From f094c30e46a0351197cef9761eba0e4ce6fd3812 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=B0=8F=E8=AF=BA?= <1253070437@qq.com>
Date: Thu, 3 Nov 2022 03:07:44 +0800
Subject: [PATCH] =?UTF-8?q?=E3=80=90=E6=96=B0=E5=A2=9E=E3=80=91=E5=A4=A7?=
=?UTF-8?q?=E6=9B=B4=E6=96=B0=20v2.1=20=E6=96=B0=E5=A2=9E=E4=BB=A3?=
=?UTF-8?q?=E7=A0=81=E7=94=9F=E6=88=90=EF=BC=8C=E5=85=B7=E4=BD=93=E4=BD=BF?=
=?UTF-8?q?=E7=94=A8=E7=9C=8B=E5=AE=98=E6=96=B9=E6=96=87=E6=A1=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
snowy-admin-web/src/api/gen/genBasicApi.js | 45 ++
snowy-admin-web/src/api/gen/genConfigApi.js | 26 +
snowy-admin-web/src/utils/tool.js | 18 +
snowy-admin-web/src/views/gen/basic.vue | 378 +++++++++++
snowy-admin-web/src/views/gen/config.vue | 406 +++++++++++
snowy-admin-web/src/views/gen/index.vue | 213 ++++++
snowy-admin-web/src/views/gen/preview.vue | 79 +++
snowy-admin-web/src/views/gen/steps.vue | 164 +++++
snowy-plugin-api/pom.xml | 3 +
.../snowy-plugin-gen-api/README.md | 1 +
snowy-plugin-api/snowy-plugin-gen-api/pom.xml | 25 +
.../java/vip/xiaonuo/gen/package-info.java | 13 +
.../vip/xiaonuo/sys/api/SysButtonApi.java | 30 +
.../java/vip/xiaonuo/sys/api/SysMenuApi.java | 30 +
.../java/vip/xiaonuo/sys/api/SysRoleApi.java | 8 +
snowy-plugin/pom.xml | 3 +
snowy-plugin/snowy-plugin-gen/README.md | 1 +
snowy-plugin/snowy-plugin-gen/pom.xml | 44 ++
.../xiaonuo/gen/core/config/GenConfigure.java | 68 ++
.../gen/core/enums/GenBuildInEnum.java | 26 +
.../xiaonuo/gen/core/util/GenDbTypeUtil.java | 91 +++
.../basic/controller/GenBasicController.java | 197 ++++++
.../gen/modular/basic/entity/GenBasic.java | 91 +++
.../basic/enums/GenEffectTypeEnum.java | 58 ++
.../modular/basic/enums/GenJavaTypeEnum.java | 55 ++
.../gen/modular/basic/enums/GenTypeEnum.java | 37 +
.../gen/modular/basic/enums/GenYesNoEnum.java | 37 +
.../modular/basic/mapper/GenBasicMapper.java | 25 +
.../basic/mapper/mapping/GenBasicMapper.xml | 5 +
.../modular/basic/param/GenBasicAddParam.java | 98 +++
.../basic/param/GenBasicEditParam.java | 104 +++
.../modular/basic/param/GenBasicIdParam.java | 35 +
.../basic/param/GenBasicPageParam.java | 44 ++
.../basic/param/GenBasicTableColumnParam.java | 35 +
.../basic/result/GenBasicPreviewResult.java | 59 ++
.../result/GenBasicTableColumnResult.java | 40 ++
.../basic/result/GenBasicTableResult.java | 36 +
.../basic/service/GenBasicService.java | 122 ++++
.../service/impl/GenBasicServiceImpl.java | 640 ++++++++++++++++++
.../controller/GenConfigController.java | 125 ++++
.../gen/modular/config/entity/GenConfig.java | 95 +++
.../config/mapper/GenConfigMapper.java | 25 +
.../config/mapper/mapping/GenConfigMapper.xml | 5 +
.../config/param/GenConfigAddParam.java | 95 +++
.../config/param/GenConfigEditParam.java | 107 +++
.../config/param/GenConfigIdParam.java | 35 +
.../config/param/GenConfigListParam.java | 43 ++
.../config/param/GenConfigPageParam.java | 51 ++
.../config/service/GenConfigService.java | 79 +++
.../service/impl/GenConfigServiceImpl.java | 95 +++
.../main/resources/backend/AddParam.java.btl | 44 ++
.../resources/backend/Controller.java.btl | 125 ++++
.../main/resources/backend/EditParam.java.btl | 44 ++
.../main/resources/backend/Entity.java.btl | 52 ++
.../src/main/resources/backend/Enum.java.btl | 34 +
.../main/resources/backend/IdParam.java.btl | 35 +
.../main/resources/backend/Mapper.java.btl | 25 +
.../src/main/resources/backend/Mapper.xml.btl | 5 +
.../main/resources/backend/PageParam.java.btl | 69 ++
.../main/resources/backend/Service.java.btl | 80 +++
.../resources/backend/ServiceImpl.java.btl | 109 +++
.../src/main/resources/frontend/Api.js.btl | 32 +
.../src/main/resources/frontend/form.vue.btl | 175 +++++
.../src/main/resources/frontend/index.vue.btl | 254 +++++++
.../src/main/resources/sqlend/Mysql.sql.btl | 14 +
.../src/main/resources/sqlend/Oracle.sql.btl | 14 +
.../provider/SysButtonApiProvider.java | 39 ++
.../resource/provider/SysMenuApiProvider.java | 37 +
.../resource/service/SysButtonService.java | 9 +
.../resource/service/SysMenuService.java | 8 +
.../service/impl/SysButtonServiceImpl.java | 15 +
.../service/impl/SysMenuServiceImpl.java | 40 ++
.../role/provider/SysRoleApiProvider.java | 53 ++
snowy-web-app/pom.xml | 7 +
74 files changed, 5464 insertions(+)
create mode 100644 snowy-admin-web/src/api/gen/genBasicApi.js
create mode 100644 snowy-admin-web/src/api/gen/genConfigApi.js
create mode 100644 snowy-admin-web/src/views/gen/basic.vue
create mode 100644 snowy-admin-web/src/views/gen/config.vue
create mode 100644 snowy-admin-web/src/views/gen/index.vue
create mode 100644 snowy-admin-web/src/views/gen/preview.vue
create mode 100644 snowy-admin-web/src/views/gen/steps.vue
create mode 100644 snowy-plugin-api/snowy-plugin-gen-api/README.md
create mode 100644 snowy-plugin-api/snowy-plugin-gen-api/pom.xml
create mode 100644 snowy-plugin-api/snowy-plugin-gen-api/src/main/java/vip/xiaonuo/gen/package-info.java
create mode 100644 snowy-plugin-api/snowy-plugin-sys-api/src/main/java/vip/xiaonuo/sys/api/SysButtonApi.java
create mode 100644 snowy-plugin-api/snowy-plugin-sys-api/src/main/java/vip/xiaonuo/sys/api/SysMenuApi.java
create mode 100644 snowy-plugin/snowy-plugin-gen/README.md
create mode 100644 snowy-plugin/snowy-plugin-gen/pom.xml
create mode 100644 snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/core/config/GenConfigure.java
create mode 100644 snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/core/enums/GenBuildInEnum.java
create mode 100644 snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/core/util/GenDbTypeUtil.java
create mode 100644 snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/controller/GenBasicController.java
create mode 100644 snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/entity/GenBasic.java
create mode 100644 snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/enums/GenEffectTypeEnum.java
create mode 100644 snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/enums/GenJavaTypeEnum.java
create mode 100644 snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/enums/GenTypeEnum.java
create mode 100644 snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/enums/GenYesNoEnum.java
create mode 100644 snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/mapper/GenBasicMapper.java
create mode 100644 snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/mapper/mapping/GenBasicMapper.xml
create mode 100644 snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/param/GenBasicAddParam.java
create mode 100644 snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/param/GenBasicEditParam.java
create mode 100644 snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/param/GenBasicIdParam.java
create mode 100644 snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/param/GenBasicPageParam.java
create mode 100644 snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/param/GenBasicTableColumnParam.java
create mode 100644 snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/result/GenBasicPreviewResult.java
create mode 100644 snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/result/GenBasicTableColumnResult.java
create mode 100644 snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/result/GenBasicTableResult.java
create mode 100644 snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/service/GenBasicService.java
create mode 100644 snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/service/impl/GenBasicServiceImpl.java
create mode 100644 snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/controller/GenConfigController.java
create mode 100644 snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/entity/GenConfig.java
create mode 100644 snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/mapper/GenConfigMapper.java
create mode 100644 snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/mapper/mapping/GenConfigMapper.xml
create mode 100644 snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/param/GenConfigAddParam.java
create mode 100644 snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/param/GenConfigEditParam.java
create mode 100644 snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/param/GenConfigIdParam.java
create mode 100644 snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/param/GenConfigListParam.java
create mode 100644 snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/param/GenConfigPageParam.java
create mode 100644 snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/service/GenConfigService.java
create mode 100644 snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/service/impl/GenConfigServiceImpl.java
create mode 100644 snowy-plugin/snowy-plugin-gen/src/main/resources/backend/AddParam.java.btl
create mode 100644 snowy-plugin/snowy-plugin-gen/src/main/resources/backend/Controller.java.btl
create mode 100644 snowy-plugin/snowy-plugin-gen/src/main/resources/backend/EditParam.java.btl
create mode 100644 snowy-plugin/snowy-plugin-gen/src/main/resources/backend/Entity.java.btl
create mode 100644 snowy-plugin/snowy-plugin-gen/src/main/resources/backend/Enum.java.btl
create mode 100644 snowy-plugin/snowy-plugin-gen/src/main/resources/backend/IdParam.java.btl
create mode 100644 snowy-plugin/snowy-plugin-gen/src/main/resources/backend/Mapper.java.btl
create mode 100644 snowy-plugin/snowy-plugin-gen/src/main/resources/backend/Mapper.xml.btl
create mode 100644 snowy-plugin/snowy-plugin-gen/src/main/resources/backend/PageParam.java.btl
create mode 100644 snowy-plugin/snowy-plugin-gen/src/main/resources/backend/Service.java.btl
create mode 100644 snowy-plugin/snowy-plugin-gen/src/main/resources/backend/ServiceImpl.java.btl
create mode 100644 snowy-plugin/snowy-plugin-gen/src/main/resources/frontend/Api.js.btl
create mode 100644 snowy-plugin/snowy-plugin-gen/src/main/resources/frontend/form.vue.btl
create mode 100644 snowy-plugin/snowy-plugin-gen/src/main/resources/frontend/index.vue.btl
create mode 100644 snowy-plugin/snowy-plugin-gen/src/main/resources/sqlend/Mysql.sql.btl
create mode 100644 snowy-plugin/snowy-plugin-gen/src/main/resources/sqlend/Oracle.sql.btl
create mode 100644 snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/provider/SysButtonApiProvider.java
create mode 100644 snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/provider/SysMenuApiProvider.java
diff --git a/snowy-admin-web/src/api/gen/genBasicApi.js b/snowy-admin-web/src/api/gen/genBasicApi.js
new file mode 100644
index 00000000..b0a43234
--- /dev/null
+++ b/snowy-admin-web/src/api/gen/genBasicApi.js
@@ -0,0 +1,45 @@
+import { baseRequest } from '@/utils/request'
+
+const request = (url, ...arg) => baseRequest(`/gen/basic/${url}`, ...arg)
+
+export default {
+ // 获取代码生成基础分页
+ basicPage(data) {
+ return request('page', data, 'get')
+ },
+ // 提交表单 edit为true时为编辑,默认为新增
+ submitForm(data, edit = false) {
+ return request(edit ? 'add' : 'edit', data)
+ },
+ // 删除代码生成基础
+ basicDelete(data) {
+ return request('delete', data)
+ },
+ // 获取代码生成基础详情
+ basicDetail(data) {
+ return request('detail', data, 'get')
+ },
+ // 获取所有表信息
+ basicTables(data) {
+ return request('tables', data, 'get')
+ },
+ // 获取表内所有字段信息
+ basicTableColumns(data) {
+ return request('tableColumns', data, 'get')
+ },
+ // 执行代码生成 压缩包
+ basicExecGenBiz(data) {
+ const options = {
+ responseType: 'blob'
+ }
+ return request('execGenZip', data, 'get', options)
+ },
+ // 执行代码生成 项目内
+ basicExecGenPro(data) {
+ return request('execGenPro', data)
+ },
+ // 预览代码生成
+ basicPreviewGen(data) {
+ return request('previewGen', data, 'get')
+ }
+}
diff --git a/snowy-admin-web/src/api/gen/genConfigApi.js b/snowy-admin-web/src/api/gen/genConfigApi.js
new file mode 100644
index 00000000..7d881a26
--- /dev/null
+++ b/snowy-admin-web/src/api/gen/genConfigApi.js
@@ -0,0 +1,26 @@
+import { baseRequest } from '@/utils/request'
+
+const request = (url, ...arg) => baseRequest(`/gen/config/${url}`, ...arg)
+
+export default {
+ // 获取代码生成详情配置列表
+ configList(data) {
+ return request('list', data, 'get')
+ },
+ // 提交表单 edit为true时为编辑,默认为新增
+ submitForm(data, edit = false) {
+ return request(edit ? 'add' : 'edit', data)
+ },
+ // 删除代码生成详情配置
+ configDelete(data) {
+ return request('delete', data)
+ },
+ // 获取代码生成详情配置详情
+ configDetail(data) {
+ return request('detail', data, 'get')
+ },
+ // 批量编辑代码生成详细配置
+ configEditBatch(data) {
+ return request('editBatch', data)
+ }
+}
diff --git a/snowy-admin-web/src/utils/tool.js b/snowy-admin-web/src/utils/tool.js
index 4105e7d8..2fa58708 100644
--- a/snowy-admin-web/src/utils/tool.js
+++ b/snowy-admin-web/src/utils/tool.js
@@ -108,6 +108,24 @@ tool.dictTypeList = (dictValue) => {
return []
}
+// 获取某个code下字典的列表,基于dictTypeList 改进,保留老的,逐步替换
+tool.dictList = (dictValue) => {
+ const dictTypeTree = tool.dictDataAll()
+ if (!dictTypeTree) {
+ return []
+ }
+ const tree = dictTypeTree.find((item) => item.dictValue === dictValue)
+ if (tree) {
+ return tree.children.map((item) => {
+ return {
+ value: item['dictValue'],
+ label: item['name']
+ }
+ })
+ }
+ return []
+}
+
// 生成UUID
tool.snowyUuid = () => {
let uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
diff --git a/snowy-admin-web/src/views/gen/basic.vue b/snowy-admin-web/src/views/gen/basic.vue
new file mode 100644
index 00000000..b8524c1b
--- /dev/null
+++ b/snowy-admin-web/src/views/gen/basic.vue
@@ -0,0 +1,378 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/snowy-admin-web/src/views/gen/config.vue b/snowy-admin-web/src/views/gen/config.vue
new file mode 100644
index 00000000..1041e87a
--- /dev/null
+++ b/snowy-admin-web/src/views/gen/config.vue
@@ -0,0 +1,406 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 无
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 时间段
+ 无
+
+
+
+
+
+
+
+
diff --git a/snowy-admin-web/src/views/gen/index.vue b/snowy-admin-web/src/views/gen/index.vue
new file mode 100644
index 00000000..ab15aafa
--- /dev/null
+++ b/snowy-admin-web/src/views/gen/index.vue
@@ -0,0 +1,213 @@
+
+
+
+
+
+
+ 新建
+
+ 删除
+
+
+
+
+ {{tablePrefixFilter(record.tablePrefix)}}
+
+
+ {{generateTypeFilter(record.generateType)}}
+
+
+ 预览
+
+
+ 生成
+
+
+ 配置
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
diff --git a/snowy-admin-web/src/views/gen/preview.vue b/snowy-admin-web/src/views/gen/preview.vue
new file mode 100644
index 00000000..d3107773
--- /dev/null
+++ b/snowy-admin-web/src/views/gen/preview.vue
@@ -0,0 +1,79 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/snowy-admin-web/src/views/gen/steps.vue b/snowy-admin-web/src/views/gen/steps.vue
new file mode 100644
index 00000000..01ff94ca
--- /dev/null
+++ b/snowy-admin-web/src/views/gen/steps.vue
@@ -0,0 +1,164 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 预览
+ 生成并关闭
+
+
+
+
+
+
+
+
+
+
diff --git a/snowy-plugin-api/pom.xml b/snowy-plugin-api/pom.xml
index a30a0961..5a3e4aef 100644
--- a/snowy-plugin-api/pom.xml
+++ b/snowy-plugin-api/pom.xml
@@ -27,6 +27,9 @@
snowy-plugin-dev-api
+
+ snowy-plugin-gen-api
+
snowy-plugin-sys-api
diff --git a/snowy-plugin-api/snowy-plugin-gen-api/README.md b/snowy-plugin-api/snowy-plugin-gen-api/README.md
new file mode 100644
index 00000000..cf90cc6f
--- /dev/null
+++ b/snowy-plugin-api/snowy-plugin-gen-api/README.md
@@ -0,0 +1 @@
+# 代码生成插件api接口
\ No newline at end of file
diff --git a/snowy-plugin-api/snowy-plugin-gen-api/pom.xml b/snowy-plugin-api/snowy-plugin-gen-api/pom.xml
new file mode 100644
index 00000000..b8ecd146
--- /dev/null
+++ b/snowy-plugin-api/snowy-plugin-gen-api/pom.xml
@@ -0,0 +1,25 @@
+
+
+ 4.0.0
+
+
+ vip.xiaonuo
+ snowy-plugin-api
+ 2.0.0
+
+
+ snowy-plugin-gen-api
+ jar
+ 代码生成插件api接口
+
+
+
+
+ vip.xiaonuo
+ snowy-common
+ ${project.parent.version}
+
+
+
\ No newline at end of file
diff --git a/snowy-plugin-api/snowy-plugin-gen-api/src/main/java/vip/xiaonuo/gen/package-info.java b/snowy-plugin-api/snowy-plugin-gen-api/src/main/java/vip/xiaonuo/gen/package-info.java
new file mode 100644
index 00000000..b969cb1f
--- /dev/null
+++ b/snowy-plugin-api/snowy-plugin-gen-api/src/main/java/vip/xiaonuo/gen/package-info.java
@@ -0,0 +1,13 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.gen;
diff --git a/snowy-plugin-api/snowy-plugin-sys-api/src/main/java/vip/xiaonuo/sys/api/SysButtonApi.java b/snowy-plugin-api/snowy-plugin-sys-api/src/main/java/vip/xiaonuo/sys/api/SysButtonApi.java
new file mode 100644
index 00000000..bde0a905
--- /dev/null
+++ b/snowy-plugin-api/snowy-plugin-sys-api/src/main/java/vip/xiaonuo/sys/api/SysButtonApi.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.sys.api;
+
+/**
+ * 按钮API
+ *
+ * @author xuyuxiang
+ * @date 2022/11/1 13:45
+ **/
+public interface SysButtonApi {
+
+ /**
+ * 代码生成按钮插入
+ *
+ * @author xuyuxiang
+ * @date 2022/11/1 13:48
+ **/
+ void addForGenButton(String menuId, String className, String functionName);
+}
diff --git a/snowy-plugin-api/snowy-plugin-sys-api/src/main/java/vip/xiaonuo/sys/api/SysMenuApi.java b/snowy-plugin-api/snowy-plugin-sys-api/src/main/java/vip/xiaonuo/sys/api/SysMenuApi.java
new file mode 100644
index 00000000..33534b5a
--- /dev/null
+++ b/snowy-plugin-api/snowy-plugin-sys-api/src/main/java/vip/xiaonuo/sys/api/SysMenuApi.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.sys.api;
+
+/**
+ * 菜单API
+ *
+ * @author xuyuxiang
+ * @date 2022/11/1 13:44
+ **/
+public interface SysMenuApi {
+
+ /**
+ * 代码生成菜单插入
+ *
+ * @author xuyuxiang
+ * @date 2022/11/1 13:48
+ **/
+ String addForGenMenu(String parentId, String busName, String module, String title, String path);
+}
diff --git a/snowy-plugin-api/snowy-plugin-sys-api/src/main/java/vip/xiaonuo/sys/api/SysRoleApi.java b/snowy-plugin-api/snowy-plugin-sys-api/src/main/java/vip/xiaonuo/sys/api/SysRoleApi.java
index 5e0e4ed4..b0fdab2a 100644
--- a/snowy-plugin-api/snowy-plugin-sys-api/src/main/java/vip/xiaonuo/sys/api/SysRoleApi.java
+++ b/snowy-plugin-api/snowy-plugin-sys-api/src/main/java/vip/xiaonuo/sys/api/SysRoleApi.java
@@ -39,4 +39,12 @@ public interface SysRoleApi {
* @date 2022/7/22 14:49
**/
List roleSelector(String orgId, String category, String searchKey);
+
+ /**
+ * 代码生成菜单按钮授权
+ *
+ * @author xuyuxiang
+ * @date 2022/11/1 15:58
+ **/
+ void grantForGenMenuAndButton(String menuId);
}
diff --git a/snowy-plugin/pom.xml b/snowy-plugin/pom.xml
index 92d9db4a..1c90c934 100644
--- a/snowy-plugin/pom.xml
+++ b/snowy-plugin/pom.xml
@@ -27,6 +27,9 @@
snowy-plugin-dev
+
+ snowy-plugin-gen
+
snowy-plugin-sys
diff --git a/snowy-plugin/snowy-plugin-gen/README.md b/snowy-plugin/snowy-plugin-gen/README.md
new file mode 100644
index 00000000..53c11bd8
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-gen/README.md
@@ -0,0 +1 @@
+# 代码生成插件
diff --git a/snowy-plugin/snowy-plugin-gen/pom.xml b/snowy-plugin/snowy-plugin-gen/pom.xml
new file mode 100644
index 00000000..3ef12172
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-gen/pom.xml
@@ -0,0 +1,44 @@
+
+
+ 4.0.0
+
+
+ vip.xiaonuo
+ snowy-plugin
+ 2.0.0
+
+
+ snowy-plugin-gen
+ jar
+ 代码生成插件
+
+
+ 1.31.0
+ 1.2.40.Beetl.RELEASE
+
+
+
+
+
+ vip.xiaonuo
+ snowy-plugin-gen-api
+ ${project.parent.version}
+
+
+
+
+ vip.xiaonuo
+ snowy-plugin-sys-api
+ ${project.parent.version}
+
+
+
+
+ com.ibeetl
+ beetl-framework-starter
+ ${beetl.version}
+
+
+
diff --git a/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/core/config/GenConfigure.java b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/core/config/GenConfigure.java
new file mode 100644
index 00000000..d1af964f
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/core/config/GenConfigure.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.gen.core.config;
+
+
+import com.github.xiaoymin.knife4j.spring.extension.OpenApiExtensionResolver;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.bind.annotation.RequestMethod;
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.service.Contact;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+import vip.xiaonuo.common.pojo.CommonResult;
+
+import javax.annotation.Resource;
+
+/**
+ * 代码生成相关配置
+ *
+ * @author yubaoshan
+ * @date 2022/10/25 22:33
+ **/
+@Configuration
+public class GenConfigure {
+
+ @Resource
+ private OpenApiExtensionResolver openApiExtensionResolver;
+
+ /**
+ * API文档分组配置
+ *
+ * @author xuyuxiang
+ * @date 2022/7/7 16:18
+ **/
+ @Bean(value = "genDocApi")
+ public Docket sysDocApi() {
+ return new Docket(DocumentationType.SWAGGER_2)
+ .apiInfo(new ApiInfoBuilder()
+ .title("代码生成GEN")
+ .description("代码生成GEN")
+ .termsOfServiceUrl("https://www.xiaonuo.vip")
+ .contact(new Contact("SNOWY_TEAM","https://www.xiaonuo.vip", "xiaonuobase@qq.com"))
+ .version("2.0.0")
+ .build())
+ .globalResponseMessage(RequestMethod.GET, CommonResult.responseList())
+ .globalResponseMessage(RequestMethod.POST, CommonResult.responseList())
+ .groupName("代码生成GEN")
+ .select()
+ .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
+ .apis(RequestHandlerSelectors.basePackage("vip.xiaonuo.gen"))
+ .paths(PathSelectors.any())
+ .build().extensions(openApiExtensionResolver.buildExtensions("代码生成GEN"));
+ }
+}
diff --git a/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/core/enums/GenBuildInEnum.java b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/core/enums/GenBuildInEnum.java
new file mode 100644
index 00000000..e433e289
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/core/enums/GenBuildInEnum.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.gen.core.enums;
+
+import lombok.Getter;
+
+/**
+ * 代码生成标识枚举
+ *
+ * @author yubaoshan
+ * @date 2022/10/25 22:33
+ **/
+@Getter
+public enum GenBuildInEnum {
+
+}
diff --git a/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/core/util/GenDbTypeUtil.java b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/core/util/GenDbTypeUtil.java
new file mode 100644
index 00000000..245efe48
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/core/util/GenDbTypeUtil.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.gen.core.util;
+
+import cn.hutool.core.util.ObjectUtil;
+import lombok.extern.slf4j.Slf4j;
+import vip.xiaonuo.gen.modular.basic.enums.GenJavaTypeEnum;
+
+/**
+ * 数据库类型工具类
+ *
+ * @author xuyuxiang
+ * @date 2022/10/26 16:33
+ **/
+@Slf4j
+public class GenDbTypeUtil {
+
+ /**
+ * 根据数据库字段类型获取Java类型
+ *
+ * @author xuyuxiang
+ * @date 2022/10/26 16:34
+ **/
+ public static String getJavaTypeBySqlType(String dataType) {
+ if(ObjectUtil.isEmpty(dataType)) {
+ log.info(">>> 字段的数据库类型为空,使用默认值String");
+ return GenJavaTypeEnum.String.getValue();
+ }
+ dataType = dataType.toUpperCase();
+ if(dataType.startsWith("INT")) {
+ //如果以int开头,则直接返回int,兼容pgsql中int2 int8等
+ return GenJavaTypeEnum.Integer.getValue();
+ }
+ switch(dataType){
+ case "NVARCHAR":
+ case "NVARCHAR2":
+ case "CHAR":
+ case "VARCHAR":
+ case "ENUM":
+ case "SET":
+ case "TEXT":
+ case "LONGTEXT":
+ case "NCHAR":
+ case "BLOB":
+ case "NCLOB":
+ case "IMAGE":
+ return GenJavaTypeEnum.String.getValue();
+ case "INTEGER":
+ case "BIGINT":
+ case "NUMBER":
+ case "ID":
+ return GenJavaTypeEnum.Long.getValue();
+ case "TINYINT":
+ case "SMALLINT":
+ case "MEDIUMINT":
+ return GenJavaTypeEnum.Integer.getValue();
+ case "BIT":
+ case "BOOLEAN":
+ return GenJavaTypeEnum.Boolean.getValue();
+ case "FLOAT":
+ return GenJavaTypeEnum.Float.getValue();
+ case "DOUBLE":
+ case "MONEY":
+ case "SMALLMONEY":
+ return GenJavaTypeEnum.Double.getValue();
+ case "DECIMAL":
+ case "NUMERIC":
+ case "REAL":
+ return GenJavaTypeEnum.BigDecimal.getValue();
+ case "DATE":
+ case "DATETIME":
+ case "YEAR":
+ case "TIME":
+ case "TIMESTAMP":
+ return GenJavaTypeEnum.Date.getValue();
+ default:
+ log.info(">>> 字段的数据库类型:{}无法匹配,使用默认值String", dataType);
+ return GenJavaTypeEnum.String.getValue();
+ }
+ }
+}
diff --git a/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/controller/GenBasicController.java b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/controller/GenBasicController.java
new file mode 100644
index 00000000..03512e81
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/controller/GenBasicController.java
@@ -0,0 +1,197 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.gen.modular.basic.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import com.github.xiaoymin.knife4j.annotations.ApiSupport;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.http.MediaType;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+import vip.xiaonuo.common.annotation.CommonLog;
+import vip.xiaonuo.common.pojo.CommonResult;
+import vip.xiaonuo.common.pojo.CommonValidList;
+import vip.xiaonuo.gen.modular.basic.entity.GenBasic;
+import vip.xiaonuo.gen.modular.basic.param.*;
+import vip.xiaonuo.gen.modular.basic.result.GenBasicPreviewResult;
+import vip.xiaonuo.gen.modular.basic.result.GenBasicTableColumnResult;
+import vip.xiaonuo.gen.modular.basic.result.GenBasicTableResult;
+import vip.xiaonuo.gen.modular.basic.service.GenBasicService;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import javax.validation.constraints.NotEmpty;
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * 代码生成基础控制器
+ *
+ * @author yubaoshan
+ * @date 2022/10/25 22:33
+ **/
+@Api(tags = "代码生成基础控制器")
+@ApiSupport(author = "SNOWY_TEAM", order = 1)
+@RestController
+@Validated
+public class GenBasicController {
+
+ @Resource
+ private GenBasicService genBasicService;
+
+ /**
+ * 获取代码生成基础分页
+ *
+ * @author yubaoshan
+ * @date 2022/4/24 20:00
+ */
+ @ApiOperationSupport(order = 1)
+ @ApiOperation("获取代码生成基础分页")
+ @GetMapping("/gen/basic/page")
+ public CommonResult> page(GenBasicPageParam genBasicPageParam) {
+ return CommonResult.data(genBasicService.page(genBasicPageParam));
+ }
+
+ /**
+ * 添加代码生成基础
+ *
+ * @author yubaoshan
+ * @date 2022/4/24 20:47
+ */
+ @ApiOperationSupport(order = 2)
+ @ApiOperation("添加代码生成基础")
+ @CommonLog("添加代码生成基础")
+ @PostMapping("/gen/basic/add")
+ public CommonResult add(@RequestBody @Valid GenBasicAddParam genBasicAddParam) {
+ return CommonResult.data(genBasicService.add(genBasicAddParam));
+ }
+
+ /**
+ * 编辑代码生成基础
+ *
+ * @author yubaoshan
+ * @date 2022/4/24 20:47
+ */
+ @ApiOperationSupport(order = 3)
+ @ApiOperation("编辑代码生成基础")
+ @CommonLog("编辑代码生成基础")
+ @PostMapping("/gen/basic/edit")
+ public CommonResult edit(@RequestBody @Valid GenBasicEditParam genBasicEditParam) {
+ return CommonResult.data(genBasicService.edit(genBasicEditParam));
+ }
+
+ /**
+ * 删除代码生成基础
+ *
+ * @author yubaoshan
+ * @date 2022/4/24 20:00
+ */
+ @ApiOperationSupport(order = 4)
+ @ApiOperation("删除代码生成基础")
+ @CommonLog("删除代码生成基础")
+ @PostMapping("/gen/basic/delete")
+ public CommonResult delete(@RequestBody @Valid @NotEmpty(message = "集合不能为空")
+ CommonValidList genBasicIdParamList) {
+ genBasicService.delete(genBasicIdParamList);
+ return CommonResult.ok();
+ }
+
+ /**
+ * 获取代码生成基础详情
+ *
+ * @author yubaoshan
+ * @date 2022/4/24 20:00
+ */
+ @ApiOperationSupport(order = 5)
+ @ApiOperation("获取代码生成基础详情")
+ @GetMapping("/gen/basic/detail")
+ public CommonResult detail(@Valid GenBasicIdParam genBasicIdParam) {
+ return CommonResult.data(genBasicService.detail(genBasicIdParam));
+ }
+
+ /**
+ * 获取所有表信息
+ *
+ * @author yubaoshan
+ * @date 2022/4/24 20:00
+ */
+ @ApiOperationSupport(order = 6)
+ @ApiOperation("获取所有表信息")
+ @GetMapping("/gen/basic/tables")
+ public CommonResult> dbsTable() {
+ return CommonResult.data(genBasicService.tables());
+ }
+
+ /**
+ * 获取表内所有字段信息
+ *
+ * @author yubaoshan
+ * @date 2022/4/24 20:00
+ */
+ @ApiOperationSupport(order = 7)
+ @ApiOperation("获取表内所有字段信息")
+ @GetMapping("/gen/basic/tableColumns")
+ public CommonResult> tableColumns(GenBasicTableColumnParam genBasicTableColumnParam) {
+ return CommonResult.data(genBasicService.tableColumns(genBasicTableColumnParam));
+ }
+
+ /**
+ * 执行代码生成
+ *
+ * @author xuyuxiang
+ * @date 2022/6/21 15:44
+ **/
+ @ApiOperationSupport(order = 8)
+ @ApiOperation("执行代码生成(压缩包)")
+ @CommonLog("执行代码生成(压缩包)")
+ @GetMapping(value = "/gen/basic/execGenZip", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
+ public void execGenZip(@Valid GenBasicIdParam genBasicIdParam, HttpServletResponse response) throws IOException {
+ genBasicService.execGenZip(genBasicIdParam, response);
+ }
+
+ /**
+ * 执行代码生成
+ *
+ * @author yubaoshan
+ * @date 2022/10/31 02:17
+ **/
+ @ApiOperationSupport(order = 9)
+ @ApiOperation("执行代码生成(项目内)")
+ @CommonLog("执行代码生成(项目内)")
+ @PostMapping(value = "/gen/basic/execGenPro")
+ public CommonResult execGenPro(@RequestBody @Valid GenBasicIdParam genBasicIdParam, HttpServletResponse response) throws IOException {
+ genBasicService.execGenPro(genBasicIdParam, response);
+ return CommonResult.ok();
+ }
+
+ /**
+ * 预览代码生成
+ *
+ * @author xuyuxiang
+ * @date 2022/6/21 15:44
+ **/
+ @ApiOperationSupport(order = 10)
+ @ApiOperation("预览代码生成")
+ @CommonLog("预览代码生成")
+ @GetMapping(value = "/gen/basic/previewGen")
+ public CommonResult previewGen(@Valid GenBasicIdParam genBasicIdParam) {
+ return CommonResult.data(genBasicService.previewGen(genBasicIdParam));
+ }
+}
+
diff --git a/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/entity/GenBasic.java b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/entity/GenBasic.java
new file mode 100644
index 00000000..9bb6ab17
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/entity/GenBasic.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.gen.modular.basic.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import vip.xiaonuo.common.pojo.CommonEntity;
+
+/**
+ * 代码生成基础
+ *
+ * @author yubaoshan
+ * @date 2022/10/25 22:33
+ **/
+@Getter
+@Setter
+@TableName("GEN_BASIC")
+public class GenBasic extends CommonEntity {
+
+ /** id */
+ @ApiModelProperty(value = "id", position = 1)
+ private String id;
+
+ /** 主表名称 */
+ @ApiModelProperty(value = "主表名称", position = 2)
+ private String dbTable;
+
+ /** 主表主键 */
+ @ApiModelProperty(value = "主表主键", position = 3)
+ private String dbTableKey;
+
+ /** 表前缀移除 */
+ @ApiModelProperty(value = "表前缀移除", position = 4)
+ private String tablePrefix;
+
+ /** 生成方式 */
+ @ApiModelProperty(value = "生成方式", position = 5)
+ private String generateType;
+
+ /** 所属模块 */
+ @ApiModelProperty(value = "所属模块", position = 6)
+ private String module;
+
+ /** 上级目录 */
+ @ApiModelProperty(value = "上级目录", position = 7)
+ private String menuPid;
+
+ /** 功能名 */
+ @ApiModelProperty(value = "功能名", position = 8)
+ private String functionName;
+
+ /** 业务名 */
+ @ApiModelProperty(value = "业务名", position = 9)
+ private String busName;
+
+ /** 类名 */
+ @ApiModelProperty(value = "类名", position = 10)
+ private String className;
+
+ /** 表单布局 */
+ @ApiModelProperty(value = "表单布局", position = 11)
+ private String formLayout;
+
+ /** 使用栅格 */
+ @ApiModelProperty(value = "使用栅格", position = 12)
+ private String gridWhether;
+
+ /** 排序 */
+ @ApiModelProperty(value = "排序", position = 13)
+ private Integer sortCode;
+
+ /** 包名 */
+ @ApiModelProperty(value = "包名", position = 14)
+ private String packageName;
+
+ /** 作者 */
+ @ApiModelProperty(value = "作者", position = 15)
+ private String authorName;
+}
diff --git a/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/enums/GenEffectTypeEnum.java b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/enums/GenEffectTypeEnum.java
new file mode 100644
index 00000000..2cafb21f
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/enums/GenEffectTypeEnum.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.gen.modular.basic.enums;
+
+import lombok.Getter;
+
+/**
+ * 作用类型枚举
+ *
+ * @author xuyuxiang
+ * @date 2022/10/28 9:57
+ **/
+@Getter
+public enum GenEffectTypeEnum {
+
+ /** 输入框 */
+ INPUT("INPUT"),
+
+ /** 文本框 */
+ TEXTAREA("TEXTAREA"),
+
+ /** 下拉框 */
+ SELECT("SELECT"),
+
+ /** 单选框 */
+ RADIO("RADIO"),
+
+ /** 复选框 */
+ CHECKBOX("CHECKBOX"),
+
+ /** 日期选择器 */
+ DATEPICKER("DATEPICKER"),
+
+ /** 时间选择器 */
+ TIMEPICKER("TIMEPICKER"),
+
+ /** 数字输入框 */
+ INPUTNUMBER("INPUTNUMBER"),
+
+ /** 滑动数字条 */
+ SLIDER("SLIDER");
+
+ private final String value;
+
+ GenEffectTypeEnum(String value) {
+ this.value = value;
+ }
+}
diff --git a/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/enums/GenJavaTypeEnum.java b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/enums/GenJavaTypeEnum.java
new file mode 100644
index 00000000..c0100535
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/enums/GenJavaTypeEnum.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.gen.modular.basic.enums;
+
+import lombok.Getter;
+
+/**
+ * Java类型枚举
+ *
+ * @author xuyuxiang
+ * @date 2022/10/28 9:57
+ **/
+@Getter
+public enum GenJavaTypeEnum {
+
+ /** Integer */
+ Integer("Integer"),
+
+ /** Long */
+ Long("Long"),
+
+ /** String */
+ String("String"),
+
+ /** Boolean */
+ Boolean("Boolean"),
+
+ /** Float */
+ Float("Float"),
+
+ /** Double */
+ Double("Double"),
+
+ /** Date */
+ Date("Date"),
+
+ /** BigDecimal */
+ BigDecimal("BigDecimal");
+
+ private final String value;
+
+ GenJavaTypeEnum(String value) {
+ this.value = value;
+ }
+}
diff --git a/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/enums/GenTypeEnum.java b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/enums/GenTypeEnum.java
new file mode 100644
index 00000000..85042a27
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/enums/GenTypeEnum.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.gen.modular.basic.enums;
+
+import lombok.Getter;
+
+/**
+ * 生成方式枚举
+ *
+ * @author yubaoshan
+ * @date 2022/10/25 22:33
+ **/
+@Getter
+public enum GenTypeEnum {
+
+ /** 压缩包 */
+ ZIP("ZIP"),
+
+ /** 项目内 */
+ PRO("PRO");
+
+ private final String value;
+
+ GenTypeEnum(String value) {
+ this.value = value;
+ }
+}
diff --git a/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/enums/GenYesNoEnum.java b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/enums/GenYesNoEnum.java
new file mode 100644
index 00000000..b20caccc
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/enums/GenYesNoEnum.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.gen.modular.basic.enums;
+
+import lombok.Getter;
+
+/**
+ * 是与否枚举
+ *
+ * @author yubaoshan
+ * @date 2022/10/25 22:33
+ **/
+@Getter
+public enum GenYesNoEnum {
+
+ /** 是 */
+ Y("Y"),
+
+ /** 否 */
+ N("N");
+
+ private final String value;
+
+ GenYesNoEnum(String value) {
+ this.value = value;
+ }
+}
diff --git a/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/mapper/GenBasicMapper.java b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/mapper/GenBasicMapper.java
new file mode 100644
index 00000000..c9cf1b4a
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/mapper/GenBasicMapper.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.gen.modular.basic.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import vip.xiaonuo.gen.modular.basic.entity.GenBasic;
+
+/**
+ * 代码生成基础Mapper接口
+ *
+ * @author yubaoshan
+ * @date 2022/10/25 22:33
+ **/
+public interface GenBasicMapper extends BaseMapper {
+}
diff --git a/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/mapper/mapping/GenBasicMapper.xml b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/mapper/mapping/GenBasicMapper.xml
new file mode 100644
index 00000000..1f181892
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/mapper/mapping/GenBasicMapper.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/param/GenBasicAddParam.java b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/param/GenBasicAddParam.java
new file mode 100644
index 00000000..7931651b
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/param/GenBasicAddParam.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.gen.modular.basic.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 代码生成基础添加参数
+ *
+ * @author yubaoshan
+ * @date 2022/10/25 22:33
+ **/
+@Getter
+@Setter
+public class GenBasicAddParam {
+
+ /** 主表名称 */
+ @ApiModelProperty(value = "主表名称", required = true, position = 1)
+ @NotNull(message = "dbTable不能为空")
+ private String dbTable;
+
+ /** 主表主键 */
+ @ApiModelProperty(value = "主表主键", required = true, position = 2)
+ @NotNull(message = "dbTableKey不能为空")
+ private String dbTableKey;
+
+ /** 表前缀移除 */
+ @ApiModelProperty(value = "表前缀移除", required = true, position = 3)
+ @NotNull(message = "tablePrefix不能为空")
+ private String tablePrefix;
+
+ /** 生成方式 */
+ @ApiModelProperty(value = "生成方式", required = true, position = 4)
+ @NotNull(message = "generateType不能为空")
+ private String generateType;
+
+ /** 所属模块 */
+ @ApiModelProperty(value = "所属模块", required = true, position = 5)
+ @NotNull(message = "module不能为空")
+ private String module;
+
+ /** 上级目录 */
+ @ApiModelProperty(value = "上级目录", required = true, position = 6)
+ @NotNull(message = "menuPid不能为空")
+ private String menuPid;
+
+ /** 功能名 */
+ @ApiModelProperty(value = "功能名", required = true, position = 7)
+ @NotNull(message = "functionName不能为空")
+ private String functionName;
+
+ /** 业务名 */
+ @ApiModelProperty(value = "业务名", required = true, position = 8)
+ @NotNull(message = "busName不能为空")
+ private String busName;
+
+ /** 类名 */
+ @ApiModelProperty(value = "类名", required = true, position = 9)
+ @NotNull(message = "className不能为空")
+ private String className;
+
+ /** 表单布局 */
+ @ApiModelProperty(value = "表单布局", required = true, position = 10)
+ @NotNull(message = "formLayout不能为空")
+ private String formLayout;
+
+ /** 使用栅格 */
+ @ApiModelProperty(value = "使用栅格", required = true, position = 11)
+ @NotNull(message = "gridWhether不能为空")
+ private String gridWhether;
+
+ /** 排序 */
+ @ApiModelProperty(value = "排序", required = true, position = 12)
+ @NotNull(message = "sortCode不能为空")
+ private Integer sortCode;
+
+ /** 作者名 */
+ @ApiModelProperty(value = "作者名", required = true, position = 13)
+ private String authorName;
+
+ /** 包名 */
+ @ApiModelProperty(value = "包名", required = true, position = 14)
+ private String packageName;
+}
diff --git a/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/param/GenBasicEditParam.java b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/param/GenBasicEditParam.java
new file mode 100644
index 00000000..07390b4a
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/param/GenBasicEditParam.java
@@ -0,0 +1,104 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.gen.modular.basic.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 代码生成基础编辑参数
+ *
+ * @author yubaoshan
+ * @date 2022/10/25 22:33
+ **/
+@Getter
+@Setter
+public class GenBasicEditParam {
+
+ /** id */
+ @ApiModelProperty(value = "id", position = 1)
+ @NotNull(message = "id不能为空")
+ private String id;
+
+ /** 主表名称 */
+ @ApiModelProperty(value = "主表名称", position = 2)
+ @NotNull(message = "dbTable不能为空")
+ private String dbTable;
+
+ /** 主表主键 */
+ @ApiModelProperty(value = "主表主键", position = 3)
+ @NotNull(message = "dbTableKey不能为空")
+ private String dbTableKey;
+
+ /** 表前缀移除 */
+ @ApiModelProperty(value = "表前缀移除", position = 4)
+ @NotNull(message = "tablePrefix不能为空")
+ private String tablePrefix;
+
+ /** 生成方式 */
+ @ApiModelProperty(value = "生成方式", position = 5)
+ @NotNull(message = "generateType不能为空")
+ private String generateType;
+
+ /** 所属模块 */
+ @ApiModelProperty(value = "所属模块", position = 6)
+ @NotNull(message = "module不能为空")
+ private String module;
+
+ /** 上级目录 */
+ @ApiModelProperty(value = "上级目录", position = 7)
+ @NotNull(message = "menuPid不能为空")
+ private String menuPid;
+
+ /** 功能名 */
+ @ApiModelProperty(value = "功能名", position = 8)
+ @NotNull(message = "functionName不能为空")
+ private String functionName;
+
+ /** 业务名 */
+ @ApiModelProperty(value = "业务名", position = 9)
+ @NotNull(message = "busName不能为空")
+ private String busName;
+
+ /** 类名 */
+ @ApiModelProperty(value = "类名", position = 10)
+ @NotNull(message = "className不能为空")
+ private String className;
+
+ /** 表单布局 */
+ @ApiModelProperty(value = "表单布局", position = 11)
+ @NotNull(message = "formLayout不能为空")
+ private String formLayout;
+
+ /** 使用栅格 */
+ @ApiModelProperty(value = "使用栅格", position = 12)
+ @NotNull(message = "gridWhether不能为空")
+ private String gridWhether;
+
+ /** 排序 */
+ @ApiModelProperty(value = "排序", position = 13)
+ @NotNull(message = "sortCode不能为空")
+ private Integer sortCode;
+
+ /** 作者名 */
+ @ApiModelProperty(value = "作者名", required = true, position = 14)
+ @NotNull(message = "authorName不能为空")
+ private String authorName;
+
+ /** 包名 */
+ @ApiModelProperty(value = "包名 */", position = 15)
+ private String packageName;
+}
diff --git a/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/param/GenBasicIdParam.java b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/param/GenBasicIdParam.java
new file mode 100644
index 00000000..b17ca2d7
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/param/GenBasicIdParam.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.gen.modular.basic.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * 代码生成基础Id参数
+ *
+ * @author yubaoshan
+ * @date 2022/10/25 22:33
+ **/
+@Getter
+@Setter
+public class GenBasicIdParam {
+
+ /** id */
+ @ApiModelProperty(value = "id", required = true)
+ @NotBlank(message = "id不能为空")
+ private String id;
+}
diff --git a/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/param/GenBasicPageParam.java b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/param/GenBasicPageParam.java
new file mode 100644
index 00000000..9dde4ce5
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/param/GenBasicPageParam.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.gen.modular.basic.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 代码生成基础查询参数
+ *
+ * @author yubaoshan
+ * @date 2022/10/25 22:33
+ */
+@Getter
+@Setter
+public class GenBasicPageParam {
+
+ /** 当前页 */
+ @ApiModelProperty(value = "当前页码")
+ private Integer current;
+
+ /** 每页条数 */
+ @ApiModelProperty(value = "每页条数")
+ private Integer size;
+
+ /** 排序字段 */
+ @ApiModelProperty(value = "排序字段,字段驼峰名称,如:userName")
+ private String sortField;
+
+ /** 排序方式 */
+ @ApiModelProperty(value = "排序方式,升序:ASCEND;降序:DESCEND")
+ private String sortOrder;
+}
diff --git a/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/param/GenBasicTableColumnParam.java b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/param/GenBasicTableColumnParam.java
new file mode 100644
index 00000000..4bfc3e30
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/param/GenBasicTableColumnParam.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.gen.modular.basic.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * 数据源库字段列表参数
+ *
+ * @author xuyuxiang
+ * @date 2022/7/29 9:59
+ */
+@Getter
+@Setter
+public class GenBasicTableColumnParam {
+
+ /** 表名称 */
+ @ApiModelProperty(value = "表名称", required = true)
+ @NotBlank(message = "表名称不能为空")
+ private String tableName;
+}
diff --git a/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/result/GenBasicPreviewResult.java b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/result/GenBasicPreviewResult.java
new file mode 100644
index 00000000..c5429fc2
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/result/GenBasicPreviewResult.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.gen.modular.basic.result;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * 预览代码生成结果
+ *
+ * @author xuyuxiang
+ * @date 2022/10/28 17:03
+ **/
+@Getter
+@Setter
+public class GenBasicPreviewResult {
+
+ /** SQL代码结果集 */
+ @ApiModelProperty(value = "SQL代码结果集", position = 1)
+ private List genBasicCodeSqlResultList;
+
+ /** 前端代码结果集 */
+ @ApiModelProperty(value = "前端代码结果集", position = 2)
+ private List genBasicCodeFrontendResultList;
+
+ /** 后端代码结果集 */
+ @ApiModelProperty(value = "后端代码结果集", position = 3)
+ private List genBasicCodeBackendResultList;
+
+ @Getter
+ @Setter
+ public static class GenBasicCodeResult {
+
+ /** 代码文件名称 */
+ @ApiModelProperty(value = "代码文件名称", position = 1)
+ private String codeFileName;
+
+ /** 代码文件带路径名称 */
+ @ApiModelProperty(value = "代码文件带路径名称", position = 2)
+ private String codeFileWithPathName;
+
+ /** 代码文件内容 */
+ @ApiModelProperty(value = "代码文件内容", position = 2)
+ private String codeFileContent;
+ }
+}
diff --git a/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/result/GenBasicTableColumnResult.java b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/result/GenBasicTableColumnResult.java
new file mode 100644
index 00000000..0572fc99
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/result/GenBasicTableColumnResult.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.gen.modular.basic.result;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 数据库表字段结果
+ *
+ * @author xuyuxiang
+ * @date 2022/7/19 19:06
+ **/
+@Getter
+@Setter
+public class GenBasicTableColumnResult {
+
+ /** 字段名称 */
+ @ApiModelProperty(value = "字段名称", position = 1)
+ private String columnName;
+
+ /** 字段类型 */
+ @ApiModelProperty(value = "字段类型", position = 2)
+ private String typeName;
+
+ /** 字段注释 */
+ @ApiModelProperty(value = "字段注释", position = 3)
+ private String columnRemark;
+}
diff --git a/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/result/GenBasicTableResult.java b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/result/GenBasicTableResult.java
new file mode 100644
index 00000000..698c7ef4
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/result/GenBasicTableResult.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.gen.modular.basic.result;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 数据库表结果
+ *
+ * @author xuyuxiang
+ * @date 2022/7/19 19:06
+ **/
+@Getter
+@Setter
+public class GenBasicTableResult {
+
+ /** 表名称 */
+ @ApiModelProperty(value = "表名称", position = 1)
+ private String tableName;
+
+ /** 表注释 */
+ @ApiModelProperty(value = "表注释", position = 2)
+ private String tableRemark;
+}
diff --git a/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/service/GenBasicService.java b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/service/GenBasicService.java
new file mode 100644
index 00000000..5ac4969a
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/service/GenBasicService.java
@@ -0,0 +1,122 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.gen.modular.basic.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import vip.xiaonuo.gen.modular.basic.entity.GenBasic;
+import vip.xiaonuo.gen.modular.basic.param.*;
+import vip.xiaonuo.gen.modular.basic.result.GenBasicPreviewResult;
+import vip.xiaonuo.gen.modular.basic.result.GenBasicTableColumnResult;
+import vip.xiaonuo.gen.modular.basic.result.GenBasicTableResult;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * 代码生成基础Service接口
+ *
+ * @author yubaoshan
+ * @date 2022/10/25 22:33
+ **/
+public interface GenBasicService extends IService {
+
+ /**
+ * 查询代码生成基础分页
+ *
+ * @author yubaoshan
+ * @date 2022/10/25 22:33
+ */
+ Page page(GenBasicPageParam genBasicPageParam);
+
+ /**
+ * 添加代码生成基础
+ *
+ * @author yubaoshan
+ * @date 2022/10/25 22:33
+ */
+ GenBasic add(GenBasicAddParam genBasicAddParam);
+
+ /**
+ * 编辑代码生成基础
+ *
+ * @author yubaoshan
+ * @date 2022/10/25 22:33
+ */
+ GenBasic edit(GenBasicEditParam genBasicEditParam);
+
+ /**
+ * 删除代码生成基础
+ *
+ * @author yubaoshan
+ * @date 2022/10/25 22:33
+ */
+ void delete(List genBasicIdParamList);
+
+ /**
+ * 获取代码生成基础详情
+ *
+ * @author yubaoshan
+ * @date 2022/10/25 22:33
+ */
+ GenBasic detail(GenBasicIdParam genBasicIdParam);
+
+ /**
+ * 获取代码生成基础详情
+ *
+ * @author yubaoshan
+ * @date 2022/10/25 22:33
+ **/
+ GenBasic queryEntity(String id);
+
+ /**
+ * 获取所有表信息
+ *
+ * @author yubaoshan
+ * @date 2022/10/25 22:33
+ **/
+ List tables();
+
+ /**
+ * 获取表内所有字段信息
+ *
+ * @author yubaoshan
+ * @date 2022/10/25 22:33
+ **/
+ List tableColumns(GenBasicTableColumnParam genBasicTableColumnParam);
+
+ /**
+ * 执行代码生成
+ *
+ * @author xuyuxiang yubaoshan
+ * @date 2022/10/28 9:37
+ **/
+ void execGenZip(GenBasicIdParam genBasicIdParam, HttpServletResponse response) throws IOException;
+
+ /**
+ * 执行代码生成
+ *
+ * @author xuyuxiang
+ * @date 2022/10/28 9:37
+ **/
+ void execGenPro(GenBasicIdParam genBasicIdParam, HttpServletResponse response) throws IOException;
+
+ /**
+ * 预览代码生成
+ *
+ * @author xuyuxiang
+ * @date 2022/10/28 17:08
+ **/
+ GenBasicPreviewResult previewGen(GenBasicIdParam genBasicIdParam);
+}
diff --git a/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/service/impl/GenBasicServiceImpl.java b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/service/impl/GenBasicServiceImpl.java
new file mode 100644
index 00000000..18cdfb2c
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/service/impl/GenBasicServiceImpl.java
@@ -0,0 +1,640 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.gen.modular.basic.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollStreamUtil;
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.RandomUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.core.util.ZipUtil;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import com.baomidou.mybatisplus.autoconfigure.MybatisPlusProperties;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.beetl.core.Configuration;
+import org.beetl.core.GroupTemplate;
+import org.beetl.core.Template;
+import org.beetl.core.resource.ClasspathResourceLoader;
+import org.springframework.core.env.Environment;
+import org.springframework.jdbc.support.JdbcUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import vip.xiaonuo.common.enums.CommonSortOrderEnum;
+import vip.xiaonuo.common.exception.CommonException;
+import vip.xiaonuo.common.page.CommonPageRequest;
+import vip.xiaonuo.common.util.CommonDownloadUtil;
+import vip.xiaonuo.common.util.CommonResponseUtil;
+import vip.xiaonuo.gen.core.util.GenDbTypeUtil;
+import vip.xiaonuo.gen.modular.basic.entity.GenBasic;
+import vip.xiaonuo.gen.modular.basic.enums.GenEffectTypeEnum;
+import vip.xiaonuo.gen.modular.basic.enums.GenYesNoEnum;
+import vip.xiaonuo.gen.modular.basic.mapper.GenBasicMapper;
+import vip.xiaonuo.gen.modular.basic.param.*;
+import vip.xiaonuo.gen.modular.basic.result.GenBasicPreviewResult;
+import vip.xiaonuo.gen.modular.basic.result.GenBasicTableColumnResult;
+import vip.xiaonuo.gen.modular.basic.result.GenBasicTableResult;
+import vip.xiaonuo.gen.modular.basic.service.GenBasicService;
+import vip.xiaonuo.gen.modular.config.entity.GenConfig;
+import vip.xiaonuo.gen.modular.config.param.GenConfigAddParam;
+import vip.xiaonuo.gen.modular.config.service.GenConfigService;
+import vip.xiaonuo.sys.api.SysButtonApi;
+import vip.xiaonuo.sys.api.SysMenuApi;
+import vip.xiaonuo.sys.api.SysRoleApi;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.IOException;
+import java.sql.*;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+/**
+ * 代码生成基础Service接口实现类
+ *
+ * @author yubaoshan
+ * @date 2022/10/25 22:33
+ **/
+@Service
+public class GenBasicServiceImpl extends ServiceImpl implements GenBasicService {
+
+ private static final String DB_URL_KEY = "spring.datasource.dynamic.datasource.master.url";
+
+ private static final String DB_USERNAME_KEY = "spring.datasource.dynamic.datasource.master.username";
+
+ private static final String DB_PASSWORD_KEY = "spring.datasource.dynamic.datasource.master.password";
+
+ private static final String MODULE_KEY = "biz";
+
+ private static final String GEN_PROJECT_FRONT_PLUGIN_KEY = "snowy-admin-web";
+
+ private static final String GEN_PROJECT_PLUGIN_KEY = "snowy-plugin";
+
+ private static final String GEN_PROJECT_PLUGIN_BIZ_KEY = GEN_PROJECT_PLUGIN_KEY + File.separator + "snowy-plugin-biz";
+
+ private static final List GEN_SQL_FILE_LIST = CollectionUtil.newArrayList(
+ JSONUtil.createObj().set("name", "Mysql.sql.btl"),
+ JSONUtil.createObj().set("name", "Oracle.sql.btl"));
+
+ private static final List GEN_FRONT_FILE_LIST = CollectionUtil.newArrayList(
+ JSONUtil.createObj().set("name", "Api.js.btl").set("path", "api" + File.separator + MODULE_KEY),
+ JSONUtil.createObj().set("name", "form.vue.btl").set("path", "views" + File.separator + MODULE_KEY),
+ JSONUtil.createObj().set("name", "index.vue.btl").set("path", "views" + File.separator + MODULE_KEY));
+
+ private static final List GEN_BACKEND_FILE_LIST = CollectionUtil.newArrayList(
+ JSONUtil.createObj().set("name", "Controller.java.btl").set("path", "controller"),
+ JSONUtil.createObj().set("name", "Entity.java.btl").set("path", "entity"),
+ JSONUtil.createObj().set("name", "Enum.java.btl").set("path", "enums"),
+ JSONUtil.createObj().set("name", "Mapper.java.btl").set("path", "mapper"),
+ JSONUtil.createObj().set("name", "Mapper.xml.btl").set("path", "mapper" + File.separator + "mapping"),
+ JSONUtil.createObj().set("name", "AddParam.java.btl").set("path", "param"),
+ JSONUtil.createObj().set("name", "EditParam.java.btl").set("path", "param"),
+ JSONUtil.createObj().set("name", "IdParam.java.btl").set("path", "param"),
+ JSONUtil.createObj().set("name", "PageParam.java.btl").set("path", "param"),
+ JSONUtil.createObj().set("name", "Service.java.btl").set("path", "service"),
+ JSONUtil.createObj().set("name", "ServiceImpl.java.btl").set("path", "service" + File.separator + "impl"));
+
+ private static final String SORT_CODE_KEY = "SORT_CODE";
+
+ private static final String CREATE_USER_KEY = "CREATE_USER";
+
+ private static final String CREATE_TIME_KEY = "CREATE_TIME";
+
+ private static final String UPDATE_USER_KEY = "UPDATE_USER";
+
+ private static final String UPDATE_TIME_KEY = "UPDATE_TIME";
+
+ @Resource
+ private Environment environment;
+
+ @Resource
+ private MybatisPlusProperties mybatisPlusProperties;
+
+ @Resource
+ private GenConfigService genConfigService;
+
+ @Resource
+ private SysMenuApi sysMenuApi;
+
+ @Resource
+ private SysButtonApi sysButtonApi;
+
+ @Resource
+ private SysRoleApi sysRoleApi;
+
+ @Override
+ public Page page(GenBasicPageParam genBasicPageParam) {
+ QueryWrapper queryWrapper = new QueryWrapper<>();
+
+ if(ObjectUtil.isAllNotEmpty(genBasicPageParam.getSortField(), genBasicPageParam.getSortOrder())) {
+ CommonSortOrderEnum.validate(genBasicPageParam.getSortOrder());
+ queryWrapper.orderBy(true, genBasicPageParam.getSortOrder().equals(CommonSortOrderEnum.ASC.getValue()),
+ StrUtil.toUnderlineCase(genBasicPageParam.getSortField()));
+ } else {
+ queryWrapper.lambda().orderByAsc(GenBasic::getSortCode);
+ }
+ return this.page(CommonPageRequest.defaultPage(), queryWrapper);
+ }
+
+ @Transactional(rollbackFor = Exception.class)
+ @Override
+ public GenBasic add(GenBasicAddParam genBasicAddParam) {
+ GenBasic genBasic = BeanUtil.toBean(genBasicAddParam, GenBasic.class);
+ this.save(genBasic);
+ GenBasicTableColumnParam tableColumnParam = new GenBasicTableColumnParam();
+ tableColumnParam.setTableName(genBasic.getDbTable());
+ List resultList = this.tableColumns(tableColumnParam);
+ for (int i = 0; i < resultList.size(); i++) {
+ GenBasicTableColumnResult item = resultList.get(i);
+ GenConfigAddParam addParam = new GenConfigAddParam();
+ addParam.setBasicId(genBasic.getId());
+ if (item.getColumnName().equals(genBasic.getDbTableKey())) {
+ addParam.setIsTableKey(GenYesNoEnum.Y.getValue());
+ } else {
+ addParam.setIsTableKey(GenYesNoEnum.N.getValue());
+ }
+ addParam.setFieldName(item.getColumnName());
+ addParam.setFieldType(item.getTypeName());
+ addParam.setFieldRemark(item.getColumnRemark());
+ addParam.setFieldJavaType(GenDbTypeUtil.getJavaTypeBySqlType(item.getTypeName()));
+ addParam.setEffectType(GenEffectTypeEnum.INPUT.getValue().toLowerCase());
+ // 除主键、删除标志、创建人、创建时间、修改人和修改时间外,所有默认在列表显示、在增改显示、非列省略、非必填,非查询
+ String logicDeleteField = mybatisPlusProperties.getGlobalConfig().getDbConfig().getLogicDeleteField();
+ if(ObjectUtil.isEmpty(logicDeleteField)) {
+ logicDeleteField = "DELETE_FLAG";
+ }
+ if(genBasic.getDbTableKey().equalsIgnoreCase(item.getColumnName()) ||
+ logicDeleteField.equalsIgnoreCase(item.getColumnName()) ||
+ CREATE_USER_KEY.equalsIgnoreCase(item.getColumnName()) ||
+ CREATE_TIME_KEY.equalsIgnoreCase(item.getColumnName()) ||
+ UPDATE_USER_KEY.equalsIgnoreCase(item.getColumnName()) ||
+ UPDATE_TIME_KEY.equalsIgnoreCase(item.getColumnName())) {
+ addParam.setWhetherTable(GenYesNoEnum.N.getValue());
+ addParam.setWhetherAddUpdate(GenYesNoEnum.N.getValue());
+ } else {
+ addParam.setWhetherTable(GenYesNoEnum.Y.getValue());
+ addParam.setWhetherAddUpdate(GenYesNoEnum.Y.getValue());
+ }
+ addParam.setWhetherRetract(GenYesNoEnum.N.getValue());
+ addParam.setWhetherRequired(GenYesNoEnum.N.getValue());
+ addParam.setQueryWhether(GenYesNoEnum.N.getValue());
+ addParam.setSortCode(i);
+ GenConfig genConfig = BeanUtil.toBean(addParam, GenConfig.class);
+ genConfigService.save(genConfig);
+ }
+ return genBasic;
+ }
+
+ @Transactional(rollbackFor = Exception.class)
+ @Override
+ public GenBasic edit(GenBasicEditParam genBasicEditParam) {
+ GenBasic genBasic = this.queryEntity(genBasicEditParam.getId());
+ BeanUtil.copyProperties(genBasicEditParam, genBasic);
+ this.updateById(genBasic);
+ return genBasic;
+ }
+
+ @Transactional(rollbackFor = Exception.class)
+ @Override
+ public void delete(List genBasicIdParamList) {
+ List basicIdIdList = CollStreamUtil.toList(genBasicIdParamList, GenBasicIdParam::getId);
+ if(ObjectUtil.isNotEmpty(basicIdIdList)) {
+ // 级联删除配置
+ genConfigService.remove(new LambdaQueryWrapper().in(GenConfig::getBasicId, basicIdIdList));
+ // 执行删除
+ this.removeBatchByIds(basicIdIdList);
+ }
+ }
+
+ @Override
+ public GenBasic detail(GenBasicIdParam genBasicIdParam) {
+ return this.queryEntity(genBasicIdParam.getId());
+ }
+
+ @Override
+ public GenBasic queryEntity(String id) {
+ GenBasic genBasic = this.getById(id);
+ if(ObjectUtil.isEmpty(genBasic)) {
+ throw new CommonException("代码生成基础不存在,id值为:{}", id);
+ }
+ return genBasic;
+ }
+
+ @Override
+ public List tables() {
+ Connection conn = null;
+ ResultSet rs = null;
+ try {
+ conn = DriverManager.getConnection(Objects.requireNonNull(environment.getProperty(DB_URL_KEY)),
+ Objects.requireNonNull(environment.getProperty(DB_USERNAME_KEY)),
+ Objects.requireNonNull(environment.getProperty(DB_PASSWORD_KEY)));
+ DatabaseMetaData metaData = conn.getMetaData();
+ String url = metaData.getURL();
+ String schema = null;
+ if (url.toLowerCase().contains("oracle")) {
+ schema = metaData.getUserName();
+ }
+ List tables = new ArrayList<>();
+ rs = metaData.getTables(null, schema, "%", new String[]{"TABLE", "VIEW"});
+ while (rs.next()) {
+ String tableName = rs.getString("TABLE_NAME").toUpperCase();
+ if (!tableName.startsWith("ACT_")) {
+ GenBasicTableResult genBasicTableResult = new GenBasicTableResult();
+ genBasicTableResult.setTableName(tableName);
+ String remarks = rs.getString("REMARKS");
+ if(ObjectUtil.isEmpty(remarks)) {
+ genBasicTableResult.setTableRemark(tableName);
+ } else {
+ genBasicTableResult.setTableRemark(remarks);
+ }
+ tables.add(genBasicTableResult);
+ }
+ }
+ return tables;
+ } catch (SQLException sqlException) {
+ sqlException.printStackTrace();
+ throw new CommonException("获取数据库表失败");
+ } finally {
+ JdbcUtils.closeResultSet(rs);
+ JdbcUtils.closeConnection(conn);
+ }
+ }
+
+ @Override
+ public List tableColumns(GenBasicTableColumnParam genBasicTableColumnParam) {
+ Connection conn = null;
+ ResultSet rs = null;
+ try {
+ conn = DriverManager.getConnection(Objects.requireNonNull(environment.getProperty(DB_URL_KEY)),
+ Objects.requireNonNull(environment.getProperty(DB_USERNAME_KEY)),
+ Objects.requireNonNull(environment.getProperty(DB_PASSWORD_KEY)));
+ DatabaseMetaData metaData = conn.getMetaData();
+ String url = metaData.getURL();
+ String schema = null;
+ if (url.toLowerCase().contains("oracle")) {
+ schema = metaData.getUserName();
+ }
+ List columns = new ArrayList<>();
+ rs = metaData.getColumns(null, schema, genBasicTableColumnParam.getTableName(), "%");
+ while (rs.next()) {
+ String columnName = rs.getString("COLUMN_NAME").toUpperCase();
+ GenBasicTableColumnResult genBasicTableColumnResult = new GenBasicTableColumnResult();
+ genBasicTableColumnResult.setColumnName(columnName);
+ String remarks = rs.getString("REMARKS");
+ if(ObjectUtil.isEmpty(remarks)) {
+ genBasicTableColumnResult.setColumnRemark(columnName);
+ } else {
+ genBasicTableColumnResult.setColumnRemark(remarks);
+ }
+ String typeName = rs.getString("TYPE_NAME").toUpperCase();
+ if(ObjectUtil.isEmpty(typeName)) {
+ genBasicTableColumnResult.setTypeName("NONE");
+ } else {
+ genBasicTableColumnResult.setTypeName(typeName);
+ }
+ columns.add(genBasicTableColumnResult);
+ }
+ return columns;
+ } catch (SQLException sqlException) {
+ sqlException.printStackTrace();
+ throw new CommonException("获取数据库表字段失败,表名称:{}", genBasicTableColumnParam.getTableName());
+ } finally {
+ JdbcUtils.closeResultSet(rs);
+ JdbcUtils.closeConnection(conn);
+ }
+ }
+
+ @Transactional(rollbackFor = Exception.class)
+ @Override
+ public void execGenZip(GenBasicIdParam genBasicIdParam, HttpServletResponse response) throws IOException {
+ File tempFolder = this.genTempFolder(genBasicIdParam, response, true);
+ if(tempFolder == null) {
+ CommonResponseUtil.renderError(response, "代码生成基础不存在,id值为:" + genBasicIdParam.getId());
+ return;
+ }
+ // 压缩
+ File zip = ZipUtil.zip(tempFolder);
+ // 压缩完毕删除临时目录
+ FileUtil.del(tempFolder);
+ // 下载
+ CommonDownloadUtil.download(zip, response);
+ }
+
+ @Transactional(rollbackFor = Exception.class)
+ @Override
+ public void execGenPro(GenBasicIdParam genBasicIdParam, HttpServletResponse response) throws IOException {
+ File tempFolder = this.genTempFolder(genBasicIdParam, response, false);
+ // 定义前端生成的目录
+ String genProjectFrontendPath = System.getProperty("user.dir") + File.separator + GEN_PROJECT_FRONT_PLUGIN_KEY + File.separator + "src";
+
+ if(!FileUtil.exist(genProjectFrontendPath)) {
+ throw new CommonException("前端代码生成位置:{}不存在,请检查位置", genProjectFrontendPath);
+ }
+
+ // 定义后端生成的目录
+ String genProjectBackendPath = System.getProperty("user.dir") + File.separator + GEN_PROJECT_PLUGIN_BIZ_KEY + File.separator + "src" +
+ File.separator + "main" + File.separator + "java";
+
+ if(!FileUtil.exist(genProjectFrontendPath)) {
+ throw new CommonException("后端代码生成位置:{}不存在,请检查位置", genProjectBackendPath);
+ }
+ try {
+ GenBasic genBasic = this.queryEntity(genBasicIdParam.getId());
+
+ // 生成菜单
+ String menuId = sysMenuApi.addForGenMenu(genBasic.getMenuPid(), genBasic.getBusName(), genBasic.getModule(), genBasic.getFunctionName() + "管理",
+ StrUtil.SLASH + MODULE_KEY + StrUtil.SLASH + genBasic.getBusName());
+
+ // 生成按钮
+ sysButtonApi.addForGenButton(menuId, genBasic.getClassName(), genBasic.getFunctionName());
+
+ // 授权菜单
+ sysRoleApi.grantForGenMenuAndButton(menuId);
+
+ //前端代码移动到前端
+ FileUtil.moveContent(FileUtil.file(tempFolder + File.separator + "frontend"), FileUtil.file(genProjectFrontendPath), true);
+
+ // 后端代码移动到后端
+ FileUtil.moveContent(FileUtil.file(tempFolder + File.separator + "backend"), FileUtil.file(genProjectBackendPath), true);
+
+ // 移动完毕删除临时目录
+ FileUtil.del(tempFolder);
+ } catch (Exception e) {
+ e.printStackTrace();
+ throw new CommonException("代码生成异常");
+ }
+ }
+
+ /**
+ * 获取临时目录
+ *
+ * @author xuyuxiang yubaoshan
+ * @date 2022/10/28 21:36
+ */
+ private File genTempFolder(GenBasicIdParam genBasicIdParam, HttpServletResponse response, boolean isZip) throws IOException {
+ GenBasic genBasic = this.getById(genBasicIdParam.getId());
+ if(ObjectUtil.isEmpty(genBasic)) {
+ // 如果是压缩包下载应该使用CommonResponseUtil渲染异常
+ if(isZip) {
+ return null;
+ } else {
+ // 否则可以直接抛出异常
+ throw new CommonException("代码生成基础不存在,id值为:{}", genBasicIdParam.getId());
+ }
+ }
+ GenBasicPreviewResult genBasicPreviewResult = this.previewGen(genBasicIdParam);
+ // 先删除压缩包
+ FileUtil.del(FileUtil.getTmpDirPath() + File.separator + genBasic.getFunctionName() + ".zip");
+ // 生成临时目录
+ File tempFolder = FileUtil.file(FileUtil.getTmpDirPath() + File.separator + genBasic.getFunctionName());
+ // 生成前端代码到临时目录
+ genBasicPreviewResult.getGenBasicCodeFrontendResultList().forEach(genBasicCodeResult ->
+ FileUtil.writeUtf8String(genBasicCodeResult.getCodeFileContent(), FileUtil.file(tempFolder + File.separator
+ + "frontend" + File.separator + genBasicCodeResult.getCodeFileWithPathName())));
+ // 生成后端代码到临时目录
+ genBasicPreviewResult.getGenBasicCodeBackendResultList().forEach(genBasicCodeResult ->
+ FileUtil.writeUtf8String(genBasicCodeResult.getCodeFileContent(), FileUtil.file(tempFolder + File.separator
+ + "backend" + File.separator + genBasicCodeResult.getCodeFileWithPathName())));
+ return tempFolder;
+ }
+
+ @Override
+ public GenBasicPreviewResult previewGen(GenBasicIdParam genBasicIdParam) {
+ GenBasic genBasic = this.queryEntity(genBasicIdParam.getId());
+ JSONObject bindingJsonObject = this.getBindingJsonObject(genBasic);
+ GenBasicPreviewResult genBasicPreviewResult = new GenBasicPreviewResult();
+ try {
+ // SQL基础路径
+ String genSqlBasicPath = "sql";
+ // 前端
+ GroupTemplate groupTemplateSql = new GroupTemplate(new ClasspathResourceLoader("sqlend"),
+ Configuration.defaultConfiguration());
+ List genBasicCodeSqlResultList = CollectionUtil.newArrayList();
+ GEN_SQL_FILE_LIST.forEach(fileJsonObject -> {
+ String fileTemplateName = fileJsonObject.getStr("name");
+ GenBasicPreviewResult.GenBasicCodeResult genBasicCodeSqlResult = new GenBasicPreviewResult.GenBasicCodeResult();
+ Template templateFront = groupTemplateSql.getTemplate(fileTemplateName);
+ templateFront.binding(bindingJsonObject);
+ String resultName = StrUtil.removeSuffix(fileTemplateName, ".btl");
+ genBasicCodeSqlResult.setCodeFileName(resultName);
+ genBasicCodeSqlResult.setCodeFileWithPathName(genSqlBasicPath + File.separator + resultName);
+ genBasicCodeSqlResult.setCodeFileContent(templateFront.render());
+ genBasicCodeSqlResultList.add(genBasicCodeSqlResult);
+ });
+ genBasicPreviewResult.setGenBasicCodeSqlResultList(genBasicCodeSqlResultList);
+
+ // 前端基础路径
+ String genFrontBasicPath = "";
+ // 前端
+ GroupTemplate groupTemplateFront = new GroupTemplate(new ClasspathResourceLoader("frontend"),
+ Configuration.defaultConfiguration());
+ List genBasicCodeFrontendResultList = CollectionUtil.newArrayList();
+ GEN_FRONT_FILE_LIST.forEach(fileJsonObject -> {
+ String fileTemplateName = fileJsonObject.getStr("name");
+ String fileTemplatePath = fileJsonObject.getStr("path");
+ GenBasicPreviewResult.GenBasicCodeResult genBasicCodeFrontResult = new GenBasicPreviewResult.GenBasicCodeResult();
+ Template templateFront = groupTemplateFront.getTemplate(fileTemplateName);
+ templateFront.binding(bindingJsonObject);
+ String resultName = StrUtil.removeSuffix(fileTemplateName, ".btl");
+ if(fileTemplateName.equalsIgnoreCase("Api.js.btl")) {
+ resultName = StrUtil.lowerFirst(genBasic.getClassName()) + resultName;
+ genBasicCodeFrontResult.setCodeFileName(resultName);
+ genBasicCodeFrontResult.setCodeFileWithPathName(genFrontBasicPath + fileTemplatePath + File.separator + resultName);
+ } else {
+ genBasicCodeFrontResult.setCodeFileName(resultName);
+ genBasicCodeFrontResult.setCodeFileWithPathName(genFrontBasicPath + fileTemplatePath + File.separator + genBasic.getBusName() + File.separator + resultName);
+ }
+ genBasicCodeFrontResult.setCodeFileContent(templateFront.render());
+ genBasicCodeFrontendResultList.add(genBasicCodeFrontResult);
+ });
+ genBasicPreviewResult.setGenBasicCodeFrontendResultList(genBasicCodeFrontendResultList);
+
+ // 后端基础路径
+ String genBackendBasicPath = StrUtil.replace(genBasic.getPackageName(), StrUtil.DOT, File.separator) +
+ File.separator + MODULE_KEY + File.separator + "modular" + File.separator + genBasic.getBusName() + File.separator;
+ // 后端
+ GroupTemplate groupTemplateBackEnd = new GroupTemplate(new ClasspathResourceLoader("backend"),
+ Configuration.defaultConfiguration());
+ List genBasicCodeBackendResultList = CollectionUtil.newArrayList();
+ GEN_BACKEND_FILE_LIST.forEach(fileJsonObject -> {
+ String fileTemplateName = fileJsonObject.getStr("name");
+ String fileTemplatePath = fileJsonObject.getStr("path");
+ GenBasicPreviewResult.GenBasicCodeResult genBasicCodeBackendResult = new GenBasicPreviewResult.GenBasicCodeResult();
+ Template templateBackend = groupTemplateBackEnd.getTemplate(fileTemplateName);
+ templateBackend.binding(bindingJsonObject);
+ String resultName = StrUtil.removeSuffix(fileTemplateName, ".btl");
+ if(fileTemplateName.equalsIgnoreCase("Entity.java.btl")) {
+ resultName = ".java";
+ }
+ genBasicCodeBackendResult.setCodeFileName(genBasic.getClassName() + resultName);
+ genBasicCodeBackendResult.setCodeFileWithPathName(genBackendBasicPath + fileTemplatePath + File.separator + genBasic.getClassName() + resultName);
+ genBasicCodeBackendResult.setCodeFileContent(templateBackend.render());
+ genBasicCodeBackendResultList.add(genBasicCodeBackendResult);
+ });
+ genBasicPreviewResult.setGenBasicCodeBackendResultList(genBasicCodeBackendResultList);
+ } catch (Exception e) {
+ e.printStackTrace();
+ throw new CommonException("代码生成异常");
+ }
+ return genBasicPreviewResult;
+ }
+
+ /**
+ * 根据代码生成基础获取构造的参数
+ *
+ * @author xuyuxiang
+ * @date 2022/10/28 21:36
+ */
+ public JSONObject getBindingJsonObject(GenBasic genBasic) {
+ JSONObject bindingJsonObject = JSONUtil.createObj();
+ // 代码模块名
+ bindingJsonObject.set("moduleName", MODULE_KEY);
+ // 功能名
+ bindingJsonObject.set("functionName", genBasic.getFunctionName());
+ // 业务名
+ bindingJsonObject.set("busName", genBasic.getBusName());
+ // 包名
+ bindingJsonObject.set("packageName", genBasic.getPackageName());
+ // 库名
+ bindingJsonObject.set("dbTable", genBasic.getDbTable());
+ // 类名
+ bindingJsonObject.set("className", genBasic.getClassName());
+ // 类首字母小写名
+ bindingJsonObject.set("classNameFirstLower", StrUtil.lowerFirst(genBasic.getClassName()));
+ // 主键名
+ bindingJsonObject.set("dbTableKey", genBasic.getDbTableKey());
+ // 主键Java类型
+ bindingJsonObject.set("dbTableKeyJavaType", "String");
+ // 主键名驼峰
+ bindingJsonObject.set("dbTableKeyCamelCase", StrUtil.toCamelCase(genBasic.getDbTableKey().toLowerCase()));
+ // 主键首字母大写名
+ bindingJsonObject.set("dbTableKeyFirstUpper", StrUtil.upperFirst(genBasic.getDbTableKey().toLowerCase()));
+ // 主键注释
+ bindingJsonObject.set("dbTableKeyRemark", genBasic.getDbTableKey());
+ // 表单布局
+ bindingJsonObject.set("formLayout", genBasic.getFormLayout());
+ // 使用栅格
+ bindingJsonObject.set("gridWhether", genBasic.getGridWhether().equalsIgnoreCase(GenYesNoEnum.Y.getValue()));
+ // 父菜单ID
+ bindingJsonObject.set("parentId", genBasic.getMenuPid());
+ // 菜单ID
+ bindingJsonObject.set("menuId", IdWorker.getIdStr());
+ // 菜单编码
+ bindingJsonObject.set("menuCode", RandomUtil.randomString(10));
+ // 菜单路径
+ bindingJsonObject.set("menuPath", StrUtil.SLASH + MODULE_KEY + StrUtil.SLASH + genBasic.getBusName());
+ // 菜单组件
+ bindingJsonObject.set("menuComponent", MODULE_KEY + StrUtil.SLASH + genBasic.getBusName() + StrUtil.SLASH + "index");
+ // 模块ID
+ bindingJsonObject.set("moduleId", genBasic.getModule());
+ // 添加按钮ID
+ bindingJsonObject.set("addButtonId", IdWorker.getIdStr());
+ // 编辑按钮ID
+ bindingJsonObject.set("editButtonId", IdWorker.getIdStr());
+ // 删除按钮ID
+ bindingJsonObject.set("deleteButtonId", IdWorker.getIdStr());
+ // 批量删除按钮ID
+ bindingJsonObject.set("batchDeleteButtonId", IdWorker.getIdStr());
+ // 作者
+ bindingJsonObject.set("authorName", genBasic.getAuthorName());
+ // 生成时间
+ bindingJsonObject.set("genTime", DateUtil.format(DateTime.now(), " yyyy/MM/dd HH:mm"));
+ // 定义配置详情列表
+ List configList = CollectionUtil.newArrayList();
+ // 定义是否有排序字段
+ AtomicBoolean hasSortCodeField = new AtomicBoolean(false);
+ genConfigService.list(new LambdaQueryWrapper().eq(GenConfig::getBasicId, genBasic.getId()))
+ .forEach(genConfig -> {
+ // 定义字段信息
+ JSONObject configItem = JSONUtil.createObj();
+ if(genConfig.getFieldName().equalsIgnoreCase(SORT_CODE_KEY)) {
+ hasSortCodeField.set(true);
+ }
+ // 如果是主键,则无需作为添加参数,需要作为编辑参数,需要主键注解
+ if(genConfig.getFieldName().equalsIgnoreCase(genBasic.getDbTableKey())) {
+ configItem.set("needAdd", false);
+ configItem.set("needEdit", true);
+ configItem.set("needPage", false);
+ configItem.set("needPageType", "none");
+ configItem.set("required", true);
+ configItem.set("needTableId", true);
+ bindingJsonObject.set("dbTableKeyJavaType", genConfig.getFieldJavaType());
+ bindingJsonObject.set("dbTableKeyRemark", genConfig.getFieldRemark());
+ } else {
+ // 排除删除标志
+ String logicDeleteField = mybatisPlusProperties.getGlobalConfig().getDbConfig().getLogicDeleteField();
+ if(ObjectUtil.isEmpty(logicDeleteField)) {
+ logicDeleteField = "DELETE_FLAG";
+ }
+ if(genConfig.getFieldName().equalsIgnoreCase(logicDeleteField)) {
+ configItem.set("needAdd", false);
+ configItem.set("needEdit", false);
+ configItem.set("needPage", false);
+ configItem.set("needPageType", "none");
+ configItem.set("required", false);
+ configItem.set("needTableId", false);
+ } else {
+ boolean needAddAndUpdate = genConfig.getWhetherAddUpdate().equalsIgnoreCase(GenYesNoEnum.Y.getValue());
+ configItem.set("needAdd", needAddAndUpdate);
+ configItem.set("needEdit", needAddAndUpdate);
+ configItem.set("needPage", genConfig.getQueryWhether().equalsIgnoreCase(GenYesNoEnum.Y.getValue()));
+ configItem.set("needPageType", genConfig.getQueryType());
+ configItem.set("required", genConfig.getWhetherRequired().equalsIgnoreCase(GenYesNoEnum.Y.getValue()));
+ configItem.set("needTableId", false);
+ }
+ }
+ // 列显示
+ configItem.set("whetherTable", genConfig.getWhetherTable().equalsIgnoreCase(GenYesNoEnum.Y.getValue()));
+ // 列省略
+ configItem.set("whetherRetract", genConfig.getWhetherRetract().equalsIgnoreCase(GenYesNoEnum.Y.getValue()));
+ // 增改
+ configItem.set("whetherAddUpdate", genConfig.getWhetherAddUpdate().equalsIgnoreCase(GenYesNoEnum.Y.getValue()));
+ // 作用类型
+ configItem.set("effectType", genConfig.getEffectType());
+ // 字典值
+ configItem.set("dictTypeCode", genConfig.getDictTypeCode());
+ // 实体类型
+ configItem.set("fieldJavaType", genConfig.getFieldJavaType());
+ // 字段驼峰名
+ configItem.set("fieldNameCamelCase", StrUtil.toCamelCase(genConfig.getFieldName().toLowerCase()));
+ // 字段驼峰首字母大写名
+ configItem.set("fieldNameCamelCaseFirstUpper", StrUtil.upperFirst(StrUtil.toCamelCase(genConfig.getFieldName().toLowerCase())));
+ // 字段注释
+ configItem.set("fieldRemark", genConfig.getFieldRemark());
+ // 是否需要自动插入
+ configItem.set("needAutoInsert", CREATE_USER_KEY.equalsIgnoreCase(genConfig.getFieldName()) ||
+ CREATE_TIME_KEY.equalsIgnoreCase(genConfig.getFieldName()));
+ // 是否需要自动更新
+ configItem.set("needAutoUpdate", UPDATE_USER_KEY.equalsIgnoreCase(genConfig.getFieldName()) ||
+ UPDATE_TIME_KEY.equalsIgnoreCase(genConfig.getFieldName()));
+ configList.add(configItem);
+
+ });
+ // 配置信息
+ bindingJsonObject.set("configList", configList);
+ // 有排序字段
+ bindingJsonObject.set("hasSortCodeField", hasSortCodeField.get());
+ return bindingJsonObject;
+ }
+}
diff --git a/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/controller/GenConfigController.java b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/controller/GenConfigController.java
new file mode 100644
index 00000000..dde3b55a
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/controller/GenConfigController.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.gen.modular.config.controller;
+
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import com.github.xiaoymin.knife4j.annotations.ApiSupport;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+import vip.xiaonuo.common.annotation.CommonLog;
+import vip.xiaonuo.common.pojo.CommonResult;
+import vip.xiaonuo.common.pojo.CommonValidList;
+import vip.xiaonuo.gen.modular.config.entity.GenConfig;
+import vip.xiaonuo.gen.modular.config.param.GenConfigEditParam;
+import vip.xiaonuo.gen.modular.config.param.GenConfigIdParam;
+import vip.xiaonuo.gen.modular.config.param.GenConfigListParam;
+import vip.xiaonuo.gen.modular.config.service.GenConfigService;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+import javax.validation.constraints.NotEmpty;
+import java.util.List;
+
+/**
+ * 代码生成详细配置控制器
+ *
+ * @author yubaoshan
+ * @date 2022/10/25 22:33
+ **/
+@Api(tags = "代码生成详细配置控制器")
+@ApiSupport(author = "SNOWY_TEAM", order = 2)
+@RestController
+@Validated
+public class GenConfigController {
+
+ @Resource
+ private GenConfigService genConfigService;
+
+ /**
+ * 获取代码生成详细配置分页
+ *
+ * @author yubaoshan
+ * @date 2022/4/24 20:00
+ */
+ @ApiOperationSupport(order = 1)
+ @ApiOperation("获取代码生成详细配置分页")
+ @GetMapping("/gen/config/list")
+ public CommonResult> list(GenConfigListParam genConfigListParam) {
+ return CommonResult.data(genConfigService.list(genConfigListParam));
+ }
+
+ /**
+ * 编辑代码生成详细配置
+ *
+ * @author yubaoshan
+ * @date 2022/4/24 20:47
+ */
+ @ApiOperationSupport(order = 2)
+ @ApiOperation("编辑代码生成详细配置")
+ @CommonLog("编辑代码生成详细配置")
+ @PostMapping("/gen/config/edit")
+ public CommonResult edit(@RequestBody @Valid GenConfigEditParam genConfigEditParam) {
+ genConfigService.edit(genConfigEditParam);
+ return CommonResult.ok();
+ }
+
+ /**
+ * 删除代码生成详细配置
+ *
+ * @author yubaoshan
+ * @date 2022/4/24 20:00
+ */
+ @ApiOperationSupport(order = 3)
+ @ApiOperation("删除代码生成详细配置")
+ @CommonLog("删除代码生成详细配置")
+ @PostMapping("/gen/config/delete")
+ public CommonResult delete(@RequestBody @Valid @NotEmpty(message = "集合不能为空")
+ CommonValidList genConfigIdParamList) {
+ genConfigService.delete(genConfigIdParamList);
+ return CommonResult.ok();
+ }
+
+ /**
+ * 获取代码生成详细配置详情
+ *
+ * @author yubaoshan
+ * @date 2022/4/24 20:00
+ */
+ @ApiOperationSupport(order = 4)
+ @ApiOperation("获取代码生成详细配置详情")
+ @GetMapping("/gen/config/detail")
+ public CommonResult detail(@Valid GenConfigIdParam genConfigIdParam) {
+ return CommonResult.data(genConfigService.detail(genConfigIdParam));
+ }
+
+ /**
+ * 批量编辑代码生成详细配置
+ *
+ * @author yubaoshan
+ * @date 2022/4/24 20:47
+ */
+ @ApiOperationSupport(order = 5)
+ @ApiOperation("批量编辑代码生成详细配置")
+ @CommonLog("批量编辑代码生成详细配置")
+ @PostMapping("/gen/config/editBatch")
+ public CommonResult editBatch(@RequestBody @Valid @NotEmpty(message = "集合不能为空")
+ CommonValidList genConfigEditParamList) {
+ genConfigService.editBatch(genConfigEditParamList);
+ return CommonResult.ok();
+ }
+}
diff --git a/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/entity/GenConfig.java b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/entity/GenConfig.java
new file mode 100644
index 00000000..3919135d
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/entity/GenConfig.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.gen.modular.config.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import vip.xiaonuo.common.pojo.CommonEntity;
+
+/**
+ * 代码生成详细配置
+ *
+ * @author yubaoshan
+ * @date 2022/10/25 22:33
+ **/
+@Getter
+@Setter
+@TableName("GEN_CONFIG")
+public class GenConfig extends CommonEntity {
+
+ /** id */
+ @ApiModelProperty(value = "id", position = 1)
+ private String id;
+
+ /** 基础ID */
+ @ApiModelProperty(value = "基础ID", position = 2)
+ private String basicId;
+
+ /** 是否主键 */
+ @ApiModelProperty(value = "是否主键", position = 3)
+ private String isTableKey;
+
+ /** 字段 */
+ @ApiModelProperty(value = "字段", position = 4)
+ private String fieldName;
+
+ /** 注释 */
+ @ApiModelProperty(value = "注释", position = 5)
+ private String fieldRemark;
+
+ /** 类型 */
+ @ApiModelProperty(value = "类型", position = 6)
+ private String fieldType;
+
+ /** 实体类型 */
+ @ApiModelProperty(value = "实体类型", position = 7)
+ private String fieldJavaType;
+
+ /** 作用类型 */
+ @ApiModelProperty(value = "作用类型", position = 8)
+ private String effectType;
+
+ /** 字典 */
+ @ApiModelProperty(value = "字典", position = 9)
+ private String dictTypeCode;
+
+ /** 列表显示 */
+ @ApiModelProperty(value = "列表显示", position = 10)
+ private String whetherTable;
+
+ /** 列省略 */
+ @ApiModelProperty(value = "列省略", position = 11)
+ private String whetherRetract;
+
+ /** 增改 */
+ @ApiModelProperty(value = "增改", position = 12)
+ private String whetherAddUpdate;
+
+ /** 必填 */
+ @ApiModelProperty(value = "必填", position = 13)
+ private String whetherRequired;
+
+ /** 查询 */
+ @ApiModelProperty(value = "查询", position = 14)
+ private String queryWhether;
+
+ /** 查询方式 */
+ @ApiModelProperty(value = "查询方式", position = 15)
+ private String queryType;
+
+ /** 排序 */
+ @ApiModelProperty(value = "排序", position = 16)
+ private String sortCode;
+}
diff --git a/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/mapper/GenConfigMapper.java b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/mapper/GenConfigMapper.java
new file mode 100644
index 00000000..88f5a574
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/mapper/GenConfigMapper.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.gen.modular.config.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import vip.xiaonuo.gen.modular.config.entity.GenConfig;
+
+/**
+ * 代码生成详细配置Mapper接口
+ *
+ * @author yubaoshan
+ * @date 2022/10/25 22:33
+ **/
+public interface GenConfigMapper extends BaseMapper {
+}
diff --git a/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/mapper/mapping/GenConfigMapper.xml b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/mapper/mapping/GenConfigMapper.xml
new file mode 100644
index 00000000..b893445b
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/mapper/mapping/GenConfigMapper.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/param/GenConfigAddParam.java b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/param/GenConfigAddParam.java
new file mode 100644
index 00000000..22c28f01
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/param/GenConfigAddParam.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.gen.modular.config.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * 代码生成详细配置添加参数
+ *
+ * @author yubaoshan
+ * @date 2022/10/25 22:33
+ **/
+@Getter
+@Setter
+public class GenConfigAddParam {
+
+ /** 基础ID */
+ @ApiModelProperty(value = "基础ID", required = true, position = 1)
+ @NotBlank(message = "basicId不能为空")
+ private String basicId;
+
+ /** 是否是主键 */
+ @ApiModelProperty(value = "是否是主键", required = true, position = 2)
+ @NotBlank(message = "isTableKey不能为空")
+ private String isTableKey;
+
+ /** 字段 */
+ @ApiModelProperty(value = "字段", required = true, position = 3)
+ @NotBlank(message = "fieldName不能为空")
+ private String fieldName;
+
+ /** 注释 */
+ @ApiModelProperty(value = "注释", required = true, position = 4)
+ @NotBlank(message = "fieldRemark不能为空")
+ private String fieldRemark;
+
+ /** 类型 */
+ @ApiModelProperty(value = "类型", required = true, position = 5)
+ @NotBlank(message = "fieldType不能为空")
+ private String fieldType;
+
+ /** 实体类型 */
+ @ApiModelProperty(value = "实体类型", position = 6)
+ private String fieldJavaType;
+
+ /** 作用类型 */
+ @ApiModelProperty(value = "作用类型", position = 7)
+ private String effectType;
+
+ /** 字典 */
+ @ApiModelProperty(value = "字典", position = 8)
+ private String dictTypeCode;
+
+ /** 列表显示 */
+ @ApiModelProperty(value = "列表显示", position = 9)
+ private String whetherTable;
+
+ /** 列省略 */
+ @ApiModelProperty(value = "列省略", position = 10)
+ private String whetherRetract;
+
+ /** 增改 */
+ @ApiModelProperty(value = "增改", position = 11)
+ private String whetherAddUpdate;
+
+ /** 必填 */
+ @ApiModelProperty(value = "必填", position = 12)
+ private String whetherRequired;
+
+ /** 查询 */
+ @ApiModelProperty(value = "查询", position = 13)
+ private String queryWhether;
+
+ /** 查询方式 */
+ @ApiModelProperty(value = "查询方式", position = 14)
+ private String queryType;
+
+ /** 排序 */
+ @ApiModelProperty(value = "排序", position = 15)
+ private Integer sortCode;
+}
diff --git a/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/param/GenConfigEditParam.java b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/param/GenConfigEditParam.java
new file mode 100644
index 00000000..b59906d1
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/param/GenConfigEditParam.java
@@ -0,0 +1,107 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.gen.modular.config.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * 代码生成详细配置编辑参数
+ *
+ * @author yubaoshan
+ * @date 2022/10/25 22:33
+ **/
+@Getter
+@Setter
+public class GenConfigEditParam {
+
+ /** id */
+ @ApiModelProperty(value = "id", required = true, position = 1)
+ @NotBlank(message = "id不能为空")
+ private String id;
+
+ /** 基础ID */
+ @ApiModelProperty(value = "基础ID", required = true, position = 2)
+ @NotBlank(message = "basicId不能为空")
+ private String basicId;
+
+ /** 是否主键 */
+ @ApiModelProperty(value = "是否主键", required = true, position = 3)
+ @NotBlank(message = "isTableKey不能为空")
+ private String isTableKey;
+
+ /** 字段 */
+ @ApiModelProperty(value = "字段", required = true, position = 4)
+ @NotBlank(message = "fieldName不能为空")
+ private String fieldName;
+
+ /** 注释 */
+ @ApiModelProperty(value = "注释", required = true, position = 5)
+ @NotBlank(message = "fieldRemark不能为空")
+ private String fieldRemark;
+
+ /** 类型 */
+ @ApiModelProperty(value = "类型", required = true, position = 6)
+ @NotBlank(message = "fieldType不能为空")
+ private String fieldType;
+
+ /** 实体类型 */
+ @ApiModelProperty(value = "实体类型", required = true, position = 7)
+ @NotBlank(message = "fieldJavaType不能为空")
+ private String fieldJavaType;
+
+ /** 作用类型 */
+ @ApiModelProperty(value = "作用类型", required = true, position = 8)
+ @NotBlank(message = "effectType不能为空")
+ private String effectType;
+
+ /** 字典 */
+ @ApiModelProperty(value = "字典", required = true, position = 9)
+ private String dictTypeCode;
+
+ /** 列表显示 */
+ @ApiModelProperty(value = "列表显示", required = true, position = 10)
+ @NotBlank(message = "whetherTable不能为空")
+ private String whetherTable;
+
+ /** 列省略 */
+ @ApiModelProperty(value = "列省略", required = true, position = 11)
+ @NotBlank(message = "whetherRetract不能为空")
+ private String whetherRetract;
+
+ /** 增改 */
+ @ApiModelProperty(value = "增改", required = true, position = 12)
+ @NotBlank(message = "whetherAddUpdate不能为空")
+ private String whetherAddUpdate;
+
+ /** 必填 */
+ @ApiModelProperty(value = "必填", required = true, position = 13)
+ @NotBlank(message = "whetherRequired不能为空")
+ private String whetherRequired;
+
+ /** 查询 */
+ @ApiModelProperty(value = "查询", required = true, position = 14)
+ @NotBlank(message = "queryWhether不能为空")
+ private String queryWhether;
+
+ /** 查询方式 */
+ @ApiModelProperty(value = "查询方式", required = true, position = 15)
+ private String queryType;
+
+ /** 排序 */
+ @ApiModelProperty(value = "排序", required = true, position = 16)
+ private Integer sortCode;
+}
diff --git a/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/param/GenConfigIdParam.java b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/param/GenConfigIdParam.java
new file mode 100644
index 00000000..93f3ed18
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/param/GenConfigIdParam.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.gen.modular.config.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * 代码生成详细配置Id参数
+ *
+ * @author yubaoshan
+ * @date 2022/10/25 22:33
+ **/
+@Getter
+@Setter
+public class GenConfigIdParam {
+
+ /** id */
+ @ApiModelProperty(value = "id", required = true)
+ @NotBlank(message = "id不能为空")
+ private String id;
+}
diff --git a/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/param/GenConfigListParam.java b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/param/GenConfigListParam.java
new file mode 100644
index 00000000..5aac3589
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/param/GenConfigListParam.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.gen.modular.config.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * 代码生成详细配置查询参数
+ *
+ * @author yubaoshan
+ * @date 2022/10/25 22:33
+ */
+@Getter
+@Setter
+public class GenConfigListParam {
+
+ /** 排序字段 */
+ @ApiModelProperty(value = "排序字段,字段驼峰名称,如:userName")
+ private String sortField;
+
+ /** 排序方式 */
+ @ApiModelProperty(value = "排序方式,升序:ASCEND;降序:DESCEND")
+ private String sortOrder;
+
+ /** 基础ID */
+ @ApiModelProperty(value = "基础ID")
+ @NotBlank(message = "basicId不能为空")
+ private String basicId;
+}
diff --git a/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/param/GenConfigPageParam.java b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/param/GenConfigPageParam.java
new file mode 100644
index 00000000..28396caa
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/param/GenConfigPageParam.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.gen.modular.config.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * 代码生成详细配置查询参数
+ *
+ * @author yubaoshan
+ * @date 2022/10/25 22:33
+ */
+@Getter
+@Setter
+public class GenConfigPageParam {
+
+ /** 当前页 */
+ @ApiModelProperty(value = "当前页码")
+ private Integer current;
+
+ /** 每页条数 */
+ @ApiModelProperty(value = "每页条数")
+ private Integer size;
+
+ /** 排序字段 */
+ @ApiModelProperty(value = "排序字段,字段驼峰名称,如:userName")
+ private String sortField;
+
+ /** 排序方式 */
+ @ApiModelProperty(value = "排序方式,升序:ASCEND;降序:DESCEND")
+ private String sortOrder;
+
+ /** 基础ID */
+ @ApiModelProperty(value = "基础ID")
+ @NotBlank(message = "basicId不能为空")
+ private String basicId;
+}
diff --git a/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/service/GenConfigService.java b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/service/GenConfigService.java
new file mode 100644
index 00000000..f7a3ea48
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/service/GenConfigService.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.gen.modular.config.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import vip.xiaonuo.common.pojo.CommonValidList;
+import vip.xiaonuo.gen.modular.config.entity.GenConfig;
+import vip.xiaonuo.gen.modular.config.param.GenConfigEditParam;
+import vip.xiaonuo.gen.modular.config.param.GenConfigIdParam;
+import vip.xiaonuo.gen.modular.config.param.GenConfigListParam;
+
+import java.util.List;
+
+/**
+ * 代码生成详细配置配置Service接口
+ *
+ * @author yubaoshan
+ * @date 2022/10/25 22:33
+ **/
+public interface GenConfigService extends IService {
+
+ /**
+ * 查询代码生成详细配置列表
+ *
+ * @author yubaoshan
+ * @date 2022/10/25 22:33
+ */
+ List list(GenConfigListParam genConfigListParam);
+
+ /**
+ * 编辑代码生成详细配置
+ *
+ * @author yubaoshan
+ * @date 2022/10/25 22:33
+ */
+ void edit(GenConfigEditParam genConfigEditParam);
+
+ /**
+ * 删除代码生成详细配置
+ *
+ * @author yubaoshan
+ * @date 2022/10/25 22:33
+ */
+ void delete(List genConfigIdParamList);
+
+ /**
+ * 获取代码生成详细配置详情
+ *
+ * @author yubaoshan
+ * @date 2022/10/25 22:33
+ */
+ GenConfig detail(GenConfigIdParam genConfigIdParam);
+
+ /**
+ * 获取代码生成详细配置详情
+ *
+ * @author yubaoshan
+ * @date 2022/10/25 22:33
+ **/
+ GenConfig queryEntity(String id);
+
+ /**
+ * 批量编辑代码生成详细配置
+ *
+ * @author xuyuxiang
+ * @date 2022/10/28 13:49
+ **/
+ void editBatch(List genConfigEditParamList);
+}
diff --git a/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/service/impl/GenConfigServiceImpl.java b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/service/impl/GenConfigServiceImpl.java
new file mode 100644
index 00000000..0eadf0da
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/service/impl/GenConfigServiceImpl.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.gen.modular.config.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollStreamUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import vip.xiaonuo.common.enums.CommonSortOrderEnum;
+import vip.xiaonuo.common.exception.CommonException;
+import vip.xiaonuo.gen.modular.config.entity.GenConfig;
+import vip.xiaonuo.gen.modular.config.mapper.GenConfigMapper;
+import vip.xiaonuo.gen.modular.config.param.GenConfigEditParam;
+import vip.xiaonuo.gen.modular.config.param.GenConfigIdParam;
+import vip.xiaonuo.gen.modular.config.param.GenConfigListParam;
+import vip.xiaonuo.gen.modular.config.service.GenConfigService;
+
+import java.util.List;
+
+/**
+ * 代码生成详情配置Service接口实现类
+ *
+ * @author yubaoshan
+ * @date 2022/10/25 22:33
+ **/
+@Service
+public class GenConfigServiceImpl extends ServiceImpl implements GenConfigService {
+
+ @Override
+ public List list(GenConfigListParam genConfigListParam) {
+ QueryWrapper queryWrapper = new QueryWrapper<>();
+
+ queryWrapper.lambda().eq(GenConfig::getBasicId, genConfigListParam.getBasicId());
+ if(ObjectUtil.isAllNotEmpty(genConfigListParam.getSortField(), genConfigListParam.getSortOrder())) {
+ CommonSortOrderEnum.validate(genConfigListParam.getSortOrder());
+ queryWrapper.orderBy(true, genConfigListParam.getSortOrder().equals(CommonSortOrderEnum.ASC.getValue()),
+ StrUtil.toUnderlineCase(genConfigListParam.getSortField()));
+ } else {
+ queryWrapper.lambda().orderByAsc(GenConfig::getSortCode);
+ }
+ return this.list(queryWrapper);
+ }
+
+ @Transactional(rollbackFor = Exception.class)
+ @Override
+ public void edit(GenConfigEditParam genConfigEditParam) {
+ GenConfig genConfig = this.queryEntity(genConfigEditParam.getId());
+ BeanUtil.copyProperties(genConfigEditParam, genConfig);
+ this.updateById(genConfig);
+ }
+
+ @Transactional(rollbackFor = Exception.class)
+ @Override
+ public void delete(List genConfigIdParamList) {
+ List basicIdIdList = CollStreamUtil.toList(genConfigIdParamList, GenConfigIdParam::getId);
+ if(ObjectUtil.isNotEmpty(basicIdIdList)) {
+ // 执行删除
+ this.removeBatchByIds(basicIdIdList);
+ }
+ }
+
+ @Override
+ public GenConfig detail(GenConfigIdParam genConfigIdParam) {
+ return this.queryEntity(genConfigIdParam.getId());
+ }
+
+ @Override
+ public GenConfig queryEntity(String id) {
+ GenConfig genConfig = this.getById(id);
+ if(ObjectUtil.isEmpty(genConfig)) {
+ throw new CommonException("代码生成详情配置不存在,id值为:{}", id);
+ }
+ return genConfig;
+ }
+
+ @Transactional(rollbackFor = Exception.class)
+ @Override
+ public void editBatch(List genConfigEditParamList) {
+ genConfigEditParamList.forEach(this::edit);
+ }
+}
diff --git a/snowy-plugin/snowy-plugin-gen/src/main/resources/backend/AddParam.java.btl b/snowy-plugin/snowy-plugin-gen/src/main/resources/backend/AddParam.java.btl
new file mode 100644
index 00000000..e7b3f972
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-gen/src/main/resources/backend/AddParam.java.btl
@@ -0,0 +1,44 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package ${packageName}.${moduleName}.modular.${busName}.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+
+/**
+ * ${functionName}添加参数
+ *
+ * @author ${authorName}
+ * @date ${genTime}
+ **/
+@Getter
+@Setter
+public class ${className}AddParam {
+
+ <% for(var i = 0; i < configList.~size; i++) { %>
+ <% if(configList[i].needAdd) { %>
+ /** ${configList[i].fieldRemark} */
+ @ApiModelProperty(value = "${configList[i].fieldRemark}",<% if(configList[i].required) { %> required = true,<% } %> position = ${i + 1})
+ <% if(configList[i].required) { %>
+ <% if(configList[i].fieldJavaType == 'String') { %>@NotBlank<% } else { %>@NotNull<% } %>(message = "${configList[i].fieldNameCamelCase}不能为空")
+ <% } else { %><% } %>
+ private ${configList[i].fieldJavaType} ${configList[i].fieldNameCamelCase};
+
+ <% } %>
+ <% } %>
+}
diff --git a/snowy-plugin/snowy-plugin-gen/src/main/resources/backend/Controller.java.btl b/snowy-plugin/snowy-plugin-gen/src/main/resources/backend/Controller.java.btl
new file mode 100644
index 00000000..2e16bba4
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-gen/src/main/resources/backend/Controller.java.btl
@@ -0,0 +1,125 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package ${packageName}.${moduleName}.modular.${busName}.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import com.github.xiaoymin.knife4j.annotations.ApiSupport;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+import ${packageName}.common.annotation.CommonLog;
+import ${packageName}.common.pojo.CommonResult;
+import ${packageName}.common.pojo.CommonValidList;
+import ${packageName}.${moduleName}.modular.${busName}.entity.${className};
+import ${packageName}.${moduleName}.modular.${busName}.param.${className}AddParam;
+import ${packageName}.${moduleName}.modular.${busName}.param.${className}EditParam;
+import ${packageName}.${moduleName}.modular.${busName}.param.${className}IdParam;
+import ${packageName}.${moduleName}.modular.${busName}.param.${className}PageParam;
+import ${packageName}.${moduleName}.modular.${busName}.service.${className}Service;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+import javax.validation.constraints.NotEmpty;
+
+/**
+ * ${functionName}控制器
+ *
+ * @author ${authorName}
+ * @date ${genTime}
+ */
+@Api(tags = "${functionName}控制器")
+@ApiSupport(author = "SNOWY_TEAM", order = 1)
+@RestController
+@Validated
+public class ${className}Controller {
+
+ @Resource
+ private ${className}Service ${classNameFirstLower}Service;
+
+ /**
+ * 获取${functionName}分页
+ *
+ * @author ${authorName}
+ * @date ${genTime}
+ */
+ @ApiOperationSupport(order = 1)
+ @ApiOperation("获取${functionName}分页")
+ @GetMapping("/${moduleName}/${busName}/page")
+ public CommonResult> page(${className}PageParam ${classNameFirstLower}PageParam) {
+ return CommonResult.data(${classNameFirstLower}Service.page(${classNameFirstLower}PageParam));
+ }
+
+ /**
+ * 添加${functionName}
+ *
+ * @author ${authorName}
+ * @date ${genTime}
+ */
+ @ApiOperationSupport(order = 2)
+ @ApiOperation("添加${functionName}")
+ @CommonLog("添加${functionName}")
+ @PostMapping("/${moduleName}/${busName}/add")
+ public CommonResult add(@RequestBody @Valid ${className}AddParam ${classNameFirstLower}AddParam) {
+ ${classNameFirstLower}Service.add(${classNameFirstLower}AddParam);
+ return CommonResult.ok();
+ }
+
+ /**
+ * 编辑${functionName}
+ *
+ * @author ${authorName}
+ * @date ${genTime}
+ */
+ @ApiOperationSupport(order = 3)
+ @ApiOperation("编辑${functionName}")
+ @CommonLog("编辑${functionName}")
+ @PostMapping("/${moduleName}/${busName}/edit")
+ public CommonResult edit(@RequestBody @Valid ${className}EditParam ${classNameFirstLower}EditParam) {
+ ${classNameFirstLower}Service.edit(${classNameFirstLower}EditParam);
+ return CommonResult.ok();
+ }
+
+ /**
+ * 删除${functionName}
+ *
+ * @author ${authorName}
+ * @date ${genTime}
+ */
+ @ApiOperationSupport(order = 4)
+ @ApiOperation("删除${functionName}")
+ @CommonLog("删除${functionName}")
+ @PostMapping("/${moduleName}/${busName}/delete")
+ public CommonResult delete(@RequestBody @Valid @NotEmpty(message = "集合不能为空")
+ CommonValidList<${className}IdParam> ${classNameFirstLower}IdParamList) {
+ ${classNameFirstLower}Service.delete(${classNameFirstLower}IdParamList);
+ return CommonResult.ok();
+ }
+
+ /**
+ * 获取${functionName}详情
+ *
+ * @author ${authorName}
+ * @date ${genTime}
+ */
+ @ApiOperationSupport(order = 5)
+ @ApiOperation("获取${functionName}详情")
+ @GetMapping("/${moduleName}/${busName}/detail")
+ public CommonResult<${className}> detail(@Valid ${className}IdParam ${classNameFirstLower}IdParam) {
+ return CommonResult.data(${classNameFirstLower}Service.detail(${classNameFirstLower}IdParam));
+ }
+}
diff --git a/snowy-plugin/snowy-plugin-gen/src/main/resources/backend/EditParam.java.btl b/snowy-plugin/snowy-plugin-gen/src/main/resources/backend/EditParam.java.btl
new file mode 100644
index 00000000..a3768f51
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-gen/src/main/resources/backend/EditParam.java.btl
@@ -0,0 +1,44 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package ${packageName}.${moduleName}.modular.${busName}.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+
+/**
+ * ${functionName}编辑参数
+ *
+ * @author ${authorName}
+ * @date ${genTime}
+ **/
+@Getter
+@Setter
+public class ${className}EditParam {
+
+ <% for(var i = 0; i < configList.~size; i++) { %>
+ <% if(configList[i].needEdit) { %>
+ /** ${configList[i].fieldRemark} */
+ @ApiModelProperty(value = "${configList[i].fieldRemark}",<% if(configList[i].required) { %> required = true,<% } %> position = ${i + 1})
+ <% if(configList[i].required) { %>
+ <% if(configList[i].fieldJavaType == 'String') { %>@NotBlank<% } else { %>@NotNull<% } %>(message = "${configList[i].fieldNameCamelCase}不能为空")
+ <% } else { %><% } %>
+ private ${configList[i].fieldJavaType} ${configList[i].fieldNameCamelCase};
+
+ <% } %>
+ <% } %>
+}
diff --git a/snowy-plugin/snowy-plugin-gen/src/main/resources/backend/Entity.java.btl b/snowy-plugin/snowy-plugin-gen/src/main/resources/backend/Entity.java.btl
new file mode 100644
index 00000000..2fcc7e88
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-gen/src/main/resources/backend/Entity.java.btl
@@ -0,0 +1,52 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package ${packageName}.${moduleName}.modular.${busName}.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import java.util.Date;
+
+/**
+ * ${functionName}实体
+ *
+ * @author ${authorName}
+ * @date ${genTime}
+ **/
+@Getter
+@Setter
+@TableName("${dbTable}")
+public class ${className} {
+
+ <% for(var i = 0; i < configList.~size; i++) { %>
+ /** ${configList[i].fieldRemark} */
+ <% if(configList[i].needTableId) { %>
+ @TableId
+ <% } else { %><% } %>
+ @ApiModelProperty(value = "${configList[i].fieldRemark}", position = ${i + 1})
+ <% if(configList[i].needAutoInsert) { %>
+ @TableField(fill = FieldFill.INSERT)
+ <% } else { %><% } %>
+ <% if(configList[i].needAutoUpdate) { %>
+ @TableField(fill = FieldFill.UPDATE)
+ <% } else { %><% } %>
+ private ${configList[i].fieldJavaType} ${configList[i].fieldNameCamelCase};
+ <% if(i == configList.~size - 1) { %><% } else { %>
+
+ <% } %>
+ <% } %>
+}
diff --git a/snowy-plugin/snowy-plugin-gen/src/main/resources/backend/Enum.java.btl b/snowy-plugin/snowy-plugin-gen/src/main/resources/backend/Enum.java.btl
new file mode 100644
index 00000000..d87196eb
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-gen/src/main/resources/backend/Enum.java.btl
@@ -0,0 +1,34 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package ${packageName}.${moduleName}.modular.${busName}.enums;
+
+import lombok.Getter;
+
+/**
+ * ${functionName}枚举
+ *
+ * @author ${authorName}
+ * @date ${genTime}
+ **/
+@Getter
+public enum ${className}Enum {
+
+ /** 测试 */
+ TEST("TEST");
+
+ private final String value;
+
+ ${className}Enum(String value) {
+ this.value = value;
+ }
+}
diff --git a/snowy-plugin/snowy-plugin-gen/src/main/resources/backend/IdParam.java.btl b/snowy-plugin/snowy-plugin-gen/src/main/resources/backend/IdParam.java.btl
new file mode 100644
index 00000000..c6566616
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-gen/src/main/resources/backend/IdParam.java.btl
@@ -0,0 +1,35 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package ${packageName}.${moduleName}.modular.${busName}.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * ${functionName}Id参数
+ *
+ * @author ${authorName}
+ * @date ${genTime}
+ **/
+@Getter
+@Setter
+public class ${className}IdParam {
+
+ /** ${dbTableKeyRemark} */
+ @ApiModelProperty(value = "${dbTableKeyRemark}", required = true)
+ @NotBlank(message = "${dbTableKeyCamelCase}不能为空")
+ private ${dbTableKeyJavaType} ${dbTableKeyCamelCase};
+}
diff --git a/snowy-plugin/snowy-plugin-gen/src/main/resources/backend/Mapper.java.btl b/snowy-plugin/snowy-plugin-gen/src/main/resources/backend/Mapper.java.btl
new file mode 100644
index 00000000..581fb2f2
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-gen/src/main/resources/backend/Mapper.java.btl
@@ -0,0 +1,25 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package ${packageName}.${moduleName}.modular.${busName}.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import ${packageName}.${moduleName}.modular.${busName}.entity.${className};
+
+/**
+ * ${functionName}Mapper接口
+ *
+ * @author ${authorName}
+ * @date ${genTime}
+ **/
+public interface ${className}Mapper extends BaseMapper<${className}> {
+}
diff --git a/snowy-plugin/snowy-plugin-gen/src/main/resources/backend/Mapper.xml.btl b/snowy-plugin/snowy-plugin-gen/src/main/resources/backend/Mapper.xml.btl
new file mode 100644
index 00000000..7d90b198
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-gen/src/main/resources/backend/Mapper.xml.btl
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/snowy-plugin/snowy-plugin-gen/src/main/resources/backend/PageParam.java.btl b/snowy-plugin/snowy-plugin-gen/src/main/resources/backend/PageParam.java.btl
new file mode 100644
index 00000000..117ddde6
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-gen/src/main/resources/backend/PageParam.java.btl
@@ -0,0 +1,69 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package ${packageName}.${moduleName}.modular.${busName}.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import java.util.Date;
+
+/**
+ * ${functionName}查询参数
+ *
+ * @author ${authorName}
+ * @date ${genTime}
+ **/
+@Getter
+@Setter
+public class ${className}PageParam {
+
+ /** 当前页 */
+ @ApiModelProperty(value = "当前页码")
+ private Integer current;
+
+ /** 每页条数 */
+ @ApiModelProperty(value = "每页条数")
+ private Integer size;
+
+ /** 排序字段 */
+ @ApiModelProperty(value = "排序字段,字段驼峰名称,如:userName")
+ private String sortField;
+
+ /** 排序方式 */
+ @ApiModelProperty(value = "排序方式,升序:ASCEND;降序:DESCEND")
+ private String sortOrder;
+
+ /** 关键词 */
+ @ApiModelProperty(value = "关键词")
+ private String searchKey;
+
+ <% for(var i = 0; i < configList.~size; i++) { %>
+ <% if(configList[i].needPage) { %>
+ <% if(configList[i].effectType == 'datepicker') { %>
+ /** ${configList[i].fieldRemark}开始 */
+ @ApiModelProperty(value = "${configList[i].fieldRemark}开始")
+ private String start${configList[i].fieldNameCamelCaseFirstUpper};
+
+ /** ${configList[i].fieldRemark}结束 */
+ @ApiModelProperty(value = "${configList[i].fieldRemark}结束")
+ private String end${configList[i].fieldNameCamelCaseFirstUpper};
+
+ <% } else { %>
+ /** ${configList[i].fieldRemark} */
+ @ApiModelProperty(value = "${configList[i].fieldRemark}")
+ private ${configList[i].fieldJavaType} ${configList[i].fieldNameCamelCase};
+
+ <% } %>
+ <% } %>
+ <% } %>
+}
diff --git a/snowy-plugin/snowy-plugin-gen/src/main/resources/backend/Service.java.btl b/snowy-plugin/snowy-plugin-gen/src/main/resources/backend/Service.java.btl
new file mode 100644
index 00000000..e8daf4d5
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-gen/src/main/resources/backend/Service.java.btl
@@ -0,0 +1,80 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package ${packageName}.${moduleName}.modular.${busName}.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import ${packageName}.${moduleName}.modular.${busName}.entity.${className};
+import ${packageName}.${moduleName}.modular.${busName}.param.${className}AddParam;
+import ${packageName}.${moduleName}.modular.${busName}.param.${className}EditParam;
+import ${packageName}.${moduleName}.modular.${busName}.param.${className}IdParam;
+import ${packageName}.${moduleName}.modular.${busName}.param.${className}PageParam;
+
+import java.util.List;
+
+/**
+ * ${functionName}Service接口
+ *
+ * @author ${authorName}
+ * @date ${genTime}
+ **/
+public interface ${className}Service extends IService<${className}> {
+
+ /**
+ * 获取${functionName}分页
+ *
+ * @author ${authorName}
+ * @date ${genTime}
+ */
+ Page<${className}> page(${className}PageParam ${classNameFirstLower}PageParam);
+
+ /**
+ * 添加${functionName}
+ *
+ * @author ${authorName}
+ * @date ${genTime}
+ */
+ void add(${className}AddParam ${classNameFirstLower}AddParam);
+
+ /**
+ * 编辑${functionName}
+ *
+ * @author ${authorName}
+ * @date ${genTime}
+ */
+ void edit(${className}EditParam ${classNameFirstLower}EditParam);
+
+ /**
+ * 删除${functionName}
+ *
+ * @author ${authorName}
+ * @date ${genTime}
+ */
+ void delete(List<${className}IdParam> ${classNameFirstLower}IdParamList);
+
+ /**
+ * 获取${functionName}详情
+ *
+ * @author ${authorName}
+ * @date ${genTime}
+ */
+ ${className} detail(${className}IdParam ${classNameFirstLower}IdParam);
+
+ /**
+ * 获取${functionName}详情
+ *
+ * @author ${authorName}
+ * @date ${genTime}
+ **/
+ ${className} queryEntity(String id);
+}
diff --git a/snowy-plugin/snowy-plugin-gen/src/main/resources/backend/ServiceImpl.java.btl b/snowy-plugin/snowy-plugin-gen/src/main/resources/backend/ServiceImpl.java.btl
new file mode 100644
index 00000000..a60f75ad
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-gen/src/main/resources/backend/ServiceImpl.java.btl
@@ -0,0 +1,109 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package ${packageName}.${moduleName}.modular.${busName}.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollStreamUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import ${packageName}.common.enums.CommonSortOrderEnum;
+import ${packageName}.common.exception.CommonException;
+import ${packageName}.common.page.CommonPageRequest;
+import ${packageName}.${moduleName}.modular.${busName}.entity.${className};
+import ${packageName}.${moduleName}.modular.${busName}.mapper.${className}Mapper;
+import ${packageName}.${moduleName}.modular.${busName}.param.${className}AddParam;
+import ${packageName}.${moduleName}.modular.${busName}.param.${className}EditParam;
+import ${packageName}.${moduleName}.modular.${busName}.param.${className}IdParam;
+import ${packageName}.${moduleName}.modular.${busName}.param.${className}PageParam;
+import ${packageName}.${moduleName}.modular.${busName}.service.${className}Service;
+
+import java.util.List;
+
+/**
+ * ${functionName}Service接口实现类
+ *
+ * @author ${authorName}
+ * @date ${genTime}
+ **/
+@Service
+public class ${className}ServiceImpl extends ServiceImpl<${className}Mapper, ${className}> implements ${className}Service {
+
+ @Override
+ public Page<${className}> page(${className}PageParam ${classNameFirstLower}PageParam) {
+ QueryWrapper<${className}> queryWrapper = new QueryWrapper<>();
+ <% for(var i = 0; i < configList.~size; i++) { %>
+ <% if(configList[i].needPage) { %>
+ <% if(configList[i].effectType == 'datepicker') { %>
+ if(ObjectUtil.isNotEmpty(${classNameFirstLower}PageParam.getStart${configList[i].fieldNameCamelCaseFirstUpper}()) && ObjectUtil.isNotEmpty(${classNameFirstLower}PageParam.getEnd${configList[i].fieldNameCamelCaseFirstUpper}())) {
+ queryWrapper.lambda().between(${className}::get${configList[i].fieldNameCamelCaseFirstUpper}, ${classNameFirstLower}PageParam.getStart${configList[i].fieldNameCamelCaseFirstUpper}(), ${classNameFirstLower}PageParam.getEnd${configList[i].fieldNameCamelCaseFirstUpper}());
+ }
+ <% } else { %>
+ if(ObjectUtil.isNotEmpty(${classNameFirstLower}PageParam.get${configList[i].fieldNameCamelCaseFirstUpper}())) {
+ queryWrapper.lambda().${configList[i].needPageType}(${className}::get${configList[i].fieldNameCamelCaseFirstUpper}, ${classNameFirstLower}PageParam.get${configList[i].fieldNameCamelCaseFirstUpper}());
+ }
+ <% } %>
+ <% } %>
+ <% } %>
+ if(ObjectUtil.isAllNotEmpty(${classNameFirstLower}PageParam.getSortField(), ${classNameFirstLower}PageParam.getSortOrder())) {
+ CommonSortOrderEnum.validate(${classNameFirstLower}PageParam.getSortOrder());
+ queryWrapper.orderBy(true, ${classNameFirstLower}PageParam.getSortOrder().equals(CommonSortOrderEnum.ASC.getValue()),
+ StrUtil.toUnderlineCase(${classNameFirstLower}PageParam.getSortField()));
+ } else {
+ <% if(hasSortCodeField) { %>
+ queryWrapper.lambda().orderByAsc(${className}::getSortCode);
+ <% } else { %>
+ queryWrapper.lambda().orderByAsc(${className}::get${dbTableKeyFirstUpper});
+ <% } %>
+ }
+ return this.page(CommonPageRequest.defaultPage(), queryWrapper);
+ }
+
+ @Override
+ public void add(${className}AddParam ${classNameFirstLower}AddParam) {
+ ${className} ${classNameFirstLower} = BeanUtil.toBean(${classNameFirstLower}AddParam, ${className}.class);
+ this.save(${classNameFirstLower});
+ }
+
+ @Override
+ public void edit(${className}EditParam ${classNameFirstLower}EditParam) {
+ ${className} ${classNameFirstLower} = this.queryEntity(${classNameFirstLower}EditParam.getId());
+ BeanUtil.copyProperties(${classNameFirstLower}EditParam, ${classNameFirstLower});
+ this.updateById(${classNameFirstLower});
+ }
+
+ @Transactional(rollbackFor = Exception.class)
+ @Override
+ public void delete(List<${className}IdParam> ${classNameFirstLower}IdParamList) {
+ // 执行删除
+ this.removeBatchByIds(CollStreamUtil.toList(${classNameFirstLower}IdParamList, ${className}IdParam::getId));
+ }
+
+ @Override
+ public ${className} detail(${className}IdParam ${classNameFirstLower}IdParam) {
+ return this.queryEntity(${classNameFirstLower}IdParam.getId());
+ }
+
+ @Override
+ public ${className} queryEntity(String id) {
+ ${className} ${classNameFirstLower} = this.getById(id);
+ if(ObjectUtil.isEmpty(${classNameFirstLower})) {
+ throw new CommonException("${functionName}不存在,id值为:{}", id);
+ }
+ return ${classNameFirstLower};
+ }
+}
diff --git a/snowy-plugin/snowy-plugin-gen/src/main/resources/frontend/Api.js.btl b/snowy-plugin/snowy-plugin-gen/src/main/resources/frontend/Api.js.btl
new file mode 100644
index 00000000..f9d2826d
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-gen/src/main/resources/frontend/Api.js.btl
@@ -0,0 +1,32 @@
+import { baseRequest } from '@/utils/request'
+
+const request = (url, ...arg) => baseRequest(`/${moduleName}/${busName}/` + url, ...arg)
+
+/**
+ * ${functionName}Api接口管理器
+ *
+ * @author ${authorName}
+ * @date ${genTime}
+ **/
+export default {
+ // 获取${functionName}分页
+ ${classNameFirstLower}Page(data) {
+ return request('page', data, 'get')
+ },
+ // 获取${functionName}列表
+ ${classNameFirstLower}List(data) {
+ return request('list', data, 'get')
+ },
+ // 提交${functionName}表单 edit为true时为编辑,默认为新增
+ ${classNameFirstLower}SubmitForm(data, edit = false) {
+ return request(edit ? 'add' : 'edit', data)
+ },
+ // 删除${functionName}
+ ${classNameFirstLower}Delete(data) {
+ return request('delete', data)
+ },
+ // 获取${functionName}详情
+ ${classNameFirstLower}Detail(data) {
+ return request('detail', data, 'get')
+ }
+}
diff --git a/snowy-plugin/snowy-plugin-gen/src/main/resources/frontend/form.vue.btl b/snowy-plugin/snowy-plugin-gen/src/main/resources/frontend/form.vue.btl
new file mode 100644
index 00000000..4905e259
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-gen/src/main/resources/frontend/form.vue.btl
@@ -0,0 +1,175 @@
+
+
+
+ <% if(gridWhether) { %>
+
+ <% for(var i = 0; i < configList.~size; i++) { %>
+ <% if(!configList[i].needTableId && configList[i].whetherAddUpdate) { %>
+
+
+ <% if(configList[i].effectType == 'input') { %>
+
+ <% } else if (configList[i].effectType == 'textarea') {%>
+
+ <% } else if (configList[i].effectType == 'select') {%>
+
+ <% } else if (configList[i].effectType == 'radio') {%>
+
+ <% } else if (configList[i].effectType == 'checkbox') {%>
+
+ <% } else if (configList[i].effectType == 'datepicker') {%>
+
+ <% } else if (configList[i].effectType == 'timepicker') {%>
+
+ <% } else if (configList[i].effectType == 'inputNumber') {%>
+
+ <% } else if (configList[i].effectType == 'slider') {%>
+
+ <% } %>
+
+
+ <% } %>
+ <% } %>
+
+ <% } else { %>
+ <% for(var i = 0; i < configList.~size; i++) { %>
+ <% if(!configList[i].needTableId && configList[i].whetherAddUpdate) { %>
+
+ <% if(configList[i].effectType == 'input') { %>
+
+ <% } else if (configList[i].effectType == 'textarea') {%>
+
+ <% } else if (configList[i].effectType == 'select') {%>
+
+ <% } else if (configList[i].effectType == 'radio') {%>
+
+ <% } else if (configList[i].effectType == 'checkbox') {%>
+
+ <% } else if (configList[i].effectType == 'datepicker') {%>
+
+ <% } else if (configList[i].effectType == 'timepicker') {%>
+
+ <% } else if (configList[i].effectType == 'inputNumber') {%>
+
+ <% } else if (configList[i].effectType == 'slider') {%>
+
+ <% } %>
+
+ <% } %>
+ <% } %>
+ <% } %>
+
+
+ 关闭
+ 保存
+
+
+
+
+
diff --git a/snowy-plugin/snowy-plugin-gen/src/main/resources/frontend/index.vue.btl b/snowy-plugin/snowy-plugin-gen/src/main/resources/frontend/index.vue.btl
new file mode 100644
index 00000000..3adfbd36
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-gen/src/main/resources/frontend/index.vue.btl
@@ -0,0 +1,254 @@
+
+ <%
+ var searchCount = 0;
+ var row = 0;
+ %>
+ <% for(var i = 0; i < configList.~size; i++) { %>
+ <% if(!configList[i].needTableId && configList[i].needPage) { searchCount ++; }%>
+ <% } %>
+
+ <% if (searchCount > 0) { %>
+
+
+ <% for(var i = 0; i < configList.~size; i++) { %>
+ <% if(!configList[i].needTableId && configList[i].needPage) { row ++; %>
+ <% if(row <= 3) { %>
+
+ <% if(configList[i].effectType == 'input' || configList[i].effectType == 'textarea') { %>
+
+
+
+ <% } else if (configList[i].effectType == 'select' || configList[i].effectType == 'radio' || configList[i].effectType == 'checkbox') {%>
+
+
+
+ <% } else if (configList[i].effectType == 'inputNumber' || configList[i].effectType == 'slider') {%>
+
+
+
+ <% } else if (configList[i].effectType == 'datepicker') {%>
+
+
+
+ <% } else {%>
+
+
+
+ <% } %>
+
+ <% } else { %>
+
+
+ <% if(configList[i].effectType == 'input' || configList[i].effectType == 'textarea') { %>
+
+
+
+ <% } else if (configList[i].effectType == 'select' || configList[i].effectType == 'radio' || configList[i].effectType == 'checkbox') {%>
+
+
+
+ <% } else if (configList[i].effectType == 'inputNumber' || configList[i].effectType == 'slider') {%>
+
+
+
+ <% } else if (configList[i].effectType == 'datepicker') {%>
+
+
+
+ <% } else {%>
+
+
+
+ <% } %>
+
+
+ <% } %>
+ <% } %>
+ <% } %>
+
+ 查询
+ searchFormRef.resetFields()">重置
+ <% if(searchCount > 3) { %>
+
+ {{ advanced ? '收起' : '展开' }}
+
+
+ <% }%>
+
+
+
+ <% } %>
+
+ <% if(configList[i].needTableId) { %>
+ :row-key="(record) => record.${configList[i].fieldNameCamelCase}"
+ <% } %>
+ <% } %>
+ :tool-config="toolConfig"
+ :row-selection="options.rowSelection"
+ >
+
+
+
+
+ 新增
+
+ 删除
+
+
+
+ <% for(var i = 0; i < configList.~size; i++) { %>
+ <% if(!configList[i].needTableId && configList[i].whetherTable) { %>
+ <% if (configList[i].effectType == 'select' || configList[i].effectType == 'radio') { %>
+
+ {{ $TOOL.dictTypeData('${configList[i].dictTypeCode}', record.${configList[i].fieldNameCamelCase}) }}
+
+ <% } else if (configList[i].effectType == 'checkbox') { %>
+
+ {{ $TOOL.dictTypeData('${configList[i].dictTypeCode}', textValue) }}
+
+ <% } %>
+ <% } %>
+ <% } %>
+
+
+ 编辑
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
diff --git a/snowy-plugin/snowy-plugin-gen/src/main/resources/sqlend/Mysql.sql.btl b/snowy-plugin/snowy-plugin-gen/src/main/resources/sqlend/Mysql.sql.btl
new file mode 100644
index 00000000..7d920c9a
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-gen/src/main/resources/sqlend/Mysql.sql.btl
@@ -0,0 +1,14 @@
+/*
+ Source Server Type : MySQL
+ Date: ${genTime}
+*/
+
+INSERT INTO `SYS_RESOURCE` VALUES ('${menuId}', '${parentId}', '${functionName}管理', '${busName}', '${menuCode}', 'MENU', '${moduleId}', 'MENU', '${menuPath}', '${menuComponent}', NULL, NULL, 99, NULL, 'NOT_DELETE', NULL, NULL, NULL, NULL);
+
+INSERT INTO `SYS_RESOURCE` VALUES ('${addButtonId}', '${menuId}', '新增${functionName}', NULL, '${classNameFirstLower}Add', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, 1, NULL, 'NOT_DELETE', NULL, NULL, NULL, NULL);
+
+INSERT INTO `SYS_RESOURCE` VALUES ('${batchDeleteButtonId}', '${menuId}', '批量删除${functionName}', NULL, '${classNameFirstLower}BatchDelete', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, 'NOT_DELETE', NULL, NULL, NULL, NULL);
+
+INSERT INTO `SYS_RESOURCE` VALUES ('${editButtonId}', '${menuId}', '编辑${functionName}', NULL, '${classNameFirstLower}Edit', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, 3, NULL, 'NOT_DELETE', NULL, NULL, NULL, NULL);
+
+INSERT INTO `SYS_RESOURCE` VALUES ('${deleteButtonId}', '${menuId}', '删除${functionName}', NULL, '${classNameFirstLower}Delete', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, 4, NULL, 'NOT_DELETE', NULL, NULL, NULL, NULL);
diff --git a/snowy-plugin/snowy-plugin-gen/src/main/resources/sqlend/Oracle.sql.btl b/snowy-plugin/snowy-plugin-gen/src/main/resources/sqlend/Oracle.sql.btl
new file mode 100644
index 00000000..d588ab5f
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-gen/src/main/resources/sqlend/Oracle.sql.btl
@@ -0,0 +1,14 @@
+/*
+ Source Server Type: Oracle
+ Date: ${genTime}
+*/
+
+INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('${menuId}', '${parentId}', '${functionName}管理', '${busName}', '${menuCode}', 'MENU', '${moduleId}', 'MENU', '${menuPath}', '${menuComponent}', NULL, NULL, '99', NULL, 'NOT_DELETE', NULL, NULL, NULL, NULL);
+
+INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('${addButtonId}', '${menuId}', '新增${functionName}', NULL, '${classNameFirstLower}Add', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, '1', NULL, 'NOT_DELETE', NULL, NULL, NULL, NULL);
+
+INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('${batchDeleteButtonId}', '${menuId}', '批量删除${functionName}', NULL, '${classNameFirstLower}BatchDelete', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, '2', NULL, 'NOT_DELETE', NULL, NULL, NULL, NULL);
+
+INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('${editButtonId}', '${menuId}', '编辑${functionName}', NULL, '${classNameFirstLower}Edit', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, '3', NULL, 'NOT_DELETE', NULL, NULL, NULL, NULL);
+
+INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('${deleteButtonId}', '${menuId}', '删除${functionName}', NULL, '${classNameFirstLower}Delete', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, '4', NULL, 'NOT_DELETE', NULL, NULL, NULL, NULL);
diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/provider/SysButtonApiProvider.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/provider/SysButtonApiProvider.java
new file mode 100644
index 00000000..301cd8b2
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/provider/SysButtonApiProvider.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.sys.modular.resource.provider;
+
+import org.springframework.stereotype.Service;
+import vip.xiaonuo.sys.api.SysButtonApi;
+import vip.xiaonuo.sys.api.SysMenuApi;
+import vip.xiaonuo.sys.modular.resource.service.SysButtonService;
+import vip.xiaonuo.sys.modular.resource.service.SysMenuService;
+
+import javax.annotation.Resource;
+
+/**
+ * 按钮API接口实现类
+ *
+ * @author xuyuxiang
+ * @date 2022/11/1 13:50
+ **/
+@Service
+public class SysButtonApiProvider implements SysButtonApi {
+
+ @Resource
+ private SysButtonService sysButtonService;
+
+ @Override
+ public void addForGenButton(String menuId, String className, String functionName) {
+ sysButtonService.addForGenButton(menuId, className, functionName);
+ }
+}
diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/provider/SysMenuApiProvider.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/provider/SysMenuApiProvider.java
new file mode 100644
index 00000000..a8798951
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/provider/SysMenuApiProvider.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.sys.modular.resource.provider;
+
+import org.springframework.stereotype.Service;
+import vip.xiaonuo.sys.api.SysMenuApi;
+import vip.xiaonuo.sys.modular.resource.service.SysMenuService;
+
+import javax.annotation.Resource;
+
+/**
+ * 菜单API接口实现类
+ *
+ * @author xuyuxiang
+ * @date 2022/11/1 13:50
+ **/
+@Service
+public class SysMenuApiProvider implements SysMenuApi {
+
+ @Resource
+ private SysMenuService sysMenuService;
+
+ @Override
+ public String addForGenMenu(String parentId, String busName, String module, String title, String path) {
+ return sysMenuService.addForGenMenu(parentId, busName, title, module, path);
+ }
+}
diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/service/SysButtonService.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/service/SysButtonService.java
index 82bdfd3c..4a69b8e0 100644
--- a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/service/SysButtonService.java
+++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/service/SysButtonService.java
@@ -46,6 +46,15 @@ public interface SysButtonService extends IService {
*/
void add(SysButtonAddParam sysButtonAddParam);
+ /**
+ * 代码生成按钮插入
+ *
+ * @author xuyuxiang
+ * @date 2022/11/1 15:34
+ * @return java.lang.String
+ **/
+ void addForGenButton(String menuId, String className, String functionName);
+
/**
* 编辑按钮
*
diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/service/SysMenuService.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/service/SysMenuService.java
index 1aeb3b88..e9263a75 100644
--- a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/service/SysMenuService.java
+++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/service/SysMenuService.java
@@ -54,6 +54,14 @@ public interface SysMenuService extends IService {
*/
void add(SysMenuAddParam sysMenuAddParam);
+ /**
+ * 代码生成菜单插入
+ *
+ * @author xuyuxiang
+ * @date 2022/11/1 14:06
+ **/
+ String addForGenMenu(String parentId, String busName, String title, String module, String path);
+
/**
* 编辑菜单
*
diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/service/impl/SysButtonServiceImpl.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/service/impl/SysButtonServiceImpl.java
index d1ecac68..3c8c39a9 100644
--- a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/service/impl/SysButtonServiceImpl.java
+++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/service/impl/SysButtonServiceImpl.java
@@ -96,6 +96,21 @@ public class SysButtonServiceImpl extends ServiceImpl {
+ SysButtonAddParam sysButtonAddParam = new SysButtonAddParam();
+ BeanUtil.copyProperties(jsonObject, sysButtonAddParam);
+ sysButtonAddParam.setParentId(sysMenu.getId());
+ this.add(sysButtonAddParam);
+ });
+ }
+
@Override
public void edit(SysButtonEditParam sysButtonEditParam) {
SysButton sysButton = this.queryEntity(sysButtonEditParam.getId());
diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/service/impl/SysMenuServiceImpl.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/service/impl/SysMenuServiceImpl.java
index db960281..ef5b9a12 100644
--- a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/service/impl/SysMenuServiceImpl.java
+++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/service/impl/SysMenuServiceImpl.java
@@ -28,6 +28,7 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
import vip.xiaonuo.common.enums.CommonSortOrderEnum;
import vip.xiaonuo.common.exception.CommonException;
import vip.xiaonuo.common.page.CommonPageRequest;
@@ -125,6 +126,45 @@ public class SysMenuServiceImpl extends ServiceImpl impl
this.save(sysMenu);
}
+ @Transactional(rollbackFor = Exception.class)
+ @Override
+ public String addForGenMenu(String parentId, String busName, String title, String module, String path) {
+ // 参数校验
+ if(!parentId.equals("0")) {
+ SysMenu parentMenu = this.queryEntity(parentId);
+ if(ObjectUtil.isEmpty(parentMenu)) {
+ throw new CommonException("上级菜单不存在,id值为:{}", parentId);
+ }
+ if(!parentMenu.getModule().equals(module)) {
+ throw new CommonException("module与上级菜单不一致");
+ }
+ }
+ // 删除老菜单(同时删除其下面的菜单、按钮,清除对应的角色与资源信息
+ SysMenu sysOldMenu = this.getOne(new LambdaQueryWrapper().eq(SysMenu::getTitle, title)
+ .eq(SysMenu::getCategory, SysResourceCategoryEnum.MENU.getValue())
+ .eq(SysMenu::getMenuType, SysResourceMenuTypeEnum.MENU.getValue()).eq(SysMenu::getPath, path));
+ if(ObjectUtil.isNotEmpty(sysOldMenu)) {
+ SysMenuIdParam sysMenuIdParam = new SysMenuIdParam();
+ sysMenuIdParam.setId(sysOldMenu.getId());
+ this.delete(CollectionUtil.newArrayList(sysMenuIdParam));
+ }
+ // 插入新菜单
+ SysMenu sysMenu = new SysMenu();
+ sysMenu.setParentId(parentId);
+ sysMenu.setTitle(title);
+ sysMenu.setName(busName);
+ sysMenu.setCode(RandomUtil.randomString(10));
+ sysMenu.setCategory(SysResourceCategoryEnum.MENU.getValue());
+ sysMenu.setModule(module);
+ sysMenu.setMenuType(SysResourceMenuTypeEnum.MENU.getValue());
+ sysMenu.setPath(path);
+ sysMenu.setComponent(StrUtil.removePrefix(path, StrUtil.SLASH) + StrUtil.SLASH + "index");
+ sysMenu.setIcon("appstore-outlined");
+ sysMenu.setSortCode(99);
+ this.save(sysMenu);
+ return sysMenu.getId();
+ }
+
private void checkParam(SysMenuAddParam sysMenuAddParam) {
SysResourceMenuTypeEnum.validate(sysMenuAddParam.getMenuType());
if(SysResourceMenuTypeEnum.MENU.getValue().equals(sysMenuAddParam.getMenuType())) {
diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/provider/SysRoleApiProvider.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/provider/SysRoleApiProvider.java
index 4ea37ece..64a32b40 100644
--- a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/provider/SysRoleApiProvider.java
+++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/provider/SysRoleApiProvider.java
@@ -12,12 +12,26 @@
*/
package vip.xiaonuo.sys.modular.role.provider;
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
import vip.xiaonuo.sys.api.SysRoleApi;
+import vip.xiaonuo.sys.core.enums.SysBuildInEnum;
+import vip.xiaonuo.sys.modular.relation.entity.SysRelation;
+import vip.xiaonuo.sys.modular.relation.enums.SysRelationCategoryEnum;
+import vip.xiaonuo.sys.modular.relation.service.SysRelationService;
+import vip.xiaonuo.sys.modular.resource.entity.SysButton;
+import vip.xiaonuo.sys.modular.resource.entity.SysMenu;
+import vip.xiaonuo.sys.modular.resource.enums.SysResourceCategoryEnum;
+import vip.xiaonuo.sys.modular.resource.service.SysButtonService;
+import vip.xiaonuo.sys.modular.resource.service.SysMenuService;
import vip.xiaonuo.sys.modular.role.entity.SysRole;
+import vip.xiaonuo.sys.modular.role.enums.SysRoleCategoryEnum;
+import vip.xiaonuo.sys.modular.role.param.SysRoleGrantResourceParam;
import vip.xiaonuo.sys.modular.role.param.SysRoleSelectorRoleParam;
import vip.xiaonuo.sys.modular.role.service.SysRoleService;
@@ -37,6 +51,15 @@ public class SysRoleApiProvider implements SysRoleApi {
@Resource
private SysRoleService sysRoleService;
+ @Resource
+ private SysMenuService sysMenuService;
+
+ @Resource
+ private SysButtonService sysButtonService;
+
+ @Resource
+ private SysRelationService sysRelationService;
+
@Override
public boolean orgHasRole(List orgIdList) {
return sysRoleService.count(new LambdaQueryWrapper().in(SysRole::getOrgId, orgIdList)) > 0;
@@ -50,4 +73,34 @@ public class SysRoleApiProvider implements SysRoleApi {
sysRoleSelectorRoleParam.setSearchKey(searchKey);
return sysRoleService.roleSelector(sysRoleSelectorRoleParam).stream().map(JSONUtil::parseObj).collect(Collectors.toList());
}
+
+ @Transactional(rollbackFor = Exception.class)
+ @Override
+ public void grantForGenMenuAndButton(String menuId) {
+ String superAdminRoleId = sysRoleService.getOne(new LambdaQueryWrapper().eq(SysRole::getCode, SysBuildInEnum.BUILD_IN_ROLE_CODE.getValue())
+ .eq(SysRole::getCategory, SysRoleCategoryEnum.GLOBAL.getValue())).getId();
+ SysRoleGrantResourceParam sysRoleGrantResourceParam = new SysRoleGrantResourceParam();
+ sysRoleGrantResourceParam.setId(superAdminRoleId);
+ SysMenu sysMenu = sysMenuService.queryEntity(menuId);
+ SysRoleGrantResourceParam.SysRoleGrantResource sysRoleGrantResource = new SysRoleGrantResourceParam.SysRoleGrantResource();
+ sysRoleGrantResource.setMenuId(sysMenu.getId());
+ List buttonIdList = sysButtonService.list(new LambdaQueryWrapper().eq(SysButton::getParentId,
+ sysMenu.getId()).eq(SysButton::getCategory, SysResourceCategoryEnum.BUTTON.getValue())).stream()
+ .map(SysButton::getId).collect(Collectors.toList());
+ sysRoleGrantResource.setButtonInfo(buttonIdList);
+ sysRoleGrantResourceParam.setGrantInfoList(CollectionUtil.newArrayList(sysRoleGrantResource));
+
+ List menuIdList = sysRoleGrantResourceParam.getGrantInfoList().stream()
+ .map(SysRoleGrantResourceParam.SysRoleGrantResource::getMenuId).collect(Collectors.toList());
+ List extJsonList = sysRoleGrantResourceParam.getGrantInfoList().stream()
+ .map(JSONUtil::toJsonStr).collect(Collectors.toList());
+
+ List existMenuIdList = sysMenuService.list(new LambdaQueryWrapper().eq(SysMenu::getCategory,
+ SysResourceCategoryEnum.MENU.getValue())).stream().map(SysMenu::getId).collect(Collectors.toList());
+ if(ObjectUtil.isNotEmpty(existMenuIdList)) {
+ sysRelationService.remove(new LambdaQueryWrapper().eq(SysRelation::getObjectId, superAdminRoleId)
+ .eq(SysRelation::getCategory, SysRelationCategoryEnum.SYS_ROLE_HAS_RESOURCE.getValue()).notIn(SysRelation::getTargetId, existMenuIdList));
+ }
+ sysRelationService.saveRelationBatchWithAppend(superAdminRoleId, menuIdList, SysRelationCategoryEnum.SYS_ROLE_HAS_RESOURCE.getValue(), extJsonList);
+ }
}
diff --git a/snowy-web-app/pom.xml b/snowy-web-app/pom.xml
index 872814a0..0fe6a311 100644
--- a/snowy-web-app/pom.xml
+++ b/snowy-web-app/pom.xml
@@ -120,6 +120,13 @@
${project.parent.version}
+
+
+ vip.xiaonuo
+ snowy-plugin-gen
+ ${project.parent.version}
+
+
vip.xiaonuo