Appearance
代码生成器
代码生成器可以根据数据库的表来生成对应的前后端代码。后端代码将提供基本的增删改查的 api 接口。本章将以项目管理为例,来带你通过代码生成器实现简单的项目增删改查的功能。
1、环境准备
- Mysql 5.7 或以上版本
- JDK 17 或以上版本
- Maven 3.9 或以上版本
- NodeJs 16.0或以上版本
- Yarn
2、构建数据库
使用 Navicate 或其他工具连接数据库,建立项目表。
sql
CREATE TABLE `project` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '项目ID',
`org_id` bigint(20) DEFAULT NULL COMMENT '公司ID',
`project_name` varchar(255) DEFAULT NULL COMMENT '项目名称',
`description` varchar(1024) DEFAULT NULL COMMENT '项目概况',
`location_province` varchar(100) DEFAULT NULL COMMENT '地址-省',
`location_city` varchar(100) DEFAULT NULL COMMENT '地址-市',
`location_area` varchar(100) DEFAULT NULL COMMENT '地址-区',
`location_detail` varchar(200) DEFAULT NULL COMMENT '详细地址',
`leader_id` bigint(20) DEFAULT NULL COMMENT '负责人(关联用户id)',
`status` enum('筹备','立项','在建','完工','停工') DEFAULT NULL COMMENT '项目状态,可选的值有:筹备、立项、在建、完工、停工',
`creator_id` bigint(20) DEFAULT NULL COMMENT '创建人编号',
`create_time` datetime DEFAULT NULL COMMENT '创建人编号\r\n',
`updator_id` bigint(20) DEFAULT NULL COMMENT '修改人编号',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
CREATE TABLE `project` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '项目ID',
`org_id` bigint(20) DEFAULT NULL COMMENT '公司ID',
`project_name` varchar(255) DEFAULT NULL COMMENT '项目名称',
`description` varchar(1024) DEFAULT NULL COMMENT '项目概况',
`location_province` varchar(100) DEFAULT NULL COMMENT '地址-省',
`location_city` varchar(100) DEFAULT NULL COMMENT '地址-市',
`location_area` varchar(100) DEFAULT NULL COMMENT '地址-区',
`location_detail` varchar(200) DEFAULT NULL COMMENT '详细地址',
`leader_id` bigint(20) DEFAULT NULL COMMENT '负责人(关联用户id)',
`status` enum('筹备','立项','在建','完工','停工') DEFAULT NULL COMMENT '项目状态,可选的值有:筹备、立项、在建、完工、停工',
`creator_id` bigint(20) DEFAULT NULL COMMENT '创建人编号',
`create_time` datetime DEFAULT NULL COMMENT '创建人编号\r\n',
`updator_id` bigint(20) DEFAULT NULL COMMENT '修改人编号',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
插入测试数据
sql
INSERT INTO `constru-intel`.project
(id, org_id, project_name, description, location_province, location_city, location_area, location_detail, leader_id, status, creator_id, create_time, updator_id, update_time)
VALUES(1, 1, '金桥大厦', '高级办公大楼建设', '上海', '上海市', '浦东新区', '张杨路88号', 1001, '在建', 101, '2023-10-31 02:51:43', 102, '2023-10-31 02:51:43');
INSERT INTO `constru-intel`.project
(id, org_id, project_name, description, location_province, location_city, location_area, location_detail, leader_id, status, creator_id, create_time, updator_id, update_time)
VALUES(2, 2, '绿地中心', '综合体商业项目', '江苏', '南京市', '鼓楼区', '中山北路123号', 1002, '立项', 103, '2023-10-31 02:51:47', 104, '2023-10-31 02:51:47');
INSERT INTO `constru-intel`.project
(id, org_id, project_name, description, location_province, location_city, location_area, location_detail, leader_id, status, creator_id, create_time, updator_id, update_time)
VALUES(3, 3, '太平湖度假酒店', '度假酒店及度假村', '安徽', '黄山市', '歙县', '太平湖景区', 1003, '完工', 105, '2023-10-31 02:51:53', 106, '2023-10-31 02:51:53');
INSERT INTO `constru-intel`.project
(id, org_id, project_name, description, location_province, location_city, location_area, location_detail, leader_id, status, creator_id, create_time, updator_id, update_time)
VALUES(4, 4, '南湖大桥', '连接南湖两岸的交通桥梁', '浙江', '嘉兴市', '南湖区', '南湖大道', 1004, '筹备', 107, '2023-10-31 02:51:56', 108, '2023-10-31 02:51:56');
INSERT INTO `constru-intel`.project
(id, org_id, project_name, description, location_province, location_city, location_area, location_detail, leader_id, status, creator_id, create_time, updator_id, update_time)
VALUES(5, 5, '中关村科技园', '高科技研发中心建设', '北京', '北京市', '海淀区', '中关村大街56号', 1005, '在建', 109, '2023-10-31 02:51:59', 110, '2023-10-31 02:51:59');
INSERT INTO `constru-intel`.project
(id, org_id, project_name, description, location_province, location_city, location_area, location_detail, leader_id, status, creator_id, create_time, updator_id, update_time)
VALUES(6, 6, '碧桂园住宅小区', '高档住宅小区建设', '广东', '广州市', '天河区', '珠江新城', 1006, '完工', 111, '2023-10-31 02:52:04', 112, '2023-10-31 02:52:04');
INSERT INTO `constru-intel`.project
(id, org_id, project_name, description, location_province, location_city, location_area, location_detail, leader_id, status, creator_id, create_time, updator_id, update_time)
VALUES(7, 7, '黄河大桥', '重要交通桥梁建设', '河南', '郑州市', '中原区', '黄河路', 1007, '立项', 113, '2023-10-31 02:52:06', 114, '2023-10-31 02:52:06');
INSERT INTO `constru-intel`.project
(id, org_id, project_name, description, location_province, location_city, location_area, location_detail, leader_id, status, creator_id, create_time, updator_id, update_time)
VALUES(8, 8, '青岛海景度假酒店', '沿海度假酒店项目', '山东', '青岛市', '市南区', '东海路', 1008, '筹备', 115, '2023-10-31 02:52:09', 116, '2023-10-31 02:52:09');
INSERT INTO `constru-intel`.project
(id, org_id, project_name, description, location_province, location_city, location_area, location_detail, leader_id, status, creator_id, create_time, updator_id, update_time)
VALUES(1, 1, '金桥大厦', '高级办公大楼建设', '上海', '上海市', '浦东新区', '张杨路88号', 1001, '在建', 101, '2023-10-31 02:51:43', 102, '2023-10-31 02:51:43');
INSERT INTO `constru-intel`.project
(id, org_id, project_name, description, location_province, location_city, location_area, location_detail, leader_id, status, creator_id, create_time, updator_id, update_time)
VALUES(2, 2, '绿地中心', '综合体商业项目', '江苏', '南京市', '鼓楼区', '中山北路123号', 1002, '立项', 103, '2023-10-31 02:51:47', 104, '2023-10-31 02:51:47');
INSERT INTO `constru-intel`.project
(id, org_id, project_name, description, location_province, location_city, location_area, location_detail, leader_id, status, creator_id, create_time, updator_id, update_time)
VALUES(3, 3, '太平湖度假酒店', '度假酒店及度假村', '安徽', '黄山市', '歙县', '太平湖景区', 1003, '完工', 105, '2023-10-31 02:51:53', 106, '2023-10-31 02:51:53');
INSERT INTO `constru-intel`.project
(id, org_id, project_name, description, location_province, location_city, location_area, location_detail, leader_id, status, creator_id, create_time, updator_id, update_time)
VALUES(4, 4, '南湖大桥', '连接南湖两岸的交通桥梁', '浙江', '嘉兴市', '南湖区', '南湖大道', 1004, '筹备', 107, '2023-10-31 02:51:56', 108, '2023-10-31 02:51:56');
INSERT INTO `constru-intel`.project
(id, org_id, project_name, description, location_province, location_city, location_area, location_detail, leader_id, status, creator_id, create_time, updator_id, update_time)
VALUES(5, 5, '中关村科技园', '高科技研发中心建设', '北京', '北京市', '海淀区', '中关村大街56号', 1005, '在建', 109, '2023-10-31 02:51:59', 110, '2023-10-31 02:51:59');
INSERT INTO `constru-intel`.project
(id, org_id, project_name, description, location_province, location_city, location_area, location_detail, leader_id, status, creator_id, create_time, updator_id, update_time)
VALUES(6, 6, '碧桂园住宅小区', '高档住宅小区建设', '广东', '广州市', '天河区', '珠江新城', 1006, '完工', 111, '2023-10-31 02:52:04', 112, '2023-10-31 02:52:04');
INSERT INTO `constru-intel`.project
(id, org_id, project_name, description, location_province, location_city, location_area, location_detail, leader_id, status, creator_id, create_time, updator_id, update_time)
VALUES(7, 7, '黄河大桥', '重要交通桥梁建设', '河南', '郑州市', '中原区', '黄河路', 1007, '立项', 113, '2023-10-31 02:52:06', 114, '2023-10-31 02:52:06');
INSERT INTO `constru-intel`.project
(id, org_id, project_name, description, location_province, location_city, location_area, location_detail, leader_id, status, creator_id, create_time, updator_id, update_time)
VALUES(8, 8, '青岛海景度假酒店', '沿海度假酒店项目', '山东', '青岛市', '市南区', '东海路', 1008, '筹备', 115, '2023-10-31 02:52:09', 116, '2023-10-31 02:52:09');
3、配置代码生成器
- 找到 xbase-code 模块中 resources 文件夹下的 conf/config_local.properties 文件。
- 在config_local.properties中填写正确的数据库连接信息和代码生成路径。
properties
#数据库连接信息
mysqlUrl=jdbc:mysql://127.0.0.1:3306/
mysqlDB=test
mysqlUrlParam=?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT&useSSL=false
mysqlUser=root
mysqlPassword=root
#代码生成路径
outDir=D:/gencode
#数据库连接信息
mysqlUrl=jdbc:mysql://127.0.0.1:3306/
mysqlDB=test
mysqlUrlParam=?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT&useSSL=false
mysqlUser=root
mysqlPassword=root
#代码生成路径
outDir=D:/gencode
- 在 xbase-code 模块中,找到 cn.xplaza.code.CodeGenMain 类,并在里面配置需要生成的表、包名。
java
public class CodeGenMain {
private static final Logger log = LoggerFactory.getLogger(CodeGenMain.class);
public static void main(String[] args) throws Exception {
/**
* 第一步,定义要生成的信息
* tableName,表名(实际表名)
* tableCN,表名中文名称
* modelName,模块名
*/
List<ModuleVo> moduleVoList = new ArrayList<>();
moduleVoList.add( new ModuleVo("project","项目", "project"));
/**
* 第二步,定义基础包
*/
String baseApiPackageName = "cn.xplaza.portal.api";
String baseServicePackageName = "cn.xplaza.service.db";
/**
* 第三步,运行mian方法
*/
CodeTheme.genTheme(moduleVoList,baseApiPackageName,baseServicePackageName);
}
}
public class CodeGenMain {
private static final Logger log = LoggerFactory.getLogger(CodeGenMain.class);
public static void main(String[] args) throws Exception {
/**
* 第一步,定义要生成的信息
* tableName,表名(实际表名)
* tableCN,表名中文名称
* modelName,模块名
*/
List<ModuleVo> moduleVoList = new ArrayList<>();
moduleVoList.add( new ModuleVo("project","项目", "project"));
/**
* 第二步,定义基础包
*/
String baseApiPackageName = "cn.xplaza.portal.api";
String baseServicePackageName = "cn.xplaza.service.db";
/**
* 第三步,运行mian方法
*/
CodeTheme.genTheme(moduleVoList,baseApiPackageName,baseServicePackageName);
}
}
- 运行 CodeGenMain 类中的 main 方法,生成代码。
- 在生成目录(在本例中,代码输出到了“D:/gencode”目录)中寻找已生成的代码。
4、后端代码
4.1、编写 xbase-service 层的代码
- 在生成的代码中找到 ProjectMapper.xml 文件,并复制到 xbase-service 模块下的mapper/project/ProjectMapper.xml。

- 在生成的代码中找到 db 文件夹,将文件夹中的内容复制到 cn.xplaza.service.db 包下。

4.2、编写 xbase-admin-api 层的代码
由于项目管理归属于管理端功能,因此把 api 接口放在 xbase-admin-api模块中。在生成的代码中找到 api 文件夹,然后将其中的文件复制到 cn.xplaza.admin.api 包下。
4.3、运行后端应用
找到 cn.xplaza.admin.XbaseAdminApiApplication 类,运行 main 方法,启动项目。
4.4、后端接口测试
调用接口需要经过鉴权拦截器。如果需要单独测试后端接口,要么携带秘钥,要么在 Controller 类上加上 @SaIgnore 注解(正式环境不可以这样做)。
下面我针对增删改查接口编写了一些curl命令,你可以直接在命令行中执行,或者导入到 apifox 中执行。
- 查询单个项目
powershell
curl --location --request GET "http://127.0.0.1:9001/api/project/view?id=3" ^
--header "User-Agent: Apifox/1.0.0 (https://apifox.com)" ^
--header "Accept: */*" ^
--header "Host: 90.1.0.140:19002" ^
--header "Connection: keep-alive"
curl --location --request GET "http://127.0.0.1:9001/api/project/view?id=3" ^
--header "User-Agent: Apifox/1.0.0 (https://apifox.com)" ^
--header "Accept: */*" ^
--header "Host: 90.1.0.140:19002" ^
--header "Connection: keep-alive"
{ "code": 200, "message": "查看项目成功", "log": "", "data": { "id": 3, "orgId": 3, "projectName": "太平湖度假酒店", "description": "度假酒店及度假村", "locationProvince": "安徽", "locationCity": "黄山市", "locationArea": "歙县", "locationDetail": "太平湖景区", "leaderId": 1003, "status": "完工", "creatorId": 105, "createTime": "2023-10-31 10:51:53", "updatorId": 106, "updateTime": "2023-10-31 10:51:53" }, "time": "2023-11-01 01:58:06" }
- 分页查询
powershell
curl --location --request GET "http://127.0.0.1:9001/api/project/list?pageNo=1" ^
--header "User-Agent: Apifox/1.0.0 (https://apifox.com)" ^
--header "Accept: */*" ^
--header "Host: 127.0.0.1:9001" ^
--header "Connection: keep-alive"
curl --location --request GET "http://127.0.0.1:9001/api/project/list?pageNo=1" ^
--header "User-Agent: Apifox/1.0.0 (https://apifox.com)" ^
--header "Accept: */*" ^
--header "Host: 127.0.0.1:9001" ^
--header "Connection: keep-alive"
- 修改项目
powershell
curl --location --request POST "http://127.0.0.1:9001/api/project/update" ^
--header "User-Agent: Apifox/1.0.0 (https://apifox.com)" ^
--header "Content-Type: application/json" ^
--header "Accept: */*" ^
--header "Host: 127.0.0.1:9001" ^
--header "Connection: keep-alive" ^
--data-raw "{ \"id\": 6, \"orgId\": 3, \"projectName\": \"豆豆酒店5\", \"description\": \"度假酒店及度假村\", \"locationProvince\": \"安徽\", \"locationCity\": \"黄山市\", \"locationArea\": \"歙县\", \"locationDetail\": \"太平湖景区\", \"leaderId\": 1003, \"status\": \"完工\", \"creatorId\": 105, \"createTime\": \"2023-10-31 10:51:53\", \"updatorId\": 106, \"updateTime\": \"2023-10-31 10:51:53\" }"
curl --location --request POST "http://127.0.0.1:9001/api/project/update" ^
--header "User-Agent: Apifox/1.0.0 (https://apifox.com)" ^
--header "Content-Type: application/json" ^
--header "Accept: */*" ^
--header "Host: 127.0.0.1:9001" ^
--header "Connection: keep-alive" ^
--data-raw "{ \"id\": 6, \"orgId\": 3, \"projectName\": \"豆豆酒店5\", \"description\": \"度假酒店及度假村\", \"locationProvince\": \"安徽\", \"locationCity\": \"黄山市\", \"locationArea\": \"歙县\", \"locationDetail\": \"太平湖景区\", \"leaderId\": 1003, \"status\": \"完工\", \"creatorId\": 105, \"createTime\": \"2023-10-31 10:51:53\", \"updatorId\": 106, \"updateTime\": \"2023-10-31 10:51:53\" }"
- 新增项目
powershell
curl --location --request POST "http://127.0.0.1:9001/api/project/add" ^
--header "User-Agent: Apifox/1.0.0 (https://apifox.com)" ^
--header "Content-Type: application/json" ^
--header "Accept: */*" ^
--header "Host: 127.0.0.1:9001" ^
--header "Connection: keep-alive" ^
--data-raw "{ \"orgId\": 3, \"projectName\": \"X酒店\", \"description\": \"度假酒店及度假村\", \"locationProvince\": \"安徽\", \"locationCity\": \"黄山市\", \"locationArea\": \"歙县\", \"locationDetail\": \"太平湖景区\", \"leaderId\": 1003, \"status\": \"完工\", \"creatorId\": 105, \"createTime\": \"2023-10-31 10:51:53\", \"updatorId\": 106, \"updateTime\": \"2023-10-31 10:51:53\"}"
curl --location --request POST "http://127.0.0.1:9001/api/project/add" ^
--header "User-Agent: Apifox/1.0.0 (https://apifox.com)" ^
--header "Content-Type: application/json" ^
--header "Accept: */*" ^
--header "Host: 127.0.0.1:9001" ^
--header "Connection: keep-alive" ^
--data-raw "{ \"orgId\": 3, \"projectName\": \"X酒店\", \"description\": \"度假酒店及度假村\", \"locationProvince\": \"安徽\", \"locationCity\": \"黄山市\", \"locationArea\": \"歙县\", \"locationDetail\": \"太平湖景区\", \"leaderId\": 1003, \"status\": \"完工\", \"creatorId\": 105, \"createTime\": \"2023-10-31 10:51:53\", \"updatorId\": 106, \"updateTime\": \"2023-10-31 10:51:53\"}"
- 删除项目
powershell
curl --location --request POST 'http://127.0.0.1:9001/api/project/delete?id=10' \
--header 'User-Agent: Apifox/1.0.0 (https://apifox.com)' \
--header 'Content-Type: application/json' \
--header 'Accept: */*' \
--header 'Host: 127.0.0.1:9001' \
--header 'Connection: keep-alive' \
--data-raw ''
curl --location --request POST 'http://127.0.0.1:9001/api/project/delete?id=10' \
--header 'User-Agent: Apifox/1.0.0 (https://apifox.com)' \
--header 'Content-Type: application/json' \
--header 'Accept: */*' \
--header 'Host: 127.0.0.1:9001' \
--header 'Connection: keep-alive' \
--data-raw ''
4.5、构建后端应用
进入项目根目录,执行命令。
shell
mvn clean package -DskipTests
mvn clean package -DskipTests
- xbase-api-admin 模块下的 target 目录中可以找到 xbase-api-admin.jar
- xbase-api-portal 模块下的 target 目录中可以找到 xbase-api-portal.jar
最后执行下面的命令来运行 jar 包。
shell
java -jar xbase-api-admin.jar
java -jar xbase-api-portal.jar
java -jar xbase-api-admin.jar
java -jar xbase-api-portal.jar
5、前端代码
前端代码分为两个端,xbase-web-admin和xbase-web-portal。请确保你的功能是在哪端,就把代码放到哪里。在开始之前,请确定已经使用 yarn install 命令装包,并后端已经启动。
5.1、编写代码
在代码生成目录中找到project文件夹,复制到前端的 src/biz/view 文件夹中。

5.2、配置路由
在 src 目录下找到 router.ts 文件,添加下面的配置。
json
{
path: '/project',
name: 'project',
redirect: '/project/list',
children: [
{
path: 'list',
name: 'projectList',
component: () => import('@/biz/view/project/List.vue')
},
]
}
{
path: '/project',
name: 'project',
redirect: '/project/list',
children: [
{
path: 'list',
name: 'projectList',
component: () => import('@/biz/view/project/List.vue')
},
]
}
5.3、配置服务器地址
在 src 目录下找到 vite.config.ts 文件,配置后端服务器地址。
5.4、运行前端应用
使用命令行进入前端代码的根目录,执行 yarn dev
,启动后端代码。然后访问 http://localhost:3000/project/list ,你将看到项目的增删改查页面。