统一身份认证系统之用户管理模块功能开发
在【统一身份认证系统之单元测试】文章中,已添加用户新增、用户修改、根据id物理删除用户信息、根据id逻辑删除用户信息、分页查询用户信息接口,详情请参考:统一身份认证系统之单元测试
一、新增用户接口
新增用户角色关系po对象【SysUserRole.java】
package com.dc.pojo;
import com.wordnik.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
public class SysUserRole implements Serializable {
@ApiModelProperty(value = " 用户角色自增id")
private int user_role_id;
@ApiModelProperty(value = " 用户id")
private int fk_user_id;
@ApiModelProperty(value = " 角色id")
private int fk_role_id;
public int getUser_role_id() {
return user_role_id;
}
public void setUser_role_id(int user_role_id) {
this.user_role_id = user_role_id;
}
public int getFk_user_id() {
return fk_user_id;
}
public void setFk_user_id(int fk_user_id) {
this.fk_user_id = fk_user_id;
}
public int getFk_role_id() {
return fk_role_id;
}
public void setFk_role_id(int fk_role_id) {
this.fk_role_id = fk_role_id;
}
}
新增文件上传记录po对象【SysFileLog.java】,存储文件上传时的头像信息
package com.dc.pojo;
import com.wordnik.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
import java.util.Date;
/**
*
* <h2>文件上传记录</h2>
*
* @ClassName: SysFileLog
* @author Enzo
* @date 2018年1月23日 上午11:24:10
*/
public class SysFileLog implements Serializable {
@ApiModelProperty(value = "主键id")
String file_log_id;
@ApiModelProperty(value = " 原始文件名")
String file_name;// 原始文件名
@ApiModelProperty(value = "重命名的文件名")
String file_rename;// 重命名的文件名
@ApiModelProperty(value = "文件类型,不包含点")
String file_type;// 文件类型,不包含点(doc)
@ApiModelProperty(value = "文件保存地址")
String save_path;// 文件保存地址(2017-01-01/default/2017010115300001_test.doc)
@ApiModelProperty(value = "文件大小")
long file_size;// 文件大小
@ApiModelProperty(value = "文件长度,针对doc、pdf、xls文档的文件页码数,针对视频文件的时长")
String file_length;// 文件长度,针对doc、pdf、xls文档的文件页码数,针对视频文件的时长(10)
@ApiModelProperty(value = "转化状态,0不转化,1待转化 ,2转化中,3转化完成,4转化异常,")
int state;// 转化状态,0不转化,1待转化 ,2转化中,3转化完成,4转化异常,
@ApiModelProperty(value = "消息")
String message = "";// 消息
@ApiModelProperty(value = "上传时间")
Date upload_time;// 上传时间
@ApiModelProperty(value = "上传者")
String uploader;// 上传者
@ApiModelProperty(value = "是否删除")
int isdeleted;
public String getFile_log_id() {
return file_log_id;
}
public void setFile_log_id(String file_log_id) {
this.file_log_id = file_log_id;
}
public String getFile_name() {
return file_name;
}
public void setFile_name(String file_name) {
this.file_name = file_name;
}
public String getFile_rename() {
return file_rename;
}
public void setFile_rename(String file_rename) {
this.file_rename = file_rename;
}
public String getFile_type() {
return file_type;
}
public void setFile_type(String file_type) {
this.file_type = file_type;
}
public String getSave_path() {
return save_path;
}
public void setSave_path(String save_path) {
this.save_path = save_path;
}
public long getFile_size() {
return file_size;
}
public void setFile_size(long file_size) {
this.file_size = file_size;
}
public String getFile_length() {
return file_length;
}
public void setFile_length(String file_length) {
this.file_length = file_length;
}
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public Date getUpload_time() {
return upload_time;
}
public void setUpload_time(Date upload_time) {
this.upload_time = upload_time;
}
public String getUploader() {
return uploader;
}
public void setUploader(String uploader) {
this.uploader = uploader;
}
public int getIsdeleted() {
return isdeleted;
}
public void setIsdeleted(int isdeleted) {
this.isdeleted = isdeleted;
}
}
新增用户vo对象【SysUserVo.java】,用于存储用户信息、用户角色信息、头像信息
package com.dc.vo;
import com.dc.pojo.SysFileLog;
import com.dc.pojo.SysRole;
import com.dc.pojo.SysUser;
import com.dc.pojo.SysUserRole;
import com.wordnik.swagger.annotations.ApiModelProperty;
import java.util.List;
/**
* @author Enzo
* @Description 用户vo对象
* @date 2018-11-15 16:23
*/
public class SysUserVo {
@ApiModelProperty("用户id")
private int user_id;
@ApiModelProperty("角色名称")
private String role_names;
@ApiModelProperty("修改密码时存储旧密码")
private String old_password;
@ApiModelProperty("用户对象")
private SysUser user;
@ApiModelProperty("用户角色关系对象")
private List<SysUserRole> listUserRole;
@ApiModelProperty("角色信息")
private List<SysRole> listRole;
@ApiModelProperty("头像文件信息")
private SysFileLog fileLog;
public int getUser_id() {
return user_id;
}
public void setUser_id(int user_id) {
this.user_id = user_id;
}
public String getRole_names() {
return role_names;
}
public void setRole_names(String role_names) {
this.role_names = role_names;
}
public String getOld_password() {
return old_password;
}
public void setOld_password(String old_password) {
this.old_password = old_password;
}
public List<SysRole> getListRole() {
return listRole;
}
public void setListRole(List<SysRole> listRole) {
this.listRole = listRole;
}
public SysFileLog getFileLog() {
return fileLog;
}
public void setFileLog(SysFileLog fileLog) {
this.fileLog = fileLog;
}
public SysUser getUser() {
return user;
}
public void setUser(SysUser user) {
this.user = user;
}
public List<SysUserRole> getListUserRole() {
return listUserRole;
}
public void setListUserRole(List<SysUserRole> listUserRole) {
this.listUserRole = listUserRole;
}
}
新增用户时需要验证账号是否已存在,若不存在,则新增创建,新增文件时判断是否上传了头像,然后新增用户角色关系信息,所以需要添加4个sql
新增角色sql:insertUser
新增角色权限sql:insertUserRole
根据角色名称查询角色信息接口:selectUserByAccount
新增用户头像sql:insertFileLog
在【SysUserDao.java】中添加根据账号查询用户信息dao接口、新增用户角色关系sql
SysUser selectUserByAccount(@Param("account") String account);
int insertUserRole(SysUserRole userRole);
在【SysUserMapper.xml】中添加根据账号查询用户信息、新增用户角色关系sqlMapper
<select id="selectUserByAccount" parameterType="string" resultType="com.dc.pojo.SysUser">
SELECT * from t_sys_user where is_deleted=0 and account=#{account}
</select>
<insert id="insertUserRole" parameterType="com.dc.pojo.SysUserRole" useGeneratedKeys="true"
keyProperty="user_role_id">
insert into t_sys_user_role
(fk_user_id,fk_role_id)
values
(#{fk_user_id},#{fk_role_id})
</insert>
新增【SysFileLogDao.java】,添加新增文件上传记录dao接口
package com.dc.mapper;
import com.dc.pojo.SysFileLog;
import org.apache.ibatis.annotations.Param;
public interface SysFileLogDao {
int insertFileLog(SysFileLog fileLog);
}
新增【SysFileLogMapper.xml】,添加文件上传记录新增sqlMapper
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dc.mapper.SysFileLogDao">
<insert id="insertFileLog" parameterType="com.dc.pojo.SysFileLog" keyProperty="file_log_id" useGeneratedKeys="true">
insert into t_sys_file_log
(file_name,file_rename,file_type,save_path,file_size,file_length,state,message,upload_time,uploader,isdeleted)
values
(#{file_name},#{file_rename},#{file_type},#{save_path},#{file_size},#{file_length},#{state},#{message},now(),#{uploader},0)
</insert>
</mapper>
新增文件上传业务接口【SysFileLogService.java】
package com.dc.service;
import com.dc.base.pojo.BaseModel;
public interface SysFileLogService {
void uploadFiles(BaseModel baseModel, String uploader)throws Exception;
}
新增文件上传业务接口实现【SysFileLogServiceImpl.java】
package com.dc.service.impl;
import com.dc.base.contants.BaseContants;
import com.dc.base.pojo.BaseModel;
import com.dc.mapper.SysFileLogDao;
import com.dc.pojo.SysFileLog;
import com.dc.service.SysFileLogService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.FileOutputStream;
import java.util.Calendar;
import java.util.UUID;
/**
* @author Enzo
* @Description 文件上级记录业务实现
* @date 2018-11-16 9:46
*/
@Service
public class SysFileLogServiceImpl implements SysFileLogService {
@Autowired
SysFileLogDao fileLogDao;
/**
* @return void
* @title:<h3> 文件上传 <h3>
* @author: Enzo
* @date: 2018-11-16 9:47
* @params [baseModel, uploader]
**/
public void uploadFiles(BaseModel baseModel, String uploader) throws Exception {
//判断文件是否为空
if (baseModel.getTempMFile() == null || baseModel.getTempMFile().length == 0) {
return;
}
StringBuilder fileIds = new StringBuilder("");
//文件不为空
for (MultipartFile file : baseModel.getTempMFile()) {
if (file.isEmpty() || file.getSize() == 0 || file.getName() == null) {//判断文件是否有效
return;
}
SysFileLog fileLog = new SysFileLog();
//获得原始文件名
fileLog.setFile_name(file.getOriginalFilename());
//获得文件类型
fileLog.setFile_type(file.getContentType());
//获得文件长度
fileLog.setFile_size(file.getSize());
//重名文件
fileLog.setFile_rename(UUID.randomUUID().toString() + fileLog.getFile_name().substring(fileLog.getFile_name().lastIndexOf(".")));
//保存文件,获得保存文件的相对地址
// SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
// Date time = new Date();
// String path = time.getYear() + File.separator + sdf.format(time).substring(0, 4)
// + File.separator + sdf.format(time) + File.separator + fileLog.getFile_rename();
Calendar c = Calendar.getInstance();//可以对每个时间域单独修改
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH)+1;
int date = c.get(Calendar.DATE);
fileLog.setSave_path( year + File.separator + year + month + File.separator
+ year + month + date + File.separator + fileLog.getFile_rename());
//上传者
fileLog.setUploader(uploader);
//进行文件上传
//文件上传物理路径
String path=System.getProperty(BaseContants.WEBAPP_ROOT)+File.separator+"files"
+File.separator+"upload"+File.separator+fileLog.getSave_path();
uploderFile(file,path);
//执行文件新增的sql
fileLogDao.insertFileLog(fileLog);
fileIds.append(",");
fileIds.append(fileLog.getFile_log_id());
}
//返回上传文件id
if (fileIds.length() > 1) {
baseModel.setFilesArray(fileIds.toString().substring(1));
}
}
/**
* @title:<h3> 上传文件 <h3>
* @author: Enzo
* @date: 2018-11-16 10:56
* @params [file:文件对象, desPath:输出文件的物理路径]
* @return void
**/
private void uploderFile(MultipartFile file,String desPath)throws Exception{
//判断文件上传的目录是否存在,若不存在,则创建文件夹
File desFile=new File(desPath);//设置目标文件
if(!desFile.getParentFile().exists()){//目标文件的文件夹是否存在,若不存在,则创建文件夹
desFile.getParentFile().mkdirs();
}
FileOutputStream outputStream=new FileOutputStream(desFile);
outputStream.write(file.getBytes());
if(outputStream!=null){
outputStream.flush();
outputStream.close();
}
}
}
新增用户时添加默认密码,默认密码记录在BaseContants.DEFAULT_PASSOWRD
中,为了提高安全性,对保存在数据库的密码进行加密,在base中新增加密工具类【MD5DES.java 】,添加加密方法
package com.dc.base.util;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import java.io.IOException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
public class MD5DES {
private final static String DES = "DES"; // 常用的对称加密有:DES、IDEA、RC2、RC4、SKIPJACK、RC5、AES算法等
private static String PUBLIC_KEY = "1234567890";// 加密解密公钥
/**
* Description 根据键值进行加密
*
* @param data
* @param key
* 加密键byte数组
* @return
* @throws Exception
*/
public static String encrypt(String data) throws Exception {
byte[] bt = encrypt(data.getBytes(), PUBLIC_KEY.getBytes());
String strs = new BASE64Encoder().encode(bt);
return strs;
}
/**
* Description 根据键值进行解密
*
* @param data
* @param key
* 加密键byte数组
* @return
* @throws IOException
* @throws Exception
*/
public static String decrypt(String data) throws IOException, Exception {
if (data == null)
return null;
BASE64Decoder decoder = new BASE64Decoder();
byte[] buf = decoder.decodeBuffer(data);
byte[] bt = decrypt(buf, PUBLIC_KEY.getBytes());
return new String(bt);
}
/**
* Description 根据键值进行加密
*
* @param data
* @param key
* 加密键byte数组
* @return
* @throws Exception
*/
private static byte[] encrypt(byte[] data, byte[] key) throws Exception {
// 生成一个可信任的随机数源
SecureRandom sr = new SecureRandom();
// 从原始密钥数据创建DESKeySpec对象
DESKeySpec dks = new DESKeySpec(key);
// 创建一个密钥工厂,然后用它把DESKeySpec转换成SecretKey对象
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);
SecretKey securekey = keyFactory.generateSecret(dks);
// Cipher对象实际完成加密操作
Cipher cipher = Cipher.getInstance(DES);
// 用密钥初始化Cipher对象
cipher.init(Cipher.ENCRYPT_MODE, securekey, sr);
return cipher.doFinal(data);
}
/**
* Description 根据键值进行解密
*
* @param data
* @param key
* 加密键byte数组
* @return
* @throws Exception
*/
private static byte[] decrypt(byte[] data, byte[] key) throws Exception {
// 生成一个可信任的随机数源
SecureRandom sr = new SecureRandom();
// 从原始密钥数据创建DESKeySpec对象
DESKeySpec dks = new DESKeySpec(key);
// 实例化支持DES算法的密钥生成器(算法名称命名需按规定,否则抛出异常)
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);
// SecretKey 负责保存对称密钥 ,生成密钥
SecretKey securekey = keyFactory.generateSecret(dks);
// Cipher负责完成加密或解密工作
Cipher cipher = Cipher.getInstance(DES);
// 根据密钥,对Cipher对象进行初始化,DECRYPT_MODE表示加密模式
cipher.init(Cipher.DECRYPT_MODE, securekey, sr);
return cipher.doFinal(data);
}
/**
* Description 获取字符串MD5值
*
* @param sourceStr
*/
private static String MD5(String sourceStr) {
String result = "";
try {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(sourceStr.getBytes());
byte b[] = md.digest();
int i;
StringBuffer buf = new StringBuffer("");
for (int offset = 0; offset < b.length; offset++) {
i = b[offset];
if (i < 0)
i += 256;
if (i < 16)
buf.append("0");
buf.append(Integer.toHexString(i));
}
result = buf.toString();
// System.out.println("MD5(" + sourceStr + ",32) = " + result);
// System.out.println("MD5(" + sourceStr + ",16) = " +
// buf.toString().substring(8, 24));
} catch (NoSuchAlgorithmException e) {
// log.error(e.getMessage());
}
return result;
}
/**
*
* <h3>可逆的加密算法 ;MD5后再加密 </h3>
* @param inStr
* @return
* @author Enzo
* @date 2018年2月3日 下午4:20:21
*/
private static String KL(String inStr) {
// String s = new String(inStr);
char[] a = inStr.toCharArray();
for (int i = 0; i < a.length; i++) {
a[i] = (char) (a[i] ^ 't');
}
String s = new String(a);
return s;
}
/**
*
* <h3>加密后解密;解密为MD5后的</h3>
* @param inStr
* @return
* @author Enzo
* @date 2018年2月3日 下午4:20:03
*/
private static String JM(String inStr) {
char[] a = inStr.toCharArray();
for (int i = 0; i < a.length; i++) {
a[i] = (char) (a[i] ^ 't');
}
String k = new String(a);
return k;
}
public static void main(String[] args) throws Exception {
String data = "mypassword";//dc10CtqzzdfqsABousAVIA==
//data="111111";//zCc5xk/vsZk=
String encode = encrypt(data);
System.err.println(encode);
String dcode = decrypt(encode);
System.err.println(dcode);
}
}
在【SysUserService.java】中添加新增用户信息业务层接口
package com.dc.service;
import com.dc.base.pojo.BaseModel;
import com.dc.pojo.SysUser;
import com.dc.vo.SysUserVo;
public interface SysUserService {
void inserUserVo(SysUserVo userVo, BaseModel baseModel) throws Exception;
}
在【SysUserServiceImpl.java】中添加新增用户信息业务层接口实现
package com.dc.service.impl;
import com.dc.base.contants.BaseContants;
import com.dc.base.pojo.BaseModel;
import com.dc.base.pojo.BusinessException;
import com.dc.base.util.MD5DES;
import com.dc.mapper.SysUserDao;
import com.dc.pojo.SysUser;
import com.dc.pojo.SysUserRole;
import com.dc.service.SysFileLogService;
import com.dc.service.SysUserService;
import com.dc.vo.SysUserVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class SysUserServiceImpl implements SysUserService {
@Autowired
private SysUserDao userDao;
@Autowired
private SysFileLogService fileLogService;
/**
* @return void
* @title:<h3> 新增用户<h3>
* @author: Enzo
* @date: 2018-11-15 16:25
* @params [userVo, baseModel]
**/
public void inserUserVo(SysUserVo userVo, BaseModel baseModel) throws Exception {
//验证用户名
SysUser oldUser = userDao.selectUserByAccount(userVo.getUser().getAccount());
if (oldUser != null) {
throw new BusinessException("帐号已存在,请勿重复添加");
}
userVo.getUser().setPassword(MD5DES.encrypt(BaseContants.DEFAULT_PASSOWRD));
//判断是否进行文件上传
fileLogService.uploadFiles(baseModel, userVo.getUser().getCreate_user_name());
userVo.getUser().setHead_img_url(baseModel.getFilesArray());
//新增用户
userDao.insertUser(userVo.getUser());
//新增用户角色关系
if (userVo.getListUserRole() != null && userVo.getListUserRole().size() > 0) {//存在用户角色关系表记录
for (int i = 0; i < userVo.getListUserRole().size(); i++) {
SysUserRole userRole = userVo.getListUserRole().get(i);
userRole.setFk_user_id(userVo.getUser().getUser_id());
userDao.insertUserRole(userRole);
}
}
}
}
在【SysUserController.java】中添加新增用户信息控制器
package com.dc.controller;
import com.dc.base.controller.BaseController;
import com.dc.base.pojo.BaseModel;
import com.dc.base.pojo.BusinessException;
import com.dc.service.SysUserService;
import com.dc.vo.SysUserVo;
import com.wordnik.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@ResponseBody
@RequestMapping("/sysUser")
public class SysUserController extends BaseController {
@Autowired
private SysUserService userService;
/**
* @return com.dc.base.pojo.BaseModel
* @title:<h3> 用户新增 <h3>
* @author: Enzo
* @date: 2018-11-15 16:38
* @params [userVo, baseModel]
**/
@ApiOperation(value = "新增用户信息", httpMethod = "POST", response = SysUserVo.class)
@RequestMapping("insertUserVo")
public BaseModel inserUserVo(@ModelAttribute SysUserVo userVo, BaseModel baseModel) throws Exception {
if (userVo == null || userVo.getUser() == null) {
throw new BusinessException("用户信息不能为空");
} else if (userVo.getUser().getAccount() == null || "".equals(userVo.getUser().getAccount())) {
throw new BusinessException("帐号不能为空");
} else if (userVo.getUser().getName() == null || "".equals(userVo.getUser().getName())) {
throw new BusinessException("用户姓名不能为空");
}
userVo.getUser().setCreate_user_id(getSessionUser().getUser_id());
userVo.getUser().setCreate_user_name(getSessionUser().getName());
userService.inserUserVo(userVo, baseModel);
baseModel.setMessage("新增用户成功");
baseModel.setTempMFile(null);
return baseModel;
}
}
修改【LoginServiceImpl.java】中的登录功能,把密码加密后,和数据库的密码进行比对
...
//4.判断密码是否正确
if (user.getPassword().equals(MD5DES.encrypt(loginLog.getUser_password()))) {//如果密码正确,登录成功
loginLog.setState(1);
baseModel.setResultCode(0);
baseModel.setMessage("登录成功");
user.setPassword(null);//密码等敏感数据不返回
baseModel.setData(user);
loginLog.setUser_id(user.getUser_id());
loginLog.setUser_name(user.getName());
loginLog.setUser_password(null);//登录成功的密码不保存在登录日志
}
...
二、分页查询用户列表接口
在【SysUserDao.java】中添加查询用户列表dao接口
List<SysUserVo>selectUserVo(QueryParams queryParams);
在【SysUserMapper.xml】中添加mapUserVo、查询用户信息列表sqlMapper
<resultMap id="mapUserVo" type="com.dc.vo.SysUserVo">
<id property="user_id" column="user_id"></id>
<result property="role_names" column="role_names"></result>
<association property="user" javaType="com.dc.pojo.SysUser">
<id property="user_id" column="user_id"></id>
<result property="account" column="account"></result>
<result property="name" column="name"></result>
<result property="sex" column="sex"></result>
<result property="address" column="address"></result>
<result property="email" column="email"></result>
<result property="birthday" column="birthday"></result>
<result property="create_user_name" column="create_user_name"></result>
<result property="update_user_name" column="update_user_name"></result>
<result property="create_time" column="create_time"></result>
<result property="version" column="version"></result>
<result property="state" column="state"></result>
<result property="head_img_url" column="head_img_url"></result>
<result property="phone" column="phone"></result>
<result property="memo" column="memo"></result>
</association>
<association property="fileLog" javaType="com.dc.pojo.SysFileLog">
<id column="file_log_id" property="file_log_id"></id>
<result property="save_path" column="save_path"></result>
</association>
<collection property="listUserRole" ofType="com.dc.pojo.SysUserRole">
<id column="user_role_id" property="user_role_id"></id>
<result column="fk_role_id" property="fk_role_id"></result>
</collection>
</resultMap>
<!--合并同一用户的角色名称,以逗号作为间隔-->
<sql id="selectRoleNames">
select fk_user_id,GROUP_CONCAT(sr.name SEPARATOR ',')as role_names from t_sys_user_role sur
join t_sys_role sr on sur.fk_role_id=sr.role_id and sr.is_deleted=0
GROUP BY fk_user_id
</sql>
<select id="selectUserVo" parameterType="com.dc.base.pojo.QueryParams" resultMap="mapUserVo">
select su.*,trn.role_names from t_sys_user su
LEFT JOIN
(
<include refid="selectRoleNames"></include>
)trn on trn.fk_user_id=su.user_id
where su.is_deleted=0
<if test="where != null and where!=''">
and ${where}
</if>
order by
<if test="order != null">
${order}
</if>
su.account asc
</select>
在【SysUserService.java】中添加查询用户列表业务层接口
void selectPageUserVo(BaseModel baseModel) throws Exception;
在【SysUserServiceImpl.java】中添加查询用户列表业务层接口实现
/**
* @return void
* @title:<h3> 分页查询用户列表信息 <h3>
* @author: Enzo
* @date: 2018-11-16 14:24
* @params [baseModel]
**/
public void selectPageUserVo(BaseModel baseModel) throws Exception {
PageHelper.startPage(baseModel.getQueryParams().getCurr_page(), baseModel.getQueryParams().getPage_size());
List<SysUserVo> list = userDao.selectUserVo(baseModel.getQueryParams());
PageInfo page = new PageInfo(list);
baseModel.setData(page);
}
在【SysUserController.java】中添加查询用户列表控制器
/**
* @return com.dc.base.pojo.BaseModel
* @title:<h3> 分页查询用户列表 <h3>
* @author: Enzo
* @date: 2018-11-16 14:29
* @params [baseModel]
**/
@ApiOperation(value = "分页查询用户列表", httpMethod = "POST", response = SysUserVo.class)
@RequestMapping("selectPageUserVo")
public BaseModel selectPageUserVo(BaseModel baseModel) throws Exception {
userService.selectPageUserVo(baseModel);
baseModel.setMessage("分页查询用户列表成功");
return baseModel;
}
三、根据id查询用户信息接口
在【SysUserDao.java】中添加根据id查询用户信息dao接口
SysUserVo selectUserVoByPk(@Param("pk") int pk);
在【SysUserMapper.xml】中添加根据id查询用户信息sqlMapper
<select id="selectUserVoByPk" parameterType="int" resultMap="mapUserVo">
select su.*,sfl.file_log_id,sfl.save_path,sur.fk_role_id from t_sys_user su
left join t_sys_file_log sfl on su.head_img_url=sfl.file_log_id and sfl.isdeleted=0
left join t_sys_user_role sur on sur.fk_user_id=su.user_id
where su.is_deleted=0
and su.user_id=#{pk}
</select>
在【SysUserService.java】中添加根据id查询用户信息业务层接口
void selectUserVoByPk(int pk, BaseModel baseModel) throws Exception;
在【SysUserServiceImpl.java】中添加根据用户id查询用户信息业务层接口实现
/**
* @return void
* @title:<h3> 根据id查询用户详情 <h3>
* @author: Enzo
* @date: 2018-11-16 15:33
* @params [pk, baseModel]
**/
public void selectUserVoByPk(int pk, BaseModel baseModel) throws Exception {
baseModel.setData(userDao.selectUserVoByPk(pk));
}
在【SysUserController.java】中添加根据用户id查询用户信息控制器
/**
* @return com.dc.base.pojo.BaseModel
* @title:<h3>根据用户id查询用户信息 <h3>
* @author: Enzo
* @date: 2018-11-16 15:38
* @params [pk, baseModel]
**/
@ApiOperation(value = "根据用户id查询用户信息", httpMethod = "GET", response = SysUserVo.class)
@RequestMapping("selectUserVoByUserId/{pk}")
public BaseModel selectUserVoByPk(@PathVariable("pk") int pk, BaseModel baseModel) throws Exception {
userService.selectUserVoByPk(pk, baseModel);
baseModel.setMessage("根据用户id查询用户信息成功");
return baseModel;
}
四、修改用户接口
修改用户时,验证帐号是否已存在,判断是否需要更新头像,删除用户角色关系表信息,后重新添加用户角色关系
用户修改接口已存在,添加根据用户id删除用户角色关系表记录dao接口deleteUserRoleInUserId
添加根据id删除文件上传记录表数据dao接口removeFileLogInFileLogId
添加根据id删除文件上传记录表数据业务层接口deleteFileLogInFileLogId
添加用户修改业务层接口updateUserVo
验证帐号是否已存在,
验证文件上传,判断是否删除文件,添加新文件
删除用户角色关系表数据,添加新的用户角色关系数据
添加用户修改控制层接口updateUserVo
参数验证,设置修改人信息
在【SysUserDao.java】中添加删除用户角色关dao接口
int deleteUserRoleInUserIds(@Param("userIds") String userIds);
在【SysUserMapper.xml】中添加删除用户角色关系sqlMapper
<!--根据用户id删除用户角色关系表-->
<delete id="deleteUserRoleInUserIds" parameterType="string">
delete from t_sys_user_role where fk_user_id in(${userIds})
</delete>
在【SysFileLogDao.java】中添加删除用户头像对应的文件dao接口
int removeFileLogInUserIds(@Param("userIds") String userIds);
在【SysFileLogMapper.xml】中添加删除用户头像对应的文件sqlMapper
<update id="removeFileLogInUserIds" parameterType="string">
update t_sys_file_log set isdeleted=1 where file_log_id in
(
select head_img_url from t_sys_user where user_id in(${userIds})
)
</update>
在【SysUserService.java】中添加修改用户信息业务层接口
void updateUserVo(SysUserVo userVo, BaseModel baseModel) throws Exception;
在【SysUserServiceImpl.java】中添加修改用户信息业务层接口实现
/**
* @return void
* @title:<h3> 更新用户信息 <h3>
* @author: Enzo
* @date: 2018-11-19 10:06
* @params [userVo, baseModel]
**/
public void updateUserVo(SysUserVo userVo, BaseModel baseModel) throws Exception {
//判断账号是否重复
SysUser oldUser = userDao.selectUserByAccount(userVo.getUser().getAccount());
if (oldUser != null && oldUser.getUser_id() != userVo.getUser().getUser_id()) {//存在用户信息,并且id不是当前修改的记录,则说明帐号重复
throw new BusinessException("帐号'" + userVo.getUser().getAccount() + "'已存在,请勿重复添加");
}
//判断是否进行文件上传(更新上传文件id)
fileLogService.uploadFiles(baseModel, userVo.getUser().getUpdate_user_name());
if (baseModel.getFilesArray() != null) {//如果存在头像更新,则更新头像id
userVo.getUser().setHead_img_url(baseModel.getFilesArray());
//删除文件上传记录表中的记录
fileLogDao.removeFileLogInUserIds(userVo.getUser().getUser_id() + "");
}
//修改用信息
int count = userDao.updateUser(userVo.getUser());
if (count == 0) {
throw new BusinessException(ErrorMesgEnum.UPDATE_VES);
}
//删除用户角色关系表记录
userDao.deleteUserRoleInUserIds(userVo.getUser().getUser_id() + "");
//新增用户角色关系表记录
if (userVo.getListUserRole() != null && userVo.getListUserRole().size() > 0) {//存在用户角色关系表记录
for (int i = 0; i < userVo.getListUserRole().size(); i++) {
SysUserRole userRole = userVo.getListUserRole().get(i);
userRole.setFk_user_id(userVo.getUser().getUser_id());
userDao.insertUserRole(userRole);
}
}
}
在【SysUserController.java】中添加修改用户信息控制器
/**
* @return com.dc.base.pojo.BaseModel
* @title:<h3> 更新用户信息 <h3>
* @author: Enzo
* @date: 2018-11-19 10:33
* @params [userVo, baseModel]
**/
@ApiOperation(value = "更新用户信息", httpMethod = "POST", response = SysUserVo.class)
@RequestMapping("updateUserVo")
public BaseModel updateUserVo(@ModelAttribute SysUserVo userVo, BaseModel baseModel) throws Exception {
if (userVo == null || userVo.getUser() == null) {
throw new BusinessException("用户信息不能为空");
} else if (userVo.getUser().getUser_id() == 0) {
throw new BusinessException("用户id不能为空");
} else if (userVo.getUser().getAccount() == null || "".equals(userVo.getUser().getAccount())) {
throw new BusinessException("帐号不能为空");
} else if (userVo.getUser().getName() == null || "".equals(userVo.getUser().getName())) {
throw new BusinessException("用户姓名不能为空");
}
userVo.getUser().setUpdate_user_id(getSessionUser().getUser_id());
userVo.getUser().setUpdate_user_name(getSessionUser().getName());
userService.updateUserVo(userVo, baseModel);
baseModel.setMessage("修改用户信息成功");
baseModel.setTempMFile(null);
return baseModel;
}
五、删除用户接口
在【SysUserService.java】中添加删除用户信息业务层接口
void deleteUserVoInUserIds(String ids, BaseModel baseModel) throws Exception;
在【SysUserServiceImpl.java】中添加删除用户信息业务层接口实现
/**
* @return void
* @title:<h3> 根据用户id删除用户信息 <h3>
* @author: Enzo
* @date: 2018-11-19 11:16
* @params [ids, baseModel]
**/
public void deleteUserVoInUserIds(String ids, BaseModel baseModel) throws Exception {
//删除用户角色关系表记录
userDao.deleteUserRoleInUserIds(ids);
//删除用户头像记录
fileLogDao.removeFileLogInUserIds(ids);
//删除用户信息
int count = userDao.removeUserInUserIds(ids);
baseModel.setMessage("删除‘" + count + "’条用户信息成功");
}
在【SysUserController.java】中添加删除用户信息控制器
/**
* @return com.dc.base.pojo.BaseModel
* @title:<h3> 删除用户信息<h3>
* @author: Enzo
* @date: 2018-11-19 11:19
* @params [userIds, baseModel]
**/
@ApiOperation(value = "删除用户信息", httpMethod = "GET")
@RequestMapping("deleteUser/{userIds}")
public BaseModel deleteUser(@PathVariable("userIds") String userIds, BaseModel baseModel) throws Exception {
userService.deleteUserVoInUserIds(userIds, baseModel);
return baseModel;
}
修改角色删除方法,删除角色信息时,同步删除角色对应的用户角色关系表信息
在【SysRoleDao.java】中添加根据角色id删除用户用户角色关系表信息接口
int deletUserRoleInRoleIds(@Param("roleIds")String roleIds);
在【SysRolaMapper.xml】中添加根据角色id删除用户用户角色关系表信息sqlMapper
<delete id="deletUserRoleInRoleIds" parameterType="string">
delete from t_sys_user_role where fk_role_id in(${roleIds})
</delete>
在【SysRoleServiceImpl.java】修改角色删除功能,删除角色时,同步删除角色对应的用户角色关系表记录
public void deleteRoleInPk(String roleIds, BaseModel baseModel) throws Exception {
//删除角色权限表记录
roleDao.deleteRolePermission(roleIds);
//删除用户角色关系表记录
roleDao.deletUserRoleInRoleIds(roleIds);
//删除角色信息
int count = roleDao.removeRoleInPk(roleIds);
baseModel.setMessage("删除" + count + "条角色信息成功");
}
六、用户激活状态切换接口
在【SysUserDao.java】中添加用户激活状态切换dao接口
int switchState(SysUser user);
SysUser selectUserByUserId(@Param("userId")int userId);
在【SysUserMapper.xml】中添加用户激活状态切换sqlMapper
<update id="switchState" parameterType="com.dc.pojo.SysUser">
update t_sys_user set state=#{state}
,update_user_id=#{update_user_id}
,update_user_name=#{update_user_name}
,update_time=now()
where user_id=#{user_id}
</update>
<select id="selectUserByUserId" parameterType="int" resultType="com.dc.pojo.SysUser">
select * from t_sys_user where user_id=#{userId}
</select>
在【SysUserService.java】中添加用户激活状态切换业务层接口
void switchState(SysUser user, BaseModel baseModel) throws Exception;
在【SysUserServiceImpl.java】中添加用户激活状态切换业务层接口实现
/**
* @return void
* @title:<h3> 状态切换 <h3>
* @author: Enzo
* @date: 2018-11-19 13:48
* @params [user, baseModel]
**/
public void switchState(SysUser user, BaseModel baseModel) throws Exception {
//根据用户id查询原有的记录中状态值
SysUser oldUser = userDao.selectUserByUserId(user.getUser_id());
if (oldUser != null) {
if (oldUser.getState() == 1) {
user.setState(0);
} else if (oldUser.getState() == 0) {
user.setState(1);
}
} else {
throw new BusinessException("修改的用户信息不存在");
}
int count = userDao.switchState(user);
if (count == 0) {
throw new BusinessException("更新状态失败");
}
//将状态值改变
}
在【SysUserController.java】中添加用户激活状态切换控制器
/**
* @return com.dc.base.pojo.BaseModel
* @title:<h3> 状态切换 <h3>
* @author: Enzo
* @date: 2018-11-19 14:02
* @params [userId, baseModel]
**/
@ApiOperation(value = "状态切换", httpMethod = "GET")
@RequestMapping("tiggerState/{pk}")
public BaseModel tiggerState(@PathVariable("pk") int userId, BaseModel baseModel) throws Exception {
SysUser user = new SysUser();
user.setUser_id(userId);
user.setUpdate_user_name(getSessionUser().getName());
user.setUpdate_user_id(getSessionUser().getUser_id());
userService.switchState(user, baseModel);
baseModel.setMessage("状态切换成功");
return baseModel;
}
七、用户密码重置接口
在【SysUserDao.java】中添加用户密码重置dao接口
int resetPassword(SysUser user);
在【SysUserMapper.xml】中添加用户密码重置sqlMapper
<update id="resetPassword" parameterType="com.dc.pojo.SysUser">
update t_sys_user set password=#{password}
,update_user_id=#{update_user_id}
,update_user_name=#{update_user_name}
,update_time=now()
where user_id=#{user_id}
</update>
在【SysUserService.java】中添加用户密码重置业务层接口
void resetPassword(SysUser user, BaseModel baseModel) throws Exception;
在【SysUserServiceImpl.java】中添加用户密码重置业务层接口实现
/**
* @return void
* @title:<h3>重置密码 <h3>
* @author: Enzo
* @date: 2018-11-19 13:48
* @params [user, baseModel]
**/
public void resetPassword(SysUser user, BaseModel baseModel) throws Exception {
user.setPassword(MD5DES.encrypt(BaseContants.DEFAULT_PASSOWRD));
int count = userDao.resetPassword(user);
if (count == 0) {
throw new BusinessException("重置密码失败");
}
}
在【SysUserController.java】中添加用户密码重置控制器
/**
* @return com.dc.base.pojo.BaseModel
* @title:<h3> 重置密码 <h3>
* @author: Enzo
* @date: 2018-11-19 14:00
* @params [pk, baseModel]
**/
@ApiOperation(value = "重置密码", httpMethod = "GET")
@RequestMapping("resetPassword/{pk}")
public BaseModel resetPassword(@PathVariable("pk") int pk, BaseModel baseModel) throws Exception {
SysUser user = new SysUser();
user.setUser_id(pk);
user.setUpdate_user_name(getSessionUser().getName());
user.setUpdate_user_id(getSessionUser().getUser_id());
userService.resetPassword(user, baseModel);
baseModel.setMessage("重置密码成功");
return baseModel;
}