黑馬程序員最新Java項(xiàng)目實(shí)戰(zhàn)《蒼穹外賣》,最適合新手的SpringBoot+SSM的企業(yè)級Java項(xiàng)目實(shí)戰(zhàn)。
新增員工
設(shè)計(jì) DTO 類
-
我們需要根據(jù)新增員工接口設(shè)計(jì)對應(yīng)的 DTO 類去接收前端傳遞的參數(shù),前端傳遞參數(shù)列表如下:
注意: 當(dāng)前端提交的數(shù)據(jù)和實(shí)體類中對應(yīng)的屬性差別比較大時(shí),建議使用 DTO 來封裝數(shù)據(jù)。
-
進(jìn)入 sky-pojo 模塊,在 com.sky.dto 包下,定義 EmployeeDTO:
public class EmployeeDTO implements Serializable { private Long id; private String username; private String name; private String phone; private String sex; private String idNumber; }
編寫接口
sky-server下EmployeeController.java 中添加新增員工接口:
/**
* 新增員工
*
* @param employeeDTO
* @return
*/
@PostMapping
@ApiOperation(value = "新增員工")
public Result add(EmployeeDTO employeeDTO) {
log.info("新增員工:{}", employeeDTO);
employeeService.save(employeeDTO);
return Result.success();
}
設(shè)置 Header
-
項(xiàng)目中使用了 Token 作為身份驗(yàn)證和授權(quán)的憑證,用于驗(yàn)證用戶的身份和授權(quán)用戶訪問系統(tǒng)中的受保護(hù)資源。
-
我們點(diǎn)擊【員工登錄】接口,在請求體中設(shè)置用戶登錄的賬號密碼,點(diǎn)擊發(fā)送,獲取后端生成的 Token。
{ "password": "123456", "username": "admin" }
-
所有后續(xù)的請求都需要在請求頭中攜帶我們生成的 Token,以確保后端進(jìn)行用戶驗(yàn)證。我們在設(shè)置中,設(shè)置環(huán)境,在 Header 中添加我們上一步獲取的 Token。
捕獲 SQL 異常
-
在員工數(shù)據(jù)表
employee
中,對username
字段設(shè)置了唯一約束: -
當(dāng)我們插入已存在員工姓名時(shí),會出現(xiàn) SQL 異常:
java.sql.SQLIntegrityConstraintViolationException: Duplicate entry '11111' for key 'employee.idx_username'
-
我們需要在全局異常 GlobalExceptionHandler 類中捕獲這個(gè)異常,處理異常并返回前端結(jié)果:
/** * 處理SQL異常 * @param ex * @return */ @ExceptionHandler public Result exceptionHandler(SQLIntegrityConstraintViolationException ex){ //Duplicate entry 'zhangsan' for key 'employee.idx_username' String message = ex.getMessage(); if(message.contains("Duplicate entry")){ String[] split = message.split(" "); String username = split[2]; String msg = username + MessageConstant.ALREADY_EXISTS; return Result.error(msg); }else{ return Result.error(MessageConstant.UNKNOWN_ERROR); } }
-
再次運(yùn)行【新增員工】接口,后端返回結(jié)果如下:
{ "code":0, "msg":"'xiaozhi'已存在", "data":null }
ThreadLocal 優(yōu)化
ThreadLocal 為每個(gè)線程提供單獨(dú)一份存儲空間,具有線程隔離的效果,只有在線程內(nèi)才能獲取到對應(yīng)的值,線程外則不
能訪問。
-
我們需要在
JwtTokenAdminInterceptor
攔截器中當(dāng)前登錄用戶 ID 保存到 ThreadLocal 中,方便后續(xù)處理:// 在線程變量中保存登錄用戶id BaseContext.setCurrentId(empId);
-
修改
EmployeeServiceImpl
實(shí)現(xiàn)類中的save()
方法,增加員工時(shí)添加創(chuàng)建人的 ID://設(shè)置當(dāng)前記錄創(chuàng)建人id和修改人id Long createUserId = BaseContext.getCurrentId(); employee.setCreateUser(createUserId); employee.setUpdateUser(createUserId);
-
當(dāng)我們在線程池下使用 ThreadLocal 時(shí),需要手動調(diào)用
remove()
方法,防止內(nèi)存泄漏。
員工分頁查詢
設(shè)計(jì) DTO 類
-
我們需要根據(jù)新增員工接口設(shè)計(jì)對應(yīng)的 DTO 類去接收前端傳遞的參數(shù),前端傳遞參數(shù)列表如下:
-
進(jìn)入 sky-pojo 模塊,在 com.sky.dto 包下,定義 EmployeePageQueryDTO:
public class EmployeePageQueryDTO implements Serializable { //員工姓名 private String name; //頁碼 private int page; //每頁顯示記錄數(shù) private int pageSize; }
編寫接口
-
在 sky-server 下 EmployeeController.java 中添加新增員工分頁查詢接口:
/** * 員工分頁查詢 * @param employeePageQueryDTO * @return */ @GetMapping("/page") @ApiOperation(value = "員工分頁查詢") public Result<PageResult> page(EmployeePageQueryDTO employeePageQueryDTO){ log.info("員工分頁查詢:{}",employeePageQueryDTO); PageResult pageResult = employeeService.pageQuery(employeePageQueryDTO); return Result.success(pageResult); }
-
在 EmployeeServiceImpl 中實(shí)現(xiàn)分頁查詢邏輯:
@Override public PageResult pageQuery(EmployeePageQueryDTO employeePageQueryDTO) { PageHelper.startPage(employeePageQueryDTO.getPage(),employeePageQueryDTO.getPageSize()); Page<Employee> page = employeeMapper.pageQuery(employeePageQueryDTO); return new PageResult(page.getTotal(),page.getResult()); }
-
在 EmployeeMapper.xml 中編寫 SQL 語句:
<select id="pageQuery" resultType="com.sky.entity.Employee"> select * from employee <where> <if test="name != null and name !=''"> name like concat('%',#{name},'%') </if> </where> order by create_time desc </select>
-
在
Employee
類中使用@JsonFormat
注解修改時(shí)間格式:@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime createTime; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime updateTime;
-
啟動項(xiàng)目,頁面測試功能:
啟動禁用員工賬號
-
在 EmployeeController 員工控制類中編寫接口:
/** * 啟用、禁用員工賬號 * @param status * @param id * @return */ @PostMapping("/status/{status}") @ApiOperation(value = "啟用、禁用員工賬號") public Result startOrStop(@PathVariable Integer status, Long id){ log.info("啟用禁用員工賬號:{},{}",status,id); employeeService.startOrStop(status,id); return Result.success(); }
-
在 EmployeeServiceImpl 實(shí)現(xiàn)類中實(shí)現(xiàn)功能:
@Override public void startOrStop(Integer status, Long id) { Employee employee = Employee.builder().id(id).status(status).build(); employeeMapper.update(employee); }
-
補(bǔ)充 EmployeeMapper 中的 update SQL語句:
<update id="update" parameterType="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>
根據(jù)id查詢員工信息
-
在 EmployeeController 員工控制類中編寫接口:
/** * 根據(jù)id查詢員工 * @param id * @return */ @GetMapping("/{id}") @ApiOperation(value = "根據(jù)id查詢員工") public Result<Employee> getById(@PathVariable Long id){ log.info("根據(jù)id查詢員工:{},",id); Employee employee = employeeService.getById(id); return Result.success(employee); }
-
在 EmployeeServiceImpl 實(shí)現(xiàn)類中實(shí)現(xiàn)功能:
@Override public Employee getById(Long id) { Employee employee = employeeMapper.getById(id); employee.setPassword("****"); return employee; }
-
補(bǔ)充 EmployeeMapper 中的 SQL 語句:
/** * 根據(jù)id查詢員工 * @param id * @return */ @Select("select * from employee where id = #{id}") Employee getById(Long id);
編輯員工信息
-
在 EmployeeController 中創(chuàng)建 update 方法:文章來源:http://www.zghlxwxcb.cn/news/detail-615798.html
/** * 編輯員工信息 * @param employeeDTO * @return */ @PutMapping @ApiOperation("編輯員工信息") public Result update(@RequestBody EmployeeDTO employeeDTO){ log.info("編輯員工信息:{}", employeeDTO); employeeService.update(employeeDTO); return Result.success(); }
-
在 EmployeeServiceImpl 中實(shí)現(xiàn) update 方法:文章來源地址http://www.zghlxwxcb.cn/news/detail-615798.html
/**
* 編輯員工信息
*
* @param employeeDTO
*/
public void update(EmployeeDTO employeeDTO) {
Employee employee = new Employee();
BeanUtils.copyProperties(employeeDTO, employee);
employee.setUpdateTime(LocalDateTime.now());
employee.setUpdateUser(BaseContext.getCurrentId());
employeeMapper.update(employee);
}
到了這里,關(guān)于最適合新手的SpringBoot+SSM項(xiàng)目《蒼穹外賣》實(shí)戰(zhàn)—(五)員工管理的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!