第九章 云平台开发
第九章 云平台开发
创建时间: 2025年4月25日 18:35
状态: Done
前言
本笔记主要用途是学习up 主程序员鱼皮的项目:代码生成器时的一些学习心得。
代码地址:https://github.com/Liucc-123/yuzi-generator.git
项目教程:https://www.codefather.cn/course/1790980795074654209
上一章节:https://editor.csdn.net/md/?articleId=148012518
本节重点
本章节属于项目的第三阶段 — 开发在线代码生成器平台
重点内容有:
- 需求分析
- 线上化实现流程
- 数据库表设计
- 后端开发
- 前端页面开发
一、需求分析
经过前两个阶段本地项目的开发,绝大多数的业务逻辑已经完成,现在我们实现项目的上线,让代码生成器具备可视化能力,优化用户使用代码生成器的交互体验。
首先要思考,我们对哪些内容进行线上化?让用户线上使用哪些能力?
主要有2个方面:
1)数据线上化
- 元信息线上化,将元信息配置文件里的内容持久化到数据库
- 项目模板线上化,将静态文件和动态模板文件持久化到对象存储服务
- 代码生成器线上化,将代码生成器产物包保存到对象存储服务
2)功能线上化
- 在线查看生成器信息
- 在线使用生成器
- 在线使用生成器制作工具
总结来说,我们要开发的在线代码生成平台,要能够支持用户在线搜索、使用、制作和分享各类代码生成器,帮助开发者提高定制化开发效率。
要开发的功能如下:
- 用户注册、登录
- 管理员功能:用户管理、代码生成器管理(增删改查)
- 代码生成器搜索
- 代码生成器详情查看
- 代码生成器创建
- 代码生成器下载
- 代码生成器在线使用
- 代码生成器在线制作
二、线上化实现流程
为了能够实现需求,首先梳理一下大致的实现流程:
1)先完成库表设计,让数据库能支持存储代码生成器信息
2)实现基本的用户注册登录、增删改查等功能,让用户能够浏览代码生成器信息
3)实现文件上传下载功能,让用户能够上传和下载代码生成器产物包
4)实现在线使用代码生成器功能,让用户直接在线生成代码
5)实现在线制作代码生成器功能,提高用户制作生成器效率
6)项目优化,包括性能优化、存储优化等
三、数据库表设计
设计库表有2处关键地方:
- 一定要结合自己的业务进行设计
- 多参考同类业务的库表设计(比如我要做电商系统,可以去GitHub上参考其他知名开源电商项目的库表是怎么设计的)
自己平时写的代码、项目一定要保存下来,多参考自己的项目也是一种大杀器!
用户表设计
-- 用户表
create table if not exists user
(id bigint auto_increment comment 'id' primary key,userAccount varchar(256) not null comment '账号',userPassword varchar(512) not null comment '密码',userName varchar(256) null comment '用户昵称',userAvatar varchar(1024) null comment '用户头像',userProfile varchar(512) null comment '用户简介',userRole varchar(256) default 'user' not null comment '用户角色:user/admin/ban',createTime datetime default CURRENT_TIMESTAMP not null comment '创建时间',updateTime datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间',isDelete tinyint default 0 not null comment '是否删除',index idx_userAccount (userAccount)
) comment '用户' collate = utf8mb4_unicode_ci;
模拟数据
INSERT INTO my_db.user (id, userAccount, userPassword, userName, userAvatar, userProfile, userRole) VALUES (1, 'yupi', 'b0dd3697a192885d7c055db46155b26a', '程序员鱼皮', 'https://gw.alipayobjects.com/zos/rmsportal/BiazfanxmamNRoxxVxka.png', '我有一头小毛驴我从来也不骑', 'admin');
INSERT INTO my_db.user (id, userAccount, userPassword, userName, userAvatar, userProfile, userRole) VALUES (2, 'yupi2', 'b0dd3697a192885d7c055db46155b26a', '普通鱼皮', 'https://gw.alipayobjects.com/zos/rmsportal/BiazfanxmamNRoxxVxka.png', '我有一头小毛驴我从来也不骑', 'user');
代码生成器表 设计
-- 代码生成器表
create table if not exists generator
(id bigint auto_increment comment 'id' primary key,name varchar(128) null comment '名称',description text null comment '描述',basePackage varchar(128) null comment '基础包',version varchar(128) null comment '版本',author varchar(128) null comment '作者',tags varchar(1024) null comment '标签列表(json 数组)',picture varchar(256) null comment '图片',fileConfig text null comment '文件配置(json字符串)',modelConfig text null comment '模型配置(json字符串)',distPath text null comment '代码生成器产物路径',status int default 0 not null comment '状态',userId bigint not null comment '创建用户 id',createTime datetime default CURRENT_TIMESTAMP not null comment '创建时间',updateTime datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间',isDelete tinyint default 0 not null comment '是否删除',index idx_userId (userId)
) comment '代码生成器' collate = utf8mb4_unicode_ci;
模拟数据
INSERT INTO my_db.generator (id, name, description, basePackage, version, author, tags, picture, fileConfig, modelConfig, distPath, status, userId) VALUES (1, 'ACM 模板项目', 'ACM 模板项目生成器', 'com.yupi', '1.0', '程序员鱼皮', '["Java"]', 'https://pic.yupi.icu/1/_r0_c1851-bf115939332e.jpg', '{}', '{}', null, 0, 1);
INSERT INTO my_db.generator (id, name, description, basePackage, version, author, tags, picture, fileConfig, modelConfig, distPath, status, userId) VALUES (2, 'Spring Boot 初始化模板', 'Spring Boot 初始化模板项目生成器', 'com.yupi', '1.0', '程序员鱼皮', '["Java"]', 'https://pic.yupi.icu/1/_r0_c0726-7e30f8db802a.jpg', '{}', '{}', null, 0, 1);
INSERT INTO my_db.generator (id, name, description, basePackage, version, author, tags, picture, fileConfig, modelConfig, distPath, status, userId) VALUES (3, '鱼皮外卖', '鱼皮外卖项目生成器', 'com.yupi', '1.0', '程序员鱼皮', '["Java", "前端"]', 'https://pic.yupi.icu/1/_r1_c0cf7-f8e4bd865b4b.jpg', '{}', '{}', null, 0, 1);
INSERT INTO my_db.generator (id, name, description, basePackage, version, author, tags, picture, fileConfig, modelConfig, distPath, status, userId) VALUES (4, '鱼皮用户中心', '鱼皮用户中心项目生成器', 'com.yupi', '1.0', '程序员鱼皮', '["Java", "前端"]', 'https://pic.yupi.icu/1/_r1_c1c15-79cdecf24aed.jpg', '{}', '{}', null, 0, 1);
INSERT INTO my_db.generator (id, name, description, basePackage, version, author, tags, picture, fileConfig, modelConfig, distPath, status, userId) VALUES (5, '鱼皮商城', '鱼皮商城项目生成器', 'com.yupi', '1.0', '程序员鱼皮', '["Java", "前端"]', 'https://pic.yupi.icu/1/_r1_c0709-8e80689ac1da.jpg', '{}', '{}', null, 0, 1);
四、后端开发
为了提高开发效率,我们这里直接使用之前准备好的SpringBoot万用模板
后端项目初始化
1、项目基础信息替换
模板拿到后,首先替换本项目的项目名称、包名等
1)替换项目名为 yuzi-generator-web-backend
:
2)包名替换:
-
文件夹名称替换
-
全局文件内容包名替换
3)修改application.yml
文件中,项目的启动端口号为 8120:
2、项目瘦身
从模板项目中移除本项目中用不到的功能和代码,包括:
- 微信公众号、公众号登录相关代码
- Elasticsearch 搜索
- Easy Excel 表格读写
- FreeMarker 模板引擎
- 所有的单元测试代码
- 帖子点赞和收藏功能
- 其他无用的工具类代码
初始化后的项目目录如下:
用户功能
由于项目模板已经提供了现成的用户注册、用户登录、用户管理、权限校验功能,我们不需要额外开发,只要根据我们的库表设计,移除掉 unionId 和 mpOpenId 字段即可。
注意使用全局搜索,把所有用到这些字段的代码均删除。
代码生成器功能
1、代码生成
实现idea的插件mybatisX插件根据数据库表生成对应的实体类、Mapper接口等代码文件。
在IDEA自带的数据库管理工具中,选中generator
表,右键选择mybatisX
插件
这里基础包我们就默认选择generator,将插件生成的代码都放到这个新的包包中,万一出问题了,也不影响我们原有项目。检查之后,确认无误,再手动将代码文件移动到我们的项目之中即可!
最后,点击Finish
按钮,等待代码生成。
2、数据模型开发
1)修改Generator
实体类的isDelete
字段,给其添加@TableLogic注解,表明这是一个逻辑删除字段:
/*** 是否删除*/
@TableLogic
private Integer isDelete;
2)根据业务需求,添加实体类对应的增删改查请求包装类、响应包装类:
在请求、响应包装类中控制对应需要有哪些字段,目的是尽量确保交付给前端的字段是最精简的字段集合。
还要注意在响应包装类中对部分字段的转换,将json字符串转为对象,对象转json字符串等。
3、业务逻辑开发
数据模型开发完成之后,就可以开发业务逻辑了,主要包括service、controller相关文件。这里我们通过调整帖子相关文件进行实现。
可以直接复制模板中的 PostService 和 PostController,通过全局替换名称,快速完成基本的增删改查、搜索、返回包装类等功能。
4、测试
数据模型和业务模型准备完成后,就可以启动主启动类进行测试了:
打开本地接口文档地址(http://localhost:8120/api/doc.html)
五、前端页面开发
这里我主要关注后端开发实现,前端直接使用鱼皮的项目源码了。
代码地址:https://github.com/Liucc-123/yuzi-generator
六、测试使用
启动本地前后端服务,访问前端页面:
http://localhost:8000