欧美午夜精品久久久久免费视/欧美黄色精品/国产一级A片在线播出/A片免费视频在线观看

公共字段自動填充1.的方法及解決辦法(上)
2023-02-18 22:00:37 歡樂點

您的支持將是我創作的動力,讓我們一起加油進步吧!!!

一、公共數組手動填充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("修改分類信息成功");
    }

創作不易,假如有幫助到你,請給文章點個贊和收藏,讓更多的人聽到!!!

關注博主不走失,內容持續更新中。

免責聲明:部分文章信息來源于網絡以及網友投稿,本站只負責對文章進行整理、排版、編輯,出于傳遞更多信息之目的,并不意味著贊同其觀點或證實其內容的真實性,如本站文章和轉稿涉及版權等問題,請作者在及時聯系本站,我們會盡快為您處理。

歡樂點

留言咨詢

×