林倩 4 lat temu
rodzic
commit
66bcb12bd6
28 zmienionych plików z 2825 dodań i 5 usunięć
  1. 2 1
      config/dev.env.js
  2. 49 0
      src/api/log-manage.js
  3. 49 0
      src/api/permiss-log-manage.js
  4. 1 1
      src/filters/index.js
  5. 72 0
      src/pages/common/form-detail/index.vue
  6. 138 0
      src/pages/data-auth-module/auth-object-manage/appfun-resource-manage/add-func-form.vue
  7. 173 0
      src/pages/data-auth-module/auth-object-manage/appfun-resource-manage/func-list.vue
  8. 1 3
      src/pages/layout/components/navbar.vue
  9. 131 0
      src/pages/log-manage/DataConfig.js
  10. 87 0
      src/pages/log-manage/auth-behavior-statistic/index.vue
  11. 151 0
      src/pages/log-manage/auth-risk-detection/detail.vue
  12. 215 0
      src/pages/log-manage/auth-risk-detection/edit.vue
  13. 151 0
      src/pages/log-manage/auth-risk-detection/index.vue
  14. 89 0
      src/pages/log-manage/err-auth-earlywarning-manage/auth-earlywarning-info-detail.vue
  15. 131 0
      src/pages/log-manage/err-auth-earlywarning-manage/auth-earlywarning-info.vue
  16. 144 0
      src/pages/log-manage/err-auth-earlywarning-manage/auth-earlywarning-plan.vue
  17. 89 0
      src/pages/log-manage/err-auth-earlywarning-manage/detail.vue
  18. 200 0
      src/pages/log-manage/err-auth-earlywarning-manage/edit.vue
  19. 10 0
      src/pages/log-manage/index.scss
  20. 232 0
      src/pages/log-manage/permiss-log-manage/DataConfig.js
  21. 127 0
      src/pages/log-manage/permiss-log-manage/auth-manage-log.vue
  22. 127 0
      src/pages/log-manage/permiss-log-manage/auth-risk-log.vue
  23. 150 0
      src/pages/log-manage/permiss-log-manage/auth-service-log.vue
  24. 84 0
      src/pages/log-manage/permiss-log-manage/log-detail/auth-manage.vue
  25. 41 0
      src/pages/log-manage/permiss-log-manage/log-detail/auth-risk.vue
  26. 41 0
      src/pages/log-manage/permiss-log-manage/log-detail/auth-service.vue
  27. 20 0
      src/router/index.js
  28. 120 0
      src/router/modules/log-manage.js

+ 2 - 1
config/dev.env.js

@@ -14,7 +14,7 @@ module.exports = merge(prodEnv, {
     QQQ: '"/easy-mock2"',
 
     //是否需要登录验证
-    NEED_LOGIN: "false",
+    NEED_LOGIN: "true",
 
     //需要依赖的系统名称
     // INSTALLED_PROJECT: "'zfba,demo2,cross-env'",
@@ -43,6 +43,7 @@ module.exports = merge(prodEnv, {
             // target: "http://10.11.0.48:8861",// 邱宇
             // target: "http://10.254.11.203:8861"
             target: "http://10.11.1.237:8861"
+            // target: "http://10.254.11.203:8861"
 
         }
     })

+ 49 - 0
src/api/log-manage.js

@@ -0,0 +1,49 @@
+/*
+ * @Author: Liugh
+ * @Date: 2021-05-27 11:28:29
+ * @LastEditTime: 2021-05-28 09:57:24
+ * @LastEditors: Do not edit
+ * @FilePath: \auth-web\src\api\log-manage.js
+ * @Description:日志管理接口
+ */
+import axios from "@/utils/req";
+
+export const base = `/auditsvr/v2`;
+
+// 鉴权预警列表
+export const warningProgrammeTableUrl = `${base}/warningProgramme/_search`;
+
+// 鉴权统计列表
+export const authenticationLogTableUrl = `${base}/authenticationLog/statistics`;
+
+// 鉴权风险检测
+export const authRiskDetectionUrl = `${base}/riskProgramme/_search`;
+
+// 鉴权预警日志
+export const authEarlyWarningInfo = `${base}/warningLog/_search`;
+
+// 鉴权预警详情
+export function warningProgrammeInfo(id) {
+  return axios.get(`${base}/warningProgramme/${id}`);
+}
+
+// 鉴权预警编辑
+export function riskProgramme(data) {
+  return axios.put(`${base}/warningProgramme/${data.id}`, data);
+}
+
+
+// 鉴权风险方案详情
+export function getAuthRiskDetail(id) {
+  return axios.get(`/auditsvr/v2/riskProgramme/${id}`);
+}
+
+// 保存鉴权风险方案
+export function saveAuthRisk(id, data) {
+  return axios.put(`/auditsvr/v2/riskProgramme/${id}`, data);
+}
+
+// 鉴权预警日志详情
+export function getAuthEarlyWarningDetail(id) {
+  return axios.get(`/auditsvr/v2/warningLog/${id}`);
+}

+ 49 - 0
src/api/permiss-log-manage.js

@@ -0,0 +1,49 @@
+/**
+ 授权日志管理接口
+ @author linqian
+ @Date:2021-05-27
+ */
+import request from "@/utils/request";
+const baseUrl = "/auditsvr/v2";
+
+/********************************************** 授权管理日志 *********************************************/
+
+// tableUrl
+export const authManageLogTableUrl = `${baseUrl}/authorizeLog/_search`;
+
+// 日志详情
+export function getAuthManageLogDetail(id) {
+    return request({
+        url: `${baseUrl}/authorizeLog/${id}`,
+        method: "GET"
+    });
+}
+
+/********************************************** 鉴权服务日志 *********************************************/
+
+// tableUrl
+export const authServiceLogTableUrl = `${baseUrl}/authenticationLog/_search`;
+
+// 日志详情
+export function getAuthServiceLogDetail(id) {
+    return request({
+        url: `${baseUrl}/authenticationLog/${id}`,
+        method: "GET"
+    });
+}
+
+// 统计信息tableUrl
+export const authServiceLogStatisticsTableUrl = `${baseUrl}/authenticationLog/statistics`;
+
+
+/********************************************** 鉴权风险日志 *********************************************/
+// tableUrl
+export const authRiskLogTableUrl = `${baseUrl}/riskLog/_search`;
+
+// 日志详情
+export function getAuthRiskLogDetail(id) {
+    return request({
+        url: `${baseUrl}/riskLog/${id}`,
+        method: "GET"
+    });
+}

+ 1 - 1
src/filters/index.js

@@ -46,7 +46,7 @@ export function dateFormatter(value, fmt) {
 }
 
 const install = function(Vue) {
-    let filters = [pluralize,timeAgo,numberFormatter,toThousandFilter,dateFormatter]
+    let filters = { pluralize, timeAgo, numberFormatter, toThousandFilter, dateFormatter };
     Object.keys(filters).forEach(key => {
         Vue.filter(key, filters[key]);
     });

+ 72 - 0
src/pages/common/form-detail/index.vue

@@ -0,0 +1,72 @@
+<!--
+表单详情组件
+@Author: linqian
+@Date: 2021-05-28 09:51
+-->
+<template>
+    <div>
+        <el-form v-if="detailInfo.id" :model="detailInfo" :label-width="labelWidth" label-suffix=":">
+            <el-row>
+                <el-col :span="item.span || 12" v-for="(item, index) in config" :key="index">
+                    <el-form-item :label="item.label">
+                        <template v-if="item.code">
+                            <div class="u-detail__text" v-translate="{ code: item.code }">
+                                {{ detailInfo[item.value] }}
+                            </div>
+                        </template>
+                        <template v-else-if="item.enum">
+                            <div class="u-detail__text" v-translate="{ enum: item.enum }">
+                                {{ detailInfo[item.value] }}
+                            </div>
+                        </template>
+                        <template v-else-if="item.isTime">
+                            <div class="u-detail__text">
+                                {{ detailInfo[item.value] | dateFormatter(item.format) }}
+                            </div>
+                        </template>
+                        <template v-else-if="item.custom">
+                            <div class="u-detail__text">
+                                <slot :name="item.value" :value="detailInfo[item.value]"></slot>
+                            </div>
+                        </template>
+                        <template v-else>
+                            <div class="u-detail__text">
+                                {{ detailInfo[item.value] }}
+                            </div>
+                        </template>
+                    </el-form-item>
+                </el-col>
+            </el-row>
+        </el-form>
+    </div>
+</template>
+
+<script>
+export default {
+    props: {
+        detailInfo: {
+            type: Object,
+            default: () => {}
+        },
+        config: {
+            type: Array,
+            default: () => []
+        },
+        labelWidth: {
+            type: String,
+            default: "100px"
+        }
+    },
+    components: {},
+    data() {
+        return {};
+    },
+    computed: {},
+    methods: {},
+    created() {},
+    mounted() {}
+};
+</script>
+
+<style lang='scss'>
+</style>

+ 138 - 0
src/pages/data-auth-module/auth-object-manage/appfun-resource-manage/add-func-form.vue

@@ -0,0 +1,138 @@
+<!--
+新增功能
+@Author: linqian
+@Date: 2021-05-17 16:47
+-->
+<template>
+    <dg-row>
+        <el-form ref="form" :model="form" :rules="rules" label-width="150px">
+            <dg-col :span="12">
+                <el-form-item label="功能编号:" prop="code">
+                    <el-input v-model="form.code" placeholder="" v-if="!isDetail"></el-input>
+                    <span v-else>{{ form.code }}</span>
+                </el-form-item>
+                <el-form-item label="上级功能编号:" prop="parentId">
+                    <el-input v-model="form.parentId" placeholder="" v-if="!isDetail"></el-input>
+                    <span v-else>{{ form.parentId }}</span>
+                </el-form-item>
+                <el-form-item label="所属应用:" prop="appName">
+                    <el-input v-model="form.appName" placeholder="" v-if="!isDetail" disabled></el-input>
+                    <span v-else>{{ form.appName }}</span>
+                </el-form-item>
+                <el-form-item label="设计安全隐私类别:" prop="designSecureType">
+                    <dg-select v-model="form.designSecureType" placeholder="" enum="SecurityPrivacyEnum" v-if="!isDetail"></dg-select>
+                    <span v-else>{{ form.designSecureType }}</span>
+                </el-form-item>
+            </dg-col>
+            <dg-col :span="12">
+                <el-form-item label="功能名称:" prop="name">
+                    <el-input v-model="form.name" placeholder="" v-if="!isDetail"></el-input>
+                    <span v-else>{{ form.name }}</span>
+                </el-form-item>
+                <el-form-item label="在用状态:" prop="isActive">
+                    <dg-select code="DM_APPLY_STATUS" v-model="form.isActive" v-if="!isDetail"></dg-select>
+                    <span v-else>{{ form.isActive == "0" ? "禁用" : "启用" }}</span>
+                </el-form-item>
+                <el-form-item label="功能使用场景代码:" prop="functionUsageScenarios">
+                    <el-input v-model="form.functionUsageScenarios" placeholder="" v-if="!isDetail"></el-input>
+                    <span v-else>{{ form.functionUsageScenarios }}</span>
+                </el-form-item>
+            </dg-col>
+            <dg-col :span="24">
+                <el-form-item label="功能说明:" prop="remark">
+                    <el-input
+                        v-model="form.remark"
+                        placeholder=""
+                        type="textarea"
+                        :rows="3"
+                        v-if="!isDetail"
+                    ></el-input>
+                    <span v-else>{{ form.remark }}</span>
+                </el-form-item>
+            </dg-col>
+        </el-form>
+    </dg-row>
+</template>
+S
+<script>
+// import { funcRestApi } from "@/api/application";
+export default {
+    props: {
+        id: String,
+        isDetail: {
+            type: Boolean,
+            default: false
+        },
+        app: Object
+    },
+    components: {},
+    data() {
+        return {
+            form: {
+                appId: "",
+                appName: "",
+                code: "",
+                designSecureType: "",
+                functionUsageScenarios: "",
+                isActive: "",
+                name: "",
+                parentId: "",
+                remark: ""
+            },
+            rules: {
+                code: [{ required: true, message: "请输入功能编号", trigger: "change" }],
+                name: [{ required: true, message: "请输入功能名称", trigger: "change" }],
+                parentId: [{ required: true, message: "请输入上级功能编号", trigger: "change" }],
+                isActive: [{ required: true, message: "请选择在用状态", trigger: "change" }],
+                appName: [{ required: true, message: "请选择应用", trigger: "change" }]
+            }
+        };
+    },
+    computed: {},
+    methods: {
+        /**
+         * 保存
+         */
+        saveForm() {
+            return new Promise((resolve) => {
+                this.$refs.form.validate((valid) => {
+                    if (valid) {
+                        const api = this.id ? "update" : "save";
+                        // funcRestApi[api](this.form)
+                        //     .then((res) => {
+                        //         this.$message.success("保存成功!");
+                        //         resolve("成功");
+                        //     })
+                        //     .catch((error) => {
+                        //         this.$message.error(error);
+                        //     });
+                    }
+                });
+            });
+        },
+        /**
+         * 获取详情
+         */
+        getDetail() {
+            // funcRestApi.detail(this.id).then((res) => {
+            //     this.form = res;
+            // });
+        }
+    },
+    created() {
+        if (this.id) {
+            if (this.isDetail) {
+                this.rules = {};
+            }
+            this.getDetail();
+        } else {
+            this.form.appName = this.app.applyName;
+            this.form.appId = this.app.id;
+        }
+    },
+    mounted() {}
+};
+</script>
+
+<style lang='scss'>
+</style>

+ 173 - 0
src/pages/data-auth-module/auth-object-manage/appfun-resource-manage/func-list.vue

@@ -0,0 +1,173 @@
+<!--
+功能列表
+@Author: linqian
+@Date: 2021-05-17 16:10
+-->
+<template>
+    <dg-card header="功能列表">
+        <!-- 搜索项 -->
+        <el-form :inline="true" class="search-form">
+            <el-form-item label="功能名称">
+                <el-input v-model="form.name.value" clearable></el-input>
+            </el-form-item>
+            <el-form-item label="在用状态">
+                <dg-select v-model="form.isActive.value" clearable code="DM_APPLY_STATUS"></dg-select>
+            </el-form-item>
+            <el-form-item>
+                <dg-button type="primary" @click="handleSearch" icon="el-icon-search">查询</dg-button>
+                <!-- <dg-button type="primary" @click="handleReset" icon="el-icon-refresh-right">重置</dg-button> -->
+            </el-form-item>
+        </el-form>
+
+        <!-- 操作 -->
+        <dg-row zebra="10px">
+            <dg-button type="primary" icon="el-icon-circle-plus-outline" @click="handleAdd" v-if="appRow.id"
+                >新增</dg-button
+            >
+        </dg-row>
+        <!-- 表格 -->
+        <dg-table ref="table" :url="tableUrl" :condition="form" border row-key="id" :before-quest="beforeQuest">
+            <dg-table-column type="index" width="75" label="序号" align="center"></dg-table-column>
+            <dg-table-column prop="code" label="功能编号" align="center"></dg-table-column>
+            <dg-table-column prop="name" label="功能名称" align="center"></dg-table-column>
+            <dg-table-column prop="parentId" label="上级功能编号" align="center"></dg-table-column>
+            <dg-table-column prop="isActive" label="在用状态" align="center" code="DM_APPLY_STATUS"></dg-table-column>
+            <dg-table-column label="操作" align="center">
+                <template slot-scope="scope">
+                    <div class="u-table__operation">
+                        <el-tooltip
+                            v-for="(item, index) in optList"
+                            :key="index"
+                            :content="item.tooltip"
+                            effect="dark"
+                            placement="top-end"
+                        >
+                            <i :class="item.icon" @click="item.on(scope.row)"></i>
+                        </el-tooltip>
+                    </div>
+                </template>
+            </dg-table-column>
+        </dg-table>
+    </dg-card>
+</template>
+
+<script>
+import addFuncForm from "./add-func-form";
+// import { funcRestApi } from "@/api/application";
+export default {
+    components: {},
+    props: {
+        appRow: Object
+    },
+    data() {
+        return {
+            form: {
+                name: {
+                    value: "",
+                    op: "like"
+                },
+                appId: {
+                    value: "",
+                    op: "="
+                },
+                isActive: {
+                    value: "",
+                    op: "="
+                }
+            },
+            optList: [
+                { icon: "el-icon-edit", tooltip: "修改", on: this.handleEdit },
+                { icon: "el-icon-document", tooltip: "详情", on: this.handleViewDetail },
+                { icon: "el-icon-delete", tooltip: "删除", on: this.handleDelete }
+            ],
+            // tableUrl: funcRestApi.base + "/search"
+        };
+    },
+    computed: {},
+    methods: {
+        /**
+         * 编辑
+         */
+        handleEdit(row) {
+            this.handleOpenForm(row.id, "编辑");
+        },
+        /**
+         * 查看详情
+         */
+        handleViewDetail(row) {
+            this.handleOpenForm(row.id, "详情", true);
+        },
+        /**
+         * 删除
+         */
+        handleDelete(row) {
+            this.$dgConfirm(`是否确认删除该条功能!`, "提示", {}).then(() => {
+                 funcRestApi.del(row.id).then((res) => {
+                    this.$message.success(res);
+                    this.handleSearch();
+                });
+            });
+        },
+        /**
+         * 查询
+         */
+        handleSearch() {
+            this.$refs.table.searchForm();
+        },
+        /**
+         * 重置
+         */
+        handleReset() {
+            for (const key in this.form) {
+                this.form[key].value = "";
+            }
+        },
+        /**
+         * 新增
+         */
+        handleAdd() {
+            this.handleOpenForm(void 0, "新增");
+        },
+        handleOpenForm(id, title, isDetail = false) {
+            const vm = this;
+            const layer = this.$dgLayer({
+                title,
+                content: addFuncForm,
+                props: {
+                    id,
+                    isDetail,
+                    app: vm.appRow
+                },
+                btn: ["确定", "取消"],
+                btnAlign: "r",
+                yes: (index) => {
+                    let _layer = layer.$children[0];
+                     _layer.saveForm().then((res) => {
+                        layer.close(index);
+                        vm.handleSearch();
+                    });
+                },
+
+                area: ["750px", "500px"]
+            });
+        },
+        beforeQuest(res) {
+            const { content, totalElements } = res.data;
+            const result = {
+                data: {
+                    content: this.appRow.id ? content : [],
+                    totalElements
+                }
+            };
+            return result;
+        }
+    },
+    created() {
+        this.form.appId.value = this.appRow.id;
+    },
+    mounted() {}
+};
+</script>
+
+<style lang='scss'>
+</style>

+ 1 - 3
src/pages/layout/components/navbar.vue

@@ -85,9 +85,7 @@ export default {
         logout() {
             this.$confirm("是否确定退出系统").then(() => {
                 if (process.env.NEED_LOGIN) {
-                    this.$confirm("是否确定退出系统").then(() => {
-                        window.loginUtil.logout(this);
-                    });
+                    window.loginUtil.logout(this);
                 } else {
                     window.location.href = `https://login.iam.com/apphub/logout`;
                 }

+ 131 - 0
src/pages/log-manage/DataConfig.js

@@ -0,0 +1,131 @@
+/*
+ * @Author: Liugh
+ * @Date: 2021-05-25 14:09:24
+ * @LastEditTime: 2021-05-28 16:37:12
+ * @LastEditors: Do not edit
+ * @FilePath: \auth-web\src\pages\log-manage\DataConfig.js
+ * @Description:
+ */
+const earlyWarningPlanTable = [{
+    label: "鉴权预警方案名称",
+    prop: "name"
+  },
+  {
+    label: "创建时间",
+    prop: "createTime",
+    timestamp: "YYYY-MM-DD"
+  },
+  {
+    label: "修改时间",
+    prop: "updateTime",
+    timestamp: "YYYY-MM-DD"
+  },
+  {
+    label: "预警数量",
+    prop: "number"
+  },
+  {
+    label: "方案状态",
+    // custom: true, // 如果需要自定义请加上这个属性,插槽名称为prop
+    prop: "state",
+    enum: "ProgrammeStateEnum"
+  }
+];
+const earlyWarningPlanTableInfo = [{
+    label: "方案名称",
+    value: "name",
+    span: 24
+  },
+  {
+    label: "方案状态",
+    value: "state",
+    span: 24,
+    enum: "ProgrammeStateEnum"
+  },
+  {
+    label: "创建时间",
+    value: "createTime",
+    span: 12,
+    isTime: true
+  },
+  {
+    label: "修改时间",
+    value: "updateTime",
+    span: 12,
+    isTime: true
+  },
+  {
+    label: "预警规则",
+    value: "ruleContent",
+    span: 24
+  },
+  {
+    label: "规则说明",
+    value: "ruleExplain",
+    span: 24
+  },
+  {
+    label: "预警信息",
+    value: "warningMsg",
+    span: 24
+  }
+];
+// 风险检测方案
+const RiskDetectionPlan = [{
+    label: "风险检测方案名称",
+    prop: "name"
+  },
+  {
+    label: "创建时间",
+    prop: "createTime",
+    timestamp: true,
+    format: "YYYY-MM-DD HH:mm:ss"
+  },
+  {
+    label: "修改时间",
+    prop: "updateTime",
+    timestamp: true,
+    format: "YYYY-MM-DD HH:mm:ss"
+  },
+  {
+    label: "风险数量",
+    prop: "number"
+  },
+  {
+    label: "方案状态",
+    // custom: true, // 如果需要自定义请加上这个属性,插槽名称为prop
+    prop: "state",
+    code: "DM_APPLY_STATUS"
+  }
+];
+// 鉴权预警信息
+const EarlyWarningInfo = [{
+    label: "预警对象",
+    prop: "creater"
+  },
+  {
+    label: "预警对象唯一标识",
+    prop: "createrId"
+  },
+  {
+    label: "预警类型",
+    prop: "programmeType",
+    enum: "WarningProgrammeTypeEnum"
+  },
+  {
+    label: "预警时间",
+    prop: "createTime",
+    timestamp: true,
+    format: "YYYY-MM-DD HH:mm:ss"
+  },
+  {
+    label: "预警信息",
+    prop: "warningMsg"
+  }
+];
+export {
+  earlyWarningPlanTable,
+  earlyWarningPlanTableInfo,
+  RiskDetectionPlan,
+  EarlyWarningInfo
+};

+ 87 - 0
src/pages/log-manage/auth-behavior-statistic/index.vue

@@ -0,0 +1,87 @@
+<!--
+鉴权行为统计
+@Author: linqian
+@Date: 2021-05-28 08:51
+-->
+<template>
+    <div>
+        <!-- 搜索项 -->
+        <el-form ref="ruleForm" inline :model="form">
+            <el-form-item label="鉴权时间">
+                <dg-date-picker
+                    v-model="form.createTime.value"
+                    type="daterange"
+                    range-separator="至"
+                    start-placeholder="开始日期"
+                    end-placeholder="结束日期"
+                    clearable
+                    value-format="yyyyMMddHHmmss"
+                    :unlink-panels="true"
+                >
+                </dg-date-picker>
+            </el-form-item>
+            <el-form-item>
+                <dg-button type="primary" @click="handleSearch" icon="el-icon-search">查询</dg-button>
+                <!-- <dg-button type="primary" @click="handleReset" icon="el-icon-refresh-right">重置</dg-button> -->
+            </el-form-item>
+        </el-form>
+        <!-- 表格 -->
+        <Table ref="myTable" :url="authServiceLogStatisticsTableUrl" :headerData="authBehaviorStatisticTableHeader" :condition="form">
+        </Table>
+    </div>
+</template>
+
+<script>
+import Table from "@/pages/common/table";
+import { authBehaviorStatisticTableHeader } from "../permiss-log-manage/DataConfig";
+import { authServiceLogStatisticsTableUrl } from "@/api/permiss-log-manage";
+export default {
+    components: {
+        Table
+    },
+    data() {
+        return {
+            authServiceLogStatisticsTableUrl,
+            authBehaviorStatisticTableHeader,
+            form: {
+                createTime: {
+                    value: "",
+                    op: "between",
+                    type: "DATE",
+                    format: "yyyyMMddHHmmss"
+                }
+            }
+        };
+    },
+    computed: {},
+    methods: {
+        /**
+         * 查询
+         */
+        handleSearch() {
+            if(!this.form.createTime.value) {
+               this.$message.warning("鉴权时间不能为空");
+               return;
+            }
+            this.$refs.myTable.handleSearchClick();
+        },
+        /**
+         * 重置
+         */
+        handleReset() {
+            for (const key in this.form) {
+                this.form[key].value = "";
+            }
+        }
+    },
+    created() {
+         const startTime = this.$moment().subtract("1", "year").format("YYYYMMDDHHmmss");
+        const endTime = this.$moment().format("YYYYMMDDHHmmss");
+        this.form.createTime.value = [startTime, endTime];
+    },
+    mounted() {}
+};
+</script>
+
+<style lang='scss'>
+</style>

+ 151 - 0
src/pages/log-manage/auth-risk-detection/detail.vue

@@ -0,0 +1,151 @@
+<template>
+    <div class="u-detail">
+        <el-form ref="ruleForm" label-width="90px" label-suffix=":">
+            <dg-row :gutter="20">
+                <dg-col :span="12">
+                    <el-form-item label="方案名称">
+                        <div class="u-detail__text">{{ sizeForm.name }}</div>
+                    </el-form-item>
+                </dg-col>
+            </dg-row>
+            <dg-row :gutter="20">
+                <dg-col :span="12">
+                    <el-form-item label="方案状态">
+                        <div class="u-detail__text" v-translate="{ code: 'DM_APPLY_STATUS' }">{{ sizeForm.state }}</div>
+                    </el-form-item>
+                </dg-col>
+            </dg-row>
+            <dg-row :gutter="20">
+                <dg-col :span="12">
+                    <el-form-item label="创建时间">
+                        <div class="u-detail__text">
+                            {{ sizeForm.createTime | dateFormatter("YYYY-MM-DD HH:mm:ss") }}
+                        </div>
+                    </el-form-item>
+                </dg-col>
+            </dg-row>
+            <dg-row :gutter="20">
+                <dg-col :span="24">
+                    <el-form-item label="检测规则">
+                        <div v-if="sizeForm.type === 'JQBYTJBWZFX'">
+                            <p>
+                                鉴权时,必要条件不完整。
+                            </p>
+                            <div>
+                                鉴权类型:
+                                <dg-radio-group
+                                    v-model="form.authType"
+                                    enum="AuthenticationNecessaryParamEnum"
+                                    @change="setNecessaryParams"
+                                    call-off
+                                ></dg-radio-group>
+                            </div>
+                            <div class="form-inline">
+                                <label>必要参数:</label>
+                                <dg-checkbox-group
+                                    v-model="form.necessaryParams"
+                                    enum="AuthenticationTypeEnum"
+                                    disabled
+                                ></dg-checkbox-group>
+                            </div>
+                        </div>
+                        <div v-else>
+                            {{ ruleContent }}
+                        </div>
+                    </el-form-item>
+                </dg-col>
+            </dg-row>
+            <dg-row :gutter="20">
+                <dg-col :span="24">
+                    <el-form-item label="规则说明">
+                        <div class="u-detail__text">{{ sizeForm.ruleExplain }}</div>
+                    </el-form-item>
+                </dg-col>
+            </dg-row>
+            <dg-row :gutter="20">
+                <dg-col :span="24">
+                    <el-form-item label="风险内容">
+                        <div class="u-detail__text">{{ sizeForm.contentFormat }}</div>
+                    </el-form-item>
+                </dg-col>
+            </dg-row>
+            <dg-row :gutter="20">
+                <dg-col :span="24">
+                    <el-form-item label="处理意见">
+                        <div class="u-detail__text">{{ sizeForm.handleOpinion }}</div>
+                    </el-form-item>
+                </dg-col>
+            </dg-row>
+            <div class="dg-layer-demo" v-footer>
+                <dg-button @click="handleClose">取消</dg-button>
+            </div>
+        </el-form>
+    </div>
+</template>
+
+<script>
+export default {
+    name: "auth-risk-detail",
+    props: {
+        sizeForm: {
+            type: Object,
+            required: true
+        }
+    },
+    data() {
+        return {
+            form: {
+                necessaryParams: "",
+                authType: ""
+            },
+            ruleContent: "",
+            necessaryParams: []
+        };
+    },
+    methods: {
+        init() {
+            if (this.sizeForm.type === "JQBYTJBWZFX") {
+                this.necessaryParams = JSON.parse(this.sizeForm.ruleContent);
+                if (Array.isArray(this.necessaryParams) && this.necessaryParams.length) {
+                    this.form.authType = this.necessaryParams[0].type;
+                    this.setNecessaryParams(this.form.authType);
+                }
+                return;
+            }
+            const { interval, frequency } = JSON.parse(this.sizeForm.ruleContent);
+            const text = this.sizeForm.type === "DSJPFJQFX" ? "分钟内,鉴权次数超过" : "分钟内,命中红/白名单超过";
+            this.ruleContent = interval + text + frequency + "次";
+        },
+        handleClose() {
+            this.$emit("close");
+        },
+        setNecessaryParams(key) {
+            const seleted = this.necessaryParams.find(item => item.type === key);
+            if (seleted) {
+                this.form.necessaryParams = seleted.params
+                    .map(item => {
+                        return item.name;
+                    })
+                    .join(",");
+            }
+        }
+    },
+    created() {
+        this.init();
+    }
+};
+</script>
+
+<style lang="scss">
+.u-detail {
+    .el-form-item {
+        margin-bottom: 10px;
+    }
+}
+.form-inline {
+    display: flex;
+    label {
+        min-width: 5.4em;
+    }
+}
+</style>

+ 215 - 0
src/pages/log-manage/auth-risk-detection/edit.vue

@@ -0,0 +1,215 @@
+<template>
+    <div>
+        <el-form
+            ref="ruleForm"
+            :rules="rules"
+            :model="sizeForm"
+            label-suffix=":"
+            label-position="right"
+            label-width="90px"
+        >
+            <dg-row>
+                <dg-col :span="12">
+                    <el-form-item label="方案名称" prop="name">
+                        {{ sizeForm.name }}
+                        <!-- <el-input
+                            v-model.trim="sizeForm.name"
+                            show-word-limit
+                            placeholder="请输入方案名称"
+                            clearable
+                            disabled
+                        /> -->
+                    </el-form-item>
+                </dg-col>
+            </dg-row>
+            <dg-row>
+                <dg-col :span="12">
+                    <el-form-item label="方案状态" prop="state">
+                        <dg-select
+                            style="width: 100%;"
+                            v-model="sizeForm.state"
+                            placeholder="请选择方案状态"
+                            code="DM_APPLY_STATUS"
+                        >
+                        </dg-select>
+                    </el-form-item>
+                </dg-col>
+            </dg-row>
+            <dg-row>
+                <dg-col :span="24">
+                    <el-form-item label="检测规则" prop="ruleContent">
+                        <!-- DSJPFJQFX    DSJPFHBMDMZFX JQBYTJBWZFX -->
+                        <div v-if="sizeForm.type === 'JQBYTJBWZFX'">
+                            <p>
+                                鉴权时,必要条件不完整。
+                            </p>
+                            <div>
+                                鉴权类型:
+                                <dg-radio-group
+                                    v-model="sizeForm.authType"
+                                    enum="AuthenticationNecessaryParamEnum"
+                                    @change="setNecessaryParams"
+                                    call-off
+                                ></dg-radio-group>
+                            </div>
+                            <div class="form-inline">
+                                <label>必要参数:</label>
+                                <dg-checkbox-group
+                                    v-model="sizeForm.necessaryParams"
+                                    enum="AuthenticationTypeEnum"
+                                    disabled
+                                ></dg-checkbox-group>
+                            </div>
+                        </div>
+                        <div v-else class="form-inline">
+                            <el-form-item label="" prop="interval">
+                                <el-input style="width: 80px;" v-model.trim="sizeForm.interval"></el-input>
+                            </el-form-item>
+                            &nbsp;{{ ruleText }}&nbsp;
+                            <el-form-item label="" prop="frequency"
+                                ><el-input style="width: 80px;" v-model.trim="sizeForm.frequency"></el-input>
+                            </el-form-item>
+                            &nbsp;次
+                        </div>
+                    </el-form-item>
+                </dg-col>
+            </dg-row>
+            <dg-row>
+                <dg-col :span="24">
+                    <el-form-item label="规则说明" prop="ruleExplain">
+                        {{ sizeForm.ruleExplain }}
+                        <!-- <el-input
+                            type="textarea"
+                            rows="4"
+                            v-model.trim="sizeForm.ruleExplain"
+                            placeholder="请输入规则说明"
+                            clearable
+                            show-word-limit
+                            disabled
+                            maxlength="500"
+                        /> -->
+                    </el-form-item>
+                </dg-col>
+            </dg-row>
+            <dg-row>
+                <dg-col :span="24">
+                    <el-form-item label="风险内容" prop="contentFormat">
+                        {{ sizeForm.contentFormat }}
+                    </el-form-item>
+                </dg-col>
+            </dg-row>
+            <dg-row>
+                <dg-col :span="24">
+                    <el-form-item label="处理意见" prop="handleOpinion">
+                        <el-input
+                            type="textarea"
+                            rows="4"
+                            v-model.trim="sizeForm.handleOpinion"
+                            placeholder="请输入处理意见"
+                            clearable
+                            show-word-limit
+                            maxlength="500"
+                        />
+                    </el-form-item>
+                </dg-col>
+            </dg-row>
+        </el-form>
+        <div class="dg-layer-demo" v-footer>
+            <dg-button @click="handleClose">取消</dg-button>
+            <dg-button type="primary" @click="handlSave">确定</dg-button>
+        </div>
+    </div>
+</template>
+
+<script>
+import { saveAuthRisk } from "@/api/log-manage";
+
+export default {
+    name: "auth-risk-edit",
+    props: {
+        formData: Object
+    },
+    computed: {
+        ruleText() {
+            if (this.sizeForm.type === "DSJPFJQFX") return "分钟内,鉴权次数超过";
+            return "分钟内,命中红/白名单超过";
+        }
+    },
+    data() {
+        return {
+            necessaryParams: [],
+            sizeForm: {
+                interval: "",
+                frequency: "",
+                authType: "",
+                necessaryParams: ""
+            },
+            rules: {
+                handleOpinion: [{ required: true, message: "请输入处理意见", trigger: "blur" }],
+                name: [{ required: true, message: "请输入方案名称", trigger: "blur" }],
+                interval: [{ required: true, message: "请输入分钟数", trigger: "blur" }],
+                frequency: [{ required: true, message: "请输入次数", trigger: "blur" }],
+                state: [{ required: true, message: "请选择方案状态", trigger: "blur" }],
+                ruleContent: [{ required: true }]
+            }
+        };
+    },
+    methods: {
+        init() {
+            this.sizeForm = Object.assign({}, this.formData, this.sizeForm);
+            if (this.sizeForm.type === "JQBYTJBWZFX") {
+                this.necessaryParams = JSON.parse(this.sizeForm.ruleContent);
+                if (Array.isArray(this.necessaryParams) && this.necessaryParams.length) {
+                    this.sizeForm.authType = this.necessaryParams[0].type;
+                    this.setNecessaryParams(this.sizeForm.authType);
+                }
+                return;
+            }
+            const { interval, frequency } = JSON.parse(this.sizeForm.ruleContent);
+            this.sizeForm.interval = interval;
+            this.sizeForm.frequency = frequency;
+        },
+        setNecessaryParams(key) {
+            const seleted = this.necessaryParams.find(item => item.type === key);
+            if (seleted) {
+                this.sizeForm.necessaryParams = seleted.params
+                    .map(item => {
+                        return item.name;
+                    })
+                    .join(",");
+            }
+        },
+        handleClose() {
+            this.$emit("success", true);
+        },
+        async handlSave() {
+            const that = this;
+            const valid = await new Promise(resolve => this.$refs.ruleForm.validate(resolve));
+            if (!valid) return;
+
+            const sizeForm = { ...this.sizeForm };
+            if (["DSJPFHBMDMZFX", "DSJPFJQFX"].includes(this.sizeForm.type)) {
+                sizeForm.ruleContent = JSON.stringify({ frequency: sizeForm.frequency, interval: sizeForm.interval });
+            }
+            saveAuthRisk(sizeForm.id, sizeForm)
+                .then(() => {
+                    that.handleClose(true);
+                    that.$message.success("保存成功");
+                })
+                .catch(error => that.$message.error(error))
+        }
+    },
+    created() {
+        this.init();
+    }
+};
+</script>
+
+<style lang="scss" scoped>
+.form-inline {
+    display: flex;
+    label {
+        min-width: 5.4em;
+    }
+}
+</style>

+ 151 - 0
src/pages/log-manage/auth-risk-detection/index.vue

@@ -0,0 +1,151 @@
+<!--
+ * @Author: Liugh
+ * @Date: 2021-05-25 13:49:40
+ * @LastEditTime: 2021-05-25 14:36:52
+ * @LastEditors: Do not edit
+ * @FilePath: \auth-web\src\pages\log-manage\err-auth-earlywarning-manage\auth-earlywarning-plan.vue
+ * @Description: 鉴权风险检测
+-->
+<template>
+    <main>
+        <el-form ref="ruleForm" inline :rules="rules" :model="form">
+            <!-- <el-form-item label="鉴权风险检测名称">
+                <el-input v-model="form.name.value" placeholder="请输入鉴权风险检测名称" clearable></el-input>
+            </el-form-item> -->
+            <el-form-item label="方案状态" prop="state.value">
+                <dg-select
+                    v-model="form.state.value"
+                    placeholder="请选择方案状态"
+                    code="DM_APPLY_STATUS"
+                    style="width: 13rem"
+                    clearable
+                >
+                </dg-select>
+            </el-form-item>
+            <el-form-item>
+                <dg-button type="primary" @click="handleSearch" icon="el-icon-search">查询</dg-button>
+                <dg-button type="primary" @click="handleReset" icon="el-icon-refresh-right">重置</dg-button>
+            </el-form-item>
+        </el-form>
+        <Table ref="myTable" :url="tableUrl" :headerData="RiskDetectionPlan" :condition="form">
+            <dg-table-column fixed="right" label="操作" width="120" align="center">
+                <template slot-scope="scope">
+                    <div class="u-table__operation">
+                        <el-tooltip
+                            v-for="(item, i) in optList"
+                            :key="i"
+                            :content="item.tooltip"
+                            effect="dark"
+                            placement="top-end"
+                        >
+                            <i :class="item.icon" @click="item.on(scope.row)" />
+                        </el-tooltip>
+                    </div>
+                </template>
+            </dg-table-column>
+        </Table>
+    </main>
+</template>
+
+<script>
+import Table from "@/pages/common/table";
+import { RiskDetectionPlan } from "../DataConfig";
+import { authRiskDetectionUrl, getAuthRiskDetail } from "@/api/log-manage";
+import Detail from "@/pages/log-manage/auth-risk-detection/detail";
+import Editor from "@/pages/log-manage/auth-risk-detection/edit";
+
+export default {
+    name: "auth-risk-detection",
+    props: {},
+    data() {
+        const that = this;
+        return {
+            RiskDetectionPlan,
+            form: {
+                // name: {
+                //     value: "",
+                //     op: "like"
+                // },
+                state: {
+                    value: "",
+                    op: "="
+                }
+            },
+            rules: {},
+            tableUrl: authRiskDetectionUrl,
+            optList: [
+                { icon: "el-icon-edit", tooltip: "修改", on: that.handleEditor },
+                { icon: "el-icon-document", tooltip: "详情", on: that.handleDetail }
+            ]
+        };
+    },
+    components: { Table, Detail, Editor }, // 注册局部组件
+    methods: {
+        reloadTable() {
+            const that = this;
+            that.$refs.myTable.$refs.grid.reload();
+        },
+        handleEditor({ id }) {
+            const that = this;
+            getAuthRiskDetail(id)
+                .then(res => {
+                    const formData = res;
+                    const layer = that.$dgLayer({
+                        title: "修改风险检测方案",
+                        shade: [0.4, "#FFF"],
+                        area: ["830px", "660px"],
+                        content: Editor,
+                        props: {
+                            formData
+                        },
+                        on: {
+                            success(bool = false) {
+                                layer.close(layer.dialogIndex);
+                                if (bool) {
+                                    that.reloadTable();
+                                }
+                            }
+                        }
+                    });
+                })
+                .catch(error => {
+                    that.$message.error("详情获取失败");
+                });
+        },
+        handleDetail({ id }) {
+            const that = this;
+            getAuthRiskDetail(id)
+                .then(res => {
+                    const layer = that.$dgLayer({
+                        title: "风险检测方案详情",
+                        shade: [0.4, "#FFF"],
+                        content: Detail,
+                        area: ["830px", "660px"],
+                        props: { sizeForm: res },
+                        on: {
+                            success() {
+                                layer.close(layer.dialogIndex);
+                            }
+                        }
+                    });
+                })
+                .catch(error => {
+                    that.$message.error("详情获取失败");
+                });
+        },
+        /**
+         * @description:表单查询
+         */
+        handleSearch() {
+            this.$refs.myTable.handleSearchClick();
+        },
+        /**
+         * @description:表单重置
+         */
+        handleReset() {
+            this.$refs.ruleForm.resetFields();
+        }
+    }
+};
+</script>
+<style lang="scss" scoped></style>

+ 89 - 0
src/pages/log-manage/err-auth-earlywarning-manage/auth-earlywarning-info-detail.vue

@@ -0,0 +1,89 @@
+<template>
+    <div class="u-detail">
+        <el-form ref="ruleForm" label-width="130px" label-suffix=":">
+            <dg-row :gutter="20">
+                <dg-col :span="12">
+                    <el-form-item label="预警对象">
+                        <div class="u-detail__text">{{ sizeForm.creater }}</div>
+                    </el-form-item>
+                </dg-col>
+                <dg-col :span="12">
+                    <el-form-item label="预警对象唯一标识">
+                        <div class="u-detail__text">{{ sizeForm.createrId }}</div>
+                    </el-form-item>
+                </dg-col>
+            </dg-row>
+            <dg-row :gutter="20">
+                <!-- <dg-col :span="12">
+                    <el-form-item label="所属单位">
+                        <div class="u-detail__text" v-translate="{ code: 'DM_APPLY_STATUS' }">{{ sizeForm.state }}</div>
+                    </el-form-item>
+                </dg-col> -->
+                <dg-col :span="12">
+                    <el-form-item label="预警类型">
+                        <div class="u-detail__text" v-translate="{ enum: 'WarningProgrammeTypeEnum' }">
+                            {{ sizeForm.programmeType }}
+                        </div>
+                    </el-form-item>
+                </dg-col>
+                <dg-col :span="12">
+                    <el-form-item label="预警时间">
+                        <div class="u-detail__text">
+                            {{ sizeForm.createTime | dateFormatter("YYYY-MM-DD HH:mm:ss") }}
+                        </div>
+                    </el-form-item>
+                </dg-col>
+            </dg-row>
+            <dg-row :gutter="20">
+                <dg-col :span="12">
+                    <el-form-item label="预警来源">
+                        <div class="u-detail__text">
+                            <span class="u-detail__text" v-translate="{ enum: 'WarningProgrammeTypeEnum' }">
+                                {{ sizeForm.programmeType }}
+                            </span>方案
+                        </div>
+                    </el-form-item>
+                </dg-col>
+            </dg-row>
+            <dg-row :gutter="20">
+                <dg-col :span="24">
+                    <el-form-item label="预警信息">
+                        <div class="u-detail__text">{{ sizeForm.warningMsg }}</div>
+                    </el-form-item>
+                </dg-col>
+            </dg-row>
+            <div class="dg-layer-demo" v-footer>
+                <dg-button @click="handleClose">取消</dg-button>
+            </div>
+        </el-form>
+    </div>
+</template>
+
+<script>
+export default {
+    name: "auth-earlywarning-info-detail",
+    props: {
+        sizeForm: {
+            type: Object,
+            required: true
+        }
+    },
+    data() {
+        return {};
+    },
+    methods: {
+        handleClose() {
+            this.$emit("close");
+        }
+    },
+    created() {}
+};
+</script>
+
+<style lang="scss">
+.u-detail {
+    .el-form-item {
+        margin-bottom: 10px;
+    }
+}
+</style>

+ 131 - 0
src/pages/log-manage/err-auth-earlywarning-manage/auth-earlywarning-info.vue

@@ -0,0 +1,131 @@
+<template>
+    <main class="auth-earlywarning-plan">
+        <el-form ref="ruleForm" inline :rules="rules" :model="form">
+            <el-form-item label="预警对象" prop="creater.value">
+                <el-input v-model="form.creater.value" placeholder="请输入预警对象" clearable></el-input>
+            </el-form-item>
+            <el-form-item label="预警对象唯一标识" prop="createrId.value">
+                <el-input v-model="form.createrId.value" placeholder="请输入预警对象唯一标识" clearable></el-input>
+            </el-form-item>
+            <el-form-item label="预警类型" prop="programmeType.value">
+                <dg-select
+                    v-model="form.programmeType.value"
+                    placeholder="请选择预警类型"
+                    enum="WarningProgrammeTypeEnum"
+                    style="width: 13rem"
+                    clearable
+                >
+                </dg-select>
+            </el-form-item>
+            <el-form-item label="预警时间" prop="createTime.value">
+                <dg-date-picker
+                    v-model="form.createTime.value"
+                    type="daterange"
+                    range-separator="至"
+                    start-placeholder="开始日期"
+                    end-placeholder="结束日期"
+                    clearable
+                    value-format="yyyyMMddHHmmss"
+                    :unlink-panels="true"
+                >
+                </dg-date-picker>
+            </el-form-item>
+            <el-form-item>
+                <dg-button type="primary" @click="handleSearch" icon="el-icon-search">查询</dg-button>
+                <dg-button type="primary" @click="handleReset" icon="el-icon-refresh-right">重置</dg-button>
+            </el-form-item>
+        </el-form>
+        <Table ref="myTable" :url="tableUrl" :headerData="EarlyWarningInfo" :condition="form">
+            <dg-table-column label="操作" align="center">
+                <template slot-scope="scope">
+                    <div class="u-table__operation">
+                        <el-tooltip content="详情" effect="dark" placement="top-end">
+                            <i class="el-icon-document" @click="handleViewDetail(scope.row)"></i>
+                        </el-tooltip>
+                    </div>
+                </template>
+            </dg-table-column>
+        </Table>
+    </main>
+</template>
+
+<script>
+import Table from "@/pages/common/table";
+import { EarlyWarningInfo } from "../DataConfig";
+import { getAuthEarlyWarningDetail, authEarlyWarningInfo } from "@/api/log-manage";
+import Detail from "./auth-earlywarning-info-detail";
+
+export default {
+    name: "auth-earlywarning-info",
+    data() {
+        return {
+            EarlyWarningInfo,
+            form: {
+                creater: {
+                    value: "",
+                    op: "like"
+                },
+                createrId: {
+                    value: "",
+                    op: "like"
+                },
+                programmeType: {
+                    value: "",
+                    op: "="
+                },
+                createTime: {
+                    value: "",
+                    op: "between",
+                    type: "DATE",
+                    format: "yyyyMMddHHmmss"
+                }
+            },
+            rules: {},
+            tableUrl: authEarlyWarningInfo
+        };
+    },
+    components: { Table },
+    methods: {
+        /**
+         * @description:表单查询
+         */
+        handleSearch() {
+            this.$refs.myTable.handleSearchClick();
+        },
+        /**
+         * @description:表单重置
+         */
+        handleReset() {
+            this.$refs.ruleForm.resetFields();
+        },
+        /**
+         * @description:详情
+         */
+        handleViewDetail({ id }) {
+            const that = this;
+            getAuthEarlyWarningDetail(id)
+                .then(res => {
+                    const sizeForm = res;
+                    const layer = this.$dgLayer({
+                        title: `详情`,
+                        shade: [0.4, "#FFF"],
+                        content: Detail,
+                        props: {
+                            sizeForm
+                        },
+                        on: {
+                            success() {
+                                layer.close(layer.dialogIndex);
+                            }
+                        },
+                        area: ["900px", "500px"]
+                    });
+                })
+                .catch(error => {
+                    that.$message.error("详情获取失败");
+                });
+        }
+    }
+};
+</script>
+<style lang="scss" scoped></style>

+ 144 - 0
src/pages/log-manage/err-auth-earlywarning-manage/auth-earlywarning-plan.vue

@@ -0,0 +1,144 @@
+<!--
+ * @Author: Liugh
+ * @Date: 2021-05-25 13:49:40
+ * @LastEditTime: 2021-05-27 17:15:49
+ * @LastEditors: Do not edit
+ * @FilePath: \auth-web\src\pages\log-manage\err-auth-earlywarning-manage\auth-earlywarning-plan.vue
+ * @Description: 鉴权预警方案
+-->
+<template>
+    <main class="auth-earlywarning-plan">
+        <el-form ref="ruleForm" inline :rules="rules" :model="form">
+            <el-form-item label="鉴权预警方案名称" prop="name.value">
+                <el-input v-model="form.name.value" placeholder="请输入鉴权预警方案名称" clearable></el-input>
+            </el-form-item>
+            <el-form-item label="方案状态" prop="state.value">
+                <dg-select
+                    v-model="form.state.value"
+                    placeholder="请选择方案状态"
+                    enum="ProgrammeStateEnum"
+                    style="width: 13rem"
+                    clearable
+                >
+                </dg-select>
+            </el-form-item>
+            <el-form-item>
+                <dg-button type="primary" @click="handleSearch" icon="el-icon-search">查询</dg-button>
+                <dg-button type="primary" @click="handleReset" icon="el-icon-refresh-right">重置</dg-button>
+            </el-form-item>
+        </el-form>
+        <Table ref="myTable" :url="tableUrl" :headerData="earlyWarningPlanTable" :condition="form">
+            <dg-table-column label="操作" align="center">
+                <template slot-scope="scope">
+                    <div class="u-table__operation">
+                        <el-tooltip content="详情" effect="dark" placement="top-end">
+                            <i class="el-icon-document" @click="handleViewDetail(scope.row)"></i>
+                        </el-tooltip>
+                        <el-tooltip content="编辑" effect="dark" placement="top-end">
+                            <i class="el-icon-edit" @click="handleViewEdit(scope.row)"></i>
+                        </el-tooltip>
+                    </div>
+                </template>
+            </dg-table-column>
+        </Table>
+    </main>
+</template>
+
+<script>
+import Table from "@/pages/common/table";
+import { earlyWarningPlanTable } from "../DataConfig";
+import { warningProgrammeTableUrl } from "@/api/log-manage";
+import detail from "./detail";
+import edit from "./edit";
+export default {
+    name: "auth-earlywarning-plan", // 组件名称
+    props: {
+        // 接收父组件的数据
+    },
+    data() {
+        // 组件内部参数
+        return {
+            // 参数名称及默认值
+            earlyWarningPlanTable,
+            form: {
+                name: {
+                    value: "",
+                    op: "like"
+                },
+                state: {
+                    value: "",
+                    op: "="
+                }
+            },
+            rules: {},
+            tableUrl: warningProgrammeTableUrl
+        };
+    },
+    computed: {}, // 计算属性
+    watch: {}, // 侦听器(扩展的计算属性)
+    components: { Table }, // 注册局部组件
+    methods: {
+        /**
+         * @description:表单查询
+         */
+        handleSearch() {
+            this.$refs.myTable.handleSearchClick();
+        },
+        /**
+         * @description:表单重置
+         */
+        handleReset() {
+            this.$refs.ruleForm.resetFields();
+        },
+        /**
+         * @description: 编辑
+         */
+        handleViewEdit(row) {
+            const layer = this.$dgLayer({
+                title: `异常鉴权预警方案修改`,
+                shade: [0.4, "#FFF"],
+                content: edit,
+                skin: "auth-earlywarning-plan-edit-layer",
+                btn: null,
+                props: {
+                    info: row
+                },
+                on: {
+                    success() {
+                        layer.close(layer.dialogIndex);
+                    }
+                },
+                area: ["900px", "500px"]
+            });
+        },
+        /**
+         * @description:详情
+         */
+        handleViewDetail(row) {
+            const layer = this.$dgLayer({
+                title: `异常鉴权预警方案详情`,
+                shade: [0.4, "#FFF"],
+                content: detail,
+                props: {
+                    info: row
+                },
+                on: {
+                    success() {
+                        layer.close(layer.dialogIndex);
+                    }
+                },
+                area: ["900px", "500px"]
+            });
+        }
+    }, // 内部方法
+    beforeCreate() {}, // 组件创建前
+    created() {}, // 组件创建完成后
+    beforeMount() {}, // 组件挂载前
+    mounted() {}, // 组件挂载完成后
+    beforeUpdate() {}, // 组件更新前
+    updated() {}, // 组件挂载完成后
+    beforeDestroy() {}, // 组件销毁前
+    destroyed() {} // 组件销毁完成后
+};
+</script>
+<style lang="scss" scoped></style>

+ 89 - 0
src/pages/log-manage/err-auth-earlywarning-manage/detail.vue

@@ -0,0 +1,89 @@
+<!--
+ * @Author: Liugh
+ * @Date: 2021-05-26 15:09:38
+ * @LastEditTime: 2021-05-27 17:28:32
+ * @LastEditors: Do not edit
+ * @FilePath: \auth-web\src\pages\log-manage\err-auth-earlywarning-manage\detail.vue
+ * @Description: 
+-->
+<template>
+    <main class="auth-earlywarning-plan-detail">
+        <el-form v-if="detailInfo.id" ref="ruleForm" :model="detailInfo" label-width="100px" label-suffix=":">
+            <el-row>
+                <el-col :span="item.span" v-for="(item, index) in earlyWarningPlanTableInfo" :key="index">
+                    <el-form-item :label="item.label">
+                        <template v-if="item.code">
+                            <div class="u-detail__text" v-translate="{ code: item.code }">
+                                {{ detailInfo[item.value] }}
+                            </div>
+                        </template>
+                        <template v-else-if="item.enum">
+                            <div class="u-detail__text" v-translate="{ enum: item.enum }">
+                                {{ detailInfo[item.value] }}
+                            </div>
+                        </template>
+                        <template v-else-if="item.value == 'ruleContent'">
+                            <div class="u-detail__text" v-for="(item, index) in detailInfo[item.value]" :key="index">
+                                用户在{{ item.time[0] }} - {{ item.time[1] }} 进行鉴权
+                            </div>
+                        </template>
+                        <template v-else-if="item.isTime">
+                            <div class="u-detail__text">
+                                {{ detailInfo[item.value] | dateFormatter("YYYY-MM-DD") }}
+                            </div>
+                        </template>
+                        <template v-else>
+                            <div class="u-detail__text">
+                                {{ detailInfo[item.value] }}
+                            </div>
+                        </template>
+                    </el-form-item>
+                </el-col>
+            </el-row>
+        </el-form>
+    </main>
+</template>
+
+<script>
+import { earlyWarningPlanTableInfo } from "../DataConfig";
+import { warningProgrammeInfo } from "@/api/log-manage";
+export default {
+    name: "auth-earlywarning-plan-detail", // 组件名称
+    props: {
+        // 接收父组件的数据
+        info: Object
+    },
+    data() {
+        // 组件内部参数
+        return {
+            earlyWarningPlanTableInfo,
+            detailInfo: {}
+        };
+    },
+    components: {}, // 注册局部组件
+    computed: {},
+    methods: {
+        countTime(val) {
+            return val >= 10 ? val + ":00" : "0" + val + ":00";
+        },
+        getDetail() {
+            return new Promise(resolve => {
+                warningProgrammeInfo(this.info.id).then(res => {
+                    res.ruleContent = res.ruleContent ? (JSON.parse(res.ruleContent) || []) : [];
+                    res.ruleContent.forEach(item => {
+                        item.time = [this.countTime(item.start), this.countTime(item.end)];
+                        delete item.start;
+                        delete item.end;
+                    });
+                    this.detailInfo = res;
+                    resolve(res);
+                });
+            });
+        }
+    }, // 内部方法
+    async created() {
+        await this.getDetail();
+    }
+};
+</script>
+<style lang="scss" scoped></style>

+ 200 - 0
src/pages/log-manage/err-auth-earlywarning-manage/edit.vue

@@ -0,0 +1,200 @@
+<!--
+ * @Author: Liugh
+ * @Date: 2021-05-26 15:09:38
+ * @LastEditTime: 2021-05-28 16:36:56
+ * @LastEditors: Do not edit
+ * @FilePath: \auth-web\src\pages\log-manage\err-auth-earlywarning-manage\edit.vue
+ * @Description: 
+-->
+<template>
+    <main class="auth-earlywarning-plan-edit">
+        <el-form ref="ruleForm" :model="form" label-width="100px" label-suffix=":">
+            <el-row>
+                <el-col :span="24">
+                    <el-form-item label="方案名称">
+                        {{ form.name }}
+                    </el-form-item>
+                </el-col>
+                <el-col :span="24">
+                    <el-form-item label="方案状态">
+                        <dg-select
+                            v-model="form.state"
+                            placeholder="请选择方案状态"
+                            enum="ProgrammeStateEnum"
+                            style="width: 100%"
+                            clearable
+                        >
+                        </dg-select>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="24">
+                    <el-form-item label="预警规则">
+                        <!--TODO 内嵌form  -->
+                        <!-- <el-input type="textarea" :rows="2" placeholder="请输入预警规则" v-model="form.textarea"></el-input> -->
+                        <el-form-item v-for="(domain, index) in form.ruleContent" :key="index">
+                            <div class="time-picker-layer">
+                                用户在
+                                <dg-time-picker
+                                    v-model="domain.time"
+                                    type="timerange2"
+                                    :picker-options="pickerOptions"
+                                    begin-placeholder="开始时间"
+                                    end-placeholder="结束时间"
+                                >
+                                </dg-time-picker>
+                                进行鉴权
+                                <div class="time-picker-layer_button">
+                                    <dg-button circle @click.prevent="addDomain" size="mini">
+                                        <i class="el-icon-plus"></i>
+                                    </dg-button>
+                                    <dg-button circle @click.prevent="removeDomain(domain)" size="mini">
+                                        <i class="el-icon-minus"></i>
+                                    </dg-button>
+                                </div>
+                            </div>
+                        </el-form-item>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="24">
+                    <el-form-item label="规则说明">
+                        {{ form.ruleExplain }}
+                    </el-form-item>
+                </el-col>
+                <el-col :span="24">
+                    <el-form-item label="预警信息">
+                        {{ form.ruleExplain }}
+                    </el-form-item>
+                </el-col>
+                <!-- <el-col :span="item.span" v-for="(item, index) in earlyWarningPlanTableInfo" :key="index"> -->
+                <!-- <el-form-item :label="item.label">{{ detailInfo[item.value] }} </el-form-item> -->
+                <!-- </el-col> -->
+            </el-row>
+            <el-form-item align="right">
+                <el-button type="primary" @click="onSubmit">保存</el-button>
+                <el-button @click="close">取消</el-button>
+            </el-form-item>
+        </el-form>
+    </main>
+</template>
+
+<script>
+import { earlyWarningPlanTableInfo } from "../DataConfig";
+import { riskProgramme, warningProgrammeInfo } from "@/api/log-manage";
+import transferBusinessTagMixin from "@/mixins/transfer-business-tag";
+
+export default {
+    name: "auth-earlywarning-plan-edit", // 组件名称
+    props: {
+        // 接收父组件的数据
+        info: Object
+    },
+    mixins: [transferBusinessTagMixin],
+    data() {
+        // 组件内部参数
+        return {
+            earlyWarningPlanTableInfo,
+            pickerOptions: {
+                start: "00:00",
+                step: "01:00",
+                end: "23:00"
+            },
+            form: {
+                ruleContent: [
+                    {
+                        time: ""
+                    }
+                ]
+            }
+        };
+    },
+    components: {}, // 注册局部组件
+    computed: {},
+    methods: {
+        /**
+         * @description: 关闭
+         */
+        close() {
+            this.$emit("success");
+        },
+        /**
+         * @description: 提交
+         */
+        onSubmit() {
+            let obj = JSON.parse(JSON.stringify(this.form));
+            obj.ruleContent.forEach((item) => {
+                item.start = parseInt(item.time[0]);
+                item.end = parseInt(item.time[1]);
+                delete item.time;
+            });
+            obj.ruleContent = JSON.stringify(obj.ruleContent);
+            riskProgramme(obj).then((res) => {
+                this.$message.success("操作成功");
+                this.$emit("success");
+            });
+        },
+        /**
+         * @description:添加规则
+         * @param {*}
+         * @return {*}
+         */
+        addDomain() {
+            this.form.ruleContent.push({
+                time: ""
+            });
+        },
+        /**
+         * @description:移除规则
+         * @param {*} item
+         * @return {*}
+         */
+        removeDomain(item) {
+            if (this.form.ruleContent.length <= 1) return;
+            var index = this.form.ruleContent.indexOf(item);
+            if (index !== -1) {
+                this.form.ruleContent.splice(index, 1);
+            }
+        },
+        countTime(val) {
+            return val >= 10 ? val + ":00" : "0" + val + ":00";
+        },
+        /**
+         * @description: 获取详情
+         */
+        getDetail() {
+            return new Promise((resolve) => {
+                warningProgrammeInfo(this.info.id).then((res) => {
+                    res.ruleContent = JSON.parse(res.ruleContent);
+                    res.ruleContent.forEach((item) => {
+                        item.time = [this.countTime(item.start), this.countTime(item.end)];
+                        delete item.start;
+                        delete item.end;
+                    });
+                    this.form = res;
+                    console.log(this.form);
+                    resolve(res);
+                });
+            });
+        }
+    }, // 内部方法
+    async created() {
+        await this.getDetail();
+    }
+};
+</script>
+<style lang="scss">
+.auth-earlywarning-plan-edit-layer {
+    .time-picker-layer {
+        display: flex;
+        // align-items: center;
+        margin-bottom: 0.75rem;
+        &_button {
+            margin-left: 0.9375rem;
+        }
+    }
+    .dg-range-editor {
+        margin: 0 0.9375rem;
+        display: flex;
+        // align-items: center;
+    }
+}
+</style>

+ 10 - 0
src/pages/log-manage/index.scss

@@ -0,0 +1,10 @@
+/*
+ * @Author: Liugh
+ * @Date: 2021-05-25 14:09:38
+ * @LastEditTime: 2021-05-27 14:37:55
+ * @LastEditors: Do not edit
+ * @FilePath: \auth-web\src\pages\log-manage\index.scss
+ * @Description: 
+ */
+.auth-earlywarning-plan-edit {
+}

+ 232 - 0
src/pages/log-manage/permiss-log-manage/DataConfig.js

@@ -0,0 +1,232 @@
+/**
+ * 数据配置
+ * @Author: linqian
+ * @Date: 2021-05-27 11:33
+ */
+
+/***********************************************  表格  ******************************************* */
+
+// 授权管理日志
+export const authManageLogTableHeader = [
+    {
+        label: "授权管理类型",
+        prop: "authorizeType",
+        enum: "AuthorizeTypeEnum"
+    },
+    {
+        label: "权限处理主体",
+        prop: "authorizeSubjectNames"
+    },
+    {
+        label: "授权管理客体",
+        prop: "authorizeObjectNames"
+    },
+    {
+        label: "权限处理者",
+        prop: "authorizeHandlerNames"
+    },
+    {
+        label: "权限处理者身份证号码",
+        prop: "authorizeHandlerIdcards"
+    },
+    {
+        label: "处理时间",
+        prop: "createTime",
+        timestamp: true,
+        format: "YYYY-MM-DD HH:mm:ss"
+    },
+    {
+        label: "状态",
+        prop: "state",
+        enum: "AuthResultEnum"
+    },
+];
+
+// 鉴权服务日志
+export const authServiceLogTableHeader = [
+    {
+        label: "用户姓名",
+        prop: "userName"
+    },
+    {
+        label: "用户身份证号码",
+        prop: "userIdcard"
+    },
+    {
+        label: "鉴权请求者",
+        prop: "requesterName"
+    },
+    {
+        label: "请求者唯一标识",
+        prop: "requesterId"
+    },
+    {
+        label: "鉴权时间",
+        prop: "createTime",
+        timestamp: true,
+        format: "YYYY-MM-DD HH:mm:ss"
+    },
+    {
+        label: "终端标识",
+        prop: "terminalId"
+    },
+    {
+        label: "鉴权令牌",
+        prop: "tokens"
+    },
+    {
+        label: "鉴权类型",
+        prop: "authenticationType",
+        enum: "AuthenticationNecessaryParamEnum"
+    },
+    {
+        label: "鉴权结果",
+        prop: "state",
+        enum: "AuthResultEnum"
+    }
+];
+
+// 鉴权风险日志
+export const authRiskLogTableHeader = [
+    {
+        label: "风险产生方",
+        prop: "creater"
+    },
+    {
+        label: "风险产生方标识",
+        prop: "createrId"
+    },
+    {
+        label: "风险发生时间",
+        prop: "createTime",
+        timestamp: true,
+        format: "YYYY-MM-DD HH:mm:ss"
+    },
+    {
+        label: "风险类型",
+        prop: "riskType",
+        enum: "RiskProgrammeTypeEnum"
+    },
+    {
+        label: "鉴权请求方",
+        prop: "requesterName"
+    },
+    {
+        label: "风险内容",
+        prop: "riskContent"
+    }
+];
+
+// 鉴权行为统计
+export const authBehaviorStatisticTableHeader = [
+    {
+        label: "鉴权类型",
+        prop: "type",
+        enum: "AuthenticationNecessaryParamEnum"
+    },
+    {
+        label: "鉴权成功次数",
+        prop: "susSize"
+    },
+    {
+        label: "鉴权失败次数",
+        prop: "failSize"
+    },
+    {
+        label: "鉴权总次数",
+        prop: "totalSize"
+    }
+];
+
+/***********************************************  详情  ******************************************* */
+
+// 鉴权风险日志详情
+export const authRiskLogDetail = [
+    {
+        label: "风险产生方",
+        value: "creater"
+    },
+    {
+        label: "风险产生方标识",
+        value: "createrId"
+    },
+    {
+        label: "风险发生时间",
+        value: "createTime",
+        isTime: true,
+        format: "YYYY-MM-DD HH:mm:ss"
+    },
+    {
+        label: "风险类型",
+        value: "riskType",
+        enum: "RiskProgrammeTypeEnum"
+    },
+    {
+        label: "鉴权请求者",
+        value: "requesterName"
+    },
+    {
+        label: "鉴权请求者标识",
+        value: "requesterId"
+    },
+    {
+        label: "风险内容",
+        value: "riskContent",
+        span: 24
+    },
+    {
+        label: "处理建议",
+        value: "handleOpinion",
+        span: 24
+    }
+];
+
+// 鉴权服务日志详情
+export const authServiceLogDetail = [
+    {
+        label: "用户姓名",
+        value: "userName"
+    },
+    {
+        label: "用户身份证号码",
+        value: "userIdcard"
+    },
+    {
+        label: "鉴权请求者",
+        value: "requesterName"
+    },
+    {
+        label: "请求者唯一标识",
+        value: "requesterId"
+    },
+    {
+        label: "鉴权时间",
+        value: "createTime",
+        isTime: true,
+        format: "YYYY-MM-DD HH:mm:ss"
+    },
+    {
+        label: "终端标识",
+        value: "terminalId"
+    },
+    {
+        label: "鉴权令牌",
+        value: "tokens",
+        span: 24
+    },
+    {
+        label: "鉴权类型",
+        value: "authenticationType",
+        enum: "AuthenticationNecessaryParamEnum"
+    },
+    {
+        label: "鉴权结果",
+        value: "state",
+        enum: "AuthenticationResultEnum"
+    },
+    {
+        label: "鉴权内容",
+        value: "content",
+        span: 24
+    }
+];

+ 127 - 0
src/pages/log-manage/permiss-log-manage/auth-manage-log.vue

@@ -0,0 +1,127 @@
+<!--
+授权管理日志
+@Author: linqian
+@Date: 2021-05-27 11:29
+-->
+<template>
+    <div>
+        <!-- 搜索项 -->
+        <el-form ref="ruleForm" inline :model="form">
+            <el-form-item label="授权管理类型">
+                <dg-select v-model="form.authorizeType.value" placeholder="请选择授权管理类型" enum="AuthorizeTypeEnum" clearable>
+                </dg-select>
+            </el-form-item>
+            <el-form-item label="处理时间">
+                <dg-date-picker
+                    v-model="form.createTime.value"
+                    type="daterange"
+                    range-separator="至"
+                    start-placeholder="开始日期"
+                    end-placeholder="结束日期"
+                    clearable
+                    value-format="yyyyMMddHHmmss"
+                    :unlink-panels="true"
+                >
+                </dg-date-picker>
+            </el-form-item>
+            <el-form-item label="授权处理者">
+                <el-input v-model="form.authorizeHandlerNames.value" placeholder="请输入授权处理者" clearable></el-input>
+            </el-form-item>
+            <el-form-item>
+                <dg-button type="primary" @click="handleSearch" icon="el-icon-search">查询</dg-button>
+                <dg-button type="primary" @click="handleReset" icon="el-icon-refresh-right">重置</dg-button>
+            </el-form-item>
+        </el-form>
+        <!-- 表格 -->
+        <Table ref="myTable" :url="authManageLogTableUrl" :headerData="authManageLogTableHeader" :condition="form">
+            <dg-table-column label="操作" align="center">
+                <template slot-scope="scope">
+                    <div class="u-table__operation">
+                        <el-tooltip content="详情" effect="dark" placement="top-end">
+                            <i class="el-icon-document" @click="handleViewDetail(scope.row)"></i>
+                        </el-tooltip>
+                    </div>
+                </template>
+            </dg-table-column>
+        </Table>
+    </div>
+</template>
+
+<script>
+import Table from "@/pages/common/table";
+import detail from "./log-detail/auth-manage";
+import { authManageLogTableHeader } from "./DataConfig";
+import { authManageLogTableUrl } from "@/api/permiss-log-manage";
+export default {
+    components: {
+        Table
+    },
+    data() {
+        return {
+            authManageLogTableUrl,
+            authManageLogTableHeader,
+            form: {
+                authorizeType: {
+                    value: "",
+                    op: "="
+                },
+                authorizeHandlerNames: {
+                    value: "",
+                    op: "like"
+                },
+                createTime: {
+                    value: "",
+                    op: "between",
+                    type: "DATE",
+                    format: "yyyyMMddHHmmss"
+                }
+            }
+        };
+    },
+    computed: {},
+    methods: {
+        /**
+         *  详情
+         */
+        handleViewDetail(row) {
+            const layer = this.$dgLayer({
+                title: `详情`,
+                shade: [0.4, "#FFF"],
+                content: detail,
+                props: {
+                    id: row.id
+                },
+                on: {
+                    success() {
+                        layer.close(layer.dialogIndex);
+                    }
+                },
+                area: ["900px", "800px"]
+            });
+        },
+        /**
+         * 查询
+         */
+        handleSearch() {
+            this.$refs.myTable.handleSearchClick();
+        },
+        /**
+         * 重置
+         */
+        handleReset() {
+            for (const key in this.form) {
+                this.form[key].value = "";
+            }
+        }
+    },
+    created() {
+        const startTime = this.$moment().subtract("1", "year").format("YYYYMMDDHHmmss");
+        const endTime = this.$moment().format("YYYYMMDDHHmmss");
+        this.form.createTime.value = [startTime, endTime];
+    },
+    mounted() {}
+};
+</script>
+
+<style lang='scss'>
+</style>

+ 127 - 0
src/pages/log-manage/permiss-log-manage/auth-risk-log.vue

@@ -0,0 +1,127 @@
+<!--
+鉴权风险日志
+@Author: linqian
+@Date: 2021-05-27 11:33
+-->
+<template>
+    <div>
+        <!-- 搜索项 -->
+        <el-form ref="ruleForm" inline :model="form">
+            <el-form-item label="风险产生方">
+                <el-input v-model="form.creater.value" placeholder="请输入风险产生方" clearable></el-input>
+            </el-form-item>
+            <el-form-item label="风险发生时间">
+                <dg-date-picker
+                    v-model="form.createTime.value"
+                    type="daterange"
+                    range-separator="至"
+                    start-placeholder="开始日期"
+                    end-placeholder="结束日期"
+                    clearable
+                    value-format="yyyyMMddHHmmss"
+                    :unlink-panels="true"
+                >
+                </dg-date-picker>
+            </el-form-item>
+            <el-form-item label="风险类型">
+                <dg-select v-model="form.riskType.value" placeholder="请选择风险类型" enum="RiskProgrammeTypeEnum" clearable>
+                </dg-select>
+            </el-form-item>
+            <el-form-item>
+                <dg-button type="primary" @click="handleSearch" icon="el-icon-search">查询</dg-button>
+                <dg-button type="primary" @click="handleReset" icon="el-icon-refresh-right">重置</dg-button>
+            </el-form-item>
+        </el-form>
+        <!-- 表格 -->
+        <Table ref="myTable" :url="authRiskLogTableUrl" :headerData="authRiskLogTableHeader" :condition="form">
+            <dg-table-column label="操作" align="center">
+                <template slot-scope="scope">
+                    <div class="u-table__operation">
+                        <el-tooltip content="详情" effect="dark" placement="top-end">
+                            <i class="el-icon-document" @click="handleViewDetail(scope.row)"></i>
+                        </el-tooltip>
+                    </div>
+                </template>
+            </dg-table-column>
+        </Table>
+    </div>
+</template>
+
+<script>
+import Table from "@/pages/common/table";
+import detail from "./log-detail/auth-risk";
+import { authRiskLogTableHeader } from "./DataConfig";
+import { authRiskLogTableUrl } from "@/api/permiss-log-manage";
+export default {
+    components: {
+        Table
+    },
+    data() {
+        return {
+            authRiskLogTableUrl,
+            authRiskLogTableHeader,
+            form: {
+                riskType: {
+                    value: "",
+                    op: "="
+                },
+                creater: {
+                    value: "",
+                    op: "like"
+                },
+                createTime: {
+                    value: "",
+                    op: "between",
+                    type: "DATE",
+                    format: "yyyyMMddHHmmss"
+                }
+            }
+        };
+    },
+    computed: {},
+    methods: {
+        /**
+         *  详情
+         */
+        handleViewDetail(row) {
+            const layer = this.$dgLayer({
+                title: `详情`,
+                shade: [0.4, "#FFF"],
+                content: detail,
+                props: {
+                    id: row.id
+                },
+                on: {
+                    success() {
+                        layer.close(layer.dialogIndex);
+                    }
+                },
+                area: ["800px", "500px"]
+            });
+        },
+        /**
+         * 查询
+         */
+        handleSearch() {
+            this.$refs.myTable.handleSearchClick();
+        },
+        /**
+         * 重置
+         */
+        handleReset() {
+            for (const key in this.form) {
+                this.form[key].value = "";
+            }
+        }
+    },
+    created() {
+        const startTime = this.$moment().subtract("1", "year").format("YYYYMMDDHHmmss");
+        const endTime = this.$moment().format("YYYYMMDDHHmmss");
+        this.form.createTime.value = [startTime, endTime];
+    },
+    mounted() {}
+};
+</script>
+
+<style lang='scss'>
+</style>

+ 150 - 0
src/pages/log-manage/permiss-log-manage/auth-service-log.vue

@@ -0,0 +1,150 @@
+<!--
+鉴权管理日志
+@Author: linqian
+@Date: 2021-05-27 11:30
+-->
+
+<template>
+    <div>
+        <!-- 搜索项 -->
+        <el-form ref="ruleForm" inline :model="form">
+            <el-form-item label="用户姓名">
+                <el-input v-model="form.userName.value" placeholder="请输入用户姓名" clearable></el-input>
+            </el-form-item>
+            <el-form-item label="用户身份证号码">
+                <el-input v-model="form.userIdcard.value" placeholder="请输入用户身份证号码" clearable></el-input>
+            </el-form-item>
+            <el-form-item label="鉴权类型">
+                <dg-select
+                    v-model="form.authenticationType.value"
+                    placeholder="请选择鉴权类型"
+                    enum="AuthenticationNecessaryParamEnum"
+                    clearable
+                    style="width: 9rem"
+                >
+                </dg-select>
+            </el-form-item>
+            <el-form-item label="鉴权时间">
+                <dg-date-picker
+                    v-model="form.createTime.value"
+                    type="daterange"
+                    range-separator="至"
+                    start-placeholder="开始日期"
+                    end-placeholder="结束日期"
+                    clearable
+                    value-format="yyyyMMddHHmmss"
+                    style="width: 16rem"
+                    :unlink-panels="true"
+                >
+                </dg-date-picker>
+            </el-form-item>
+            <el-form-item label="鉴权结果">
+                <dg-select v-model="form.state.value" placeholder="请选择鉴权结果" enum="AuthResultEnum" clearable  style="width: 9rem">
+                </dg-select>
+            </el-form-item>
+            <el-form-item>
+                <dg-button type="primary" @click="handleSearch" icon="el-icon-search">查询</dg-button>
+                <dg-button type="primary" @click="handleReset" icon="el-icon-refresh-right">重置</dg-button>
+            </el-form-item>
+        </el-form>
+        <!-- 表格 -->
+        <Table ref="myTable" :url="authServiceLogTableUrl" :headerData="authServiceLogTableHeader" :condition="form">
+            <dg-table-column label="操作" align="center">
+                <template slot-scope="scope">
+                    <div class="u-table__operation">
+                        <el-tooltip content="详情" effect="dark" placement="top-end">
+                            <i class="el-icon-document" @click="handleViewDetail(scope.row)"></i>
+                        </el-tooltip>
+                    </div>
+                </template>
+            </dg-table-column>
+        </Table>
+    </div>
+</template>
+
+<script>
+import Table from "@/pages/common/table";
+import detail from "./log-detail/auth-service";
+import { authServiceLogTableHeader } from "./DataConfig";
+import { authServiceLogTableUrl } from "@/api/permiss-log-manage";
+export default {
+    components: {
+        Table
+    },
+    data() {
+        return {
+            authServiceLogTableHeader,
+            authServiceLogTableUrl,
+            form: {
+                userName: {
+                    value: "",
+                    op: "like"
+                },
+                userIdcard: {
+                    value: "",
+                    op: "like"
+                },
+                authenticationType: {
+                    value: "",
+                    op: "="
+                },
+                createTime: {
+                    value: [],
+                    op: "between",
+                    type: "DATE",
+                    format: "yyyyMMddHHmmss"
+                },
+                state: {
+                    value: "",
+                    op: "="
+                }
+            }
+        };
+    },
+    computed: {},
+    methods: {
+        /**
+         *  详情
+         */
+        handleViewDetail(row) {
+            const layer = this.$dgLayer({
+                title: `详情`,
+                shade: [0.4, "#FFF"],
+                content: detail,
+                props: {
+                    id: row.id
+                },
+                on: {
+                    success() {
+                        layer.close(layer.dialogIndex);
+                    }
+                },
+                area: ["800px", "500px"]
+            });
+        },
+        /**
+         * 查询
+         */
+        handleSearch() {
+            this.$refs.myTable.handleSearchClick();
+        },
+        /**
+         * 重置
+         */
+        handleReset() {
+            for (const key in this.form) {
+                this.form[key].value = "";
+            }
+        }
+    },
+    created() {
+         const startTime = this.$moment().subtract("1", "year").format("YYYYMMDDHHmmss");
+        const endTime = this.$moment().format("YYYYMMDDHHmmss");
+        this.form.createTime.value = [startTime, endTime];
+    },
+    mounted() {}
+};
+</script>
+
+<style lang='scss'>
+</style>

+ 84 - 0
src/pages/log-manage/permiss-log-manage/log-detail/auth-manage.vue

@@ -0,0 +1,84 @@
+<!--
+授权管理日志详情
+@Author: linqian
+@Date: 2021-05-27 15:10
+-->
+<template>
+    <div>
+        <el-form v-if="detailInfo.id" label-width="120px" label-suffix=":">
+            <el-form-item label="授权管理类型">
+                <div class="u-detail__text" v-translate="{ enum: 'AuthorizeTypeEnum' }">
+                    {{ detailInfo.authorizeType }}
+                </div>
+            </el-form-item>
+            <el-form-item label="权限处理时间">
+                <p>{{ detailInfo.createTime | dateFormatter("YYYY-MM-DD HH:mm:ss") }}</p>
+            </el-form-item>
+            <el-form-item label="状态">
+                <div class="u-detail__text" v-translate="{ enum: 'AuthResultEnum' }">
+                    {{ detailInfo.state }}
+                </div>
+            </el-form-item>
+
+            <el-form-item label="操作内容"> -- </el-form-item>
+            <dg-row zebra="16px">
+                <dg-table :data="detailInfo.handlers" paging-type="client" :pagination-props="paginationProps">
+                    <dg-table-column prop="handlerName" label="授权处理者"></dg-table-column>
+                    <dg-table-column prop="handlerIdcard" label="权限处理者身份证号码"></dg-table-column>
+                </dg-table>
+            </dg-row>
+            <dg-row zebra="16px">
+                <dg-table :data="detailInfo.subjects" paging-type="client" :pagination-props="paginationProps">
+                    <dg-table-column prop="subjectName" label="权限处理主体"></dg-table-column>
+                    <dg-table-column prop="subjectId" label="权限处理主体ID"></dg-table-column>
+                </dg-table>
+            </dg-row>
+            <dg-row zebra="16px">
+                <dg-table :data="detailInfo.objects" paging-type="client" :pagination-props="paginationProps">
+                    <dg-table-column prop="objectName" label="授权管理客体"></dg-table-column>
+                    <dg-table-column prop="objectId" label="授权管理客体ID"></dg-table-column>
+                </dg-table>
+            </dg-row>
+        </el-form>
+        <!-- <div v-footer>
+            <dg-button @click="handleClose">关闭</dg-button>
+        </div> -->
+    </div>
+</template>
+
+<script>
+import { getAuthManageLogDetail } from "@/api/permiss-log-manage";
+export default {
+    props: {
+        id: [String, Number]
+    },
+    components: {},
+    data() {
+        return {
+            detailInfo: {},
+            value: "",
+            paginationProps: {
+                currentPage: 1,
+                pageSizes: [10, 20],
+                pageSize: 5,
+                layout: "total, prev, pager, next, jumper"
+            }
+        };
+    },
+    computed: {},
+    methods: {
+        handleClose() {
+            this.$emit("close");
+        }
+    },
+    created() {
+        getAuthManageLogDetail(this.id).then((res) => {
+            this.detailInfo = res.data.content;
+        });
+    },
+    mounted() {}
+};
+</script>
+
+<style lang='scss' scoped>
+</style>

+ 41 - 0
src/pages/log-manage/permiss-log-manage/log-detail/auth-risk.vue

@@ -0,0 +1,41 @@
+<!--
+鉴权风险日志详情
+@Author: linqian
+@Date: 2021-05-27 15:17
+-->
+<template>
+    <div>
+        <form-detail :detailInfo="detailInfo" :config="authRiskLogDetail" labelWidth="160px"></form-detail>
+    </div>
+</template>
+
+<script>
+import formDetail from "@/pages/common/form-detail";
+import { authRiskLogDetail } from "../DataConfig";
+import { getAuthRiskLogDetail } from "@/api/permiss-log-manage";
+export default {
+    props: {
+        id: [String, Number]
+    },
+    components: {
+        formDetail
+    },
+    data() {
+        return {
+            authRiskLogDetail,
+            detailInfo: {}
+        };
+    },
+    computed: {},
+    methods: {},
+    created() {
+        getAuthRiskLogDetail(this.id).then((res) => {
+            this.detailInfo = res.data.content;
+        });
+    },
+    mounted() {}
+};
+</script>
+
+<style lang='scss'>
+</style>

+ 41 - 0
src/pages/log-manage/permiss-log-manage/log-detail/auth-service.vue

@@ -0,0 +1,41 @@
+<!--
+鉴权服务日志详情
+@Author: linqian
+@Date: 2021-05-27 15:17
+-->
+<template>
+    <div>
+        <form-detail :detailInfo="detailInfo" :config="authServiceLogDetail" labelWidth="140px"></form-detail>
+    </div>
+</template>
+
+<script>
+import formDetail from "@/pages/common/form-detail";
+import { authServiceLogDetail } from "../DataConfig";
+import { getAuthServiceLogDetail } from "@/api/permiss-log-manage";
+export default {
+    props: {
+        id: [String, Number]
+    },
+    components: {
+        formDetail
+    },
+    data() {
+        return {
+            authServiceLogDetail,
+            detailInfo: {}
+        };
+    },
+    computed: {},
+    methods: {},
+    created() {
+        getAuthServiceLogDetail(this.id).then((res) => {
+            this.detailInfo = res.data.content;
+        });
+    },
+    mounted() {}
+};
+</script>
+
+<style lang='scss'>
+</style>

+ 20 - 0
src/router/index.js

@@ -14,6 +14,7 @@ let layoutType = getSetting("LAYOUT");
 import userManage from "./modules/user-manage";
 import adminManage from "./modules/admin-manage";
 import logReport from "./modules/log-report";
+import logManage from "./modules/log-manage";
 import applicationManage from "./modules/application-manage";
 import statisticsManage from "./modules/statistics-manage";
 import authorizationManage from "./modules/authorization-manage";
@@ -99,6 +100,7 @@ export const asyncRouterMap = [{
     //统计报表
     statisticsManage,
     // 动态授权管理
+<<<<<<< HEAD
     // {
     //     path: "/dynamic-author-manage",
     //     component: Layout,
@@ -114,6 +116,24 @@ export const asyncRouterMap = [{
     //     }]
     // },
     ...dataAuthModuleRouter
+=======
+    {
+        path: "/dynamic-author-manage",
+        component: Layout,
+        redirect: "/dynamic-author-manage",
+        alwaysShow: true,
+        meta: { title: "动态授权管理", icon: "el-icon-time", noCache: true, permission: ["YHGLPT_DTSQGL"] },
+        children: [{
+            path: "dynamic-manage",
+            component: () =>
+                import ("@/pages/dynamic-author-manage"),
+            name: "dynamic-author-manage",
+            meta: { title: "动态授权管理", noCache: false, permission: ["YHGLPT_DTSQGL_DTSQGL"] }
+        }]
+    },
+    ...dataAuthModuleRouter,
+    logManage
+>>>>>>> develop_2.4.0_LogManage
 ];
 
 export default new Router({

+ 120 - 0
src/router/modules/log-manage.js

@@ -0,0 +1,120 @@
+/*
+ * @Author: Liugh
+ * @Date: 2021-05-25 11:19:26
+ * @LastEditTime: 2021-05-28 10:15:02
+ * @LastEditors: Do not edit
+ * @FilePath: \auth-web\src\router\modules\log-manage.js
+ * @Description: 日志管理模块
+ */
+import Layout from "@/pages/layout/layout";
+import common from "@/pages/common";
+// const Layout = () => import("@/pages/" + process.env.LAYOUT + "/layout");
+
+const componentsRouter = {
+    path: "/log-manage",
+    component: Layout,
+    redirect: "/log-manage",
+    alwaysShow: true,
+    meta: { title: "日志管理", icon: "el-icon-document-checked", noCache: true, permission: ["QXGL_RZGL"] },
+    children: [
+        {
+            path: "/err-auth-earlywarning-manage",
+            component: common,
+            name: "common",
+            redirect: "/err-auth-earlywarning-manage",
+            alwaysShow: true,
+            meta: { title: "异常鉴权预警管理", icon: "el-icon-goods", noCache: true, permission: ["QXGL_RZGL_YCJQYJGL"] },
+            children: [
+                {
+                    path: "auth-earlywarning-plan",
+                    component: () => import("@/pages/log-manage/err-auth-earlywarning-manage/auth-earlywarning-plan"),
+                    name: "auth-earlywarning-plan",
+                    meta: {
+                        title: "鉴权预警方案",
+                        noCache: false,
+                        permission: ["QXGL_RZGL_YCJQYJGL_JQYJFA"]
+                        // layout: "page"
+                    }
+                },
+                {
+                    path: "auth-earlywarning-info",
+                    component: () => import("@/pages/log-manage/err-auth-earlywarning-manage/auth-earlywarning-info"),
+                    name: "auth-earlywarning-info",
+                    meta: {
+                        title: "鉴权预警信息",
+                        noCache: false,
+                        permission: ["QXGL_RZGL_YCJQYJGL_JQYJXX"]
+                        // layout: "page"
+                    }
+                }
+            ]
+        },
+        {
+          path: "auth-risk-detection",
+          component: () => import("@/pages/log-manage/auth-risk-detection/index"),
+          name: "auth-risk-detection",
+          meta: {
+            title: "鉴权风险检测",
+            noCache: false,
+            permission: ['QXGL_RZGL_JQFXJC']
+          }
+        },
+        {
+            path: "/permiss-log-manage",
+            component: common,
+            name: "common",
+            redirect: "/permiss-log-manage",
+            alwaysShow: true,
+            meta: { title: "权限日志管理", icon: "el-icon-goods", noCache: true, permission: ["QXGL_RZGL_QXRZGL"] },
+            children: [
+                {
+                    path: "auth-manage-log",
+                    component: () => import("@/pages/log-manage/permiss-log-manage/auth-manage-log"),
+                    name: "auth-manage-log",
+                    meta: {
+                        title: "授权管理日志",
+                        noCache: false,
+                        permission: ["QXGL_RZGL_QXRZGL_SQGLRZ"]
+                    }
+                },
+                {
+                    path: "auth-service-log",
+                    component: () => import("@/pages/log-manage/permiss-log-manage/auth-service-log"),
+                    name: "auth-service-log",
+                    meta: {
+                        title: "鉴权服务日志",
+                        noCache: false,
+                        permission: ["QXGL_RZGL_QXRZGL_JQFWRZ"]
+                    }
+                },
+                {
+                    path: "auth-risk-log",
+                    component: () => import("@/pages/log-manage/permiss-log-manage/auth-risk-log"),
+                    name: "auth-risk-log",
+                    meta: {
+                        title: "鉴权风险日志",
+                        noCache: false,
+                        permission: ["QXGL_RZGL_QXRZGL_JQFXRZ"]
+                    }
+                }
+            ]
+        },
+        {
+            path: "/auth-behavior-statistic",
+            component: common,
+            name: "common",
+            redirect: "/index",
+            meta: { title: "鉴权行为分析", icon: "el-icon-goods", noCache: true, permission: ["QXGL_RZGL_JQXWTJ"] },
+            children: [
+                {
+                    path: "index",
+                    component: () => import("@/pages/log-manage/auth-behavior-statistic"),
+                    name: "auth-behavior-statistic",
+                    meta: { title: "鉴权行为分析", icon: "el-icon-goods", noCache: true, permission: ["QXGL_RZGL_JQXWTJ"] }
+                }
+            ]
+        }
+    ]
+};
+
+export default componentsRouter;