diff --git a/backend/application/urls.py b/backend/application/urls.py index cb5a89997adb091fb3f8b071a6c7be814583e766..641b85cf216850c815203e2838b86675b6e43679 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, ) # 前端页面映射 diff --git a/backend/dvadmin/system/models.py b/backend/dvadmin/system/models.py index 5d500b793c730cee502b68c28422b558d0b7952a..c70f2561b6ff5d6a007d996b1fdc688c367a68f7 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="角色顺序") @@ -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): """ diff --git a/backend/dvadmin/system/views/user.py b/backend/dvadmin/system/views/user.py index 464e77dc64733974fbfffb7ee9761627d3b915b3..c31540c22c98a1497a7c684b2608e33a1945f6cf 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="修改成功") diff --git a/web/flowH5.config.ts b/web/flowH5.config.ts new file mode 100644 index 0000000000000000000000000000000000000000..505f760474d656e14cda9f14ebbbb92273b7d97b --- /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, 'src/views/plugins/dvadmin3-flow-web/src/flowH5/index.ts'), // 库的入口文件 + name: 'previewer', // 库的全局变量名称 + fileName: (format) => `index.${format}.js`, // 输出文件名格式 + }, + rollupOptions: { + input:{ + previewer: path.resolve(__dirname, 'src/views/plugins/dvadmin3-flow-web/src/flowH5/index.ts'), + }, + external: ['vue','xe-utils'], // 指定外部依赖 + 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 diff --git a/web/package.json b/web/package.json index 61d8bc49da6b53bce7b88b574d4b192e8c89414f..ac60e3ffcf564b62bb04988e58e3aa537f23c3af 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 0000000000000000000000000000000000000000..9c44e60174037981be2c52b2f71d829007f1d26a --- /dev/null +++ b/web/src/components/calendar/index.vue @@ -0,0 +1,403 @@ + + + + + + \ No newline at end of file diff --git a/web/src/views/plugins/index.ts b/web/src/views/plugins/index.ts index e678075aef97c3f78f6d0537993c051833aa1764..f1a3381743413b1c1120d6b24af920b222ffa40f 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`) + }) + } };