Compare commits
5 Commits
Author | SHA1 | Date |
---|---|---|
whh | 34c06045d2 | 3 months ago |
whh | ba42035174 | 3 months ago |
whh | 23745b746b | 3 months ago |
whh | e588e8de6c | 3 months ago |
whh | 82773ba2eb | 3 months ago |
37 changed files with 1260 additions and 1 deletions
@ -1,3 +1,7 @@ |
|||
# excise-demo |
|||
|
|||
练习 |
|||
用户表没密码,统一成123456在逻辑中判断。 |
|||
用户新增时要指定好它对应的角色 |
|||
新建角色不需要指定他关联的用户 |
|||
删除用户或角色都要先删除他们对应的关联表。 |
|||
部门修改相当于部门改名字了,部门对应的用户原班人马应该不变。 |
@ -0,0 +1,12 @@ |
|||
package com.haihang; |
|||
|
|||
import org.springframework.boot.SpringApplication; |
|||
import org.springframework.boot.autoconfigure.SpringBootApplication; |
|||
|
|||
@SpringBootApplication |
|||
public class App { |
|||
public static void main(String[] args) { |
|||
SpringApplication.run(App.class, args); |
|||
|
|||
} |
|||
} |
@ -0,0 +1,31 @@ |
|||
package com.haihang.config; |
|||
|
|||
import com.haihang.utils.LoginInterceptor; |
|||
import org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration; |
|||
import org.springframework.cache.annotation.CacheConfig; |
|||
import org.springframework.context.annotation.Configuration; |
|||
import org.springframework.data.redis.core.StringRedisTemplate; |
|||
import org.springframework.web.servlet.config.annotation.InterceptorRegistry; |
|||
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; |
|||
|
|||
import javax.annotation.Resource; |
|||
|
|||
/** |
|||
* mvc配置 |
|||
* |
|||
* @author CHEN |
|||
* @date 2022/10/07 |
|||
*/ |
|||
@Configuration |
|||
public class MvcConfig implements WebMvcConfigurer { |
|||
@Resource |
|||
private StringRedisTemplate stringRedisTemplate; |
|||
|
|||
@Override |
|||
public void addInterceptors(InterceptorRegistry registry) { |
|||
//登陆拦截器
|
|||
registry |
|||
.addInterceptor(new LoginInterceptor(stringRedisTemplate)) |
|||
.excludePathPatterns("/user/login"); |
|||
} |
|||
} |
@ -0,0 +1,32 @@ |
|||
package com.haihang.config; |
|||
|
|||
import org.redisson.Redisson; |
|||
import org.redisson.api.RedissonClient; |
|||
import org.redisson.config.Config; |
|||
import org.springframework.beans.factory.annotation.Value; |
|||
import org.springframework.context.annotation.Bean; |
|||
import org.springframework.context.annotation.Configuration; |
|||
|
|||
/** |
|||
* redisson配置 |
|||
* |
|||
* @author CHEN |
|||
* @date 2022/10/10 |
|||
*/ |
|||
@Configuration |
|||
public class RedissonConfig { |
|||
@Value("${spring.redis.host}") |
|||
private String host; |
|||
@Value("${spring.redis.port}") |
|||
private String port; |
|||
|
|||
@Bean |
|||
public RedissonClient redissonClient(){ |
|||
//配置
|
|||
Config config=new Config(); |
|||
config.useSingleServer().setAddress("redis://"+host+":"+port); |
|||
//创建对并且返回
|
|||
return Redisson.create(config); |
|||
} |
|||
|
|||
} |
@ -0,0 +1,17 @@ |
|||
package com.haihang.config; |
|||
|
|||
import com.haihang.utils.Result; |
|||
import lombok.extern.slf4j.Slf4j; |
|||
import org.springframework.web.bind.annotation.ExceptionHandler; |
|||
import org.springframework.web.bind.annotation.RestControllerAdvice; |
|||
|
|||
@Slf4j |
|||
@RestControllerAdvice |
|||
public class WebExceptionAdvice { |
|||
|
|||
@ExceptionHandler(RuntimeException.class) |
|||
public Result handleRuntimeException(RuntimeException e) { |
|||
log.error(e.toString(), e); |
|||
return Result.fail("服务器异常:"+e.getMessage()); |
|||
} |
|||
} |
@ -0,0 +1,8 @@ |
|||
package com.haihang.constant; |
|||
|
|||
public class Constant { |
|||
|
|||
public static String LOGIN_COUNT_KEY = "login:count:";//登录次数
|
|||
public static String LOGIN_LOCK_KEY = "login:lock:";//1代表被锁定
|
|||
public static String LOGIN_USER_KEY = "login:token:"; |
|||
} |
@ -0,0 +1,55 @@ |
|||
package com.haihang.controller; |
|||
|
|||
|
|||
import com.haihang.entity.Case; |
|||
import com.haihang.entity.CasePageQueryDTO; |
|||
import com.haihang.entity.PageResult; |
|||
import com.haihang.service.CaseService; |
|||
import com.haihang.utils.Result; |
|||
import lombok.extern.slf4j.Slf4j; |
|||
import org.springframework.beans.factory.annotation.Autowired; |
|||
import org.springframework.web.bind.annotation.*; |
|||
|
|||
@Slf4j |
|||
@RestController |
|||
@RequestMapping("/case") |
|||
public class CaseController { |
|||
//用例相关接口
|
|||
|
|||
@Autowired |
|||
private CaseService caseService; |
|||
|
|||
@PostMapping("/add") |
|||
public Result add(@RequestBody Case _case){ |
|||
|
|||
return caseService.add(_case); |
|||
} |
|||
|
|||
|
|||
@DeleteMapping("/{id}") |
|||
public Result delete(@PathVariable int id){ |
|||
//根据id删除用例,删除一个用例他的子用例会一并全部删除
|
|||
return caseService.deleteWithSonById(id); |
|||
} |
|||
|
|||
@PutMapping("update") |
|||
public Result update(@RequestBody Case _case){ |
|||
//修改用例,只能修改用例名字和用例描述
|
|||
return caseService.update(_case); |
|||
} |
|||
|
|||
@GetMapping("/{id}") |
|||
public Result get(@PathVariable int id){ |
|||
//根据id查询用例信息接口
|
|||
return caseService.getById(id); |
|||
|
|||
} |
|||
|
|||
@GetMapping("/page") |
|||
public Result page(CasePageQueryDTO casePageQueryDTO){ |
|||
log.info("用例分页查询:{}",casePageQueryDTO); |
|||
PageResult pageResult = caseService.pageQuery(casePageQueryDTO); |
|||
return Result.ok(pageResult); |
|||
} |
|||
|
|||
} |
@ -0,0 +1,46 @@ |
|||
package com.haihang.controller; |
|||
|
|||
import com.haihang.service.ReportService; |
|||
import com.haihang.utils.Result; |
|||
import org.springframework.beans.factory.annotation.Autowired; |
|||
import org.springframework.format.annotation.DateTimeFormat; |
|||
import org.springframework.web.bind.annotation.GetMapping; |
|||
import org.springframework.web.bind.annotation.PathVariable; |
|||
import org.springframework.web.bind.annotation.RequestMapping; |
|||
import org.springframework.web.bind.annotation.RestController; |
|||
|
|||
import java.time.LocalDate; |
|||
import java.util.Date; |
|||
|
|||
@RequestMapping("/report") |
|||
@RestController |
|||
public class ReportController { |
|||
|
|||
@Autowired |
|||
private ReportService reportService; |
|||
|
|||
@GetMapping("/{id}") |
|||
public Result userCases(@PathVariable Integer id) { |
|||
//根据用户id统计用户创建的用例数量
|
|||
return reportService.userCases(id); |
|||
} |
|||
|
|||
@GetMapping("/dayCase") |
|||
public Result dayCase(@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate date) { |
|||
|
|||
return reportService.dayCase(date); |
|||
} |
|||
|
|||
@GetMapping("/beforeDayUserCase") |
|||
public Result beforeDayUserCase(@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate date,Integer userId) { |
|||
// 3. 统计到指定日期,每个用户的用例数
|
|||
return reportService.beforeDayUserCase(date,userId); |
|||
} |
|||
|
|||
@GetMapping("/userAndRole") |
|||
public Result userAndRole(Integer roleId) { |
|||
|
|||
|
|||
return reportService.countUserByRoleId(roleId); |
|||
} |
|||
} |
@ -0,0 +1,35 @@ |
|||
package com.haihang.controller; |
|||
|
|||
|
|||
import com.haihang.entity.Role; |
|||
import com.haihang.service.RoleService; |
|||
import com.haihang.utils.Result; |
|||
import org.apache.ibatis.annotations.Delete; |
|||
import org.springframework.beans.factory.annotation.Autowired; |
|||
import org.springframework.web.bind.annotation.*; |
|||
|
|||
@RestController |
|||
@RequestMapping("/role") |
|||
public class RoleController { |
|||
|
|||
@Autowired |
|||
private RoleService roleService; |
|||
|
|||
|
|||
@PutMapping("/add") |
|||
public Result add(Role role) { |
|||
return roleService.add(role); |
|||
|
|||
} |
|||
|
|||
|
|||
@Delete("/{id}") |
|||
public Result delete(@PathVariable Integer id) { |
|||
return roleService.delete(id); |
|||
} |
|||
@PutMapping("/update") |
|||
public Result update(@RequestBody Role role) { |
|||
return roleService.update(role); |
|||
} |
|||
|
|||
} |
@ -0,0 +1,60 @@ |
|||
package com.haihang.controller; |
|||
|
|||
import com.haihang.entity.User; |
|||
import com.haihang.entity.UserDTO; |
|||
import com.haihang.service.UserService; |
|||
import com.haihang.utils.Result; |
|||
import lombok.extern.slf4j.Slf4j; |
|||
import org.springframework.beans.factory.annotation.Autowired; |
|||
import org.springframework.web.bind.annotation.*; |
|||
|
|||
import javax.annotation.Resource; |
|||
|
|||
@Slf4j |
|||
@RequestMapping("/user") |
|||
@RestController |
|||
public class UserController { |
|||
|
|||
@Autowired |
|||
private UserService userService; |
|||
|
|||
/** |
|||
* 用户登录接口 |
|||
*/ |
|||
|
|||
@PostMapping("/login") |
|||
public Result login(@RequestBody User user) { |
|||
//接收一个用户登录名和用户的密码,因为数据库中没有密码字段,所以可以直接把密码存数据库里面。
|
|||
//因为没有注册接口,可以做一个缓存预热。提前存用户密码
|
|||
|
|||
return userService.login(user); |
|||
|
|||
} |
|||
|
|||
|
|||
@PutMapping("/add") |
|||
public Result add(@RequestBody UserDTO user) { |
|||
//新增用户
|
|||
log.info("新增用户:{}",user); |
|||
return userService.add(user); |
|||
} |
|||
|
|||
@DeleteMapping("/{id}") |
|||
public Result delete(@PathVariable("id") int id) { |
|||
log.info("删除用户的id:{}",id); |
|||
return userService.deleteUserById(id); |
|||
} |
|||
|
|||
@GetMapping("/{id}") |
|||
public Result getUserById(@PathVariable("id") int id) { |
|||
log.info("查询用户:{}",id); |
|||
return userService.selectUserById(id); |
|||
} |
|||
|
|||
@PutMapping("/updat") |
|||
public Result update(@RequestBody UserDTO userDTO) { |
|||
|
|||
return userService.update(userDTO); |
|||
} |
|||
|
|||
} |
@ -0,0 +1,24 @@ |
|||
package com.haihang.entity; |
|||
|
|||
import lombok.Data; |
|||
import org.apache.ibatis.annotations.Insert; |
|||
|
|||
import java.util.Date; |
|||
|
|||
//用例信息,与数据库完全相同
|
|||
@Data |
|||
public class Case { |
|||
|
|||
private int id; |
|||
private String caseName; |
|||
private int parentId; |
|||
private int isLeaf; |
|||
private int createUser; |
|||
private int updateUser; |
|||
private Date createTime; |
|||
private Date updateTime; |
|||
private String caseDesc;//用例描述
|
|||
|
|||
|
|||
|
|||
} |
@ -0,0 +1,14 @@ |
|||
package com.haihang.entity; |
|||
|
|||
|
|||
import lombok.Data; |
|||
|
|||
import java.io.Serializable; |
|||
|
|||
//用例分页查询DTO
|
|||
@Data |
|||
public class CasePageQueryDTO implements Serializable { |
|||
private String caseName; |
|||
private int page;//当前页码
|
|||
private int pageSize;//每页有多大?
|
|||
} |
@ -0,0 +1,21 @@ |
|||
package com.haihang.entity; |
|||
|
|||
|
|||
import lombok.AllArgsConstructor; |
|||
import lombok.Data; |
|||
import lombok.NoArgsConstructor; |
|||
|
|||
import java.util.List; |
|||
|
|||
//分页结果
|
|||
@Data |
|||
@NoArgsConstructor |
|||
public class PageResult { |
|||
private int total; |
|||
private List records; |
|||
|
|||
public PageResult(int total, List records) { |
|||
this.total = total; |
|||
this.records = records; |
|||
} |
|||
} |
@ -0,0 +1,16 @@ |
|||
package com.haihang.entity; |
|||
|
|||
import lombok.Data; |
|||
|
|||
import java.util.Date; |
|||
|
|||
@Data |
|||
public class Role { |
|||
|
|||
|
|||
private int id; |
|||
private String roleName; |
|||
private String roleCode; //英文代号
|
|||
private Date createTime; |
|||
private Date updateTime; |
|||
} |
@ -0,0 +1,16 @@ |
|||
package com.haihang.entity; |
|||
|
|||
import lombok.Data; |
|||
|
|||
import java.util.Date; |
|||
|
|||
@Data |
|||
public class User { |
|||
private int id;//id
|
|||
private String password; |
|||
private String loginName;//登录名
|
|||
private String userChnName;//用户中文名
|
|||
private Date createTime; |
|||
private Date updateTime; |
|||
} |
|||
|
@ -0,0 +1,9 @@ |
|||
package com.haihang.entity; |
|||
|
|||
import lombok.Data; |
|||
|
|||
@Data |
|||
public class UserCaseVO { |
|||
//用户用例大全
|
|||
|
|||
} |
@ -0,0 +1,18 @@ |
|||
package com.haihang.entity; |
|||
|
|||
import lombok.Data; |
|||
|
|||
import java.util.Date; |
|||
|
|||
@Data |
|||
public class UserDTO { |
|||
|
|||
|
|||
private int id;//id
|
|||
|
|||
|
|||
private String loginName;//登录名
|
|||
private String userChnName;//用户中文名
|
|||
|
|||
private int roleId;//前端传过来的角色id。新增用户时要指定他的角色是什么。
|
|||
} |
@ -0,0 +1,12 @@ |
|||
package com.haihang.entity; |
|||
|
|||
import lombok.Data; |
|||
|
|||
//用来存放token的用户简单信息
|
|||
@Data |
|||
public class UserInfo { |
|||
|
|||
private int id; |
|||
private String loginName; |
|||
private String UserChnName; |
|||
} |
@ -0,0 +1,47 @@ |
|||
package com.haihang.mapper; |
|||
|
|||
import com.github.pagehelper.Page; |
|||
import com.haihang.entity.Case; |
|||
import com.haihang.entity.CasePageQueryDTO; |
|||
import org.apache.ibatis.annotations.*; |
|||
|
|||
import java.time.LocalDate; |
|||
import java.util.List; |
|||
|
|||
@Mapper |
|||
public interface CaseMapper { |
|||
|
|||
@Select("select * from case_table where id = #{parentId}") |
|||
Case selectById(int parentId); |
|||
|
|||
@Insert("INSERT INTO `case_table`\n" + |
|||
"(id, case_name, parent_id, is_leaf, create_user, update_user, create_time, update_time, case_desc)\n" + |
|||
"VALUES(null, #{caseName}, #{parentId}, 1, #{createUser}, #{updateUser}, #{createTime}, #{updateTime}, #{caseDesc});") |
|||
void insert(Case aCase); |
|||
|
|||
@Update("update case_table set is_leaf = #{isLeaf},case_name = #{caseName},parent_id = #{parentId}" + |
|||
", update_user = #{updateUser},update_time = null ,case_desc=#{caseDesc} " + |
|||
"where id = #{id}") |
|||
void update(Case parentCase); |
|||
|
|||
|
|||
@Delete("delete from case_table where id = #{id}") |
|||
void deleteById(int id); |
|||
|
|||
@Select("select id from case_table where parent_id =#{id}") |
|||
List<Integer> selectByParentId(int id); |
|||
|
|||
@Update("update case_table set is_leaf = #{i} where id =#{parentId}") |
|||
void updateIsLeaf(int i, int parentId); |
|||
|
|||
Page<Case> pageQuery(CasePageQueryDTO casePageQueryDTO); |
|||
|
|||
@Select("select id from case_table where create_user =#{id}") |
|||
List<Integer> queryByUserId(int id); |
|||
|
|||
@Select("select id from case_table where DATE(create_time) = #{date}") |
|||
List<Integer> queryByDate(String date); |
|||
|
|||
|
|||
Integer queryBeforeDateByUser(LocalDate date, int userId); |
|||
} |
@ -0,0 +1,24 @@ |
|||
package com.haihang.mapper; |
|||
|
|||
import com.haihang.entity.Role; |
|||
import com.haihang.entity.User; |
|||
import org.apache.ibatis.annotations.*; |
|||
|
|||
@Mapper |
|||
public interface RoleMapper { |
|||
|
|||
@Insert("insert into user (ID, ROLE_NAME,ROLE_CODE,CREATE_TIME,UPDATE_TIME) values " + |
|||
" (null,#{roleName},#{roleCode},now(),now())") |
|||
void insertRole(Role role); |
|||
|
|||
|
|||
@Delete("delete from role where id=#{id}") |
|||
void deleteRoleById(int id); |
|||
|
|||
|
|||
@Select("select * from role where id=#{id}") |
|||
User getRoleById(int id); |
|||
|
|||
@Update("update role set ROLE_NAME = #{roleName},ROLE_CODE =#{roleCode} where ROLE_ID=#{id}") |
|||
void update(Role role); |
|||
} |
@ -0,0 +1,28 @@ |
|||
package com.haihang.mapper; |
|||
|
|||
import com.haihang.entity.User; |
|||
import com.haihang.entity.UserDTO; |
|||
import org.apache.ibatis.annotations.*; |
|||
|
|||
@Mapper |
|||
public interface UserMapper { |
|||
|
|||
@Select("select * from user where LOGIN_NAME = #{loginName}") |
|||
User getUserByLoginName(String loginName); |
|||
|
|||
@Insert("insert into user (ID, LOGIN_NAME,USER_CHN_NAME,CREATE_TIME,UPDATE_TIME) values " + |
|||
" (null,#{loginName},#{userChnName},now(),now())") |
|||
@Options(useGeneratedKeys = true, keyProperty = "id", flushCache = Options.FlushCachePolicy.TRUE) |
|||
void insertUser(User user); |
|||
|
|||
|
|||
@Delete("delete from user where id=#{id}") |
|||
void deleteUserById(int id); |
|||
|
|||
|
|||
@Select("select * from user where id=#{id}") |
|||
User getUserById(int id); |
|||
|
|||
@Update("update user set LOGIN_NAME = #{loginName},USER_CHN_NAME =#{userChnName} where id =#{id} ") |
|||
void updateUser(UserDTO userDTO); |
|||
} |
@ -0,0 +1,25 @@ |
|||
package com.haihang.mapper; |
|||
|
|||
import com.haihang.entity.UserDTO; |
|||
import org.apache.ibatis.annotations.*; |
|||
|
|||
@Mapper |
|||
public interface UserRoleMapper { |
|||
|
|||
@Delete("delete from user_role_relation where USER_ID = #{userId}") |
|||
void deleteByUserId(Integer userId); |
|||
|
|||
@Delete("delete from user_role_relation where ROLE_ID = #{id}") |
|||
void deleteByRoleId(int id); |
|||
|
|||
|
|||
@Insert("insert into user_role_relation values (null,#{roleId},#{userId})") |
|||
void insert(int userId, int roleId); |
|||
|
|||
@Update("update user_role_relation " + |
|||
"set ROLE_ID = #{roleId} where USER_ID =#{id}") |
|||
void updateRoleIdByUserId(UserDTO userDTO); |
|||
|
|||
@Select("select count(id) from user_role_relation where ROLE_ID =#{roleId}") |
|||
Integer CountByRoleId(Integer roleId); |
|||
} |
@ -0,0 +1,20 @@ |
|||
package com.haihang.service; |
|||
|
|||
import com.haihang.entity.Case; |
|||
import com.haihang.entity.CasePageQueryDTO; |
|||
import com.haihang.entity.PageResult; |
|||
import com.haihang.utils.Result; |
|||
|
|||
public interface CaseService { |
|||
|
|||
|
|||
Result add(Case aCase); |
|||
|
|||
Result deleteWithSonById(int id); |
|||
|
|||
Result update(Case aCase); |
|||
|
|||
Result getById(int id); |
|||
|
|||
PageResult pageQuery(CasePageQueryDTO casePageQueryDTO); |
|||
} |
@ -0,0 +1,19 @@ |
|||
package com.haihang.service; |
|||
|
|||
|
|||
import com.haihang.utils.Result; |
|||
|
|||
import java.time.LocalDate; |
|||
import java.util.Date; |
|||
|
|||
public interface ReportService { |
|||
|
|||
|
|||
Result userCases(int id); |
|||
|
|||
Result dayCase(LocalDate date); |
|||
|
|||
Result beforeDayUserCase(LocalDate date, int userId); |
|||
|
|||
Result countUserByRoleId(Integer roleId); |
|||
} |
@ -0,0 +1,12 @@ |
|||
package com.haihang.service; |
|||
|
|||
import com.haihang.entity.Role; |
|||
import com.haihang.utils.Result; |
|||
|
|||
public interface RoleService { |
|||
Result add(Role role); |
|||
|
|||
Result delete(int id); |
|||
|
|||
Result update(Role role); |
|||
} |
@ -0,0 +1,19 @@ |
|||
package com.haihang.service; |
|||
|
|||
import com.haihang.entity.User; |
|||
import com.haihang.entity.UserDTO; |
|||
import com.haihang.utils.Result; |
|||
import org.springframework.stereotype.Service; |
|||
|
|||
@Service |
|||
public interface UserService { |
|||
Result login(User user); |
|||
|
|||
Result add(UserDTO user); |
|||
|
|||
Result deleteUserById(int id); |
|||
|
|||
Result selectUserById(int id); |
|||
|
|||
Result update(UserDTO userDTO); |
|||
} |
@ -0,0 +1,113 @@ |
|||
package com.haihang.service.impl; |
|||
|
|||
import com.github.pagehelper.Page; |
|||
import com.github.pagehelper.PageHelper; |
|||
import com.haihang.entity.Case; |
|||
import com.haihang.entity.CasePageQueryDTO; |
|||
import com.haihang.entity.PageResult; |
|||
import com.haihang.mapper.CaseMapper; |
|||
import com.haihang.service.CaseService; |
|||
import com.haihang.utils.Result; |
|||
import com.haihang.utils.UserHolder; |
|||
import org.springframework.beans.factory.annotation.Autowired; |
|||
import org.springframework.stereotype.Service; |
|||
|
|||
import java.util.Date; |
|||
import java.util.List; |
|||
|
|||
@Service |
|||
public class CaseServiceImpl implements CaseService { |
|||
|
|||
|
|||
@Autowired |
|||
private CaseMapper caseMapper; |
|||
|
|||
|
|||
//新增用例
|
|||
@Override |
|||
public Result add(Case aCase) { |
|||
aCase.setCreateTime(new Date()); |
|||
aCase.setUpdateTime(new Date()); |
|||
|
|||
//判断传进来的用例父节点id,查询他是不是叶子节点,如果不是叶子节点则不能新增用例
|
|||
int parentId = aCase.getParentId(); |
|||
if(parentId == 0){ |
|||
//如果父节点为空,说明还没建立树,可以直接插入
|
|||
caseMapper.insert(aCase); |
|||
|
|||
return Result.ok(); |
|||
} |
|||
Case parentCase = caseMapper.selectById(parentId); |
|||
int isLeaf = parentCase.getIsLeaf(); |
|||
if(isLeaf!=1){ |
|||
return Result.fail("该用例不能添加!原因:父节点并非叶子节点"); |
|||
} |
|||
aCase.setCreateUser(UserHolder.getUser().getId()); |
|||
aCase.setUpdateUser(UserHolder.getUser().getId()); |
|||
|
|||
caseMapper.insert(aCase); |
|||
//插入完成要把父亲的isleaf修改掉.
|
|||
parentCase.setIsLeaf(0); |
|||
caseMapper.update(parentCase); |
|||
return Result.ok(); |
|||
} |
|||
|
|||
@Override |
|||
public Result deleteWithSonById(int id) { |
|||
//先根据id查询
|
|||
Case aCase = caseMapper.selectById(id); |
|||
if(aCase==null){ |
|||
return Result.ok(); |
|||
} |
|||
//根据当前id查询父节点为id的id列表,找他的儿子们
|
|||
List<Integer> ids= caseMapper.selectByParentId(id); |
|||
|
|||
//删他的儿子们
|
|||
for(Integer sonId:ids){ |
|||
deleteWithSonById(sonId); |
|||
} |
|||
|
|||
//在删除自己之前顺便记录parentId
|
|||
int parentId = aCase.getParentId(); |
|||
|
|||
//有值则删除自己
|
|||
caseMapper.deleteById(id); |
|||
|
|||
//根据他爹id判断他爹isleaf
|
|||
List<Integer> brotherId= caseMapper.selectByParentId(parentId); |
|||
if(brotherId == null || brotherId.isEmpty()){ |
|||
caseMapper.updateIsLeaf(1,parentId); |
|||
} |
|||
return Result.ok(); |
|||
} |
|||
|
|||
@Override |
|||
public Result update(Case aCase) { |
|||
Case dbCase = caseMapper.selectById(aCase.getId()); |
|||
dbCase.setCaseName(aCase.getCaseName()); |
|||
dbCase.setCaseDesc(aCase.getCaseDesc()); |
|||
dbCase.setUpdateUser(UserHolder.getUser().getId()); |
|||
dbCase.setUpdateTime(new Date()); |
|||
caseMapper.update(dbCase); |
|||
return Result.ok(); |
|||
} |
|||
|
|||
@Override |
|||
public Result getById(int id) { |
|||
Case aCase = caseMapper.selectById(id); |
|||
return Result.ok(aCase); |
|||
} |
|||
|
|||
@Override |
|||
public PageResult pageQuery(CasePageQueryDTO casePageQueryDTO) { |
|||
//开始分页查询
|
|||
PageHelper.startPage(casePageQueryDTO.getPage(),casePageQueryDTO.getPageSize()); |
|||
Page<Case> page = caseMapper.pageQuery(casePageQueryDTO); |
|||
long total = page.getTotal(); |
|||
List<Case> list = page.getResult(); |
|||
|
|||
return new PageResult((int) total,list); |
|||
} |
|||
|
|||
|
|||
} |
@ -0,0 +1,52 @@ |
|||
package com.haihang.service.impl; |
|||
|
|||
import com.haihang.mapper.CaseMapper; |
|||
import com.haihang.mapper.UserRoleMapper; |
|||
import com.haihang.service.ReportService; |
|||
import com.haihang.utils.Result; |
|||
import org.springframework.beans.factory.annotation.Autowired; |
|||
import org.springframework.stereotype.Service; |
|||
|
|||
import java.time.LocalDate; |
|||
import java.util.Date; |
|||
import java.util.List; |
|||
|
|||
@Service |
|||
public class ReportServiceImpl implements ReportService { |
|||
|
|||
@Autowired |
|||
private CaseMapper caseMapper; |
|||
|
|||
@Autowired |
|||
private UserRoleMapper userRoleMapper; |
|||
|
|||
|
|||
@Override |
|||
public Result userCases(int id) { |
|||
List<Integer> list = caseMapper.queryByUserId(id); |
|||
return Result.ok(list.size()); |
|||
|
|||
} |
|||
|
|||
@Override |
|||
public Result dayCase(LocalDate date) { |
|||
//根据日期筛选出符合当前日期的用例
|
|||
System.out.println(date.toString()); |
|||
List<Integer> lis = caseMapper.queryByDate(date.toString()); |
|||
return Result.ok(lis.size()); |
|||
} |
|||
|
|||
@Override |
|||
public Result beforeDayUserCase(LocalDate date, int userId) { |
|||
Integer lis = caseMapper.queryBeforeDateByUser(date,userId); |
|||
return Result.ok(lis); |
|||
} |
|||
|
|||
@Override |
|||
public Result countUserByRoleId(Integer roleId) { |
|||
//根据角色id查询角色关联用户数
|
|||
//直接查中间表就完了
|
|||
Integer count = userRoleMapper.CountByRoleId(roleId); |
|||
return Result.ok(count); |
|||
} |
|||
} |
@ -0,0 +1,46 @@ |
|||
package com.haihang.service.impl; |
|||
|
|||
import com.haihang.entity.Role; |
|||
import com.haihang.mapper.RoleMapper; |
|||
import com.haihang.mapper.UserRoleMapper; |
|||
import com.haihang.service.RoleService; |
|||
import com.haihang.utils.Result; |
|||
import org.springframework.beans.factory.annotation.Autowired; |
|||
import org.springframework.stereotype.Service; |
|||
|
|||
@Service |
|||
public class RoleServiceImpl implements RoleService { |
|||
|
|||
@Autowired |
|||
private RoleMapper roleMapper; |
|||
|
|||
|
|||
@Autowired |
|||
private UserRoleMapper userRoleMapper; |
|||
|
|||
@Override |
|||
public Result add(Role role) { |
|||
roleMapper.insertRole(role); |
|||
return Result.ok(); |
|||
} |
|||
|
|||
@Override |
|||
public Result delete(int id) { |
|||
|
|||
//删除用户记录的时候要先删除用户角色关联的信息
|
|||
userRoleMapper.deleteByRoleId(id); |
|||
roleMapper.deleteRoleById(id); |
|||
return Result.ok(); |
|||
} |
|||
|
|||
@Override |
|||
public Result update(Role role) { |
|||
//部门改名字了,但是原本的用户没有变化
|
|||
roleMapper.update(role); |
|||
|
|||
|
|||
return Result.ok(); |
|||
} |
|||
|
|||
|
|||
} |
@ -0,0 +1,138 @@ |
|||
package com.haihang.service.impl; |
|||
|
|||
import cn.hutool.core.bean.BeanUtil; |
|||
import cn.hutool.core.bean.copier.CopyOptions; |
|||
import cn.hutool.core.lang.UUID; |
|||
import com.haihang.constant.Constant; |
|||
import com.haihang.entity.User; |
|||
import com.haihang.entity.UserDTO; |
|||
import com.haihang.entity.UserInfo; |
|||
import com.haihang.mapper.UserMapper; |
|||
import com.haihang.mapper.UserRoleMapper; |
|||
import com.haihang.service.UserService; |
|||
import com.haihang.utils.Result; |
|||
import lombok.extern.slf4j.Slf4j; |
|||
import org.redisson.api.RedissonClient; |
|||
import org.springframework.beans.factory.annotation.Autowired; |
|||
import org.springframework.data.redis.core.StringRedisTemplate; |
|||
import org.springframework.stereotype.Service; |
|||
|
|||
import java.util.HashMap; |
|||
import java.util.Map; |
|||
import java.util.concurrent.TimeUnit; |
|||
|
|||
import static com.haihang.constant.Constant.LOGIN_USER_KEY; |
|||
|
|||
@Slf4j |
|||
@Service |
|||
public class UserServiceImpl implements UserService { |
|||
|
|||
|
|||
@Autowired |
|||
private UserMapper userMapper; |
|||
|
|||
@Autowired |
|||
private StringRedisTemplate stringRedisTemplate; |
|||
|
|||
@Autowired |
|||
private RedissonClient redissonClient; |
|||
|
|||
@Autowired |
|||
private UserRoleMapper userRoleMapper; |
|||
|
|||
@Override |
|||
public Result login(User user) { |
|||
|
|||
//根据传过来的用户名和密码判断登录。
|
|||
// 先根据用户名查询所有信息
|
|||
User userDb = userMapper.getUserByLoginName(user.getLoginName()); |
|||
int id = userDb.getId(); |
|||
|
|||
|
|||
//判断是否已经被锁定
|
|||
String isLock = stringRedisTemplate.opsForValue().get(Constant.LOGIN_LOCK_KEY + id); |
|||
|
|||
if("1".equals(isLock)){ |
|||
return Result.fail("因为错误密码次数过多!账户已经锁定!请联系管理员解锁"); |
|||
} |
|||
|
|||
if(!"123456".equals(user.getPassword())){ |
|||
log.info("密码错误!"); |
|||
//密码错误时redis中的错误记录加1
|
|||
stringRedisTemplate.opsForValue().increment(Constant.LOGIN_COUNT_KEY+id); |
|||
String s = stringRedisTemplate.opsForValue().get(Constant.LOGIN_COUNT_KEY + id); |
|||
|
|||
if (Integer.parseInt(s)>=5){ |
|||
stringRedisTemplate.opsForValue().set(Constant.LOGIN_LOCK_KEY+id |
|||
,"1"); |
|||
return Result.fail("账户将被锁定"); |
|||
|
|||
} |
|||
return Result.fail("用户输入密码错误"); |
|||
} |
|||
//走到这里说明密码正确,清空并放行
|
|||
stringRedisTemplate.delete(Constant.LOGIN_COUNT_KEY + id); |
|||
|
|||
UserInfo userInfo = new UserInfo(); |
|||
userInfo.setId(userDb.getId()); |
|||
userInfo.setLoginName(user.getLoginName()); |
|||
userInfo.setUserChnName(userDb.getUserChnName()); |
|||
String token = UUID.fastUUID().toString(true); |
|||
//将用户信息存放到redis中
|
|||
Map<String, Object> map = BeanUtil.beanToMap(userInfo, new HashMap<>() |
|||
, CopyOptions.create().setIgnoreNullValue(true) |
|||
.setFieldValueEditor( |
|||
(name, value) -> value.toString() |
|||
)); |
|||
//保存用户信息到redis
|
|||
stringRedisTemplate.opsForHash().putAll(LOGIN_USER_KEY + token, map); |
|||
//设置过期时间
|
|||
stringRedisTemplate.expire(LOGIN_USER_KEY + token, 100000000000L, TimeUnit.MINUTES); |
|||
log.info("success"); |
|||
return Result.ok(token); |
|||
} |
|||
|
|||
@Override |
|||
public Result add(UserDTO userDTO) { |
|||
|
|||
User user = new User(); |
|||
|
|||
// 把这个DTO解析成一个user,一个角色id然后分别存入两张表
|
|||
BeanUtil.copyProperties(userDTO,user); |
|||
userMapper.insertUser(user);//插入user
|
|||
int roleId = userDTO.getRoleId(); |
|||
int userId = user.getId(); |
|||
|
|||
userRoleMapper.insert(userId,roleId); |
|||
|
|||
return Result.ok(); |
|||
} |
|||
|
|||
@Override |
|||
public Result deleteUserById(int id) { |
|||
|
|||
//删除用户时,需要优先删除用户角色关联表中用户id为id的记录
|
|||
userRoleMapper.deleteByUserId(id); |
|||
|
|||
userMapper.deleteUserById(id); |
|||
return Result.ok(); |
|||
} |
|||
|
|||
@Override |
|||
public Result selectUserById(int id) { |
|||
User user = userMapper.getUserById(id); |
|||
return Result.ok(user); |
|||
} |
|||
|
|||
@Override |
|||
public Result update(UserDTO userDTO) { |
|||
//根据给定的id更新用户信息
|
|||
userMapper.updateUser(userDTO); |
|||
|
|||
//根据roleid更新用户对于角色
|
|||
userRoleMapper.updateRoleIdByUserId(userDTO); |
|||
return Result.ok(); |
|||
} |
|||
|
|||
|
|||
} |
@ -0,0 +1,67 @@ |
|||
package com.haihang.utils; |
|||
|
|||
|
|||
|
|||
|
|||
import cn.hutool.core.bean.BeanUtil; |
|||
import com.haihang.entity.UserInfo; |
|||
import org.springframework.data.redis.core.StringRedisTemplate; |
|||
import org.springframework.util.StringUtils; |
|||
import org.springframework.web.servlet.HandlerInterceptor; |
|||
|
|||
import javax.annotation.Resource; |
|||
import javax.servlet.http.HttpServletRequest; |
|||
import javax.servlet.http.HttpServletResponse; |
|||
import javax.servlet.http.HttpSession; |
|||
import java.util.Map; |
|||
import java.util.concurrent.TimeUnit; |
|||
|
|||
import static com.haihang.constant.Constant.LOGIN_USER_KEY; |
|||
|
|||
/** |
|||
* 登录拦截器 |
|||
* |
|||
* @author CHEN |
|||
* @date 2022/10/07 |
|||
*/ |
|||
public class LoginInterceptor implements HandlerInterceptor { |
|||
|
|||
private final StringRedisTemplate stringRedisTemplate; |
|||
|
|||
public LoginInterceptor(StringRedisTemplate stringRedisTemplate) { |
|||
this.stringRedisTemplate=stringRedisTemplate; |
|||
} |
|||
|
|||
@Override |
|||
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { |
|||
//解析token
|
|||
//从请求头中获取token
|
|||
String token = request.getHeader("authorization"); |
|||
if (StringUtils.isEmpty(token)) { |
|||
//前端没传
|
|||
throw new RuntimeException("前端没有携带token!"); |
|||
|
|||
} |
|||
//从redis中获取用户
|
|||
Map<Object, Object> userMap = |
|||
stringRedisTemplate.opsForHash() |
|||
.entries(LOGIN_USER_KEY + token); |
|||
//前端的这个token没有值
|
|||
if (userMap.isEmpty()) { |
|||
throw new RuntimeException("无效token!!"); |
|||
|
|||
} |
|||
// //hash转UserDTO存入ThreadLocal
|
|||
// UserHolder.saveUser(BeanUtil.fillBeanWithMap(userMap, new UserDTO(), false));
|
|||
//走到这里说明前端传过来的token里面有值且是登录用户,放行就完事了,暂时不用ThreadLocal
|
|||
|
|||
//将用户id存放到ThreadLocal
|
|||
UserHolder.saveUser(BeanUtil.fillBeanWithMap(userMap, new UserInfo(), false)); |
|||
|
|||
|
|||
|
|||
return true; |
|||
} |
|||
|
|||
|
|||
} |
@ -0,0 +1,30 @@ |
|||
package com.haihang.utils; |
|||
|
|||
import lombok.AllArgsConstructor; |
|||
import lombok.Data; |
|||
import lombok.NoArgsConstructor; |
|||
|
|||
import java.util.List; |
|||
|
|||
@Data |
|||
@NoArgsConstructor |
|||
@AllArgsConstructor |
|||
public class Result { |
|||
private Boolean success; |
|||
private String errorMsg; |
|||
private Object data; |
|||
private Long total; |
|||
|
|||
public static Result ok(){ |
|||
return new Result(true, null, null, null); |
|||
} |
|||
public static Result ok(Object data){ |
|||
return new Result(true, null, data, null); |
|||
} |
|||
public static Result ok(List<?> data, Long total){ |
|||
return new Result(true, null, data, total); |
|||
} |
|||
public static Result fail(String errorMsg){ |
|||
return new Result(false, errorMsg, null, null); |
|||
} |
|||
} |
@ -0,0 +1,20 @@ |
|||
package com.haihang.utils; |
|||
|
|||
import com.haihang.entity.UserDTO; |
|||
import com.haihang.entity.UserInfo; |
|||
|
|||
public class UserHolder { |
|||
private static final ThreadLocal<UserInfo> tl = new ThreadLocal<>(); |
|||
|
|||
public static void saveUser(UserInfo user){ |
|||
tl.set(user); |
|||
} |
|||
|
|||
public static UserInfo getUser(){ |
|||
return tl.get(); |
|||
} |
|||
|
|||
public static void removeUser(){ |
|||
tl.remove(); |
|||
} |
|||
} |
@ -0,0 +1,39 @@ |
|||
server: |
|||
port: 8081 |
|||
spring: |
|||
|
|||
main: |
|||
allow-circular-references: true |
|||
|
|||
application: |
|||
name: hmdp |
|||
datasource: |
|||
driver-class-name: com.mysql.cj.jdbc.Driver |
|||
url: jdbc:mysql://117.72.91.159:13306/test_repo?useSSL=false&serverTimezone=UTC |
|||
username: root |
|||
password: 123456 |
|||
redis: |
|||
host: 117.72.91.159 |
|||
port: 16379 |
|||
|
|||
lettuce: |
|||
pool: |
|||
max-active: 10 |
|||
max-idle: 10 |
|||
min-idle: 1 |
|||
time-between-eviction-runs: 10s |
|||
jackson: |
|||
default-property-inclusion: non_null # JSON处理时忽略非空字段 |
|||
logging: |
|||
level: |
|||
com.haihang: debug |
|||
mybatis: |
|||
|
|||
#标注待解析的mapper的xml文件位置 |
|||
mapper-locations: classpath:mapper/*.xml |
|||
#标注实体类位置 |
|||
type-aliases-package: com.haihang.entity |
|||
configuration: |
|||
#开启驼峰命名 |
|||
map-underscore-to-camel-case: true |
|||
|
@ -0,0 +1,25 @@ |
|||
<?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.haihang.mapper.CaseMapper"> |
|||
|
|||
<select id="pageQuery" resultType="com.haihang.entity.Case"> |
|||
select * from case_table |
|||
<where> |
|||
<if test="caseName!= '' and caseName != null"> |
|||
and case_name like concat('%',#{caseName},'%') |
|||
</if> |
|||
</where> |
|||
|
|||
</select> |
|||
|
|||
<select id="queryBeforeDateByUser" resultType="java.lang.Integer"> |
|||
select count(id) from case_table |
|||
<where> |
|||
<if test="date!= null">and create_time < #{date}</if> |
|||
and create_user = #{userId} |
|||
</where> |
|||
</select> |
|||
|
|||
|
|||
|
|||
</mapper> |
@ -0,0 +1,8 @@ |
|||
<?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.haihang.mapper.UserMapper"> |
|||
|
|||
|
|||
|
|||
|
|||
</mapper> |
@ -0,0 +1,97 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<project xmlns="http://maven.apache.org/POM/4.0.0" |
|||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
|||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> |
|||
<modelVersion>4.0.0</modelVersion> |
|||
|
|||
<groupId>com.haihang</groupId> |
|||
<artifactId>excersice</artifactId> |
|||
<version>1.0-SNAPSHOT</version> |
|||
<parent> |
|||
<groupId>org.springframework.boot</groupId> |
|||
<artifactId>spring-boot-starter-parent</artifactId> |
|||
<version>2.7.4</version> |
|||
<relativePath/><!-- lookup parent from repository --> |
|||
</parent> |
|||
|
|||
<properties> |
|||
<maven.compiler.source>8</maven.compiler.source> |
|||
<maven.compiler.target>8</maven.compiler.target> |
|||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> |
|||
</properties> |
|||
|
|||
<dependencies> |
|||
<dependency> |
|||
<groupId>com.github.pagehelper</groupId> |
|||
<artifactId>pagehelper-spring-boot-starter</artifactId> |
|||
<version>1.2.12</version> |
|||
</dependency> |
|||
|
|||
<dependency> |
|||
<groupId>org.springframework.boot</groupId> |
|||
<artifactId>spring-boot-starter-data-redis</artifactId> |
|||
</dependency> |
|||
<dependency> |
|||
<groupId>org.apache.commons</groupId> |
|||
<artifactId>commons-pool2</artifactId> |
|||
</dependency> |
|||
<dependency> |
|||
<groupId>org.springframework.boot</groupId> |
|||
<artifactId>spring-boot-starter-web</artifactId> |
|||
</dependency> |
|||
|
|||
<dependency> |
|||
<groupId>mysql</groupId> |
|||
<artifactId>mysql-connector-java</artifactId> |
|||
<version>8.0.19</version> |
|||
</dependency> |
|||
|
|||
<dependency> |
|||
<groupId>org.mybatis.spring.boot</groupId> |
|||
<artifactId>mybatis-spring-boot-starter</artifactId> |
|||
<version>2.2.0</version> |
|||
</dependency> |
|||
|
|||
<dependency> |
|||
<groupId>org.projectlombok</groupId> |
|||
<artifactId>lombok</artifactId> |
|||
<optional>true</optional> |
|||
</dependency> |
|||
<dependency> |
|||
<groupId>org.springframework.boot</groupId> |
|||
<artifactId>spring-boot-starter-test</artifactId> |
|||
<scope>test</scope> |
|||
</dependency> |
|||
<!--hutool--> |
|||
<dependency> |
|||
<groupId>cn.hutool</groupId> |
|||
<artifactId>hutool-all</artifactId> |
|||
<version>5.8.8</version> |
|||
</dependency> |
|||
|
|||
<dependency> |
|||
<groupId>org.redisson</groupId> |
|||
<artifactId>redisson</artifactId> |
|||
<version>3.17.7</version> |
|||
</dependency> |
|||
</dependencies> |
|||
|
|||
<build> |
|||
<plugins> |
|||
<plugin> |
|||
<groupId>org.springframework.boot</groupId> |
|||
<artifactId>spring-boot-maven-plugin</artifactId> |
|||
<version>2.7.4</version> |
|||
<configuration> |
|||
<excludes> |
|||
<exclude> |
|||
<groupId>org.projectlombok</groupId> |
|||
<artifactId>lombok</artifactId> |
|||
</exclude> |
|||
</excludes> |
|||
</configuration> |
|||
</plugin> |
|||
</plugins> |
|||
</build> |
|||
|
|||
</project> |
Loading…
Reference in new issue