diff --git a/README.zh.md b/README.zh.md
index a95a364..e3e1048 100644
--- a/README.zh.md
+++ b/README.zh.md
@@ -54,16 +54,21 @@
## 交流
- 交流社区:[戳我](https://bbs.django-vue-admin.com)👩👦👦
-
- 插件市场:[戳我](https://bbs.django-vue-admin.com/plugMarket.html)👩👦👦
-
- django-vue-admin交流01群(已满):812482043 [点击链接加入群聊](https://qm.qq.com/cgi-bin/qm/qr?k=aJVwjDvH-Es4MPJQuoO32N0SucK22TE5&jump_from=webapi)
- django-vue-admin交流02群(已满):687252418 [点击链接加入群聊](https://qm.qq.com/cgi-bin/qm/qr?k=4jJN4IjWGfxJ8YJXbb_gTsuWjR34WLdc&jump_from=webapi)
-- django-vue-admin交流03群:442108213 [点击链接加入群聊](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=wsm5oSz3K8dElBYUDtLTcQSEPhINFkl8&authKey=M6sbER0z59ZakgBr5erFeZyFZU15CI52bErNZa%2FxSvvGIuVAbY0N5866v89hm%2FK4&noverify=0&group_code=442108213)
+- django-vue-admin交流03群(已满):442108213 [点击链接加入群聊](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=wsm5oSz3K8dElBYUDtLTcQSEPhINFkl8&authKey=M6sbER0z59ZakgBr5erFeZyFZU15CI52bErNZa%2FxSvvGIuVAbY0N5866v89hm%2FK4&noverify=0&group_code=442108213)
+- django-vue-admin交流04群:442108213 [点击链接加入群聊](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=wsm5oSz3K8dElBYUDtLTcQSEPhINFkl8&authKey=M6sbER0z59ZakgBr5erFeZyFZU15CI52bErNZa%2FxSvvGIuVAbY0N5866v89hm%2FK4&noverify=0&group_code=442108213)
-- 二维码
-
+
+## 给框架点赞
+
+
+
+
+
+
## 交流
diff --git a/web/flowH5.config.ts b/web/flowH5.config.ts
new file mode 100644
index 0000000..505f760
--- /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 7022283..73981a4 100644
--- a/web/package.json
+++ b/web/package.json
@@ -1,10 +1,11 @@
{
"name": "django-vue3-admin",
- "version": "3.0.4",
+ "version": "3.2.0",
"description": "是一套全部开源的快速开发平台,毫无保留给个人免费使用、团体授权使用。\n django-vue3-admin 基于RBAC模型的权限控制的一整套基础开发平台,权限粒度达到列级别,前后端分离,后端采用django + django-rest-framework,前端采用基于 vue3 + CompositionAPI + typescript + vite + element plus",
"license": "MIT",
"scripts": {
"dev": "vite --force",
+ "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/"
@@ -15,6 +16,7 @@
"@fast-crud/fast-extends": "^1.21.2",
"@fast-crud/ui-element": "^1.21.2",
"@fast-crud/ui-interface": "^1.21.2",
+ "@great-dream/dvadmin3-celery-web": "^3.1.3",
"@iconify/vue": "^4.1.2",
"@types/lodash": "^4.17.7",
"@vitejs/plugin-vue-jsx": "^4.0.1",
@@ -24,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",
@@ -34,7 +37,9 @@
"js-cookie": "^3.0.5",
"js-table2excel": "^1.1.2",
"jsplumb": "^2.15.6",
+ "less": "^4.3.0",
"lodash-es": "^4.17.21",
+ "lunar-javascript": "^1.7.1",
"mitt": "^3.0.1",
"nprogress": "^0.2.0",
"pinia": "^2.0.28",
@@ -49,9 +54,12 @@
"tailwindcss": "^3.2.7",
"ts-md5": "^1.3.1",
"upgrade": "^1.1.0",
+ "vant": "^4.9.19",
+ "vant4-kit": "^1.0.3",
"vue": "^3.4.38",
"vue-clipboard3": "^2.0.0",
"vue-cropper": "^1.0.8",
+ "vue-draggable-plus": "^0.6.0",
"vue-grid-layout": "^3.0.0-beta1",
"vue-i18n": "^9.14.0",
"vue-router": "^4.4.3",
diff --git a/web/src/App.vue b/web/src/App.vue
index 56f585e..449b965 100644
--- a/web/src/App.vue
+++ b/web/src/App.vue
@@ -11,7 +11,7 @@
diff --git a/web/src/assets/iconfont/iconfont-01/iconfont.css b/web/src/assets/iconfont/iconfont-01/iconfont.css
new file mode 100644
index 0000000..6ac83a6
--- /dev/null
+++ b/web/src/assets/iconfont/iconfont-01/iconfont.css
@@ -0,0 +1,55 @@
+@font-face {
+ font-family: "iconfont"; /* Project id 3882322 */
+ src: url('iconfont.woff2?t=1676037377315') format('woff2'),
+ url('iconfont.woff?t=1676037377315') format('woff'),
+ url('iconfont.ttf?t=1676037377315') format('truetype');
+}
+
+.iconfont {
+ font-family: "iconfont" !important;
+ font-size: 16px;
+ font-style: normal;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+.icon-xiaoxizhongxin:before {
+ content: "\e665";
+}
+
+.icon-xitongshezhi:before {
+ content: "\e7ba";
+}
+
+.icon-caozuorizhi:before {
+ content: "\e611";
+}
+
+.icon-guanlidenglurizhi:before {
+ content: "\ea45";
+}
+
+.icon-rizhi:before {
+ content: "\e60c";
+}
+
+.icon-system:before {
+ content: "\e684";
+}
+
+.icon-Area:before {
+ content: "\eaa2";
+}
+
+.icon-file:before {
+ content: "\e671";
+}
+
+.icon-dict:before {
+ content: "\e626";
+}
+
+.icon-configure:before {
+ content: "\e733";
+}
+
diff --git a/web/src/assets/iconfont/iconfont-01/iconfont.ttf b/web/src/assets/iconfont/iconfont-01/iconfont.ttf
new file mode 100644
index 0000000..1220a01
Binary files /dev/null and b/web/src/assets/iconfont/iconfont-01/iconfont.ttf differ
diff --git a/web/src/assets/iconfont/iconfont-01/iconfont.woff b/web/src/assets/iconfont/iconfont-01/iconfont.woff
new file mode 100644
index 0000000..4ce6f7c
Binary files /dev/null and b/web/src/assets/iconfont/iconfont-01/iconfont.woff differ
diff --git a/web/src/assets/iconfont/iconfont-01/iconfont.woff2 b/web/src/assets/iconfont/iconfont-01/iconfont.woff2
new file mode 100644
index 0000000..c7a73e7
Binary files /dev/null and b/web/src/assets/iconfont/iconfont-01/iconfont.woff2 differ
diff --git a/web/src/assets/iconfont/iconfont-02/iconfont.css b/web/src/assets/iconfont/iconfont-02/iconfont.css
new file mode 100644
index 0000000..a7393cc
--- /dev/null
+++ b/web/src/assets/iconfont/iconfont-02/iconfont.css
@@ -0,0 +1,427 @@
+@font-face {
+ font-family: "iconfont"; /* Project id 2298093 */
+ src: url('iconfont.woff2?t=1627014681704') format('woff2'),
+ url('iconfont.woff?t=1627014681704') format('woff'),
+ url('iconfont.ttf?t=1627014681704') format('truetype');
+}
+
+.iconfont {
+ font-family: "iconfont" !important;
+ font-size: 16px;
+ font-style: normal;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+.icon-diannao101:before {
+ content: "\e670";
+}
+
+.icon-diannao:before {
+ content: "\e618";
+}
+
+.icon-diannao1:before {
+ content: "\e622";
+}
+
+.icon-diannao-shuju:before {
+ content: "\e63e";
+}
+
+.icon-shoujidiannao:before {
+ content: "\e62e";
+}
+
+.icon-diannaobangong:before {
+ content: "\e647";
+}
+
+.icon-LoggedinPC:before {
+ content: "\e604";
+}
+
+.icon-barcode-qr:before {
+ content: "\e61e";
+}
+
+.icon-zhongduancanshuchaxun:before {
+ content: "\e638";
+}
+
+.icon-shouye_dongtaihui:before {
+ content: "\e606";
+}
+
+.icon-putong:before {
+ content: "\e603";
+}
+
+.icon-dongtai:before {
+ content: "\e659";
+}
+
+.icon-wenducanshu-05:before {
+ content: "\e634";
+}
+
+.icon-zhongduancanshu:before {
+ content: "\e63b";
+}
+
+.icon-tongzhi1:before {
+ content: "\e63a";
+}
+
+.icon-tongzhi2:before {
+ content: "\e649";
+}
+
+.icon-tongzhi3:before {
+ content: "\e648";
+}
+
+.icon-tongzhi4:before {
+ content: "\e60c";
+}
+
+.icon-dianhua:before {
+ content: "\e615";
+}
+
+.icon-xianshimima:before {
+ content: "\e63c";
+}
+
+.icon-yincangmima:before {
+ content: "\e63d";
+}
+
+.icon-shuxing:before {
+ content: "\e67a";
+}
+
+.icon-juxingkaobei:before {
+ content: "\e7a5";
+}
+
+.icon-shuxingtu:before {
+ content: "\e685";
+}
+
+.icon-bolangneng:before {
+ content: "\e745";
+}
+
+.icon-bolangnengshiyanchang:before {
+ content: "\e746";
+}
+
+.icon--chaifenhang:before {
+ content: "\e6d1";
+}
+
+.icon--chaifenlie:before {
+ content: "\e6d0";
+}
+
+.icon-tupianyulan:before {
+ content: "\e67e";
+}
+
+.icon-15tupianyulan:before {
+ content: "\e624";
+}
+
+.icon-728bianjiqi_zitidaxiao:before {
+ content: "\e660";
+}
+
+.icon-ziti:before {
+ content: "\e7b1";
+}
+
+.icon-font-size:before {
+ content: "\eaef";
+}
+
+.icon-tuodong:before {
+ content: "\e6a8";
+}
+
+.icon-zhongyingwen1:before {
+ content: "\e7a3";
+}
+
+.icon-fuhao-yingwen:before {
+ content: "\e714";
+}
+
+.icon-fuhao-zhongwen:before {
+ content: "\e712";
+}
+
+.icon-diqiu:before {
+ content: "\e689";
+}
+
+.icon-xingqiu:before {
+ content: "\e65c";
+}
+
+.icon-diqiu1:before {
+ content: "\e631";
+}
+
+.icon-huanjingxingqiu:before {
+ content: "\e617";
+}
+
+.icon-zidingyibuju:before {
+ content: "\e637";
+}
+
+.icon-dayin:before {
+ content: "\e612";
+}
+
+.icon-step:before {
+ content: "\e601";
+}
+
+.icon-30xuanzhongyuanxingfill:before {
+ content: "\e677";
+}
+
+.icon-shibai:before {
+ content: "\e60b";
+}
+
+.icon-7_round_solid:before {
+ content: "\e64d";
+}
+
+.icon-6_round_solid:before {
+ content: "\e64e";
+}
+
+.icon-9_round_solid:before {
+ content: "\e64f";
+}
+
+.icon-1_round_solid:before {
+ content: "\e650";
+}
+
+.icon-5_round_solid:before {
+ content: "\e651";
+}
+
+.icon-2_round_solid:before {
+ content: "\e654";
+}
+
+.icon-0_round_solid:before {
+ content: "\e655";
+}
+
+.icon-3_round_solid:before {
+ content: "\e656";
+}
+
+.icon-4_round_solid:before {
+ content: "\e657";
+}
+
+.icon-8_round_solid:before {
+ content: "\e658";
+}
+
+.icon-radio-off-full:before {
+ content: "\ea6b";
+}
+
+.icon-tongzhi:before {
+ content: "\e600";
+}
+
+.icon-ditu:before {
+ content: "\e8bc";
+}
+
+.icon-ico:before {
+ content: "\e646";
+}
+
+.icon-chazhaobiaodanliebiao:before {
+ content: "\e76a";
+}
+
+.icon-biaodan:before {
+ content: "\e61d";
+}
+
+.icon-siweidaotu:before {
+ content: "\e614";
+}
+
+.icon-jiliandongxuanzeqi:before {
+ content: "\e616";
+}
+
+.icon-caijian:before {
+ content: "\e611";
+}
+
+.icon-fuwenben:before {
+ content: "\e7e4";
+}
+
+.icon-fuwenbenkuang:before {
+ content: "\e66f";
+}
+
+.icon-shangchuan:before {
+ content: "\e663";
+}
+
+.icon-xuanzeqi:before {
+ content: "\e635";
+}
+
+.icon-fangkuang:before {
+ content: "\e642";
+}
+
+.icon-gouxuan-weixuanzhong-xianxingfangkuang:before {
+ content: "\e77b";
+}
+
+.icon-shidu:before {
+ content: "\e60a";
+}
+
+.icon-yangan:before {
+ content: "\e67d";
+}
+
+.icon-wendu:before {
+ content: "\e686";
+}
+
+.icon-zaosheng:before {
+ content: "\e61c";
+}
+
+.icon-jinridaiban:before {
+ content: "\e60f";
+}
+
+.icon-AIshiyanshi:before {
+ content: "\e609";
+}
+
+.icon-shenqingkaiban:before {
+ content: "\e639";
+}
+
+.icon-zhongyingwenqiehuan:before {
+ content: "\e611";
+}
+
+.icon-zhongyingwen:before {
+ content: "\e605";
+}
+
+.icon-zhongyingzhuanhuan:before {
+ content: "\e6a2";
+}
+
+.icon-zhongyingwenyuyan:before {
+ content: "\e609";
+}
+
+.icon-shuju:before {
+ content: "\e613";
+}
+
+.icon-ico_shuju:before {
+ content: "\e6ff";
+}
+
+.icon-shuju1:before {
+ content: "\e60e";
+}
+
+.icon-fuzhiyemian:before {
+ content: "\e772";
+}
+
+.icon-caozuo-wailian:before {
+ content: "\e711";
+}
+
+.icon-icon-:before {
+ content: "\e620";
+}
+
+.icon-gerenzhongxin:before {
+ content: "\e60d";
+}
+
+.icon-caidan:before {
+ content: "\e652";
+}
+
+.icon-xitongshezhi:before {
+ content: "\e69b";
+}
+
+.icon-neiqianshujuchucun:before {
+ content: "\e62f";
+}
+
+.icon-shouye:before {
+ content: "\e653";
+}
+
+.icon-quanxian:before {
+ content: "\e610";
+}
+
+.icon-zujian:before {
+ content: "\e85e";
+}
+
+.icon-crew_feature:before {
+ content: "\e602";
+}
+
+.icon-gongju:before {
+ content: "\e62d";
+}
+
+.icon-skin:before {
+ content: "\e636";
+}
+
+.icon-shixinyuan:before {
+ content: "\e669";
+}
+
+.icon-webicon318:before {
+ content: "\e6a9";
+}
+
+.icon-dian:before {
+ content: "\e608";
+}
+
+.icon-fullscreen:before {
+ content: "\e623";
+}
+
+.icon-tuichuquanping:before {
+ content: "\e641";
+}
+
diff --git a/web/src/assets/iconfont/iconfont-02/iconfont.ttf b/web/src/assets/iconfont/iconfont-02/iconfont.ttf
new file mode 100644
index 0000000..2d3a61d
Binary files /dev/null and b/web/src/assets/iconfont/iconfont-02/iconfont.ttf differ
diff --git a/web/src/assets/iconfont/iconfont-02/iconfont.woff b/web/src/assets/iconfont/iconfont-02/iconfont.woff
new file mode 100644
index 0000000..c3575c3
Binary files /dev/null and b/web/src/assets/iconfont/iconfont-02/iconfont.woff differ
diff --git a/web/src/assets/iconfont/iconfont-02/iconfont.woff2 b/web/src/assets/iconfont/iconfont-02/iconfont.woff2
new file mode 100644
index 0000000..9eaf90e
Binary files /dev/null and b/web/src/assets/iconfont/iconfont-02/iconfont.woff2 differ
diff --git a/web/src/assets/login-bg.png b/web/src/assets/login-bg.png
new file mode 100644
index 0000000..9fd3aa4
Binary files /dev/null and b/web/src/assets/login-bg.png differ
diff --git a/web/src/components/avatarSelector/index.vue b/web/src/components/avatarSelector/index.vue
index f979cb0..2464554 100644
--- a/web/src/components/avatarSelector/index.vue
+++ b/web/src/components/avatarSelector/index.vue
@@ -1,6 +1,6 @@
-