From 0392b3b10141c1f0d8511d3b62d91e1f3c8911dc Mon Sep 17 00:00:00 2001 From: 1638245306 <1638245306@qq.com> Date: Fri, 28 Mar 2025 13:39:44 +0800 Subject: [PATCH 1/8] =?UTF-8?q?feat(plugins):=20=E5=8A=A8=E6=80=81?= =?UTF-8?q?=E5=8A=A0=E8=BD=BD=E6=8F=92=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增插件动态加载逻辑,遍历已发现的插件列表 - 对于每个插件,尝试导入其 index.ts 文件 - 导入成功后,将插件注册到应用中,并打印加载信息 -导入失败时,打印错误信息,提示插件下无 index.ts 文件 --- web/src/views/plugins/index.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/web/src/views/plugins/index.ts b/web/src/views/plugins/index.ts index e678075a..f1a33817 100644 --- a/web/src/views/plugins/index.ts +++ b/web/src/views/plugins/index.ts @@ -22,4 +22,13 @@ export const scanAndInstallPlugins = (app: any) => { } pluginsAll = Array.from(pluginNames); console.log('已发现插件:', pluginsAll); + for (const pluginName of pluginsAll) { + const plugin = import(`./${pluginName}/index.ts`); + plugin.then((module) => { + app.use(module.default) + console.log(`${pluginName}插件已加载`) + }).catch((error) => { + console.log(`${pluginName}插件下无index.ts`) + }) + } }; -- Gitee From 4b05a28f4cbfa76bdd11599db3afa06d1180912d Mon Sep 17 00:00:00 2001 From: 1638245306 <1638245306@qq.com> Date: Fri, 28 Mar 2025 14:44:39 +0800 Subject: [PATCH 2/8] =?UTF-8?q?fix(system):=20=E4=BF=AE=E6=94=B9=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E5=AF=86=E7=A0=81=E8=AE=BE=E7=BD=AE=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除了对新密码进行 MD5 加密的步骤- 直接使用明文密码进行加密存储 - 保留了密码修改次数的计数功能 --- backend/dvadmin/system/views/user.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/dvadmin/system/views/user.py b/backend/dvadmin/system/views/user.py index 464e77dc..c31540c2 100644 --- a/backend/dvadmin/system/views/user.py +++ b/backend/dvadmin/system/views/user.py @@ -352,7 +352,7 @@ class UserViewSet(CustomModelViewSet): if new_pwd != new_pwd2: return ErrorResponse(msg="两次密码不匹配") else: - request.user.password = make_password(hashlib.md5(new_pwd.encode(encoding='UTF-8')).hexdigest()) + request.user.password = make_password(new_pwd) request.user.pwd_change_count += 1 request.user.save() return DetailResponse(data=None, msg="修改成功") -- Gitee From 7a152d359144209e25cd8f47c25496190884e70e Mon Sep 17 00:00:00 2001 From: 1638245306 <1638245306@qq.com> Date: Fri, 28 Mar 2025 15:08:56 +0800 Subject: [PATCH 3/8] =?UTF-8?q?feat(system):=20=E6=B7=BB=E5=8A=A0=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E7=94=A8=E6=88=B7=E9=80=92=E5=BD=92=E9=83=A8=E9=97=A8?= =?UTF-8?q?=E5=90=8D=E7=A7=B0=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 Department模型中添加了 _recursion 类方法,用于递归获取指定属性值 - 新增 get_region_name 类方法,用于获取用户的所有上级部门名称 - 该功能可以用于显示用户所在的完整部门路径 --- backend/dvadmin/system/models.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/backend/dvadmin/system/models.py b/backend/dvadmin/system/models.py index 5d500b79..d6c229b6 100644 --- a/backend/dvadmin/system/models.py +++ b/backend/dvadmin/system/models.py @@ -122,6 +122,27 @@ class Dept(CoreModel): help_text="上级部门", ) + @classmethod + def _recursion(cls, instance, parent, result): + new_instance = getattr(instance, parent, None) + res = [] + data = getattr(instance, result, None) + if data: + res.append(data) + if new_instance: + array = cls._recursion(new_instance, parent, result) + res += array + return res + + @classmethod + def get_region_name(cls, obj): + """ + 获取某个用户的递归所有部门名称 + """ + dept_name_all = cls._recursion(obj, "parent", "name") + dept_name_all.reverse() + return "/".join(dept_name_all) + @classmethod def recursion_all_dept(cls, dept_id: int, dept_all_list=None, dept_list=None): """ -- Gitee From 8eacc4aad3280d4048949e0c19ec07ffa14d3368 Mon Sep 17 00:00:00 2001 From: 1638245306 <1638245306@qq.com> Date: Fri, 28 Mar 2025 18:24:13 +0800 Subject: [PATCH 4/8] =?UTF-8?q?feat(system):=20=E8=A7=92=E8=89=B2=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B=E6=B7=BB=E5=8A=A0=E5=B7=A5=E4=BD=9C=E6=B5=81=E6=94=AF?= =?UTF-8?q?=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 引入 FlowBaseModel 以支持工作流功能 - 使 Role 模型继承 CoreModel 和 FlowBaseModel --- backend/dvadmin/system/models.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/dvadmin/system/models.py b/backend/dvadmin/system/models.py index d6c229b6..c70f2561 100644 --- a/backend/dvadmin/system/models.py +++ b/backend/dvadmin/system/models.py @@ -9,8 +9,8 @@ from django.core.exceptions import ObjectDoesNotExist, ValidationError from application import dispatch from dvadmin.utils.models import CoreModel, table_prefix, get_custom_app_models - -class Role(CoreModel): +from dvadmin3_flow.base_model import FlowBaseModel +class Role(CoreModel,FlowBaseModel): name = models.CharField(max_length=64, verbose_name="角色名称", help_text="角色名称") key = models.CharField(max_length=64, unique=True, verbose_name="权限字符", help_text="权限字符") sort = models.IntegerField(default=1, verbose_name="角色顺序", help_text="角色顺序") -- Gitee From 66c28bd389aa125ec8c7a6800f12ea67ceb0458b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=BE=89?= Date: Mon, 7 Apr 2025 15:20:52 +0800 Subject: [PATCH 5/8] =?UTF-8?q?=E6=97=A5=E5=8E=86=E9=80=89=E6=8B=A9?= =?UTF-8?q?=E5=99=A8=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/package.json | 4 +- web/src/components/calendar/index.vue | 403 ++++++++++++++++++++++++++ 2 files changed, 406 insertions(+), 1 deletion(-) create mode 100644 web/src/components/calendar/index.vue diff --git a/web/package.json b/web/package.json index 61d8bc49..ac60e3ff 100644 --- a/web/package.json +++ b/web/package.json @@ -5,7 +5,7 @@ "license": "MIT", "scripts": { "dev": "vite --force", - "build:dev":"vite build --mode development", + "build:dev": "vite build --mode development", "build": "vite build", "build:local": "vite build --mode local_prod", "lint-fix": "eslint --fix --ext .js --ext .jsx --ext .vue src/" @@ -26,6 +26,7 @@ "axios": "^1.7.4", "countup.js": "^2.8.0", "cropperjs": "^1.6.2", + "date-holidays": "^3.24.1", "e-icon-picker": "2.1.1", "echarts": "^5.5.1", "echarts-gl": "^2.0.9", @@ -37,6 +38,7 @@ "js-table2excel": "^1.1.2", "jsplumb": "^2.15.6", "lodash-es": "^4.17.21", + "lunar-javascript": "^1.7.1", "mitt": "^3.0.1", "nprogress": "^0.2.0", "pinia": "^2.0.28", diff --git a/web/src/components/calendar/index.vue b/web/src/components/calendar/index.vue new file mode 100644 index 00000000..9c44e601 --- /dev/null +++ b/web/src/components/calendar/index.vue @@ -0,0 +1,403 @@ + + + + + + \ No newline at end of file -- Gitee From bda002398c0a600d26dd986b31bc72f5e454d5fc Mon Sep 17 00:00:00 2001 From: 1638245306 <1638245306@qq.com> Date: Tue, 29 Apr 2025 14:45:45 +0800 Subject: [PATCH 6/8] =?UTF-8?q?refactor:=20=E4=BF=AE=E6=94=B9=20API=20?= =?UTF-8?q?=E6=96=87=E6=A1=A3=E6=9D=83=E9=99=90=E4=B8=BA=E4=BB=85=E5=85=81?= =?UTF-8?q?=E8=AE=B8=E8=AE=A4=E8=AF=81=E7=94=A8=E6=88=B7=E8=AE=BF=E9=97=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将 API 文档的权限设置从 AllowAny 更改为 IsAuthenticated- 确保只有经过身份验证的用户才能访问 API 文档 --- backend/application/urls.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/application/urls.py b/backend/application/urls.py index cb5a8999..641b85cf 100644 --- a/backend/application/urls.py +++ b/backend/application/urls.py @@ -50,7 +50,7 @@ schema_view = get_schema_view( license=openapi.License(name="BSD License"), ), public=True, - permission_classes=(permissions.AllowAny,), + permission_classes=(permissions.IsAuthenticated,), generator_class=CustomOpenAPISchemaGenerator, ) # 前端页面映射 -- Gitee From 94149161b3c4a59538f5ec90938d6b2cd7b8b82e Mon Sep 17 00:00:00 2001 From: 1638245306 <1638245306@qq.com> Date: Wed, 30 Apr 2025 12:55:58 +0800 Subject: [PATCH 7/8] =?UTF-8?q?build(flowH5):=20=E6=B7=BB=E5=8A=A0=20flowH?= =?UTF-8?q?5=20=E9=A1=B9=E7=9B=AE=E7=9A=84=E9=85=8D=E7=BD=AE=E6=96=87?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 flowH5.config.ts 文件,配置 Vite 构建项目- 设置 Vue 插件和路径别名 - 配置 Roll --- web/flowH5.config.ts | 77 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 web/flowH5.config.ts diff --git a/web/flowH5.config.ts b/web/flowH5.config.ts new file mode 100644 index 00000000..21fbac9a --- /dev/null +++ b/web/flowH5.config.ts @@ -0,0 +1,77 @@ +import { defineConfig } from 'vite'; +import vue from '@vitejs/plugin-vue'; +import path, {resolve} from 'path'; +import vueJsx from "@vitejs/plugin-vue-jsx"; +import vueSetupExtend from "vite-plugin-vue-setup-extend"; +import { terser } from 'rollup-plugin-terser'; +import postcss from 'rollup-plugin-postcss'; +import pxtorem from 'postcss-pxtorem'; +const pathResolve = (dir: string) => { + return resolve(__dirname, '.', dir); +}; +export default defineConfig({ + build: { + // outDir: '../backend/static/previewer', + lib: { + entry: path.resolve(__dirname, './index.ts'), // 库的入口文件 + name: 'previewer', // 库的全局变量名称 + fileName: (format) => `index.${format}.js`, // 输出文件名格式 + }, + rollupOptions: { + input:{ + previewer: path.resolve(__dirname, './index.ts'), + }, + external: ['vue'], // 指定外部依赖 + output:{ + // dir: '../backend/static/previewer', // 输出目录 + entryFileNames: 'index.[format].js', // 入口文件名格式 + format: 'commonjs', + globals: { + vue: 'Vue' + }, + chunkFileNames: `[name].[hash].js` + }, + plugins: [ + terser({ + compress: { + drop_console: false, // 确保不移除 console.log + }, + }), + postcss({ + plugins: [ + pxtorem({ + rootValue: 37.5, + unitPrecision: 5, + propList: ['*'], + selectorBlackList: [], + replace: true, + mediaQuery: false, + minPixelValue: 0, + exclude: /node_modules/i, + }), + ], + }), + ], + }, + }, + plugins: [ + vue(), + vueJsx(), + vueSetupExtend(), + ], + resolve: { + alias: { + '/@': path.resolve(__dirname, 'src'), // '@' 别名指向 'src' 目录 + '@views': pathResolve('./src/views'), + '/src':path.resolve(__dirname, 'src') + }, + }, + css:{ + postcss:{ + + } + }, + define: { + 'process.env': {} + } +}); \ No newline at end of file -- Gitee From 3398aa3ba9044de71c87bbebc62dc141c38591f1 Mon Sep 17 00:00:00 2001 From: 1638245306 <1638245306@qq.com> Date: Thu, 1 May 2025 00:04:01 +0800 Subject: [PATCH 8/8] =?UTF-8?q?build(flowH5):=20=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E5=BA=93=E5=85=A5=E5=8F=A3=E6=96=87=E4=BB=B6=E8=B7=AF=E5=BE=84?= =?UTF-8?q?=E5=92=8C=E5=A4=96=E9=83=A8=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修改入口文件路径为 src/views/plugins/dvadmin3-flow-web/src/flowH5/index.ts - 添加 xe-utils 到外部依赖列表 --- web/flowH5.config.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/web/flowH5.config.ts b/web/flowH5.config.ts index 21fbac9a..505f7604 100644 --- a/web/flowH5.config.ts +++ b/web/flowH5.config.ts @@ -13,15 +13,15 @@ export default defineConfig({ build: { // outDir: '../backend/static/previewer', lib: { - entry: path.resolve(__dirname, './index.ts'), // 库的入口文件 + entry: path.resolve(__dirname, 'src/views/plugins/dvadmin3-flow-web/src/flowH5/index.ts'), // 库的入口文件 name: 'previewer', // 库的全局变量名称 fileName: (format) => `index.${format}.js`, // 输出文件名格式 }, rollupOptions: { input:{ - previewer: path.resolve(__dirname, './index.ts'), + previewer: path.resolve(__dirname, 'src/views/plugins/dvadmin3-flow-web/src/flowH5/index.ts'), }, - external: ['vue'], // 指定外部依赖 + external: ['vue','xe-utils'], // 指定外部依赖 output:{ // dir: '../backend/static/previewer', // 输出目录 entryFileNames: 'index.[format].js', // 入口文件名格式 -- Gitee