AdminController.java 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329
  1. package com.cyksj.web.controller.manage;
  2. import cn.dev33.satoken.annotation.SaCheckRole;
  3. import cn.dev33.satoken.stp.StpUtil;
  4. import cn.hutool.core.date.DateTime;
  5. import cn.hutool.core.date.DateUtil;
  6. import cn.hutool.core.lang.Validator;
  7. import cn.hutool.core.util.StrUtil;
  8. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  9. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  10. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  11. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  12. import com.cyksj.common.exception.BusinessRuntimeException;
  13. import com.cyksj.common.util.Codec;
  14. import com.cyksj.dto.Result;
  15. import com.cyksj.enums.GatewayResponse;
  16. import com.cyksj.mapper.PhoneCodeMapper;
  17. import com.cyksj.model.entity.PhoneCode;
  18. import com.cyksj.model.manage.dto.AdminInfo;
  19. import com.cyksj.model.manage.entity.Admin;
  20. import com.cyksj.service.mail.MailService;
  21. import com.cyksj.service.mange.AdminService;
  22. import com.cyksj.web.util.StpUserUtil;
  23. import lombok.RequiredArgsConstructor;
  24. import lombok.extern.slf4j.Slf4j;
  25. import org.apache.commons.lang3.StringUtils;
  26. import org.springframework.dao.DuplicateKeyException;
  27. import org.springframework.validation.annotation.Validated;
  28. import org.springframework.web.bind.annotation.*;
  29. import javax.servlet.http.HttpServletRequest;
  30. import java.io.BufferedReader;
  31. import java.io.IOException;
  32. import java.nio.charset.StandardCharsets;
  33. import java.security.MessageDigest;
  34. import java.util.Date;
  35. import java.util.Enumeration;
  36. import java.util.List;
  37. import java.util.Map;
  38. /**
  39. * @description
  40. * @author chan
  41. * @date 2021-10-11 下午11:02
  42. */
  43. @RestController
  44. @RequestMapping("/manage/admin")
  45. @RequiredArgsConstructor
  46. @Slf4j
  47. public class AdminController {
  48. @org.springframework.beans.factory.annotation.Autowired
  49. private com.cyksj.security.AdminLoginGuard adminLoginGuard;
  50. private final AdminService adminService;
  51. private final PhoneCodeMapper phoneCodeMapper;
  52. private final MailService mailService;
  53. private static final List<String> SEND_LIST = List.of(
  54. "1935822056@qq.com",
  55. "598488687@qq.com",
  56. "1991846178@qq.com",
  57. "3301493050@qq.com",
  58. "1031494735@qq.com",
  59. "1814454156@qq.com",
  60. "1094366385@qq.com",
  61. "1505704409@qq.com"
  62. );
  63. private static final String YOUTUBE_URL = "https://zhaoju666.com/youtube_subscribe/";
  64. @PostMapping(value = "/login")
  65. public Result<String> login(@RequestBody Admin adminRequest) throws Exception {
  66. Admin admin = adminService.getOne(
  67. new QueryWrapper<Admin>().lambda().eq(Admin::getPhone,adminRequest.getPhone()));
  68. if (null == admin) {
  69. throw BusinessRuntimeException.getInstance("账号或凭据错误");
  70. }
  71. adminLoginGuard.verify("admin", admin.getId(), true, false);
  72. if (null == admin.getStatus() || !admin.getStatus()) {
  73. throw BusinessRuntimeException.getInstance("账号或凭据错误");
  74. }
  75. // 对比密码
  76. if (adminRequest.getPassWord() == null || adminRequest.getPassWord().isEmpty()) {
  77. adminLoginGuard.verify("admin", admin.getId(), false, false);
  78. }
  79. String encodePasscode = Codec.DoDigest.custom().setAlgorithm(Codec.DoDigest.Algorithm.SHA256).setStringData(adminRequest.getPassWord()).toBase64String();
  80. adminLoginGuard.verify("admin", admin.getId(), StringUtils.equals(admin.getPassWord(), encodePasscode), false);
  81. return GatewayResponse.SUCCESS.newBuilder().toResult();
  82. }
  83. @SaCheckRole("root")
  84. @PostMapping("/post")
  85. public Result<String> saveAdmin(@RequestBody @Validated Admin admin) throws Exception {
  86. Long adminId = StpUtil.getLoginIdAsLong();
  87. Admin exist = adminService.getById(adminId);
  88. if (exist == null) {
  89. throw BusinessRuntimeException.getInstance("账号不存在,请重新登录");
  90. }
  91. if (exist.getCategory() != Admin.Category.superoot) {
  92. throw BusinessRuntimeException.getInstance("无超级管理员权限");
  93. }
  94. if (StringUtils.isNotBlank(admin.getPassWord())) {
  95. admin.setPassWord(Codec.DoDigest.custom().setAlgorithm(Codec.DoDigest.Algorithm.SHA256).setStringData(admin.getPassWord()).toBase64String());
  96. }
  97. if (admin.getId() == null) {
  98. Admin ad = adminService.getOne(new LambdaQueryWrapper<Admin>().eq(Admin::getPhone, admin.getPhone()));
  99. if (ad != null) {
  100. throw BusinessRuntimeException.getInstance("该账号已存在.");
  101. }
  102. }
  103. boolean mobile = Validator.isMobile(admin.getPhone());
  104. if (!mobile) {
  105. throw BusinessRuntimeException.getInstance("请输入正确的手机号");
  106. }
  107. try {
  108. adminService.saveOrUpdate(admin);
  109. } catch (DuplicateKeyException e) {
  110. throw BusinessRuntimeException.getInstance("手机号重复");
  111. }
  112. return GatewayResponse.SUCCESS.newBuilder().toResult();
  113. }
  114. /**
  115. * 删除管理员
  116. */
  117. @SaCheckRole("root")
  118. @DeleteMapping("/delete/{id}")
  119. public Result<String> deleteAdminById(@PathVariable Long id) {
  120. Long adminId = StpUtil.getLoginIdAsLong();
  121. Admin exist = adminService.getById(adminId);
  122. if (exist == null) {
  123. throw BusinessRuntimeException.getInstance("账号不存在,请重新登录");
  124. }
  125. if (exist.getCategory() != Admin.Category.superoot) {
  126. throw BusinessRuntimeException.getInstance("无超级管理员权限");
  127. }
  128. if (id.equals(adminId)) {
  129. throw BusinessRuntimeException.getInstance("无法删除自己");
  130. }
  131. adminService.removeById(id);
  132. return GatewayResponse.SUCCESS.newBuilder().toResult("删除成功");
  133. }
  134. /**
  135. * 编辑管理员
  136. */
  137. @SaCheckRole("root")
  138. @PutMapping("/put")
  139. public Result<String> editAdmin(@RequestBody Admin admin) throws Exception {
  140. Long adminId = StpUtil.getLoginIdAsLong();
  141. Admin exist = adminService.getById(adminId);
  142. if (exist == null) {
  143. throw BusinessRuntimeException.getInstance("账号不存在,请重新登录");
  144. }
  145. if (exist.getCategory() != Admin.Category.superoot) {
  146. throw BusinessRuntimeException.getInstance("无超级管理员权限");
  147. }
  148. Admin user = adminService.getById(admin.getId());
  149. if (admin.getId() == null || user == null) {
  150. throw BusinessRuntimeException.getInstance("账号不存在");
  151. }
  152. Boolean flag = false;
  153. if (StrUtil.isNotEmpty(admin.getPhone())) {
  154. boolean mobile = Validator.isMobile(admin.getPhone());
  155. if (!mobile) {
  156. throw BusinessRuntimeException.getInstance("请输入正确的手机号");
  157. }
  158. if (!admin.getPhone().equals(user.getPhone())) {
  159. flag = true;
  160. }
  161. }
  162. if (StrUtil.isNotEmpty(admin.getPassWord())) {
  163. String encodePwd = Codec.DoDigest.custom().setAlgorithm(Codec.DoDigest.Algorithm.SHA256).setStringData(admin.getPassWord()).toBase64String();
  164. admin.setPassWord(encodePwd);
  165. if (!encodePwd.equals(user.getPassWord())) {
  166. flag = true;
  167. }
  168. }
  169. adminService.saveOrUpdate(admin);
  170. if (flag) {
  171. StpUtil.logoutByLoginId(admin.getId());
  172. }
  173. return GatewayResponse.SUCCESS.newBuilder().toResult("编辑成功");
  174. }
  175. /**
  176. * 校验手机号获取登录信息
  177. */
  178. @GetMapping("/get/loginInfo")
  179. public Result<AdminInfo> getLoginInfo(String phone, String code) {
  180. Admin admin = adminService.getOne(
  181. new QueryWrapper<Admin>().lambda().eq(Admin::getPhone, phone));
  182. if (null == admin) {
  183. throw BusinessRuntimeException.getInstance("该用户不存在.");
  184. }
  185. adminLoginGuard.verify("admin", admin.getId(), true, false);
  186. if (StrUtil.hasEmpty(phone, code)) {
  187. adminLoginGuard.verify("admin", admin.getId(), false, false);
  188. throw BusinessRuntimeException.getInstance("请输入对应信息");
  189. }
  190. DateTime now = DateTime.now();
  191. PhoneCode phoneCode = phoneCodeMapper.selectOne(Wrappers.lambdaQuery(PhoneCode.class).eq(PhoneCode::getPhone, phone).last("limit 1"));
  192. if (phoneCode == null || StrUtil.isEmpty(phoneCode.getCode())) {
  193. adminLoginGuard.verify("admin", admin.getId(), false, false);
  194. throw BusinessRuntimeException.getInstance("请重新获取手机验证码");
  195. }
  196. //3分钟失效
  197. Date updateTime = phoneCode.getUpdateTime();
  198. DateTime afterFiveMinutes = DateUtil.offsetMinute(updateTime, 3);
  199. if (now.isAfter(afterFiveMinutes)) {
  200. adminLoginGuard.verify("admin", admin.getId(), false, false);
  201. throw BusinessRuntimeException.getInstance("手机验证码已失效,请重新获取");
  202. }
  203. if (!StrUtil.equals(code, phoneCode.getCode())) {
  204. adminLoginGuard.verify("admin", admin.getId(), false, false);
  205. throw BusinessRuntimeException.getInstance("手机验证码错误,请重新输入");
  206. }
  207. // 生成token
  208. adminLoginGuard.verify("admin", admin.getId(), true, true);
  209. StpUtil.login(admin.getId());
  210. adminLoginGuard.verify("admin", admin.getId(), true, false);
  211. String token = StpUtil.getTokenValue();
  212. admin.setPassWord("");
  213. AdminInfo info = new AdminInfo();
  214. info.setInfo(admin);
  215. info.setToken(token);
  216. return GatewayResponse.SUCCESS.newBuilder().toResult(info);
  217. }
  218. @GetMapping("/get/list")
  219. public Result<Page<Admin>> list(@RequestParam(defaultValue = "1") Integer start, @RequestParam(defaultValue = "5") Integer limit) {
  220. Page<Admin> page = adminService.page(new Page<>(start, limit), new LambdaQueryWrapper<Admin>().eq(Admin::getStatus, true));
  221. return GatewayResponse.SUCCESS.newBuilder().toResult(page);
  222. }
  223. @SaCheckRole("root")
  224. @GetMapping("/send/template")
  225. public Result<String> sendTemplate(String title, String channel, String url) throws Exception {
  226. for (String email : SEND_LIST) {
  227. // WxMpTemplateMessage templateMessage = new WxMpTemplateMessage()
  228. // .setToUser(openId)
  229. // .setTemplateId(WeChatTemplateConst.VDIEO_NOTIFY)
  230. // .setUrl(" ");
  231. // WxMpTemplateMessage.TemplateData data = templateMessage.getData();
  232. // data.setFirst(new WxMpTemplateData("youtube频道有更新"));
  233. // data.setKeyword1(new WxMpTemplateData(title));
  234. // data.setKeyword2(new WxMpTemplateData(channel));
  235. // data.setKeyword3(new WxMpTemplateData(DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss")));
  236. // data.setKeyword4(new WxMpTemplateData("默认"));
  237. // data.setRemark(new WxMpTemplateData(url));
  238. // log.info("发送video模板消息至客服:{}","磨牙怪");
  239. // weChatService.sendTemplateMessage(weChatService.getAccessToken(), Jsons.toJson(templateMessage));
  240. String subject = "youtube频道有更新";
  241. String msg = String.format("标题:%s\n频道:%s\n下载地址:%s", title, channel, YOUTUBE_URL);
  242. mailService.sendEmailMsgToPeople(email, subject, msg);
  243. }
  244. return GatewayResponse.SUCCESS.newBuilder().toResult();
  245. }
  246. @RequestMapping("/callback")
  247. public String youtubeCallback(HttpServletRequest request, @RequestHeader Map<String, String> headers) throws IOException {
  248. log.info("----------------打印请求全部消息开始----------------");
  249. Enumeration<String> headerNames = request.getHeaderNames();
  250. while (headerNames.hasMoreElements()) {
  251. String name = headerNames.nextElement();
  252. log.info("{} - {}", name, request.getHeader(name));
  253. }
  254. log.info("----------------打印请求全部消息结束----------------");
  255. log.info("-----------------打印请求头消息开始-----------------");
  256. headers.forEach((String key, String value) -> log.info(String.format("Header '%s' = %s", key, value)));
  257. log.info("-----------------打印请求头消息结束-----------------");
  258. Map<String, String[]> parameterMap = request.getParameterMap();
  259. log.info("------------------打印全部参数开始------------------");
  260. String result = "";
  261. if (parameterMap.isEmpty()) {
  262. log.info("请求参数为空");
  263. }else {
  264. parameterMap.forEach((String key, String[] value) -> {
  265. for (String s : value) {
  266. log.info("Param '{}' = {}", key, s);
  267. }
  268. });
  269. result = parameterMap.get("hub.challenge")[0];
  270. }
  271. log.info("------------------打印全部参数结束------------------");
  272. log.info("-----------------打印Reader数据开始----------------");
  273. StringBuilder buffer = new StringBuilder();
  274. try (BufferedReader reader = request.getReader()){
  275. String line;
  276. while ((line = reader.readLine()) != null) {
  277. buffer.append(line);
  278. }
  279. } catch (IOException e) {
  280. log.error(e.getMessage(), e);
  281. }
  282. log.info("reader -> {}", buffer);
  283. log.info("-----------------打印Reader数据结束----------------");
  284. return result;
  285. }
  286. /**
  287. * 银河用户token信息
  288. */
  289. @GetMapping("/get/yh/user/token")
  290. public Result<String> getYhUserToken(
  291. @RequestHeader(value = "X-API-Key", required = false) String apiKey,
  292. @RequestParam Long userId) {
  293. if (StrUtil.isBlank(apiKey)
  294. || !MessageDigest.isEqual(com.cyksj.common.constant.Constant.CREDENTIAL_API_KEY.getBytes(StandardCharsets.UTF_8),
  295. apiKey.getBytes(StandardCharsets.UTF_8))) {
  296. throw BusinessRuntimeException.getInstance("凭证无效");
  297. }
  298. StpUserUtil.login(userId);
  299. return GatewayResponse.SUCCESS.newBuilder().toResult(StpUserUtil.getTokenValue());
  300. }
  301. }