From 013ee2800381927123c21def62c253e2beb8f30c Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Thu, 25 Nov 2021 16:55:26 +0800 Subject: [PATCH 001/117] updated README --- myems-aggregation/README.md | 68 ++++++++++++++++++++++++++++++------- 1 file changed, 55 insertions(+), 13 deletions(-) diff --git a/myems-aggregation/README.md b/myems-aggregation/README.md index e0e3a1aa..ad548087 100644 --- a/myems-aggregation/README.md +++ b/myems-aggregation/README.md @@ -52,34 +52,74 @@ docker run -d --restart always --name myems-aggregation myems/myems-aggregation --name Assign a name to the container -### Option 2: Install myems-aggregation on Ubuntu Server (bare-metal or virtual machine) -In this section, you will install myems-aggregation on Ubuntu Server. +### Option 2: Online install myems-aggregation on Ubuntu Server with internet access -Download and install MySQL Connector: +In this section, you will install myems-aggregation on Ubuntu Server with internet access. + +```bash +cd ~ +git clone https://github.com/MyEMS/myems.git +cd myems +git checkout master (or the latest release tag) +cd myems-aggregation +pip install -r requirements.txt +cp -r ~/myems/myems-aggregation /myems-aggregation +``` +Copy exmaple.env file to .env and modify the .env file: +```bash +cp /myems-aggregation/example.env /myems-aggregation/.env +nano /myems-aggregation/.env +``` +Setup systemd service: +```bash +cp myems-aggregation.service /lib/systemd/system/ +``` +Enable the service: +```bash +systemctl enable myems-aggregation.service +``` +Start the service: +```bash +systemctl start myems-aggregation.service +``` +Monitor the service: +```bash +systemctl status myems-aggregation.service +``` +View the log: +```bash +cat /myems-aggregation.log +``` + +### Option 3: Offline install myems-aggregation on Ubuntu Server without internet access + +In this section, you will install myems-aggregation on Ubuntu Server without internet access. + +Download on any server with internet access: ```bash cd ~/tools wget https://cdn.mysql.com/archives/mysql-connector-python-8.0/mysql-connector-python-8.0.23.tar.gz +git clone https://github.com/henriquebastos/python-decouple.git +cd ~ +git clone https://github.com/MyEMS/myems.git +``` + +Copy files to the server without internet access and install prerequisites: +```bash +cd ~/tools tar xzf mysql-connector-python-8.0.23.tar.gz cd ~/tools/mysql-connector-python-8.0.23 python3 setup.py install -``` - -Download and install Python Decouple -```bash -cd ~/tools -git clone https://github.com/henriquebastos/python-decouple.git cd ~/tools/python-decouple python3 setup.py install ``` Install myems-aggregation service: ```bash -cd ~ -git clone https://github.com/MyEMS/myems.git -cd myems +cd ~/myems git checkout master (or the latest release tag) -cp -R ~/myems/myems-aggregation /myems-aggregation +cp -r ~/myems/myems-aggregation /myems-aggregation ``` Copy exmaple.env file to .env and modify the .env file: ```bash @@ -112,3 +152,5 @@ cat /myems-aggregation.log [1]. https://myems.io [2]. https://dev.mysql.com/doc/connector-python/en/ + +[3]. https://github.com/henriquebastos/python-decouple/ From 27f9bb862927075e60a3150d23e7f6fe3ce7c239 Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Fri, 26 Nov 2021 19:17:09 +0800 Subject: [PATCH 002/117] updated postman collection and README of myems-api --- myems-api/MyEMS.postman_collection.json | 112 ++++++++++-- myems-api/README.md | 233 ++++++++++++++---------- 2 files changed, 227 insertions(+), 118 deletions(-) diff --git a/myems-api/MyEMS.postman_collection.json b/myems-api/MyEMS.postman_collection.json index 4a108d31..14620963 100644 --- a/myems-api/MyEMS.postman_collection.json +++ b/myems-api/MyEMS.postman_collection.json @@ -1,6 +1,6 @@ { "info": { - "_postman_id": "188bbc28-1018-45ae-bdc8-c0b465102f5f", + "_postman_id": "edda43bf-7618-4cef-a9dc-b5eb90fde85a", "name": "MyEMS", "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" }, @@ -1844,7 +1844,20 @@ "name": "POST Create an Energy Category", "request": { "method": "POST", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4 ", + "type": "text", + "description": "Any admin users' UUID" + }, + { + "key": "Token", + "value": "073b43c05dadd89b833c0595b81c49cb9c1a54ca52b024b301a001720e52c5bf3b95951d5c54766de1028d20301cbd2bb6ec3fb62f9e14d9658cbf3811fe6c93", + "type": "text", + "description": "Login to get a valid token" + } + ], "body": { "mode": "raw", "raw": "{\"data\":{\"name\":\"柴油\",\"unit_of_measure\":\"L\", \"kgce\":0.1229 , \"kgco2e\":0.8825}}" @@ -1865,19 +1878,32 @@ "name": "PUT Update an Energy Category", "request": { "method": "PUT", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4 ", + "type": "text", + "description": "Any admin users' UUID" + }, + { + "key": "Token", + "value": "073b43c05dadd89b833c0595b81c49cb9c1a54ca52b024b301a001720e52c5bf3b95951d5c54766de1028d20301cbd2bb6ec3fb62f9e14d9658cbf3811fe6c93", + "type": "text", + "description": "Login to get a valid token" + } + ], "body": { "mode": "raw", "raw": "{\"data\":{\"name\":\"汽油\",\"unit_of_measure\":\"L\", \"kgce\":0.1229 , \"kgco2e\":0.8825}}" }, "url": { - "raw": "{{base_url}}/energycategories/9", + "raw": "{{base_url}}/energycategories/12", "host": [ "{{base_url}}" ], "path": [ "energycategories", - "9" + "12" ] } }, @@ -1887,15 +1913,28 @@ "name": "DELETE an Energy Category", "request": { "method": "DELETE", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4 ", + "type": "text", + "description": "Any admin users' UUID" + }, + { + "key": "Token", + "value": "073b43c05dadd89b833c0595b81c49cb9c1a54ca52b024b301a001720e52c5bf3b95951d5c54766de1028d20301cbd2bb6ec3fb62f9e14d9658cbf3811fe6c93", + "type": "text", + "description": "Login to get a valid token" + } + ], "url": { - "raw": "{{base_url}}/energycategories/9", + "raw": "{{base_url}}/energycategories/12", "host": [ "{{base_url}}" ], "path": [ "energycategories", - "9" + "12" ] } }, @@ -3274,7 +3313,20 @@ "name": "POST Create New Meter", "request": { "method": "POST", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4 ", + "type": "text", + "description": "Any admin users' UUID" + }, + { + "key": "Token", + "value": "073b43c05dadd89b833c0595b81c49cb9c1a54ca52b024b301a001720e52c5bf3b95951d5c54766de1028d20301cbd2bb6ec3fb62f9e14d9658cbf3811fe6c93", + "type": "text", + "description": "Login to get a valid token" + } + ], "body": { "mode": "raw", "raw": "{\"data\":{\"name\":\"PM20\", \"energy_category_id\":1, \"hourly_low_limit\":0.000, \"hourly_high_limit\":999.99, \"is_counted\":true, \"cost_center_id\":1, \"energy_item_id\":1, \"master_meter_id\":1, \"description\":\"空调用电\"}}" @@ -3295,19 +3347,32 @@ "name": "PUT Update a Meter", "request": { "method": "PUT", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4 ", + "type": "text", + "description": "Any admin users' UUID" + }, + { + "key": "Token", + "value": "073b43c05dadd89b833c0595b81c49cb9c1a54ca52b024b301a001720e52c5bf3b95951d5c54766de1028d20301cbd2bb6ec3fb62f9e14d9658cbf3811fe6c93", + "type": "text", + "description": "Login to get a valid token" + } + ], "body": { "mode": "raw", - "raw": "{\"data\":{\"name\":\"PM201\", \"energy_category_id\":1, \"hourly_low_limit\":0.000, \"hourly_high_limit\":999.99, \"is_counted\":true, \"cost_center_id\":1, \"energy_item_id\":1, \"master_meter_id\":7, \"description\":\"空调用电\"}}" + "raw": "{\"data\":{\"name\":\"PM201\", \"energy_category_id\":1, \"hourly_low_limit\":0.000, \"hourly_high_limit\":999.99, \"is_counted\":true, \"cost_center_id\":1, \"energy_item_id\":1, \"master_meter_id\":1, \"description\":\"空调用电\"}}" }, "url": { - "raw": "{{base_url}}/meters/28", + "raw": "{{base_url}}/meters/4", "host": [ "{{base_url}}" ], "path": [ "meters", - "28" + "4" ] } }, @@ -3317,15 +3382,28 @@ "name": "DELETE Meter by ID", "request": { "method": "DELETE", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4 ", + "type": "text", + "description": "Any admin users' UUID" + }, + { + "key": "Token", + "value": "073b43c05dadd89b833c0595b81c49cb9c1a54ca52b024b301a001720e52c5bf3b95951d5c54766de1028d20301cbd2bb6ec3fb62f9e14d9658cbf3811fe6c93", + "type": "text", + "description": "Login to get a valid token" + } + ], "url": { - "raw": "{{base_url}}/meters/2", + "raw": "{{base_url}}/meters/4", "host": [ "{{base_url}}" ], "path": [ "meters", - "2" + "4" ] } }, @@ -3357,7 +3435,7 @@ "header": [], "body": { "mode": "raw", - "raw": "{\"data\":{\"point_id\":\"1\"}}" + "raw": "{\"data\":{\"point_id\":\"3\"}}" }, "url": { "raw": "{{base_url}}/meters/1/points", diff --git a/myems-api/README.md b/myems-api/README.md index bd2b19a5..7a6dd830 100644 --- a/myems-api/README.md +++ b/myems-api/README.md @@ -33,7 +33,7 @@ python-decouple ```bash cd myems/myems-api -pip install -r requirements.txt +pip install -r requirements.txt -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com cp example.env .env chmod +x run.sh ./run.sh @@ -41,7 +41,7 @@ chmod +x run.sh ## Installation -### Option 1: Install myems-api on Docker +### Installation Option 1: Install myems-api on Docker In this section, you will install myems-api on Docker. @@ -69,107 +69,18 @@ docker run -d -p 8000:8000 --restart always --name myems-api myems/myems-api --name Assign a name to the container -### Option 2: Install myems-api on Ubuntu Server (bare-metal or virtual machine) +### Option 2: Online install myems-api on Ubuntu Server with internet access -In this section, you will install myems-api on Ubuntu Server. - -* Install anytree +In this section, you will online install myems-api on Ubuntu Server with internet access. +* Copy source code to a production Ubuntu Server and then install tools ```bash -cd ~/tools -git clone https://github.com/c0fec0de/anytree.git -cd anytree -python3 setup.py install +cd ~/myems/myems-api +pip install -r requirements.txt -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com ``` -* Install simplejson +* Install myems-api service: ```bash -cd ~/tools -git clone https://github.com/simplejson/simplejson.git -cd simplejson -python3 setup.py install -``` - -* Install MySQL Connector -```bash - cd ~/tools - wget https://cdn.mysql.com/archives/mysql-connector-python-8.0/mysql-connector-python-8.0.23.tar.gz - tar xzf mysql-connector-python-8.0.23.tar.gz - cd ~/tools/mysql-connector-python-8.0.23 - python3 setup.py install -``` - -* Install Falcon, - - if you are behind proxy, use --proxy parameter - - Refer to - - https://falconframework.org/ - - https://github.com/lwcolton/falcon-cors - - https://github.com/yohanboniface/falcon-multipart -```bash - mkdir ~/tools/falcon && cd ~/tools/falcon - pip3 download cython falcon falcon-cors falcon-multipart - export LC_ALL="en_US.UTF-8" - export LC_CTYPE="en_US.UTF-8" - dpkg-reconfigure locales - pip3 install --upgrade --no-index --find-links ~/tools/falcon cython falcon falcon-cors falcon-multipart -``` - -* Install gunicorn, refer to http://gunicorn.org -```bash - mkdir ~/tools/gunicorn && cd ~/tools/gunicorn - pip3 download gunicorn - pip3 install --no-index --find-links ~/tools/gunicorn gunicorn -``` - -* Install openpyxl, refer to https://foss.heptapod.net/openpyxl/openpyxl -Get the latest version of et_xmlfile from https://foss.heptapod.net/openpyxl/et_xmlfile/ -```bash -cd ~/tools -wget https://foss.heptapod.net/openpyxl/et_xmlfile/-/archive/1.1/et_xmlfile-1.1.tar.gz -tar xzf et_xmlfile-1.1.tar.gz -``` -Get jdcal -```bash -cd ~/tools -git clone https://github.com/phn/jdcal.git -``` -Get Pillow -``` -mkdir ~/tools/pillow && cd ~/tools/pillow -pip3 download Pillow -``` -Get the latest version of openpyxl from https://foss.heptapod.net/openpyxl/openpyxl -```bash -cd ~/tools -wget https://foss.heptapod.net/openpyxl/openpyxl/-/archive/3.0.7/openpyxl-3.0.7.tar.gz -tar xzf openpyxl-3.0.7.tar.gz -``` - -```bash -cd ~/tools/et_xmlfile-1.1 -python3 setup.py install -cd ~/tools/jdcal -python3 setup.py install -pip3 install --no-index --find-links ~/tools/pillow Pillow -cd ~/tools/openpyxl-3.0.7 -python3 setup.py install -``` - -Download and install Python Decouple -```bash -cd ~/tools -git clone https://github.com/henriquebastos/python-decouple.git -cd ~/tools/python-decouple -python3 setup.py install -``` - -* Install gunicorn service for myems-api: -```bash -cp -R myems/myems-api /myems-api +cp -r ~/myems/myems-api /myems-api ``` Create .env file based on example.env and edit the .env file if needed: ```bash @@ -180,7 +91,105 @@ Check or change the listening port (default is 8000) in myems-api.service and my ```bash nano /myems-api/myems-api.service ``` -``` +```bash +ExecStart=/usr/local/bin/gunicorn -b 0.0.0.0:8000 --pid /run/myems-api/pid --timeout 600 --workers=4 app:api +``` +```bash +nano /myems-api/myems-api.socket +``` +```bash +ListenStream=0.0.0.0:8000 +``` +Add port to firewall: +```bash +ufw allow 8000 +``` +Setup systemd configure files: +```bash +cp /myems-api/myems-api.service /lib/systemd/system/ +cp /myems-api/myems-api.socket /lib/systemd/system/ +cp /myems-api/myems-api.conf /usr/lib/tmpfiles.d/ +``` +Next enable the services so that they autostart at boot: +```bash + systemctl enable myems-api.socket + systemctl enable myems-api.service +``` +Start the services : +```bash +systemctl start myems-api.socket +systemctl start myems-api.service +``` + +### Option 3: Offline install myems-api on Ubuntu Server without internet access + +In this section, you will offline install myems-api on Ubuntu Server without internet access. +* Download tools +```bash +mkdir ~tools && cd ~/tools +git clone https://github.com/c0fec0de/anytree.git +git clone https://github.com/simplejson/simplejson.git +wget https://cdn.mysql.com/archives/mysql-connector-python-8.0/mysql-connector-python-8.0.23.tar.gz +mkdir ~/tools/falcon && cd ~/tools/falcon +pip download cython falcon falcon-cors falcon-multipart +cd ~/tools +mkdir ~/tools/gunicorn && cd ~/tools/gunicorn +pip download gunicorn +cd ~/tools +wget https://foss.heptapod.net/openpyxl/et_xmlfile/-/archive/1.1/et_xmlfile-1.1.tar.gz +cd ~/tools +git clone https://github.com/phn/jdcal.git +mkdir ~/tools/pillow && cd ~/tools/pillow +pip download Pillow +cd ~/tools +wget https://foss.heptapod.net/openpyxl/openpyxl/-/archive/3.0.7/openpyxl-3.0.7.tar.gz +cd ~/tools +git clone https://github.com/henriquebastos/python-decouple.git +``` +* Copy source code and tools to the production Ubuntu Server and then run: +```bash +cd ~/tools/anytree +python setup.py install +cd ~/tools/simplejson +python setup.py install +cd ~/tools +tar xzf mysql-connector-python-8.0.23.tar.gz +cd ~/tools/mysql-connector-python-8.0.23 +python setup.py install +export LC_ALL="en_US.UTF-8" +export LC_CTYPE="en_US.UTF-8" +dpkg-reconfigure locales +pip install --upgrade --no-index --find-links ~/tools/falcon cython falcon falcon-cors falcon-multipart +pip install --no-index --find-links ~/tools/gunicorn gunicorn +cd ~/tools +tar xzf et_xmlfile-1.1.tar.gz +cd ~/tools/et_xmlfile-1.1 +python setup.py install +cd ~/tools/jdcal +python setup.py install +cd ~/tools +pip install --no-index --find-links ~/tools/pillow Pillow +tar xzf openpyxl-3.0.7.tar.gz +cd ~/tools/openpyxl-3.0.7 +python setup.py install +cd ~/tools/python-decouple +python setup.py install +``` + +* Install myems-api service: +```bash +cp -r ~/myems/myems-api /myems-api +``` +Create .env file based on example.env and edit the .env file if needed: +```bash +cp /myems-api/example.env /myems-api/.env +nano /myems-api/.env +``` +Check or change the listening port (default is 8000) in myems-api.service and myems-api.socket: +```bash +nano /myems-api/myems-api.service +``` +```bash ExecStart=/usr/local/bin/gunicorn -b 0.0.0.0:8000 --pid /run/myems-api/pid --timeout 600 --workers=4 app:api ``` ```bash @@ -210,7 +219,7 @@ systemctl start myems-api.socket systemctl start myems-api.service ``` -### Option 3: Install myems-api on macOS +### Installation Option 4: Install myems-api on macOS Please refer to [Installation on macOS (Chinese)](./installation_macos_zh.md) @@ -219,7 +228,6 @@ Please refer to [Installation on macOS (Chinese)](./installation_macos_zh.md) View in Postman: import the file MyEMS.postman_collection.json with Postman - [Energy Category](#Energy-Category) | [Energy Item](#Energy-Item) [Data Source](#Data-Source) | [Point](#Point) @@ -2390,3 +2398,26 @@ curl -i -X GET {{base_url}}/reports/virtualmeterenergy?virtualmeterid=1&periodty ```bash curl -i -X GET {{base_url}}/reports/virtualmetercost?virtualmeterid=1&periodtype=daily&baseperiodstartdatetime=2020-08-01T00:00:00&baseperiodenddatetime=2020-09-01T00:00:00&reportingperiodstartdatetime=2020-09-01T00:00:00&reportingperiodenddatetime=2020-10-01T00:00:00 ``` + +## References + +[1]. http://myems.io + +[2]. https://falconframework.org/ + +[3]. https://github.com/lwcolton/falcon-cors + +[4]. https://github.com/yohanboniface/falcon-multipart + +[5]. http://gunicorn.org + +[6]. https://github.com/henriquebastos/python-decouple/ + +[7]. https://foss.heptapod.net/openpyxl/openpyxl + +[8]. https://foss.heptapod.net/openpyxl/et_xmlfile/ + + + + + From d937acd1bb31ae0102b160274b7051c003c21608 Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Fri, 26 Nov 2021 20:05:01 +0800 Subject: [PATCH 003/117] fixed issue of EnergyCategory in admin and updated README of admin --- admin/README.md | 18 +++++++++++++++--- .../category/energycategory.controller.js | 11 ++++++++--- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/admin/README.md b/admin/README.md index e3e92fc9..6653e273 100644 --- a/admin/README.md +++ b/admin/README.md @@ -14,6 +14,16 @@ nginx-1.18.0 or later In this section, you will install myems-admin on Docker. +* replace ~~127.0.0.1:8000~~ in nginx.conf with actual **HOST** ip and port of myems-api +```bash +cd myems/admin +nano nginx.conf +``` + +```bash + proxy_pass http://127.0.0.1:8000/; +``` + * Build a Docker image ```bash cd myems/admin @@ -141,6 +151,8 @@ sudo nano /var/www/html/admin/app/api.js ## References -1. https://myems.io -2. https://dev.mysql.com/doc/connector-python/en/ -3. https://nginx.org/ \ No newline at end of file +[1]. https://myems.io + +[2]. https://dev.mysql.com/doc/connector-python/en/ + +[3]. https://nginx.org/ \ No newline at end of file diff --git a/admin/app/controllers/settings/category/energycategory.controller.js b/admin/app/controllers/settings/category/energycategory.controller.js index fcc0db00..def966a5 100644 --- a/admin/app/controllers/settings/category/energycategory.controller.js +++ b/admin/app/controllers/settings/category/energycategory.controller.js @@ -1,7 +1,13 @@ 'use strict'; -app.controller('EnergyCategoryController', function($scope, $translate,$uibModal, CategoryService,toaster,SweetAlert) { - +app.controller('EnergyCategoryController', function($scope, + $window, + $translate, + $uibModal, + CategoryService, + toaster, + SweetAlert) { + $scope.cur_user = JSON.parse($window.localStorage.getItem("myems_admin_ui_current_user")); $scope.getAllCategories = function() { CategoryService.getAllCategories(function (response) { if (angular.isDefined(response.status) && response.status === 200) { @@ -10,7 +16,6 @@ app.controller('EnergyCategoryController', function($scope, $translate,$uibModal $scope.categories = []; } }); - }; $scope.addCategory = function() { From 3b0d4a13f5dc5023a53ec56c9c0afbc8ca2a8bc1 Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Sat, 27 Nov 2021 21:15:43 +0800 Subject: [PATCH 004/117] added access control to meter in api and admin --- .../combinedequipmentparameter.controller.js | 19 ++++++++++-- .../datasource/datasource.controller.js | 3 +- .../settings/datasource/point.controller.js | 3 +- .../distributioncircuitpoint.controller.js | 19 ++++++++++-- .../equipmentparameter.controller.js | 17 +++++++++-- .../settings/meter/meter.controller.js | 13 ++++++-- .../settings/meter/meterpoint.controller.js | 29 +++++++++++------- .../settings/sensor/sensorpoint.controller.js | 19 ++++++++++-- .../shopfloor/shopfloorpoint.controller.js | 18 +++++++++-- .../settings/space/spacepoint.controller.js | 18 +++++++++-- .../settings/store/storepoint.controller.js | 18 +++++++++-- .../settings/tenant/tenantpoint.controller.js | 18 +++++++++-- .../settings/datasource/datasource.service.js | 2 +- .../settings/meter/meterpoint.service.js | 10 +++---- myems-api/MyEMS.postman_collection.json | 30 +++++++++++++++++-- myems-api/README.md | 14 ++++----- myems-api/core/meter.py | 3 ++ 17 files changed, 201 insertions(+), 52 deletions(-) diff --git a/admin/app/controllers/settings/combinedequipment/combinedequipmentparameter.controller.js b/admin/app/controllers/settings/combinedequipment/combinedequipmentparameter.controller.js index c52bef8f..5455780a 100644 --- a/admin/app/controllers/settings/combinedequipment/combinedequipmentparameter.controller.js +++ b/admin/app/controllers/settings/combinedequipment/combinedequipmentparameter.controller.js @@ -1,6 +1,19 @@ 'use strict'; -app.controller('CombinedEquipmentParameterController', function ($scope, $uibModal, $translate, MeterService, VirtualMeterService, OfflineMeterService, CombinedEquipmentParameterService, CombinedEquipmentService, PointService, toaster, SweetAlert) { +app.controller('CombinedEquipmentParameterController', function ( + $scope, + $window, + $uibModal, + $translate, + MeterService, + VirtualMeterService, + OfflineMeterService, + CombinedEquipmentParameterService, + CombinedEquipmentService, + PointService, + toaster, + SweetAlert) { + $scope.cur_user = JSON.parse($window.localStorage.getItem("myems_admin_ui_current_user")); $scope.currentCombinedEquipment = { selected: undefined }; $scope.is_show_add_parameter = false; $scope.combinedequipments = []; @@ -36,7 +49,6 @@ app.controller('CombinedEquipmentParameterController', function ($scope, $uibMod }; $scope.addCombinedEquipmentParameter = function () { - var modalInstance = $uibModal.open({ templateUrl: 'views/settings/combinedequipment/combinedequipmentparameter.model.html', controller: 'ModalAddCombinedEquipmentParameterCtrl', @@ -250,7 +262,8 @@ app.controller('CombinedEquipmentParameterController', function ($scope, $uibMod }; $scope.getAllPoints = function () { - PointService.getAllPoints(function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + PointService.getAllPoints(headers, function (response) { if (angular.isDefined(response.status) && response.status === 200) { $scope.points = response.data; } else { diff --git a/admin/app/controllers/settings/datasource/datasource.controller.js b/admin/app/controllers/settings/datasource/datasource.controller.js index 45e5df29..bb26dec2 100644 --- a/admin/app/controllers/settings/datasource/datasource.controller.js +++ b/admin/app/controllers/settings/datasource/datasource.controller.js @@ -1,6 +1,7 @@ 'use strict'; -app.controller('DataSourceController', function($scope, +app.controller('DataSourceController', function( + $scope, $window, $uibModal, $translate, diff --git a/admin/app/controllers/settings/datasource/point.controller.js b/admin/app/controllers/settings/datasource/point.controller.js index 83ec5913..e426df06 100644 --- a/admin/app/controllers/settings/datasource/point.controller.js +++ b/admin/app/controllers/settings/datasource/point.controller.js @@ -1,6 +1,7 @@ 'use strict'; -app.controller('PointController', function($scope, +app.controller('PointController', function( + $scope, $window, $uibModal, $translate, diff --git a/admin/app/controllers/settings/distributionsystem/distributioncircuitpoint.controller.js b/admin/app/controllers/settings/distributionsystem/distributioncircuitpoint.controller.js index 8b5f8aaf..b7a63720 100644 --- a/admin/app/controllers/settings/distributionsystem/distributioncircuitpoint.controller.js +++ b/admin/app/controllers/settings/distributionsystem/distributioncircuitpoint.controller.js @@ -1,9 +1,21 @@ 'use strict'; -app.controller('DistributionCircuitPointController', function ($scope, $timeout, $translate, DistributionCircuitService, DataSourceService, PointService, DistributionCircuitPointService, toaster, SweetAlert) { +app.controller('DistributionCircuitPointController', function ( + $scope, + $window, + $timeout, + $translate, + DistributionCircuitService, + DataSourceService, + PointService, + DistributionCircuitPointService, + toaster, + SweetAlert) { + $scope.cur_user = JSON.parse($window.localStorage.getItem("myems_admin_ui_current_user")); $scope.currentDistributionCircuit = {selected:undefined}; $scope.getAllDataSources = function () { - DataSourceService.getAllDataSources(function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + DataSourceService.getAllDataSources(headers, function (response) { if (angular.isDefined(response.status) && response.status === 200) { $scope.datasources = response.data; if ($scope.datasources.length > 0) { @@ -17,7 +29,8 @@ app.controller('DistributionCircuitPointController', function ($scope, $timeout, }; $scope.getPointsByDataSourceID = function (id) { - PointService.getPointsByDataSourceID(id, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + PointService.getPointsByDataSourceID(id, headers, function (response) { if (angular.isDefined(response.status) && response.status === 200) { $scope.points = response.data; } else { diff --git a/admin/app/controllers/settings/equipment/equipmentparameter.controller.js b/admin/app/controllers/settings/equipment/equipmentparameter.controller.js index 17ae48d8..09a9a133 100644 --- a/admin/app/controllers/settings/equipment/equipmentparameter.controller.js +++ b/admin/app/controllers/settings/equipment/equipmentparameter.controller.js @@ -1,6 +1,18 @@ 'use strict'; -app.controller('EquipmentParameterController', function($scope, $uibModal, $translate, MeterService, VirtualMeterService, OfflineMeterService, EquipmentParameterService, EquipmentService, PointService, toaster,SweetAlert) { +app.controller('EquipmentParameterController', function( + $scope, + $window, + $uibModal, + $translate, + MeterService, + VirtualMeterService, + OfflineMeterService, + EquipmentParameterService, + EquipmentService, + PointService, + toaster,SweetAlert) { + $scope.cur_user = JSON.parse($window.localStorage.getItem("myems_admin_ui_current_user")); $scope.currentEquipment = {selected:undefined}; $scope.is_show_add_parameter = false; $scope.equipments = []; @@ -251,7 +263,8 @@ app.controller('EquipmentParameterController', function($scope, $uibModal, $tran }; $scope.getAllPoints = function() { - PointService.getAllPoints(function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + PointService.getAllPoints(headers, function (response) { if (angular.isDefined(response.status) && response.status === 200) { $scope.points = response.data; } else { diff --git a/admin/app/controllers/settings/meter/meter.controller.js b/admin/app/controllers/settings/meter/meter.controller.js index 747c3bbe..9f43df25 100644 --- a/admin/app/controllers/settings/meter/meter.controller.js +++ b/admin/app/controllers/settings/meter/meter.controller.js @@ -1,7 +1,16 @@ 'use strict'; -app.controller('MeterController', function($scope, $translate, $uibModal, MeterService, CategoryService, CostCenterService, EnergyItemService,toaster, SweetAlert) { - +app.controller('MeterController', function($scope, + $window, + $translate, + $uibModal, + MeterService, + CategoryService, + CostCenterService, + EnergyItemService, + toaster, + SweetAlert) { + $scope.cur_user = JSON.parse($window.localStorage.getItem("myems_admin_ui_current_user")); $scope.getAllCostCenters = function() { CostCenterService.getAllCostCenters(function (response) { if (angular.isDefined(response.status) && response.status === 200) { diff --git a/admin/app/controllers/settings/meter/meterpoint.controller.js b/admin/app/controllers/settings/meter/meterpoint.controller.js index fa0f697b..44e6fb38 100644 --- a/admin/app/controllers/settings/meter/meterpoint.controller.js +++ b/admin/app/controllers/settings/meter/meterpoint.controller.js @@ -1,14 +1,20 @@ 'use strict'; -app.controller('MeterPointController', function ($scope, $timeout, $translate, - MeterService, - DataSourceService, - PointService, - MeterPointService, - toaster) { +app.controller('MeterPointController', function ( + $scope, + $window, + $timeout, + $translate, + MeterService, + DataSourceService, + PointService, + MeterPointService, + toaster) { + $scope.cur_user = JSON.parse($window.localStorage.getItem("myems_admin_ui_current_user")); $scope.currentMeter = {selected:undefined}; $scope.getAllDataSources = function () { - DataSourceService.getAllDataSources(function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + DataSourceService.getAllDataSources(headers, function (response) { if (angular.isDefined(response.status) && response.status === 200) { $scope.datasources = response.data; if ($scope.datasources.length > 0) { @@ -22,7 +28,8 @@ app.controller('MeterPointController', function ($scope, $timeout, $translate, }; $scope.getPointsByDataSourceID = function (id) { - PointService.getPointsByDataSourceID(id, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + PointService.getPointsByDataSourceID(id, headers, function (response) { if (angular.isDefined(response.status) && response.status === 200) { $scope.points = response.data; } else { @@ -69,7 +76,8 @@ app.controller('MeterPointController', function ($scope, $timeout, $translate, $scope.pairPoint = function (dragEl, dropEl) { var pointid = angular.element('#' + dragEl).scope().point.id; var meterid = $scope.currentMeter.id; - MeterPointService.addPair(meterid, pointid, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + MeterPointService.addPair(meterid, pointid, headers, function (response) { if (angular.isDefined(response.status) && response.status === 201) { toaster.pop({ type: "success", @@ -95,7 +103,8 @@ app.controller('MeterPointController', function ($scope, $timeout, $translate, } var meterpointid = angular.element('#' + dragEl).scope().meterpoint.id; var meterid = $scope.currentMeter.id; - MeterPointService.deletePair(meterid, meterpointid, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + MeterPointService.deletePair(meterid, meterpointid, headers, function (response) { if (angular.isDefined(response.status) && response.status === 204) { toaster.pop({ type: "success", diff --git a/admin/app/controllers/settings/sensor/sensorpoint.controller.js b/admin/app/controllers/settings/sensor/sensorpoint.controller.js index 3ba13fd3..c2b6839c 100644 --- a/admin/app/controllers/settings/sensor/sensorpoint.controller.js +++ b/admin/app/controllers/settings/sensor/sensorpoint.controller.js @@ -1,9 +1,21 @@ 'use strict'; -app.controller('SensorPointController', function ($scope, $timeout, $translate, SensorService, DataSourceService, PointService, SensorPointService, toaster, SweetAlert) { +app.controller('SensorPointController', function ( + $scope, + $window, + $timeout, + $translate, + SensorService, + DataSourceService, + PointService, + SensorPointService, + toaster, + SweetAlert) { + $scope.cur_user = JSON.parse($window.localStorage.getItem("myems_admin_ui_current_user")); $scope.currentSensor = {selected:undefined}; $scope.getAllDataSources = function () { - DataSourceService.getAllDataSources(function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + DataSourceService.getAllDataSources(headers, function (response) { if (angular.isDefined(response.status) && response.status === 200) { $scope.datasources = response.data; if ($scope.datasources.length > 0) { @@ -18,7 +30,8 @@ app.controller('SensorPointController', function ($scope, $timeout, $translate, }; $scope.getPointsByDataSourceID = function (id) { - PointService.getPointsByDataSourceID(id, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + PointService.getPointsByDataSourceID(id, headers, function (response) { if (angular.isDefined(response.status) && response.status === 200) { $scope.points = response.data; } else { diff --git a/admin/app/controllers/settings/shopfloor/shopfloorpoint.controller.js b/admin/app/controllers/settings/shopfloor/shopfloorpoint.controller.js index a88ea9f1..09eb88a0 100644 --- a/admin/app/controllers/settings/shopfloor/shopfloorpoint.controller.js +++ b/admin/app/controllers/settings/shopfloor/shopfloorpoint.controller.js @@ -1,9 +1,20 @@ 'use strict'; -app.controller('ShopfloorPointController', function ($scope, $translate, ShopfloorService, DataSourceService, PointService, ShopfloorPointService, toaster, SweetAlert) { +app.controller('ShopfloorPointController', function ( + $scope, + $window, + $translate, + ShopfloorService, + DataSourceService, + PointService, + ShopfloorPointService, + toaster, + SweetAlert) { + $scope.cur_user = JSON.parse($window.localStorage.getItem("myems_admin_ui_current_user")); $scope.currentShopfloor = {selected:undefined}; $scope.getAllDataSources = function () { - DataSourceService.getAllDataSources(function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + DataSourceService.getAllDataSources(headers, function (response) { if (angular.isDefined(response.status) && response.status === 200) { $scope.datasources = response.data; if ($scope.datasources.length > 0) { @@ -17,7 +28,8 @@ app.controller('ShopfloorPointController', function ($scope, $translate, Shopflo }; $scope.getPointsByDataSourceID = function (id) { - PointService.getPointsByDataSourceID(id, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + PointService.getPointsByDataSourceID(id, headers, function (response) { if (angular.isDefined(response.status) && response.status === 200) { $scope.points = response.data; } else { diff --git a/admin/app/controllers/settings/space/spacepoint.controller.js b/admin/app/controllers/settings/space/spacepoint.controller.js index cec6de57..c1b50d52 100644 --- a/admin/app/controllers/settings/space/spacepoint.controller.js +++ b/admin/app/controllers/settings/space/spacepoint.controller.js @@ -1,6 +1,16 @@ 'use strict'; -app.controller('SpacePointController', function ($scope, $translate, SpaceService, DataSourceService, PointService, SpacePointService, toaster, SweetAlert) { +app.controller('SpacePointController', function ( + $scope, + $window, + $translate, + SpaceService, + DataSourceService, + PointService, + SpacePointService, + toaster, + SweetAlert) { + $scope.cur_user = JSON.parse($window.localStorage.getItem("myems_admin_ui_current_user")); $scope.spaces = []; $scope.currentSpaceID = 1; $scope.spacepoints = []; @@ -42,7 +52,8 @@ app.controller('SpacePointController', function ($scope, $translate, SpaceServic }; $scope.getAllDataSources = function () { - DataSourceService.getAllDataSources(function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + DataSourceService.getAllDataSources(headers, function (response) { if (angular.isDefined(response.status) && response.status === 200) { $scope.datasources = response.data; if ($scope.datasources.length > 0) { @@ -56,7 +67,8 @@ app.controller('SpacePointController', function ($scope, $translate, SpaceServic }; $scope.getPointsByDataSourceID = function (id) { - PointService.getPointsByDataSourceID(id, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + PointService.getPointsByDataSourceID(id, headers, function (response) { if (angular.isDefined(response.status) && response.status === 200) { $scope.points = response.data; } else { diff --git a/admin/app/controllers/settings/store/storepoint.controller.js b/admin/app/controllers/settings/store/storepoint.controller.js index 17cc3c0e..d239d6c5 100644 --- a/admin/app/controllers/settings/store/storepoint.controller.js +++ b/admin/app/controllers/settings/store/storepoint.controller.js @@ -1,9 +1,20 @@ 'use strict'; -app.controller('StorePointController', function ($scope, $translate, StoreService, DataSourceService, PointService, StorePointService, toaster, SweetAlert) { +app.controller('StorePointController', function ( + $window, + $scope, + $translate, + StoreService, + DataSourceService, + PointService, + StorePointService, + toaster, + SweetAlert) { + $scope.cur_user = JSON.parse($window.localStorage.getItem("myems_admin_ui_current_user")); $scope.currentStore = {selected:undefined}; $scope.getAllDataSources = function () { - DataSourceService.getAllDataSources(function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + DataSourceService.getAllDataSources(headers, function (response) { if (angular.isDefined(response.status) && response.status === 200) { $scope.datasources = response.data; if ($scope.datasources.length > 0) { @@ -17,7 +28,8 @@ app.controller('StorePointController', function ($scope, $translate, StoreServic }; $scope.getPointsByDataSourceID = function (id) { - PointService.getPointsByDataSourceID(id, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + PointService.getPointsByDataSourceID(id, headers, function (response) { if (angular.isDefined(response.status) && response.status === 200) { $scope.points = response.data; } else { diff --git a/admin/app/controllers/settings/tenant/tenantpoint.controller.js b/admin/app/controllers/settings/tenant/tenantpoint.controller.js index b29505ee..d8c687e2 100644 --- a/admin/app/controllers/settings/tenant/tenantpoint.controller.js +++ b/admin/app/controllers/settings/tenant/tenantpoint.controller.js @@ -1,9 +1,20 @@ 'use strict'; -app.controller('TenantPointController', function ($scope, $translate, TenantService, DataSourceService, PointService, TenantPointService, toaster, SweetAlert) { +app.controller('TenantPointController', function ( + $scope, + $window, + $translate, + TenantService, + DataSourceService, + PointService, + TenantPointService, + toaster, + SweetAlert) { + $scope.cur_user = JSON.parse($window.localStorage.getItem("myems_admin_ui_current_user")); $scope.currentTenant = {selected:undefined}; $scope.getAllDataSources = function () { - DataSourceService.getAllDataSources(function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + DataSourceService.getAllDataSources(headers, function (response) { if (angular.isDefined(response.status) && response.status === 200) { $scope.datasources = response.data; if ($scope.datasources.length > 0) { @@ -17,7 +28,8 @@ app.controller('TenantPointController', function ($scope, $translate, TenantServ }; $scope.getPointsByDataSourceID = function (id) { - PointService.getPointsByDataSourceID(id, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + PointService.getPointsByDataSourceID(id, headers, function (response) { if (angular.isDefined(response.status) && response.status === 200) { $scope.points = response.data; } else { diff --git a/admin/app/services/settings/datasource/datasource.service.js b/admin/app/services/settings/datasource/datasource.service.js index f33486c0..b3e88a92 100644 --- a/admin/app/services/settings/datasource/datasource.service.js +++ b/admin/app/services/settings/datasource/datasource.service.js @@ -2,7 +2,7 @@ app.factory('DataSourceService', function($http) { return { getAllDataSources:function(headers, callback){ - $http.get(getAPI()+'datasources', {headers}) + $http.get(getAPI() + 'datasources', {headers}) .then(function (response) { callback(response); }, function (response) { diff --git a/admin/app/services/settings/meter/meterpoint.service.js b/admin/app/services/settings/meter/meterpoint.service.js index e9184851..3c1ebf28 100644 --- a/admin/app/services/settings/meter/meterpoint.service.js +++ b/admin/app/services/settings/meter/meterpoint.service.js @@ -1,8 +1,8 @@ 'use strict'; app.factory('MeterPointService', function($http) { return { - addPair: function(meterID,pointID,callback) { - $http.post(getAPI()+'meters/'+meterID+'/points',{data:{'point_id':pointID}}) + addPair: function(meterID, pointID, headers, callback) { + $http.post(getAPI() + 'meters/' + meterID + '/points', {data:{'point_id':pointID}}, {headers}) .then(function (response) { callback(response); }, function (response) { @@ -10,8 +10,8 @@ app.factory('MeterPointService', function($http) { }); }, - deletePair: function(meterID,pointID, callback) { - $http.delete(getAPI()+'meters/'+meterID+'/points/'+pointID) + deletePair: function(meterID,pointID, headers, callback) { + $http.delete(getAPI() + 'meters/' + meterID + '/points/' + pointID, {headers}) .then(function (response) { callback(response); }, function (response) { @@ -19,7 +19,7 @@ app.factory('MeterPointService', function($http) { }); }, getPointsByMeterID: function(id, callback) { - $http.get(getAPI()+'meters/'+id+'/points') + $http.get(getAPI() + 'meters/' + id + '/points') .then(function (response) { callback(response); }, function (response) { diff --git a/myems-api/MyEMS.postman_collection.json b/myems-api/MyEMS.postman_collection.json index 14620963..af45e87a 100644 --- a/myems-api/MyEMS.postman_collection.json +++ b/myems-api/MyEMS.postman_collection.json @@ -3432,7 +3432,20 @@ "name": "POST Meter Point Relation", "request": { "method": "POST", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4 ", + "type": "text", + "description": "Any admin users' UUID" + }, + { + "key": "Token", + "value": "ee46c3c7ca148dcb76af23fd2431fd925d20d570c363dc8d478a3afa74a9c8743886cdaf8d37b94faa49210d9003a916313790c7818c2ab7e87647489aaabfb7", + "type": "text", + "description": "Login to get a valid token" + } + ], "body": { "mode": "raw", "raw": "{\"data\":{\"point_id\":\"3\"}}" @@ -3474,7 +3487,20 @@ "name": "DELETE Meter Point Relation", "request": { "method": "DELETE", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4 ", + "type": "text", + "description": "Any admin users' UUID" + }, + { + "key": "Token", + "value": "ee46c3c7ca148dcb76af23fd2431fd925d20d570c363dc8d478a3afa74a9c8743886cdaf8d37b94faa49210d9003a916313790c7818c2ab7e87647489aaabfb7", + "type": "text", + "description": "Login to get a valid token" + } + ], "url": { "raw": "{{base_url}}/meters/1/points/3", "host": [ diff --git a/myems-api/README.md b/myems-api/README.md index 7a6dd830..b8c163dc 100644 --- a/myems-api/README.md +++ b/myems-api/README.md @@ -574,15 +574,15 @@ curl -i -X GET {{base_url}}/energycategories ``` * DELETE an Energy Category by ID ```bash -curl -i -X DELETE {{base_url}}/energycategories/{id} +curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/energycategories/{id} ``` * POST Create an Energy Category ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"电","unit_of_measure":"kWh", "kgce":0.1229 , "kgco2e":0.8825}}' {{base_url}}/energycategories +curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"name":"电","unit_of_measure":"kWh", "kgce":0.1229 , "kgco2e":0.8825}}' {{base_url}}/energycategories ``` * PUT Update an Energy Category ```bash -curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"电","unit_of_measure":"kWh", "kgce":0.1329 , "kgco2e":0.9825}}' {{base_url}}/energycategories/{id} +curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"电","unit_of_measure":"kWh", "kgce":0.1329 , "kgco2e":0.9825}}' {{base_url}}/energycategories/{id} ``` ### Energy Flow Diagram @@ -1053,11 +1053,11 @@ curl -i -X DELETE {{base_url}}/meters/{id} ``` * POST Create a Meter ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"PM20", "energy_category_id":1, "hourly_low_limit":0.000, "hourly_high_limit":999.999, "is_counted":true, "cost_center_id":1, "energy_item_id":1, "master_meter_id":1, "description":"空调用电"}}' {{base_url}}/meters +curl -i -H "Content-Type: application/json" -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: 073b43c05dadd89b833c0595b81c49cb9c1a54ca52b024b301a001720e52c5bf3b95951d5c54766de1028d20301cbd2bb6ec3fb62f9e14d9658cbf3811fe6c93" -X POST -d '{"data":{"name":"PM20", "energy_category_id":1, "hourly_low_limit":0.000, "hourly_high_limit":999.999, "is_counted":true, "cost_center_id":1, "energy_item_id":1, "master_meter_id":1, "description":"空调用电"}}' {{base_url}}/meters ``` * PUT Update a Meter ```bash -curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"PM20", "energy_category_id":1, "hourly_low_limit":0.000, "hourly_high_limit":999.999, "is_counted":true, "cost_center_id":1, "energy_item_id":1, "master_meter_id":1, "description":"空调用电"}}' {{base_url}}/meters/{id} +curl -i -H "Content-Type: application/json" -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: 073b43c05dadd89b833c0595b81c49cb9c1a54ca52b024b301a001720e52c5bf3b95951d5c54766de1028d20301cbd2bb6ec3fb62f9e14d9658cbf3811fe6c93" -X PUT -d '{"data":{"name":"PM20", "energy_category_id":1, "hourly_low_limit":0.000, "hourly_high_limit":999.999, "is_counted":true, "cost_center_id":1, "energy_item_id":1, "master_meter_id":1, "description":"空调用电"}}' {{base_url}}/meters/{id} ``` * GET All Submeters of Meter by ID ```bash @@ -1069,11 +1069,11 @@ curl -i -X GET {{base_url}}/meters/{id}/points ``` * POST Meter Point Relation ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"point_id":"3"}}' {{base_url}}/meters/{id}/points +curl -i -H "Content-Type: application/json" -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: 073b43c05dadd89b833c0595b81c49cb9c1a54ca52b024b301a001720e52c5bf3b95951d5c54766de1028d20301cbd2bb6ec3fb62f9e14d9658cbf3811fe6c93" -X POST -d '{"data":{"point_id":"3"}}' {{base_url}}/meters/{id}/points ``` * DELETE Meter Point Relation ```bash -curl -i -X DELETE {{base_url}}/meters/{id}/points/{pid} +curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: 073b43c05dadd89b833c0595b81c49cb9c1a54ca52b024b301a001720e52c5bf3b95951d5c54766de1028d20301cbd2bb6ec3fb62f9e14d9658cbf3811fe6c93" -X DELETE {{base_url}}/meters/{id}/points/{pid} ``` ### Notification diff --git a/myems-api/core/meter.py b/myems-api/core/meter.py index 5a5dd1a2..11812ea3 100644 --- a/myems-api/core/meter.py +++ b/myems-api/core/meter.py @@ -900,6 +900,7 @@ class MeterPointCollection: @user_logger def on_post(req, resp, id_): """Handles POST requests""" + access_control(req) try: raw_json = req.stream.read().decode('utf-8') except Exception as ex: @@ -967,6 +968,8 @@ class MeterPointItem: @staticmethod @user_logger def on_delete(req, resp, id_, pid): + """Handles DELETE requests""" + access_control(req) if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', description='API.INVALID_METER_ID') From ccf7b9d43533bee1fc54b56149296af2d03c063b Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Sun, 28 Nov 2021 20:46:46 +0800 Subject: [PATCH 005/117] updated requirements of myems-api --- myems-api/requirements.txt | 2 +- web/README.md | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/myems-api/requirements.txt b/myems-api/requirements.txt index b2db7617..430b7cc9 100644 --- a/myems-api/requirements.txt +++ b/myems-api/requirements.txt @@ -1,7 +1,7 @@ anytree simplejson mysql-connector-python -falcon +falcon==3.0.1 falcon_cors falcon-multipart gunicorn diff --git a/web/README.md b/web/README.md index 01e763f6..4ea41edb 100644 --- a/web/README.md +++ b/web/README.md @@ -57,6 +57,13 @@ In this section, you will install myems-web on Docker. cd myems/web sudo nano src/config.js ``` + +* replace ~~127.0.0.1:8000~~ in nginx.conf with actual **HOST** ip and port of myems-api +```bash +cd myems/web +nano nginx.conf +``` + * Download all the necessary dependencies into the node_modules directory. ```bash sudo npm i --unsafe-perm=true --allow-root --legacy-peer-deps From 7a2d2a3f1de92bbafa63664d4388921e01c1511d Mon Sep 17 00:00:00 2001 From: tianlinzhong <673359306@qq.com> Date: Mon, 29 Nov 2021 16:07:31 +0800 Subject: [PATCH 006/117] menu of access_control --- .../settings/menu/menu.controller.js | 7 +-- .../services/settings/menu/menu.service.js | 4 +- myems-api/MyEMS.postman_collection.json | 43 +++++++++++++++++-- myems-api/core/menu.py | 3 +- 4 files changed, 48 insertions(+), 9 deletions(-) diff --git a/admin/app/controllers/settings/menu/menu.controller.js b/admin/app/controllers/settings/menu/menu.controller.js index 13ada957..31689cdd 100644 --- a/admin/app/controllers/settings/menu/menu.controller.js +++ b/admin/app/controllers/settings/menu/menu.controller.js @@ -1,10 +1,10 @@ 'use strict'; -app.controller('MenuController', function ($scope, $uibModal, MenuService, toaster, $translate) { +app.controller('MenuController', function ($scope, $window, $uibModal, MenuService, toaster, $translate) { $scope.menus = []; $scope.currentMenu = {}; $scope.currentMenuChildren = []; - + $scope.cur_user = JSON.parse($window.localStorage.getItem("myems_admin_ui_current_user")); $scope.getAllMenus = function () { MenuService.getAllMenus(function (response) { if (angular.isDefined(response.status) && response.status === 200) { @@ -104,7 +104,8 @@ app.controller('MenuController', function ($scope, $uibModal, MenuService, toast }); modalInstance.result.then(function (modifiedMenu) { - MenuService.editMenu(modifiedMenu, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + MenuService.editMenu(modifiedMenu, headers, function (response) { if (angular.isDefined(response.status) && response.status === 200) { toaster.pop({ type: "success", diff --git a/admin/app/services/settings/menu/menu.service.js b/admin/app/services/settings/menu/menu.service.js index fc0c6505..7d2080bb 100644 --- a/admin/app/services/settings/menu/menu.service.js +++ b/admin/app/services/settings/menu/menu.service.js @@ -17,8 +17,8 @@ app.factory('MenuService', function($http) { callback(response); }); }, - editMenu: function(menu, callback) { - $http.put(getAPI()+'menus/'+menu.id,{data:menu}) + editMenu: function(menu, headers, callback) { + $http.put(getAPI()+'menus/'+menu.id, {data:menu}, {headers}) .then(function (response) { callback(response); }, function (response) { diff --git a/myems-api/MyEMS.postman_collection.json b/myems-api/MyEMS.postman_collection.json index af45e87a..623bddec 100644 --- a/myems-api/MyEMS.postman_collection.json +++ b/myems-api/MyEMS.postman_collection.json @@ -1,6 +1,6 @@ { "info": { - "_postman_id": "edda43bf-7618-4cef-a9dc-b5eb90fde85a", + "_postman_id": "27f47263-6e8e-4d74-93a9-0ee9b56eccfc", "name": "MyEMS", "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" }, @@ -3214,7 +3214,18 @@ "name": "PUT Update a Menu", "request": { "method": "PUT", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "816be1f0-cf59-4aa4-bf81-a0e90577d416", + "type": "text" + }, + { + "key": "Token", + "value": "fc037979da169499d2c84d9ff838ae2599f1934b2e43872a8dc9da033f4d5811a0ca711595a576dcd6b340ffc3d8a8824630cf04b4e67331a6a82e8ec2dfd155", + "type": "text" + } + ], "body": { "mode": "raw", "raw": "{\"data\":{\"is_hidden\":true}}" @@ -7414,7 +7425,7 @@ "header": [], "body": { "mode": "raw", - "raw": "{\"data\":{\"email\":\"administrator@myems.io\", \"password\":\"!MyEMS1\"}}" + "raw": "{\"data\":{\"email\":\"admin1130@kwh-w.com\", \"password\":\"c2c77a39ab28\"}}" }, "url": { "raw": "{{base_url}}/users/login", @@ -10631,5 +10642,31 @@ }, "response": [] } + ], + "event": [ + { + "listen": "prerequest", + "script": { + "type": "text/javascript", + "exec": [ + "" + ] + } + }, + { + "listen": "test", + "script": { + "type": "text/javascript", + "exec": [ + "" + ] + } + } + ], + "variable": [ + { + "key": "base_url", + "value": "127.0.0.1:8000" + } ] } \ No newline at end of file diff --git a/myems-api/core/menu.py b/myems-api/core/menu.py index 2f620d75..8845ca6b 100644 --- a/myems-api/core/menu.py +++ b/myems-api/core/menu.py @@ -2,7 +2,7 @@ import falcon import simplejson as json import mysql.connector import config -from core.useractivity import user_logger +from core.useractivity import user_logger, access_control class MenuCollection: @@ -83,6 +83,7 @@ class MenuItem: @user_logger def on_put(req, resp, id_): """Handles PUT requests""" + access_control(req) try: raw_json = req.stream.read().decode('utf-8') except Exception as ex: From d5ad69b7b986aeab8377546fd975fe50b4325bce Mon Sep 17 00:00:00 2001 From: tianlinzhong <673359306@qq.com> Date: Mon, 29 Nov 2021 17:02:06 +0800 Subject: [PATCH 007/117] menu of access_control2 --- myems-api/MyEMS.postman_collection.json | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/myems-api/MyEMS.postman_collection.json b/myems-api/MyEMS.postman_collection.json index 623bddec..51ba6bc6 100644 --- a/myems-api/MyEMS.postman_collection.json +++ b/myems-api/MyEMS.postman_collection.json @@ -7425,7 +7425,7 @@ "header": [], "body": { "mode": "raw", - "raw": "{\"data\":{\"email\":\"admin1130@kwh-w.com\", \"password\":\"c2c77a39ab28\"}}" + "raw": "{\"data\":{\"email\":\"administrator@myems.io\", \"password\":\"!MyEMS1\"}}" }, "url": { "raw": "{{base_url}}/users/login", @@ -10662,11 +10662,5 @@ ] } } - ], - "variable": [ - { - "key": "base_url", - "value": "127.0.0.1:8000" - } ] } \ No newline at end of file From dfec9a8fc0c6221ffa8f1ac1df8cc128b36f2376 Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Mon, 29 Nov 2021 17:46:14 +0800 Subject: [PATCH 008/117] added access_control to menu in api and admin --- .../settings/menu/menu.controller.js | 8 ++++- myems-api/MyEMS.postman_collection.json | 16 ++++++---- myems-api/README.md | 32 +++++++++---------- web/README.md | 10 +++--- 4 files changed, 37 insertions(+), 29 deletions(-) diff --git a/admin/app/controllers/settings/menu/menu.controller.js b/admin/app/controllers/settings/menu/menu.controller.js index 31689cdd..03400cfd 100644 --- a/admin/app/controllers/settings/menu/menu.controller.js +++ b/admin/app/controllers/settings/menu/menu.controller.js @@ -1,6 +1,12 @@ 'use strict'; -app.controller('MenuController', function ($scope, $window, $uibModal, MenuService, toaster, $translate) { +app.controller('MenuController', function ( + $scope, + $window, + $uibModal, + MenuService, + toaster, + $translate) { $scope.menus = []; $scope.currentMenu = {}; $scope.currentMenuChildren = []; diff --git a/myems-api/MyEMS.postman_collection.json b/myems-api/MyEMS.postman_collection.json index 51ba6bc6..df8ee26b 100644 --- a/myems-api/MyEMS.postman_collection.json +++ b/myems-api/MyEMS.postman_collection.json @@ -1,6 +1,6 @@ { "info": { - "_postman_id": "27f47263-6e8e-4d74-93a9-0ee9b56eccfc", + "_postman_id": "1a6c20d8-4d7a-49a1-a5e9-3d4261ba0505", "name": "MyEMS", "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" }, @@ -3217,13 +3217,15 @@ "header": [ { "key": "User-UUID", - "value": "816be1f0-cf59-4aa4-bf81-a0e90577d416", - "type": "text" + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any admin users' UUID" }, { "key": "Token", - "value": "fc037979da169499d2c84d9ff838ae2599f1934b2e43872a8dc9da033f4d5811a0ca711595a576dcd6b340ffc3d8a8824630cf04b4e67331a6a82e8ec2dfd155", - "type": "text" + "value": "9217343d83a59d87cd7d28949d039cbea8b05c219a40ef1d71fe8db6ceebedf5bb7eadf34792c31bc6dccda27e9d5d932ae6e4da444dddbfe1e1fad14a1f5384", + "type": "text", + "description": "Login to get a valid token" } ], "body": { @@ -3231,13 +3233,13 @@ "raw": "{\"data\":{\"is_hidden\":true}}" }, "url": { - "raw": "{{base_url}}/menus/1", + "raw": "{{base_url}}/menus/100", "host": [ "{{base_url}}" ], "path": [ "menus", - "1" + "100" ] } }, diff --git a/myems-api/README.md b/myems-api/README.md index b8c163dc..afea25e8 100644 --- a/myems-api/README.md +++ b/myems-api/README.md @@ -352,7 +352,7 @@ curl -i -X DELETE {{base_url}}/costfiles/{id} * POST Upload a Cost File (call users login API to get 'User-UUID' and 'Token') ```bash -curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: 02f93023a39c98e1d1bc9f5197a83dfc5ddc0d48" -H "Content-Type: application/TBD" -X POST -d 'file: (binary)' {{base_url}}/costfiles +curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/TBD" -X POST -d 'file: (binary)' {{base_url}}/costfiles ``` * GET Restore a Cost File by ID from database to disk ```bash @@ -982,7 +982,7 @@ curl -i -X DELETE {{base_url}}/knowledgefiles/{id} * POST Upload a Knowledge File (call users login API to get 'User-UUID' and 'Token') ```bash -curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: 02f93023a39c98e1d1bc9f5197a83dfc5ddc0d48" -H "Content-Type: application/TBD" -X POST -d 'file: (binary)' {{base_url}}/knowledgefiles +curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/TBD" -X POST -d 'file: (binary)' {{base_url}}/knowledgefiles ``` * GET Restore a Knowledge File by id from database to disk ```bash @@ -1010,7 +1010,7 @@ curl -i -X GET {{base_url}}/menus ``` * PUT Update a Menu ```bash -curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"is_hidden": false}}' {{base_url}}/menus/{id} +curl -i -H "Content-Type: application/json" -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X PUT -d '{"data":{"is_hidden": false}}' {{base_url}}/menus/{id} ``` * Get All Menus for Web UI ```bash @@ -1053,11 +1053,11 @@ curl -i -X DELETE {{base_url}}/meters/{id} ``` * POST Create a Meter ```bash -curl -i -H "Content-Type: application/json" -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: 073b43c05dadd89b833c0595b81c49cb9c1a54ca52b024b301a001720e52c5bf3b95951d5c54766de1028d20301cbd2bb6ec3fb62f9e14d9658cbf3811fe6c93" -X POST -d '{"data":{"name":"PM20", "energy_category_id":1, "hourly_low_limit":0.000, "hourly_high_limit":999.999, "is_counted":true, "cost_center_id":1, "energy_item_id":1, "master_meter_id":1, "description":"空调用电"}}' {{base_url}}/meters +curl -i -H "Content-Type: application/json" -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X POST -d '{"data":{"name":"PM20", "energy_category_id":1, "hourly_low_limit":0.000, "hourly_high_limit":999.999, "is_counted":true, "cost_center_id":1, "energy_item_id":1, "master_meter_id":1, "description":"空调用电"}}' {{base_url}}/meters ``` * PUT Update a Meter ```bash -curl -i -H "Content-Type: application/json" -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: 073b43c05dadd89b833c0595b81c49cb9c1a54ca52b024b301a001720e52c5bf3b95951d5c54766de1028d20301cbd2bb6ec3fb62f9e14d9658cbf3811fe6c93" -X PUT -d '{"data":{"name":"PM20", "energy_category_id":1, "hourly_low_limit":0.000, "hourly_high_limit":999.999, "is_counted":true, "cost_center_id":1, "energy_item_id":1, "master_meter_id":1, "description":"空调用电"}}' {{base_url}}/meters/{id} +curl -i -H "Content-Type: application/json" -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X PUT -d '{"data":{"name":"PM20", "energy_category_id":1, "hourly_low_limit":0.000, "hourly_high_limit":999.999, "is_counted":true, "cost_center_id":1, "energy_item_id":1, "master_meter_id":1, "description":"空调用电"}}' {{base_url}}/meters/{id} ``` * GET All Submeters of Meter by ID ```bash @@ -1069,11 +1069,11 @@ curl -i -X GET {{base_url}}/meters/{id}/points ``` * POST Meter Point Relation ```bash -curl -i -H "Content-Type: application/json" -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: 073b43c05dadd89b833c0595b81c49cb9c1a54ca52b024b301a001720e52c5bf3b95951d5c54766de1028d20301cbd2bb6ec3fb62f9e14d9658cbf3811fe6c93" -X POST -d '{"data":{"point_id":"3"}}' {{base_url}}/meters/{id}/points +curl -i -H "Content-Type: application/json" -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X POST -d '{"data":{"point_id":"3"}}' {{base_url}}/meters/{id}/points ``` * DELETE Meter Point Relation ```bash -curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: 073b43c05dadd89b833c0595b81c49cb9c1a54ca52b024b301a001720e52c5bf3b95951d5c54766de1028d20301cbd2bb6ec3fb62f9e14d9658cbf3811fe6c93" -X DELETE {{base_url}}/meters/{id}/points/{pid} +curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/meters/{id}/points/{pid} ``` ### Notification @@ -1097,19 +1097,19 @@ Result * GET All Notifications ```bash -curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: 02f93023a39c98e1d1bc9f5197a83dfc5ddc0d48" -X GET {{base_url}}/notifications?startdatetime={startdatetime}&enddatetime={enddatetime}&status={status} +curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X GET {{base_url}}/notifications?startdatetime={startdatetime}&enddatetime={enddatetime}&status={status} ``` * DELETE Notification by ID ```bash -curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: 02f93023a39c98e1d1bc9f5197a83dfc5ddc0d48" -X DELETE {{base_url}}/notifications/{id} +curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/notifications/{id} ``` * PUT Update a Notification ```bash -curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: 02f93023a39c98e1d1bc9f5197a83dfc5ddc0d48" -H "Content-Type: application/json" -X PUT -d '{"data":{"status":"read"}}' {{base_url}}/notifications/{id} +curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X PUT -d '{"data":{"status":"read"}}' {{base_url}}/notifications/{id} ``` * DELETE Notification ```bash -curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: 02f93023a39c98e1d1bc9f5197a83dfc5ddc0d48" -X DELETE {{base_url}}/notifications/{id} +curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/notifications/{id} ``` ### Offline Meter @@ -1178,7 +1178,7 @@ curl -i -X DELETE {{base_url}}/offlinemeterfiles/{id} * POST Upload an Offline Meter File (call users login API to get 'User-UUID' and 'Token') ```bash -curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: 02f93023a39c98e1d1bc9f5197a83dfc5ddc0d48" -H "Content-Type: application/TBD" -X POST -d 'file: (binary)' {{base_url}}/offlinemeterfiles +curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/TBD" -X POST -d 'file: (binary)' {{base_url}}/offlinemeterfiles ``` * GET Restore an Offline Meter File by ID from database to disk ```bash @@ -1604,7 +1604,7 @@ curl -i -X DELETE {{base_url}}/spaces/{id}/virtualmeters/{mid} ``` * GET Space Tree of User ```bash -curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: a6e52af82e5b4168ae03b1c5fd8fa31b2ab3a338" -X GET {{base_url}}/spaces/tree +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X GET {{base_url}}/spaces/tree ``` ### Store @@ -2009,15 +2009,15 @@ curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"email":"johnson ``` * PUT User Logout ```bash -curl -i -H "Content-Type: application/json" -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: a6e52af82e5b4168ae03b1c5fd8fa31b2ab3a338" -X PUT {{base_url}}/users/logout +curl -i -H "Content-Type: application/json" -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X PUT {{base_url}}/users/logout ``` * PUT User change password ```bash -curl -i -H "Content-Type: application/json" -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: a6e52af82e5b4168ae03b1c5fd8fa31b2ab3a338" -X PUT -d '{"data":{"old_password":"Password1", "new_password":"Password2"}}' {{base_url}}/users/changepassword +curl -i -H "Content-Type: application/json" -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X PUT -d '{"data":{"old_password":"Password1", "new_password":"Password2"}}' {{base_url}}/users/changepassword ``` * PUT User reset other user's password by administrator ```bash -curl -i -H "Content-Type: application/json" -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: a6e52af82e5b4168ae03b1c5fd8fa31b2ab3a338" -X PUT -d '{"data":{"name":"johnson","password":"NewPassword1"}}' {{base_url}}/users/resetpassword +curl -i -H "Content-Type: application/json" -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X PUT -d '{"data":{"name":"johnson","password":"NewPassword1"}}' {{base_url}}/users/resetpassword ``` ### Virtual Meter diff --git a/web/README.md b/web/README.md index 4ea41edb..dab37692 100644 --- a/web/README.md +++ b/web/README.md @@ -55,7 +55,7 @@ In this section, you will install myems-web on Docker. * Check and change the config file if necessary: ```bash cd myems/web -sudo nano src/config.js +nano src/config.js ``` * replace ~~127.0.0.1:8000~~ in nginx.conf with actual **HOST** ip and port of myems-api @@ -66,11 +66,11 @@ nano nginx.conf * Download all the necessary dependencies into the node_modules directory. ```bash -sudo npm i --unsafe-perm=true --allow-root --legacy-peer-deps +npm i --unsafe-perm=true --allow-root --legacy-peer-deps ``` * Build for production with NPM ```bash -sudo npm run build +npm run build ``` * Build a Docker image ```bash @@ -91,14 +91,14 @@ docker run -d -p 80:80 --restart always --name myems-web myems/myems-web --name Assign a name to the container -### Option 2: Install myems-web on NGINX Server +### Option 2: Install myems-web on Server with NGINX * Install NGINX Server refer to http://nginx.org/en/docs/install.html * Configure NGINX ```bash -sudo nano /etc/nginx/nginx.conf +nano /etc/nginx/nginx.conf ``` In the 'http' section, add some directives: ``` From 9304225419495c1ce034c52f71104098ed699afd Mon Sep 17 00:00:00 2001 From: tianlinzhong <673359306@qq.com> Date: Mon, 29 Nov 2021 18:48:29 +0800 Subject: [PATCH 009/117] contact of access_control --- .../settings/contact/contact.controller.js | 13 +++-- .../settings/contact/contact.service.js | 12 ++--- myems-api/MyEMS.postman_collection.json | 47 +++++++++++++++++-- myems-api/README.md | 10 ++-- myems-api/core/contact.py | 5 +- 5 files changed, 66 insertions(+), 21 deletions(-) diff --git a/admin/app/controllers/settings/contact/contact.controller.js b/admin/app/controllers/settings/contact/contact.controller.js index 02aa61ac..89d5a05a 100644 --- a/admin/app/controllers/settings/contact/contact.controller.js +++ b/admin/app/controllers/settings/contact/contact.controller.js @@ -1,8 +1,8 @@ 'use strict'; -app.controller('ContactController', function($scope, $translate,$uibModal, ContactService,toaster,SweetAlert) { - +app.controller('ContactController', function($scope, $window, $translate,$uibModal, ContactService,toaster,SweetAlert) { + $scope.cur_user = JSON.parse($window.localStorage.getItem("myems_admin_ui_current_user")); $scope.getAllContacts = function() { ContactService.getAllContacts(function (response) { if (angular.isDefined(response.status) && response.status === 200) { @@ -28,7 +28,8 @@ app.controller('ContactController', function($scope, $translate,$uibModal, Conta } }); modalInstance.result.then(function(contact) { - ContactService.addContact(contact, function(response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + ContactService.addContact(contact, headers, function(response) { if (angular.isDefined(response.status) && response.status === 201) { toaster.pop({ type: "success", @@ -67,7 +68,8 @@ app.controller('ContactController', function($scope, $translate,$uibModal, Conta }); modalInstance.result.then(function (modifiedContact) { - ContactService.editContact(modifiedContact, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + ContactService.editContact(modifiedContact, headers, function (response) { if(angular.isDefined(response.status) && response.status === 200){ toaster.pop({ type: "success", @@ -103,7 +105,8 @@ app.controller('ContactController', function($scope, $translate,$uibModal, Conta closeOnCancel: true }, function (isConfirm) { if (isConfirm) { - ContactService.deleteContact(contact, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + ContactService.deleteContact(contact, headers, function (response) { if (angular.isDefined(response.status) && response.status === 204) { toaster.pop({ type: "success", diff --git a/admin/app/services/settings/contact/contact.service.js b/admin/app/services/settings/contact/contact.service.js index 19b47c98..437540e0 100644 --- a/admin/app/services/settings/contact/contact.service.js +++ b/admin/app/services/settings/contact/contact.service.js @@ -17,24 +17,24 @@ app.factory('ContactService', function($http) { callback(response); }); }, - addContact: function(contact, callback) { - $http.post(getAPI()+'contacts',{data:contact}) + addContact: function(contact, headers, callback) { + $http.post(getAPI()+'contacts',{data:contact}, {headers}) .then(function (response) { callback(response); }, function (response) { callback(response); }); }, - editContact: function(contact, callback) { - $http.put(getAPI()+'contacts/'+contact.id,{data:contact}) + editContact: function(contact, headers, callback) { + $http.put(getAPI()+'contacts/'+contact.id,{data:contact}, {headers}) .then(function (response) { callback(response); }, function (response) { callback(response); }); }, - deleteContact: function(contact, callback) { - $http.delete(getAPI()+'contacts/'+contact.id) + deleteContact: function(contact, headers, callback) { + $http.delete(getAPI()+'contacts/'+contact.id, {headers}) .then(function (response) { callback(response); }, function (response) { diff --git a/myems-api/MyEMS.postman_collection.json b/myems-api/MyEMS.postman_collection.json index df8ee26b..4192a101 100644 --- a/myems-api/MyEMS.postman_collection.json +++ b/myems-api/MyEMS.postman_collection.json @@ -1,6 +1,6 @@ { "info": { - "_postman_id": "1a6c20d8-4d7a-49a1-a5e9-3d4261ba0505", + "_postman_id": "92712647-82fc-4cf2-acae-25fb13badd9e", "name": "MyEMS", "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" }, @@ -634,7 +634,20 @@ "name": "POST Create New Contact", "request": { "method": "POST", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "description": "Any admin users' UUID", + "type": "text" + }, + { + "key": "Token", + "value": "e3e753d078585ff791e8a899ad4bf3cc3673912061d5b6ab5119ed3ac713895ae1fc5f90f8d4a7942b1b139774b4db82e6702593b9a453a82982fdae47edac34", + "description": "Login to get a valid token", + "type": "text" + } + ], "body": { "mode": "raw", "raw": "{\"data\":{\"name\":\"albert\", \"email\":\"albert@myems.io\", \"phone\":\"+8613888888888\", \"description\":\"contact description\"}}" @@ -655,7 +668,20 @@ "name": "PUT Update a Contact", "request": { "method": "PUT", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "description": "Any admin users' UUID", + "type": "text" + }, + { + "key": "Token", + "value": "e3e753d078585ff791e8a899ad4bf3cc3673912061d5b6ab5119ed3ac713895ae1fc5f90f8d4a7942b1b139774b4db82e6702593b9a453a82982fdae47edac34", + "description": "Login to get a valid token", + "type": "text" + } + ], "body": { "mode": "raw", "raw": "{\"data\":{\"name\":\"albert\", \"email\":\"albert@myems.io\", \"phone\":\"+8613888888899\", \"description\":\"contact description\"}}" @@ -677,7 +703,20 @@ "name": "DELETE a Contact by ID", "request": { "method": "DELETE", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "description": "Any admin users' UUID", + "type": "text" + }, + { + "key": "Token", + "value": "e3e753d078585ff791e8a899ad4bf3cc3673912061d5b6ab5119ed3ac713895ae1fc5f90f8d4a7942b1b139774b4db82e6702593b9a453a82982fdae47edac34", + "description": "Login to get a valid token", + "type": "text" + } + ], "url": { "raw": "{{base_url}}/contacts/2", "host": [ diff --git a/myems-api/README.md b/myems-api/README.md index afea25e8..2d2a2374 100644 --- a/myems-api/README.md +++ b/myems-api/README.md @@ -269,15 +269,15 @@ curl -i -X GET {{base_url}}/contacts ``` * DELETE Contact by ID ```bash -curl -i -X DELETE {{base_url}}/contacts/{id} +curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/contacts/{id} ``` * POST Create a New Contact ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"albert", "email":"albert@myems.io", "phone":"+8613888888888", "description":"contact description"}}' {{base_url}}/contacts +curl -i -H "Content-Type: application/json" -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X POST -d '{"data":{"name":"albert", "email":"albert@myems.io", "phone":"+8613888888888", "description":"contact description"}}' {{base_url}}/contacts ``` * PUT Update a Contact ```bash -curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"albert", "email":"albert@myems.io", "phone":"+8613888888899", "description":"contact description"}}' {{base_url}}/contacts/{id} +curl -i -H "Content-Type: application/json" -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X PUT -d '{"data":{"name":"albert", "email":"albert@myems.io", "phone":"+8613888888899", "description":"contact description"}}' {{base_url}}/contacts/{id} ``` ### Cost Center @@ -2402,9 +2402,9 @@ curl -i -X GET {{base_url}}/reports/virtualmetercost?virtualmeterid=1&periodtype ## References [1]. http://myems.io - + [2]. https://falconframework.org/ - + [3]. https://github.com/lwcolton/falcon-cors [4]. https://github.com/yohanboniface/falcon-multipart diff --git a/myems-api/core/contact.py b/myems-api/core/contact.py index 5a10a0d3..ef5dfd90 100644 --- a/myems-api/core/contact.py +++ b/myems-api/core/contact.py @@ -4,7 +4,7 @@ import mysql.connector import config import uuid import re -from core.useractivity import user_logger +from core.useractivity import user_logger, access_control class ContactCollection: @@ -48,6 +48,7 @@ class ContactCollection: @user_logger def on_post(req, resp): """Handles POST requests""" + access_control(req) try: raw_json = req.stream.read().decode('utf-8') except Exception as ex: @@ -160,6 +161,7 @@ class ContactItem: @staticmethod @user_logger def on_delete(req, resp, id_): + access_control(req) if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', description='API.INVALID_CONTACT_ID') @@ -236,6 +238,7 @@ class ContactItem: @user_logger def on_put(req, resp, id_): """Handles PUT requests""" + access_control(req) try: raw_json = req.stream.read().decode('utf-8') except Exception as ex: From 16c7e858fbeb331cc7f17d4495f6a32c92c6ad16 Mon Sep 17 00:00:00 2001 From: Caozhenhui <823914102@qq.com> Date: Tue, 30 Nov 2021 10:00:38 +0800 Subject: [PATCH 010/117] added access control to EnergyItem --- .../settings/category/energyitem.controller.js | 10 +++++++--- .../services/settings/category/energyitem.service.js | 12 ++++++------ myems-api/MyEMS.postman_collection.json | 2 +- myems-api/README.md | 6 +++--- myems-api/core/energyitem.py | 5 ++++- 5 files changed, 21 insertions(+), 14 deletions(-) diff --git a/admin/app/controllers/settings/category/energyitem.controller.js b/admin/app/controllers/settings/category/energyitem.controller.js index e6abad0b..03261570 100644 --- a/admin/app/controllers/settings/category/energyitem.controller.js +++ b/admin/app/controllers/settings/category/energyitem.controller.js @@ -1,6 +1,7 @@ 'use strict'; app.controller('EnergyItemController', function($scope, $translate,$uibModal, CategoryService, EnergyItemService, toaster,SweetAlert) { + $scope.cur_user = JSON.parse($window.localStorage.getItem("myems_admin_ui_current_user")); $scope.getAllCategories = function() { CategoryService.getAllCategories(function (response) { if (angular.isDefined(response.status) && response.status === 200) { @@ -38,7 +39,8 @@ app.controller('EnergyItemController', function($scope, $translate,$uibModal, Ca } }); modalInstance.result.then(function(energyItem) { - EnergyItemService.addEnergyItem(energyItem, function(response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + EnergyItemService.addEnergyItem(energyItem, headers, function(response) { if (angular.isDefined(response.status) && response.status === 201) { toaster.pop({ type: "success", @@ -78,7 +80,8 @@ app.controller('EnergyItemController', function($scope, $translate,$uibModal, Ca }); modalInstance.result.then(function (modifiedEnergyItem) { - EnergyItemService.editEnergyItem(modifiedEnergyItem, function (response){ + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + EnergyItemService.editEnergyItem(modifiedEnergyItem, headers, function (response){ if(angular.isDefined(response.status) && response.status === 200){ toaster.pop({ type: "success", @@ -114,7 +117,8 @@ app.controller('EnergyItemController', function($scope, $translate,$uibModal, Ca closeOnCancel: true }, function (isConfirm) { if (isConfirm) { - EnergyItemService.deleteEnergyItem(energyItem, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + EnergyItemService.deleteEnergyItem(energyItem, headers, function (response) { if (angular.isDefined(response.status) && response.status === 204) { toaster.pop({ type: "success", diff --git a/admin/app/services/settings/category/energyitem.service.js b/admin/app/services/settings/category/energyitem.service.js index 503a8542..ee0fff62 100644 --- a/admin/app/services/settings/category/energyitem.service.js +++ b/admin/app/services/settings/category/energyitem.service.js @@ -17,24 +17,24 @@ app.factory('EnergyItemService', function($http) { callback(response); }); }, - addEnergyItem: function(energyItem, callback) { - $http.post(getAPI()+'energyitems',{data:energyItem}) + addEnergyItem: function(energyItem, headers, callback) { + $http.post(getAPI()+'energyitems',{data:energyItem}, {headers}) .then(function (response) { callback(response); }, function (response) { callback(response); }); }, - editEnergyItem: function(energyItem, callback) { - $http.put(getAPI()+'energyitems/'+energyItem.id,{data:energyItem}) + editEnergyItem: function(energyItem, headers, callback) { + $http.put(getAPI()+'energyitems/'+energyItem.id,{data:energyItem}, {headers}) .then(function (response) { callback(response); }, function (response) { callback(response); }); }, - deleteEnergyItem: function(energyItem, callback) { - $http.delete(getAPI()+'energyitems/'+energyItem.id) + deleteEnergyItem: function(energyItem, headers, callback) { + $http.delete(getAPI()+'energyitems/'+energyItem.id, {headers}) .then(function (response) { callback(response); }, function (response) { diff --git a/myems-api/MyEMS.postman_collection.json b/myems-api/MyEMS.postman_collection.json index df8ee26b..7f2c217c 100644 --- a/myems-api/MyEMS.postman_collection.json +++ b/myems-api/MyEMS.postman_collection.json @@ -1,6 +1,6 @@ { "info": { - "_postman_id": "1a6c20d8-4d7a-49a1-a5e9-3d4261ba0505", + "_postman_id": "36fe4322-48fb-414c-8328-665d2872c2b7", "name": "MyEMS", "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" }, diff --git a/myems-api/README.md b/myems-api/README.md index afea25e8..74f2d05b 100644 --- a/myems-api/README.md +++ b/myems-api/README.md @@ -669,15 +669,15 @@ curl -i -X GET {{base_url}}/energyitems ``` * DELETE an Energy Item by ID ```bash -curl -i -X DELETE {{base_url}}/energyitems/{id} +curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/energyitems/{id} ``` * POST Create an Energy Item ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"空调用电","energy_category_id":1}}' {{base_url}}/energyitems +curl -i -H "Content-Type: application/json" -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X POST -d '{"data":{"name":"空调用电","energy_category_id":1}}' {{base_url}}/energyitems ``` * PUT Update an Energy Item ```bash -curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"动力用电","energy_category_id":1}}' {{base_url}}/energyitems/{id} +curl -i -H "Content-Type: application/json" -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X PUT -d '{"data":{"name":"动力用电","energy_category_id":1}}' {{base_url}}/energyitems/{id} ``` ### Equipment diff --git a/myems-api/core/energyitem.py b/myems-api/core/energyitem.py index f2edffcb..b22b06a2 100644 --- a/myems-api/core/energyitem.py +++ b/myems-api/core/energyitem.py @@ -3,7 +3,7 @@ import simplejson as json import mysql.connector import config import uuid -from core.useractivity import user_logger +from core.useractivity import user_logger, access_control class EnergyItemCollection: @@ -55,6 +55,7 @@ class EnergyItemCollection: @user_logger def on_post(req, resp): """Handles POST requests""" + access_control(req) try: raw_json = req.stream.read().decode('utf-8') except Exception as ex: @@ -165,6 +166,7 @@ class EnergyItemItem: @staticmethod @user_logger def on_delete(req, resp, id_): + access_control(req) if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', description='API.INVALID_ENERGY_ITEM_ID') @@ -225,6 +227,7 @@ class EnergyItemItem: @user_logger def on_put(req, resp, id_): """Handles PUT requests""" + access_control(req) try: raw_json = req.stream.read().decode('utf-8') except Exception as ex: From 6e5344943998ed6469ff2e5d1250284ef9038cb7 Mon Sep 17 00:00:00 2001 From: Caozhenhui <823914102@qq.com> Date: Tue, 30 Nov 2021 10:07:12 +0800 Subject: [PATCH 011/117] added access control to EnergyItem --- .../app/controllers/settings/category/energyitem.controller.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/admin/app/controllers/settings/category/energyitem.controller.js b/admin/app/controllers/settings/category/energyitem.controller.js index 03261570..439e2db7 100644 --- a/admin/app/controllers/settings/category/energyitem.controller.js +++ b/admin/app/controllers/settings/category/energyitem.controller.js @@ -1,6 +1,6 @@ 'use strict'; -app.controller('EnergyItemController', function($scope, $translate,$uibModal, CategoryService, EnergyItemService, toaster,SweetAlert) { +app.controller('EnergyItemController', function($scope, $window, $translate,$uibModal, CategoryService, EnergyItemService, toaster,SweetAlert) { $scope.cur_user = JSON.parse($window.localStorage.getItem("myems_admin_ui_current_user")); $scope.getAllCategories = function() { CategoryService.getAllCategories(function (response) { From 20db5357b28a7fe80a763017da56a7fb1f175800 Mon Sep 17 00:00:00 2001 From: Caozhenhui <823914102@qq.com> Date: Tue, 30 Nov 2021 10:11:04 +0800 Subject: [PATCH 012/117] modified postman_collection.json --- myems-api/MyEMS.postman_collection.json | 58 +++++++++++++++++++++++-- 1 file changed, 54 insertions(+), 4 deletions(-) diff --git a/myems-api/MyEMS.postman_collection.json b/myems-api/MyEMS.postman_collection.json index 7f2c217c..5b66a321 100644 --- a/myems-api/MyEMS.postman_collection.json +++ b/myems-api/MyEMS.postman_collection.json @@ -2257,7 +2257,20 @@ "name": "POST Create an Energy Item", "request": { "method": "POST", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4 ", + "description": "Any admin users' UUID", + "type": "text" + }, + { + "key": "Token", + "value": "89d8c1a8e6e2a4fc3b7a7eb3964c4e6fc97b5ae216591a986deb43f8a03babcd72ce5ad0c160e3ed4c9550cea29a9a548a261812484f2c7ac9aa039aa33441e2", + "description": "Login to get a valid token", + "type": "text" + } + ], "body": { "mode": "raw", "raw": "{\"data\":{\"name\":\"租户用电\",\"energy_category_id\":1}}" @@ -2278,7 +2291,20 @@ "name": "PUT Update an Energy Item", "request": { "method": "PUT", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4 ", + "description": "Any admin users' UUID", + "type": "text" + }, + { + "key": "Token", + "value": "89d8c1a8e6e2a4fc3b7a7eb3964c4e6fc97b5ae216591a986deb43f8a03babcd72ce5ad0c160e3ed4c9550cea29a9a548a261812484f2c7ac9aa039aa33441e2", + "description": "Login to get a valid token", + "type": "text" + } + ], "body": { "mode": "raw", "raw": "{\"data\":{\"name\":\"空调用\",\"energy_category_id\":1}}" @@ -2300,7 +2326,20 @@ "name": "DELETE an Energy Item", "request": { "method": "DELETE", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4 ", + "description": "Any admin users' UUID", + "type": "text" + }, + { + "key": "Token", + "value": "89d8c1a8e6e2a4fc3b7a7eb3964c4e6fc97b5ae216591a986deb43f8a03babcd72ce5ad0c160e3ed4c9550cea29a9a548a261812484f2c7ac9aa039aa33441e2", + "description": "Login to get a valid token", + "type": "text" + } + ], "url": { "raw": "{{base_url}}/energyitems/4", "host": [ @@ -7424,7 +7463,18 @@ "name": "PUT User Login by Email", "request": { "method": "PUT", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "816be1f0-cf59-4aa4-bf81-a0e90577d416", + "type": "text" + }, + { + "key": "Token", + "value": "89d8c1a8e6e2a4fc3b7a7eb3964c4e6fc97b5ae216591a986deb43f8a03babcd72ce5ad0c160e3ed4c9550cea29a9a548a261812484f2c7ac9aa039aa33441e2", + "type": "text" + } + ], "body": { "mode": "raw", "raw": "{\"data\":{\"email\":\"administrator@myems.io\", \"password\":\"!MyEMS1\"}}" From 8481fa68a5836ceef569c630e3bddb9733eed0c8 Mon Sep 17 00:00:00 2001 From: Caozhenhui <823914102@qq.com> Date: Tue, 30 Nov 2021 10:13:11 +0800 Subject: [PATCH 013/117] modified postman_collection.json --- myems-api/MyEMS.postman_collection.json | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/myems-api/MyEMS.postman_collection.json b/myems-api/MyEMS.postman_collection.json index 5b66a321..090d3d35 100644 --- a/myems-api/MyEMS.postman_collection.json +++ b/myems-api/MyEMS.postman_collection.json @@ -7463,18 +7463,7 @@ "name": "PUT User Login by Email", "request": { "method": "PUT", - "header": [ - { - "key": "User-UUID", - "value": "816be1f0-cf59-4aa4-bf81-a0e90577d416", - "type": "text" - }, - { - "key": "Token", - "value": "89d8c1a8e6e2a4fc3b7a7eb3964c4e6fc97b5ae216591a986deb43f8a03babcd72ce5ad0c160e3ed4c9550cea29a9a548a261812484f2c7ac9aa039aa33441e2", - "type": "text" - } - ], + "header": [], "body": { "mode": "raw", "raw": "{\"data\":{\"email\":\"administrator@myems.io\", \"password\":\"!MyEMS1\"}}" From 637f8ce481abdc9726631a45268dc4344d932315 Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Tue, 30 Nov 2021 22:57:51 +0800 Subject: [PATCH 014/117] added accecc_control to contact in api and admin --- .../settings/contact/contact.controller.js | 9 ++++++- myems-api/MyEMS.postman_collection.json | 25 ++++++++++++------- 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/admin/app/controllers/settings/contact/contact.controller.js b/admin/app/controllers/settings/contact/contact.controller.js index 89d5a05a..1dadf16c 100644 --- a/admin/app/controllers/settings/contact/contact.controller.js +++ b/admin/app/controllers/settings/contact/contact.controller.js @@ -1,6 +1,13 @@ 'use strict'; -app.controller('ContactController', function($scope, $window, $translate,$uibModal, ContactService,toaster,SweetAlert) { +app.controller('ContactController', function( + $scope, + $window, + $translate, + $uibModal, + ContactService, + toaster, + SweetAlert) { $scope.cur_user = JSON.parse($window.localStorage.getItem("myems_admin_ui_current_user")); $scope.getAllContacts = function() { diff --git a/myems-api/MyEMS.postman_collection.json b/myems-api/MyEMS.postman_collection.json index 4192a101..d17add4c 100644 --- a/myems-api/MyEMS.postman_collection.json +++ b/myems-api/MyEMS.postman_collection.json @@ -1,6 +1,6 @@ { "info": { - "_postman_id": "92712647-82fc-4cf2-acae-25fb13badd9e", + "_postman_id": "98580f5c-106c-4b86-8262-ec3c918608e1", "name": "MyEMS", "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" }, @@ -625,7 +625,14 @@ "method": "GET", "header": [], "url": { - "raw": "" + "raw": "{{base_url}}/contacts/1", + "host": [ + "{{base_url}}" + ], + "path": [ + "contacts", + "1" + ] } }, "response": [] @@ -643,7 +650,7 @@ }, { "key": "Token", - "value": "e3e753d078585ff791e8a899ad4bf3cc3673912061d5b6ab5119ed3ac713895ae1fc5f90f8d4a7942b1b139774b4db82e6702593b9a453a82982fdae47edac34", + "value": "835aa13a4bc4af4ca2f47cac03d186bc49c13a30a025e9d983cc52238027f2eb7bd323784ee53a3833109ce1234acf9c8cb6754ba602b84049bb9244e3df6aeb", "description": "Login to get a valid token", "type": "text" } @@ -677,7 +684,7 @@ }, { "key": "Token", - "value": "e3e753d078585ff791e8a899ad4bf3cc3673912061d5b6ab5119ed3ac713895ae1fc5f90f8d4a7942b1b139774b4db82e6702593b9a453a82982fdae47edac34", + "value": "835aa13a4bc4af4ca2f47cac03d186bc49c13a30a025e9d983cc52238027f2eb7bd323784ee53a3833109ce1234acf9c8cb6754ba602b84049bb9244e3df6aeb", "description": "Login to get a valid token", "type": "text" } @@ -687,13 +694,13 @@ "raw": "{\"data\":{\"name\":\"albert\", \"email\":\"albert@myems.io\", \"phone\":\"+8613888888899\", \"description\":\"contact description\"}}" }, "url": { - "raw": "{{base_url}}/contacts/2", + "raw": "{{base_url}}/contacts/3", "host": [ "{{base_url}}" ], "path": [ "contacts", - "2" + "3" ] } }, @@ -712,19 +719,19 @@ }, { "key": "Token", - "value": "e3e753d078585ff791e8a899ad4bf3cc3673912061d5b6ab5119ed3ac713895ae1fc5f90f8d4a7942b1b139774b4db82e6702593b9a453a82982fdae47edac34", + "value": "835aa13a4bc4af4ca2f47cac03d186bc49c13a30a025e9d983cc52238027f2eb7bd323784ee53a3833109ce1234acf9c8cb6754ba602b84049bb9244e3df6aeb", "description": "Login to get a valid token", "type": "text" } ], "url": { - "raw": "{{base_url}}/contacts/2", + "raw": "{{base_url}}/contacts/3", "host": [ "{{base_url}}" ], "path": [ "contacts", - "2" + "3" ] } }, From c7fe4dea79435841ef8c7358e9ed794651986a77 Mon Sep 17 00:00:00 2001 From: tianlinzhong <673359306@qq.com> Date: Wed, 1 Dec 2021 14:21:38 +0800 Subject: [PATCH 015/117] energyflowdiagram of access_control --- .../energyflowdiagram.controller.js | 19 ++++++-- .../energyflowdiagram.service.js | 12 ++--- myems-api/MyEMS.postman_collection.json | 47 +++++++++++++++++-- myems-api/README.md | 6 +-- myems-api/core/energyflowdiagram.py | 5 +- 5 files changed, 70 insertions(+), 19 deletions(-) diff --git a/admin/app/controllers/settings/energyflowdiagram/energyflowdiagram.controller.js b/admin/app/controllers/settings/energyflowdiagram/energyflowdiagram.controller.js index dd8f81fe..5cf69fae 100644 --- a/admin/app/controllers/settings/energyflowdiagram/energyflowdiagram.controller.js +++ b/admin/app/controllers/settings/energyflowdiagram/energyflowdiagram.controller.js @@ -1,7 +1,13 @@ 'use strict'; -app.controller('EnergyFlowDiagramController', function($scope, $translate, $uibModal, EnergyFlowDiagramService, toaster,SweetAlert) { - +app.controller('EnergyFlowDiagramController', function($scope, + $window, + $translate, + $uibModal, + EnergyFlowDiagramService, + toaster, + SweetAlert) { + $scope.cur_user = JSON.parse($window.localStorage.getItem("myems_admin_ui_current_user")); $scope.getAllEnergyFlowDiagrams = function() { EnergyFlowDiagramService.getAllEnergyFlowDiagrams(function (response) { if (angular.isDefined(response.status) && response.status === 200) { @@ -19,7 +25,8 @@ app.controller('EnergyFlowDiagramController', function($scope, $translate, $uibM windowClass: "animated fadeIn", }); modalInstance.result.then(function(energyflowdiagram) { - EnergyFlowDiagramService.addEnergyFlowDiagram(energyflowdiagram, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + EnergyFlowDiagramService.addEnergyFlowDiagram(energyflowdiagram, headers, function (response) { if (angular.isDefined(response.status) && response.status === 201) { toaster.pop({ type: "success", @@ -58,7 +65,8 @@ app.controller('EnergyFlowDiagramController', function($scope, $translate, $uibM }); modalInstance.result.then(function(modifiedEnergyFlowDiagram) { - EnergyFlowDiagramService.editEnergyFlowDiagram(modifiedEnergyFlowDiagram, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + EnergyFlowDiagramService.editEnergyFlowDiagram(modifiedEnergyFlowDiagram, headers, function (response) { if (angular.isDefined(response.status) && response.status === 200) { toaster.pop({ type: "success", @@ -95,7 +103,8 @@ app.controller('EnergyFlowDiagramController', function($scope, $translate, $uibM closeOnCancel: true }, function (isConfirm) { if (isConfirm) { - EnergyFlowDiagramService.deleteEnergyFlowDiagram(energyflowdiagram, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + EnergyFlowDiagramService.deleteEnergyFlowDiagram(energyflowdiagram, headers, function (response) { if (angular.isDefined(response.status) && response.status === 204) { toaster.pop({ type: "success", diff --git a/admin/app/services/settings/energyflowdiagram/energyflowdiagram.service.js b/admin/app/services/settings/energyflowdiagram/energyflowdiagram.service.js index c82b3f22..6180fe60 100644 --- a/admin/app/services/settings/energyflowdiagram/energyflowdiagram.service.js +++ b/admin/app/services/settings/energyflowdiagram/energyflowdiagram.service.js @@ -17,24 +17,24 @@ app.factory('EnergyFlowDiagramService', function($http) { callback(response); }); }, - addEnergyFlowDiagram: function(energyflowdiagram, callback) { - $http.post(getAPI()+'energyflowdiagrams',{data:energyflowdiagram}) + addEnergyFlowDiagram: function(energyflowdiagram, headers, callback) { + $http.post(getAPI()+'energyflowdiagrams',{data:energyflowdiagram}, {headers}) .then(function (response) { callback(response); }, function (response) { callback(response); }); }, - editEnergyFlowDiagram: function(energyflowdiagram, callback) { - $http.put(getAPI()+'energyflowdiagrams/'+energyflowdiagram.id,{data:energyflowdiagram}) + editEnergyFlowDiagram: function(energyflowdiagram, headers, callback) { + $http.put(getAPI()+'energyflowdiagrams/'+energyflowdiagram.id,{data:energyflowdiagram}, {headers}) .then(function (response) { callback(response); }, function (response) { callback(response); }); }, - deleteEnergyFlowDiagram: function(energyflowdiagram, callback) { - $http.delete(getAPI()+'energyflowdiagrams/'+energyflowdiagram.id) + deleteEnergyFlowDiagram: function(energyflowdiagram, headers, callback) { + $http.delete(getAPI()+'energyflowdiagrams/'+energyflowdiagram.id, {headers}) .then(function (response) { callback(response); }, function (response) { diff --git a/myems-api/MyEMS.postman_collection.json b/myems-api/MyEMS.postman_collection.json index d17add4c..86ba0b6c 100644 --- a/myems-api/MyEMS.postman_collection.json +++ b/myems-api/MyEMS.postman_collection.json @@ -1,6 +1,6 @@ { "info": { - "_postman_id": "98580f5c-106c-4b86-8262-ec3c918608e1", + "_postman_id": "ab4b1f3e-3892-4a0e-801b-4ec90d4592fe", "name": "MyEMS", "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" }, @@ -2030,7 +2030,20 @@ "name": "POST Create an Energy Flow Diagram", "request": { "method": "POST", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "description": "Any admin users' UUID", + "type": "text" + }, + { + "key": "Token", + "value": "073b43c05dadd89b833c0595b81c49cb9c1a54ca52b024b301a001720e52c5bf3b95951d5c54766de1028d20301cbd2bb6ec3fb62f9e14d7254cbf3811fe6c93", + "description": "Login to get a valid token", + "type": "text" + } + ], "body": { "mode": "raw", "raw": "{\"data\":{\"name\":\"MyEMS Energy Flow\"}}" @@ -2051,7 +2064,20 @@ "name": "PUT Update an Energy Flow Diagram", "request": { "method": "PUT", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "description": "Any admin users' UUID", + "type": "text" + }, + { + "key": "Token", + "value": "073b43c05dadd89b833c0595b81c49cb9c1a54ca52b024b301a001720e52c5bf3b95951d5c54766de1028d20301cbd2bb6ec3fb62f9e14d7254cbf3811fe6c93", + "description": "Login to get a valid token", + "type": "text" + } + ], "body": { "mode": "raw", "raw": "{\"data\":{\"name\":\"MyEMS Energy Flow Diagram\"}}" @@ -2073,7 +2099,20 @@ "name": "DELETE an Energy Flow Diagram", "request": { "method": "DELETE", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "description": "Any admin users' UUID", + "type": "text" + }, + { + "key": "Token", + "value": "073b43c05dadd89b833c0595b81c49cb9c1a54ca52b024b301a001720e52c5bf3b95951d5c54766de1028d20301cbd2bb6ec3fb62f9e14d7254cbf3811fe6c93", + "description": "Login to get a valid token", + "type": "text" + } + ], "url": { "raw": "{{base_url}}/energyflowdiagrams/2", "host": [ diff --git a/myems-api/README.md b/myems-api/README.md index 2d2a2374..99bcea51 100644 --- a/myems-api/README.md +++ b/myems-api/README.md @@ -604,15 +604,15 @@ curl -i -X GET {{base_url}}/energyflowdiagrams ``` * DELETE an Energy Flow Diagram by ID ```bash -curl -i -X DELETE {{base_url}}/energyflowdiagrams/{id} +curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/energyflowdiagrams/{id} ``` * POST Create an Energy Flow Diagram ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"MyEMS Energy Flow"}}' {{base_url}}/energyflowdiagrams +curl -i -H "Content-Type: application/json" -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X POST -d '{"data":{"name":"MyEMS Energy Flow"}}' {{base_url}}/energyflowdiagrams ``` * PUT Update an Energy Flow Diagram ```bash -curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"MyEMS Energy Flow Diagram"}}' {{base_url}}/energyflowdiagrams/{id} +curl -i -H "Content-Type: application/json" -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X PUT -d '{"data":{"name":"MyEMS Energy Flow Diagram"}}' {{base_url}}/energyflowdiagrams/{id} ``` * GET All Nodes of an Energy Flow Diagram by ID ```bash diff --git a/myems-api/core/energyflowdiagram.py b/myems-api/core/energyflowdiagram.py index 82c8c7d5..fa4f9304 100644 --- a/myems-api/core/energyflowdiagram.py +++ b/myems-api/core/energyflowdiagram.py @@ -3,7 +3,7 @@ import simplejson as json import mysql.connector import config import uuid -from core.useractivity import user_logger +from core.useractivity import user_logger, access_control class EnergyFlowDiagramCollection: @@ -124,6 +124,7 @@ class EnergyFlowDiagramCollection: @user_logger def on_post(req, resp): """Handles POST requests""" + access_control(req) try: raw_json = req.stream.read().decode('utf-8') except Exception as ex: @@ -285,6 +286,7 @@ class EnergyFlowDiagramItem: @staticmethod @user_logger def on_delete(req, resp, id_): + access_control(req) if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', description='API.INVALID_ENERGY_FLOW_DIAGRAM_ID') @@ -315,6 +317,7 @@ class EnergyFlowDiagramItem: @user_logger def on_put(req, resp, id_): """Handles PUT requests""" + access_control(req) if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', description='API.INVALID_ENERGY_FLOW_DIAGRAM_ID') From 62312e8c5477cdd369dbe6903593804d626045df Mon Sep 17 00:00:00 2001 From: tianlinzhong <673359306@qq.com> Date: Thu, 2 Dec 2021 09:56:13 +0800 Subject: [PATCH 016/117] energyflowdiagram of access_control2 --- .../energyflowdiagramlink.controller.js | 26 ++++++++++++++----- .../energyflowdiagramnode.controller.js | 22 +++++++++++----- .../energyflowdiagramlink.service.js | 12 ++++----- .../energyflowdiagramnode.service.js | 12 ++++----- myems-api/README.md | 12 ++++----- myems-api/core/energyflowdiagram.py | 6 +++++ 6 files changed, 60 insertions(+), 30 deletions(-) diff --git a/admin/app/controllers/settings/energyflowdiagram/energyflowdiagramlink.controller.js b/admin/app/controllers/settings/energyflowdiagram/energyflowdiagramlink.controller.js index 2849bd9d..330aadfa 100644 --- a/admin/app/controllers/settings/energyflowdiagram/energyflowdiagramlink.controller.js +++ b/admin/app/controllers/settings/energyflowdiagram/energyflowdiagramlink.controller.js @@ -1,6 +1,18 @@ 'use strict'; -app.controller('EnergyFlowDiagramLinkController', function($scope,$uibModal, $translate, MeterService, VirtualMeterService, OfflineMeterService, EnergyFlowDiagramLinkService, EnergyFlowDiagramService, EnergyFlowDiagramNodeService, toaster,SweetAlert) { +app.controller('EnergyFlowDiagramLinkController', function( + $scope, + $window, + $uibModal, + $translate, + MeterService, + VirtualMeterService, + OfflineMeterService, + EnergyFlowDiagramLinkService, + EnergyFlowDiagramService, + EnergyFlowDiagramNodeService, + toaster, + SweetAlert) { $scope.currentEnergyFlowDiagram = {selected:undefined}; $scope.is_show_add_link = false; $scope.energyflowdiagrams = []; @@ -10,7 +22,7 @@ app.controller('EnergyFlowDiagramLinkController', function($scope,$uibModal, $tr $scope.offlinemeters = []; $scope.virtualmeters = []; $scope.mergedMeters = []; - + $scope.cur_user = JSON.parse($window.localStorage.getItem("myems_admin_ui_current_user")); $scope.getAllEnergyFlowDiagrams = function() { EnergyFlowDiagramService.getAllEnergyFlowDiagrams(function (response) { if (angular.isDefined(response.status) && response.status === 200) { @@ -77,8 +89,8 @@ app.controller('EnergyFlowDiagramLinkController', function($scope,$uibModal, $tr if (energyflowdiagramlink.meter != null) { energyflowdiagramlink.meter_uuid = energyflowdiagramlink.meter.uuid; } - - EnergyFlowDiagramLinkService.addEnergyFlowDiagramLink(energyflowdiagramid, energyflowdiagramlink, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + EnergyFlowDiagramLinkService.addEnergyFlowDiagramLink(energyflowdiagramid, energyflowdiagramlink, headers, function (response) { if (angular.isDefined(response.status) && response.status === 201) { toaster.pop({ type: "success", @@ -128,7 +140,8 @@ app.controller('EnergyFlowDiagramLinkController', function($scope,$uibModal, $tr if (modifiedEnergyFlowDiagramLink.meter != null) { modifiedEnergyFlowDiagramLink.meter_uuid = modifiedEnergyFlowDiagramLink.meter.uuid; } - EnergyFlowDiagramLinkService.editEnergyFlowDiagramLink($scope.currentEnergyFlowDiagram.id, modifiedEnergyFlowDiagramLink, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + EnergyFlowDiagramLinkService.editEnergyFlowDiagramLink($scope.currentEnergyFlowDiagram.id, modifiedEnergyFlowDiagramLink, headers, function (response) { if (angular.isDefined(response.status) && response.status === 200) { toaster.pop({ type: "success", @@ -166,7 +179,8 @@ app.controller('EnergyFlowDiagramLinkController', function($scope,$uibModal, $tr }, function(isConfirm) { if (isConfirm) { - EnergyFlowDiagramLinkService.deleteEnergyFlowDiagramLink($scope.currentEnergyFlowDiagram.id, energyflowdiagramlink.id, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + EnergyFlowDiagramLinkService.deleteEnergyFlowDiagramLink($scope.currentEnergyFlowDiagram.id, energyflowdiagramlink.id, headers, function (response) { if (angular.isDefined(response.status) && response.status === 204) { toaster.pop({ type: "success", diff --git a/admin/app/controllers/settings/energyflowdiagram/energyflowdiagramnode.controller.js b/admin/app/controllers/settings/energyflowdiagram/energyflowdiagramnode.controller.js index fae5cfe7..bae48548 100644 --- a/admin/app/controllers/settings/energyflowdiagram/energyflowdiagramnode.controller.js +++ b/admin/app/controllers/settings/energyflowdiagram/energyflowdiagramnode.controller.js @@ -1,10 +1,18 @@ 'use strict'; -app.controller('EnergyFlowDiagramNodeController', function($scope, $translate, $uibModal, EnergyFlowDiagramService, EnergyFlowDiagramNodeService, toaster,SweetAlert) { +app.controller('EnergyFlowDiagramNodeController', function( + $scope, + $window, + $translate, + $uibModal, + EnergyFlowDiagramService, + EnergyFlowDiagramNodeService, + toaster, + SweetAlert) { $scope.energyflowdiagrams = []; $scope.energyflowdiagramnodes = []; $scope.currentEnergyFlowDiagram = null; - + $scope.cur_user = JSON.parse($window.localStorage.getItem("myems_admin_ui_current_user")); $scope.getAllEnergyFlowDiagrams = function() { EnergyFlowDiagramService.getAllEnergyFlowDiagrams(function (response) { if (angular.isDefined(response.status) && response.status === 200) { @@ -48,8 +56,8 @@ app.controller('EnergyFlowDiagramNodeController', function($scope, $translate, $ }); modalInstance.result.then(function(energyflowdiagramnode) { var energyflowdiagramid = $scope.currentEnergyFlowDiagram.id; - - EnergyFlowDiagramNodeService.addEnergyFlowDiagramNode(energyflowdiagramid, energyflowdiagramnode, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + EnergyFlowDiagramNodeService.addEnergyFlowDiagramNode(energyflowdiagramid, energyflowdiagramnode, headers, function (response) { if (angular.isDefined(response.status) && response.status === 201) { toaster.pop({ type: "success", @@ -88,7 +96,8 @@ app.controller('EnergyFlowDiagramNodeController', function($scope, $translate, $ }); modalInstance.result.then(function(modifiedEnergyFlowDiagramNode) { - EnergyFlowDiagramNodeService.editEnergyFlowDiagramNode($scope.currentEnergyFlowDiagram.id, modifiedEnergyFlowDiagramNode, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + EnergyFlowDiagramNodeService.editEnergyFlowDiagramNode($scope.currentEnergyFlowDiagram.id, modifiedEnergyFlowDiagramNode, headers, function (response) { if (angular.isDefined(response.status) && response.status === 200) { toaster.pop({ type: "success", @@ -126,7 +135,8 @@ app.controller('EnergyFlowDiagramNodeController', function($scope, $translate, $ }, function(isConfirm) { if (isConfirm) { - EnergyFlowDiagramNodeService.deleteEnergyFlowDiagramNode($scope.currentEnergyFlowDiagram.id, energyflowdiagramnode.id, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + EnergyFlowDiagramNodeService.deleteEnergyFlowDiagramNode($scope.currentEnergyFlowDiagram.id, energyflowdiagramnode.id, headers, function (response) { if (angular.isDefined(response.status) && response.status === 204) { toaster.pop({ type: "success", diff --git a/admin/app/services/settings/energyflowdiagram/energyflowdiagramlink.service.js b/admin/app/services/settings/energyflowdiagram/energyflowdiagramlink.service.js index 511fb04a..0709c60b 100644 --- a/admin/app/services/settings/energyflowdiagram/energyflowdiagramlink.service.js +++ b/admin/app/services/settings/energyflowdiagram/energyflowdiagramlink.service.js @@ -10,16 +10,16 @@ app.factory('EnergyFlowDiagramLinkService', function($http) { callback(response); }); }, - addEnergyFlowDiagramLink: function(energyflowdiagramID, energyflowdiagramlink, callback) { - $http.post(getAPI()+'energyflowdiagrams/'+energyflowdiagramID+'/links',{data:energyflowdiagramlink}) + addEnergyFlowDiagramLink: function(energyflowdiagramID, energyflowdiagramlink, headers, callback) { + $http.post(getAPI()+'energyflowdiagrams/'+energyflowdiagramID+'/links',{data:energyflowdiagramlink}, {headers}) .then(function (response) { callback(response); }, function (response) { callback(response); }); }, - editEnergyFlowDiagramLink: function(energyflowdiagramID,energyflowdiagramlink,callback) { - $http.put(getAPI()+'energyflowdiagrams/'+energyflowdiagramID+'/links/'+energyflowdiagramlink.id,{data:energyflowdiagramlink}) + editEnergyFlowDiagramLink: function(energyflowdiagramID, energyflowdiagramlink, headers, callback) { + $http.put(getAPI()+'energyflowdiagrams/'+energyflowdiagramID+'/links/'+energyflowdiagramlink.id,{data:energyflowdiagramlink}, {headers}) .then(function (response) { callback(response); }, function (response) { @@ -27,8 +27,8 @@ app.factory('EnergyFlowDiagramLinkService', function($http) { }); }, - deleteEnergyFlowDiagramLink: function(energyflowdiagramID, linkID, callback) { - $http.delete(getAPI()+'energyflowdiagrams/'+energyflowdiagramID+'/links/'+linkID) + deleteEnergyFlowDiagramLink: function(energyflowdiagramID, linkID, headers, callback) { + $http.delete(getAPI()+'energyflowdiagrams/'+energyflowdiagramID+'/links/'+linkID, {headers}) .then(function (response) { callback(response); }, function (response) { diff --git a/admin/app/services/settings/energyflowdiagram/energyflowdiagramnode.service.js b/admin/app/services/settings/energyflowdiagram/energyflowdiagramnode.service.js index b9d69a7f..4786ec09 100644 --- a/admin/app/services/settings/energyflowdiagram/energyflowdiagramnode.service.js +++ b/admin/app/services/settings/energyflowdiagram/energyflowdiagramnode.service.js @@ -9,16 +9,16 @@ app.factory('EnergyFlowDiagramNodeService', function($http) { callback(response); }); }, - addEnergyFlowDiagramNode: function(energyflowdiagramID, energyflowdiagramnode,callback) { - $http.post(getAPI()+'energyflowdiagrams/'+energyflowdiagramID+'/nodes',{data:energyflowdiagramnode}) + addEnergyFlowDiagramNode: function(energyflowdiagramID, energyflowdiagramnode, headers, callback) { + $http.post(getAPI()+'energyflowdiagrams/'+energyflowdiagramID+'/nodes',{data:energyflowdiagramnode}, {headers}) .then(function (response) { callback(response); }, function (response) { callback(response); }); }, - editEnergyFlowDiagramNode: function(energyflowdiagramID,energyflowdiagramnode,callback) { - $http.put(getAPI()+'energyflowdiagrams/'+energyflowdiagramID+'/nodes/'+energyflowdiagramnode.id,{data:energyflowdiagramnode}) + editEnergyFlowDiagramNode: function(energyflowdiagramID, energyflowdiagramnode, headers, callback) { + $http.put(getAPI()+'energyflowdiagrams/'+energyflowdiagramID+'/nodes/'+energyflowdiagramnode.id,{data:energyflowdiagramnode}, {headers}) .then(function (response) { callback(response); }, function (response) { @@ -26,8 +26,8 @@ app.factory('EnergyFlowDiagramNodeService', function($http) { }); }, - deleteEnergyFlowDiagramNode: function(energyflowdiagramID, nodeID, callback) { - $http.delete(getAPI()+'energyflowdiagrams/'+energyflowdiagramID+'/nodes/'+nodeID) + deleteEnergyFlowDiagramNode: function(energyflowdiagramID, nodeID, headers, callback) { + $http.delete(getAPI()+'energyflowdiagrams/'+energyflowdiagramID+'/nodes/'+nodeID, {headers}) .then(function (response) { callback(response); }, function (response) { diff --git a/myems-api/README.md b/myems-api/README.md index 1832f4d0..262bdef5 100644 --- a/myems-api/README.md +++ b/myems-api/README.md @@ -620,15 +620,15 @@ curl -i -X GET {{base_url}}/energyflowdiagrams/{id}/nodes ``` * POST Create a Node of an Energy Flow Diagram ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"10KV#1"}}' {{base_url}}/energyflowdiagrams/{id}/nodes +curl -i -H "Content-Type: application/json" -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X POST -d '{"data":{"name":"10KV#1"}}' {{base_url}}/energyflowdiagrams/{id}/nodes ``` * PUT Update a Node of an Energy Flow Diagram ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"10KV#2"}}' {{base_url}}/energyflowdiagrams/{id}/nodes/{nid} +curl -i -H "Content-Type: application/json" -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X POST -d '{"data":{"name":"10KV#2"}}' {{base_url}}/energyflowdiagrams/{id}/nodes/{nid} ``` * DELETE a Node of an Energy Flow Diagram ```bash -curl -i -X DELETE {{base_url}}/energyflowdiagrams/{id}/nodes/{nid} +curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/energyflowdiagrams/{id}/nodes/{nid} ``` * GET All Links of an Energy Flow Diagram by ID ```bash @@ -636,15 +636,15 @@ curl -i -X GET {{base_url}}/energyflowdiagrams/{id}/links ``` * POST Create a Link of an Energy Flow Diagram ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"source_node_id":1, "target_node_id":3, "meter_uuid":"d806a78d-a31e-4833-b5c8-81261cfeb1f2"}}' {{base_url}}/energyflowdiagrams/{id}/links +curl -i -H "Content-Type: application/json" -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X POST -d '{"data":{"source_node_id":1, "target_node_id":3, "meter_uuid":"d806a78d-a31e-4833-b5c8-81261cfeb1f2"}}' {{base_url}}/energyflowdiagrams/{id}/links ``` * PUT Update a Link of an Energy Flow Diagram ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"source_node_id":1, "target_node_id":4, "meter_uuid":"d806a78d-a31e-4833-b5c8-81261cfeb1f2"}}' {{base_url}}/energyflowdiagrams/{id}/links/{lid} +curl -i -H "Content-Type: application/json" -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X POST -d '{"data":{"source_node_id":1, "target_node_id":4, "meter_uuid":"d806a78d-a31e-4833-b5c8-81261cfeb1f2"}}' {{base_url}}/energyflowdiagrams/{id}/links/{lid} ``` * DELETE a Link of an Energy Flow Diagram ```bash -curl -i -X DELETE {{base_url}}/energyflowdiagrams/{id}/links/{lid} +curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/energyflowdiagrams/{id}/links/{lid} ``` ### Energy Item diff --git a/myems-api/core/energyflowdiagram.py b/myems-api/core/energyflowdiagram.py index fa4f9304..6eaa9b79 100644 --- a/myems-api/core/energyflowdiagram.py +++ b/myems-api/core/energyflowdiagram.py @@ -480,6 +480,7 @@ class EnergyFlowDiagramLinkCollection: @user_logger def on_post(req, resp, id_): """Handles POST requests""" + access_control(req) if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', description='API.INVALID_ENERGY_FLOW_DIAGRAM_ID') @@ -723,6 +724,7 @@ class EnergyFlowDiagramLinkItem: @staticmethod @user_logger def on_delete(req, resp, id_, lid): + access_control(req) if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', description='API.INVALID_ENERGY_FLOW_DIAGRAM_ID') @@ -771,6 +773,7 @@ class EnergyFlowDiagramLinkItem: @user_logger def on_put(req, resp, id_, lid): """Handles PUT requests""" + access_control(req) if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', description='API.INVALID_ENERGY_FLOW_DIAGRAM_ID') @@ -977,6 +980,7 @@ class EnergyFlowDiagramNodeCollection: @user_logger def on_post(req, resp, id_): """Handles POST requests""" + access_control(req) if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', description='API.INVALID_ENERGY_FLOW_DIAGRAM_ID') @@ -1072,6 +1076,7 @@ class EnergyFlowDiagramNodeItem: @staticmethod @user_logger def on_delete(req, resp, id_, nid): + access_control(req) if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', description='API.INVALID_ENERGY_FLOW_DIAGRAM_ID') @@ -1120,6 +1125,7 @@ class EnergyFlowDiagramNodeItem: @user_logger def on_put(req, resp, id_, nid): """Handles PUT requests""" + access_control(req) if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', description='API.INVALID_ENERGY_FLOW_DIAGRAM_ID') From 8dd998ed0c699e2be31dde5e9a1c79c8a4d311cd Mon Sep 17 00:00:00 2001 From: Caozhenhui <823914102@qq.com> Date: Thu, 2 Dec 2021 10:43:32 +0800 Subject: [PATCH 017/117] added access_control to privilege --- .../users/privilege/privilege.controller.js | 11 ++++++++--- .../services/users/privilege/privilege.service.js | 12 ++++++------ myems-api/README.md | 6 +++--- myems-api/core/privilege.py | 5 ++++- 4 files changed, 21 insertions(+), 13 deletions(-) diff --git a/admin/app/controllers/users/privilege/privilege.controller.js b/admin/app/controllers/users/privilege/privilege.controller.js index 80b2c094..30bfca59 100644 --- a/admin/app/controllers/users/privilege/privilege.controller.js +++ b/admin/app/controllers/users/privilege/privilege.controller.js @@ -1,11 +1,13 @@ 'use strict'; app.controller('PrivilegeController', function ($scope, + $window, $uibModal, PrivilegeService, toaster, $translate, SweetAlert) { + $scope.cur_user = JSON.parse($window.localStorage.getItem("myems_admin_ui_current_user")); $scope.getAllPrivileges = function () { PrivilegeService.getAllPrivileges(function (response) { if (angular.isDefined(response.status) && response.status === 200) { @@ -31,7 +33,8 @@ app.controller('PrivilegeController', function ($scope, } }); modalInstance.result.then(function (privilege) { - PrivilegeService.addPrivilege(privilege, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + PrivilegeService.addPrivilege(privilege, headers, function (response) { if (angular.isDefined(response.status) && response.status === 201) { toaster.pop({ type: "success", @@ -70,7 +73,8 @@ app.controller('PrivilegeController', function ($scope, }); modalInstance.result.then(function (modifiedPrivilege) { - PrivilegeService.editPrivilege(modifiedPrivilege, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + PrivilegeService.editPrivilege(modifiedPrivilege, headers, function (response) { if (angular.isDefined(response.status) && response.status === 200) { toaster.pop({ type: "success", @@ -107,7 +111,8 @@ app.controller('PrivilegeController', function ($scope, }, function (isConfirm) { if (isConfirm) { - PrivilegeService.deletePrivilege(privilege, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + PrivilegeService.deletePrivilege(privilege, headers, function (response) { if (angular.isDefined(response.status) && response.status === 204) { toaster.pop({ type: "success", diff --git a/admin/app/services/users/privilege/privilege.service.js b/admin/app/services/users/privilege/privilege.service.js index 04402b9a..096408a4 100644 --- a/admin/app/services/users/privilege/privilege.service.js +++ b/admin/app/services/users/privilege/privilege.service.js @@ -9,24 +9,24 @@ app.factory('PrivilegeService', function($http) { callback(response); }); }, - addPrivilege: function(privilege, callback) { - $http.post(getAPI()+'privileges',{data:privilege}) + addPrivilege: function(privilege, headers, callback) { + $http.post(getAPI()+'privileges', {headers}, {data:privilege}) .then(function (response) { callback(response); }, function (response) { callback(response); }); }, - editPrivilege: function(privilege, callback) { - $http.put(getAPI()+'privileges/'+privilege.id,{data:privilege}) + editPrivilege: function(privilege, headers, callback) { + $http.put(getAPI()+'privileges/'+privilege.id, {headers}, {data:privilege}) .then(function (response) { callback(response); }, function (response) { callback(response); }); }, - deletePrivilege: function(privilege, callback) { - $http.delete(getAPI()+'privileges/'+privilege.id) + deletePrivilege: function(privilege, headers, callback) { + $http.delete(getAPI()+'privileges/'+privilege.id, {headers}) .then(function (response) { callback(response); }, function (response) { diff --git a/myems-api/README.md b/myems-api/README.md index 4c5cc047..9219b549 100644 --- a/myems-api/README.md +++ b/myems-api/README.md @@ -1251,15 +1251,15 @@ curl -i -X GET {{base_url}}/privileges ``` * DELETE Privilege by ID ```bash -curl -i -X DELETE {{base_url}}/privileges/{id} +curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/privileges/{id} ``` * POST New Privilege ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"superusers","data":"{\"spaces\":[1,2,3,5]}"}}' {{base_url}}/privileges +curl -i -H "Content-Type: application/json" -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X POST -d '{"data":{"name":"superusers","data":"{\"spaces\":[1,2,3,5]}"}}' {{base_url}}/privileges ``` * PUT Privilege ```bash -curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"superusers", "data":"{\"spaces\":[1, 3]}"}}' {{base_url}}/privileges/{id} +curl -i -H "Content-Type: application/json" -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X PUT -d '{"data":{"name":"superusers", "data":"{\"spaces\":[1, 3]}"}}' {{base_url}}/privileges/{id} ``` ### Rule diff --git a/myems-api/core/privilege.py b/myems-api/core/privilege.py index f0faa48d..302530e3 100644 --- a/myems-api/core/privilege.py +++ b/myems-api/core/privilege.py @@ -2,7 +2,7 @@ import falcon import simplejson as json import mysql.connector import config -from core.useractivity import user_logger +from core.useractivity import user_logger, access_control class PrivilegeCollection: @@ -42,6 +42,7 @@ class PrivilegeCollection: @user_logger def on_post(req, resp): """Handles POST requests""" + access_control(req) try: raw_json = req.stream.read().decode('utf-8') new_values = json.loads(raw_json) @@ -101,6 +102,7 @@ class PrivilegeItem: @staticmethod @user_logger def on_delete(req, resp, id_): + access_control(req) if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', description='API.INVALID_PRIVILEGE_ID') @@ -142,6 +144,7 @@ class PrivilegeItem: @user_logger def on_put(req, resp, id_): """Handles PUT requests""" + access_control(req) try: raw_json = req.stream.read().decode('utf-8') new_values = json.loads(raw_json) From 29f3b91e56c1c0eb13d1d3dc8732332e2a4dfeea Mon Sep 17 00:00:00 2001 From: Caozhenhui <823914102@qq.com> Date: Thu, 2 Dec 2021 10:57:39 +0800 Subject: [PATCH 018/117] fixed the sequence of parameter --- admin/app/services/users/privilege/privilege.service.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/admin/app/services/users/privilege/privilege.service.js b/admin/app/services/users/privilege/privilege.service.js index 096408a4..53ac75d5 100644 --- a/admin/app/services/users/privilege/privilege.service.js +++ b/admin/app/services/users/privilege/privilege.service.js @@ -10,7 +10,7 @@ app.factory('PrivilegeService', function($http) { }); }, addPrivilege: function(privilege, headers, callback) { - $http.post(getAPI()+'privileges', {headers}, {data:privilege}) + $http.post(getAPI()+'privileges', {data:privilege}, {headers}) .then(function (response) { callback(response); }, function (response) { @@ -18,7 +18,7 @@ app.factory('PrivilegeService', function($http) { }); }, editPrivilege: function(privilege, headers, callback) { - $http.put(getAPI()+'privileges/'+privilege.id, {headers}, {data:privilege}) + $http.put(getAPI()+'privileges/'+privilege.id, {data:privilege}, {headers}) .then(function (response) { callback(response); }, function (response) { From 8f2db8952f97535102adb8f718f8c2cb352f7a33 Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Fri, 3 Dec 2021 13:51:14 +0800 Subject: [PATCH 019/117] added access control to energyflowdiagram in api and admin --- .../energyflowdiagram.controller.js | 3 +- .../energyflowdiagramlink.controller.js | 19 ++- .../equipmentparameter.model.html | 84 ---------- myems-api/MyEMS.postman_collection.json | 150 +++++++++++++----- 4 files changed, 125 insertions(+), 131 deletions(-) delete mode 100644 admin/app/services/settings/energyflowdiagram/equipmentparameter.model.html diff --git a/admin/app/controllers/settings/energyflowdiagram/energyflowdiagram.controller.js b/admin/app/controllers/settings/energyflowdiagram/energyflowdiagram.controller.js index 5cf69fae..f17b5639 100644 --- a/admin/app/controllers/settings/energyflowdiagram/energyflowdiagram.controller.js +++ b/admin/app/controllers/settings/energyflowdiagram/energyflowdiagram.controller.js @@ -1,6 +1,7 @@ 'use strict'; -app.controller('EnergyFlowDiagramController', function($scope, +app.controller('EnergyFlowDiagramController', function( + $scope, $window, $translate, $uibModal, diff --git a/admin/app/controllers/settings/energyflowdiagram/energyflowdiagramlink.controller.js b/admin/app/controllers/settings/energyflowdiagram/energyflowdiagramlink.controller.js index 330aadfa..2355d33f 100644 --- a/admin/app/controllers/settings/energyflowdiagram/energyflowdiagramlink.controller.js +++ b/admin/app/controllers/settings/energyflowdiagram/energyflowdiagramlink.controller.js @@ -279,15 +279,14 @@ app.controller('EnergyFlowDiagramLinkController', function( app.controller('ModalAddEnergyFlowDiagramLinkCtrl', function($scope, $uibModalInstance, params) { $scope.operation = "ENERGY_FLOW_DIAGRAM.ADD_LINK"; - $scope.energyflowdiagramlink = { - source_node: {id: null, name: null}, - target_node: {id: null, name: null}, - meter: {id: null, uuid: null, name: null, type: null}, - }; - $scope.energyflowdiagramnodes = params.energyflowdiagramnodes; - $scope.mergedmeters = params.mergedmeters; + $scope.energyflowdiagramlink = { + source_node: {id: null, name: null}, + target_node: {id: null, name: null}, + meter: {id: null, uuid: null, name: null, type: null}, + }; + $scope.energyflowdiagramnodes = params.energyflowdiagramnodes; + $scope.mergedmeters = params.mergedmeters; $scope.ok = function() { - $uibModalInstance.close($scope.energyflowdiagramlink); }; @@ -299,8 +298,8 @@ app.controller('ModalAddEnergyFlowDiagramLinkCtrl', function($scope, $uibModalIn app.controller('ModalEditEnergyFlowDiagramLinkCtrl', function($scope, $uibModalInstance, params) { $scope.operation = "ENERGY_FLOW_DIAGRAM.EDIT_LINK"; $scope.energyflowdiagramlink = params.energyflowdiagramlink; - $scope.energyflowdiagramnodes = params.energyflowdiagramnodes; - $scope.mergedmeters = params.mergedmeters; + $scope.energyflowdiagramnodes = params.energyflowdiagramnodes; + $scope.mergedmeters = params.mergedmeters; $scope.ok = function() { $uibModalInstance.close($scope.energyflowdiagramlink); }; diff --git a/admin/app/services/settings/energyflowdiagram/equipmentparameter.model.html b/admin/app/services/settings/energyflowdiagram/equipmentparameter.model.html deleted file mode 100644 index f1bfb19c..00000000 --- a/admin/app/services/settings/energyflowdiagram/equipmentparameter.model.html +++ /dev/null @@ -1,84 +0,0 @@ -
`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n// Abbreviations\n//\n// 1. Duplicate behavior to the data-* attribute for our tooltip plugin\n// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n// 3. Add explicit cursor to indicate changed behavior.\n// 4. Remove the bottom border in Firefox 39-.\n// 5. Prevent the text-decoration to be skipped.\n\nabbr[title],\nabbr[data-original-title] { // 1\n text-decoration: underline; // 2\n text-decoration: underline dotted; // 2\n cursor: help; // 3\n border-bottom: 0; // 4\n text-decoration-skip-ink: none; // 5\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // Undo browser default\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: $font-weight-bolder; // Add the correct font weight in Chrome, Edge, and Safari\n}\n\nsmall {\n @include font-size(80%); // Add the correct font size in all browsers\n}\n\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n//\n\nsub,\nsup {\n position: relative;\n @include font-size(75%);\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n//\n// Links\n//\n\na {\n color: $link-color;\n text-decoration: $link-decoration;\n background-color: transparent; // Remove the gray background on active links in IE 10.\n\n @include hover() {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([class]) {\n color: inherit;\n text-decoration: none;\n\n @include hover() {\n color: inherit;\n text-decoration: none;\n }\n}\n\n\n//\n// Code\n//\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-monospace;\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n}\n\npre {\n // Remove browser default top margin\n margin-top: 0;\n // Reset browser default of `1em` to use `rem`s\n margin-bottom: 1rem;\n // Don't allow content to break outside\n overflow: auto;\n // Disable auto-hiding scrollbar in IE & legacy Edge to avoid overlap,\n // making it impossible to interact with the content\n -ms-overflow-style: scrollbar;\n}\n\n\n//\n// Figures\n//\n\nfigure {\n // Apply a consistent margin strategy (matches our type styles).\n margin: 0 0 1rem;\n}\n\n\n//\n// Images and content\n//\n\nimg {\n vertical-align: middle;\n border-style: none; // Remove the border on images inside links in IE 10-.\n}\n\nsvg {\n // Workaround for the SVG overflow bug in IE10/11 is still required.\n // See https://github.com/twbs/bootstrap/issues/26878\n overflow: hidden;\n vertical-align: middle;\n}\n\n\n//\n// Tables\n//\n\ntable {\n border-collapse: collapse; // Prevent double borders\n}\n\ncaption {\n padding-top: $table-cell-padding;\n padding-bottom: $table-cell-padding;\n color: $table-caption-color;\n text-align: left;\n caption-side: bottom;\n}\n\n// 1. Removes font-weight bold by inheriting\n// 2. Matches default `