员工管理,分类管理
新增员工
产品经理需求分析
使用请求post去请求,按照json格式去提交,后端给前端返回result
Path: /admin/employee
Method:post
请求的json就是包含上图表单里面数据
返回的数据是后端给前端:
**在controller类里面增加方法,然后在service里面增加方法,再在impl里面实现方法(从DTO传过来的参数赋值给new的employee,然后调用Mapper将数据记录到数据库之中)
其中的参数都是清一色的DTO(从前端接受的数据)**
1、技巧 只用Spring的BeanUtils.copyProperties去拷贝类的属性。
2. 设置常量类 Constant以便后期维护,在set的时候都用常量属性来set
3.返回Result.succes
@PostMapping
@ApiOperation("新增员工")
public Result save(@RequestBody EmployeeDTO employeeDTO){
System.out.println("当前线程的id" + Thread.currentThread().getId());
log.info("新增员工:{}",employeeDTO);
employeeService.save(employeeDTO);
return Result.success();
}
也就是controller(return Result)- >service(只是定义一个方法名)- > impl(完成功能获取employee的信息,转到Mapper去执行sql操作)- >Mapper(完成sql代码)
public void save(EmployeeDTO employeeDTO){
Employee employee = new Employee();
//对象属性拷贝 Spring封装的
BeanUtils.copyProperties(employeeDTO,employee); //从前往后面拷贝
//设置账号的状态
employee.setStatus(StatusConstant.ENABLE); //就是写了一个常量类
employee.setPassword(DigestUtils.md5DigestAsHex(PasswordConstant.DEFAULT_PASSWORD.getBytes()));
employee.setCreateTime(LocalDateTime.now());
employee.setUpdateTime(LocalDateTime.now());
//TODO 后期改成当前登录用户的id 用户名共同值了没有异常处理
employee.setCreateUser(10L);
employee.setUpdateUser(10L);
employeeMapper.insert(employee); //专门的类去执行sql语句的操作
}
解决用户名重复的问题!写异常处理类
@ExceptionHandler
public Result exceptionHandler(SQLIntegrityConstraintViolationException ex){
获取ex.getMessage的内容,处理内容使用split,返回的是Result.error(处理的文本数据表示获得的异常)
解决创建人id问题
在login的时候其实已经生成了jwt令牌,但是需要在login里面把令牌保存下来,然后提供成service下面的其他方法使用,需要用到ThreadLocal保存下来
每一次请求其实都是单独的线程,每个线程都有单独的存储空间,所以我们可以把数据存在里面,在不用的类(service类不同方法)共享这个数据
先在拦截器里调用
BaseContext.setCurrentId(empId);
其中操作很简单,关键是ThreadLocal的概念
遇到bug&技巧
1.调用getset的时候没有自动补全:下载插件lombok
2.在写Mapper的时候用@Insert写mysql代码,没有自动补全。Insert开头黄色灯泡
3.调试的时候需要设置一下全局参数,jwt令牌,先去登录那边获取,然后在全局参数设置一个token的,为什么叫token去application.yml配置文件设置的
4.测试的时候发现返回500,查阅的时候发现
@Insert("insert into employee (name,username,password,phone,sex,id_number,create_time,update_time,create_user,update_user) VALUES " +
"(#{name},#{username},#{password},#{phone},#{sex},#{idNumber},#{createTime},#{updateTime},#{createUser},#{updateUser})")
void insert(Employee employee);
values后面需要驼峰命名,前面一部分是mysql设置好的表的格式
5. ex.getMessage().var可以自动补全定义
员工分页查询
产品经理需求分析
请求格式是Query不是json
需要返回一页的数据
Controller
@GetMapping("/page")
@ApiOperation("分页查询")
public Result<PageResult> page(EmployeePageQueryDTO employeePageQueryDTO){
log.info("员工分页查询,参数为:{}",employeePageQueryDTO);
PageResult pageResult = employeeService.pageQuery(employeePageQueryDTO);
return Result.success(pageResult);
}
@GetMapping(“/page”) 定义接口
impl
使用pagehelper插件(mybatis自带的)
public PageResult pageQuery(EmployeePageQueryDTO employeePageQueryDTO){
//select * from employee limit 0,10
PageHelper.startPage(employeePageQueryDTO.getPage(),employeePageQueryDTO.getPageSize());
//是基于TreadLocal实现的,获得Limit 自动拼接到Mapper.xml之中
Page<Employee> page = employeeMapper.pageQuery(employeePageQueryDTO);
long total = page.getTotal();
List<Employee> result = page.getResult();
return new PageResult(total,result); //
}
pageQuery是在Mapper里面实现的,然后实现方法是通过,EmployeeMapper.xml里面写代码
mapper namespace="com.sky.mapper.EmployeeMapper">
<select id="pageQuery" resultType="com.sky.entity.Employee">
select * from employee
<where>
<if test="name!=null and name != ' '">
and name like concat('%',#(name),'%')
</if>
</where>
</select>
</mapper>
Preparing: SELECT count(0) FROM employee这部分是mybatisX插件帮助写的
员工分页查询,参数为:EmployeePageQueryDTO(name=null, page=1, pageSize=10)
2024-07-05 14:48:02.595 DEBUG 26312 --- [nio-8080-exec-2] c.s.m.EmployeeMapper.pageQuery_COUNT : ==> Preparing: SELECT count(0) FROM employee
2024-07-05 14:48:02.595 DEBUG 26312 --- [nio-8080-exec-2] c.s.m.EmployeeMapper.pageQuery_COUNT : ==> Parameters:
2024-07-05 14:48:02.596 DEBUG 26312 --- [nio-8080-exec-2] c.s.m.EmployeeMapper.pageQuery_COUNT : <== Total: 1
2024-07-05 14:48:02.597 DEBUG 26312 --- [nio-8080-exec-2] com.sky.mapper.EmployeeMapper.pageQuery : ==> Preparing: select * from employee LIMIT ?
2024-07-05 14:48:02.597 DEBUG 26312 --- [nio-8080-exec-2] com.sky.mapper.EmployeeMapper.pageQuery : ==> Parameters: 10(Integer)
2024-07-05 14:48:02.598 DEBUG 26312 --- [nio-8080-exec-2] com.sky.mapper.EmployeeMapper.pageQuery : <== Total: 3
展示时间格式不对
第一种 按照注释的方式
//@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
第二种 使用WebMvcConfiguration类来解决
/**
* 扩展Spring MVC框架的消息转化器
* @param converters
*/
@Override
protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
log.info("启动消息转化器。。。");
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
converter.setObjectMapper(new JacksonObjectMapper());
converters.add(0,converter);
}
bug&技巧
1.在写Mapper的时候没有报错,无法自动生成pagehelper的相关代码,下载插件,mybatisX
启用禁用员工账号
产品分析
controller
如果需要返回数据的话,
public result<返回的数据>
如果不返回数据
就public result就行了
@PostMapping("/status/{status}")
@ApiOperation("启动禁用员工账号")
public Result startOrStop(@PathVariable Integer status,Long id){ //路径参数加PathVariable 路径参数就是/(status)
log.info("启动禁用员工账号:{},{}",status,id);
employeeService.startOrStop(status,id);
return Result.success();
}
serviceimpl
使用builder更加装逼,再使用Mapper去调用sql语句
public void startOrStop(Integer status, Long id){
//update employee set status = ? where id = ?
// Employee employee = new Employee();
// employee.setStatus(status);
Employee employee = Employee.builder()
.status(status)
.id(id)
.build();
employeeMapper.update(employee);
}
Mapper
因为动态修改属性,所以使用Mapper映射文件去使用,
<update id="update" parameterType="com.sky.entity.Employee">
update employee
<set>
<if test="name !=null">name = #{name},</if>
<if test="username !=null">username = #{username},</if>
<if test="password !=null">password = #{password},</if>
<if test="phone !=null">phone = #{phone},</if>
<if test="sex !=null">sex = #{sex},</if>
<if test="idNumber !=null">idNumber = #{idNumber},</if>
<if test="updateTime !=null">updateTime = #{updateTime},</if>
<if test="updateUser !=null">updateUser = #{updateUser},</if>
<if test="status !=null">status = #{status},</if>
</set>
where id = #{id}
</update>
修改的时候回显员工信息
修改信息时候回显
分析需要id查询,需要返回整个employee的信息去显示
首先是使用Get在controller里面请求,
@GetMapping("/{id}")
@ApiOperation("根据id获取员工的资料")
public Result<Employee> getById(@PathVariable Long id){
log.info("编辑员工信息,id为{}",id);
Employee employee = employeeService.getById(id);
return Result.success(employee);
}
serice
/**
* 根据id查员工信息
*
* @param id
* @return
*/
public Employee getById(Long id){
Employee employee = employeeMapper.getById(id);
employee.setPassword("******");
return employee;
}
Mapper
@Select("select * from employee where id = #{id}")
Employee getById(Long id);
这里我出现错误,把@select写成了@Insert是不对的,修改完之后就有回显了
修改员工的信息
Put方法controller参数是DTO,不需要return就返回Result.success
service里面就参数DTO,去BeanUtils从DTO变成正常Employee类
记得要updateTime 和User更改修改的时间和修改人
然后就调用之前写好的Mapper类里面的update函数(封装到Mapper.xml)里面
public void update(EmployeeDTO employeeDTO){
Employee employee = new Employee();
BeanUtils.copyProperties(employeeDTO,employee);
employee.setUpdateTime(LocalDateTime.now());
employee.setUpdateUser(BaseContext.getCurrentId());
employeeMapper.update(employee);
}
bug
去调试的时候发现,updateTime是没有的
Cause: java.sql.SQLSyntaxErrorException: Unknown column 'updateTime' in 'field list'
; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Unknown column 'updateTime' in 'field list'] with root cause
原因是xml文档里面是错误的
<update id="update" parameterType="com.sky.entity.Employee">
update employee
<set>
<if test="name !=null">name = #{name},</if>
<if test="username !=null">username = #{username},</if>
<if test="password !=null">password = #{password},</if>
<if test="phone !=null">phone = #{phone},</if>
<if test="sex !=null">sex = #{sex},</if>
<if test="idNumber !=null">id_Number = #{idNumber},</if>
<if test="updateTime !=null">update_Time = #{updateTime},</if>
<if test="updateUser !=null">update_User = #{updateUser},</if>
<if test="status !=null">status = #{status},</if>
</set>
where id = #{id}
</update>
update_Time = #{updateTime}
还有一个错误
@PutMapping
@ApiOperation("编辑员工信息")
public Result update(@RequestBody EmployeeLoginDTO employeeLoginDTO){
log.info("编辑员工信息:{}",employeeLoginDTO);
employeeService.update(employeeLoginDTO);
return Result.success();
}
@PutMapping后面没有网址参数了,获取的是employee页面的里面自带的json格式,所以我们在传参的时候需要把**@RequestBody**给加上,才能正确的返回DTO的值
发现我全部用的EmployeeloginDTO,这个时候需要的是全部的DTO。。。。。。。。。。。。。。。。。。
全部改完就好了
导入分类模块功能代码
知识
GET:
用途:用于从服务器获取数据。
特性:请求通常是幂等的(多次请求对服务器的资源不会产生不同的结果),请求参数通常包含在URL中。
例子:访问网页、获取API数据等。
POST:
用途:用于向服务器发送数据以创建新的资源。
特性:请求不是幂等的(多次相同的请求可能会产生不同的结果),请求数据包含在请求体中。
例子:提交表单、上传文件等。
PUT:
用途:用于向服务器发送数据以更新现有资源。
特性:请求通常是幂等的,整个资源数据包含在请求体中。
例子:更新用户信息、更改文件内容等。
DELETE:
用途:用于从服务器删除指定的资源。
特性:请求通常是幂等的。
例子:删除用户账户、移除文件等。
总结
新增员工接受网页TDO,转Employee,去Mapper里面Insert,直接使用注释@Insert就能完成,不返回内容只返回success
分页查询,使用Mybatis的pagehelper类去完成代码,传入pageDTO(可以其实是没有在前端输入参数的,是通过TreadLocal自动获取的内容)就可以,DTO包括了页码和每页最大的页数,返回的是PageResult(成员属性就是页码和每页最大的页数)
其中,Mapper使用了XML文件去完成这个操作
<select id="pageQuery" resultType="com.sky.entity.Employee">
select * from employee
<where>
<if test="name!=null and name != ' '">
and name like concat('%',#(name),'%')
</if>
</where>
</select>
禁用设置
需要页面属性做status做参数,所以接受的前面加上了**@PathVariable** ,没有返回所以success就行,sql本质是update,所以使用了xml完成了所有的update但是在命名上要注意驼峰和下划线_,传给Mapper的时候update函数接受的都是整个employee
编辑员工
传入的是网页参数要加上@RquestBody参数,本质还是update,所以用上面的代码就可以,