diff --git a/.env b/.env index 33a9e5b649c28423761bac64a8c8799f66a51659..97f8c7329703f75a3e546bb6883c6e8d05319937 100644 --- a/.env +++ b/.env @@ -1,5 +1,5 @@ # port -VITE_PORT=3100 +VITE_PORT=3300 # spa-title VITE_GLOB_APP_TITLE=Bootx-Platform diff --git a/.env.development b/.env.development index 770bf037ed1f1f4fb8bb358ccd39f777eef9a794..954f930e3fe45f3a74670a4c57bfa08afbabb23b 100644 --- a/.env.development +++ b/.env.development @@ -5,7 +5,7 @@ VITE_USE_MOCK=true VITE_PUBLIC_PATH=/ # 跨域代理,您可以配置多个 ,请注意,没有换行符 -VITE_PROXY=[["/api","http://localhost:9999"],["/upload","http://localhost:9999/file/upload"]] +VITE_PROXY=[["/api","http://localhost:9999"],["/upload","http://localhost:9999/file/upload"],["/v3/api-docs"]] # 控制台不输出console VITE_DROP_CONSOLE=false diff --git a/commitlint.config.js b/commitlint.config.js index af370982a4724cf8f9ecc8523ffad73e386be3ce..b423359125229bf66b937fa62ed9383e062693e7 100644 --- a/commitlint.config.js +++ b/commitlint.config.js @@ -7,7 +7,7 @@ const scopes = fs .filter((dirent) => dirent.isDirectory()) .map((dirent) => dirent.name.replace(/s$/, '')) -// precomputed scope +// precomputed data const scopeComplete = execSync('git status --porcelain || true') .toString() .trim() @@ -59,7 +59,7 @@ module.exports = { // 中英文对照版 // messages: { // type: '选择你要提交的类型 :', - // scope: '选择一个提交范围 (可选):', + // data: '选择一个提交范围 (可选):', // customScope: '请输入自定义的提交范围 :', // subject: '填写简短精炼的变更描述 :\n', // body: '填写更加详细的变更描述 (可选)。使用 "|" 换行 :\n', diff --git a/package.json b/package.json index 69bb240b5ee0e89dd4e7098b45d917997c651ec8..3a7aa539c746c03d9951ecb3830726710cd240b7 100644 --- a/package.json +++ b/package.json @@ -69,7 +69,7 @@ "vue-json-pretty": "^2.0.6", "vue-router": "^4.0.16", "vue-types": "^4.1.1", - "vxe-table": "^4.4.2", + "vxe-table": "^4.5.14", "xe-utils": "^3.5.7", "xlsx": "^0.18.5" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b34bc5c23dac4c5ace55d60887fa7c44aee567ce..6f9b92ce69dbb9f65f746b3d0d3a1127d36e3c36 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -118,7 +118,7 @@ specifiers: vue-router: ^4.0.16 vue-tsc: ^0.33.9 vue-types: ^4.1.1 - vxe-table: ^4.4.2 + vxe-table: ^4.5.14 xe-utils: ^3.5.7 xlsx: ^0.18.5 @@ -161,7 +161,7 @@ dependencies: vue-json-pretty: 2.2.4_vue@3.3.4 vue-router: 4.1.6_vue@3.3.4 vue-types: 4.2.1_vue@3.3.4 - vxe-table: 4.4.2_vue@3.3.4+xe-utils@3.5.7 + vxe-table: 4.5.14_vue@3.3.4+xe-utils@3.5.7 xe-utils: 3.5.7 xlsx: 0.18.5 @@ -4859,6 +4859,10 @@ packages: entities: 4.5.0 dev: true + /dom-zindex/1.0.1: + resolution: {integrity: sha512-M/MERVDZ8hguvjl6MAlLWSLYLS7PzEyXaTb5gEeJ+SF+e9iUC0sdvlzqe91MMDHBoy+nqw7wKcUOrDSyvMCrRg==} + dev: false + /dom7/3.0.0: resolution: {integrity: sha512-oNlcUdHsC4zb7Msx7JN3K0Nro1dzJ48knvBOnDPKJ2GV9wl1i5vydJZUSyOfrkKFDZEud/jBsTk92S/VGSAe/g==} dependencies: @@ -11003,12 +11007,13 @@ packages: vue: 3.3.4 dev: false - /vxe-table/4.4.2_vue@3.3.4+xe-utils@3.5.7: - resolution: {integrity: sha512-3UdfSeMZ/D5nfTohcnZQQ2gkFZnhvf0v83usOCwx3B1nzBNKAJumg3QviMEox5SdikT8pq9z4vz3a0pesPPrJw==} + /vxe-table/4.5.14_vue@3.3.4+xe-utils@3.5.7: + resolution: {integrity: sha512-S+6pAYQsoY5DZj9qLXQLDKcA/+AO5CSrs9tGn+/By8WxYWJNLw3i5cjbXsriUaJeuj8Qi1aYfdhrNfeMCwE9Iw==} peerDependencies: vue: ^3.2.28 xe-utils: ^3.5.0 dependencies: + dom-zindex: 1.0.1 vue: 3.3.4 xe-utils: 3.5.7 dev: false diff --git a/src/api/common/FileUpload.ts b/src/api/common/FileUpload.ts index e596cbda27535ee6c25c977b957674deb3821ad1..ecce2294f6990b8716b55c638679c3b1cb47f5d3 100644 --- a/src/api/common/FileUpload.ts +++ b/src/api/common/FileUpload.ts @@ -52,14 +52,50 @@ export function uploadFile(params: UploadFileParams, onUploadProgress: (progress * 上传文件信息 */ export interface UpdateFileInfo { - // 文件id - id: string + // id + id?: number + // 文件访问地址 + url?: string + // 文件大小,单位字节 + size?: string // 文件名称 - fileName: string - // 文件后缀 - fileSuffix: string - // 文件类型 - fileType: string - // 文件大小 - fileSize: number + filename?: string + // 原始文件名 + originalFilename?: string + // 基础存储路径 + basePath?: string + // 存储路径 + path?: string + // 文件扩展名 + ext?: string + // MIME类型 + contentType?: string + // 存储平台 + platform?: string + // 缩略图访问路径 + thUrl?: string + // 缩略图名称 + thFilename?: string + // 缩略图大小,单位字节 + thSize?: string + // 缩略图MIME类型 + thContentType?: string + // 文件所属对象id + objectId?: string + // 文件所属对象类型,例如用户头像,评价图片 + objectType?: string + // 文件元数据 + metadata?: string + // 文件用户元数据 + userMetadata?: string + // 缩略图元数据 + thMetadata?: string + // 缩略图用户元数据 + thUserMetadata?: string + // 附加属性 + attr?: string + // 文件ACL + fileAcl?: string + // 缩略图文件ACL + thFileAcl?: string } diff --git a/src/components/Basic/src/BasicTitle.vue b/src/components/Basic/src/BasicTitle.vue index 41ec3d8d6349ae6821b3f1deeb3fc84697a8512e..5cacee5ebe26c387706804d4d51fbcc8e7564c82 100644 --- a/src/components/Basic/src/BasicTitle.vue +++ b/src/components/Basic/src/BasicTitle.vue @@ -46,7 +46,7 @@ position: relative; display: flex; padding-left: 7px; - font-size: 16px; + font-size: 14px; font-weight: 500; line-height: 24px; color: @text-color-base; diff --git a/src/components/Bootx/Query/QueryItem.vue b/src/components/Bootx/Query/QueryItem.vue index 943c0ab5091b655873e47b10119fa23b73282249..e5e9a156b0af788a31f303be796f1eebbaa8f778 100644 --- a/src/components/Bootx/Query/QueryItem.vue +++ b/src/components/Bootx/Query/QueryItem.vue @@ -37,7 +37,7 @@ v-else-if="field.type === DATE" style="width: 100%" :placeholder="field.placeholder ? field.placeholder : '请选择日期'" - :valueFormat="field.format ? field.format : 'yyyy-MM-DD'" + :valueFormat="field.format ? field.format : 'YYYY-MM-DD'" v-model:value="queryParams[field.field]" /> @@ -56,7 +56,7 @@ v-else-if="field.type === DATE_TIME" style="width: 100%" :placeholder="field.placeholder ? field.placeholder : '请选择日期时间'" - :valueFormat="field.format ? field.format : 'yyyy-MM-DD HH:mm:ss'" + :valueFormat="field.format ? field.format : 'YYYY-MM-DD HH:mm:ss'" v-model:value="queryParams[field.field]" /> diff --git a/src/components/VxeTable/black.scss b/src/components/VxeTable/black.scss index 0da066c05e87b8831ad2cf5e2b39ee9203c05893..42f34cd6c03b64a280a0f89713cd5c59187de5b4 100644 --- a/src/components/VxeTable/black.scss +++ b/src/components/VxeTable/black.scss @@ -164,9 +164,6 @@ html[data-theme='dark'] { /*textarea*/ --vxe-textarea-background-color: #{$vxe-textarea-background-color}; - --vxe-textarea-count-color: #{$vxe-textarea-count-color}; - --vxe-textarea-count-background-color: #{$vxe-textarea-count-background-color}; - --vxe-textarea-count-error-color: #{$vxe-textarea-count-error-color}; /*form*/ --vxe-form-background-color: #{$vxe-form-background-color}; diff --git a/src/hooks/bootx/useTablePage.ts b/src/hooks/bootx/useTablePage.ts index ea118cfa435dd16bbbdbb4c8f34cd186409843d3..82c42235456d4aef30e646e47441955f804eec06 100644 --- a/src/hooks/bootx/useTablePage.ts +++ b/src/hooks/bootx/useTablePage.ts @@ -22,7 +22,11 @@ export default function (queryPageCallback: CallableFunction) { const batchOperateFlag = ref(false) // 超级查询条件生效状态 const superQueryFlag = ref(false) - + // 排序条件 + const sortParam = reactive({ + sortField: null, + asc: false, + }) // 不可以被重新赋值, 否则会失去绑定 const { pages, pagination } = model /** @@ -43,6 +47,14 @@ export default function (queryPageCallback: CallableFunction) { pages.size = pageSize queryPageCallback() } + /** + * 排序条件变动 + */ + function sortChange({ order, property }) { + sortParam.sortField = order ? property : null + sortParam.asc = order === 'asc' + queryPageCallback() + } /** * 重置当前页数 */ @@ -87,7 +99,9 @@ export default function (queryPageCallback: CallableFunction) { pagination, batchOperateFlag, superQueryFlag, + sortParam, query, + sortChange, resetPage, pageQueryResHandel, handleTableChange, diff --git a/src/hooks/web/useDesign.ts b/src/hooks/web/useDesign.ts index f32b14637d6201c6d85c75e412feacc1a3b19def..272ccaed83116dc2cb9a13209d38cc8f77da39c4 100644 --- a/src/hooks/web/useDesign.ts +++ b/src/hooks/web/useDesign.ts @@ -14,7 +14,7 @@ export function useDesign(scope: string) { // }); // } return { - // prefixCls: computed(() => `${values.prefixCls}-${scope}`), + // prefixCls: computed(() => `${values.prefixCls}-${data}`), prefixCls: `${values.prefixCls}-${scope}`, prefixVar: values.prefixCls, // style, diff --git a/src/locales/setupI18n.ts b/src/locales/setupI18n.ts index 889d36e24504843678bf341ee91875d330812e94..c062bf1dae90f2e31f01215aa827b705adb659e4 100644 --- a/src/locales/setupI18n.ts +++ b/src/locales/setupI18n.ts @@ -29,7 +29,7 @@ async function createI18nOptions(): Promise { [locale]: message, }, availableLocales: availableLocales, - sync: true, //If you don’t want to inherit locale from global scope, you need to set sync of i18n component option to false. + sync: true, //If you don’t want to inherit locale from global data, you need to set sync of i18n component option to false. silentTranslationWarn: true, // true - warning off missingWarn: false, silentFallbackWarn: true, diff --git a/src/router/guard/index.ts b/src/router/guard/index.ts index 1794ff40a39d9124063ecb603e11eea1652ac990..19ae8da797c61ccb44f3cfd48c1264b884d5013c 100644 --- a/src/router/guard/index.ts +++ b/src/router/guard/index.ts @@ -117,12 +117,9 @@ function createScrollGuard(router: Router) { export function createMessageGuard(router: Router) { const { closeMessageOnSwitch } = projectSetting - console.log(projectSetting) - console.log(closeMessageOnSwitch) router.beforeEach(async () => { try { if (closeMessageOnSwitch) { - console.log(666444) Modal.destroyAll() notification.destroy() } diff --git a/src/router/routes/basic.ts b/src/router/routes/basic.ts index 5b09aa71be92fb29e04633f943615e71725c3f87..7f88ceffb7a5a3d23c3cd2c7c91bf3d11f3a47fe 100644 --- a/src/router/routes/basic.ts +++ b/src/router/routes/basic.ts @@ -101,7 +101,7 @@ export const DASHBOARD: AppRouteModule = { component: () => import('/@/views/dashboard/analysis/index.vue'), meta: { // affix: true, - title: '分析页', + title: '主页', }, }, ], diff --git a/src/utils/dataUtil.ts b/src/utils/dataUtil.ts index 3da9ef549158b26443c86c5b0f9fa1f2ac2b0657..1fc56e0f3fa87feb24fa5656ff10b356498de3a4 100644 --- a/src/utils/dataUtil.ts +++ b/src/utils/dataUtil.ts @@ -11,6 +11,10 @@ import { LabeledValue } from 'ant-design-vue/lib/select' */ export function treeDataTranslate(data, value = 'value', title = 'title', children = 'children') { const temp = [] as Tree[] + if (!data) { + return [] + } + for (let i = 0; i < data.length; i++) { const p = { key: data[i][value], diff --git a/src/utils/validate.ts b/src/utils/validate.ts index 6fe25c446d3cc056ca7bd47aec90d996b3da9eb7..414371b328a70b04670ed52185a0699e3b8bdcba 100644 --- a/src/utils/validate.ts +++ b/src/utils/validate.ts @@ -175,6 +175,7 @@ export function validateEmail(email) { /** * 判断手机号码是否正确 + * @return */ export function validateMobile(phone) { let result = false @@ -188,7 +189,7 @@ export function validateMobile(phone) { result = true } } else { - msg = '手机号码长度不为11位' + msg = '手机号码格式不正确' } } else { msg = '手机号码不能为空' diff --git a/src/views/dashboard/analysis/index.vue b/src/views/dashboard/analysis/index.vue index a2eecf8eeb2c54a2d913ebc5cd3780e8c3e3b9e8..97831f86eaa627155f1d3261fe6f35a22866bd15 100644 --- a/src/views/dashboard/analysis/index.vue +++ b/src/views/dashboard/analysis/index.vue @@ -1,21 +1,12 @@ + + diff --git a/src/views/modules/develop/file/FileUploadList.vue b/src/views/modules/develop/file/FileUploadList.vue index d5874feb84f2fa3417f09475beb988ee680df6be..ded5d0f19e32d8366a5414faa220f887423dabb0 100644 --- a/src/views/modules/develop/file/FileUploadList.vue +++ b/src/views/modules/develop/file/FileUploadList.vue @@ -1,7 +1,31 @@ - + @@ -115,7 +107,7 @@ import { nextTick, onMounted } from 'vue' import { Client, findAll } from '/@/views/modules/system/client/Client.api' import XEUtils from 'xe-utils' - import { menuTree, Menu, del, allTree } from './Menu.api' + import { menuTree, Menu, del, menuAndPermCodeTree } from './Menu.api' import { FormEditType } from '/@/enums/formTypeEnum' import MenuEdit from './MenuEdit.vue' import { VxeTableInstance, VxeToolbarInstance } from 'vxe-table' @@ -158,7 +150,7 @@ async function queryPage() { loading = true if (showPermCode) { - const { data } = await allTree(clientCode) + const { data } = await menuAndPermCodeTree(clientCode) remoteTableData = data } else { const { data } = await menuTree(clientCode) diff --git a/src/views/modules/system/param/SystemParamList.vue b/src/views/modules/system/param/SystemParamList.vue index 59b5b8a994de36615a3c79aa6b5bba3d7b538dde..ddecc13a17c4e370ac179bb75af04b7686a9ef78 100644 --- a/src/views/modules/system/param/SystemParamList.vue +++ b/src/views/modules/system/param/SystemParamList.vue @@ -130,8 +130,8 @@ function remove(record) { del(record.id).then(() => { createMessage.success('删除成功') + queryPage() }) - queryPage() } diff --git a/src/views/modules/system/path/PermPathEdit.vue b/src/views/modules/system/path/PermPathEdit.vue index 29a805d86e84995b7c61d5cc07aa2f9a2734e3ab..69fc1ff8ab6b7f20b9bb9d54a9d7d3a966dc52d4 100644 --- a/src/views/modules/system/path/PermPathEdit.vue +++ b/src/views/modules/system/path/PermPathEdit.vue @@ -5,13 +5,16 @@ :loading="confirmLoading" :title="title" :visible="visible" - :mask-closable="showable" + :mask-closable="false" @cancel="handleCancel" > + + + @@ -98,6 +101,7 @@ function init(id, editType: FormEditType) { initFormEditType(editType) resetForm() + console.log(form.generate) getInfo(id, editType) } // 获取信息 diff --git a/src/views/modules/system/path/PermPathList.vue b/src/views/modules/system/path/PermPathList.vue index f84ed0ee15e20efd0676fb6f2a9b418f8f9761d2..f08baf7f0f8b4e9ed6f3a2249ad70a33ba2d382d 100644 --- a/src/views/modules/system/path/PermPathList.vue +++ b/src/views/modules/system/path/PermPathList.vue @@ -152,8 +152,8 @@ function remove(record) { del(record.id).then(() => { notification.success({ message: '删除成功' }) + queryPage() }) - queryPage() } // 批量删除 function removeDataScopeBatch() { diff --git a/src/views/modules/system/role/Role.api.ts b/src/views/modules/system/role/Role.api.ts index 9a4ed9312a7b97070e64ef065ccb891b6f315af8..72c54c972f83f659aeefd19334fce188420d83ff 100644 --- a/src/views/modules/system/role/Role.api.ts +++ b/src/views/modules/system/role/Role.api.ts @@ -1,6 +1,8 @@ import { defHttp } from '/@/utils/http/axios' import { PageResult, Result } from '/#/axios' import { BaseEntity } from '/#/web' +import { MenuTree } from '/@/views/modules/system/menu/Menu.api' +import { PermPath } from '/@/views/modules/system/path/PermPath.api' /** * 分页 @@ -11,6 +13,14 @@ export const page = (params) => { params, }) } +/** + * 分页 + */ +export const tree = () => { + return defHttp.get>({ + url: '/role/tree', + }) +} /** * 获取单条 @@ -105,7 +115,7 @@ export const existsByNameNotId = (name: string, id) => { } /** - * 查询全部 + * 查询全部角色 */ export const findAll = () => { return defHttp.get>>({ @@ -114,7 +124,7 @@ export const findAll = () => { } /** - * 根据用户获取拥有的权限 + * 根据角色获取拥有的权限 */ export function findPermissionIdsByRole(roleId, clientCode) { return defHttp.get>({ @@ -124,11 +134,12 @@ export function findPermissionIdsByRole(roleId, clientCode) { } /** - * 根据用户id获取角色授权(请求权限列表) + * 获取当前用户角色下可见的菜单树(分配时用) */ -export function findPathsByUser() { - return defHttp.get>({ - url: `/role/path/findPathsByUser`, +export function findTreeByRole(roleId, clientCode) { + return defHttp.get>({ + url: '/perm/menu/findTreeByRole', + params: { roleId, clientCode }, }) } @@ -136,22 +147,41 @@ export function findPathsByUser() { * 根据角色id获取关联请求权限id */ export function findPathIdsByRole(roleId) { - return defHttp.get({ + return defHttp.get>({ url: `/role/path/findIdsByRole`, params: { roleId }, }) } +/** + * 获取当前用户角色下可见的请求权限列表(分配时用) + */ +export function findPathsByRole(roleId) { + return defHttp.get>({ + url: `/role/path/findPathsByRole`, + params: { roleId }, + }) +} + /** * 角色 */ export interface Role extends BaseEntity { // 编码 - code: string + code?: string + // 父ID + pid?: number // 名称 - name: string + name?: string // 是否系统内置 internal?: boolean // 说明 - remark: string + remark?: string +} + +/** + * 角色树 + */ +export interface RoleTree extends Role { + children?: RoleTree[] } diff --git a/src/views/modules/system/role/RoleEdit.vue b/src/views/modules/system/role/RoleEdit.vue index 357093b04066e8d2083ebbbab33ff0129f448e08..e009171bedf8995a0344da9172166172f070f686 100644 --- a/src/views/modules/system/role/RoleEdit.vue +++ b/src/views/modules/system/role/RoleEdit.vue @@ -1,9 +1,26 @@ diff --git a/src/views/modules/system/role/RoleMenuModal.vue b/src/views/modules/system/role/RoleMenuModal.vue index 9ed7282cebdc4ef51f6cad5216eae8bb6fe87bdd..3a36c68438a0507d5a85232d9d19fc6878eae3cd 100644 --- a/src/views/modules/system/role/RoleMenuModal.vue +++ b/src/views/modules/system/role/RoleMenuModal.vue @@ -53,15 +53,17 @@ import { $ref } from 'vue/macros' import { findAll as findClients, Client } from '/@/views/modules/system/client/Client.api' import { getAppEnvConfig } from '/@/utils/env' - import { findPermissionIdsByRole, saveRoleMenu } from '/@/views/modules/system/role/Role.api' + import { findPermissionIdsByRole, findTreeByRole, RoleTree, saveRoleMenu } from '/@/views/modules/system/role/Role.api' import { Tree, treeDataTranslate } from '/@/utils/dataUtil' import XEUtils from 'xe-utils' - import { allTree, MenuTree } from '/@/views/modules/system/menu/Menu.api' + import { MenuTree } from '/@/views/modules/system/menu/Menu.api' + import { useMessage } from '/@/hooks/web/useMessage' const { VITE_GLOB_APP_CLIENT } = getAppEnvConfig() + const { createMessage, createConfirm } = useMessage() let loading = $ref(false) - let roleId = $ref('') + let currentRole = $ref({}) let visible = $ref(false) // 终端列表 let clients = $ref([] as Client[]) @@ -80,31 +82,36 @@ let treeData = $ref([]) let treeList = $ref([]) - function init(id) { - roleId = id + function init(record: RoleTree) { + currentRole = record initData() initAssign() } + /** + * 初始化终端列表 + */ function initData() { findClients().then(({ data }) => { clients = data }) } - // 初始化菜单分配信息 + /** + * 初始化菜单分配信息 + */ async function initAssign() { visible = true loading = true searchName = '' expandedKeys = [] - // 权限树 - await allTree(clientCode).then((res) => { + // 当前角色的菜单和权限码树 + await findTreeByRole(currentRole.id, clientCode).then((res) => { treeData = treeDataTranslate(res.data, 'id', 'title') generateTreeList(res.data) }) // 当前角色已经选择的 - await findPermissionIdsByRole(roleId, clientCode).then((res) => { + await findPermissionIdsByRole(currentRole.id, clientCode).then((res) => { checkedKeys = res.data }) // 所有的key值 @@ -112,23 +119,52 @@ loading = false } - // 保存 + /** + * 保存 + */ function handleSubmit() { + // 是否级联更新子角色 + if (currentRole.children) { + createConfirm({ + iconType: 'warning', + title: '警告', + cancelText: '不应用', + okText: '应用', + content: '将新增的权限应用到下级子角色中,注意:删除权限时无论如何选择,都将会下级角色的权限被级联删除', + onOk: () => { + save(true) + }, + onCancel: () => { + save(false) + }, + }) + } else { + save(false) + } + } + + function save(updateChildren: boolean) { loading = true saveRoleMenu({ - roleId, + roleId: currentRole.id, clientCode, + updateChildren, permissionIds: checkedKeys, }).then(() => { + createMessage.success('保存成功') handleCancel() }) } + // 取消 function handleCancel() { visible = false } // 树数据铺平 function generateTreeList(treeData) { + if (!treeData) { + return + } for (let i = 0; i < treeData.length; i++) { const node = treeData[i] treeList.push(node) diff --git a/src/views/modules/system/role/RolePathModal.vue b/src/views/modules/system/role/RolePathModal.vue index 52b3968c7b05283b9585659538d05a09fd36399b..ec91d62703b38126ec4e1d21a3c43498a3609e28 100644 --- a/src/views/modules/system/role/RolePathModal.vue +++ b/src/views/modules/system/role/RolePathModal.vue @@ -29,25 +29,38 @@ import BasicDrawer from '/@/components/Drawer/src/BasicDrawer.vue' import { $ref } from 'vue/macros' import { VxeTableInstance } from 'vxe-table' - import { findPathIdsByRole, findPathsByUser, saveRoleMenu, saveRolePath } from "./Role.api"; + import { findPathIdsByRole, findPathsByRole, RoleTree, saveRolePath } from './Role.api' import XEUtils from 'xe-utils' + import { useMessage } from '/@/hooks/web/useMessage' + + const { createMessage, createConfirm } = useMessage() const xTable = $ref() let loading = $ref(false) let roleId = $ref('') + let currentRole = $ref({}) let visible = $ref(false) let checkedKeys = $ref([]) let tableData = $ref([]) - async function init(id) { + async function init(record: RoleTree) { visible = true loading = true - roleId = id - await findPathIdsByRole(roleId).then(({ data }) => { + currentRole = record + initAssign() + } + + /** + * 初始化分配信息 + */ + async function initAssign() { + // 已经勾选的 + await findPathIdsByRole(currentRole.id).then(({ data }) => { checkedKeys = data }) - await findPathsByUser().then(({ data }) => { + // 可以被分配的 + await findPathsByRole(currentRole.id).then(({ data }) => { const result = [] as any[] // 对数据进行分组 XEUtils.each(XEUtils.groupBy(data, 'groupName'), (children, key) => { @@ -57,27 +70,58 @@ }) }) tableData = result - xTable.reloadData(tableData) + xTable?.reloadData(tableData) loading = false }) } - // 保存 + /** + * 保存 + */ function handleSubmit() { + loading = true + // 是否级联更新子角色 + if (currentRole.children) { + createConfirm({ + iconType: 'warning', + title: '警告', + cancelText: '不应用', + okText: '应用', + content: '将新增的权限应用到下级子角色中,注意:删除权限时无论如何选择,都将会下级角色的权限被级联删除', + onOk: () => { + save(true) + }, + onCancel: () => { + save(false) + }, + }) + } else { + save(false) + } + } + + /** + * 保存 + */ + function save(updateChildren: boolean) { loading = true const checkedKeys = xTable - .getCheckboxRecords() + ?.getCheckboxRecords() .map((res) => res.id) .filter((id) => id.indexOf('row_') === -1) saveRolePath({ - roleId, + roleId: currentRole.id, + updateChildren, permissionIds: checkedKeys, }).then(() => { + createMessage.success('保存成功') handleCancel() }) } - // 取消 + /** + * 取消 + */ function handleCancel() { visible = false } diff --git a/src/views/modules/system/scope/DataScope.api.ts b/src/views/modules/system/scope/DataRole.api.ts similarity index 70% rename from src/views/modules/system/scope/DataScope.api.ts rename to src/views/modules/system/scope/DataRole.api.ts index 4059124371c693799c037dbbb56683cbbba866e7..8e4701d19afba32b97f2446fbd8daa575c92edf1 100644 --- a/src/views/modules/system/scope/DataScope.api.ts +++ b/src/views/modules/system/scope/DataRole.api.ts @@ -6,8 +6,8 @@ import { BaseEntity } from '/#/web' * 分页 */ export const page = (params) => { - return defHttp.get>>({ - url: '/data/scope/page', + return defHttp.get>>({ + url: '/data/role/page', params, }) } @@ -16,8 +16,8 @@ export const page = (params) => { * 获取单条 */ export const get = (id) => { - return defHttp.get>({ - url: '/data/scope/findById', + return defHttp.get>({ + url: '/data/role/findById', params: { id }, }) } @@ -25,9 +25,9 @@ export const get = (id) => { /** * 添加 */ -export const add = (obj: DataScope) => { +export const add = (obj: DataRole) => { return defHttp.post({ - url: '/data/scope/add', + url: '/data/role/add', data: obj, }) } @@ -35,9 +35,9 @@ export const add = (obj: DataScope) => { /** * 更新 */ -export const update = (obj: DataScope) => { +export const update = (obj: DataRole) => { return defHttp.post({ - url: '/data/scope/update', + url: '/data/role/update', data: obj, }) } @@ -47,7 +47,7 @@ export const update = (obj: DataScope) => { */ export const del = (id) => { return defHttp.delete({ - url: '/data/scope/delete', + url: '/data/role/delete', params: { id }, }) } @@ -56,8 +56,8 @@ export const del = (id) => { * 查询全部 */ export const findAll = () => { - return defHttp.get>>({ - url: '/data/scope/findAll', + return defHttp.get>>({ + url: '/data/role/findAll', }) } @@ -66,13 +66,13 @@ export const findAll = () => { */ export function existsByCode(code: string) { return defHttp.get>({ - url: '/data/scope/existsByCode', + url: '/data/role/existsByCode', params: { code }, }) } export function existsByCodeNotId(code, id) { return defHttp.get>({ - url: '/data/scope/existsByCodeNotId', + url: '/data/role/existsByCodeNotId', params: { code, id }, }) } @@ -82,13 +82,13 @@ export function existsByCodeNotId(code, id) { */ export function existsByName(name: string) { return defHttp.get>({ - url: '/data/scope/existsByName', + url: '/data/role/existsByName', params: { name }, }) } export function existsByNameNotId(name: string, id) { return defHttp.get>({ - url: '/data/scope/existsByNameNotId', + url: '/data/role/existsByNameNotId', params: { name, id }, }) } @@ -98,7 +98,7 @@ export function existsByNameNotId(name: string, id) { */ export function getDeptIds(id) { return defHttp.get>({ - url: '/data/scope/getDeptIds', + url: '/data/role/getDeptIds', params: { id }, }) } @@ -108,7 +108,7 @@ export function getDeptIds(id) { */ export function saveDeptAssign(obj) { return defHttp.post({ - url: '/data/scope/saveDeptAssign', + url: '/data/role/saveDeptAssign', data: obj, }) } @@ -116,9 +116,9 @@ export function saveDeptAssign(obj) { /** * 获取关联的用户列表 */ -export function findUsersByDataScopeId(id) { +export function findUsersByDataRoleId(id) { return defHttp.get>({ - url: '/data/scope/findUsersByDataScopeId', + url: '/data/role/findUsersByDataRoleId', params: { id }, }) } @@ -128,7 +128,7 @@ export function findUsersByDataScopeId(id) { */ export function saveUserAssign(obj) { return defHttp.post({ - url: '/data/scope/saveUserAssign', + url: '/data/role/saveUserAssign', data: obj, }) } @@ -138,7 +138,7 @@ export function saveUserAssign(obj) { */ export function deleteBatchUserAssign(obj) { return defHttp.delete({ - url: '/data/scope/deleteUserAssigns', + url: '/data/role/deleteUserAssigns', data: obj, }) } @@ -146,13 +146,13 @@ export function deleteBatchUserAssign(obj) { /** * 数据范围权限 */ -export interface DataScope extends BaseEntity { +export interface DataRole extends BaseEntity { // 编码 code?: string // 名称 name?: string // 类型 - type?: number + type?: string // 说明 remark?: string } diff --git a/src/views/modules/system/scope/DataScopeEdit.vue b/src/views/modules/system/scope/DataRoleEdit.vue similarity index 84% rename from src/views/modules/system/scope/DataScopeEdit.vue rename to src/views/modules/system/scope/DataRoleEdit.vue index e23ac4b38d78425a8425167abf386de5f6b6707b..0fb5694de842a98f27e5482bb84a968c634123a0 100644 --- a/src/views/modules/system/scope/DataScopeEdit.vue +++ b/src/views/modules/system/scope/DataRoleEdit.vue @@ -18,8 +18,14 @@ - - + + @@ -38,7 +44,7 @@ import { nextTick, reactive } from 'vue' import { $ref } from 'vue/macros' import useFormEdit from '/@/hooks/bootx/useFormEdit' - import { add, get, update, existsByCode, existsByCodeNotId, existsByName, existsByNameNotId, DataScope } from './DataScope.api' + import { add, get, update, existsByCode, existsByCodeNotId, existsByName, existsByNameNotId, DataRole } from './DataRole.api' import { FormInstance, Rule } from 'ant-design-vue/lib/form' import { FormEditType } from '/@/enums/formTypeEnum' import { BasicModal } from '/@/components/Modal' @@ -47,7 +53,7 @@ import { useDict } from '/@/hooks/bootx/useDict' const { existsByServer } = useValidate() - const { dictDropDownNumber } = useDict() + const { dictDropDown } = useDict() const { initFormEditType, handleCancel, @@ -67,12 +73,11 @@ // 表单 const formRef = $ref() let form = $ref({ - id: null, code: '', name: '', - type: 1, + type: undefined, remark: '', - } as DataScope) + } as DataRole) // 校验 const rules = reactive({ name: [ @@ -87,9 +92,12 @@ } as Record) // 事件 const emits = defineEmits(['ok']) - // 入口 - function init(id, editType: FormEditType) { - dataScopeTypes = dictDropDownNumber('DataScopePerm') + /** + * 入口 + */ + async function init(id, editType: FormEditType) { + dataScopeTypes = await dictDropDown('DataScopePerm') + console.log(dataScopeTypes) initFormEditType(editType) resetForm() getInfo(id, editType) @@ -130,11 +138,6 @@ async function validateCode() { const { code, id } = form return existsByServer(code, id, formEditType.value, existsByCode, existsByCodeNotId) - if (!code) { - return Promise.resolve() - } - const res = formEditType.value === FormEditType.Edit ? await existsByCodeNotId(code, id) : await existsByCode(code) - return res.data ? Promise.reject('该编码已存在!') : Promise.resolve() } async function validateName() { const { name, id } = form diff --git a/src/views/modules/system/scope/DataScopeList.vue b/src/views/modules/system/scope/DataRoleList.vue similarity index 78% rename from src/views/modules/system/scope/DataScopeList.vue rename to src/views/modules/system/scope/DataRoleList.vue index 96e412a0310b1de692d4f562d5aa266a980a7ab9..75c22004c120968b5a29b730ef5379a8dc3c8f72 100644 --- a/src/views/modules/system/scope/DataScopeList.vue +++ b/src/views/modules/system/scope/DataRoleList.vue @@ -35,17 +35,17 @@ 删除 -