gitee位址: znew-admin: 绠€鍗曢€氱敤鐨剆pringboot+vue3绠$悊鍚庡彴
後端管理頁面
Geeker-Admin, 在此特别感謝大佬! Geeker-Admin: 鉁ㄢ湪鉁� Geeker Admin锛屽熀浜� Vue3.2銆乀ypeScript銆乂ite3銆丳inia銆丒lement-Plus 寮€婧愮殑涓€濂楀悗鍙扮鐞嗘鏋躲€�
接口測試
采用Apifox+ 規範注釋 + IDEA插件,在此特别感謝Apifox團隊! 安裝 | Apifox 使用文檔
一鍵生成接口文檔,簡直不要太好用!
項目簡介
力求簡單,好用,能夠快速開發. 新的一年希望有新氣象,是以項目名就叫znew.
資料庫通路
基于mybatis,封裝了一個通用實體類增删改查的工具類,也是本項目特色.
設計理念: 萬能實體類的增删改查. 不考慮複雜sql,關聯查詢等,推薦用原生mybatis配置檔案的方式.
CommonDao使用
/**
* CommonDao使用示例
* @author farkle
* @date 2023-01-13
*/
@Service
public class CommonDaoDemo {
@Autowired
private CommonDao commonDao;
//主鍵查找
public SysDemo findByPk(Long id){
return commonDao.findByPk(SysDemo.class, id);
}
//查詢所有資料
public List<SysDemo> findALl(){
return commonDao.findALl(SysDemo.class);
}
//查詢一條資料,推薦
public SysDemo findByName(String name){
return commonDao.findOne(new SysDemo().setName(name));
}
//查詢一條資料2
public SysDemo findByName2(String name){
return commonDao.findOneCond(Condition.create(SysDemo.class).put(SysDemo::getName, name));
}
//清單查詢,推薦
public List<SysDemo> list(String name){
return commonDao.list(new SysDemo().setName(name));
}
//清單查詢2
public List<SysDemo> list2(String name){
return commonDao.listCond(Condition.create(SysDemo.class).put(SysDemo::getName, name));
}
/**
* 分頁查詢,推薦
* 這裡隻是簡單分頁,面對複雜查詢的分頁推薦使用pagehelper
* @param name
* @param pageNumber
* @param pageSize
* @return
*/
public List<SysDemo> listPage(String name, Integer pageNumber, Integer pageSize){
return commonDao.list((SysDemo)new SysDemo().setName(name).setSortByField("id").setSortByWay(SortByWay.desc), pageNumber,pageSize);
}
//分頁查詢2
public List<SysDemo> listPage2(String name, Integer pageNumber, Integer pageSize){
return commonDao.listCond(Condition.create(SysDemo.class).put(SysDemo::getName, name), pageNumber,pageSize);
}
//統計,推薦
public Long count(String name){
return commonDao.count(new SysDemo().setName(name));
}
//統計2
public Long count2(String name){
return commonDao.countCond(Condition.create(SysDemo.class).put(SysDemo::getName, name));
}
//帶統計數量的分頁,推薦
public PageResult<SysDemo> page(String name, Integer pageNumber, Integer pageSize){
PageResult<SysDemo> pageResult = commonDao.page((SysDemo) new SysDemo().setName(name).setSortByField("id").setSortByWay(SortByWay.desc), pageNumber, pageSize);
System.out.println(pageResult.getTotal());
System.out.println(pageResult.getData());
return pageResult;
}
//帶統計數量的分頁2
public PageResult<SysDemo> page2(String name, Integer pageNumber, Integer pageSize){
PageResult<SysDemo> pageResult = commonDao.pageCond(Condition.create(SysDemo.class).put(SysDemo::getName, name), pageNumber,pageSize);
System.out.println(pageResult.getTotal());
System.out.println(pageResult.getData());
return pageResult;
}
//新增
public int insert(){
SysDemo sysDemo = new SysDemo();
sysDemo.setName("小明");
return commonDao.insert(sysDemo);
}
//批量新增
public int insertBatch(){
List<SysDemo> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
SysDemo sysDemo = new SysDemo();
sysDemo.setName("小明"+i);
list.add(sysDemo);
}
return commonDao.insertBatch(list);
}
//主鍵更新
public int updateByPk(Long id){
SysDemo sysDemo = new SysDemo();
sysDemo.setId(id);
sysDemo.setName("小明名稱變更");
return commonDao.updateByPk(sysDemo);
}
//updateAllField 根據主鍵根性所有字段
//條件更新
public int update(){
SysDemo update = new SysDemo();
update.setName("所有男的都叫小明");
return commonDao.update(update, new SysDemo().setGender(Gender.Male));
}
//主鍵删除
public int deleteByPk(Long id){
return commonDao.deleteByPk(SysDemo.class, id);
}
//主鍵批量删除
public int deleteBatch(List<Long> ids){
return commonDao.deleteBatch(SysDemo.class, ids);
}
//條件删除
public int delete(){
//删除所有男性
return commonDao.delete(new SysDemo().setGender(Gender.Male));
}
}
CommonService:通用增删改服務
/**
* 通用服務
* @author farkle
* @date 2022-12-08
*/
public interface CommonService<T> {
List<T> list(T t);
T detail(Class<T> clazz, Long id);
Long count(T t);
int save(T t);
int edit(T t);
int update(T t, T cond);
int del(Class<T> clazz, Long id);
int dels(Class<T> clazz, List<Long> ids);
}
@Service
public class CommonServiceImpl<T> implements CommonService<T> {
@Autowired
private CommonDao commonDao;
public List<T> list(T t){
return commonDao.list(t);
}
public T detail(Class<T> clazz, Long id){
return commonDao.findByPk(clazz, id);
}
public Long count(T t){
return commonDao.count(t);
}
public int save(T t){
return commonDao.insert(t);
}
public int edit(T t){
return commonDao.updateByPk(t);
}
public int update(T t, T cond){
return commonDao.update(t,cond);
}
public int del(Class<T> clazz, Long id){
return commonDao.deleteByPk(clazz, id);
}
public int dels(Class<T> clazz, List<Long> ids){
return commonDao.deleteBatch(clazz, ids);
}
}
znew多子產品架構
znew
├─ common # 通用工具支援
│ ├─ lombok, servlet-api
│ ├─ jackson, FastJson
│ ├─ commons-io, commons-lang3, httpclient
│ ├─ jjwt
├─ model # 通用業務實體類
├─ basesystem # 背景管理基礎内容以及公共服務
│ ├─ common
│ ├─ spring-boot-starter, spring-boot-starter-web
│ ├─ redis, validation, mybatis
│ ├─ freemarker(代碼生成器), Retrofit, swagger
├─ admin # 背景業務管理
│ ├─ basesystem, model, plugin
│ ├─ security, pagehelper
├─ api # app業務接口
│ ├─ basesystem, model, plugin
│ ├─ Freemarker(文章h5頁面)
├─ plugin # 通用第三方插件
│ ├─ common
│ ├─ 微信授權登入,微信支付
│ ├─ 支付寶支付
│ ├─ 雲存儲 等
└─
後端管理頁面權限控制
參考增删改demo, 注意:權限編碼和Controlelr是一一對應的,前端被屏蔽了,需要去資料庫檢視.實作方式自行檢視Authorization類.
代碼生成
生成代碼預覽
可拖拽排序的表單配置, 以及常用的表單字段類型
接口規範
請求方法
送出資料推薦用 POST 方法
擷取資料用 GET 方法
Response Headers(響應頭設定)
Content-Type: application/json;charset=utf-8
請求參數
POST請求 用@RequestBody 接收(json格式,請求頭設定:Content-Type: application/json;charset=UTF-8)
後端必須做參數校驗
文檔
請求參數,傳回實體 必須有對應的說明
特殊code 必須有對應的說明
狀态類型辨別的字段
推薦用枚舉,見名知意(看見對應的單詞就知道代表的狀态)
disable(禁用) enable(啟用)
辨別是否狀态的字段是推薦用1(是)0(否)辨別
接口變動
方案一:做檔案記錄對應的接口變動
方案二:接口加版版本區分
方案三:...
接口日志
建議做接口日志,友善排查問題
響應
1.後端不允許直接報錯給前端,必須經過錯誤處理,傳回code=0
2.傳回的json資料不允許出現 null 類型,如果是空類型請按下列傳回相應的"空資料"
空數組請傳回: []
空字元串請傳回: ""
空數值請傳回:0
金額格式: 兩位小數傳回,為空傳回 0
日期格式: 轉成對應的字元格式傳回,為空傳回 ""
3.不推薦用複雜的資料類型傳回(複雜類型,最多不超過3層)
列子(不推薦):
{
"name": "教師zyh",
"no": "教師001",
"student": {
"name": "學生zyh",
"no": "學生001"
}
}
錯誤傳回示例:
{
"name": "教師zyh",
"no": "教師001",
"student": null
}
推薦傳回:
{
"name": "教師zyh",
"no": "教師001",
"studentName": "學生zyh",
"studentNo": "學生001"
}
{
"name": "教師zyh",
"no": "教師001",
"studentName": "",
"studentNo": ""
}
标準成功相應格式
{
"code": 1,
"data":"",
"message": ""
}
标準失敗響應格式
{
"code": 0,
"data":"",
"message": ""
}
标準帶資料相應格式
字元資料
{
"code": 1,
"data": "",
"message": ""
}
對象資料
{
"code": 1,
"data": {},
"message": ""
}
數組資料
{
"code": 1,
"data": [],
"message": ""
}
帶有分頁資訊的資料,前端分頁參數固定接收 pageNumber(第幾頁,預設值1) pageSize(每頁數量,預設值10)
{
"code": 1,
"data": [],
"message": "",
"total": 0 //總條數
"pageNumber":1 //目前頁
"pageSize":10 //每頁數量
}
項目截圖
TODO
- CommonDao 更新多資料源,字段自動填充屬性,更新政策等進階功能
- 更新至Springboot3
- 背景管理清單通用導入,導出功能
- 內建工作流
- 推出 spring cloud alibaba 微服務版本
gitee位址: znew-admin: 绠€鍗曢€氱敤鐨剆pringboot+vue3绠$悊鍚庡彴