diff --git a/.env.production b/.env.production index 22b39b8..44d6953 100644 --- a/.env.production +++ b/.env.production @@ -1,5 +1,5 @@ # 平台本地运行端口号 -VITE_PORT=7000 +VITE_PORT=80 # 预发布环境路由历史模式(Hash模式传"hash"、HTML5模式传"h5"、Hash模式带base参数传"hash,base参数"、HTML5模式带base参数传"h5,base参数") VITE_ROUTER_HISTORY="hash" @@ -8,7 +8,7 @@ VITE_ROUTER_HISTORY="hash" VITE_BASE_API=/admin # 跨域代理地址 -VITE_APP_URL=http://localhost:7070 +VITE_APP_URL=http://localhost:8000 # mock地址 VITE_MOCK_BASE_API=/mock diff --git a/ReadMe.md b/ReadMe.md index 370752b..99e56c9 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -1,3 +1,7 @@ # Docker配置详情 -![img.png](images/img.png) \ No newline at end of file +如果想更改端口号,前面的对外访问的端口号,后面是容器也就是服务本身端口号 +![img.png](images/1.png) + +项目本身端口号 +![img.png](images/2.png) \ No newline at end of file diff --git a/mock/data.js b/build/data.js similarity index 98% rename from mock/data.js rename to build/data.js index ec0a5e5..3a172d5 100644 --- a/mock/data.js +++ b/build/data.js @@ -1,3 +1,6 @@ +/** + * * 自动创建权限内容 + */ (async function requestPath() { // 获取基础paths对象 const response = await fetch('http://localhost:7070/v3/api-docs/admin%E7%AE%A1%E7%90%86%E5%91%98%E6%8E%A5%E5%8F%A3%E8%AF%B7%E6%B1%82', { method: 'GET' }); diff --git a/docker/nginx.conf b/docker/nginx.conf index 8f09f63..90008b3 100644 --- a/docker/nginx.conf +++ b/docker/nginx.conf @@ -16,8 +16,7 @@ server { # 后端跨域请求 location ~/admin/ { - #proxy_pass http://z-bunny.cn:7070; - proxy_pass http://172.17.0.1:7070; + proxy_pass http://172.17.0.1:8000; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; diff --git a/images/img.png b/images/1.png similarity index 100% rename from images/img.png rename to images/1.png diff --git a/images/2.png b/images/2.png new file mode 100644 index 0000000..b09d3c1 Binary files /dev/null and b/images/2.png differ diff --git a/src/api/v1/menu.ts b/src/api/v1/menu.ts index d856fda..fd5a4f8 100644 --- a/src/api/v1/menu.ts +++ b/src/api/v1/menu.ts @@ -6,29 +6,34 @@ export const fetchGetMenusList = (data?: any) => { return http.request>('get', `router/getMenusList`, { params: data }); }; +/** + * 根据路由id获取所有角色 + */ +export const fetchGetRoleListByRouterId = data => { + return http.request>('get', `routerRole/getRoleListByRouterId`, { params: data }); +}; + /** 菜单管理-添加菜单 */ export const fetchAddMenu = (data?: any) => { return http.request>('post', `router/addMenu`, { data }); }; -/** 菜单管理-更新菜单 */ -export const fetchUpdateMenu = (data?: any) => { - return http.request>('put', `router/updateMenu`, { data }); -}; - -/** 菜单管理-删除菜单 */ -export const fetchDeletedMenuByIds = (data?: any) => { - return http.request>('delete', `router/deletedMenuByIds`, { data }); -}; - /** 菜单管理-为菜单分配角色 */ export const fetchAssignRolesToRouter = (data: any) => { return http.request>('post', `routerRole/assignRolesToRouter`, { data }); }; -/** - * 根据路由id获取所有角色 - */ -export const fetchGetRoleListByRouterId = data => { - return http.request>('get', `routerRole/getRoleListByRouterId`, { params: data }); +/** 菜单管理-更新菜单 */ +export const fetchUpdateMenu = (data?: any) => { + return http.request>('put', `router/updateMenu`, { data }); +}; + +/** 菜单管理-快速更新菜单排序 */ +export const fetchUpdateMenuByIdWithRank = (data?: any) => { + return http.request>('put', `router/updateMenuByIdWithRank`, { data }); +}; + +/** 菜单管理-删除菜单 */ +export const fetchDeletedMenuByIds = (data?: any) => { + return http.request>('delete', `router/deletedMenuByIds`, { data }); }; diff --git a/src/api/v1/quartzExecuteLog.ts b/src/api/v1/quartzExecuteLog.ts new file mode 100644 index 0000000..f527753 --- /dev/null +++ b/src/api/v1/quartzExecuteLog.ts @@ -0,0 +1,22 @@ +import { http } from '@/api/service/request'; +import type { BaseResult, ResultTable } from '@/api/service/types'; + +/** 调度任务执行日志---获取调度任务执行日志列表 */ +export const fetchGetQuartzExecuteLogList = (data: any) => { + return http.request>('get', `quartzExecuteLog/getQuartzExecuteLogList/${data.currentPage}/${data.pageSize}`, { params: data }); +}; + +/** 调度任务执行日志---添加调度任务执行日志 */ +export const fetchAddQuartzExecuteLog = (data: any) => { + return http.request>('post', 'quartzExecuteLog/addQuartzExecuteLog', { data }); +}; + +/** 调度任务执行日志---更新调度任务执行日志 */ +export const fetchUpdateQuartzExecuteLog = (data: any) => { + return http.request>('put', 'quartzExecuteLog/updateQuartzExecuteLog', { data }); +}; + +/** 调度任务执行日志---删除调度任务执行日志 */ +export const fetchDeleteQuartzExecuteLog = (data: any) => { + return http.request>('delete', 'quartzExecuteLog/deleteQuartzExecuteLog', { data }); +}; diff --git a/src/store/scheduler/quartzExecuteLog.ts b/src/store/scheduler/quartzExecuteLog.ts new file mode 100644 index 0000000..1ac8f26 --- /dev/null +++ b/src/store/scheduler/quartzExecuteLog.ts @@ -0,0 +1,77 @@ +import { defineStore } from 'pinia'; +import { fetchAddQuartzExecuteLog, fetchDeleteQuartzExecuteLog, fetchGetQuartzExecuteLogList, fetchUpdateQuartzExecuteLog } from '@/api/v1/quartzExecuteLog'; +import { pageSizes } from '@/enums/baseConstant'; +import { storeMessage } from '@/utils/message'; +import { storePagination } from '@/store/useStorePagination'; + +/** + * 调度任务执行日志 Store + */ +export const useQuartzExecuteLogStore = defineStore('quartzExecuteLogStore', { + state() { + return { + // 调度任务执行日志列表 + datalist: [], + // 查询表单 + form: { + // 任务名称 + jobName: undefined, + // 任务分组 + jobGroup: undefined, + // 执行任务类名 + jobClassName: undefined, + // 执行任务core表达式 + cronExpression: undefined, + // 触发器名称 + triggerName: undefined, + // 结束时间 + endTime: undefined, + }, + // 分页查询结果 + pagination: { + currentPage: 1, + pageSize: 150, + total: 100, + pageSizes, + }, + // 加载 + loading: false, + }; + }, + getters: {}, + actions: { + /** 获取调度任务执行日志 */ + async getQuartzExecuteLogList() { + // 整理请求参数 + const data = { ...this.pagination, ...this.form }; + delete data.pageSizes; + delete data.total; + delete data.background; + + // 获取调度任务执行日志列表 + const result = await fetchGetQuartzExecuteLogList(data); + + // 公共页面函数hook + const pagination = storePagination.bind(this); + return pagination(result); + }, + + /** 添加调度任务执行日志 */ + async addQuartzExecuteLog(data: any) { + const result = await fetchAddQuartzExecuteLog(data); + return storeMessage(result); + }, + + /** 修改调度任务执行日志 */ + async updateQuartzExecuteLog(data: any) { + const result = await fetchUpdateQuartzExecuteLog(data); + return storeMessage(result); + }, + + /** 删除调度任务执行日志 */ + async deleteQuartzExecuteLog(data: any) { + const result = await fetchDeleteQuartzExecuteLog(data); + return storeMessage(result); + }, + }, +}); diff --git a/src/store/monitor/schedulers.ts b/src/store/scheduler/schedulers.ts similarity index 100% rename from src/store/monitor/schedulers.ts rename to src/store/scheduler/schedulers.ts diff --git a/src/store/monitor/schedulersGroup.ts b/src/store/scheduler/schedulersGroup.ts similarity index 100% rename from src/store/monitor/schedulersGroup.ts rename to src/store/scheduler/schedulersGroup.ts diff --git a/src/store/system/menu.ts b/src/store/system/menu.ts index 84c208f..f9d6045 100644 --- a/src/store/system/menu.ts +++ b/src/store/system/menu.ts @@ -1,7 +1,7 @@ import { defineStore } from 'pinia'; import { storeMessage } from '@/utils/message'; import { handleTree } from '@/utils/tree'; -import { fetchAddMenu, fetchAssignRolesToRouter, fetchDeletedMenuByIds, fetchGetMenusList, fetchGetRoleListByRouterId, fetchUpdateMenu } from '@/api/v1/menu'; +import { fetchAddMenu, fetchAssignRolesToRouter, fetchDeletedMenuByIds, fetchGetMenusList, fetchGetRoleListByRouterId, fetchUpdateMenu, fetchUpdateMenuByIdWithRank } from '@/api/v1/menu'; import { isAllEmpty } from '@pureadmin/utils'; import { $t } from '@/plugins/i18n'; @@ -42,6 +42,12 @@ export const userMenuStore = defineStore('menuStore', { return storeMessage(result); }, + /** 快速更新菜单排序 */ + async updateMenuByIdWithRank(data: object) { + const result = await fetchUpdateMenuByIdWithRank(data); + return storeMessage(result); + }, + /** 删除菜单 */ async deletedMenuByIds(data: object) { const result = await fetchDeletedMenuByIds(data); diff --git a/src/views/scheduler/quartzExecuteLog/index.vue b/src/views/scheduler/quartzExecuteLog/index.vue new file mode 100644 index 0000000..6439f9a --- /dev/null +++ b/src/views/scheduler/quartzExecuteLog/index.vue @@ -0,0 +1,138 @@ + + + diff --git a/src/views/scheduler/quartzExecuteLog/quartz-execute-log-dialog.vue b/src/views/scheduler/quartzExecuteLog/quartz-execute-log-dialog.vue new file mode 100644 index 0000000..7e8196a --- /dev/null +++ b/src/views/scheduler/quartzExecuteLog/quartz-execute-log-dialog.vue @@ -0,0 +1,77 @@ + + + diff --git a/src/views/scheduler/quartzExecuteLog/utils/columns.ts b/src/views/scheduler/quartzExecuteLog/utils/columns.ts new file mode 100644 index 0000000..db1208f --- /dev/null +++ b/src/views/scheduler/quartzExecuteLog/utils/columns.ts @@ -0,0 +1,61 @@ +import { reactive } from 'vue'; +import { $t } from '@/plugins/i18n'; + +// 表格列 +export const columns: TableColumnList = [ + { type: 'selection', align: 'left' }, + { type: 'index', index: (index: number) => index + 1, label: '序号', width: 60 }, + // 任务名称 + { label: $t('quartzExecuteLog_jobName'), prop: 'jobName' }, + // 任务分组 + { label: $t('quartzExecuteLog_jobGroup'), prop: 'jobGroup' }, + // 执行任务类名 + { label: $t('quartzExecuteLog_jobClassName'), prop: 'jobClassName' }, + // 执行任务core表达式 + { label: $t('quartzExecuteLog_cronExpression'), prop: 'cronExpression' }, + // 触发器名称 + { label: $t('quartzExecuteLog_triggerName'), prop: 'triggerName' }, + // 执行结果 + { label: $t('quartzExecuteLog_executeResult'), prop: 'executeResult', width: 210 }, + // 执行时间 + { label: $t('quartzExecuteLog_duration'), prop: 'duration' }, + // 结束时间 + { label: $t('quartzExecuteLog_endTime'), prop: 'endTime' }, + { label: $t('table.updateTime'), prop: 'updateTime', sortable: true, width: 160 }, + { label: $t('table.createTime'), prop: 'createTime', sortable: true, width: 160 }, + { label: $t('table.createUser'), prop: 'createUser', slot: 'createUser', width: 90 }, + { label: $t('table.updateUser'), prop: 'updateUser', slot: 'updateUser', width: 90 }, + { label: $t('table.operation'), fixed: 'right', width: 210, slot: 'operation' }, +]; + +// 添加规则 +export const rules = reactive({ + // 任务名称 + jobName: [{ required: true, message: `${$t('input')}${$t('quartzExecuteLog_jobName')}`, trigger: 'blur' }], + // 任务分组 + jobGroup: [{ required: true, message: `${$t('input')}${$t('quartzExecuteLog_jobGroup')}`, trigger: 'blur' }], + // 执行任务类名 + jobClassName: [{ required: true, message: `${$t('input')}${$t('quartzExecuteLog_jobClassName')}`, trigger: 'blur' }], + // 执行任务core表达式 + cronExpression: [ + { + required: true, + message: `${$t('input')}${$t('quartzExecuteLog_cronExpression')}`, + trigger: 'blur', + }, + ], + // 触发器名称 + triggerName: [{ required: true, message: `${$t('input')}${$t('quartzExecuteLog_triggerName')}`, trigger: 'blur' }], + // 执行结果 + executeResult: [ + { + required: true, + message: `${$t('input')}${$t('quartzExecuteLog_executeResult')}`, + trigger: 'blur', + }, + ], + // 执行时间 + duration: [{ required: true, message: `${$t('input')}${$t('quartzExecuteLog_duration')}`, trigger: 'blur' }], + // 结束时间 + endTime: [{ required: true, message: `${$t('input')}${$t('quartzExecuteLog_endTime')}`, trigger: 'blur' }], +}); diff --git a/src/views/scheduler/quartzExecuteLog/utils/hooks.ts b/src/views/scheduler/quartzExecuteLog/utils/hooks.ts new file mode 100644 index 0000000..956ad0b --- /dev/null +++ b/src/views/scheduler/quartzExecuteLog/utils/hooks.ts @@ -0,0 +1,99 @@ +import { addDialog } from '@/components/BaseDialog/index'; +import QuartzExecuteLogDialog from '@/views/scheduler/quartzExecuteLog/quartz-execute-log-dialog.vue'; +import { useQuartzExecuteLogStore } from '@/store/scheduler/quartzExecuteLog'; +import { h, ref } from 'vue'; +import { messageBox } from '@/utils/message'; +import type { FormItemProps } from '@/views/scheduler/quartzExecuteLog/utils/types'; +import { $t } from '@/plugins/i18n'; + +export const formRef = ref(); +// 删除ids +export const deleteIds = ref([]); +const quartzExecuteLogStore = useQuartzExecuteLogStore(); + +/** + * * 搜索初始化调度任务执行日志 + */ +export async function onSearch() { + quartzExecuteLogStore.loading = true; + await quartzExecuteLogStore.getQuartzExecuteLogList(); + quartzExecuteLogStore.loading = false; +} + +/** + * * 更新调度任务执行日志 + * @param row + */ +export function onUpdate(row: any) { + addDialog({ + title: `${$t('modify')}${$t('quartzExecuteLog')}`, + width: '30%', + props: { + formInline: { + jobName: row.jobName, + jobGroup: row.jobGroup, + jobClassName: row.jobClassName, + cronExpression: row.cronExpression, + triggerName: row.triggerName, + executeResult: row.executeResult, + duration: row.duration, + endTime: row.endTime, + }, + }, + draggable: true, + fullscreenIcon: true, + closeOnClickModal: false, + contentRenderer: () => h(QuartzExecuteLogDialog, { ref: formRef }), + beforeSure: (done, { options }) => { + const form = options.props.formInline as FormItemProps; + formRef.value.formRef.validate(async (valid: any) => { + if (!valid) return; + + const result = await quartzExecuteLogStore.updateQuartzExecuteLog({ ...form, id: row.id }); + if (!result) return; + done(); + await onSearch(); + }); + }, + }); +} + +/** + * * 删除调度任务执行日志 + */ +export const onDelete = async (row: any) => { + const id = row.id; + + // 是否确认删除 + const result = await messageBox({ + title: $t('confirm_delete'), + showMessage: false, + confirmMessage: undefined, + cancelMessage: $t('cancel_delete'), + }); + if (!result) return; + + // 删除数据 + await quartzExecuteLogStore.deleteQuartzExecuteLog([id]); + await onSearch(); +}; + +/** + * 批量删除 + */ +export const onDeleteBatch = async () => { + const ids = deleteIds.value; + + // 是否确认删除 + const result = await messageBox({ + title: $t('confirm_delete'), + showMessage: false, + confirmMessage: undefined, + cancelMessage: $t('cancel_delete'), + }); + if (!result) return; + + // 删除数据 + await quartzExecuteLogStore.deleteQuartzExecuteLog(ids); + await onSearch(); +}; diff --git a/src/views/scheduler/quartzExecuteLog/utils/types.ts b/src/views/scheduler/quartzExecuteLog/utils/types.ts new file mode 100644 index 0000000..826375a --- /dev/null +++ b/src/views/scheduler/quartzExecuteLog/utils/types.ts @@ -0,0 +1,24 @@ +// 添加或者修改表单元素 +export interface FormItemProps { + // 任务名称 + jobName: string; + // 任务分组 + jobGroup: string; + // 执行任务类名 + jobClassName: string; + // 执行任务core表达式 + cronExpression: string; + // 触发器名称 + triggerName: string; + // 执行结果 + executeResult: any; + // 执行时间 + duration: number; + // 结束时间 + endTime: any; +} + +// 添加或修改表单Props +export interface FormProps { + formInline: FormItemProps; +} diff --git a/src/views/scheduler/schedulers/index.vue b/src/views/scheduler/schedulers/index.vue index dc52eb5..7f7d86e 100644 --- a/src/views/scheduler/schedulers/index.vue +++ b/src/views/scheduler/schedulers/index.vue @@ -10,7 +10,7 @@ import EditPen from '@iconify-icons/ep/edit-pen'; import Refresh from '@iconify-icons/ep/refresh'; import { selectUserinfo } from '@/components/Table/Userinfo/columns'; import { $t } from '@/plugins/i18n'; -import { useSchedulersStore } from '@/store/monitor/schedulers'; +import { useSchedulersStore } from '@/store/scheduler/schedulers'; import { useRenderIcon } from '@/components/CommonIcon/src/hooks'; import { FormInstance } from 'element-plus'; diff --git a/src/views/scheduler/schedulers/schedulers-dialog.vue b/src/views/scheduler/schedulers/schedulers-dialog.vue index 56a1710..2bd795e 100644 --- a/src/views/scheduler/schedulers/schedulers-dialog.vue +++ b/src/views/scheduler/schedulers/schedulers-dialog.vue @@ -4,8 +4,8 @@ import { FormInstance } from 'element-plus'; import { rules } from '@/views/scheduler/schedulers/utils/columns'; import { FormProps } from '@/views/scheduler/schedulers/utils/types'; import { $t } from '@/plugins/i18n'; -import { useSchedulersGroupStore } from '@/store/monitor/schedulersGroup'; -import { useSchedulersStore } from '@/store/monitor/schedulers'; +import { useSchedulersGroupStore } from '@/store/scheduler/schedulersGroup'; +import { useSchedulersStore } from '@/store/scheduler/schedulers'; const props = withDefaults(defineProps(), { formInline: () => ({ diff --git a/src/views/scheduler/schedulers/utils/hooks.ts b/src/views/scheduler/schedulers/utils/hooks.ts index dd0dad8..49b9dd8 100644 --- a/src/views/scheduler/schedulers/utils/hooks.ts +++ b/src/views/scheduler/schedulers/utils/hooks.ts @@ -1,6 +1,6 @@ import { addDialog } from '@/components/BaseDialog/index'; import SchedulersDialog from '@/views/scheduler/schedulers/schedulers-dialog.vue'; -import { useSchedulersStore } from '@/store/monitor/schedulers'; +import { useSchedulersStore } from '@/store/scheduler/schedulers'; import { h, ref } from 'vue'; import { messageBox } from '@/utils/message'; import type { FormItemProps } from '@/views/scheduler/schedulers/utils/types'; diff --git a/src/views/scheduler/schedulersGroup/index.vue b/src/views/scheduler/schedulersGroup/index.vue index c07575b..9796e85 100644 --- a/src/views/scheduler/schedulersGroup/index.vue +++ b/src/views/scheduler/schedulersGroup/index.vue @@ -10,7 +10,7 @@ import EditPen from '@iconify-icons/ep/edit-pen'; import Refresh from '@iconify-icons/ep/refresh'; import { selectUserinfo } from '@/components/Table/Userinfo/columns'; import { $t } from '@/plugins/i18n'; -import { useSchedulersGroupStore } from '@/store/monitor/schedulersGroup'; +import { useSchedulersGroupStore } from '@/store/scheduler/schedulersGroup'; import { useRenderIcon } from '@/components/CommonIcon/src/hooks'; import { FormInstance } from 'element-plus'; diff --git a/src/views/scheduler/schedulersGroup/utils/hooks.ts b/src/views/scheduler/schedulersGroup/utils/hooks.ts index a3643e4..b1a317f 100644 --- a/src/views/scheduler/schedulersGroup/utils/hooks.ts +++ b/src/views/scheduler/schedulersGroup/utils/hooks.ts @@ -1,6 +1,6 @@ import { addDialog } from '@/components/BaseDialog/index'; import SchedulersGroupDialog from '@/views/scheduler/schedulersGroup/schedulers-group-dialog.vue'; -import { useSchedulersGroupStore } from '@/store/monitor/schedulersGroup'; +import { useSchedulersGroupStore } from '@/store/scheduler/schedulersGroup'; import { h, ref } from 'vue'; import { messageBox } from '@/utils/message'; import type { FormItemProps } from '@/views/scheduler/schedulersGroup/utils/types'; diff --git a/src/views/system/menu/index.vue b/src/views/system/menu/index.vue index bab4f62..4ddc80a 100644 --- a/src/views/system/menu/index.vue +++ b/src/views/system/menu/index.vue @@ -6,7 +6,7 @@ import Delete from '@iconify-icons/ep/delete'; import EditPen from '@iconify-icons/ep/edit-pen'; import Refresh from '@iconify-icons/ep/refresh'; import AddFill from '@iconify-icons/ri/add-circle-line'; -import { assignRolesToRouter, handleDelete, onAdd, onchangeVisible, onSearch, onUpdate, switchLoadMap } from '@/views/system/menu/utils/hooks'; +import { assignRolesToRouter, handleDelete, onAdd, onChangeMenuRank, onchangeVisible, onSearch, onUpdate, switchLoadMap } from '@/views/system/menu/utils/hooks'; import PureTable from '@pureadmin/table'; import { columns } from '@/views/system/menu/utils/columns'; import { userMenuStore } from '@/store/system/menu'; @@ -85,6 +85,10 @@ onMounted(() => { /> + + diff --git a/src/views/system/menu/utils/columns.tsx b/src/views/system/menu/utils/columns.tsx index 8dd521c..fea83b5 100644 --- a/src/views/system/menu/utils/columns.tsx +++ b/src/views/system/menu/utils/columns.tsx @@ -1,5 +1,6 @@ import { h, reactive } from 'vue'; import type { FormRules } from 'element-plus'; +import { ElTag } from 'element-plus'; import { $t } from '@/plugins/i18n'; import { isAllEmpty } from '@pureadmin/utils'; import { getMenuType } from '@/views/system/menu/utils/hooks'; @@ -26,9 +27,9 @@ export const columns: TableColumnList = [ prop: 'menuType', width: 100, cellRenderer: ({ row, props }) => ( - + {getMenuType(row.menuType, true)} - + ), }, { label: '路由路径', prop: 'path' }, @@ -37,13 +38,13 @@ export const columns: TableColumnList = [ prop: 'component', formatter: ({ path, component }) => (isAllEmpty(component) ? path : component), }, - { label: '排序', prop: 'rank', width: 100 }, + { label: '排序', prop: 'rank', width: 80, slot: 'rank' }, { label: '隐藏', prop: 'visible', slot: 'visible', width: 100 }, { label: $t('table.updateTime'), prop: 'updateTime', sortable: true }, { label: $t('table.createTime'), prop: 'createTime', sortable: true }, { label: $t('table.createUser'), prop: 'createUser', slot: 'createUser', width: 90 }, { label: $t('table.updateUser'), prop: 'updateUser', slot: 'updateUser', width: 90 }, - { label: $t('table.operation'), fixed: 'right', width: 210, slot: 'operation' }, + { label: $t('table.operation'), fixed: 'right', width: 230, slot: 'operation' }, ]; /** 自定义表单规则校验 */ diff --git a/src/views/system/menu/utils/hooks.tsx b/src/views/system/menu/utils/hooks.tsx index b5f1897..8878d1a 100644 --- a/src/views/system/menu/utils/hooks.tsx +++ b/src/views/system/menu/utils/hooks.tsx @@ -20,7 +20,7 @@ const formRef = ref(); * @param type * @param text */ -export const getMenuType = (type, text = false) => { +export const getMenuType = (type: number, text: boolean = false): any => { switch (type) { case 0: return text ? '菜单' : 'primary'; @@ -199,6 +199,27 @@ export const onchangeVisible = async (row: any, index: number) => { }); }; +/** + * * 更新菜单排序 + * @param row + */ +export const onChangeMenuRank = async (row: any) => { + const data = { id: row.id, rank: row.rank }; + + // 是否确认修改显示状态 + const confirm = await messageBox({ + title: $t('confirm_update_sort'), + showMessage: false, + confirmMessage: undefined, + cancelMessage: $t('cancel'), + }); + + // 取消修改 + if (!confirm) return; + + await routerStore.updateMenuByIdWithRank(data); +}; + /** * 为路由分配角色 * @param row