【尚籌網IDEA版】06-管理員資訊維護

YuanbaoQiang發表於2020-11-09

先前的記錄

【尚籌網IDEA版】01-基本環境空間搭建

【尚籌網IDEA版】02-資料庫建立、Mybatis逆向、Spring整合Mybatis

【尚籌網IDEA版】03-SSM整合測試

【尚籌網IDEA版】04-異常處理、ajax請求等

【尚籌網IDEA版】05-管理員登陸功能

程式碼下載

git clone https://github.com/YuanbaoQiang/atcrowdfunding.git

說明
前端程式碼部落格中不涉及!需要直接看原始碼即可!

分頁功能實現(查詢管理員)

目標

將管理員的資訊通過分頁的形式顯示在頁面上。特殊需求:兼顧關鍵詞查詢,讓後端程式碼不管有沒有查詢條件都可以以分頁形式顯示資料。

思路

image-20201108204640076

程式碼

需要用到PageHelper外掛,配置過程可以參考報錯解決:使用分頁外掛遇到java-lang-ClassNotFoundException-mysql

以下兩個檔案也得先配置好!

image-20201109162410748

handler方法

image-20201108201402007

@RequestMapping("/admin/get/page.html")
public String getPageInfo(
        // 使用@RequestParam註解的default屬性,指定預設值,在請求沒有攜帶對應引數時使用預設值
        // keyword預設值使用空字串,和SQL語句配合實現兩種情況的適配
        @RequestParam(value = "keyword",defaultValue = "") String keyword,

        // pageNum預設值使用1
        @RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum,

        // pageSize預設值使用5
        @RequestParam(value = "pageSize", defaultValue = "5") Integer pageSize,

        // PgaeInfo物件存入模型
        ModelMap modelMap

){
    // 呼叫Service方法獲取PageInfo物件
    PageInfo<Admin> pageInfo = adminService.getPageInfo(keyword, pageNum, pageSize);

    // 將PageInfo物件存入到模型
    modelMap.addAttribute(CrowdConstant.ATTR_NAME_PAGE_INFO, pageInfo);

    return "admin-page";
}

AdminService介面中宣告getPageInfo方法

image-20201108201557249

PageInfo<Admin> getPageInfo(String keyword, Integer pageNum, Integer pageSize);

AdminServiceImpl中重寫getPageInfo方法

@Override
public PageInfo<Admin> getPageInfo(String keyword, Integer pageNum, Integer pageSize) {

    // 1. 呼叫PageHelper的靜態方法,開啟分頁的功能
    // 這裡充分體現了PageHelper的“非侵入式”設計:原本要做的查詢不必有任何的修改
    PageHelper.startPage(pageNum,pageSize);

    // 2. 執行查詢
    List<Admin> adminList = adminMapper.selectAdminByKeyword(keyword);

    // 3. 封裝到PageInfo物件中
    return new PageInfo<>(adminList);
}

關鍵詞查詢功能實現

image-20201108202506294

<select id="selectAdminByKeyword" resultMap="BaseResultMap">
   select id, login_acct, user_pswd, user_name, email, create_time
   from t_admin
   where
      login_acct like concat("%",#{keyword},"%") or
      user_name like concat("%",#{keyword},"%") or
      email like concat("%",#{keyword},"%")
</select>

List<Admin> selectAdminByKeyword(String keyword);

分頁條配置

image-20201108204551372

為了避免死迴圈,需要註釋掉如下資訊!

image-20201109162706563

如果註釋掉頁面還是在無限迴圈,極有可能是頁面資料快取的原因!可以參考:記一次使用JQuery的Pagination分頁外掛時死迴圈BUG定位

新增管理員

目標

建立新的管理員,並通過表單的形式儲存到資料庫。

思路

程式碼

配置view-controller

<mvc:view-controller path="/admin/to/add/page.html" view-name="admin-add"/>

配置handler方法

@RequestMapping("/admin/save.html")
public String save(Admin admin){
    adminService.saveAdmin(admin);
    // 重定向到分頁頁面,使用重定向是為了避免重新整理瀏覽器重複提交表單
    return "redirect:/admin/get/page.html?pageNum=" + Integer.MAX_VALUE;
}

AdminService介面

image-20201109154226048

void saveAdmin(Admin admin);

AdminServiceImpl介面實現類

image-20201109154430143

@Override
public void saveAdmin(Admin admin) {
    // 1. 密碼的加密
    String userPswd = admin.getUserPswd();
    userPswd = CrowdUtil.md5(userPswd);
    admin.setUserPswd(userPswd);

    // 2. 生成建立時間
    Date date = new Date();
    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String createTime = format.format(date);
    admin.setCreateTime(createTime);

    // 3.執行儲存
    try {
        adminMapper.insert(admin);
    } catch (Exception exception) {
        exception.printStackTrace();
        logger.info("異常的全類名=" + exception.getClass().getName());

        // 如果儲存重複的login_acct,則會報錯,上述的logge資訊如下:
        // [異常的全類名=org.springframework.dao.DuplicateKeyException]
        if(exception instanceof DuplicateKeyException){
            throw new LoginAcctAlreadyInUseException(CrowdConstant.MESSAGE_REMOVE_ACCT_ALREADY_IN_USE);
        }

    }
}

涉及到的自定義異常類:LoginAcctAlreadyInUseException

image-20201109154810197

package com.yuanbaoqiang.crowd.exception;

/**
 * @description: 儲存或更新Admin時如果檢測到登陸賬號重複丟擲這個異常
 * @author: YuanbaoQiang
 * @time: 2020/11/9 14:14
 */
public class LoginAcctAlreadyInUseException extends RuntimeException{
    private static final long serialVersionUID = 1L;

    public LoginAcctAlreadyInUseException() {
    }

    public LoginAcctAlreadyInUseException(String message) {
        super(message);
    }

    public LoginAcctAlreadyInUseException(String message, Throwable cause) {
        super(message, cause);
    }

    public LoginAcctAlreadyInUseException(Throwable cause) {
        super(cause);
    }

    public LoginAcctAlreadyInUseException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);
    }
}

異常處理

image-20201109154924125

/*
 * @description: 處理新增
 * @param exception
 * @param request
 * @param response
 * @return: org.springframework.web.servlet.ModelAndView
 * @author: YuanbaoQiang
 * @time: 2020/11/9 15:06
 */
@ExceptionHandler(value = LoginAcctAlreadyInUseException.class)
public ModelAndView resolveLoginAcctAlreadyInUseException(
        LoginAcctAlreadyInUseException exception,
        HttpServletRequest request,
        HttpServletResponse response) throws IOException {
    String viewName = "admin-add";
    return commonResolve(viewName,exception,request,response);
}

刪除管理員

目標

在瀏覽器頁面實現管理員資訊的刪除!

思路

程式碼

handler方法

@RequestMapping("/admin/remove/{adminId}/{pageNum}/{keyword}.html")
public String remove(
        @PathVariable("adminId") Integer adminId,
        @PathVariable("pageNum") Integer pageNum,
        @PathVariable("keyword") String keyword,
        HttpSession session
){

    Admin admin = (Admin) session.getAttribute(CrowdConstant.ATTR_NAME_LOGIN_ADMIN);
    if(admin.getId() == adminId){
        // 此時預刪除的管理員的id和正在登陸的管理員的id重合,需要丟擲異常
        throw new RuntimeException(CrowdConstant.MESSAGE_REMOVE_ACCT_ALREADY_IN_USE);
    }else{
        // 執行刪除命令
        adminService.removeAdminById(adminId);
        // 頁面的跳轉:回到分頁的頁面
        // 嘗試方案1:直接轉發admin-page.jsp會無法顯示分頁資料
        // return "admin-page";

        // 嘗試方案2:轉發到admin/get/page.html,一旦重新整理會重複執行刪除的操作,浪費效能
        // return "admin/get/page.html"

        // 嘗試方案3:重定向到admin/get/page.html地址
        // 同時為了保持原本所在的頁面和查詢關鍵詞再附加pageNum和keyword兩個請求引數

    }
    return "redirect:/admin/get/page.html?pageNum=" + pageNum + "&keyword=" + keyword;
}

AdminService介面

void removeAdminById(Integer adminId);

AdminServiceImpl實現類方法

@Override
public void removeAdminById(Integer adminId) {
    adminMapper.deleteByPrimaryKey(adminId);
}

修改管理員

目標

通過頁面上的表單來修改管理員的資訊

思路

image-20201109161308219

程式碼

handler方法

@RequestMapping("/admin/update.html")
public String update(
        Admin admin,
        @RequestParam("pageNum") Integer pageNum,
        @RequestParam("keyword") String keyword
){

    adminService.update(admin);

    return "redirect:/admin/get/page.html?pageNum=" + pageNum + "&keyword=" + keyword;

}

AdminService介面

image-20201109161631959

void update(Admin admin);

AdminServiceImpl介面實現類

image-20201109161746641

@Override
public void update(Admin admin) {
    // "Selective"表示有選擇的更新,對於null值的欄位不更新
    try {
        adminMapper.updateByPrimaryKeySelective(admin);
    } catch (Exception exception) {
        exception.printStackTrace();
        logger.info("異常的全類名為:" + exception.getClass().getName());

        if(exception instanceof DuplicateKeyException){
            throw new LoginAcctAlreadyInUseForUpdateException(CrowdConstant.MESSAGE_REMOVE_ACCT_ALREADY_IN_USE);
        }
    }
}

相關文章