Przeglądaj źródła

refactor: operatelog

xingyu4j 2 lat temu
rodzic
commit
f09a1a4b8e

+ 32 - 2
yudao-ui-admin-vue3/src/api/system/operatelog/index.ts

@@ -1,10 +1,40 @@
 import request from '@/config/axios'
 
+export type OperateLogVO = {
+  id: number
+  userNickname: string
+  traceId: string
+  userId: number
+  module: string
+  name: string
+  type: number
+  content: string
+  exts: object
+  requestMethod: string
+  requestUrl: string
+  userIp: string
+  userAgent: string
+  javaMethod: string
+  javaMethodArgs: string
+  startTime: string
+  duration: number
+  resultCode: number
+  resultMsg: string
+  resultData: string
+}
+export interface OperateLogPageReqVO extends BasePage {
+  module?: string
+  userNickname?: string
+  type?: number
+  success?: boolean
+  startTime?: string[]
+}
+
 // 查询操作日志列表
-export const getOperateLogPageApi = (params) => {
+export const getOperateLogPageApi = (params: OperateLogPageReqVO) => {
   return request.get({ url: '/system/operate-log/page', params })
 }
 // 导出操作日志
-export const exportOperateLogApi = (params) => {
+export const exportOperateLogApi = (params: OperateLogPageReqVO) => {
   return request.download({ url: '/system/operate-log/export', params })
 }

+ 0 - 22
yudao-ui-admin-vue3/src/api/system/operatelog/types.ts

@@ -1,22 +0,0 @@
-export type OperateLogVO = {
-  id: number
-  userNickname: string
-  traceId: string
-  userId: number
-  module: string
-  name: string
-  type: number
-  content: string
-  exts: object
-  requestMethod: string
-  requestUrl: string
-  userIp: string
-  userAgent: string
-  javaMethod: string
-  javaMethodArgs: string
-  startTime: string
-  duration: number
-  resultCode: number
-  resultMsg: string
-  resultData: string
-}

+ 2 - 1
yudao-ui-admin-vue3/src/hooks/web/useVxeCrudSchemas.ts

@@ -20,6 +20,7 @@ export type VxeCrudSchema = {
   primaryType?: VxeColumnPropTypes.Type
   // 是否开启操作栏插槽
   action?: boolean
+  actionWidth?: string
   columns: VxeCrudColumns[]
 }
 type VxeCrudColumns = Omit<VxeTableColumn, 'children'> & {
@@ -204,7 +205,7 @@ const filterTableSchema = (crudSchema: VxeCrudSchema): VxeGridPropTypes.Columns
     const tableSchemaItem = {
       title: t('table.action'),
       field: 'actionbtns',
-      width: '240px',
+      width: crudSchema.actionWidth ? crudSchema.actionWidth : '240px',
       slots: {
         default: 'actionbtns_default'
       }

+ 0 - 5
yudao-ui-admin-vue3/src/views/system/dept/index.vue

@@ -10,11 +10,6 @@ import { DeptVO } from '@/api/system/dept/types'
 import { useMessage } from '@/hooks/web/useMessage'
 import { getListSimpleUsersApi } from '@/api/system/user'
 const message = useMessage()
-interface Tree {
-  id: number
-  name: string
-  children?: Tree[]
-}
 
 const defaultProps = {
   children: 'children',

+ 1 - 0
yudao-ui-admin-vue3/src/views/system/loginlog/loginLog.data.ts

@@ -9,6 +9,7 @@ const crudSchemas = reactive<VxeCrudSchema>({
   primaryKey: 'id',
   primaryType: 'seq',
   action: true,
+  actionWidth: '80px',
   columns: [
     {
       title: '日志类型',

+ 71 - 83
yudao-ui-admin-vue3/src/views/system/operatelog/index.vue

@@ -1,61 +1,16 @@
-<script setup lang="ts">
-import dayjs from 'dayjs'
-import { useTable } from '@/hooks/web/useTable'
-import { allSchemas } from './operatelog.data'
-import { DICT_TYPE } from '@/utils/dict'
-import { useI18n } from '@/hooks/web/useI18n'
-import type { OperateLogVO } from '@/api/system/operatelog/types'
-import * as OperateLogApi from '@/api/system/operatelog'
-import { ref } from 'vue'
-const { t } = useI18n() // 国际化
-// ========== 列表相关 ==========
-const { register, tableObject, methods } = useTable<OperateLogVO>({
-  getListApi: OperateLogApi.getOperateLogPageApi,
-  exportListApi: OperateLogApi.exportOperateLogApi
-})
-// ========== 详情相关 ==========
-const detailRef = ref() // 详情 Ref
-const dialogVisible = ref(false) // 是否显示弹出层
-const dialogTitle = ref(t('action.detail')) // 弹出层标题
-const { getList, setSearchParams, exportList } = methods
-// 详情
-const handleDetail = (row: OperateLogVO) => {
-  // 设置数据
-  detailRef.value = row
-  dialogVisible.value = true
-}
-getList()
-</script>
 <template>
   <ContentWrap>
-    <Search :schema="allSchemas.searchSchema" @search="setSearchParams" @reset="setSearchParams" />
-  </ContentWrap>
-  <ContentWrap>
-    <!-- 操作工具栏 -->
-    <div class="mb-10px">
-      <el-button
-        type="warning"
-        v-hasPermi="['system:operate-log:export']"
-        :loading="tableObject.exportLoading"
-        @click="exportList('操作日志.xls')"
-      >
-        <Icon icon="ep:download" class="mr-5px" /> {{ t('action.export') }}
-      </el-button>
-    </div>
-    <Table
-      :columns="allSchemas.tableColumns"
-      :selection="false"
-      :data="tableObject.tableList"
-      :loading="tableObject.loading"
-      :pagination="{
-        total: tableObject.total
-      }"
-      v-model:pageSize="tableObject.pageSize"
-      v-model:currentPage="tableObject.currentPage"
-      @register="register"
-    >
-      <template #type="{ row }">
-        <DictTag :type="DICT_TYPE.SYSTEM_OPERATE_TYPE" :value="row.type" />
+    <!-- 列表 -->
+    <vxe-grid ref="xGrid" v-bind="gridOptions" class="xtable-scrollbar">
+      <!-- 操作:新增 -->
+      <template #toolbar_buttons>
+        <XButton
+          type="warning"
+          preIcon="ep:download"
+          :title="t('action.export')"
+          v-hasPermi="['system:operate-log:export']"
+          @click="handleExport()"
+        />
       </template>
       <template #duration="{ row }">
         <span>{{ row.duration + 'ms' }}</span>
@@ -63,35 +18,68 @@ getList()
       <template #resultCode="{ row }">
         <span>{{ row.resultCode === 0 ? '成功' : '失败' }}</span>
       </template>
-      <template #startTime="{ row }">
-        <span>{{ dayjs(row.startTime).format('YYYY-MM-DD HH:mm:ss') }}</span>
+      <template #actionbtns_default="{ row }">
+        <!-- 操作:详情 -->
+        <XTextButton preIcon="ep:view" :title="t('action.detail')" @click="handleDetail(row)" />
       </template>
-      <template #action="{ row }">
-        <el-button link type="primary" @click="handleDetail(row)">
-          <Icon icon="ep:view" class="mr-1px" /> {{ t('action.detail') }}
-        </el-button>
-      </template>
-    </Table>
+    </vxe-grid>
   </ContentWrap>
-  <Dialog v-model="dialogVisible" :title="dialogTitle">
-    <!-- 对话框(详情) -->
-    <Descriptions :schema="allSchemas.detailSchema" :data="detailRef">
-      <template #resultCode="{ row }">
-        <span>{{ row.resultCode === 0 ? '成功' : '失败' }}</span>
-      </template>
-      <template #type="{ row }">
-        <DictTag :type="DICT_TYPE.SYSTEM_OPERATE_TYPE" :value="row.type" />
-      </template>
-      <template #duration="{ row }">
-        <span>{{ row.duration + 'ms' }}</span>
-      </template>
-      <template #startTime="{ row }">
-        <span>{{ dayjs(row.startTime).format('YYYY-MM-DD HH:mm:ss') }}</span>
-      </template>
-    </Descriptions>
-    <!-- 操作按钮 -->
+  <!-- 弹窗 -->
+  <XModal id="postModel" v-model="dialogVisible" :title="dialogTitle">
+    <template #default>
+      <!-- 对话框(详情) -->
+      <Descriptions :schema="allSchemas.detailSchema" :data="detailRef">
+        <template #resultCode="{ row }">
+          <span>{{ row.resultCode === 0 ? '成功' : '失败' }}</span>
+        </template>
+        <template #duration="{ row }">
+          <span>{{ row.duration + 'ms' }}</span>
+        </template>
+      </Descriptions>
+    </template>
     <template #footer>
-      <el-button @click="dialogVisible = false">{{ t('dialog.close') }}</el-button>
+      <!-- 按钮:关闭 -->
+      <XButton :loading="actionLoading" :title="t('dialog.close')" @click="dialogVisible = false" />
     </template>
-  </Dialog>
+  </XModal>
 </template>
+<script setup lang="ts">
+// 全局相关的 import
+import { ref } from 'vue'
+import { useI18n } from '@/hooks/web/useI18n'
+import { useVxeGrid } from '@/hooks/web/useVxeGrid'
+import { VxeGridInstance } from 'vxe-table'
+// 业务相关的 import
+import * as OperateLogApi from '@/api/system/operatelog'
+import { allSchemas } from './operatelog.data'
+import download from '@/utils/download'
+
+const { t } = useI18n() // 国际化
+// 列表相关的变量
+const xGrid = ref<VxeGridInstance>() // 列表 Grid Ref
+const { gridOptions } = useVxeGrid<OperateLogApi.OperateLogVO>({
+  allSchemas: allSchemas,
+  getListApi: OperateLogApi.getOperateLogPageApi
+})
+// 弹窗相关的变量
+const dialogVisible = ref(false) // 是否显示弹出层
+const dialogTitle = ref('edit') // 弹出层标题
+const actionLoading = ref(false) // 按钮 Loading
+const detailRef = ref() // 详情 Ref
+// 详情
+const handleDetail = (row: OperateLogApi.OperateLogVO) => {
+  // 设置数据
+  detailRef.value = row
+  dialogVisible.value = true
+}
+
+// 导出操作
+const handleExport = async () => {
+  const queryParams = Object.assign(
+    {},
+    JSON.parse(JSON.stringify(xGrid.value?.getRefMaps().refForm.value.data))
+  )
+  const res = await OperateLogApi.exportOperateLogApi(queryParams)
+  download.excel(res, '岗位列表.xls')
+}
+</script>

+ 77 - 106
yudao-ui-admin-vue3/src/views/system/operatelog/operatelog.data.ts

@@ -1,113 +1,84 @@
 import { reactive } from 'vue'
 import { DICT_TYPE } from '@/utils/dict'
-import { useI18n } from '@/hooks/web/useI18n'
-import { CrudSchema, useCrudSchemas } from '@/hooks/web/useCrudSchemas'
-const { t } = useI18n() // 国际化
-const crudSchemas = reactive<CrudSchema[]>([
-  {
-    label: t('common.index'),
-    field: 'id',
-    type: 'index',
-    form: {
-      show: false
-    }
-  },
-  {
-    label: '操作模块',
-    field: 'module',
-    search: {
-      show: true
-    }
-  },
-  {
-    label: '操作名',
-    field: 'name'
-  },
-  {
-    label: '操作类型',
-    field: 'type',
-    dictType: DICT_TYPE.SYSTEM_OPERATE_TYPE,
-    search: {
-      show: true
-    }
-  },
-  {
-    label: '请求方法名',
-    field: 'requestMethod'
-  },
-  {
-    label: '请求地址',
-    field: 'requestUrl'
-  },
-  {
-    label: '操作人员',
-    field: 'userNickname',
-    search: {
-      show: true
-    }
-  },
-  {
-    label: '操作明细',
-    field: 'content',
-    table: {
-      show: false
-    }
-  },
-  {
-    label: '用户 IP',
-    field: 'userIp',
-    table: {
-      show: false
-    }
-  },
-  {
-    label: 'userAgent',
-    field: 'userAgent'
-  },
-  {
-    label: '操作结果',
-    field: 'resultCode',
-    search: {
-      show: true,
-      component: 'Select',
-      componentProps: {
-        options: [
-          { label: '成功', value: true },
-          { label: '失败', value: false }
-        ]
+import { VxeCrudSchema, useVxeCrudSchemas } from '@/hooks/web/useVxeCrudSchemas'
+
+const crudSchemas = reactive<VxeCrudSchema>({
+  primaryKey: 'id',
+  primaryType: 'seq',
+  action: true,
+  actionWidth: '80px',
+  columns: [
+    {
+      title: '操作模块',
+      field: 'module',
+      isSearch: true
+    },
+    {
+      title: '操作名',
+      field: 'name'
+    },
+    {
+      title: '操作类型',
+      field: 'type',
+      dictType: DICT_TYPE.SYSTEM_OPERATE_TYPE,
+      isSearch: true
+    },
+    {
+      title: '请求方法名',
+      field: 'requestMethod'
+    },
+    {
+      title: '请求地址',
+      field: 'requestUrl'
+    },
+    {
+      title: '操作人员',
+      field: 'userNickname',
+      isSearch: true
+    },
+    {
+      title: '操作明细',
+      field: 'content',
+      isTable: false
+    },
+    {
+      title: '用户 IP',
+      field: 'userIp',
+      isTable: false
+    },
+    {
+      title: 'userAgent',
+      field: 'userAgent'
+    },
+    {
+      title: '操作结果',
+      field: 'resultCode',
+      table: {
+        slots: {
+          default: 'resultCode'
+        }
       }
-    }
-  },
-  {
-    label: '操作日期',
-    field: 'startTime',
-    form: {
-      show: false
     },
-    search: {
-      show: true,
-      component: 'DatePicker',
-      componentProps: {
-        type: 'daterange',
-        valueFormat: 'YYYY-MM-DD HH:mm:ss',
-        defaultTime: [new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 2, 1, 23, 59, 59)]
+    {
+      title: '操作日期',
+      field: 'startTime',
+      formatter: 'formatDate',
+      isForm: false,
+      search: {
+        itemRender: {
+          name: 'XDataTimePicker'
+        }
       }
-    }
-  },
-  {
-    label: '执行时长',
-    field: 'duration'
-  },
-  {
-    label: t('table.action'),
-    field: 'action',
-    width: '120px',
-    form: {
-      show: false
     },
-    detail: {
-      show: false
+    {
+      title: '执行时长',
+      field: 'duration',
+      table: {
+        slots: {
+          default: 'duration'
+        }
+      }
     }
-  }
-])
-export const { allSchemas } = useCrudSchemas(crudSchemas)
+  ]
+})
+export const { allSchemas } = useVxeCrudSchemas(crudSchemas)

+ 0 - 5
yudao-ui-admin-vue3/src/views/system/user/index.vue

@@ -39,11 +39,6 @@ import { getAccessToken, getTenantId } from '@/utils/auth'
 import { useMessage } from '@/hooks/web/useMessage'
 
 const message = useMessage()
-interface Tree {
-  id: number
-  name: string
-  children?: Tree[]
-}
 
 const defaultProps = {
   children: 'children',