1.环境搭建
1.pom.xml引入依赖
<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
<version>2.8.2</version>
</dependency>
2.使用EasyCode生成crud
1.配置
2.service 引入正确的PageResult
3.ShareCircleController.java 全局替换ResponseEntity 为自己的响应类
2.圈子功能开发
1.新增圈子
1.Req和Vo
1.SaveShareCircleReq.java
package com.sunxiansheng.circle.api.req;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
@Getter
@Setter
public class SaveShareCircleReq implements Serializable {
private String circleName;
private String icon;
private Long parentId = -1L;
}
2.ShareCircleVO.java
package com.sunxiansheng.circle.api.vo;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
@Data
public class ShareCircleVO implements Serializable {
private Long id;
private String circleName;
private String icon;
private List<ShareCircleVO> children;
}
2.ShareCircleController.java
package com.sunxiansheng.circle.server.controller;
import com.alibaba.fastjson.JSON;
import com.google.common.base.Preconditions;
import com.sunxiansheng.circle.api.common.Result;
import com.sunxiansheng.circle.api.req.SaveShareCircleReq;
import com.sunxiansheng.circle.server.entity.po.ShareCircle;
import com.sunxiansheng.circle.server.service.ShareCircleService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.Objects;
@RestController
@RequestMapping("/share/circle")
@Slf4j
public class ShareCircleController {
@Resource
private ShareCircleService shareCircleService;
@PostMapping(value = "/save")
public Result<Boolean> save(@RequestBody SaveShareCircleReq req) {
try {
if (log.isInfoEnabled()) {
log.info("新增圈子入参{}", JSON.toJSONString(req));
}
Preconditions.checkArgument(Objects.nonNull(req), "参数不能为空!");
Preconditions.checkArgument(Objects.nonNull(req.getCircleName()), "圈子名称不能为空!");
Preconditions.checkArgument(Objects.nonNull(req.getIcon()), "圈子图标不能为空!");
if (req.getParentId() != -1) {
ShareCircle circle = shareCircleService.getById(req.getParentId());
Preconditions.checkArgument(Objects.nonNull(circle), "父级不存在!");
}
Boolean result = shareCircleService.saveCircle(req);
if (log.isInfoEnabled()) {
log.info("新增圈子{}", JSON.toJSONString(result));
}
return Result.ok(result);
} catch (IllegalArgumentException e) {
log.error("参数异常!错误原因{}", e.getMessage(), e);
return Result.fail(e.getMessage());
} catch (Exception e) {
log.error("新增圈子异常!错误原因{}", e.getMessage(), e);
return Result.fail("新增圈子异常!");
}
}
}
3.service
1.ShareCircleService.java
package com.sunxiansheng.circle.server.service;
import com.sunxiansheng.circle.api.req.SaveShareCircleReq;
import com.sunxiansheng.circle.server.entity.po.ShareCircle;
import com.sunxiansheng.practice.api.common.PageResult;
import java.util.List;
public interface ShareCircleService {
ShareCircle queryById(Long id);
PageResult<ShareCircle> queryByPage(ShareCircle shareCircle, Integer pageNo, Integer pageSize);
List<ShareCircle> queryAllByLimit(ShareCircle shareCircle);
ShareCircle insert(ShareCircle shareCircle);
ShareCircle update(ShareCircle shareCircle);
boolean deleteById(Long id);
ShareCircle getById(Long parentId);
Boolean saveCircle(SaveShareCircleReq req);
}
2.ShareCircleServiceImpl.java
package com.sunxiansheng.circle.server.service.impl;
import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import com.sunxiansheng.circle.api.req.SaveShareCircleReq;
import com.sunxiansheng.circle.api.vo.ShareCircleVO;
import com.sunxiansheng.circle.server.entity.po.ShareCircle;
import com.sunxiansheng.circle.server.mapper.ShareCircleMapper;
import com.sunxiansheng.circle.server.service.ShareCircleService;
import com.sunxiansheng.circle.server.util.LoginUtil;
import com.sunxiansheng.practice.api.common.PageResult;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.time.Duration;
import java.util.Date;
import java.util.List;
@Service("shareCircleService")
public class ShareCircleServiceImpl implements ShareCircleService {
@Resource
private ShareCircleMapper shareCircleMapper;
private static final Cache<Integer, List<ShareCircleVO>> CACHE = Caffeine.newBuilder()
.initialCapacity(1)
.maximumSize(1)
.expireAfterWrite(Duration.ofSeconds(30))
.build();
@Override
public ShareCircle queryById(Long id) {
return this.shareCircleMapper.queryById(id);
}
@Override
public PageResult<ShareCircle> queryByPage(ShareCircle shareCircle, Integer pageNo, Integer pageSize) {
return null;
}
@Override
public List<ShareCircle> queryAllByLimit(ShareCircle shareCircle) {
return this.shareCircleMapper.queryAllByLimit(shareCircle);
}
@Override
public ShareCircle insert(ShareCircle shareCircle) {
this.shareCircleMapper.insert(shareCircle);
return shareCircle;
}
@Override
public ShareCircle update(ShareCircle shareCircle) {
this.shareCircleMapper.update(shareCircle);
return this.queryById(shareCircle.getId());
}
@Override
public boolean deleteById(Long id) {
return this.shareCircleMapper.deleteById(id) > 0;
}
@Override
public ShareCircle getById(Long parentId) {
ShareCircle shareCircle = shareCircleMapper.queryById(parentId);
return shareCircle;
}
@Override
public Boolean saveCircle(SaveShareCircleReq req) {
String circleName = req.getCircleName();
String icon = req.getIcon();
Long parentId = req.getParentId();
ShareCircle shareCircle = new ShareCircle();
shareCircle.setCircleName(circleName);
shareCircle.setIcon(icon);
shareCircle.setParentId(parentId);
shareCircle.setIsDeleted(0);
shareCircle.setCreatedBy(LoginUtil.getLoginId());
shareCircle.setCreatedTime(new Date());
CACHE.invalidateAll();
int insert = shareCircleMapper.insert(shareCircle);
return insert > 0;
}
}
4.mapper
1.ShareCircleMapper.java
package com.sunxiansheng.circle.server.mapper;
import com.sunxiansheng.circle.server.entity.po.ShareCircle;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface ShareCircleMapper {
ShareCircle queryById(Long id);
List<ShareCircle> queryPage(@Param("po") ShareCircle shareCircle, @Param("offset") Integer offset, @Param("pageSize") Integer pageSize);
List<ShareCircle> queryAllByLimit(@Param("po") ShareCircle shareCircle);
long count(ShareCircle shareCircle);
int insert(ShareCircle shareCircle);
int insertBatch(@Param("entities") List<ShareCircle> entities);
int insertOrUpdateBatch(@Param("entities") List<ShareCircle> entities);
int update(ShareCircle shareCircle);
int deleteById(Long id);
}
2.ShareCircleMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sunxiansheng.circle.server.mapper.ShareCircleMapper">
<resultMap type="com.sunxiansheng.circle.server.entity.po.ShareCircle" id="ShareCircleMap">
<result property="id" column="id"/>
<result property="parentId" column="parent_id"/>
<result property="circleName" column="circle_name"/>
<result property="icon" column="icon"/>
<result property="createdBy" column="created_by"/>
<result property="createdTime" column="created_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
<result property="isDeleted" column="is_deleted"/>
</resultMap>
<select id="queryById" resultMap="ShareCircleMap">
select id, parent_id, circle_name, icon, created_by, created_time, update_by, update_time, is_deleted
from share_circle
where id = #{id}
and is_deleted = 0
</select>
<select id="queryPage" resultMap="ShareCircleMap">
select id, parent_id, circle_name, icon, created_by, created_time, update_by, update_time, is_deleted
from share_circle
<where>
<if test="po.id != null">
and id = #{po.id}
</if>
<if test="po.parentId != null">
and parent_id = #{po.parentId}
</if>
<if test="po.circleName != null and po.circleName != ''">
and circle_name = #{po.circleName}
</if>
<if test="po.icon != null and po.icon != ''">
and icon = #{po.icon}
</if>
<if test="po.createdBy != null and po.createdBy != ''">
and created_by = #{po.createdBy}
</if>
<if test="po.createdTime != null">
and created_time = #{po.createdTime}
</if>
<if test="po.updateBy != null and po.updateBy != ''">
and update_by = #{po.updateBy}
</if>
<if test="po.updateTime != null">
and update_time = #{po.updateTime}
</if>
<if test="po.isDeleted != null">
and is_deleted = #{po.isDeleted}
</if>
</where>
limit #{offset}, #{pageSize}
</select>
<select id="queryAllByLimit" resultMap="ShareCircleMap">
select id, parent_id, circle_name, icon, created_by, created_time, update_by, update_time, is_deleted
from share_circle
<where>
<if test="po.id != null">
and id = #{po.id}
</if>
<if test="po.parentId != null">
and parent_id = #{po.parentId}
</if>
<if test="po.circleName != null and po.circleName != ''">
and circle_name = #{po.circleName}
</if>
<if test="po.icon != null and po.icon != ''">
and icon = #{po.icon}
</if>
<if test="po.createdBy != null and po.createdBy != ''">
and created_by = #{po.createdBy}
</if>
<if test="po.createdTime != null">
and created_time = #{po.createdTime}
</if>
<if test="po.updateBy != null and po.updateBy != ''">
and update_by = #{po.updateBy}
</if>
<if test="po.updateTime != null">
and update_time = #{po.updateTime}
</if>
<if test="po.isDeleted != null">
and is_deleted = #{po.isDeleted}
</if>
</where>
</select>
<select id="count" resultType="java.lang.Long">
select count(1)
from share_circle
<where>
<if test="id != null">
and id = #{id}
</if>
<if test="parentId != null">
and parent_id = #{parentId}
</if>
<if test="circleName != null and circleName != ''">
and circle_name = #{circleName}
</if>
<if test="icon != null and icon != ''">
and icon = #{icon}
</if>
<if test="createdBy != null and createdBy != ''">
and created_by = #{createdBy}
</if>
<if test="createdTime != null">
and created_time = #{createdTime}
</if>
<if test="updateBy != null and updateBy != ''">
and update_by = #{updateBy}
</if>
<if test="updateTime != null">
and update_time = #{updateTime}
</if>
<if test="isDeleted != null">
and is_deleted = #{isDeleted}
</if>
</where>
</select>
<insert id="insert" keyProperty="id" useGeneratedKeys="true">
insert into share_circle(parent_id, circle_name, icon, created_by, created_time, update_by, update_time,
is_deleted)
values (#{parentId}, #{circleName}, #{icon}, #{createdBy}, #{createdTime}, #{updateBy}, #{updateTime},
#{isDeleted})
</insert>
<insert id="insertBatch" keyProperty="id" useGeneratedKeys="true">
insert into share_circle(parent_id, circle_name, icon, created_by, created_time, update_by, update_time,
is_deleted)
values
<foreach collection="entities" item="entity" separator=",">
<trim prefix="(" suffix=")" suffixOverrides=",">
<choose>
<when test="entity.parentId != null">
#{entity.parentId},
</when>
<otherwise>
NULL,
</otherwise>
</choose>
<choose>
<when test="entity.circleName != null">
#{entity.circleName},
</when>
<otherwise>
NULL,
</otherwise>
</choose>
<choose>
<when test="entity.icon != null">
#{entity.icon},
</when>
<otherwise>
NULL,
</otherwise>
</choose>
<choose>
<when test="entity.createdBy != null">
#{entity.createdBy},
</when>
<otherwise>
NULL,
</otherwise>
</choose>
<choose>
<when test="entity.createdTime != null">
#{entity.createdTime},
</when>
<otherwise>
NULL,
</otherwise>
</choose>
<choose>
<when test="entity.updateBy != null">
#{entity.updateBy},
</when>
<otherwise>
NULL,
</otherwise>
</choose>
<choose>
<when test="entity.updateTime != null">
#{entity.updateTime},
</when>
<otherwise>
NULL,
</otherwise>
</choose>
<choose>
<when test="entity.isDeleted != null">
#{entity.isDeleted},
</when>
<otherwise>
NULL,
</otherwise>
</choose>
</trim>
</foreach>
</insert>
<insert id="insertOrUpdateBatch" keyProperty="id" useGeneratedKeys="true">
insert into share_circle(id, parent_id, circle_name, icon, created_by, created_time, update_by, update_time,
is_deleted)
values
<foreach collection="entities" item="entity" separator=",">
(#{entity.id}, #{entity.parentId}, #{entity.circleName}, #{entity.icon}, #{entity.createdBy},
#{entity.createdTime}, #{entity.updateBy}, #{entity.updateTime}, #{entity.isDeleted})
</foreach>
on duplicate key update
parent_id = values(parent_id),
circle_name = values(circle_name),
icon = values(icon),
created_by = values(created_by),
created_time = values(created_time),
update_by = values(update_by),
update_time = values(update_time),
is_deleted = values(is_deleted)
</insert>
<update id="update">
update share_circle
<set>
<if test="parentId != null">
parent_id = #{parentId},
</if>
<if test="circleName != null and circleName != ''">
circle_name = #{circleName},
</if>
<if test="icon != null and icon != ''">
icon = #{icon},
</if>
<if test="createdBy != null and createdBy != ''">
created_by = #{createdBy},
</if>
<if test="createdTime != null">
created_time = #{createdTime},
</if>
<if test="updateBy != null and updateBy != ''">
update_by = #{updateBy},
</if>
<if test="updateTime != null">
update_time = #{updateTime},
</if>
<if test="isDeleted != null">
is_deleted = #{isDeleted},
</if>
</set>
where id = #{id}
</update>
<delete id="deleteById">
delete from share_circle where id = #{id}
</delete>
</mapper>
5.entity
1.ShareCircle.java
package com.sunxiansheng.circle.server.entity.po;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
@Data
@Accessors(chain = true)
public class ShareCircle implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private Long parentId;
private String circleName;
private String icon;
private String createdBy;
private Date createdTime;
private String updateBy;
private Date updateTime;
private Integer isDeleted;
}
6.测试
1.新增一个父级圈子
2.再新增两个子级圈子
2.更新圈子
1.UpdateShareCircleReq.java
package com.sunxiansheng.circle.api.req;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
@Getter
@Setter
public class UpdateShareCircleReq implements Serializable {
private Long id;
private String circleName;
private String icon;
private Long parentId;
}
2.ShareCircleController.java
@PostMapping(value = "/update")
public Result<Boolean> update(@RequestBody UpdateShareCircleReq req) {
try {
if (log.isInfoEnabled()) {
log.info("修改圈子入参{}", JSON.toJSONString(req));
}
Preconditions.checkArgument(Objects.nonNull(req), "参数不能为空!");
Preconditions.checkArgument(Objects.nonNull(req.getCircleName()), "圈子名称不能为空!");
if (Objects.nonNull(req.getParentId()) && req.getParentId() != -1) {
ShareCircle circle = shareCircleService.getById(req.getParentId());
Preconditions.checkArgument(Objects.nonNull(circle), "父级不存在!");
}
Boolean result = shareCircleService.updateCircle(req);
if (log.isInfoEnabled()) {
log.info("修改圈子{}", JSON.toJSONString(result));
}
return Result.ok(result);
} catch (IllegalArgumentException e) {
log.error("参数异常!错误原因{}", e.getMessage(), e);
return Result.fail(e.getMessage());
} catch (Exception e) {
log.error("修改圈子异常!错误原因{}", e.getMessage(), e);
return Result.fail("修改圈子异常!");
}
}
3.service
1.ShareCircleService.java
Boolean updateCircle(UpdateShareCircleReq req);
2.ShareCircleServiceImpl.java
@Override
public Boolean updateCircle(UpdateShareCircleReq req) {
Long id = req.getId();
String circleName = req.getCircleName();
String icon = req.getIcon();
Long parentId = req.getParentId();
ShareCircle shareCircle = new ShareCircle();
shareCircle.setId(id);
shareCircle.setParentId(parentId);
shareCircle.setCircleName(circleName);
shareCircle.setIcon(icon);
shareCircle.setUpdateTime(new Date());
shareCircle.setUpdateBy(LoginUtil.getLoginId());
int update = shareCircleMapper.update(shareCircle);
return update > 0;
}
4.mapper
1.ShareCircleMapper.xml
5.测试
3.删除圈子
1.RemoveShareCircleReq.java
package com.sunxiansheng.circle.api.req;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
@Getter
@Setter
public class RemoveShareCircleReq implements Serializable {
private Long id;
}
2.ShareCircleController.java
@PostMapping(value = "/remove")
public Result<Boolean> remove(@RequestBody RemoveShareCircleReq req) {
try {
if (log.isInfoEnabled()) {
log.info("删除圈子入参{}", JSON.toJSONString(req));
}
Preconditions.checkArgument(Objects.nonNull(req), "参数不能为空!");
Preconditions.checkArgument(Objects.nonNull(req.getId()), "圈子ID!");
Boolean result = shareCircleService.removeCircle(req);
if (log.isInfoEnabled()) {
log.info("删除圈子{}", JSON.toJSONString(result));
}
return Result.ok(result);
} catch (IllegalArgumentException e) {
log.error("参数异常!错误原因{}", e.getMessage(), e);
return Result.fail(e.getMessage());
} catch (Exception e) {
log.error("删除圈子异常!错误原因{}", e.getMessage(), e);
return Result.fail("删除圈子异常!");
}
}
3.service
1.ShareCircleService.java
Boolean removeCircle(RemoveShareCircleReq req);
2.ShareCircleServiceImpl.java
@Override
public Boolean removeCircle(RemoveShareCircleReq req) {
Long id = req.getId();
ShareCircle shareCircle = new ShareCircle();
shareCircle.setId(id)
.setIsDeleted(1);
int update = shareCircleMapper.update(shareCircle);
CACHE.invalidateAll();
return update > 0;
}
4.测试