From 75a1447d666acfeae69f784212f5f7b681a8ca8e Mon Sep 17 00:00:00 2001
From: Echo <1711788888@qq.com>
Date: Wed, 9 Apr 2025 12:10:46 +0800
Subject: [PATCH] :sparkles: init Project
---
.docker-compose/nginx/conf.d/my.conf | 26 +
.docker-compose/nginx/conf.d/nginx.conf | 32 +
.dockerignore | 1 +
.env.development | 11 +
.env.production | 7 +
.gitignore | 17 +-
.prettierrc | 12 +
Dockerfile | 25 +
README.md | 107 +-
babel.config.js | 4 +
eslint.config.mjs | 29 +
index.html | 115 ++
jsconfig.json | 10 +
limit.js | 37 +
package.json | 75 +
postcss.config.js | 6 +
public/favicon.ico | Bin 0 -> 4286 bytes
public/logo.png | Bin 0 -> 76683 bytes
src/App.vue | 41 +
src/api/api.js | 176 ++
src/api/attachmentCategory.js | 26 +
src/api/authority.js | 85 +
src/api/authorityBtn.js | 25 +
src/api/autoCode.js | 198 ++
src/api/bot/bot.js | 110 ++
src/api/breakpoint.js | 43 +
src/api/casbin.js | 32 +
src/api/category/category.js | 110 ++
src/api/customer.js | 80 +
src/api/email.js | 14 +
src/api/exportTemplate.js | 128 ++
src/api/fileUploadAndDownload.js | 67 +
src/api/github.js | 19 +
src/api/initdb.js | 27 +
src/api/jwt.js | 14 +
src/api/menu.js | 113 ++
src/api/sysDictionary.js | 80 +
src/api/sysDictionaryDetail.js | 80 +
src/api/sysOperationRecord.js | 48 +
src/api/sysParams.js | 111 ++
src/api/system.js | 55 +
src/api/user.js | 181 ++
src/assets/404.png | Bin 0 -> 43988 bytes
src/assets/background.svg | 1 +
src/assets/banner.jpg | Bin 0 -> 40498 bytes
src/assets/banner2.jpg | Bin 0 -> 45773 bytes
src/assets/dashboard.png | Bin 0 -> 72153 bytes
src/assets/docs.png | Bin 0 -> 4701 bytes
src/assets/flipped-aurora.png | Bin 0 -> 72652 bytes
src/assets/github.png | Bin 0 -> 7793 bytes
src/assets/icons/ai-gva.svg | 1 +
src/assets/icons/customer-gva.svg | 1 +
src/assets/kefu.png | Bin 0 -> 6770 bytes
src/assets/login_background.jpg | Bin 0 -> 41154 bytes
src/assets/login_background.svg | 33 +
src/assets/login_left.svg | 123 ++
src/assets/login_right_banner.jpg | Bin 0 -> 719028 bytes
src/assets/logo.jpg | Bin 0 -> 27616 bytes
src/assets/logo.png | Bin 0 -> 8060 bytes
src/assets/logo_login.png | Bin 0 -> 25312 bytes
src/assets/nav_logo.png | Bin 0 -> 76683 bytes
src/assets/noBody.png | Bin 0 -> 4097 bytes
src/assets/notFound.png | Bin 0 -> 19669 bytes
src/assets/qm.png | Bin 0 -> 4821 bytes
src/assets/video.png | Bin 0 -> 5160 bytes
src/components/arrayCtrl/arrayCtrl.vue | 67 +
src/components/bottomInfo/bottomInfo.vue | 44 +
src/components/charts/index.vue | 54 +
src/components/commandMenu/index.vue | 196 ++
src/components/customPic/index.vue | 90 +
src/components/exportExcel/exportExcel.vue | 75 +
src/components/exportExcel/exportTemplate.vue | 40 +
src/components/exportExcel/importExcel.vue | 45 +
src/components/office/docx.vue | 31 +
src/components/office/excel.vue | 36 +
src/components/office/index.vue | 49 +
src/components/office/pdf.vue | 39 +
src/components/richtext/rich-edit.vue | 86 +
src/components/richtext/rich-view.vue | 58 +
src/components/selectFile/selectFile.vue | 87 +
.../selectImage/selectComponent.vue | 86 +
src/components/selectImage/selectImage.vue | 453 +++++
src/components/svgIcon/svgIcon.vue | 32 +
src/components/upload/QR-code.vue | 65 +
src/components/upload/common.vue | 90 +
src/components/upload/cropper.vue | 237 +++
src/components/upload/image.vue | 102 +
src/components/warningBar/warningBar.vue | 33 +
src/core/config.js | 53 +
src/core/gin-vue-admin.js | 27 +
src/core/global.js | 59 +
src/directive/auth.js | 40 +
src/hooks/charts.js | 18 +
src/hooks/responsive.js | 35 +
src/hooks/use-windows-resize.js | 23 +
src/main.js | 21 +
src/pathInfo.json | 74 +
src/permission.js | 147 ++
src/pinia/index.js | 8 +
src/pinia/modules/app.js | 133 ++
src/pinia/modules/dictionary.js | 41 +
src/pinia/modules/params.js | 31 +
src/pinia/modules/router.js | 144 ++
src/pinia/modules/user.js | 144 ++
src/plugin/announcement/api/info.js | 110 ++
src/plugin/announcement/form/info.vue | 137 ++
src/plugin/announcement/view/info.vue | 510 +++++
src/plugin/email/api/email.js | 29 +
src/plugin/email/view/index.vue | 60 +
src/router/index.js | 41 +
src/style/element/index.scss | 24 +
src/style/element_visiable.scss | 136 ++
src/style/iconfont.css | 47 +
src/style/main.scss | 51 +
src/style/reset.scss | 469 +++++
src/style/transition.scss | 68 +
src/utils/asyncRouter.js | 29 +
src/utils/btnAuth.js | 6 +
src/utils/bus.js | 4 +
src/utils/closeThisPage.js | 5 +
src/utils/date.js | 44 +
src/utils/dictionary.js | 26 +
src/utils/doc.js | 3 +
src/utils/downloadImg.js | 20 +
src/utils/event.js | 17 +
src/utils/fmtRouterTitle.js | 13 +
src/utils/format.js | 146 ++
src/utils/image.js | 126 ++
src/utils/page.js | 9 +
src/utils/params.js | 14 +
src/utils/request.js | 172 ++
src/utils/stringFun.js | 29 +
src/view/about/index.vue | 166 ++
src/view/bot/bot/bot.vue | 411 ++++
src/view/bot/bot/botForm.vue | 118 ++
src/view/category/category/category.vue | 438 +++++
src/view/category/category/categoryForm.vue | 119 ++
src/view/dashboard/components/banner.vue | 43 +
src/view/dashboard/components/card.vue | 46 +
.../components/charts-content-numbers.vue | 189 ++
.../components/charts-people-numbers.vue | 138 ++
src/view/dashboard/components/charts.vue | 54 +
src/view/dashboard/components/index.js | 19 +
src/view/dashboard/components/notice.vue | 80 +
src/view/dashboard/components/pluginTable.vue | 66 +
src/view/dashboard/components/quickLinks.vue | 111 ++
src/view/dashboard/components/table.vue | 52 +
src/view/dashboard/components/wiki.vue | 45 +
src/view/dashboard/index.vue | 77 +
src/view/error/index.vue | 37 +
src/view/error/reload.vue | 14 +
src/view/example/breakpoint/breakpoint.vue | 340 ++++
src/view/example/customer/customer.vue | 215 +++
src/view/example/index.vue | 19 +
src/view/example/upload/scanUpload.vue | 245 +++
src/view/example/upload/upload.vue | 448 +++++
src/view/init/index.vue | 368 ++++
.../aside/asideComponent/asyncSubmenu.vue | 66 +
.../layout/aside/asideComponent/index.vue | 47 +
.../layout/aside/asideComponent/menuItem.vue | 43 +
src/view/layout/aside/combinationMode.vue | 146 ++
src/view/layout/aside/headMode.vue | 106 ++
src/view/layout/aside/index.vue | 34 +
src/view/layout/aside/normalMode.vue | 120 ++
src/view/layout/header/index.vue | 140 ++
src/view/layout/header/tools.vue | 192 ++
src/view/layout/iframe.vue | 73 +
src/view/layout/index.vue | 114 ++
src/view/layout/screenfull/index.vue | 62 +
src/view/layout/search/search.vue | 98 +
src/view/layout/setting/index.vue | 212 +++
src/view/layout/setting/title.vue | 34 +
src/view/layout/tabs/index.vue | 425 +++++
src/view/login/index.vue | 238 +++
src/view/person/person.vue | 631 ++++++
src/view/routerHolder.vue | 22 +
src/view/superAdmin/api/api.vue | 832 ++++++++
src/view/superAdmin/authority/authority.vue | 422 +++++
.../superAdmin/authority/components/apis.vue | 174 ++
.../superAdmin/authority/components/datas.vue | 145 ++
.../superAdmin/authority/components/menus.vue | 233 +++
.../superAdmin/dictionary/sysDictionary.vue | 255 +++
.../dictionary/sysDictionaryDetail.vue | 321 ++++
src/view/superAdmin/index.vue | 20 +
.../menu/components/components-cascader.vue | 131 ++
src/view/superAdmin/menu/icon.vue | 1179 ++++++++++++
src/view/superAdmin/menu/menu.vue | 680 +++++++
.../operation/sysOperationRecord.vue | 277 +++
src/view/superAdmin/params/sysParams.vue | 604 ++++++
src/view/superAdmin/user/user.vue | 524 +++++
src/view/system/state.vue | 192 ++
.../autoCode/component/fieldDialog.vue | 502 +++++
.../autoCode/component/previewCodeDialog.vue | 119 ++
src/view/systemTools/autoCode/index.vue | 1685 +++++++++++++++++
src/view/systemTools/autoCodeAdmin/index.vue | 620 ++++++
src/view/systemTools/autoPkg/autoPkg.vue | 205 ++
src/view/systemTools/exportTemplate/code.js | 32 +
.../exportTemplate/exportTemplate.vue | 996 ++++++++++
src/view/systemTools/formCreate/index.vue | 18 +
src/view/systemTools/index.vue | 20 +
src/view/systemTools/installPlugin/index.vue | 42 +
src/view/systemTools/pubPlug/pubPlug.vue | 225 +++
src/view/systemTools/system/system.vue | 1085 +++++++++++
tailwind.config.js | 23 +
vite.config.js | 113 ++
vitePlugin/componentName/index.js | 85 +
vitePlugin/secret/index.js | 6 +
207 files changed, 26387 insertions(+), 13 deletions(-)
create mode 100644 .docker-compose/nginx/conf.d/my.conf
create mode 100644 .docker-compose/nginx/conf.d/nginx.conf
create mode 100644 .dockerignore
create mode 100644 .env.development
create mode 100644 .env.production
create mode 100644 .prettierrc
create mode 100644 Dockerfile
create mode 100644 babel.config.js
create mode 100644 eslint.config.mjs
create mode 100644 index.html
create mode 100644 jsconfig.json
create mode 100644 limit.js
create mode 100644 package.json
create mode 100644 postcss.config.js
create mode 100644 public/favicon.ico
create mode 100644 public/logo.png
create mode 100644 src/App.vue
create mode 100644 src/api/api.js
create mode 100644 src/api/attachmentCategory.js
create mode 100644 src/api/authority.js
create mode 100644 src/api/authorityBtn.js
create mode 100644 src/api/autoCode.js
create mode 100644 src/api/bot/bot.js
create mode 100644 src/api/breakpoint.js
create mode 100644 src/api/casbin.js
create mode 100644 src/api/category/category.js
create mode 100644 src/api/customer.js
create mode 100644 src/api/email.js
create mode 100644 src/api/exportTemplate.js
create mode 100644 src/api/fileUploadAndDownload.js
create mode 100644 src/api/github.js
create mode 100644 src/api/initdb.js
create mode 100644 src/api/jwt.js
create mode 100644 src/api/menu.js
create mode 100644 src/api/sysDictionary.js
create mode 100644 src/api/sysDictionaryDetail.js
create mode 100644 src/api/sysOperationRecord.js
create mode 100644 src/api/sysParams.js
create mode 100644 src/api/system.js
create mode 100644 src/api/user.js
create mode 100644 src/assets/404.png
create mode 100644 src/assets/background.svg
create mode 100644 src/assets/banner.jpg
create mode 100644 src/assets/banner2.jpg
create mode 100644 src/assets/dashboard.png
create mode 100644 src/assets/docs.png
create mode 100644 src/assets/flipped-aurora.png
create mode 100644 src/assets/github.png
create mode 100644 src/assets/icons/ai-gva.svg
create mode 100644 src/assets/icons/customer-gva.svg
create mode 100644 src/assets/kefu.png
create mode 100644 src/assets/login_background.jpg
create mode 100644 src/assets/login_background.svg
create mode 100644 src/assets/login_left.svg
create mode 100644 src/assets/login_right_banner.jpg
create mode 100644 src/assets/logo.jpg
create mode 100644 src/assets/logo.png
create mode 100644 src/assets/logo_login.png
create mode 100644 src/assets/nav_logo.png
create mode 100644 src/assets/noBody.png
create mode 100644 src/assets/notFound.png
create mode 100644 src/assets/qm.png
create mode 100644 src/assets/video.png
create mode 100644 src/components/arrayCtrl/arrayCtrl.vue
create mode 100644 src/components/bottomInfo/bottomInfo.vue
create mode 100644 src/components/charts/index.vue
create mode 100644 src/components/commandMenu/index.vue
create mode 100644 src/components/customPic/index.vue
create mode 100644 src/components/exportExcel/exportExcel.vue
create mode 100644 src/components/exportExcel/exportTemplate.vue
create mode 100644 src/components/exportExcel/importExcel.vue
create mode 100644 src/components/office/docx.vue
create mode 100644 src/components/office/excel.vue
create mode 100644 src/components/office/index.vue
create mode 100644 src/components/office/pdf.vue
create mode 100644 src/components/richtext/rich-edit.vue
create mode 100644 src/components/richtext/rich-view.vue
create mode 100644 src/components/selectFile/selectFile.vue
create mode 100644 src/components/selectImage/selectComponent.vue
create mode 100644 src/components/selectImage/selectImage.vue
create mode 100644 src/components/svgIcon/svgIcon.vue
create mode 100644 src/components/upload/QR-code.vue
create mode 100644 src/components/upload/common.vue
create mode 100644 src/components/upload/cropper.vue
create mode 100644 src/components/upload/image.vue
create mode 100644 src/components/warningBar/warningBar.vue
create mode 100644 src/core/config.js
create mode 100644 src/core/gin-vue-admin.js
create mode 100644 src/core/global.js
create mode 100644 src/directive/auth.js
create mode 100644 src/hooks/charts.js
create mode 100644 src/hooks/responsive.js
create mode 100644 src/hooks/use-windows-resize.js
create mode 100644 src/main.js
create mode 100644 src/pathInfo.json
create mode 100644 src/permission.js
create mode 100644 src/pinia/index.js
create mode 100644 src/pinia/modules/app.js
create mode 100644 src/pinia/modules/dictionary.js
create mode 100644 src/pinia/modules/params.js
create mode 100644 src/pinia/modules/router.js
create mode 100644 src/pinia/modules/user.js
create mode 100644 src/plugin/announcement/api/info.js
create mode 100644 src/plugin/announcement/form/info.vue
create mode 100644 src/plugin/announcement/view/info.vue
create mode 100644 src/plugin/email/api/email.js
create mode 100644 src/plugin/email/view/index.vue
create mode 100644 src/router/index.js
create mode 100644 src/style/element/index.scss
create mode 100644 src/style/element_visiable.scss
create mode 100644 src/style/iconfont.css
create mode 100644 src/style/main.scss
create mode 100644 src/style/reset.scss
create mode 100644 src/style/transition.scss
create mode 100644 src/utils/asyncRouter.js
create mode 100644 src/utils/btnAuth.js
create mode 100644 src/utils/bus.js
create mode 100644 src/utils/closeThisPage.js
create mode 100644 src/utils/date.js
create mode 100644 src/utils/dictionary.js
create mode 100644 src/utils/doc.js
create mode 100644 src/utils/downloadImg.js
create mode 100644 src/utils/event.js
create mode 100644 src/utils/fmtRouterTitle.js
create mode 100644 src/utils/format.js
create mode 100644 src/utils/image.js
create mode 100644 src/utils/page.js
create mode 100644 src/utils/params.js
create mode 100644 src/utils/request.js
create mode 100644 src/utils/stringFun.js
create mode 100644 src/view/about/index.vue
create mode 100644 src/view/bot/bot/bot.vue
create mode 100644 src/view/bot/bot/botForm.vue
create mode 100644 src/view/category/category/category.vue
create mode 100644 src/view/category/category/categoryForm.vue
create mode 100644 src/view/dashboard/components/banner.vue
create mode 100644 src/view/dashboard/components/card.vue
create mode 100644 src/view/dashboard/components/charts-content-numbers.vue
create mode 100644 src/view/dashboard/components/charts-people-numbers.vue
create mode 100644 src/view/dashboard/components/charts.vue
create mode 100644 src/view/dashboard/components/index.js
create mode 100644 src/view/dashboard/components/notice.vue
create mode 100644 src/view/dashboard/components/pluginTable.vue
create mode 100644 src/view/dashboard/components/quickLinks.vue
create mode 100644 src/view/dashboard/components/table.vue
create mode 100644 src/view/dashboard/components/wiki.vue
create mode 100644 src/view/dashboard/index.vue
create mode 100644 src/view/error/index.vue
create mode 100644 src/view/error/reload.vue
create mode 100644 src/view/example/breakpoint/breakpoint.vue
create mode 100644 src/view/example/customer/customer.vue
create mode 100644 src/view/example/index.vue
create mode 100644 src/view/example/upload/scanUpload.vue
create mode 100644 src/view/example/upload/upload.vue
create mode 100644 src/view/init/index.vue
create mode 100644 src/view/layout/aside/asideComponent/asyncSubmenu.vue
create mode 100644 src/view/layout/aside/asideComponent/index.vue
create mode 100644 src/view/layout/aside/asideComponent/menuItem.vue
create mode 100644 src/view/layout/aside/combinationMode.vue
create mode 100644 src/view/layout/aside/headMode.vue
create mode 100644 src/view/layout/aside/index.vue
create mode 100644 src/view/layout/aside/normalMode.vue
create mode 100644 src/view/layout/header/index.vue
create mode 100644 src/view/layout/header/tools.vue
create mode 100644 src/view/layout/iframe.vue
create mode 100644 src/view/layout/index.vue
create mode 100644 src/view/layout/screenfull/index.vue
create mode 100644 src/view/layout/search/search.vue
create mode 100644 src/view/layout/setting/index.vue
create mode 100644 src/view/layout/setting/title.vue
create mode 100644 src/view/layout/tabs/index.vue
create mode 100644 src/view/login/index.vue
create mode 100644 src/view/person/person.vue
create mode 100644 src/view/routerHolder.vue
create mode 100644 src/view/superAdmin/api/api.vue
create mode 100644 src/view/superAdmin/authority/authority.vue
create mode 100644 src/view/superAdmin/authority/components/apis.vue
create mode 100644 src/view/superAdmin/authority/components/datas.vue
create mode 100644 src/view/superAdmin/authority/components/menus.vue
create mode 100644 src/view/superAdmin/dictionary/sysDictionary.vue
create mode 100644 src/view/superAdmin/dictionary/sysDictionaryDetail.vue
create mode 100644 src/view/superAdmin/index.vue
create mode 100644 src/view/superAdmin/menu/components/components-cascader.vue
create mode 100644 src/view/superAdmin/menu/icon.vue
create mode 100644 src/view/superAdmin/menu/menu.vue
create mode 100644 src/view/superAdmin/operation/sysOperationRecord.vue
create mode 100644 src/view/superAdmin/params/sysParams.vue
create mode 100644 src/view/superAdmin/user/user.vue
create mode 100644 src/view/system/state.vue
create mode 100644 src/view/systemTools/autoCode/component/fieldDialog.vue
create mode 100644 src/view/systemTools/autoCode/component/previewCodeDialog.vue
create mode 100644 src/view/systemTools/autoCode/index.vue
create mode 100644 src/view/systemTools/autoCodeAdmin/index.vue
create mode 100644 src/view/systemTools/autoPkg/autoPkg.vue
create mode 100644 src/view/systemTools/exportTemplate/code.js
create mode 100644 src/view/systemTools/exportTemplate/exportTemplate.vue
create mode 100644 src/view/systemTools/formCreate/index.vue
create mode 100644 src/view/systemTools/index.vue
create mode 100644 src/view/systemTools/installPlugin/index.vue
create mode 100644 src/view/systemTools/pubPlug/pubPlug.vue
create mode 100644 src/view/systemTools/system/system.vue
create mode 100644 tailwind.config.js
create mode 100644 vite.config.js
create mode 100644 vitePlugin/componentName/index.js
create mode 100644 vitePlugin/secret/index.js
diff --git a/.docker-compose/nginx/conf.d/my.conf b/.docker-compose/nginx/conf.d/my.conf
new file mode 100644
index 0000000..9a1685d
--- /dev/null
+++ b/.docker-compose/nginx/conf.d/my.conf
@@ -0,0 +1,26 @@
+server {
+ listen 8080;
+ server_name localhost;
+
+ #charset koi8-r;
+ #access_log logs/host.access.log main;
+
+ location / {
+ root /usr/share/nginx/html;
+ add_header Cache-Control 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0';
+ try_files $uri $uri/ /index.html;
+ }
+
+ location /api {
+ proxy_set_header Host $http_host;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header X-Forwarded-Proto $scheme;
+ rewrite ^/api/(.*)$ /$1 break; #重写
+ proxy_pass http://177.7.0.12:8888; # 设置代理服务器的协议和地址
+ }
+
+ location /api/swagger/index.html {
+ proxy_pass http://127.0.0.1:8888/swagger/index.html;
+ }
+ }
\ No newline at end of file
diff --git a/.docker-compose/nginx/conf.d/nginx.conf b/.docker-compose/nginx/conf.d/nginx.conf
new file mode 100644
index 0000000..29f68b8
--- /dev/null
+++ b/.docker-compose/nginx/conf.d/nginx.conf
@@ -0,0 +1,32 @@
+server {
+ listen 80;
+ server_name localhost;
+
+ #charset koi8-r;
+ #access_log logs/host.access.log main;
+
+ location / {
+ root /usr/share/nginx/html/dist;
+ add_header Cache-Control 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0';
+ try_files $uri $uri/ /index.html;
+ }
+
+ location /api {
+ proxy_set_header Host $http_host;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header X-Forwarded-Proto $scheme;
+ rewrite ^/api/(.*)$ /$1 break; #重写
+ proxy_pass http://127.0.0.1:8888; # 设置代理服务器的协议和地址
+ }
+ location /form-generator {
+ proxy_set_header Host $http_host;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header X-Forwarded-Proto $scheme;
+ proxy_pass http://127.0.0.1:8888;
+ }
+ location /api/swagger/index.html {
+ proxy_pass http://127.0.0.1:8888/swagger/index.html;
+ }
+ }
\ No newline at end of file
diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 0000000..40b878d
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1 @@
+node_modules/
\ No newline at end of file
diff --git a/.env.development b/.env.development
new file mode 100644
index 0000000..ad07c38
--- /dev/null
+++ b/.env.development
@@ -0,0 +1,11 @@
+ENV = 'development'
+VITE_CLI_PORT = 8080
+VITE_SERVER_PORT = 8888
+VITE_BASE_API = /api
+VITE_FILE_API = /api
+VITE_BASE_PATH = http://127.0.0.1
+VITE_POSITION = close
+VITE_EDITOR = vscode
+// VITE_EDITOR = webstorm 如果使用webstorm开发且要使用dom定位到代码行功能 请先自定添加 webstorm到环境变量 再将VITE_EDITOR值修改为webstorm
+// 如果使用docker-compose开发模式,设置为下面的地址或本机主机IP
+//VITE_BASE_PATH = http://177.7.0.12
diff --git a/.env.production b/.env.production
new file mode 100644
index 0000000..9345df2
--- /dev/null
+++ b/.env.production
@@ -0,0 +1,7 @@
+ENV = 'production'
+
+#下方为上线需要用到的程序代理前缀,一般用于nginx代理转发
+VITE_BASE_API = /api
+VITE_FILE_API = /api
+#下方修改为你的线上ip(如果需要在线使用表单构建工具时使用,其余情况无需使用以下环境变量)
+VITE_BASE_PATH = https://demo.gin-vue-admin.com
diff --git a/.gitignore b/.gitignore
index a19f004..ea890fa 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,11 +1,6 @@
-# ---> Vue
-# gitignore template for Vue.js projects
-#
-# Recommended template: Node.gitignore
-
-# TODO: where does this rule come from?
-docs/_book
-
-# TODO: where does this rule come from?
-test/
-
+node_modules/*
+package-lock.json
+yarn.lock
+bun.lockb
+config.yaml
+.idea
diff --git a/.prettierrc b/.prettierrc
new file mode 100644
index 0000000..bc61a53
--- /dev/null
+++ b/.prettierrc
@@ -0,0 +1,12 @@
+{
+ "printWidth": 80,
+ "tabWidth": 2,
+ "useTabs": false,
+ "semi": false,
+ "singleQuote": true,
+ "trailingComma": "none",
+ "bracketSpacing": true,
+ "arrowParens": "always",
+ "vueIndentScriptAndStyle": true,
+ "endOfLine": "lf"
+}
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..af4464e
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,25 @@
+# 如果需要用 cicd ,请设置环境变量:
+# variables:
+# DOCKER_BUILDKIT: 1
+
+FROM node:20-slim AS base
+ENV PNPM_HOME="/pnpm"
+ENV PATH="$PNPM_HOME:$PATH"
+RUN corepack enable
+COPY . /app
+WORKDIR /app
+
+
+FROM base AS prod-deps
+RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --prod
+
+FROM base AS build
+COPY --from=prod-deps /app/node_modules /app/node_modules
+RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install && pnpm run build
+
+
+FROM nginx:alpine
+LABEL MAINTAINER="bypanghu@163.com"
+COPY --from=base /app/.docker-compose/nginx/conf.d/my.conf /etc/nginx/conf.d/my.conf
+COPY --from=build /app/dist /usr/share/nginx/html
+RUN ls -al /usr/share/nginx/html
diff --git a/README.md b/README.md
index b724201..06f1a8c 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,106 @@
-# lckt-admin
+# gin-vue-admin web
-老陈课堂-管理后台
\ No newline at end of file
+## Project setup
+
+```
+npm install
+```
+
+### Compiles and hot-reloads for development
+
+```
+npm run serve
+```
+
+### Compiles and minifies for production
+
+```
+npm run build
+```
+
+### Run your tests
+
+```
+npm run test
+```
+
+### Lints and fixes files
+
+```
+npm run lint
+```
+
+整理代码结构
+
+```lua
+web
+ ├── babel.config.js
+ ├── Dockerfile
+ ├── favicon.ico
+ ├── index.html -- 主页面
+ ├── limit.js -- 助手代码
+ ├── package.json -- 包管理器代码
+ ├── src -- 源代码
+ │ ├── api -- api 组
+ │ ├── App.vue -- 主页面
+ │ ├── assets -- 静态资源
+ │ ├── components -- 全局组件
+ │ ├── core -- gva 组件包
+ │ │ ├── config.js -- gva网站配置文件
+ │ │ ├── gin-vue-admin.js -- 注册欢迎文件
+ │ │ └── global.js -- 统一导入文件
+ │ ├── directive -- v-auth 注册文件
+ │ ├── main.js -- 主文件
+ │ ├── permission.js -- 路由中间件
+ │ ├── pinia -- pinia 状态管理器,取代vuex
+ │ │ ├── index.js -- 入口文件
+ │ │ └── modules -- modules
+ │ │ ├── dictionary.js
+ │ │ ├── router.js
+ │ │ └── user.js
+ │ ├── router -- 路由声明文件
+ │ │ └── index.js
+ │ ├── style -- 全局样式
+ │ │ ├── base.scss
+ │ │ ├── basics.scss
+ │ │ ├── element_visiable.scss -- 此处可以全局覆盖 element-plus 样式
+ │ │ ├── iconfont.css -- 顶部几个icon的样式文件
+ │ │ ├── main.scss
+ │ │ ├── mobile.scss
+ │ │ └── newLogin.scss
+ │ ├── utils -- 方法包库
+ │ │ ├── asyncRouter.js -- 动态路由相关
+ │ │ ├── bus.js -- 全局mitt声明文件
+ │ │ ├── date.js -- 日期相关
+ │ │ ├── dictionary.js -- 获取字典方法
+ │ │ ├── downloadImg.js -- 下载图片方法
+ │ │ ├── format.js -- 格式整理相关
+ │ │ ├── image.js -- 图片相关方法
+ │ │ ├── page.js -- 设置页面标题
+ │ │ ├── request.js -- 请求
+ │ │ └── stringFun.js -- 字符串文件
+ | ├── view -- 主要view代码
+ | | ├── about -- 关于我们
+ | | ├── dashboard -- 面板
+ | | ├── error -- 错误
+ | | ├── example --上传案例
+ | | ├── iconList -- icon列表
+ | | ├── init -- 初始化数据
+ | | | ├── index -- 新版本
+ | | | ├── init -- 旧版本
+ | | ├── layout -- layout约束页面
+ | | | ├── aside
+ | | | ├── bottomInfo -- bottomInfo
+ | | | ├── screenfull -- 全屏设置
+ | | | ├── setting -- 系统设置
+ | | | └── index.vue -- base 约束
+ | | ├── login --登录
+ | | ├── person --个人中心
+ | | ├── superAdmin -- 超级管理员操作
+ | | ├── system -- 系统检测页面
+ | | ├── systemTools -- 系统配置相关页面
+ | | └── routerHolder.vue -- page 入口页面
+ ├── vite.config.js -- vite 配置文件
+ └── yarn.lock
+
+```
diff --git a/babel.config.js b/babel.config.js
new file mode 100644
index 0000000..b1becff
--- /dev/null
+++ b/babel.config.js
@@ -0,0 +1,4 @@
+module.exports = {
+ presets: [],
+ plugins: []
+}
diff --git a/eslint.config.mjs b/eslint.config.mjs
new file mode 100644
index 0000000..3b443c5
--- /dev/null
+++ b/eslint.config.mjs
@@ -0,0 +1,29 @@
+import js from '@eslint/js'
+import pluginVue from 'eslint-plugin-vue'
+import globals from 'globals'
+
+export default [
+ js.configs.recommended,
+ ...pluginVue.configs['flat/essential'],
+ {
+ name: 'app/files-to-lint',
+ files: ['**/*.{js,mjs,jsx,vue}'],
+ languageOptions: {
+ ecmaVersion: 'latest',
+ sourceType: 'module',
+ globals: globals.node
+ },
+ rules: {
+ 'vue/max-attributes-per-line': 0,
+ 'vue/no-v-model-argument': 0,
+ 'vue/multi-word-component-names': 'off',
+ 'no-lone-blocks': 'off',
+ 'no-extend-native': 'off',
+ 'no-unused-vars': ['error', { argsIgnorePattern: '^_' }]
+ }
+ },
+ {
+ name: 'app/files-to-ignore',
+ ignores: ['**/dist/**', '**/build/*.js', '**/src/assets/**', '**/public/**']
+ }
+]
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..1d8d87a
--- /dev/null
+++ b/index.html
@@ -0,0 +1,115 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/jsconfig.json b/jsconfig.json
new file mode 100644
index 0000000..ca45014
--- /dev/null
+++ b/jsconfig.json
@@ -0,0 +1,10 @@
+{
+ "compilerOptions": {
+ "baseUrl": "./",
+ "paths": {
+ "@/*": ["src/*"]
+ }
+ },
+ "exclude": ["node_modules", "dist"],
+ "include": ["src/**/*"]
+}
diff --git a/limit.js b/limit.js
new file mode 100644
index 0000000..6ba9d46
--- /dev/null
+++ b/limit.js
@@ -0,0 +1,37 @@
+// 运行项目前通过node执行此脚本 (此脚本与 node_modules 目录同级)
+const fs = require('fs')
+const path = require('path')
+const wfPath = path.resolve(__dirname, './node_modules/.bin')
+
+fs.readdir(wfPath, (err, files) => {
+ if (err) {
+ console.log(err)
+ } else {
+ if (files.length !== 0) {
+ files.forEach((item) => {
+ if (item.split('.')[1] === 'cmd') {
+ replaceStr(`${wfPath}/${item}`, /"%_prog%"/, '%_prog%')
+ }
+ })
+ }
+ }
+})
+
+// 参数:[文件路径、 需要修改的字符串、修改后的字符串] (替换对应文件内字符串的公共函数)
+function replaceStr(filePath, sourceRegx, targetSrt) {
+ fs.readFile(filePath, (err, data) => {
+ if (err) {
+ console.log(err)
+ } else {
+ let str = data.toString()
+ str = str.replace(sourceRegx, targetSrt)
+ fs.writeFile(filePath, str, (err) => {
+ if (err) {
+ console.log(err)
+ } else {
+ console.log('\x1B[42m%s\x1B[0m', '文件修改成功')
+ }
+ })
+ }
+ })
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..9bc5be3
--- /dev/null
+++ b/package.json
@@ -0,0 +1,75 @@
+{
+ "name": "gin-vue-admin",
+ "version": "2.8.0",
+ "private": true,
+ "scripts": {
+ "serve": "vite --host --mode development",
+ "build": "vite build --mode production",
+ "limit-build": "npm install increase-memory-limit-fixbug cross-env -g && npm run fix-memory-limit && node ./limit && npm run build",
+ "preview": "vite preview",
+ "fix-memory-limit": "cross-env LIMIT=4096 increase-memory-limit"
+ },
+ "dependencies": {
+ "@element-plus/icons-vue": "^2.3.1",
+ "@form-create/designer": "^3.2.6",
+ "@form-create/element-ui": "^3.2.10",
+ "@vue-office/docx": "^1.6.2",
+ "@vue-office/excel": "^1.7.11",
+ "@vue-office/pdf": "^2.0.2",
+ "@vueuse/core": "^11.0.3",
+ "@vueuse/integrations": "^12.0.0",
+ "@wangeditor/editor": "^5.1.23",
+ "@wangeditor/editor-for-vue": "^5.1.12",
+ "ace-builds": "^1.36.4",
+ "axios": "^1.7.7",
+ "chokidar": "^4.0.0",
+ "core-js": "^3.38.1",
+ "echarts": "5.5.1",
+ "element-plus": "^2.8.5",
+ "highlight.js": "^11.10.0",
+ "marked": "14.1.1",
+ "marked-highlight": "^2.1.4",
+ "mitt": "^3.0.1",
+ "nprogress": "^0.2.0",
+ "path": "^0.12.7",
+ "pinia": "^2.2.2",
+ "qs": "^6.13.0",
+ "screenfull": "^6.0.2",
+ "sortablejs": "^1.15.3",
+ "spark-md5": "^3.0.2",
+ "tailwindcss": "^3.4.10",
+ "universal-cookie": "^7",
+ "vform3-builds": "^3.0.10",
+ "vite-auto-import-svg": "^1.1.0",
+ "vue": "^3.5.7",
+ "vue-cropper": "^1.1.4",
+ "vue-echarts": "^7.0.3",
+ "vue-qr": "^4.0.9",
+ "vue-router": "^4.4.3",
+ "vue3-ace-editor": "^2.2.4",
+ "vuedraggable": "^4.1.0"
+ },
+ "devDependencies": {
+ "@babel/eslint-parser": "^7.25.1",
+ "@eslint/js": "^9.14.0",
+ "@vitejs/plugin-legacy": "^5.4.2",
+ "@vitejs/plugin-vue": "^5.1.4",
+ "@vue/cli-plugin-babel": "~5.0.8",
+ "@vue/cli-plugin-eslint": "~5.0.8",
+ "@vue/cli-plugin-router": "~5.0.8",
+ "@vue/cli-plugin-vuex": "~5.0.8",
+ "@vue/cli-service": "~5.0.8",
+ "@vue/compiler-sfc": "^3.5.1",
+ "babel-plugin-import": "^1.13.8",
+ "chalk": "^5.3.0",
+ "dotenv": "^16.4.5",
+ "eslint": "^9.14.0",
+ "eslint-plugin-vue": "^9.30.0",
+ "sass": "^1.78.0",
+ "terser": "^5.31.6",
+ "vite": "^5.4.3",
+ "vite-plugin-banner": "^0.8.0",
+ "vite-plugin-importer": "^0.2.5",
+ "vite-plugin-vue-devtools": "^7.4.4"
+ }
+}
diff --git a/postcss.config.js b/postcss.config.js
new file mode 100644
index 0000000..85f717c
--- /dev/null
+++ b/postcss.config.js
@@ -0,0 +1,6 @@
+module.exports = {
+ plugins: {
+ tailwindcss: {},
+ autoprefixer: {}
+ }
+}
diff --git a/public/favicon.ico b/public/favicon.ico
new file mode 100644
index 0000000000000000000000000000000000000000..ee520ce4b34e962134995910c368ccd4870a774e
GIT binary patch
literal 4286
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