From 03e5776f85115efa54b07e91a04714bc5e8a8969 Mon Sep 17 00:00:00 2001 From: cgx <2606784146@qq.com> Date: Sat, 7 Dec 2024 15:48:59 +0800 Subject: [PATCH] test --- admin-hanhai-vue/.env | 2 +- admin-hanhai-vue/.env.development | 2 +- admin-hanhai-vue/.env.production | 2 +- admin-hanhai-vue/public/img.png | Bin 75236 -> 0 bytes admin-hanhai-vue/public/index.html | 6 +- admin-hanhai-vue/public/logo.png | Bin 7749 -> 46962 bytes admin-hanhai-vue/src/assets/logo.png | Bin 7749 -> 46962 bytes .../src/components/layouts/TabLayout.vue | 2 +- .../src/components/layouts/UserLayout.vue | 4 +- .../src/components/page/GlobalHeader.vue | 4 +- admin-hanhai-vue/src/components/tools/Logo.vue | 2 +- .../src/views/banner/WebBannerList.vue | 197 ++++++++++++ .../src/views/banner/modules/WebBannerForm.vue | 130 ++++++++ .../banner/modules/WebBannerModal.Style#Drawer.vue | 84 +++++ .../src/views/banner/modules/WebBannerModal.vue | 60 ++++ .../src/views/customs/TbCustomsList.vue | 279 ++++++++++++++++ .../src/views/customs/modules/TbCustomsForm.vue | 164 ++++++++++ .../modules/TbCustomsModal.Style#Drawer.vue | 84 +++++ .../src/views/customs/modules/TbCustomsModal.vue | 60 ++++ .../src/views/industry/TbIndustryList.vue | 358 +++++++++++++++++++++ .../src/views/industry/modules/TbIndustryModal.vue | 162 ++++++++++ .../src/views/product/TbProductList.vue | 263 +++++++++++++++ .../src/views/product/modules/TbProductForm.vue | 147 +++++++++ .../modules/TbProductModal.Style#Drawer.vue | 84 +++++ .../src/views/product/modules/TbProductModal.vue | 60 ++++ .../src/views/productOrder/TbProductOrderList.vue | 267 +++++++++++++++ .../productOrder/modules/TbProductOrderForm.vue | 150 +++++++++ .../modules/TbProductOrderModal.Style#Drawer.vue | 84 +++++ .../productOrder/modules/TbProductOrderModal.vue | 60 ++++ .../src/views/suggest/TbSuggestList.vue | 219 +++++++++++++ .../src/views/suggest/modules/TbSuggestForm.vue | 124 +++++++ .../modules/TbSuggestModal.Style#Drawer.vue | 84 +++++ .../src/views/suggest/modules/TbSuggestModal.vue | 60 ++++ admin-hanhai-vue/src/views/tbConf/TbConfList.vue | 177 ++++++++++ .../src/views/tbConf/modules/TbConfForm.vue | 109 +++++++ .../tbConf/modules/TbConfModal.Style#Drawer.vue | 84 +++++ .../src/views/tbConf/modules/TbConfModal.vue | 60 ++++ .../src/views/userRole/TbUserRoleList.vue | 278 ++++++++++++++++ .../src/views/userRole/modules/TbUserRoleForm.vue | 159 +++++++++ .../modules/TbUserRoleModal.Style#Drawer.vue | 84 +++++ .../src/views/userRole/modules/TbUserRoleModal.vue | 60 ++++ .../main/java/org/jeecg/config/Swagger2Config.java | 2 +- .../userRole/controller/TbUserRoleController.java | 155 +++++++++ .../jeecg/modules/userRole/entity/TbUserRole.java | 111 +++++++ .../modules/userRole/mapper/TbUserRoleMapper.java | 14 + .../userRole/mapper/xml/TbUserRoleMapper.xml | 5 + .../userRole/service/ITbUserRoleService.java | 19 ++ .../service/impl/TbUserRoleServiceImpl.java | 45 +++ .../jeecg/modules/userRole/vue/TbUserRoleList.vue | 278 ++++++++++++++++ .../userRole/vue/modules/TbUserRoleForm.vue | 159 +++++++++ .../vue/modules/TbUserRoleModal.Style#Drawer.vue | 84 +++++ .../userRole/vue/modules/TbUserRoleModal.vue | 60 ++++ .../jeecg/modules/userRole/vue3/TbUserRole.api.ts | 61 ++++ .../jeecg/modules/userRole/vue3/TbUserRole.data.ts | 184 +++++++++++ .../jeecg/modules/userRole/vue3/TbUserRoleList.vue | 162 ++++++++++ .../userRole/vue3/components/TbUserRoleModal.vue | 58 ++++ .../org/jeecg/modules/postBean/ReqUserRole.java | 79 +++++ .../modules/user/controller/UserController.java | 35 -- .../controller/IndexController.java | 11 +- .../userCode/controller/UserController.java | 51 +++ .../service/AppletLoginService.java | 6 +- .../{user => userCode}/service/IndexService.java | 2 +- .../service/impl/AppletLoginServiceImpl.java | 57 +++- .../service/impl/IndexServiceImpl.java | 31 +- .../src/main/resources/application-dev.yml | 6 +- .../src/main/resources/application-prod.yml | 4 +- 66 files changed, 5805 insertions(+), 89 deletions(-) delete mode 100644 admin-hanhai-vue/public/img.png create mode 100644 admin-hanhai-vue/src/views/banner/WebBannerList.vue create mode 100644 admin-hanhai-vue/src/views/banner/modules/WebBannerForm.vue create mode 100644 admin-hanhai-vue/src/views/banner/modules/WebBannerModal.Style#Drawer.vue create mode 100644 admin-hanhai-vue/src/views/banner/modules/WebBannerModal.vue create mode 100644 admin-hanhai-vue/src/views/customs/TbCustomsList.vue create mode 100644 admin-hanhai-vue/src/views/customs/modules/TbCustomsForm.vue create mode 100644 admin-hanhai-vue/src/views/customs/modules/TbCustomsModal.Style#Drawer.vue create mode 100644 admin-hanhai-vue/src/views/customs/modules/TbCustomsModal.vue create mode 100644 admin-hanhai-vue/src/views/industry/TbIndustryList.vue create mode 100644 admin-hanhai-vue/src/views/industry/modules/TbIndustryModal.vue create mode 100644 admin-hanhai-vue/src/views/product/TbProductList.vue create mode 100644 admin-hanhai-vue/src/views/product/modules/TbProductForm.vue create mode 100644 admin-hanhai-vue/src/views/product/modules/TbProductModal.Style#Drawer.vue create mode 100644 admin-hanhai-vue/src/views/product/modules/TbProductModal.vue create mode 100644 admin-hanhai-vue/src/views/productOrder/TbProductOrderList.vue create mode 100644 admin-hanhai-vue/src/views/productOrder/modules/TbProductOrderForm.vue create mode 100644 admin-hanhai-vue/src/views/productOrder/modules/TbProductOrderModal.Style#Drawer.vue create mode 100644 admin-hanhai-vue/src/views/productOrder/modules/TbProductOrderModal.vue create mode 100644 admin-hanhai-vue/src/views/suggest/TbSuggestList.vue create mode 100644 admin-hanhai-vue/src/views/suggest/modules/TbSuggestForm.vue create mode 100644 admin-hanhai-vue/src/views/suggest/modules/TbSuggestModal.Style#Drawer.vue create mode 100644 admin-hanhai-vue/src/views/suggest/modules/TbSuggestModal.vue create mode 100644 admin-hanhai-vue/src/views/tbConf/TbConfList.vue create mode 100644 admin-hanhai-vue/src/views/tbConf/modules/TbConfForm.vue create mode 100644 admin-hanhai-vue/src/views/tbConf/modules/TbConfModal.Style#Drawer.vue create mode 100644 admin-hanhai-vue/src/views/tbConf/modules/TbConfModal.vue create mode 100644 admin-hanhai-vue/src/views/userRole/TbUserRoleList.vue create mode 100644 admin-hanhai-vue/src/views/userRole/modules/TbUserRoleForm.vue create mode 100644 admin-hanhai-vue/src/views/userRole/modules/TbUserRoleModal.Style#Drawer.vue create mode 100644 admin-hanhai-vue/src/views/userRole/modules/TbUserRoleModal.vue create mode 100644 jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/userRole/controller/TbUserRoleController.java create mode 100644 jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/userRole/entity/TbUserRole.java create mode 100644 jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/userRole/mapper/TbUserRoleMapper.java create mode 100644 jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/userRole/mapper/xml/TbUserRoleMapper.xml create mode 100644 jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/userRole/service/ITbUserRoleService.java create mode 100644 jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/userRole/service/impl/TbUserRoleServiceImpl.java create mode 100644 jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/userRole/vue/TbUserRoleList.vue create mode 100644 jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/userRole/vue/modules/TbUserRoleForm.vue create mode 100644 jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/userRole/vue/modules/TbUserRoleModal.Style#Drawer.vue create mode 100644 jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/userRole/vue/modules/TbUserRoleModal.vue create mode 100644 jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/userRole/vue3/TbUserRole.api.ts create mode 100644 jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/userRole/vue3/TbUserRole.data.ts create mode 100644 jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/userRole/vue3/TbUserRoleList.vue create mode 100644 jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/userRole/vue3/components/TbUserRoleModal.vue create mode 100644 jeecg-boot-module-system/src/main/java/org/jeecg/modules/postBean/ReqUserRole.java delete mode 100644 jeecg-boot-module-system/src/main/java/org/jeecg/modules/user/controller/UserController.java rename jeecg-boot-module-system/src/main/java/org/jeecg/modules/{user => userCode}/controller/IndexController.java (84%) create mode 100644 jeecg-boot-module-system/src/main/java/org/jeecg/modules/userCode/controller/UserController.java rename jeecg-boot-module-system/src/main/java/org/jeecg/modules/{user => userCode}/service/AppletLoginService.java (56%) rename jeecg-boot-module-system/src/main/java/org/jeecg/modules/{user => userCode}/service/IndexService.java (89%) rename jeecg-boot-module-system/src/main/java/org/jeecg/modules/{user => userCode}/service/impl/AppletLoginServiceImpl.java (79%) rename jeecg-boot-module-system/src/main/java/org/jeecg/modules/{user => userCode}/service/impl/IndexServiceImpl.java (63%) diff --git a/admin-hanhai-vue/.env b/admin-hanhai-vue/.env index e75392c..15710b5 100644 --- a/admin-hanhai-vue/.env +++ b/admin-hanhai-vue/.env @@ -1,5 +1,5 @@ NODE_ENV=production -VUE_APP_PLATFORM_NAME=用工小程序 +VUE_APP_PLATFORM_NAME=铝材交易后台管理系统 # 开启单点登录 VUE_APP_SSO=false # 开启微应用模式 diff --git a/admin-hanhai-vue/.env.development b/admin-hanhai-vue/.env.development index c610a8c..dff2c2b 100644 --- a/admin-hanhai-vue/.env.development +++ b/admin-hanhai-vue/.env.development @@ -1,5 +1,5 @@ NODE_ENV=development -VUE_APP_API_BASE_URL=http://localhost:8000/employ-admin/ +VUE_APP_API_BASE_URL=http://localhost:8000/employ-api/ VUE_APP_CAS_BASE_URL=http://cas.example.org:8443/cas VUE_APP_ONLINE_BASE_URL=http://fileview.jeecg.com/onlinePreview diff --git a/admin-hanhai-vue/.env.production b/admin-hanhai-vue/.env.production index 084c8ef..d24a478 100644 --- a/admin-hanhai-vue/.env.production +++ b/admin-hanhai-vue/.env.production @@ -1,4 +1,4 @@ NODE_ENV=production -VUE_APP_API_BASE_URL=http://localhost:8000/employ-admin/ +VUE_APP_API_BASE_URL=https://aluminium-prod.hhlm1688.com/aluminium-api/ VUE_APP_CAS_BASE_URL=http://localhost:8888/cas VUE_APP_ONLINE_BASE_URL=http://fileview.jeecg.com/onlinePreview \ No newline at end of file diff --git a/admin-hanhai-vue/public/img.png b/admin-hanhai-vue/public/img.png deleted file mode 100644 index 30c5357da3e0c1c0ee02e1c773b074750ced6904..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 75236 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 z zQ6ryUhaCXSC1Rn=e)&<>beQd?HC^&*1XR@-^g~Y}BByfQf;IN_bHwHhyR1U5|F{@# z-yN&8S3fb0i}x6$Hu}^U0^pb&n>y4ctoS;*da!VbOvL0(E;4@{fJJBY!Z1pXd3q&( zgctk+;7)6r9~1uw90ZAwb{tS=#&TV_-lXmelJc=pJv+eDm$fg1COhbOGW@U+&g3;w~-9VMOJf)YP8SuP%2<4scdL z5Q_ruv;NnNAPg9xIcqj6$HW(>fdMAmfMv_TLy&|_g`TQDv!=uup!n9C~!`a zZrMSvL(dt+^8Uh9eFSUFMp@n~36#FE+g|EzXLj`sbRvHXN(^H0OHaa-!754vR&I9r zeG&7^CXfEO{7hz0_yfv11T|zI!LODXVekE!h5SGL0O`ok$+~Xd6zvzD?=HUGH6Uy@ zT73K0fbcw7=FKeQ5@P1|^+)QN4nmbo%PCKn|GBEA8d-^nI$l@lsgifR%hC5hEx%6{ z6HhW>O)un18);WZk^yO3SE3{eW2k%4=iQpEUr=%Uq-RB25&`{xy=O!0=v+cXZzOYOu?-3*Q@vdfoPso0LqMzh)- zOzpwlJkoa_+Y9@f)iAdxw|CKyzNIsYV}H+skdaPP&(BcZedpBhU8YndO>x+vTPc$uVQ^2K9`J4UDR(>QeGzgtSb9* z=o~Em9j&+YozNI(*(SCc+K4zcyNWqva;=^0#lO=1Aox1Q;sP;d53DBwgx-f)obwX^ g8Rtn9QLE?Fll)cSKM_L#WTeM6T_c^>NW1X=0#&}4r2qf` diff --git a/admin-hanhai-vue/public/index.html b/admin-hanhai-vue/public/index.html index c5e66c0..931da2a 100644 --- a/admin-hanhai-vue/public/index.html +++ b/admin-hanhai-vue/public/index.html @@ -5,8 +5,8 @@ - 用工小程序 - + 铝材交易后台管理系统 + \ No newline at end of file diff --git a/admin-hanhai-vue/src/views/banner/modules/WebBannerForm.vue b/admin-hanhai-vue/src/views/banner/modules/WebBannerForm.vue new file mode 100644 index 0000000..373e2c6 --- /dev/null +++ b/admin-hanhai-vue/src/views/banner/modules/WebBannerForm.vue @@ -0,0 +1,130 @@ + + + \ No newline at end of file diff --git a/admin-hanhai-vue/src/views/banner/modules/WebBannerModal.Style#Drawer.vue b/admin-hanhai-vue/src/views/banner/modules/WebBannerModal.Style#Drawer.vue new file mode 100644 index 0000000..509370f --- /dev/null +++ b/admin-hanhai-vue/src/views/banner/modules/WebBannerModal.Style#Drawer.vue @@ -0,0 +1,84 @@ + + + + + \ No newline at end of file diff --git a/admin-hanhai-vue/src/views/banner/modules/WebBannerModal.vue b/admin-hanhai-vue/src/views/banner/modules/WebBannerModal.vue new file mode 100644 index 0000000..5092021 --- /dev/null +++ b/admin-hanhai-vue/src/views/banner/modules/WebBannerModal.vue @@ -0,0 +1,60 @@ + + + \ No newline at end of file diff --git a/admin-hanhai-vue/src/views/customs/TbCustomsList.vue b/admin-hanhai-vue/src/views/customs/TbCustomsList.vue new file mode 100644 index 0000000..6d56a6f --- /dev/null +++ b/admin-hanhai-vue/src/views/customs/TbCustomsList.vue @@ -0,0 +1,279 @@ + + + + \ No newline at end of file diff --git a/admin-hanhai-vue/src/views/customs/modules/TbCustomsForm.vue b/admin-hanhai-vue/src/views/customs/modules/TbCustomsForm.vue new file mode 100644 index 0000000..fbff815 --- /dev/null +++ b/admin-hanhai-vue/src/views/customs/modules/TbCustomsForm.vue @@ -0,0 +1,164 @@ + + + \ No newline at end of file diff --git a/admin-hanhai-vue/src/views/customs/modules/TbCustomsModal.Style#Drawer.vue b/admin-hanhai-vue/src/views/customs/modules/TbCustomsModal.Style#Drawer.vue new file mode 100644 index 0000000..8d62fda --- /dev/null +++ b/admin-hanhai-vue/src/views/customs/modules/TbCustomsModal.Style#Drawer.vue @@ -0,0 +1,84 @@ + + + + + \ No newline at end of file diff --git a/admin-hanhai-vue/src/views/customs/modules/TbCustomsModal.vue b/admin-hanhai-vue/src/views/customs/modules/TbCustomsModal.vue new file mode 100644 index 0000000..84a7266 --- /dev/null +++ b/admin-hanhai-vue/src/views/customs/modules/TbCustomsModal.vue @@ -0,0 +1,60 @@ + + + \ No newline at end of file diff --git a/admin-hanhai-vue/src/views/industry/TbIndustryList.vue b/admin-hanhai-vue/src/views/industry/TbIndustryList.vue new file mode 100644 index 0000000..4d1a79b --- /dev/null +++ b/admin-hanhai-vue/src/views/industry/TbIndustryList.vue @@ -0,0 +1,358 @@ + + + + \ No newline at end of file diff --git a/admin-hanhai-vue/src/views/industry/modules/TbIndustryModal.vue b/admin-hanhai-vue/src/views/industry/modules/TbIndustryModal.vue new file mode 100644 index 0000000..e313753 --- /dev/null +++ b/admin-hanhai-vue/src/views/industry/modules/TbIndustryModal.vue @@ -0,0 +1,162 @@ + + + \ No newline at end of file diff --git a/admin-hanhai-vue/src/views/product/TbProductList.vue b/admin-hanhai-vue/src/views/product/TbProductList.vue new file mode 100644 index 0000000..63af222 --- /dev/null +++ b/admin-hanhai-vue/src/views/product/TbProductList.vue @@ -0,0 +1,263 @@ + + + + \ No newline at end of file diff --git a/admin-hanhai-vue/src/views/product/modules/TbProductForm.vue b/admin-hanhai-vue/src/views/product/modules/TbProductForm.vue new file mode 100644 index 0000000..5e1165d --- /dev/null +++ b/admin-hanhai-vue/src/views/product/modules/TbProductForm.vue @@ -0,0 +1,147 @@ + + + \ No newline at end of file diff --git a/admin-hanhai-vue/src/views/product/modules/TbProductModal.Style#Drawer.vue b/admin-hanhai-vue/src/views/product/modules/TbProductModal.Style#Drawer.vue new file mode 100644 index 0000000..b2132b3 --- /dev/null +++ b/admin-hanhai-vue/src/views/product/modules/TbProductModal.Style#Drawer.vue @@ -0,0 +1,84 @@ + + + + + \ No newline at end of file diff --git a/admin-hanhai-vue/src/views/product/modules/TbProductModal.vue b/admin-hanhai-vue/src/views/product/modules/TbProductModal.vue new file mode 100644 index 0000000..be72558 --- /dev/null +++ b/admin-hanhai-vue/src/views/product/modules/TbProductModal.vue @@ -0,0 +1,60 @@ + + + \ No newline at end of file diff --git a/admin-hanhai-vue/src/views/productOrder/TbProductOrderList.vue b/admin-hanhai-vue/src/views/productOrder/TbProductOrderList.vue new file mode 100644 index 0000000..850dc56 --- /dev/null +++ b/admin-hanhai-vue/src/views/productOrder/TbProductOrderList.vue @@ -0,0 +1,267 @@ + + + + \ No newline at end of file diff --git a/admin-hanhai-vue/src/views/productOrder/modules/TbProductOrderForm.vue b/admin-hanhai-vue/src/views/productOrder/modules/TbProductOrderForm.vue new file mode 100644 index 0000000..49f986a --- /dev/null +++ b/admin-hanhai-vue/src/views/productOrder/modules/TbProductOrderForm.vue @@ -0,0 +1,150 @@ + + + \ No newline at end of file diff --git a/admin-hanhai-vue/src/views/productOrder/modules/TbProductOrderModal.Style#Drawer.vue b/admin-hanhai-vue/src/views/productOrder/modules/TbProductOrderModal.Style#Drawer.vue new file mode 100644 index 0000000..6ab7406 --- /dev/null +++ b/admin-hanhai-vue/src/views/productOrder/modules/TbProductOrderModal.Style#Drawer.vue @@ -0,0 +1,84 @@ + + + + + \ No newline at end of file diff --git a/admin-hanhai-vue/src/views/productOrder/modules/TbProductOrderModal.vue b/admin-hanhai-vue/src/views/productOrder/modules/TbProductOrderModal.vue new file mode 100644 index 0000000..0f876ea --- /dev/null +++ b/admin-hanhai-vue/src/views/productOrder/modules/TbProductOrderModal.vue @@ -0,0 +1,60 @@ + + + \ No newline at end of file diff --git a/admin-hanhai-vue/src/views/suggest/TbSuggestList.vue b/admin-hanhai-vue/src/views/suggest/TbSuggestList.vue new file mode 100644 index 0000000..7b69036 --- /dev/null +++ b/admin-hanhai-vue/src/views/suggest/TbSuggestList.vue @@ -0,0 +1,219 @@ + + + + \ No newline at end of file diff --git a/admin-hanhai-vue/src/views/suggest/modules/TbSuggestForm.vue b/admin-hanhai-vue/src/views/suggest/modules/TbSuggestForm.vue new file mode 100644 index 0000000..7af81fa --- /dev/null +++ b/admin-hanhai-vue/src/views/suggest/modules/TbSuggestForm.vue @@ -0,0 +1,124 @@ + + + \ No newline at end of file diff --git a/admin-hanhai-vue/src/views/suggest/modules/TbSuggestModal.Style#Drawer.vue b/admin-hanhai-vue/src/views/suggest/modules/TbSuggestModal.Style#Drawer.vue new file mode 100644 index 0000000..1fb1e0e --- /dev/null +++ b/admin-hanhai-vue/src/views/suggest/modules/TbSuggestModal.Style#Drawer.vue @@ -0,0 +1,84 @@ + + + + + \ No newline at end of file diff --git a/admin-hanhai-vue/src/views/suggest/modules/TbSuggestModal.vue b/admin-hanhai-vue/src/views/suggest/modules/TbSuggestModal.vue new file mode 100644 index 0000000..0b9a03e --- /dev/null +++ b/admin-hanhai-vue/src/views/suggest/modules/TbSuggestModal.vue @@ -0,0 +1,60 @@ + + + \ No newline at end of file diff --git a/admin-hanhai-vue/src/views/tbConf/TbConfList.vue b/admin-hanhai-vue/src/views/tbConf/TbConfList.vue new file mode 100644 index 0000000..79a4ee5 --- /dev/null +++ b/admin-hanhai-vue/src/views/tbConf/TbConfList.vue @@ -0,0 +1,177 @@ + + + + \ No newline at end of file diff --git a/admin-hanhai-vue/src/views/tbConf/modules/TbConfForm.vue b/admin-hanhai-vue/src/views/tbConf/modules/TbConfForm.vue new file mode 100644 index 0000000..6c09697 --- /dev/null +++ b/admin-hanhai-vue/src/views/tbConf/modules/TbConfForm.vue @@ -0,0 +1,109 @@ + + + \ No newline at end of file diff --git a/admin-hanhai-vue/src/views/tbConf/modules/TbConfModal.Style#Drawer.vue b/admin-hanhai-vue/src/views/tbConf/modules/TbConfModal.Style#Drawer.vue new file mode 100644 index 0000000..c015084 --- /dev/null +++ b/admin-hanhai-vue/src/views/tbConf/modules/TbConfModal.Style#Drawer.vue @@ -0,0 +1,84 @@ + + + + + \ No newline at end of file diff --git a/admin-hanhai-vue/src/views/tbConf/modules/TbConfModal.vue b/admin-hanhai-vue/src/views/tbConf/modules/TbConfModal.vue new file mode 100644 index 0000000..b56d67b --- /dev/null +++ b/admin-hanhai-vue/src/views/tbConf/modules/TbConfModal.vue @@ -0,0 +1,60 @@ + + + \ No newline at end of file diff --git a/admin-hanhai-vue/src/views/userRole/TbUserRoleList.vue b/admin-hanhai-vue/src/views/userRole/TbUserRoleList.vue new file mode 100644 index 0000000..6469cd5 --- /dev/null +++ b/admin-hanhai-vue/src/views/userRole/TbUserRoleList.vue @@ -0,0 +1,278 @@ + + + + \ No newline at end of file diff --git a/admin-hanhai-vue/src/views/userRole/modules/TbUserRoleForm.vue b/admin-hanhai-vue/src/views/userRole/modules/TbUserRoleForm.vue new file mode 100644 index 0000000..c3bb940 --- /dev/null +++ b/admin-hanhai-vue/src/views/userRole/modules/TbUserRoleForm.vue @@ -0,0 +1,159 @@ + + + \ No newline at end of file diff --git a/admin-hanhai-vue/src/views/userRole/modules/TbUserRoleModal.Style#Drawer.vue b/admin-hanhai-vue/src/views/userRole/modules/TbUserRoleModal.Style#Drawer.vue new file mode 100644 index 0000000..8142cb1 --- /dev/null +++ b/admin-hanhai-vue/src/views/userRole/modules/TbUserRoleModal.Style#Drawer.vue @@ -0,0 +1,84 @@ + + + + + \ No newline at end of file diff --git a/admin-hanhai-vue/src/views/userRole/modules/TbUserRoleModal.vue b/admin-hanhai-vue/src/views/userRole/modules/TbUserRoleModal.vue new file mode 100644 index 0000000..9ac4966 --- /dev/null +++ b/admin-hanhai-vue/src/views/userRole/modules/TbUserRoleModal.vue @@ -0,0 +1,60 @@ + + + \ No newline at end of file diff --git a/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/Swagger2Config.java b/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/Swagger2Config.java index 83cecf2..913b519 100644 --- a/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/Swagger2Config.java +++ b/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/Swagger2Config.java @@ -68,7 +68,7 @@ public class Swagger2Config implements WebMvcConfigurer { .apiInfo(apiInfo()) .select() //此包路径下的类,才生成接口文档 - .apis(RequestHandlerSelectors.basePackage("org.jeecg.modules.api")) + .apis(RequestHandlerSelectors.basePackage("org.jeecg.modules.userCode")) //加了ApiOperation注解的类,才生成接口文档 .apis(RequestHandlerSelectors.withClassAnnotation(RestController.class)) .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) diff --git a/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/userRole/controller/TbUserRoleController.java b/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/userRole/controller/TbUserRoleController.java new file mode 100644 index 0000000..d626c42 --- /dev/null +++ b/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/userRole/controller/TbUserRoleController.java @@ -0,0 +1,155 @@ +package org.jeecg.modules.userRole.controller; + +import java.util.Arrays; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.system.query.QueryGenerator; +import org.jeecg.modules.userRole.entity.TbUserRole; +import org.jeecg.modules.userRole.service.ITbUserRoleService; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.extern.slf4j.Slf4j; + +import org.jeecg.common.system.base.controller.JeecgController; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.ModelAndView; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.jeecg.common.aspect.annotation.AutoLog; + + /** + * @Description: 角色表 + * @Author: jeecg-boot + * @Date: 2024-10-16 + * @Version: V1.0 + */ +@RestController +@RequestMapping("/userRole/tbUserRole") +@Slf4j +public class TbUserRoleController extends JeecgController { + @Autowired + private ITbUserRoleService tbUserRoleService; + + /** + * 分页列表查询 + * + * @param tbUserRole + * @param pageNo + * @param pageSize + * @param req + * @return + */ + //@AutoLog(value = "角色表-分页列表查询") + @ApiOperation(value="角色表-分页列表查询", notes="角色表-分页列表查询") + @GetMapping(value = "/list") + public Result> queryPageList(TbUserRole tbUserRole, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + HttpServletRequest req) { + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(tbUserRole, req.getParameterMap()); + Page page = new Page(pageNo, pageSize); + IPage pageList = tbUserRoleService.page(page, queryWrapper); + return Result.OK(pageList); + } + + /** + * 添加 + * + * @param tbUserRole + * @return + */ + @AutoLog(value = "角色表-添加") + @ApiOperation(value="角色表-添加", notes="角色表-添加") + @PostMapping(value = "/add") + public Result add(@RequestBody TbUserRole tbUserRole) { + tbUserRoleService.save(tbUserRole); + return Result.OK("添加成功!"); + } + + /** + * 编辑 + * + * @param tbUserRole + * @return + */ + @AutoLog(value = "角色表-编辑") + @ApiOperation(value="角色表-编辑", notes="角色表-编辑") + @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST}) + public Result edit(@RequestBody TbUserRole tbUserRole) { + tbUserRoleService.updateById(tbUserRole); + return Result.OK("编辑成功!"); + } + + /** + * 通过id删除 + * + * @param id + * @return + */ + @AutoLog(value = "角色表-通过id删除") + @ApiOperation(value="角色表-通过id删除", notes="角色表-通过id删除") + @DeleteMapping(value = "/delete") + public Result delete(@RequestParam(name="id",required=true) String id) { + tbUserRoleService.removeById(id); + return Result.OK("删除成功!"); + } + + /** + * 批量删除 + * + * @param ids + * @return + */ + @AutoLog(value = "角色表-批量删除") + @ApiOperation(value="角色表-批量删除", notes="角色表-批量删除") + @DeleteMapping(value = "/deleteBatch") + public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) { + this.tbUserRoleService.removeByIds(Arrays.asList(ids.split(","))); + return Result.OK("批量删除成功!"); + } + + /** + * 通过id查询 + * + * @param id + * @return + */ + //@AutoLog(value = "角色表-通过id查询") + @ApiOperation(value="角色表-通过id查询", notes="角色表-通过id查询") + @GetMapping(value = "/queryById") + public Result queryById(@RequestParam(name="id",required=true) String id) { + TbUserRole tbUserRole = tbUserRoleService.getById(id); + if(tbUserRole==null) { + return Result.error("未找到对应数据"); + } + return Result.OK(tbUserRole); + } + + /** + * 导出excel + * + * @param request + * @param tbUserRole + */ + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(HttpServletRequest request, TbUserRole tbUserRole) { + return super.exportXls(request, tbUserRole, TbUserRole.class, "角色表"); + } + + /** + * 通过excel导入数据 + * + * @param request + * @param response + * @return + */ + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + public Result importExcel(HttpServletRequest request, HttpServletResponse response) { + return super.importExcel(request, response, TbUserRole.class); + } + +} diff --git a/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/userRole/entity/TbUserRole.java b/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/userRole/entity/TbUserRole.java new file mode 100644 index 0000000..8e7fd9a --- /dev/null +++ b/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/userRole/entity/TbUserRole.java @@ -0,0 +1,111 @@ +package org.jeecg.modules.userRole.entity; + +import java.io.Serializable; +import java.io.UnsupportedEncodingException; +import java.util.Date; +import java.math.BigDecimal; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import org.jeecgframework.poi.excel.annotation.Excel; +import org.jeecg.common.aspect.annotation.Dict; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * @Description: 角色表 + * @Author: jeecg-boot + * @Date: 2024-10-16 + * @Version: V1.0 + */ +@Data +@TableName("tb_user_role") +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = false) +@ApiModel(value="tb_user_role对象", description="角色表") +public class TbUserRole implements Serializable { + private static final long serialVersionUID = 1L; + + /**主键*/ + @TableId(type = IdType.ASSIGN_ID) + @ApiModelProperty(value = "主键") + private String id; + /**用户id*/ + @Excel(name = "用户id", width = 15) + @ApiModelProperty(value = "用户id") + private String userId; + /**角色信息 用人方企业 1 用人方个人 0*/ + @Excel(name = "角色信息 用人方企业 1 用人方个人 0", width = 15, dicCode = "user_role") + @Dict(dicCode = "user_role") + @ApiModelProperty(value = "用人方企业 1 用人方个人 0") + private Integer role; + /**用户名*/ + @Excel(name = "用户名", width = 15) + @ApiModelProperty(value = "用户名") + private String userName; + /**行业*/ + @Excel(name = "行业", width = 15) + @ApiModelProperty(value = "行业") + private String industry; + /**公司名称*/ + @Excel(name = "公司名称", width = 15) + @ApiModelProperty(value = "公司名称") + private String companyName; + /**税收编码*/ + @Excel(name = "税收编码", width = 15) + @ApiModelProperty(value = "税收编码") + private String taxCode; + /**公司地址*/ + @Excel(name = "公司地址", width = 15) + @ApiModelProperty(value = "公司地址") + private String address; + /**公司账号*/ + @Excel(name = "公司账号", width = 15) + @ApiModelProperty(value = "公司账号") + private String bankAccount; + /**电话*/ + @Excel(name = "电话", width = 15) + @ApiModelProperty(value = "电话") + private String phone; + /**开户行*/ + @Excel(name = "开户行", width = 15) + @ApiModelProperty(value = "开户行") + private String bankNama; + /**营业执照上传*/ + @Excel(name = "营业执照上传", width = 15) + @ApiModelProperty(value = "营业执照上传") + private String businessLicense; + /**基本户信息照片上传*/ + @Excel(name = "基本户信息照片上传", width = 15) + @ApiModelProperty(value = "基本户信息照片上传") + private String basicAccount; + /**收款银行照片上传*/ + @Excel(name = "收款银行照片上传", width = 15) + @ApiModelProperty(value = "收款银行照片上传") + private String bankInfo; + /**审核状态 0审核中 1 审核通过 2审核未通过*/ + @Excel(name = "审核状态 0审核中 1 审核通过 2审核未通过", width = 15, dicCode = "audit_status") + @Dict(dicCode = "audit_status") + @ApiModelProperty(value = "审核状态 0审核中 1 审核通过 2审核未通过") + private Integer auditStatus; + /**创建人*/ + @ApiModelProperty(value = "创建人") + private String createBy; + /**创建日期*/ + @ApiModelProperty(value = "创建日期") + private Date createTime; + /**更新人*/ + @ApiModelProperty(value = "更新人") + private String updateBy; + /**更新日期*/ + @ApiModelProperty(value = "更新日期") + private Date updateTime; + /**所属部门*/ + @ApiModelProperty(value = "所属部门") + private String sysOrgCode; +} diff --git a/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/userRole/mapper/TbUserRoleMapper.java b/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/userRole/mapper/TbUserRoleMapper.java new file mode 100644 index 0000000..860e826 --- /dev/null +++ b/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/userRole/mapper/TbUserRoleMapper.java @@ -0,0 +1,14 @@ +package org.jeecg.modules.userRole.mapper; + +import org.jeecg.modules.userRole.entity.TbUserRole; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * @Description: 角色表 + * @Author: jeecg-boot + * @Date: 2024-10-16 + * @Version: V1.0 + */ +public interface TbUserRoleMapper extends BaseMapper { + +} diff --git a/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/userRole/mapper/xml/TbUserRoleMapper.xml b/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/userRole/mapper/xml/TbUserRoleMapper.xml new file mode 100644 index 0000000..416449a --- /dev/null +++ b/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/userRole/mapper/xml/TbUserRoleMapper.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/userRole/service/ITbUserRoleService.java b/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/userRole/service/ITbUserRoleService.java new file mode 100644 index 0000000..58f7f24 --- /dev/null +++ b/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/userRole/service/ITbUserRoleService.java @@ -0,0 +1,19 @@ +package org.jeecg.modules.userRole.service; + +import org.jeecg.modules.userRole.entity.TbUserRole; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.Map; + +/** + * @Description: 角色表 + * @Author: jeecg-boot + * @Date: 2024-10-16 + * @Version: V1.0 + */ +public interface ITbUserRoleService extends IService { + + //获取首页基础信息 + Map getRoleInfo(String userId); + +} diff --git a/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/userRole/service/impl/TbUserRoleServiceImpl.java b/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/userRole/service/impl/TbUserRoleServiceImpl.java new file mode 100644 index 0000000..21a08cc --- /dev/null +++ b/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/userRole/service/impl/TbUserRoleServiceImpl.java @@ -0,0 +1,45 @@ +package org.jeecg.modules.userRole.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.jeecg.modules.userRole.entity.TbUserRole; +import org.jeecg.modules.userRole.mapper.TbUserRoleMapper; +import org.jeecg.modules.userRole.service.ITbUserRoleService; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +import java.util.HashMap; +import java.util.Map; + +/** + * @Description: 角色表 + * @Author: jeecg-boot + * @Date: 2024-10-16 + * @Version: V1.0 + */ +@Service +public class TbUserRoleServiceImpl extends ServiceImpl implements ITbUserRoleService { + + + @Override + public Map getRoleInfo(String userId) { + + LambdaQueryWrapper queryWrapper1 = new LambdaQueryWrapper<>(); + queryWrapper1.eq(TbUserRole::getUserId, userId). + eq(TbUserRole::getRole, 0).eq(TbUserRole::getAuditStatus, 1); + TbUserRole boss = this.getOne(queryWrapper1); + LambdaQueryWrapper queryWrapper2 = new LambdaQueryWrapper<>(); + queryWrapper2.eq(TbUserRole::getUserId, userId). + eq(TbUserRole::getRole, 1).eq(TbUserRole::getAuditStatus, 1); + TbUserRole company = this.getOne(queryWrapper2); + Map map = new HashMap<>(); +// 返回用人方个人身份信息 + map.put("boss", boss); + // 返回用人方企业身份信息 + map.put("company", company); + return map; + + } + + +} diff --git a/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/userRole/vue/TbUserRoleList.vue b/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/userRole/vue/TbUserRoleList.vue new file mode 100644 index 0000000..c602242 --- /dev/null +++ b/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/userRole/vue/TbUserRoleList.vue @@ -0,0 +1,278 @@ + + + + \ No newline at end of file diff --git a/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/userRole/vue/modules/TbUserRoleForm.vue b/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/userRole/vue/modules/TbUserRoleForm.vue new file mode 100644 index 0000000..343863d --- /dev/null +++ b/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/userRole/vue/modules/TbUserRoleForm.vue @@ -0,0 +1,159 @@ + + + \ No newline at end of file diff --git a/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/userRole/vue/modules/TbUserRoleModal.Style#Drawer.vue b/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/userRole/vue/modules/TbUserRoleModal.Style#Drawer.vue new file mode 100644 index 0000000..8142cb1 --- /dev/null +++ b/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/userRole/vue/modules/TbUserRoleModal.Style#Drawer.vue @@ -0,0 +1,84 @@ + + + + + \ No newline at end of file diff --git a/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/userRole/vue/modules/TbUserRoleModal.vue b/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/userRole/vue/modules/TbUserRoleModal.vue new file mode 100644 index 0000000..9ac4966 --- /dev/null +++ b/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/userRole/vue/modules/TbUserRoleModal.vue @@ -0,0 +1,60 @@ + + + \ No newline at end of file diff --git a/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/userRole/vue3/TbUserRole.api.ts b/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/userRole/vue3/TbUserRole.api.ts new file mode 100644 index 0000000..37d277d --- /dev/null +++ b/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/userRole/vue3/TbUserRole.api.ts @@ -0,0 +1,61 @@ +import {defHttp} from '/@/utils/http/axios'; +import {Modal} from 'ant-design-vue'; + +enum Api { + list = '/userRole/tbUserRole/list', + save='/userRole/tbUserRole/add', + edit='/userRole/tbUserRole/edit', + deleteOne = '/userRole/tbUserRole/delete', + deleteBatch = '/userRole/tbUserRole/deleteBatch', + importExcel = '/userRole/tbUserRole/importExcel', + exportXls = '/userRole/tbUserRole/exportXls', +} +/** + * 导出api + * @param params + */ +export const getExportUrl = Api.exportXls; +/** + * 导入api + */ +export const getImportUrl = Api.importExcel; +/** + * 列表接口 + * @param params + */ +export const list = (params) => + defHttp.get({url: Api.list, params}); + +/** + * 删除单个 + */ +export const deleteOne = (params,handleSuccess) => { + return defHttp.delete({url: Api.deleteOne, params}, {joinParamsToUrl: true}).then(() => { + handleSuccess(); + }); +} +/** + * 批量删除 + * @param params + */ +export const batchDelete = (params, handleSuccess) => { + Modal.confirm({ + title: '确认删除', + content: '是否删除选中数据', + okText: '确认', + cancelText: '取消', + onOk: () => { + return defHttp.delete({url: Api.deleteBatch, data: params}, {joinParamsToUrl: true}).then(() => { + handleSuccess(); + }); + } + }); +} +/** + * 保存或者更新 + * @param params + */ +export const saveOrUpdate = (params, isUpdate) => { + let url = isUpdate ? Api.edit : Api.save; + return defHttp.post({url: url, params}); +} diff --git a/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/userRole/vue3/TbUserRole.data.ts b/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/userRole/vue3/TbUserRole.data.ts new file mode 100644 index 0000000..540f7b4 --- /dev/null +++ b/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/userRole/vue3/TbUserRole.data.ts @@ -0,0 +1,184 @@ +import {BasicColumn} from '/@/components/Table'; +import {FormSchema} from '/@/components/Table'; +import { rules} from '/@/utils/helper/validator'; +import { render } from '/@/utils/common/renderUtils'; +//列表数据 +export const columns: BasicColumn[] = [ + { + title: '角色信息 1供应商 2采购商', + align:"center", + dataIndex: 'role_dictText' + }, + { + title: '用户名', + align:"center", + dataIndex: 'userName' + }, + { + title: '公司名称', + align:"center", + dataIndex: 'companyName' + }, + { + title: '税收编码', + align:"center", + dataIndex: 'taxCode' + }, + { + title: '公司地址', + align:"center", + dataIndex: 'address' + }, + { + title: '公司账号', + align:"center", + dataIndex: 'bankAccount' + }, + { + title: '电话', + align:"center", + dataIndex: 'phone' + }, + { + title: '开户行', + align:"center", + dataIndex: 'bankNama' + }, + { + title: '营业执照上传', + align:"center", + dataIndex: 'businessLicense', + customRender:render.renderAvatar, + }, + { + title: '基本户信息照片上传', + align:"center", + dataIndex: 'basicAccount', + customRender:render.renderAvatar, + }, + { + title: '收款银行照片上传', + align:"center", + dataIndex: 'bankInfo', + customRender:render.renderAvatar, + }, + { + title: '审核状态 0审核中 1 审核通过 2审核未通过', + align:"center", + dataIndex: 'auditStatus_dictText' + }, +]; +//查询数据 +export const searchFormSchema: FormSchema[] = [ + { + label: "角色信息 1供应商 2采购商", + field: "role", + component: 'JDictSelectTag', + componentProps:{ + dictCode:"user_role" + }, + colProps: {span: 6}, + }, + { + label: "用户名", + field: "userName", + component: 'Input', + colProps: {span: 6}, + }, + { + label: "公司名称", + field: "companyName", + component: 'Input', + colProps: {span: 6}, + }, + { + label: "电话", + field: "phone", + component: 'Input', + colProps: {span: 6}, + }, + { + label: "审核状态 0审核中 1 审核通过 2审核未通过", + field: "auditStatus", + component: 'JDictSelectTag', + componentProps:{ + dictCode:"audit_status" + }, + colProps: {span: 6}, + }, +]; +//表单数据 +export const formSchema: FormSchema[] = [ + { + label: '角色信息 1供应商 2采购商', + field: 'role', + component: 'JDictSelectTag', + componentProps:{ + dictCode:"user_role" + }, + }, + { + label: '用户名', + field: 'userName', + component: 'Input', + }, + { + label: '公司名称', + field: 'companyName', + component: 'Input', + }, + { + label: '税收编码', + field: 'taxCode', + component: 'Input', + }, + { + label: '公司地址', + field: 'address', + component: 'Input', + }, + { + label: '公司账号', + field: 'bankAccount', + component: 'Input', + }, + { + label: '电话', + field: 'phone', + component: 'Input', + }, + { + label: '开户行', + field: 'bankNama', + component: 'Input', + }, + { + label: '营业执照上传', + field: 'businessLicense', + component: 'JImageUpload', + componentProps:{ + }, + }, + { + label: '基本户信息照片上传', + field: 'basicAccount', + component: 'JImageUpload', + componentProps:{ + }, + }, + { + label: '收款银行照片上传', + field: 'bankInfo', + component: 'JImageUpload', + componentProps:{ + }, + }, + { + label: '审核状态 0审核中 1 审核通过 2审核未通过', + field: 'auditStatus', + component: 'JDictSelectTag', + componentProps:{ + dictCode:"audit_status" + }, + }, +]; diff --git a/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/userRole/vue3/TbUserRoleList.vue b/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/userRole/vue3/TbUserRoleList.vue new file mode 100644 index 0000000..9c06043 --- /dev/null +++ b/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/userRole/vue3/TbUserRoleList.vue @@ -0,0 +1,162 @@ + + + + + \ No newline at end of file diff --git a/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/userRole/vue3/components/TbUserRoleModal.vue b/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/userRole/vue3/components/TbUserRoleModal.vue new file mode 100644 index 0000000..3a75d48 --- /dev/null +++ b/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/userRole/vue3/components/TbUserRoleModal.vue @@ -0,0 +1,58 @@ + + + + + \ No newline at end of file diff --git a/jeecg-boot-module-system/src/main/java/org/jeecg/modules/postBean/ReqUserRole.java b/jeecg-boot-module-system/src/main/java/org/jeecg/modules/postBean/ReqUserRole.java new file mode 100644 index 0000000..0901b80 --- /dev/null +++ b/jeecg-boot-module-system/src/main/java/org/jeecg/modules/postBean/ReqUserRole.java @@ -0,0 +1,79 @@ +package org.jeecg.modules.postBean; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.jeecg.common.aspect.annotation.Dict; +import org.jeecgframework.poi.excel.annotation.Excel; + +import java.io.Serializable; + +/** + * @Description: 角色表 + * @Author: jeecg-boot + * @Date: 2024-10-16 + * @Version: V1.0 + */ +@Data +@ApiModel(value="选择身份对象", description="选择身份对象") +public class ReqUserRole implements Serializable { + private static final long serialVersionUID = 1L; + + + + /**用人方企业 1 用人方个人 0*/ + @Excel(name = "用人方企业 1 用人方个人 0", width = 15, dicCode = "user_role") + @Dict(dicCode = "user_role") + @ApiModelProperty(value = "用人方企业 1 用人方个人 0") + private Integer role; + /**用户名*/ + @Excel(name = "用户名", width = 15) + @ApiModelProperty(value = "用户名") + private String userName; + @ApiModelProperty(value = "行业") + private String industry; +// @ApiModelProperty(value = "密码") +// private String password; + /**公司名称*/ + @Excel(name = "公司名称", width = 15) + @ApiModelProperty(value = "公司名称") + private String companyName; +// /**税收编码*/ +// @Excel(name = "税收编码", width = 15) +// @ApiModelProperty(value = "税收编码") +// private String taxCode; + /**公司地址*/ + @Excel(name = "公司地址", width = 15) + @ApiModelProperty(value = "公司地址") + private String address; +// /**公司账号*/ +// @Excel(name = "公司账号", width = 15) +// @ApiModelProperty(value = "公司账号") +// private String bankAccount; +// /**电话*/ +// @Excel(name = "电话", width = 15) +// @ApiModelProperty(value = "电话") +// private String phone; +// /**开户行*/ +// @Excel(name = "开户行", width = 15) +// @ApiModelProperty(value = "开户行") +// private String bankNama; + /**营业执照上传*/ + @Excel(name = "营业执照上传", width = 15) + @ApiModelProperty(value = "营业执照上传") + private String businessLicense; +// /**基本户信息照片上传*/ +// @Excel(name = "基本户信息照片上传", width = 15) +// @ApiModelProperty(value = "基本户信息照片上传") +// private String basicAccount; +// /**收款银行照片上传*/ +// @Excel(name = "收款银行照片上传", width = 15) +// @ApiModelProperty(value = "收款银行照片上传") +// private String bankInfo; +// /**审核状态 0审核中 1 审核通过 2审核未通过*/ +// @Excel(name = "审核状态 0审核中 1 审核通过 2审核未通过", width = 15, dicCode = "audit_status") +// @Dict(dicCode = "audit_status") +// @ApiModelProperty(value = "审核状态 0审核中 1 审核通过 2审核未通过") +// private Integer auditStatus; + +} diff --git a/jeecg-boot-module-system/src/main/java/org/jeecg/modules/user/controller/UserController.java b/jeecg-boot-module-system/src/main/java/org/jeecg/modules/user/controller/UserController.java deleted file mode 100644 index c5c995f..0000000 --- a/jeecg-boot-module-system/src/main/java/org/jeecg/modules/user/controller/UserController.java +++ /dev/null @@ -1,35 +0,0 @@ -package org.jeecg.modules.user.controller; - -import io.swagger.annotations.ApiOperation; -import lombok.extern.slf4j.Slf4j; -import org.jeecg.common.api.vo.Result; -import org.jeecg.modules.bean.LoginReq; -import org.jeecg.modules.user.service.AppletLoginService; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import javax.annotation.Resource; - - -/** - * 服务化 system模块 对外接口请求类 - * @author: jeecg-boot - */ -@Slf4j -@RestController -@RequestMapping("/user/") -public class UserController { - - @Resource - private AppletLoginService appletLoginService; - - - //小程序授权登录 - @ApiOperation(value="小程序-登录接口", notes="小程序-登录接口") - @GetMapping("/login") - public Result login(LoginReq loginReq){ - return appletLoginService.appletLogin(loginReq); - } - -} diff --git a/jeecg-boot-module-system/src/main/java/org/jeecg/modules/user/controller/IndexController.java b/jeecg-boot-module-system/src/main/java/org/jeecg/modules/userCode/controller/IndexController.java similarity index 84% rename from jeecg-boot-module-system/src/main/java/org/jeecg/modules/user/controller/IndexController.java rename to jeecg-boot-module-system/src/main/java/org/jeecg/modules/userCode/controller/IndexController.java index b3126eb..f92b76e 100644 --- a/jeecg-boot-module-system/src/main/java/org/jeecg/modules/user/controller/IndexController.java +++ b/jeecg-boot-module-system/src/main/java/org/jeecg/modules/userCode/controller/IndexController.java @@ -1,30 +1,23 @@ -package org.jeecg.modules.user.controller; +package org.jeecg.modules.userCode.controller; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; -import com.xkcoding.http.HttpUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.jeecg.common.api.vo.Result; -import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.util.RedisUtil; import org.jeecg.config.shiro.ShiroRealm; -import org.jeecg.modules.user.service.IndexService; +import org.jeecg.modules.userCode.service.IndexService; import org.jeecg.modules.banner.entity.WebBanner; import org.jeecg.modules.hanHaiMember.entity.HanHaiMember; import org.jeecg.modules.postBean.SuggestReq; import org.jeecg.modules.tbSuggest.entity.TbSuggest; import org.jeecg.modules.tbSuggest.service.ITbSuggestService; -import org.jeecg.modules.utils.ValidateTool; import org.springframework.beans.BeanUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.List; import java.util.Map; -import java.util.stream.Collectors; /** * @Author scott diff --git a/jeecg-boot-module-system/src/main/java/org/jeecg/modules/userCode/controller/UserController.java b/jeecg-boot-module-system/src/main/java/org/jeecg/modules/userCode/controller/UserController.java new file mode 100644 index 0000000..db0d18a --- /dev/null +++ b/jeecg-boot-module-system/src/main/java/org/jeecg/modules/userCode/controller/UserController.java @@ -0,0 +1,51 @@ +package org.jeecg.modules.userCode.controller; + +import com.alibaba.fastjson.JSONObject; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.jeecg.common.api.vo.Result; +import org.jeecg.modules.bean.LoginReq; +import org.jeecg.modules.postBean.ReqUserRole; +import org.jeecg.modules.userCode.service.AppletLoginService; +import org.jeecg.modules.utils.ValidateTool; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + + +/** + * 服务化 system模块 对外接口请求类 + * + * @author: jeecg-boot + */ +@Slf4j +@RestController +@RequestMapping("/user/") +@Api(tags = "登陆选择身份等接口") +public class UserController { + + @Resource + private AppletLoginService appletLoginService; + + + //小程序授权登录 + @ApiOperation(value = "小程序-登录接口", notes = "小程序-登录接口") + @GetMapping("/login") + public Result login(LoginReq loginReq) { + return appletLoginService.appletLogin(loginReq); + } + + + @ApiOperation(value = "选择身份") + @RequestMapping(value = "/role", method = RequestMethod.POST) + public Result role(@RequestBody ReqUserRole reqUserRole, @RequestHeader("X-Access-Token") String token) { + if (ValidateTool.isNull(reqUserRole)) { + return Result.error("参数错误"); + } + + return appletLoginService.role(reqUserRole,token); + } + + +} diff --git a/jeecg-boot-module-system/src/main/java/org/jeecg/modules/user/service/AppletLoginService.java b/jeecg-boot-module-system/src/main/java/org/jeecg/modules/userCode/service/AppletLoginService.java similarity index 56% rename from jeecg-boot-module-system/src/main/java/org/jeecg/modules/user/service/AppletLoginService.java rename to jeecg-boot-module-system/src/main/java/org/jeecg/modules/userCode/service/AppletLoginService.java index 041a9eb..e5968e7 100644 --- a/jeecg-boot-module-system/src/main/java/org/jeecg/modules/user/service/AppletLoginService.java +++ b/jeecg-boot-module-system/src/main/java/org/jeecg/modules/userCode/service/AppletLoginService.java @@ -1,15 +1,19 @@ -package org.jeecg.modules.user.service; +package org.jeecg.modules.userCode.service; +import com.alibaba.fastjson.JSONObject; import org.jeecg.common.api.vo.Result; import org.jeecg.modules.bean.LoginReq; +import org.jeecg.modules.postBean.ReqUserRole; public interface AppletLoginService { /** * 微信小程序登录接口 + * * @param loginReq * @return */ Result appletLogin(LoginReq loginReq); + Result role(ReqUserRole reqUserRole, String token); } diff --git a/jeecg-boot-module-system/src/main/java/org/jeecg/modules/user/service/IndexService.java b/jeecg-boot-module-system/src/main/java/org/jeecg/modules/userCode/service/IndexService.java similarity index 89% rename from jeecg-boot-module-system/src/main/java/org/jeecg/modules/user/service/IndexService.java rename to jeecg-boot-module-system/src/main/java/org/jeecg/modules/userCode/service/IndexService.java index d044028..adea753 100644 --- a/jeecg-boot-module-system/src/main/java/org/jeecg/modules/user/service/IndexService.java +++ b/jeecg-boot-module-system/src/main/java/org/jeecg/modules/userCode/service/IndexService.java @@ -1,4 +1,4 @@ -package org.jeecg.modules.user.service; +package org.jeecg.modules.userCode.service; import org.jeecg.common.api.vo.Result; import org.jeecg.modules.banner.entity.WebBanner; diff --git a/jeecg-boot-module-system/src/main/java/org/jeecg/modules/user/service/impl/AppletLoginServiceImpl.java b/jeecg-boot-module-system/src/main/java/org/jeecg/modules/userCode/service/impl/AppletLoginServiceImpl.java similarity index 79% rename from jeecg-boot-module-system/src/main/java/org/jeecg/modules/user/service/impl/AppletLoginServiceImpl.java rename to jeecg-boot-module-system/src/main/java/org/jeecg/modules/userCode/service/impl/AppletLoginServiceImpl.java index 86edcdb..f31cfa6 100644 --- a/jeecg-boot-module-system/src/main/java/org/jeecg/modules/user/service/impl/AppletLoginServiceImpl.java +++ b/jeecg-boot-module-system/src/main/java/org/jeecg/modules/userCode/service/impl/AppletLoginServiceImpl.java @@ -1,17 +1,24 @@ -package org.jeecg.modules.user.service.impl; +package org.jeecg.modules.userCode.service.impl; import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import org.apache.commons.lang3.StringUtils; import org.jeecg.common.api.vo.Result; import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.exception.JeecgBootException; import org.jeecg.common.system.util.JwtUtil; import org.jeecg.common.util.RedisUtil; +import org.jeecg.config.shiro.ShiroRealm; import org.jeecg.modules.bean.HttpConf; import org.jeecg.modules.bean.LoginReq; import org.jeecg.modules.hanHaiMember.entity.HanHaiMember; import org.jeecg.modules.hanHaiMember.service.IHanHaiMemberService; -import org.jeecg.modules.user.service.AppletLoginService; +import org.jeecg.modules.postBean.ReqUserRole; +import org.jeecg.modules.userCode.service.AppletLoginService; +import org.jeecg.modules.userRole.entity.TbUserRole; +import org.jeecg.modules.userRole.service.ITbUserRoleService; +import org.jeecg.modules.utils.ValidateTool; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -30,7 +37,8 @@ public class AppletLoginServiceImpl implements AppletLoginService { @Value("${wechat.mpAppSecret}") private String mpAppSecret; - + @Resource + private ShiroRealm shiroRealm; @Resource private IHanHaiMemberService memberService; @@ -39,6 +47,8 @@ public class AppletLoginServiceImpl implements AppletLoginService { private RedisUtil redisUtil; @Resource private HttpConf httpConf; + @Resource + private ITbUserRoleService tbUserRoleService; @@ -82,7 +92,10 @@ public class AppletLoginServiceImpl implements AppletLoginService { redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, JwtUtil.EXPIRE_TIME / 100); map.put("userInfo", member); map.put("token", token); - + //返回身份角色信息 新账号没有身份 + map.put("boss", null); + map.put("company", null); + map.put("worker", null); result.setCode(200); result.setResult(map); return result; @@ -95,6 +108,11 @@ public class AppletLoginServiceImpl implements AppletLoginService { redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, token); // 设置超时时间 redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, JwtUtil.EXPIRE_TIME / 100); + Map roleInfo = tbUserRoleService.getRoleInfo(member.getId()); + //返回身份角色信息 + map.put("boss", roleInfo.get("boss")); + map.put("company", roleInfo.get("company")); + map.put("worker", null); map.put("userInfo", member); map.put("token", token); //用户id做im账号 @@ -109,6 +127,37 @@ public class AppletLoginServiceImpl implements AppletLoginService { // return result; // } } + + return result; + } + + + @Transactional(rollbackFor = Exception.class) + @Override + public Result role(ReqUserRole reqUserRole, String token) { + + HanHaiMember hanHaiMember = shiroRealm.checkUserTokenIsEffectHanHaiAccount(token); + Result result = new Result(); + //getAuditStatus 0审核中 1 审核通过 2审核未通过 + LambdaQueryWrapper objectLambdaQueryWrapper = new LambdaQueryWrapper<>(); + objectLambdaQueryWrapper.eq(TbUserRole::getUserId,hanHaiMember.getId()). + eq(TbUserRole::getRole,reqUserRole.getRole()).in(TbUserRole::getAuditStatus,1,0); + TbUserRole one1 = tbUserRoleService.getOne(objectLambdaQueryWrapper); + if (ValidateTool.isNotNull(one1) && one1.getAuditStatus()==0){ + return result.error500("已提交审核,请耐心等候或联系管理员"); + } + if (ValidateTool.isNotNull(one1) && one1.getAuditStatus()==1){ + return result.error500("已提交审核,请勿重复提交"); + } + TbUserRole tbUserRole = new TbUserRole(); + BeanUtils.copyProperties(reqUserRole, tbUserRole); + tbUserRole.setUserId(hanHaiMember.getId()); + tbUserRole.setAuditStatus(0); + tbUserRoleService.save(tbUserRole); + JSONObject obj = new JSONObject(); + obj.put("role", tbUserRole); + result.setResult(obj); + result.setCode(CommonConstant.SC_OK_200); return result; } diff --git a/jeecg-boot-module-system/src/main/java/org/jeecg/modules/user/service/impl/IndexServiceImpl.java b/jeecg-boot-module-system/src/main/java/org/jeecg/modules/userCode/service/impl/IndexServiceImpl.java similarity index 63% rename from jeecg-boot-module-system/src/main/java/org/jeecg/modules/user/service/impl/IndexServiceImpl.java rename to jeecg-boot-module-system/src/main/java/org/jeecg/modules/userCode/service/impl/IndexServiceImpl.java index 68f3856..dcf605f 100644 --- a/jeecg-boot-module-system/src/main/java/org/jeecg/modules/user/service/impl/IndexServiceImpl.java +++ b/jeecg-boot-module-system/src/main/java/org/jeecg/modules/userCode/service/impl/IndexServiceImpl.java @@ -1,4 +1,4 @@ -package org.jeecg.modules.user.service.impl; +package org.jeecg.modules.userCode.service.impl; import com.alibaba.fastjson.JSONObject; @@ -11,7 +11,8 @@ import org.jeecg.modules.banner.service.IWebBannerService; import org.jeecg.modules.hanHaiMember.entity.HanHaiMember; import org.jeecg.modules.tbConf.entity.TbConf; import org.jeecg.modules.tbConf.service.ITbConfService; -import org.jeecg.modules.user.service.IndexService; +import org.jeecg.modules.userCode.service.IndexService; +import org.jeecg.modules.userRole.service.ITbUserRoleService; import org.jeecg.modules.utils.ValidateTool; import org.springframework.stereotype.Service; @@ -31,8 +32,8 @@ public class IndexServiceImpl implements IndexService { private ITbConfService tbConfService; @Resource private ShiroRealm shiroRealm; -// @Resource -// private ITbUserRoleService tbUserRoleService; + @Resource + private ITbUserRoleService tbUserRoleService; @Resource private RedisUtil redisUtil; @@ -47,25 +48,13 @@ public class IndexServiceImpl implements IndexService { //平台客户电话号码 jsonObject.put("phone", ValidateTool.isNull(one) ? "19198239116" : one.getValue()); jsonObject.put("my", hanHaiMember); - //清关背景图 - QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("name", "sys_pic_qg"); - TbConf pic = tbConfService.getOne(queryWrapper); - jsonObject.put("pic", ValidateTool.isNull(pic) ? "https://dianpin-img.xzaiyp.top/temp/组478612x_1730704228537.png" : pic.getValue()); -// LambdaQueryWrapper objectLambdaQueryWrapper = new LambdaQueryWrapper<>(); -// objectLambdaQueryWrapper.eq(TbUserRole::getUserId, hanHaiMember.getId()). -// eq(TbUserRole::getRole, 0).eq(TbUserRole::getAuditStatus, 1); -// TbUserRole cg = tbUserRoleService.getOne(objectLambdaQueryWrapper); -// LambdaQueryWrapper queryWrapper1 = new LambdaQueryWrapper<>(); -// queryWrapper1.eq(TbUserRole::getUserId, hanHaiMember.getId()). -// eq(TbUserRole::getRole, 1).eq(TbUserRole::getAuditStatus, 1); -// TbUserRole shop = tbUserRoleService.getOne(queryWrapper1); -//// 返回采购商身份信息 -// jsonObject.put("buy", cg); -//// 返回供应商身份信息 -// jsonObject.put("shop", shop); + Map roleInfo = tbUserRoleService.getRoleInfo(hanHaiMember.getId()); +// 返回用人方个人身份信息 + jsonObject.put("boss", roleInfo.get("boss")); + // 返回用人方企业身份信息 + jsonObject.put("company", roleInfo.get("company")); return Result.OK(jsonObject); } diff --git a/jeecg-boot-module-system/src/main/resources/application-dev.yml b/jeecg-boot-module-system/src/main/resources/application-dev.yml index d6e5e76..1e65927 100644 --- a/jeecg-boot-module-system/src/main/resources/application-dev.yml +++ b/jeecg-boot-module-system/src/main/resources/application-dev.yml @@ -7,7 +7,7 @@ server: include-stacktrace: ALWAYS include-message: ALWAYS servlet: - context-path: /employ-admin + context-path: /employ-api compression: enabled: true min-response-size: 1024 @@ -331,8 +331,8 @@ third-app: #配置微信 wechat: - mpAppId: wxe631bce44d54667e - mpAppSecret: 2f19c405ea9bb523f350b5a9fd01b878 + mpAppId: wx6931d85f7371b032 + mpAppSecret: 4bc2d5bdfec7023818ece6ee41613f18 mchId: mchKey: keyPath: /usr/local/cert/apiclient_cert.p12 diff --git a/jeecg-boot-module-system/src/main/resources/application-prod.yml b/jeecg-boot-module-system/src/main/resources/application-prod.yml index 14cde23..cafc0b1 100644 --- a/jeecg-boot-module-system/src/main/resources/application-prod.yml +++ b/jeecg-boot-module-system/src/main/resources/application-prod.yml @@ -7,7 +7,7 @@ server: include-stacktrace: ALWAYS include-message: ALWAYS servlet: - context-path: /employ-admin + context-path: /employ-api compression: enabled: true min-response-size: 1024 @@ -136,7 +136,7 @@ spring: master: url: jdbc:mysql://8.138.162.67:3306/employ2?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai&autoReconnect=true&failOverReadOnly=false username: root - password: Fk4q*h@V + password: F^E5!Kfd driver-class-name: com.mysql.cj.jdbc.Driver # 多数据源配置 #multi-datasource1: