package com.sxpcwlkj.system.controller;
import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaIgnore;
import com.sxpcwlkj.authority.LoginObject;
import com.sxpcwlkj.common.annotation.MssSafety;
import com.sxpcwlkj.common.code.controller.BaseController;
import com.sxpcwlkj.common.code.entity.PrintObject;
import com.sxpcwlkj.common.code.entity.WxCodeBo;
import com.sxpcwlkj.common.enums.WxCodeStatusEnum;
import com.sxpcwlkj.common.utils.MapstructUtil;
import com.sxpcwlkj.common.utils.R;
import com.sxpcwlkj.datasource.entity.page.PageQuery;
import com.sxpcwlkj.datasource.entity.page.TableDataInfo;
import com.sxpcwlkj.framework.config.ValidatedGroupConfig;
import com.sxpcwlkj.framework.utils.ExcelUtil;
import com.sxpcwlkj.redis.RedisUtil;
import com.sxpcwlkj.system.entity.bo.*;
import com.sxpcwlkj.system.entity.export.SysUserExportVo;
import com.sxpcwlkj.system.entity.vo.SysUserVo;
import com.sxpcwlkj.system.service.SysUserService;
import com.sxpcwlkj.wx.service.WxCodeService;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.NotBlank;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
/**
* 系统用户
* @module 系统管理模块
* @author mmsAdmin
* @Doc MMS文档
*/
@Tag(name = "系统管理模块-系统用户",description = "系统管理模块-系统用户")
@Slf4j
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("system/user")
public class SysUserController extends BaseController {
private final SysUserService baseService;
private final WxCodeService wxCodeService;
/**
* 获取用户分页列表
*
* @return 用户列表
*/
@MssSafety(decryptRequest = true)
@SaCheckPermission("system:user:list")
@PostMapping("/list")
public TableDataInfo listPage(@RequestBody @Validated(ValidatedGroupConfig.query.class) SysUserBo user) {
return baseService.selectPageUserList(user, user.getPageQuery());
}
/**
* 获取用户详细信息
*
* @return PageDataInfo
*/
@SaCheckPermission("system:user:query")
@GetMapping("/{id}")
public R queryById(@PathVariable String id) {
return success(baseService.selectVoById(id));
}
/**
* 编辑用户
*
* @return true/false
*/
@MssSafety
@Transactional
@SaCheckPermission("system:user:edit")
@PutMapping
public R edit(@RequestBody @Validated(ValidatedGroupConfig.update.class) SysUserBo bo) {
return success(baseService.updateById(bo));
}
/**
* 新增用户
*
* @return vo
*/
@MssSafety
@Transactional
@SaCheckPermission("system:user:insert")
@PostMapping
public R insert(@RequestBody @Validated(ValidatedGroupConfig.insert.class) SysUserBo bo) {
return success(baseService.insert(bo));
}
/**
* 删除用户
*
* @return vo
*/
@MssSafety
@Transactional
@SaCheckPermission("system:user:delete")
@DeleteMapping("/{ids}")
public R delete(@PathVariable String ids) {
return success(baseService.deleteById(ids));
}
/**
* 模版下载
*/
@SaCheckPermission("system:user:import")
@PostMapping("/importTemplate")
public void importTemplate(HttpServletResponse response) throws IOException {
ExcelUtil.download(response, SysUserExportVo.class, "系统用户");
}
/**
* 导入系统用户
* @param file 模版文件
*/
@MssSafety
@Transactional
@SaCheckPermission("system:user:import")
@PostMapping("/import")
public R imports(@RequestParam("file") MultipartFile file) throws Exception {
Set list= ExcelUtil.imports(file, SysUserExportVo.class);
Boolean state= baseService.imports(list);
return R.ok(state,state?"数据导入成功!":"数据导入失败!");
}
/**
* 导出系统用户
*/
@MssSafety
@Transactional
@SaCheckPermission("system:user:export")
@PostMapping("/export")
public void export(SysUserBo user, PageQuery pageQuery,HttpServletResponse response) throws IOException {
List list= baseService.selectPageUserList(user, pageQuery).getRows();
List data= MapstructUtil.convert(list,SysUserExportVo.class);
ExcelUtil.export(response, SysUserExportVo.class, "系统用户",data);
}
/**
* 打印系统用户
* @param user 查询条件
* @param pageQuery 分页条件
*/
@MssSafety
@Transactional
@SaCheckPermission("system:user:print")
@PostMapping("/print")
public R> print(SysUserBo user, PageQuery pageQuery) throws Exception {
List list= baseService.selectPageUserList(user, pageQuery).getRows();
List data= MapstructUtil.convert(list,SysUserExportVo.class);
PrintObject printObject= new PrintObject()
.setTitle("系统用户")
.setData(data);
return R.response(Boolean.TRUE,printObject);
}
//====================================个人信息=====================================
/**
* 重置密码
*
* @return vo
*/
@SaCheckLogin
@PostMapping("/resetPwd")
public R resetPwd(@Validated @RequestBody(required = false)ResetPwdBo bo) {
return success(baseService.resetPwd(bo));
}
/**
* 重置密码:管理员
*
* @return vo
*/
@SaCheckLogin
@PostMapping("/resetPwdSuper")
public R resetPwdSuper(@Validated @RequestBody ResetPwdSuperBo bo) {
return success(baseService.resetPwdSuper(bo));
}
/**
* 修改头像
*
* @param avatar 图片
* @return true/false
*/
@SaCheckLogin
@GetMapping(value = "/editHeaderImg")
public R editHeaderImg(@Validated @NotBlank(message = "头像不能为空") String avatar) {
return success("修改头像成功",baseService.updateHeaderImgById(avatar));
}
/**
* 设置用户角色
* @param bo bo
* @return true/false
*/
@PostMapping("/setUserRole")
public R setUserRole(@Validated @RequestBody SetUserRoleSuperBo bo) {
return success("设置用户角色成功",baseService.setUserRoleSuper(bo));
}
/**
* 解绑手机号 邮箱 微信
*
* @return vo
*/
@SaCheckLogin
@GetMapping("/unbind")
public R unbind(int type) {
return success(baseService.unbind(type)?"解绑成功":"解绑失败");
}
/**
* 绑定手机号
*
* @return vo
*/
@SaCheckLogin
@PostMapping("/bindingPhone")
public R bindingPhone(@Validated({ValidatedGroupConfig.update.class}) @RequestBody SmsBo bo) {
String keyType = "updatePhone:";
String phone = bo.getPhone();
String key = RedisUtil.PHONE_CODES_KEY + keyType + phone;
Object code = RedisUtil.getCacheObject(key);
if (code == null) {
return R.fail("验证码已过期!");
}
if (!bo.getCode().equals(code)) {
return R.fail("验证码不正确!");
}
RedisUtil.deleteObject(key);
return success(baseService.bindingPhone(phone)? "绑定手机号成功":"绑定手机号失败");
}
/**
* 绑定邮件
*
* @return vo
*/
@SaCheckLogin
@PostMapping("/bindingEmail")
public R bindingEmail(@Validated({ValidatedGroupConfig.update.class}) @RequestBody EmailBo bo) {
String keyType = "updatePhone:";
String email = bo.getEmail();
String key = RedisUtil.EMAIL_CODES_KEY + keyType + email;
Object code = RedisUtil.getCacheObject(key);
if (code == null) {
return R.fail("验证码已过期!");
}
if (!bo.getCode().equals(code)) {
return R.fail("验证码不正确!");
}
RedisUtil.deleteObject(key);
return success(baseService.bindingEmail(email)? "绑定邮箱成功":"绑定邮箱失败");
}
@SaCheckLogin
@GetMapping("/getWxCode")
public R getWxCode(String uuid) {
if(uuid==null){
return R.fail("uuid不能为空!");
}
//获取微信绑定的二维码
String codeUrl= wxCodeService.getCode(new WxCodeBo(uuid)
.typeBinding()
.expireTime(1000*60)
.paramData(LoginObject.getLoginId()));
return success("二维码获取成功",codeUrl);
}
/**
* 查询二维码状态
* @param uuid 二维码key
* @return
*/
@SaIgnore
@GetMapping("/queryWxCodeState")
public R