# 后端管理页面
### [Geeker-Admin](https://gitee.com/laramie/Geeker-Admin) ,在此特别感谢大佬!
# 接口测试
## 采用 [Apifox](https://www.apifox.cn/help/ide-plugin/idea-plugin/quickstart/installation/) + 规范注释 + IDEA插件,在此特别感谢[Apifox](https://www.apifox.cn/)团队!
一键生成接口文档,简直不要太好用!
# 项目简介
力求简单,好用,能够快速开发.
新的一年希望有新气象,所以项目名就叫znew.
# 数据库访问
基于mybatis,封装了一个通用实体类增删改查的工具类,也是本**项目特色**.
设计理念: 万能实体类的增删改查. 不考虑复杂sql,关联查询等,推荐用原生mybatis配置文件的方式.
## CommonDao使用
```java
/**
* CommonDao使用示例
* @author farkle
* @date 2023-01-13
*/
@Service
public class CommonDaoDemo {
@Resource
private CommonDao commonDao;
//主键查找
public SysDemo selectByPk(Long id){
return commonDao.selectByPk(SysDemo.class, id);
}
//查询所有数据
public List<SysDemo> select(){
return commonDao.select(SysDemo.class);
}
//查询一条数据,推荐
public SysDemo findByName(String name){
return commonDao.selectOne( SysDemo.builder().name(name).build() );
}
//查询一条数据2
public SysDemo findByName2(String name){
return commonDao.selectOneCond(Condition.create(SysDemo.class).put(SysDemo::getName, name));
}
//列表查询,推荐
public List<SysDemo> list(String name){
return commonDao.select( SysDemo.builder().name(name).build() );
}
//列表查询2
public List<SysDemo> list2(String name){
return commonDao.selectCond(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){
SysDemo cond = SysDemo.builder().name(name).build();
cond.setSortByField("id").setSortByWay(SortByWay.desc);
return commonDao.select(cond, pageNumber,pageSize);
}
//分页查询2
public List<SysDemo> listPage2(String name, Integer pageNumber, Integer pageSize){
return commonDao.selectCond(Condition.create(SysDemo.class).put(SysDemo::getName, name), pageNumber,pageSize);
}
//统计,推荐
public Long count(String name){
return commonDao.count( SysDemo.builder().name(name).build() );
}
//统计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){
SysDemo cond = SysDemo.builder().name(name).build();
cond.setSortByField("id").setSortByWay(SortByWay.desc);
PageResult<SysDemo> pageResult = commonDao.page(cond, 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, SysDemo.builder().gender(Gender.Male).build() );
}
//主键删除
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( SysDemo.builder().gender(Gender.Male).build() );
}
}
```
CommonService:通用增删改服务
```java
/**
* 通用服务
* @author farkle
* @date 2022-12-08
*/
public interface CommonService<T> {
List<T> listAll(Class<T> clazz);
List<T> list(T t);
List<T> list(T t, Integer pageNumber, Integer pageSize);
<T> T getOne(T t);
T getById(Class<T> clazz, Long id);
Long count(T t);
int save(T t);
int edit(T t);
int edit(T t, T cond);
int del(Class<T> clazz, Long id);
int dels(Class<T> clazz, List<Long> ids);
}
@Service("commonService")
public class CommonServiceImpl<T> implements CommonService<T> {
@Resource
private CommonDao commonDao;
public List<T> listAll(Class<T> clazz){
return commonDao.select(clazz);
}
public List<T> list(T t){
return commonDao.select(t);
}
public List<T> list(T t, Integer pageNumber, Integer pageSize){
return commonDao.select(t,pageNumber,pageSize);
}
public <T> T getOne(T t){
return commonDao.selectOne(t);
}
public T getById(Class<T> clazz, Long id){
return commonDao.selectByPk(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 edit(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
│ ├─ 微信授权登录,微信支付
│ ├─ 支付宝支付
│ ├─ 云存储 等
└─
```
# 后端管理页面权限控制
![image-20230113200504510](https://oscimg.oschina.net/oscnet/up-98dc0f77b993ff92d108d35109e6fcfb308.png)
**参考增删改demo, 注意:权限编码前端被屏蔽了,需要的去数据库查看**
**实现方式:基于spring security URL的权限控制, 实现请自行查看Authorization类.**
**权限编码规则: 请求方法/请求url, 支