ljr-395181403 1 gadu atpakaļ
vecāks
revīzija
39355d1bb4

+ 2 - 1
.eslintrc.js

@@ -46,6 +46,7 @@ module.exports = {
         // 禁止出现未使用过的变量
         "no-unused-vars": 0,
         // 要求或禁止末尾逗号
-        "comma-dangle": 0
+        "comma-dangle": 0,
+        "no-extra-semi": 0
     }
 }

+ 31 - 0
.vscode/settings.json

@@ -0,0 +1,31 @@
+{
+    "editor.formatOnPaste": true, // 粘贴时自动格式化
+    "editor.formatOnSave": true, // 保存时自动格式化
+    "editor.formatOnType": true, // 控制编辑器在键入一行后,是否自动格式化该行
+    "editor.codeActionsOnSave": { // 保存时的代码操作
+        "source.fixAll.eslint": true // 执行eslint程序
+    },
+    "eslint.validate": [ // eslint指定要执行验证的文件
+        "javascript",
+        "html",
+        "vue"
+    ],
+    "[javascript]": {
+        "editor.defaultFormatter": "esbenp.prettier-vscode" // javascript 默认格式化程序
+    },
+    "[html]": {
+        "editor.defaultFormatter": "esbenp.prettier-vscode" // html 默认格式化程序
+    },
+    "[vue]": {
+        "editor.defaultFormatter": "esbenp.prettier-vscode" // vue 默认格式化程序
+    },
+    "[css]": {
+        "editor.defaultFormatter": "esbenp.prettier-vscode" // css 默认格式化程序
+    },
+    "[scss]": {
+        "editor.defaultFormatter": "esbenp.prettier-vscode" // scss 默认格式化程序
+    },
+    "[less]": {
+        "editor.defaultFormatter": "esbenp.prettier-vscode" // less 默认格式化程序
+    }
+}

+ 1 - 1
config/dev.env.js

@@ -32,7 +32,7 @@ module.exports = merge(prodEnv, {
     IS_MOCK: "false",
     PROXY_TABLE: JSON.stringify({
         "/dcucauth": {
-            // target: 'http://10.11.1.237:8861' // 马志强
+            // target: "http://10.11.1.237:8861" // 马志强
             target: "http://10.11.0.240:8861" // 陈炳煌
             // target: "http://10.254.11.203:8861"
             //  target: "http://192.168.10.2:8871"

+ 58 - 48
src/api/common.js

@@ -1,61 +1,60 @@
-import req from "ui-jz-v4-common/src/utils/zt-data";
-import axios from "@/utils/req";
-import request from "@/utils/request";
+import req from "ui-jz-v4-common/src/utils/zt-data"
+import axios from "@/utils/req"
+import request from "@/utils/request"
 import handleSearchCondition from "@/utils/searchable"
 
 // 将一维数组转换成树形结构
 function treeUtil(data, key = { id: "id", pid: "pid" }) {
-    let result = [];
+    let result = []
     if (!Array.isArray(data)) {
-        return result;
+        return result
     }
     data.forEach(item => {
-        delete item.children;
-    });
-    let map = {};
+        delete item.children
+    })
+    let map = {}
     data.forEach(item => {
-        map[item[key.id]] = item;
-    });
+        map[item[key.id]] = item
+    })
     data.forEach(item => {
-        let parent = map[item[key.pid] || item[key.pid.toLocaleUpperCase()]];
+        let parent = map[item[key.pid] || item[key.pid.toLocaleUpperCase()]]
         if (parent) {
-            (parent.children || (parent.children = [])).push(item);
+            ;(parent.children || (parent.children = [])).push(item)
         } else {
-            result.push(item);
+            result.push(item)
         }
-    });
-    return result;
+    })
+    return result
 }
 
 /** next delete...
  * 机构树列表
  */
 export function getOrgMtTree(data) {
-    return req.post("/orgInfo/orgMtTreeYB", data);
+    return req.post("/orgInfo/orgMtTreeYB", data)
 }
 
 // 机构列表 *懒加载
 export function getTree(data) {
-    data.type = data.type || "APP";
+    data.type = data.type || "APP"
     // data.id = data.id || '7F08CCC3C4984A2586C9D3F0A6B804E5';
-    return axios.post("/authsvr/v2/authorginfo/org/tree/catalog", data);
+    return axios.post("/authsvr/v2/authorginfo/org/tree/catalog", data)
 }
 
 // 机构树-正确的树 (权限过滤后的)
 export function getOrgTree(data) {
-    data.type = data.type || "APP";
-    return axios.post("/authsvr/v2/authorginfo/org/tree/catalog", data);
-
+    data.type = data.type || "APP"
+    return axios.post("/authsvr/v2/authorginfo/org/tree/catalog", data)
 }
 
 // 机构列表 *查询本级
 export function getBaseTree(data) {
-    return axios.get(`/authsvr/v2/authorginfo/org/tree/node/${data.id}`);
+    return axios.get(`/authsvr/v2/authorginfo/org/tree/node/${data.id}`)
 }
 
 // 厂商列表
 export function externalTree(data) {
-    return axios.post("/appsvr/app/externalTree", data);
+    return axios.post("/appsvr/app/externalTree", data)
 }
 
 /**
@@ -64,7 +63,7 @@ export function externalTree(data) {
  */
 export function treeMatch(data) {
     // return axios.post(`orgsvr/v2/org/tree/match`, data);
-   return request({
+    return request({
         url: "/authsvr/v2/authorginfo/org/tree/match",
         method: "POST",
         data
@@ -77,60 +76,60 @@ export function treeMatch(data) {
  * type: police 警员、auxiliaryPolice 辅警、externalPersonnel 外部人员、manager 管理员、govUser 政府人员
  */
 export function downTemplate(params) {
-    return axios.arraybuffer("/downloadTemplate/downTemplate", params);
+    return axios.arraybuffer("/downloadTemplate/downTemplate", params)
 }
 
 // 导入文件
 export function importFile(url, data) {
-   return request({
-       url,
-       method: "GET",
-       params: data
-   })
+    return request({
+        url,
+        method: "GET",
+        params: data
+    })
 }
 
 export function uniClass() {
     return req.post("/duacm/codeSon/v2/data/T_MD_UNIT_CLASS.ation").then(res => {
-        const arr = res.data;
+        const arr = res.data
 
         return {
             arr,
             tree: treeUtil(arr, { id: "CODE", pid: "pcode" })
-        };
-    });
+        }
+    })
 }
 
 // 单位类别  新新新
 export function uniClass2() {
     return req.post("/duacm/codeSon/v2/data/T_MD_UNIT_CLASS.ation").then(res => {
-        const arr = res.data;
+        const arr = res.data
 
         return {
             arr,
             tree: treeUtil(arr, { id: "CODE", pid: "pcode" })
-        };
-    });
+        }
+    })
 }
 
 // 分配范围
 export function distribuAction(data) {
     return req.get("/authsvr/v2/orgQuota/distributionRange", data).then(res => {
         if (res.data && res.status == 200) {
-            return res.data.content;
+            return res.data.content
         }
-    });
+    })
 }
 
 /**
  * 菜单树 一次性查询
  * */
 export function menuTree({ appId }) {
-    return axios.get(`/authsvr/v2/appfuninfo/menuTreeList`, { appId });
+    return axios.get(`/authsvr/v2/appfuninfo/menuTreeList`, { appId })
 }
 
 // 根据appId 获取菜单
 export function getAppfunMenu(appId) {
-    return axios.get(`/authsvr/v2/appfuninfo/menu/${appId}`);
+    return axios.get(`/authsvr/v2/appfuninfo/menu/${appId}`)
 }
 
 // 标签树
@@ -138,13 +137,24 @@ export function getBusinessTagTree(data) {
     return request({
         url: `/authsvr/v2/dataauth/businessTreeList`,
         method: "get"
-    });
+    })
 }
 
-export function getDropdownApp(url,condition) {
-   return request({
-       url,
-       method: "POST",
-       data: handleSearchCondition(condition)
-   })
-}
+export function getDropdownApp(url, condition) {
+    return request({
+        url,
+        method: "POST",
+        data: handleSearchCondition(condition)
+    })
+}
+
+/**
+ * 令牌在线查询接口
+ */
+export function getOnline(data) {
+    return request({
+        url: `/authsvr/v2/token-info/online-query`,
+        method: "POST",
+        data
+    })
+}

+ 5 - 0
src/api/roleinfo-manage.js

@@ -41,3 +41,8 @@ export function getMenuChecked(roleId) {
 export function saveRsGrid(data) {
     return axios.post(`${base}/rsGrid`, data)
 }
+
+// 角色申请
+export function roleApply(data) {
+    return axios.post(`${base}/role-operate-apply`, data)
+}

+ 27 - 0
src/api/task-type-manage.js

@@ -0,0 +1,27 @@
+// 任务类型管理
+
+import axios from "@/utils/req";
+import qs from "qs";
+
+const baseUrl = `/authsvr/v2/subTaskType`;
+
+export const tableUrl = `${baseUrl}/pageSearch`;
+
+export function taskTypePage() {
+  const params = {
+    page: 0,
+    size: 1000,
+    searchCondition: qs.stringify([])
+  };
+  return axios.post(`${baseUrl}/pageSearch`, params);
+}
+
+// 任务类型树
+export function taskTypeTree() {
+  return axios.get(`${baseUrl}/tree`);
+}
+
+// 任务类型同步
+export function taskTypeSync() {
+  return axios.get(`${baseUrl}/taskTypeSync `);
+}

+ 3 - 3
src/assets/style/project.scss

@@ -75,9 +75,9 @@
   max-height: 400px;
 }
 
-.el-button--small {
-  min-width: 80px !important;
-}
+// .el-button--small {
+//   min-width: 80px !important;
+// }
 .el-tree {
   padding-right: 17px;
 }

+ 3 - 3
src/components/new-table/index.vue

@@ -40,14 +40,14 @@
             <dg-table-column label="操作" align="center" v-if="tableOptList.length" :width="optColumnWidth">
                 <template slot-scope="{ row }">
                     <div class="u-table__operation">
-                        <span
+                        <el-button
                             v-for="(item, index) in tableOptList"
                             :key="index"
-                            style="margin-right: 5px;font-size: 14px;"
+                            type="text"
                             @click="handleEvent(item, row)"
                         >
                             {{ item }}
-                        </span>
+                        </el-button>
                     </div>
                 </template>
             </dg-table-column>

+ 63 - 35
src/pages/appfun-auth-manage/app-role-manage/author-role-manage.vue

@@ -1,5 +1,3 @@
-/** * 组件名称;权限配置-角色管理 * @author:laiyh * @Date:2020-07-27 */
-
 <template>
     <dg-row :gutter="10" class="role-edit-box">
         <dg-col :span="14">
@@ -31,9 +29,12 @@
                     >
                 </el-form>
                 <div class="u-table-top__btn">
-                    <dg-button type="primary" icon="el-icon-circle-plus-outline" @click="handleAddDialog"
-                        >新增</dg-button
-                    >
+                    <dg-button type="primary" icon="el-icon-circle-plus-outline" @click="handleAddDialog('role')">
+                        新增
+                    </dg-button>
+                    <dg-button type="primary" icon="el-icon-circle-plus-outline" @click="handleAddDialog('apply')">
+                        新增申请
+                    </dg-button>
                 </div>
                 <Table
                     ref="myRoleTable"
@@ -43,16 +44,20 @@
                     :maxheight="620"
                     @handleRowClick="handleRowClick"
                 >
-                    <dg-table-column label="操作" width="120" align="center">
+                    <dg-table-column label="操作" width="240" align="center">
                         <template slot-scope="scope">
-                            <div class="u-table__operation">
-                                <el-tooltip class="item" effect="dark" content="修改"
-                                    ><i class="el-icon-edit" @click="handleRoleEdit(scope.row)"></i
-                                ></el-tooltip>
-                                <el-tooltip class="item" effect="dark" content="删除"
-                                    ><i class="el-icon-delete" @click="handleRoleDelete(scope.row)"></i
-                                ></el-tooltip>
-                            </div>
+                            <el-button type="text" @click="handleRoleEdit(scope.row, 'role', $event)">
+                                修改
+                            </el-button>
+                            <el-button type="text" @click="handleRoleDelete(scope.row, 'role', $event)">
+                                删除
+                            </el-button>
+                            <el-button type="text" @click="handleRoleEdit(scope.row, 'apply', $event)">
+                                修改申请
+                            </el-button>
+                            <el-button type="text" @click="handleRoleDelete(scope.row, 'apply', $event)">
+                                删除申请
+                            </el-button>
                         </template>
                     </dg-table-column>
                 </Table>
@@ -125,6 +130,12 @@ export default {
             roleId: ""
         }
     },
+    // 页面创建完成$data可访问 $el不可以访问
+    created() {
+        const that = this
+        this.$set(this.reportForm.app_id, "value", this.appId)
+        this.getAppfunMenu()
+    },
     // 方法
     methods: {
         // 查询角色
@@ -132,17 +143,18 @@ export default {
             this.$refs.myRoleTable.handleSearchClick()
         },
         // 新增
-        handleAddDialog() {
+        handleAddDialog(createType = "role") {
             const that = this
             const { appId } = that
             const layer = that.$dgLayer({
-                title: "新增角色",
+                title: createType === "role" ? "新增角色" : "新增申请",
                 area: ["550px", "650px"],
                 shadow: [0.4, "#fff"],
                 content: roleMange,
                 props: {
                     appId,
-                    type: "create"
+                    type: "create",
+                    createType
                 },
                 on: {
                     success(bool = false) {
@@ -155,7 +167,8 @@ export default {
             })
         },
         // 修改
-        handleRoleEdit({ id }) {
+        handleRoleEdit({ id }, createType = "role", event) {
+            event.stopPropagation()
             const that = this
             const { appId } = that
             roleinfoManageApi.getRoleInfo(id).then(res => {
@@ -167,6 +180,7 @@ export default {
                     props: {
                         appId,
                         type: "update",
+                        createType,
                         formData: res
                     },
                     on: {
@@ -181,22 +195,42 @@ export default {
             })
         },
         // 删除、
-        handleRoleDelete({ id, name }) {
+        handleRoleDelete(row, createType = "role", event) {
+            event.stopPropagation()
             const that = this
-            that.$confirm(`是否确定删除角色[${name}]?`, "提示", {
+            const isRole = createType === "role"
+            let message = isRole ? "是否确定删除角色" : "是否确定删除申请"
+            message += row.name + "?"
+            that.$confirm(message, "提示", {
                 distinguishCancelAndClose: true,
                 confirmButtonText: "确定",
                 cancelButtonText: "取消"
             }).then(_ => {
-                roleinfoManageApi
-                    .deleteRole(id)
-                    .then(() => {
-                        that.reloadTable()
-                        that.$message.success("删除成功!")
-                    })
-                    .catch(() => {
-                        that.$message.error("删除失败")
-                    })
+                if (isRole) {
+                    roleinfoManageApi
+                        .deleteRole(row.id)
+                        .then(() => {
+                            that.reloadTable()
+                            that.$message.success("删除成功!")
+                        })
+                        .catch(() => {
+                            that.$message.error("删除失败")
+                        })
+                }
+                if (!isRole) {
+                    roleinfoManageApi
+                        .roleApply({
+                            operate: "30",
+                            roleSaveVo: row
+                        })
+                        .then(() => {
+                            that.reloadTable()
+                            that.$message.success("删除成功!")
+                        })
+                        .catch(() => {
+                            that.$message.error("删除失败")
+                        })
+                }
             })
         },
         // 刷新表格
@@ -388,12 +422,6 @@ export default {
         /*
          *********应用菜单end**********
          */
-    },
-    // 页面创建完成$data可访问 $el不可以访问
-    created() {
-        const that = this
-        this.$set(this.reportForm.app_id, "value", this.appId)
-        this.getAppfunMenu()
     }
 }
 </script>

+ 9 - 11
src/pages/appfun-auth-manage/app-role-manage/edit.vue

@@ -1,5 +1,3 @@
-/** * 组件名称;权限配置修改 * @author:laiyh * @Date:2020-07-27 */
-
 <template>
     <div class="authen-main authorization-edit-maintain">
         <el-tabs v-model="active" type="card" @tab-click="tableClick">
@@ -11,11 +9,11 @@
 </template>
 
 <script>
-import AuthorRoleManage from "./author-role-manage";
+import AuthorRoleManage from "./author-role-manage.vue"
 export default {
     name: "",
     components: {
-        AuthorRoleManage,
+        AuthorRoleManage
     },
     // 接收父节点的参数
     props: {
@@ -29,24 +27,24 @@ export default {
             active: "roleManage",
             tabFirst: true,
             tabSecond: false
-        };
+        }
     },
     // 方法
     methods: {
         tableClick(tabName) {
-            const active_1 = this.active;
+            const active_1 = this.active
             if (active_1 === "roleManage") {
-                this.tabFirst = true;
-                this.tabSecond = false;
+                this.tabFirst = true
+                this.tabSecond = false
             } else if (active_1 === "sourceManage") {
-                this.tabFirst = false;
-                this.tabSecond = true;
+                this.tabFirst = false
+                this.tabSecond = true
             }
         }
     },
     // 页面创建完成$data可访问 $el不可以访问
     created() {}
-};
+}
 </script>
 
 <style lang="scss" scope>

+ 84 - 86
src/pages/appfun-auth-manage/app-role-manage/index.vue

@@ -1,96 +1,94 @@
-/** * 组件名称;权限配置 * @author:laiyh * @Date:2020-07-27 */
-
 <template>
-  <dg-row>
-    <!-- 搜索项 -->
-    <search-bar ref="searchBar" :conditionForm="conditionForm" @submitSearch="receiveSearch"></search-bar>
-    <!-- 表格 -->
-    <new-table
-      ref="table"
-      :tableUrl="tableUrl"
-      :tableHeader="tableHeader"
-      :condition="condition"
-      :tableOptList="tableOptList"
-      @submitTableOpt="receviceOpt"
-    >
-    </new-table>
-  </dg-row>
+    <dg-row>
+        <!-- 搜索项 -->
+        <search-bar ref="searchBar" :conditionForm="conditionForm" @submitSearch="receiveSearch"></search-bar>
+        <!-- 表格 -->
+        <new-table
+            ref="table"
+            :tableUrl="tableUrl"
+            :tableHeader="tableHeader"
+            :condition="condition"
+            :tableOptList="tableOptList"
+            @submitTableOpt="receviceOpt"
+        >
+        </new-table>
+    </dg-row>
 </template>
 
 <script>
-import newTable from '@/components/new-table';
-import searchBar from '@/components/search-bar';
-import { searchOpt } from '@/mixins/page-opt';
-import Editor from './edit.vue';
-import * as AuthorzationManageApi from '@/api/empower-manage';
-import { appRestApi } from '@/api/application';
-const area = ['1280px', '880px'];
+import newTable from "@/components/new-table"
+import searchBar from "@/components/search-bar"
+import { searchOpt } from "@/mixins/page-opt"
+import Editor from "./edit.vue"
+import * as AuthorzationManageApi from "@/api/empower-manage"
+import { appRestApi } from "@/api/application"
+const area = ["1280px", "880px"]
 export default {
-  name: '',
-  components: {
-    newTable,
-    searchBar
-  },
-  mixins: [searchOpt],
-  // 接收父节点的参数
-  props: {},
-  data() {
-    return {
-      tableUrl: AuthorzationManageApi.authTableUrl,
-      tableHeader: [
-        { label: '应用系统名称', prop: 'name' },
-        { label: '应用系统菜单数', prop: 'menus' },
-        { label: '应用系统角色数', prop: 'roles' }
-      ],
-      conditionForm: [
-        {
-          label: '应用系统名称',
-          name: 'applyName',
-          op: '=',
-          value: '',
-          component: 'SelectApp',
-          apiUrl: appRestApi.table,
-          valueName: 'applyName',
-          labelName: 'applyName'
-        },
-        // {
-        //   label: '单位名称',
-        //   name: 'orgCode',
-        //   op: '=',
-        //   value: '',
-        //   apiName: 'getOrgTree',
-        //   nodeKey: 'code',
-        //   type: 'APP',
-        //   component: 'SelectOrgTree',
-        //   placeholder: '请选择单位名称',
-        //   filterable: true
-        // }
-      ],
-      tableOptList: ['权限配置']
-    };
-  },
-  // 方法
-  methods: {
-    receviceOpt(opt, row) {
-      this.handleEdit(row);
+    name: "",
+    components: {
+        newTable,
+        searchBar
     },
-    // 修改
-    handleEdit(row) {
-      const that = this;
-      const layer = that.$dgLayer({
-        title: '权限配置',
-        area: area,
-        shade: [0.4, '#fff'],
-        props: {
-          sizeForm: row
+    mixins: [searchOpt],
+    // 接收父节点的参数
+    props: {},
+    data() {
+        return {
+            tableUrl: AuthorzationManageApi.authTableUrl,
+            tableHeader: [
+                { label: "应用系统名称", prop: "name" },
+                { label: "应用系统菜单数", prop: "menus" },
+                { label: "应用系统角色数", prop: "roles" }
+            ],
+            conditionForm: [
+                {
+                    label: "应用系统名称",
+                    name: "applyName",
+                    op: "=",
+                    value: "",
+                    component: "SelectApp",
+                    apiUrl: appRestApi.table,
+                    valueName: "applyName",
+                    labelName: "applyName"
+                }
+                // {
+                //   label: '单位名称',
+                //   name: 'orgCode',
+                //   op: '=',
+                //   value: '',
+                //   apiName: 'getOrgTree',
+                //   nodeKey: 'code',
+                //   type: 'APP',
+                //   component: 'SelectOrgTree',
+                //   placeholder: '请选择单位名称',
+                //   filterable: true
+                // }
+            ],
+            tableOptList: ["权限配置"]
+        }
+    },
+    // 方法
+    methods: {
+        receviceOpt(opt, row) {
+            this.handleEdit(row)
         },
-        content: Editor,
-        on: {}
-      });
-    }
-  },
-  created() {}
-};
+        // 修改
+        handleEdit(row) {
+            const that = this
+            const layer = that.$dgLayer({
+                title: "权限配置",
+                area: area,
+                shade: [0.4, "#fff"],
+                props: {
+                    sizeForm: row
+                },
+                content: Editor,
+                on: {}
+            })
+        }
+    },
+    created() {}
+}
 </script>
 
 <style lang="scss" scoped></style>

+ 21 - 9
src/pages/appfun-auth-manage/app-role-manage/role-manage.vue

@@ -1,8 +1,3 @@
-<!--
-    角色管理
-    @Author:laiyh
-    @Date:  2020-09-22
--->
 <template>
     <el-form ref="sizeForm" :model="sizeForm" label-suffix=":" :rules="rules" label-width="120px">
         <el-form-item prop="name" label="角色名称">
@@ -79,7 +74,7 @@
 </template>
 
 <script>
-import * as roleinfoManageApi from "@/api/roleinfo-manage"
+import * as roleinfoManageApi from "@/api/roleinfo-manage.js"
 import * as regular from "@/utils/regular"
 import { getBusinessTagTree } from "@/api/data-auth"
 export default {
@@ -90,6 +85,10 @@ export default {
             type: String,
             default: "create"
         },
+        createType: {
+            type: String,
+            default: "role"
+        },
         formData: {
             type: Object,
             default: () => {}
@@ -145,13 +144,26 @@ export default {
         handlSave() {
             this.sizeForm.name = this.sizeForm.name.trim()
             let sizeForm = { ...this.sizeForm }
-            const api = this.type === "create" ? "addRole" : "editRole"
+            sizeForm.roleBusiness = String(sizeForm.roleBusiness || "") // 业务域格式
+            let api = ""
+            if (this.type === "create") {
+                api = this.createType === "role" ? "addRole" : "roleApply"
+            }
+            if (this.type === "update") {
+                api = this.createType === "role" ? "editRole" : "roleApply"
+            }
+            if (this.createType === "apply") {
+                sizeForm = {
+                    roleSaveVo: sizeForm,
+                    operate: this.formData && this.formData.id ? "20" : "10"
+                }
+            }
+
             this.$refs.sizeForm.validate(valid => {
                 if (!valid) {
                     return
                 }
-                // 业务域格式
-                sizeForm.roleBusiness = String(sizeForm.roleBusiness || "")
+
                 roleinfoManageApi[api](sizeForm)
                     .then(res => {
                         this.$message.success("保存成功")

+ 1 - 1
src/pages/appfun-auth-manage/role-auth-manage/persionView.vue

@@ -33,8 +33,8 @@
                 overflow="tooltip"
                 @selection-change="handleSelectChange"
             >
-                <dg-table-column type="selection" width="50" align="center"></dg-table-column>
                 <dg-table-column prop="appName" label="应用系统名称" min-width="120" align="center"> </dg-table-column>
+                <dg-table-column type="selection" width="50" align="center"></dg-table-column>
                 <dg-table-column prop="name" label="角色名称" width="100" align="center">
                     <template slot-scope="{ row }">
                         <span style="cursor: pointer;color: #1890ff;" @click="viewRoleMenu(row, $event)">

+ 72 - 0
src/pages/auth-subject-manage/task-type-manage/index.vue

@@ -0,0 +1,72 @@
+<template>
+    <div>
+        <!-- 搜索项 -->
+        <search-bar ref="searchbar" :conditionForm="conditionForm" @submitSearch="receiveSearch"></search-bar>
+        <!-- 操作栏 -->
+        <operate-bar :pageOptList="pageOptList" @submitPageOpt="receviceOpt"></operate-bar>
+        <!-- 表格 -->
+        <new-table ref="table" :tableUrl="tableUrl" :tableHeader="tableHeader" :condition="condition"> </new-table>
+    </div>
+</template>
+
+<script>
+import searchBar from "@/components/search-bar"
+import operateBar from "@/components/operate-bar"
+import newTable from "@/components/new-table"
+
+import { searchOpt, importOpt, syncOpt } from "@/mixins/page-opt"
+import { tableUrl, taskTypeSync } from "@/api/task-type-manage.js"
+export default {
+    components: {
+        searchBar,
+        operateBar,
+        newTable
+    },
+    mixins: [searchOpt, importOpt, syncOpt],
+    data() {
+        return {
+            tableUrl,
+            conditionForm: [
+                {
+                    label: "任务类型名称",
+                    name: "taskTypeName",
+                    op: "like",
+                    value: "",
+                    component: "ElInput"
+                }
+            ],
+            pageOptList: ["同步"],
+            tableHeader: [
+                {
+                    label: "任务类型名称",
+                    prop: "taskTypeName"
+                },
+                {
+                    label: "任务类型编号",
+                    prop: "taskTypeCode"
+                },
+                {
+                    label: "创建时间",
+                    prop: "createTime"
+                }
+            ]
+        }
+    },
+    computed: {},
+    methods: {
+        receviceOpt(opt) {
+            if (opt == "导入") {
+                console.log("任务类型导入没做")
+            } else if (opt == "同步") {
+                taskTypeSync().then(res => {
+                    this.$refs.table.handleSearch()
+                })
+            }
+        }
+    },
+    created() {},
+    mounted() {}
+}
+</script>
+
+<style lang="scss"></style>

+ 62 - 0
src/pages/auth-subject-manage/task-type-manage/task-menu.vue

@@ -0,0 +1,62 @@
+<!--
+任务菜单栏
+@Author: linqian
+@date: 2023-03-10 09:12
+-->
+<template>
+  <dg-card class="task-menu-card" header="任务类型">
+    <div style="height: calc(100vh - 15.5rem)">
+      <dg-scrollbar>
+        <ul>
+          <li
+            :style="{ backgroundColor: activeIndex == index ? 'rgba(24, 144, 255, 0.08)' : 'unset' }"
+            class="task-item"
+            v-for="(item, index) in taskList"
+            :key="index"
+            @click="handleSelectTask(item, index)"
+          >
+            {{ item }}
+          </li>
+        </ul>
+      </dg-scrollbar>
+    </div>
+  </dg-card>
+</template>
+
+<script>
+export default {
+  components: {},
+  data() {
+    let list = [];
+    for (let i = 0; i < 20; i++) {
+      list.push("任务类型_" + i);
+    }
+    return {
+      taskList: list,
+      activeIndex: null
+    };
+  },
+  computed: {},
+  methods: {
+    handleSelectTask(item, index) {
+      this.activeIndex = index;
+      this.$emit("getActiveTask", item);
+    }
+  },
+  created() {},
+  mounted() {}
+};
+</script>
+
+<style lang='scss' scoped>
+::v-deep .el-card__body {
+  padding: 1rem 0.5rem !important;
+}
+.task-item {
+  padding: 10px 0 10px 10px;
+  cursor: pointer;
+}
+.task-item:hover {
+  background: rgba(24, 144, 255, 0.08) !important;
+}
+</style>

+ 79 - 55
src/pages/layout/components/navbar.vue

@@ -4,69 +4,93 @@
     @Date: 2019-03-12
 -->
 <template>
-  <div class="l-main-header" style="position: relative">
-    <div class="l-main-header__left">
-      <div class="l-main-header__box">
-        <img style="width: 40px; height: 40px" class="l-main-header__logo" src="@/assets/images/layout/logo.png" />
-      </div>
-      <p class="l-main-header__title">警务云统一授权管理中心</p>
-    </div>
-    <div class="l-main-header__center"></div>
-    <div class="l-main-header__right">
-      <div style="display: inline-block; vertical-align: top">
-        <!-- 用户操作区域 -->
-        <div class="l-avatar-box">
-          <i class="icon icon-user2"></i>
-          <span class="l-avatar-box__user">{{ name }}</span>
-          <i class="icon icon-close" title="退出登录" @click="logout"></i>
+    <div class="l-main-header" style="position: relative">
+        <div class="l-main-header__left">
+            <div class="l-main-header__box">
+                <img
+                    style="width: 40px; height: 40px"
+                    class="l-main-header__logo"
+                    src="@/assets/images/layout/logo.png"
+                />
+            </div>
+            <p class="l-main-header__title">警务云统一授权管理中心</p>
+        </div>
+        <div class="l-main-header__center"></div>
+        <div class="l-main-header__right">
+            <div style="display: inline-block; vertical-align: top;margin-right: 32px">
+                <div style="color: #eef8fe;cursor: pointer;" @click="handleOnline">
+                    在线查询
+                </div>
+            </div>
+            <div style="display: inline-block; vertical-align: top">
+                <!-- 用户操作区域 -->
+                <div class="l-avatar-box">
+                    <i class="icon icon-user2"></i>
+                    <span class="l-avatar-box__user">{{ name }}</span>
+                    <i class="icon icon-close" title="退出登录" @click="logout"></i>
+                </div>
+            </div>
         </div>
-      </div>
     </div>
-  </div>
 </template>
 
-
 <script>
-import { mapGetters } from 'vuex';
+import { mapGetters } from "vuex"
 export default {
-  data() {
-    return {
-      searchValue: '',
-      activeShow: false,
-      activeHide: false
-    };
-  },
-  components: {},
-  computed: {
-    ...mapGetters(['sidebar', 'name', 'avatar', 'device'])
-  },
-  methods: {
-    toggleSideBar() {
-      this.$store.dispatch('toggleSideBar');
+    data() {
+        return {
+            searchValue: "",
+            activeShow: false,
+            activeHide: false
+        }
+    },
+    components: {},
+    computed: {
+        ...mapGetters(["sidebar", "name", "avatar", "device"])
+    },
+    methods: {
+        handleOnline() {
+            var layer = this.$dgLayer({
+                title: "在线查询",
+                noneBtnField: true,
+                content: require("@/pages/layout/components/online.vue"),
+                maxmin: false,
+                props: {},
+                on: {},
+                cancel: function(index) {
+                    // 关闭对应弹窗的ID
+                    layer.close(index)
+                    return false
+                },
+                area: ["680px", "500px"]
+            })
+        },
+        toggleSideBar() {
+            this.$store.dispatch("toggleSideBar")
+        },
+        logout() {
+            this.$confirm("是否确定退出系统").then(() => {
+                if (process.env.NEED_LOGIN == true) {
+                    window.loginUtil.logout(this)
+                } else {
+                    window.location.href = `https://login.iam.com/apphub/logout`
+                }
+            })
+        },
+        handleClickSearch() {
+            this.activeShow = true
+            this.activeHide = false
+        }
     },
-    logout() {
-      this.$confirm('是否确定退出系统').then(() => {
-        if (process.env.NEED_LOGIN == true) {
-          window.loginUtil.logout(this);
-        } else {
-          window.location.href = `https://login.iam.com/apphub/logout`;
+    mounted() {
+        this.bodyListener = () => {
+            this.activeShow = false
+            this.activeHide = true
         }
-      });
+        document.body.addEventListener("click", this.bodyListener, false)
     },
-    handleClickSearch() {
-      this.activeShow = true;
-      this.activeHide = false;
+    beforeDestroy() {
+        document.body.removeEventListener("click", this.bodyListener)
     }
-  },
-  mounted() {
-    this.bodyListener = () => {
-      this.activeShow = false;
-      this.activeHide = true;
-    };
-    document.body.addEventListener('click', this.bodyListener, false);
-  },
-  beforeDestroy() {
-    document.body.removeEventListener('click', this.bodyListener);
-  }
-};
+}
 </script>

+ 70 - 0
src/pages/layout/components/online.vue

@@ -0,0 +1,70 @@
+<!--
+ * @Author: chenhr
+ * @Date: 2023-06-20 16:06:18
+ * @Description: 在线查询功能
+-->
+<template>
+    <div class="online">
+        <el-form v-loading="loading" :model="form" label-suffix=":" label-width="80px">
+            <el-form-item label="用户令牌">
+                <el-input v-model="form.userTokenId" placeholder="请输入用户令牌"></el-input>
+            </el-form-item>
+            <el-form-item label="应用令牌">
+                <el-input v-model="form.appTokenId" placeholder="请输入应用令牌"></el-input>
+            </el-form-item>
+            <div class="button-group">
+                <dg-button type="primary" @click="handleSearch">在线查询</dg-button>
+            </div>
+            <el-form-item label="在线情况" v-if="appTokenOnline || userTokenOnline">
+                <div>
+                    用户令牌是否在线: <span>{{ userTokenOnline }}</span>
+                </div>
+                <div>
+                    应用令牌是否在线: <span>{{ appTokenOnline }}</span>
+                </div>
+            </el-form-item>
+        </el-form>
+    </div>
+</template>
+
+<script>
+import { getOnline } from "@/api/common"
+export default {
+    data() {
+        return {
+            loading: false,
+            form: {
+                userTokenId: "",
+                appTokenId: ""
+            },
+            userTokenOnline: "",
+            appTokenOnline: ""
+        }
+    },
+    methods: {
+        handleSearch() {
+            this.loading = true
+            getOnline(this.form)
+                .then(res => {
+                    const data = res.data.content
+                    this.userTokenOnline = data.userTokenOnline
+                    this.appTokenOnline = data.appTokenOnline
+                })
+                .finally(() => {
+                    this.loading = true
+                })
+        }
+    },
+    created() {}
+}
+</script>
+
+<style scoped lang="scss">
+.online {
+    .button-group {
+        display: flex;
+        justify-content: center;
+        align-items: center;
+    }
+}
+</style>

+ 6 - 0
src/router/modules/auth-subject-manage.js

@@ -35,6 +35,12 @@ const componentsRouter = {
             name: "subject-prop-manage",
             meta: { title: "主体属性管理", noCache: true, permission: ["QXGL_SQGL_ZTGL_ZTSXLGL"], layout: "page" }
         },
+        {
+            path: "task-type-manage",
+            component: () => import("@/pages/auth-subject-manage/task-type-manage"),
+            name: "task-type-manage",
+            meta: { title: "任务类型管理", noCache: true }
+        },
         {
             path: "environment-element",
             component: () => import("@/pages/auth-subject-manage/environment-element"),

+ 15 - 15
src/utils/request.js

@@ -1,20 +1,20 @@
-import { Message } from "element-ui";
+import { Message } from "element-ui"
 
-let request = {};
-request = require("./request-base").default;
+let request = {}
+request = require("./request-base").default
 
 request.interceptors.request.use(
     config => {
-        config.timeout = 10000;
+        config.timeout = 60 * 1000
         // console.log("这里可以写自定义的request拦截器");
-        return config;
+        return config
     },
     error => {
         // Do something with request error
         // console.log(error); // for debug
-        return Promise.reject(error);
+        return Promise.reject(error)
     }
-);
+)
 
 request.interceptors.response.use(
     response => {
@@ -23,22 +23,22 @@ request.interceptors.response.use(
     },
     error => {
         if (error && error.response) {
-            const { response } = error;
-            const { status, data } = response;
+            const { response } = error
+            const { status, data } = response
             if (status === 500) {
                 // 判断是否是国密异常,进行提示
                 if (data && data.statusCode && data.message) {
-                    const { statusCode, message } = data;
+                    const { statusCode, message } = data
 
-                    if (statusCode === '406') {
-                        Message.error(message);
+                    if (statusCode === "406") {
+                        Message.error(message)
                     }
                 }
             }
         }
         // Do something with request error
         // console.log(error); // for debug
-        return Promise.reject(error);
+        return Promise.reject(error)
     }
-);
-export default request;
+)
+export default request