askin 2 rokov pred
rodič
commit
00f32ade77

Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 28885 - 0
sources/client/vrv-platform/package-lock.json


+ 1 - 0
sources/client/vrv-platform/package.json

@@ -18,6 +18,7 @@
     "mqtt": "^3.0.0",
     "numeral": "^2.0.6",
     "qs": "^6.7.0",
+    "v-distpicker": "^2.0.8",
     "vue": "^2.6.10",
     "vue-codemirror": "^4.0.6",
     "vue-echarts": "^4.0.3",

+ 3 - 0
sources/client/vrv-platform/src/App.vue

@@ -13,8 +13,11 @@
   }
 
   html, body, #app {
+    margin: 0px 0px 0px 0px;
     height: 100%;
     position: relative;
     overflow: hidden;
   }
+
+
 </style>

+ 1 - 0
sources/client/vrv-platform/src/config/api.js

@@ -3,6 +3,7 @@ const root = "http://127.0.0.1:8088";
 
 //接口auth
 const api = {
+
         user: {
             list: `${root}/user/list`,
             add: `${root}/user/add`,

+ 89 - 122
sources/client/vrv-platform/src/main.js

@@ -1,6 +1,6 @@
 import Vue from 'vue'
 import App from './App.vue'
-import _ from 'lodash'
+// import _ from 'lodash'
 import router from './router'
 import store from './store'
 console.log(router);
@@ -12,25 +12,25 @@ import 'element-ui/lib/theme-chalk/index.css';
 Vue.use(ElementUI);
 
 
-//引入Fastboot UI库
-import  FastbootUI from 'fastboot-ui/src/components';
-import 'fastboot-ui/src/scss/element-theme.scss'
+// //引入Fastboot UI库
+// import  FastbootUI from 'fastboot-ui/src/components';
+// import 'fastboot-ui/src/scss/element-theme.scss'
 
 
-Vue.use(FastbootUI);
+// Vue.use(FastbootUI);
 
 
-import FastbootAdmin from 'fastboot-admin';
-import DictSelect from "fastboot-admin/src/components/DictSelect.vue";
-import OrgCascader from "fastboot-admin/src/components/OrgCascader.vue";
-import DictText from "fastboot-admin/src/components/DictText.vue";
-import AreaCascader from "fastboot-admin/src/components/AreaCascader.vue";
-import RoleSelect from "fastboot-admin/src/components/RoleSelect.vue";
-Vue.component(DictSelect.name,DictSelect);
-Vue.component(OrgCascader.name,OrgCascader);
-Vue.component(AreaCascader.name,AreaCascader);
-Vue.component(DictText.name,DictText);
-Vue.component(RoleSelect.name,RoleSelect);
+// import FastbootAdmin from 'fastboot-admin';
+// import DictSelect from "fastboot-admin/src/components/DictSelect.vue";
+// import OrgCascader from "fastboot-admin/src/components/OrgCascader.vue";
+// import DictText from "fastboot-admin/src/components/DictText.vue";
+// import AreaCascader from "fastboot-admin/src/components/AreaCascader.vue";
+// import RoleSelect from "fastboot-admin/src/components/RoleSelect.vue";
+// Vue.component(DictSelect.name,DictSelect);
+// Vue.component(OrgCascader.name,OrgCascader);
+// Vue.component(AreaCascader.name,AreaCascader);
+// Vue.component(DictText.name,DictText);
+// Vue.component(RoleSelect.name,RoleSelect);
 
 
 //引入全局工具和配置
@@ -38,146 +38,113 @@ import qs from 'qs'
 import axios from 'axios'
 
 //引入接口
-import baseApi from './config/api'
-let api = _.defaultsDeep(baseApi,FastbootAdmin.api);
-router.addRoutes(FastbootAdmin.routes)
+import api from './config/api'
+// let api = _.defaultsDeep(baseApi,FastbootAdmin.api);
+// router.addRoutes(FastbootAdmin.routes)
 
 import moment from 'moment'
 
-import utils from './util/utils'
+// import utils from './util/utils'
 
 Vue.prototype.$moment = moment;
 Vue.prototype.$api = api ;
 Vue.prototype.$http = axios;
 Vue.prototype.$qs = qs;
-Vue.prototype.$utils = utils;
+// Vue.prototype.$utils = utils;
 axios.defaults.withCredentials = true;
 
 Vue.config.productionTip = false
 
 
 //http响应拦截器
-Vue.prototype.$http.interceptors.response.use(resp => {
-
-
-  //如果未授权,则跳转至授权页面
-  if(resp.data.status === 401){
-
-    if(sessionStorage.getItem("login-user-info") != null){
-      Message.warning("30分钟未操作自动退出登录");
+// Vue.prototype.$http.interceptors.response.use(resp => {
+//
+//
+//   //如果未授权,则跳转至授权页面
+//   if(resp.data.status === 401){
+//
+//     if(sessionStorage.getItem("login-user-info") != null){
+//       Message.warning("30分钟未操作自动退出登录");
+//     }
+//
+//     sessionStorage.removeItem("login-user-info");
+//
+//
+//
+//
+//     router.push("/login");
+//
+//
+//   }
+//
+//   //如果未授权,则跳转至授权页面
+//   if(resp.data.status === 403){
+//     router.push("/no-permission");
+//   }
+//
+//   return resp;
+//
+// }, error => {
+//   console.log(error);
+//   return Promise.reject(error)
+// });
+
+
+
+
+
+
+//路由拦截器
+router.beforeEach((to,form,next)=>{
+
+
+  if(to.path.startsWith('/update-user-password')){
+    next();
+    if(window.updatePassword){
+      Message.warning("请修改密码再进行操作!");
     }
-
-    sessionStorage.removeItem("login-user-info");
-
-
-
-
-    router.push("/login");
-
-
-  }
-
-  //如果未授权,则跳转至授权页面
-  if(resp.data.status === 403){
-    router.push("/no-permission");
-  }
-
-  return resp;
-
-}, error => {
-  console.log(error);
-  return Promise.reject(error)
-});
-
-
-
-
-
-
-//加载系统信息
-axios.post(api.app.appInfo).then((resp)=>{
-
-  window.appInfo = resp.data.data.appInfo;
-  try {
-    window.appSetting = JSON.parse(resp.data.data.appInfo.setting);
-  }catch (e) {
-    window.appSetting = {};
-  }
-
-  if(!window.appSetting){
-    window.appSetting={};
-  }
-
-  if(window.appInfo.logo){
-    window.appInfo.logoUrl = `${api.commonFile.download}?code=${window.appInfo.logo}`;
+    return;
   }
 
 
-  if(window.appInfo.name){
-    document.title=window.appInfo.name;
-  }else{
-    document.title="未配置系统名称";
-  }
+  if(sessionStorage.getItem("login-user-info") != null){
 
 
-  //路由拦截器
-  router.beforeEach((to,form,next)=>{
+    let userInfo = JSON.parse(sessionStorage.getItem("login-user-info"));
 
 
+    if(window.appSetting && window.appSetting["UPDATE_PWD_INTERVAL"] && window.appSetting["UPDATE_PWD_INTERVAL"].value !== "0"){
 
+      if(!userInfo.lastUpdatePwdTime){
+        window.updatePassword = true;
 
-    if(to.path.startsWith('/update-user-password')){
-      next();
-      if(window.updatePassword){
-        Message.warning("请修改密码再进行操作!");
+        next('/update-user-password')
+        return ;
       }
-      return;
-    }
-
-
-    if(sessionStorage.getItem("login-user-info") != null){
-
-
-      let userInfo = JSON.parse(sessionStorage.getItem("login-user-info"));
-
-
-
 
-      if(window.appSetting["UPDATE_PWD_INTERVAL"] && window.appSetting["UPDATE_PWD_INTERVAL"].value !== "0"){
-
-        if(!userInfo.lastUpdatePwdTime){
-          window.updatePassword = true;
-
-          next('/update-user-password')
-          return ;
-        }
-
-        if(userInfo.lastUpdatePwdTime <= parseInt(window.appSetting["UPDATE_PWD_INTERVAL"]) * 24 * 60 * 60 * 1000){
-          next('/update-user-password');
-          return;
-        }
-
-        next();
+      if(userInfo.lastUpdatePwdTime <= parseInt(window.appSetting["UPDATE_PWD_INTERVAL"]) * 24 * 60 * 60 * 1000){
+        next('/update-user-password');
+        return;
+      }
 
+      next();
 
 
-      }else{
-        next();
-      }
 
     }else{
       next();
     }
 
-  });
-
-  window.routeViewType = 'route';
-
-  new Vue({
-    router,
-    store,
-    render: h => h(App)
-  }).$mount('#app');
+  }else{
+    next();
+  }
 
 });
 
+window.routeViewType = 'route';
+
+new Vue({
+  router,
+  store,
+  render: h => h(App)
+}).$mount('#app');

+ 3 - 1
sources/client/vrv-platform/src/router/index.js

@@ -7,6 +7,7 @@ Vue.use(Router)
 export default new Router({
     routes: [
         {
+
             path: '/',
             name: 'menu',
             component: () => import(/* webpackChunkName: "views" */ '../views/menu/menu'),
@@ -85,12 +86,13 @@ export default new Router({
         },
 
         {
-            path: '/',
+            path: '/login',
             name: 'login',
             meta: {title: '登录', tab: true, keepAlive: true},
             component: () => import(/* webpackChunkName: "views" */ '../views/login/login'),
         },
 
+
     ]
 })
 

Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 1940 - 0
sources/client/vrv-platform/src/util/area.json


+ 0 - 94
sources/client/vrv-platform/src/util/utils.js

@@ -1,94 +0,0 @@
-const utils = {}
-
-// discernTrackingNumber
-utils.dtn = function (trackingNumber) {
-
-    let business = ""
-
-    // 判断是否是圆通
-    let yt = /^[YT|DD|G].*/
-    if (yt.test(trackingNumber)) {
-        return "YT"
-    }
-
-    // 判断是否是顺丰
-    let sf = /^[SF].*/
-    if (sf.test(trackingNumber)) {
-        return "SF"
-    }
-
-    let length12 = function (trackingNumber){
-        console.log(12)
-        // 判断是否是中通
-        let zt = /^5.*/
-        if (zt.test(trackingNumber)) {
-            return "ZTO"
-        }
-
-        // 判断是否是申通
-        let st = /^1.*/
-        if (st.test(trackingNumber)) {
-            return "STO"
-        }
-
-        // 默认返回顺丰
-        return "SF"
-    }
-
-    let length13 = function (trackingNumber){
-        console.log(13)
-        // 判断是否是韵达
-        let zt = /^[3|4|5|6|7|8].*/
-        if (zt.test(trackingNumber)) {
-            return "YD"
-        }
-
-        // 默认返回顺丰
-        return "SF"
-    }
-
-    let length14 = function(trackingNumber){
-        console.log(14)
-        // 判断是否是中通
-        let zt = /^7.*/
-        if (zt.test(trackingNumber)) {
-            return "ZTO"
-        }
-
-        // 默认返回顺丰
-        return "SF"
-    }
-
-    let length15 = function(trackingNumber){
-        console.log(15)
-        // 判断是否是申通
-        let zt = /^7.*/
-        if (zt.test(trackingNumber)) {
-            return "STO"
-        }
-
-        // 默认返回顺丰
-        return "SF"
-    }
-
-    switch (trackingNumber.length) {
-        case 12:
-            business = length12(trackingNumber);
-            break;
-        case 13:
-            business = length13(trackingNumber);
-            break;
-        case 14:
-            business = length14(trackingNumber);
-            break;
-        case 15:
-            business = length15(trackingNumber);
-            break;
-    }
-
-    return business
-}
-
-export default Object.assign(
-    utils
-)

+ 136 - 0
sources/client/vrv-platform/src/views/login/login.vue

@@ -0,0 +1,136 @@
+<template>
+  <div id="login">
+
+    <el-form :model="form" :rules="formRules">
+      <el-form-item prop="account">
+        <el-input v-model="form.account"
+                  placeholder="请输入账号"
+                  prefix-icon="el-icon-user"></el-input>
+      </el-form-item>
+
+      <el-form-item prop="password">
+        <el-input v-model="form.password"
+                  prefix-icon="el-icon-lock"
+                  placeholder="请输入密码"
+                  type="password"></el-input>
+      </el-form-item>
+
+      <el-form-item prop="verifyCode">
+        <div>
+          <el-input v-model="form.verifyCode"
+                    prefix-icon="el-icon-circle-check"
+                    placeholder="请输入图形验证码"></el-input>
+
+          <img @click="handleRefreshVerifyCode" class="verify-img" :src="verifyCodeUrl" style="cursor: pointer"
+               alt="">
+        </div>
+
+      </el-form-item>
+
+      <div>
+        <el-button @click="login" type="primary">登录
+        </el-button>
+      </div>
+
+    </el-form>
+  </div>
+
+</template>
+
+<script>
+export default {
+  name: "login",
+  data() {
+    return {
+
+
+      form: {
+        account: '',
+        password: '',
+        verifyCode: '',
+      },
+
+      formErrorMsg: {
+        account: '',
+        password: '',
+        verifyCode: '',
+      },
+
+      formRules: {
+        account: [
+          {required: true, message: '请输入账号', trigger: 'blur'},
+        ],
+        password: [
+          {required: true, message: '请输入密码', trigger: 'blur'},
+        ],
+        verifyCode: [
+          {required: true, message: '请输入验证码', trigger: 'blur'},
+        ]
+      },
+
+      verifyCodeUrl: this.$api.auth.verifyCode,
+    };
+  },
+
+  created() {
+    this.handleRefreshVerifyCode();
+  },
+
+  methods: {
+    handleRefreshVerifyCode() {
+      this.verifyCodeUrl = (this.$api.auth.verifyCode + "?t=" + new Date().getTime());
+    },
+
+    login() {
+      const vm = this;
+
+      vm.$http.get(vm.$api.auth.login,{
+        params:{
+          account:this.form.account,
+          password:this.form.password,
+          verifyCode:this.form.verifyCode,
+        }
+      }).then((resp) => {
+        if(resp.data.status === 200){
+          vm.$message({
+            type: "success",
+            message: resp.data.desc
+          });
+
+
+          vm.$router.push({
+            path: '/',
+            query: {resp: resp}
+          });
+
+        }
+
+        if(resp.data.status === 400){
+          vm.$message({
+            type: "error",
+            message: resp.data.data.errorFields[0].message
+          });
+        }
+
+        if(resp.data.status === 500){
+          vm.$message({
+            type: "error",
+            message: resp.data.desc
+          });
+        }
+      })
+
+    }
+
+  },
+
+}
+</script>
+
+<style scoped>
+.el-form {
+  width: 30%;
+  margin: 300px 200px 200px 500px;
+}
+
+</style>

+ 16 - 2
sources/client/vrv-platform/src/views/menu/menu.vue

@@ -100,7 +100,6 @@
           <i class="el-icon-s-fold" @click="isC" v-show="block"></i>
           <i class="el-icon-s-unfold" @click="isC" v-show="toggle"></i>
 
-
           <!--          <el-radio-group v-model="isCollapse" style="margin-top: 15px;">-->
           <!--            <el-radio-button :label="false">展开</el-radio-button>-->
           <!--            <el-radio-button :label="true">收起</el-radio-button>-->
@@ -115,7 +114,7 @@
             </el-dropdown-menu>
           </el-dropdown>
 
-          <span style="float: right; margin-right: 20px; margin-top: 10px">Admin</span>
+          <span style="float: right; margin-right: 20px; margin-top: 10px">{{ realname }}</span>
 
         </el-header>
 
@@ -136,6 +135,8 @@ export default {
 
   data() {
     return {
+      realname:'',
+
       index: '1',
 
       isCollapse: false,
@@ -147,11 +148,20 @@ export default {
 
   created: function () {
     let vm = this;
+
+    var resp = this.$route.query.resp
+
+    this.realname = resp.data.data.user.realname
+
+    console.log(resp)
+
     vm.$router.push('/operator')
 
   },
 
   methods: {
+
+
     isC() {
       this.isCollapse = !this.isCollapse;
       this.toggle = !this.toggle;
@@ -235,4 +245,8 @@ export default {
   width: 20px;
   height: 20px;
 }
+
+.el-button{
+  color: black;
+}
 </style>

+ 186 - 137
sources/client/vrv-platform/src/views/operator/list.vue

@@ -4,156 +4,172 @@
       <el-main>
 
         <div style="margin-bottom: 10px">
-          <el-button size="medium" icon="el-icon-back" type="text">返回</el-button>
+          <el-button size="medium" icon="el-icon-back" type="text" @click="back">返回</el-button>
           <span style="margin-left: 20px; font-size: 18px">运营商列表</span>
         </div>
 
 
-            <el-button size="medium"  icon="el-icon-search" style="margin-bottom: 15px" @click="search(searchFormData)">查询</el-button>
-            <el-button size="medium" icon="el-icon-plus" @click="showAdd" style="margin-left: 0">新增</el-button>
+        <el-button size="medium" icon="el-icon-search" style="margin-bottom: 15px" @click="search(searchFormData)">
+          查询
+        </el-button>
+        <el-button size="medium" icon="el-icon-plus" @click="showAdd" style="margin-left: 0">新增</el-button>
 
 
         <div style="padding: 10px;background-color: white">
-        <el-form :inline="true" :model="searchFormData" style="background-color: white;">
-          <el-form-item label="运营商名称">
-            <el-input placeholder="运营商名称" size="mini" v-model="searchFormData.name"></el-input>
-          </el-form-item>
-          <el-form-item label="运营商编号">
-            <el-input placeholder="运营商编号" size="mini" v-model="searchFormData.number"></el-input>
-          </el-form-item>
-          <el-form-item label="联系人">
-            <el-input placeholder="联系人" size="mini" v-model="searchFormData.contact"></el-input>
-          </el-form-item>
-          <el-form-item label="联系电话">
-            <el-input placeholder="联系电话" size="mini" v-model="searchFormData.tel"></el-input>
-          </el-form-item>
-
-          <el-form-item label="省份" size="mini" style="margin-top: 6px">
-            <el-select v-model="searchFormData.province" placeholder="省份" style="width: 180px">
-              <el-option label="上海" value="上海"></el-option>
-              <el-option label="广东" value="广东"></el-option>
-            </el-select>
-          </el-form-item>
-
-          <el-form-item label="城市" style="margin-top: 6px" size="mini">
-            <el-select v-model="searchFormData.city" placeholder="城市" style="width: 180px">
-              <el-option label="广州" value="广州"></el-option>
-              <el-option label="韶关" value="韶关"></el-option>
-            </el-select>
-          </el-form-item>
-
-          <el-form-item label="具体地址">
-            <el-input placeholder="具体地址" size="mini" v-model="searchFormData.address"></el-input>
-          </el-form-item>
-
-
-          <el-dialog title="运营商" :visible.sync="dialogFormVisible" style="width: 70% ; margin-left: 300px ;">
-
-            <el-form label-position="left" :model="formData">
-              <el-form-item label="运营商名称" style=" text-align: right;margin-right: 20px">
-                <el-input v-model="formData.name"></el-input>
-              </el-form-item>
-              <el-form-item label="运营商编号" style="">
-                <el-input v-model="formData.number"></el-input>
-              </el-form-item>
-              <el-form-item label="联系人" style=" text-align: right;margin-right: 34px;margin-left: 38px">
-                <el-input v-model="formData.contact"></el-input>
-              </el-form-item>
-              <el-form-item label="联系电话" style="">
-                <el-input v-model="formData.tel"></el-input>
-              </el-form-item>
-              <el-form-item label="省份" style=" text-align: right;margin-right: 62px;margin-left: 52px ;">
-                <el-select v-model="formData.province" placeholder="省份" style="width: 202px">
-                  <el-option label="上海" value="上海"></el-option>
-                  <el-option label="广东" value="广东"></el-option>
-                </el-select>
-              </el-form-item>
-              <el-form-item label="城市" style="">
-                <el-select v-model="formData.city" placeholder="城市" style="width: 202px">
-                  <el-option label="广州" value="广州"></el-option>
-                  <el-option label="韶关" value="韶关"></el-option>
-                </el-select>
-              </el-form-item>
-              <el-form-item label="具体地址" style=" text-align: right;margin-right: 75px;margin-left: 24px">
-                <el-input v-model="formData.address"></el-input>
-              </el-form-item>
-
-            </el-form>
-
-            <div slot="footer" class="dialog-footer" style="text-align: center">
-              <el-button @click="cancel()">取 消</el-button>
-              <el-button type="primary" @click="addOrEditMehtond()">确 定</el-button>
-            </div>
-          </el-dialog>
-
-        </el-form>
-
-
-        <el-table :data="tableData">
-          <el-table-column  type="selection"></el-table-column>
-
-          <el-table-column prop="name" label="运营商名称"></el-table-column>
-          <el-table-column prop="number" label="运营商编号"></el-table-column>
-          <el-table-column prop="contact" label="联系人"></el-table-column>
-          <el-table-column prop="tel" label="联系电话"></el-table-column>
-
-          <el-table-column prop="province" label="省份"></el-table-column>
-          <el-table-column prop="city" label="城市"></el-table-column>
-          <el-table-column prop="address" label="具体地址"></el-table-column>
-          <el-table-column label="账号状态">
-            <template slot-scope="scope">
-              {{ String(scope.row.status) === '0' ? '已禁用' : '正常' }}
-            </template>
-          </el-table-column>
-
-
-          <el-table-column label="操作"  fixed="right">
-            <template slot-scope="scope">
-              <el-button type="text" size="medium" @click="showEdit(scope.row)">编辑</el-button>
-              <el-button type="text" size="medium" @click="operatorList(scope.row)">项目</el-button>
-              <el-button type="text" size="medium" @click="del(scope.row)" style="color: #c01920">删除</el-button>
-
-              <el-button
-                  type="text"
-                  size="medium"
-                  class="delBut non"
-                  style="color: #c01920"
-                  @click="statusHandle(scope.row)"
-              >
-                {{ scope.row.status == '1' ? '禁用' : '启用' }}
-              </el-button>
-
-            </template>
-          </el-table-column>
-        </el-table>
-
-
-        <el-pagination
-            style="margin-top: 15px;text-align: center"
-            background
-            layout="prev, pager, next"
-            :page-size="pager.pageSize"
-            :current-page="pager.pageIndex"
-            :total="pager.itemCount"
-            @current-change="handleCurrentChange"
-        >
-        </el-pagination>
+          <el-form :inline="true" :model="searchFormData" style="background-color: white;">
+            <el-form-item label="运营商名称">
+              <el-input placeholder="运营商名称" size="mini" v-model="searchFormData.name"></el-input>
+            </el-form-item>
+            <el-form-item label="运营商编号">
+              <el-input placeholder="运营商编号" size="mini" v-model="searchFormData.number"></el-input>
+            </el-form-item>
+            <el-form-item label="联系人">
+              <el-input placeholder="联系人" size="mini" v-model="searchFormData.contact"></el-input>
+            </el-form-item>
+            <el-form-item label="联系电话">
+              <el-input placeholder="联系电话" size="mini" v-model="searchFormData.tel"></el-input>
+            </el-form-item>
+
+
+            <el-form-item label="省份" size="mini" style="margin-top: 6px">
+              <el-select v-model="searchFormData.province" placeholder="省份" style="width: 180px" clearable>
+                <el-option v-for="item in areas" :value="item.label" :label="item.label" :key="item.code"></el-option>
+              </el-select>
+            </el-form-item>
+
+            <el-form-item label="城市" style="margin-top: 6px" size="mini">
+              <el-select v-model="searchFormData.city" placeholder="城市" style="width: 180px"
+                         :disabled="!searchFormData.province" clearable>
+                <el-option v-for="item in cityArr" :value="item.label" :label="item.label" :key="item.code"></el-option>
+              </el-select>
+            </el-form-item>
+
+
+            <el-form-item label="具体地址">
+              <el-input placeholder="具体地址" size="mini" v-model="searchFormData.address"></el-input>
+            </el-form-item>
+
+
+            <el-dialog title="运营商" :visible.sync="dialogFormVisible" style="width: 70% ; margin-left: 300px ;">
+
+              <el-form label-position="left" :model="formData">
+                <el-form-item label="运营商名称" style=" text-align: right;margin-right: 20px">
+                  <el-input v-model="formData.name"></el-input>
+                </el-form-item>
+                <el-form-item label="运营商编号" style="">
+                  <el-input v-model="formData.number"></el-input>
+                </el-form-item>
+                <el-form-item label="联系人" style=" text-align: right;margin-right: 34px;margin-left: 38px">
+                  <el-input v-model="formData.contact"></el-input>
+                </el-form-item>
+                <el-form-item label="联系电话" style="">
+                  <el-input v-model="formData.tel"></el-input>
+                </el-form-item>
+
+
+                <el-form-item label="省份" style=" text-align: right;margin-right: 62px;margin-left: 52px ;">
+                  <el-select v-model="formData.province" placeholder="省份" style="width: 202px" clearable>
+                    <el-option v-for="item in areas" :value="item.label" :label="item.label"
+                               :key="item.code"></el-option>
+                  </el-select>
+                </el-form-item>
+
+                <el-form-item label="城市">
+                  <el-select v-model="formData.city" placeholder="城市" style="width: 202px"
+                             :disabled="!formData.province" clearable>
+                    <el-option v-for="item in cityArr" :value="item.label" :label="item.label"
+                               :key="item.code"></el-option>
+                  </el-select>
+                </el-form-item>
+
+
+                <el-form-item label="具体地址" style=" text-align: right;margin-right: 75px;margin-left: 24px">
+                  <el-input v-model="formData.address"></el-input>
+                </el-form-item>
+
+              </el-form>
+
+              <div slot="footer" class="dialog-footer" style="text-align: center">
+                <el-button @click="cancel()">取 消</el-button>
+                <el-button type="primary" @click="addOrEditMehtond()">确 定</el-button>
+              </div>
+            </el-dialog>
+
+          </el-form>
+
+
+          <el-table :data="tableData">
+            <el-table-column type="selection"></el-table-column>
+
+            <el-table-column prop="name" label="运营商名称"></el-table-column>
+            <el-table-column prop="number" label="运营商编号"></el-table-column>
+            <el-table-column prop="contact" label="联系人"></el-table-column>
+            <el-table-column prop="tel" label="联系电话"></el-table-column>
+
+            <el-table-column prop="province" label="省份"></el-table-column>
+            <el-table-column prop="city" label="城市"></el-table-column>
+            <el-table-column prop="address" label="具体地址"></el-table-column>
+            <el-table-column label="账号状态">
+              <template slot-scope="scope">
+                {{ String(scope.row.status) === '0' ? '已禁用' : '正常' }}
+              </template>
+            </el-table-column>
+
+
+            <el-table-column label="操作" fixed="right">
+              <template slot-scope="scope">
+                <el-button type="text" size="medium" @click="showEdit(scope.row)">编辑</el-button>
+                <el-button type="text" size="medium" @click="operatorList(scope.row)">项目</el-button>
+                <el-button type="text" size="medium" @click="del(scope.row)" style="color: #c01920">删除</el-button>
+
+                <el-button
+                    type="text"
+                    size="medium"
+                    class="delBut non"
+                    style="color: #c01920"
+                    @click="statusHandle(scope.row)"
+                >
+                  {{ scope.row.status == '1' ? '禁用' : '启用' }}
+                </el-button>
+
+              </template>
+            </el-table-column>
+          </el-table>
+
+
+          <el-pagination
+              style="margin-top: 15px;text-align: center"
+              background
+              layout="prev, pager, next"
+              :page-size="pager.pageSize"
+              :current-page="pager.pageIndex"
+              :total="pager.itemCount"
+              @current-change="handleCurrentChange"
+          >
+          </el-pagination>
         </div>
       </el-main>
 
     </el-container>
   </div>
+
+
 </template>
 
 
 <script>
-
+import areas from '../../util/area.json'
 
 export default {
   name: 'operator',
   data() {
     return {
 
+      //存放对应的城市数组
+      cityArr: [],
+      //省份
+      areas: areas,
+
       api: {
         list: this.$api.operator.list,
         delete: this.$api.operator.delete,
@@ -210,11 +226,44 @@ export default {
     }
   },
 
+
   created: function () {
     this.loadData();
+
   },
 
+  watch: {
+    'searchFormData.province'(oldValue, newValue) {
+
+      console.log(oldValue)
+      console.log(newValue)
+
+      this.searchFormData.city = ''
+
+      this.cityArr = areas.find(item => item.label == oldValue).children
+      console.log(this.cityArr)
+
+
+    },
+
+    'formData.province'(oldValue, newValue) {
+      console.log(oldValue)
+      console.log(newValue)
+
+      if (oldValue) {
+        this.cityArr = areas.find(item => item.label == oldValue).children
+        console.log(this.cityArr)
+        this.formData.city = ''
+      }
+
+
+    },
+    deep: true  // 深度监听
+  },
+
+
   methods: {
+
     //切换页码
     handleCurrentChange(index) {
       this.loadData(index)
@@ -263,9 +312,6 @@ export default {
     },
 
     showEdit(row) {
-
-      console.log(row)
-
       this.dialogFormVisible = true;
 
       this.editRow = JSON.parse(JSON.stringify(row));
@@ -430,9 +476,14 @@ export default {
 
       let vm = this;
       vm.$router.push({
-        path:'/operatorList',
-        query:{row:row}
+        path: '/operatorList',
+        query: {row: row}
       })
+    },
+
+    back() {
+      let vm = this;
+      vm.$router.back()
     }
 
   }
@@ -440,18 +491,16 @@ export default {
 </script>
 
 <style scoped>
-.el-form-item{
+.el-form-item {
   margin-right: 10px;
   margin-left: 10px;
   margin-bottom: 10px;
   margin-top: 0px;
 }
 
-.el-dialog__header{
+.el-dialog__header {
   text-align: center;
 }
 
 
-
-
 </style>

+ 56 - 20
sources/client/vrv-platform/src/views/project/list.vue

@@ -1,11 +1,10 @@
-
 <template>
   <div id="project">
     <el-container>
 
       <el-main>
         <div style="margin-bottom: 10px">
-          <el-button size="medium" icon="el-icon-back" type="text">返回</el-button>
+          <el-button size="medium" icon="el-icon-back" type="text" @click="back">返回</el-button>
           <span style="margin-left: 20px; font-size: 18px">项目列表</span>
         </div>
 
@@ -30,16 +29,16 @@
               <el-input placeholder="客户电话" size="mini" v-model="searchFormData.customerTel"></el-input>
             </el-form-item>
 
-            <el-form-item label="省份" size="mini" style="margin-top: 6px">
-              <el-select v-model="searchFormData.province" placeholder="省份" style="width: 180px">
-
+            <el-form-item label="省份" size="mini" style="margin-top: 6px;">
+              <el-select v-model="searchFormData.province" placeholder="省份" style="width: 180px" clearable>
+                <el-option v-for="item in areas" :value="item.label" :label="item.label" :key="item.code"></el-option>
               </el-select>
             </el-form-item>
 
             <el-form-item label="城市" style="margin-top: 6px" size="mini">
-              <el-select v-model="searchFormData.city" placeholder="城市" style="width: 180px">
-                <el-option label="广州" value="广州"></el-option>
-                <el-option label="韶关" value="韶关"></el-option>
+              <el-select v-model="searchFormData.city" placeholder="城市" style="width: 180px"
+                         :disabled="!searchFormData.province" clearable>
+                <el-option v-for="item in cityArr" :value="item.label" :label="item.label" :key="item.code"></el-option>
               </el-select>
             </el-form-item>
 
@@ -80,7 +79,8 @@
                   <el-form-item label="运营商编号">
                     <el-select v-model="formData.operatorNumber" placeholder="运营商编号" style="width: 202px">
 
-                      <el-option :value="i.number" v-for="(i,index) in operators" :key="index" :label="i.number"></el-option>
+                      <el-option :value="i.number" v-for="(i,index) in operators" :key="index"
+                                 :label="i.number"></el-option>
 
                     </el-select>
                   </el-form-item>
@@ -90,16 +90,18 @@
                   </el-form-item>
                 </el-row>
 
-                <el-form-item label="省份" style=" text-align: right;margin-right: 40px;margin-left: 52px">
-                  <el-select v-model="formData.province" placeholder="省份" style="width: 202px">
-                    <el-option label="上海" value="上海"></el-option>
-                    <el-option label="广东" value="广东"></el-option>
+                <el-form-item label="省份" style=" text-align: right;margin-right: 38px;margin-left: 52px ;">
+                  <el-select v-model="formData.province" placeholder="省份" style="width: 202px" clearable>
+                    <el-option v-for="item in areas" :value="item.label" :label="item.label"
+                               :key="item.code"></el-option>
                   </el-select>
                 </el-form-item>
-                <el-form-item label="城市" style="margin-right: 2px">
-                  <el-select v-model="formData.city" placeholder="城市" style="width: 202px">
-                    <el-option label="广州" value="广州"></el-option>
-                    <el-option label="韶关" value="韶关"></el-option>
+
+                <el-form-item label="城市">
+                  <el-select v-model="formData.city" placeholder="城市" style="width: 202px"
+                             :disabled="!formData.province" clearable>
+                    <el-option v-for="item in cityArr" :value="item.label" :label="item.label"
+                               :key="item.code"></el-option>
                   </el-select>
                 </el-form-item>
 
@@ -160,14 +162,18 @@
 
 
 <script>
-
+import areas from '../../util/area.json'
 
 export default {
   name: 'project',
-
   data() {
     return {
 
+      //存放对应的城市数组
+      cityArr: [],
+      //省份
+      areas: areas,
+
       api: {
         listOperator: this.$api.operator.list,
 
@@ -234,7 +240,33 @@ export default {
     this.getOperatorNumber();
   },
 
-  methods:{
+  watch: {
+    'searchFormData.province'(oldValue, newValue) {
+
+      console.log(oldValue)
+      console.log(newValue)
+
+      this.searchFormData.city = ''
+
+      this.cityArr = areas.find(item => item.label == oldValue).children
+      console.log(this.cityArr)
+
+
+    },
+
+    'formData.province'(oldValue, newValue) {
+      console.log(oldValue)
+      console.log(newValue)
+
+      this.formData.city = ''
+
+      this.cityArr = areas.find(item => item.label == oldValue).children
+      console.log(this.cityArr)
+    },
+    deep: true  // 深度监听
+  },
+
+  methods: {
     //切换页码
     handleCurrentChange(index) {
       this.loadData(index)
@@ -456,6 +488,10 @@ export default {
       vm.$router.push('/gateway')
     }
     ,
+    back(){
+      let vm = this;
+      vm.$router.back()
+    }
   }
 }
 

+ 62 - 37
sources/client/vrv-platform/src/views/project/operatorList.vue

@@ -4,8 +4,13 @@
 
       <el-main>
         <div style="margin-bottom: 10px">
-          <el-button size="medium" icon="el-icon-back" type="text">返回</el-button>
+          <el-button size="medium" icon="el-icon-back" type="text" @click="back">返回</el-button>
           <span style="margin-left: 20px; font-size: 18px">项目列表</span>
+
+        </div>
+        <div style="margin-bottom: 12px">
+          <span style="margin-left: 3px; font-size: 16px; color: #545c64">运营商编号:{{operatorData.number}}</span>
+          <span style="margin-left: 20px; font-size: 16px;color: #545c64">运营商名称:{{operatorData.name}}</span>
         </div>
 
         <el-button size="medium" icon="el-icon-search" style="margin-bottom: 15px" @click="search(searchFormData)">
@@ -29,16 +34,16 @@
               <el-input placeholder="客户电话" size="mini" v-model="searchFormData.customerTel"></el-input>
             </el-form-item>
 
-            <el-form-item label="省份" size="mini" style="margin-top: 6px">
-              <el-select v-model="searchFormData.province" placeholder="省份" style="width: 180px">
-
+            <el-form-item label="省份" size="mini" style="margin-top: 6px;">
+              <el-select v-model="searchFormData.province" placeholder="省份" style="width: 180px" clearable>
+                <el-option v-for="item in areas" :value="item.label" :label="item.label" :key="item.code"></el-option>
               </el-select>
             </el-form-item>
 
             <el-form-item label="城市" style="margin-top: 6px" size="mini">
-              <el-select v-model="searchFormData.city" placeholder="城市" style="width: 180px">
-                <el-option label="广州" value="广州"></el-option>
-                <el-option label="韶关" value="韶关"></el-option>
+              <el-select v-model="searchFormData.city" placeholder="城市" style="width: 180px"
+                         :disabled="!searchFormData.province" clearable>
+                <el-option v-for="item in cityArr" :value="item.label" :label="item.label" :key="item.code"></el-option>
               </el-select>
             </el-form-item>
 
@@ -47,13 +52,6 @@
               <el-input placeholder="具体地址" size="mini" v-model="searchFormData.address"></el-input>
             </el-form-item>
 
-            <el-form-item label="运营商编号" style="margin-top: 6px" size="mini">
-              <el-select v-model="formData.operatorNumber" placeholder="运营商编号" style="width: 180px">
-
-                <el-option :value="i.number" v-for="(i,index) in operators" :key="index" :label="i.number"></el-option>
-
-              </el-select>
-            </el-form-item>
 
             <!--            编辑弹窗-->
             <el-dialog title="项目" :visible.sync="dialogFormVisible" style="width: 70% ; margin-left: 300px ;">
@@ -77,12 +75,7 @@
 
                 <el-row style="margin-left: 0px">
                   <el-form-item label="运营商编号">
-                    <el-select v-model="formData.operatorNumber" placeholder="运营商编号" style="width: 202px">
-
-                      <el-option :value="i.number" v-for="(i,index) in operators" :key="index"
-                                 :label="i.number"></el-option>
-
-                    </el-select>
+                    <el-input v-model="operatorData.number" readonly="readonly"></el-input>
                   </el-form-item>
 
                   <el-form-item label="客户电话">
@@ -90,16 +83,18 @@
                   </el-form-item>
                 </el-row>
 
-                <el-form-item label="省份" style=" text-align: right;margin-right: 40px;margin-left: 52px">
-                  <el-select v-model="formData.province" placeholder="省份" style="width: 202px">
-                    <el-option label="上海" value="上海"></el-option>
-                    <el-option label="广东" value="广东"></el-option>
+                <el-form-item label="省份" style=" text-align: right;margin-right: 38px;margin-left: 52px ;">
+                  <el-select v-model="formData.province" placeholder="省份" style="width: 202px" clearable>
+                    <el-option v-for="item in areas" :value="item.label" :label="item.label"
+                               :key="item.code"></el-option>
                   </el-select>
                 </el-form-item>
-                <el-form-item label="城市" style="margin-right: 2px">
-                  <el-select v-model="formData.city" placeholder="城市" style="width: 202px">
-                    <el-option label="广州" value="广州"></el-option>
-                    <el-option label="韶关" value="韶关"></el-option>
+
+                <el-form-item label="城市">
+                  <el-select v-model="formData.city" placeholder="城市" style="width: 202px"
+                             :disabled="!formData.province" clearable>
+                    <el-option v-for="item in cityArr" :value="item.label" :label="item.label"
+                               :key="item.code"></el-option>
                   </el-select>
                 </el-form-item>
 
@@ -120,7 +115,6 @@
 
           <el-table :data="tableData">
             <el-table-column type="selection"></el-table-column>
-            <el-table-column prop="operatorNumber" label="运营商编号"></el-table-column>
             <el-table-column prop="name" label="项目名称"></el-table-column>
             <el-table-column prop="number" label="项目编号"></el-table-column>
             <el-table-column prop="description" label="项目描述"></el-table-column>
@@ -161,14 +155,18 @@
 
 
 <script>
-
+import areas from '../../util/area.json'
 
 export default {
   name: 'project',
-
   data() {
     return {
 
+      //存放对应的城市数组
+      cityArr: [],
+      //省份
+      areas: areas,
+
       api: {
         listOperator: this.$api.operator.list,
 
@@ -246,6 +244,32 @@ export default {
 
   },
 
+  watch: {
+    'searchFormData.province'(oldValue, newValue) {
+
+      console.log(oldValue)
+      console.log(newValue)
+
+      this.searchFormData.city = ''
+
+      this.cityArr = areas.find(item => item.label == oldValue).children
+      console.log(this.cityArr)
+
+
+    },
+
+    'formData.province'(oldValue, newValue) {
+      console.log(oldValue)
+      console.log(newValue)
+
+      this.formData.city = ''
+
+      this.cityArr = areas.find(item => item.label == oldValue).children
+      console.log(this.cityArr)
+    },
+    deep: true  // 深度监听
+  },
+
   methods: {
     //切换页码
     handleCurrentChange(index) {
@@ -265,7 +289,9 @@ export default {
 
 
     loadData(index) {
+
       var row = this.$route.query.row;
+
       console.log(row)
 
       this.operatorData = row
@@ -285,23 +311,17 @@ export default {
           address: this.searchFormData.address,
           customer: this.searchFormData.customer,
           customerTel: this.searchFormData.customerTel,
-          operatorName: this.operatorData.name,
           operatorNumber: this.operatorData.number,
         }
       })
           .then((response) => {
-            // vm.paper = response.data.data.paper;
-            //console.log(response.data.data);
-
             vm.pager = response.data.data.pager
 
             vm.tableData = response.data.data.projects;
-            vm.tableData.operatorNumber = this.operatorData.number;
           })
     }
     ,
     search() {
-      //console.log(this.searchFormData)
       this.loadData();
     }
     ,
@@ -475,6 +495,11 @@ export default {
       vm.$router.push('/gateway')
     }
     ,
+    back(){
+      let vm = this;
+      vm.$router.back()
+    }
+
   }
 }
 

+ 158 - 17
sources/client/vrv-platform/yarn.lock

@@ -262,7 +262,7 @@
     "chalk" "^2.0.0"
     "js-tokens" "^4.0.0"
 
-"@babel/parser@^7.18.10", "@babel/parser@^7.18.13", "@babel/parser@^7.18.4", "@babel/parser@^7.7.0":
+"@babel/parser@^7.16.4", "@babel/parser@^7.18.10", "@babel/parser@^7.18.13", "@babel/parser@^7.18.4", "@babel/parser@^7.7.0":
   "integrity" "sha512-dgXcIfMuQ0kgzLB2b9tRZs7TTFFaGM2AbtA4fJgUUYukzGH4jwsS7hzQHEGs67jdehpm22vkgKwvbU+aEflgwg=="
   "resolved" "https://registry.npmmirror.com/@babel/parser/-/parser-7.18.13.tgz"
   "version" "7.18.13"
@@ -1061,6 +1061,24 @@
     "semver" "^6.0.0"
     "string.prototype.padstart" "^3.0.0"
 
+"@vue/compiler-core@3.2.38":
+  "integrity" "sha512-/FsvnSu7Z+lkd/8KXMa4yYNUiqQrI22135gfsQYVGuh5tqEgOB0XqrUdb/KnCLa5+TmQLPwvyUnKMyCpu+SX3Q=="
+  "resolved" "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.38.tgz"
+  "version" "3.2.38"
+  dependencies:
+    "@babel/parser" "^7.16.4"
+    "@vue/shared" "3.2.38"
+    "estree-walker" "^2.0.2"
+    "source-map" "^0.6.1"
+
+"@vue/compiler-dom@3.2.38":
+  "integrity" "sha512-zqX4FgUbw56kzHlgYuEEJR8mefFiiyR3u96498+zWPsLeh1WKvgIReoNE+U7gG8bCUdvsrJ0JRmev0Ky6n2O0g=="
+  "resolved" "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.38.tgz"
+  "version" "3.2.38"
+  dependencies:
+    "@vue/compiler-core" "3.2.38"
+    "@vue/shared" "3.2.38"
+
 "@vue/compiler-sfc@2.7.10":
   "integrity" "sha512-55Shns6WPxlYsz4WX7q9ZJBL77sKE1ZAYNYStLs6GbhIOMrNtjMvzcob6gu3cGlfpCR4bT7NXgyJ3tly2+Hx8Q=="
   "resolved" "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-2.7.10.tgz"
@@ -1070,6 +1088,30 @@
     "postcss" "^8.4.14"
     "source-map" "^0.6.1"
 
+"@vue/compiler-sfc@3.2.38":
+  "integrity" "sha512-KZjrW32KloMYtTcHAFuw3CqsyWc5X6seb8KbkANSWt3Cz9p2qA8c1GJpSkksFP9ABb6an0FLCFl46ZFXx3kKpg=="
+  "resolved" "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.38.tgz"
+  "version" "3.2.38"
+  dependencies:
+    "@babel/parser" "^7.16.4"
+    "@vue/compiler-core" "3.2.38"
+    "@vue/compiler-dom" "3.2.38"
+    "@vue/compiler-ssr" "3.2.38"
+    "@vue/reactivity-transform" "3.2.38"
+    "@vue/shared" "3.2.38"
+    "estree-walker" "^2.0.2"
+    "magic-string" "^0.25.7"
+    "postcss" "^8.1.10"
+    "source-map" "^0.6.1"
+
+"@vue/compiler-ssr@3.2.38":
+  "integrity" "sha512-bm9jOeyv1H3UskNm4S6IfueKjUNFmi2kRweFIGnqaGkkRePjwEcfCVqyS3roe7HvF4ugsEkhf4+kIvDhip6XzQ=="
+  "resolved" "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.38.tgz"
+  "version" "3.2.38"
+  dependencies:
+    "@vue/compiler-dom" "3.2.38"
+    "@vue/shared" "3.2.38"
+
 "@vue/component-compiler-utils@^3.0.0", "@vue/component-compiler-utils@^3.1.0":
   "integrity" "sha512-97sfH2mYNU+2PzGrmK2haqffDpVASuib9/w2/noxiFi31Z54hW+q3izKQXXQZSNhtiUpAI36uSuYepeBe4wpHQ=="
   "resolved" "https://registry.npmmirror.com/@vue/component-compiler-utils/-/component-compiler-utils-3.3.0.tgz"
@@ -1091,6 +1133,54 @@
   "resolved" "https://registry.npmmirror.com/@vue/preload-webpack-plugin/-/preload-webpack-plugin-1.1.2.tgz"
   "version" "1.1.2"
 
+"@vue/reactivity-transform@3.2.38":
+  "integrity" "sha512-3SD3Jmi1yXrDwiNJqQ6fs1x61WsDLqVk4NyKVz78mkaIRh6d3IqtRnptgRfXn+Fzf+m6B1KxBYWq1APj6h4qeA=="
+  "resolved" "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.38.tgz"
+  "version" "3.2.38"
+  dependencies:
+    "@babel/parser" "^7.16.4"
+    "@vue/compiler-core" "3.2.38"
+    "@vue/shared" "3.2.38"
+    "estree-walker" "^2.0.2"
+    "magic-string" "^0.25.7"
+
+"@vue/reactivity@3.2.38":
+  "integrity" "sha512-6L4myYcH9HG2M25co7/BSo0skKFHpAN8PhkNPM4xRVkyGl1K5M3Jx4rp5bsYhvYze2K4+l+pioN4e6ZwFLUVtw=="
+  "resolved" "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.38.tgz"
+  "version" "3.2.38"
+  dependencies:
+    "@vue/shared" "3.2.38"
+
+"@vue/runtime-core@3.2.38":
+  "integrity" "sha512-kk0qiSiXUU/IKxZw31824rxmFzrLr3TL6ZcbrxWTKivadoKupdlzbQM4SlGo4MU6Zzrqv4fzyUasTU1jDoEnzg=="
+  "resolved" "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.38.tgz"
+  "version" "3.2.38"
+  dependencies:
+    "@vue/reactivity" "3.2.38"
+    "@vue/shared" "3.2.38"
+
+"@vue/runtime-dom@3.2.38":
+  "integrity" "sha512-4PKAb/ck2TjxdMSzMsnHViOrrwpudk4/A56uZjhzvusoEU9xqa5dygksbzYepdZeB5NqtRw5fRhWIiQlRVK45A=="
+  "resolved" "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.38.tgz"
+  "version" "3.2.38"
+  dependencies:
+    "@vue/runtime-core" "3.2.38"
+    "@vue/shared" "3.2.38"
+    "csstype" "^2.6.8"
+
+"@vue/server-renderer@3.2.38":
+  "integrity" "sha512-pg+JanpbOZ5kEfOZzO2bt02YHd+ELhYP8zPeLU1H0e7lg079NtuuSB8fjLdn58c4Ou8UQ6C1/P+528nXnLPAhA=="
+  "resolved" "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.38.tgz"
+  "version" "3.2.38"
+  dependencies:
+    "@vue/compiler-ssr" "3.2.38"
+    "@vue/shared" "3.2.38"
+
+"@vue/shared@3.2.38":
+  "integrity" "sha512-dTyhTIRmGXBjxJE+skC8tTWCGLCVc4wQgRRLt8+O9p5ewBAjoBwtCAkLPrtToSr1xltoe3st21Pv953aOZ7alg=="
+  "resolved" "https://registry.npmjs.org/@vue/shared/-/shared-3.2.38.tgz"
+  "version" "3.2.38"
+
 "@vue/web-component-wrapper@^1.2.0":
   "integrity" "sha512-Iu8Tbg3f+emIIMmI2ycSI8QcEuAUgPTgHwesDU1eKMLE4YC/c/sFbGc70QgMq31ijRftV0R7vCm9co6rldCeOA=="
   "resolved" "https://registry.npmmirror.com/@vue/web-component-wrapper/-/web-component-wrapper-1.3.0.tgz"
@@ -2866,6 +2956,11 @@
   dependencies:
     "css-tree" "^1.1.2"
 
+"csstype@^2.6.8":
+  "integrity" "sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA=="
+  "resolved" "https://registry.npmjs.org/csstype/-/csstype-2.6.20.tgz"
+  "version" "2.6.20"
+
 "csstype@^3.1.0":
   "integrity" "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA=="
   "resolved" "https://registry.npmmirror.com/csstype/-/csstype-3.1.0.tgz"
@@ -3664,6 +3759,11 @@
   "resolved" "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz"
   "version" "5.3.0"
 
+"estree-walker@^2.0.2":
+  "integrity" "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
+  "resolved" "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz"
+  "version" "2.0.2"
+
 "esutils@^2.0.2":
   "integrity" "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="
   "resolved" "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz"
@@ -3921,25 +4021,27 @@
   "resolved" "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz"
   "version" "2.0.6"
 
-"fastboot-admin@file:D:/IdeaCode/fastboot/client/fastboot-admin":
-  "resolved" "file:D:/IdeaCode/fastboot/client/fastboot-admin"
+"fastboot-ui@file:D:/IdeaCode/fastboot/ui/fastboot-ui":
+  "resolved" "file:D:/IdeaCode/fastboot/ui/fastboot-ui"
   "version" "0.1.0"
   dependencies:
-    "@babel/plugin-syntax-dynamic-import" "^7.8.3"
-    "ace-builds" "^1.4.5"
-    "axios" "^0.19.0"
+    "@fortawesome/fontawesome" "^1.1.8"
+    "@fortawesome/fontawesome-free-brands" "^5.0.13"
+    "@fortawesome/fontawesome-free-regular" "^5.0.13"
+    "@fortawesome/fontawesome-free-solid" "^5.0.13"
+    "@fortawesome/fontawesome-svg-core" "^1.2.17"
+    "@fortawesome/free-solid-svg-icons" "^5.8.1"
+    "@fortawesome/vue-fontawesome" "^0.1.6"
     "core-js" "^2.6.5"
-    "echarts" "^4.2.1"
-    "element-ui" "^2.12.0"
-    "lodash" "4.17.11"
-    "moment" "^2.24.0"
-    "mqtt" "^3.0.0"
-    "qs" "^6.7.0"
-    "vue" "^2.6.10"
-    "vue-codemirror" "^4.0.6"
-    "vue-echarts" "^4.0.3"
-    "vue-quill-editor" "^3.0.6"
-    "vue-router" "^3.0.3"
+    "element-ui" "2.12.0"
+    "ionicons" "^4.5.6"
+    "normalize.css" "^8.0.1"
+    "perfect-scrollbar" "^1.4.0"
+    "screenfull" "^4.2.0"
+    "vue" "^2.6.6"
+    "vue-awesome-swiper" "^3.1.3"
+    "vue-context-menu" "^2.0.6"
+    "vue-router" "^3.0.1"
     "vuex" "^3.0.1"
 
 "fastparse@^1.1.2":
@@ -5629,6 +5731,13 @@
   dependencies:
     "yallist" "^3.0.2"
 
+"magic-string@^0.25.7":
+  "integrity" "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ=="
+  "resolved" "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz"
+  "version" "0.25.9"
+  dependencies:
+    "sourcemap-codec" "^1.4.8"
+
 "make-dir@^1.0.0":
   "integrity" "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ=="
   "resolved" "https://registry.npmmirror.com/make-dir/-/make-dir-1.3.0.tgz"
@@ -7029,6 +7138,15 @@
     "picocolors" "^0.2.1"
     "source-map" "^0.6.1"
 
+"postcss@^8.1.10":
+  "integrity" "sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ=="
+  "resolved" "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz"
+  "version" "8.4.16"
+  dependencies:
+    "nanoid" "^3.3.4"
+    "picocolors" "^1.0.0"
+    "source-map-js" "^1.0.2"
+
 "postcss@^8.4.14":
   "integrity" "sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ=="
   "resolved" "https://registry.npmmirror.com/postcss/-/postcss-8.4.16.tgz"
@@ -8045,6 +8163,11 @@
   "resolved" "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz"
   "version" "0.6.1"
 
+"sourcemap-codec@^1.4.8":
+  "integrity" "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA=="
+  "resolved" "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz"
+  "version" "1.4.8"
+
 "spdx-correct@^3.0.0":
   "integrity" "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w=="
   "resolved" "https://registry.npmmirror.com/spdx-correct/-/spdx-correct-3.1.1.tgz"
@@ -8908,6 +9031,13 @@
   "resolved" "https://registry.npmmirror.com/uuid/-/uuid-8.3.2.tgz"
   "version" "8.3.2"
 
+"v-distpicker@^2.0.8":
+  "integrity" "sha512-qaUUr+/h1xFsWBCVhEt/nH4gdy/PZgjjeEakrGxzFQzf+gafFovYdc2Q+9BXrSAMmv1YpEkLgMA+5dOK3fR7jQ=="
+  "resolved" "https://registry.npmjs.org/v-distpicker/-/v-distpicker-2.0.8.tgz"
+  "version" "2.0.8"
+  dependencies:
+    "vue" "~3.2.37"
+
 "validate-npm-package-license@^3.0.1":
   "integrity" "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew=="
   "resolved" "https://registry.npmmirror.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz"
@@ -9038,6 +9168,17 @@
     "@vue/compiler-sfc" "2.7.10"
     "csstype" "^3.1.0"
 
+"vue@~3.2.37", "vue@3.2.38":
+  "integrity" "sha512-hHrScEFSmDAWL0cwO4B6WO7D3sALZPbfuThDsGBebthrNlDxdJZpGR3WB87VbjpPh96mep1+KzukYEhpHDFa8Q=="
+  "resolved" "https://registry.npmjs.org/vue/-/vue-3.2.38.tgz"
+  "version" "3.2.38"
+  dependencies:
+    "@vue/compiler-dom" "3.2.38"
+    "@vue/compiler-sfc" "3.2.38"
+    "@vue/runtime-dom" "3.2.38"
+    "@vue/server-renderer" "3.2.38"
+    "@vue/shared" "3.2.38"
+
 "vuex@^3.0.1":
   "integrity" "sha512-ETW44IqCgBpVomy520DT5jf8n0zoCac+sxWnn+hMe/CzaSejb/eVw2YToiXYX+Ex/AuHHia28vWTq4goAexFbw=="
   "resolved" "https://registry.npmmirror.com/vuex/-/vuex-3.6.2.tgz"

+ 1 - 0
sources/server/vrv/run/application.pid

@@ -0,0 +1 @@
+7668

+ 3 - 0
sources/server/vrv/vrv-core-service/src/main/java/com/kuyuntech/vrv/coreservice/service/core/impl/ProjectServiceImpl.java

@@ -201,6 +201,9 @@ public class ProjectServiceImpl extends AbstractFastbootService<Project, Project
         DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Project.class);
 
         if (projectBean != null) {
+            if (StringUtils.isNotBlank(projectBean.getOperatorNumber())) {
+                detachedCriteria.add(Restrictions.like("operatorNumber", projectBean.getOperatorNumber(), MatchMode.ANYWHERE));
+            }
             if (StringUtils.isNotBlank(projectBean.getName())) {
                 detachedCriteria.add(Restrictions.like("name", projectBean.getName(), MatchMode.ANYWHERE));
             }