tangning 3 år sedan
förälder
incheckning
85aeedb889

+ 2 - 2
public/index.html

@@ -5,11 +5,11 @@
     <meta http-equiv="X-UA-Compatible" content="IE=edge">
     <meta name="viewport" content="width=device-width,initial-scale=1.0">
     <link rel="icon" href="<%= BASE_URL %>favicon.ico">
-    <title>广东省消防救援总队火场三维数据平台 </title>
+    <title>消防火调三维远程勘验平台 </title>
   </head>
   <body>
     <noscript>
-      <strong>We're sorry but 房车宝VR看房平台 doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
+      <strong>Three-dimensional remote prospecting platform of fire scene of Fire Resue</strong>
     </noscript>
     <div id="app"></div>
     <div id="dialog"></div>

+ 4 - 4
src/assets/style/public.scss

@@ -376,10 +376,10 @@ body {
 
 .el-popper:not(.el-cascader__dropdown,.el-picker__popper,.el-dropdown__popper)  {
   max-width: 500px;
-  background: #EFEFEF;
-  box-shadow: 0px 2px 4px 0px #e4e4e4;
-  border-radius: 2px;
-  border: 1px solid #D7D7D7;
+  // background: #EFEFEF;
+  // box-shadow: 0px 2px 4px 0px #e4e4e4;
+  // border-radius: 2px;
+  // border: 1px solid #D7D7D7;
   padding: 2px 6px;
   word-break: break-all;
 }

+ 3 - 2
src/components/company-select/index.vue

@@ -105,6 +105,7 @@ export default {
     let threeOptions = ref([])
     let threeValue = computed({
       get() {
+        console.log('threeOptions.value',threeOptions.value)
         return findData(threeOptions.value, ret.value.value)
       },
       set(val) {
@@ -114,18 +115,18 @@ export default {
 
     return {...ret, threeOptions, threeValue}
   },
-  async mounted() {
+  async created () {
     let res = await axios.get(getTreeselect)
     let coms = Array.isArray(res.data) ? res.data : [res.data]
     if (this.showAll) {
       this.threeOptions = [{label: '全部', value: ''}].concat(analyData(coms))
     } else if (this.notUpdate){
-      console.log(findItemSelect(analyData(coms), this.value))
       this.threeOptions = findItemSelect(analyData(coms), this.value)
       // this.threeOptions = []
     } else {
       this.threeOptions = analyData(coms)
     }
+    console.log('threeOptions',this.threeOptions,this.showAll,this.notUpdate)
     this.options = coms.map(item => ({...item, id: item.id.toString(), sort: item.sort }))
     extObj.mounted.call(this)
   }

+ 2 - 1
src/constant/REG.js

@@ -6,7 +6,8 @@ export const PSW ={
 
 // 手机号校验
 export const PHONE = {
-  REG: /^((13[0-9]|14[01456879]|15[0-3,5-9]|16[2567]|17[0-8]|18[0-9]|19[0-3,5-9])\d{8})|(8){11}$/,
+  REG: /^1(3|4|5|6|7|8|9)\d{9}$/,
+  // REG: /^((13[0-9]|14[01456879]|15[0-3,5-9]|16[2567]|17[0-8]|18[0-9]|19[0-3,5-9])\d{8})|(8){11}$/,
   tip: '手机号格式不正确!'
 }
 

+ 1 - 1
src/constant/index.js

@@ -523,4 +523,4 @@ export const types = [
   { name: '其他', value: 2 }
 ]
 
-export const ADMIN_USER_ID = 'USER00011379381288039055360'
+export const ADMIN_USER_ID = 'admin-dept'

+ 1 - 2
src/main.js

@@ -19,8 +19,7 @@ app.directive('power',{
         let roleKeyList = user._value.roleKeyList
         let rokeName =  `${replacelist[routeName] || routeName}:${binding.value}`
         if(!roleKeyList.includes(rokeName)){
-            console.log('removeChild',el,roleKeyList.includes(rokeName),rokeName,roleKeyList);
-            el.parentNode.removeChild(el);
+            el.parentNode&&el.parentNode.removeChild(el);
         }
     }
 })

+ 1 - 1
src/state/user.js

@@ -49,7 +49,7 @@ watch(
 export const setPermission = async (val,permissions) => {
   let power = []
   if (val !== void 0){
-    power = permissions&&permissions.map(element => element.replace('dept','organization'));
+    power = permissions&&permissions.map(element => element.replace('dept','organization').replace('scene','vrmodel'));
     let pubPermission = ['home', 'vrmodel', 'camera', 'teaching', 'dispatch'].map(key => ({
       children: [
         { resourceKey: key + ':select' },

+ 3 - 4
src/view/camera/index.vue

@@ -41,7 +41,8 @@
       <el-table-column label="S/N码" prop="snCode"></el-table-column>
       <el-table-column label="所属架构" prop="deptName"></el-table-column>
       <el-table-column label="云容量使用情况" v-slot:default="{ row }">
-        {{row.usedSpaceStr}} / {{row.totalSpaceStr}}
+        {{row.usedSpaceStr}} 
+        <!-- / {{row.totalSpaceStr}} -->
       </el-table-column>
       <el-table-column label="操作" v-slot:default="{ row }" v-if="auth.unbind || auth.update">
         <!-- <span class="oper-span" @click="oper.readyUpdate(row)" v-if="auth.update">编辑</span> -->
@@ -81,9 +82,7 @@
             v-for="item in list"
             :key="item.id"
             :label="item.nickName"
-            :value="item.id"
-          >
-          </el-option>
+            :value="item.id" />
         </el-select>
       </el-form-item>
     </el-form>

+ 1 - 0
src/view/dispatch/archives.vue

@@ -60,6 +60,7 @@
       </el-form-item>
       <el-form-item label="附件:" class="mandatory">
         <el-upload
+        :disabled="!!oper.state.fileOssUrl"
           class="upload-demo"
           :http-request="uploadFile"
           :multiple="false"

+ 13 - 9
src/view/dispatch/index.vue

@@ -55,11 +55,12 @@
       <h3 style="visibility: hidden;">项目列表</h3>
       <div class="table-ctrl-right">
         <template v-if="isTeaching">
-          <el-button type="primary" @click="revokeTeaching()" v-if="auth.setting" :disabled="!dataList.selectRows.length">撤销教学</el-button>
+          <el-button type="primary" @click="revokeTeaching()" v-power="'cancel'" v-if="auth.setting" :disabled="!dataList.selectRows.length">撤销教学</el-button>
         </template>
         <template v-else>
-          <el-button type="primary" @click="insertProject">新增火调项目</el-button>
-          <el-button type="primary" @click="setTeaching" v-if="auth.setting" :disabled="!dataList.selectRows.length">设为教学项目</el-button>
+          <el-button type="primary" @click="insertProject" v-if="user.roleKey!=='admin'" v-power="'add'">新增火调项目</el-button>
+          <!-- :disabled="!dataList.selectRows.length" -->
+          <el-button type="primary" @click="setTeaching" v-if="user.roleKey=='admin-dept' && auth.setting" v-power="'teach'" >设为教学项目</el-button>
         </template>
       </div>
     </div>
@@ -89,7 +90,7 @@
         </el-tooltip>
         <p class="tip" v-else>{{row.projectAddress}}</p></el-table-column>
       <el-table-column label="起火场所" prop="projectSite" v-slot:default="{ row }" >
-        <el-tooltip class="item" effect="light" :content="row.projectSite" placement="bottom-start" v-if="row.projectSite && row.projectSite.length > 15">
+        <el-tooltip class="item" effect="light" :content="row.projectSite" placement="bottom-start" v-if="row.projectSite && row.projectSite.length > 10">
           <p class="tip oper-user">{{row.projectSite}}</p>
         </el-tooltip>
         <p class="tip" v-else>{{row.projectSite}}</p></el-table-column>
@@ -107,12 +108,12 @@
         <span class="oper-span" @click="queryDetail(row)" v-power="'view'">详情</span>
         <span class="oper-span" @click="archivesHandle(row)" v-power="'readFile'">档案</span>
         <span class="oper-span" @click="queryScene(row)">场景</span>
-        <span class="oper-span" v-if="row.vrLink" @click="takeLook(row)">带看</span>
+        <span class="oper-span" v-if="row.vrLink && !isTeaching" @click="takeLook(row)">带看</span>
         <template v-if="isTeaching">
           <span class="oper-span" @click="leaveMsgHandle(row)">留言</span>
           <span class="oper-span" 
-            @click=" user.info.id === ADMIN_USER_ID && revokeTeaching(row)" 
-            :class="{disable: user.info.id !== ADMIN_USER_ID}"
+            @click=" user.roleKey === ADMIN_USER_ID && revokeTeaching(row)" 
+            :class="{disable: user.roleKey !== ADMIN_USER_ID}"
             style="color: var(--primaryColor)">
             撤销
           </span>
@@ -616,10 +617,13 @@ export default {
       this.detail.show = true
     },
     async setTeaching() {
+      let items = this.dataList.selectRows || []
+      if (!items.length) {
+        return this.$message.error("请先选择操作项", "提示");
+      }
       if (!(await this.$confirm('将火调场景设为教学项目后,所有用户均可查看。设置后可在教学平台取消设置。', '设为教学项目'))) {
         return
       }
-      let items = this.dataList.selectRows
       await axios.post(setTeach, {ids: items.map(({id}) => id).join(',')})
       this.dataList.refer()
       this.$message({
@@ -789,7 +793,7 @@ export default {
   -webkit-line-clamp: 2;
   line-clamp: 2;
   -webkit-box-orient: vertical;
-  height: 50px;
+  /* height: 50px; */
   white-space: initial
 }
 </style>

+ 2 - 2
src/view/home/index.vue

@@ -7,9 +7,9 @@
       <p>Three-dimensional remote prospecting platform of fire scene of Fire Resue</p>
     </div>
     <div class="foot">
-      <p> 广东省消防救援总队火场三维数据平台</p>
+      <!-- <p> 广东省消防救援总队火场三维数据平台</p> -->
       <p>珠海市四维时代网络科技有限公司</p>
-      <p>技术支持</p>
+      <!-- <p>技术支持</p> -->
     </div>
   </div>
 </template>

+ 2 - 2
src/view/layout/index.vue

@@ -10,9 +10,9 @@
         <div class="view">
           <div class="main">
             <router-view v-slot="{ Component }">
-              <keep-alive >
+              <!-- <keep-alive > -->
                 <component :is="Component" />
-              </keep-alive>
+              <!-- </keep-alive> -->
             </router-view>
           </div>
         </div>

+ 16 - 12
src/view/layout/top/index.vue

@@ -43,20 +43,20 @@
       <el-form-item label="手机号:" class="mandatory">
         <el-input v-model="data.phone" placeholder="请输入手机号码" disabled></el-input>
       </el-form-item>
-      <el-form-item label="验证码:" class="mandatory">
-        <el-input v-model="data.code" placeholder="请输入验证码">
-        <template v-slot:suffix>
+      <el-form-item label="原密码:" class="mandatory">
+        <el-input v-model="data.oldPwd" placeholder="请输入原密码">
+        <!-- <template v-slot:suffix>
           <el-button type="primary" plain class="input-inner-btn" @click="sendCode" :disabled="msgStatus.status !== 0">
             {{msgStatus.status === 2 ? `${msgStatus.miss}S后可重新发送` : '获取验证码' }}
           </el-button>
-        </template>
+        </template> -->
       </el-input>
       </el-form-item>
       <el-form-item label="新密码:" class="mandatory">
-        <el-input v-model="data.password" type="password" placeholder="请输入8-16位数字、英文大小写组合"></el-input>
+        <el-input v-model="data.newPwd" type="password" placeholder="请输入8-16位数字、英文大小写组合"></el-input>
       </el-form-item>
       <el-form-item label="密码确认:" class="mandatory">
-        <el-input v-model="data.confimPsw" type="password" placeholder="请输入8-16位数字、英文大小写组合"></el-input>
+        <el-input v-model="data.confirmPwd" type="password" placeholder="请输入8-16位数字、英文大小写组合"></el-input>
       </el-form-item>
     </el-form>
 
@@ -91,19 +91,23 @@ export default {
   },
   methods: {
     async updatePsw() {
-      if (this.data.password !== this.data.confimPsw) {
-        return this.$message.error('两次密码不一致!', '提示')
+      
+      if (!PSW.REG.test(this.data.oldPwd)) {
+        return this.$message.error('请输入正确的原密码', '提示')
       }
-      if (!PSW.REG.test(this.data.password)) {
+      if (!PSW.REG.test(this.data.newPwd)) {
         return this.$message.error(PSW.tip, '提示')
       }
+      if (this.data.newPwd !== this.data.confirmPwd) {
+        return this.$message.error('两次密码不一致!', '提示')
+      }
       
-      let psw = encryption(this.data.password)
+      let psw = encryption(this.data.newPwd)
 
       await axios.post(updatePsw, {
           userName: this.data.phone,
-          code: this.data.code,
-          password: psw,
+          oldPwd: this.data.oldPwd,
+          newPwd: psw,
           confirmPwd: psw
       })
 

+ 0 - 11
src/view/organization/info.vue

@@ -146,15 +146,4 @@ export default {
   color: #646566;
 }
 
-.table .tip {
-  text-overflow: -o-ellipsis-lastline;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  display: -webkit-box;
-  -webkit-line-clamp: 2;
-  line-clamp: 2;
-  -webkit-box-orient: vertical;
-  height: 50px;
-  white-space: initial;
-}
 </style>

+ 110 - 102
src/view/organization/list.vue

@@ -1,38 +1,39 @@
 <template>
   <div class="organiza">
-    <div class="but">
-      <el-button type="primary" v-power="'add'" @click="insertProject">新增组织架构</el-button>
-    </div>
     <div class="organiza-body">
+      <div class="but">
+      <el-button type="primary" v-power="'add'" @click="insertProject"
+        >新增组织架构</el-button
+      >
+    </div>
       <div class="tree">
         <div class="treeTile">
           <span>全国消防火调组织架构</span>
-          <span style="padding-right: 100px;">操作</span>
+          <span style="padding-right: 100px">操作</span>
         </div>
         <div class="treeList">
           <el-tree
-            style="width: 100%"
+            style="width: 100%;"
             :props="treeProps"
             :data="treedata"
             node-key="id"
-            ref="treeBox"
+            accordion
             default-expand-all
-            :expand-on-click-node="false"
           >
-            <template #default="{ node, data }">
+            <template  #default="{ node, data }">
               <span class="custom-tree-node">
                 <span>{{ data.name }}</span>
-                <span class="butList">
-                  <a @click="seeDetail(data,node)" v-power="'view'"> 查看 </a>
+                <div class="butList"  v-if="data.id != '1'">
+                  <a @click="seeDetail(data, node)" v-power="'view'"> 查看 </a>
                   <a @click="insertProject(data)" v-power="'edit'"> 编辑 </a>
                   <a
                     style="color: var(--primaryColor)"
-                    @click="remove(data.id)" 
+                    @click="remove(data.id)"
                     v-power="'del'"
                   >
                     删除
                   </a>
-                </span>
+                </div>
               </span>
             </template>
           </el-tree>
@@ -65,14 +66,16 @@
           </el-radio-group>
         </el-form-item>
         <el-form-item label="上级组织" class="mandatory">
-          <el-cascader  v-if="detailType == '新增'"
+          <el-cascader
+            v-if="detailType == '新增'"
             style="width: 100%"
             v-model="superiorValue"
             :options="treedata"
-            :props="{ checkStrictly: true,label:'name',value:'id' }"
+            :props="{ checkStrictly: true, label: 'name', value: 'id' }"
             @change="handleChange"
           ></el-cascader>
-           <el-input v-else
+          <el-input
+            v-else
             v-model="detail.parentName"
             :disabled="true"
             placeholder="请输入组织名称"
@@ -87,14 +90,15 @@
         </el-form-item>
         <el-form-item label="联系电话">
           <el-input
-            v-model="detail.phone"
+            v-model.trim="detail.phone"
             maxlength="50"
             placeholder="请输入联系电话"
           ></el-input>
         </el-form-item>
         <el-form-item label="备注">
-          <el-input
+          <el-input 
             v-model="detail.remark"
+            maxlength="500"
             type="textarea"
             placeholder="请输入备注"
           ></el-input>
@@ -108,7 +112,7 @@
       enterText="确定"
       title="查看组织架构"
     >
-      <see-info :required="true" :detail="seeData"/>
+      <see-info :required="true" :detail="seeData" />
     </com-dialog>
 
     <!-- <com-dialog
@@ -130,35 +134,39 @@
 </template>
 
 <script>
-import { reactive, toRefs,onMounted } from "vue"; //computed watch ref
+import { reactive, toRefs, onMounted } from "vue"; //computed watch ref
 import comDialog from "@/components/dialog";
-import user from '@/state/user'
-import axios from 'axios';
-import {useRoute} from 'vue-router'
+import user from "@/state/user";
+import axios from "axios";
+import { useRoute } from "vue-router";
 import seeInfo from "./seeInfo.vue";
+import {PHONE} from '@/constant/REG'
 import { getApp } from "@/app";
 import {
-  getTreeselect,delTreeitem,addTreeitem,editTreeitem
-} from '@/request/config'
+  getTreeselect,
+  delTreeitem,
+  addTreeitem,
+  editTreeitem,
+} from "@/request/config";
 
 export default {
   name: "camera",
   setup() {
-      const rout = useRoute()
-      console.log('rout',rout)
+    const rout = useRoute();
+    console.log("rout", rout);
     const data = reactive({
       show: false,
       tipsShow: false,
       seeShow: false,
       infoShow: false,
-      detailType:'新增',
-      seeData:{
-        name:'test',
-        deptType:'1',
-        superior:'sheq',
-        leader:'负责人',
-        phone:'',
-        remark:'test',
+      detailType: "新增",
+      seeData: {
+        name: "test",
+        deptType: "1",
+        superior: "sheq",
+        leader: "负责人",
+        phone: "",
+        remark: "test",
       },
       detail: {
         name: "",
@@ -168,72 +176,77 @@ export default {
       superiorValue: [],
       treedata: [],
     });
-    const seeDetail = (val) =>{
+    const seeDetail = (val) => {
       // console.log('seeDetail',getApp().$refs)
       // getApp().$refs.treeBox.setCurrentKey(user.info.id)
-      console.log('seeDetail',val)
+      console.log("getApp().$ref", getApp().$refs);
       data.seeData = {
-        superior:val.order,
-        ...val
-      }
-      data.seeShow = true
-    }
+        superior: val.order,
+        ...val,
+      };
+      data.seeShow = true;
+    };
     const handleNodeClick = (data) => {
       console.log(data);
     };
     const submit = async () => {
-      console.log('getApp().$ref',getApp())
-      const { name, deptType,parentId} = data.detail;
-      const { detailType } = data
+      const { name, deptType, parentId,phone } = data.detail;
+      const { detailType } = data;
       if (!name) {
         return getApp().$message.error("组织名称不能为空!", "提示");
       } else if (!deptType) {
         return getApp().$message.error("组织类型不能为空!", "提示");
       } else if (!parentId) {
         return getApp().$message.error("上级组织不能为空!", "提示");
+      } else if( phone && !PHONE.REG.test(phone)){
+        return getApp().$message.error('联系电话格式不正确', "提示");
       }
       //校验成功后温馨提示
       let apidata = {
-        superior:'sheq',
-        ...data.detail
-      }
-      let requestApi = addTreeitem
-      if(detailType == '编辑'){
-        requestApi = editTreeitem
+        superior: "sheq",
+        ...data.detail,
+      };
+      let requestApi = addTreeitem;
+      if (detailType == "编辑") {
+        requestApi = editTreeitem;
       }
-      let res = await axios.post(requestApi, apidata)
-      getTreedata()
-      console.log('async',res,data);
-      if(detailType == '编辑'){
-        getApp().$message({message: '操作成功', type: 'success'});
-      }else{
-      getApp().$confirm('组织创建成功,快去创建用户吧', '温馨提示',{
-          confirmButtonText: '我知道了',
-          showCancelButton:false,
-          cancelButtonText: 'Cancel',
-      })
+      let res = await axios.post(requestApi, apidata);
+      getTreedata();
+      console.log("async", res, data);
+      if (detailType == "编辑") {
+        getApp().$message({ message: "操作成功", type: "success" });
+      } else {
+        getApp().$confirm("组织创建成功,快去创建用户吧", "温馨提示", {
+          confirmButtonText: "我知道了",
+          showCancelButton: false,
+          cancelButtonText: "Cancel",
+          callback:()=>{
+            setTimeout(()=>{
+                getApp().$router.push({name: 'user'})
+              },500)
+          }
+        });
       }
-      data.detail = {}
-      data.show = false
-      data.superiorValue = []
+      data.detail = {};
+      data.show = false;
+      data.superiorValue = [];
     };
     const insertProject = (val) => {
-     console.log('insertProject',val.id);
-     if(val.id){
-      data.detailType = '编辑'
-      data.detail = {
-          ...val
+      console.log("insertProject", val.id);
+      if (val.id) {
+        data.detailType = "编辑";
+        data.detail = {
+          ...val,
+        };
+      } else {
+        data.detailType = "新增";
+        data.detail = {};
       }
-     }else{
-      data.detailType = '新增'
-      data.detail = {}
-     }
       data.show = true;
     };
     const handleChange = (val) => {
-      data.detail.parentId = val&&val[val.length-1]
-      console.log("点击handleChange", val.length,data);
-
+      data.detail.parentId = val && val[val.length - 1];
+      console.log("点击handleChange", val.length, data);
     };
     const loadNode = (node, resolve) => {
       if (node.level === 0) {
@@ -256,22 +269,25 @@ export default {
       }, 500);
     };
     const remove = async (val) => {
-      let isOk = await getApp().$confirm('当前组织下尚存在用户或绑定的相机,删除组织将一并删除,确认要删除组织吗?', '删除')
-      if(isOk){
-        let res = await axios.post(delTreeitem+val)
-        console.log("isOk",isOk, val,res);
-        getApp().$message({message: '删除成功', type: 'success'});
-        getTreedata()
+      let isOk = await getApp().$confirm(
+        "当前组织下尚存在用户或绑定的相机,删除组织将一并删除,确认要删除组织吗?",
+        "删除"
+      );
+      if (isOk) {
+        let res = await axios.post(delTreeitem + val);
+        console.log("isOk", isOk, val, res);
+        getApp().$message({ message: "删除成功", type: "success" });
+        getTreedata();
       }
     };
-    const getTreedata = async () =>{
-      let res = await axios.get(getTreeselect, {})
-      data.treedata = res.data
+    const getTreedata = async () => {
+      let res = await axios.get(getTreeselect, {});
+      data.treedata = res.data;
       // getApp().$ref.treeBox.setCurrentKey(user.info.id)
-    }
-    onMounted(async ()=>{
-        getTreedata()
-    })
+    };
+    onMounted(async () => {
+      getTreedata();
+    });
     return {
       // treedata,
       ...toRefs(data),
@@ -296,7 +312,7 @@ export default {
 
   components: {
     "com-dialog": comDialog,
-    "see-info":seeInfo
+    "see-info": seeInfo,
   },
 };
 </script>
@@ -304,7 +320,7 @@ export default {
 <style lang="scss" scoped>
 .organiza {
   .but {
-    padding: 16px;
+    padding: 0 16px 16px 16px;
     background-color: #fff;
     text-align: right;
   }
@@ -334,6 +350,8 @@ export default {
         padding: 12px 20px;
       }
       .treeList {
+        max-height: 500px;
+        overflow-y: auto;
         display: flex;
         justify-content: space-between;
         .custom-tree-node {
@@ -344,6 +362,7 @@ export default {
           font-size: 14px;
           padding-right: 8px;
           .butList {
+            width: 140px;
             a {
               margin: 0 8px;
             }
@@ -410,15 +429,4 @@ export default {
   color: #646566;
 }
 
-.table .tip {
-  text-overflow: -o-ellipsis-lastline;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  display: -webkit-box;
-  -webkit-line-clamp: 2;
-  line-clamp: 2;
-  -webkit-box-orient: vertical;
-  height: 50px;
-  white-space: initial;
-}
 </style>

+ 1 - 1
src/view/system/forget.vue

@@ -9,7 +9,7 @@
     <h2>重置密码</h2>
     <el-form-item class="panel-form-item" label="手机号">
       <p class="err-info">{{verification.phone}}</p>
-      <el-input v-model="form.phone" placeholder="请输入手机号码"></el-input>
+      <el-input v-model.trim="form.phone" placeholder="请输入手机号码"></el-input>
     </el-form-item>
     <el-form-item class="panel-form-item" label="验证码">
       <p class="err-info">{{verification.code}}</p>

+ 1 - 1
src/view/system/login.vue

@@ -12,7 +12,7 @@
       <h2>欢迎登录</h2>
       <el-form-item class="panel-form-item">
         <p class="err-info">{{verification.phone}}</p>
-        <el-input v-model="form.phone" placeholder="手机号" @keydown.enter="submitClick"></el-input>
+        <el-input v-model.trim="form.phone" placeholder="手机号" @keydown.enter="submitClick"></el-input>
       </el-form-item>
       <el-form-item class="panel-form-item">
         <p class="err-info">{{verification.psw}}</p>

+ 1 - 1
src/view/teaching/index.vue

@@ -42,7 +42,7 @@
       ref="multipleTable"
       :data="dataList.state"
       tooltip-effect="dark"
-      style="width: 100%"
+      style="width: 100%;max-height:500px;"
       @row-click="dataList.selectRow"
     >
       <el-table-column type="selection" width="50"></el-table-column>

+ 40 - 70
src/view/user/index.vue

@@ -14,7 +14,7 @@
         <el-form-item label="状态:">
           <el-select v-model="search.state.status" placeholder="全部">
             <el-option label="全部" :value="''"></el-option>
-            <el-option label="用" :value="1"></el-option>
+            <el-option label="用" :value="1"></el-option>
             <el-option label="禁用" :value="0"></el-option>
           </el-select>
         </el-form-item>
@@ -36,7 +36,7 @@
         ref="multipleTable"
         :data="dataList.state"
         tooltip-effect="dark"
-        style="width: 100%"
+        style="width: 100%;max-height:480px"
         @row-click="selectRow"
       >
         <el-table-column label="序号" width="55" v-slot:default="{ $index }">
@@ -55,14 +55,14 @@
         ></el-table-column>
         <el-table-column label="角色" prop="roleName"></el-table-column>
         <el-table-column label="状态" v-slot:default="{ row }">
-          {{ row.status ? "用" : "禁用" }}
+          {{ row.status ? "用" : "禁用" }}
         </el-table-column>
         <el-table-column
           label="操作"
           v-slot:default="{ row }"
           v-if="auth.update || auth.updatePwd || auth.delete"
         >
-          <template v-if="row.id !== ADMIN_USER_ID && row.id !== user.info.id">
+          <template v-if="row.roleKey == roleKey[user.roleKey]">
             <span class="oper-span" @click="updateInfo(row)" v-if="auth.update"
             v-power="'edit'">编辑</span
             >
@@ -100,8 +100,9 @@
       <el-form ref="form" :model="form" label-width="90px" class="user-from">
         <el-form-item label="用户姓名" class="mandatory" >
           <el-input
-            v-model="editName"
+            v-model.trim="editName"
             placeholder="请输入"
+            maxlength="15"
           ></el-input>
         </el-form-item>
       </el-form>
@@ -116,19 +117,25 @@
       <el-form ref="form" :model="form" label-width="90px" class="user-from">
         <el-form-item label="用户姓名" class="mandatory" >
           <el-input
+            maxlength="15"
             v-model="newData.nickName"
             placeholder="请输入"
           ></el-input>
         </el-form-item>
+        <el-form-item label="所属架构:"  v-if="user.roleKey !== 'admin-ordinary'">
+          <el-cascader
+            style="width: 100%"
+            v-model="newData.deptId"
+            :options="treedata"
+            :props="{ checkStrictly: true, label: 'name', value: 'id' }"
+          ></el-cascader>
+        </el-form-item>
         <el-form-item label="用户角色" class="roleName mandatory">
          <com-role v-model="newData.roleId" style="width: 100%" allText="请选择" hideAll :notDefault="true" />
         </el-form-item>
-        <el-form-item label="所属架构:" v-if="user.roleKey == 'admin' || user.roleKey == 'admin-super' ">
-          <com-select v-model="newData.deptId" />
-        </el-form-item>
         <el-form-item label="用户账号" class="mandatory">
           <el-input
-            v-model="newData.userName"
+            v-model.trim="newData.userName"
             placeholder="请输入11位手机号码作为用户账号"
           ></el-input>
         </el-form-item>
@@ -146,22 +153,22 @@
 
 
 <script>
-import { reactive, ref, toRefs } from "vue";
+import { reactive, ref, toRefs,onMounted } from "vue";
 import getTableState from "@/state/tableRef";
 import comDialog from "@/components/dialog";
 import comHead from "@/components/head";
 import comCompany from "@/components/company-select";
 import comPagination from "@/components/pagination";
 import roleCompany from "@/components/role-select";
-import comSelect from "@/components/company-select";
+// import comSelect from "@/components/company-select";
 import auth from "@/state/viewAuth";
 import user from "@/state/user";
 import axios from "axios";
 // import { encryption } from "@/util";
-// import { PSW, PHONE } from "@/constant/REG";
+import {PHONE,EPSW} from '@/constant/REG'
 import { ADMIN_USER_ID } from "@/constant";
 
-import { getUserList, updateUser, deleUser, changeUserStatus,userAdd,userEdit } from "@/request/config";
+import { getTreeselect,getUserList, updateUser, deleUser, changeUserStatus,userAdd,userEdit } from "@/request/config";
 import { getApp } from "../../app";
 
 export default {
@@ -182,11 +189,13 @@ export default {
       searchAttr: { nickName: "", status: "", deptId: "" },
     });
     const headList = ref([{ name: "用户管理", value: 2 }]);
+    const roleKey = ref({ 'admin': "admin-dept", 'admin-dept': 'admin-ordinary' });
     const operRoleId = ref("");
     const updateInfo = (row) => {
       if (!row.status) {
         return getApp().$message.error("请先启用用户", "提示");
       }
+      data.editName = row.nickName
       operRoleId.value = row.roleId;
       state.oper.value.readyUpdate(row);
     };
@@ -198,12 +207,19 @@ export default {
         getApp().$message({message: '操作成功', type: 'success'});
       }
     }
+    const getTreedata = async () => {
+      let res = await axios.get(getTreeselect, {});
+      data.treedata = res.data;
+      console.log('data.treedata',data.treedata);
+      // getApp().$ref.treeBox.setCurrentKey(user.info.id)
+    };
     const newAddclick = () =>{
       data.newShow = true
     }
     const data = reactive({
       newShow: false,
       editName:'',//修改编辑用户名称
+      treedata:[],
       newData:{
         userName: "",
         userId: "",
@@ -211,9 +227,13 @@ export default {
         userRole: "",
       }
     });
+    onMounted(async () => {
+      getTreedata();
+    });
     return {
       ...state,
       ...toRefs(data),
+      getTreedata,
       headList,
       delInfo,
       updateInfo,
@@ -221,6 +241,7 @@ export default {
       user,
       operRoleId,
       ADMIN_USER_ID,
+      roleKey,
       newAddclick
     };
   },
@@ -233,11 +254,16 @@ export default {
       if (!this.newData.roleId) {
         return this.$message.error("请选择用户角色", "提示");
       }
+      console.log(PHONE.REG.test(this.newData.userName),this.newData.userName)
       if (!this.newData.userName) {
         return this.$message.error("请选择用户账户", "提示");
+      }else if(!PHONE.REG.test(this.newData.userName)){
+        return this.$message.error(PHONE.tip, "提示");
       }
       if (!this.newData.psw) {
         return this.$message.error("请输入登录密码", "提示");
+      }else if(!EPSW.REG.test(this.newData.psw)){
+        return this.$message.error(EPSW.tip, "提示");
       }
       await axios.post(userAdd, {
         nickName:this.newData.nickName,
@@ -266,64 +292,8 @@ export default {
       this.oper.reset();
       this.editName = ''
       this.dataList.refer();
-      // const updatePhone = this.oper.state.__oldData
-      //   ? this.oper.state.__oldData.userName !== this.oper.state.userName
-      //   : true;
-
-      // if (updatePhone && !PHONE.REG.test(this.oper.state.userName)) {
-      //   return this.$message.error(PHONE.tip, "提示");
-      // }
-      // if (this.oper.state.password !== this.oper.state.confirmPwd) {
-      //   return this.$message.error("两次密码不一致!", "提示");
-      // }
-
-      // if (!this.oper.state.roleId) {
-      //   return this.$message.error("请选择用户角色", "提示");
-      // }
-
-      // if (
-      //   !this.operRoleId &&
-      //   !(await this.$confirm(
-      //     "用户被启用后,可正常登录使用。确定要启用吗?",
-      //     "提示"
-      //   ))
-      // ) {
-      //   return;
-      // }
-
-      // if (this.oper.state.id) {
-      //   let updateState = {
-      //     ...this.oper.state,
-      //     password: void 0,
-      //     confirmPwd: void 0,
-      //     updatePwd: void 0,
-      //     userId: this.oper.state.id,
-      //   };
-      //   if (!updatePhone) {
-      //     delete updateState.userName;
-      //   }
-      //   let state = { ...this.oper.state };
-      //   await this.oper.update(updateState);
-      //   await this.changeUserStatus(state, true);
-      // } else if (this.oper.state.password === this.oper.state.confirmPwd) {
-      //   if (PSW.REG.test(this.oper.state.password)) {
-      //     let cryPsw = encryption(this.oper.state.password);
-      //     this.oper.insert({
-      //       ...this.oper.state,
-      //       password: cryPsw,
-      //       confirmPwd: cryPsw,
-      //       updatePwd: void 0,
-      //     });
-      //   } else {
-      //     this.$message.error(PSW.tip, "提示");
-      //   }
-      // }
     },
     async changeUserStatus(row, d) {
-      // if (!d && (!row.roleId && !row.status)) {
-      //   this.operRoleId = row.roleId
-      //   return this.oper.readyUpdate(row)
-      // }
       let msg = row.status
         ? `用户被禁用后,无法登录使用,无法编辑场景(可将该用户关联的相机绑定到其它管理员)。确定要禁用吗?`
         : `用户被启用后,可正常登录使用。确定要启用吗?`;
@@ -347,7 +317,7 @@ export default {
     "com-company": comCompany,
     "com-role": roleCompany,
     "com-pagination": comPagination,
-    "com-select": comSelect
+    // "com-select": comSelect
   },
 };
 </script>

+ 1 - 1
vue.config.js

@@ -18,7 +18,7 @@ module.exports = {
     proxy: {
       '/fireApi': {
         // target: 'http://192.168.0.26:8585/',
-        target: 'https://xfhd.4dkankan.com',
+        target: 'https://testxfhd.4dkankan.com',
         // target: 'https://testhuodiao.4dkankan.com/',
         changeOrigin: true,  
         pathRewrite: {