diff --git a/casic-server/pom.xml b/casic-server/pom.xml index cd24fd8..6ff78b8 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -35,6 +35,41 @@ ${boot.version} provided + + com.casic + casic-admin-core + 2.0.0.alpha + compile + + + org.apache.httpcomponents + httpcore + 4.0.1 + + + org.apache.httpcomponents + httpclient + 4.0.2 + + + org.apache.httpcomponents + httpclient + + + com.dameng + DmJdbcDriver18 + 1.8 + compile + + + org.testcontainers + testcontainers + 1.15.1 + + + org.apache.httpcomponents + httpcore + diff --git a/casic-server/pom.xml b/casic-server/pom.xml index cd24fd8..6ff78b8 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -35,6 +35,41 @@ ${boot.version} provided + + com.casic + casic-admin-core + 2.0.0.alpha + compile + + + org.apache.httpcomponents + httpcore + 4.0.1 + + + org.apache.httpcomponents + httpclient + 4.0.2 + + + org.apache.httpcomponents + httpclient + + + com.dameng + DmJdbcDriver18 + 1.8 + compile + + + org.testcontainers + testcontainers + 1.15.1 + + + org.apache.httpcomponents + httpcore + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java index a7381d1..4ef1109 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java @@ -1,32 +1,83 @@ package com.casic.missiles.modular.system.controller; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.system.service.UserActionService; +import com.casic.missiles.modular.system.utils.*; +import dm.jdbc.util.StringUtil; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.List; + /** * @Description: 小程序用户 * @Author: wangpeng * @Date: 2022/11/8 14:39 */ +@Controller +@RequestMapping("user") public class UserController { + @Resource + private UserActionService userActionService; + /** * 注册 */ + @RequestMapping("userLogin") + @ResponseBody + public Result userLogin(@RequestBody HashMap map){ + return userActionService.userLogin(map); + } /** - * 登录 + * 注册 */ - + @RequestMapping("userRegister") + @ResponseBody + public Result userRegister(@RequestBody UserDto userDto){ + return userActionService.userRegister(userDto); + } /** - * 验证用户信息 + * 获取员工类型 */ - + @RequestMapping("getUserType") + @ResponseBody + public List getUserType(){ + return userActionService.getUserType(); + } + /** + * 校验用户 + */ + @RequestMapping("verifyUser") + @ResponseBody + public Result verifyUser(@RequestBody UserDto userDto){ + return userActionService.verifyUser(userDto); + } /** * 找回密码 */ - + @RequestMapping("retrievePassword") + @ResponseBody + public Result retrievePassword(String id,String oldPwd,String newPwd){ + return userActionService.retrievePassword(id,oldPwd,newPwd); + } /** * 用户信息 */ - + @RequestMapping("getUserInfo") + @ResponseBody + public Result getUserInfo(String userName){ + return userActionService.getUserInfo(userName); + } /** * 修改照片 */ @@ -38,4 +89,46 @@ /** * 员工导入 */ + /** + * 获取微信openid,sessionkey等信息 + */ + @RequestMapping("getOther") + @ResponseBody + public Object getWxOpenidInfo(@RequestParam String code) { + if (StringUtil.isEmpty(code)) { + return null; + } + JSONObject jsonObject = WXUserUtils.getOpenId(code); + //JSONObject str = WXUserUtils.getAccessToken(); + //JSONObject phone = WXUserUtils.getPhone(code,str.get("access_token").toString()); + //System.out.println("token:"+str); + //System.out.println("phone:"+phone); + return Result.buildR(Status.OK,jsonObject); + } + /** + * 获取微信手机号 + */ + @RequestMapping("/phone") + @ResponseBody + public Object authPhone(String encryptedData, String session_key, String iv) { + try { + //String decrypt = AESUtils.decrypt(encryptedData, session_key, iv, "UTF-8"); + //System.out.println(decrypt); + // String result = WXUserUtils.wxDecrypt(encryptedData, session_key, iv); + String result = ""; + JSONObject json = JSONObject.parseObject(result); + if (json.containsKey("phoneNumber")) { + String phone = json.getString("phoneNumber"); + if (StringUtils.isNoneBlank(phone)) { + return Result.buildR(Status.OK,json); + } else { + return Result.buildR(Status.FAILED_PHONE); + } + } else { + return Result.buildR(Status.FAIL); + } + } catch (Exception e) { + return Result.buildR(Status.FAIL); + } + } } diff --git a/casic-server/pom.xml b/casic-server/pom.xml index cd24fd8..6ff78b8 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -35,6 +35,41 @@ ${boot.version} provided + + com.casic + casic-admin-core + 2.0.0.alpha + compile + + + org.apache.httpcomponents + httpcore + 4.0.1 + + + org.apache.httpcomponents + httpclient + 4.0.2 + + + org.apache.httpcomponents + httpclient + + + com.dameng + DmJdbcDriver18 + 1.8 + compile + + + org.testcontainers + testcontainers + 1.15.1 + + + org.apache.httpcomponents + httpcore + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java index a7381d1..4ef1109 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java @@ -1,32 +1,83 @@ package com.casic.missiles.modular.system.controller; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.system.service.UserActionService; +import com.casic.missiles.modular.system.utils.*; +import dm.jdbc.util.StringUtil; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.List; + /** * @Description: 小程序用户 * @Author: wangpeng * @Date: 2022/11/8 14:39 */ +@Controller +@RequestMapping("user") public class UserController { + @Resource + private UserActionService userActionService; + /** * 注册 */ + @RequestMapping("userLogin") + @ResponseBody + public Result userLogin(@RequestBody HashMap map){ + return userActionService.userLogin(map); + } /** - * 登录 + * 注册 */ - + @RequestMapping("userRegister") + @ResponseBody + public Result userRegister(@RequestBody UserDto userDto){ + return userActionService.userRegister(userDto); + } /** - * 验证用户信息 + * 获取员工类型 */ - + @RequestMapping("getUserType") + @ResponseBody + public List getUserType(){ + return userActionService.getUserType(); + } + /** + * 校验用户 + */ + @RequestMapping("verifyUser") + @ResponseBody + public Result verifyUser(@RequestBody UserDto userDto){ + return userActionService.verifyUser(userDto); + } /** * 找回密码 */ - + @RequestMapping("retrievePassword") + @ResponseBody + public Result retrievePassword(String id,String oldPwd,String newPwd){ + return userActionService.retrievePassword(id,oldPwd,newPwd); + } /** * 用户信息 */ - + @RequestMapping("getUserInfo") + @ResponseBody + public Result getUserInfo(String userName){ + return userActionService.getUserInfo(userName); + } /** * 修改照片 */ @@ -38,4 +89,46 @@ /** * 员工导入 */ + /** + * 获取微信openid,sessionkey等信息 + */ + @RequestMapping("getOther") + @ResponseBody + public Object getWxOpenidInfo(@RequestParam String code) { + if (StringUtil.isEmpty(code)) { + return null; + } + JSONObject jsonObject = WXUserUtils.getOpenId(code); + //JSONObject str = WXUserUtils.getAccessToken(); + //JSONObject phone = WXUserUtils.getPhone(code,str.get("access_token").toString()); + //System.out.println("token:"+str); + //System.out.println("phone:"+phone); + return Result.buildR(Status.OK,jsonObject); + } + /** + * 获取微信手机号 + */ + @RequestMapping("/phone") + @ResponseBody + public Object authPhone(String encryptedData, String session_key, String iv) { + try { + //String decrypt = AESUtils.decrypt(encryptedData, session_key, iv, "UTF-8"); + //System.out.println(decrypt); + // String result = WXUserUtils.wxDecrypt(encryptedData, session_key, iv); + String result = ""; + JSONObject json = JSONObject.parseObject(result); + if (json.containsKey("phoneNumber")) { + String phone = json.getString("phoneNumber"); + if (StringUtils.isNoneBlank(phone)) { + return Result.buildR(Status.OK,json); + } else { + return Result.buildR(Status.FAILED_PHONE); + } + } else { + return Result.buildR(Status.FAIL); + } + } catch (Exception e) { + return Result.buildR(Status.FAIL); + } + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dao/UserActionMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/UserActionMapper.java new file mode 100644 index 0000000..5647343 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/UserActionMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.system.dto.StaffInfoDto; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.model.Dict; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +public interface UserActionMapper extends BaseMapper { + List getList(); + + void userRegister(@Param("userDto") UserDto userDto); + + UserDto getUserInfo(@Param("userDto") UserDto userDto); + + StaffInfoDto getStaffInfo(@Param("userDto") UserDto userDto); + + void retrievePassword(@Param("id")String id, @Param("salt")String salt, @Param("password")String password); + + void setUserOpenId(@Param("userDto")UserDto user); + + void userEmpowerment(@Param("id")String id,@Param("userId")String userId,@Param("updateTime")String updateTime); +} diff --git a/casic-server/pom.xml b/casic-server/pom.xml index cd24fd8..6ff78b8 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -35,6 +35,41 @@ ${boot.version} provided + + com.casic + casic-admin-core + 2.0.0.alpha + compile + + + org.apache.httpcomponents + httpcore + 4.0.1 + + + org.apache.httpcomponents + httpclient + 4.0.2 + + + org.apache.httpcomponents + httpclient + + + com.dameng + DmJdbcDriver18 + 1.8 + compile + + + org.testcontainers + testcontainers + 1.15.1 + + + org.apache.httpcomponents + httpcore + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java index a7381d1..4ef1109 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java @@ -1,32 +1,83 @@ package com.casic.missiles.modular.system.controller; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.system.service.UserActionService; +import com.casic.missiles.modular.system.utils.*; +import dm.jdbc.util.StringUtil; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.List; + /** * @Description: 小程序用户 * @Author: wangpeng * @Date: 2022/11/8 14:39 */ +@Controller +@RequestMapping("user") public class UserController { + @Resource + private UserActionService userActionService; + /** * 注册 */ + @RequestMapping("userLogin") + @ResponseBody + public Result userLogin(@RequestBody HashMap map){ + return userActionService.userLogin(map); + } /** - * 登录 + * 注册 */ - + @RequestMapping("userRegister") + @ResponseBody + public Result userRegister(@RequestBody UserDto userDto){ + return userActionService.userRegister(userDto); + } /** - * 验证用户信息 + * 获取员工类型 */ - + @RequestMapping("getUserType") + @ResponseBody + public List getUserType(){ + return userActionService.getUserType(); + } + /** + * 校验用户 + */ + @RequestMapping("verifyUser") + @ResponseBody + public Result verifyUser(@RequestBody UserDto userDto){ + return userActionService.verifyUser(userDto); + } /** * 找回密码 */ - + @RequestMapping("retrievePassword") + @ResponseBody + public Result retrievePassword(String id,String oldPwd,String newPwd){ + return userActionService.retrievePassword(id,oldPwd,newPwd); + } /** * 用户信息 */ - + @RequestMapping("getUserInfo") + @ResponseBody + public Result getUserInfo(String userName){ + return userActionService.getUserInfo(userName); + } /** * 修改照片 */ @@ -38,4 +89,46 @@ /** * 员工导入 */ + /** + * 获取微信openid,sessionkey等信息 + */ + @RequestMapping("getOther") + @ResponseBody + public Object getWxOpenidInfo(@RequestParam String code) { + if (StringUtil.isEmpty(code)) { + return null; + } + JSONObject jsonObject = WXUserUtils.getOpenId(code); + //JSONObject str = WXUserUtils.getAccessToken(); + //JSONObject phone = WXUserUtils.getPhone(code,str.get("access_token").toString()); + //System.out.println("token:"+str); + //System.out.println("phone:"+phone); + return Result.buildR(Status.OK,jsonObject); + } + /** + * 获取微信手机号 + */ + @RequestMapping("/phone") + @ResponseBody + public Object authPhone(String encryptedData, String session_key, String iv) { + try { + //String decrypt = AESUtils.decrypt(encryptedData, session_key, iv, "UTF-8"); + //System.out.println(decrypt); + // String result = WXUserUtils.wxDecrypt(encryptedData, session_key, iv); + String result = ""; + JSONObject json = JSONObject.parseObject(result); + if (json.containsKey("phoneNumber")) { + String phone = json.getString("phoneNumber"); + if (StringUtils.isNoneBlank(phone)) { + return Result.buildR(Status.OK,json); + } else { + return Result.buildR(Status.FAILED_PHONE); + } + } else { + return Result.buildR(Status.FAIL); + } + } catch (Exception e) { + return Result.buildR(Status.FAIL); + } + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dao/UserActionMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/UserActionMapper.java new file mode 100644 index 0000000..5647343 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/UserActionMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.system.dto.StaffInfoDto; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.model.Dict; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +public interface UserActionMapper extends BaseMapper { + List getList(); + + void userRegister(@Param("userDto") UserDto userDto); + + UserDto getUserInfo(@Param("userDto") UserDto userDto); + + StaffInfoDto getStaffInfo(@Param("userDto") UserDto userDto); + + void retrievePassword(@Param("id")String id, @Param("salt")String salt, @Param("password")String password); + + void setUserOpenId(@Param("userDto")UserDto user); + + void userEmpowerment(@Param("id")String id,@Param("userId")String userId,@Param("updateTime")String updateTime); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/StaffInfoDto.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/StaffInfoDto.java new file mode 100644 index 0000000..16f8088 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/StaffInfoDto.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +@Data +public class StaffInfoDto { + private String id;// + private String staffCode;//工号 + private String staffName;//姓名 + private String staffGender;//性别 + private String staffPhone;//手机号 + private String createTime;// + private String updateTime;// +} diff --git a/casic-server/pom.xml b/casic-server/pom.xml index cd24fd8..6ff78b8 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -35,6 +35,41 @@ ${boot.version} provided + + com.casic + casic-admin-core + 2.0.0.alpha + compile + + + org.apache.httpcomponents + httpcore + 4.0.1 + + + org.apache.httpcomponents + httpclient + 4.0.2 + + + org.apache.httpcomponents + httpclient + + + com.dameng + DmJdbcDriver18 + 1.8 + compile + + + org.testcontainers + testcontainers + 1.15.1 + + + org.apache.httpcomponents + httpcore + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java index a7381d1..4ef1109 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java @@ -1,32 +1,83 @@ package com.casic.missiles.modular.system.controller; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.system.service.UserActionService; +import com.casic.missiles.modular.system.utils.*; +import dm.jdbc.util.StringUtil; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.List; + /** * @Description: 小程序用户 * @Author: wangpeng * @Date: 2022/11/8 14:39 */ +@Controller +@RequestMapping("user") public class UserController { + @Resource + private UserActionService userActionService; + /** * 注册 */ + @RequestMapping("userLogin") + @ResponseBody + public Result userLogin(@RequestBody HashMap map){ + return userActionService.userLogin(map); + } /** - * 登录 + * 注册 */ - + @RequestMapping("userRegister") + @ResponseBody + public Result userRegister(@RequestBody UserDto userDto){ + return userActionService.userRegister(userDto); + } /** - * 验证用户信息 + * 获取员工类型 */ - + @RequestMapping("getUserType") + @ResponseBody + public List getUserType(){ + return userActionService.getUserType(); + } + /** + * 校验用户 + */ + @RequestMapping("verifyUser") + @ResponseBody + public Result verifyUser(@RequestBody UserDto userDto){ + return userActionService.verifyUser(userDto); + } /** * 找回密码 */ - + @RequestMapping("retrievePassword") + @ResponseBody + public Result retrievePassword(String id,String oldPwd,String newPwd){ + return userActionService.retrievePassword(id,oldPwd,newPwd); + } /** * 用户信息 */ - + @RequestMapping("getUserInfo") + @ResponseBody + public Result getUserInfo(String userName){ + return userActionService.getUserInfo(userName); + } /** * 修改照片 */ @@ -38,4 +89,46 @@ /** * 员工导入 */ + /** + * 获取微信openid,sessionkey等信息 + */ + @RequestMapping("getOther") + @ResponseBody + public Object getWxOpenidInfo(@RequestParam String code) { + if (StringUtil.isEmpty(code)) { + return null; + } + JSONObject jsonObject = WXUserUtils.getOpenId(code); + //JSONObject str = WXUserUtils.getAccessToken(); + //JSONObject phone = WXUserUtils.getPhone(code,str.get("access_token").toString()); + //System.out.println("token:"+str); + //System.out.println("phone:"+phone); + return Result.buildR(Status.OK,jsonObject); + } + /** + * 获取微信手机号 + */ + @RequestMapping("/phone") + @ResponseBody + public Object authPhone(String encryptedData, String session_key, String iv) { + try { + //String decrypt = AESUtils.decrypt(encryptedData, session_key, iv, "UTF-8"); + //System.out.println(decrypt); + // String result = WXUserUtils.wxDecrypt(encryptedData, session_key, iv); + String result = ""; + JSONObject json = JSONObject.parseObject(result); + if (json.containsKey("phoneNumber")) { + String phone = json.getString("phoneNumber"); + if (StringUtils.isNoneBlank(phone)) { + return Result.buildR(Status.OK,json); + } else { + return Result.buildR(Status.FAILED_PHONE); + } + } else { + return Result.buildR(Status.FAIL); + } + } catch (Exception e) { + return Result.buildR(Status.FAIL); + } + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dao/UserActionMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/UserActionMapper.java new file mode 100644 index 0000000..5647343 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/UserActionMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.system.dto.StaffInfoDto; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.model.Dict; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +public interface UserActionMapper extends BaseMapper { + List getList(); + + void userRegister(@Param("userDto") UserDto userDto); + + UserDto getUserInfo(@Param("userDto") UserDto userDto); + + StaffInfoDto getStaffInfo(@Param("userDto") UserDto userDto); + + void retrievePassword(@Param("id")String id, @Param("salt")String salt, @Param("password")String password); + + void setUserOpenId(@Param("userDto")UserDto user); + + void userEmpowerment(@Param("id")String id,@Param("userId")String userId,@Param("updateTime")String updateTime); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/StaffInfoDto.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/StaffInfoDto.java new file mode 100644 index 0000000..16f8088 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/StaffInfoDto.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +@Data +public class StaffInfoDto { + private String id;// + private String staffCode;//工号 + private String staffName;//姓名 + private String staffGender;//性别 + private String staffPhone;//手机号 + private String createTime;// + private String updateTime;// +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/UserDto.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/UserDto.java new file mode 100644 index 0000000..2cc75d4 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/UserDto.java @@ -0,0 +1,40 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class UserDto { + private String id;//主键id + private String avatar;//头像 + private String account;//账号 + private String password;//密码 + private String salt;//md5密码盐 + private String name;//名字 + private String birthday;//生日 + private String sex;//性别 + private String email;//电子邮件 + private String phone;//电话 + private String roleId;//角色id(停用) + private String deptId;//部门ID + private String status;//状态 + private Integer version;//保留字段 + private String syncId;//原ID + private String syncName;//原名称 + private String syncPwd;//同步密码 + private String syncDeptid;//同步组织ID + private Integer isSync;//是否是同步数据 + private String loginIp;//登录限制IP + private String loginMac;//登录MAC地址 + private Double positionLng;//定位经度 + private Double positionLat;//定位纬度 + private String attr1;//预留字段 + private String lastTime;//登录时间 + private String createUser;//创建用户 + private String updateUser;//修改用户 + private String createTime;//创建时间 + private String updateTime;//修改时间 + private String delFlag;//删除状态 + private String tenantId;//租户ID +} diff --git a/casic-server/pom.xml b/casic-server/pom.xml index cd24fd8..6ff78b8 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -35,6 +35,41 @@ ${boot.version} provided + + com.casic + casic-admin-core + 2.0.0.alpha + compile + + + org.apache.httpcomponents + httpcore + 4.0.1 + + + org.apache.httpcomponents + httpclient + 4.0.2 + + + org.apache.httpcomponents + httpclient + + + com.dameng + DmJdbcDriver18 + 1.8 + compile + + + org.testcontainers + testcontainers + 1.15.1 + + + org.apache.httpcomponents + httpcore + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java index a7381d1..4ef1109 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java @@ -1,32 +1,83 @@ package com.casic.missiles.modular.system.controller; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.system.service.UserActionService; +import com.casic.missiles.modular.system.utils.*; +import dm.jdbc.util.StringUtil; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.List; + /** * @Description: 小程序用户 * @Author: wangpeng * @Date: 2022/11/8 14:39 */ +@Controller +@RequestMapping("user") public class UserController { + @Resource + private UserActionService userActionService; + /** * 注册 */ + @RequestMapping("userLogin") + @ResponseBody + public Result userLogin(@RequestBody HashMap map){ + return userActionService.userLogin(map); + } /** - * 登录 + * 注册 */ - + @RequestMapping("userRegister") + @ResponseBody + public Result userRegister(@RequestBody UserDto userDto){ + return userActionService.userRegister(userDto); + } /** - * 验证用户信息 + * 获取员工类型 */ - + @RequestMapping("getUserType") + @ResponseBody + public List getUserType(){ + return userActionService.getUserType(); + } + /** + * 校验用户 + */ + @RequestMapping("verifyUser") + @ResponseBody + public Result verifyUser(@RequestBody UserDto userDto){ + return userActionService.verifyUser(userDto); + } /** * 找回密码 */ - + @RequestMapping("retrievePassword") + @ResponseBody + public Result retrievePassword(String id,String oldPwd,String newPwd){ + return userActionService.retrievePassword(id,oldPwd,newPwd); + } /** * 用户信息 */ - + @RequestMapping("getUserInfo") + @ResponseBody + public Result getUserInfo(String userName){ + return userActionService.getUserInfo(userName); + } /** * 修改照片 */ @@ -38,4 +89,46 @@ /** * 员工导入 */ + /** + * 获取微信openid,sessionkey等信息 + */ + @RequestMapping("getOther") + @ResponseBody + public Object getWxOpenidInfo(@RequestParam String code) { + if (StringUtil.isEmpty(code)) { + return null; + } + JSONObject jsonObject = WXUserUtils.getOpenId(code); + //JSONObject str = WXUserUtils.getAccessToken(); + //JSONObject phone = WXUserUtils.getPhone(code,str.get("access_token").toString()); + //System.out.println("token:"+str); + //System.out.println("phone:"+phone); + return Result.buildR(Status.OK,jsonObject); + } + /** + * 获取微信手机号 + */ + @RequestMapping("/phone") + @ResponseBody + public Object authPhone(String encryptedData, String session_key, String iv) { + try { + //String decrypt = AESUtils.decrypt(encryptedData, session_key, iv, "UTF-8"); + //System.out.println(decrypt); + // String result = WXUserUtils.wxDecrypt(encryptedData, session_key, iv); + String result = ""; + JSONObject json = JSONObject.parseObject(result); + if (json.containsKey("phoneNumber")) { + String phone = json.getString("phoneNumber"); + if (StringUtils.isNoneBlank(phone)) { + return Result.buildR(Status.OK,json); + } else { + return Result.buildR(Status.FAILED_PHONE); + } + } else { + return Result.buildR(Status.FAIL); + } + } catch (Exception e) { + return Result.buildR(Status.FAIL); + } + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dao/UserActionMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/UserActionMapper.java new file mode 100644 index 0000000..5647343 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/UserActionMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.system.dto.StaffInfoDto; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.model.Dict; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +public interface UserActionMapper extends BaseMapper { + List getList(); + + void userRegister(@Param("userDto") UserDto userDto); + + UserDto getUserInfo(@Param("userDto") UserDto userDto); + + StaffInfoDto getStaffInfo(@Param("userDto") UserDto userDto); + + void retrievePassword(@Param("id")String id, @Param("salt")String salt, @Param("password")String password); + + void setUserOpenId(@Param("userDto")UserDto user); + + void userEmpowerment(@Param("id")String id,@Param("userId")String userId,@Param("updateTime")String updateTime); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/StaffInfoDto.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/StaffInfoDto.java new file mode 100644 index 0000000..16f8088 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/StaffInfoDto.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +@Data +public class StaffInfoDto { + private String id;// + private String staffCode;//工号 + private String staffName;//姓名 + private String staffGender;//性别 + private String staffPhone;//手机号 + private String createTime;// + private String updateTime;// +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/UserDto.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/UserDto.java new file mode 100644 index 0000000..2cc75d4 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/UserDto.java @@ -0,0 +1,40 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class UserDto { + private String id;//主键id + private String avatar;//头像 + private String account;//账号 + private String password;//密码 + private String salt;//md5密码盐 + private String name;//名字 + private String birthday;//生日 + private String sex;//性别 + private String email;//电子邮件 + private String phone;//电话 + private String roleId;//角色id(停用) + private String deptId;//部门ID + private String status;//状态 + private Integer version;//保留字段 + private String syncId;//原ID + private String syncName;//原名称 + private String syncPwd;//同步密码 + private String syncDeptid;//同步组织ID + private Integer isSync;//是否是同步数据 + private String loginIp;//登录限制IP + private String loginMac;//登录MAC地址 + private Double positionLng;//定位经度 + private Double positionLat;//定位纬度 + private String attr1;//预留字段 + private String lastTime;//登录时间 + private String createUser;//创建用户 + private String updateUser;//修改用户 + private String createTime;//创建时间 + private String updateTime;//修改时间 + private String delFlag;//删除状态 + private String tenantId;//租户ID +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java b/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java new file mode 100644 index 0000000..ae06f38 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.system.utils.Result; + +import java.util.HashMap; +import java.util.List; + +public interface UserActionService extends IService { + + List getUserType(); + + Result userRegister(UserDto userDto); + + Result retrievePassword(String id,String oldPwd,String newPwd); + + Result verifyUser(UserDto userDto); + + Result getUserInfo(String userName); + + Result userLogin(HashMap map); +} diff --git a/casic-server/pom.xml b/casic-server/pom.xml index cd24fd8..6ff78b8 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -35,6 +35,41 @@ ${boot.version} provided + + com.casic + casic-admin-core + 2.0.0.alpha + compile + + + org.apache.httpcomponents + httpcore + 4.0.1 + + + org.apache.httpcomponents + httpclient + 4.0.2 + + + org.apache.httpcomponents + httpclient + + + com.dameng + DmJdbcDriver18 + 1.8 + compile + + + org.testcontainers + testcontainers + 1.15.1 + + + org.apache.httpcomponents + httpcore + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java index a7381d1..4ef1109 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java @@ -1,32 +1,83 @@ package com.casic.missiles.modular.system.controller; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.system.service.UserActionService; +import com.casic.missiles.modular.system.utils.*; +import dm.jdbc.util.StringUtil; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.List; + /** * @Description: 小程序用户 * @Author: wangpeng * @Date: 2022/11/8 14:39 */ +@Controller +@RequestMapping("user") public class UserController { + @Resource + private UserActionService userActionService; + /** * 注册 */ + @RequestMapping("userLogin") + @ResponseBody + public Result userLogin(@RequestBody HashMap map){ + return userActionService.userLogin(map); + } /** - * 登录 + * 注册 */ - + @RequestMapping("userRegister") + @ResponseBody + public Result userRegister(@RequestBody UserDto userDto){ + return userActionService.userRegister(userDto); + } /** - * 验证用户信息 + * 获取员工类型 */ - + @RequestMapping("getUserType") + @ResponseBody + public List getUserType(){ + return userActionService.getUserType(); + } + /** + * 校验用户 + */ + @RequestMapping("verifyUser") + @ResponseBody + public Result verifyUser(@RequestBody UserDto userDto){ + return userActionService.verifyUser(userDto); + } /** * 找回密码 */ - + @RequestMapping("retrievePassword") + @ResponseBody + public Result retrievePassword(String id,String oldPwd,String newPwd){ + return userActionService.retrievePassword(id,oldPwd,newPwd); + } /** * 用户信息 */ - + @RequestMapping("getUserInfo") + @ResponseBody + public Result getUserInfo(String userName){ + return userActionService.getUserInfo(userName); + } /** * 修改照片 */ @@ -38,4 +89,46 @@ /** * 员工导入 */ + /** + * 获取微信openid,sessionkey等信息 + */ + @RequestMapping("getOther") + @ResponseBody + public Object getWxOpenidInfo(@RequestParam String code) { + if (StringUtil.isEmpty(code)) { + return null; + } + JSONObject jsonObject = WXUserUtils.getOpenId(code); + //JSONObject str = WXUserUtils.getAccessToken(); + //JSONObject phone = WXUserUtils.getPhone(code,str.get("access_token").toString()); + //System.out.println("token:"+str); + //System.out.println("phone:"+phone); + return Result.buildR(Status.OK,jsonObject); + } + /** + * 获取微信手机号 + */ + @RequestMapping("/phone") + @ResponseBody + public Object authPhone(String encryptedData, String session_key, String iv) { + try { + //String decrypt = AESUtils.decrypt(encryptedData, session_key, iv, "UTF-8"); + //System.out.println(decrypt); + // String result = WXUserUtils.wxDecrypt(encryptedData, session_key, iv); + String result = ""; + JSONObject json = JSONObject.parseObject(result); + if (json.containsKey("phoneNumber")) { + String phone = json.getString("phoneNumber"); + if (StringUtils.isNoneBlank(phone)) { + return Result.buildR(Status.OK,json); + } else { + return Result.buildR(Status.FAILED_PHONE); + } + } else { + return Result.buildR(Status.FAIL); + } + } catch (Exception e) { + return Result.buildR(Status.FAIL); + } + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dao/UserActionMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/UserActionMapper.java new file mode 100644 index 0000000..5647343 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/UserActionMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.system.dto.StaffInfoDto; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.model.Dict; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +public interface UserActionMapper extends BaseMapper { + List getList(); + + void userRegister(@Param("userDto") UserDto userDto); + + UserDto getUserInfo(@Param("userDto") UserDto userDto); + + StaffInfoDto getStaffInfo(@Param("userDto") UserDto userDto); + + void retrievePassword(@Param("id")String id, @Param("salt")String salt, @Param("password")String password); + + void setUserOpenId(@Param("userDto")UserDto user); + + void userEmpowerment(@Param("id")String id,@Param("userId")String userId,@Param("updateTime")String updateTime); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/StaffInfoDto.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/StaffInfoDto.java new file mode 100644 index 0000000..16f8088 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/StaffInfoDto.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +@Data +public class StaffInfoDto { + private String id;// + private String staffCode;//工号 + private String staffName;//姓名 + private String staffGender;//性别 + private String staffPhone;//手机号 + private String createTime;// + private String updateTime;// +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/UserDto.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/UserDto.java new file mode 100644 index 0000000..2cc75d4 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/UserDto.java @@ -0,0 +1,40 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class UserDto { + private String id;//主键id + private String avatar;//头像 + private String account;//账号 + private String password;//密码 + private String salt;//md5密码盐 + private String name;//名字 + private String birthday;//生日 + private String sex;//性别 + private String email;//电子邮件 + private String phone;//电话 + private String roleId;//角色id(停用) + private String deptId;//部门ID + private String status;//状态 + private Integer version;//保留字段 + private String syncId;//原ID + private String syncName;//原名称 + private String syncPwd;//同步密码 + private String syncDeptid;//同步组织ID + private Integer isSync;//是否是同步数据 + private String loginIp;//登录限制IP + private String loginMac;//登录MAC地址 + private Double positionLng;//定位经度 + private Double positionLat;//定位纬度 + private String attr1;//预留字段 + private String lastTime;//登录时间 + private String createUser;//创建用户 + private String updateUser;//修改用户 + private String createTime;//创建时间 + private String updateTime;//修改时间 + private String delFlag;//删除状态 + private String tenantId;//租户ID +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java b/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java new file mode 100644 index 0000000..ae06f38 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.system.utils.Result; + +import java.util.HashMap; +import java.util.List; + +public interface UserActionService extends IService { + + List getUserType(); + + Result userRegister(UserDto userDto); + + Result retrievePassword(String id,String oldPwd,String newPwd); + + Result verifyUser(UserDto userDto); + + Result getUserInfo(String userName); + + Result userLogin(HashMap map); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/UserActionServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/UserActionServiceImpl.java new file mode 100644 index 0000000..1e49b17 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/UserActionServiceImpl.java @@ -0,0 +1,121 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.core.shiro.ShiroKit; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.UserActionMapper; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.system.service.UserActionService; +import com.casic.missiles.modular.system.utils.Result; +import com.casic.missiles.modular.system.utils.Status; +import com.casic.missiles.modular.system.utils.UuidUtils; +import com.casic.missiles.modular.system.utils.WXUserUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.text.SimpleDateFormat; +import java.util.*; + +@Service("UserActionService") +public class UserActionServiceImpl extends ServiceImpl implements UserActionService { + + @Resource + private UserActionMapper userActionDao; + + @Override + public Result userLogin(HashMap map) { + try { + UserDto userDto = new UserDto(); + userDto.setAttr1(WXUserUtils.getPhone(map.get("phoneCode").toString())); + UserDto user = userActionDao.getUserInfo(userDto); + if(null != user){ + JSONObject jsonObject = WXUserUtils.getOpenId(map.get("code").toString()); + user.setSyncId(jsonObject.get("openid").toString()); + userActionDao.setUserOpenId(user); + return Result.buildR(Status.LOGIN_SUCCEEDED,user); + }else{ + return Result.buildR(Status.USER_ALREADY_NOT_REGISTERED); + } + }catch (Exception e){ + e.printStackTrace(); + return Result.buildR(Status.FAIL); + } + } + + @Override + public Result userRegister(UserDto userDto) { + try { + SimpleDateFormat sim = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + userDto.setAttr1(userDto.getPhone()); + UserDto user = userActionDao.getUserInfo(userDto); + if(null == user){ + userDto.setAttr1(""); + UserDto userInfo = userActionDao.getUserInfo(userDto); + if(null != userInfo){ + userActionDao.userRegister(userDto); + userActionDao.userEmpowerment(UuidUtils.getId(),userInfo.getId(),sim.format(new Date())); + return Result.buildR(Status.OK); + }else { + return Result.buildR(Status.EMPLOYEE_NOT_EXIST); + } + }else{ + return Result.buildR(Status.USER_ALREADY_REGISTERED); + } + }catch (Exception e){ + e.printStackTrace(); + return Result.buildR(Status.FAIL); + } + } + + @Override + public Result retrievePassword(String id,String oldPwd,String newPwd) { + try { + String salt = ShiroKit.getRandomSalt(5); + String password = ShiroKit.md5(newPwd, salt); + userActionDao.retrievePassword(id,salt,password); + return Result.buildR(Status.OK); + }catch (Exception e){ + e.printStackTrace(); + return Result.buildR(Status.FAIL); + } + } + + @Override + public Result verifyUser(UserDto userDto) { + try { + UserDto user = userActionDao.getUserInfo(userDto); + if(null != user){ + if(user.getPhone().equals(userDto.getPhone())){ + return Result.buildR(Status.OK,user.getId()); + }else{ + return Result.buildR(Status.FAILED_PHONE); + } + }else{ + return Result.buildR(Status.FAILED_CERTIFICATION); + } + }catch (Exception e){ + e.printStackTrace(); + return Result.buildR(Status.FAIL); + } + } + + @Override + public Result getUserInfo(String userName) { + try { + UserDto userDto = new UserDto(); + userDto.setAccount(userName); + UserDto user = userActionDao.getUserInfo(userDto); + return Result.buildR(Status.OK,user); + }catch (Exception e){ + e.printStackTrace(); + return Result.buildR(Status.FAIL); + } + } + + + @Override + public List getUserType() { + return userActionDao.getList(); + } +} diff --git a/casic-server/pom.xml b/casic-server/pom.xml index cd24fd8..6ff78b8 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -35,6 +35,41 @@ ${boot.version} provided + + com.casic + casic-admin-core + 2.0.0.alpha + compile + + + org.apache.httpcomponents + httpcore + 4.0.1 + + + org.apache.httpcomponents + httpclient + 4.0.2 + + + org.apache.httpcomponents + httpclient + + + com.dameng + DmJdbcDriver18 + 1.8 + compile + + + org.testcontainers + testcontainers + 1.15.1 + + + org.apache.httpcomponents + httpcore + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java index a7381d1..4ef1109 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java @@ -1,32 +1,83 @@ package com.casic.missiles.modular.system.controller; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.system.service.UserActionService; +import com.casic.missiles.modular.system.utils.*; +import dm.jdbc.util.StringUtil; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.List; + /** * @Description: 小程序用户 * @Author: wangpeng * @Date: 2022/11/8 14:39 */ +@Controller +@RequestMapping("user") public class UserController { + @Resource + private UserActionService userActionService; + /** * 注册 */ + @RequestMapping("userLogin") + @ResponseBody + public Result userLogin(@RequestBody HashMap map){ + return userActionService.userLogin(map); + } /** - * 登录 + * 注册 */ - + @RequestMapping("userRegister") + @ResponseBody + public Result userRegister(@RequestBody UserDto userDto){ + return userActionService.userRegister(userDto); + } /** - * 验证用户信息 + * 获取员工类型 */ - + @RequestMapping("getUserType") + @ResponseBody + public List getUserType(){ + return userActionService.getUserType(); + } + /** + * 校验用户 + */ + @RequestMapping("verifyUser") + @ResponseBody + public Result verifyUser(@RequestBody UserDto userDto){ + return userActionService.verifyUser(userDto); + } /** * 找回密码 */ - + @RequestMapping("retrievePassword") + @ResponseBody + public Result retrievePassword(String id,String oldPwd,String newPwd){ + return userActionService.retrievePassword(id,oldPwd,newPwd); + } /** * 用户信息 */ - + @RequestMapping("getUserInfo") + @ResponseBody + public Result getUserInfo(String userName){ + return userActionService.getUserInfo(userName); + } /** * 修改照片 */ @@ -38,4 +89,46 @@ /** * 员工导入 */ + /** + * 获取微信openid,sessionkey等信息 + */ + @RequestMapping("getOther") + @ResponseBody + public Object getWxOpenidInfo(@RequestParam String code) { + if (StringUtil.isEmpty(code)) { + return null; + } + JSONObject jsonObject = WXUserUtils.getOpenId(code); + //JSONObject str = WXUserUtils.getAccessToken(); + //JSONObject phone = WXUserUtils.getPhone(code,str.get("access_token").toString()); + //System.out.println("token:"+str); + //System.out.println("phone:"+phone); + return Result.buildR(Status.OK,jsonObject); + } + /** + * 获取微信手机号 + */ + @RequestMapping("/phone") + @ResponseBody + public Object authPhone(String encryptedData, String session_key, String iv) { + try { + //String decrypt = AESUtils.decrypt(encryptedData, session_key, iv, "UTF-8"); + //System.out.println(decrypt); + // String result = WXUserUtils.wxDecrypt(encryptedData, session_key, iv); + String result = ""; + JSONObject json = JSONObject.parseObject(result); + if (json.containsKey("phoneNumber")) { + String phone = json.getString("phoneNumber"); + if (StringUtils.isNoneBlank(phone)) { + return Result.buildR(Status.OK,json); + } else { + return Result.buildR(Status.FAILED_PHONE); + } + } else { + return Result.buildR(Status.FAIL); + } + } catch (Exception e) { + return Result.buildR(Status.FAIL); + } + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dao/UserActionMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/UserActionMapper.java new file mode 100644 index 0000000..5647343 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/UserActionMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.system.dto.StaffInfoDto; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.model.Dict; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +public interface UserActionMapper extends BaseMapper { + List getList(); + + void userRegister(@Param("userDto") UserDto userDto); + + UserDto getUserInfo(@Param("userDto") UserDto userDto); + + StaffInfoDto getStaffInfo(@Param("userDto") UserDto userDto); + + void retrievePassword(@Param("id")String id, @Param("salt")String salt, @Param("password")String password); + + void setUserOpenId(@Param("userDto")UserDto user); + + void userEmpowerment(@Param("id")String id,@Param("userId")String userId,@Param("updateTime")String updateTime); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/StaffInfoDto.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/StaffInfoDto.java new file mode 100644 index 0000000..16f8088 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/StaffInfoDto.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +@Data +public class StaffInfoDto { + private String id;// + private String staffCode;//工号 + private String staffName;//姓名 + private String staffGender;//性别 + private String staffPhone;//手机号 + private String createTime;// + private String updateTime;// +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/UserDto.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/UserDto.java new file mode 100644 index 0000000..2cc75d4 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/UserDto.java @@ -0,0 +1,40 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class UserDto { + private String id;//主键id + private String avatar;//头像 + private String account;//账号 + private String password;//密码 + private String salt;//md5密码盐 + private String name;//名字 + private String birthday;//生日 + private String sex;//性别 + private String email;//电子邮件 + private String phone;//电话 + private String roleId;//角色id(停用) + private String deptId;//部门ID + private String status;//状态 + private Integer version;//保留字段 + private String syncId;//原ID + private String syncName;//原名称 + private String syncPwd;//同步密码 + private String syncDeptid;//同步组织ID + private Integer isSync;//是否是同步数据 + private String loginIp;//登录限制IP + private String loginMac;//登录MAC地址 + private Double positionLng;//定位经度 + private Double positionLat;//定位纬度 + private String attr1;//预留字段 + private String lastTime;//登录时间 + private String createUser;//创建用户 + private String updateUser;//修改用户 + private String createTime;//创建时间 + private String updateTime;//修改时间 + private String delFlag;//删除状态 + private String tenantId;//租户ID +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java b/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java new file mode 100644 index 0000000..ae06f38 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.system.utils.Result; + +import java.util.HashMap; +import java.util.List; + +public interface UserActionService extends IService { + + List getUserType(); + + Result userRegister(UserDto userDto); + + Result retrievePassword(String id,String oldPwd,String newPwd); + + Result verifyUser(UserDto userDto); + + Result getUserInfo(String userName); + + Result userLogin(HashMap map); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/UserActionServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/UserActionServiceImpl.java new file mode 100644 index 0000000..1e49b17 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/UserActionServiceImpl.java @@ -0,0 +1,121 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.core.shiro.ShiroKit; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.UserActionMapper; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.system.service.UserActionService; +import com.casic.missiles.modular.system.utils.Result; +import com.casic.missiles.modular.system.utils.Status; +import com.casic.missiles.modular.system.utils.UuidUtils; +import com.casic.missiles.modular.system.utils.WXUserUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.text.SimpleDateFormat; +import java.util.*; + +@Service("UserActionService") +public class UserActionServiceImpl extends ServiceImpl implements UserActionService { + + @Resource + private UserActionMapper userActionDao; + + @Override + public Result userLogin(HashMap map) { + try { + UserDto userDto = new UserDto(); + userDto.setAttr1(WXUserUtils.getPhone(map.get("phoneCode").toString())); + UserDto user = userActionDao.getUserInfo(userDto); + if(null != user){ + JSONObject jsonObject = WXUserUtils.getOpenId(map.get("code").toString()); + user.setSyncId(jsonObject.get("openid").toString()); + userActionDao.setUserOpenId(user); + return Result.buildR(Status.LOGIN_SUCCEEDED,user); + }else{ + return Result.buildR(Status.USER_ALREADY_NOT_REGISTERED); + } + }catch (Exception e){ + e.printStackTrace(); + return Result.buildR(Status.FAIL); + } + } + + @Override + public Result userRegister(UserDto userDto) { + try { + SimpleDateFormat sim = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + userDto.setAttr1(userDto.getPhone()); + UserDto user = userActionDao.getUserInfo(userDto); + if(null == user){ + userDto.setAttr1(""); + UserDto userInfo = userActionDao.getUserInfo(userDto); + if(null != userInfo){ + userActionDao.userRegister(userDto); + userActionDao.userEmpowerment(UuidUtils.getId(),userInfo.getId(),sim.format(new Date())); + return Result.buildR(Status.OK); + }else { + return Result.buildR(Status.EMPLOYEE_NOT_EXIST); + } + }else{ + return Result.buildR(Status.USER_ALREADY_REGISTERED); + } + }catch (Exception e){ + e.printStackTrace(); + return Result.buildR(Status.FAIL); + } + } + + @Override + public Result retrievePassword(String id,String oldPwd,String newPwd) { + try { + String salt = ShiroKit.getRandomSalt(5); + String password = ShiroKit.md5(newPwd, salt); + userActionDao.retrievePassword(id,salt,password); + return Result.buildR(Status.OK); + }catch (Exception e){ + e.printStackTrace(); + return Result.buildR(Status.FAIL); + } + } + + @Override + public Result verifyUser(UserDto userDto) { + try { + UserDto user = userActionDao.getUserInfo(userDto); + if(null != user){ + if(user.getPhone().equals(userDto.getPhone())){ + return Result.buildR(Status.OK,user.getId()); + }else{ + return Result.buildR(Status.FAILED_PHONE); + } + }else{ + return Result.buildR(Status.FAILED_CERTIFICATION); + } + }catch (Exception e){ + e.printStackTrace(); + return Result.buildR(Status.FAIL); + } + } + + @Override + public Result getUserInfo(String userName) { + try { + UserDto userDto = new UserDto(); + userDto.setAccount(userName); + UserDto user = userActionDao.getUserInfo(userDto); + return Result.buildR(Status.OK,user); + }catch (Exception e){ + e.printStackTrace(); + return Result.buildR(Status.FAIL); + } + } + + + @Override + public List getUserType() { + return userActionDao.getList(); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/AESUtils.java b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/AESUtils.java new file mode 100644 index 0000000..6d5a99d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/AESUtils.java @@ -0,0 +1,48 @@ +package com.casic.missiles.modular.system.utils; + +import sun.misc.BASE64Decoder; + +import javax.crypto.Cipher; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; + + +public class AESUtils { + + + public static String decrypt(String encryptedData, String sessionKey, String iv, String encodingFormat) throws Exception { + + try { + + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + + BASE64Decoder base64Decoder = new BASE64Decoder(); + + byte[] _encryptedData = base64Decoder.decodeBuffer(encryptedData); + + byte[] _sessionKey = base64Decoder.decodeBuffer(sessionKey); + + byte[] _iv = base64Decoder.decodeBuffer(iv); + + SecretKeySpec secretKeySpec = new SecretKeySpec(_sessionKey, "AES"); + + IvParameterSpec ivParameterSpec = new IvParameterSpec(_iv); + + cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec); + + byte[] original = cipher.doFinal(_encryptedData); + + byte[] bytes = WxPKCS7Encoder.decode(original); + + String originalString = new String(bytes, encodingFormat); return originalString; + + } catch (Exception ex) { + + ex.printStackTrace(); + return null; + + } + + } + +} \ No newline at end of file diff --git a/casic-server/pom.xml b/casic-server/pom.xml index cd24fd8..6ff78b8 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -35,6 +35,41 @@ ${boot.version} provided + + com.casic + casic-admin-core + 2.0.0.alpha + compile + + + org.apache.httpcomponents + httpcore + 4.0.1 + + + org.apache.httpcomponents + httpclient + 4.0.2 + + + org.apache.httpcomponents + httpclient + + + com.dameng + DmJdbcDriver18 + 1.8 + compile + + + org.testcontainers + testcontainers + 1.15.1 + + + org.apache.httpcomponents + httpcore + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java index a7381d1..4ef1109 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java @@ -1,32 +1,83 @@ package com.casic.missiles.modular.system.controller; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.system.service.UserActionService; +import com.casic.missiles.modular.system.utils.*; +import dm.jdbc.util.StringUtil; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.List; + /** * @Description: 小程序用户 * @Author: wangpeng * @Date: 2022/11/8 14:39 */ +@Controller +@RequestMapping("user") public class UserController { + @Resource + private UserActionService userActionService; + /** * 注册 */ + @RequestMapping("userLogin") + @ResponseBody + public Result userLogin(@RequestBody HashMap map){ + return userActionService.userLogin(map); + } /** - * 登录 + * 注册 */ - + @RequestMapping("userRegister") + @ResponseBody + public Result userRegister(@RequestBody UserDto userDto){ + return userActionService.userRegister(userDto); + } /** - * 验证用户信息 + * 获取员工类型 */ - + @RequestMapping("getUserType") + @ResponseBody + public List getUserType(){ + return userActionService.getUserType(); + } + /** + * 校验用户 + */ + @RequestMapping("verifyUser") + @ResponseBody + public Result verifyUser(@RequestBody UserDto userDto){ + return userActionService.verifyUser(userDto); + } /** * 找回密码 */ - + @RequestMapping("retrievePassword") + @ResponseBody + public Result retrievePassword(String id,String oldPwd,String newPwd){ + return userActionService.retrievePassword(id,oldPwd,newPwd); + } /** * 用户信息 */ - + @RequestMapping("getUserInfo") + @ResponseBody + public Result getUserInfo(String userName){ + return userActionService.getUserInfo(userName); + } /** * 修改照片 */ @@ -38,4 +89,46 @@ /** * 员工导入 */ + /** + * 获取微信openid,sessionkey等信息 + */ + @RequestMapping("getOther") + @ResponseBody + public Object getWxOpenidInfo(@RequestParam String code) { + if (StringUtil.isEmpty(code)) { + return null; + } + JSONObject jsonObject = WXUserUtils.getOpenId(code); + //JSONObject str = WXUserUtils.getAccessToken(); + //JSONObject phone = WXUserUtils.getPhone(code,str.get("access_token").toString()); + //System.out.println("token:"+str); + //System.out.println("phone:"+phone); + return Result.buildR(Status.OK,jsonObject); + } + /** + * 获取微信手机号 + */ + @RequestMapping("/phone") + @ResponseBody + public Object authPhone(String encryptedData, String session_key, String iv) { + try { + //String decrypt = AESUtils.decrypt(encryptedData, session_key, iv, "UTF-8"); + //System.out.println(decrypt); + // String result = WXUserUtils.wxDecrypt(encryptedData, session_key, iv); + String result = ""; + JSONObject json = JSONObject.parseObject(result); + if (json.containsKey("phoneNumber")) { + String phone = json.getString("phoneNumber"); + if (StringUtils.isNoneBlank(phone)) { + return Result.buildR(Status.OK,json); + } else { + return Result.buildR(Status.FAILED_PHONE); + } + } else { + return Result.buildR(Status.FAIL); + } + } catch (Exception e) { + return Result.buildR(Status.FAIL); + } + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dao/UserActionMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/UserActionMapper.java new file mode 100644 index 0000000..5647343 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/UserActionMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.system.dto.StaffInfoDto; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.model.Dict; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +public interface UserActionMapper extends BaseMapper { + List getList(); + + void userRegister(@Param("userDto") UserDto userDto); + + UserDto getUserInfo(@Param("userDto") UserDto userDto); + + StaffInfoDto getStaffInfo(@Param("userDto") UserDto userDto); + + void retrievePassword(@Param("id")String id, @Param("salt")String salt, @Param("password")String password); + + void setUserOpenId(@Param("userDto")UserDto user); + + void userEmpowerment(@Param("id")String id,@Param("userId")String userId,@Param("updateTime")String updateTime); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/StaffInfoDto.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/StaffInfoDto.java new file mode 100644 index 0000000..16f8088 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/StaffInfoDto.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +@Data +public class StaffInfoDto { + private String id;// + private String staffCode;//工号 + private String staffName;//姓名 + private String staffGender;//性别 + private String staffPhone;//手机号 + private String createTime;// + private String updateTime;// +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/UserDto.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/UserDto.java new file mode 100644 index 0000000..2cc75d4 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/UserDto.java @@ -0,0 +1,40 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class UserDto { + private String id;//主键id + private String avatar;//头像 + private String account;//账号 + private String password;//密码 + private String salt;//md5密码盐 + private String name;//名字 + private String birthday;//生日 + private String sex;//性别 + private String email;//电子邮件 + private String phone;//电话 + private String roleId;//角色id(停用) + private String deptId;//部门ID + private String status;//状态 + private Integer version;//保留字段 + private String syncId;//原ID + private String syncName;//原名称 + private String syncPwd;//同步密码 + private String syncDeptid;//同步组织ID + private Integer isSync;//是否是同步数据 + private String loginIp;//登录限制IP + private String loginMac;//登录MAC地址 + private Double positionLng;//定位经度 + private Double positionLat;//定位纬度 + private String attr1;//预留字段 + private String lastTime;//登录时间 + private String createUser;//创建用户 + private String updateUser;//修改用户 + private String createTime;//创建时间 + private String updateTime;//修改时间 + private String delFlag;//删除状态 + private String tenantId;//租户ID +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java b/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java new file mode 100644 index 0000000..ae06f38 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.system.utils.Result; + +import java.util.HashMap; +import java.util.List; + +public interface UserActionService extends IService { + + List getUserType(); + + Result userRegister(UserDto userDto); + + Result retrievePassword(String id,String oldPwd,String newPwd); + + Result verifyUser(UserDto userDto); + + Result getUserInfo(String userName); + + Result userLogin(HashMap map); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/UserActionServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/UserActionServiceImpl.java new file mode 100644 index 0000000..1e49b17 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/UserActionServiceImpl.java @@ -0,0 +1,121 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.core.shiro.ShiroKit; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.UserActionMapper; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.system.service.UserActionService; +import com.casic.missiles.modular.system.utils.Result; +import com.casic.missiles.modular.system.utils.Status; +import com.casic.missiles.modular.system.utils.UuidUtils; +import com.casic.missiles.modular.system.utils.WXUserUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.text.SimpleDateFormat; +import java.util.*; + +@Service("UserActionService") +public class UserActionServiceImpl extends ServiceImpl implements UserActionService { + + @Resource + private UserActionMapper userActionDao; + + @Override + public Result userLogin(HashMap map) { + try { + UserDto userDto = new UserDto(); + userDto.setAttr1(WXUserUtils.getPhone(map.get("phoneCode").toString())); + UserDto user = userActionDao.getUserInfo(userDto); + if(null != user){ + JSONObject jsonObject = WXUserUtils.getOpenId(map.get("code").toString()); + user.setSyncId(jsonObject.get("openid").toString()); + userActionDao.setUserOpenId(user); + return Result.buildR(Status.LOGIN_SUCCEEDED,user); + }else{ + return Result.buildR(Status.USER_ALREADY_NOT_REGISTERED); + } + }catch (Exception e){ + e.printStackTrace(); + return Result.buildR(Status.FAIL); + } + } + + @Override + public Result userRegister(UserDto userDto) { + try { + SimpleDateFormat sim = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + userDto.setAttr1(userDto.getPhone()); + UserDto user = userActionDao.getUserInfo(userDto); + if(null == user){ + userDto.setAttr1(""); + UserDto userInfo = userActionDao.getUserInfo(userDto); + if(null != userInfo){ + userActionDao.userRegister(userDto); + userActionDao.userEmpowerment(UuidUtils.getId(),userInfo.getId(),sim.format(new Date())); + return Result.buildR(Status.OK); + }else { + return Result.buildR(Status.EMPLOYEE_NOT_EXIST); + } + }else{ + return Result.buildR(Status.USER_ALREADY_REGISTERED); + } + }catch (Exception e){ + e.printStackTrace(); + return Result.buildR(Status.FAIL); + } + } + + @Override + public Result retrievePassword(String id,String oldPwd,String newPwd) { + try { + String salt = ShiroKit.getRandomSalt(5); + String password = ShiroKit.md5(newPwd, salt); + userActionDao.retrievePassword(id,salt,password); + return Result.buildR(Status.OK); + }catch (Exception e){ + e.printStackTrace(); + return Result.buildR(Status.FAIL); + } + } + + @Override + public Result verifyUser(UserDto userDto) { + try { + UserDto user = userActionDao.getUserInfo(userDto); + if(null != user){ + if(user.getPhone().equals(userDto.getPhone())){ + return Result.buildR(Status.OK,user.getId()); + }else{ + return Result.buildR(Status.FAILED_PHONE); + } + }else{ + return Result.buildR(Status.FAILED_CERTIFICATION); + } + }catch (Exception e){ + e.printStackTrace(); + return Result.buildR(Status.FAIL); + } + } + + @Override + public Result getUserInfo(String userName) { + try { + UserDto userDto = new UserDto(); + userDto.setAccount(userName); + UserDto user = userActionDao.getUserInfo(userDto); + return Result.buildR(Status.OK,user); + }catch (Exception e){ + e.printStackTrace(); + return Result.buildR(Status.FAIL); + } + } + + + @Override + public List getUserType() { + return userActionDao.getList(); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/AESUtils.java b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/AESUtils.java new file mode 100644 index 0000000..6d5a99d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/AESUtils.java @@ -0,0 +1,48 @@ +package com.casic.missiles.modular.system.utils; + +import sun.misc.BASE64Decoder; + +import javax.crypto.Cipher; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; + + +public class AESUtils { + + + public static String decrypt(String encryptedData, String sessionKey, String iv, String encodingFormat) throws Exception { + + try { + + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + + BASE64Decoder base64Decoder = new BASE64Decoder(); + + byte[] _encryptedData = base64Decoder.decodeBuffer(encryptedData); + + byte[] _sessionKey = base64Decoder.decodeBuffer(sessionKey); + + byte[] _iv = base64Decoder.decodeBuffer(iv); + + SecretKeySpec secretKeySpec = new SecretKeySpec(_sessionKey, "AES"); + + IvParameterSpec ivParameterSpec = new IvParameterSpec(_iv); + + cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec); + + byte[] original = cipher.doFinal(_encryptedData); + + byte[] bytes = WxPKCS7Encoder.decode(original); + + String originalString = new String(bytes, encodingFormat); return originalString; + + } catch (Exception ex) { + + ex.printStackTrace(); + return null; + + } + + } + +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/HttpClientUtil.java b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/HttpClientUtil.java new file mode 100644 index 0000000..89d6d21 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/HttpClientUtil.java @@ -0,0 +1,185 @@ +package com.casic.missiles.modular.system.utils; + +import java.io.IOException; +import java.net.URI; +import java.util.*; + +import org.apache.http.HttpEntity; +import org.apache.http.NameValuePair; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.client.utils.URIBuilder; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.message.BasicNameValuePair; +import org.apache.http.util.EntityUtils; + +public class HttpClientUtil { + + public static String URLGet(String url,Map paramsMap){ + CloseableHttpClient httpclient = HttpClients.createDefault(); + String params = ""; + try { + if (paramsMap != null && !paramsMap.isEmpty()) { + StringBuffer str = new StringBuffer(); + Set set = paramsMap.keySet(); + Iterator iter = set.iterator(); + while (iter.hasNext()) { + String key = iter.next().toString(); + if (paramsMap.get(key) == null) { + continue; + } + str.append(key).append("=").append(paramsMap.get(key)).append("&"); + } + if (str.length() > 0) { + params = "?" + str.substring(0, str.length() - 1); + } + } + HttpGet httpget = new HttpGet(url+params); + System.out.println("executing request " + httpget.getURI()); + // 执行get请求. + CloseableHttpResponse response = httpclient.execute(httpget); + try { + // 获取响应实体 + HttpEntity entity = response.getEntity(); + if (entity != null) { + return EntityUtils.toString(entity); + } + } finally { + response.close(); + } + }catch (Exception e) { + e.printStackTrace(); + } finally { + // 关闭连接,释放资源 + try { + httpclient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return null; + } + + + public static String doGet(String url, Map param) { + + // 创建Httpclient对象 + CloseableHttpClient httpclient = HttpClients.createDefault(); + + String resultString = ""; + CloseableHttpResponse response = null; + try { + // 创建uri + URIBuilder builder = new URIBuilder(url); + if (param != null) { + for (String key : param.keySet()) { + builder.addParameter(key, param.get(key)); + } + } + URI uri = builder.build(); + + // 创建http GET请求 + HttpGet httpGet = new HttpGet(uri); + + // 执行请求 + response = httpclient.execute(httpGet); + // 判断返回状态是否为200 + if (response.getStatusLine().getStatusCode() == 200) { + resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (response != null) { + response.close(); + } + httpclient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return resultString; + } + + + public static String doGet(String url) { + return doGet(url, null); + } + + + public static String doPost(String url, Map param) { + // 创建Httpclient对象 + CloseableHttpClient httpClient = HttpClients.createDefault(); + CloseableHttpResponse response = null; + String resultString = ""; + try { + // 创建Http Post请求 + HttpPost httpPost = new HttpPost(url); + // 创建参数列表 + if (param != null) { + List paramList = new ArrayList<>(); + for (String key : param.keySet()) { + paramList.add(new BasicNameValuePair(key, param.get(key))); + } + // 模拟表单 + UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList, "utf-8"); + httpPost.setEntity(entity); + } + // 执行http请求 + response = httpClient.execute(httpPost); + resultString = EntityUtils.toString(response.getEntity(), "utf-8"); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + response.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + return resultString; + } + + + public static String doPost(String url) { + return doPost(url, null); + } + + + public static String doPostJson(String url, String json) { + // 创建Httpclient对象 + CloseableHttpClient httpClient = HttpClients.createDefault(); + CloseableHttpResponse response = null; + String resultString = ""; + try { + // 创建Http Post请求 + HttpPost httpPost = new HttpPost(url); + // 创建请求内容 + StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON); + httpPost.setEntity(entity); + // 执行http请求 + response = httpClient.execute(httpPost); + resultString = EntityUtils.toString(response.getEntity(), "utf-8"); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + response.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + return resultString; + } + +} diff --git a/casic-server/pom.xml b/casic-server/pom.xml index cd24fd8..6ff78b8 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -35,6 +35,41 @@ ${boot.version} provided + + com.casic + casic-admin-core + 2.0.0.alpha + compile + + + org.apache.httpcomponents + httpcore + 4.0.1 + + + org.apache.httpcomponents + httpclient + 4.0.2 + + + org.apache.httpcomponents + httpclient + + + com.dameng + DmJdbcDriver18 + 1.8 + compile + + + org.testcontainers + testcontainers + 1.15.1 + + + org.apache.httpcomponents + httpcore + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java index a7381d1..4ef1109 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java @@ -1,32 +1,83 @@ package com.casic.missiles.modular.system.controller; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.system.service.UserActionService; +import com.casic.missiles.modular.system.utils.*; +import dm.jdbc.util.StringUtil; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.List; + /** * @Description: 小程序用户 * @Author: wangpeng * @Date: 2022/11/8 14:39 */ +@Controller +@RequestMapping("user") public class UserController { + @Resource + private UserActionService userActionService; + /** * 注册 */ + @RequestMapping("userLogin") + @ResponseBody + public Result userLogin(@RequestBody HashMap map){ + return userActionService.userLogin(map); + } /** - * 登录 + * 注册 */ - + @RequestMapping("userRegister") + @ResponseBody + public Result userRegister(@RequestBody UserDto userDto){ + return userActionService.userRegister(userDto); + } /** - * 验证用户信息 + * 获取员工类型 */ - + @RequestMapping("getUserType") + @ResponseBody + public List getUserType(){ + return userActionService.getUserType(); + } + /** + * 校验用户 + */ + @RequestMapping("verifyUser") + @ResponseBody + public Result verifyUser(@RequestBody UserDto userDto){ + return userActionService.verifyUser(userDto); + } /** * 找回密码 */ - + @RequestMapping("retrievePassword") + @ResponseBody + public Result retrievePassword(String id,String oldPwd,String newPwd){ + return userActionService.retrievePassword(id,oldPwd,newPwd); + } /** * 用户信息 */ - + @RequestMapping("getUserInfo") + @ResponseBody + public Result getUserInfo(String userName){ + return userActionService.getUserInfo(userName); + } /** * 修改照片 */ @@ -38,4 +89,46 @@ /** * 员工导入 */ + /** + * 获取微信openid,sessionkey等信息 + */ + @RequestMapping("getOther") + @ResponseBody + public Object getWxOpenidInfo(@RequestParam String code) { + if (StringUtil.isEmpty(code)) { + return null; + } + JSONObject jsonObject = WXUserUtils.getOpenId(code); + //JSONObject str = WXUserUtils.getAccessToken(); + //JSONObject phone = WXUserUtils.getPhone(code,str.get("access_token").toString()); + //System.out.println("token:"+str); + //System.out.println("phone:"+phone); + return Result.buildR(Status.OK,jsonObject); + } + /** + * 获取微信手机号 + */ + @RequestMapping("/phone") + @ResponseBody + public Object authPhone(String encryptedData, String session_key, String iv) { + try { + //String decrypt = AESUtils.decrypt(encryptedData, session_key, iv, "UTF-8"); + //System.out.println(decrypt); + // String result = WXUserUtils.wxDecrypt(encryptedData, session_key, iv); + String result = ""; + JSONObject json = JSONObject.parseObject(result); + if (json.containsKey("phoneNumber")) { + String phone = json.getString("phoneNumber"); + if (StringUtils.isNoneBlank(phone)) { + return Result.buildR(Status.OK,json); + } else { + return Result.buildR(Status.FAILED_PHONE); + } + } else { + return Result.buildR(Status.FAIL); + } + } catch (Exception e) { + return Result.buildR(Status.FAIL); + } + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dao/UserActionMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/UserActionMapper.java new file mode 100644 index 0000000..5647343 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/UserActionMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.system.dto.StaffInfoDto; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.model.Dict; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +public interface UserActionMapper extends BaseMapper { + List getList(); + + void userRegister(@Param("userDto") UserDto userDto); + + UserDto getUserInfo(@Param("userDto") UserDto userDto); + + StaffInfoDto getStaffInfo(@Param("userDto") UserDto userDto); + + void retrievePassword(@Param("id")String id, @Param("salt")String salt, @Param("password")String password); + + void setUserOpenId(@Param("userDto")UserDto user); + + void userEmpowerment(@Param("id")String id,@Param("userId")String userId,@Param("updateTime")String updateTime); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/StaffInfoDto.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/StaffInfoDto.java new file mode 100644 index 0000000..16f8088 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/StaffInfoDto.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +@Data +public class StaffInfoDto { + private String id;// + private String staffCode;//工号 + private String staffName;//姓名 + private String staffGender;//性别 + private String staffPhone;//手机号 + private String createTime;// + private String updateTime;// +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/UserDto.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/UserDto.java new file mode 100644 index 0000000..2cc75d4 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/UserDto.java @@ -0,0 +1,40 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class UserDto { + private String id;//主键id + private String avatar;//头像 + private String account;//账号 + private String password;//密码 + private String salt;//md5密码盐 + private String name;//名字 + private String birthday;//生日 + private String sex;//性别 + private String email;//电子邮件 + private String phone;//电话 + private String roleId;//角色id(停用) + private String deptId;//部门ID + private String status;//状态 + private Integer version;//保留字段 + private String syncId;//原ID + private String syncName;//原名称 + private String syncPwd;//同步密码 + private String syncDeptid;//同步组织ID + private Integer isSync;//是否是同步数据 + private String loginIp;//登录限制IP + private String loginMac;//登录MAC地址 + private Double positionLng;//定位经度 + private Double positionLat;//定位纬度 + private String attr1;//预留字段 + private String lastTime;//登录时间 + private String createUser;//创建用户 + private String updateUser;//修改用户 + private String createTime;//创建时间 + private String updateTime;//修改时间 + private String delFlag;//删除状态 + private String tenantId;//租户ID +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java b/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java new file mode 100644 index 0000000..ae06f38 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.system.utils.Result; + +import java.util.HashMap; +import java.util.List; + +public interface UserActionService extends IService { + + List getUserType(); + + Result userRegister(UserDto userDto); + + Result retrievePassword(String id,String oldPwd,String newPwd); + + Result verifyUser(UserDto userDto); + + Result getUserInfo(String userName); + + Result userLogin(HashMap map); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/UserActionServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/UserActionServiceImpl.java new file mode 100644 index 0000000..1e49b17 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/UserActionServiceImpl.java @@ -0,0 +1,121 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.core.shiro.ShiroKit; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.UserActionMapper; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.system.service.UserActionService; +import com.casic.missiles.modular.system.utils.Result; +import com.casic.missiles.modular.system.utils.Status; +import com.casic.missiles.modular.system.utils.UuidUtils; +import com.casic.missiles.modular.system.utils.WXUserUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.text.SimpleDateFormat; +import java.util.*; + +@Service("UserActionService") +public class UserActionServiceImpl extends ServiceImpl implements UserActionService { + + @Resource + private UserActionMapper userActionDao; + + @Override + public Result userLogin(HashMap map) { + try { + UserDto userDto = new UserDto(); + userDto.setAttr1(WXUserUtils.getPhone(map.get("phoneCode").toString())); + UserDto user = userActionDao.getUserInfo(userDto); + if(null != user){ + JSONObject jsonObject = WXUserUtils.getOpenId(map.get("code").toString()); + user.setSyncId(jsonObject.get("openid").toString()); + userActionDao.setUserOpenId(user); + return Result.buildR(Status.LOGIN_SUCCEEDED,user); + }else{ + return Result.buildR(Status.USER_ALREADY_NOT_REGISTERED); + } + }catch (Exception e){ + e.printStackTrace(); + return Result.buildR(Status.FAIL); + } + } + + @Override + public Result userRegister(UserDto userDto) { + try { + SimpleDateFormat sim = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + userDto.setAttr1(userDto.getPhone()); + UserDto user = userActionDao.getUserInfo(userDto); + if(null == user){ + userDto.setAttr1(""); + UserDto userInfo = userActionDao.getUserInfo(userDto); + if(null != userInfo){ + userActionDao.userRegister(userDto); + userActionDao.userEmpowerment(UuidUtils.getId(),userInfo.getId(),sim.format(new Date())); + return Result.buildR(Status.OK); + }else { + return Result.buildR(Status.EMPLOYEE_NOT_EXIST); + } + }else{ + return Result.buildR(Status.USER_ALREADY_REGISTERED); + } + }catch (Exception e){ + e.printStackTrace(); + return Result.buildR(Status.FAIL); + } + } + + @Override + public Result retrievePassword(String id,String oldPwd,String newPwd) { + try { + String salt = ShiroKit.getRandomSalt(5); + String password = ShiroKit.md5(newPwd, salt); + userActionDao.retrievePassword(id,salt,password); + return Result.buildR(Status.OK); + }catch (Exception e){ + e.printStackTrace(); + return Result.buildR(Status.FAIL); + } + } + + @Override + public Result verifyUser(UserDto userDto) { + try { + UserDto user = userActionDao.getUserInfo(userDto); + if(null != user){ + if(user.getPhone().equals(userDto.getPhone())){ + return Result.buildR(Status.OK,user.getId()); + }else{ + return Result.buildR(Status.FAILED_PHONE); + } + }else{ + return Result.buildR(Status.FAILED_CERTIFICATION); + } + }catch (Exception e){ + e.printStackTrace(); + return Result.buildR(Status.FAIL); + } + } + + @Override + public Result getUserInfo(String userName) { + try { + UserDto userDto = new UserDto(); + userDto.setAccount(userName); + UserDto user = userActionDao.getUserInfo(userDto); + return Result.buildR(Status.OK,user); + }catch (Exception e){ + e.printStackTrace(); + return Result.buildR(Status.FAIL); + } + } + + + @Override + public List getUserType() { + return userActionDao.getList(); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/AESUtils.java b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/AESUtils.java new file mode 100644 index 0000000..6d5a99d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/AESUtils.java @@ -0,0 +1,48 @@ +package com.casic.missiles.modular.system.utils; + +import sun.misc.BASE64Decoder; + +import javax.crypto.Cipher; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; + + +public class AESUtils { + + + public static String decrypt(String encryptedData, String sessionKey, String iv, String encodingFormat) throws Exception { + + try { + + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + + BASE64Decoder base64Decoder = new BASE64Decoder(); + + byte[] _encryptedData = base64Decoder.decodeBuffer(encryptedData); + + byte[] _sessionKey = base64Decoder.decodeBuffer(sessionKey); + + byte[] _iv = base64Decoder.decodeBuffer(iv); + + SecretKeySpec secretKeySpec = new SecretKeySpec(_sessionKey, "AES"); + + IvParameterSpec ivParameterSpec = new IvParameterSpec(_iv); + + cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec); + + byte[] original = cipher.doFinal(_encryptedData); + + byte[] bytes = WxPKCS7Encoder.decode(original); + + String originalString = new String(bytes, encodingFormat); return originalString; + + } catch (Exception ex) { + + ex.printStackTrace(); + return null; + + } + + } + +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/HttpClientUtil.java b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/HttpClientUtil.java new file mode 100644 index 0000000..89d6d21 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/HttpClientUtil.java @@ -0,0 +1,185 @@ +package com.casic.missiles.modular.system.utils; + +import java.io.IOException; +import java.net.URI; +import java.util.*; + +import org.apache.http.HttpEntity; +import org.apache.http.NameValuePair; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.client.utils.URIBuilder; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.message.BasicNameValuePair; +import org.apache.http.util.EntityUtils; + +public class HttpClientUtil { + + public static String URLGet(String url,Map paramsMap){ + CloseableHttpClient httpclient = HttpClients.createDefault(); + String params = ""; + try { + if (paramsMap != null && !paramsMap.isEmpty()) { + StringBuffer str = new StringBuffer(); + Set set = paramsMap.keySet(); + Iterator iter = set.iterator(); + while (iter.hasNext()) { + String key = iter.next().toString(); + if (paramsMap.get(key) == null) { + continue; + } + str.append(key).append("=").append(paramsMap.get(key)).append("&"); + } + if (str.length() > 0) { + params = "?" + str.substring(0, str.length() - 1); + } + } + HttpGet httpget = new HttpGet(url+params); + System.out.println("executing request " + httpget.getURI()); + // 执行get请求. + CloseableHttpResponse response = httpclient.execute(httpget); + try { + // 获取响应实体 + HttpEntity entity = response.getEntity(); + if (entity != null) { + return EntityUtils.toString(entity); + } + } finally { + response.close(); + } + }catch (Exception e) { + e.printStackTrace(); + } finally { + // 关闭连接,释放资源 + try { + httpclient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return null; + } + + + public static String doGet(String url, Map param) { + + // 创建Httpclient对象 + CloseableHttpClient httpclient = HttpClients.createDefault(); + + String resultString = ""; + CloseableHttpResponse response = null; + try { + // 创建uri + URIBuilder builder = new URIBuilder(url); + if (param != null) { + for (String key : param.keySet()) { + builder.addParameter(key, param.get(key)); + } + } + URI uri = builder.build(); + + // 创建http GET请求 + HttpGet httpGet = new HttpGet(uri); + + // 执行请求 + response = httpclient.execute(httpGet); + // 判断返回状态是否为200 + if (response.getStatusLine().getStatusCode() == 200) { + resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (response != null) { + response.close(); + } + httpclient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return resultString; + } + + + public static String doGet(String url) { + return doGet(url, null); + } + + + public static String doPost(String url, Map param) { + // 创建Httpclient对象 + CloseableHttpClient httpClient = HttpClients.createDefault(); + CloseableHttpResponse response = null; + String resultString = ""; + try { + // 创建Http Post请求 + HttpPost httpPost = new HttpPost(url); + // 创建参数列表 + if (param != null) { + List paramList = new ArrayList<>(); + for (String key : param.keySet()) { + paramList.add(new BasicNameValuePair(key, param.get(key))); + } + // 模拟表单 + UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList, "utf-8"); + httpPost.setEntity(entity); + } + // 执行http请求 + response = httpClient.execute(httpPost); + resultString = EntityUtils.toString(response.getEntity(), "utf-8"); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + response.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + return resultString; + } + + + public static String doPost(String url) { + return doPost(url, null); + } + + + public static String doPostJson(String url, String json) { + // 创建Httpclient对象 + CloseableHttpClient httpClient = HttpClients.createDefault(); + CloseableHttpResponse response = null; + String resultString = ""; + try { + // 创建Http Post请求 + HttpPost httpPost = new HttpPost(url); + // 创建请求内容 + StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON); + httpPost.setEntity(entity); + // 执行http请求 + response = httpClient.execute(httpPost); + resultString = EntityUtils.toString(response.getEntity(), "utf-8"); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + response.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + return resultString; + } + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/Result.java b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/Result.java new file mode 100644 index 0000000..312c9fa --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/Result.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.utils; + +public class Result { + + private Integer status; + private String message; + private T data; + + public Integer getStatus() { + return status; + } + public String getMessage() { + return message; + } + public T getData() { + return data; + } + + private Result(Integer status,String message,T data){ + this.status=status; + this.message=message; + this.data=data; + } + private Result(Integer status,String message){ + this.status=status; + this.message=message; + } + private Result(String message){ + this.message=message; + } + + + public static Result buildR(Status status,String message,T data){ + return new Result(status.getCode(),message,data); + + } + + + public static Result buildR(Status status,String message,String type){ + return new Result(status.getCode(),message); + } + + public static Result buildR(Status status,T data){ + return new Result(status.getCode(),status.getMessage(),data); + } + + public static Result buildR(Status status){ + return new Result(status.getCode(),status.getMessage()); + } + +} diff --git a/casic-server/pom.xml b/casic-server/pom.xml index cd24fd8..6ff78b8 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -35,6 +35,41 @@ ${boot.version} provided + + com.casic + casic-admin-core + 2.0.0.alpha + compile + + + org.apache.httpcomponents + httpcore + 4.0.1 + + + org.apache.httpcomponents + httpclient + 4.0.2 + + + org.apache.httpcomponents + httpclient + + + com.dameng + DmJdbcDriver18 + 1.8 + compile + + + org.testcontainers + testcontainers + 1.15.1 + + + org.apache.httpcomponents + httpcore + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java index a7381d1..4ef1109 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java @@ -1,32 +1,83 @@ package com.casic.missiles.modular.system.controller; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.system.service.UserActionService; +import com.casic.missiles.modular.system.utils.*; +import dm.jdbc.util.StringUtil; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.List; + /** * @Description: 小程序用户 * @Author: wangpeng * @Date: 2022/11/8 14:39 */ +@Controller +@RequestMapping("user") public class UserController { + @Resource + private UserActionService userActionService; + /** * 注册 */ + @RequestMapping("userLogin") + @ResponseBody + public Result userLogin(@RequestBody HashMap map){ + return userActionService.userLogin(map); + } /** - * 登录 + * 注册 */ - + @RequestMapping("userRegister") + @ResponseBody + public Result userRegister(@RequestBody UserDto userDto){ + return userActionService.userRegister(userDto); + } /** - * 验证用户信息 + * 获取员工类型 */ - + @RequestMapping("getUserType") + @ResponseBody + public List getUserType(){ + return userActionService.getUserType(); + } + /** + * 校验用户 + */ + @RequestMapping("verifyUser") + @ResponseBody + public Result verifyUser(@RequestBody UserDto userDto){ + return userActionService.verifyUser(userDto); + } /** * 找回密码 */ - + @RequestMapping("retrievePassword") + @ResponseBody + public Result retrievePassword(String id,String oldPwd,String newPwd){ + return userActionService.retrievePassword(id,oldPwd,newPwd); + } /** * 用户信息 */ - + @RequestMapping("getUserInfo") + @ResponseBody + public Result getUserInfo(String userName){ + return userActionService.getUserInfo(userName); + } /** * 修改照片 */ @@ -38,4 +89,46 @@ /** * 员工导入 */ + /** + * 获取微信openid,sessionkey等信息 + */ + @RequestMapping("getOther") + @ResponseBody + public Object getWxOpenidInfo(@RequestParam String code) { + if (StringUtil.isEmpty(code)) { + return null; + } + JSONObject jsonObject = WXUserUtils.getOpenId(code); + //JSONObject str = WXUserUtils.getAccessToken(); + //JSONObject phone = WXUserUtils.getPhone(code,str.get("access_token").toString()); + //System.out.println("token:"+str); + //System.out.println("phone:"+phone); + return Result.buildR(Status.OK,jsonObject); + } + /** + * 获取微信手机号 + */ + @RequestMapping("/phone") + @ResponseBody + public Object authPhone(String encryptedData, String session_key, String iv) { + try { + //String decrypt = AESUtils.decrypt(encryptedData, session_key, iv, "UTF-8"); + //System.out.println(decrypt); + // String result = WXUserUtils.wxDecrypt(encryptedData, session_key, iv); + String result = ""; + JSONObject json = JSONObject.parseObject(result); + if (json.containsKey("phoneNumber")) { + String phone = json.getString("phoneNumber"); + if (StringUtils.isNoneBlank(phone)) { + return Result.buildR(Status.OK,json); + } else { + return Result.buildR(Status.FAILED_PHONE); + } + } else { + return Result.buildR(Status.FAIL); + } + } catch (Exception e) { + return Result.buildR(Status.FAIL); + } + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dao/UserActionMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/UserActionMapper.java new file mode 100644 index 0000000..5647343 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/UserActionMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.system.dto.StaffInfoDto; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.model.Dict; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +public interface UserActionMapper extends BaseMapper { + List getList(); + + void userRegister(@Param("userDto") UserDto userDto); + + UserDto getUserInfo(@Param("userDto") UserDto userDto); + + StaffInfoDto getStaffInfo(@Param("userDto") UserDto userDto); + + void retrievePassword(@Param("id")String id, @Param("salt")String salt, @Param("password")String password); + + void setUserOpenId(@Param("userDto")UserDto user); + + void userEmpowerment(@Param("id")String id,@Param("userId")String userId,@Param("updateTime")String updateTime); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/StaffInfoDto.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/StaffInfoDto.java new file mode 100644 index 0000000..16f8088 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/StaffInfoDto.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +@Data +public class StaffInfoDto { + private String id;// + private String staffCode;//工号 + private String staffName;//姓名 + private String staffGender;//性别 + private String staffPhone;//手机号 + private String createTime;// + private String updateTime;// +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/UserDto.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/UserDto.java new file mode 100644 index 0000000..2cc75d4 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/UserDto.java @@ -0,0 +1,40 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class UserDto { + private String id;//主键id + private String avatar;//头像 + private String account;//账号 + private String password;//密码 + private String salt;//md5密码盐 + private String name;//名字 + private String birthday;//生日 + private String sex;//性别 + private String email;//电子邮件 + private String phone;//电话 + private String roleId;//角色id(停用) + private String deptId;//部门ID + private String status;//状态 + private Integer version;//保留字段 + private String syncId;//原ID + private String syncName;//原名称 + private String syncPwd;//同步密码 + private String syncDeptid;//同步组织ID + private Integer isSync;//是否是同步数据 + private String loginIp;//登录限制IP + private String loginMac;//登录MAC地址 + private Double positionLng;//定位经度 + private Double positionLat;//定位纬度 + private String attr1;//预留字段 + private String lastTime;//登录时间 + private String createUser;//创建用户 + private String updateUser;//修改用户 + private String createTime;//创建时间 + private String updateTime;//修改时间 + private String delFlag;//删除状态 + private String tenantId;//租户ID +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java b/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java new file mode 100644 index 0000000..ae06f38 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.system.utils.Result; + +import java.util.HashMap; +import java.util.List; + +public interface UserActionService extends IService { + + List getUserType(); + + Result userRegister(UserDto userDto); + + Result retrievePassword(String id,String oldPwd,String newPwd); + + Result verifyUser(UserDto userDto); + + Result getUserInfo(String userName); + + Result userLogin(HashMap map); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/UserActionServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/UserActionServiceImpl.java new file mode 100644 index 0000000..1e49b17 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/UserActionServiceImpl.java @@ -0,0 +1,121 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.core.shiro.ShiroKit; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.UserActionMapper; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.system.service.UserActionService; +import com.casic.missiles.modular.system.utils.Result; +import com.casic.missiles.modular.system.utils.Status; +import com.casic.missiles.modular.system.utils.UuidUtils; +import com.casic.missiles.modular.system.utils.WXUserUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.text.SimpleDateFormat; +import java.util.*; + +@Service("UserActionService") +public class UserActionServiceImpl extends ServiceImpl implements UserActionService { + + @Resource + private UserActionMapper userActionDao; + + @Override + public Result userLogin(HashMap map) { + try { + UserDto userDto = new UserDto(); + userDto.setAttr1(WXUserUtils.getPhone(map.get("phoneCode").toString())); + UserDto user = userActionDao.getUserInfo(userDto); + if(null != user){ + JSONObject jsonObject = WXUserUtils.getOpenId(map.get("code").toString()); + user.setSyncId(jsonObject.get("openid").toString()); + userActionDao.setUserOpenId(user); + return Result.buildR(Status.LOGIN_SUCCEEDED,user); + }else{ + return Result.buildR(Status.USER_ALREADY_NOT_REGISTERED); + } + }catch (Exception e){ + e.printStackTrace(); + return Result.buildR(Status.FAIL); + } + } + + @Override + public Result userRegister(UserDto userDto) { + try { + SimpleDateFormat sim = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + userDto.setAttr1(userDto.getPhone()); + UserDto user = userActionDao.getUserInfo(userDto); + if(null == user){ + userDto.setAttr1(""); + UserDto userInfo = userActionDao.getUserInfo(userDto); + if(null != userInfo){ + userActionDao.userRegister(userDto); + userActionDao.userEmpowerment(UuidUtils.getId(),userInfo.getId(),sim.format(new Date())); + return Result.buildR(Status.OK); + }else { + return Result.buildR(Status.EMPLOYEE_NOT_EXIST); + } + }else{ + return Result.buildR(Status.USER_ALREADY_REGISTERED); + } + }catch (Exception e){ + e.printStackTrace(); + return Result.buildR(Status.FAIL); + } + } + + @Override + public Result retrievePassword(String id,String oldPwd,String newPwd) { + try { + String salt = ShiroKit.getRandomSalt(5); + String password = ShiroKit.md5(newPwd, salt); + userActionDao.retrievePassword(id,salt,password); + return Result.buildR(Status.OK); + }catch (Exception e){ + e.printStackTrace(); + return Result.buildR(Status.FAIL); + } + } + + @Override + public Result verifyUser(UserDto userDto) { + try { + UserDto user = userActionDao.getUserInfo(userDto); + if(null != user){ + if(user.getPhone().equals(userDto.getPhone())){ + return Result.buildR(Status.OK,user.getId()); + }else{ + return Result.buildR(Status.FAILED_PHONE); + } + }else{ + return Result.buildR(Status.FAILED_CERTIFICATION); + } + }catch (Exception e){ + e.printStackTrace(); + return Result.buildR(Status.FAIL); + } + } + + @Override + public Result getUserInfo(String userName) { + try { + UserDto userDto = new UserDto(); + userDto.setAccount(userName); + UserDto user = userActionDao.getUserInfo(userDto); + return Result.buildR(Status.OK,user); + }catch (Exception e){ + e.printStackTrace(); + return Result.buildR(Status.FAIL); + } + } + + + @Override + public List getUserType() { + return userActionDao.getList(); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/AESUtils.java b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/AESUtils.java new file mode 100644 index 0000000..6d5a99d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/AESUtils.java @@ -0,0 +1,48 @@ +package com.casic.missiles.modular.system.utils; + +import sun.misc.BASE64Decoder; + +import javax.crypto.Cipher; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; + + +public class AESUtils { + + + public static String decrypt(String encryptedData, String sessionKey, String iv, String encodingFormat) throws Exception { + + try { + + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + + BASE64Decoder base64Decoder = new BASE64Decoder(); + + byte[] _encryptedData = base64Decoder.decodeBuffer(encryptedData); + + byte[] _sessionKey = base64Decoder.decodeBuffer(sessionKey); + + byte[] _iv = base64Decoder.decodeBuffer(iv); + + SecretKeySpec secretKeySpec = new SecretKeySpec(_sessionKey, "AES"); + + IvParameterSpec ivParameterSpec = new IvParameterSpec(_iv); + + cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec); + + byte[] original = cipher.doFinal(_encryptedData); + + byte[] bytes = WxPKCS7Encoder.decode(original); + + String originalString = new String(bytes, encodingFormat); return originalString; + + } catch (Exception ex) { + + ex.printStackTrace(); + return null; + + } + + } + +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/HttpClientUtil.java b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/HttpClientUtil.java new file mode 100644 index 0000000..89d6d21 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/HttpClientUtil.java @@ -0,0 +1,185 @@ +package com.casic.missiles.modular.system.utils; + +import java.io.IOException; +import java.net.URI; +import java.util.*; + +import org.apache.http.HttpEntity; +import org.apache.http.NameValuePair; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.client.utils.URIBuilder; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.message.BasicNameValuePair; +import org.apache.http.util.EntityUtils; + +public class HttpClientUtil { + + public static String URLGet(String url,Map paramsMap){ + CloseableHttpClient httpclient = HttpClients.createDefault(); + String params = ""; + try { + if (paramsMap != null && !paramsMap.isEmpty()) { + StringBuffer str = new StringBuffer(); + Set set = paramsMap.keySet(); + Iterator iter = set.iterator(); + while (iter.hasNext()) { + String key = iter.next().toString(); + if (paramsMap.get(key) == null) { + continue; + } + str.append(key).append("=").append(paramsMap.get(key)).append("&"); + } + if (str.length() > 0) { + params = "?" + str.substring(0, str.length() - 1); + } + } + HttpGet httpget = new HttpGet(url+params); + System.out.println("executing request " + httpget.getURI()); + // 执行get请求. + CloseableHttpResponse response = httpclient.execute(httpget); + try { + // 获取响应实体 + HttpEntity entity = response.getEntity(); + if (entity != null) { + return EntityUtils.toString(entity); + } + } finally { + response.close(); + } + }catch (Exception e) { + e.printStackTrace(); + } finally { + // 关闭连接,释放资源 + try { + httpclient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return null; + } + + + public static String doGet(String url, Map param) { + + // 创建Httpclient对象 + CloseableHttpClient httpclient = HttpClients.createDefault(); + + String resultString = ""; + CloseableHttpResponse response = null; + try { + // 创建uri + URIBuilder builder = new URIBuilder(url); + if (param != null) { + for (String key : param.keySet()) { + builder.addParameter(key, param.get(key)); + } + } + URI uri = builder.build(); + + // 创建http GET请求 + HttpGet httpGet = new HttpGet(uri); + + // 执行请求 + response = httpclient.execute(httpGet); + // 判断返回状态是否为200 + if (response.getStatusLine().getStatusCode() == 200) { + resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (response != null) { + response.close(); + } + httpclient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return resultString; + } + + + public static String doGet(String url) { + return doGet(url, null); + } + + + public static String doPost(String url, Map param) { + // 创建Httpclient对象 + CloseableHttpClient httpClient = HttpClients.createDefault(); + CloseableHttpResponse response = null; + String resultString = ""; + try { + // 创建Http Post请求 + HttpPost httpPost = new HttpPost(url); + // 创建参数列表 + if (param != null) { + List paramList = new ArrayList<>(); + for (String key : param.keySet()) { + paramList.add(new BasicNameValuePair(key, param.get(key))); + } + // 模拟表单 + UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList, "utf-8"); + httpPost.setEntity(entity); + } + // 执行http请求 + response = httpClient.execute(httpPost); + resultString = EntityUtils.toString(response.getEntity(), "utf-8"); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + response.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + return resultString; + } + + + public static String doPost(String url) { + return doPost(url, null); + } + + + public static String doPostJson(String url, String json) { + // 创建Httpclient对象 + CloseableHttpClient httpClient = HttpClients.createDefault(); + CloseableHttpResponse response = null; + String resultString = ""; + try { + // 创建Http Post请求 + HttpPost httpPost = new HttpPost(url); + // 创建请求内容 + StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON); + httpPost.setEntity(entity); + // 执行http请求 + response = httpClient.execute(httpPost); + resultString = EntityUtils.toString(response.getEntity(), "utf-8"); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + response.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + return resultString; + } + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/Result.java b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/Result.java new file mode 100644 index 0000000..312c9fa --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/Result.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.utils; + +public class Result { + + private Integer status; + private String message; + private T data; + + public Integer getStatus() { + return status; + } + public String getMessage() { + return message; + } + public T getData() { + return data; + } + + private Result(Integer status,String message,T data){ + this.status=status; + this.message=message; + this.data=data; + } + private Result(Integer status,String message){ + this.status=status; + this.message=message; + } + private Result(String message){ + this.message=message; + } + + + public static Result buildR(Status status,String message,T data){ + return new Result(status.getCode(),message,data); + + } + + + public static Result buildR(Status status,String message,String type){ + return new Result(status.getCode(),message); + } + + public static Result buildR(Status status,T data){ + return new Result(status.getCode(),status.getMessage(),data); + } + + public static Result buildR(Status status){ + return new Result(status.getCode(),status.getMessage()); + } + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/Status.java b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/Status.java new file mode 100644 index 0000000..bdca50f --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/Status.java @@ -0,0 +1,33 @@ +package com.casic.missiles.modular.system.utils; + +public enum Status { + OK(200,"请求成功"), + FAIL(500,"请求失败"), + SYSTEM_ERROR(101,"系统异常"), + LOGIN_SUCCEEDED(200,"登录成功"), + EMPLOYEE_NOT_EXIST(2400,"员工号不存在"), + USER_ALREADY_REGISTERED(2500,"该账号已注册"), + USER_ALREADY_NOT_REGISTERED(2301,"您的账号未注册,请先注册"), + FAILED_CERTIFICATION(2300,"认证不通过"), + FAILED_PHONE(2302,"授权手机号不正确"), + EMPLOYEE_NAME_MISMATCH(2400,"员工号与姓名不匹配"); + private Integer code; + private String message; + Status(Integer code,String message){ + this.code=code; + this.message=message; + } + //只需要添加get方法就行 + public Integer getCode() { + return code; + } + public String getMessage() { + return message; + } + + @Override + public String toString() { + return code+":"+message; + } + +} diff --git a/casic-server/pom.xml b/casic-server/pom.xml index cd24fd8..6ff78b8 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -35,6 +35,41 @@ ${boot.version} provided + + com.casic + casic-admin-core + 2.0.0.alpha + compile + + + org.apache.httpcomponents + httpcore + 4.0.1 + + + org.apache.httpcomponents + httpclient + 4.0.2 + + + org.apache.httpcomponents + httpclient + + + com.dameng + DmJdbcDriver18 + 1.8 + compile + + + org.testcontainers + testcontainers + 1.15.1 + + + org.apache.httpcomponents + httpcore + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java index a7381d1..4ef1109 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java @@ -1,32 +1,83 @@ package com.casic.missiles.modular.system.controller; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.system.service.UserActionService; +import com.casic.missiles.modular.system.utils.*; +import dm.jdbc.util.StringUtil; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.List; + /** * @Description: 小程序用户 * @Author: wangpeng * @Date: 2022/11/8 14:39 */ +@Controller +@RequestMapping("user") public class UserController { + @Resource + private UserActionService userActionService; + /** * 注册 */ + @RequestMapping("userLogin") + @ResponseBody + public Result userLogin(@RequestBody HashMap map){ + return userActionService.userLogin(map); + } /** - * 登录 + * 注册 */ - + @RequestMapping("userRegister") + @ResponseBody + public Result userRegister(@RequestBody UserDto userDto){ + return userActionService.userRegister(userDto); + } /** - * 验证用户信息 + * 获取员工类型 */ - + @RequestMapping("getUserType") + @ResponseBody + public List getUserType(){ + return userActionService.getUserType(); + } + /** + * 校验用户 + */ + @RequestMapping("verifyUser") + @ResponseBody + public Result verifyUser(@RequestBody UserDto userDto){ + return userActionService.verifyUser(userDto); + } /** * 找回密码 */ - + @RequestMapping("retrievePassword") + @ResponseBody + public Result retrievePassword(String id,String oldPwd,String newPwd){ + return userActionService.retrievePassword(id,oldPwd,newPwd); + } /** * 用户信息 */ - + @RequestMapping("getUserInfo") + @ResponseBody + public Result getUserInfo(String userName){ + return userActionService.getUserInfo(userName); + } /** * 修改照片 */ @@ -38,4 +89,46 @@ /** * 员工导入 */ + /** + * 获取微信openid,sessionkey等信息 + */ + @RequestMapping("getOther") + @ResponseBody + public Object getWxOpenidInfo(@RequestParam String code) { + if (StringUtil.isEmpty(code)) { + return null; + } + JSONObject jsonObject = WXUserUtils.getOpenId(code); + //JSONObject str = WXUserUtils.getAccessToken(); + //JSONObject phone = WXUserUtils.getPhone(code,str.get("access_token").toString()); + //System.out.println("token:"+str); + //System.out.println("phone:"+phone); + return Result.buildR(Status.OK,jsonObject); + } + /** + * 获取微信手机号 + */ + @RequestMapping("/phone") + @ResponseBody + public Object authPhone(String encryptedData, String session_key, String iv) { + try { + //String decrypt = AESUtils.decrypt(encryptedData, session_key, iv, "UTF-8"); + //System.out.println(decrypt); + // String result = WXUserUtils.wxDecrypt(encryptedData, session_key, iv); + String result = ""; + JSONObject json = JSONObject.parseObject(result); + if (json.containsKey("phoneNumber")) { + String phone = json.getString("phoneNumber"); + if (StringUtils.isNoneBlank(phone)) { + return Result.buildR(Status.OK,json); + } else { + return Result.buildR(Status.FAILED_PHONE); + } + } else { + return Result.buildR(Status.FAIL); + } + } catch (Exception e) { + return Result.buildR(Status.FAIL); + } + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dao/UserActionMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/UserActionMapper.java new file mode 100644 index 0000000..5647343 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/UserActionMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.system.dto.StaffInfoDto; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.model.Dict; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +public interface UserActionMapper extends BaseMapper { + List getList(); + + void userRegister(@Param("userDto") UserDto userDto); + + UserDto getUserInfo(@Param("userDto") UserDto userDto); + + StaffInfoDto getStaffInfo(@Param("userDto") UserDto userDto); + + void retrievePassword(@Param("id")String id, @Param("salt")String salt, @Param("password")String password); + + void setUserOpenId(@Param("userDto")UserDto user); + + void userEmpowerment(@Param("id")String id,@Param("userId")String userId,@Param("updateTime")String updateTime); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/StaffInfoDto.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/StaffInfoDto.java new file mode 100644 index 0000000..16f8088 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/StaffInfoDto.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +@Data +public class StaffInfoDto { + private String id;// + private String staffCode;//工号 + private String staffName;//姓名 + private String staffGender;//性别 + private String staffPhone;//手机号 + private String createTime;// + private String updateTime;// +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/UserDto.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/UserDto.java new file mode 100644 index 0000000..2cc75d4 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/UserDto.java @@ -0,0 +1,40 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class UserDto { + private String id;//主键id + private String avatar;//头像 + private String account;//账号 + private String password;//密码 + private String salt;//md5密码盐 + private String name;//名字 + private String birthday;//生日 + private String sex;//性别 + private String email;//电子邮件 + private String phone;//电话 + private String roleId;//角色id(停用) + private String deptId;//部门ID + private String status;//状态 + private Integer version;//保留字段 + private String syncId;//原ID + private String syncName;//原名称 + private String syncPwd;//同步密码 + private String syncDeptid;//同步组织ID + private Integer isSync;//是否是同步数据 + private String loginIp;//登录限制IP + private String loginMac;//登录MAC地址 + private Double positionLng;//定位经度 + private Double positionLat;//定位纬度 + private String attr1;//预留字段 + private String lastTime;//登录时间 + private String createUser;//创建用户 + private String updateUser;//修改用户 + private String createTime;//创建时间 + private String updateTime;//修改时间 + private String delFlag;//删除状态 + private String tenantId;//租户ID +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java b/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java new file mode 100644 index 0000000..ae06f38 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.system.utils.Result; + +import java.util.HashMap; +import java.util.List; + +public interface UserActionService extends IService { + + List getUserType(); + + Result userRegister(UserDto userDto); + + Result retrievePassword(String id,String oldPwd,String newPwd); + + Result verifyUser(UserDto userDto); + + Result getUserInfo(String userName); + + Result userLogin(HashMap map); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/UserActionServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/UserActionServiceImpl.java new file mode 100644 index 0000000..1e49b17 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/UserActionServiceImpl.java @@ -0,0 +1,121 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.core.shiro.ShiroKit; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.UserActionMapper; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.system.service.UserActionService; +import com.casic.missiles.modular.system.utils.Result; +import com.casic.missiles.modular.system.utils.Status; +import com.casic.missiles.modular.system.utils.UuidUtils; +import com.casic.missiles.modular.system.utils.WXUserUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.text.SimpleDateFormat; +import java.util.*; + +@Service("UserActionService") +public class UserActionServiceImpl extends ServiceImpl implements UserActionService { + + @Resource + private UserActionMapper userActionDao; + + @Override + public Result userLogin(HashMap map) { + try { + UserDto userDto = new UserDto(); + userDto.setAttr1(WXUserUtils.getPhone(map.get("phoneCode").toString())); + UserDto user = userActionDao.getUserInfo(userDto); + if(null != user){ + JSONObject jsonObject = WXUserUtils.getOpenId(map.get("code").toString()); + user.setSyncId(jsonObject.get("openid").toString()); + userActionDao.setUserOpenId(user); + return Result.buildR(Status.LOGIN_SUCCEEDED,user); + }else{ + return Result.buildR(Status.USER_ALREADY_NOT_REGISTERED); + } + }catch (Exception e){ + e.printStackTrace(); + return Result.buildR(Status.FAIL); + } + } + + @Override + public Result userRegister(UserDto userDto) { + try { + SimpleDateFormat sim = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + userDto.setAttr1(userDto.getPhone()); + UserDto user = userActionDao.getUserInfo(userDto); + if(null == user){ + userDto.setAttr1(""); + UserDto userInfo = userActionDao.getUserInfo(userDto); + if(null != userInfo){ + userActionDao.userRegister(userDto); + userActionDao.userEmpowerment(UuidUtils.getId(),userInfo.getId(),sim.format(new Date())); + return Result.buildR(Status.OK); + }else { + return Result.buildR(Status.EMPLOYEE_NOT_EXIST); + } + }else{ + return Result.buildR(Status.USER_ALREADY_REGISTERED); + } + }catch (Exception e){ + e.printStackTrace(); + return Result.buildR(Status.FAIL); + } + } + + @Override + public Result retrievePassword(String id,String oldPwd,String newPwd) { + try { + String salt = ShiroKit.getRandomSalt(5); + String password = ShiroKit.md5(newPwd, salt); + userActionDao.retrievePassword(id,salt,password); + return Result.buildR(Status.OK); + }catch (Exception e){ + e.printStackTrace(); + return Result.buildR(Status.FAIL); + } + } + + @Override + public Result verifyUser(UserDto userDto) { + try { + UserDto user = userActionDao.getUserInfo(userDto); + if(null != user){ + if(user.getPhone().equals(userDto.getPhone())){ + return Result.buildR(Status.OK,user.getId()); + }else{ + return Result.buildR(Status.FAILED_PHONE); + } + }else{ + return Result.buildR(Status.FAILED_CERTIFICATION); + } + }catch (Exception e){ + e.printStackTrace(); + return Result.buildR(Status.FAIL); + } + } + + @Override + public Result getUserInfo(String userName) { + try { + UserDto userDto = new UserDto(); + userDto.setAccount(userName); + UserDto user = userActionDao.getUserInfo(userDto); + return Result.buildR(Status.OK,user); + }catch (Exception e){ + e.printStackTrace(); + return Result.buildR(Status.FAIL); + } + } + + + @Override + public List getUserType() { + return userActionDao.getList(); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/AESUtils.java b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/AESUtils.java new file mode 100644 index 0000000..6d5a99d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/AESUtils.java @@ -0,0 +1,48 @@ +package com.casic.missiles.modular.system.utils; + +import sun.misc.BASE64Decoder; + +import javax.crypto.Cipher; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; + + +public class AESUtils { + + + public static String decrypt(String encryptedData, String sessionKey, String iv, String encodingFormat) throws Exception { + + try { + + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + + BASE64Decoder base64Decoder = new BASE64Decoder(); + + byte[] _encryptedData = base64Decoder.decodeBuffer(encryptedData); + + byte[] _sessionKey = base64Decoder.decodeBuffer(sessionKey); + + byte[] _iv = base64Decoder.decodeBuffer(iv); + + SecretKeySpec secretKeySpec = new SecretKeySpec(_sessionKey, "AES"); + + IvParameterSpec ivParameterSpec = new IvParameterSpec(_iv); + + cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec); + + byte[] original = cipher.doFinal(_encryptedData); + + byte[] bytes = WxPKCS7Encoder.decode(original); + + String originalString = new String(bytes, encodingFormat); return originalString; + + } catch (Exception ex) { + + ex.printStackTrace(); + return null; + + } + + } + +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/HttpClientUtil.java b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/HttpClientUtil.java new file mode 100644 index 0000000..89d6d21 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/HttpClientUtil.java @@ -0,0 +1,185 @@ +package com.casic.missiles.modular.system.utils; + +import java.io.IOException; +import java.net.URI; +import java.util.*; + +import org.apache.http.HttpEntity; +import org.apache.http.NameValuePair; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.client.utils.URIBuilder; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.message.BasicNameValuePair; +import org.apache.http.util.EntityUtils; + +public class HttpClientUtil { + + public static String URLGet(String url,Map paramsMap){ + CloseableHttpClient httpclient = HttpClients.createDefault(); + String params = ""; + try { + if (paramsMap != null && !paramsMap.isEmpty()) { + StringBuffer str = new StringBuffer(); + Set set = paramsMap.keySet(); + Iterator iter = set.iterator(); + while (iter.hasNext()) { + String key = iter.next().toString(); + if (paramsMap.get(key) == null) { + continue; + } + str.append(key).append("=").append(paramsMap.get(key)).append("&"); + } + if (str.length() > 0) { + params = "?" + str.substring(0, str.length() - 1); + } + } + HttpGet httpget = new HttpGet(url+params); + System.out.println("executing request " + httpget.getURI()); + // 执行get请求. + CloseableHttpResponse response = httpclient.execute(httpget); + try { + // 获取响应实体 + HttpEntity entity = response.getEntity(); + if (entity != null) { + return EntityUtils.toString(entity); + } + } finally { + response.close(); + } + }catch (Exception e) { + e.printStackTrace(); + } finally { + // 关闭连接,释放资源 + try { + httpclient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return null; + } + + + public static String doGet(String url, Map param) { + + // 创建Httpclient对象 + CloseableHttpClient httpclient = HttpClients.createDefault(); + + String resultString = ""; + CloseableHttpResponse response = null; + try { + // 创建uri + URIBuilder builder = new URIBuilder(url); + if (param != null) { + for (String key : param.keySet()) { + builder.addParameter(key, param.get(key)); + } + } + URI uri = builder.build(); + + // 创建http GET请求 + HttpGet httpGet = new HttpGet(uri); + + // 执行请求 + response = httpclient.execute(httpGet); + // 判断返回状态是否为200 + if (response.getStatusLine().getStatusCode() == 200) { + resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (response != null) { + response.close(); + } + httpclient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return resultString; + } + + + public static String doGet(String url) { + return doGet(url, null); + } + + + public static String doPost(String url, Map param) { + // 创建Httpclient对象 + CloseableHttpClient httpClient = HttpClients.createDefault(); + CloseableHttpResponse response = null; + String resultString = ""; + try { + // 创建Http Post请求 + HttpPost httpPost = new HttpPost(url); + // 创建参数列表 + if (param != null) { + List paramList = new ArrayList<>(); + for (String key : param.keySet()) { + paramList.add(new BasicNameValuePair(key, param.get(key))); + } + // 模拟表单 + UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList, "utf-8"); + httpPost.setEntity(entity); + } + // 执行http请求 + response = httpClient.execute(httpPost); + resultString = EntityUtils.toString(response.getEntity(), "utf-8"); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + response.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + return resultString; + } + + + public static String doPost(String url) { + return doPost(url, null); + } + + + public static String doPostJson(String url, String json) { + // 创建Httpclient对象 + CloseableHttpClient httpClient = HttpClients.createDefault(); + CloseableHttpResponse response = null; + String resultString = ""; + try { + // 创建Http Post请求 + HttpPost httpPost = new HttpPost(url); + // 创建请求内容 + StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON); + httpPost.setEntity(entity); + // 执行http请求 + response = httpClient.execute(httpPost); + resultString = EntityUtils.toString(response.getEntity(), "utf-8"); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + response.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + return resultString; + } + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/Result.java b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/Result.java new file mode 100644 index 0000000..312c9fa --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/Result.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.utils; + +public class Result { + + private Integer status; + private String message; + private T data; + + public Integer getStatus() { + return status; + } + public String getMessage() { + return message; + } + public T getData() { + return data; + } + + private Result(Integer status,String message,T data){ + this.status=status; + this.message=message; + this.data=data; + } + private Result(Integer status,String message){ + this.status=status; + this.message=message; + } + private Result(String message){ + this.message=message; + } + + + public static Result buildR(Status status,String message,T data){ + return new Result(status.getCode(),message,data); + + } + + + public static Result buildR(Status status,String message,String type){ + return new Result(status.getCode(),message); + } + + public static Result buildR(Status status,T data){ + return new Result(status.getCode(),status.getMessage(),data); + } + + public static Result buildR(Status status){ + return new Result(status.getCode(),status.getMessage()); + } + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/Status.java b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/Status.java new file mode 100644 index 0000000..bdca50f --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/Status.java @@ -0,0 +1,33 @@ +package com.casic.missiles.modular.system.utils; + +public enum Status { + OK(200,"请求成功"), + FAIL(500,"请求失败"), + SYSTEM_ERROR(101,"系统异常"), + LOGIN_SUCCEEDED(200,"登录成功"), + EMPLOYEE_NOT_EXIST(2400,"员工号不存在"), + USER_ALREADY_REGISTERED(2500,"该账号已注册"), + USER_ALREADY_NOT_REGISTERED(2301,"您的账号未注册,请先注册"), + FAILED_CERTIFICATION(2300,"认证不通过"), + FAILED_PHONE(2302,"授权手机号不正确"), + EMPLOYEE_NAME_MISMATCH(2400,"员工号与姓名不匹配"); + private Integer code; + private String message; + Status(Integer code,String message){ + this.code=code; + this.message=message; + } + //只需要添加get方法就行 + public Integer getCode() { + return code; + } + public String getMessage() { + return message; + } + + @Override + public String toString() { + return code+":"+message; + } + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/UuidUtils.java b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/UuidUtils.java new file mode 100644 index 0000000..ebf9328 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/UuidUtils.java @@ -0,0 +1,22 @@ +package com.casic.missiles.modular.system.utils; + +import org.apache.commons.lang3.RandomUtils; + +import java.util.Date; +import java.util.UUID; + +public class UuidUtils { + + public static String randomUUID() { + return cn.hutool.core.lang.UUID.randomUUID().toString(); + } + + public static String getUUID(){ + return UUID.randomUUID().toString().replace("-",""); + } + + public static String getId(){ + int i = RandomUtils.nextInt(1000000, 10000000); + return new Date().getTime() + "" + i; + } +} diff --git a/casic-server/pom.xml b/casic-server/pom.xml index cd24fd8..6ff78b8 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -35,6 +35,41 @@ ${boot.version} provided + + com.casic + casic-admin-core + 2.0.0.alpha + compile + + + org.apache.httpcomponents + httpcore + 4.0.1 + + + org.apache.httpcomponents + httpclient + 4.0.2 + + + org.apache.httpcomponents + httpclient + + + com.dameng + DmJdbcDriver18 + 1.8 + compile + + + org.testcontainers + testcontainers + 1.15.1 + + + org.apache.httpcomponents + httpcore + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java index a7381d1..4ef1109 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java @@ -1,32 +1,83 @@ package com.casic.missiles.modular.system.controller; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.system.service.UserActionService; +import com.casic.missiles.modular.system.utils.*; +import dm.jdbc.util.StringUtil; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.List; + /** * @Description: 小程序用户 * @Author: wangpeng * @Date: 2022/11/8 14:39 */ +@Controller +@RequestMapping("user") public class UserController { + @Resource + private UserActionService userActionService; + /** * 注册 */ + @RequestMapping("userLogin") + @ResponseBody + public Result userLogin(@RequestBody HashMap map){ + return userActionService.userLogin(map); + } /** - * 登录 + * 注册 */ - + @RequestMapping("userRegister") + @ResponseBody + public Result userRegister(@RequestBody UserDto userDto){ + return userActionService.userRegister(userDto); + } /** - * 验证用户信息 + * 获取员工类型 */ - + @RequestMapping("getUserType") + @ResponseBody + public List getUserType(){ + return userActionService.getUserType(); + } + /** + * 校验用户 + */ + @RequestMapping("verifyUser") + @ResponseBody + public Result verifyUser(@RequestBody UserDto userDto){ + return userActionService.verifyUser(userDto); + } /** * 找回密码 */ - + @RequestMapping("retrievePassword") + @ResponseBody + public Result retrievePassword(String id,String oldPwd,String newPwd){ + return userActionService.retrievePassword(id,oldPwd,newPwd); + } /** * 用户信息 */ - + @RequestMapping("getUserInfo") + @ResponseBody + public Result getUserInfo(String userName){ + return userActionService.getUserInfo(userName); + } /** * 修改照片 */ @@ -38,4 +89,46 @@ /** * 员工导入 */ + /** + * 获取微信openid,sessionkey等信息 + */ + @RequestMapping("getOther") + @ResponseBody + public Object getWxOpenidInfo(@RequestParam String code) { + if (StringUtil.isEmpty(code)) { + return null; + } + JSONObject jsonObject = WXUserUtils.getOpenId(code); + //JSONObject str = WXUserUtils.getAccessToken(); + //JSONObject phone = WXUserUtils.getPhone(code,str.get("access_token").toString()); + //System.out.println("token:"+str); + //System.out.println("phone:"+phone); + return Result.buildR(Status.OK,jsonObject); + } + /** + * 获取微信手机号 + */ + @RequestMapping("/phone") + @ResponseBody + public Object authPhone(String encryptedData, String session_key, String iv) { + try { + //String decrypt = AESUtils.decrypt(encryptedData, session_key, iv, "UTF-8"); + //System.out.println(decrypt); + // String result = WXUserUtils.wxDecrypt(encryptedData, session_key, iv); + String result = ""; + JSONObject json = JSONObject.parseObject(result); + if (json.containsKey("phoneNumber")) { + String phone = json.getString("phoneNumber"); + if (StringUtils.isNoneBlank(phone)) { + return Result.buildR(Status.OK,json); + } else { + return Result.buildR(Status.FAILED_PHONE); + } + } else { + return Result.buildR(Status.FAIL); + } + } catch (Exception e) { + return Result.buildR(Status.FAIL); + } + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dao/UserActionMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/UserActionMapper.java new file mode 100644 index 0000000..5647343 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/UserActionMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.system.dto.StaffInfoDto; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.model.Dict; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +public interface UserActionMapper extends BaseMapper { + List getList(); + + void userRegister(@Param("userDto") UserDto userDto); + + UserDto getUserInfo(@Param("userDto") UserDto userDto); + + StaffInfoDto getStaffInfo(@Param("userDto") UserDto userDto); + + void retrievePassword(@Param("id")String id, @Param("salt")String salt, @Param("password")String password); + + void setUserOpenId(@Param("userDto")UserDto user); + + void userEmpowerment(@Param("id")String id,@Param("userId")String userId,@Param("updateTime")String updateTime); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/StaffInfoDto.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/StaffInfoDto.java new file mode 100644 index 0000000..16f8088 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/StaffInfoDto.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +@Data +public class StaffInfoDto { + private String id;// + private String staffCode;//工号 + private String staffName;//姓名 + private String staffGender;//性别 + private String staffPhone;//手机号 + private String createTime;// + private String updateTime;// +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/UserDto.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/UserDto.java new file mode 100644 index 0000000..2cc75d4 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/UserDto.java @@ -0,0 +1,40 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class UserDto { + private String id;//主键id + private String avatar;//头像 + private String account;//账号 + private String password;//密码 + private String salt;//md5密码盐 + private String name;//名字 + private String birthday;//生日 + private String sex;//性别 + private String email;//电子邮件 + private String phone;//电话 + private String roleId;//角色id(停用) + private String deptId;//部门ID + private String status;//状态 + private Integer version;//保留字段 + private String syncId;//原ID + private String syncName;//原名称 + private String syncPwd;//同步密码 + private String syncDeptid;//同步组织ID + private Integer isSync;//是否是同步数据 + private String loginIp;//登录限制IP + private String loginMac;//登录MAC地址 + private Double positionLng;//定位经度 + private Double positionLat;//定位纬度 + private String attr1;//预留字段 + private String lastTime;//登录时间 + private String createUser;//创建用户 + private String updateUser;//修改用户 + private String createTime;//创建时间 + private String updateTime;//修改时间 + private String delFlag;//删除状态 + private String tenantId;//租户ID +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java b/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java new file mode 100644 index 0000000..ae06f38 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.system.utils.Result; + +import java.util.HashMap; +import java.util.List; + +public interface UserActionService extends IService { + + List getUserType(); + + Result userRegister(UserDto userDto); + + Result retrievePassword(String id,String oldPwd,String newPwd); + + Result verifyUser(UserDto userDto); + + Result getUserInfo(String userName); + + Result userLogin(HashMap map); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/UserActionServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/UserActionServiceImpl.java new file mode 100644 index 0000000..1e49b17 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/UserActionServiceImpl.java @@ -0,0 +1,121 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.core.shiro.ShiroKit; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.UserActionMapper; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.system.service.UserActionService; +import com.casic.missiles.modular.system.utils.Result; +import com.casic.missiles.modular.system.utils.Status; +import com.casic.missiles.modular.system.utils.UuidUtils; +import com.casic.missiles.modular.system.utils.WXUserUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.text.SimpleDateFormat; +import java.util.*; + +@Service("UserActionService") +public class UserActionServiceImpl extends ServiceImpl implements UserActionService { + + @Resource + private UserActionMapper userActionDao; + + @Override + public Result userLogin(HashMap map) { + try { + UserDto userDto = new UserDto(); + userDto.setAttr1(WXUserUtils.getPhone(map.get("phoneCode").toString())); + UserDto user = userActionDao.getUserInfo(userDto); + if(null != user){ + JSONObject jsonObject = WXUserUtils.getOpenId(map.get("code").toString()); + user.setSyncId(jsonObject.get("openid").toString()); + userActionDao.setUserOpenId(user); + return Result.buildR(Status.LOGIN_SUCCEEDED,user); + }else{ + return Result.buildR(Status.USER_ALREADY_NOT_REGISTERED); + } + }catch (Exception e){ + e.printStackTrace(); + return Result.buildR(Status.FAIL); + } + } + + @Override + public Result userRegister(UserDto userDto) { + try { + SimpleDateFormat sim = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + userDto.setAttr1(userDto.getPhone()); + UserDto user = userActionDao.getUserInfo(userDto); + if(null == user){ + userDto.setAttr1(""); + UserDto userInfo = userActionDao.getUserInfo(userDto); + if(null != userInfo){ + userActionDao.userRegister(userDto); + userActionDao.userEmpowerment(UuidUtils.getId(),userInfo.getId(),sim.format(new Date())); + return Result.buildR(Status.OK); + }else { + return Result.buildR(Status.EMPLOYEE_NOT_EXIST); + } + }else{ + return Result.buildR(Status.USER_ALREADY_REGISTERED); + } + }catch (Exception e){ + e.printStackTrace(); + return Result.buildR(Status.FAIL); + } + } + + @Override + public Result retrievePassword(String id,String oldPwd,String newPwd) { + try { + String salt = ShiroKit.getRandomSalt(5); + String password = ShiroKit.md5(newPwd, salt); + userActionDao.retrievePassword(id,salt,password); + return Result.buildR(Status.OK); + }catch (Exception e){ + e.printStackTrace(); + return Result.buildR(Status.FAIL); + } + } + + @Override + public Result verifyUser(UserDto userDto) { + try { + UserDto user = userActionDao.getUserInfo(userDto); + if(null != user){ + if(user.getPhone().equals(userDto.getPhone())){ + return Result.buildR(Status.OK,user.getId()); + }else{ + return Result.buildR(Status.FAILED_PHONE); + } + }else{ + return Result.buildR(Status.FAILED_CERTIFICATION); + } + }catch (Exception e){ + e.printStackTrace(); + return Result.buildR(Status.FAIL); + } + } + + @Override + public Result getUserInfo(String userName) { + try { + UserDto userDto = new UserDto(); + userDto.setAccount(userName); + UserDto user = userActionDao.getUserInfo(userDto); + return Result.buildR(Status.OK,user); + }catch (Exception e){ + e.printStackTrace(); + return Result.buildR(Status.FAIL); + } + } + + + @Override + public List getUserType() { + return userActionDao.getList(); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/AESUtils.java b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/AESUtils.java new file mode 100644 index 0000000..6d5a99d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/AESUtils.java @@ -0,0 +1,48 @@ +package com.casic.missiles.modular.system.utils; + +import sun.misc.BASE64Decoder; + +import javax.crypto.Cipher; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; + + +public class AESUtils { + + + public static String decrypt(String encryptedData, String sessionKey, String iv, String encodingFormat) throws Exception { + + try { + + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + + BASE64Decoder base64Decoder = new BASE64Decoder(); + + byte[] _encryptedData = base64Decoder.decodeBuffer(encryptedData); + + byte[] _sessionKey = base64Decoder.decodeBuffer(sessionKey); + + byte[] _iv = base64Decoder.decodeBuffer(iv); + + SecretKeySpec secretKeySpec = new SecretKeySpec(_sessionKey, "AES"); + + IvParameterSpec ivParameterSpec = new IvParameterSpec(_iv); + + cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec); + + byte[] original = cipher.doFinal(_encryptedData); + + byte[] bytes = WxPKCS7Encoder.decode(original); + + String originalString = new String(bytes, encodingFormat); return originalString; + + } catch (Exception ex) { + + ex.printStackTrace(); + return null; + + } + + } + +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/HttpClientUtil.java b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/HttpClientUtil.java new file mode 100644 index 0000000..89d6d21 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/HttpClientUtil.java @@ -0,0 +1,185 @@ +package com.casic.missiles.modular.system.utils; + +import java.io.IOException; +import java.net.URI; +import java.util.*; + +import org.apache.http.HttpEntity; +import org.apache.http.NameValuePair; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.client.utils.URIBuilder; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.message.BasicNameValuePair; +import org.apache.http.util.EntityUtils; + +public class HttpClientUtil { + + public static String URLGet(String url,Map paramsMap){ + CloseableHttpClient httpclient = HttpClients.createDefault(); + String params = ""; + try { + if (paramsMap != null && !paramsMap.isEmpty()) { + StringBuffer str = new StringBuffer(); + Set set = paramsMap.keySet(); + Iterator iter = set.iterator(); + while (iter.hasNext()) { + String key = iter.next().toString(); + if (paramsMap.get(key) == null) { + continue; + } + str.append(key).append("=").append(paramsMap.get(key)).append("&"); + } + if (str.length() > 0) { + params = "?" + str.substring(0, str.length() - 1); + } + } + HttpGet httpget = new HttpGet(url+params); + System.out.println("executing request " + httpget.getURI()); + // 执行get请求. + CloseableHttpResponse response = httpclient.execute(httpget); + try { + // 获取响应实体 + HttpEntity entity = response.getEntity(); + if (entity != null) { + return EntityUtils.toString(entity); + } + } finally { + response.close(); + } + }catch (Exception e) { + e.printStackTrace(); + } finally { + // 关闭连接,释放资源 + try { + httpclient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return null; + } + + + public static String doGet(String url, Map param) { + + // 创建Httpclient对象 + CloseableHttpClient httpclient = HttpClients.createDefault(); + + String resultString = ""; + CloseableHttpResponse response = null; + try { + // 创建uri + URIBuilder builder = new URIBuilder(url); + if (param != null) { + for (String key : param.keySet()) { + builder.addParameter(key, param.get(key)); + } + } + URI uri = builder.build(); + + // 创建http GET请求 + HttpGet httpGet = new HttpGet(uri); + + // 执行请求 + response = httpclient.execute(httpGet); + // 判断返回状态是否为200 + if (response.getStatusLine().getStatusCode() == 200) { + resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (response != null) { + response.close(); + } + httpclient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return resultString; + } + + + public static String doGet(String url) { + return doGet(url, null); + } + + + public static String doPost(String url, Map param) { + // 创建Httpclient对象 + CloseableHttpClient httpClient = HttpClients.createDefault(); + CloseableHttpResponse response = null; + String resultString = ""; + try { + // 创建Http Post请求 + HttpPost httpPost = new HttpPost(url); + // 创建参数列表 + if (param != null) { + List paramList = new ArrayList<>(); + for (String key : param.keySet()) { + paramList.add(new BasicNameValuePair(key, param.get(key))); + } + // 模拟表单 + UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList, "utf-8"); + httpPost.setEntity(entity); + } + // 执行http请求 + response = httpClient.execute(httpPost); + resultString = EntityUtils.toString(response.getEntity(), "utf-8"); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + response.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + return resultString; + } + + + public static String doPost(String url) { + return doPost(url, null); + } + + + public static String doPostJson(String url, String json) { + // 创建Httpclient对象 + CloseableHttpClient httpClient = HttpClients.createDefault(); + CloseableHttpResponse response = null; + String resultString = ""; + try { + // 创建Http Post请求 + HttpPost httpPost = new HttpPost(url); + // 创建请求内容 + StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON); + httpPost.setEntity(entity); + // 执行http请求 + response = httpClient.execute(httpPost); + resultString = EntityUtils.toString(response.getEntity(), "utf-8"); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + response.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + return resultString; + } + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/Result.java b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/Result.java new file mode 100644 index 0000000..312c9fa --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/Result.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.utils; + +public class Result { + + private Integer status; + private String message; + private T data; + + public Integer getStatus() { + return status; + } + public String getMessage() { + return message; + } + public T getData() { + return data; + } + + private Result(Integer status,String message,T data){ + this.status=status; + this.message=message; + this.data=data; + } + private Result(Integer status,String message){ + this.status=status; + this.message=message; + } + private Result(String message){ + this.message=message; + } + + + public static Result buildR(Status status,String message,T data){ + return new Result(status.getCode(),message,data); + + } + + + public static Result buildR(Status status,String message,String type){ + return new Result(status.getCode(),message); + } + + public static Result buildR(Status status,T data){ + return new Result(status.getCode(),status.getMessage(),data); + } + + public static Result buildR(Status status){ + return new Result(status.getCode(),status.getMessage()); + } + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/Status.java b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/Status.java new file mode 100644 index 0000000..bdca50f --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/Status.java @@ -0,0 +1,33 @@ +package com.casic.missiles.modular.system.utils; + +public enum Status { + OK(200,"请求成功"), + FAIL(500,"请求失败"), + SYSTEM_ERROR(101,"系统异常"), + LOGIN_SUCCEEDED(200,"登录成功"), + EMPLOYEE_NOT_EXIST(2400,"员工号不存在"), + USER_ALREADY_REGISTERED(2500,"该账号已注册"), + USER_ALREADY_NOT_REGISTERED(2301,"您的账号未注册,请先注册"), + FAILED_CERTIFICATION(2300,"认证不通过"), + FAILED_PHONE(2302,"授权手机号不正确"), + EMPLOYEE_NAME_MISMATCH(2400,"员工号与姓名不匹配"); + private Integer code; + private String message; + Status(Integer code,String message){ + this.code=code; + this.message=message; + } + //只需要添加get方法就行 + public Integer getCode() { + return code; + } + public String getMessage() { + return message; + } + + @Override + public String toString() { + return code+":"+message; + } + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/UuidUtils.java b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/UuidUtils.java new file mode 100644 index 0000000..ebf9328 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/UuidUtils.java @@ -0,0 +1,22 @@ +package com.casic.missiles.modular.system.utils; + +import org.apache.commons.lang3.RandomUtils; + +import java.util.Date; +import java.util.UUID; + +public class UuidUtils { + + public static String randomUUID() { + return cn.hutool.core.lang.UUID.randomUUID().toString(); + } + + public static String getUUID(){ + return UUID.randomUUID().toString().replace("-",""); + } + + public static String getId(){ + int i = RandomUtils.nextInt(1000000, 10000000); + return new Date().getTime() + "" + i; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/WXUserUtils.java b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/WXUserUtils.java new file mode 100644 index 0000000..8e4ba75 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/WXUserUtils.java @@ -0,0 +1,119 @@ +package com.casic.missiles.modular.system.utils; + +import java.security.AlgorithmParameters; +import java.security.Key; +import java.util.HashMap; +import java.util.Map; + +import javax.crypto.Cipher; +import javax.crypto.KeyGenerator; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; +import com.alibaba.fastjson.JSONObject; +import org.springframework.stereotype.Component; + +@Component +public class WXUserUtils{ + + public static final String AES = "AES"; + public static final String AES_CBC_PADDING = "AES/CBC/PKCS5Padding"; + /** + * 获取 微信小程序用户 openId + * @param code + * @return + */ + public static JSONObject getOpenId(String code) { + Map params=new HashMap<>(); + params.put("appid", "wx899496f4295e554e"); + params.put("secret","1783357d9445f7135303b67b79ce9ca2"); + params.put("js_code", code); + params.put("grant_type","authorization_code"); + String result=HttpClientUtil.URLGet("https://api.weixin.qq.com/sns/jscode2session", params); + return JSONObject.parseObject(result); + } + + + + public static JSONObject getAccessToken() { + Map params=new HashMap<>(); + params.put("appid", "wx899496f4295e554e"); + params.put("secret","1783357d9445f7135303b67b79ce9ca2"); + params.put("grant_type","client_credential"); + String result=HttpClientUtil.URLGet("https://api.weixin.qq.com/cgi-bin/token", params); + + return JSONObject.parseObject(result); + + } + public static String getPhone(String code) { + JSONObject accessToken = getAccessToken(); + String token = accessToken.get("access_token").toString(); + String json = "{ \"code\": \""+code+"\" }"; + String url = "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=" + token + "&"; + String doPost = HttpClientUtil.doPostJson(url, json); + JSONObject jsonObject = JSONObject.parseObject(doPost); + Object phone_info = jsonObject.get("phone_info"); + JSONObject parse =JSONObject.parseObject(phone_info.toString()); + return parse.get("phoneNumber").toString(); + + } + + /** + * * 微信 数据解密
+ * * 对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充
+ * * 对称解密的目标密文:encrypted=Base64_Decode(encryptData)
+ * * 对称解密秘钥:key = Base64_Decode(session_key),aeskey是16字节
+ * * 对称解密算法初始向量:iv = Base64_Decode(iv),同样是16字节
+ * * + * * @param encrypted 目标密文 + * * @param session_key 会话ID + * * @param iv 加密算法的初始向量 + * + */ + public static String wxDecrypt(String encrypted, String session_key, String iv) { + String result = null; + byte[] encrypted64 = org.apache.commons.codec.binary.Base64.decodeBase64(encrypted); + byte[] key64 = org.apache.commons.codec.binary.Base64.decodeBase64(session_key); + byte[] iv64 = org.apache.commons.codec.binary.Base64.decodeBase64(iv); + try { + init(); + result = new String(decrypt(encrypted64, key64, generateIV(iv64))); + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } + /** + * * 初始化密钥 + * + */ + + public static void init() throws Exception { + //Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); + KeyGenerator.getInstance(AES).init(128); + } + + /** + * * 生成iv + * + */ + public static AlgorithmParameters generateIV(byte[] iv) throws Exception { + // iv 为一个 16 字节的数组,这里采用和 iOS 端一样的构造方法,数据全为0 + // Arrays.fill(iv, (byte) 0x00); + AlgorithmParameters params = AlgorithmParameters.getInstance(AES); + params.init(new IvParameterSpec(iv)); + return params; + } + + /** + * * 生成解密 + * + */ + public static byte[] decrypt(byte[] encryptedData, byte[] keyBytes, AlgorithmParameters iv) + throws Exception { + Key key = new SecretKeySpec(keyBytes, AES); + Cipher cipher = Cipher.getInstance(AES_CBC_PADDING); + // 设置为解密模式 + cipher.init(Cipher.DECRYPT_MODE, key, iv); + return cipher.doFinal(encryptedData); + } +} \ No newline at end of file diff --git a/casic-server/pom.xml b/casic-server/pom.xml index cd24fd8..6ff78b8 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -35,6 +35,41 @@ ${boot.version} provided + + com.casic + casic-admin-core + 2.0.0.alpha + compile + + + org.apache.httpcomponents + httpcore + 4.0.1 + + + org.apache.httpcomponents + httpclient + 4.0.2 + + + org.apache.httpcomponents + httpclient + + + com.dameng + DmJdbcDriver18 + 1.8 + compile + + + org.testcontainers + testcontainers + 1.15.1 + + + org.apache.httpcomponents + httpcore + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java index a7381d1..4ef1109 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java @@ -1,32 +1,83 @@ package com.casic.missiles.modular.system.controller; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.system.service.UserActionService; +import com.casic.missiles.modular.system.utils.*; +import dm.jdbc.util.StringUtil; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.List; + /** * @Description: 小程序用户 * @Author: wangpeng * @Date: 2022/11/8 14:39 */ +@Controller +@RequestMapping("user") public class UserController { + @Resource + private UserActionService userActionService; + /** * 注册 */ + @RequestMapping("userLogin") + @ResponseBody + public Result userLogin(@RequestBody HashMap map){ + return userActionService.userLogin(map); + } /** - * 登录 + * 注册 */ - + @RequestMapping("userRegister") + @ResponseBody + public Result userRegister(@RequestBody UserDto userDto){ + return userActionService.userRegister(userDto); + } /** - * 验证用户信息 + * 获取员工类型 */ - + @RequestMapping("getUserType") + @ResponseBody + public List getUserType(){ + return userActionService.getUserType(); + } + /** + * 校验用户 + */ + @RequestMapping("verifyUser") + @ResponseBody + public Result verifyUser(@RequestBody UserDto userDto){ + return userActionService.verifyUser(userDto); + } /** * 找回密码 */ - + @RequestMapping("retrievePassword") + @ResponseBody + public Result retrievePassword(String id,String oldPwd,String newPwd){ + return userActionService.retrievePassword(id,oldPwd,newPwd); + } /** * 用户信息 */ - + @RequestMapping("getUserInfo") + @ResponseBody + public Result getUserInfo(String userName){ + return userActionService.getUserInfo(userName); + } /** * 修改照片 */ @@ -38,4 +89,46 @@ /** * 员工导入 */ + /** + * 获取微信openid,sessionkey等信息 + */ + @RequestMapping("getOther") + @ResponseBody + public Object getWxOpenidInfo(@RequestParam String code) { + if (StringUtil.isEmpty(code)) { + return null; + } + JSONObject jsonObject = WXUserUtils.getOpenId(code); + //JSONObject str = WXUserUtils.getAccessToken(); + //JSONObject phone = WXUserUtils.getPhone(code,str.get("access_token").toString()); + //System.out.println("token:"+str); + //System.out.println("phone:"+phone); + return Result.buildR(Status.OK,jsonObject); + } + /** + * 获取微信手机号 + */ + @RequestMapping("/phone") + @ResponseBody + public Object authPhone(String encryptedData, String session_key, String iv) { + try { + //String decrypt = AESUtils.decrypt(encryptedData, session_key, iv, "UTF-8"); + //System.out.println(decrypt); + // String result = WXUserUtils.wxDecrypt(encryptedData, session_key, iv); + String result = ""; + JSONObject json = JSONObject.parseObject(result); + if (json.containsKey("phoneNumber")) { + String phone = json.getString("phoneNumber"); + if (StringUtils.isNoneBlank(phone)) { + return Result.buildR(Status.OK,json); + } else { + return Result.buildR(Status.FAILED_PHONE); + } + } else { + return Result.buildR(Status.FAIL); + } + } catch (Exception e) { + return Result.buildR(Status.FAIL); + } + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dao/UserActionMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/UserActionMapper.java new file mode 100644 index 0000000..5647343 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/UserActionMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.system.dto.StaffInfoDto; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.model.Dict; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +public interface UserActionMapper extends BaseMapper { + List getList(); + + void userRegister(@Param("userDto") UserDto userDto); + + UserDto getUserInfo(@Param("userDto") UserDto userDto); + + StaffInfoDto getStaffInfo(@Param("userDto") UserDto userDto); + + void retrievePassword(@Param("id")String id, @Param("salt")String salt, @Param("password")String password); + + void setUserOpenId(@Param("userDto")UserDto user); + + void userEmpowerment(@Param("id")String id,@Param("userId")String userId,@Param("updateTime")String updateTime); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/StaffInfoDto.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/StaffInfoDto.java new file mode 100644 index 0000000..16f8088 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/StaffInfoDto.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +@Data +public class StaffInfoDto { + private String id;// + private String staffCode;//工号 + private String staffName;//姓名 + private String staffGender;//性别 + private String staffPhone;//手机号 + private String createTime;// + private String updateTime;// +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/UserDto.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/UserDto.java new file mode 100644 index 0000000..2cc75d4 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/UserDto.java @@ -0,0 +1,40 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class UserDto { + private String id;//主键id + private String avatar;//头像 + private String account;//账号 + private String password;//密码 + private String salt;//md5密码盐 + private String name;//名字 + private String birthday;//生日 + private String sex;//性别 + private String email;//电子邮件 + private String phone;//电话 + private String roleId;//角色id(停用) + private String deptId;//部门ID + private String status;//状态 + private Integer version;//保留字段 + private String syncId;//原ID + private String syncName;//原名称 + private String syncPwd;//同步密码 + private String syncDeptid;//同步组织ID + private Integer isSync;//是否是同步数据 + private String loginIp;//登录限制IP + private String loginMac;//登录MAC地址 + private Double positionLng;//定位经度 + private Double positionLat;//定位纬度 + private String attr1;//预留字段 + private String lastTime;//登录时间 + private String createUser;//创建用户 + private String updateUser;//修改用户 + private String createTime;//创建时间 + private String updateTime;//修改时间 + private String delFlag;//删除状态 + private String tenantId;//租户ID +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java b/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java new file mode 100644 index 0000000..ae06f38 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.system.utils.Result; + +import java.util.HashMap; +import java.util.List; + +public interface UserActionService extends IService { + + List getUserType(); + + Result userRegister(UserDto userDto); + + Result retrievePassword(String id,String oldPwd,String newPwd); + + Result verifyUser(UserDto userDto); + + Result getUserInfo(String userName); + + Result userLogin(HashMap map); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/UserActionServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/UserActionServiceImpl.java new file mode 100644 index 0000000..1e49b17 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/UserActionServiceImpl.java @@ -0,0 +1,121 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.core.shiro.ShiroKit; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.UserActionMapper; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.system.service.UserActionService; +import com.casic.missiles.modular.system.utils.Result; +import com.casic.missiles.modular.system.utils.Status; +import com.casic.missiles.modular.system.utils.UuidUtils; +import com.casic.missiles.modular.system.utils.WXUserUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.text.SimpleDateFormat; +import java.util.*; + +@Service("UserActionService") +public class UserActionServiceImpl extends ServiceImpl implements UserActionService { + + @Resource + private UserActionMapper userActionDao; + + @Override + public Result userLogin(HashMap map) { + try { + UserDto userDto = new UserDto(); + userDto.setAttr1(WXUserUtils.getPhone(map.get("phoneCode").toString())); + UserDto user = userActionDao.getUserInfo(userDto); + if(null != user){ + JSONObject jsonObject = WXUserUtils.getOpenId(map.get("code").toString()); + user.setSyncId(jsonObject.get("openid").toString()); + userActionDao.setUserOpenId(user); + return Result.buildR(Status.LOGIN_SUCCEEDED,user); + }else{ + return Result.buildR(Status.USER_ALREADY_NOT_REGISTERED); + } + }catch (Exception e){ + e.printStackTrace(); + return Result.buildR(Status.FAIL); + } + } + + @Override + public Result userRegister(UserDto userDto) { + try { + SimpleDateFormat sim = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + userDto.setAttr1(userDto.getPhone()); + UserDto user = userActionDao.getUserInfo(userDto); + if(null == user){ + userDto.setAttr1(""); + UserDto userInfo = userActionDao.getUserInfo(userDto); + if(null != userInfo){ + userActionDao.userRegister(userDto); + userActionDao.userEmpowerment(UuidUtils.getId(),userInfo.getId(),sim.format(new Date())); + return Result.buildR(Status.OK); + }else { + return Result.buildR(Status.EMPLOYEE_NOT_EXIST); + } + }else{ + return Result.buildR(Status.USER_ALREADY_REGISTERED); + } + }catch (Exception e){ + e.printStackTrace(); + return Result.buildR(Status.FAIL); + } + } + + @Override + public Result retrievePassword(String id,String oldPwd,String newPwd) { + try { + String salt = ShiroKit.getRandomSalt(5); + String password = ShiroKit.md5(newPwd, salt); + userActionDao.retrievePassword(id,salt,password); + return Result.buildR(Status.OK); + }catch (Exception e){ + e.printStackTrace(); + return Result.buildR(Status.FAIL); + } + } + + @Override + public Result verifyUser(UserDto userDto) { + try { + UserDto user = userActionDao.getUserInfo(userDto); + if(null != user){ + if(user.getPhone().equals(userDto.getPhone())){ + return Result.buildR(Status.OK,user.getId()); + }else{ + return Result.buildR(Status.FAILED_PHONE); + } + }else{ + return Result.buildR(Status.FAILED_CERTIFICATION); + } + }catch (Exception e){ + e.printStackTrace(); + return Result.buildR(Status.FAIL); + } + } + + @Override + public Result getUserInfo(String userName) { + try { + UserDto userDto = new UserDto(); + userDto.setAccount(userName); + UserDto user = userActionDao.getUserInfo(userDto); + return Result.buildR(Status.OK,user); + }catch (Exception e){ + e.printStackTrace(); + return Result.buildR(Status.FAIL); + } + } + + + @Override + public List getUserType() { + return userActionDao.getList(); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/AESUtils.java b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/AESUtils.java new file mode 100644 index 0000000..6d5a99d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/AESUtils.java @@ -0,0 +1,48 @@ +package com.casic.missiles.modular.system.utils; + +import sun.misc.BASE64Decoder; + +import javax.crypto.Cipher; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; + + +public class AESUtils { + + + public static String decrypt(String encryptedData, String sessionKey, String iv, String encodingFormat) throws Exception { + + try { + + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + + BASE64Decoder base64Decoder = new BASE64Decoder(); + + byte[] _encryptedData = base64Decoder.decodeBuffer(encryptedData); + + byte[] _sessionKey = base64Decoder.decodeBuffer(sessionKey); + + byte[] _iv = base64Decoder.decodeBuffer(iv); + + SecretKeySpec secretKeySpec = new SecretKeySpec(_sessionKey, "AES"); + + IvParameterSpec ivParameterSpec = new IvParameterSpec(_iv); + + cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec); + + byte[] original = cipher.doFinal(_encryptedData); + + byte[] bytes = WxPKCS7Encoder.decode(original); + + String originalString = new String(bytes, encodingFormat); return originalString; + + } catch (Exception ex) { + + ex.printStackTrace(); + return null; + + } + + } + +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/HttpClientUtil.java b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/HttpClientUtil.java new file mode 100644 index 0000000..89d6d21 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/HttpClientUtil.java @@ -0,0 +1,185 @@ +package com.casic.missiles.modular.system.utils; + +import java.io.IOException; +import java.net.URI; +import java.util.*; + +import org.apache.http.HttpEntity; +import org.apache.http.NameValuePair; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.client.utils.URIBuilder; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.message.BasicNameValuePair; +import org.apache.http.util.EntityUtils; + +public class HttpClientUtil { + + public static String URLGet(String url,Map paramsMap){ + CloseableHttpClient httpclient = HttpClients.createDefault(); + String params = ""; + try { + if (paramsMap != null && !paramsMap.isEmpty()) { + StringBuffer str = new StringBuffer(); + Set set = paramsMap.keySet(); + Iterator iter = set.iterator(); + while (iter.hasNext()) { + String key = iter.next().toString(); + if (paramsMap.get(key) == null) { + continue; + } + str.append(key).append("=").append(paramsMap.get(key)).append("&"); + } + if (str.length() > 0) { + params = "?" + str.substring(0, str.length() - 1); + } + } + HttpGet httpget = new HttpGet(url+params); + System.out.println("executing request " + httpget.getURI()); + // 执行get请求. + CloseableHttpResponse response = httpclient.execute(httpget); + try { + // 获取响应实体 + HttpEntity entity = response.getEntity(); + if (entity != null) { + return EntityUtils.toString(entity); + } + } finally { + response.close(); + } + }catch (Exception e) { + e.printStackTrace(); + } finally { + // 关闭连接,释放资源 + try { + httpclient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return null; + } + + + public static String doGet(String url, Map param) { + + // 创建Httpclient对象 + CloseableHttpClient httpclient = HttpClients.createDefault(); + + String resultString = ""; + CloseableHttpResponse response = null; + try { + // 创建uri + URIBuilder builder = new URIBuilder(url); + if (param != null) { + for (String key : param.keySet()) { + builder.addParameter(key, param.get(key)); + } + } + URI uri = builder.build(); + + // 创建http GET请求 + HttpGet httpGet = new HttpGet(uri); + + // 执行请求 + response = httpclient.execute(httpGet); + // 判断返回状态是否为200 + if (response.getStatusLine().getStatusCode() == 200) { + resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (response != null) { + response.close(); + } + httpclient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return resultString; + } + + + public static String doGet(String url) { + return doGet(url, null); + } + + + public static String doPost(String url, Map param) { + // 创建Httpclient对象 + CloseableHttpClient httpClient = HttpClients.createDefault(); + CloseableHttpResponse response = null; + String resultString = ""; + try { + // 创建Http Post请求 + HttpPost httpPost = new HttpPost(url); + // 创建参数列表 + if (param != null) { + List paramList = new ArrayList<>(); + for (String key : param.keySet()) { + paramList.add(new BasicNameValuePair(key, param.get(key))); + } + // 模拟表单 + UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList, "utf-8"); + httpPost.setEntity(entity); + } + // 执行http请求 + response = httpClient.execute(httpPost); + resultString = EntityUtils.toString(response.getEntity(), "utf-8"); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + response.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + return resultString; + } + + + public static String doPost(String url) { + return doPost(url, null); + } + + + public static String doPostJson(String url, String json) { + // 创建Httpclient对象 + CloseableHttpClient httpClient = HttpClients.createDefault(); + CloseableHttpResponse response = null; + String resultString = ""; + try { + // 创建Http Post请求 + HttpPost httpPost = new HttpPost(url); + // 创建请求内容 + StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON); + httpPost.setEntity(entity); + // 执行http请求 + response = httpClient.execute(httpPost); + resultString = EntityUtils.toString(response.getEntity(), "utf-8"); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + response.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + return resultString; + } + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/Result.java b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/Result.java new file mode 100644 index 0000000..312c9fa --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/Result.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.utils; + +public class Result { + + private Integer status; + private String message; + private T data; + + public Integer getStatus() { + return status; + } + public String getMessage() { + return message; + } + public T getData() { + return data; + } + + private Result(Integer status,String message,T data){ + this.status=status; + this.message=message; + this.data=data; + } + private Result(Integer status,String message){ + this.status=status; + this.message=message; + } + private Result(String message){ + this.message=message; + } + + + public static Result buildR(Status status,String message,T data){ + return new Result(status.getCode(),message,data); + + } + + + public static Result buildR(Status status,String message,String type){ + return new Result(status.getCode(),message); + } + + public static Result buildR(Status status,T data){ + return new Result(status.getCode(),status.getMessage(),data); + } + + public static Result buildR(Status status){ + return new Result(status.getCode(),status.getMessage()); + } + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/Status.java b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/Status.java new file mode 100644 index 0000000..bdca50f --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/Status.java @@ -0,0 +1,33 @@ +package com.casic.missiles.modular.system.utils; + +public enum Status { + OK(200,"请求成功"), + FAIL(500,"请求失败"), + SYSTEM_ERROR(101,"系统异常"), + LOGIN_SUCCEEDED(200,"登录成功"), + EMPLOYEE_NOT_EXIST(2400,"员工号不存在"), + USER_ALREADY_REGISTERED(2500,"该账号已注册"), + USER_ALREADY_NOT_REGISTERED(2301,"您的账号未注册,请先注册"), + FAILED_CERTIFICATION(2300,"认证不通过"), + FAILED_PHONE(2302,"授权手机号不正确"), + EMPLOYEE_NAME_MISMATCH(2400,"员工号与姓名不匹配"); + private Integer code; + private String message; + Status(Integer code,String message){ + this.code=code; + this.message=message; + } + //只需要添加get方法就行 + public Integer getCode() { + return code; + } + public String getMessage() { + return message; + } + + @Override + public String toString() { + return code+":"+message; + } + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/UuidUtils.java b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/UuidUtils.java new file mode 100644 index 0000000..ebf9328 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/UuidUtils.java @@ -0,0 +1,22 @@ +package com.casic.missiles.modular.system.utils; + +import org.apache.commons.lang3.RandomUtils; + +import java.util.Date; +import java.util.UUID; + +public class UuidUtils { + + public static String randomUUID() { + return cn.hutool.core.lang.UUID.randomUUID().toString(); + } + + public static String getUUID(){ + return UUID.randomUUID().toString().replace("-",""); + } + + public static String getId(){ + int i = RandomUtils.nextInt(1000000, 10000000); + return new Date().getTime() + "" + i; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/WXUserUtils.java b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/WXUserUtils.java new file mode 100644 index 0000000..8e4ba75 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/WXUserUtils.java @@ -0,0 +1,119 @@ +package com.casic.missiles.modular.system.utils; + +import java.security.AlgorithmParameters; +import java.security.Key; +import java.util.HashMap; +import java.util.Map; + +import javax.crypto.Cipher; +import javax.crypto.KeyGenerator; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; +import com.alibaba.fastjson.JSONObject; +import org.springframework.stereotype.Component; + +@Component +public class WXUserUtils{ + + public static final String AES = "AES"; + public static final String AES_CBC_PADDING = "AES/CBC/PKCS5Padding"; + /** + * 获取 微信小程序用户 openId + * @param code + * @return + */ + public static JSONObject getOpenId(String code) { + Map params=new HashMap<>(); + params.put("appid", "wx899496f4295e554e"); + params.put("secret","1783357d9445f7135303b67b79ce9ca2"); + params.put("js_code", code); + params.put("grant_type","authorization_code"); + String result=HttpClientUtil.URLGet("https://api.weixin.qq.com/sns/jscode2session", params); + return JSONObject.parseObject(result); + } + + + + public static JSONObject getAccessToken() { + Map params=new HashMap<>(); + params.put("appid", "wx899496f4295e554e"); + params.put("secret","1783357d9445f7135303b67b79ce9ca2"); + params.put("grant_type","client_credential"); + String result=HttpClientUtil.URLGet("https://api.weixin.qq.com/cgi-bin/token", params); + + return JSONObject.parseObject(result); + + } + public static String getPhone(String code) { + JSONObject accessToken = getAccessToken(); + String token = accessToken.get("access_token").toString(); + String json = "{ \"code\": \""+code+"\" }"; + String url = "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=" + token + "&"; + String doPost = HttpClientUtil.doPostJson(url, json); + JSONObject jsonObject = JSONObject.parseObject(doPost); + Object phone_info = jsonObject.get("phone_info"); + JSONObject parse =JSONObject.parseObject(phone_info.toString()); + return parse.get("phoneNumber").toString(); + + } + + /** + * * 微信 数据解密
+ * * 对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充
+ * * 对称解密的目标密文:encrypted=Base64_Decode(encryptData)
+ * * 对称解密秘钥:key = Base64_Decode(session_key),aeskey是16字节
+ * * 对称解密算法初始向量:iv = Base64_Decode(iv),同样是16字节
+ * * + * * @param encrypted 目标密文 + * * @param session_key 会话ID + * * @param iv 加密算法的初始向量 + * + */ + public static String wxDecrypt(String encrypted, String session_key, String iv) { + String result = null; + byte[] encrypted64 = org.apache.commons.codec.binary.Base64.decodeBase64(encrypted); + byte[] key64 = org.apache.commons.codec.binary.Base64.decodeBase64(session_key); + byte[] iv64 = org.apache.commons.codec.binary.Base64.decodeBase64(iv); + try { + init(); + result = new String(decrypt(encrypted64, key64, generateIV(iv64))); + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } + /** + * * 初始化密钥 + * + */ + + public static void init() throws Exception { + //Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); + KeyGenerator.getInstance(AES).init(128); + } + + /** + * * 生成iv + * + */ + public static AlgorithmParameters generateIV(byte[] iv) throws Exception { + // iv 为一个 16 字节的数组,这里采用和 iOS 端一样的构造方法,数据全为0 + // Arrays.fill(iv, (byte) 0x00); + AlgorithmParameters params = AlgorithmParameters.getInstance(AES); + params.init(new IvParameterSpec(iv)); + return params; + } + + /** + * * 生成解密 + * + */ + public static byte[] decrypt(byte[] encryptedData, byte[] keyBytes, AlgorithmParameters iv) + throws Exception { + Key key = new SecretKeySpec(keyBytes, AES); + Cipher cipher = Cipher.getInstance(AES_CBC_PADDING); + // 设置为解密模式 + cipher.init(Cipher.DECRYPT_MODE, key, iv); + return cipher.doFinal(encryptedData); + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/WxPKCS7Encoder.java b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/WxPKCS7Encoder.java new file mode 100644 index 0000000..bcef87c --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/WxPKCS7Encoder.java @@ -0,0 +1,61 @@ +package com.casic.missiles.modular.system.utils; + +import java.nio.charset.Charset; +import java.util.Arrays; + +public class WxPKCS7Encoder { + + + static Charset CHARSET = Charset.forName("utf-8"); + + static int BLOCK_SIZE = 32; + + /** + * 获得对明文进行补位填充的字节. + * + * @param count 需要进行填充补位操作的明文字节个数 + * @return 补齐用的字节数组 + */ + static byte[] encode(int count) { + // 计算需要填充的位数 + int amountToPad = BLOCK_SIZE - (count % BLOCK_SIZE); + if (amountToPad == 0) { + amountToPad = BLOCK_SIZE; + } + // 获得补位所用的字符 + char padChr = chr(amountToPad); + String tmp = new String(); + for (int index = 0; index < amountToPad; index++) { + tmp += padChr; + } + return tmp.getBytes(CHARSET); + } + + /** + * 删除解密后明文的补位字符 + * + * @param decrypted 解密后的明文 + * @return 删除补位字符后的明文 + */ + static byte[] decode(byte[] decrypted) { + int pad = (int) decrypted[decrypted.length - 1]; + if (pad < 1 || pad > 32) { + pad = 0; + } + return Arrays.copyOfRange(decrypted, 0, decrypted.length - pad); + } + + /** + * 将数字转化成ASCII码对应的字符,用于对明文进行补码 + * + * @param a 需要转化的数字 + * @return 转化得到的字符 + */ + static char chr(int a) { + + byte target = (byte) (a & 0xFF); + + return (char) target; + + } +} \ No newline at end of file diff --git a/casic-server/pom.xml b/casic-server/pom.xml index cd24fd8..6ff78b8 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -35,6 +35,41 @@ ${boot.version} provided + + com.casic + casic-admin-core + 2.0.0.alpha + compile + + + org.apache.httpcomponents + httpcore + 4.0.1 + + + org.apache.httpcomponents + httpclient + 4.0.2 + + + org.apache.httpcomponents + httpclient + + + com.dameng + DmJdbcDriver18 + 1.8 + compile + + + org.testcontainers + testcontainers + 1.15.1 + + + org.apache.httpcomponents + httpcore + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java index a7381d1..4ef1109 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java @@ -1,32 +1,83 @@ package com.casic.missiles.modular.system.controller; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.system.service.UserActionService; +import com.casic.missiles.modular.system.utils.*; +import dm.jdbc.util.StringUtil; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.List; + /** * @Description: 小程序用户 * @Author: wangpeng * @Date: 2022/11/8 14:39 */ +@Controller +@RequestMapping("user") public class UserController { + @Resource + private UserActionService userActionService; + /** * 注册 */ + @RequestMapping("userLogin") + @ResponseBody + public Result userLogin(@RequestBody HashMap map){ + return userActionService.userLogin(map); + } /** - * 登录 + * 注册 */ - + @RequestMapping("userRegister") + @ResponseBody + public Result userRegister(@RequestBody UserDto userDto){ + return userActionService.userRegister(userDto); + } /** - * 验证用户信息 + * 获取员工类型 */ - + @RequestMapping("getUserType") + @ResponseBody + public List getUserType(){ + return userActionService.getUserType(); + } + /** + * 校验用户 + */ + @RequestMapping("verifyUser") + @ResponseBody + public Result verifyUser(@RequestBody UserDto userDto){ + return userActionService.verifyUser(userDto); + } /** * 找回密码 */ - + @RequestMapping("retrievePassword") + @ResponseBody + public Result retrievePassword(String id,String oldPwd,String newPwd){ + return userActionService.retrievePassword(id,oldPwd,newPwd); + } /** * 用户信息 */ - + @RequestMapping("getUserInfo") + @ResponseBody + public Result getUserInfo(String userName){ + return userActionService.getUserInfo(userName); + } /** * 修改照片 */ @@ -38,4 +89,46 @@ /** * 员工导入 */ + /** + * 获取微信openid,sessionkey等信息 + */ + @RequestMapping("getOther") + @ResponseBody + public Object getWxOpenidInfo(@RequestParam String code) { + if (StringUtil.isEmpty(code)) { + return null; + } + JSONObject jsonObject = WXUserUtils.getOpenId(code); + //JSONObject str = WXUserUtils.getAccessToken(); + //JSONObject phone = WXUserUtils.getPhone(code,str.get("access_token").toString()); + //System.out.println("token:"+str); + //System.out.println("phone:"+phone); + return Result.buildR(Status.OK,jsonObject); + } + /** + * 获取微信手机号 + */ + @RequestMapping("/phone") + @ResponseBody + public Object authPhone(String encryptedData, String session_key, String iv) { + try { + //String decrypt = AESUtils.decrypt(encryptedData, session_key, iv, "UTF-8"); + //System.out.println(decrypt); + // String result = WXUserUtils.wxDecrypt(encryptedData, session_key, iv); + String result = ""; + JSONObject json = JSONObject.parseObject(result); + if (json.containsKey("phoneNumber")) { + String phone = json.getString("phoneNumber"); + if (StringUtils.isNoneBlank(phone)) { + return Result.buildR(Status.OK,json); + } else { + return Result.buildR(Status.FAILED_PHONE); + } + } else { + return Result.buildR(Status.FAIL); + } + } catch (Exception e) { + return Result.buildR(Status.FAIL); + } + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dao/UserActionMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/UserActionMapper.java new file mode 100644 index 0000000..5647343 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/UserActionMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.system.dto.StaffInfoDto; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.model.Dict; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +public interface UserActionMapper extends BaseMapper { + List getList(); + + void userRegister(@Param("userDto") UserDto userDto); + + UserDto getUserInfo(@Param("userDto") UserDto userDto); + + StaffInfoDto getStaffInfo(@Param("userDto") UserDto userDto); + + void retrievePassword(@Param("id")String id, @Param("salt")String salt, @Param("password")String password); + + void setUserOpenId(@Param("userDto")UserDto user); + + void userEmpowerment(@Param("id")String id,@Param("userId")String userId,@Param("updateTime")String updateTime); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/StaffInfoDto.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/StaffInfoDto.java new file mode 100644 index 0000000..16f8088 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/StaffInfoDto.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +@Data +public class StaffInfoDto { + private String id;// + private String staffCode;//工号 + private String staffName;//姓名 + private String staffGender;//性别 + private String staffPhone;//手机号 + private String createTime;// + private String updateTime;// +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/UserDto.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/UserDto.java new file mode 100644 index 0000000..2cc75d4 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/UserDto.java @@ -0,0 +1,40 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class UserDto { + private String id;//主键id + private String avatar;//头像 + private String account;//账号 + private String password;//密码 + private String salt;//md5密码盐 + private String name;//名字 + private String birthday;//生日 + private String sex;//性别 + private String email;//电子邮件 + private String phone;//电话 + private String roleId;//角色id(停用) + private String deptId;//部门ID + private String status;//状态 + private Integer version;//保留字段 + private String syncId;//原ID + private String syncName;//原名称 + private String syncPwd;//同步密码 + private String syncDeptid;//同步组织ID + private Integer isSync;//是否是同步数据 + private String loginIp;//登录限制IP + private String loginMac;//登录MAC地址 + private Double positionLng;//定位经度 + private Double positionLat;//定位纬度 + private String attr1;//预留字段 + private String lastTime;//登录时间 + private String createUser;//创建用户 + private String updateUser;//修改用户 + private String createTime;//创建时间 + private String updateTime;//修改时间 + private String delFlag;//删除状态 + private String tenantId;//租户ID +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java b/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java new file mode 100644 index 0000000..ae06f38 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.system.utils.Result; + +import java.util.HashMap; +import java.util.List; + +public interface UserActionService extends IService { + + List getUserType(); + + Result userRegister(UserDto userDto); + + Result retrievePassword(String id,String oldPwd,String newPwd); + + Result verifyUser(UserDto userDto); + + Result getUserInfo(String userName); + + Result userLogin(HashMap map); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/UserActionServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/UserActionServiceImpl.java new file mode 100644 index 0000000..1e49b17 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/UserActionServiceImpl.java @@ -0,0 +1,121 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.core.shiro.ShiroKit; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.UserActionMapper; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.system.service.UserActionService; +import com.casic.missiles.modular.system.utils.Result; +import com.casic.missiles.modular.system.utils.Status; +import com.casic.missiles.modular.system.utils.UuidUtils; +import com.casic.missiles.modular.system.utils.WXUserUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.text.SimpleDateFormat; +import java.util.*; + +@Service("UserActionService") +public class UserActionServiceImpl extends ServiceImpl implements UserActionService { + + @Resource + private UserActionMapper userActionDao; + + @Override + public Result userLogin(HashMap map) { + try { + UserDto userDto = new UserDto(); + userDto.setAttr1(WXUserUtils.getPhone(map.get("phoneCode").toString())); + UserDto user = userActionDao.getUserInfo(userDto); + if(null != user){ + JSONObject jsonObject = WXUserUtils.getOpenId(map.get("code").toString()); + user.setSyncId(jsonObject.get("openid").toString()); + userActionDao.setUserOpenId(user); + return Result.buildR(Status.LOGIN_SUCCEEDED,user); + }else{ + return Result.buildR(Status.USER_ALREADY_NOT_REGISTERED); + } + }catch (Exception e){ + e.printStackTrace(); + return Result.buildR(Status.FAIL); + } + } + + @Override + public Result userRegister(UserDto userDto) { + try { + SimpleDateFormat sim = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + userDto.setAttr1(userDto.getPhone()); + UserDto user = userActionDao.getUserInfo(userDto); + if(null == user){ + userDto.setAttr1(""); + UserDto userInfo = userActionDao.getUserInfo(userDto); + if(null != userInfo){ + userActionDao.userRegister(userDto); + userActionDao.userEmpowerment(UuidUtils.getId(),userInfo.getId(),sim.format(new Date())); + return Result.buildR(Status.OK); + }else { + return Result.buildR(Status.EMPLOYEE_NOT_EXIST); + } + }else{ + return Result.buildR(Status.USER_ALREADY_REGISTERED); + } + }catch (Exception e){ + e.printStackTrace(); + return Result.buildR(Status.FAIL); + } + } + + @Override + public Result retrievePassword(String id,String oldPwd,String newPwd) { + try { + String salt = ShiroKit.getRandomSalt(5); + String password = ShiroKit.md5(newPwd, salt); + userActionDao.retrievePassword(id,salt,password); + return Result.buildR(Status.OK); + }catch (Exception e){ + e.printStackTrace(); + return Result.buildR(Status.FAIL); + } + } + + @Override + public Result verifyUser(UserDto userDto) { + try { + UserDto user = userActionDao.getUserInfo(userDto); + if(null != user){ + if(user.getPhone().equals(userDto.getPhone())){ + return Result.buildR(Status.OK,user.getId()); + }else{ + return Result.buildR(Status.FAILED_PHONE); + } + }else{ + return Result.buildR(Status.FAILED_CERTIFICATION); + } + }catch (Exception e){ + e.printStackTrace(); + return Result.buildR(Status.FAIL); + } + } + + @Override + public Result getUserInfo(String userName) { + try { + UserDto userDto = new UserDto(); + userDto.setAccount(userName); + UserDto user = userActionDao.getUserInfo(userDto); + return Result.buildR(Status.OK,user); + }catch (Exception e){ + e.printStackTrace(); + return Result.buildR(Status.FAIL); + } + } + + + @Override + public List getUserType() { + return userActionDao.getList(); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/AESUtils.java b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/AESUtils.java new file mode 100644 index 0000000..6d5a99d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/AESUtils.java @@ -0,0 +1,48 @@ +package com.casic.missiles.modular.system.utils; + +import sun.misc.BASE64Decoder; + +import javax.crypto.Cipher; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; + + +public class AESUtils { + + + public static String decrypt(String encryptedData, String sessionKey, String iv, String encodingFormat) throws Exception { + + try { + + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + + BASE64Decoder base64Decoder = new BASE64Decoder(); + + byte[] _encryptedData = base64Decoder.decodeBuffer(encryptedData); + + byte[] _sessionKey = base64Decoder.decodeBuffer(sessionKey); + + byte[] _iv = base64Decoder.decodeBuffer(iv); + + SecretKeySpec secretKeySpec = new SecretKeySpec(_sessionKey, "AES"); + + IvParameterSpec ivParameterSpec = new IvParameterSpec(_iv); + + cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec); + + byte[] original = cipher.doFinal(_encryptedData); + + byte[] bytes = WxPKCS7Encoder.decode(original); + + String originalString = new String(bytes, encodingFormat); return originalString; + + } catch (Exception ex) { + + ex.printStackTrace(); + return null; + + } + + } + +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/HttpClientUtil.java b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/HttpClientUtil.java new file mode 100644 index 0000000..89d6d21 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/HttpClientUtil.java @@ -0,0 +1,185 @@ +package com.casic.missiles.modular.system.utils; + +import java.io.IOException; +import java.net.URI; +import java.util.*; + +import org.apache.http.HttpEntity; +import org.apache.http.NameValuePair; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.client.utils.URIBuilder; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.message.BasicNameValuePair; +import org.apache.http.util.EntityUtils; + +public class HttpClientUtil { + + public static String URLGet(String url,Map paramsMap){ + CloseableHttpClient httpclient = HttpClients.createDefault(); + String params = ""; + try { + if (paramsMap != null && !paramsMap.isEmpty()) { + StringBuffer str = new StringBuffer(); + Set set = paramsMap.keySet(); + Iterator iter = set.iterator(); + while (iter.hasNext()) { + String key = iter.next().toString(); + if (paramsMap.get(key) == null) { + continue; + } + str.append(key).append("=").append(paramsMap.get(key)).append("&"); + } + if (str.length() > 0) { + params = "?" + str.substring(0, str.length() - 1); + } + } + HttpGet httpget = new HttpGet(url+params); + System.out.println("executing request " + httpget.getURI()); + // 执行get请求. + CloseableHttpResponse response = httpclient.execute(httpget); + try { + // 获取响应实体 + HttpEntity entity = response.getEntity(); + if (entity != null) { + return EntityUtils.toString(entity); + } + } finally { + response.close(); + } + }catch (Exception e) { + e.printStackTrace(); + } finally { + // 关闭连接,释放资源 + try { + httpclient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return null; + } + + + public static String doGet(String url, Map param) { + + // 创建Httpclient对象 + CloseableHttpClient httpclient = HttpClients.createDefault(); + + String resultString = ""; + CloseableHttpResponse response = null; + try { + // 创建uri + URIBuilder builder = new URIBuilder(url); + if (param != null) { + for (String key : param.keySet()) { + builder.addParameter(key, param.get(key)); + } + } + URI uri = builder.build(); + + // 创建http GET请求 + HttpGet httpGet = new HttpGet(uri); + + // 执行请求 + response = httpclient.execute(httpGet); + // 判断返回状态是否为200 + if (response.getStatusLine().getStatusCode() == 200) { + resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (response != null) { + response.close(); + } + httpclient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return resultString; + } + + + public static String doGet(String url) { + return doGet(url, null); + } + + + public static String doPost(String url, Map param) { + // 创建Httpclient对象 + CloseableHttpClient httpClient = HttpClients.createDefault(); + CloseableHttpResponse response = null; + String resultString = ""; + try { + // 创建Http Post请求 + HttpPost httpPost = new HttpPost(url); + // 创建参数列表 + if (param != null) { + List paramList = new ArrayList<>(); + for (String key : param.keySet()) { + paramList.add(new BasicNameValuePair(key, param.get(key))); + } + // 模拟表单 + UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList, "utf-8"); + httpPost.setEntity(entity); + } + // 执行http请求 + response = httpClient.execute(httpPost); + resultString = EntityUtils.toString(response.getEntity(), "utf-8"); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + response.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + return resultString; + } + + + public static String doPost(String url) { + return doPost(url, null); + } + + + public static String doPostJson(String url, String json) { + // 创建Httpclient对象 + CloseableHttpClient httpClient = HttpClients.createDefault(); + CloseableHttpResponse response = null; + String resultString = ""; + try { + // 创建Http Post请求 + HttpPost httpPost = new HttpPost(url); + // 创建请求内容 + StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON); + httpPost.setEntity(entity); + // 执行http请求 + response = httpClient.execute(httpPost); + resultString = EntityUtils.toString(response.getEntity(), "utf-8"); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + response.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + return resultString; + } + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/Result.java b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/Result.java new file mode 100644 index 0000000..312c9fa --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/Result.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.utils; + +public class Result { + + private Integer status; + private String message; + private T data; + + public Integer getStatus() { + return status; + } + public String getMessage() { + return message; + } + public T getData() { + return data; + } + + private Result(Integer status,String message,T data){ + this.status=status; + this.message=message; + this.data=data; + } + private Result(Integer status,String message){ + this.status=status; + this.message=message; + } + private Result(String message){ + this.message=message; + } + + + public static Result buildR(Status status,String message,T data){ + return new Result(status.getCode(),message,data); + + } + + + public static Result buildR(Status status,String message,String type){ + return new Result(status.getCode(),message); + } + + public static Result buildR(Status status,T data){ + return new Result(status.getCode(),status.getMessage(),data); + } + + public static Result buildR(Status status){ + return new Result(status.getCode(),status.getMessage()); + } + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/Status.java b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/Status.java new file mode 100644 index 0000000..bdca50f --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/Status.java @@ -0,0 +1,33 @@ +package com.casic.missiles.modular.system.utils; + +public enum Status { + OK(200,"请求成功"), + FAIL(500,"请求失败"), + SYSTEM_ERROR(101,"系统异常"), + LOGIN_SUCCEEDED(200,"登录成功"), + EMPLOYEE_NOT_EXIST(2400,"员工号不存在"), + USER_ALREADY_REGISTERED(2500,"该账号已注册"), + USER_ALREADY_NOT_REGISTERED(2301,"您的账号未注册,请先注册"), + FAILED_CERTIFICATION(2300,"认证不通过"), + FAILED_PHONE(2302,"授权手机号不正确"), + EMPLOYEE_NAME_MISMATCH(2400,"员工号与姓名不匹配"); + private Integer code; + private String message; + Status(Integer code,String message){ + this.code=code; + this.message=message; + } + //只需要添加get方法就行 + public Integer getCode() { + return code; + } + public String getMessage() { + return message; + } + + @Override + public String toString() { + return code+":"+message; + } + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/UuidUtils.java b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/UuidUtils.java new file mode 100644 index 0000000..ebf9328 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/UuidUtils.java @@ -0,0 +1,22 @@ +package com.casic.missiles.modular.system.utils; + +import org.apache.commons.lang3.RandomUtils; + +import java.util.Date; +import java.util.UUID; + +public class UuidUtils { + + public static String randomUUID() { + return cn.hutool.core.lang.UUID.randomUUID().toString(); + } + + public static String getUUID(){ + return UUID.randomUUID().toString().replace("-",""); + } + + public static String getId(){ + int i = RandomUtils.nextInt(1000000, 10000000); + return new Date().getTime() + "" + i; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/WXUserUtils.java b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/WXUserUtils.java new file mode 100644 index 0000000..8e4ba75 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/WXUserUtils.java @@ -0,0 +1,119 @@ +package com.casic.missiles.modular.system.utils; + +import java.security.AlgorithmParameters; +import java.security.Key; +import java.util.HashMap; +import java.util.Map; + +import javax.crypto.Cipher; +import javax.crypto.KeyGenerator; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; +import com.alibaba.fastjson.JSONObject; +import org.springframework.stereotype.Component; + +@Component +public class WXUserUtils{ + + public static final String AES = "AES"; + public static final String AES_CBC_PADDING = "AES/CBC/PKCS5Padding"; + /** + * 获取 微信小程序用户 openId + * @param code + * @return + */ + public static JSONObject getOpenId(String code) { + Map params=new HashMap<>(); + params.put("appid", "wx899496f4295e554e"); + params.put("secret","1783357d9445f7135303b67b79ce9ca2"); + params.put("js_code", code); + params.put("grant_type","authorization_code"); + String result=HttpClientUtil.URLGet("https://api.weixin.qq.com/sns/jscode2session", params); + return JSONObject.parseObject(result); + } + + + + public static JSONObject getAccessToken() { + Map params=new HashMap<>(); + params.put("appid", "wx899496f4295e554e"); + params.put("secret","1783357d9445f7135303b67b79ce9ca2"); + params.put("grant_type","client_credential"); + String result=HttpClientUtil.URLGet("https://api.weixin.qq.com/cgi-bin/token", params); + + return JSONObject.parseObject(result); + + } + public static String getPhone(String code) { + JSONObject accessToken = getAccessToken(); + String token = accessToken.get("access_token").toString(); + String json = "{ \"code\": \""+code+"\" }"; + String url = "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=" + token + "&"; + String doPost = HttpClientUtil.doPostJson(url, json); + JSONObject jsonObject = JSONObject.parseObject(doPost); + Object phone_info = jsonObject.get("phone_info"); + JSONObject parse =JSONObject.parseObject(phone_info.toString()); + return parse.get("phoneNumber").toString(); + + } + + /** + * * 微信 数据解密
+ * * 对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充
+ * * 对称解密的目标密文:encrypted=Base64_Decode(encryptData)
+ * * 对称解密秘钥:key = Base64_Decode(session_key),aeskey是16字节
+ * * 对称解密算法初始向量:iv = Base64_Decode(iv),同样是16字节
+ * * + * * @param encrypted 目标密文 + * * @param session_key 会话ID + * * @param iv 加密算法的初始向量 + * + */ + public static String wxDecrypt(String encrypted, String session_key, String iv) { + String result = null; + byte[] encrypted64 = org.apache.commons.codec.binary.Base64.decodeBase64(encrypted); + byte[] key64 = org.apache.commons.codec.binary.Base64.decodeBase64(session_key); + byte[] iv64 = org.apache.commons.codec.binary.Base64.decodeBase64(iv); + try { + init(); + result = new String(decrypt(encrypted64, key64, generateIV(iv64))); + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } + /** + * * 初始化密钥 + * + */ + + public static void init() throws Exception { + //Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); + KeyGenerator.getInstance(AES).init(128); + } + + /** + * * 生成iv + * + */ + public static AlgorithmParameters generateIV(byte[] iv) throws Exception { + // iv 为一个 16 字节的数组,这里采用和 iOS 端一样的构造方法,数据全为0 + // Arrays.fill(iv, (byte) 0x00); + AlgorithmParameters params = AlgorithmParameters.getInstance(AES); + params.init(new IvParameterSpec(iv)); + return params; + } + + /** + * * 生成解密 + * + */ + public static byte[] decrypt(byte[] encryptedData, byte[] keyBytes, AlgorithmParameters iv) + throws Exception { + Key key = new SecretKeySpec(keyBytes, AES); + Cipher cipher = Cipher.getInstance(AES_CBC_PADDING); + // 设置为解密模式 + cipher.init(Cipher.DECRYPT_MODE, key, iv); + return cipher.doFinal(encryptedData); + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/WxPKCS7Encoder.java b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/WxPKCS7Encoder.java new file mode 100644 index 0000000..bcef87c --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/WxPKCS7Encoder.java @@ -0,0 +1,61 @@ +package com.casic.missiles.modular.system.utils; + +import java.nio.charset.Charset; +import java.util.Arrays; + +public class WxPKCS7Encoder { + + + static Charset CHARSET = Charset.forName("utf-8"); + + static int BLOCK_SIZE = 32; + + /** + * 获得对明文进行补位填充的字节. + * + * @param count 需要进行填充补位操作的明文字节个数 + * @return 补齐用的字节数组 + */ + static byte[] encode(int count) { + // 计算需要填充的位数 + int amountToPad = BLOCK_SIZE - (count % BLOCK_SIZE); + if (amountToPad == 0) { + amountToPad = BLOCK_SIZE; + } + // 获得补位所用的字符 + char padChr = chr(amountToPad); + String tmp = new String(); + for (int index = 0; index < amountToPad; index++) { + tmp += padChr; + } + return tmp.getBytes(CHARSET); + } + + /** + * 删除解密后明文的补位字符 + * + * @param decrypted 解密后的明文 + * @return 删除补位字符后的明文 + */ + static byte[] decode(byte[] decrypted) { + int pad = (int) decrypted[decrypted.length - 1]; + if (pad < 1 || pad > 32) { + pad = 0; + } + return Arrays.copyOfRange(decrypted, 0, decrypted.length - pad); + } + + /** + * 将数字转化成ASCII码对应的字符,用于对明文进行补码 + * + * @param a 需要转化的数字 + * @return 转化得到的字符 + */ + static char chr(int a) { + + byte target = (byte) (a & 0xFF); + + return (char) target; + + } +} \ No newline at end of file diff --git a/casic-web/src/main/java/com/casic/missiles/CasicApplication.java b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java index 739eb99..3422629 100644 --- a/casic-web/src/main/java/com/casic/missiles/CasicApplication.java +++ b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java @@ -1,6 +1,7 @@ package com.casic.missiles; import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; @@ -19,6 +20,7 @@ @EnableTransactionManagement(proxyTargetClass = true) @EnableAsync @Slf4j +@MapperScan("com.casic.missiles.modular.system.dao") public class CasicApplication { public static void main(String[] args) { SpringApplication.run(CasicApplication.class, args); diff --git a/casic-server/pom.xml b/casic-server/pom.xml index cd24fd8..6ff78b8 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -35,6 +35,41 @@ ${boot.version} provided + + com.casic + casic-admin-core + 2.0.0.alpha + compile + + + org.apache.httpcomponents + httpcore + 4.0.1 + + + org.apache.httpcomponents + httpclient + 4.0.2 + + + org.apache.httpcomponents + httpclient + + + com.dameng + DmJdbcDriver18 + 1.8 + compile + + + org.testcontainers + testcontainers + 1.15.1 + + + org.apache.httpcomponents + httpcore + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java index a7381d1..4ef1109 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java @@ -1,32 +1,83 @@ package com.casic.missiles.modular.system.controller; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.system.service.UserActionService; +import com.casic.missiles.modular.system.utils.*; +import dm.jdbc.util.StringUtil; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.List; + /** * @Description: 小程序用户 * @Author: wangpeng * @Date: 2022/11/8 14:39 */ +@Controller +@RequestMapping("user") public class UserController { + @Resource + private UserActionService userActionService; + /** * 注册 */ + @RequestMapping("userLogin") + @ResponseBody + public Result userLogin(@RequestBody HashMap map){ + return userActionService.userLogin(map); + } /** - * 登录 + * 注册 */ - + @RequestMapping("userRegister") + @ResponseBody + public Result userRegister(@RequestBody UserDto userDto){ + return userActionService.userRegister(userDto); + } /** - * 验证用户信息 + * 获取员工类型 */ - + @RequestMapping("getUserType") + @ResponseBody + public List getUserType(){ + return userActionService.getUserType(); + } + /** + * 校验用户 + */ + @RequestMapping("verifyUser") + @ResponseBody + public Result verifyUser(@RequestBody UserDto userDto){ + return userActionService.verifyUser(userDto); + } /** * 找回密码 */ - + @RequestMapping("retrievePassword") + @ResponseBody + public Result retrievePassword(String id,String oldPwd,String newPwd){ + return userActionService.retrievePassword(id,oldPwd,newPwd); + } /** * 用户信息 */ - + @RequestMapping("getUserInfo") + @ResponseBody + public Result getUserInfo(String userName){ + return userActionService.getUserInfo(userName); + } /** * 修改照片 */ @@ -38,4 +89,46 @@ /** * 员工导入 */ + /** + * 获取微信openid,sessionkey等信息 + */ + @RequestMapping("getOther") + @ResponseBody + public Object getWxOpenidInfo(@RequestParam String code) { + if (StringUtil.isEmpty(code)) { + return null; + } + JSONObject jsonObject = WXUserUtils.getOpenId(code); + //JSONObject str = WXUserUtils.getAccessToken(); + //JSONObject phone = WXUserUtils.getPhone(code,str.get("access_token").toString()); + //System.out.println("token:"+str); + //System.out.println("phone:"+phone); + return Result.buildR(Status.OK,jsonObject); + } + /** + * 获取微信手机号 + */ + @RequestMapping("/phone") + @ResponseBody + public Object authPhone(String encryptedData, String session_key, String iv) { + try { + //String decrypt = AESUtils.decrypt(encryptedData, session_key, iv, "UTF-8"); + //System.out.println(decrypt); + // String result = WXUserUtils.wxDecrypt(encryptedData, session_key, iv); + String result = ""; + JSONObject json = JSONObject.parseObject(result); + if (json.containsKey("phoneNumber")) { + String phone = json.getString("phoneNumber"); + if (StringUtils.isNoneBlank(phone)) { + return Result.buildR(Status.OK,json); + } else { + return Result.buildR(Status.FAILED_PHONE); + } + } else { + return Result.buildR(Status.FAIL); + } + } catch (Exception e) { + return Result.buildR(Status.FAIL); + } + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dao/UserActionMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/UserActionMapper.java new file mode 100644 index 0000000..5647343 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/UserActionMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.system.dto.StaffInfoDto; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.model.Dict; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +public interface UserActionMapper extends BaseMapper { + List getList(); + + void userRegister(@Param("userDto") UserDto userDto); + + UserDto getUserInfo(@Param("userDto") UserDto userDto); + + StaffInfoDto getStaffInfo(@Param("userDto") UserDto userDto); + + void retrievePassword(@Param("id")String id, @Param("salt")String salt, @Param("password")String password); + + void setUserOpenId(@Param("userDto")UserDto user); + + void userEmpowerment(@Param("id")String id,@Param("userId")String userId,@Param("updateTime")String updateTime); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/StaffInfoDto.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/StaffInfoDto.java new file mode 100644 index 0000000..16f8088 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/StaffInfoDto.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +@Data +public class StaffInfoDto { + private String id;// + private String staffCode;//工号 + private String staffName;//姓名 + private String staffGender;//性别 + private String staffPhone;//手机号 + private String createTime;// + private String updateTime;// +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/UserDto.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/UserDto.java new file mode 100644 index 0000000..2cc75d4 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/UserDto.java @@ -0,0 +1,40 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class UserDto { + private String id;//主键id + private String avatar;//头像 + private String account;//账号 + private String password;//密码 + private String salt;//md5密码盐 + private String name;//名字 + private String birthday;//生日 + private String sex;//性别 + private String email;//电子邮件 + private String phone;//电话 + private String roleId;//角色id(停用) + private String deptId;//部门ID + private String status;//状态 + private Integer version;//保留字段 + private String syncId;//原ID + private String syncName;//原名称 + private String syncPwd;//同步密码 + private String syncDeptid;//同步组织ID + private Integer isSync;//是否是同步数据 + private String loginIp;//登录限制IP + private String loginMac;//登录MAC地址 + private Double positionLng;//定位经度 + private Double positionLat;//定位纬度 + private String attr1;//预留字段 + private String lastTime;//登录时间 + private String createUser;//创建用户 + private String updateUser;//修改用户 + private String createTime;//创建时间 + private String updateTime;//修改时间 + private String delFlag;//删除状态 + private String tenantId;//租户ID +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java b/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java new file mode 100644 index 0000000..ae06f38 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.system.utils.Result; + +import java.util.HashMap; +import java.util.List; + +public interface UserActionService extends IService { + + List getUserType(); + + Result userRegister(UserDto userDto); + + Result retrievePassword(String id,String oldPwd,String newPwd); + + Result verifyUser(UserDto userDto); + + Result getUserInfo(String userName); + + Result userLogin(HashMap map); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/UserActionServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/UserActionServiceImpl.java new file mode 100644 index 0000000..1e49b17 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/UserActionServiceImpl.java @@ -0,0 +1,121 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.core.shiro.ShiroKit; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.UserActionMapper; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.system.service.UserActionService; +import com.casic.missiles.modular.system.utils.Result; +import com.casic.missiles.modular.system.utils.Status; +import com.casic.missiles.modular.system.utils.UuidUtils; +import com.casic.missiles.modular.system.utils.WXUserUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.text.SimpleDateFormat; +import java.util.*; + +@Service("UserActionService") +public class UserActionServiceImpl extends ServiceImpl implements UserActionService { + + @Resource + private UserActionMapper userActionDao; + + @Override + public Result userLogin(HashMap map) { + try { + UserDto userDto = new UserDto(); + userDto.setAttr1(WXUserUtils.getPhone(map.get("phoneCode").toString())); + UserDto user = userActionDao.getUserInfo(userDto); + if(null != user){ + JSONObject jsonObject = WXUserUtils.getOpenId(map.get("code").toString()); + user.setSyncId(jsonObject.get("openid").toString()); + userActionDao.setUserOpenId(user); + return Result.buildR(Status.LOGIN_SUCCEEDED,user); + }else{ + return Result.buildR(Status.USER_ALREADY_NOT_REGISTERED); + } + }catch (Exception e){ + e.printStackTrace(); + return Result.buildR(Status.FAIL); + } + } + + @Override + public Result userRegister(UserDto userDto) { + try { + SimpleDateFormat sim = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + userDto.setAttr1(userDto.getPhone()); + UserDto user = userActionDao.getUserInfo(userDto); + if(null == user){ + userDto.setAttr1(""); + UserDto userInfo = userActionDao.getUserInfo(userDto); + if(null != userInfo){ + userActionDao.userRegister(userDto); + userActionDao.userEmpowerment(UuidUtils.getId(),userInfo.getId(),sim.format(new Date())); + return Result.buildR(Status.OK); + }else { + return Result.buildR(Status.EMPLOYEE_NOT_EXIST); + } + }else{ + return Result.buildR(Status.USER_ALREADY_REGISTERED); + } + }catch (Exception e){ + e.printStackTrace(); + return Result.buildR(Status.FAIL); + } + } + + @Override + public Result retrievePassword(String id,String oldPwd,String newPwd) { + try { + String salt = ShiroKit.getRandomSalt(5); + String password = ShiroKit.md5(newPwd, salt); + userActionDao.retrievePassword(id,salt,password); + return Result.buildR(Status.OK); + }catch (Exception e){ + e.printStackTrace(); + return Result.buildR(Status.FAIL); + } + } + + @Override + public Result verifyUser(UserDto userDto) { + try { + UserDto user = userActionDao.getUserInfo(userDto); + if(null != user){ + if(user.getPhone().equals(userDto.getPhone())){ + return Result.buildR(Status.OK,user.getId()); + }else{ + return Result.buildR(Status.FAILED_PHONE); + } + }else{ + return Result.buildR(Status.FAILED_CERTIFICATION); + } + }catch (Exception e){ + e.printStackTrace(); + return Result.buildR(Status.FAIL); + } + } + + @Override + public Result getUserInfo(String userName) { + try { + UserDto userDto = new UserDto(); + userDto.setAccount(userName); + UserDto user = userActionDao.getUserInfo(userDto); + return Result.buildR(Status.OK,user); + }catch (Exception e){ + e.printStackTrace(); + return Result.buildR(Status.FAIL); + } + } + + + @Override + public List getUserType() { + return userActionDao.getList(); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/AESUtils.java b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/AESUtils.java new file mode 100644 index 0000000..6d5a99d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/AESUtils.java @@ -0,0 +1,48 @@ +package com.casic.missiles.modular.system.utils; + +import sun.misc.BASE64Decoder; + +import javax.crypto.Cipher; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; + + +public class AESUtils { + + + public static String decrypt(String encryptedData, String sessionKey, String iv, String encodingFormat) throws Exception { + + try { + + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + + BASE64Decoder base64Decoder = new BASE64Decoder(); + + byte[] _encryptedData = base64Decoder.decodeBuffer(encryptedData); + + byte[] _sessionKey = base64Decoder.decodeBuffer(sessionKey); + + byte[] _iv = base64Decoder.decodeBuffer(iv); + + SecretKeySpec secretKeySpec = new SecretKeySpec(_sessionKey, "AES"); + + IvParameterSpec ivParameterSpec = new IvParameterSpec(_iv); + + cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec); + + byte[] original = cipher.doFinal(_encryptedData); + + byte[] bytes = WxPKCS7Encoder.decode(original); + + String originalString = new String(bytes, encodingFormat); return originalString; + + } catch (Exception ex) { + + ex.printStackTrace(); + return null; + + } + + } + +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/HttpClientUtil.java b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/HttpClientUtil.java new file mode 100644 index 0000000..89d6d21 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/HttpClientUtil.java @@ -0,0 +1,185 @@ +package com.casic.missiles.modular.system.utils; + +import java.io.IOException; +import java.net.URI; +import java.util.*; + +import org.apache.http.HttpEntity; +import org.apache.http.NameValuePair; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.client.utils.URIBuilder; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.message.BasicNameValuePair; +import org.apache.http.util.EntityUtils; + +public class HttpClientUtil { + + public static String URLGet(String url,Map paramsMap){ + CloseableHttpClient httpclient = HttpClients.createDefault(); + String params = ""; + try { + if (paramsMap != null && !paramsMap.isEmpty()) { + StringBuffer str = new StringBuffer(); + Set set = paramsMap.keySet(); + Iterator iter = set.iterator(); + while (iter.hasNext()) { + String key = iter.next().toString(); + if (paramsMap.get(key) == null) { + continue; + } + str.append(key).append("=").append(paramsMap.get(key)).append("&"); + } + if (str.length() > 0) { + params = "?" + str.substring(0, str.length() - 1); + } + } + HttpGet httpget = new HttpGet(url+params); + System.out.println("executing request " + httpget.getURI()); + // 执行get请求. + CloseableHttpResponse response = httpclient.execute(httpget); + try { + // 获取响应实体 + HttpEntity entity = response.getEntity(); + if (entity != null) { + return EntityUtils.toString(entity); + } + } finally { + response.close(); + } + }catch (Exception e) { + e.printStackTrace(); + } finally { + // 关闭连接,释放资源 + try { + httpclient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return null; + } + + + public static String doGet(String url, Map param) { + + // 创建Httpclient对象 + CloseableHttpClient httpclient = HttpClients.createDefault(); + + String resultString = ""; + CloseableHttpResponse response = null; + try { + // 创建uri + URIBuilder builder = new URIBuilder(url); + if (param != null) { + for (String key : param.keySet()) { + builder.addParameter(key, param.get(key)); + } + } + URI uri = builder.build(); + + // 创建http GET请求 + HttpGet httpGet = new HttpGet(uri); + + // 执行请求 + response = httpclient.execute(httpGet); + // 判断返回状态是否为200 + if (response.getStatusLine().getStatusCode() == 200) { + resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (response != null) { + response.close(); + } + httpclient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return resultString; + } + + + public static String doGet(String url) { + return doGet(url, null); + } + + + public static String doPost(String url, Map param) { + // 创建Httpclient对象 + CloseableHttpClient httpClient = HttpClients.createDefault(); + CloseableHttpResponse response = null; + String resultString = ""; + try { + // 创建Http Post请求 + HttpPost httpPost = new HttpPost(url); + // 创建参数列表 + if (param != null) { + List paramList = new ArrayList<>(); + for (String key : param.keySet()) { + paramList.add(new BasicNameValuePair(key, param.get(key))); + } + // 模拟表单 + UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList, "utf-8"); + httpPost.setEntity(entity); + } + // 执行http请求 + response = httpClient.execute(httpPost); + resultString = EntityUtils.toString(response.getEntity(), "utf-8"); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + response.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + return resultString; + } + + + public static String doPost(String url) { + return doPost(url, null); + } + + + public static String doPostJson(String url, String json) { + // 创建Httpclient对象 + CloseableHttpClient httpClient = HttpClients.createDefault(); + CloseableHttpResponse response = null; + String resultString = ""; + try { + // 创建Http Post请求 + HttpPost httpPost = new HttpPost(url); + // 创建请求内容 + StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON); + httpPost.setEntity(entity); + // 执行http请求 + response = httpClient.execute(httpPost); + resultString = EntityUtils.toString(response.getEntity(), "utf-8"); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + response.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + return resultString; + } + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/Result.java b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/Result.java new file mode 100644 index 0000000..312c9fa --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/Result.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.utils; + +public class Result { + + private Integer status; + private String message; + private T data; + + public Integer getStatus() { + return status; + } + public String getMessage() { + return message; + } + public T getData() { + return data; + } + + private Result(Integer status,String message,T data){ + this.status=status; + this.message=message; + this.data=data; + } + private Result(Integer status,String message){ + this.status=status; + this.message=message; + } + private Result(String message){ + this.message=message; + } + + + public static Result buildR(Status status,String message,T data){ + return new Result(status.getCode(),message,data); + + } + + + public static Result buildR(Status status,String message,String type){ + return new Result(status.getCode(),message); + } + + public static Result buildR(Status status,T data){ + return new Result(status.getCode(),status.getMessage(),data); + } + + public static Result buildR(Status status){ + return new Result(status.getCode(),status.getMessage()); + } + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/Status.java b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/Status.java new file mode 100644 index 0000000..bdca50f --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/Status.java @@ -0,0 +1,33 @@ +package com.casic.missiles.modular.system.utils; + +public enum Status { + OK(200,"请求成功"), + FAIL(500,"请求失败"), + SYSTEM_ERROR(101,"系统异常"), + LOGIN_SUCCEEDED(200,"登录成功"), + EMPLOYEE_NOT_EXIST(2400,"员工号不存在"), + USER_ALREADY_REGISTERED(2500,"该账号已注册"), + USER_ALREADY_NOT_REGISTERED(2301,"您的账号未注册,请先注册"), + FAILED_CERTIFICATION(2300,"认证不通过"), + FAILED_PHONE(2302,"授权手机号不正确"), + EMPLOYEE_NAME_MISMATCH(2400,"员工号与姓名不匹配"); + private Integer code; + private String message; + Status(Integer code,String message){ + this.code=code; + this.message=message; + } + //只需要添加get方法就行 + public Integer getCode() { + return code; + } + public String getMessage() { + return message; + } + + @Override + public String toString() { + return code+":"+message; + } + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/UuidUtils.java b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/UuidUtils.java new file mode 100644 index 0000000..ebf9328 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/UuidUtils.java @@ -0,0 +1,22 @@ +package com.casic.missiles.modular.system.utils; + +import org.apache.commons.lang3.RandomUtils; + +import java.util.Date; +import java.util.UUID; + +public class UuidUtils { + + public static String randomUUID() { + return cn.hutool.core.lang.UUID.randomUUID().toString(); + } + + public static String getUUID(){ + return UUID.randomUUID().toString().replace("-",""); + } + + public static String getId(){ + int i = RandomUtils.nextInt(1000000, 10000000); + return new Date().getTime() + "" + i; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/WXUserUtils.java b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/WXUserUtils.java new file mode 100644 index 0000000..8e4ba75 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/WXUserUtils.java @@ -0,0 +1,119 @@ +package com.casic.missiles.modular.system.utils; + +import java.security.AlgorithmParameters; +import java.security.Key; +import java.util.HashMap; +import java.util.Map; + +import javax.crypto.Cipher; +import javax.crypto.KeyGenerator; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; +import com.alibaba.fastjson.JSONObject; +import org.springframework.stereotype.Component; + +@Component +public class WXUserUtils{ + + public static final String AES = "AES"; + public static final String AES_CBC_PADDING = "AES/CBC/PKCS5Padding"; + /** + * 获取 微信小程序用户 openId + * @param code + * @return + */ + public static JSONObject getOpenId(String code) { + Map params=new HashMap<>(); + params.put("appid", "wx899496f4295e554e"); + params.put("secret","1783357d9445f7135303b67b79ce9ca2"); + params.put("js_code", code); + params.put("grant_type","authorization_code"); + String result=HttpClientUtil.URLGet("https://api.weixin.qq.com/sns/jscode2session", params); + return JSONObject.parseObject(result); + } + + + + public static JSONObject getAccessToken() { + Map params=new HashMap<>(); + params.put("appid", "wx899496f4295e554e"); + params.put("secret","1783357d9445f7135303b67b79ce9ca2"); + params.put("grant_type","client_credential"); + String result=HttpClientUtil.URLGet("https://api.weixin.qq.com/cgi-bin/token", params); + + return JSONObject.parseObject(result); + + } + public static String getPhone(String code) { + JSONObject accessToken = getAccessToken(); + String token = accessToken.get("access_token").toString(); + String json = "{ \"code\": \""+code+"\" }"; + String url = "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=" + token + "&"; + String doPost = HttpClientUtil.doPostJson(url, json); + JSONObject jsonObject = JSONObject.parseObject(doPost); + Object phone_info = jsonObject.get("phone_info"); + JSONObject parse =JSONObject.parseObject(phone_info.toString()); + return parse.get("phoneNumber").toString(); + + } + + /** + * * 微信 数据解密
+ * * 对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充
+ * * 对称解密的目标密文:encrypted=Base64_Decode(encryptData)
+ * * 对称解密秘钥:key = Base64_Decode(session_key),aeskey是16字节
+ * * 对称解密算法初始向量:iv = Base64_Decode(iv),同样是16字节
+ * * + * * @param encrypted 目标密文 + * * @param session_key 会话ID + * * @param iv 加密算法的初始向量 + * + */ + public static String wxDecrypt(String encrypted, String session_key, String iv) { + String result = null; + byte[] encrypted64 = org.apache.commons.codec.binary.Base64.decodeBase64(encrypted); + byte[] key64 = org.apache.commons.codec.binary.Base64.decodeBase64(session_key); + byte[] iv64 = org.apache.commons.codec.binary.Base64.decodeBase64(iv); + try { + init(); + result = new String(decrypt(encrypted64, key64, generateIV(iv64))); + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } + /** + * * 初始化密钥 + * + */ + + public static void init() throws Exception { + //Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); + KeyGenerator.getInstance(AES).init(128); + } + + /** + * * 生成iv + * + */ + public static AlgorithmParameters generateIV(byte[] iv) throws Exception { + // iv 为一个 16 字节的数组,这里采用和 iOS 端一样的构造方法,数据全为0 + // Arrays.fill(iv, (byte) 0x00); + AlgorithmParameters params = AlgorithmParameters.getInstance(AES); + params.init(new IvParameterSpec(iv)); + return params; + } + + /** + * * 生成解密 + * + */ + public static byte[] decrypt(byte[] encryptedData, byte[] keyBytes, AlgorithmParameters iv) + throws Exception { + Key key = new SecretKeySpec(keyBytes, AES); + Cipher cipher = Cipher.getInstance(AES_CBC_PADDING); + // 设置为解密模式 + cipher.init(Cipher.DECRYPT_MODE, key, iv); + return cipher.doFinal(encryptedData); + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/WxPKCS7Encoder.java b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/WxPKCS7Encoder.java new file mode 100644 index 0000000..bcef87c --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/WxPKCS7Encoder.java @@ -0,0 +1,61 @@ +package com.casic.missiles.modular.system.utils; + +import java.nio.charset.Charset; +import java.util.Arrays; + +public class WxPKCS7Encoder { + + + static Charset CHARSET = Charset.forName("utf-8"); + + static int BLOCK_SIZE = 32; + + /** + * 获得对明文进行补位填充的字节. + * + * @param count 需要进行填充补位操作的明文字节个数 + * @return 补齐用的字节数组 + */ + static byte[] encode(int count) { + // 计算需要填充的位数 + int amountToPad = BLOCK_SIZE - (count % BLOCK_SIZE); + if (amountToPad == 0) { + amountToPad = BLOCK_SIZE; + } + // 获得补位所用的字符 + char padChr = chr(amountToPad); + String tmp = new String(); + for (int index = 0; index < amountToPad; index++) { + tmp += padChr; + } + return tmp.getBytes(CHARSET); + } + + /** + * 删除解密后明文的补位字符 + * + * @param decrypted 解密后的明文 + * @return 删除补位字符后的明文 + */ + static byte[] decode(byte[] decrypted) { + int pad = (int) decrypted[decrypted.length - 1]; + if (pad < 1 || pad > 32) { + pad = 0; + } + return Arrays.copyOfRange(decrypted, 0, decrypted.length - pad); + } + + /** + * 将数字转化成ASCII码对应的字符,用于对明文进行补码 + * + * @param a 需要转化的数字 + * @return 转化得到的字符 + */ + static char chr(int a) { + + byte target = (byte) (a & 0xFF); + + return (char) target; + + } +} \ No newline at end of file diff --git a/casic-web/src/main/java/com/casic/missiles/CasicApplication.java b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java index 739eb99..3422629 100644 --- a/casic-web/src/main/java/com/casic/missiles/CasicApplication.java +++ b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java @@ -1,6 +1,7 @@ package com.casic.missiles; import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; @@ -19,6 +20,7 @@ @EnableTransactionManagement(proxyTargetClass = true) @EnableAsync @Slf4j +@MapperScan("com.casic.missiles.modular.system.dao") public class CasicApplication { public static void main(String[] args) { SpringApplication.run(CasicApplication.class, args); diff --git a/casic-web/src/main/resources/config/application-dev.yml b/casic-web/src/main/resources/config/application-dev.yml index e937cb1..4eb60d0 100644 --- a/casic-web/src/main/resources/config/application-dev.yml +++ b/casic-web/src/main/resources/config/application-dev.yml @@ -12,7 +12,7 @@ casic: kaptcha-open: false #是否开启登录时验证码 (true/false) - no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/user/* #flowable数据源和多数据源配置 db: init: diff --git a/casic-server/pom.xml b/casic-server/pom.xml index cd24fd8..6ff78b8 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -35,6 +35,41 @@ ${boot.version} provided + + com.casic + casic-admin-core + 2.0.0.alpha + compile + + + org.apache.httpcomponents + httpcore + 4.0.1 + + + org.apache.httpcomponents + httpclient + 4.0.2 + + + org.apache.httpcomponents + httpclient + + + com.dameng + DmJdbcDriver18 + 1.8 + compile + + + org.testcontainers + testcontainers + 1.15.1 + + + org.apache.httpcomponents + httpcore + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java index a7381d1..4ef1109 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java @@ -1,32 +1,83 @@ package com.casic.missiles.modular.system.controller; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.system.service.UserActionService; +import com.casic.missiles.modular.system.utils.*; +import dm.jdbc.util.StringUtil; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.List; + /** * @Description: 小程序用户 * @Author: wangpeng * @Date: 2022/11/8 14:39 */ +@Controller +@RequestMapping("user") public class UserController { + @Resource + private UserActionService userActionService; + /** * 注册 */ + @RequestMapping("userLogin") + @ResponseBody + public Result userLogin(@RequestBody HashMap map){ + return userActionService.userLogin(map); + } /** - * 登录 + * 注册 */ - + @RequestMapping("userRegister") + @ResponseBody + public Result userRegister(@RequestBody UserDto userDto){ + return userActionService.userRegister(userDto); + } /** - * 验证用户信息 + * 获取员工类型 */ - + @RequestMapping("getUserType") + @ResponseBody + public List getUserType(){ + return userActionService.getUserType(); + } + /** + * 校验用户 + */ + @RequestMapping("verifyUser") + @ResponseBody + public Result verifyUser(@RequestBody UserDto userDto){ + return userActionService.verifyUser(userDto); + } /** * 找回密码 */ - + @RequestMapping("retrievePassword") + @ResponseBody + public Result retrievePassword(String id,String oldPwd,String newPwd){ + return userActionService.retrievePassword(id,oldPwd,newPwd); + } /** * 用户信息 */ - + @RequestMapping("getUserInfo") + @ResponseBody + public Result getUserInfo(String userName){ + return userActionService.getUserInfo(userName); + } /** * 修改照片 */ @@ -38,4 +89,46 @@ /** * 员工导入 */ + /** + * 获取微信openid,sessionkey等信息 + */ + @RequestMapping("getOther") + @ResponseBody + public Object getWxOpenidInfo(@RequestParam String code) { + if (StringUtil.isEmpty(code)) { + return null; + } + JSONObject jsonObject = WXUserUtils.getOpenId(code); + //JSONObject str = WXUserUtils.getAccessToken(); + //JSONObject phone = WXUserUtils.getPhone(code,str.get("access_token").toString()); + //System.out.println("token:"+str); + //System.out.println("phone:"+phone); + return Result.buildR(Status.OK,jsonObject); + } + /** + * 获取微信手机号 + */ + @RequestMapping("/phone") + @ResponseBody + public Object authPhone(String encryptedData, String session_key, String iv) { + try { + //String decrypt = AESUtils.decrypt(encryptedData, session_key, iv, "UTF-8"); + //System.out.println(decrypt); + // String result = WXUserUtils.wxDecrypt(encryptedData, session_key, iv); + String result = ""; + JSONObject json = JSONObject.parseObject(result); + if (json.containsKey("phoneNumber")) { + String phone = json.getString("phoneNumber"); + if (StringUtils.isNoneBlank(phone)) { + return Result.buildR(Status.OK,json); + } else { + return Result.buildR(Status.FAILED_PHONE); + } + } else { + return Result.buildR(Status.FAIL); + } + } catch (Exception e) { + return Result.buildR(Status.FAIL); + } + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dao/UserActionMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/UserActionMapper.java new file mode 100644 index 0000000..5647343 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/UserActionMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.system.dto.StaffInfoDto; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.model.Dict; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +public interface UserActionMapper extends BaseMapper { + List getList(); + + void userRegister(@Param("userDto") UserDto userDto); + + UserDto getUserInfo(@Param("userDto") UserDto userDto); + + StaffInfoDto getStaffInfo(@Param("userDto") UserDto userDto); + + void retrievePassword(@Param("id")String id, @Param("salt")String salt, @Param("password")String password); + + void setUserOpenId(@Param("userDto")UserDto user); + + void userEmpowerment(@Param("id")String id,@Param("userId")String userId,@Param("updateTime")String updateTime); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/StaffInfoDto.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/StaffInfoDto.java new file mode 100644 index 0000000..16f8088 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/StaffInfoDto.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +@Data +public class StaffInfoDto { + private String id;// + private String staffCode;//工号 + private String staffName;//姓名 + private String staffGender;//性别 + private String staffPhone;//手机号 + private String createTime;// + private String updateTime;// +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/UserDto.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/UserDto.java new file mode 100644 index 0000000..2cc75d4 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/UserDto.java @@ -0,0 +1,40 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class UserDto { + private String id;//主键id + private String avatar;//头像 + private String account;//账号 + private String password;//密码 + private String salt;//md5密码盐 + private String name;//名字 + private String birthday;//生日 + private String sex;//性别 + private String email;//电子邮件 + private String phone;//电话 + private String roleId;//角色id(停用) + private String deptId;//部门ID + private String status;//状态 + private Integer version;//保留字段 + private String syncId;//原ID + private String syncName;//原名称 + private String syncPwd;//同步密码 + private String syncDeptid;//同步组织ID + private Integer isSync;//是否是同步数据 + private String loginIp;//登录限制IP + private String loginMac;//登录MAC地址 + private Double positionLng;//定位经度 + private Double positionLat;//定位纬度 + private String attr1;//预留字段 + private String lastTime;//登录时间 + private String createUser;//创建用户 + private String updateUser;//修改用户 + private String createTime;//创建时间 + private String updateTime;//修改时间 + private String delFlag;//删除状态 + private String tenantId;//租户ID +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java b/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java new file mode 100644 index 0000000..ae06f38 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.system.utils.Result; + +import java.util.HashMap; +import java.util.List; + +public interface UserActionService extends IService { + + List getUserType(); + + Result userRegister(UserDto userDto); + + Result retrievePassword(String id,String oldPwd,String newPwd); + + Result verifyUser(UserDto userDto); + + Result getUserInfo(String userName); + + Result userLogin(HashMap map); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/UserActionServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/UserActionServiceImpl.java new file mode 100644 index 0000000..1e49b17 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/UserActionServiceImpl.java @@ -0,0 +1,121 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.core.shiro.ShiroKit; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.UserActionMapper; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.system.service.UserActionService; +import com.casic.missiles.modular.system.utils.Result; +import com.casic.missiles.modular.system.utils.Status; +import com.casic.missiles.modular.system.utils.UuidUtils; +import com.casic.missiles.modular.system.utils.WXUserUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.text.SimpleDateFormat; +import java.util.*; + +@Service("UserActionService") +public class UserActionServiceImpl extends ServiceImpl implements UserActionService { + + @Resource + private UserActionMapper userActionDao; + + @Override + public Result userLogin(HashMap map) { + try { + UserDto userDto = new UserDto(); + userDto.setAttr1(WXUserUtils.getPhone(map.get("phoneCode").toString())); + UserDto user = userActionDao.getUserInfo(userDto); + if(null != user){ + JSONObject jsonObject = WXUserUtils.getOpenId(map.get("code").toString()); + user.setSyncId(jsonObject.get("openid").toString()); + userActionDao.setUserOpenId(user); + return Result.buildR(Status.LOGIN_SUCCEEDED,user); + }else{ + return Result.buildR(Status.USER_ALREADY_NOT_REGISTERED); + } + }catch (Exception e){ + e.printStackTrace(); + return Result.buildR(Status.FAIL); + } + } + + @Override + public Result userRegister(UserDto userDto) { + try { + SimpleDateFormat sim = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + userDto.setAttr1(userDto.getPhone()); + UserDto user = userActionDao.getUserInfo(userDto); + if(null == user){ + userDto.setAttr1(""); + UserDto userInfo = userActionDao.getUserInfo(userDto); + if(null != userInfo){ + userActionDao.userRegister(userDto); + userActionDao.userEmpowerment(UuidUtils.getId(),userInfo.getId(),sim.format(new Date())); + return Result.buildR(Status.OK); + }else { + return Result.buildR(Status.EMPLOYEE_NOT_EXIST); + } + }else{ + return Result.buildR(Status.USER_ALREADY_REGISTERED); + } + }catch (Exception e){ + e.printStackTrace(); + return Result.buildR(Status.FAIL); + } + } + + @Override + public Result retrievePassword(String id,String oldPwd,String newPwd) { + try { + String salt = ShiroKit.getRandomSalt(5); + String password = ShiroKit.md5(newPwd, salt); + userActionDao.retrievePassword(id,salt,password); + return Result.buildR(Status.OK); + }catch (Exception e){ + e.printStackTrace(); + return Result.buildR(Status.FAIL); + } + } + + @Override + public Result verifyUser(UserDto userDto) { + try { + UserDto user = userActionDao.getUserInfo(userDto); + if(null != user){ + if(user.getPhone().equals(userDto.getPhone())){ + return Result.buildR(Status.OK,user.getId()); + }else{ + return Result.buildR(Status.FAILED_PHONE); + } + }else{ + return Result.buildR(Status.FAILED_CERTIFICATION); + } + }catch (Exception e){ + e.printStackTrace(); + return Result.buildR(Status.FAIL); + } + } + + @Override + public Result getUserInfo(String userName) { + try { + UserDto userDto = new UserDto(); + userDto.setAccount(userName); + UserDto user = userActionDao.getUserInfo(userDto); + return Result.buildR(Status.OK,user); + }catch (Exception e){ + e.printStackTrace(); + return Result.buildR(Status.FAIL); + } + } + + + @Override + public List getUserType() { + return userActionDao.getList(); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/AESUtils.java b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/AESUtils.java new file mode 100644 index 0000000..6d5a99d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/AESUtils.java @@ -0,0 +1,48 @@ +package com.casic.missiles.modular.system.utils; + +import sun.misc.BASE64Decoder; + +import javax.crypto.Cipher; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; + + +public class AESUtils { + + + public static String decrypt(String encryptedData, String sessionKey, String iv, String encodingFormat) throws Exception { + + try { + + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + + BASE64Decoder base64Decoder = new BASE64Decoder(); + + byte[] _encryptedData = base64Decoder.decodeBuffer(encryptedData); + + byte[] _sessionKey = base64Decoder.decodeBuffer(sessionKey); + + byte[] _iv = base64Decoder.decodeBuffer(iv); + + SecretKeySpec secretKeySpec = new SecretKeySpec(_sessionKey, "AES"); + + IvParameterSpec ivParameterSpec = new IvParameterSpec(_iv); + + cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec); + + byte[] original = cipher.doFinal(_encryptedData); + + byte[] bytes = WxPKCS7Encoder.decode(original); + + String originalString = new String(bytes, encodingFormat); return originalString; + + } catch (Exception ex) { + + ex.printStackTrace(); + return null; + + } + + } + +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/HttpClientUtil.java b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/HttpClientUtil.java new file mode 100644 index 0000000..89d6d21 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/HttpClientUtil.java @@ -0,0 +1,185 @@ +package com.casic.missiles.modular.system.utils; + +import java.io.IOException; +import java.net.URI; +import java.util.*; + +import org.apache.http.HttpEntity; +import org.apache.http.NameValuePair; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.client.utils.URIBuilder; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.message.BasicNameValuePair; +import org.apache.http.util.EntityUtils; + +public class HttpClientUtil { + + public static String URLGet(String url,Map paramsMap){ + CloseableHttpClient httpclient = HttpClients.createDefault(); + String params = ""; + try { + if (paramsMap != null && !paramsMap.isEmpty()) { + StringBuffer str = new StringBuffer(); + Set set = paramsMap.keySet(); + Iterator iter = set.iterator(); + while (iter.hasNext()) { + String key = iter.next().toString(); + if (paramsMap.get(key) == null) { + continue; + } + str.append(key).append("=").append(paramsMap.get(key)).append("&"); + } + if (str.length() > 0) { + params = "?" + str.substring(0, str.length() - 1); + } + } + HttpGet httpget = new HttpGet(url+params); + System.out.println("executing request " + httpget.getURI()); + // 执行get请求. + CloseableHttpResponse response = httpclient.execute(httpget); + try { + // 获取响应实体 + HttpEntity entity = response.getEntity(); + if (entity != null) { + return EntityUtils.toString(entity); + } + } finally { + response.close(); + } + }catch (Exception e) { + e.printStackTrace(); + } finally { + // 关闭连接,释放资源 + try { + httpclient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return null; + } + + + public static String doGet(String url, Map param) { + + // 创建Httpclient对象 + CloseableHttpClient httpclient = HttpClients.createDefault(); + + String resultString = ""; + CloseableHttpResponse response = null; + try { + // 创建uri + URIBuilder builder = new URIBuilder(url); + if (param != null) { + for (String key : param.keySet()) { + builder.addParameter(key, param.get(key)); + } + } + URI uri = builder.build(); + + // 创建http GET请求 + HttpGet httpGet = new HttpGet(uri); + + // 执行请求 + response = httpclient.execute(httpGet); + // 判断返回状态是否为200 + if (response.getStatusLine().getStatusCode() == 200) { + resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (response != null) { + response.close(); + } + httpclient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return resultString; + } + + + public static String doGet(String url) { + return doGet(url, null); + } + + + public static String doPost(String url, Map param) { + // 创建Httpclient对象 + CloseableHttpClient httpClient = HttpClients.createDefault(); + CloseableHttpResponse response = null; + String resultString = ""; + try { + // 创建Http Post请求 + HttpPost httpPost = new HttpPost(url); + // 创建参数列表 + if (param != null) { + List paramList = new ArrayList<>(); + for (String key : param.keySet()) { + paramList.add(new BasicNameValuePair(key, param.get(key))); + } + // 模拟表单 + UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList, "utf-8"); + httpPost.setEntity(entity); + } + // 执行http请求 + response = httpClient.execute(httpPost); + resultString = EntityUtils.toString(response.getEntity(), "utf-8"); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + response.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + return resultString; + } + + + public static String doPost(String url) { + return doPost(url, null); + } + + + public static String doPostJson(String url, String json) { + // 创建Httpclient对象 + CloseableHttpClient httpClient = HttpClients.createDefault(); + CloseableHttpResponse response = null; + String resultString = ""; + try { + // 创建Http Post请求 + HttpPost httpPost = new HttpPost(url); + // 创建请求内容 + StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON); + httpPost.setEntity(entity); + // 执行http请求 + response = httpClient.execute(httpPost); + resultString = EntityUtils.toString(response.getEntity(), "utf-8"); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + response.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + return resultString; + } + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/Result.java b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/Result.java new file mode 100644 index 0000000..312c9fa --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/Result.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.utils; + +public class Result { + + private Integer status; + private String message; + private T data; + + public Integer getStatus() { + return status; + } + public String getMessage() { + return message; + } + public T getData() { + return data; + } + + private Result(Integer status,String message,T data){ + this.status=status; + this.message=message; + this.data=data; + } + private Result(Integer status,String message){ + this.status=status; + this.message=message; + } + private Result(String message){ + this.message=message; + } + + + public static Result buildR(Status status,String message,T data){ + return new Result(status.getCode(),message,data); + + } + + + public static Result buildR(Status status,String message,String type){ + return new Result(status.getCode(),message); + } + + public static Result buildR(Status status,T data){ + return new Result(status.getCode(),status.getMessage(),data); + } + + public static Result buildR(Status status){ + return new Result(status.getCode(),status.getMessage()); + } + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/Status.java b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/Status.java new file mode 100644 index 0000000..bdca50f --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/Status.java @@ -0,0 +1,33 @@ +package com.casic.missiles.modular.system.utils; + +public enum Status { + OK(200,"请求成功"), + FAIL(500,"请求失败"), + SYSTEM_ERROR(101,"系统异常"), + LOGIN_SUCCEEDED(200,"登录成功"), + EMPLOYEE_NOT_EXIST(2400,"员工号不存在"), + USER_ALREADY_REGISTERED(2500,"该账号已注册"), + USER_ALREADY_NOT_REGISTERED(2301,"您的账号未注册,请先注册"), + FAILED_CERTIFICATION(2300,"认证不通过"), + FAILED_PHONE(2302,"授权手机号不正确"), + EMPLOYEE_NAME_MISMATCH(2400,"员工号与姓名不匹配"); + private Integer code; + private String message; + Status(Integer code,String message){ + this.code=code; + this.message=message; + } + //只需要添加get方法就行 + public Integer getCode() { + return code; + } + public String getMessage() { + return message; + } + + @Override + public String toString() { + return code+":"+message; + } + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/UuidUtils.java b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/UuidUtils.java new file mode 100644 index 0000000..ebf9328 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/UuidUtils.java @@ -0,0 +1,22 @@ +package com.casic.missiles.modular.system.utils; + +import org.apache.commons.lang3.RandomUtils; + +import java.util.Date; +import java.util.UUID; + +public class UuidUtils { + + public static String randomUUID() { + return cn.hutool.core.lang.UUID.randomUUID().toString(); + } + + public static String getUUID(){ + return UUID.randomUUID().toString().replace("-",""); + } + + public static String getId(){ + int i = RandomUtils.nextInt(1000000, 10000000); + return new Date().getTime() + "" + i; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/WXUserUtils.java b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/WXUserUtils.java new file mode 100644 index 0000000..8e4ba75 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/WXUserUtils.java @@ -0,0 +1,119 @@ +package com.casic.missiles.modular.system.utils; + +import java.security.AlgorithmParameters; +import java.security.Key; +import java.util.HashMap; +import java.util.Map; + +import javax.crypto.Cipher; +import javax.crypto.KeyGenerator; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; +import com.alibaba.fastjson.JSONObject; +import org.springframework.stereotype.Component; + +@Component +public class WXUserUtils{ + + public static final String AES = "AES"; + public static final String AES_CBC_PADDING = "AES/CBC/PKCS5Padding"; + /** + * 获取 微信小程序用户 openId + * @param code + * @return + */ + public static JSONObject getOpenId(String code) { + Map params=new HashMap<>(); + params.put("appid", "wx899496f4295e554e"); + params.put("secret","1783357d9445f7135303b67b79ce9ca2"); + params.put("js_code", code); + params.put("grant_type","authorization_code"); + String result=HttpClientUtil.URLGet("https://api.weixin.qq.com/sns/jscode2session", params); + return JSONObject.parseObject(result); + } + + + + public static JSONObject getAccessToken() { + Map params=new HashMap<>(); + params.put("appid", "wx899496f4295e554e"); + params.put("secret","1783357d9445f7135303b67b79ce9ca2"); + params.put("grant_type","client_credential"); + String result=HttpClientUtil.URLGet("https://api.weixin.qq.com/cgi-bin/token", params); + + return JSONObject.parseObject(result); + + } + public static String getPhone(String code) { + JSONObject accessToken = getAccessToken(); + String token = accessToken.get("access_token").toString(); + String json = "{ \"code\": \""+code+"\" }"; + String url = "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=" + token + "&"; + String doPost = HttpClientUtil.doPostJson(url, json); + JSONObject jsonObject = JSONObject.parseObject(doPost); + Object phone_info = jsonObject.get("phone_info"); + JSONObject parse =JSONObject.parseObject(phone_info.toString()); + return parse.get("phoneNumber").toString(); + + } + + /** + * * 微信 数据解密
+ * * 对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充
+ * * 对称解密的目标密文:encrypted=Base64_Decode(encryptData)
+ * * 对称解密秘钥:key = Base64_Decode(session_key),aeskey是16字节
+ * * 对称解密算法初始向量:iv = Base64_Decode(iv),同样是16字节
+ * * + * * @param encrypted 目标密文 + * * @param session_key 会话ID + * * @param iv 加密算法的初始向量 + * + */ + public static String wxDecrypt(String encrypted, String session_key, String iv) { + String result = null; + byte[] encrypted64 = org.apache.commons.codec.binary.Base64.decodeBase64(encrypted); + byte[] key64 = org.apache.commons.codec.binary.Base64.decodeBase64(session_key); + byte[] iv64 = org.apache.commons.codec.binary.Base64.decodeBase64(iv); + try { + init(); + result = new String(decrypt(encrypted64, key64, generateIV(iv64))); + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } + /** + * * 初始化密钥 + * + */ + + public static void init() throws Exception { + //Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); + KeyGenerator.getInstance(AES).init(128); + } + + /** + * * 生成iv + * + */ + public static AlgorithmParameters generateIV(byte[] iv) throws Exception { + // iv 为一个 16 字节的数组,这里采用和 iOS 端一样的构造方法,数据全为0 + // Arrays.fill(iv, (byte) 0x00); + AlgorithmParameters params = AlgorithmParameters.getInstance(AES); + params.init(new IvParameterSpec(iv)); + return params; + } + + /** + * * 生成解密 + * + */ + public static byte[] decrypt(byte[] encryptedData, byte[] keyBytes, AlgorithmParameters iv) + throws Exception { + Key key = new SecretKeySpec(keyBytes, AES); + Cipher cipher = Cipher.getInstance(AES_CBC_PADDING); + // 设置为解密模式 + cipher.init(Cipher.DECRYPT_MODE, key, iv); + return cipher.doFinal(encryptedData); + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/WxPKCS7Encoder.java b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/WxPKCS7Encoder.java new file mode 100644 index 0000000..bcef87c --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/WxPKCS7Encoder.java @@ -0,0 +1,61 @@ +package com.casic.missiles.modular.system.utils; + +import java.nio.charset.Charset; +import java.util.Arrays; + +public class WxPKCS7Encoder { + + + static Charset CHARSET = Charset.forName("utf-8"); + + static int BLOCK_SIZE = 32; + + /** + * 获得对明文进行补位填充的字节. + * + * @param count 需要进行填充补位操作的明文字节个数 + * @return 补齐用的字节数组 + */ + static byte[] encode(int count) { + // 计算需要填充的位数 + int amountToPad = BLOCK_SIZE - (count % BLOCK_SIZE); + if (amountToPad == 0) { + amountToPad = BLOCK_SIZE; + } + // 获得补位所用的字符 + char padChr = chr(amountToPad); + String tmp = new String(); + for (int index = 0; index < amountToPad; index++) { + tmp += padChr; + } + return tmp.getBytes(CHARSET); + } + + /** + * 删除解密后明文的补位字符 + * + * @param decrypted 解密后的明文 + * @return 删除补位字符后的明文 + */ + static byte[] decode(byte[] decrypted) { + int pad = (int) decrypted[decrypted.length - 1]; + if (pad < 1 || pad > 32) { + pad = 0; + } + return Arrays.copyOfRange(decrypted, 0, decrypted.length - pad); + } + + /** + * 将数字转化成ASCII码对应的字符,用于对明文进行补码 + * + * @param a 需要转化的数字 + * @return 转化得到的字符 + */ + static char chr(int a) { + + byte target = (byte) (a & 0xFF); + + return (char) target; + + } +} \ No newline at end of file diff --git a/casic-web/src/main/java/com/casic/missiles/CasicApplication.java b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java index 739eb99..3422629 100644 --- a/casic-web/src/main/java/com/casic/missiles/CasicApplication.java +++ b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java @@ -1,6 +1,7 @@ package com.casic.missiles; import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; @@ -19,6 +20,7 @@ @EnableTransactionManagement(proxyTargetClass = true) @EnableAsync @Slf4j +@MapperScan("com.casic.missiles.modular.system.dao") public class CasicApplication { public static void main(String[] args) { SpringApplication.run(CasicApplication.class, args); diff --git a/casic-web/src/main/resources/config/application-dev.yml b/casic-web/src/main/resources/config/application-dev.yml index e937cb1..4eb60d0 100644 --- a/casic-web/src/main/resources/config/application-dev.yml +++ b/casic-web/src/main/resources/config/application-dev.yml @@ -12,7 +12,7 @@ casic: kaptcha-open: false #是否开启登录时验证码 (true/false) - no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/user/* #flowable数据源和多数据源配置 db: init: diff --git a/casic-web/src/main/resources/config/application.yml b/casic-web/src/main/resources/config/application.yml index 9dc8566..1b9c063 100644 --- a/casic-web/src/main/resources/config/application.yml +++ b/casic-web/src/main/resources/config/application.yml @@ -20,6 +20,7 @@ # 配置结果集属性为空时 是否映射返回结果 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 map-underscore-to-camel-case: true + mapper-locations: classpath:mapper/*.xml ################### guns配置 ################### casic: swagger-open: false #是否开启swagger (true/false) diff --git a/casic-server/pom.xml b/casic-server/pom.xml index cd24fd8..6ff78b8 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -35,6 +35,41 @@ ${boot.version} provided + + com.casic + casic-admin-core + 2.0.0.alpha + compile + + + org.apache.httpcomponents + httpcore + 4.0.1 + + + org.apache.httpcomponents + httpclient + 4.0.2 + + + org.apache.httpcomponents + httpclient + + + com.dameng + DmJdbcDriver18 + 1.8 + compile + + + org.testcontainers + testcontainers + 1.15.1 + + + org.apache.httpcomponents + httpcore + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java index a7381d1..4ef1109 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java @@ -1,32 +1,83 @@ package com.casic.missiles.modular.system.controller; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.system.service.UserActionService; +import com.casic.missiles.modular.system.utils.*; +import dm.jdbc.util.StringUtil; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.List; + /** * @Description: 小程序用户 * @Author: wangpeng * @Date: 2022/11/8 14:39 */ +@Controller +@RequestMapping("user") public class UserController { + @Resource + private UserActionService userActionService; + /** * 注册 */ + @RequestMapping("userLogin") + @ResponseBody + public Result userLogin(@RequestBody HashMap map){ + return userActionService.userLogin(map); + } /** - * 登录 + * 注册 */ - + @RequestMapping("userRegister") + @ResponseBody + public Result userRegister(@RequestBody UserDto userDto){ + return userActionService.userRegister(userDto); + } /** - * 验证用户信息 + * 获取员工类型 */ - + @RequestMapping("getUserType") + @ResponseBody + public List getUserType(){ + return userActionService.getUserType(); + } + /** + * 校验用户 + */ + @RequestMapping("verifyUser") + @ResponseBody + public Result verifyUser(@RequestBody UserDto userDto){ + return userActionService.verifyUser(userDto); + } /** * 找回密码 */ - + @RequestMapping("retrievePassword") + @ResponseBody + public Result retrievePassword(String id,String oldPwd,String newPwd){ + return userActionService.retrievePassword(id,oldPwd,newPwd); + } /** * 用户信息 */ - + @RequestMapping("getUserInfo") + @ResponseBody + public Result getUserInfo(String userName){ + return userActionService.getUserInfo(userName); + } /** * 修改照片 */ @@ -38,4 +89,46 @@ /** * 员工导入 */ + /** + * 获取微信openid,sessionkey等信息 + */ + @RequestMapping("getOther") + @ResponseBody + public Object getWxOpenidInfo(@RequestParam String code) { + if (StringUtil.isEmpty(code)) { + return null; + } + JSONObject jsonObject = WXUserUtils.getOpenId(code); + //JSONObject str = WXUserUtils.getAccessToken(); + //JSONObject phone = WXUserUtils.getPhone(code,str.get("access_token").toString()); + //System.out.println("token:"+str); + //System.out.println("phone:"+phone); + return Result.buildR(Status.OK,jsonObject); + } + /** + * 获取微信手机号 + */ + @RequestMapping("/phone") + @ResponseBody + public Object authPhone(String encryptedData, String session_key, String iv) { + try { + //String decrypt = AESUtils.decrypt(encryptedData, session_key, iv, "UTF-8"); + //System.out.println(decrypt); + // String result = WXUserUtils.wxDecrypt(encryptedData, session_key, iv); + String result = ""; + JSONObject json = JSONObject.parseObject(result); + if (json.containsKey("phoneNumber")) { + String phone = json.getString("phoneNumber"); + if (StringUtils.isNoneBlank(phone)) { + return Result.buildR(Status.OK,json); + } else { + return Result.buildR(Status.FAILED_PHONE); + } + } else { + return Result.buildR(Status.FAIL); + } + } catch (Exception e) { + return Result.buildR(Status.FAIL); + } + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dao/UserActionMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/UserActionMapper.java new file mode 100644 index 0000000..5647343 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/UserActionMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.system.dto.StaffInfoDto; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.model.Dict; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +public interface UserActionMapper extends BaseMapper { + List getList(); + + void userRegister(@Param("userDto") UserDto userDto); + + UserDto getUserInfo(@Param("userDto") UserDto userDto); + + StaffInfoDto getStaffInfo(@Param("userDto") UserDto userDto); + + void retrievePassword(@Param("id")String id, @Param("salt")String salt, @Param("password")String password); + + void setUserOpenId(@Param("userDto")UserDto user); + + void userEmpowerment(@Param("id")String id,@Param("userId")String userId,@Param("updateTime")String updateTime); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/StaffInfoDto.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/StaffInfoDto.java new file mode 100644 index 0000000..16f8088 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/StaffInfoDto.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +@Data +public class StaffInfoDto { + private String id;// + private String staffCode;//工号 + private String staffName;//姓名 + private String staffGender;//性别 + private String staffPhone;//手机号 + private String createTime;// + private String updateTime;// +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/UserDto.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/UserDto.java new file mode 100644 index 0000000..2cc75d4 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/UserDto.java @@ -0,0 +1,40 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class UserDto { + private String id;//主键id + private String avatar;//头像 + private String account;//账号 + private String password;//密码 + private String salt;//md5密码盐 + private String name;//名字 + private String birthday;//生日 + private String sex;//性别 + private String email;//电子邮件 + private String phone;//电话 + private String roleId;//角色id(停用) + private String deptId;//部门ID + private String status;//状态 + private Integer version;//保留字段 + private String syncId;//原ID + private String syncName;//原名称 + private String syncPwd;//同步密码 + private String syncDeptid;//同步组织ID + private Integer isSync;//是否是同步数据 + private String loginIp;//登录限制IP + private String loginMac;//登录MAC地址 + private Double positionLng;//定位经度 + private Double positionLat;//定位纬度 + private String attr1;//预留字段 + private String lastTime;//登录时间 + private String createUser;//创建用户 + private String updateUser;//修改用户 + private String createTime;//创建时间 + private String updateTime;//修改时间 + private String delFlag;//删除状态 + private String tenantId;//租户ID +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java b/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java new file mode 100644 index 0000000..ae06f38 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.system.utils.Result; + +import java.util.HashMap; +import java.util.List; + +public interface UserActionService extends IService { + + List getUserType(); + + Result userRegister(UserDto userDto); + + Result retrievePassword(String id,String oldPwd,String newPwd); + + Result verifyUser(UserDto userDto); + + Result getUserInfo(String userName); + + Result userLogin(HashMap map); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/UserActionServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/UserActionServiceImpl.java new file mode 100644 index 0000000..1e49b17 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/UserActionServiceImpl.java @@ -0,0 +1,121 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.core.shiro.ShiroKit; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.UserActionMapper; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.system.service.UserActionService; +import com.casic.missiles.modular.system.utils.Result; +import com.casic.missiles.modular.system.utils.Status; +import com.casic.missiles.modular.system.utils.UuidUtils; +import com.casic.missiles.modular.system.utils.WXUserUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.text.SimpleDateFormat; +import java.util.*; + +@Service("UserActionService") +public class UserActionServiceImpl extends ServiceImpl implements UserActionService { + + @Resource + private UserActionMapper userActionDao; + + @Override + public Result userLogin(HashMap map) { + try { + UserDto userDto = new UserDto(); + userDto.setAttr1(WXUserUtils.getPhone(map.get("phoneCode").toString())); + UserDto user = userActionDao.getUserInfo(userDto); + if(null != user){ + JSONObject jsonObject = WXUserUtils.getOpenId(map.get("code").toString()); + user.setSyncId(jsonObject.get("openid").toString()); + userActionDao.setUserOpenId(user); + return Result.buildR(Status.LOGIN_SUCCEEDED,user); + }else{ + return Result.buildR(Status.USER_ALREADY_NOT_REGISTERED); + } + }catch (Exception e){ + e.printStackTrace(); + return Result.buildR(Status.FAIL); + } + } + + @Override + public Result userRegister(UserDto userDto) { + try { + SimpleDateFormat sim = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + userDto.setAttr1(userDto.getPhone()); + UserDto user = userActionDao.getUserInfo(userDto); + if(null == user){ + userDto.setAttr1(""); + UserDto userInfo = userActionDao.getUserInfo(userDto); + if(null != userInfo){ + userActionDao.userRegister(userDto); + userActionDao.userEmpowerment(UuidUtils.getId(),userInfo.getId(),sim.format(new Date())); + return Result.buildR(Status.OK); + }else { + return Result.buildR(Status.EMPLOYEE_NOT_EXIST); + } + }else{ + return Result.buildR(Status.USER_ALREADY_REGISTERED); + } + }catch (Exception e){ + e.printStackTrace(); + return Result.buildR(Status.FAIL); + } + } + + @Override + public Result retrievePassword(String id,String oldPwd,String newPwd) { + try { + String salt = ShiroKit.getRandomSalt(5); + String password = ShiroKit.md5(newPwd, salt); + userActionDao.retrievePassword(id,salt,password); + return Result.buildR(Status.OK); + }catch (Exception e){ + e.printStackTrace(); + return Result.buildR(Status.FAIL); + } + } + + @Override + public Result verifyUser(UserDto userDto) { + try { + UserDto user = userActionDao.getUserInfo(userDto); + if(null != user){ + if(user.getPhone().equals(userDto.getPhone())){ + return Result.buildR(Status.OK,user.getId()); + }else{ + return Result.buildR(Status.FAILED_PHONE); + } + }else{ + return Result.buildR(Status.FAILED_CERTIFICATION); + } + }catch (Exception e){ + e.printStackTrace(); + return Result.buildR(Status.FAIL); + } + } + + @Override + public Result getUserInfo(String userName) { + try { + UserDto userDto = new UserDto(); + userDto.setAccount(userName); + UserDto user = userActionDao.getUserInfo(userDto); + return Result.buildR(Status.OK,user); + }catch (Exception e){ + e.printStackTrace(); + return Result.buildR(Status.FAIL); + } + } + + + @Override + public List getUserType() { + return userActionDao.getList(); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/AESUtils.java b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/AESUtils.java new file mode 100644 index 0000000..6d5a99d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/AESUtils.java @@ -0,0 +1,48 @@ +package com.casic.missiles.modular.system.utils; + +import sun.misc.BASE64Decoder; + +import javax.crypto.Cipher; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; + + +public class AESUtils { + + + public static String decrypt(String encryptedData, String sessionKey, String iv, String encodingFormat) throws Exception { + + try { + + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + + BASE64Decoder base64Decoder = new BASE64Decoder(); + + byte[] _encryptedData = base64Decoder.decodeBuffer(encryptedData); + + byte[] _sessionKey = base64Decoder.decodeBuffer(sessionKey); + + byte[] _iv = base64Decoder.decodeBuffer(iv); + + SecretKeySpec secretKeySpec = new SecretKeySpec(_sessionKey, "AES"); + + IvParameterSpec ivParameterSpec = new IvParameterSpec(_iv); + + cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec); + + byte[] original = cipher.doFinal(_encryptedData); + + byte[] bytes = WxPKCS7Encoder.decode(original); + + String originalString = new String(bytes, encodingFormat); return originalString; + + } catch (Exception ex) { + + ex.printStackTrace(); + return null; + + } + + } + +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/HttpClientUtil.java b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/HttpClientUtil.java new file mode 100644 index 0000000..89d6d21 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/HttpClientUtil.java @@ -0,0 +1,185 @@ +package com.casic.missiles.modular.system.utils; + +import java.io.IOException; +import java.net.URI; +import java.util.*; + +import org.apache.http.HttpEntity; +import org.apache.http.NameValuePair; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.client.utils.URIBuilder; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.message.BasicNameValuePair; +import org.apache.http.util.EntityUtils; + +public class HttpClientUtil { + + public static String URLGet(String url,Map paramsMap){ + CloseableHttpClient httpclient = HttpClients.createDefault(); + String params = ""; + try { + if (paramsMap != null && !paramsMap.isEmpty()) { + StringBuffer str = new StringBuffer(); + Set set = paramsMap.keySet(); + Iterator iter = set.iterator(); + while (iter.hasNext()) { + String key = iter.next().toString(); + if (paramsMap.get(key) == null) { + continue; + } + str.append(key).append("=").append(paramsMap.get(key)).append("&"); + } + if (str.length() > 0) { + params = "?" + str.substring(0, str.length() - 1); + } + } + HttpGet httpget = new HttpGet(url+params); + System.out.println("executing request " + httpget.getURI()); + // 执行get请求. + CloseableHttpResponse response = httpclient.execute(httpget); + try { + // 获取响应实体 + HttpEntity entity = response.getEntity(); + if (entity != null) { + return EntityUtils.toString(entity); + } + } finally { + response.close(); + } + }catch (Exception e) { + e.printStackTrace(); + } finally { + // 关闭连接,释放资源 + try { + httpclient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return null; + } + + + public static String doGet(String url, Map param) { + + // 创建Httpclient对象 + CloseableHttpClient httpclient = HttpClients.createDefault(); + + String resultString = ""; + CloseableHttpResponse response = null; + try { + // 创建uri + URIBuilder builder = new URIBuilder(url); + if (param != null) { + for (String key : param.keySet()) { + builder.addParameter(key, param.get(key)); + } + } + URI uri = builder.build(); + + // 创建http GET请求 + HttpGet httpGet = new HttpGet(uri); + + // 执行请求 + response = httpclient.execute(httpGet); + // 判断返回状态是否为200 + if (response.getStatusLine().getStatusCode() == 200) { + resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (response != null) { + response.close(); + } + httpclient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return resultString; + } + + + public static String doGet(String url) { + return doGet(url, null); + } + + + public static String doPost(String url, Map param) { + // 创建Httpclient对象 + CloseableHttpClient httpClient = HttpClients.createDefault(); + CloseableHttpResponse response = null; + String resultString = ""; + try { + // 创建Http Post请求 + HttpPost httpPost = new HttpPost(url); + // 创建参数列表 + if (param != null) { + List paramList = new ArrayList<>(); + for (String key : param.keySet()) { + paramList.add(new BasicNameValuePair(key, param.get(key))); + } + // 模拟表单 + UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList, "utf-8"); + httpPost.setEntity(entity); + } + // 执行http请求 + response = httpClient.execute(httpPost); + resultString = EntityUtils.toString(response.getEntity(), "utf-8"); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + response.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + return resultString; + } + + + public static String doPost(String url) { + return doPost(url, null); + } + + + public static String doPostJson(String url, String json) { + // 创建Httpclient对象 + CloseableHttpClient httpClient = HttpClients.createDefault(); + CloseableHttpResponse response = null; + String resultString = ""; + try { + // 创建Http Post请求 + HttpPost httpPost = new HttpPost(url); + // 创建请求内容 + StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON); + httpPost.setEntity(entity); + // 执行http请求 + response = httpClient.execute(httpPost); + resultString = EntityUtils.toString(response.getEntity(), "utf-8"); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + response.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + return resultString; + } + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/Result.java b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/Result.java new file mode 100644 index 0000000..312c9fa --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/Result.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.utils; + +public class Result { + + private Integer status; + private String message; + private T data; + + public Integer getStatus() { + return status; + } + public String getMessage() { + return message; + } + public T getData() { + return data; + } + + private Result(Integer status,String message,T data){ + this.status=status; + this.message=message; + this.data=data; + } + private Result(Integer status,String message){ + this.status=status; + this.message=message; + } + private Result(String message){ + this.message=message; + } + + + public static Result buildR(Status status,String message,T data){ + return new Result(status.getCode(),message,data); + + } + + + public static Result buildR(Status status,String message,String type){ + return new Result(status.getCode(),message); + } + + public static Result buildR(Status status,T data){ + return new Result(status.getCode(),status.getMessage(),data); + } + + public static Result buildR(Status status){ + return new Result(status.getCode(),status.getMessage()); + } + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/Status.java b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/Status.java new file mode 100644 index 0000000..bdca50f --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/Status.java @@ -0,0 +1,33 @@ +package com.casic.missiles.modular.system.utils; + +public enum Status { + OK(200,"请求成功"), + FAIL(500,"请求失败"), + SYSTEM_ERROR(101,"系统异常"), + LOGIN_SUCCEEDED(200,"登录成功"), + EMPLOYEE_NOT_EXIST(2400,"员工号不存在"), + USER_ALREADY_REGISTERED(2500,"该账号已注册"), + USER_ALREADY_NOT_REGISTERED(2301,"您的账号未注册,请先注册"), + FAILED_CERTIFICATION(2300,"认证不通过"), + FAILED_PHONE(2302,"授权手机号不正确"), + EMPLOYEE_NAME_MISMATCH(2400,"员工号与姓名不匹配"); + private Integer code; + private String message; + Status(Integer code,String message){ + this.code=code; + this.message=message; + } + //只需要添加get方法就行 + public Integer getCode() { + return code; + } + public String getMessage() { + return message; + } + + @Override + public String toString() { + return code+":"+message; + } + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/UuidUtils.java b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/UuidUtils.java new file mode 100644 index 0000000..ebf9328 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/UuidUtils.java @@ -0,0 +1,22 @@ +package com.casic.missiles.modular.system.utils; + +import org.apache.commons.lang3.RandomUtils; + +import java.util.Date; +import java.util.UUID; + +public class UuidUtils { + + public static String randomUUID() { + return cn.hutool.core.lang.UUID.randomUUID().toString(); + } + + public static String getUUID(){ + return UUID.randomUUID().toString().replace("-",""); + } + + public static String getId(){ + int i = RandomUtils.nextInt(1000000, 10000000); + return new Date().getTime() + "" + i; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/WXUserUtils.java b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/WXUserUtils.java new file mode 100644 index 0000000..8e4ba75 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/WXUserUtils.java @@ -0,0 +1,119 @@ +package com.casic.missiles.modular.system.utils; + +import java.security.AlgorithmParameters; +import java.security.Key; +import java.util.HashMap; +import java.util.Map; + +import javax.crypto.Cipher; +import javax.crypto.KeyGenerator; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; +import com.alibaba.fastjson.JSONObject; +import org.springframework.stereotype.Component; + +@Component +public class WXUserUtils{ + + public static final String AES = "AES"; + public static final String AES_CBC_PADDING = "AES/CBC/PKCS5Padding"; + /** + * 获取 微信小程序用户 openId + * @param code + * @return + */ + public static JSONObject getOpenId(String code) { + Map params=new HashMap<>(); + params.put("appid", "wx899496f4295e554e"); + params.put("secret","1783357d9445f7135303b67b79ce9ca2"); + params.put("js_code", code); + params.put("grant_type","authorization_code"); + String result=HttpClientUtil.URLGet("https://api.weixin.qq.com/sns/jscode2session", params); + return JSONObject.parseObject(result); + } + + + + public static JSONObject getAccessToken() { + Map params=new HashMap<>(); + params.put("appid", "wx899496f4295e554e"); + params.put("secret","1783357d9445f7135303b67b79ce9ca2"); + params.put("grant_type","client_credential"); + String result=HttpClientUtil.URLGet("https://api.weixin.qq.com/cgi-bin/token", params); + + return JSONObject.parseObject(result); + + } + public static String getPhone(String code) { + JSONObject accessToken = getAccessToken(); + String token = accessToken.get("access_token").toString(); + String json = "{ \"code\": \""+code+"\" }"; + String url = "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=" + token + "&"; + String doPost = HttpClientUtil.doPostJson(url, json); + JSONObject jsonObject = JSONObject.parseObject(doPost); + Object phone_info = jsonObject.get("phone_info"); + JSONObject parse =JSONObject.parseObject(phone_info.toString()); + return parse.get("phoneNumber").toString(); + + } + + /** + * * 微信 数据解密
+ * * 对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充
+ * * 对称解密的目标密文:encrypted=Base64_Decode(encryptData)
+ * * 对称解密秘钥:key = Base64_Decode(session_key),aeskey是16字节
+ * * 对称解密算法初始向量:iv = Base64_Decode(iv),同样是16字节
+ * * + * * @param encrypted 目标密文 + * * @param session_key 会话ID + * * @param iv 加密算法的初始向量 + * + */ + public static String wxDecrypt(String encrypted, String session_key, String iv) { + String result = null; + byte[] encrypted64 = org.apache.commons.codec.binary.Base64.decodeBase64(encrypted); + byte[] key64 = org.apache.commons.codec.binary.Base64.decodeBase64(session_key); + byte[] iv64 = org.apache.commons.codec.binary.Base64.decodeBase64(iv); + try { + init(); + result = new String(decrypt(encrypted64, key64, generateIV(iv64))); + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } + /** + * * 初始化密钥 + * + */ + + public static void init() throws Exception { + //Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); + KeyGenerator.getInstance(AES).init(128); + } + + /** + * * 生成iv + * + */ + public static AlgorithmParameters generateIV(byte[] iv) throws Exception { + // iv 为一个 16 字节的数组,这里采用和 iOS 端一样的构造方法,数据全为0 + // Arrays.fill(iv, (byte) 0x00); + AlgorithmParameters params = AlgorithmParameters.getInstance(AES); + params.init(new IvParameterSpec(iv)); + return params; + } + + /** + * * 生成解密 + * + */ + public static byte[] decrypt(byte[] encryptedData, byte[] keyBytes, AlgorithmParameters iv) + throws Exception { + Key key = new SecretKeySpec(keyBytes, AES); + Cipher cipher = Cipher.getInstance(AES_CBC_PADDING); + // 设置为解密模式 + cipher.init(Cipher.DECRYPT_MODE, key, iv); + return cipher.doFinal(encryptedData); + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/WxPKCS7Encoder.java b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/WxPKCS7Encoder.java new file mode 100644 index 0000000..bcef87c --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/WxPKCS7Encoder.java @@ -0,0 +1,61 @@ +package com.casic.missiles.modular.system.utils; + +import java.nio.charset.Charset; +import java.util.Arrays; + +public class WxPKCS7Encoder { + + + static Charset CHARSET = Charset.forName("utf-8"); + + static int BLOCK_SIZE = 32; + + /** + * 获得对明文进行补位填充的字节. + * + * @param count 需要进行填充补位操作的明文字节个数 + * @return 补齐用的字节数组 + */ + static byte[] encode(int count) { + // 计算需要填充的位数 + int amountToPad = BLOCK_SIZE - (count % BLOCK_SIZE); + if (amountToPad == 0) { + amountToPad = BLOCK_SIZE; + } + // 获得补位所用的字符 + char padChr = chr(amountToPad); + String tmp = new String(); + for (int index = 0; index < amountToPad; index++) { + tmp += padChr; + } + return tmp.getBytes(CHARSET); + } + + /** + * 删除解密后明文的补位字符 + * + * @param decrypted 解密后的明文 + * @return 删除补位字符后的明文 + */ + static byte[] decode(byte[] decrypted) { + int pad = (int) decrypted[decrypted.length - 1]; + if (pad < 1 || pad > 32) { + pad = 0; + } + return Arrays.copyOfRange(decrypted, 0, decrypted.length - pad); + } + + /** + * 将数字转化成ASCII码对应的字符,用于对明文进行补码 + * + * @param a 需要转化的数字 + * @return 转化得到的字符 + */ + static char chr(int a) { + + byte target = (byte) (a & 0xFF); + + return (char) target; + + } +} \ No newline at end of file diff --git a/casic-web/src/main/java/com/casic/missiles/CasicApplication.java b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java index 739eb99..3422629 100644 --- a/casic-web/src/main/java/com/casic/missiles/CasicApplication.java +++ b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java @@ -1,6 +1,7 @@ package com.casic.missiles; import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; @@ -19,6 +20,7 @@ @EnableTransactionManagement(proxyTargetClass = true) @EnableAsync @Slf4j +@MapperScan("com.casic.missiles.modular.system.dao") public class CasicApplication { public static void main(String[] args) { SpringApplication.run(CasicApplication.class, args); diff --git a/casic-web/src/main/resources/config/application-dev.yml b/casic-web/src/main/resources/config/application-dev.yml index e937cb1..4eb60d0 100644 --- a/casic-web/src/main/resources/config/application-dev.yml +++ b/casic-web/src/main/resources/config/application-dev.yml @@ -12,7 +12,7 @@ casic: kaptcha-open: false #是否开启登录时验证码 (true/false) - no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/user/* #flowable数据源和多数据源配置 db: init: diff --git a/casic-web/src/main/resources/config/application.yml b/casic-web/src/main/resources/config/application.yml index 9dc8566..1b9c063 100644 --- a/casic-web/src/main/resources/config/application.yml +++ b/casic-web/src/main/resources/config/application.yml @@ -20,6 +20,7 @@ # 配置结果集属性为空时 是否映射返回结果 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 map-underscore-to-camel-case: true + mapper-locations: classpath:mapper/*.xml ################### guns配置 ################### casic: swagger-open: false #是否开启swagger (true/false) diff --git a/casic-web/src/main/resources/mapper/UserActionMapper.xml b/casic-web/src/main/resources/mapper/UserActionMapper.xml new file mode 100644 index 0000000..26cc328 --- /dev/null +++ b/casic-web/src/main/resources/mapper/UserActionMapper.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + UPDATE sys_user SET `PASSWORD` = #{password}, `SALT` = #{salt} WHERE `ID` = #{id} + + + + and t.ACCOUNT = #{userDto.account} + + + and t.NAME = #{userDto.name} + + + and t.PHONE = #{userDto.attr1} + + + + UPDATE sys_user SET `PHONE` = #{userDto.phone} WHERE `ACCOUNT` = #{userDto.account} and `NAME` = #{userDto.name} + + + UPDATE sys_user SET `SYNC_ID` = #{userDto.syncId} WHERE `ACCOUNT` = #{userDto.account} and `NAME` = #{userDto.name} and `PHONE` = #{userDto.phone} + + + INSERT INTO sys_ru_relation ( `ID`, `USERID`, `ROLEID`,`UPDATE_TIME`) + VALUES (#{id},#{userId},'1397015476211346433',DATE_FORMAT(#{updateTime},'%Y-%m-%d %H:%i:%S')) + + + INSERT INTO sys_user ( + `ID`, + `ACCOUNT`, + `PASSWORD`, + `SALT`, + `NAME`, + `BIRTHDAY`, + `SEX`, + `EMAIL`, + `PHONE`, + `DEPT_ID`, + `STATUS`, + `CREATE_TIME`, + `TENANT_ID` + ) + VALUES + ( + #{userDto.id}, + #{userDto.account}, + #{userDto.password}, + #{userDto.salt}, + #{userDto.name}, + null, + #{userDto.sex}, + #{userDto.email}, + #{userDto.phone}, + #{userDto.deptId}, + #{userDto.status}, + DATE_FORMAT(#{userDto.createTime},'%Y-%m-%d %H:%i:%S'), + #{userDto.tenantId} + ) + + \ No newline at end of file