您的支持將是我創作的動力,讓我們一起加油進步吧!!!
一、公共數組手動填充1.問題剖析
后面我們早已完成了后臺系統的職工管理功能開發,在新增職工時須要設置創建時間、創建人、修改時間、修改人等數組,在編輯職工時須要設置更改時間和更改人等數組。這種數組屬于公共數組,也就是好多表中都有這種數組,如下:
能不能對于這種公共數組在某個地方統一處理,來簡化開發呢?
答案就是使用Plus提供的公共數組手動填充功能。
2.代碼實現
Plus公共數組手動填充,也就是在插入或則更新的時侯為指定主鍵賦于指定的值,使用它的用處就是可以統一對這種數組進行處理,防止了重復代碼。
實現步驟:
1、在實體類的屬性上加入@注解,指定手動填充的策略
@TableField(fill = FieldFill.INSERT) //插入時填充字段
private LocalDateTime createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)//插入和更新時填充字段
private LocalDateTime updateTime;
@TableField(fill = FieldFill.INSERT)
private Long createUser;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Long updateUser;
2、按照框架要求編撰元數據對象處理器,在這種中統一為公共數組形參,這種須要實現插口
/**
* 自定義元數據對象處理器
*/
@Slf4j
@Component
public class MyMetaObjecthandler implements MetaObjectHandler {
/**
* 插入操作,自動填充
* @param metaObject
*/
@Override
public void insertFill(MetaObject metaObject) {
log.info("公共字段自動填充[insert]...");
log.info(metaObject.toString());
metaObject.setValue("createTime", LocalDateTime.now());
metaObject.setValue("updateTime", LocalDateTime.now());
metaObject.setValue("createUser", new Long(1));
metaObject.setValue("updateUser", new Long(1));
}
/**
* 更新操作,自動填充
* @param metaObject
*/
@Override
public void updateFill(MetaObject metaObject) {
log.info("公共字段自動填充[update]...");
log.info(metaObject.toString());
long id = Thread.currentThread().getId();
log.info("線程id為:{}",id);
metaObject.setValue("updateTime", LocalDateTime.now());
metaObject.setValue("updateUser", new Long(1));
}
}
功能健全
后面我們早已完成了公共數組手動填充功能的代碼開發,而且還有一個問題沒有解決,就是我們在手動填充和時設置的用戶id是固定值,如今我們須要改導致動態獲取當前登入用戶的id。
有的朋友可能想到,用戶登陸成功后我們將用戶id存入了中,如今我從中獲取不就行了?
注意:我們在類中是不能獲得對象的,所以我們須要通過其他方法來獲取登陸用戶id。
可以使用來解決此問題,它是JDK中提供的一個類。
在學習之前,我們須要先確認一個事情,就是顧客端發送的每次http懇求,對應的在服務端就會分配一個新的線程來處理點餐系統點餐系統,在處理過程中涉及到下邊類中的方式都屬于相同的一個線程:
1、的方式
2、的方式
3、的方式
可以在里面的三個方式中分別加入下邊代碼(獲取當前線程id):
long id = Thread.currentThread().getId();
log.info("線程id為:{}",id);
執行編輯職工功能進行驗證,通過觀察控制臺輸出可以發覺,一次懇求對應的線程id是相同的:
哪些是?
并不是一個,而是的局部變量。當使用維護變量時,為每位使用該變量的線程提供獨立的變量副本,所以每一個線程都可以獨立地改變自己的副本,而不會影響其它線程所對應的副本。
為每位線程提供單獨一份儲存空間,具有線程隔離的療效,只有在線程內就能獲取到對應的值,線程外則不能訪問。
常用方式:
我們可以在的方式中獲取當前登入用戶id,并調用的set方式來設置當前線程的線程局部變量的值(用戶id),之后在的方式中調用的get方式來獲得當前線程所對應的線程局部變量的值(用戶id)。
實現步驟
1、編寫工具類,基于封裝的工具類
/**
* 基于ThreadLocal封裝工具類,用戶保存和獲取當前登錄用戶id
*/
public class BaseContext {
private static ThreadLocal<Long> threadLocal = new ThreadLocal<>();
/**
* 設置值
* @param id
*/
public static void setCurrentId(Long id){
threadLocal.set(id);
}
/**
* 獲取值
* @return
*/
public static Long getCurrentId(){
return threadLocal.get();
}
}
2、在的方式中調用來設置當前登入用戶的id
if(request.getSession().getAttribute("employee") != null){
log.info("用戶已登錄,用戶id為:{}", request.getSession().getAttribute("employee"));
Long empId = (Long) request.getSession().getAttribute("employee");
BaseContext.setCurrentId(empId);
filterChain.doFilter(request, response);
return;
}
3、在的方式中調用獲取登陸用戶的id
@Slf4j
@Component
public class MyMetaObjecthandler implements MetaObjectHandler {
/**
* 插入操作,自動填充
* @param metaObject
*/
@Override
public void insertFill(MetaObject metaObject) {
log.info("公共字段自動填充[insert]...");
log.info(metaObject.toString());
metaObject.setValue("createTime", LocalDateTime.now());
metaObject.setValue("updateTime", LocalDateTime.now());
metaObject.setValue("createUser", BaseContext.getCurrentId());
metaObject.setValue("updateUser", BaseContext.getCurrentId());
}
/**
* 更新操作,自動填充
* @param metaObject
*/
@Override
public void updateFill(MetaObject metaObject) {
log.info("公共字段自動填充[update]...");
log.info(metaObject.toString());
long id = Thread.currentThread().getId();
log.info("線程id為:{}",id);
metaObject.setValue("updateTime", LocalDateTime.now());
metaObject.setValue("updateUser", BaseContext.getCurrentId());
}
}
二、新增分類1.需求剖析
后臺系統中可以管理分類信息,分類包括兩種類型,分別是菜肴分類和套餐分類。當我們在后臺系統中添加菜肴時須要選擇一個菜肴分類,當我們在后臺系統中添加一個套餐時須要選擇一個套餐分類,在聯通端也會根據食材分類和套餐分類來展示對應的食材和套餐。
2.數據模型
新增分類,雖然就是將我們新增窗口錄入的分類數據插入到表,表結構如下:
3.代碼開發4.功能測試
三、分類信息分類查詢1.需求剖析
系統中的分類好多的時侯,假如在一個頁面中全部展示下來會變得比較亂,不易于查看,所以通常的系統中還會以分頁的形式來展示列表數據。
2.代碼實現
@GetMapping("/page")
public R<Page> page(int page, int pageSize) {
//分頁構造器
Page<Category> pageInfo = new Page<>(page, pageSize);
//條件構造器
LambdaQueryWrapper<Category> queryWrapper = new LambdaQueryWrapper<>();
//添加排序條件,根據sort進行排序
queryWrapper.orderByAsc(Category::getSort);
//分頁查詢
categoryService.page(pageInfo, queryWrapper);
return R.success(pageInfo);
}
3.功能測試
四、刪除分類1.需求剖析
在分類管理列表頁面,可以對某個分類進行刪掉操作。須要注意的是當分類關聯了菜肴或則套餐時,此分類不容許刪掉。
2.代碼實現
@DeleteMapping
public R<String> delete(Long id) {
log.info("刪除分類,id為{}", id);
categoryService.removeById(id);
//代碼完善之后categoryService.remove(id);
return R.success("分類信息刪除成功");
}
3.代碼構建
后面我們早已實現了按照id刪掉分類的功能,而且并沒有檢測刪掉的分類是否關聯了菜肴或則套餐,所以我們須要進行功能健全。
要建立分類刪掉功能,須要先打算基礎的類和插口:
1、實體類Dish和
@Data
public class Dish implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
//菜品名稱
private String name;
//菜品分類id
private Long categoryId;
//菜品價格
private BigDecimal price;
//商品碼
private String code;
//圖片
private String image;
//描述信息
private String description;
//0 停售 1 起售
private Integer status;
//順序
private Integer sort;
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
@TableField(fill = FieldFill.INSERT)
private Long createUser;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Long updateUser;
}
@Data
public class Setmeal implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
//分類id
private Long categoryId;
//套餐名稱
private String name;
//套餐價格
private BigDecimal price;
//狀態 0:停用 1:啟用
private Integer status;
//編碼
private String code;
//描述信息
private String description;
//圖片
private String image;
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
@TableField(fill = FieldFill.INSERT)
private Long createUser;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Long updateUser;
}
2、接口和
@Mapper
public interface DishMapper extends BaseMapper<Dish> {
}
@Mapper
public interface SetmealMapper extends BaseMapper<Setmeal> {
}
3、接口和
public interface DishService extends IService<Dish> {
}
public interface SetmealService extends IService<Setmeal> {
}
4、實現類和
@Service
public class DishServiceImpl extends ServiceImpl<DishMapper, Dish> implements DishService {
}
@Service
public class SetmealServiceImpl extends ServiceImpl<SetmealMapper, Setmeal> implements SetmealService {
}
關鍵代碼
五、修改分類1.需求剖析
在分類管理列表頁面點擊更改按鍵,彈出更改窗口,在更改窗口回顯分類信息并進行更改,最后點擊確定按鍵完成更改操作。
2.代碼實現
@PutMapping
public R<String> update(@RequestBody Category category){
log.info("修改分類信息:{}",category);
categoryService.updateById(category);
return R.success("修改分類信息成功");
}
創作不易,假如有幫助到你,請給文章點個贊和收藏,讓更多的人聽到!!!
關注博主不走失,內容持續更新中。
免責聲明:部分文章信息來源于網絡以及網友投稿,本站只負責對文章進行整理、排版、編輯,出于傳遞更多信息之目的,并不意味著贊同其觀點或證實其內容的真實性,如本站文章和轉稿涉及版權等問題,請作者在及時聯系本站,我們會盡快為您處理。