统一身份认证系统之用户管理【9】

统一身份认证系统之用户管理模块功能开发

在【统一身份认证系统之单元测试】文章中,已添加用户新增、用户修改、根据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;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值