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