package com.kidgrow.usercenter.controller;
import cn.hutool.core.bean.BeanUtil;
import com.alibaba.fastjson.JSONObject;
import com.kidgrow.common.annotation.LoginUser;
import com.kidgrow.common.constant.CommonConstant;
import com.kidgrow.common.context.ClientContextHolder;
import com.kidgrow.common.model.*;
import com.kidgrow.common.utils.ExcelUtil;
import com.kidgrow.log.annotation.AuditLog;
import com.kidgrow.searchcenter.client.service.IQueryService;
import com.kidgrow.searchcenter.model.LogicDelDto;
import com.kidgrow.searchcenter.model.SearchDto;
import com.kidgrow.usercenter.mapper.SysUserLogsMapper;
import com.kidgrow.usercenter.model.SysUserExcel;
import com.kidgrow.usercenter.model.SysUserLogs;
import com.kidgrow.usercenter.service.ISysUserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.MapUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.*;
/**
* 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020
*
* @Description: 用户管理
* @Project:
* @CreateDate: Created in 2020/2/13 15:50
* @Author: liuke
*/
@Slf4j
@RestController
@Api(tags = "用户模块api")
public class SysUserController {
private static final String ADMIN_CHANGE_MSG = "超级管理员不给予修改";
/**
* 全文搜索逻辑删除Dto
*/
private static final LogicDelDto SEARCH_LOGIC_DEL_DTO = new LogicDelDto("isDel", "否");
@Autowired
private ISysUserService appUserService;
@Autowired
private IQueryService queryService;
@Autowired
private SysUserLogsMapper sysUserLogsMapper;
@Autowired
private HttpServletRequest request;
/**
* 当前登录用户 LoginAppUser
*
* @return
*/
@ApiOperation(value = "根据access_token当前登录用户")
@GetMapping("/users/current")
public ResultBody getLoginAppUser(@LoginUser(isFull = true) SysUser user) {
return ResultBody.ok().data(appUserService.getLoginAppUser(user));
}
/**
* 查询用户实体对象SysUser
*/
@GetMapping(value = "/users/name/{username}")
@ApiOperation(value = "根据用户名查询用户实体")
@Cacheable(value = "user", key = "#username")
public SysUser selectByUsername(@PathVariable String username) {
return appUserService.selectByUsername(username);
}
/**
* 查询用户登录对象LoginAppUser
*/
@GetMapping(value = "/users-anon/login", params = "username")
@ApiOperation(value = "根据用户名查询用户")
public LoginAppUser findByUsername(String username,HttpServletRequest request) {
LoginAppUser loginAppUser =appUserService.findByUsername(username);
if(loginAppUser!=null){
loginLogs(loginAppUser,request);
}
return loginAppUser;
}
/**
* 用户登录日志
* @param sysUser
* @return
*/
private int loginLogs(LoginAppUser sysUser,HttpServletRequest request){
SysUserLogs sysUserLogs = new SysUserLogs();
sysUserLogs.setClientId(ClientContextHolder.getClient());
sysUserLogs.setLoginAgentSystem(request.getHeader(CommonConstant.USER_AGENT_SYSTEM));
sysUserLogs.setLoginAgentBrowser(request.getHeader(CommonConstant.USER_AGENT_BROWSER));
sysUserLogs.setLoginIp(request.getHeader(CommonConstant.USER_AGENT_IP));
sysUserLogs.setLoginTime(new Date());
sysUserLogs.setUserid(sysUser.getId());
sysUserLogs.setUsername(sysUser.getUsername());
return sysUserLogsMapper.insert(sysUserLogs);
}
/**
* 通过手机号查询用户、角色信息
*
* @param mobile 手机号
*/
@GetMapping(value = "/users-anon/mobile", params = "mobile")
@ApiOperation(value = "根据手机号查询用户")
public SysUser findByMobile(String mobile) {
return appUserService.findByMobile(mobile);
}
/**
* 根据OpenId查询用户信息
*
* @param openId openId
*/
@GetMapping(value = "/users-anon/openId", params = "openId")
@ApiOperation(value = "根据OpenId查询用户")
public SysUser findByOpenId(String openId) {
return appUserService.findByOpenId(openId);
}
@GetMapping("/users/{id}")
public SysUser findUserById(@PathVariable Long id) {
return appUserService.getById(id);
}
/**
* 管理后台修改用户
*
* @param sysUser
*/
@PutMapping("/users")
@CachePut(value = "user", key = "#sysUser.username", unless="#result == null")
@AuditLog(operation = "'更新用户:' + #sysUser")
public ResultBody updateSysUser(@RequestBody SysUser sysUser) {
appUserService.updateById(sysUser);
return ResultBody.ok();
}
/**
* 管理后台给用户分配角色
*
* @param id
* @param roleIds
*/
@PostMapping("/users/{id}/roles")
public ResultBody setRoleToUser(@PathVariable Long id, @RequestBody Set roleIds) {
appUserService.setRoleToUser(id, roleIds);
return ResultBody.ok();
}
/**
* 获取用户的角色
*
* @param
* @return
*/
@GetMapping("/users/{id}/roles")
public ResultBody> findRolesByUserId(@PathVariable Long id) {
return ResultBody.ok().data(appUserService.findRolesByUserId(id));
}
/**
* 用户查询
*
* @param params
* @return
*/
@ApiOperation(value = "用户查询列表")
@ApiImplicitParams({
@ApiImplicitParam(name = "page", value = "分页起始位置", required = true, dataType = "Integer"),
@ApiImplicitParam(name = "limit", value = "分页结束位置", required = true, dataType = "Integer")
})
@GetMapping("/users")
public PageResult findUsers(@RequestParam Map params) {
// log.info("租户ID:"+ TenantContextHolder.getTenant());
// log.info("IP:"+request.getHeader(CommonConstant.USER_AGENT_IP));
return appUserService.findUsers(params);
}
/**
* 修改用户状态
*
* @param params
* @return
*/
@ApiOperation(value = "修改用户状态")
@GetMapping("/users/updateEnabled")
@ApiImplicitParams({
@ApiImplicitParam(name = "id", value = "用户id", required = true, dataType = "Integer"),
@ApiImplicitParam(name = "enabled", value = "是否启用", required = true, dataType = "Boolean")
})
public ResultBody updateEnabled(@RequestParam Map params) {
Long id = MapUtils.getLong(params, "id");
if (checkAdmin(id)) {
return ResultBody.failed(ADMIN_CHANGE_MSG);
}
return appUserService.updateEnabled(params);
}
/**
* 管理后台,给用户重置密码
*
* @param id
*/
@PutMapping(value = "/users/{id}/password")
@AuditLog(operation = "'重置用户密码:' + #id")
public ResultBody resetPassword(@PathVariable Long id) {
if (checkAdmin(id)) {
return ResultBody.failed(ADMIN_CHANGE_MSG);
}
appUserService.updatePassword(id, null, null);
return ResultBody.ok().msg("重置成功");
}
/**
* 用户自己修改密码
*/
@PutMapping(value = "/users/password")
public ResultBody resetPassword(@RequestBody SysUser sysUser) {
if (checkAdmin(sysUser.getId())) {
return ResultBody.failed().msg(ADMIN_CHANGE_MSG);
}
appUserService.updatePassword(sysUser.getId(), sysUser.getOldPassword(), sysUser.getNewPassword());
return ResultBody.ok().msg("重置成功");
}
/**
* 删除用户
*
* @param id
*/
@DeleteMapping(value = "/users/{id}")
//@AuditLog(operation = "'删除用户:' + #id")
public ResultBody delete(@PathVariable Long id) {
if (checkAdmin(id)) {
return ResultBody.failed(ADMIN_CHANGE_MSG);
}
appUserService.delUser(id);
return ResultBody.ok().msg("删除成功");
}
/**
* 新增or更新
*
* @param sysUser
* @return
*/
@CacheEvict(value = "user", key = "#sysUser.username")
@PostMapping("/users/saveOrUpdate")
@AuditLog(operation = "'新增或更新用户:' + #sysUser.username")
public ResultBody saveOrUpdate(@RequestBody SysUser sysUser) {
return appUserService.saveOrUpdateUser(sysUser);
}
/**
* 导出excel
*
* @return
*/
@PostMapping("/users/export")
public ResultBody exportUser(@RequestParam Map params, HttpServletResponse response) throws IOException {
List result = appUserService.findAllUsers(params);
//导出操作
ExcelUtil.exportExcel(result, null, "用户", SysUserExcel.class, "user", response);
return ResultBody.ok().msg("导出数据成功");
}
@PostMapping(value = "/users/import")
public ResultBody importExcl(@RequestParam("file") MultipartFile excl) throws Exception {
int rowNum = 0;
if(!excl.isEmpty()) {
List list = ExcelUtil.importExcel(excl, 0, 1, SysUserExcel.class);
rowNum = list.size();
if (rowNum > 0) {
List users = new ArrayList<>(rowNum);
list.forEach(u -> {
SysUser user = new SysUser();
BeanUtil.copyProperties(u, user);
user.setPassword(CommonConstant.DEF_USER_PASSWORD);
user.setType(UserType.BACKEND.name());
users.add(user);
});
appUserService.saveBatch(users);
}
}
return ResultBody.ok().msg("导入数据成功,一共【"+rowNum+"】行");
}
@ApiOperation(value = "用户全文搜索列表")
@ApiImplicitParams({
@ApiImplicitParam(name = "page", value = "分页起始位置", required = true, dataType = "Integer"),
@ApiImplicitParam(name = "limit", value = "分页结束位置", required = true, dataType = "Integer"),
@ApiImplicitParam(name = "queryStr", value = "搜索关键字", dataType = "String")
})
@GetMapping("/users/search")
public PageResult search(SearchDto searchDto) {
searchDto.setIsHighlighter(true);
searchDto.setSortCol("createTime");
return queryService.strQuery("sys_user", searchDto, SEARCH_LOGIC_DEL_DTO);
}
/**
* 根据map查询
*/
private boolean checkAdmin(long id) {
return id == 1L;
}
@PostMapping("/users/findAll")
public ResultBody findAll( @RequestBody Map map) {
return appUserService.findAll(map);
}
/**
* 根据map查询 总个数
* @param map
* @return
*/
@PostMapping("/users/findCountByMap")
public ResultBody findCountByMap( @RequestBody Map map) {
return appUserService.findCountByMap(map);
}
/**
* 获取当前用的 组织下的所有人员
*/
@GetMapping("users/getThisUserOrganizationUser")
public ResultBody getThisUserOrganizationUser(HttpServletRequest request){
return appUserService.getThisUserOrganizationUser(request);
}
/**
* 通过手机修改密码
*/
@PutMapping(value = "/users/passwordByPhone")
public ResultBody passwordByPhone(@RequestBody Map map) {
return appUserService.passwordByPhone(map);
}
/**
* 通过手机号注册 新用户
*/
@PutMapping(value = "/users/registerByPhone")
public ResultBody registerByPhone(@RequestBody Map map) {
return appUserService.registerByPhone(map);
}
/**
* 更换手机号
*/
@PutMapping(value = "/users/updatePhone")
public ResultBody updatePhone(@RequestBody Map map, @LoginUser SysUser sysUser) {
return appUserService.updatePhone(map,sysUser);
}
}