From aa0fe7f056ea6209e0ada5d4242e766a6b987c21 Mon Sep 17 00:00:00 2001
From: AN <1983933789@qq.com>
Date: Wed, 4 Jun 2025 22:45:50 +0800
Subject: [PATCH 26/31] =?UTF-8?q?refactor:=20=E4=BC=98=E5=8C=96=E6=96=87?=
=?UTF-8?q?=E4=BB=B6=E4=B8=8A=E4=BC=A0=E7=BB=84=E4=BB=B6=EF=BC=8C=E4=BF=AE?=
=?UTF-8?q?=E6=94=B9=E6=96=87=E4=BB=B6=E5=91=BD=E5=90=8D?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/components/custom/file-upload.vue | 11 ++++-------
src/utils/{format.ts => icon-tag-format.ts} | 0
.../_builtin/user-center/modules/online-table.vue | 2 +-
src/views/monitor/logininfor/index.vue | 2 +-
.../logininfor/modules/login-infor-view-drawer.vue | 2 +-
src/views/monitor/online/index.vue | 2 +-
.../monitor/operlog/modules/oper-log-view-drawer.vue | 2 +-
src/views/system/oss/modules/oss-upload-modal.vue | 2 +-
8 files changed, 10 insertions(+), 13 deletions(-)
rename src/utils/{format.ts => icon-tag-format.ts} (100%)
diff --git a/src/components/custom/file-upload.vue b/src/components/custom/file-upload.vue
index b61b2373..0dea9af6 100644
--- a/src/components/custom/file-upload.vue
+++ b/src/components/custom/file-upload.vue
@@ -33,21 +33,18 @@ const props = withDefaults(defineProps
(), {
const attrs: UploadProps = useAttrs();
-const value = defineModel('value', { required: false, default: [] });
-
let fileNum = 0;
const fileList = ref([]);
-const needRelaodData = defineModel('needRelaodData', {
- default: false
-});
+
+const needRelaodData = ref(false);
+
defineExpose({
- refreshList: needRelaodData
+ needRelaodData
});
watch(
() => fileList.value,
newValue => {
needRelaodData.value = newValue.length > 0;
- value.value = newValue.map(item => item.id);
}
);
diff --git a/src/utils/format.ts b/src/utils/icon-tag-format.ts
similarity index 100%
rename from src/utils/format.ts
rename to src/utils/icon-tag-format.ts
diff --git a/src/views/_builtin/user-center/modules/online-table.vue b/src/views/_builtin/user-center/modules/online-table.vue
index d5d4c8af..e1c3eaad 100644
--- a/src/views/_builtin/user-center/modules/online-table.vue
+++ b/src/views/_builtin/user-center/modules/online-table.vue
@@ -4,7 +4,7 @@ import { useLoading } from '@sa/hooks';
import { fetchForceLogout, fetchGetOnlineDeviceList } from '@/service/api/monitor';
import { useAppStore } from '@/store/modules/app';
import { useTable } from '@/hooks/common/table';
-import { getBrowserIcon, getOsIcon } from '@/utils/format';
+import { getBrowserIcon, getOsIcon } from '@/utils/icon-tag-format';
import { $t } from '@/locales';
import ButtonIcon from '@/components/custom/button-icon.vue';
import SvgIcon from '@/components/custom/svg-icon.vue';
diff --git a/src/views/monitor/logininfor/index.vue b/src/views/monitor/logininfor/index.vue
index 2daf63cb..1812d59d 100644
--- a/src/views/monitor/logininfor/index.vue
+++ b/src/views/monitor/logininfor/index.vue
@@ -11,7 +11,7 @@ import { useAuth } from '@/hooks/business/auth';
import { useDownload } from '@/hooks/business/download';
import { useTable, useTableOperate } from '@/hooks/common/table';
import { useDict } from '@/hooks/business/dict';
-import { getBrowserIcon, getOsIcon } from '@/utils/format';
+import { getBrowserIcon, getOsIcon } from '@/utils/icon-tag-format';
import DictTag from '@/components/custom/dict-tag.vue';
import SvgIcon from '@/components/custom/svg-icon.vue';
import { $t } from '@/locales';
diff --git a/src/views/monitor/logininfor/modules/login-infor-view-drawer.vue b/src/views/monitor/logininfor/modules/login-infor-view-drawer.vue
index 0954fc5b..cb482acc 100644
--- a/src/views/monitor/logininfor/modules/login-infor-view-drawer.vue
+++ b/src/views/monitor/logininfor/modules/login-infor-view-drawer.vue
@@ -1,5 +1,5 @@
+
+
+
+
+
+
diff --git a/src/constants/app.ts b/src/constants/app.ts
index 4767c479..cc249c10 100644
--- a/src/constants/app.ts
+++ b/src/constants/app.ts
@@ -63,3 +63,11 @@ export const resetCacheStrategyRecord: Record = {
+ small: 'theme.table.size.small',
+ medium: 'theme.table.size.medium',
+ large: 'theme.table.size.large'
+};
+
+export const themeTableSizeOptions = transformRecordToOption(themeTableSizeRecord);
diff --git a/src/layouts/modules/theme-drawer/index.vue b/src/layouts/modules/theme-drawer/index.vue
index aa937d5a..1cb11390 100644
--- a/src/layouts/modules/theme-drawer/index.vue
+++ b/src/layouts/modules/theme-drawer/index.vue
@@ -6,6 +6,7 @@ import LayoutMode from './modules/layout-mode.vue';
import ThemeColor from './modules/theme-color.vue';
import PageFun from './modules/page-fun.vue';
import ConfigOperation from './modules/config-operation.vue';
+import TableProps from './modules/table-props.vue';
defineOptions({
name: 'ThemeDrawer'
@@ -21,6 +22,7 @@ const appStore = useAppStore();
+
diff --git a/src/layouts/modules/theme-drawer/modules/table-props.vue b/src/layouts/modules/theme-drawer/modules/table-props.vue
new file mode 100644
index 00000000..ac84e5ce
--- /dev/null
+++ b/src/layouts/modules/theme-drawer/modules/table-props.vue
@@ -0,0 +1,44 @@
+
+
+
+ {{ $t('theme.tablePropsTitle') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/locales/langs/en-us.ts b/src/locales/langs/en-us.ts
index ba006b8e..7ae7dc29 100644
--- a/src/locales/langs/en-us.ts
+++ b/src/locales/langs/en-us.ts
@@ -165,6 +165,20 @@ const local: App.I18n.Schema = {
visible: 'Watermark Full Screen Visible',
text: 'Watermark Text'
},
+ tablePropsTitle: 'Table Props',
+ table: {
+ size: {
+ title: 'Table Size',
+ small: 'Small',
+ medium: 'Medium',
+ large: 'Large'
+ },
+ bordered: 'Bordered',
+ bottomBordered: 'Bottom Bordered',
+ singleColumn: 'Single Column',
+ singleLine: 'Single Line',
+ striped: 'Striped'
+ },
themeDrawerTitle: 'Theme Configuration',
pageFunTitle: 'Page Function',
resetCacheStrategy: {
diff --git a/src/locales/langs/zh-cn.ts b/src/locales/langs/zh-cn.ts
index 3290c0db..4fbe3686 100644
--- a/src/locales/langs/zh-cn.ts
+++ b/src/locales/langs/zh-cn.ts
@@ -165,6 +165,20 @@ const local: App.I18n.Schema = {
visible: '显示全屏水印',
text: '水印文本'
},
+ tablePropsTitle: '表格配置',
+ table: {
+ size: {
+ title: '表格大小',
+ small: '小',
+ medium: '中',
+ large: '大'
+ },
+ bordered: '边框',
+ bottomBordered: '底部边框',
+ singleColumn: '设定行的分割线',
+ singleLine: '设定列的分割线',
+ striped: '斑马线条纹'
+ },
themeDrawerTitle: '主题配置',
pageFunTitle: '页面功能',
resetCacheStrategy: {
diff --git a/src/theme/settings.ts b/src/theme/settings.ts
index 57bc26d3..5d521d52 100644
--- a/src/theme/settings.ts
+++ b/src/theme/settings.ts
@@ -57,6 +57,14 @@ export const themeSettings: App.Theme.ThemeSetting = {
visible: import.meta.env.VITE_WATERMARK === 'Y',
text: 'RuoYi-Vue-Plus'
},
+ table: {
+ bordered: true,
+ bottomBordered: true,
+ singleColumn: false,
+ singleLine: true,
+ size: 'small',
+ striped: false
+ },
tokens: {
light: {
colors: {
diff --git a/src/typings/app.d.ts b/src/typings/app.d.ts
index b37b9083..d2273547 100644
--- a/src/typings/app.d.ts
+++ b/src/typings/app.d.ts
@@ -109,6 +109,20 @@ declare namespace App {
/** Watermark text */
text: string;
};
+ table: {
+ /** Whether to show the table border */
+ bordered: boolean;
+ /** Whether to show the table bottom border */
+ bottomBordered: boolean;
+ /** Whether to show the table single column */
+ singleColumn: boolean;
+ /** Whether to show the table single line */
+ singleLine: boolean;
+ /** Whether to show the table size */
+ size: UnionKey.ThemeTableSize;
+ /** Whether to show the table striped */
+ striped: boolean;
+ };
/** define some theme settings tokens, will transform to css variables */
tokens: {
light: ThemeSettingToken;
@@ -426,6 +440,15 @@ declare namespace App {
visible: string;
text: string;
};
+ tablePropsTitle: string;
+ table: {
+ size: { title: string } & Record;
+ bordered: string;
+ bottomBordered: string;
+ singleColumn: string;
+ singleLine: string;
+ striped: string;
+ };
themeDrawerTitle: string;
pageFunTitle: string;
resetCacheStrategy: { title: string } & Record;
diff --git a/src/typings/components.d.ts b/src/typings/components.d.ts
index f735fc70..8be6129d 100644
--- a/src/typings/components.d.ts
+++ b/src/typings/components.d.ts
@@ -14,6 +14,7 @@ declare module 'vue' {
ButtonIcon: typeof import('./../components/custom/button-icon.vue')['default']
CountTo: typeof import('./../components/custom/count-to.vue')['default']
DarkModeContainer: typeof import('./../components/common/dark-mode-container.vue')['default']
+ DataTable: typeof import('./../components/common/data-table.vue')['default']
DeptTree: typeof import('./../components/custom/dept-tree.vue')['default']
DeptTreeSelect: typeof import('./../components/custom/dept-tree-select.vue')['default']
DictRadio: typeof import('./../components/custom/dict-radio.vue')['default']
diff --git a/src/typings/union-key.d.ts b/src/typings/union-key.d.ts
index a783294b..dc27a701 100644
--- a/src/typings/union-key.d.ts
+++ b/src/typings/union-key.d.ts
@@ -51,6 +51,15 @@ declare namespace UnionKey {
*/
type ThemeTabMode = import('@sa/materials').PageTabMode;
+ /**
+ * The table size
+ *
+ * - small: small size
+ * - medium: medium size
+ * - large: large size
+ */
+ type ThemeTableSize = 'small' | 'medium' | 'large';
+
/** Unocss animate key */
type UnoCssAnimateKey =
| 'pulse'
diff --git a/src/views/demo/demo/index.vue b/src/views/demo/demo/index.vue
index fcc883fc..b9818f03 100644
--- a/src/views/demo/demo/index.vue
+++ b/src/views/demo/demo/index.vue
@@ -184,11 +184,10 @@ async function handleExport() {
@refresh="getData"
/>
-
-
Date: Thu, 5 Jun 2025 21:45:34 +0800
Subject: [PATCH 29/31] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E7=BA=A7?=
=?UTF-8?q?=E8=81=94=E8=8F=9C=E5=8D=95=E5=88=A0=E9=99=A4=E6=8C=89=E9=92=AE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/components/custom/menu-tree.vue | 6 +-
src/locales/langs/en-us.ts | 7 +-
src/locales/langs/zh-cn.ts | 7 +-
src/service/api/system/menu.ts | 8 ++
src/typings/app.d.ts | 2 +
src/views/system/menu/index.vue | 13 ++-
.../modules/menu-cascade-delete-modal.vue | 107 ++++++++++++++++++
7 files changed, 145 insertions(+), 5 deletions(-)
create mode 100644 src/views/system/menu/modules/menu-cascade-delete-modal.vue
diff --git a/src/components/custom/menu-tree.vue b/src/components/custom/menu-tree.vue
index fdb9960f..721204aa 100644
--- a/src/components/custom/menu-tree.vue
+++ b/src/components/custom/menu-tree.vue
@@ -9,11 +9,13 @@ defineOptions({ name: 'MenuTree' });
interface Props {
immediate?: boolean;
+ showHeader?: boolean;
[key: string]: any;
}
const props = withDefaults(defineProps(), {
- immediate: true
+ immediate: true,
+ showHeader: true
});
const { bool: expandAll } = useBoolean();
@@ -106,7 +108,7 @@ defineExpose({
-
+
展开/折叠
({
+ url: `/system/menu/cascade/${menuIds.join(',')}`,
+ method: 'delete'
+ });
+}
diff --git a/src/typings/app.d.ts b/src/typings/app.d.ts
index d2273547..a2a49d53 100644
--- a/src/typings/app.d.ts
+++ b/src/typings/app.d.ts
@@ -714,6 +714,7 @@ declare namespace App {
form: {
parentId: FormMsg;
menuType: FormMsg;
+ menuIds: FormMsg;
icon: FormMsg;
menuName: FormMsg;
orderNum: FormMsg;
@@ -740,6 +741,7 @@ declare namespace App {
addMenu: string;
addChildMenu: string;
editMenu: string;
+ cascadeDelete: string;
};
notice: {
title: string;
diff --git a/src/views/system/menu/index.vue b/src/views/system/menu/index.vue
index 8bc7a7ec..3c1887f3 100644
--- a/src/views/system/menu/index.vue
+++ b/src/views/system/menu/index.vue
@@ -14,6 +14,7 @@ import SvgIcon from '@/components/custom/svg-icon.vue';
import DictTag from '@/components/custom/dict-tag.vue';
import ButtonIcon from '@/components/custom/button-icon.vue';
import MenuOperateDrawer from './modules/menu-operate-drawer.vue';
+import MenuCascadeDeleteModal from './modules/menu-cascade-delete-modal.vue';
useDict('sys_show_hide');
useDict('sys_normal_disable');
@@ -26,6 +27,7 @@ const editingData = ref();
const operateType = ref('add');
const { loading, startLoading, endLoading } = useLoading();
const { bool: drawerVisible, setTrue: openDrawer } = useBoolean();
+const { bool: cascadeDeleteVisible, setTrue: openCascadeDeleteDrawer } = useBoolean();
const { loading: btnLoading, startLoading: startBtnLoading, endLoading: endBtnLoading } = useLoading();
/** tree pattern name , use tree search */
const name = ref();
@@ -304,10 +306,18 @@ const btnColumns: DataTableColumns = [
v-if="hasAuth('system:menu:add')"
size="small"
icon="material-symbols:add-rounded"
- class="h-28px text-icon"
+ class="h-28px text-icon color-primary"
:tooltip-content="$t('page.system.menu.addMenu')"
@click.stop="handleAddMenu(0)"
/>
+
= [
:menu-type="createType"
@submitted="handleSubmitted"
/>
+
diff --git a/src/views/system/menu/modules/menu-cascade-delete-modal.vue b/src/views/system/menu/modules/menu-cascade-delete-modal.vue
new file mode 100644
index 00000000..3f94a117
--- /dev/null
+++ b/src/views/system/menu/modules/menu-cascade-delete-modal.vue
@@ -0,0 +1,107 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t('common.cancel') }}
+ {{ $t('common.confirm') }}
+
+
+
+
+
+
From ea47523c6f82e8fa3535ecfb908aab21ed5e05d6 Mon Sep 17 00:00:00 2001
From: xlsea
Date: Thu, 5 Jun 2025 22:06:42 +0800
Subject: [PATCH 30/31] =?UTF-8?q?feat:=20=E8=8F=9C=E5=8D=95=E7=BA=A7?=
=?UTF-8?q?=E8=81=94=E5=88=A0=E9=99=A4=E6=96=B0=E5=A2=9E=E5=88=A0=E9=99=A4?=
=?UTF-8?q?=E6=8F=90=E7=A4=BA?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/locales/langs/en-us.ts | 1 +
src/locales/langs/zh-cn.ts | 1 +
src/typings/app.d.ts | 1 +
.../modules/menu-cascade-delete-modal.vue | 21 ++++++++++++++-----
4 files changed, 19 insertions(+), 5 deletions(-)
diff --git a/src/locales/langs/en-us.ts b/src/locales/langs/en-us.ts
index c884a79a..c2c4c9f5 100644
--- a/src/locales/langs/en-us.ts
+++ b/src/locales/langs/en-us.ts
@@ -591,6 +591,7 @@ const local: App.I18n.Schema = {
buttonPermissionList: 'Button Permission List',
emptyMenu: 'Empty Menu',
menuDetail: 'Menu Detail',
+ cascadeDeleteContent: 'Cascade delete menu will delete the selected menu and all its sub-menus, are you sure?',
iconifyTip: 'iconify address:`https://icones.js.org`',
isFrameTip: 'If you choose External Link, the routing address needs to start with `http(s)://`',
isCacheTip:
diff --git a/src/locales/langs/zh-cn.ts b/src/locales/langs/zh-cn.ts
index 0ab6341e..46b37507 100644
--- a/src/locales/langs/zh-cn.ts
+++ b/src/locales/langs/zh-cn.ts
@@ -591,6 +591,7 @@ const local: App.I18n.Schema = {
buttonPermissionList: '按钮权限列表',
emptyMenu: '暂无菜单',
menuDetail: '菜单详情',
+ cascadeDeleteContent: '级联删除菜单将删除所选中的菜单,是否继续?',
iconifyTip: 'iconify 地址:https://icones.js.org',
isFrameTip: '选择是外链则路由地址需要以`http(s)://`开头',
isCacheTip: '选择是则会被`keep-alive`缓存,需要匹配组件的`name`和地址保持一致',
diff --git a/src/typings/app.d.ts b/src/typings/app.d.ts
index 29415bb3..36c232c2 100644
--- a/src/typings/app.d.ts
+++ b/src/typings/app.d.ts
@@ -710,6 +710,7 @@ declare namespace App {
buttonPermissionList: string;
emptyMenu: string;
menuDetail: string;
+ cascadeDeleteContent: string;
iconifyTip: string;
isFrameTip: string;
isCacheTip: string;
diff --git a/src/views/system/menu/modules/menu-cascade-delete-modal.vue b/src/views/system/menu/modules/menu-cascade-delete-modal.vue
index 3f94a117..307f7550 100644
--- a/src/views/system/menu/modules/menu-cascade-delete-modal.vue
+++ b/src/views/system/menu/modules/menu-cascade-delete-modal.vue
@@ -56,11 +56,22 @@ function closeDrawer() {
async function handleSubmit() {
await validate();
- const { error } = await fetchCascadeDeleteMenu(model.menuIds);
- if (error) return;
- window.$message?.success($t('common.deleteSuccess'));
- closeDrawer();
- emit('submitted');
+ window.$dialog?.warning({
+ title: $t('page.system.menu.cascadeDelete'),
+ content: $t('page.system.menu.cascadeDeleteContent'),
+ positiveText: $t('common.delete'),
+ positiveButtonProps: {
+ type: 'error'
+ },
+ negativeText: $t('common.cancel'),
+ onPositiveClick: async () => {
+ const { error } = await fetchCascadeDeleteMenu(model.menuIds);
+ if (error) return;
+ window.$message?.success($t('common.deleteSuccess'));
+ closeDrawer();
+ emit('submitted');
+ }
+ });
}
watch(visible, () => {
From 0ab8bd8a98a83404d9a933564fb9d0c7eb03165b Mon Sep 17 00:00:00 2001
From: xlsea
Date: Thu, 5 Jun 2025 22:07:48 +0800
Subject: [PATCH 31/31] chore(projects): release v1.0.0
---
CHANGELOG.md | 13 +++++++++++++
package.json | 2 +-
2 files changed, 14 insertions(+), 1 deletion(-)
create mode 100644 CHANGELOG.md
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 00000000..a292c36d
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,13 @@
+# 更新日志
+
+## [v1.0.0](https://gitee.com/xlsea/ruoyi-plus-soybean/releases/tag/v1.0.0) (2025-06-05)
+
+### 🚀 新功能
+
+1.0.0 版本正式发布,此版本不包含工作流与多语言,请期待后续版本发布。
+
+### ❤️ 贡献者
+
+首次发版不展示过多贡献者,敬请谅解
+
+[](https://github.com/honghuangdc) [](https://gitee.com/xlsea) [](https://gitee.com/elio-an) [](https://github.com/wangqiqi95)
diff --git a/package.json b/package.json
index dac5a01e..84560213 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
"name": "ruoyi-vue-plus",
"type": "module",
- "version": "1.0.0-beta.1",
+ "version": "1.0.0",
"description": "RuoYi-Vue-Plus多租户管理系统",
"author": {
"name": "xlsea",