Bläddra i källkod

添加人脸识别设备更新消息;用户增加头像管理

sunmiao 4 år sedan
förälder
incheckning
d30153f3d9

+ 6 - 1
backend/src/dashoo.cn/mcs_api/conf/app.conf

@@ -13,8 +13,13 @@ apiurl=http://47.92.238.200:10015/v1
 type=mysql
 name=mcs_db
 host=rm-8vbk16zx2rbfu6jt6uo.mysql.zhangbei.rds.aliyuncs.com
+db_port=3306
 user=mcs_user
 pwd=X6T1pa5o1AgO
 
 [redis]
-addr = 39.98.34.197:26379
+addr = 39.98.34.197:26379
+
+[nsq]
+nsqd_tcp_addr = 47.92.249.239:9150
+topic = mcs_facelock_check

+ 25 - 4
backend/src/dashoo.cn/mcs_api/controllers/user.go

@@ -2,11 +2,14 @@ package controllers
 
 import (
 	"encoding/json"
+	"fmt"
+	"github.com/nsqio/go-nsq"
 	"strings"
 
 	"dashoo.cn/base_common/business/auth"
 	"dashoo.cn/base_common/business/permission"
 	"dashoo.cn/base_common/business/userRole"
+	"dashoo.cn/base_common/utils"
 	"dashoo.cn/mcs_api/business/accountinfo"
 	"dashoo.cn/mcs_api/business/authcodeman"
 	"dashoo.cn/mcs_api/business/company"
@@ -15,7 +18,6 @@ import (
 	"dashoo.cn/mcs_api/business/logsinfo"
 	"dashoo.cn/mcs_api/business/organize"
 	"dashoo.cn/mcs_api/models"
-	"dashoo.cn/base_common/utils"
 )
 
 // Operations about Users
@@ -293,12 +295,14 @@ func (this *UserController) EditUser() {
 		userentity.Modifiedby = this.User.Realname
 		userentity.Departmentid = model.DepartmentId
 		userentity.Departmentname = model.DepartmentName
+		userentity.Photo = model.Photo
 
-		var cols []string = []string{"Realname", "Roleid", "Telephone", "Mobile", "Description", "Modifieduserid", "Modifiedby", "Departmentid", "Departmentname"}
+		var cols []string = []string{"Realname", "Roleid", "Telephone", "Mobile", "Description", "Modifieduserid", "Modifiedby", "Departmentid", "Departmentname", "Photo"}
 
 		err := svc.UpdateEntityAndBackupByCols(id, &userentity, &userentityempty, cols, utils.ToStr(this.User.Id), this.User.Realname)
 
 		if err == nil {
+			sendFaceLockCheckMsg(id, "update")
 			errinfo.Message = "保存成功!"
 			errinfo.Code = 0
 			this.Data["json"] = &errinfo
@@ -436,11 +440,12 @@ func (this *UserController) SetPermission() {
 		}
 	}
 
+	sendFaceLockCheckMsg(utils.ToStr(uid), "power")
+
 	errinfo.Message = "权限调整成功"
 	errinfo.Code = 0
 	this.Data["json"] = &errinfo
 	this.ServeJSON()
-
 }
 
 // @Title 创建用户
@@ -490,7 +495,6 @@ func (this *UserController) ResetPassWord() {
 		this.Data["json"] = &errinfo
 		this.ServeJSON()
 	}
-
 }
 
 // @Title 创建用户
@@ -553,6 +557,7 @@ func (this *UserController) MemberSetting() {
 
 		}
 
+		sendFaceLockCheckMsg(utils.ToStr(userentity.Id), "update")
 		errinfo.Message = "设置成功"
 		errinfo.Code = 0
 		this.Data["json"] = &errinfo
@@ -726,3 +731,19 @@ func (this *UserController) GetUserModule() {
 	this.Data["json"] = model
 	this.ServeJSON()
 }
+
+// 发出人脸识别设备更新检查消息
+// action: update 用户照片更新,power 设备权限更新
+func sendFaceLockCheckMsg(userId, action string) {
+	nsqdAddr := utils.Cfg.MustValue("nsq", "nsqd_tcp_addr")
+	topic := utils.Cfg.MustValue("nsq", "topic")
+	config := nsq.NewConfig()
+	w, err := nsq.NewProducer(nsqdAddr, config)
+	if err != nil {
+		fmt.Println("初始化NsqProducer失败:", err)
+	}
+	err = w.Publish(topic, []byte(userId+ "|" + action))
+	if err != nil {
+		fmt.Println("发送NSQ消息失败:", err)
+	}
+}

+ 0 - 4
backend/src/dashoo.cn/mcs_api/main.go

@@ -1,7 +1,3 @@
-//go:generate sh -c "echo 'package routers; import \"github.com/astaxie/beego\"; func init() {beego.BConfig.RunMode = beego.DEV}' > routers/0.go"
-//go:generate sh -c "echo 'package routers; import \"os\"; func init() {os.Exit(0)}' > routers/z.go"
-//go:generate go run $GOFILE
-//go:generate sh -c "rm routers/0.go routers/z.go"
 package main
 
 import (

+ 86 - 0
frontend_web/package.json

@@ -0,0 +1,86 @@
+{
+  "name": "frontend_web",
+  "version": "1.0.0",
+  "description": "A Vue.js project",
+  "author": "sunmiao@dashoo.cn",
+  "private": true,
+  "scripts": {
+    "dev": "node build/dev-server.js",
+    "start": "node build/dev-server.js",
+    "build": "node build/build.js",
+    "lint": "eslint --ext .js,.vue src"
+  },
+  "dependencies": {
+    "axios": "^0.16.1",
+    "echarts": "^3.3.2",
+    "element-ui": "^1.3.1",
+    "highcharts": "^5.0.0",
+    "nprogress": "^0.2.0",
+    "store": "^2.0.4",
+    "videojs-contrib-hls": "^5.15.0",
+    "vue": "^2.3.0",
+    "vue-amap": "^0.3.0",
+    "vue-i18n": "^6.1.0",
+    "vue-router": "^2.4.0",
+    "vue-video-player": "^5.0.2",
+    "vuedraggable": "^2.14.1",
+    "vuex": "^2.3.1",
+    "vuex-i18n": "^1.10.5",
+    "vuex-router-sync": "^4.1.2"
+  },
+  "devDependencies": {
+    "autoprefixer": "^6.7.2",
+    "babel-core": "^6.22.1",
+    "babel-eslint": "^7.1.1",
+    "babel-loader": "^6.2.10",
+    "babel-plugin-transform-runtime": "^6.22.0",
+    "babel-preset-env": "^1.3.2",
+    "babel-preset-stage-2": "^6.22.0",
+    "babel-register": "^6.22.0",
+    "chalk": "^1.1.3",
+    "connect-history-api-fallback": "^1.3.0",
+    "copy-webpack-plugin": "^4.0.1",
+    "css-loader": "^0.28.0",
+    "eslint": "^3.19.0",
+    "eslint-config-standard": "^6.2.1",
+    "eslint-friendly-formatter": "^2.0.7",
+    "eslint-loader": "^1.7.1",
+    "eslint-plugin-html": "^2.0.3",
+    "eslint-plugin-promise": "^3.4.0",
+    "eslint-plugin-standard": "^2.0.1",
+    "eventsource-polyfill": "^0.9.6",
+    "express": "^4.14.1",
+    "extract-text-webpack-plugin": "^2.0.0",
+    "file-loader": "^0.11.1",
+    "friendly-errors-webpack-plugin": "^1.1.3",
+    "html-webpack-plugin": "^2.28.0",
+    "http-proxy-middleware": "^0.17.3",
+    "node-sass": "^4.14.1",
+    "opn": "^4.0.2",
+    "optimize-css-assets-webpack-plugin": "^1.3.0",
+    "ora": "^1.2.0",
+    "rimraf": "^2.6.0",
+    "sass-loader": "^6.0.7",
+    "semver": "^5.3.0",
+    "shelljs": "^0.7.6",
+    "url-loader": "^0.5.8",
+    "vue-loader": "^11.3.4",
+    "vue-style-loader": "^2.0.5",
+    "vue-template-compiler": "^2.3.0",
+    "webpack": "^2.5.1",
+    "webpack-bundle-analyzer": "^2.6.0",
+    "webpack-dev-middleware": "^1.10.0",
+    "webpack-hot-middleware": "^2.18.0",
+    "webpack-merge": "^4.1.0"
+  },
+  "engines": {
+    "node": ">= 4.0.0",
+    "yarn": ">= 0.0.0",
+    "npm": ">= 3.0.0"
+  },
+  "browserslist": [
+    "> 1%",
+    "last 2 versions",
+    "not ie <= 8"
+  ]
+}

BIN
frontend_web/src/assets/images/1.png


BIN
frontend_web/src/assets/images/2.png


BIN
frontend_web/src/assets/images/3.png


+ 37 - 3
frontend_web/src/views/main/users.vue

@@ -112,6 +112,13 @@
                        v-model="selectedorg"
                        placeholder="请选择组织"></el-cascader>
         </el-form-item>
+        <el-form-item :label="$t('message.usersetting.image')"
+                      label-width="120px">
+          <el-upload class="avatar-uploader" :action="'http://'+host+'/api/users/uploadphoto'" :show-file-list="false" :on-success="handleAvatarSuccess" :before-upload="beforeAvatarUpload">
+            <img v-if="imageUrl" :src="imageUrl" class="usersettingavatar">
+            <img v-else class="usersettingavatar" src="../../assets/images/avatar-default.jpg">
+          </el-upload>
+        </el-form-item>
         <el-form-item :label="$t('message.users.Telephone')"
                       label-width="120px"
                       prop="telephone">
@@ -221,7 +228,8 @@ export default {
         role: '10000123',
         id: 0,
         departmentid: '',
-        departmentname: ''
+        departmentname: '',
+        photo: ''
       },
       rulesuser: {
         username: [
@@ -248,7 +256,9 @@ export default {
       },
       selectedorg: [],
       userdepartment: [],
-      ischeckbj: false // 过滤字段勾选时触发的选中事件
+      ischeckbj: false, // 过滤字段勾选时触发的选中事件
+      host: '',
+      imageUrl: ''
     }
   },
   computed: mapGetters({
@@ -261,6 +271,7 @@ export default {
     this.loadequipsall()
     this.userdepartment.push(parseInt(this.session.user.Profile.DepartmentId))
     this.selectedorg = [parseInt(this.session.user.Profile.DepartmentId)]
+    this.host = this.session.user.Profile.Host
   },
   methods: {
     initData () {
@@ -336,6 +347,10 @@ export default {
               _this.userform.description = v.Description
               _this.userform.role = v.Roleid + ''
               _this.userform.id = v.Id
+              _this.userform.photo = v.Photo
+              if (_this.userform.photo !== '') {
+                _this.imageUrl = `http://${this.host}${_this.userform.photo}`
+              }
               // 选中状态
               _this.selectedorg = []
               let pidarr = res.data.message.split(',')
@@ -455,8 +470,10 @@ export default {
         telephone: '',
         mobile: '',
         description: '',
-        role: '10000123'
+        role: '10000123',
+        photo: ''
       }
+      this.imageUrl = ''
     },
     permission (v) {
       let _this = this
@@ -649,6 +666,23 @@ export default {
         }
       }
       return nodes
+    },
+     handleAvatarSuccess(res, file) {
+      this.userform.photo = res
+      this.imageUrl = URL.createObjectURL(file.raw)
+    },
+    beforeAvatarUpload(file) {
+      const isJPG = (file.type.indexOf('image/') === 0)
+      const isLt2M = file.size / 1024 / 1024 < 1
+      if (!isJPG) {
+        this.$message.error(this.$t('message.usersetting.format'))
+        return false
+      }
+      if (!isLt2M) {
+        this.$message.error(this.$t('message.usersetting.size'))
+        return false
+      }
+      return true
     }
   }
 }