SpringBoot新聞項目學習day3--后臺權限的增刪改查以及權限管理分配

      • 新增管理員
      • 修改管理員
      • 刪除管理員
      • 登錄

新增管理員

1.點擊新增按鈕打開一個對話框

2.確定新增對話框要顯示哪些內容

3.提交

4.后端處理、保存

5.響應前端

vue代碼

<template><!-- 新增代碼內容是比較多的,建議抽取出來,定義到一個獨立的vue文件中在列表組件中導入添加組件--><el-dialog title="新增管理員" :visible.sync="dialogVisible" width="50%"><el-form ref="form" label-width="80px"><el-form-item label="賬號"><el-input v-model="form.account"></el-input></el-form-item><el-form-item label="性別"><el-radio-group v-model="form.gender"><el-radio label="男"></el-radio><el-radio label="女"></el-radio></el-radio-group></el-form-item>
<!-- 			<el-form-item label="生日"><el-date-picker type="date"   placeholder="選擇日期" value-format="yyyy-MM-dd"  v-model="form.birthday"style="width: 100%;"></el-date-picker></el-form-item> --><el-form-item label="電話"><el-input v-model="form.phone"></el-input></el-form-item><el-form-item label="菜單"><!-- 動態獲取--><el-checkbox v-model = "form.menuIds" v-for="menu in menuList" :label="menu.id" :key="menu.id">{{menu.name}}</el-checkbox></el-form-item></el-form><span slot="footer" class="dialog-footer"><el-button @click="dialogVisible = false">取 消</el-button><el-button type="primary" @click="save()">保 存</el-button></span></el-dialog>
</template><script>export default {data() {return {dialogVisible: false,menuList:[],form: {account: "",gender: "",phone: "",menuIds:[]}}},methods: {save(){this.$http.post("adminCtl/addAdmin",this.form).then((resp)=>{if(resp.data.code == 200){this.$message({message:resp.data.message,type:'success'})dialogVisible:false,this.$router.go();//更新當前路由路件}})}},mounted() {this.$http.get("adminCtl/menus").then((resp)=>{if(resp.data.code == 200){this.menuList = resp.data.data;}})}}
</script><style>
</style>

打開添加界面的邏輯代碼

openDialog(){this.$refs.add.dialogVisible=true;
}

image-20250616205910002

Admin增加屬性

image-20250616210054552

后端主要的Service層邏輯

//1.從Token中獲取用戶id

JWTUtil中增加通過Token來獲取id

/** 通過Token獲取Admin對象id* */public static Admin getAdmin(String token){DecodedJWT jwt = JWTUtil.getTokenInfo(token);Integer id = jwt.getClaim("id").asInt();Admin operAdmin = new Admin();operAdmin.setId(id);return operAdmin;}

在Service層

//1.從Token中獲取用戶idAdmin operAdmin = JWTUtil.getAdmin(adminToken);admin.setAdmin(operAdmin);//封裝操作人

//2.生成默認密碼

//2.生成默認密碼 md5加密 111111為初始密碼并進行加密
String md5Password = DigestUtils.md5DigestAsHex("111111".getBytes());admin.setPassword(md5Password);

//3.保存管理信息到admin表

//3.保存管理信息到admin表
adminDao.insertAdmin(admin);
<insert id="insertAdmin" parameterType="Admin" useGeneratedKeys="true" keyColumn="id" keyProperty="id">INSERT INTO admin (account, password, phone, gender, type, adminid, oper_time)VALUES (#{account}, #{password}, #{phone}, #{gender}, #{type}, #{admin.id}, now())
</insert>

//4.保存管理員和菜單關系

Integer[] menuIds = admin.getMenuIds();if(menuIds!=null){for(Integer menuId:menuIds){adminDao.insertAdminMenu(admin.getId(),menuId);}}
 public void addAdmin(@RequestBody Admin admin,String adminToken) {//1.從Token中獲取用戶idAdmin operAdmin = JWTUtil.getAdmin(adminToken);admin.setAdmin(operAdmin);//封裝操作人//2.生成默認密碼 md5加密 111111為初始密碼并進行加密String md5Password = DigestUtils.md5DigestAsHex("111111".getBytes());admin.setPassword(md5Password);//3.保存管理信息到admin表adminDao.insertAdmin(admin);//4.保存管理員和菜單關系Integer[] menuIds = admin.getMenuIds();if(menuIds!=null){for(Integer menuId:menuIds){adminDao.insertAdminMenu(admin.getId(),menuId);}}}

接收端Controller

public Result addAdmin(@RequestBody Admin admin, @RequestHeader("Token")String adminToken) {adminService.addAdmin(admin,adminToken);return new Result(200,"success",null);}

修改管理員

1.點擊編輯按鈕,打開修改對話框

? 獲取修改記錄的id

? 查詢管理員的信息

el-dialog title="修改管理員" :visible.sync="dialogVisible" width="50%"><el-form ref="form" label-width="80px"><el-form-item label="賬號" ><el-input v-model="form.account" disabled></el-input></el-form-item><el-form-item label="性別"><el-radio-group v-model="form.gender"><el-radio label="男"></el-radio><el-radio label="女"></el-radio></el-radio-group></el-form-item><el-form-item label="電話"><el-input v-model="form.phone"></el-input></el-form-item><el-form-item label="菜單"><!-- 動態獲取--><el-checkbox v-model = "form.menuIds" v-for="menu in menuList" :label="menu.id" :key="menu.id">{{menu.name}}</el-checkbox></el-form-item></el-form><span slot="footer" class="dialog-footer"><el-button @click="dialogVisible = false">取 消</el-button><el-button type="primary" @click="save()">保 存</el-button></span></el-dialog>

2.在修改頁面顯示管理員信息

前端1.獲取被修改用戶id

openUpdateDialog(id){this.$refs.update.dialogVisible=true;this.$refs.update.findAdminById(id);
}
findAdminById(id){this.$http.get("adminCtl/findAdminById?id="+id).then((resp)=>{if(resp.data.code == 200){this.form.account = resp.data.data.account;this.form.gender = resp.data.data.gender;this.form.phone = resp.data.data.phone;this.form.menuIds = resp.data.data.menuIds;}})}

后端

? 1.controller層

@RequestMapping(path = "/findAdminById",method = RequestMethod.GET)public Result findAdminById(Integer id) {Admin admin = adminService.findAdminById(id);return new Result(200,"success",admin);}

? 2.Service層

public Admin findAdminById(Integer id) {Admin admin = adminDao.findAdminById(id);//把菜單的每個id轉化為數組Integer[] menusId = admin.getMenus().stream().map(Menu::getId).toArray(Integer[]::new);System.out.println(Arrays.toString(menusId));admin.setMenuIds(menusId);return admin;}

? 3.Dao層

Admin findAdminById(Integer id);

? 4.mybatis

resultMap

666666666+<id column="menuid" property="id"/></collection></resultMap>

? 5.select語句

<select id="findAdminById" parameterType="Integer" resultMap="AdminMenuMap">SELECTa.`id`,a.`account`,a.`gender`,a.`phone`,am.`menuid`FROM admin a LEFT JOIN admin_menu am ON a.id = am.adminid WHERE a.`id` = #{id}</select>

由于查出來的菜單id封裝在Menu數組里面

new attribute of Admin class

private List<Menu> menus;//封裝菜單列表

image-20250617183743493

3.修改管理員信息

前端:將修改的信息放在表單

form: {account: "",gender: "",phone: "",menuIds:[]
}

4.提交修改信息到后端

save(){this.$http.post("adminCtl/addAdmin",this.form).then((resp)=>{if(resp.data.code == 200){this.$message({message:resp.data.message,type:'success'})dialogVisible:false,this.$router.go();//更新當前路由路件}})}

5.后端修改并且響應

Controller層:

修改和更新可以同時在一個方法里,如何區分修改和刪除??

答:當傳入的數據id不等于null那么就是修改操作

@RequestMapping(path = "/addAdmin",method = RequestMethod.POST)/*添加管理員* */public Result addAdmin(@RequestBody Admin admin, @RequestHeader("Token")String adminToken) {if(admin.getId() == null){adminService.addAdmin(admin,adminToken);}else{adminService.updateAdmin(admin,adminToken);}return new Result(200,"success",null);
}

Service層:

public void updateAdmin(Admin admin, String adminToken) {//1.從Token中獲取用戶idAdmin operAdmin = JWTUtil.getAdmin(adminToken);admin.setAdmin(operAdmin);//封裝操作人//2.更新管理員數據到管理員表adminDao.updateAdmin(admin);//3.更新菜單關系//3.1先刪除原有關系adminDao.deleteAdminMenu(admin.getId());//3.2再插入新的關系Integer[] menuIds = admin.getMenuIds();if(menuIds!=null){for(Integer menuId:menuIds){adminDao.insertAdminMenu(admin.getId(),menuId);}}}

Dao層

void updateAdmin(Admin admin);void deleteAdminMenu(Integer id);

Mapper.xml層

<!--    更新管理員信息--><update id="updateAdmin" parameterType="Admin">UPDATE admin SET account = #{account}, phone = #{phone}, gender = #{gender}, oper_time = now() WHERE id = #{id}</update><!--    刪除管理員信息--><delete id="deleteAdminMenu" parameterType="Integer">DELETE FROM admin_menu WHERE adminid = #{id}</delete>

修改前:

image-20250618210351635

image-20250618210405383

修改后:

image-20250618210428534

image-20250618210745641

image-20250618210822333

刪除管理員

1.前端方法 傳遞所要刪除的管理員id

deleteAdmin(id){alert(id)this.$confirm('此操作將永久刪除該文件, 是否繼續?', '提示', {confirmButtonText: '確定',cancelButtonText: '取消',type: 'warning'}).then(() => {this.$http.get("adminCtl/deleteAdminById?id=" + id).then((resp) => {this.$message({type: 'success',message: '刪除成功!'});this.$router.go();})}).catch(() => {// 用戶點擊了取消按鈕,這里可以什么也不做,或者給用戶一個反饋  // 例如,可以使用 this.$message 來顯示一個消息  this.$message({type: 'info',message: '已取消刪除操作'});});}

2.后端

controller層

@RequestMapping(path = "/deleteAdminById",method = RequestMethod.GET)public Result deleteAdminById(Integer id) {adminService.deleteAdminById(id);return new Result(200, "success", null);}

Service層

public void deleteAdminById(Integer id) {//先刪除菜單關系adminDao.deleteAdminMenu(id);//再刪除管理員adminDao.deleteAdminById(id);
}

登錄

1.認證:登錄時候賬號是否存在,驗證上號是否可用

? 由于進行md5加密后,數據庫密碼是加密之后的,所以登錄后端程序需要做以下修改

controller層

@RequestMapping(path = "/login")public Result login(@RequestBody Admin admin){ admin.setPassword(DigestUtils.md5DigestAsHex(admin.getPassword().getBytes()));System.out.println(loginService);Admin admin1 = loginService.login(admin);if(admin1 != null){return new Result(200,"success",admin1);}else {return new Result(400,"fail","用戶名或密碼錯誤");}}

2.授權:根據給管理員分配的權限菜單進行查詢

前端Main界面做一下修改

2.1將管理菜單改為動態

 <el-container><el-aside width="200px" style="background-color: rgb(238, 241, 246)"><el-menu :default-openeds="['1']"  router><el-submenu index="1"><template slot="title"><i class="el-icon-message"></i>操作菜單</template><el-menu-item-group><el-menu-item :index="menu.url" v-for="menu in menuList">{{menu.name}}</el-menu-item><!-- 路由地址 --></el-menu-item-group></el-submenu></el-menu></el-aside><el-main><router-view></router-view></el-main></el-container>

2.2向后端傳送get請求獲取登陸者權限菜單

后端Login模塊

controller層

@RequestMapping(path = "/menus",method = RequestMethod.GET)public Result menus(@RequestHeader("adminToken")String adminToken){List<Menu> menus = loginService.getMenus(adminToken);return new Result(200,"success",menus);}

2.3Service層

public List<Menu> getMenus(String adminToken) {Admin admin = JWTUtil.getAdmin(adminToken);return loginDao.getMenus(admin.getId());}

2.4Dao層

List<Menu> getMenus(Integer id);

2.5Mapper.xml

<select id="getMenus" resultType="Menu">SELECT m.name, m.urlFROM admin_menu amLEFT JOIN menu m ON am.menuid = m.idWHERE am.adminid = #{id}</select>

注意:Menu類里面必修加url屬性

package org.example.model;import lombok.Data;
import org.springframework.stereotype.Component;@Component
@Data
public class Menu {private Integer id;private String name;//增加url屬性private String url;
}

測試:

1.添加zhuguan賦予所有權限(初始密碼為手機后四位)過程略

結果如下

image-20250619112453838

3.擴展作業

image-20250619111736390

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/84807.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/84807.shtml
英文地址,請注明出處:http://en.pswp.cn/web/84807.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

算法導論第二十五章 深度學習的倫理與社會影響

第二十五章 深度學習的倫理與社會影響 技術的光芒不應掩蓋倫理的陰影 隨著深度學習技術在各領域的廣泛應用&#xff0c;其引發的倫理和社會問題日益凸顯。本章將深入探討這些挑戰&#xff0c;并提供技術解決方案和最佳實踐&#xff0c;引導讀者構建負責任的人工智能系統。 25.…

Linux中ansible模塊補充和playbook講解

一、模塊使用 1.1 Yum模塊 功能&#xff1a;管理軟件包&#xff0c;只支持RHEL&#xff0c;CentOS&#xff0c;fedora&#xff0c;不支持Ubuntu其它版本 參數說明name要操作的軟件包名稱&#xff0c;支持通配符&#xff08;如 httpd, nginx*&#xff09;&#xff0c;也可以是…

唐代大模型:智能重構下的盛世文明圖譜

引言&#xff1a;當長安城遇見深度學習 一件唐代鎏金舞馬銜杯銀壺的虛擬復原品正通過全息投影技術演繹盛唐樂舞。這個跨越時空的場景&#xff0c;恰似唐代大模型技術的隱喻——以人工智能為紐帶&#xff0c;連接起長安城的盛世氣象與數字時代的文明重構。作為人工智能與歷史學…

國產ARM/RISCV與OpenHarmony物聯網項目(三)網關設備控制

一、設備控制界面與功能設計 程序界面運行與設計效果如下: 設備控制相關程序調用關系圖如下&#xff1a; 其中device_control.html程序為網頁界面顯示程序&#xff0c;led_alarm.cgi程序為光線數據的報警超限數據設置與管理&#xff0c;led_control.cgi程序功能為對Led燈的開…

微信小程序反編譯實戰教程

在實際滲透測試或安全分析中&#xff0c;經常會遇到微信小程序中的簽名加密&#xff08;sign&#xff09;機制&#xff0c;這些機制大多具備防重放、防篡改的特性&#xff0c;導致我們在抓包時難以直接復現請求。 &#x1f50d; 另一方面&#xff0c;一些小程序的代碼中往往會…

【NLP入門系列三】NLP文本嵌入(以Embedding和EmbeddingBag為例)

&#x1f368; 本文為&#x1f517;365天深度學習訓練營 中的學習記錄博客&#x1f356; 原作者&#xff1a;K同學啊 博主簡介&#xff1a;努力學習的22級本科生一枚 &#x1f31f;?&#xff1b;探索AI算法&#xff0c;C&#xff0c;go語言的世界&#xff1b;在迷茫中尋找光芒…

文心一言(ERNIE Bot):百度打造的知識增強大語言模型

1. 產品概述 文心一言&#xff08;ERNIE Bot&#xff09;是百度自主研發的知識增強大語言模型&#xff0c;于2023年3月16日正式發布&#xff0c;對標OpenAI的ChatGPT&#xff0c;具備文本生成、多模態交互、邏輯推理、中文理解等能力。該模型基于百度的飛槳深度學習平臺和文心…

Java-49 深入淺出 Tomcat 手寫 Tomcat 實現【02】HttpServlet Request RequestProcessor

點一下關注吧&#xff01;&#xff01;&#xff01;非常感謝&#xff01;&#xff01;持續更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持續更新中&#xff01;&#xff08;長期更新&#xff09; 目前2025年06月13日更新到&#xff1a; AI煉丹日志-28 - Aud…

在VB.net中,文本插入的幾個自定義函數

一、如果你是高手&#xff0c;一定“識貨”&#xff0c;分享給你 二、可應用于文本插入的幾種方式&#xff1a;6種 三、需要用到以下的幾個函數&#xff1a; 上代碼&#xff1a; Module TextModule <summary> 在指定位置插入文本 </summary> <p…

QC -io 服務器排查報錯方式/報錯: Failed to convert string to integer of varId variable!“

進斷點控制臺有報錯之后&#xff0c;復制報錯信息到 頭部菜單欄 1.編輯 -> 2.Find/Replace ->3.Advanced Find ->4. Project“xxxxx” 能找到問題點 再分析定位 在排查報錯時候&#xff0c;進入了這個報錯&#xff0c;msgInfo "MyTcpRedis: Failed to conver…

c++中auto與decltype使用

在 C11及后續版本中&#xff0c;關鍵字auto和decltype都是用于類型推導的&#xff0c;但它們的使用場景和行為有所不同。 1. auto 關鍵字 作用 auto 用于自動推導變量的類型&#xff0c;由編譯器根據初始化表達式來確定。 常見用法 // 基本用法 auto x 42; // int…

LabVIEW機器視覺零件檢測

基于LabVIEW 圖形化編程平臺與機器視覺技術&#xff0c;構建集圖像采集、處理、尺寸計算與合格性分析于一體的自動化檢測方案。通過模塊化硬件架構與自適應算法設計&#xff0c;實現對機械零件多維度尺寸的非接觸式高精度測量&#xff0c;相比人工檢測效率提升 12 倍&#xff0…

大數據治理域——實時數據開發

摘要 本文深入探討了大數據治理域中的實時數據開發&#xff0c;重點介紹了流式數據處理的核心價值、特點、技術挑戰、典型能力和應用場景。同時&#xff0c;詳細闡述了流式技術架構&#xff0c;包括數據采集、處理、存儲和服務等環節&#xff0c;并針對大促場景提出了相應的技…

Halcon/C# 圖像窗口、讀取圖片及仿射變換

一、Halcon 清理窗口 清除圖像窗口的顯示。 dev_clear_window() 二、Halcon 讀取圖片 (一) 讀取一張圖片 read_image (Image, printer_chip/printer_chip_01)Image&#xff1a;&#xff08;輸出參數&#xff09;讀取到的圖片變量名 第二個參數&#xff1a;圖片路徑&#xf…

Nginx 反向代理服務和安裝docker-compose

Nginx 反向代理服務和安裝docker-compose Nginx Proxy Manager 他是一個可視化的nginx的反向代理神器&#xff0c;動動手指輕松的配置Nginx&#xff0c;我們可以通過一些網頁&#xff0c;即可完成網站的代理配置&#xff0c;無需在動手安裝Nginx&#xff1b; dockoer-compose部…

FPGA基礎 -- Verilog 鎖存器簡介

由淺入深地講解 Verilog 中的鎖存器&#xff08;Latch&#xff09;**&#xff0c;包括&#xff1a; 什么是鎖存器&#xff08;定義與作用&#xff09;鎖存器的分類&#xff08;透明鎖存器 vs 邊沿觸發器&#xff09;Verilog 中鎖存器的建模方式鎖存器與觸發器的區別鎖存器的時…

Eclipse Memory Analyzer (MAT) 相關配置調整

一、JDK版本過低提示 已安裝高于 jdk 17 的版本依舊提示 jdk 版本過低&#xff0c;打開MAT的安裝目錄&#xff0c;在配置文件 MemoryAnalyzer.ini 中添加配置指向JDK即可。新增兩行配置&#xff1a; -vm D:/jdk_21.0.7/bin/javaw.exe //jdk安裝路徑 bin 目錄下的javaw.exe二…

機器學習常用評估指標

機器學習常用評估指標 機器學習的評價指標有精度、精確率、召回率、P-R曲線、F1 值、TPR、FPR、ROC等指標&#xff0c;還有在生物領域常用的敏感性、特異性等指標。 基礎 在分類任務中&#xff0c;各指標的計算基礎都來自于對正負樣本的分類結果&#xff0c;用混淆矩陣表示&…

視頻相似度檢測算法(帶課設報告)

摘 要 本文提出了一種基于關鍵幀特征提取的視頻相似度檢測方法&#xff0c;通過融合自適應采樣與特征降維技術實現高效準確的視頻內容比對。系統采用三階段處理流程&#xff1a;首先對輸入視頻進行自適應關鍵幀采樣&#xff0c;通過均勻間隔算法提取固定數量&#xff08;默…

微服務江湖的愛恨情仇:Spring Cloud 與 Kubernetes 的雙雄演義

引言&#xff1a;雙雄并立&#xff0c;一個時代的序幕 微服務革命&#xff0c;如同一場燎原之火&#xff0c;將龐大、笨重的單體應用燒成灰燼&#xff0c;宣告了一個敏捷、獨立、快速迭代的新紀元。然而&#xff0c;這場革命在摧毀舊世界的同時&#xff0c;也催生了一片混沌的新…