znewadmin简单通用的springbootvue3管理后台
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 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 list(String name){ return commonDao.list(new SysDemo().setName(name)); } //列表查询2 public List list2(String name){ return commonDao.listCond(Condition.create(SysDemo.class).put(SysDemo::getName, name)); } /** * 分页查询,推荐 * 这里只是简单分页,面对复杂查询的分页推荐使用pagehelper * @param name * @param pageNumber * @param pageSize * @return */ public List 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 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 page(String name, Integer pageNumber, Integer pageSize){ PageResult 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 page2(String name, Integer pageNumber, Integer pageSize){ PageResult 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 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 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 { List list(T t); T detail(Class clazz, Long id); Long count(T t); int save(T t); int edit(T t); int update(T t, T cond); int del(Class clazz, Long id); int dels(Class clazz, List ids); } @Service public class CommonServiceImpl implements CommonService { @Autowired private CommonDao commonDao; public List list(T t){ return commonDao.list(t); } public T detail(Class 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 clazz, Long id){ return commonDao.deleteByPk(clazz, id); } public int dels(Class clazz, List 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 //每页数量 }项目截图
TODOCommonDao 更新多数据源,字段自动填充属性,更新策略等高级功能 升级至Springboot3 后台管理列表通用导入,导出功能 集成工作流 推出 spring cloud alibaba 微服务版本
gitee地址: znew-admin: 绠€鍗曢€氱敤鐨剆pringboot+vue3绠$悊鍚庡彴
谢逸枫不要恐惧!未来20年房地产依然是10万亿级支柱产业文谢逸枫目前中国房地产继续筑底探底,市场处于信心恢复的过程之中。2021年9月以来,已有超过300个省市出台了各类稳楼市政策,经过11个月的筑底探底,到6月市场有所升温,依然未完全
FIFA23能力值最高23人公布!姆巴佩梅西并列第一,C罗第六足球游戏FIFA系列最新版本FIFA23,官方宣布了该版本中能力值最高的23人名单!FIFA23能力值TOP23姆巴佩梅西并列第一,C罗第六这代FIFA能力值最高的球员总评也只有9
她们的名字她们的名字是由牟晓杰导演,秦海璐,金世佳,白冰,薇薇等主演的都市剧场。和三十而已欢乐颂二十不惑这种题材差不多都是以几个女性为主,讲述她们的生活,感情,工作中发生的故事。她们的名字这
2022年9月13日新闻简报,工作愉快正文共806字预计阅读时间3分钟码字不易,如果有用,请记得支持点赞关注转发!美好的一天,从读报开始,9月13日,壬寅年八月十八,星期二,工作愉快,幸福生活1魅族科技部分机型无法参与
为啥我不配置红利策略?(周报161期)文望京博格(转载请注明出处)2015年市场突破5000点的时候,投资者都会感叹一句如果市场再给我一次3000点以下的机会,我一定满仓!2022年市场在3000点左右持续震荡的时候,
惠州代建项目检查中科院总部区地下停车场项目被通报近期,惠州市代建项目管理局在官网发布代建项目2022年第二季度大检查情况通报,惠州市建设集团建筑工程有限公司承建市金山湖公园水上项目活动与训练基地项目,广东永木建设有限公司负责承建
不求全,不停滞,就会坚韧且成长幸福是每个人自我的感受,所以差异性大。幸福绝对不是没有不幸福,这句话让我醍醐灌顶,也是不求全的萌芽。还好,接纳内化这个观念已经有十几年了。十几年前,我已过了不惑之年,依旧有许多惑。
TCL发布Tab10二合一平板电脑,搭载我国联发科芯片,支持5G网络就在本年度的8月末,TCL发布了TCLTab10平板电脑,这是一款二合一类型的平板电脑,除了是平板电脑外,还可以连接到键盘用来当作笔记本电脑来使用,这款平板电脑会给我们带来很多惊喜
吉林省有个俄罗斯村扫一扫,看视频视频剪辑中青报中青网记者王培莲这个暑期,前往吉林省舒兰市四合村南阳屯的游客络绎不绝。南阳屯的风景与周围其他乡村不同,这里是吉林省有名的俄罗斯村。屯子里一家名叫普希金庄
印度智能手表全球份额暴增347,超越中国成为第二大市场IT之家8月28日消息,根据CounterpointResearch最近发布的GlobalSmartwatchModelTracker,由于通货膨胀和地缘政治冲突等宏观不确定性,2
医疗器械蓝皮书我国医疗器械国际贸易现状及发展趋势原创孟冬平行业发展蓝皮书20220902编者按本文为医疗器械蓝皮书中国医疗器械行业发展报告(2022)报告B102021年我国医疗器械国际贸易现状及发展趋势部分节选。转载于此,供读