Java精品項目瑞吉外賣之員工信息管理篇
上一篇:
一. 員工信息分頁查詢
1. 需求分析
當系統(tǒng)中的用戶越來越多頁面展示不完整,我們需要通過實現(xiàn)分頁的方式去展示員工的信息:

2. 代碼開發(fā)
在開發(fā)代碼之前,需要理清楚程序的執(zhí)行過程與業(yè)務邏輯:
- 頁面發(fā)送Ajax請求,將分頁查詢參數(shù)(page,pagesize,name)提交到服務端服務端
- Controller接收頁面提交的數(shù)據(jù)并調(diào)用查詢的數(shù)據(jù)
- Service調(diào)用Mapper操作數(shù)據(jù)庫,查詢分頁數(shù)據(jù)
- Controller將查詢到的分頁數(shù)據(jù)響應到頁面
- 頁面接收到分頁的數(shù)據(jù)并通過ElementUI的Table組件展示到頁面上

其實頁面的分頁參數(shù)是通過JSON的格式傳值后端,但是為何是圖中是以這種問號的方式拼接的呢,原因是前端將請求進行一個攔截后重新拼接后的結果(前端代碼不再敘述)。
配置分頁插件
package com.itheima.reggie.config;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* 配置Mybatis-plus分頁插件
* @author jektong
* @date 2022年05月01日 0:08
*/
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return mybatisPlusInterceptor;
}
}Controller層
/**
* 員工信息分頁查詢
*
* @param page 當前頁
* @param pageSize 頁碼
* @param name 關鍵字查詢
* @return
*/
@GetMapping("/page")
public R<Page> page(int page, int pageSize, String name) {
log.info("page={},pageSize={},name={}", page, pageSize, name);
// 構造分頁構造器
Page pageInfo = new Page(page, pageSize);
// 構造條件
LambdaQueryWrapper<Employee> queryWrapper = new LambdaQueryWrapper();
queryWrapper.like(StringUtils.isNotEmpty(name), Employee::getName, name).or()
.like(StringUtils.isNotEmpty(name),Employee::getUsername,name);
// 添加排序
queryWrapper.orderByDesc(Employee::getUpdateTime);
// 執(zhí)行查詢
employeeService.page(pageInfo, queryWrapper);
return R.success(pageInfo);
}二. 啟用或禁用員工狀態(tài)
1 需求分析
員工管理列表頁,可以對某個員工狀態(tài)進行啟用或者禁用的操作。賬號禁用的與員工不可登錄系統(tǒng),啟用過后可以正常登錄。這一操作只允許管理員進行操作。
2 代碼開發(fā)
前端核心代碼
頁面中是如何做到只有管理員admin可以看到禁用按鈕的,其實在前端只需獲取到登錄的賬號,然后進行一個用戶名判斷即可:
頁面初始化的時候就獲取登錄賬號:
created() {
this.init()
this.user = JSON.parse(localStorage.getItem('userInfo')).username
},顯示賬號狀態(tài)的那一列:
<el-table-column label="賬號狀態(tài)">
<template slot-scope="scope">
{{ String(scope.row.status) === '0' ? '已禁用' : '正常' }}
</template>
</el-table-column>向后端傳遞JSON的數(shù)據(jù),將需要禁用員工的賬號的ID與狀態(tài)傳值后端,前端主要代碼:
//狀態(tài)修改
statusHandle (row) {
this.id = row.id
this.status = row.status
this.$confirm('確認調(diào)整該賬號的狀態(tài)?', '提示', {
'confirmButtonText': '確定',
'cancelButtonText': '取消',
'type': 'warning'
}).then(() => {
enableOrDisableEmployee({ 'id': this.id, 'status': !this.status ? 1 : 0 }).then(res => {
console.log('enableOrDisableEmployee',res)
if (String(res.code) === '1') {
this.$message.success('賬號狀態(tài)更改成功!')
this.handleQuery()
}
}).catch(err => {
this.$message.error('請求出錯了:' + err)
})
})
},后端核心代碼
/**
* 根據(jù)用戶ID去修改用戶狀態(tài)
* @param request
* @param employee
* @return
*/
@PostMapping
public R<String> update(HttpServletRequest request, @RequestBody Employee employee){
// 獲取員工ID
Long empId = (Long) request.getSession().getAttribute("employee");
employee.setUpdateTime(LocalDateTime.now());
employee.setUpdateUser(empId);
employeeService.updateById(employee);
return R.success("員工信息修改成功");
}其實測試發(fā)現(xiàn)這段代碼是不會被修改成功的,因為涉及一個JS的精度問題,JS識別Long類型只精確到16位,而ID是雪花算法生成的ID有19位,導致ID精度丟失。
代碼修復
如何解決上述問題,將頁面的Long類型轉為字符串。具體步驟:
- 使用JacksonObjectMapper對JSON數(shù)據(jù)進行轉換
- 在WebConfig配置類中擴展SringMVC的消息轉換器,鏡像Java對象到JSON數(shù)據(jù)的轉換
JacksonObjectMapper:
package com.itheima.reggie.common;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;
import org.springframework.stereotype.Component;
import java.math.BigInteger;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES;
/**
* 對象映射器:基于jackson將Java對象轉為json,或者將json轉為Java對象
* 將JSON解析為Java對象的過程稱為 [從JSON反序列化Java對象]
* 從Java對象生成JSON的過程稱為 [序列化Java對象到JSON]
*/
@Component
public class JacksonObjectMapper extends ObjectMapper {
public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
public static final String DEFAULT_TIME_FORMAT = "HH:mm:ss";
public JacksonObjectMapper() {
super();
//收到未知屬性時不報異常
this.configure(FAIL_ON_UNKNOWN_PROPERTIES, false);
//反序列化時,屬性不存在的兼容處理
this.getDeserializationConfig().withoutFeatures(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
SimpleModule simpleModule = new SimpleModule()
.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))
.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)))
.addSerializer(BigInteger.class, ToStringSerializer.instance)
.addSerializer(Long.class, ToStringSerializer.instance)
.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))
.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)));
//注冊功能模塊 例如,可以添加自定義序列化器和反序列化器
this.registerModule(simpleModule);
}
}WebMVCConfig:
/**
* 擴展MVC消息轉換器
* @param converters
*/
@Override
protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
log.info("擴展消息轉換器");
// 創(chuàng)建消息轉換器
MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter();
// 設置對象轉換器,底層使用Jackson將Java對象轉為json
messageConverter.setObjectMapper(new JacksonObjectMapper());
// 將上面的消息轉換器對象追加到MVC框架的轉換器集合中
converters.add(0,messageConverter);
}修復之后員工狀態(tài)可以正常修改,ID也改變?yōu)樽址袷搅耍?/p>

到此這篇關于Java精品項目瑞吉外賣之員工信息管理篇的文章就介紹到這了,更多相關Java員工信息管理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java tomcat環(huán)境變量及idea配置解析
這篇文章主要介紹了Java tomcat環(huán)境變量及idea配置解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-12-12
SpringBoot啟動java.nio.charset.MalformedInputException: I
本文主要介紹了SpringBoot啟動java.nio.charset.MalformedInputException: Input length = 1報錯的解決方案2023-07-07

