merge dev into dev

fix: 修复字典项权限标识不一致的问题 feat(菜单管理): 增加路由地址和权限标识搜索功能

Created-by: onekr-billy
Commit-by: Billy
Merged-by: Charles_7c
Description: <!--
  非常感谢您的 PR!在提交之前,请务必确保您 PR 的代码经过了完整测试,并且通过了代码规范检查。
-->

<!-- 在 [] 中输入 x 来勾选) -->

## PR 类型

<!-- 您的 PR 引入了哪种类型的变更? -->
<!-- 只支持选择一种类型,如果有多种类型,可以在更新日志中增加 “类型” 列。 -->

- [ ] 新 feature
- [x] Bug 修复
- [x] 功能增强
- [ ] 文档变更
- [ ] 代码样式变更
- [ ] 重构
- [ ] 性能改进
- [ ] 单元测试
- [ ] CI/CD
- [ ] 其他

## PR 目的

<!-- 描述一下您的 PR 解决了什么问题。如果可以,请链接到相关 issues。 -->

## 解决方案

<!-- 详细描述您是如何解决的问题 -->

## PR 测试

<!-- 如果可以,请为您的 PR 添加或更新单元测试。 -->
<!-- 请描述一下您是如何测试 PR 的。例如:创建/更新单元测试或添加相关的截图。 -->
遗留问题:
后端自动识别权限编码不符合数据库里的权限编码规范,需要同步调整
![37a8a365f2e705652db6a6a25d67c884.png](https://raw.gitcode.com/user-images/assets/3910673/5d982fbd-7721-4f52-91c0-5a6f12d50bc0/37a8a365f2e705652db6a6a25d67c884.png '37a8a365f2e705652db6a6a25d67c884.png')

## Changelog

| 模块  | Changelog | Related issues |
|-----|-----------| -------------- |
|     |           |                |

<!-- 如果有多种类型的变更,可以在变更日志表中增加 “类型” 列,该列的值与上方 “PR 类型” 相同。 -->
<!-- Related issues 格式为 Closes #<issue号>,或者 Fixes #<issue号>,或者 Resolves #<issue号>。 -->

## 其他信息

<!-- 请描述一下还有哪些注意事项。例如:如果引入了一个不向下兼容的变更,请描述其影响。 -->

## 提交前确认

- [x] PR 代码经过了完整测试,并且通过了代码规范检查
- [ ] 已经完整填写 Changelog,并链接到了相关 issues
- [x] PR 代码将要提交到 dev 分支

See merge request: continew/continew-admin-ui!5
This commit is contained in:
2025-07-24 14:48:37 +08:00
2 changed files with 19 additions and 9 deletions

View File

@@ -24,11 +24,11 @@
</a-button>
</template>
<template #toolbar-right>
<a-button v-permission="['system:dict:item:create']" type="primary" @click="onAdd">
<a-button v-permission="['system:dictItem:create']" type="primary" @click="onAdd">
<template #icon><icon-plus /></template>
<template #default>新增</template>
</a-button>
<a-button v-permission="['system:dict:item:clearCache']" type="outline" status="warning" @click="onClearCache">
<a-button v-permission="['system:dictItem:clearCache']" type="outline" status="warning" @click="onClearCache">
<template #icon><icon-delete /></template>
<template #default>清除缓存</template>
</a-button>
@@ -46,9 +46,9 @@
</template>
<template #action="{ record }">
<a-space>
<a-link v-permission="['system:dict:item:update']" title="修改" @click="onUpdate(record)">修改</a-link>
<a-link v-permission="['system:dictItem:update']" title="修改" @click="onUpdate(record)">修改</a-link>
<a-link
v-permission="['system:dict:item:delete']"
v-permission="['system:dictItem:delete']"
status="danger"
title="删除"
@click="onDelete(record)"
@@ -119,7 +119,7 @@ const columns: TableInstance['columns'] = [
width: 130,
align: 'center',
fixed: !isMobile() ? 'right' : undefined,
show: has.hasPermOr(['system:dict:item:update', 'system:dict:item:delete']),
show: has.hasPermOr(['system:dictItem:update', 'system:dictItem:delete']),
},
]

View File

@@ -19,6 +19,10 @@
<a-input v-model="title" placeholder="搜索菜单标题" allow-clear>
<template #prefix><icon-search /></template>
</a-input>
<a-input v-model="path" placeholder="搜索路由地址" allow-clear>
</a-input>
<a-input v-model="permission" placeholder="搜索权限标识" allow-clear>
</a-input>
<a-button @click="reset">
<template #icon><icon-refresh /></template>
<template #default>重置</template>
@@ -110,11 +114,15 @@ const {
} = useTable(() => listMenu(queryForm), { immediate: true })
// 过滤树
const searchData = (title: string) => {
const searchData = (title: string, path: string, permission: string) => {
const loop = (data: MenuResp[]) => {
const result = [] as MenuResp[]
data.forEach((item: MenuResp) => {
if (item.title?.toLowerCase().includes(title.toLowerCase())) {
if (
(!title || item.title?.toLowerCase().includes(title.toLowerCase()))
&& (!path || item.path?.toLowerCase().includes(path.toLowerCase()))
&& (!permission || item.permission?.toLowerCase().includes(permission.toLowerCase()))
) {
result.push({ ...item })
} else if (item.children) {
const filterData = loop(item.children)
@@ -132,9 +140,11 @@ const searchData = (title: string) => {
}
const title = ref('')
const path = ref('')
const permission = ref('')
const dataList = computed(() => {
if (!title.value) return tableData.value
return searchData(title.value)
if (!title.value && !path.value && !permission.value) return tableData.value
return searchData(title.value, path.value, permission.value)
})
const columns: TableInstance['columns'] = [