1.分析业务
1.1 业务分析图
1.2 数据逻辑图
1.3 原型设计图
1.4 分层架构图
2. 用户窗口数据呈现
2.1 页面呈现
说明: 在start.html中添加用户页面
<script type="text/javascript">
$(function(){//jQuery中的函数,在页面加载完成之后执行
doLoadUI("load-menu-id", "/menu/menu_list");
doLoadUI("load-user-id", "/user/user_list");
})
//实现共性代码封装
function doLoadUI(id,url){//创建点击事件
$("#"+id).click(function(){
//mainContentId指具体页面位置进行异步加载url对应的资源
$("mainContentId").load(url);
})
}
</script>
2.2 数据呈现
2.2.1 时序图以及数据库数据
2.2.2 创建SysUserDept对象
说明:通过此对象除了可以封装从数据库查询的数据,还可以封装客户端请求数据,实现层与层之间数据的传递
package com.cy.pj.sys.pojo;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
@Data
public class SysUserDept implements Serializable {
private static final long serialVersionUID = 3776304095517793129L;
private Integer id;
private String username;
private String password;//md5
private String salt;
private String email;
private String mobile;
private Integer valid=1;
private SysDept sysDept; //private Integer deptId;
private Date createdTime;
private Date modifiedTime;
private String createdUser;
private String modifiedUser;
}
2.2.3 编辑SysUserDao
/**
* 基于条件查询总记录数
* @param username
* @return
*/
//int getRowCount(String username);
/**
* 基于条件查询当前页记录
* @param username
* @param startIndex
* @param pageSize
* @return
*/
// List<SysUserDept> findPageObjects(String username,Integer startIndex,Integer pageSize);
//同时实现上述两个方法
List<SysUserDept> findPageObjects(String username);
2.2.4 编辑SysUserMapper.xml
<resultMap id="sysUserDept" type="com.cy.pj.sys.pojo.SysUserDept">
<!--association 一般应用于many2one或者one2one这种查询场景-->
<association property="sysDept"
column="deptId"
select="com.cy.pj.sys.dao.SysDeptDao.findById">
</association>
</resultMap>
<select id="findPageObjects" resultMap="sysUserDept">
select *
from sys_users
<where>
<if test="username!=null and username!=''">
username like concat("%",#{username},"%")
</if>
</where>
order by createdTime desc
</select>
2.2.5 添加pagehelper依赖
说明:实现网页的分页查询,减少sql语句的书写
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
2.2.6 编辑SysUserService
PageObject<SysUserDept> findPageObjects(String username,Integer pageCurrent);
2.2.6 编辑SysUserServiceImpl
@Override
public PageObject<SysUserDept> findPageObjects(String username, Integer pageCurrent) {
String tName=Thread.currentThread().getName();
System.out.println("SysUserServiceImpl.findPageObjects.thread.name="+tName);
//1.参数校验
if(pageCurrent==null||pageCurrent<1)
throw new IllegalArgumentException("页码值不正确");
//2.启动分页配置(底层会启动一个mybatis拦截器,拦截sql会话)
int pageSize=3;
Page<SysUserDept> page=PageHelper.startPage(pageCurrent, pageSize);//底层会计算起始位置
//3.执行分页查询(底层会在查询时为sql语句添加limit 语句)
List<SysUserDept> records=sysUserDao.findPageObjects(username);
return new PageObject<>((int)page.getTotal(), records, pageSize, pageCurrent);
}
2.2.7 编辑SysUserController
@GetMapping("doFindPageObjects")
public JsonResult doFindPageObjects(String username,Integer pageCurrent){
//long t1=System.currentTimeMillis();
PageObject<SysUserDept> pageObject=
sysUserService.findPageObjects(username, pageCurrent);
//long t2=System.currentTimeMillis();
//long time=t2-t1;
return new JsonResult(pageObject);
}
2.5 呈现效果
3. 禁用操作的实现
3.1 时序图
3.1 编辑SysUserDao
@Update("update sys_users set valid=#{valid},modifiedUser=#{modifiedUser},modifiedTime=now() where id=#{id}")
int validById(Integer id,Integer valid,String modifiedUser);
3.2 编辑SysUserService
int validById(Integer id,Integer valid);
3.2 编辑SysUserServiceImpl
@Override
public int validById(Integer id, Integer valid) {
///...............
//1.参数校验
if(id==null||id<1)
throw new IllegalArgumentException("id值无效");
if(valid==null||valid!=0&&valid!=1)
throw new IllegalArgumentException("状态值不正确");
//2.修改状态并校验结果
int rows=sysUserDao.validById(id,valid,"admin");//这里admin代表登录用户
if(rows==0)
throw new ServiceException("记录可能已经不存在");
return rows;
}
3.3 编辑SysUserController
@PostMapping("doValidById")
public JsonResult doValidById(Integer id,Integer valid){
//long t1=System.currentTimeMillis();
sysUserService.validById(id,valid);
//long t2=System.currentTimeMillis();
//long time=t2-t1;
return new JsonResult("update ok");
}
3.4 效果展现
4. 添加操作的实现
4.1 原型图
4.2 时序图
4.3 角色数据查询
4.3.1 创建CheckBox对象
说明:添加页面呈现用户拥有的角色信息,创建该POJO对象封装用户角色id和角色信息
package com.cy.pj.common.pojo;
import lombok.Data;
import java.io.Serializable;
@Data
public class CheckBox implements Serializable {
private static final long serialVersionUID = -3930756932197466333L;
private Integer id;
private String name;
}
4.3.2 编辑SysRoleDao
/**
* 查询角色id和名字,每个一行数据封装为一个Checkbox对象
* @return
*/
@Select("select id,name from sys_roles")
List<CheckBox> findObjects();
4.3.3 编辑SysRoleService
List<CheckBox> findObjects();
4.3.4 编辑SysRoleServiceImpl
@Override
public List<CheckBox> findObjects() {
return sysRoleDao.findObjects();
}
4.3.5 编辑SysRoleController
@GetMapping("doFindRoles")
public JsonResult doFindObjects(){
return new JsonResult(sysRoleService.findObjects());
}
4.4 添加用户信息提交
4.4.1 时序图
4.4.2 编辑SysUser对象
package com.cy.pj.sys.pojo;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
@Data
public class SysUser implements Serializable {
private static final long serialVersionUID = 8857453521738996113L;
private Integer id;
private String username;
private String password;//md5
private String salt;
private String email;
private String mobile;
private Integer valid=1;
private Integer deptId;
private Date createdTime;
private Date modifiedTime;
private String createdUser;
private String modifiedUser;
}
5. 更新操作的实现
5.1 修改页面数据呈现
5.1.1 时序图
5.1.2 编辑SysUserRoleDao
/**
* 基于用户id查找用户对应的角色id
* @param userId
* @return
*/
@Select("select role_id from sys_user_roles where user_id=#{userId}")
List<Integer> findRoleIdsByUserId(Integer userId);
5.1.3 编辑SysUserDao
/**
* 基于用户id获取用户以及用户对应的部门信息
* @param id
* @return
*/
SysUserDept findById(Integer id);
5.1.3 编辑SysUserMapper
<select id="findById" resultMap="sysUserDept">
select *
from sys_users
where id=#{id}
</select>
5.1.4 编辑SysUserServiceImpl
@Override
public Map<String, Object> findById(Integer id) {
//1.参数校验
//2.查询用户以及用户对应的部门信息
SysUserDept user=sysUserDao.findById(id);
if(user==null)
throw new ServiceException("用户可能已经不存在");
//3.查询用户对应的角色id
List<Integer> roleIds=sysUserRoleDao.findRoleIdsByUserId(id);
//4.封装结果并返回
Map<String,Object> map=new HashMap<>();
map.put("user", user);
map.put("roleIds", roleIds);
return map;
}
5.1.5 编辑SysUserController
@GetMapping("doFindObjectById")
public JsonResult doFindById(Integer id){
return new JsonResult(sysUserService.findById(id));
}
5.1.6 编辑页面呈现
5.2 修改页面数据更新
5.2.1 时序图
5.2.2 编辑SysUserDao
int updateObject(SysUser entity);
5.2.3 编辑SysUserMapper
<update id="updateObject">
update sys_users
set username=#{username},
mobile=#{mobile},
email=#{email},
deptId=#{deptId},
modifiedTime=now(),
modifiedUser=#{modifiedUser}
where id=#{id}
</update>
5.2.3 编辑SysUserRoleDao
基于用户 id 删除用户角色关系数据
@Delete("delete from sys_user_roles where user_id=#{userId}")
int deleteObjectsByUserId(Integer userId);
5.2.4 编辑SysUserServiceImpl
@Override
public int updateObject(SysUser entity, Integer[] roleIds) {
//1.参数校验
if(entity==null)
throw new IllegalArgumentException("保存对象不能为空");
if(StringUtils.isEmpty(entity.getUsername()))
throw new IllegalArgumentException("用户名不能为空");
if(roleIds==null||roleIds.length==0)
throw new IllegalArgumentException("必须要为用户分配角色");
//.....
//2.更新用户自身信息
int rows=sysUserDao.updateObject(entity);
if(rows==0)
throw new ServiceException("用户可能已经不存在");
//3.更新用户和角色关系数据
sysUserRoleDao.deleteObjectsByUserId(entity.getId());
sysUserRoleDao.insertObjects(entity.getId(),roleIds);
return rows;
}
5.2.5 编辑SysUserController
@PostMapping("doUpdateObject")
public JsonResult doUpdateObject(SysUser entity,Integer[]roleIds){
sysUserService.updateObject(entity, roleIds);
return new JsonResult("update ok");
}