日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > windows >内容正文

windows

java 角色管理代码_后台管理系统-角色管理模块

發(fā)布時(shí)間:2024/3/12 windows 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 角色管理代码_后台管理系统-角色管理模块 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

午夜精品久久久久99热app | 视频三区 | 在线观看国产中文字幕 | 欧美综合色 | 久久久久久久久久久福利 | 99热这里只有精品在线观看 | 亚洲综合视频在线 | 亚洲五月激情 | 狠狠天天| 日韩在线观看中文字幕 | 日韩免费区 | 狠狠干夜夜爱 | 久久久精品免费观看 | 国产视频丨精品|在线观看 国产精品久久久久久久久久久久午夜 | 久久精久久精 | 深夜男人影院 | 热久久免费视频 | 亚洲国产成人久久 | 免费在线观看亚洲视频 | 国产高清一区二区 | 久久久久久综合网天天 | 国产精品国产三级国产不产一地 | 国产精品涩涩屋www在线观看 | 97干com | 久久久久久免费毛片精品 | 久草在线这里只有精品 | 中文字幕久久精品一区 | 欧美中文字幕久久 | 亚洲天堂网视频 | 欧美嫩草影院 | 中文字幕黄色网 | 啪啪精品 | 亚洲欧美日本A∨在线观看 青青河边草观看完整版高清 | 国产美腿白丝袜足在线av | 在线观看亚洲国产 | 黄色特级毛片 | 久久久三级视频 | 国产精品久久久久久久久免费 | 手机在线看永久av片免费 | 国产免费专区 | 天天天天天操 | 婷婷在线五月 | 日韩美一区二区三区 | 国产区网址| 日韩一区二区三区免费视频 | 欧美精品免费在线观看 | 一区二区三高清 | 超碰人人在 | 国产在线中文 | 六月婷操| 麻豆精品传媒视频 | 婷色| 激情五月综合网 | 久久午夜鲁丝片 | 国产精品国产三级国产不产一地 | 久久y| 欧美日韩一区二区久久 | 亚洲人成影院在线 | 狠狠色丁香九九婷婷综合五月 | 久久综合免费视频影院 | 91日韩在线播放 | 精品久久中文 | 欧洲精品久久久久毛片完整版 | 国产精品久久久久久久久久久久午夜 | 国产色小视频 | 超碰人人射 | 天天久久综合 | 亚洲国产精品va在线看黑人动漫 | 久久综合99 | 久久激情五月丁香伊人 | 国产精品第二页 | 91av亚洲 | 日韩久久久久久久久久久久 | 天天操天天干天天操天天干 | 亚洲综合小说电影qvod | 综合伊人久久 | 国产精品1区2区 | 99精品久久久久久久久久综合 | 免费看污片 | 久久66热这里只有精品 | 福利av在线 | 国产精品成人一区二区三区吃奶 | 在线观看岛国av | 日韩二区在线 | 国产尤物视频在线 | 成人精品99 | 国产中文视 | 国产一区欧美一区 | 免费看污在线观看 | 黄色小说视频在线 | 国产一区二区三区免费在线观看 | 国产亚洲成av人片在线观看桃 | 最近日本中文字幕a | 深夜激情影院 | 在线高清 | 日韩网| 久久久久国产一区二区三区四区 | 精品一区二区三区四区在线 | 久久久这里有精品 | 在线视频久久 | 亚洲三级精品 | 免费在线观看的av网站 | 91免费版在线观看 | 911亚洲精品第一 | 国产精品亚洲成人 | 黄色大片日本免费大片 | 日本公妇色中文字幕 | 最新国产精品拍自在线播放 | 欧美精品在线观看免费 | 国产精品久久久久久麻豆一区 | 黄av资源 | 999电影免费在线观看 | 国产精品视频永久免费播放 | 国产二区视频在线观看 | 免费人成网 | 免费看黄的视频 | 免费看久久久 | 亚洲日本欧美 | www.国产高清 | 成人a在线观看高清电影 | 91在线www| av中文字幕在线免费观看 | 中文字幕乱码日本亚洲一区二区 | 在线免费观看av网站 | 在线观看日韩视频 | 韩国一区二区三区视频 | 在线观看精品 | 日日添夜夜添 | 男女视频久久久 | 香蕉视频91 | 亚洲黄色av网址 | 午夜精品一区二区国产 | www在线免费观看 | 曰本三级在线 | 精品国产一区二区三区免费 | 成人三级网址 | 一级黄色在线免费观看 | 狠狠的日| 麻豆影视网| 久久99在线| 伊人天天干 | 免费看网站在线 | 国产大尺度视频 | 亚洲成人资源在线观看 | 免费av网址在线观看 | 久久免费中文视频 | 免费看三级网站 | 美女精品国产 | www在线观看视频 | 免费亚洲一区二区 | 久久久久国产精品午夜一区 | 99久高清在线观看视频99精品热在线观看视频 | 深夜国产福利 | 日韩伦理片一区二区三区 | 三级动图 | 97色婷婷人人爽人人 | 伊人久久婷婷 | 免费看黄20分钟 | 国产精品手机视频 | 久久久久99精品国产片 | 久久久久久久久久久久久久电影 | 国产精品久久久久久爽爽爽 | 深爱综合网 | 婷婷伊人综合 | 视频在线播放国产 | 69视频永久免费观看 | 国产精品theporn | 深爱激情综合 | 最近中文字幕免费观看 | av成人动漫 | 黄色av影院 | 99久久er热在这里只有精品66 | 狠狠色噜噜狠狠狠狠 | 国产精品99久久免费黑人 | 一区二区三区日韩精品 | 国产精品久久久精品 | 成人av在线影院 | 亚洲1区在线 | 在线视频中文字幕一区 | 国产午夜精品一区二区三区欧美 | 黄色一级大片在线观看 | 色婷在线 | 欧美另类v| 国产成人无码AⅤ片在线观 日韩av不卡在线 | 欧美久久久久久久久久久久久 | 五月天六月丁香 | 天天亚洲综合 | 在线观看日韩一区 | 手机av片| 日本激情视频中文字幕 | 日韩久久久 | 欧美极品少妇xbxb性爽爽视频 | 久久在线播放 | 久久亚洲二区 | 视频二区在线 | 国产又粗又猛又黄又爽 | 亚洲一区精品人人爽人人躁 | 黄网站app在线观看免费视频 | 国产亚洲精品中文字幕 | 国产99久久久国产 | 91亚洲视频在线观看 | 国产91小视频 | 国产精品久久久久久久久久白浆 | 国产精品久久电影观看 | 丁香婷婷激情国产高清秒播 | 伊人狠狠色 | 综合网在线视频 | 亚洲一区视频免费观看 | 狠狠色狠狠色 | 国产在线 一区二区三区 | wwxxxx日本| 亚洲电影免费 | 成人黄色大片网站 | 欧美最猛性xxxx | 国际av在线 | 91精品视频在线看 | 日韩精品免费一区二区三区 | 久久国产精品免费观看 | 97品白浆高清久久久久久 | 粉嫩aⅴ一区二区三区 | 欧美最猛性xxx | 9999免费视频 | 夜夜骑日日 | 国内精品在线一区 | 成人午夜精品久久久久久久3d | 毛片网站免费在线观看 | 日韩久久精品一区 | 久久视频在线观看中文字幕 | 中文字幕视频在线播放 | 日日操日日操 | 亚洲成人免费观看 | 观看免费av | 亚洲欧美日韩不卡 | 中文字幕视频网站 | 深爱激情五月综合 | 91精品视频免费看 | 中文字幕三区 | 久久av福利 | 国产精品久久久久久久久毛片 | 久久久国产精品麻豆 | 亚洲天天 | 成人一级免费视频 | 国产精品久久久久久影院 | 亚洲精品久久久久久久不卡四虎 | 91在线视频播放 | 亚洲综合欧美激情 | 国产二区电影 | 日韩久久网站 | av大片网站 | 欧美综合久久久 | 国产第一页福利影院 | 国产免费视频在线 | 99视频偷窥在线精品国自产拍 | 亚洲黄色片在线 | 91日本在线播放 | 最近日本中文字幕 | 日日婷婷夜日日天干 | 美女视频a美女大全免费下载蜜臀 | 麻豆 videos| 96香蕉视频 | 91资源在线播放 | 久久久久区 | 99视频精品 | 丁香av| 成人在线电影观看 | 久久久久这里只有精品 | 一区二区三区精品在线视频 | 超碰在线日本 | 亚洲专区 国产精品 | 三三级黄色片之日韩 | 亚洲日韩中文字幕 | 日韩亚洲欧美中文字幕 | 天天综合网 天天 | 99精品一区 | 激情图片久久 | 九九热国产 | 一区二区三区日韩精品 | 久久黄色小说视频 | 午夜精品视频免费在线观看 | www免费看| 精品国产伦一区二区三区观看方式 | 久久精品看 | 免费视频97 | 日韩在线视频网 | 久久成人午夜 | 国产另类av| 美女久久99 | www·22com天天操 | 狠狠激情中文字幕 | 99视频一区二区 | 成人免费观看在线视频 | 五月婷婷av | 中文字幕美女免费在线 | 成年人网站免费在线观看 | 国产精品一区一区三区 | 日韩免费一区 | 久久精品99国产国产 | 国产1区2区3区精品美女 | 国产精品毛片久久蜜 | 午夜性生活片 | 日韩一区二区免费播放 | 91夜夜夜| 国产精品99蜜臀久久不卡二区 | 国产精品第72页 | 99久久婷婷国产综合精品 | 久久精品视频中文字幕 | 国产最新福利 | 丁香六月在线 | 91视频大全 | av在线直接看 | av网在线观看 | 日韩欧美在线视频一区二区 | 国产一级小视频 | 日韩精品一区二区在线视频 | av超碰免费在线 | 在线v片免费观看视频 | 国产精品成人一区二区三区 | 久久不卡电影 | 99精品免费在线观看 | 国产中文字幕免费 | 久久国产三级 | 成人a视频片观看免费 | 99一区二区三区 | 日本深夜福利视频 | 成人av网站在线观看 | 免费在线观看成年人视频 | 国产成人精品一区二区在线 | 久久精品这里热有精品 | 久久久综合香蕉尹人综合网 | av中文字幕在线观看网站 | 五月天久久精品 | 亚洲一区二区三区在线看 | 亚洲首页 | 免费网站在线观看成人 | 麻豆传媒在线免费看 | 久久伊人色综合 | 在线观看日韩专区 | 久久九九精品 | 日韩精品一区二区三区外面 | 九九精品视频在线观看 | 久久久精品国产一区二区三区 | 国产精品一区二区久久国产 | 欧美日韩视频在线观看免费 | 99中文字幕视频 | 亚洲最新av在线网站 | 在线观看黄| 国产精品久久久久久久久久免费看 | 日韩美女黄色片 | 91在线精品观看 | 色老板在线视频 | 综合色中色 | 国产亚洲一区 | 九九免费在线视频 | 99久久夜色精品国产亚洲96 | 国产一级特黄毛片在线毛片 | 特级西西444www高清大视频 | 婷婷激情5月天 | 精品亚洲免费 | 手机版av在线 | 久久久久国产一区二区三区 | 中文av资源站 | 91成人短视频在线观看 | 精品高清美女精品国产区 | 日韩色高清 | 在线观看成人一级片 | 狠狠狠狠狠狠操 | 久久影院午夜论 | 最新国产精品亚洲 | 免费三级黄 | 亚洲视频在线观看网站 | 免费国产在线观看 | 中文字幕av在线不卡 | 九九九九精品九九九九 | 日韩在线观看三区 | 欧美一级乱黄 | 97精品国自产拍在线观看 | 国产精品第一视频 | 丰满少妇对白在线偷拍 | 韩日三级在线 | av黄色国产 | 日日日操操 | 在线 国产 日韩 | 最新av在线播放 | 久久综合射 | 特级a老妇做爰全过程 | 亚洲va韩国va欧美va精四季 | 成年人免费看 | 在线精品观看国产 | 久久社区视频 | 日韩欧美视频二区 | av色综合| 亚洲国产日韩av | 免费高清在线视频一区· | 国产免费资源 | 亚洲精品自拍视频在线观看 | 天天干夜夜夜操天 | 久久免费大片 | 国产原创av在线 | 深爱激情婷婷网 | 少妇18xxxx性xxxx片 | 五月亚洲综合 | 亚洲精品456在线播放第一页 | 97免费在线观看 | 中文字幕网站视频在线 | 91精品日韩| 在线视频观看国产 | 91色偷偷 | 久久精品视频观看 | 欧美日韩3p | 成人h电影| 一区二区三区高清不卡 | 国产亚洲视频在线免费观看 | 日韩在线免费不卡 | 激情五月***国产精品 | 欧美性粗大hdvideo | 久久这里只有精品9 | 九九热久久免费视频 | 免费一级日韩欧美性大片 | 91av中文字幕 | 91九色在线观看视频 | 久久久久成人精品亚洲国产 | 久草av在线播放 | 国产免费黄色 | 激情婷婷色 | 国产美女永久免费 | 日韩免费高清 | 久久在线电影 | 91福利社区在线观看 | 婷婷婷国产在线视频 | 伊人婷婷色 | 久久免费久久 | 黄色免费高清视频 | 国产成人亚洲在线观看 | 麻豆91在线播放 | 国产亚洲一区二区在线观看 | 欧美精品一级视频 | 欧美日韩视频在线一区 | 亚洲一级片在线看 | 日韩免费在线一区 | 国产黄a三级 | 亚洲黄色av网址 | 日韩免费在线观看视频 | 欧美另类sm图片 | 99r在线| 色橹橹欧美在线观看视频高清 | 日韩成人中文字幕 | 国产一区自拍视频 | 国产成人久久久久 | 欧美一级视频免费 | 人人插人人艹 | 精品视频在线免费观看 | 人人搞人人干 | 日韩精品久久久久久中文字幕8 | 麻豆视频在线观看 | 国产日产精品一区二区三区四区的观看方式 | 91天堂素人约啪 | 超碰97人| 日本中文字幕一二区观 | 日韩精品中文字幕在线 | 国产精品高清一区二区三区 | 中文字幕在线观看完整 | 五月天激情视频在线观看 | 日本黄色免费播放 | 国产精品爽爽久久久久久蜜臀 | 成人在线播放视频 | 91精品视频免费看 | 美女天天操 | 国产成人精品一区二区三区免费 | 免费亚洲精品视频 | 欧美夫妻生活视频 | 国产精品二区三区 | 特级xxxxx欧美 | 久久精品国产一区 | 日韩超碰在线 | 在线草 | 国产免费观看高清完整版 | 国内精品久久久久久中文字幕 | 久久久www成人免费精品 | 国产专区视频在线 | 日日成人网 | 中文字幕视频一区二区 | 97电影网手机版 | 毛片随便看 | 国产一二区免费视频 | 国产视频手机在线 | 成人久久久久久久久久 | 国产精品国产自产拍高清av | 日韩不卡高清 | 婷婷久久综合网 | 欧美日韩国产三级 | 中文字幕精品一区二区三区电影 | 精品超碰| 天天射天天操天天干 | 亚洲激情久久 | 国产精品免费在线观看视频 | 美女视频黄免费网站 | 美女网站视频色 | 国产精品一区在线播放 | 成人在线免费观看视视频 | 日韩精品字幕 | 91黄色小网站 | 久久精品伊人 | 亚洲黄色av一区 | 美女视频黄频大全免费 | 波多野结衣电影一区 | 黄色资源在线观看 | 91av在线精品 | 一区三区视频在线观看 | 午夜在线资源 | 网站免费黄色 | 人人爽人人澡人人添人人人人 | 97超碰在线久草超碰在线观看 | 欧美激情精品久久久久久变态 | 丁香婷婷色综合亚洲电影 | 国产999精品久久久久久麻豆 | 国产亚洲精品久久网站 | 91精品国产麻豆国产自产影视 | 久久成人国产精品一区二区 | 久久久久久免费视频 | 中文字幕av一区二区三区四区 | 91看毛片| 免费在线观看一区 | 一区二区三区日韩在线 | 欧美人人爱 | 国产网红在线观看 | 久草在线电影网 | 福利视频 | 亚洲 欧美 日韩 综合 | 国产精品一区二区三区视频免费 | 久久久久综合精品福利啪啪 | 国产一区二区三区免费在线 | 国产一线天在线观看 | 亚洲视频精品在线 | 在线看国产一区 | 成年人视频在线观看免费 | 久久国产电影 | 成人av在线直播 | 久久激情小视频 | 在线免费国产视频 | 亚洲高清av在线 | 精品在线播放 | 亚州精品在线视频 | 国产偷v国产偷∨精品视频 在线草 | 久草视频在线免费 | 久久九九影院 | 久久99精品国产99久久 | 国产不卡一区二区视频 | 色网站免费在线观看 | 日韩色综合网 | 一区二区三区三区在线 | 波多野结衣动态图 | 91亚洲精品久久久蜜桃借种 | 免费看国产a | av丁香花| 久久精品视 | 97成人资源站 | 永久av免费在线观看 | 国产中文字幕网 | 九九热精品国产 | 久草网在线观看 | 国产中文字幕在线视频 | 在线91网 | 99精品国产免费久久久久久下载 | 久久视频一区二区 | 欧美一区二区在线免费观看 | 日韩a在线看 | 波多野结衣在线播放一区 | 中文字幕 影院 | 国产精品久久久久永久免费 | 亚洲精品mv在线观看 | 18国产精品白浆在线观看免费 | 日日干美女| 日韩久久久久久久 | 久久久久久美女 | 99视频 | 亚洲免费不卡 | 综合色在线观看 | 欧美日韩精品在线观看视频 | 在线中文字幕av观看 | 中国精品少妇 | 欧美综合色 | av字幕在线| 91福利社在线观看 | 国产小视频在线免费观看 | 麻豆精品国产传媒 | 五月的婷婷 | 91亚色视频在线观看 | 丁香视频全集免费观看 | free,性欧美 九九交易行官网 | 色视频在线 | 国产精品久久久久久麻豆一区 | 一区二区三区 亚洲 | 久久久精品二区 | 在线观看免费成人av | 中文字幕一区二区三区乱码在线 | 一级成人在线 | 最近av在线 | 日韩欧美国产激情在线播放 | 天天干天天做 | 久久免费视频在线观看30 | 蜜臀av性久久久久蜜臀aⅴ涩爱 | 在线观看久久久久久 | 97色婷婷成人综合在线观看 | 日韩精品短视频 | 999久久a精品合区久久久 | 国产麻豆精品久久一二三 | 最近更新好看的中文字幕 | 在线免费观看视频一区二区三区 | av成人在线播放 | 日韩在线观看视频一区二区三区 | 狠狠的干狠狠的操 | 国产精品黄网站在线观看 | 久久精品99精品国产香蕉 | 91色视频| 免费看的黄色 | 在线超碰av | 在线va网站| 久久理伦片 | 超碰成人av | 97电影网手机版 | 欧洲性视频| 国产黑丝一区二区三区 | 激情婷婷网| 欧美成人xxxxx | 91高清视频 | av免费在线观看网站 | 正在播放亚洲精品 | 欧美日韩一区二区久久 | 99产精品成人啪免费网站 | 91最新视频在线观看 | 精品无人国产偷自产在线 | 免费麻豆视频 | 精品国产一区二区三区久久 | 永久黄网站色视频免费观看w | 18网站在线观看 | 操操日| 国产伦精品一区二区三区四区视频 | 日韩在线视频二区 | 狠狠做六月爱婷婷综合aⅴ 日本高清免费中文字幕 | 国内久久精品视频 | 精品亚洲成人 | 91丝袜美腿 | 高清一区二区三区 | 国产高清视频在线播放一区 | 国产精品12 | 日韩在线免费高清视频 | 日韩精品在线看 | 九精品| 亚洲aⅴ免费在线观看 | 奇米影视8888在线观看大全免费 | 中文字幕一区二区三区久久蜜桃 | 成人国产精品久久久 | 在线观看中文字幕一区二区 | 日本精品中文字幕在线观看 | 欧美黄污视频 | 福利二区视频 | 激情五月在线观看 | 国内精品久久久久国产 | 99热超碰在线 | 国产精品乱码久久久久久1区2区 | 亚洲激情视频在线 | 视频在线观看91 | 日日天天av| 狠狠gao | 国产一区二区在线免费播放 | 国产日产精品一区二区三区四区的观看方式 | 国产精品美女免费视频 | 中文字幕五区 | 91av99| 麻豆国产精品永久免费视频 | 午夜久久久影院 | 日韩精品一区二区三区丰满 | 久久久96 | 午夜电影久久 | 午夜精品一二三区 | 精品美女国产在线 | 免费在线观看污网站 | 黄色一级影院 | 国产精品观看 | 夜夜高潮夜夜爽国产伦精品 | 久久成人免费电影 | 欧美日韩亚洲在线观看 | av色影院 | 日韩午夜视频在线观看 | 国产精品精品国产色婷婷 | 五月天色婷婷丁香 | 欧美日韩高清一区二区三区 | www狠狠| 在线观看一区二区精品 | 黄色成年 | 久草在线看片 | 日韩av电影国产 | 久久免费看毛片 | 久久久久在线视频 | 99在线免费视频 | 人人干干人人 | 五月激情六月丁香 | 精品九九九 | 九九热久久免费视频 | 天堂av在线免费观看 | 亚洲,播放 | 亚洲综合色丁香婷婷六月图片 | 在线观看一区视频 | 美女免费黄网站 | 日韩性色 | 天天插综合 | 伊人婷婷色 | 久久99久久精品 | 欧美日韩国产免费视频 | 97香蕉久久国产在线观看 | 国产精品日韩久久久久 | 国产在线永久 | 911精品视频 | 激情综合网五月 | 精品国产成人在线 | 国产糖心vlog在线观看 | 国产欧美在线一区二区三区 | 国产免费片 | 免费亚洲一区二区 | 久久久国产在线视频 | 狠狠干激情 | 欧美日韩高清一区二区 | 91字幕| www久久久久 | 狠狠色噜噜狠狠狠狠2021天天 | 亚洲精品视频在线免费播放 | 中文字幕二区 | 91欧美国产 | 精品国产视频在线 | 国产一二区精品 | 国产精品久久久久aaaa | 日本3级在线观看 | 精品99在线观看 | 99视频国产在线 | 日韩成人在线一区二区 | 又黄又爽又无遮挡的视频 | 亚洲精品视频在线观看免费视频 | 天天艹日日干 | 狠狠五月婷婷 | 一 级 黄 色 片免费看的 | 日韩午夜精品 | 美女露久久 | 99视频偷窥在线精品国自产拍 | 久久人人爽人人 | 91九色国产视频 | 91尤物国产尤物福利在线播放 | 国产一性一爱一乱一交 | 国产精品视频999 | 久久精品三级 | 中国一级片在线观看 | 亚洲欧美日本A∨在线观看 青青河边草观看完整版高清 | 国产不卡在线看 | 久久视频这里有久久精品视频11 | 日日躁夜夜躁xxxxaaaa | 精品免费观看 | 国产精品一区二区久久精品爱微奶 | 久久精品79国产精品 | 久久这里只有精品23 | 人人爽人人爽人人片av | 久久综合成人网 | 中文字幕色综合网 | 亚洲精品久久激情国产片 | 国产精品美女在线 | 免费在线一区二区三区 | 国产精品av久久久久久无 | 男女免费av| 黄色亚洲免费 | 伊人亚洲综合网 | 天天草夜夜 | 97av在线视频| 国产一区在线视频观看 | 国产麻豆精品久久 | aaa亚洲精品一二三区 | 国产亚洲婷婷免费 | 亚洲国产成人在线播放 | 久久久免费电影 | 久久国产视屏 | 在线免费视 | 91香蕉视频| 亚洲黄污| 日韩一区在线播放 | a黄色片在线观看 | 特级黄色片免费看 | 伊人在线视频 | 婷婷福利影院 | 91chinese在线| 91污污视频在线观看 | 免费三级av| 久久激情久久 | 午夜日b视频 | 成人av一级片 | www色,com | 99久久精品国 | 中文字幕乱码日本亚洲一区二区 | 最新中文字幕在线播放 | 色综合天天综合在线视频 | 99爱爱 | 97av免费视频 | 欧美大片在线观看一区 | 久久不射网站 | 五月激情片 | 中文字幕人成乱码在线观看 | 午夜久久成人 | 日韩在线国产精品 | 2019中文最近的2019中文在线 | 91精品爽啪蜜夜国产在线播放 | 天天做日日爱夜夜爽 | 国产精品视频地址 | 日本中文一级片 | 精品一区二区三区四区在线 | 日韩三级视频在线观看 | 有码中文在线 | 91成人蝌蚪| 国产亚洲精品久久久久动 | 999久久久免费精品国产 | 91精品久久久久久综合乱菊 | 九九热精| 99麻豆视频 | av黄色一级片 | 日韩精品一区二区在线观看 | 精品视频久久久久久 | 免费av观看网站 | 国产一区视频导航 | 亚洲有 在线 | 日日夜夜操操操操 | 国产一级黄色免费看 | 日韩成人av在线 | 超碰99人人 | 亚洲精品午夜aaa久久久 | 91久久国产精品 | www日韩欧美 | 久久夜色电影 | 伊人天天狠天天添日日拍 | 国产网站在线免费观看 | 久久久精品电影 | 亚洲成av人片一区二区梦乃 | 日韩欧美有码在线 | 中文字幕888 | 久久精品人人做人人综合老师 | 一区二区三区高清在线观看 | 天天综合视频在线观看 | 国产又黄又爽无遮挡 | 狠狠色丁香婷综合久久 | 狠狠久久婷婷 | 精品久久一区二区 | 国产一区免费在线观看 | 一区二区三区在线观看免费 | 精品国产三级a∨在线欧美 免费一级片在线观看 | 亚洲精品一区二区三区在线观看 | 豆豆色资源网xfplay | 香蕉视频日本 | 黄色影院在线免费观看 | 成年人电影毛片 | 在线观看一区视频 | 91在线区 | 日韩在线观看中文 | 操操综合网| 色综合国产 | 国产一区国产精品 | 99久久国产免费看 | 久久久久久亚洲精品 | 天天综合网国产 | 日韩三级一区 | 日韩理论片在线观看 | 亚洲天堂精品视频在线观看 | 日韩免费视频观看 | 久久精品电影 | 色婷婷 亚洲| 国产成人精品一区二区在线 | 成人综合免费 | 国产又黄又猛又粗 | 91成人免费在线 | a'aaa级片在线观看 | 国产成人av福利 | 日本久久精品视频 | 久久久久久久久综合 | 久草国产在线 | 操操日| 99久久精品午夜一区二区小说 | 国产精品久久久久久久午夜片 | 国产玖玖在线 | 91精品天码美女少妇 | av不卡网站 | 欧美精品亚州精品 | 亚洲国产精品传媒在线观看 | 黄色三级免费网址 | 狠狠狠色狠狠色综合 | 色资源中文字幕 | 在线国产高清 | 麻豆免费在线视频 | 三三级黄色片之日韩 | 综合网伊人 | 亚洲美女视频网 | 99久久久国产精品 | 中文字幕有码在线观看 | 夜夜夜夜夜夜操 | 免费观看一级特黄欧美大片 | 国产看片免费 | 麻豆视频在线看 | 欧美日韩在线网站 | 99热这里有 | 能在线观看的日韩av | 四虎成人精品永久免费av九九 | 日日日天天天 | av资源在线看 | 97超碰超碰 | 亚洲成人黄色网址 | 欧美精品中文字幕亚洲专区 | 人人看人人 | 国产精品久久久久三级 | 最近中文字幕免费观看 | 日韩一级电影在线观看 | 很黄很黄的网站免费的 | 奇米导航 | 精品国产成人 | 99色免费 | 国产中文欧美日韩在线 | 久久系列 | 欧美激情va永久在线播放 | 91精品国产91久久久久 | 在线一级片 | 成人丝袜 | 精品一二三四在线 | 热久久免费视频精品 | 免费99视频 | 国产黄色a | 久久久精品电影 | 国产一级h| 人人插人人艹 | 色中文字幕在线观看 | 天天干天天插伊人网 | av+在线播放在线播放 | 四虎最新入口 | 午夜日b视频 | av在线小说| www.久久久.com | 又黄又爽又色无遮挡免费 | 久要激情网 | 三级视频片 | 久草9视频 | 国产中文a| 字幕网av | 国产中文字幕在线看 | 久久久网 | 特级xxxxx欧美 | 四虎在线免费观看 | 伊甸园av在线 | 久久久久国产成人免费精品免费 | 亚洲干视频在线观看 | 久久人视频 | 九九久久影视 | 又黄又爽又色无遮挡免费 | 久久的色 | 手机av网站| 国偷自产中文字幕亚洲手机在线 | 国产精品精品国产 | av在线免费网 | 激情开心网站 | 激情电影影院 | 久久精品高清 | 国产一级特黄毛片在线毛片 | 中文字幕在线播放视频 | 亚洲国产av精品毛片鲁大师 | 成人久久久精品国产乱码一区二区 | 五月天婷亚洲天综合网精品偷 | 久久国产精品久久精品国产演员表 | 欧美一级xxxx | 9999在线| 国产中文字幕在线观看 | 国产精品美女久久久久久久久久久 | 综合色站导航 | 免费亚洲婷婷 | 日韩18p| 在线免费av播放 | 少妇视频在线播放 | 国产原创av在线 | 国产小视频网站 | 超碰精品在线观看 | 久草在线视频免费资源观看 | 欧美九九视频 | av资源中文字幕 | 久久午夜国产精品 | 日韩成人高清在线 | 91视频在线观看免费 | 亚洲国产精选 | 人人玩人人添人人澡超碰 | 久久久久久久99精品免费观看 | 国产精品9999久久久久仙踪林 | 欧洲一区二区在线观看 | 日韩精品一区二区在线视频 | 日韩欧美精品在线观看视频 | 成人97人人超碰人人99 | 最新av网址大全 | 国产亚洲免费的视频看 | 欧美最猛性xxxxx(亚洲精品) | 日韩一区二区免费在线观看 | 亚洲免费在线观看视频 | 97精品在线 |