XiaXxxxxx 2 lat temu
rodzic
commit
126ac5fab9

+ 18 - 1
src/api/sys/log.ts

@@ -1,7 +1,8 @@
 import { defHttp } from '/@/utils/http/axios';
 
 enum Api {
-    SelecteLogin = '/base-center/syslog/SelecteLogin'
+    SelecteLogin = '/base-center/syslog/SelecteLogin',
+    Select = '/base-center/syslog/Select'
 }
 
 /**
@@ -18,4 +19,20 @@ export const getLoginList = (params) => {
             resolve(res)
         })
     })
+};
+
+/**
+ * @description: 查询操作日志
+ * @param: page:页数    must
+ * @param: rows:每页数据条数    must
+ * @param: keyStr:模糊查询关键字
+ * @param: startCreateTimeStr:操作开始时间
+ * @param: endCreateTimeStr:操作结束时间 
+ */
+export const getSelectList = (params) => {
+    return new Promise<void>((resolve) => {
+        defHttp.post({ url: Api.Select, params: params }).then((res) => {
+            resolve(res)
+        })
+    })
 };

+ 0 - 208
src/views/dataAdmin/dataAdmin/version/TagDrawer.vue

@@ -1,208 +0,0 @@
-<template>
-    <a-drawer :title="title" :visible="true" :width="540" :body-style="{ paddingBottom: '80px' }"
-        :footer-style="{ textAlign: 'right' }" @close="onClose">
-        <a-form ref="formRef" :model="form" :rules="rules" :label-col="labelCol" :wrapper-col="wrapperCol">
-            <!-- 名称 -->
-            <a-form-item label="标签名称" name="name">
-                <a-input v-model:value="form.name" style="width: 100%" placeholder="请输入名称" />
-            </a-form-item>
-            <!-- 编码 -->
-            <a-form-item label="标签编码" name="code">
-                <a-input v-model:value="form.code" style="width: 100%" placeholder="根据名称生成" disabled />
-            </a-form-item>
-            <!-- 类型 -->
-            <a-form-item label="标签类型" name="type">
-                <a-select v-model:value="form.type" style="width: 100%" :options="selectOptions">
-                </a-select>
-            </a-form-item>
-            <!-- 排序 -->
-            <a-form-item label="标签排序" name="px">
-                <a-input v-model:value="form.px" style="width: 100%" placeholder="请输入序号" />
-            </a-form-item>
-        </a-form>
-        <div :style="{
-            position: 'absolute',
-            right: 0,
-            bottom: 0,
-            width: '100%',
-            borderTop: '1px solid #e9e9e9',
-            padding: '10px 16px',
-            background: '#fff',
-            textAlign: 'right',
-            zIndex: 1,
-        }">
-            <a-button style="margin-right: 8px" @click="onClose">取消</a-button>
-            <a-button type="primary" @click="onSubmit">确定</a-button>
-        </div>
-    </a-drawer>
-</template>
-<script>
-import { defineComponent, reactive, ref, onMounted, watch } from 'vue';
-import { message } from 'ant-design-vue';
-import { getAllTagsType, generateCodeByName, addTag, updateTag, checkTagCode } from '/@/api/sys/tag';
-import { session } from '/@/utils/Memory';
-
-const props = {
-    formData: {
-        type: Object,
-        default: () => {
-            return {}
-        }
-    },
-    drawerTitle: {
-        type: String,
-        default: "新增岗位"
-    }
-}
-export default defineComponent({
-    name: 'TagDrawer',
-    components: {},
-    props,
-    setup(props, { emit }) {
-        const form = reactive({
-            id: "",
-            name: "",
-            code: "",
-            codeName: "",
-            type: "",
-            px: "",
-        });
-        const rules = {
-            name: [{
-                required: true,
-                message: '请输入标签名称',
-                trigger: 'blur'
-            }],
-            // code: [{
-            //     required: true,
-            //     message: '请输入标签编码',
-            //     trigger: 'blur'
-            // }],
-            type: [{
-                required: true,
-                message: '请选择标签类型',
-                trigger: 'blur'
-            }],
-            px: [{
-                required: true,
-                message: '请输入标签排序',
-                trigger: 'blur'
-            }]
-        };
-        const title = ref(props.drawerTitle)
-        const formRef = ref()
-        const selectOptions = ref([])
-
-        onMounted(() => {
-            if (Object.keys(props.formData).length) {
-                for (let key in form) {
-                    form[key] = props.formData[key]
-                }
-            };
-            getTagsType();
-        })
-
-        watch(
-            () => [props.formData, props.drawerTitle],
-            ([newF, newD]) => {
-                for (let key in form) {
-                    form[key] = props.formData[key]
-                }
-                title.value = newD
-            },
-            {
-                immediate: true,
-                deep: true
-            }
-        )
-        //获取所有标签类型
-        const getTagsType = () => {
-            let param = {
-                1: session.getItem('tokenV2')
-            }
-            getAllTagsType(param).then(res => {
-                let resData = JSON.parse(res.result)
-                resData.forEach((item, index) => {
-                    selectOptions.value.push({
-                        value: item.TYPE,
-                        label: item.TYPE
-                    })
-                })
-            })
-        }
-        // 关闭弹窗
-        const onClose = () => {
-            emit('closeDialog')
-            resetForm()
-        };
-        // 提交信息
-        const onSubmit = () => {
-            formRef.value.validate().then(() => {
-                //此处调用新增
-                if (title.value === '新增标签') {
-                    form.id = undefined;
-                    form.codeName = undefined;
-                    //名称生成code
-                    let param1 = {
-                        1: session.getItem('tokenV2'),
-                        2: form.name
-                    }
-                    generateCodeByName(param1).then(res1 => {
-                        form.code = res1.result
-                        //检查code是否重复
-                        let param2 = {
-                            1: session.getItem('tokenV2'),
-                            2: form.code
-                        }
-                        checkTagCode(param2).then(res2 => {
-                            if (res2.result === 'true') {
-                                // 添加标签
-                                let param3 = {
-                                    1: session.getItem('tokenV2'),
-                                    2: JSON.stringify([form])
-                                }
-                                addTag(param3).then(res3 => {
-                                    message.success('操作成功')
-                                    resetForm()
-                                    emit('onSubmit', true)
-                                })
-                            } else {
-                                message.error('code重复')
-                                resetForm()
-                            }
-                        })
-                    })
-                } else {
-                    let param = {
-                        1: session.getItem('tokenV2'),
-                        2: JSON.stringify([form])
-                    }
-                    updateTag(param).then(res => {
-                        message.success('操作成功')
-                        resetForm()
-                        emit('onSubmit', true)
-                    })
-                }
-            }).catch((error) => {
-                console.log('error', error);
-            });
-        };
-        // 重置表单
-        const resetForm = () => {
-            formRef.value.resetFields();
-        };
-        return {
-            form,
-            rules,
-            title,
-            formRef,
-            labelCol: { span: 6 },
-            wrapperCol: { span: 18 },
-            selectOptions,
-            onClose,
-            onSubmit,
-            resetForm
-        };
-    },
-});
-</script>

+ 161 - 0
src/views/dataAdmin/dataAdmin/version/VersionDrawer.vue

@@ -0,0 +1,161 @@
+<template>
+    <a-drawer :title="title" :visible="true" :width="540" :body-style="{ paddingBottom: '80px' }"
+        :footer-style="{ textAlign: 'right' }" @close="onClose">
+        <a-form ref="formRef" :model="form" :rules="rules" :label-col="labelCol" :wrapper-col="wrapperCol">
+            <!-- 名称 -->
+            <a-form-item label="版本名称" name="name">
+                <a-input v-model:value="form.name" style="width: 100%" placeholder="请输入名称" />
+            </a-form-item>
+            <!-- 说明 -->
+            <a-form-item label="版本说明" name="description">
+                <a-input v-model:value="form.description" style="width: 100%" placeholder="请输入说明" />
+            </a-form-item>
+        </a-form>
+        <div :style="{
+            position: 'absolute',
+            right: 0,
+            bottom: 0,
+            width: '100%',
+            borderTop: '1px solid #e9e9e9',
+            padding: '10px 16px',
+            background: '#fff',
+            textAlign: 'right',
+            zIndex: 1,
+        }">
+            <a-button style="margin-right: 8px" @click="onClose">取消</a-button>
+            <a-button type="primary" @click="onSubmit">确定</a-button>
+        </div>
+    </a-drawer>
+</template>
+<script>
+import { defineComponent, reactive, ref, onMounted, watch } from 'vue';
+import { message } from 'ant-design-vue';
+import { addVersion, updateVersion } from '/@/api/sys/version';
+import { session } from '/@/utils/Memory';
+import moment from 'moment';
+
+const props = {
+    formData: {
+        type: Object,
+        default: () => {
+            return {}
+        }
+    },
+    drawerTitle: {
+        type: String,
+        default: "新增版本"
+    }
+}
+export default defineComponent({
+    name: 'VersionDrawer',
+    components: {},
+    props,
+    setup(props, { emit }) {
+        const form = reactive({
+            dataVersionConfs: [],
+            description: "",
+            insertTime: "",
+            name: "",
+            type: "",
+            updateTime: "",
+            vid: "",
+        });
+        const rules = {
+            name: [{
+                required: true,
+                message: '请输入版本名称',
+                trigger: 'blur'
+            }],
+            description: [{
+                required: true,
+                message: '请选择版本说明',
+                trigger: 'blur'
+            }]
+        };
+        const title = ref(props.drawerTitle)
+        const formRef = ref()
+
+        onMounted(() => {
+            if (Object.keys(props.formData).length) {
+                for (let key in form) {
+                    form[key] = props.formData[key]
+                }
+            };
+        })
+
+        watch(
+            () => [props.formData, props.drawerTitle],
+            ([newF, newD]) => {
+                for (let key in form) {
+                    form[key] = props.formData[key]
+                }
+                title.value = newD
+            },
+            {
+                immediate: true,
+                deep: true
+            }
+        )
+        // 关闭弹窗
+        const onClose = () => {
+            emit('closeDialog')
+            resetForm()
+        };
+        // 提交信息
+        const onSubmit = () => {
+            formRef.value.validate().then(() => {
+                //此处调用新增
+                if (title.value === '新增版本') {
+                    let { name, description } = form
+                    //新增版本
+                    let param = {
+                        1: session.getItem('tokenV2'),
+                        2: JSON.stringify({ name: name, description: description })
+                    }
+                    addVersion(param).then(res => {
+                        if (res.status === "0") {
+                            message.success('操作成功')
+                            resetForm()
+                            emit('onSubmit', true)
+                        } else {
+                            message.error('操作失败')
+                        }
+                    })
+                } else {
+                    form.updateTime = moment().format('YYYY-MM-DD HH:mm:ss')
+                    let param = {
+                        1: session.getItem('tokenV2'),
+                        2: JSON.stringify(form)
+                    }
+                    updateVersion(param).then(res => {
+                        if (res.status === "0") {
+                            message.success('操作成功')
+                            resetForm()
+                            emit('onSubmit', true)
+                        } else {
+                            message.error('操作失败')
+                        }
+                    })
+                }
+            }).catch((error) => {
+                console.log('error', error);
+            });
+        };
+        // 重置表单
+        const resetForm = () => {
+            formRef.value.resetFields();
+        };
+        return {
+            form,
+            rules,
+            title,
+            formRef,
+            labelCol: { span: 6 },
+            wrapperCol: { span: 18 },
+            onClose,
+            onSubmit,
+            resetForm
+        };
+    },
+});
+</script>

+ 72 - 0
src/views/dataAdmin/dataAdmin/version/VersionModal.vue

@@ -0,0 +1,72 @@
+<template>
+    <a-modal 
+        :visible="true" 
+        :width="width" 
+        :maskClosable="false" 
+        :destroyOnClose="true"
+        :title="title" 
+        :footer="null"
+        :wrapClassName="wrapClassName"
+        @cancel="onClose" 
+    >
+        <slot name="modalContent"></slot>
+    </a-modal>
+</template>
+<script>
+import { defineComponent, reactive, ref, onMounted, watch, toRefs } from 'vue';
+import { message } from 'ant-design-vue';
+import moment from 'moment';
+
+const props = {
+    width: {
+        type: String,
+        default: '1000px'
+    },
+    title:{
+        type:String,
+        default:"版本资源"
+    },
+    wrapClassName:{
+        type:String,
+        default:""
+    }
+}
+export default defineComponent({
+    name: 'modal',
+    components: {},
+    props,
+    setup(props, { emit }) {
+        const propsData = reactive({
+            width: props.width,
+            title: props.title,
+            wrapClassName:props.wrapClassName
+        })
+        watch(
+            () => props.width,
+            (val) => {
+                propsData.width = val
+            }
+        )
+        watch(
+            () => props.title,
+            (val) => {
+                propsData.title = val
+            }
+        )
+        watch(
+            () => props.wrapClassName,
+            (val) => {
+                propsData.wrapClassName = val
+            }
+        )
+        const onClose = (e) => {
+            emit('closeModal')
+        }
+        return {
+            ...toRefs(propsData),
+            //func
+            onClose
+        };
+    },
+});
+</script>

+ 127 - 57
src/views/dataAdmin/dataAdmin/version/index.vue

@@ -4,24 +4,18 @@
             <div class="version-title">版本管理</div>
             <div class="handle-btns">
                 <span class="label">版本名称:</span>
-                <!-- <a-select v-model:value="searchType" style="width: 120px">
-                    <a-select-option value="name">标签名称</a-select-option>
-                    <a-select-option value="code">标签编码</a-select-option>
-                    <a-select-option value="type">标签类型</a-select-option>
-                    <a-select-option value="time">创建时间</a-select-option>
-                </a-select> -->
                 <a-input v-model:value="searchValue" placeholder="输入关键字查询" allow-clear />
                 <a-button class="btn" type="primary" @click="searchTable">查询</a-button>
             </div>
         </div>
         <div class="version-body">
             <div class="body-header">
-                <div class="item-title">标签列表</div>
+                <div class="item-title">版本列表</div>
                 <div class="table-btns">
-                    <a-button class="btn" type="primary" @click="getTagsData" title="刷新">
+                    <a-button class="btn" type="primary" @click="getVersionData" title="刷新">
                         <RedoOutlined />
                     </a-button>
-                    <a-button class="btn" type="primary" @click="openDialog('add', {})">新增标签</a-button>
+                    <a-button class="btn" type="primary" @click="openDialog('add', {})">新增版本</a-button>
                     <a-popconfirm :title="delAllBtnTitle" @confirm="delAllData">
                         <a-button class="btn" :disabled="!hasSelected">批量删除</a-button>
                     </a-popconfirm>
@@ -31,41 +25,42 @@
                 <a-table :row-selection="{ selectedRowKeys: selectedRowKeys, onChange: onSelectChange }" :columns="columns"
                     :data-source="tableData" :bordered="true" @change="tableChange">
                     <template #operation="{ record }">
-                        <a-tooltip title="编辑" color="yellow">
-                            <a @click="openDialog('edit', record)">
-                                <EditOutlined />
-                            </a>
-                        </a-tooltip>
-                        <a-popconfirm v-if="tableData.length" title="确定删除该标签?" @confirm="onDelete(record.id)">
-                            <a-tooltip title="删除" color="red">
-                                <a>
-                                    <DeleteOutlined />
-                                </a>
-                            </a-tooltip>
+                        <a @click="openModal(record.vid)">查看</a>
+                        <a @click="openDialog('edit', record)">编辑</a>
+                        <a-popconfirm v-if="tableData.length" title="确定删除该版本?" @confirm="onDelete(record.vid)">
+                            <a>删除</a>
                         </a-popconfirm>
                     </template>
                 </a-table>
             </div>
         </div>
-        <TagDrawer v-if="ifShowDialog" @closeDialog="ifShowDialog = false" :formData="formData" :drawerTitle="drawerTitle"
-            @onSubmit="onSubmit" ref="drawerRef">
-        </TagDrawer>
+        <VersionDrawer v-if="ifShowDialog" @closeDialog="ifShowDialog = false" :formData="formData"
+            :drawerTitle="drawerTitle" @onSubmit="onSubmit" ref="drawerRef">
+        </VersionDrawer>
+        <VersionModal v-if="ifShowModal" @closeModal="ifShowModal = false" :width="modalWidth" :title="sourcesTableTitle">
+            <template #modalContent>
+                <div class="sources-body" style="padding: 20px;">
+                    <div class="sources-title" style="margin-bottom: 20px;font-size: 16px;">资源列表</div>
+                    <a-table :columns="sourcesColumns" :data-source="sourcesTableData" :bordered="true"></a-table>
+                </div>
+            </template>
+        </VersionModal>
     </div>
 </template>
 
 <script>
 import { defineComponent, reactive, ref, toRefs, computed, onMounted, watch } from 'vue';
-import TagDrawer from './TagDrawer.vue';
-import { getAllTags, deleteTag } from '/@/api/sys/tag';
-import { getVersionList, delVersionByIds } from '/@/api/sys/version';
+import VersionDrawer from './VersionDrawer.vue';
+import VersionModal from './VersionModal.vue';
+import { getVersionList, delVersionByIds, getVersionDetail } from '/@/api/sys/version';
 import { message } from 'ant-design-vue';
-import { EditOutlined, DeleteOutlined, RedoOutlined } from '@ant-design/icons-vue';
+import { RedoOutlined } from '@ant-design/icons-vue';
 import moment from 'moment'
 import { session } from '/@/utils/Memory';
 
 export default defineComponent({
     name: 'version',
-    components: { TagDrawer, EditOutlined, DeleteOutlined, RedoOutlined },
+    components: { VersionDrawer, RedoOutlined, VersionModal },
     setup() {
         const drawerRef = ref(null)
         onMounted(() => {
@@ -74,19 +69,59 @@ export default defineComponent({
         const data = reactive({
             tableData: [],//表格数据
             selectedRowKeys: [],//选中的key
-            searchType: "name",//查询类型
             searchValue: "",//查询值
             formData: {
-                id: "",
+                dataVersionConfs: [],
+                description: "",
+                insertTime: "",
                 name: "",
-                codeName: "",
-                code: "",
                 type: "",
-                px: "",
+                updateTime: "",
+                vid: "",
             },
-            drawerTitle: "新增标签",
-            ifShowDialog: false
+            drawerTitle: "新增版本",
+            ifShowDialog: false,
+            ifShowModal: false
         });
+        //资源列表数据
+        const sourcesData = reactive({
+            sourcesTableData: [],//资源表格数据
+            sourcesColumns: [
+                {
+                    title: '资源ID',
+                    align: 'center',
+                    dataIndex: 'rid',
+                    key: 'rid'
+                },
+                {
+                    title: '版本号',
+                    align: 'center',
+                    dataIndex: 'versionNum',
+                    key: 'versionNum'
+                },
+                {
+                    title: '最新版本',
+                    align: 'center',
+                    dataIndex: 'isNew',
+                    key: 'isNew'
+                },
+                {
+                    title: '发布时间',
+                    align: 'center',
+                    dataIndex: 'insertTime',
+                    key: 'insertTime'
+                },
+                {
+                    title: '修改时间',
+                    align: 'center',
+                    dataIndex: 'updateTime',
+                    key: 'updateTime'
+                },
+            ],
+            sourcesTableTitle: "",
+            modalWidth: '1200px',
+            wrapClassName: "sources-body"
+        })
         //获取所有标签
         const getVersionData = () => {
             data.tableData = []
@@ -177,15 +212,19 @@ export default defineComponent({
         const delAllBtnTitle = computed(() => `确定删除${data.selectedRowKeys.length}个版本?`)
         //删除所有选中的数据
         const delAllData = () => {
+            let ids = ''
+            data.selectedRowKeys.forEach(item => {
+                ids += item + ','
+            })
             let param = {
                 1: session.getItem('tokenV2'),
-                2: JSON.stringify({}),
-                3: JSON.stringify(data.selectedRowKeys)
+                2: ids,
             }
-            deleteTag(param).then(res => {
-                message.success('操作成功');
-                getTagsData();
-                data.selectedRowKeys = [];
+            delVersionByIds(param).then(res => {
+                if (res.status === "0") {
+                    message.success('操作成功');
+                    getVersionData();
+                }
             })
         };
         //表格行选中事件
@@ -196,25 +235,27 @@ export default defineComponent({
         const openDialog = (flag, record) => {
             if (flag === 'add') {
                 data.formData = {
-                    id: "",
+                    dataVersionConfs: [],
+                    description: "",
+                    insertTime: "",
                     name: "",
-                    codeName: "",
-                    code: "",
                     type: "",
-                    px: "",
+                    updateTime: "",
+                    vid: "",
                 }
-                data.drawerTitle = '新增标签'
+                data.drawerTitle = '新增版本'
                 data.ifShowDialog = true
             } else {
                 data.formData = {
-                    id: record.id,
+                    dataVersionConfs: record.dataVersionConfs,
+                    description: record.description,
+                    insertTime: record.insertTime,
                     name: record.name,
-                    code: record.code,
-                    codeName: record.codeName,
                     type: record.type,
-                    px: record.px,
+                    updateTime: record.updateTime,
+                    vid: record.vid,
                 }
-                data.drawerTitle = '修改标签'
+                data.drawerTitle = '修改版本'
                 data.ifShowDialog = true
             }
         }
@@ -222,19 +263,46 @@ export default defineComponent({
         const onDelete = (id) => {
             let param = {
                 1: session.getItem('tokenV2'),
-                2: JSON.stringify({}),
-                3: JSON.stringify([id])
+                2: id,
             }
-            deleteTag(param).then(res => {
-                message.success('操作成功');
-                getTagsData();
+            delVersionByIds(param).then(res => {
+                if (res.status === "0") {
+                    message.success('操作成功');
+                    getVersionData();
+                }
+            })
+        }
+        //打开弹窗展示资源
+        const openModal = (id) => {
+            let param = {
+                1: session.getItem('tokenV2'),
+                2: id,
+            }
+            getVersionDetail(param).then(res => {
+                if (res.status === "0") {
+                    let resData = JSON.parse(res.result)
+                    if (resData.dataVersionConfs.length) {
+                        sourcesData.sourcesTableData = []
+                        sourcesData.sourcesTableTitle = `版本:${resData.name}`
+                        resData.dataVersionConfs.forEach(item => {
+                            sourcesData.sourcesTableData.push({
+                                isNew: item.active === 'N' ? '否' : '是',
+                                key: item.id,
+                                ...item
+                            })
+                        })
+                        data.ifShowModal = true
+                    } else {
+                        message.info('该版本暂无资源')
+                    }
+                }
             })
         }
         //弹窗确认
         const onSubmit = (e) => {
             data.ifShowDialog = false
             if (e) {
-                getTagsData();
+                getVersionData();
             }
         }
         return {
@@ -244,12 +312,14 @@ export default defineComponent({
             hasSelected,
             delAllBtnTitle,
             ...toRefs(data),
+            ...toRefs(sourcesData),
             // func
             getVersionData,
             tableChange,
             searchTable,
             delAllData,
             onDelete,
+            openModal,
             onSelectChange,
             openDialog,
             onSubmit

+ 125 - 36
src/views/systemAdmin/system/log/operate/OperateDrawer.vue

@@ -1,41 +1,130 @@
 <template>
-  <BasicDrawer v-bind="$attrs" @register="registerDrawer" title="操作日志详情" width="40%">
-    <BasicForm @register="registerForm" />
-  </BasicDrawer>
+    <a-drawer :title="title" :visible="true" :width="540" :body-style="{ paddingBottom: '80px' }"
+        :footer-style="{ textAlign: 'right' }" @close="onClose">
+        <a-form ref="formRef" :model="form" :label-col="labelCol" :wrapper-col="wrapperCol">
+            <!-- 名称 -->
+            <a-form-item label="记录id" name="ID">
+                <a-input v-model:value="form.ID" style="width: 100%" placeholder="根据名称生成" disabled />
+            </a-form-item>
+            <!-- 编码 -->
+            <a-form-item label="用户名称" name="USERNAME">
+                <a-input v-model:value="form.USERNAME" style="width: 100%" placeholder="根据名称生成" disabled />
+            </a-form-item>
+            <!-- 排序 -->
+            <a-form-item label="用户id" name="USERID">
+                <a-input v-model:value="form.USERID" style="width: 100%" placeholder="根据名称生成" disabled />
+            </a-form-item>
+            <!-- 排序 -->
+            <a-form-item label="操作类型" name="OPT">
+                <a-input v-model:value="form.OPT" style="width: 100%" placeholder="根据名称生成" disabled />
+            </a-form-item>
+            <!-- 排序 -->
+            <a-form-item label="操作说明" name="CZSM">
+                <a-input v-model:value="form.CZSM" style="width: 100%" placeholder="根据名称生成" disabled />
+            </a-form-item>
+            <!-- 排序 -->
+            <a-form-item label="是否成功" name="SFCG">
+                <a-input v-model:value="form.SFCG" style="width: 100%" placeholder="根据名称生成" disabled />
+            </a-form-item>
+            <!-- 排序 -->
+            <a-form-item label="创建时间" name="CJRQ">
+                <a-input v-model:value="form.CJRQ" style="width: 100%" placeholder="根据名称生成" disabled />
+            </a-form-item>
+        </a-form>
+        <div :style="{
+            position: 'absolute',
+            right: 0,
+            bottom: 0,
+            width: '100%',
+            borderTop: '1px solid #e9e9e9',
+            padding: '10px 16px',
+            background: '#fff',
+            textAlign: 'right',
+            zIndex: 1,
+        }">
+            <a-button style="margin-right: 8px" @click="onClose">取消</a-button>
+            <a-button type="primary" @click="onSubmit">确定</a-button>
+        </div>
+    </a-drawer>
 </template>
-<script lang="ts">
-  import { defineComponent } from 'vue';
-  import { BasicForm, useForm } from '/@/components/Form';
-  import { formSchema } from './config.data';
-  import { BasicDrawer, useDrawerInner } from '/@/components/Drawer';
-  import { getLogManageDetail } from '/@/api/log/logManager';
-  import moment from 'moment';
+<script>
+import { defineComponent, reactive, ref, onMounted, watch } from 'vue';
 
-  export default defineComponent({
-    name: 'ContactDrawer',
-    components: { BasicDrawer, BasicForm },
-    emits: ['success', 'register'],
-    setup(_) {
-      const [registerForm, { setFieldsValue, resetFields }] = useForm({
-        labelWidth: 120,
-        schemas: formSchema,
-        showActionButtonGroup: false,
-      });
+const props = {
+    formData: {
+        type: Object,
+        default: () => {
+            return {}
+        }
+    },
+    drawerTitle: {
+        type: String,
+        default: "操作记录详情"
+    }
+}
+export default defineComponent({
+    name: 'OperateDrawer',
+    components: {},
+    props,
+    setup(props, { emit }) {
+        const form = reactive({
+            ID: "",
+            USERNAME: "",
+            USERID: "",
+            OPT: "",
+            CZSM: "",
+            SFCG: 0,
+            CJRQ: "",
+        });
+        const title = ref(props.drawerTitle)
+        const formRef = ref()
+
+        onMounted(() => {
+            if (Object.keys(props.formData).length) {
+                for (let key in form) {
+                    form[key] = props.formData[key]
+                }
+                form.SFCG = form.SFCG === 0?'失败':'成功'
+            };
+        })
 
-      const [registerDrawer, { setDrawerProps }] = useDrawerInner(async (data) => {
-        await resetFields();
-        setDrawerProps({ confirmLoading: false });
-        const res = await getLogManageDetail(data.record.id);
-        const createdTime = moment(data.record.createdTime).format('YYYY-MM-DD');
-        const actionData = JSON.stringify(res.actionData);
-        await setFieldsValue(res || data.record);
-        await setFieldsValue({ actionData });
-        await setFieldsValue({ createdTime });
-      });
-      return {
-        registerDrawer,
-        registerForm,
-      };
+        watch(
+            () => [props.formData, props.drawerTitle],
+            ([newF, newD]) => {
+                for (let key in form) {
+                    form[key] = props.formData[key]
+                }
+                form.SFCG = form.SFCG === 0?'失败':'成功'
+                title.value = newD
+            },
+            {
+                immediate: true,
+                deep: true
+            }
+        )
+        // 关闭弹窗
+        const onClose = () => {
+            emit('closeDialog')
+            resetForm()
+        };
+        // 提交信息
+        const onSubmit = () => {
+            onClose();
+        };
+        // 重置表单
+        const resetForm = () => {
+            formRef.value.resetFields();
+        };
+        return {
+            form,
+            title,
+            formRef,
+            labelCol: { span: 6 },
+            wrapperCol: { span: 18 },
+            onClose,
+            onSubmit,
+            resetForm
+        };
     },
-  });
-</script>
+});
+</script>

+ 0 - 217
src/views/systemAdmin/system/log/operate/config.data.ts

@@ -1,217 +0,0 @@
-import { BasicColumn, FormSchema } from '/@/components/Table';
-import moment from 'moment';
-import { findDictItemByCode } from '/@/api/system/dict';
-import { format } from '../util';
-import { Tag } from 'ant-design-vue';
-import { h } from 'vue';
-
-//格式化资源类型和操作类型
-let formatText;
-let actionTypeText;
-
-async function formatTextFunc() {
-  formatText = await findDictItemByCode({ dictCode: 'operate_log' });
-  actionTypeText = await findDictItemByCode({ dictCode: 'exception_log' });
-}
-formatTextFunc();
-// 表格数据
-export const columns: BasicColumn[] = [
-  {
-    title: '租户名称',
-    dataIndex: 'tenantName',
-    width: 120,
-  },
-  {
-    title: '客户名称',
-    dataIndex: 'customerName',
-    width: 120,
-  },
-  {
-    title: '资源类型',
-    dataIndex: 'entityType',
-    width: 180,
-    format: (_, record) => {
-      const text = formatText.find((f) => {
-        if (f.itemValue == record.entityType) {
-          return f.itemText;
-        }
-      });
-      return text?.itemText;
-    },
-  },
-  {
-    title: '资源名称',
-    dataIndex: 'entityName',
-    width: 180,
-  },
-  {
-    title: '操作人员',
-    dataIndex: 'userName',
-    width: 180,
-  },
-  {
-    title: '操作类型',
-    dataIndex: 'actionType',
-    width: 180,
-    format: (_, record) => {
-      const text = actionTypeText.find((f) => {
-        if (f.itemValue == record.actionType) {
-          return f.itemText;
-        }
-      });
-      return text?.itemText;
-    },
-  },
-  {
-    title: '操作状态',
-    dataIndex: 'actionStatus',
-    width: 180,
-    customRender: ({ record }) => {
-      const status = record.actionStatus;
-      const enable = status === 'SUCCESS' ? '成功' : '失败';
-      const color = enable === '成功' ? 'green' : 'red';
-      const text = enable === '成功' ? '成功' : '失败';
-      return h(Tag, { color }, () => text);
-    },
-  },
-  {
-    title: '操作时间',
-    dataIndex: 'createdTime',
-    width: 180,
-    format: (_, record) => {
-      return format(record.createdTime, 'yyyy-MM-dd HH:mm:ss');
-    },
-  },
-];
-
-// 分页查询
-export const searchFormSchema: FormSchema[] = [
-  {
-    field: 'entityType',
-    label: '资源类型',
-    component: 'ApiSelect',
-    componentProps: {
-      api: findDictItemByCode,
-      params: {
-        dictCode: 'operate_log',
-      },
-      labelField: 'itemText',
-      valueField: 'itemValue',
-    },
-    colProps: { span: 6 },
-  },
-  {
-    field: 'actionType',
-    label: '操作类型',
-    component: 'ApiSelect',
-    componentProps: {
-      api: findDictItemByCode,
-      params: {
-        dictCode: 'exception_log',
-      },
-      labelField: 'itemText',
-      valueField: 'itemValue',
-    },
-    colProps: { span: 6 },
-  },
-  {
-    field: 'queryTime',
-    label: '查询时间',
-    component: 'RangePicker',
-    componentProps: {
-      showTime: {
-        defaultValue: [moment('00:00:00', 'HH:mm:ss'), moment('23:59:59', 'HH:mm:ss')],
-      },
-    },
-    colProps: { span: 6 },
-  },
-];
-
-// 详情配置
-export const formSchema: FormSchema[] = [
-  {
-    field: 'createdTime',
-    label: '操作时间',
-    component: 'Input',
-    componentProps: {
-      disabled: true,
-    },
-  },
-  {
-    field: 'tenantName',
-    label: '租户名称',
-    component: 'Input',
-    componentProps: {
-      disabled: true,
-    },
-  },
-  {
-    field: 'customerName',
-    label: '客户名称',
-    component: 'Input',
-    componentProps: {
-      disabled: true,
-    },
-  },
-  {
-    field: 'entityType',
-    label: '资源类型',
-    component: 'Input',
-    componentProps: {
-      disabled: true,
-    },
-  },
-  {
-    field: 'entityName',
-    label: '资源名称',
-    component: 'Input',
-    componentProps: {
-      disabled: true,
-    },
-  },
-  {
-    field: 'userName',
-    label: '操作人员',
-    colProps: { span: 24 },
-    component: 'Input',
-    componentProps: {
-      disabled: true,
-    },
-  },
-  {
-    field: 'actionType',
-    label: '操作类型',
-    component: 'Input',
-    componentProps: {
-      disabled: true,
-    },
-  },
-  {
-    field: 'actionStatus',
-    label: '操作状态',
-    component: 'Input',
-    componentProps: {
-      disabled: true,
-    },
-  },
-  {
-    field: 'actionData',
-    label: '操作数据',
-    component: 'InputTextArea',
-    componentProps: {
-      disabled: true,
-      autosize: true,
-      allowClear: false,
-    },
-  },
-  {
-    field: 'actionFailureDetails',
-    label: '失败信息',
-    component: 'InputTextArea',
-    componentProps: {
-      disabled: true,
-      autosize: true,
-      allowClear: false,
-    },
-  },
-];

+ 281 - 83
src/views/systemAdmin/system/log/operate/index.vue

@@ -1,90 +1,288 @@
 <template>
-  <div>
-    <BasicTable :clickToRowSelect="false" @register="registerTable">
-      <template #toolbar> </template>
-      <template #action="{ record }">
-        <TableAction
-          :actions="[
-            {
-              label: '详情',
-              auth: 'api:yt:log:get',
-              icon: 'clarity:note-edit-line',
-              onClick: handleViewDetail.bind(null, record),
-            },
-          ]"
-        />
-      </template>
-    </BasicTable>
-    <OperateDrawer @register="registerDrawer" @success="handleSuccess" />
-  </div>
+    <div class="p-4">
+        <div class="operate-header">
+            <div class="operate-title">操作日志</div>
+            <div class="handle-btns">
+                <span class="label-item">操作类型:</span>
+                <div class="select-item">
+                    <a-select v-model:value="opt" :options="selectOpt">
+                    </a-select>
+                </div>
+                <span class="label-item">查询时间:</span>
+                <div class="input-item">
+                    <a-range-picker :show-time="{ format: 'HH:mm:ss' }" format="YYYY-MM-DD HH:mm:ss"
+                        :placeholder="['开始时间', '结束时间']" v-model:value="searchDate" />
+                </div>
+                <a-button class="btn" @click="resetForm">重置</a-button>
+                <a-button class="btn" type="primary" @click="searchTable">查询</a-button>
+            </div>
+        </div>
+        <div class="operate-body">
+            <div class="body-header">
+                <div class="item-title">操作日志列表</div>
+                <div class="table-btns">
+                    <a-button class="btn" type="primary" @click="getLoginData" title="刷新">
+                        <RedoOutlined />
+                    </a-button>
+                </div>
+            </div>
+            <div class="body-content">
+                <a-table :columns="columns" :data-source="tableData" :bordered="true">
+                    <template #STATE="{ record }">
+                        <span>{{ record.SFCG ? '成功' : '失败' }}</span>
+                    </template>
+                    <template #operation="{ record }">
+                        <a-tooltip title="详情" color="#2db7f5">
+                            <a @click="openDialog(record)">
+                                <FormOutlined /> 详情
+                            </a>
+                        </a-tooltip>
+                    </template>
+                </a-table>
+            </div>
+        </div>
+        <OperateDrawer v-if="ifShowDialog" @closeDialog="ifShowDialog = false" :formData="formData"
+            :drawerTitle="drawerTitle">
+        </OperateDrawer>
+    </div>
 </template>
 
-<script lang="ts">
-  import { defineComponent } from 'vue';
-  import { BasicTable, useTable, TableAction } from '/@/components/Table';
-  import { useDrawer } from '/@/components/Drawer';
-  import OperateDrawer from './OperateDrawer.vue';
-  import { getOperatePage } from '/@/api/log/logManager';
-  import { searchFormSchema, columns } from './config.data';
-  import { useModal } from '/@/components/Modal';
-
-  export default defineComponent({
-    components: {
-      BasicTable,
-      TableAction,
-      OperateDrawer,
-    },
+<script>
+import { defineComponent, reactive, ref, toRefs, computed, onMounted, watch } from 'vue';
+import OperateDrawer from './OperateDrawer.vue';
+import { getSelectList } from '/@/api/sys/log';
+import { FormOutlined, RedoOutlined } from '@ant-design/icons-vue';
+import moment from 'moment';
+
+export default defineComponent({
+    name: 'operate',
+    components: { OperateDrawer, FormOutlined, RedoOutlined },
     setup() {
-      const [registerModal] = useModal();
-      const [registerTable, { reload }] = useTable({
-        title: '操作日志列表',
-        api: getOperatePage,
-        columns,
-        showIndexColumn: false,
-        clickToRowSelect: false,
-        beforeFetch: (T) => {
-          if (T.actionType == 'ALL') {
-            delete T.actionType;
-          }
-        },
-        formConfig: {
-          labelWidth: 120,
-          schemas: searchFormSchema,
-          fieldMapToTime: [['queryTime', ['startTime', 'endTime'], 'x']],
-        },
-        useSearchForm: true,
-        showTableSetting: true,
-        bordered: true,
-        rowKey: 'id',
-        actionColumn: {
-          width: 200,
-          title: '操作',
-          dataIndex: 'action',
-          slots: { customRender: 'action' },
-          fixed: 'right',
-        },
-      });
-      // 弹框
-      const [registerDrawer, { openDrawer }] = useDrawer();
-
-      // 刷新
-      const handleSuccess = () => {
-        reload();
-      };
-
-      const handleViewDetail = (record) => {
-        openDrawer(true, {
-          isUpdate: true,
-          record,
+        onMounted(() => {
+            getLoginData();
         });
-      };
-      return {
-        handleSuccess,
-        registerTable,
-        registerDrawer,
-        handleViewDetail,
-        registerModal,
-      };
+        const data = reactive({
+            tableData: [],//表格数据
+            formData: {
+                ID: "",
+                USERNAME: "",
+                USERID: "",
+                OPT: "",
+                CZSM: "",
+                SFCG: 0,
+                CJRQ: "",
+            },
+            drawerTitle: "日志记录详情",
+            ifShowDialog: false
+        });
+        const selectOpt = ref([])
+        const searchForm = reactive({
+            opt: "",//查询类型
+            searchDate: [moment().subtract(30, 'days'), moment()],//查询时间
+        })
+        //获取所有日志
+        const getLoginData = () => {
+            data.tableData = []
+            selectOpt.value = []
+            let param = {
+                page: 1,
+                rows: 10000000,
+                startCreateTimeStr: searchForm.searchDate[0].format('YYYY-MM-DD HH:mm:ss'),
+                endCreateTimeStr: searchForm.searchDate[1].format('YYYY-MM-DD HH:mm:ss'),
+                keyStr: searchForm.opt
+            }
+            getSelectList(param).then(res => {
+                if (res.resp_msg === "获取成功!") {
+                    let resData = res.datas.records
+                    let optArr = []
+                    resData.forEach((item, index) => {
+                        optArr.push(item.OPT)
+                        data.tableData.push({
+                            key: item.ID,
+                            ...item
+                        })
+                    })
+                    let set1 = new Set(optArr)
+                    let newArr = [...set1]
+                    newArr.forEach(item => {
+                        selectOpt.value.push({
+                            value: item,
+                            label: item
+                        })
+                    })
+                    searchForm.opt = selectOpt.value[0].value
+                }
+            })
+        }
+        //表格列
+        const columns = [
+            {
+                title: '用户名称',
+                align: 'center',
+                dataIndex: 'USERNAME',
+                key: 'USERNAME',
+                width: "200px"
+            },
+            {
+                title: '用户ID',
+                align: 'center',
+                dataIndex: 'USERID',
+                key: 'USERID',
+                width: "400px"
+            },
+            {
+                title: '操作类型',
+                align: 'center',
+                dataIndex: 'OPT',
+                key: 'OPT',
+                width: "150px"
+            },
+            {
+                title: '操作说明',
+                align: 'center',
+                dataIndex: 'CZSM',
+                key: 'CZSM',
+                width: "320px"
+            },
+            {
+                title: '操作状态',
+                align: 'center',
+                dataIndex: 'SFCG',
+                slots: {
+                    customRender: 'STATE',
+                },
+                width: "100px"
+            },
+            {
+                title: '操作时间',
+                align: 'center',
+                dataIndex: 'CJRQ',
+                key: 'CJRQ',
+                width: "230px"
+            },
+            {
+                title: '操作',
+                align: 'center',
+                dataIndex: 'operation',
+                slots: {
+                    customRender: 'operation',
+                }
+            },
+        ]
+        //重置表格
+        const resetForm = () => {
+            searchForm.opt = selectOpt.value[0].value
+            searchForm.searchDate = [moment().subtract(30, 'days'), moment()]
+        }
+        //表格查询功能
+        const searchTable = () => {
+            getLoginData();
+        }
+        //打开详情弹窗
+        const openDialog = (record) => {
+            data.formData = { ...record }
+            data.drawerTitle = '日志记录详情'
+            data.ifShowDialog = true
+        }
+        return {
+            columns,
+            selectOpt,
+            ...toRefs(data),
+            ...toRefs(searchForm),
+            // func
+            getLoginData,
+            resetForm,
+            searchTable,
+            openDialog
+        };
     },
-  });
+});
 </script>
+
+<style lang="less" scoped>
+.p-4 {
+    height: 100%;
+
+    .operate-header {
+        padding: 10px;
+        width: 100%;
+        height: 70px;
+        background-color: #fff;
+        display: flex;
+        justify-content: space-between;
+        align-items: center;
+
+        .operate-title {
+            font-size: 16px;
+            font-weight: 500;
+            margin-left: 20px;
+            user-select: none;
+        }
+
+        .handle-btns {
+            margin-right: 20px;
+            display: flex;
+            align-items: center;
+
+            .label-item {
+                width: 80px;
+            }
+
+            .select-item {
+                width: 130px;
+            }
+
+            .input-item {
+                width: 350px;
+            }
+
+            .btn {
+                margin-left: 10px;
+            }
+        }
+    }
+
+    .operate-body {
+        padding: 0 30px;
+        margin-top: 20px;
+        width: 100%;
+        // height: 800px;
+        height: calc(100% - 90px);
+        background-color: #fff;
+
+        .body-header {
+            display: flex;
+            height: 80px;
+            width: 100%;
+            justify-content: space-between;
+            align-items: center;
+
+            .item-title {
+                height: 40px;
+                line-height: 40px;
+                font-size: 16px;
+                user-select: none;
+            }
+
+            .table-btns {
+                .btn {
+                    margin-right: 10px;
+
+                    &:last-child {
+                        margin-right: 0;
+                    }
+                }
+            }
+        }
+
+        .body-content {
+            padding-bottom: 20px;
+            height: calc(100% - 80px);
+
+            a {
+                margin-right: 10px;
+            }
+        }
+    }
+}
+</style>

+ 72 - 0
src/views/tips/index.vue

@@ -0,0 +1,72 @@
+<template>
+    <div class="tips">
+        <!-- 顶部面板 -->
+        <div class="top-panel">
+            <!-- 顶部导航菜单 -->
+            <div class="top-navs">
+                <div class="btns" v-for="(item, index) in navBtns">{{ item.name }}</div>
+            </div>
+        </div>
+    </div>
+</template>
+<script>
+import { defineComponent, reactive, ref, toRefs, computed, onMounted, watch } from 'vue';
+
+export default defineComponent({
+    name: 'tips',
+    components: {},
+    setup() {
+        const navBtns = reactive([
+            {
+                name:"待办信息",
+                code:"todo"
+            },
+            {
+                name:"通知消息",
+                code:"message"
+            }
+        ])
+        return {
+            ...toRefs(navBtns)
+        };
+    },
+});
+</script>
+<style lang="less" scoped>
+.tips {
+    position: fixed;
+    right: 16px;
+    bottom: 20px;
+
+    .top-panel {
+        width: 430px;
+        height: 820px;
+        padding: 0 16px;
+
+        .top-navs {
+            width: 100%;
+            height: 50px;
+            border-bottom: 1px solid #DEDEDE;
+            display: flex;
+
+            .btns {
+                margin-right: 32px;
+                width: 100px;
+                height: 22px;
+                font-family: Source Han Sans CN;
+                font-size: 16px;
+                font-weight: 500;
+                line-height: 22px;
+                color: #333333;
+                user-select: none;
+
+                &:hover{
+                    cursor: pointer;
+                    color:#0671DD;
+                    border-bottom: 2px solid #0671DD;
+                }
+            }
+        }
+    }
+}
+</style>