一.回顾

1.项目首页面执行过程分析
2.顶部菜单点击后,为什么左侧,中间区域会改变
3.为什么左侧菜单点击后,显示结果在中间区域
4.DAO分析
5.Page分页组件
6.编写及酉己置Service, Action
7完成DeptAction类的CRUD操作
8.BaseAction 的类

二.DeptAction 更新&删除

Dept .java 父部门 、用户

public class Dept implements Serializable {private String id;private Set<User> users  = new HashSet<User>(0);//部门与用户    一对多private String deptName;//部门名称private Dept parent; //父部门  自关联  子部门与父部门     多对一private Integer state;//状态    1代表启用    0代表停用public String getId() {

Dept.hbm.xml 子部门与父部门/多对一 部门与用户 一对多

<hibernate-mapping package="cn.itcast.jk.domain"><class name="Dept" table="DEPT_P"><id name="id" column="DEPT_ID"><generator class="uuid"></generator></id><property name="deptName" column="DEPT_NAME"></property><property name="state" column="STATE"></property><!-- 自关联  子部门与父部门     多对一 --><many-to-one name="parent" class="Dept" column="PARENT_ID"></many-to-one><!-- private Set<User> users  = new HashSet<User>(0);//部门与用户    一对多 --><set name="users"><key column="DEPT_ID"></key><one-to-many class="User"/></set></class>
</hibernate-mapping>

界面-列表

jDeptUpdate.jsp 分页,列表

<table id="ec_table" class="tableRegion" width="98%" ><thead><tr><td class="tableHeader"><input type="checkbox" name="selid" onclick="checkAll('id',this)"></td><td class="tableHeader">序号</td><td class="tableHeader">编号</td><td class="tableHeader">上级</td><td class="tableHeader">名称</td></tr></thead><tbody class="tableBody" >${links }<c:forEach items="${results }" var="dept" varStatus="st"><tr class="odd" onmouseover="this.className='highlight'" onmouseout="this.className='odd'" ><td><input type="checkbox" name="id" value="${dept.id }"/></td><td>${st.count }</td><td>${dept.id }</td><td>${dept.parent.deptName }</td><td><a href="deptAction_toview?id=${dept.id }">${dept.deptName }</a></td></tr></c:forEach></tbody>
</table>

分页 Page.java results

/*** 分页辅助类:对分页的基本数据进行一个简单的封装* 用来传递分页参数和查询参数params*/
public class Page<T> {private int pageNo = 1;                            //页码,默认是第一页private int pageSize = SysConstant.PAGE_SIZE;    //每页显示的记录数,默认是10private int totalRecord;                     //总记录数private int totalPage;                            //总页数private List<T> results;                     //对应的当前页记录private Map<String, Object> params = new HashMap<String, Object>();      //其他的参数我们把它分装成一个Map对象/* 页面链接 */public String url;       //分页按钮中的转向链接public void setUrl(String url) {this.url = url;}public String links; public String getLinks() {return sBuf.toString();}

DeptAction.java list() 模型驱动 ModelDriven

/*** 部门管理的Action* @author Administrator**/
public class DeptAction extends BaseAction implements ModelDriven<Dept> {private Dept model = new Dept();public Dept getModel() {return model;}//分页查询private Page page  = new Page();public Page getPage() {return page;}public void setPage(Page page) {this.page = page;}//注入DeptServiceprivate DeptService deptService;public void setDeptService(DeptService deptService) {this.deptService = deptService;}/*** 分页查询*/public String list() throws Exception {deptService.findPage("from Dept", page, Dept.class, null);//设置分页的url地址page.setUrl("deptAction_list");//将page对象压入栈顶super.push(page);return "list";}

BaseAction .java push(Object obj)、put(String key ,Object value)


/*** @Description:* @Author:      传智播客 java学院 传智.宋江* @Company:   http://java.itcast.cn* @CreateDate:    2014年10月31日*///通过RequestAware, SessionAware, ApplicationAware实行接口获得request,session,application对象,action中就可直接调用public class BaseAction extends ActionSupport implements RequestAware, SessionAware, ApplicationAware{private static Logger log = Logger.getLogger(BaseAction.class);private static final long serialVersionUID = 1L;protected Map<String, Object> request;protected Map<String, Object> session;protected Map<String, Object> application;public Map<String, Object> getRequest() {return request;}public Map<String, Object> getSession() {return session;}public Map<String, Object> getApplication() {return application;}@Overridepublic void setRequest(Map<String, Object> request) {this.request = request;}@Overridepublic void setSession(Map<String, Object> session) {this.session = session;}@Overridepublic void setApplication(Map<String, Object> application) {this.application = application;}/*** * 将对象放入值栈的栈顶*/public void push(Object obj){ActionContext.getContext().getValueStack().push(obj);}/*** 将key-value对放入值栈的 context中* */public void put(String key ,Object value){ActionContext.getContext().put(key, value);}/*** 获取当前登录的用户对象* @return*/public User getCurUser(){User user = (User)session.get(SysConstant.CURRENT_USER_INFO);return user;}}

struts-sysadmin.xml /sysadmin/deptAction_*

<constant name="struts.ui.theme" value="simple"/><constant name="struts.devMode" value="true" /><constant name="struts.i18n.encoding" value="UTF-8" /><package name="sysadmin" namespace="/sysadmin" extends="default"><action name="deptAction_*" class="deptAction" method="{1}"><result name="list">/WEB-INF/pages/sysadmin/dept/jDeptList.jsp</result><result name="toview">/WEB-INF/pages/sysadmin/dept/jDeptView.jsp</result><result name="tocreate">/WEB-INF/pages/sysadmin/dept/jDeptCreate.jsp</result><result name="toupdate">/WEB-INF/pages/sysadmin/dept/jDeptUpdate.jsp</result><result name="alist" type="redirectAction">deptAction_list</result></action>

界面-查看

DeptAction.java toView 进入查看页面 jDeptView.jsp

public String toview() throws Exception {//1.调用业务方法,根据id,得到对象Dept dept = deptService.get(Dept.class, model.getId());//放入栈顶super.push(dept);//3.跳页面return "toview";}

界面-修改

DeptAction.java toupdate() 进入修改页面 jDeptUpdate.jsp

/*** 进入修改页面*/public String toupdate() throws Exception {//1.根据id,得到一个对象Dept obj = deptService.get(Dept.class, model.getId());//2.将对象放入值栈中super.push(obj);//3.查询父部门List<Dept> deptList = deptService.find("from Dept where state=1", Dept.class, null);//4.将查询的结果放入值栈中 ,它放在context区域中super.put("deptList", deptList);//5.跳页面return "toupdate";}

DeptAction.java update() 更新 先查询原始信息,只保存更新的书写

public String update() throws Exception {//调用业务Dept obj = deptService.get(Dept.class, model.getId());//根据id,得到一个数据库中保存的对象//2.设置修改的属性obj.setParent(model.getParent());obj.setDeptName(model.getDeptName());deptService.saveOrUpdate(obj);return "alist";}

界面-新增

DeptAction.java tocreate() 进入新增页面 jDeptCreate.jsp

public String tocreate() throws Exception {//调用业务方法List<Dept> deptList = deptService.find("from Dept where state=1", Dept.class, null);//将查询的结果放入值栈中 ,它放在context区域中super.put("deptList", deptList);//跳页面return "tocreate";}

jDeptCreate.jsp 上级部门下拉框

<!-- name属性代表下拉框的名称list: 绑定的集合名   List<Dept>headerKey:代表首选项的value属性headerValue:代表首选项的文本listKey: <option value="${id }"listValue:代表中间的文本--><s:select name="parent.id" list="#deptList" headerKey="" headerValue="--请选择--" listKey="id" listValue="deptName"></s:select>

DeptAction.java insert() 保存

/*** 保存*     <s:select name="parent.id"*     <input type="text" name="deptName" value=""/>* model对象能接收*      parent *           id*      deptName*/public String insert() throws Exception {//1.调用业务方法,实现保存deptService.saveOrUpdate(model);//跳页面return "alist";}

新增时,指定用户状态为1 DeptServiceImpl saveOrUpdate

public void saveOrUpdate(Dept entity) {if(UtilFuns.isEmpty(entity.getId())){//新增entity.setState(1);//1启用  0停用  默认为启用}baseDao.saveOrUpdate(entity);}

删除

DeptAction.java delete() 多选删除

/*** 删除* <input type="checkbox" name="id" value="100"/>* <input type="checkbox" name="id" value="3d00290a-1af0-4c28-853e-29fbf96a2722"/>* .....* model*    id:String类型*       具有同名框的一组值如何封装数据?*       如何服务端是String类型:*                       100, 3d00290a-1af0-4c28-853e-29fbf96a2722, 3d00290a-1af0-4c28-853e-29fbf96a2722*                       *    id:Integer,Float,Double.Date类型                  id=100               id=200        id=300  *    id=300*    Integer []id;  {100,200,300}*        *                       */public String delete() throws Exception {String ids[] = model.getId().split(", ");//调用业务方法,实现批量删除deptService.delete(Dept.class, ids);return "alist";}

删除时注意级联删除下级部门

DeptServiceImpl.deleteById()

public void deleteById(Class<Dept> entityClass, Serializable id) {//有哪些子部门,它的父部门编号为第二个参数:idString hql = "from Dept where parent.id=?";List<Dept> list = baseDao.find(hql, Dept.class, new Object[]{id});//查询出当前父部门下的子部门列表if(list!=null && list.size()>0){for(Dept dept :list){deleteById(Dept.class,dept.getId());//递归调用 }}baseDao.deleteById(entityClass, id);//删除父部门}public void delete(Class<Dept> entityClass, Serializable[] ids) {for(Serializable id :ids){this.deleteById(Dept.class,id);}}

三.认证的传统与BRAC认证方式


BRAC认证方式:
Base Role Access Controller :基于角色的访问控制

四.BRAC认证方式下的数据库设计

五.实现用户与用户扩展信息的CRUD

用户 User/BaseEntity

抽取与用户扩展信息中的相同属性,放入父类中

BaseEntity .java

public class BaseEntity implements Serializable {protected String createBy;  //创建者的 idprotected String createDept;//创建者所在部门的idprotected Date createTime;//创建时间protected String updateBy;//更新者的idprotected Date updateTime;//更新时间

User.java

public class User extends BaseEntity{private String id;private Dept dept;//用户与部门   多对一private Userinfo userinfo ;  //用户与用户扩展信息    一对一private Set<Role> roles = new HashSet<Role>(0);//用户与角色   多对多private String userName;//用户名private String password;//密码  要加密private Integer state;//状态

UserInfo.java

public class Userinfo  extends BaseEntity {private String id;private String name;//姓名private User manager;//用户与直属领导    多对一private Date joinDate;//入职时间private Double salary;//薪水private Date birthday;  //出生年月private String gender;  //性别private String station;//岗位private String email;//邮箱private String telephone;//电话private Integer degree;//等级private String remark;// 备注private Integer orderNo;//排序号

User.hbm.xml 用户-部门-用户扩展信息-角色

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.itcast.jk.domain"><class name="User" table="USER_P" dynamic-insert="true" dynamic-update="true"><id name="id" column="USER_ID"><generator class="assigned"></generator></id><property name="userName" column="USER_NAME"></property><property name="password" column="PASSWORD"></property><property name="state" column="STATE"></property><property name="createBy" column="CREATE_BY"></property><property name="createDept" column="CREATE_DEPT"></property><property name="createTime" column="CREATE_TIME"></property><property name="updateBy" column="UPDATE_BY"></property><property name="updateTime" column="UPDATE_TIME"></property><!-- private Dept dept;//用户与部门   多对一 --><many-to-one name="dept" class="Dept" column="DEPT_ID"></many-to-one><!--  private Userinfo userinfo ;  //用户与用户扩展信息    一对一 --><one-to-one name="userinfo" class="Userinfo" cascade="all"></one-to-one><!-- private Set<Role> roles = new HashSet<Role>(0);//用户与角色   多对多 --><set name="roles" table="ROLE_USER_P"><key column="USER_ID"></key><many-to-many class="Role" column="ROLE_ID"></many-to-many></set></class>
</hibernate-mapping>

Userinfo.hbm.xml

<hibernate-mapping package="cn.itcast.jk.domain"><class name="Userinfo" table="USER_INFO_P" dynamic-insert="true" dynamic-update="true"><id name="id" column="USER_INFO_ID"><generator class="assigned"></generator></id><property name="name" column="NAME"></property><property name="joinDate" column="JOIN_DATE"></property><!--  private User manager;//用户与直属领导    多对一 --><many-to-one name="manager" class="User" column="MANAGER_ID"></many-to-one></class>
</hibernate-mapping>

界面-用户列表

界面-查看

界面-修改

界面-新增

用户id generator方式为 assigned

UserServiceImpl.saveOrUpdate()

if(UtilFuns.isEmpty(entity.getId())){//新增String id = UUID.randomUUID().toString();entity.setId(id);entity.getUserinfo().setId(id);

新增用户 选择所在部门,领导 jUserCreate.jsp

<tr><td class="columnTitle">所在部门:</td><td class="tableContent"><s:select name="dept.id" list="deptList"listKey="id" listValue="deptName"headerKey="" headerValue="--请选择--"></s:select></td></tr><td class="columnTitle">直属领导:</td><td class="tableContent"><s:select name="userinfo.manager.id" list="userList"listKey="id" listValue="userinfo.name"headerKey="" headerValue="--请选择--"></s:select></td>

更新是,用户状态回显 jUserUpdate.jsp

<td class="columnTitle">状态:</td><td class="tableContentAuto"><input type="radio" name="state" class="input" ${state==0?'checked':'' } value="0">停用 <input type="radio" name="state" class="input"  ${state==1?'checked':'' } value="1">启用 </td>

六.实现角色的CRUD

Role.hbm.xml 角色与用户 /多对多 角色与模块/多对多

<hibernate-mapping package="cn.itcast.jk.domain"><class name="Role" table="ROLE_P" dynamic-insert="true" dynamic-update="true"><id name="id" column="ROLE_ID"><generator class="uuid"></generator></id><property name="name" column="NAME"></property><!-- private Set<User> users = new HashSet<User>(0);//角色与用户    多对多 --><set name="users" table="ROLE_USER_P"><key column="ROLE_ID"></key><many-to-many class="User" column="USER_ID"></many-to-many></set><!-- private Set<Module> modules = new HashSet<Module>(0);//角色与模块    多对多 --><set name="modules" table="ROLE_MODULE_P"><key column="ROLE_ID"></key><many-to-many class="Module" column="MODULE_ID" order-by="ORDER_NO"></many-to-many></set></class>
</hibernate-mapping>

Role.java

public class Role extends BaseEntity{private String id;private Set<User> users = new HashSet<User>(0);//角色与用户    多对多private Set<Module> modules = new HashSet<Module>(0);//角色与模块    多对多private String name;//角色名private String remark;//备注private String orderNo;//排序号

界面-列表

界面-新增

七.实现模块的CRUD

Module.hbm.xml 模块与角色 多对多

<hibernate-mapping package="cn.itcast.jk.domain"><class name="Module" table="MODULE_P" dynamic-update="true" dynamic-insert="true"><id name="id" column="MODULE_ID"><generator class="uuid"></generator></id><property name="parentId" column="PARENT_ID"></property><property name="parentName" column="PARENT_NAME"></property><property name="name" column="NAME"></property><!-- private Set<Role> roles = new HashSet<Role>(0);//模块与角色   多对多 --><set name="roles" table="ROLE_MODULE_P"><key column="MODULE_ID"></key><many-to-many class="Role" column="ROLE_ID" order-by="ORDER_NO"></many-to-many></set></class></hibernate-mapping>

Module.java

public class Module extends BaseEntity {private String id;private Set<Role> roles = new HashSet<Role>(0);//模块与角色   多对多private String parentId;  //父模块的编号private String parentName;//父模块的名称  冗余  用空间换时间private String name;  //模块名private Integer layerNum;//层数   private Integer isLeaf;//叶子private String ico;  //图片private String cpermission;//权限private String curl;//路径private Integer ctype;//菜单的类型:主菜单,左侧菜单   ,按钮private Integer state;//状态private String belong;//从属于private String cwhich;//private Integer quoteNum;//引用次数private String remark;//备注private Integer orderNo;//排序号

界面-列表

界面-新增

【SSH框架/国际物流商综平台】-03 部门、用户、角色、模块 CURD BRAC认证 细粒度权限控制 BaseAction Page struts.xml *.hbm.xml相关推荐

  1. 【SSH框架/国际物流商综平台】-05 单点登录 用户-角色-权限分配 Ztree.js structs2.0 异常框架 细粒度权限控制 BaseEntitity中createby degree

    回顾 Shiro安全框架 认证,授权,加密,会话管理(单点登录),缓存,与web集成 单点登录(SSO Single Sign on)的原理 就是将原有的各个系统的会话管理机制,抽取出来交给第三方集中 ...

  2. 【SSH框架/国际物流商综平台】-09 POI-SXSSFWorkbook 海量数据导出 细粒度权限控制 出口报运模块 打断设计+跳跃查询 内存监控工具jvisualvm

    回顾: 1.细粒度权限的控制 2.POI报表 八个步骤 3.Excel版本之间的区别 4.模板打印的步骤 1.制作模板 2.加载模板文件,得到工作簿 3.获取工作表 4.获取行对象 5.获取单元格对象 ...

  3. 【SSH框架/国际物流商综平台】-01-分三期(仓储管理,货运全流程管理,决策分析)- 项目背景 界面原型 用例图 企业组织结构 功能模块图 系统框架 项目表单收集

    项目背景 商务综合管理平台是国际物流行业一家专门从事进出口玻璃器皿贸易的公司.业务遍及欧美.随着公司不断发展壮大,旧的信息系统已无法满足公司的快速发展需求,妨碍公司成长,在此背景下,公司领导决定研发& ...

  4. 用Python建设企业认证和权限控制平台

    目前大家对Python的了解更多来源是数据分析.AI.运维工具开发,在行业中使用Python进行web开发,同样也是非常受欢迎的,例如:FaceBook,豆瓣,知乎,饿了么等等,本文主要是介绍是利用P ...

  5. 企业级项目|用Python进行web开发企业统一用户认证和权限控制平台

    目前大家对Python的了解更多来源是数据分析.Ai.运维工具开发,在行业中使用Python进行web开发,同样也是非常受欢迎的,例如:FaceBook,豆瓣,知乎,饿了么等等,本文主要是介绍是利用P ...

  6. CC00229.CloudKubernetes——|KuberNetes细粒度权限控制.V13|——|Ratel.v01|k8s资源管理平台部署|

    一.k8s资源管理平台Ratel ### --- ratel官方hub地址:~~~ https://github.com/dotbalo/ratel-doc 二.安装Ratel ### --- 创建s ...

  7. CC00230.CloudKubernetes——|KuberNetes细粒度权限控制.V14|——|Ratel.v02|k8s资源管理平台配置|

    一.ratel的使用 ### --- 通过Chrome访问Ratel~~~ 注意:如果没有安装ingress controller,需要把type: ClusterIP改成type: NodePort ...

  8. 基于jsp的消防知识宣传网站ssh框架

    消防知识宣传网站主要是发布一些消防新闻和消防知识以及消防器材的介绍使用方法,对人们对火灾方面的了解有一定的普及作用,系统基于javaweb开发,使用了mvc思想ssh框架,Myeclipse作为开发平 ...

  9. ABP开发框架前后端开发系列---(9)ABP框架的权限控制管理

    在前面两篇随笔<ABP开发框架前后端开发系列---(7)系统审计日志和登录日志的管理>和<ABP开发框架前后端开发系列---(8)ABP框架之Winform界面的开发过程>开始 ...

最新文章

  1. 将带空格的字符串去掉空格.join()函数
  2. asp.net使用httphandler打包多CSS或JS文件以加快页面加载速度
  3. mybatis返回map操作
  4. Java面试绕不开的问题: Java中HashMap底层实现原理(JDK1.8)源码分析
  5. 树莓派3 kali linux很卡,树莓派3装kali Linux 成功写入 但是点不亮 为什么?
  6. 使用SpringBoot AOP 记录操作日志、异常日志
  7. python django开发工具_利用pyCharm编辑器创建Django项目开发环境-python开发工具第一篇...
  8. SpringBoot+Prometheus+Grafana实现应用监控和报警
  9. Bootstrap 图片
  10. python 图片数据增强_数据增强之批量修改图像尺寸大小(附Python实现)
  11. 服务注册不进eureka
  12. 【操作系统】虚拟存储器(上)-思维导图 :虚拟存储器概述、请求分页存储方式
  13. C++字符串格式化 sprintf详解
  14. pjsip workshop
  15. IBM AppScan v9.0.3.12+安全规则17339下载、安装和使用
  16. win10清理_win10系统怎么一键清理系统垃圾
  17. Visual Assist X 10.6.1837完美破解版(带VS2010破解)
  18. 基于Java实现的商品推荐系统
  19. 大一高级计算机考试内容,大一计算机考试内容
  20. 前端验证码与后端验证码

热门文章

  1. P4语言——basic_tunnel
  2. 【Python与数据分析实验报告】Pandas数据分析基础应用
  3. 新版经营级秀出打赏系统源码+带支付模块/视频教程
  4. uni-app - Refused to display ‘xxx‘ in a frame because an ancestor violates the following Content Sec
  5. [原创]java实现word转pdf
  6. pr基本图形模板无法使用_Pr基本图形模板安装教程
  7. matlab在矿物加工中的应用,试述《矿物加工数学模型》在矿物加工中的作用
  8. 为什么阿里巴巴最爱招Java开发程序员?
  9. 微信小程序wx:if与hidden区别
  10. appium连接mumu模拟器,无法连接问题