Java精品項(xiàng)目瑞吉外賣(mài)之員工信息管理篇
上一篇:
一. 員工信息分頁(yè)查詢
1. 需求分析
當(dāng)系統(tǒng)中的用戶越來(lái)越多頁(yè)面展示不完整,我們需要通過(guò)實(shí)現(xiàn)分頁(yè)的方式去展示員工的信息:
2. 代碼開(kāi)發(fā)
在開(kāi)發(fā)代碼之前,需要理清楚程序的執(zhí)行過(guò)程與業(yè)務(wù)邏輯:
- 頁(yè)面發(fā)送Ajax請(qǐng)求,將分頁(yè)查詢參數(shù)(page,pagesize,name)提交到服務(wù)端服務(wù)端
- Controller接收頁(yè)面提交的數(shù)據(jù)并調(diào)用查詢的數(shù)據(jù)
- Service調(diào)用Mapper操作數(shù)據(jù)庫(kù),查詢分頁(yè)數(shù)據(jù)
- Controller將查詢到的分頁(yè)數(shù)據(jù)響應(yīng)到頁(yè)面
- 頁(yè)面接收到分頁(yè)的數(shù)據(jù)并通過(guò)ElementUI的Table組件展示到頁(yè)面上
其實(shí)頁(yè)面的分頁(yè)參數(shù)是通過(guò)JSON的格式傳值后端,但是為何是圖中是以這種問(wèn)號(hào)的方式拼接的呢,原因是前端將請(qǐng)求進(jìn)行一個(gè)攔截后重新拼接后的結(jié)果(前端代碼不再敘述)。
配置分頁(yè)插件
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分頁(yè)插件 * @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層
/** * 員工信息分頁(yè)查詢 * * @param page 當(dāng)前頁(yè) * @param pageSize 頁(yè)碼 * @param name 關(guān)鍵字查詢 * @return */ @GetMapping("/page") public R<Page> page(int page, int pageSize, String name) { log.info("page={},pageSize={},name={}", page, pageSize, name); // 構(gòu)造分頁(yè)構(gòu)造器 Page pageInfo = new Page(page, pageSize); // 構(gòu)造條件 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 需求分析
員工管理列表頁(yè),可以對(duì)某個(gè)員工狀態(tài)進(jìn)行啟用或者禁用的操作。賬號(hào)禁用的與員工不可登錄系統(tǒng),啟用過(guò)后可以正常登錄。這一操作只允許管理員進(jìn)行操作。
2 代碼開(kāi)發(fā)
前端核心代碼
頁(yè)面中是如何做到只有管理員admin可以看到禁用按鈕的,其實(shí)在前端只需獲取到登錄的賬號(hào),然后進(jìn)行一個(gè)用戶名判斷即可:
頁(yè)面初始化的時(shí)候就獲取登錄賬號(hào):
created() { this.init() this.user = JSON.parse(localStorage.getItem('userInfo')).username },
顯示賬號(hào)狀態(tài)的那一列:
<el-table-column label="賬號(hào)狀態(tài)"> <template slot-scope="scope"> {{ String(scope.row.status) === '0' ? '已禁用' : '正常' }} </template> </el-table-column>
向后端傳遞JSON的數(shù)據(jù),將需要禁用員工的賬號(hào)的ID與狀態(tài)傳值后端,前端主要代碼:
//狀態(tài)修改 statusHandle (row) { this.id = row.id this.status = row.status this.$confirm('確認(rèn)調(diào)整該賬號(hà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('賬號(hào)狀態(tài)更改成功!') this.handleQuery() } }).catch(err => { this.$message.error('請(qǐng)求出錯(cuò)了:' + 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("員工信息修改成功"); }
其實(shí)測(cè)試發(fā)現(xiàn)這段代碼是不會(huì)被修改成功的,因?yàn)樯婕耙粋€(gè)JS的精度問(wèn)題,JS識(shí)別Long類型只精確到16位,而ID是雪花算法生成的ID有19位,導(dǎo)致ID精度丟失。
代碼修復(fù)
如何解決上述問(wèn)題,將頁(yè)面的Long類型轉(zhuǎn)為字符串。具體步驟:
- 使用JacksonObjectMapper對(duì)JSON數(shù)據(jù)進(jìn)行轉(zhuǎn)換
- 在WebConfig配置類中擴(kuò)展SringMVC的消息轉(zhuǎn)換器,鏡像Java對(duì)象到JSON數(shù)據(jù)的轉(zhuǎn)換
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; /** * 對(duì)象映射器:基于jackson將Java對(duì)象轉(zhuǎn)為json,或者將json轉(zhuǎn)為Java對(duì)象 * 將JSON解析為Java對(duì)象的過(guò)程稱為 [從JSON反序列化Java對(duì)象] * 從Java對(duì)象生成JSON的過(guò)程稱為 [序列化Java對(duì)象到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(); //收到未知屬性時(shí)不報(bào)異常 this.configure(FAIL_ON_UNKNOWN_PROPERTIES, false); //反序列化時(shí),屬性不存在的兼容處理 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))); //注冊(cè)功能模塊 例如,可以添加自定義序列化器和反序列化器 this.registerModule(simpleModule); } }
WebMVCConfig:
/** * 擴(kuò)展MVC消息轉(zhuǎn)換器 * @param converters */ @Override protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) { log.info("擴(kuò)展消息轉(zhuǎn)換器"); // 創(chuàng)建消息轉(zhuǎn)換器 MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter(); // 設(shè)置對(duì)象轉(zhuǎn)換器,底層使用Jackson將Java對(duì)象轉(zhuǎn)為json messageConverter.setObjectMapper(new JacksonObjectMapper()); // 將上面的消息轉(zhuǎn)換器對(duì)象追加到MVC框架的轉(zhuǎn)換器集合中 converters.add(0,messageConverter); }
修復(fù)之后員工狀態(tài)可以正常修改,ID也改變?yōu)樽址袷搅耍?/p>
到此這篇關(guān)于Java精品項(xiàng)目瑞吉外賣(mài)之員工信息管理篇的文章就介紹到這了,更多相關(guān)Java員工信息管理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java實(shí)現(xiàn)企業(yè)員工管理系統(tǒng)
- java實(shí)現(xiàn)員工工資管理系統(tǒng)
- Java實(shí)現(xiàn)員工信息管理系統(tǒng)
- Java實(shí)現(xiàn)簡(jiǎn)單員工管理系統(tǒng)
- Java實(shí)戰(zhàn)員工績(jī)效管理系統(tǒng)的實(shí)現(xiàn)流程
- Java 實(shí)戰(zhàn)范例之員工管理系統(tǒng)的實(shí)現(xiàn)
- Java實(shí)現(xiàn)員工管理系統(tǒng)
- 員工管理系統(tǒng)java版
- Java實(shí)現(xiàn)部門(mén)員工管理
相關(guān)文章
Java tomcat環(huán)境變量及idea配置解析
這篇文章主要介紹了Java tomcat環(huán)境變量及idea配置解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-12-12解決使用ProcessBuilder踩到的坑及注意事項(xiàng)
這篇文章主要介紹了解決使用ProcessBuilder踩到的坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06java中的反射及其優(yōu)點(diǎn)說(shuō)明
這篇文章主要介紹了java中的反射及其優(yōu)點(diǎn)說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05mybatis中使用oracle關(guān)鍵字出錯(cuò)的解決方法
這篇文章主要給大家介紹了關(guān)于mybatis中使用oracle關(guān)鍵字出錯(cuò)的解決方法,文中通過(guò)示例代碼將解決的方法介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-08-08springboot中設(shè)置定時(shí)任務(wù)的三種方法小結(jié)
在我們開(kāi)發(fā)項(xiàng)目過(guò)程中,經(jīng)常需要定時(shí)任務(wù)來(lái)幫助我們來(lái)做一些內(nèi)容,本文介紹了springboot中設(shè)置定時(shí)任務(wù)的三種方法,主要包括@Scheduled注解,Quartz框架和xxl-job框架的實(shí)現(xiàn),感興趣的可以了解一下2023-12-12SpringBoot啟動(dòng)java.nio.charset.MalformedInputException: I
本文主要介紹了SpringBoot啟動(dòng)java.nio.charset.MalformedInputException: Input length = 1報(bào)錯(cuò)的解決方案2023-07-07