查询构造器

v1.4.1
Parker 5 years ago
parent 459dafef79
commit 6432e6e31b

@ -25,7 +25,7 @@ import java.io.Serializable;
*/ */
@Data @Data
@ApiModel(value="视图层返回Api对象", @ApiModel(value="视图层返回Api对象",
description="视图层返回Api对象 success:成功状态 code:编号 msg:信息 datatime:时间戳") description="视图层返回Api对象 success:成功状态 code:编号 msg:信息 timestamp:时间戳 data:数据")
public class ResultVo<T> implements Serializable { public class ResultVo<T> implements Serializable {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;

@ -4,6 +4,10 @@ import io.swagger.annotations.ApiOperation;
import org.opsli.api.base.result.ResultVo; import org.opsli.api.base.result.ResultVo;
import org.opsli.api.wrapper.test.TestModel; import org.opsli.api.wrapper.test.TestModel;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
/** /**
@ -23,7 +27,6 @@ import org.springframework.web.bind.annotation.GetMapping;
public interface TestApi { public interface TestApi {
@ApiOperation(value = "发送邮件", notes = "发送邮件")
@GetMapping("/sendMail") @GetMapping("/sendMail")
ResultVo<?> sendMail(); ResultVo<?> sendMail();
@ -32,7 +35,6 @@ public interface TestApi {
* Redis * Redis
* @return * @return
*/ */
@ApiOperation(value = "发送 Redis 订阅消息", notes = "发送 Redis 订阅消息")
@GetMapping("/sendMsg") @GetMapping("/sendMsg")
ResultVo<?> sendMsg(); ResultVo<?> sendMsg();
@ -41,7 +43,6 @@ public interface TestApi {
* Redis * Redis
* @return * @return
*/ */
@ApiOperation(value = "发送 Redis 测试", notes = "发送 Redis 测试")
@GetMapping("/redisTest") @GetMapping("/redisTest")
ResultVo<?> redisTest(); ResultVo<?> redisTest();
@ -50,7 +51,6 @@ public interface TestApi {
* Redis * Redis
* @return * @return
*/ */
@ApiOperation(value = "发起 Redis 分布式锁", notes = "发起 Redis 分布式锁")
@GetMapping("/testLock") @GetMapping("/testLock")
ResultVo<?> testLock(); ResultVo<?> testLock();
@ -66,7 +66,6 @@ public interface TestApi {
* *
* @return * @return
*/ */
@ApiOperation(value = "修改数据", notes = "修改数据")
@GetMapping("/update") @GetMapping("/update")
ResultVo<TestModel> update(TestModel entity); ResultVo<TestModel> update(TestModel entity);
@ -75,7 +74,6 @@ public interface TestApi {
* *
* @return * @return
*/ */
@ApiOperation(value = "查看对象", notes = "查看对象")
@GetMapping("/get") @GetMapping("/get")
ResultVo<TestModel> get(TestModel entity); ResultVo<TestModel> get(TestModel entity);
@ -84,7 +82,6 @@ public interface TestApi {
* *
* @return * @return
*/ */
@ApiOperation(value = "删除对象", notes = "删除对象")
@GetMapping("/del") @GetMapping("/del")
ResultVo<?> del(String id); ResultVo<?> del(String id);
@ -93,9 +90,35 @@ public interface TestApi {
* *
* @return * @return
*/ */
@ApiOperation(value = "删除全部对象", notes = "删除全部对象")
@GetMapping("/delAll") @GetMapping("/delAll")
ResultVo<?> delAll(); ResultVo<?> delAll();
/**
*
* @return
*/
@GetMapping("/findList")
ResultVo<List<TestModel>> findList();
/**
*
* @return
*/
@GetMapping("/findAllList")
ResultVo<List<TestModel>> findAllList();
/**
*
* @return
*/
@GetMapping("/findPage")
ResultVo<?> findPage(
@RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
HttpServletRequest request
);
} }

@ -1,5 +1,6 @@
package org.opsli.api.wrapper.test; package org.opsli.api.wrapper.test;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import org.opsli.api.base.warpper.ApiWrapper; import org.opsli.api.base.warpper.ApiWrapper;
@ -11,6 +12,7 @@ import org.opsli.api.base.warpper.ApiWrapper;
* @CreateTime: 2020-09-16 17:33 * @CreateTime: 2020-09-16 17:33
* @Description: * @Description:
*/ */
@ApiModel(value="测试接口返回Model",description="测试接口返回Model")
@Data @Data
public class TestModel extends ApiWrapper { public class TestModel extends ApiWrapper {

@ -20,7 +20,8 @@ public final class MyBatisConstants {
public static final char LOGIC_NOT_DELETE_VALUE = public static final char LOGIC_NOT_DELETE_VALUE =
prop.getChar("mybatis-plus.global-config.db-config.logic-not-delete-value",'0'); prop.getChar("mybatis-plus.global-config.db-config.logic-not-delete-value",'0');
/** ID */
public static final String FIELD_ID = "id";
/** 创建人 */ /** 创建人 */
public static final String FIELD_CREATE_BY = "createBy"; public static final String FIELD_CREATE_BY = "createBy";
/** 更新时间 */ /** 更新时间 */
@ -33,6 +34,8 @@ public final class MyBatisConstants {
public static final String FIELD_DELETE_LOGIC = "deleted"; public static final String FIELD_DELETE_LOGIC = "deleted";
/** 乐观锁 */ /** 乐观锁 */
public static final String FIELD_OPTIMISTIC_LOCK = "version"; public static final String FIELD_OPTIMISTIC_LOCK = "version";
/** 多租户字段 */
public static final String FIELD_TENANT = "tenantId";
private MyBatisConstants(){} private MyBatisConstants(){}
} }

@ -0,0 +1,71 @@
package org.opsli.common.utils;
/**
* @BelongsProject: opsli-boot
* @BelongsPackage: org.opsli.common.utils
* @Author: Parker
* @CreateTime: 2020-09-19 23:21
* @Description:
*/
public final class HumpUtil {
private final static String UNDERLINE = "_";
private HumpUtil(){}
/***
* 线
*
* @param para
* 线
*/
public static String underlineToHump(String para) {
StringBuilder result = new StringBuilder();
String a[] = para.split(UNDERLINE);
for (String s : a) {
if (!para.contains(UNDERLINE)) {
result.append(s);
continue;
}
if (result.length() == 0) {
result.append(s.toLowerCase());
} else {
result.append(s.substring(0, 1).toUpperCase());
result.append(s.substring(1).toLowerCase());
}
}
return result.toString();
}
/***
* 线
*
* @param para
*
*/
public static String humpToUnderline(String para) {
StringBuilder sb = new StringBuilder(para);
int temp = 0;//定位
if (!para.contains(UNDERLINE)) {
for (int i = 0; i < para.length(); i++) {
if (Character.isUpperCase(para.charAt(i))) {
sb.insert(i + temp, UNDERLINE);
temp += 1;
}
}
}
return sb.toString().toLowerCase();
}
public static void main(String[] args) {
String aa = HumpUtil.humpToUnderline("tenantId");
String bb = HumpUtil.underlineToHump(aa);
System.out.println(aa);
System.out.println(bb);
}
}

@ -113,6 +113,17 @@ public class CacheDataAop {
return returnValue; return returnValue;
} }
// 删除状态判断
try {
Boolean ret = (Boolean) returnValue;
if(ret == null || !ret){
return returnValue;
}
}catch (Exception e){
log.error(e.getMessage(),e);
return returnValue;
}
// ====== 如果 使用了 EnableHotData ,表示开启热数据加载 则执行下段代码 // ====== 如果 使用了 EnableHotData ,表示开启热数据加载 则执行下段代码
List<CacheDataEntity> cacheDataEntityList = this.delHandlerData(point, args); List<CacheDataEntity> cacheDataEntityList = this.delHandlerData(point, args);
if(cacheDataEntityList == null || cacheDataEntityList.size() == 0){ if(cacheDataEntityList == null || cacheDataEntityList.size() == 0){

@ -1,6 +1,7 @@
package org.opsli.core.base.concroller; package org.opsli.core.base.concroller;
import cn.hutool.core.util.TypeUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.opsli.api.base.warpper.ApiWrapper; import org.opsli.api.base.warpper.ApiWrapper;
@ -17,7 +18,7 @@ import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type;
/** /**
* @BelongsProject: opsli-boot * @BelongsProject: opsli-boot
@ -38,8 +39,12 @@ public abstract class BaseRestController <E extends ApiWrapper, T extends BaseEn
/** Model Clazz 类 */ /** Model Clazz 类 */
protected Class<E> modelClazz; protected Class<E> modelClazz;
/** Model 泛型游标 */
private static final int modelIndex = 0;
/** Entity Clazz 类 */ /** Entity Clazz 类 */
protected Class<T> entityClazz; protected Class<T> entityClazz;
/** Entity 泛型游标 */
private static final int entityIndex = 1;
@Autowired(required = false) @Autowired(required = false)
protected S IService; protected S IService;
@ -69,6 +74,8 @@ public abstract class BaseRestController <E extends ApiWrapper, T extends BaseEn
if(model != null){ if(model != null){
// 如果开启缓存 将数据库查询对象 存如缓存 // 如果开启缓存 将数据库查询对象 存如缓存
if(hotDataFlag){ if(hotDataFlag){
// 这里会 同步更新到本地Ehcache 和 Redis缓存
// 如果其他服务器缓存也丢失了 则 回去Redis拉取
CacheUtil.put(id, model); CacheUtil.put(id, model);
} }
} }
@ -127,7 +134,11 @@ public abstract class BaseRestController <E extends ApiWrapper, T extends BaseEn
* @return * @return
*/ */
private Class<E> getModelClass(){ private Class<E> getModelClass(){
Class<E> tClass = (Class<E>)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0]; Class<E> tClass = null;
Type typeArgument = TypeUtil.getTypeArgument(getClass().getGenericSuperclass(), modelIndex);
if(typeArgument != null){
tClass = (Class<E>) typeArgument;
}
return tClass; return tClass;
} }
@ -136,7 +147,11 @@ public abstract class BaseRestController <E extends ApiWrapper, T extends BaseEn
* @return * @return
*/ */
private Class<T> getEntityClass(){ private Class<T> getEntityClass(){
Class<T> tClass = (Class<T>)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[1]; Class<T> tClass = null;
Type typeArgument = TypeUtil.getTypeArgument(getClass().getGenericSuperclass(), entityIndex);
if(typeArgument != null){
tClass = (Class<T>) typeArgument;
}
return tClass; return tClass;
} }

@ -1,6 +1,5 @@
package org.opsli.core.base.entity; package org.opsli.core.base.entity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
@ -35,4 +34,20 @@ public abstract class BaseEntity extends ApiWrapper {
**/ **/
/**
* ID 使
* tenant_id varchar 32
*
* Entity WrapperModel tenantId
*
*/
/**
private String tenantId;
*/
} }

@ -1,20 +1,27 @@
package org.opsli.core.base.service.impl; package org.opsli.core.base.service.impl;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.ReflectUtil;
import cn.hutool.core.util.TypeUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.github.pagehelper.PageInfo;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.opsli.api.base.warpper.ApiWrapper; import org.opsli.api.base.warpper.ApiWrapper;
import org.opsli.common.annotation.EnableHotData;
import org.opsli.common.constants.MyBatisConstants; import org.opsli.common.constants.MyBatisConstants;
import org.opsli.common.utils.HumpUtil;
import org.opsli.common.utils.WrapperUtil; import org.opsli.common.utils.WrapperUtil;
import org.opsli.core.base.entity.BaseEntity; import org.opsli.core.base.entity.BaseEntity;
import org.opsli.core.base.service.base.BaseService; import org.opsli.core.base.service.base.BaseService;
import org.opsli.core.base.service.interfaces.CrudServiceInterface; import org.opsli.core.base.service.interfaces.CrudServiceInterface;
import org.opsli.core.persistence.Page;
import org.opsli.core.utils.UserUtil;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
import java.lang.reflect.ParameterizedType; import java.lang.reflect.ParameterizedType;
import java.util.Arrays; import java.lang.reflect.Type;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
@ -31,21 +38,33 @@ import java.util.List;
* *
* save * save
* *
*
* ID ID
* page
*
*/ */
@Slf4j @Slf4j
public abstract class CrudServiceImpl<M extends BaseMapper<T>, E extends ApiWrapper, T extends BaseEntity> public abstract class CrudServiceImpl<M extends BaseMapper<T>, E extends ApiWrapper, T extends BaseEntity>
extends BaseService<M, T> implements CrudServiceInterface<E,T> { extends BaseService<M, T> implements CrudServiceInterface<E,T> {
/** entity Class 类 */
protected Class<T> entityClazz;
/** entity Class 类 */ /** Model Clazz 类 */
protected Class<E> modelClazz; protected Class<E> modelClazz;
/** Model 泛型游标 */
private static final int modelIndex = 1;
/** Entity Clazz 类 */
protected Class<T> entityClazz;
/** Entity 泛型游标 */
private static final int entityIndex = 2;
/** 多租户状态 */
protected boolean tenantFlag = false;
@Override @Override
public E get(String id) { public E get(String id) {
return transformT2M( return transformT2M(
baseMapper.selectById(id) super.getById(id)
); );
} }
@ -53,7 +72,7 @@ public abstract class CrudServiceImpl<M extends BaseMapper<T>, E extends ApiWrap
public E get(E model) { public E get(E model) {
if(model == null) return null; if(model == null) return null;
return transformT2M( return transformT2M(
baseMapper.selectById(model.getId()) super.getById(model.getId())
); );
} }
@ -61,8 +80,8 @@ public abstract class CrudServiceImpl<M extends BaseMapper<T>, E extends ApiWrap
public E insert(E model) { public E insert(E model) {
if(model == null) return null; if(model == null) return null;
T entity = transformM2T(model); T entity = transformM2T(model);
int count = baseMapper.insert(entity); boolean ret = super.save(entity);
if(count > 0){ if(ret){
return transformT2M(entity); return transformT2M(entity);
} }
return null; return null;
@ -72,44 +91,78 @@ public abstract class CrudServiceImpl<M extends BaseMapper<T>, E extends ApiWrap
public E update(E model) { public E update(E model) {
if(model == null) return null; if(model == null) return null;
T entity = transformM2T(model); T entity = transformM2T(model);
int count = baseMapper.updateById(entity); boolean ret = super.updateById(entity);
if(count > 0){ if(ret){
return transformT2M(entity); return transformT2M(entity);
} }
return null; return null;
} }
@Override @Override
public int delete(String id) { public boolean delete(String id) {
return baseMapper.deleteById(id); return super.removeById(id);
} }
@Override @Override
public int delete(E model) { public boolean delete(E model) {
if(model == null) return 0; if(model == null) return false;
return baseMapper.deleteById(model.getId()); return super.removeById(model.getId());
} }
@Override @Override
public int deleteAll(String[] ids) { public boolean deleteAll(String[] ids) {
if(ids == null) return 0; if(ids == null) return false;
List<String> idList = Arrays.asList(ids); List<String> idList = Convert.toList(String.class, ids);
return baseMapper.deleteBatchIds(idList); return super.removeByIds(idList);
} }
@Override @Override
public int deleteAll(Collection<E> models) { public boolean deleteAll(Collection<E> models) {
if(models == null || models.isEmpty()) return 0; if(models == null || models.isEmpty()) return false;
List<String> idList = Lists.newArrayListWithCapacity(models.size()); List<String> idList = Lists.newArrayListWithCapacity(models.size());
for (E entity : models) { for (E entity : models) {
idList.add(entity.getId()); idList.add(entity.getId());
} }
return baseMapper.deleteBatchIds(idList); return super.removeByIds(idList);
} }
@Override @Override
public List<E> findList(E model) { public List<T> findList(QueryWrapper<T> queryWrapper) {
return null; // 判断多租户
if(this.tenantFlag) {
String tenantId = UserUtil.getTenantId();
if (StringUtils.isNotEmpty(tenantId)) {
queryWrapper.eq(HumpUtil.humpToUnderline(MyBatisConstants.FIELD_TENANT), tenantId);
}
}
return super.list(queryWrapper);
}
@Override
public List<T> findAllList() {
QueryWrapper<T> queryWrapper = new QueryWrapper<>();
// 判断多租户
if(this.tenantFlag){
String tenantId = UserUtil.getTenantId();
if(StringUtils.isNotEmpty(tenantId)){
queryWrapper.eq(HumpUtil.humpToUnderline(MyBatisConstants.FIELD_TENANT), tenantId);
}
}
return super.list(queryWrapper);
}
@Override
public Page<E,T> findPage(Page<E,T> page) {
page.pageHelperBegin();
try{
List<T> list = this.findList(page.getQueryWrapper());
List<E> es = WrapperUtil.transformInstance(list, modelClazz);
PageInfo<E> pageInfo = new PageInfo<>(es);
page.instance(pageInfo);
} finally {
page.pageHelperEnd();
}
return page;
} }
// ======================== 对象转化 ======================== // ======================== 对象转化 ========================
@ -164,17 +217,24 @@ public abstract class CrudServiceImpl<M extends BaseMapper<T>, E extends ApiWrap
try { try {
this.modelClazz = this.getModelClass(); this.modelClazz = this.getModelClass();
this.entityClazz = this.getEntityClass(); this.entityClazz = this.getEntityClass();
// 多租户判断
this.tenantFlag = ReflectUtil.hasField(entityClazz, MyBatisConstants.FIELD_TENANT);
}catch (Exception e){ }catch (Exception e){
log.error(e.getMessage(),e); log.error(e.getMessage(),e);
} }
} }
/** /**
* Clazz * Clazz
* @return * @return
*/ */
private Class<E> getModelClass(){ private Class<E> getModelClass(){
Class<E> tClass = (Class<E>)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[1]; Class<E> tClass = null;
Type typeArgument = TypeUtil.getTypeArgument(getClass().getGenericSuperclass(), modelIndex);
if(typeArgument != null){
tClass = (Class<E>) typeArgument;
}
return tClass; return tClass;
} }
@ -183,7 +243,11 @@ public abstract class CrudServiceImpl<M extends BaseMapper<T>, E extends ApiWrap
* @return * @return
*/ */
private Class<T> getEntityClass(){ private Class<T> getEntityClass(){
Class<T> tClass = (Class<T>)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[2]; Class<T> tClass = null;
Type typeArgument = TypeUtil.getTypeArgument(getClass().getGenericSuperclass(), entityIndex);
if(typeArgument != null){
tClass = (Class<T>) typeArgument;
}
return tClass; return tClass;
} }

@ -2,7 +2,8 @@ package org.opsli.core.base.service.interfaces;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.opsli.core.persistence.Page;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
@ -26,16 +27,16 @@ public interface CrudServiceInterface<E,T> extends BaseServiceInterface<T> {
/** /**
* *
* *
* @param id * @param id ID
* @return * @return E
*/ */
E get(String id); E get(String id);
/** /**
* *
* *
* @param model * @param model model
* @return * @return E
*/ */
E get(E model); E get(E model);
@ -48,8 +49,8 @@ public interface CrudServiceInterface<E,T> extends BaseServiceInterface<T> {
* *
* *
* *
* @param model * @param model model
* @return * @return E
*/ */
E insert(E model); E insert(E model);
@ -61,8 +62,8 @@ public interface CrudServiceInterface<E,T> extends BaseServiceInterface<T> {
* *
* *
* *
* @param model * @param model model
* @return * @return E
*/ */
E update(E model); E update(E model);
@ -75,11 +76,10 @@ public interface CrudServiceInterface<E,T> extends BaseServiceInterface<T> {
* *
* *
* *
* @param id * @param id ID
* @return * @return boolean
* @see int delete(T entity)
*/ */
int delete(String id); boolean delete(String id);
/** /**
@ -90,10 +90,10 @@ public interface CrudServiceInterface<E,T> extends BaseServiceInterface<T> {
* *
* *
* *
* @param model * @param model
* @return * @return boolean
*/ */
int delete(E model); boolean delete(E model);
/** /**
@ -104,10 +104,10 @@ public interface CrudServiceInterface<E,T> extends BaseServiceInterface<T> {
* *
* *
* *
* @param ids * @param ids id
* @return * @return boolean
*/ */
int deleteAll(String[] ids); boolean deleteAll(String[] ids);
/** /**
* *
@ -117,27 +117,34 @@ public interface CrudServiceInterface<E,T> extends BaseServiceInterface<T> {
* *
* *
* *
* @param models * @param models
* @return * @return boolean
*/ */
int deleteAll(Collection<E> models); boolean deleteAll(Collection<E> models);
/** /**
* *
* *
* @param model * @param queryWrapper
* @return * @return List<E>
*/ */
List<E> findList(E model); List<T> findList(QueryWrapper<T> queryWrapper);
/**
*
*
* @return List<T>
*/
List<T> findAllList();
/** /**
* *
* *
* @return * @return Page<T>
* @see List<E> findAllList(T entity)
*/ */
//Page findPage(Page page, T t); Page<E,T> findPage(Page<E,T> page);
} }

@ -9,6 +9,7 @@ import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.SqlCommandType; import org.apache.ibatis.mapping.SqlCommandType;
import org.apache.ibatis.plugin.*; import org.apache.ibatis.plugin.*;
import org.opsli.common.constants.MyBatisConstants; import org.opsli.common.constants.MyBatisConstants;
import org.opsli.core.utils.UserUtil;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.lang.reflect.Field; import java.lang.reflect.Field;
@ -20,6 +21,12 @@ import java.util.*;
* *
* PSPlus * PSPlus
* *
* --
*
*
* findList
* SQL
*
* https://www.cnblogs.com/qingshan-tang/p/13299701.html * https://www.cnblogs.com/qingshan-tang/p/13299701.html
*/ */
@Component @Component
@ -100,6 +107,10 @@ public class AutoFillInterceptor implements Interceptor {
case MyBatisConstants.FIELD_DELETE_LOGIC: case MyBatisConstants.FIELD_DELETE_LOGIC:
setProperty(arg, MyBatisConstants.FIELD_DELETE_LOGIC, MyBatisConstants.LOGIC_NOT_DELETE_VALUE); setProperty(arg, MyBatisConstants.FIELD_DELETE_LOGIC, MyBatisConstants.LOGIC_NOT_DELETE_VALUE);
break; break;
// 多租户设置
case MyBatisConstants.FIELD_TENANT:
setProperty(arg, MyBatisConstants.FIELD_TENANT, UserUtil.getTenantId());
break;
default: default:
break; break;
} }

@ -0,0 +1,123 @@
package org.opsli.core.persistence;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.github.pagehelper.PageSerializable;
import java.util.HashMap;
import java.util.Map;
public class Page<E,T> extends PageSerializable<E>{
private int pageNo = 1;
private int pageSize = 10;
/** 查询条件构造器 */
private QueryWrapper<T> queryWrapper;
public Page(){
super();
}
/**
*
* @param pageNo
* @param pageSize
*/
public Page(int pageNo, int pageSize) {
super();
this.pageNo = pageNo;
this.pageSize = pageSize;
}
/**
*
* @param pageNo
* @param pageSize
* @param queryWrapper
*/
public Page(int pageNo, int pageSize, QueryWrapper<T> queryWrapper) {
super();
this.pageNo = pageNo;
this.pageSize = pageSize;
this.queryWrapper = queryWrapper;
}
/**
*
* @param pageNo
* @param pageSize
*/
public Page(int pageNo, int pageSize, String orderBy) {
super();
this.pageNo = pageNo;
this.pageSize = pageSize;
}
/**
*
*/
public void pageHelperBegin(){
PageHelper.startPage(this.pageNo,this.pageSize);
}
/**
*
*/
public void pageHelperEnd(){
PageHelper.clearPage();
}
/**
*
* @param pageInfo
*/
public void instance(PageInfo<E> pageInfo) {
super.setList(pageInfo.getList());
super.setTotal(pageInfo.getTotal());
}
/**
* bootstrap data
* @return map
*/
public Map<String, Object> getBootstrapData(){
Map<String, Object> map = new HashMap<>();
map.put("rows", this.getList());
map.put("total", this.getTotal());
return map;
}
// =======================================================
public int getPageNo() {
return pageNo;
}
public void setPageNo(int pageNo) {
this.pageNo = pageNo;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public QueryWrapper<T> getQueryWrapper() {
return queryWrapper;
}
public void setQueryWrapper(QueryWrapper<T> queryWrapper) {
this.queryWrapper = queryWrapper;
}
}

@ -0,0 +1,198 @@
package org.opsli.core.persistence;
import cn.hutool.core.util.ReflectUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.opsli.api.base.warpper.ApiWrapper;
import org.opsli.common.utils.HumpUtil;
import org.opsli.core.base.entity.BaseEntity;
import java.util.Map;
/**
* @BelongsProject: opsli-boot
* @BelongsPackage: org.opsli.core.persistence
* @Author: Parker
* @CreateTime: 2020-09-19 21:15
* @Description:
*
*
* eq
* like
* begin end
*
*/
@Slf4j
public class PageQueryBuilder<E extends ApiWrapper,T extends BaseEntity>{
// == 匹配条件 ==
/** 全值匹配 */
private static final String EQ = "EQ";
/** 模糊匹配 */
private static final String LIKE = "LIKE";
/** 日期匹配 */
private static final String BEGIN = "BEGIN";
private static final String END = "END";
/** 排序方式 */
private static final String ORDER = "ORDER";
private static final String ORDER_ASC = "ASC";
private static final String ORDER_DESC = "DESC";
/** 当前页 */
private Integer pageNo;
/** 每页数量 */
private Integer pageSize;
/** 参数 */
private Map<String, String[]> parameterMap;
/** Entity Clazz */
private Class<T> entityClazz;
/**
*
* @param entityClazz Entity clazz
* @param pageNo
* @param pageSize
* @param parameterMap request
*/
public PageQueryBuilder(Class<T> entityClazz, Integer pageNo, Integer pageSize, Map<String, String[]> parameterMap){
this.pageNo = pageNo;
this.pageSize = pageSize;
this.parameterMap = parameterMap;
this.entityClazz = entityClazz;
}
/**
* builderPage
* @return
*/
public Page<E,T> builderPage(){
Page<E,T> page = new Page<>(this.pageNo,this.pageSize);
QueryWrapper<T> queryWrapper = this.createQueryWrapper();
page.setQueryWrapper(queryWrapper);
return page;
}
/**
*
* @return
*/
private QueryWrapper<T> createQueryWrapper(){
QueryWrapper<T> queryWrapper = new QueryWrapper<>();
if(this.parameterMap == null){
return queryWrapper;
}
for (Map.Entry<String, String[]> stringEntry : this.parameterMap.entrySet()) {
String keys = stringEntry.getKey();
String[] values = stringEntry.getValue();
// 非空检测
if(StringUtils.isEmpty(keys) || values == null || StringUtils.isEmpty(values[0])){
continue;
}
// 键 和 操作
String[] key_handle = keys.split("_");
if(key_handle.length < 2){
continue;
}
// 判断 字段是否合法
boolean hasField = this.validationField(key_handle);
if(hasField){
// 验证操作是否合法
boolean hasHandle = this.validationHandle(key_handle);
if(hasHandle){
// 操作
String handle = key_handle[1];
// 键
String key = key_handle[0];
// 处理值
String value = values[0];
// 赋值
this.handlerValue(queryWrapper, handle, key ,value);
}
}
}
return queryWrapper;
}
/**
*
* @param queryWrapper
* @param handle
* @param key
* @param value
* @return
*/
private void handlerValue(QueryWrapper<T> queryWrapper, String handle, String key, String value){
if(queryWrapper == null || StringUtils.isEmpty(handle)
|| StringUtils.isEmpty(key) || StringUtils.isEmpty(value)
){
return;
}
// 转换驼峰 为 数据库下划线字段
key = HumpUtil.humpToUnderline(key);
if (EQ.equals(handle)) {
// 全值匹配
queryWrapper.eq(key,value);
} else if (LIKE.equals(handle)) {
// 模糊匹配
queryWrapper.like(key,value);
} else if (BEGIN.equals(handle)) {
// 大于等于
queryWrapper.ge(key,value);
} else if (END.equals(handle)) {
// 小于等于
queryWrapper.le(key,value);
} else if (ORDER.equals(handle)) {
// 排序
if(ORDER_ASC.equals(value)){
queryWrapper.orderByAsc(key);
} else if(ORDER_DESC.equals(value)){
queryWrapper.orderByDesc(key);
} else{
queryWrapper.orderByAsc(key);
}
}
}
/**
*
* @param key_handle
* @return
*/
private boolean validationField(String[] key_handle){
if(entityClazz == null || key_handle == null || StringUtils.isEmpty(key_handle[0])){
return false;
}
// 判断当前传入参数 是否是Entity的字段
return ReflectUtil.hasField(entityClazz, key_handle[0]);
}
/**
*
* @param key_handle
* @return
*/
private boolean validationHandle(String[] key_handle){
if(key_handle == null || StringUtils.isEmpty(key_handle[1])){
return false;
}
String handle = key_handle[1];
if (EQ.equals(handle)) {
return true;
} else if (LIKE.equals(handle)) {
return true;
} else if (BEGIN.equals(handle)) {
return true;
} else if (END.equals(handle)) {
return true;
} else if (ORDER.equals(handle)) {
return true;
}
return false;
}
}

@ -0,0 +1,26 @@
package org.opsli.core.utils;
/**
* @BelongsProject: opsli-boot
* @BelongsPackage: org.opsli.core.utils
* @Author: Parker
* @CreateTime: 2020-09-19 20:03
* @Description:
*/
public final class UserUtil {
private UserUtil(){}
/**
* ID
* @return
*/
public static String getTenantId(){
// TODO 如果 没取到多租户ID 也按照默认值赋值 且不可删除默认多租户数据
// TODO 判断权限 如果是 admin 超级管理员 则租户ID清空 且findList 不做处理 否则默认都会做处理
// TODO 如果表中 没有 tenant_id 字段 则不进行多租户处理
return "a121321255";
}
}

@ -1,7 +1,7 @@
package org.opsli.modulars.test.entity; package org.opsli.modulars.test.entity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import org.opsli.core.base.entity.BaseEntity; import org.opsli.core.base.entity.BaseEntity;
/** /**
@ -12,12 +12,16 @@ import org.opsli.core.base.entity.BaseEntity;
* @Description: * @Description:
*/ */
@Data @Data
@EqualsAndHashCode(callSuper = false)
public class TestEntity extends BaseEntity { public class TestEntity extends BaseEntity {
@ApiModelProperty(value = "名称") /** 名称 */
private String name; private String name;
@ApiModelProperty(value = "备注") /** 备注 */
private String remark; private String remark;
/** 多租户字段 */
private String tenantId;
} }

@ -59,25 +59,25 @@ public class TestServiceImpl extends CrudServiceImpl<TestMapper, TestModel, Test
@Override @Override
@HotDataDel @HotDataDel
public int delete(String id) { public boolean delete(String id) {
return super.delete(id); return super.delete(id);
} }
@Override @Override
@HotDataDel @HotDataDel
public int delete(TestModel model) { public boolean delete(TestModel model) {
return super.delete(model); return super.delete(model);
} }
@Override @Override
@HotDataDel @HotDataDel
public int deleteAll(String[] ids) { public boolean deleteAll(String[] ids) {
return super.deleteAll(ids); return super.deleteAll(ids);
} }
@Override @Override
@HotDataDel @HotDataDel
public int deleteAll(Collection<TestModel> models) { public boolean deleteAll(Collection<TestModel> models) {
return super.deleteAll(models); return super.deleteAll(models);
} }

@ -1,15 +1,19 @@
package org.opsli.modulars.test.web; package org.opsli.modulars.test.web;
import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.thread.ThreadUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.opsli.api.base.result.ResultVo; import org.opsli.api.base.result.ResultVo;
import org.opsli.api.wrapper.test.TestModel; import org.opsli.api.wrapper.test.TestModel;
import org.opsli.api.web.test.TestApi; import org.opsli.api.web.test.TestApi;
import org.opsli.common.annotation.ApiRestController; import org.opsli.common.annotation.ApiRestController;
import org.opsli.common.utils.WrapperUtil;
import org.opsli.core.base.concroller.BaseRestController; import org.opsli.core.base.concroller.BaseRestController;
import org.opsli.core.cache.pushsub.enums.CacheType; import org.opsli.core.cache.pushsub.enums.CacheType;
import org.opsli.core.cache.pushsub.msgs.DictMsgFactory; import org.opsli.core.cache.pushsub.msgs.DictMsgFactory;
import org.opsli.core.persistence.Page;
import org.opsli.core.persistence.PageQueryBuilder;
import org.opsli.modulars.test.entity.TestEntity; import org.opsli.modulars.test.entity.TestEntity;
import org.opsli.modulars.test.service.ITestService; import org.opsli.modulars.test.service.ITestService;
import org.opsli.plugins.mail.MailPlugin; import org.opsli.plugins.mail.MailPlugin;
@ -20,6 +24,7 @@ import org.opsli.plugins.redis.lock.RedisLock;
import org.opsli.plugins.redis.pushsub.entity.BaseSubMessage; import org.opsli.plugins.redis.pushsub.entity.BaseSubMessage;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Random; import java.util.Random;
@ -227,5 +232,31 @@ public class TestRestRestController extends BaseRestController<TestModel, TestEn
return ResultVo.error("删除对象成功"); return ResultVo.error("删除对象成功");
} }
@ApiOperation(value = "查找一个集合", notes = "查找一个集合")
@Override
public ResultVo<List<TestModel>> findList() {
QueryWrapper<TestEntity> queryWrapper = new QueryWrapper<>();
List<TestEntity> list = IService.findList(queryWrapper);
List<TestModel> testModels = WrapperUtil.transformInstance(list, TestModel.class);
return ResultVo.success(testModels);
}
@ApiOperation(value = "查找全部数据", notes = "查找全部数据")
@Override
public ResultVo<List<TestModel>> findAllList() {
List<TestEntity> list = IService.findAllList();
List<TestModel> testModels = WrapperUtil.transformInstance(list, TestModel.class);
return ResultVo.success(testModels);
}
@ApiOperation(value = "查询分页", notes = "查询分页")
@Override
public ResultVo<?> findPage(Integer pageNo, Integer pageSize, HttpServletRequest request) {
PageQueryBuilder<TestModel,TestEntity> pageQueryBuilder = new PageQueryBuilder<>(
TestEntity.class, pageNo, pageSize, request.getParameterMap()
);
Page<TestModel, TestEntity> page = IService.findPage(pageQueryBuilder.builderPage());
return ResultVo.success(page.getBootstrapData());
}
} }

@ -146,6 +146,20 @@
<version>${mybatis-plus.version}</version> <version>${mybatis-plus.version}</version>
</dependency> </dependency>
<!-- page-helper 分页 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.3.0</version>
<!-- <exclusions>-->
<!-- &lt;!&ndash; 移除Mybatis plus中已有 &ndash;&gt;-->
<!-- <exclusion>-->
<!-- <groupId>org.mybatis.spring.boot</groupId>-->
<!-- <artifactId>mybatis-spring-boot-starter</artifactId>-->
<!-- </exclusion>-->
<!-- </exclusions>-->
</dependency>
<!-- druid --> <!-- druid -->
<dependency> <dependency>
<groupId>com.alibaba</groupId> <groupId>com.alibaba</groupId>

Loading…
Cancel
Save