java 角色管理代码_后台管理系统-角色管理模块
1 角色管理設計說明
1.1 業務設計說明
本模塊主要實現的是企業內部角色(崗位)的管理,可以在添加角色時,為角色分配資源訪問權限,最后將角色再分配給用戶,圖所示:
基于對表的設計,其數據邏輯關系的展示,如圖所示:
角色表設計腳本如下:CREATE TABLE `sys_roles` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(100) DEFAULT NULL COMMENT '角色名稱',
`note` varchar(500) DEFAULT NULL COMMENT '備注',
`createdTime` datetime DEFAULT NULL COMMENT '創建時間',
`modifiedTime` datetime DEFAULT NULL COMMENT '修改時間',
`createdUser` varchar(20) DEFAULT NULL COMMENT '創建用戶',
`modifiedUser` varchar(20) DEFAULT NULL COMMENT '修改用戶',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=46 DEFAULT CHARSET=utf8 COMMENT='角色';
菜單與角色的關系表腳本設計如下:CREATE TABLE `sys_role_menus` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`role_id` int(11) DEFAULT NULL COMMENT '角色ID',
`menu_id` int(11) DEFAULT NULL COMMENT 'ID',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='角色與菜單對應關系';
用戶與角色關系表設計腳本如下:CREATE TABLE `sys_user_roles` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) DEFAULT NULL COMMENT '用戶ID',
`role_id` int(11) DEFAULT NULL COMMENT '角色ID',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='用戶與角色對應關系';
1.2 原型設計說明
基于用戶需求,通過靜態頁面為用戶呈現角色模塊的基本需求。當在主頁點擊角色管理時,呈現角色列表頁面,如圖所示。
在列表頁面點擊添加按鈕時,呈現角色編輯頁面,如圖所示.
在列表頁面點擊編輯按鈕時,呈現角色編輯頁面,如圖所示。
說明:假如客戶對此原型進行了確認,后續則可以基于此原型進行研發。
1.3 API設計說明
角色管理業務后臺API分層架構及調用關系如圖所示:
說明:分層目的主要將復雜問題簡單化,實現各司其職,各盡所能。
2 角色管理列表頁面呈現
2.1 業務時序分析
角色列表頁面,其加載時序分析,如圖所示:
2.2 服務端實現
2.2.1 Controller實現
? 業務描述與設計實現
基于角色管理的請求業務,在PageController中添加返回角色頁面相關方法。
? 關鍵代碼設計與實現
檢查PageController中是否有返回UI頁面的方法,有則無需添加。例如:@RequestMapping("{module}/{moduleUI}")
public String doModuleUI(@PathVariable String moduleUI) {
return "sys/"+moduleUI;
}
2.3 客戶端實現
2.3.1 首頁菜單事件處理
? 業務描述與設計實現
首先準備角色列表頁面(/templates/pages/sys/role_list.html),然后在starter.html頁面中點擊菜單管理時異步加載角色列表頁面。
? 關鍵代碼設計與實現
找到項目中的starter.html 頁面,頁面加載完成以后,注冊菜單管理項的點擊事件,當點擊角色管理時,執行事件處理函數。關鍵代碼如下:$(function(){
…
doLoadUI("load-role-id","role/role_list")
})
function doLoadUI(id,url){
$("#"+id).click(function(){
$("#mainContentId").load(url);
});
}
其中,load函數為jquery中的ajax異步請求函數。
2.3.2 角色列表頁面
? 業務描述與設計實現
本頁面呈現角色信息時要以分頁形式進行呈現。
? 關鍵代碼設計與實現:
參考sys_role.html文件內容。
3 角色管理列表數據呈現
3.1 數據架構分析
角色列表頁面加載完成,啟動角色數據異步加載操作,本次角色列表頁面要以分頁形式呈現角色信息,其數據查詢時,數據的封裝及傳遞過程,如圖所示。
說明:本模塊將從數據庫查詢到的角色數據封裝到SysRole對象,一行記錄一個SysRole對象。
角色數據分頁查詢時,其時序分析如圖所示:
3.2 服務端關鍵業務及代碼實現
3.2.1 Entity類實現
? 業務描述及設計實現
構建實體對象(POJO)封裝從數據庫查詢到的記錄,一行記錄映射為內存中一個的這樣的對象。對象屬性定義時盡量與表中字段有一定的映射關系,并添加對應的set/get/toString等方法,便于對數據進行更好的操作。
? 關鍵代碼分析及實現package com.cy.pj.sys.entity;
import java.io.Serializable;
import java.util.Date;
public class SysRole implements Serializable{
private static final long serialVersionUID = -356538509994150709L;
private Integer id;
private String name;
private String note;
private Date createdTime;
private Date modifiedTime;
private String createdUser;
private String modifiedUser;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNote() {
return note;
}
public void setNote(String note) {
this.note = note;
}
public Date getCreatedTime() {
return createdTime;
}
public void setCreatedTime(Date createdTime) {
this.createdTime = createdTime;
}
public Date getModifiedTime() {
return modifiedTime;
}
public void setModifiedTime(Date modifiedTime) {
this.modifiedTime = modifiedTime;
}
public String getCreatedUser() {
return createdUser;
}
public void setCreatedUser(String createdUser) {
this.createdUser = createdUser;
}
public String getModifiedUser() {
return modifiedUser;
}
public void setModifiedUser(String modifiedUser) {
this.modifiedUser = modifiedUser;
}
}
說明:通過此對象除了可以封裝從數據庫查詢的數據,還可以封裝客戶端請求數據,實現層與層之間數據的傳遞。
3.2.2 Dao接口實現
? 業務描述及設計實現
通過數據層對象,基于業務層參數數據查詢角色記錄總數以及當前頁面要呈現的角色信息。
? 關鍵代碼分析及實現:
第一步:定義角色數據層接口對象,通過將此對象保證給業務層以提供角色數據操作。代碼如下:@Mapper
public interface SysRoleDao {
}
第二步:在SysRoleDao接口中添加getRowCount方法用于按條件統計記錄總數。代碼如下:int getRowCount(@Param("name") String name);
第三步:在SysRoleDao接口中添加findPageObjects方法,基于此方法實現當前頁記錄的數據查詢操作。代碼如下:List findPageObjects(
@Param("name")String name,
@Param("startIndex")Integer startIndex,
@Param("pageSize")Integer pageSize);
說明:
1) 當DAO中方法參數多余一個時盡量使用@Param注解進行修飾并指定名字,然后再Mapper文件中便可以通過類似#{username}方式進行獲取,否則只能通過#{arg0},#{arg1}或者#{param1},#{param2}等方式進行獲取。
2) 當DAO方法中的參數應用在動態SQL中時無論多少個參數,盡量使用@Param注解進行修飾并定義。
3.2.3 Mapper文件實現
? 業務描述及設計實現
基于Dao接口創建映射文件,在此文件中通過相關元素(例如select)描述要執行的數據操作。
? 關鍵代碼設計及實現
第一步:在映射文件的設計目錄中添加SysRoleMapper.xml映射文件,代碼如下:<?xml version="1.0" encoding="UTF-8"?>
/p>
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
第二步:在映射文件中添加sql元素實現,SQL中的共性操作,代碼如下:
name like concat("%",#{name},"%")
第三步:在映射文件中添加id為getRowCount元素,按條件統計記錄總數,代碼如下:
resultType="int">
select count(*)
from sys_roles
第四步:在映射文件中添加id為findPageObjects元素,實現分頁查詢。代碼如下:
resultType="com.cy.pj.sys.entity.SysRole">
select *
from sys_roles
order by createdTime desc
limit #{startIndex},#{pageSize}
思考:
1) 動態sql:基于用于需求動態拼接SQL
2) Sql標簽元素的作用是什么?對sql語句中的共性進行提取,以遍實現更好的復用.
3) Include標簽的作用是什么?引入使用sql標簽定義的元素
3.2.4 Service接口及實現類
? 業務描述與設計實現
在角色分頁查詢中,業務層對象主要負責對業務數據進行校驗,并借助數據層對象完成數據的分頁查詢操作。
? 關鍵代碼設計及實現
第一步:定義角色業務接口及方法,暴露外界對角色業務數據的訪問,其代碼參考如下:package com.cy.pj.sys.service;
public interface SysRoleService {
PageObject findPageObjects(
String name,Integer pageCurrent);
}
第二步:定義角色業務接口實現類,并添加角色業務數據分頁查詢操作的具體實現,其代碼參考如下:package com.cy.pj.sys.service.impl;
import org.springframework.util.StringUtils;
@Service
public class SysRoleServiceImpl implements SysRoleService {
@Autowired
private SysRoleDao sysRoleDao;
@Override
public PageObject findPageObjects(
String name,Integer pageCurrent) {
//1.對參數進行校驗
if(pageCurrent==null||pageCurrent<1)
throw new IllegalArgumentException("當前頁碼值無效");
//2.查詢總記錄數并進行校驗
int rowCount=sysRoleDao.getRowCount(name);
if(rowCount==0)
throw new ServiceException("沒有找到對應記錄");
//3.查詢當前頁記錄
int pageSize=2;
int startIndex=(pageCurrent-1)*pageSize;
List records=
sysRoleDao.findPageObjects(name,
startIndex, pageSize);
//4.對查詢結果進行封裝并返回
return new PageObject<>(pageCurrent, pageSize,
rowCount, records);
}
}
3.2.5 Controller類實現
? 業務描述與設計實現
控制層對象主要負責請求和響應數據的處理,例如,本模塊通過業務層對象執行業務邏輯,再通過VO對象封裝響應結果(主要對業務層數據添加狀態信息),最后將響應結果轉換為JSON格式的字符串響應到客戶端。
? 關鍵代碼設計與實現
定義Controller類,并將此類對象使用Spring框架中的@RestController注解進行標識,表示此類對象要交給Spring管理。然后基于@RequestMapping注解為此類定義根路徑映射。代碼參考如下:package com.cy.pj.sys.controller;
@RequestMapping("/role/")
@RestController
public class SysRoleController {
private SysRoleService sysRoleService;
}
在Controller類中添加菜單查詢處理方法,代碼參考如下:@RequestMapping("doFindPageObjects")
public JsonResult doFindPageObjects(
String name,Integer pageCurrent) {
return new JsonResult(
sysRoleService.findPageObjects(name,
pageCurrent));
}
3.3 客戶端關鍵業務及代碼實現
3.3.1 菜單列表信息呈現
? 業務描述與設計實現
角色分頁頁面加載完成以后,向服務端發起異步請求加載角色信息,當角色信息加載完成需要將角色信息、分頁信息呈現到列表頁面上。
? 關鍵代碼設計與實現
異步請求處理函數,關鍵代碼如下:
第一步:分頁頁面加載完成,向服務端發起異步請求,代碼參考如下:$(function(){
//為什么要將doGetObjects函數寫到load函數對應的回調內部。
$("#pageId").load("doPageUI", doGetObjects)
});
第二步:定義異步請求處理函數,代碼參考如下:function doGetObjects(){
//debugger;//斷點調試
//1.定義url和參數
var url="role/doFindPageObjects"
var params={"pageCurrent":1};//pageCurrent=2
//2.發起異步請求
$.getJSON(url,params,function(result){
doHandleResponseResult(result);
}
);//特殊的ajax函數
}
第三步:定義回調函數,處理服務端的響應結果。代碼如下:function doHandleResponseResult (result){ //JsonResult
if(result.state==1){//ok
//更新table中tbody內部的數據
doSetTableBodyRows(result.data.records);//將數據呈現在頁面上
//更新頁面page.html分頁數據
doSetPagination(result.data); //此方法寫到page.html中
}else{
alert(result.msg);
}
}
第四步:將異步響應結果呈現在table的tbody位置。代碼參考如下:function doSetTableBodyRows(records){
//1.獲取tbody對象,并清空對象
var tBody=$("#tbodyId");
tBody.empty();
//2.迭代records記錄,并將其內容追加到tbody
for(var i in records){
//2.1 構建tr對象
var tr=$("
");//2.2 構建tds對象
var tds=doCreateTds(records[i]);
//2.3 將tds追加到tr中
tr.append(tds);
//2.4 將tr追加到tbody中
tBody.append(tr);
}
}
第五步:創建每行中的td元素,并填充具體業務數據。代碼參考如下:function doCreateTds(row,i){
var tds=
"
"+(parseInt(i)+1)+""+"
"+row.name+""+"
"+row.note+""+"
"+new Date(row.createdTime).toLocaleString()+""+"
"+new Date(row.modifiedTime).toLocaleString()+""+"
"+row.createdUser+""+"
"+row.modifiedUser+""+"
delete"+"?update
";return tds;
}
4 角色管理刪除操作實現
4.1 業務時序分析
基于用戶在列表頁面上選擇的的用戶記錄ID,執行刪除操作,本次刪除業務實現中,首先要基于id刪除角色菜單關系數據,然后基于id刪除用戶角色關系數據,最后刪除角色自身信息,如圖所示:
4.2 服務端關鍵業務及代碼實現
4.2.1 Dao接口實現
? 業務描述及設計實現
數據層基于業務層提交的角色記錄id,先刪除角色相關的關系數據,然后刪除角色自身記錄信息。
? 關鍵代碼設計及實現:
第一步:在創建SysRoleMenuDao并定義基于角色id刪除關系數據的方法,關鍵代碼如下:public interface SysRoleMenuDao {
int deleteObjectsByRoleId(Integer roleId);
}
第二步:創建SysUserRoleDao并定義基于角色id刪除關系數據的方法,關鍵代碼如下:public interface SysUserRoleDao {
int deleteObjectsByRoleId(Integer roleId);
}
第三步:在SysRoleDao中添加基于菜單id刪除角色記錄的方法。代碼參考如下:int deleteObject(Integer id);
4.2.2 Mapper文件實現
? 業務描述及設計實現
在SysRoleMenuDao,SysUserRoleDao,SysRoleDao接口對應的映射文件中添加用于執行刪除業務的delete元素,然后在元素內部定義具體的SQL實現。
? 關鍵代碼設計與實現
第一步:創建SysRoleMenuMapper.xml文件并添加基于菜單id刪除關系數據的元素,關鍵代碼如下:<?xml version="1.0" encoding="UTF-8"?>
/p>
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
parameterType="int">
delete from sys_role_menus
where role_id=#{roleId}
第二步:在SysUserRoleMapper.xml文件中添加基于id刪除用戶角色關系數據的元素,關鍵代碼如下:
delete from sys_user_roles
where role_id=#{roleId}
第三步:在SysRoleMapper.xml文件添加delete元素,基于角色id刪除角色自身記錄信息,關鍵代碼如下:
delete from sys_roles
where id =#{id}
4.2.3 Service接口及實現類
? 業務描述與設計實現
在角色業務層定義用于執行角色刪除業務的方法,首先通過方法參數接收控制層傳遞的角色id,并對參數id進行校驗。然后基于角色id刪除角色菜單關系數據,用戶角色關系數據。最后刪除自身記錄信息后并返回業務執行結果。
? 關鍵代碼設計與實現
第一步:在SysRoleService接口中,添加基于id進行角色刪除的方法。關鍵代碼如下:int deleteObject(Integer id);
第二步:在SysRoleServiceImpl實現類中注入SysRoleMenuDao,SysUserRoleDao相關對象。關鍵代碼如下:@Autowired
private SysRoleMenuDao sysRoleMenuDao;
@Autowired
private SysUserRoleDao sysUserRoleDao;
第二步:在SysRoleServiceImpl實現類中添加刪除業務的具體實現。關鍵代碼如下:@Override
public int deleteObject(Integer id) {
//1.驗證數據的合法性
if(id==null||id<=0)
throw new IllegalArgumentException("請先選擇");
//3.基于id刪除關系數據
sysRoleMenuDao.deleteObjectsByRoleId(id);
sysUserRoleDao.deleteObjectsByRoleId(id);
//4.刪除角色自身
int rows=sysRoleDao.deleteObject(id);
if(rows==0)
throw new ServiceException("此記錄可能已經不存在");
//5.返回結果
return rows;
}
4.2.4 Controller類實現
? 業務描述與設計實現
在角色控制層對象中,添加用于處理角色刪除請求的方法。首先在此方法中通過形參接收客戶端提交的數據,然后調用業務層對象執行刪除操作,最后封裝執行結果,并在運行時將響應對象轉換為JSON格式的字符串,響應到客戶端。
? 關鍵代碼設計與實現
第一步:在SysRoleController中添加用于執行刪除業務的方法。代碼如下:@RequestMapping("doDeleteObject")
public JsonResult doDeleteObject(Integer id){
sysRoleService.deleteObject(id);
return new JsonResult("delete ok");
}
第二步:啟動tomcat進行訪問測試,打開瀏覽器輸入如下網址:http://localhost/role/doDeleteObject?id=10
4.3 客戶端關鍵業務及代碼實現
4.3.1 菜單列表頁面事件處理
? 業務描述及設計實現
用戶在頁面上首先選擇要刪除的元素,然后點擊刪除按鈕,將用戶選擇的記錄id異步提交到服務端,最后在服務端執行角色的刪除動作。
? 關鍵代碼設計與實現
第一步:頁面加載完成以后,在刪除按鈕上進行點擊事件注冊。關鍵代碼如下:$(".input-group-btn")
.on("click",".btn-delete",doDeleteObject)
第二步:定義刪除操作對應的事件處理函數。關鍵代碼如下:function doDeleteObject(){
//1.獲取選中的值(分頁顯示記錄時在tr上要綁定id的值)
var id=$(this).parents("tr").data("id");
//2.構建參數對象
var params={id:id};
//3.異步請求執行刪除
var url="role/doDeleteObject";
$.post(url,params,function(result){
if(result.state==1){
alert(result.message);
doGetObjects();
}else{
alert(result.message);
}
})
}
5 角色添加頁面呈現
5.1 業務時序分析
點擊角色列表上的添加按鈕,其時序分析,如圖所示:
5.2 準備角色編輯頁面
準備角色編輯頁面(/templates/pages/sys/role_edit.html)
5.3 角色編輯頁面呈現
? 業務描述與設計實現
在角色列表頁面中點擊添加按鈕時,呈現角色編輯頁面。
? 關鍵代碼設計與實現
第一步:角色列表事件注冊,關鍵代碼如下:$(document).ready(function(){
...
$(".input-group-btn")
.on("click",".btn-add",doLoadEditUI);
});
第二步:定義角色列表頁面添加按鈕的事件處理函數,關鍵代碼如下://異步加載編輯頁面
function doLoadEditUI(){
var title;
//hasClass函數用于判定對象中是否包含某個樣式
if($(this).hasClass("btn-add")){
title="角色添加";
}else{
title="角色修改";
}
loadPageUI(url);
}
5.4 角色編輯頁面事件處理
? 業務描述與設計實現
角色編輯頁面加載完成,異步加載菜單信息并呈現在頁面上。
? 關鍵代碼設計與實現
第一步:頁面中引入zTree相關JS
第二步:頁面上定義zTree初始配置var zTree;
var setting = {
data : {
simpleData : {
enable : true,
idKey : "id", //節點數據中保存唯一標識的屬性名稱
pIdKey : "parentId", //節點數據中保存其父節點唯一標識的屬性名稱
rootPId : null //根節點id
}
},
check:{
enable:true,
nocheckInherit:true
}
}
第三步:異步加載菜單信息并進行呈現。function doLoadSysMenus(){
var url="menu/doFindZtreeMenuNodes"
$.getJSON(url,function(result){
if(result.state==1){
zTree=$.fn.zTree.init(
$("#menuTree"),setting,result.data);
}else{
alert(result.message);
}
});
}
6 角色數據添加實現
6.1 數據基本架構分析
用戶在角色編輯頁面輸入數據,然后異步提交到服務端,其簡易數據傳遞基本架構,如圖所示:
角色數據保存時,數據時序圖分析,
如圖所示:
6.2 服務端關鍵業務及代碼實現
6.2.1 DAO接口定義
? 業務描述與設計實現
負責將用戶提交的角色數據,持久化到數據庫。
? 關鍵代碼設計與實現
在SysRoleDao接口中定義數據持久化方法:int insertObject(SysRole entity);
SysRoleMenuDao接口中方法定義(不存在則創建)int insertObjects(
@Param("roleId")Integer roleId,
@Param("menuIds")Integer[] menuIds);
6.2.2 Mapper映射文件定義
? 業務描述與設計實現
基于SysRoleDao中方法的定義,編寫用于實現角色添加的SQL元素。
? 關鍵代碼設計與實現
第一步:在SysRoleMapper.xml中添加insertObject元素,用于寫入菜單信息。其中useGeneratedKeys 表示使用insert操作的自增主鍵值,keyProperty表示將獲取的自增主鍵值賦值給參數對象的id屬性,關鍵代碼如下:
parameterType="com.cy.pj.sys.entity.SysRole"
useGeneratedKeys="true"
keyProperty="id">
insert into sys_roles
(id,name,note,createdTime,modifiedTime,
createdUser,modifiedUser)
values
(null,#{name},#{note},now(),now(),
#{createdUser},#{modifiedUser})
第二步:在SysRoleMenuMapper中元素定義,關鍵代碼如下:
insert into sys_role_menus
(role_id,menu_id)
values
separator=","
item="item">
(#{roleId},#{item})
6.2.3 Service接口定義及實現
? 業務描述與設計實現
基于控制層請求,調用數據層對象將角色以及對應的菜單信息寫入到數據庫中。
? 關鍵代碼設計與實現
第一步:在SysRoleService接口中,添加用于保存角色對象的方法。關鍵代碼如下:int saveObject(SysRole entity,Integer[]menuIds);
第二步:在SysRoleServiceImpl類中,實現菜單保存操作。關鍵代碼如下:@Override
public int saveObject(SysRole entity, Integer[] menuIds) {
//1.參數有效性校驗
if(entity==null)
throw new IllegalArgumentException("保存對象不能為空");
if(StringUtils.isEmpty(entity.getName()))
throw new IllegalArgumentException("角色名不允許為空");
if(menuIds==null||menuIds.length==0)
throw new ServiceException("必須為角色分配權限");
//2.保存角色自身信息
int rows=sysRoleDao.insertObject(entity);
//3.保存角色菜單關系數據
sysRoleMenuDao.insertObjects(entity.getId(), menuIds);
//4.返回業務結果
return rows;
}
6.2.4 Controller類定義
? 業務描述與設計實現
接收客戶端提交的菜單數據,并對其進行封裝,然后調用業務層對象進行業務處理,最后將業務層處理結果響應到客戶端。
? 關鍵代碼設計與實現
定義Controller方法,借助此方法處理保存角色數據請求和響應邏輯。關鍵代碼如下:@RequestMapping("doSaveObject")
@ResponseBody
public JsonResult doSaveObject(
SysRole entity,Integer[] menuIds){
sysRoleService.saveObject(entity,menuIds);
return new JsonResult("save ok");
}
6.3 客戶端關鍵業務及代碼實現
6.3.1 頁面cancel按鈕事件處理
? 業務描述與設計實現
點擊頁面cancel按鈕時,加載菜單那列表頁面。
? 關鍵代碼設計與實現
第一步:事件注冊(頁面加載完成以后)$(".box-footer")
.on("click",".btn-cancel",doCancel)
第二步:事件處理函數定義function doCancel(){
var url="role/role_list";
$("#mainContentId").load(url);
}
6.3.2 頁面Save按鈕事件處理
? 業務描述與設計實現
點擊頁面save按鈕時,將頁面上輸入的菜單信息提交到服務端。
? 關鍵代碼設計與實現
第一步:事件注冊(頁面加載完成以后)。$(".box-footer")
.on("click",".btn-save",doSaveOrUpdate)
第二步:Save按鈕事件處理函數定義。關鍵代碼如下:function doSaveOrUpdate(){
//1.獲取表單數據
var params=doGetEditFormData();
//2.異步提交表單數據
var insertUrl="role/doSaveObject";
$.post(insertUrl,params,function(result){
if(result.state==1){
alert(result.message);
doCancel();
}else{
alert(result.message);
}
});
}
第三步:表單數據獲取及封裝函數定義。關鍵代碼如下://獲取表單數據
function doGetEditFormData(){
var params={
name:$("#nameId").val(),
note:$("#noteId").val()
}
//獲取選中的node節點
var menuIds=[];
var checkedNodes=zTree.getCheckedNodes(true);//zTree
for(var i in checkedNodes){
console.log(checkedNodes[i]);
menuIds.push(checkedNodes[i].id)
}
params.menuIds=menuIds.toString();//(1,2,3,4,5)
return params;
}
7 角色修改頁面數據呈現
7.1 業務時序分析
點擊角色列表頁面的編輯按鈕,其時序分析,如圖所示:
7.2 服務端關鍵業務及代碼實現
核心業務:在角色列表頁面點擊修改按鈕時,基于id進行角色信息的查詢,在查詢角色信息時將角色信息與對應的菜單關系數據封裝到到一個值對象,然后傳遞到客戶端在修改頁面進行呈現,如圖所示。
7.2.1 VO定義
? 業務描述及設計實現
構建值對象(VO),用于封裝從數據庫查詢到的角色菜單記錄,并添加對應的set/get/toString等方法,便于對數據進行更好的操作。
? 關鍵代碼分析及實現package com.cy.pj.sys.vo;
import java.util.List;
import com.cy.pj.sys.entity.SysRole;
/**
* VO:通過此對象封裝角色以及角色對應的菜單id
* @author ta
*/
public class SysRoleMenuVo implements Serializable{
private static final long serialVersionUID = 3609240922718345518L;
private Integer id;
private String name;
private String note;
/**角色對應的菜單id*/
private List menuIds;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id= id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNote() {
return note;
}
public void setName(String note) {
this.note = note;
}
public List getMenuIds() {
return menuIds;
}
public void setMenuIds(List menuIds) {
this.menuIds = menuIds;
}
}
7.2.2 DAO接口定義
? 業務描述與設計實現
負責基于id執行角色數據的查詢操作。
? 關鍵代碼設計與實現
在SysRoleDao接口中定義數據持久化方法:
resultMap="sysRoleMenuVo">
select id,name,note
from sys_roles
where id=#{id}
7.2.3 Mapper文件定義
? 業務描述與設計實現
基于SysRoleDao中findObjectById方法的定義,在映射文件中添加對應的角色查詢元素。
? 關鍵代碼設計與實現
第一步:在SysRoleMapper.xml中添加findObjectById元素,關鍵代碼如下:
resultMap="sysRoleMenuVo">
select id,name,note
from sys_roles
where id=#{id}
第二步:在SysRoleMapper.xml中添加第一步中resultMap屬性定義的結果映射元素,關鍵代碼如下:
id="sysRoleMenuVo">
select="com.cy.pj.sys.dao.SysRoleMenuDao.findMenuIdsByRoleId"
column="id">
第三步:在SysRoleMenuMapper.xml中添加第二步中collection元素內部select屬性對應的查詢元素。關鍵代碼如下:
resultType="int">
select menu_id
from sys_role_menus
where role_id=#{id}
7.2.4 Service接口定義及實現
? 業務描述與設計實現
基于控制層請求,調用數據層方法,查詢對應的角色及相關信息。
? 關鍵代碼設計與實現
第一步:在SysRoleService接口中,添加基于id查詢對應角色及相關信息的方法。關鍵代碼如下:SysRoleMenuVo findObjectById(Integer id) ;
第二步:在SysRoleService接口對應的實現類SysRoleServiceImpl中添加findObjectById的具體實現。關鍵代碼如下:@Override
public SysRoleMenuVo findObjectById(Integer id) {
//1.合法性驗證
if(id==null||id<=0)
throw new IllegalArgumentException("id的值不合法");
//2.執行查詢
SysRoleMenuVo result=sysRoleDao.findObjectById(id);
//3.驗證結果并返回
if(result==null)
throw new ServiceException("此記錄已經不存在");
return result;
}
7.2.5 Controller類定義
? 業務描述與設計實現
基于控制層請求,調用數據層方法,查詢對應的角色及相關信息。
? 關鍵代碼設計與實現
在SysRoleController類中定義基于角色ID查詢角色的方法。關鍵代碼如下:@RequestMapping("doFindObjectById")
public JsonResult doFindObjectById(Integer id){
return new JsonResult(sysRoleService.findObjectById(id));
}
7.3 客戶端關鍵業務及代碼實現
7.3.1 列表頁面修改按鈕事件處理
? 業務描述與設計實現
在角色修改按鈕上進行事件注冊,點擊頁面修改按鈕時,基于角色id向服務端發起異步請求獲取角色相關數據,然后加載修改頁面。
? 關鍵代碼設計與實現
第一步:頁面加載完成,進行修改按鈕事件注冊,關鍵代碼如下:$(function(){
…
//假如是修改
$(".input-group-btn")
.on("click","btn-update",doLoadEditUI);
});
第二步:修改按鈕事件處理函數定義或修改,關鍵代碼如下:function doLoadEditUI(){
//定義頁面標題(內容可能是添加角色也可能是修改角色)
var title;
//判定要執行的操作(是添加還是修改)
if($(this).hasClass("btn-add")){
title="添加角色";
doLoadPageUI(title);
}else{
title="修改角色";
//獲取當前行的id值
var id=$(this).parents("tr").data("id");
//根據id查找記錄,判定記錄是否存在
var url="role/doFindObjectById";
var data={"id":id};
$.getJSON(url,data,function(result){
if(result.state==1){
$("#mainContentId").data("data",result.data)
loadPageUI(title);
}else{
alert(result.message);
}
});
}
}
第三步:定義或修改加載編輯頁面的方法。關鍵代碼如下:function doLoadPageUI(title){
$("#mainContentId")
.load("role/role_edit",function(){
$(".box-title").html(title);
});
}
7.3.2 編輯頁面菜單數據呈現
? 業務描述與設計實現
頁面加載完成,獲取編輯頁面數據,然后在頁面指定位置進行數據呈現數據。
? 關鍵代碼設計與實現
第一步:在角色編輯頁面中,菜單數據加載完成以后,獲取角色編輯頁面中需要的表單數據,然后進行頁面數據初始化。關鍵代碼如下:function doLoadSysMenus(){
var url="menu/doFindZTreeNodes"
$.getJSON(url,function(result){
if(result.state==1){
zTree=$.fn.zTree.init(
$("#menuTree"),setting,result.data);
var data=$("#mainContentId").data("data");
if(data){
doInitEditFormData(data);
}
}else{
alert(result.message);
}
})
}
第三步:定義編輯頁面數據初始化方法。關鍵代碼如下:function doInitEditFormData(data){
$("#nameId").val(data.name);
$("#noteId").val(data.note);
//展開所有節點
zTree.expandAll(true);
//勾選角色所擁有的菜單
var menuIds = data.menuIds;
for(var i=0; i
//獲取key為id值為menuIds[i]的節點
var node = zTree.getNodeByParam("id",menuIds[i]);
//選中當前節點
zTree.checkNode(node,true,false);
}
}
8 角色數據更新實現
8.1 業務時序分析
點擊角色編輯頁面的更新按鈕,其時序分析,如圖所示:
8.2 服務端關鍵業務及代碼實現
8.2.1 DAO接口實現
? 業務描述與設計實現
獲取角色編輯頁面數據,然后異步提交到服務端,將角色信息以及角色對應的菜單關系數據更新到數據庫。
? 關鍵代碼設計與實現
在SysRoleDao接口中添加數據更新方法,關鍵代碼如下:int updateObject(SysRole entity);
8.2.2 Mapper文件定義
? 業務描述與設計實現
基于SysRoleDao中updateObject方法的定義,編寫用于實現角色更新的SQL元素。
? 關鍵代碼設計與實現
在SysRoleMapper.xml中添加updateObject元素,用于更新菜單信息。關鍵代碼如下:
parameterType="com.cy.pj.sys.entity.SysRole">
update sys_roles
set
name=#{name},
note=#{note},
modifiedUser=#{modifiedUser},
modifiedTime=now()
where id=#{id}
8.2.3 Service接口及實現
? 業務描述與設計實現
基于控制層請求,對數據進行校驗并調用數據層對象將角色信息以及角色菜單關系數據更新到數據庫中。
? 關鍵代碼設計與實現
第一步:在SysRoleService接口中,添加用于更新角色對象的方法。關鍵代碼如下:int updateObject(SysRole entity,Integer[] menuIds)
第二步:在SysRoleServiceImpl類中,實現更新角色操作。關鍵代碼如下:@Override
public int updateObject(SysRole entity,Integer[] menuIds) {
//1.合法性驗證
if(entity==null)
throw new IllegalArgumentException("更新的對象不能為空");
if(entity.getId()==null)
throw new IllegalArgumentException("id的值不能為空");
if(StringUtils.isEmpty(entity.getName()))
throw new IllegalArgumentException("角色名不能為空");
if(menuIds==null||menuIds.length==0)
throw new IllegalArgumentException("必須為角色指定一個權限");
//2.更新數據
int rows=sysRoleDao.updateObject(entity);
if(rows==0)
throw new ServiceException("對象可能已經不存在");
sysRoleMenuDao.deleteObjectsByRoleId(entity.getId());
sysRoleMenuDao.insertObject(entity.getId(),menuIds);
//3.返回結果
return rows;
}
8.2.4 Controller類定義
? 業務描述與設計實現
首先接收客戶端提交的角色數據,并對其進行封裝,然后調用業務層對象對角色信息進行更行更新,最后將業務層處理結果響應到客戶端。
? 關鍵代碼設計與實現
在SysRoleController類中定義更新角色的方法。關鍵代碼如下:@RequestMapping("doUpdateObject")
public JsonResult doUpdateObject(SysRole entity,
Integer[] menuIds){
sysRoleService.updateObject(entity,menuIds);
return new JsonResult("update ok");
8.3 客戶端關鍵業務及代碼實現
8.3.1 編輯頁面更新按鈕事件處理
? 業務描述與設計實現
點擊頁面save按鈕時,將頁面上輸入的角色編輯信息提交到服務端。
? 關鍵代碼設計與實現
第一步:在角色編輯頁面中定義獲取角色編輯頁面表單數據的函數,關鍵代碼如下:function doSaveOrUpdate(){
//1.獲取表單數據
var params=doGetEditFormData();
var rowData=$("#mainContentId").data("rowData");
//2.定義url
var insertUrl="menu/doSaveObject";
var updateUrl="menu/doUpdateObject";
var url=rowData?updateUrl:insertUrl;
if(rowData)params.id=rowData.id;
//3.異步提交數據
$.post(url,params,function(result){
if(result.state==1){
alert(result.message);
doCancel();
}else{
alert(result.message);
}
});
}
第二步:定義或修改提交編輯頁面表單數據方法,關鍵代碼如下://點擊保存按鈕時執行此方法
function doSaveOrUpdate(){//insert/update
//獲取表單數據
var params=doGetEditFormData();
//假如當前頁面.container-fluid對象上綁定著值說明是修改
var data=$("#mainContentId").data("data");
if(data){
params.id=data.id;//修改時表單數據中需要添加id
}
//根據當前頁面上是否綁定著值來定義url
var insertUrl="role/doSaveObject";
var updateUrl="role/doUpdateObject";
var url=data?updateUrl:insertUrl;
//異步提交數據
$.post(url,params,function(result){
if(result.state==1){
alert(result.message);
doCancel();
}else{
alert(result.message);
}
})
}
9 總結
9.1 重難點分析
? 角色數據的刪除操作?(關系表中數據的刪除)
? 一對多數據的保存?(保存角色的同時也要保存角色和菜單的關系數據)
? 一對多數據的查詢映射?(基于角色id查詢角色信息并將對應的菜單信息也查詢出來)
9.2 FAQ分析
? 角色與菜單之間是什么關系?(Many2Many)
? 角色與用戶之間是什么關系?(Many2Many)
? 描述一下角色刪除業務的實現?
? 描述一下角色添加業務的實現?
? 描述一下角色更新業務的實現?
? 角色和菜單的關系數據如何更新?
9.3 BUG分析
? 視圖解析問題,如圖所示:
問題分析:
1) 檢查對應的方法上是否添加@ResponseBody注解。
2) 檢查控制層對象方法的映射路徑配置是否正確。
總結
以上是生活随笔為你收集整理的java 角色管理代码_后台管理系统-角色管理模块的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android开发之百度地图(soso地
- 下一篇: PCBA方案定制,开发腕式血压计方案