Commit 8691d23c by Java-张振楠

①增加用户接口

②增加消息中心接口
③增加图片接口
④增加在Koala Cloud上的配置
parent 6088fe09
package com.thinkgem.jeesite.modules.img.api;
import com.thinkgem.jeesite.common.baseBean.Response;
import com.thinkgem.jeesite.common.constant.ComCode;
import com.thinkgem.jeesite.common.utils.StringUtils;
import com.thinkgem.jeesite.modules.img.bean.ImgRequest;
import com.thinkgem.jeesite.modules.img.service.ImgService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
/**
* 图片
*/
@RestController
@RequestMapping("/api/img")
public class ImgController {
@Autowired
private ImgService imgService;
/**
* 上传图片
*
* @param request
* @return
*/
@PostMapping("/upload")
public Response uploadImg(ImgRequest request) {
Response resp = new Response();
try {
// 判断业务入参是否为空
if (StringUtils.isBlank(request.getSubMerchantCode()) || StringUtils.isBlank(request.getImgExt()) || StringUtils.isBlank(request.getImgBase())) {
resp.setStatus(ComCode.STATUS_CODE_4001);
resp.setMessage(ComCode.STATUS_CODE_4001_DESC);
return resp;
}
Map<String, String> map = new HashMap<>();
map.put("imgName", imgService.uploadImg(request));
resp.setData(map);
resp.setStatus(ComCode.STATUS_CODE_2000);
resp.setMessage(ComCode.STATUS_CODE_2000_DESC);
} catch (Exception e) {
resp.setStatus(ComCode.STATUS_CODE_9998);
resp.setMessage(ComCode.STATUS_CODE_9998_DESC);
resp.setError(e.getMessage());
}
return resp;
}
}
package com.thinkgem.jeesite.modules.img.bean;
import com.thinkgem.jeesite.common.baseBean.Request;
public class ImgRequest extends Request {
private String imgExt; // 图片扩展名
private String imgBase; // 图片的base64
public String getImgExt() {
return imgExt;
}
public void setImgExt(String imgExt) {
this.imgExt = imgExt;
}
public String getImgBase() {
return imgBase;
}
public void setImgBase(String imgBase) {
this.imgBase = imgBase;
}
}
package com.thinkgem.jeesite.modules.img.dao;
import com.thinkgem.jeesite.common.persistence.annotation.MyBatisDao;
@MyBatisDao
public interface ImgDao {
}
package com.thinkgem.jeesite.modules.img.service;
import com.thinkgem.jeesite.common.config.Global;
import com.thinkgem.jeesite.common.utils.IdGen;
import com.thinkgem.jeesite.modules.img.bean.ImgRequest;
import com.thinkgem.jeesite.modules.img.dao.ImgDao;
import com.thinkgem.jeesite.modules.img.util.ImgUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.io.File;
/**
* 图片
*/
@Service
@Transactional(readOnly = true)
public class ImgService {
@Autowired
private ImgDao imgDao;
public String uploadImg(ImgRequest request) {
//将base64转为图片并保存到路径中
String imgName = checkImgExist(request.getImgExt());
ImgUtils.generateImage(request.getImgBase(), Global.getConfig("image.save.url") + imgName);
//返回图片的的地址
return Global.getConfig("sys.pre.url") + Global.getConfig("image.return.url") + imgName;
}
/**
* 判断图片是否已存在
*
* @param ext 图片扩展名
* @return 图片名
*/
public String checkImgExist(String ext) {
String imgName;
boolean isExist = true;
do {
imgName = IdGen.randomBase62(32) + "." + ext;
File file = new File(Global.getConfig("image.save.url") + imgName);
if (!file.exists()) {
isExist = false;
}
} while (isExist);
return imgName;
}
}
/**
* Copyright &copy; 2012-2016 <a href="https://github.com/thinkgem/jeesite">JeeSite</a> All rights reserved.
*/
package com.thinkgem.jeesite.modules.img.util;
import com.google.common.collect.Lists;
import com.thinkgem.jeesite.common.utils.Encodes;
import com.thinkgem.jeesite.common.utils.StringUtils;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.apache.tools.zip.ZipOutputStream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.Enumeration;
import java.util.List;
/**
* 图片上传工具类
*/
public class ImgUtils {
private static Logger logger = LoggerFactory.getLogger(ImgUtils.class);
/**
* @param imgStr base64编码字符串
* @param path 图片路径-具体到文件
* @return
* @Description: 将base64编码字符串转换为图片
*/
public static boolean generateImage(String imgStr, String path) {
if (imgStr == null)
return false;
BASE64Decoder decoder = new BASE64Decoder();
try {
byte[] b = decoder.decodeBuffer(imgStr);// 解密
for (int i = 0; i < b.length; ++i) {// 处理数据
if (b[i] < 0) {
b[i] += 256;
}
}
OutputStream out = new FileOutputStream(path);
out.write(b);
out.flush();
out.close();
return true;
} catch (Exception e) {
return false;
}
}
/**
* @return
* @Description: 根据图片地址转换为base64编码字符串
*/
public static String getImageStr(String imgFile) {
InputStream inputStream = null;
byte[] data = null;
try {
inputStream = new FileInputStream(imgFile);
data = new byte[inputStream.available()];
inputStream.read(data);
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
// 加密
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(data);
}
public static void main(String[] args) {
String strImg = "/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAHCAlgDASIAAhEBAxEB/8QAHQABAAAHAQEAAAAAAAAAAAAAAAECAwQFBgcICf/EAEcQAAEDAwMCBQIEBAMFBgQHAAEAAgMEBREGEiEHMRMiQVFhCHEUMoGRFSNCoVKxwQkzYoLRFiRykuHwFxhD8SU0Y3OissL/xAAcAQEAAgMBAQEAAAAAAAAAAAAAAgMBBAUGBwj/xAA4EQACAQMDAgIIBAYCAwEAAAAAAQIDBBESITEFQVFhBhMUIjJScZFCgaGxBxUjwdHhkvAzovFi/9oADAMBAAIRAxEAPwD6IIiL5uewCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIilJQEyKXOFMgCKUlM5Gc5CAmREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEJwhOFKTlAQJ5/9FM3sjeyhn2QET2UMqTxmbyzcC5vJGeQua9S+q7NJ3D+Hwlr53wl7XDkNeM8H9uyjKSiss2Le3qXVRUqSyzpEdVHJPJC1wMkeNzfUZ7KjNdaSn8TxJ2MLM7g5wyMDPZcCqOs01wqqC7U0TYKtsZiqYGk4dxnjK1a462uVyqKuWWXDpsgYGMA/ZUuvFHp7f0aua3/AJHpR1vTXU2Gt6jXelfXNdaJqZk1NvP5XDuAPkf5LaqrqRaKd7WsnbM52MBruefdeTohPDVCWN22Rp4flX8ElQx3itcRITnIVKrvB6GfoxQlLVqfH7HbOqHW+ls1rfRWwudcpXNY95GBE093Z9eF0DSuoqKstFO1tU2V8ULPEduzyRleVJ6c1L98rnSPPJLucqeeepNOI2VE0QDtw2PI591lVXnJXW9GqUqUYUpYfdnpu29RKa869qdO0DG1LKSm8apqmOyGOJwGrcAV5A0Dq+v6fXmouEIZMyoZtqIXHBlA7Oz7jJ+67vaeuOnqqzx11XUNpHSDyQPP8x7s4DGt9SSrqdRSW55nqXRa1pNeqjqjhb+ffY6Si1XTnUW0aqvVTa7dI6onpYWy1Dm8siJOAwn/ABd+3stpB/VXJ54POThKnLTNYZFERZIBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREBK7lAOUxzlRzhAQKx96rnW+mbKwtyHflJ7j1V7PM2JhLnNbgE+Yrzb1D6q1NXc62jhm2ROfhpjeHxtwPzNI7h2cemFXOaijqdOsal9V0wWy5Mjr7qbUU+oaKttlU5ssYNHXUwOzaSchwJ7/AAe37rld51DV6lu01dVYdK7MfiAebaDwsdNWVFTJKHje+VwL3l2Sce/9llqKiY5okIGXfmC0JTctj6zYdNo2mJY3WxWoYHiNoedxZ+Un1Cun0oc7OBz6BVGva2MbcDHCnjduOCMLGEdrL5RTbb2OIyOAq8dIA0AeirRu5IVQTN3BueflZwkUSlJlN1GC1oVJ9vDgcdvZXsriG8d1I2bIwePlZK1KWDBVlvzG8kZHstHutsnMxqI92Yz3HO32wuoytbI13qFiq62seCMAevyouJZGSfJnOgWv7Zo2SejnhxU1jh4k4HAHfk+uOf3Xp62XelulO2anmY9jjxhwyV4dmpfw0ztrfvtOMLpPRG5Ulvvkt1udYGMgZsp4Xvw0E93bfUq6lVa91niut9FhU1XVNvV98+B6nyoqytlyjutIyoia9sT+W7xgke+Fehbx81aaeHyEREMBERAEREAREQBERAEREAREQBFA59lBuUBMigVAOQEyKGVFAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAFAnlRUh5OOyAmyFZ3K5w2uHxqglsQ7vDSQ374V2XADJOAPVafq/qJRaTEv4uJxhbF4m8cgj9eD+6w3hFtOnKrJRismka46qWmrdOLTdWVT4WHxaN4LQSPVru4K4JNHHU10s0Dg6Fz3OawjBbk5wmsNU0N9vclXTWuCgMh8TxKaF8PjMJOCWOJGfkd1YUdYwTENG0A5Hb+6505ts+u9Hso20MpYbXf/RlB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";
generateImage(strImg, "E:/1bak.jpg");
}
}
package com.thinkgem.jeesite.modules.messageCenter.api;
import com.thinkgem.jeesite.common.baseBean.Response;
import com.thinkgem.jeesite.common.constant.ComCode;
import com.thinkgem.jeesite.modules.messageCenter.bean.ArticleRequest;
import com.thinkgem.jeesite.modules.messageCenter.service.ArticleApiService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 首页通知
*/
@RestController
@RequestMapping("/api/article")
public class ArticleApiController {
@Autowired
private ArticleApiService articleApiService;
/**
* 获取消息列表
*
* @param request
* @return
*/
@PostMapping("/getArticles")
public Response getArticles(ArticleRequest request) {
Response resp = new Response();
try {
resp.setData(articleApiService.getArticles(request));
resp.setStatus(ComCode.STATUS_CODE_2000);
resp.setMessage(ComCode.STATUS_CODE_2000_DESC);
} catch (Exception e) {
resp.setStatus(ComCode.STATUS_CODE_9998);
resp.setMessage(ComCode.STATUS_CODE_9998_DESC);
resp.setError(e.getMessage());
}
return resp;
}
/**
* 获取消息详情
*
* @param request
* @return
*/
@PostMapping("/getArticleDetail")
public Response getArticleDetail(ArticleRequest request) {
Response resp = new Response();
try {
resp.setData(articleApiService.getArticleDetail(request));
resp.setStatus(ComCode.STATUS_CODE_2000);
resp.setMessage(ComCode.STATUS_CODE_2000_DESC);
} catch (Exception e) {
resp.setStatus(ComCode.STATUS_CODE_9998);
resp.setMessage(ComCode.STATUS_CODE_9998_DESC);
resp.setError(e.getMessage());
}
return resp;
}
}
package com.thinkgem.jeesite.modules.messageCenter.bean;
import com.thinkgem.jeesite.common.baseBean.Request;
public class ArticleRequest extends Request {
private int begin; // 起始条数
private String articleId; // 消息id
public String getArticleId() {
return articleId;
}
public void setArticleId(String articleId) {
this.articleId = articleId;
}
public int getBegin() {
return this.getPageSize() * (this.getPageNum() - 1);
}
}
package com.thinkgem.jeesite.modules.messageCenter.dao;
import com.thinkgem.jeesite.common.persistence.annotation.MyBatisDao;
import com.thinkgem.jeesite.modules.messageCenter.bean.ArticleRequest;
import com.thinkgem.jeesite.modules.messageCenter.entity.ArticleEntity;
import java.util.List;
@MyBatisDao
public interface ArticleApiDao {
List<ArticleEntity> getArticles(ArticleRequest request);
ArticleEntity getArticleDetail(ArticleRequest request);
}
package com.thinkgem.jeesite.modules.messageCenter.entity;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.thinkgem.jeesite.common.baseBean.BaseEntity;
import java.io.Serializable;
public class ArticleEntity extends BaseEntity implements Serializable {
private String title; // 标题
private String image; // 图片
@JsonIgnore
private String keywords; // 关键字
@JsonIgnore
private String description; // 摘要
private String publishDate; // 发布日期
@JsonIgnore
private String weight; // 权重
@JsonIgnore
private String hits; // 点击数
@JsonIgnore
private String is_flow; // 是否滚动通知
@JsonIgnore
private String is_tip; // 是否弹窗通知
private String content; // 内容
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getImage() {
return image;
}
public void setImage(String image) {
this.image = image;
}
public String getKeywords() {
return keywords;
}
public void setKeywords(String keywords) {
this.keywords = keywords;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getPublishDate() {
return publishDate;
}
public void setPublishDate(String publishDate) {
this.publishDate = publishDate;
}
public String getWeight() {
return weight;
}
public void setWeight(String weight) {
this.weight = weight;
}
public String getHits() {
return hits;
}
public void setHits(String hits) {
this.hits = hits;
}
public String getIs_flow() {
return is_flow;
}
public void setIs_flow(String is_flow) {
this.is_flow = is_flow;
}
public String getIs_tip() {
return is_tip;
}
public void setIs_tip(String is_tip) {
this.is_tip = is_tip;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
package com.thinkgem.jeesite.modules.messageCenter.service;
import com.thinkgem.jeesite.modules.messageCenter.bean.ArticleRequest;
import com.thinkgem.jeesite.modules.messageCenter.dao.ArticleApiDao;
import com.thinkgem.jeesite.modules.messageCenter.entity.ArticleEntity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
* 首页通知
*/
@Service
@Transactional(readOnly = true)
public class ArticleApiService {
@Autowired
private ArticleApiDao articleApiDao;
public List<ArticleEntity> getArticles(ArticleRequest request) throws Exception {
return articleApiDao.getArticles(request);
}
public ArticleEntity getArticleDetail(ArticleRequest request) throws Exception {
return articleApiDao.getArticleDetail(request);
}
}
package com.thinkgem.jeesite.modules.user.api;
import com.thinkgem.jeesite.common.baseBean.Response;
import com.thinkgem.jeesite.common.constant.ComCode;
import com.thinkgem.jeesite.common.utils.StringUtils;
import com.thinkgem.jeesite.modules.user.bean.IdentityCodeRequest;
import com.thinkgem.jeesite.modules.user.bean.UserRequest;
import com.thinkgem.jeesite.modules.user.entity.IdentityCodeEntity;
import com.thinkgem.jeesite.modules.user.entity.UserEntity;
import com.thinkgem.jeesite.modules.user.service.UserApiService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
/**
* 前端用户相关
*/
@RestController
@RequestMapping("/api/user")
public class UserApiController {
@Autowired
private UserApiService userService;
/**
* 判断是否已经实名认证
*
* @param request
* @return
*/
@PostMapping("/checkValidation")
public Response checkValidation(UserRequest request) {
Response resp = new Response();
try {
resp.setData(userService.getUserInfo(request));
resp.setStatus(ComCode.STATUS_CODE_2000);
resp.setMessage(ComCode.STATUS_CODE_2000_DESC);
} catch (Exception e) {
resp.setStatus(ComCode.STATUS_CODE_9998);
resp.setMessage(ComCode.STATUS_CODE_9998_DESC);
resp.setError(e.getMessage());
}
return resp;
}
/**
* 获取验证码
*
* @param request
* @return
*/
@PostMapping("/getIdentifyCode")
public Response getIdentifyCode(IdentityCodeRequest request) {
Response resp = new Response();
try {
// 判断业务入参是否为空
if (StringUtils.isBlank(request.getFunction()) || StringUtils.isBlank(request.getMobile())) {
resp.setStatus(ComCode.STATUS_CODE_3001);
resp.setMessage(ComCode.STATUS_CODE_3001_DESC);
return resp;
}
Map identifyCodeMap = new HashMap();
identifyCodeMap.put("indentifyCode", userService.getIdentifyCode(request));
resp.setData(identifyCodeMap);
resp.setStatus(ComCode.STATUS_CODE_2000);
resp.setMessage(ComCode.STATUS_CODE_2000_DESC);
} catch (Exception e) {
resp.setStatus(ComCode.STATUS_CODE_9998);
resp.setMessage(ComCode.STATUS_CODE_9998_DESC);
resp.setError(e.getMessage());
}
return resp;
}
/**
* 注册
*
* @param request
* @return
*/
@PostMapping("/signUp")
public Response signUp(UserRequest request) {
Response resp = new Response();
try {
// 判断业务入参是否为空
if (StringUtils.isBlank(request.getMobile()) || StringUtils.isBlank(request.getNewPassword()) || StringUtils.isBlank(request.getFunction()) || StringUtils.isBlank(request.getRecommendedMobile()) || StringUtils.isBlank(request.getIdentityCode())) {
resp.setStatus(ComCode.STATUS_CODE_4001);
resp.setMessage(ComCode.STATUS_CODE_4001_DESC);
return resp;
}
// 根据手机号 + 使用场景 + 验证码查询
IdentityCodeEntity identityCodeEntity = userService.getIdentifyCode(request);
// 验证码使用场景
if (identityCodeEntity == null) {
resp.setStatus(ComCode.STATUS_CODE_4010);
resp.setMessage(ComCode.STATUS_CODE_4010_DESC);
return resp;
}
// 验证码是否过期
if (!userService.checkIdentifyCodeExpired(identityCodeEntity)) {
resp.setStatus(ComCode.STATUS_CODE_4009);
resp.setMessage(ComCode.STATUS_CODE_4009_DESC);
return resp;
}
// 查询推荐人是否存在
if (userService.checkRecommend(request) == null) {
resp.setStatus(ComCode.STATUS_CODE_4006);
resp.setMessage(ComCode.STATUS_CODE_4006_DESC);
return resp;
}
// 查询注册手机号是否存在
if (userService.checkMobile(request) != null) {
resp.setStatus(ComCode.STATUS_CODE_4007);
resp.setMessage(ComCode.STATUS_CODE_4007_DESC);
return resp;
}
// 注册手机号与推荐人手机号是否重复
if (request.getMobile().equals(request.getRecommendedMobile())) {
resp.setStatus(ComCode.STATUS_CODE_4008);
resp.setMessage(ComCode.STATUS_CODE_4008_DESC);
return resp;
}
// 保存注册用户
resp.setData(userService.signUp(request));
resp.setStatus(ComCode.STATUS_CODE_2000);
resp.setMessage(ComCode.STATUS_CODE_2000_DESC);
} catch (Exception e) {
resp.setStatus(ComCode.STATUS_CODE_9998);
resp.setMessage(ComCode.STATUS_CODE_9998_DESC);
resp.setError(e.getMessage());
}
return resp;
}
/**
* 找回密码/修改密码
*
* @param request
* @return
*/
@PostMapping("/resetPassword")
public Response resetPassword(UserRequest request) {
Response resp = new Response();
try {
// 判断业务入参是否为空
if (StringUtils.isBlank(request.getMobile()) || StringUtils.isBlank(request.getNewPassword()) || StringUtils.isBlank(request.getFunction()) || StringUtils.isBlank(request.getIdentityCode())) {
resp.setStatus(ComCode.STATUS_CODE_4001);
resp.setMessage(ComCode.STATUS_CODE_4001_DESC);
return resp;
}
// 根据手机号 + 使用场景 + 验证码查询
IdentityCodeEntity identityCodeEntity = userService.getIdentifyCode(request);
// 验证码使用场景
if (identityCodeEntity == null) {
resp.setStatus(ComCode.STATUS_CODE_4010);
resp.setMessage(ComCode.STATUS_CODE_4010_DESC);
return resp;
}
// 验证码是否过期
if (!userService.checkIdentifyCodeExpired(identityCodeEntity)) {
resp.setStatus(ComCode.STATUS_CODE_4009);
resp.setMessage(ComCode.STATUS_CODE_4009_DESC);
return resp;
}
// 查询注册手机号是否存在
if (userService.checkMobile(request) == null) {
resp.setStatus(ComCode.STATUS_CODE_4004);
resp.setMessage(ComCode.STATUS_CODE_4004_DESC);
return resp;
}
userService.resetPassword(request);
resp.setStatus(ComCode.STATUS_CODE_2000);
resp.setMessage(ComCode.STATUS_CODE_2000_DESC);
} catch (Exception e) {
resp.setStatus(ComCode.STATUS_CODE_4005);
resp.setMessage(ComCode.STATUS_CODE_4005_DESC);
resp.setError(e.getMessage());
}
return resp;
}
/**
* 登录
*
* @param request
* @return
*/
@PostMapping("/login")
public Response login(UserRequest request) {
Response resp = new Response();
try {
// 判断业务入参是否为空
if (StringUtils.isBlank(request.getMobile()) || (StringUtils.isBlank(request.getPassword()) // 手机号 + 密码登录
&& !(!StringUtils.isBlank(request.getFunction()) && !StringUtils.isBlank(request.getIdentityCode())))) { // 手机号 + 验证码登录
resp.setStatus(ComCode.STATUS_CODE_4001);
resp.setMessage(ComCode.STATUS_CODE_4001_DESC);
return resp;
}
// 查询注册手机号是否存在
if (userService.checkMobile(request) == null) {
resp.setStatus(ComCode.STATUS_CODE_4004);
resp.setMessage(ComCode.STATUS_CODE_4004_DESC);
return resp;
}
UserEntity userEntity = null;
if (!StringUtils.isBlank(request.getMobile()) && !StringUtils.isBlank(request.getPassword())) {
userEntity = userService.getUserInfoByPassword(request);
if (userEntity == null) {
resp.setStatus(ComCode.STATUS_CODE_4002);
resp.setMessage(ComCode.STATUS_CODE_4002_DESC);
return resp;
}
} else if (!StringUtils.isBlank(request.getMobile()) && !StringUtils.isBlank(request.getFunction()) && !StringUtils.isBlank(request.getIdentityCode())) {
// 根据手机号 + 使用场景 + 验证码查询
IdentityCodeEntity identityCodeEntity = userService.getIdentifyCode(request);
// 验证码使用场景
if (identityCodeEntity == null) {
resp.setStatus(ComCode.STATUS_CODE_4010);
resp.setMessage(ComCode.STATUS_CODE_4010_DESC);
return resp;
}
// 验证码是否过期
if (!userService.checkIdentifyCodeExpired(identityCodeEntity)) {
resp.setStatus(ComCode.STATUS_CODE_4009);
resp.setMessage(ComCode.STATUS_CODE_4009_DESC);
return resp;
}
userEntity = userService.getUserInfoByIdentifyCode(request);
if (userEntity == null) {
resp.setStatus(ComCode.STATUS_CODE_4003);
resp.setMessage(ComCode.STATUS_CODE_4003_DESC);
return resp;
}
}
resp.setData(userService.getUserDetailInfo(userEntity));
resp.setStatus(ComCode.STATUS_CODE_2000);
resp.setMessage(ComCode.STATUS_CODE_2000_DESC);
} catch (Exception e) {
resp.setStatus(ComCode.STATUS_CODE_9998);
resp.setMessage(ComCode.STATUS_CODE_9998_DESC);
resp.setError(e.getMessage());
}
return resp;
}
/**
* 获取银行卡列表
*
* @param request
* @return
*/
@PostMapping("/getCardsInfo")
public Response getCardsInfo(UserRequest request) {
Response resp = new Response();
try {
// 判断业务入参是否为空
if (StringUtils.isBlank(request.getCardType())) {
resp.setStatus(ComCode.STATUS_CODE_4001);
resp.setMessage(ComCode.STATUS_CODE_4001_DESC);
return resp;
}
resp.setData(userService.getCardsInfo(request));
resp.setStatus(ComCode.STATUS_CODE_2000);
resp.setMessage(ComCode.STATUS_CODE_2000_DESC);
} catch (Exception e) {
resp.setStatus(ComCode.STATUS_CODE_9998);
resp.setMessage(ComCode.STATUS_CODE_9998_DESC);
resp.setError(e.getMessage());
}
return resp;
}
/**
* 移除银行卡
*
* @param request
* @return
*/
@PostMapping("/removeCards")
public Response removeCards(UserRequest request) {
Response resp = new Response();
try {
// 判断业务入参是否为空
if (StringUtils.isBlank(request.getCardType()) || request.getCardCodes().size() == 0) {
resp.setStatus(ComCode.STATUS_CODE_4001);
resp.setMessage(ComCode.STATUS_CODE_4001_DESC);
return resp;
}
userService.removeCards(request);
resp.setStatus(ComCode.STATUS_CODE_2000);
resp.setMessage(ComCode.STATUS_CODE_2000_DESC);
} catch (Exception e) {
resp.setStatus(ComCode.STATUS_CODE_9998);
resp.setMessage(ComCode.STATUS_CODE_9998_DESC);
resp.setError(e.getMessage());
}
return resp;
}
/**
* 添加银行卡
*
* @param request
* @return
*/
@PostMapping("/addNewCard")
public Response addNewCard(UserRequest request) {
Response resp = new Response();
try {
// 判断业务入参是否为空
if (StringUtils.isBlank(request.getSubMerchantCode()) || StringUtils.isBlank(request.getIdentityCode()) || StringUtils.isBlank(request.getFunction()) || StringUtils.isBlank(request.getCardType()) || StringUtils.isBlank(request.getCardNo()) || StringUtils.isBlank(request.getCardMobile()) || StringUtils.isBlank(request.getBelongBank()) || StringUtils.isBlank(request.getCardBank()) || StringUtils.isBlank(request.getCardPlace())) {
resp.setStatus(ComCode.STATUS_CODE_4001);
resp.setMessage(ComCode.STATUS_CODE_4001_DESC);
return resp;
}
// 根据手机号 + 使用场景 + 验证码查询
request.setMobile(request.getCardMobile());
IdentityCodeEntity identityCodeEntity = userService.getIdentifyCode(request);
// 验证码使用场景
if (identityCodeEntity == null // 未查询到
|| ("5".equals(request.getFunction()) && !"D".equals(request.getCardType())) // function = 储蓄卡,但cardType = 信用卡
|| ("6".equals(request.getFunction()) && !"C".equals(request.getCardType()))) { // function = 信用卡,但cardType = 储蓄卡
resp.setStatus(ComCode.STATUS_CODE_4010);
resp.setMessage(ComCode.STATUS_CODE_4010_DESC);
return resp;
}
// 验证码是否过期
if (!userService.checkIdentifyCodeExpired(identityCodeEntity)) {
resp.setStatus(ComCode.STATUS_CODE_4009);
resp.setMessage(ComCode.STATUS_CODE_4009_DESC);
return resp;
}
userService.addNewCard(request);
resp.setStatus(ComCode.STATUS_CODE_2000);
resp.setMessage(ComCode.STATUS_CODE_2000_DESC);
} catch (Exception e) {
resp.setStatus(ComCode.STATUS_CODE_9998);
resp.setMessage(ComCode.STATUS_CODE_9998_DESC);
resp.setError(e.getMessage());
}
return resp;
}
/**
* 意见反馈
*
* @param request
* @return
*/
@PostMapping("/addFeedback")
public Response addFeedback(UserRequest request) {
Response resp = new Response();
try {
// 判断业务入参是否为空
if (StringUtils.isBlank(request.getSubMerchantCode()) || StringUtils.isBlank(request.getFeedback())) {
resp.setStatus(ComCode.STATUS_CODE_4001);
resp.setMessage(ComCode.STATUS_CODE_4001_DESC);
return resp;
}
userService.addFeedback(request);
resp.setStatus(ComCode.STATUS_CODE_2000);
resp.setMessage(ComCode.STATUS_CODE_2000_DESC);
} catch (Exception e) {
resp.setStatus(ComCode.STATUS_CODE_9998);
resp.setMessage(ComCode.STATUS_CODE_9998_DESC);
resp.setError(e.getMessage());
}
return resp;
}
/**
* 关于我们
*
* @param request
* @return
*/
@PostMapping("/getAboutUsInfo")
public Response getAboutUsInfo(UserRequest request) {
Response resp = new Response();
try {
Map<String, String> map = new HashMap<>();
map.put("aboutUs", userService.getAboutUsInfo(request).getAboutInfo());
resp.setData(map);
resp.setStatus(ComCode.STATUS_CODE_2000);
resp.setMessage(ComCode.STATUS_CODE_2000_DESC);
} catch (Exception e) {
resp.setStatus(ComCode.STATUS_CODE_9998);
resp.setMessage(ComCode.STATUS_CODE_9998_DESC);
resp.setError(e.getMessage());
}
return resp;
}
/**
* 实名认证
*
* @param request
* @return
*/
@PostMapping("/certification")
public Response certification(UserRequest request) {
Response resp = new Response();
try {
// 判断业务入参是否为空
if (StringUtils.isBlank(request.getSubMerchantCode())
|| StringUtils.isBlank(request.getFunction()) || StringUtils.isBlank(request.getIdentityCode())
|| StringUtils.isBlank(request.getRealName()) || StringUtils.isBlank(request.getIdCard()) || StringUtils.isBlank(request.getIdCardPlace())
|| StringUtils.isBlank(request.getCardNo()) || StringUtils.isBlank(request.getCardMobile()) || StringUtils.isBlank(request.getBelongBank()) || StringUtils.isBlank(request.getCardPlace()) || StringUtils.isBlank(request.getCardBank())
|| StringUtils.isBlank(request.getIdCardFront()) || StringUtils.isBlank(request.getIdCardBack()) || StringUtils.isBlank(request.getIdCardHold()) || StringUtils.isBlank(request.getDebitCard())) {
resp.setStatus(ComCode.STATUS_CODE_4001);
resp.setMessage(ComCode.STATUS_CODE_4001_DESC);
return resp;
}
// 根据手机号 + 使用场景 + 验证码查询
request.setMobile(request.getCardMobile());
IdentityCodeEntity identityCodeEntity = userService.getIdentifyCode(request);
// 验证码使用场景
if (identityCodeEntity == null) {
resp.setStatus(ComCode.STATUS_CODE_4010);
resp.setMessage(ComCode.STATUS_CODE_4010_DESC);
return resp;
}
// 验证码是否过期
if (!userService.checkIdentifyCodeExpired(identityCodeEntity)) {
resp.setStatus(ComCode.STATUS_CODE_4009);
resp.setMessage(ComCode.STATUS_CODE_4009_DESC);
return resp;
}
userService.certification(request);
resp.setStatus(ComCode.STATUS_CODE_2000);
resp.setMessage(ComCode.STATUS_CODE_2000_DESC);
} catch (Exception e) {
resp.setStatus(ComCode.STATUS_CODE_9998);
resp.setMessage(ComCode.STATUS_CODE_9998_DESC);
resp.setError(e.getMessage());
}
return resp;
}
}
package com.thinkgem.jeesite.modules.user.bean;
import com.thinkgem.jeesite.common.baseBean.Request;
public class IdentityCodeRequest extends Request {
private String function; // 请求验证码的功能
private String mobile; // 手机号
public String getFunction() {
return function;
}
public void setFunction(String functioin) {
this.function = functioin;
}
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
}
package com.thinkgem.jeesite.modules.user.bean;
import com.thinkgem.jeesite.common.baseBean.Request;
import java.util.List;
public class UserRequest extends Request {
private String mobile; // 电话号码
private String password; // 密码
private String newPassword; // 新密码 用于注册功能、忘记密码功能、修改密码功能
private String recommendedMobile; // 推荐人手机号
private String identityCode; // 验证码
private String function; // 获取验证码的功能 1注册 2验证码登录 3忘记密码/修改密码 4实名认证 5添加储蓄卡 6添加信用卡
private String cardType; // 银行卡类型 D储蓄卡 C信用卡
private List<String> cardCodes; // 银行卡code
private String cardNo; // 卡号
private String cardMobile; // 预留手机号
private String belongBank; // 所属银行
private String cardBank; // 开户支行
private String cardPlace; // 开户地址
private String feedback; // 反馈意见
private String realName; // 真实姓名
private String idCard; // 身份证号
private String idCardPlace; // 身份证地址
private String idCardFront; // 身份证正面
private String idCardBack; // 身份证反面
private String idCardHold; // 手持身份证
private String debitCard; // 结算卡正面
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getNewPassword() {
return newPassword;
}
public void setNewPassword(String newPassword) {
this.newPassword = newPassword;
}
public String getRecommendedMobile() {
return recommendedMobile;
}
public void setRecommendedMobile(String recommendedMobile) {
this.recommendedMobile = recommendedMobile;
}
public String getIdentityCode() {
return identityCode;
}
public void setIdentityCode(String identityCode) {
this.identityCode = identityCode;
}
public String getFunction() {
return function;
}
public void setFunction(String function) {
this.function = function;
}
public String getCardType() {
return cardType;
}
public void setCardType(String cardType) {
this.cardType = cardType;
}
public List<String> getCardCodes() {
return cardCodes;
}
public void setCardCodes(List<String> cardCodes) {
this.cardCodes = cardCodes;
}
public String getCardNo() {
return cardNo;
}
public void setCardNo(String cardNo) {
this.cardNo = cardNo;
}
public String getCardMobile() {
return cardMobile;
}
public void setCardMobile(String cardMobile) {
this.cardMobile = cardMobile;
}
public String getBelongBank() {
return belongBank;
}
public void setBelongBank(String belongBank) {
this.belongBank = belongBank;
}
public String getCardBank() {
return cardBank;
}
public void setCardBank(String cardBank) {
this.cardBank = cardBank;
}
public String getCardPlace() {
return cardPlace;
}
public void setCardPlace(String cardPlace) {
this.cardPlace = cardPlace;
}
public String getFeedback() {
return feedback;
}
public void setFeedback(String feedback) {
this.feedback = feedback;
}
public String getRealName() {
return realName;
}
public void setRealName(String realName) {
this.realName = realName;
}
public String getIdCard() {
return idCard;
}
public void setIdCard(String idCard) {
this.idCard = idCard;
}
public String getIdCardPlace() {
return idCardPlace;
}
public void setIdCardPlace(String idCardPlace) {
this.idCardPlace = idCardPlace;
}
public String getIdCardFront() {
return idCardFront;
}
public void setIdCardFront(String idCardFront) {
this.idCardFront = idCardFront;
}
public String getIdCardBack() {
return idCardBack;
}
public void setIdCardBack(String idCardBack) {
this.idCardBack = idCardBack;
}
public String getIdCardHold() {
return idCardHold;
}
public void setIdCardHold(String idCardHold) {
this.idCardHold = idCardHold;
}
public String getDebitCard() {
return debitCard;
}
public void setDebitCard(String debitCard) {
this.debitCard = debitCard;
}
}
package com.thinkgem.jeesite.modules.user.dao;
import com.thinkgem.jeesite.common.baseBean.Request;
import com.thinkgem.jeesite.common.persistence.annotation.MyBatisDao;
import com.thinkgem.jeesite.modules.user.bean.UserRequest;
import com.thinkgem.jeesite.modules.user.entity.*;
import java.util.List;
@MyBatisDao
public interface UserApiDao {
UserEntity getUserInfo(Request request);
void saveIdentifyCode(IdentityCodeEntity identityCodeEntity);
IdentityCodeEntity getIdentifyCode(UserRequest request);
UserEntity checkRecommend(UserRequest request);
UserEntity checkMobile(UserRequest request);
void signUp(UserEntity userEntity);
void resetPassword(UserEntity request);
UserEntity getUserInfoByPassword(UserRequest request);
UserDetailEntity getUserDetailByCode(UserEntity code);
CardEntity getCardInfoByCode(UserEntity userEntity);
List<CardEntity> getCardsInfo(UserRequest request);
void removeCards(UserRequest request);
void addNewCard(CardEntity cardEntity);
void addFeedback(FeedbackEntity feedbackEntity);
AboutUsEntity getAboutUsInfo(UserRequest request);
void saveUserDetail(UserDetailEntity userDetailEntity);
void updateUserInfo(UserEntity userEntity);
}
package com.thinkgem.jeesite.modules.user.entity;
import com.thinkgem.jeesite.common.baseBean.BaseEntity;
import java.io.Serializable;
public class AboutUsEntity extends BaseEntity implements Serializable {
private String aboutInfo; // 关于
public String getAboutInfo() {
return aboutInfo;
}
public void setAboutInfo(String aboutInfo) {
this.aboutInfo = aboutInfo;
}
}
package com.thinkgem.jeesite.modules.user.entity;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.thinkgem.jeesite.common.baseBean.BaseEntity;
import java.io.Serializable;
public class CardEntity extends BaseEntity implements Serializable {
@JsonIgnore
private String userCode; // 用户code
private String cardType; // 银行卡类型 D储蓄卡 C信用卡
private String cardNo; // 卡号
@JsonIgnore
private String cardMobile; // 预留手机号
@JsonIgnore
private String belongBank; // 所属银行
@JsonIgnore
private String cardBank; // 开户支行
@JsonIgnore
private String cardPlace; // 开户地点
private String isDebit; // 是否是结算卡 Y是 N否
private String delFlag; // 删除标记 0未删除 1已删除
public CardEntity() {
}
public CardEntity(String code, String userCode, String cardType, String cardNo, String cardMobile, String belongBank, String cardBank, String cardPlace, String isDebit) {
this.setCode(code);
this.userCode = userCode;
this.cardType = cardType;
this.cardNo = cardNo;
this.cardMobile = cardMobile;
this.belongBank = belongBank;
this.cardBank = cardBank;
this.cardPlace = cardPlace;
this.isDebit = isDebit;
this.delFlag = "0";
this.setCreatedUser("sys");
this.setModifiedUser("sys");
}
public String getUserCode() {
return userCode;
}
public void setUserCode(String userCode) {
this.userCode = userCode;
}
public String getCardType() {
return cardType;
}
public void setCardType(String cardType) {
this.cardType = cardType;
}
public String getCardNo() {
return cardNo;
}
public void setCardNo(String cardNo) {
this.cardNo = cardNo;
}
public String getCardMobile() {
return cardMobile;
}
public void setCardMobile(String cardMobile) {
this.cardMobile = cardMobile;
}
public String getBelongBank() {
return belongBank;
}
public void setBelongBank(String belongBank) {
this.belongBank = belongBank;
}
public String getCardBank() {
return cardBank;
}
public void setCardBank(String cardBank) {
this.cardBank = cardBank;
}
public String getCardPlace() {
return cardPlace;
}
public void setCardPlace(String cardPlace) {
this.cardPlace = cardPlace;
}
public String getIsDebit() {
return isDebit;
}
public void setIsDebit(String isDebit) {
this.isDebit = isDebit;
}
public String getDelFlag() {
return delFlag;
}
public void setDelFlag(String delFlag) {
this.delFlag = delFlag;
}
}
package com.thinkgem.jeesite.modules.user.entity;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.thinkgem.jeesite.common.baseBean.BaseEntity;
import java.io.Serializable;
public class FeedbackEntity extends BaseEntity implements Serializable {
@JsonIgnore
private String userCode; // 用户code
private String feedback; // 反馈意见
public FeedbackEntity() {
}
public FeedbackEntity(String code, String userCode, String feedback) {
this.setCode(code);
this.userCode = userCode;
this.feedback = feedback;
this.setCreatedUser("sys");
this.setModifiedUser("sys");
}
public String getUserCode() {
return userCode;
}
public void setUserCode(String userCode) {
this.userCode = userCode;
}
public String getFeedback() {
return feedback;
}
public void setFeedback(String feedback) {
this.feedback = feedback;
}
}
package com.thinkgem.jeesite.modules.user.entity;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.thinkgem.jeesite.common.baseBean.BaseEntity;
import java.io.Serializable;
public class IdentityCodeEntity extends BaseEntity implements Serializable {
@JsonIgnore
private String function; // 获取验证码的功能 1注册 2验证码登录 3忘记密码/修改密码 4实名认证 5添加储蓄卡 6添加信用卡
@JsonIgnore
private String mobile; // 手机号
private String identityCode; // 验证码
public IdentityCodeEntity() {
}
public IdentityCodeEntity(String code, String function, String mobile, String identityCode) {
setCode(code);
this.function = function;
this.mobile = mobile;
this.identityCode = identityCode;
}
public String getFunction() {
return function;
}
public void setFunction(String function) {
this.function = function;
}
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
public String getIdentityCode() {
return identityCode;
}
public void setIdentityCode(String identityCode) {
this.identityCode = identityCode;
}
}
package com.thinkgem.jeesite.modules.user.entity;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.thinkgem.jeesite.common.baseBean.BaseEntity;
import java.io.Serializable;
public class UserDetailEntity extends BaseEntity implements Serializable {
@JsonIgnore
private String userCode; // 用户code
private String realName; // 真实姓名
private String idCard; // 身份证号
private String idCardPlace; // 身份证地址
private String idCardFront; // 身份证正面
private String idCardBack; // 身份证反面
private String idCardHold; // 手持身份证
private String debitCard; // 结算卡正面
private CardEntity card; // 结算卡信息
public UserDetailEntity() {
}
public UserDetailEntity(String code, String userCode, String realName, String idCard, String idCardPlace, String idCardFront, String idCardBack, String idCardHold, String debitCard) {
this.setCode(code);
this.userCode = userCode;
this.realName = realName;
this.idCard = idCard;
this.idCardPlace = idCardPlace;
this.idCardFront = idCardFront;
this.idCardBack = idCardBack;
this.idCardHold = idCardHold;
this.debitCard = debitCard;
this.setCreatedUser("sys");
this.setModifiedUser("sys");
}
public String getUserCode() {
return userCode;
}
public void setUserCode(String userCode) {
this.userCode = userCode;
}
public String getRealName() {
return realName;
}
public void setRealName(String realName) {
this.realName = realName;
}
public String getIdCard() {
return idCard;
}
public void setIdCard(String idCard) {
this.idCard = idCard;
}
public String getIdCardPlace() {
return idCardPlace;
}
public void setIdCardPlace(String idCardPlace) {
this.idCardPlace = idCardPlace;
}
public String getIdCardFront() {
return idCardFront;
}
public void setIdCardFront(String idCardFront) {
this.idCardFront = idCardFront;
}
public String getIdCardBack() {
return idCardBack;
}
public void setIdCardBack(String idCardBack) {
this.idCardBack = idCardBack;
}
public String getIdCardHold() {
return idCardHold;
}
public void setIdCardHold(String idCardHold) {
this.idCardHold = idCardHold;
}
public String getDebitCard() {
return debitCard;
}
public void setDebitCard(String debitCard) {
this.debitCard = debitCard;
}
public CardEntity getCard() {
return card;
}
public void setCard(CardEntity card) {
this.card = card;
}
}
package com.thinkgem.jeesite.modules.user.entity;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.thinkgem.jeesite.common.baseBean.BaseEntity;
import java.io.Serializable;
public class UserEntity extends BaseEntity implements Serializable {
private String nickname; // 昵称 注册时默认为等级_手机号
@JsonIgnore
private String subMerchantId; // 子商户id
private String level; // 等级 S管理员 A王者 B钻石 C黄金 D白银 E青铜
private String mobile; // 电话
@JsonIgnore
private String password; // 密码
private String avatar; // 头像
@JsonIgnore
private String recommendedMobile; // 推荐人手机号
@JsonIgnore
private String recommendedPath; // 推荐人路径
@JsonIgnore
private String belongTo; // 归属 B佰邦达 S盛世互通
private String status; // 状态 0未实名 1审核中 2已实名
private UserDetailEntity userDetail; // 用户详情
public UserEntity() {
}
public UserEntity(String code, String subMerchantId, String mobile, String password, String recommendedMobile, String recommendedPath, String belongTo) {
this.setCode(code);
this.nickname = "E_" + mobile;
this.subMerchantId = subMerchantId;
this.level = "E";
this.mobile = mobile;
this.password = password;
this.avatar = "";
this.recommendedMobile = recommendedMobile;
this.recommendedPath = recommendedPath;
this.belongTo = belongTo;
this.status = "0";
this.setCreatedUser("sys");
this.setModifiedUser("sys");
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public String getSubMerchantId() {
return subMerchantId;
}
public void setSubMerchantId(String subMerchantId) {
this.subMerchantId = subMerchantId;
}
public String getLevel() {
return level;
}
public void setLevel(String level) {
this.level = level;
}
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getAvatar() {
return avatar;
}
public void setAvatar(String avatar) {
this.avatar = avatar;
}
public String getRecommendedMobile() {
return recommendedMobile;
}
public void setRecommendedMobile(String recommendedMobile) {
this.recommendedMobile = recommendedMobile;
}
public String getRecommendedPath() {
return recommendedPath;
}
public void setRecommendedPath(String recommendedPath) {
this.recommendedPath = recommendedPath;
}
public String getBelongTo() {
return belongTo;
}
public void setBelongTo(String belongTo) {
this.belongTo = belongTo;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public UserDetailEntity getUserDetail() {
return userDetail;
}
public void setUserDetail(UserDetailEntity userDetail) {
this.userDetail = userDetail;
}
}
package com.thinkgem.jeesite.modules.user.service;
import com.thinkgem.jeesite.common.baseBean.Request;
import com.thinkgem.jeesite.common.config.Global;
import com.thinkgem.jeesite.common.constant.ComCode;
import com.thinkgem.jeesite.common.utils.DateUtils;
import com.thinkgem.jeesite.common.utils.IdGen;
import com.thinkgem.jeesite.common.utils.MD5;
import com.thinkgem.jeesite.modules.user.bean.IdentityCodeRequest;
import com.thinkgem.jeesite.modules.user.bean.UserRequest;
import com.thinkgem.jeesite.modules.user.dao.UserApiDao;
import com.thinkgem.jeesite.modules.user.entity.*;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.text.ParseException;
import java.util.Date;
import java.util.List;
/**
* 前端用户相关
*/
@Service
@Transactional(readOnly = true)
public class UserApiService {
@Autowired
private UserApiDao userDao;
public UserEntity getUserInfo(UserRequest request) {
return userDao.getUserInfo(request);
}
@Transactional(readOnly = false)
public String getIdentifyCode(IdentityCodeRequest request) {
// 生成验证码
String identifyCode = IdGen.randomBase62(6).toUpperCase();
// TODO 发送验证码
// 验证码入库
IdentityCodeEntity identityCodeEntity = new IdentityCodeEntity(IdGen.randomBase62(64), request.getFunction(), request.getMobile(), identifyCode);
userDao.saveIdentifyCode(identityCodeEntity);
// 返回验证码
return identifyCode;
}
public IdentityCodeEntity getIdentifyCode(UserRequest request) {
return userDao.getIdentifyCode(request);
}
public boolean checkIdentifyCodeExpired(IdentityCodeEntity identityCodeEntity) throws ParseException {
Date now = new Date();
Date created = ComCode.YYYYMMDD_HHMMSS.parse(identityCodeEntity.getCreated());
// 验证码半小时内有效
if ((now.getTime() - created.getTime()) < (30 * ComCode.seconds * ComCode.mills)) {
return true;
}
return false;
}
public UserEntity checkRecommend(UserRequest request) {
return userDao.checkRecommend(request);
}
public UserEntity checkMobile(UserRequest request) {
return userDao.checkMobile(request);
}
@Transactional(readOnly = false)
public UserEntity signUp(UserRequest request) {
// 申请子商户号
String subMerchantId = "subMerchantId" + DateUtils.formatDateTime(new Date());
// 保存用户信息
String code = IdGen.randomBase62(64);
UserEntity recommend = userDao.checkRecommend(request);
UserEntity userEntity = new UserEntity(code, subMerchantId, request.getMobile(), MD5.sign(request.getNewPassword(), ComCode.signCode, "utf-8"), request.getRecommendedMobile(), recommend.getRecommendedPath() + recommend.getId() + ",", recommend.getBelongTo());
userDao.signUp(userEntity);
return userDao.getUserInfo(new Request(code));
}
@Transactional(readOnly = false)
public void resetPassword(UserRequest request) {
// 根据手机号查询用户信息,因为Controller层判断过用户信息,因此此处一定可以查到用户信息
UserEntity userEntity = userDao.checkMobile(request);
userEntity.setPassword(MD5.sign(request.getNewPassword(), ComCode.signCode, "utf-8"));
// 重置密码
userDao.resetPassword(userEntity);
}
public UserEntity getUserInfoByPassword(UserRequest request) {
request.setPassword(MD5.sign(request.getPassword(), ComCode.signCode, "utf-8"));
return userDao.getUserInfoByPassword(request);
}
public UserEntity getUserInfoByIdentifyCode(UserRequest request) {
// Controller层判断过验证码信息,因此直接根据手机号查询用户信息即可
return userDao.checkMobile(request);
}
public UserEntity getUserDetailInfo(UserEntity userEntity) {
// 根据用户code获取用户详情
UserDetailEntity userDetailEntity = userDao.getUserDetailByCode(userEntity);
userEntity.setUserDetail(userDetailEntity);
// 获取用户结算卡信息
CardEntity cardEntity = userDao.getCardInfoByCode(userEntity);
userEntity.getUserDetail().setCard(cardEntity);
return userEntity;
}
public List<CardEntity> getCardsInfo(UserRequest request) {
return userDao.getCardsInfo(request);
}
@Transactional(readOnly = false)
public void removeCards(UserRequest request) {
userDao.removeCards(request);
}
@Transactional(readOnly = false)
public void addNewCard(UserRequest request) {
String code = IdGen.randomBase62(64);
CardEntity cardEntity = new CardEntity(code, request.getSubMerchantCode(), request.getCardType(), request.getCardNo(), request.getCardMobile(), request.getBelongBank(), request.getCardBank(), request.getCardPlace(), "N");
userDao.addNewCard(cardEntity);
}
@Transactional(readOnly = false)
public void addFeedback(UserRequest request) {
String code = IdGen.randomBase62(64);
FeedbackEntity feedbackEntity = new FeedbackEntity(code, request.getSubMerchantCode(), request.getFeedback());
userDao.addFeedback(feedbackEntity);
}
public AboutUsEntity getAboutUsInfo(UserRequest request) {
return userDao.getAboutUsInfo(request);
}
@Transactional(readOnly = false)
public void certification(UserRequest request) {
// 更新用户详情
UserDetailEntity userDetailEntity = new UserDetailEntity(IdGen.randomBase62(64), request.getSubMerchantCode(), request.getRealName(), request.getIdCard(), request.getIdCardPlace(), request.getIdCardFront().replace(Global.getConfig("sys.pre.url"), ""), request.getIdCardBack().replace(Global.getConfig("sys.pre.url"), ""), request.getIdCardHold().replace(Global.getConfig("sys.pre.url"), ""), request.getDebitCard().replace(Global.getConfig("sys.pre.url"), ""));
userDao.saveUserDetail(userDetailEntity);
// 更新银行卡详情
CardEntity cardEntity = new CardEntity(IdGen.randomBase62(64), request.getSubMerchantCode(), "D", request.getCardNo(), request.getCardMobile(), request.getBelongBank(), request.getCardBank(), request.getCardPlace(), "Y");
userDao.addNewCard(cardEntity);
// 更新用户状态
UserEntity userEntity = new UserEntity();
userEntity.setCode(request.getSubMerchantCode());
userEntity.setStatus("1");
userDao.updateUserInfo(userEntity);
}
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.thinkgem.jeesite.modules.messageCenter.dao.ArticleApiDao">
<select id="getArticles" resultType="com.thinkgem.jeesite.modules.messageCenter.entity.ArticleEntity">
SELECT
a.id,
a.title,
a.image,
a.keywords,
a.description,
DATE_FORMAT(a.create_date,'%Y-%m-%d') AS publishDate,
a.weight,
a.hits,
a.is_flow,
a.is_tip,
a.create_date AS created,
a.create_by AS createdUser,
a.update_date AS modified,
a.update_by AS modifiedUser
FROM
cms_article a
WHERE
a.is_flow = 'N'
AND a.is_tip = 'N'
ORDER BY
a.create_date DESC,
a.weight DESC
LIMIT #{begin},#{pageSize}
</select>
<select id="getArticleDetail" resultType="com.thinkgem.jeesite.modules.messageCenter.entity.ArticleEntity">
SELECT
a.id,
a.title,
a.image,
a.keywords,
a.description,
DATE_FORMAT(a.create_date,'%Y-%m-%d') AS publishDate,
a.weight,
a.hits,
a.is_flow,
a.is_tip,
a.create_date AS created,
a.create_by AS createdUser,
a.update_date AS modified,
a.update_by AS modifiedUser,
b.content
FROM
cms_article a
LEFT JOIN cms_article_data b ON a.id = b.id
WHERE
a.id = #{articleId}
ORDER BY
a.create_date DESC,
a.weight DESC
</select>
</mapper>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.thinkgem.jeesite.modules.user.dao.UserApiDao">
<select id="getUserInfo" resultType="com.thinkgem.jeesite.modules.user.entity.UserEntity">
SELECT
yu.id,
yu.code,
yu.nickname,
yu.sub_merchant_id AS subMerchantId,
yu.level,
yu.mobile,
yu.password,
yu.avatar,
yu.recommended_mobile AS recommendedMobile,
yu.recommended_path AS recommendedPath,
yu.belong_to AS belongTo,
yu.status,
yu.create_date AS created,
yu.create_by AS createdUser,
yu.update_date AS modified,
yu.update_by AS modifiedUser
FROM
youka_users yu
WHERE
yu.code = #{subMerchantCode}
</select>
<insert id="saveIdentifyCode">
INSERT INTO youka_identity_code (
code,
func,
mobile,
identity_code,
create_by,
update_by
)
VALUES
(#{code}, #{function}, #{mobile}, #{identityCode}, 'sys', 'sys')
</insert>
<select id="getIdentifyCode" resultType="com.thinkgem.jeesite.modules.user.entity.IdentityCodeEntity">
SELECT
yic.id,
yic.code,
yic.func AS function,
yic.mobile,
yic.identity_code AS identityCode,
yic.create_date AS created,
yic.create_by AS createdUser,
yic.update_date AS modified,
yic.update_by AS modifiedUser
FROM
youka_identity_code yic
WHERE
yic.func = #{function}
AND yic.mobile = #{mobile}
AND yic.identity_code = #{identityCode}
</select>
<select id="checkRecommend" resultType="com.thinkgem.jeesite.modules.user.entity.UserEntity">
SELECT
yu.id,
yu.code,
yu.nickname,
yu.sub_merchant_id AS subMerchantId,
yu.level,
yu.mobile,
yu.password,
yu.avatar,
yu.recommended_mobile AS recommendedMobile,
yu.recommended_path AS recommendedPath,
yu.belong_to AS belongTo,
yu.status,
yu.create_date AS created,
yu.create_by AS createdUser,
yu.update_date AS modified,
yu.update_by AS modifiedUser
FROM
youka_users yu
WHERE
yu.recommended_mobile = #{recommendedMobile}
</select>
<select id="checkMobile" resultType="com.thinkgem.jeesite.modules.user.entity.UserEntity">
SELECT
yu.id,
yu.code,
yu.nickname,
yu.sub_merchant_id AS subMerchantId,
yu.level,
yu.mobile,
yu.password,
yu.avatar,
yu.recommended_mobile AS recommendedMobile,
yu.recommended_path AS recommendedPath,
yu.belong_to AS belongTo,
yu.status,
yu.create_date AS created,
yu.create_by AS createdUser,
yu.update_date AS modified,
yu.update_by AS modifiedUser
FROM
youka_users yu
WHERE
yu.mobile = #{mobile}
</select>
<insert id="signUp">
INSERT INTO youka_users (
code,
nickname,
sub_merchant_id,
level,
mobile,
password,
avatar,
recommended_mobile,
recommended_path,
belong_to,
status,
create_by,
update_by
)
VALUES
(#{code}, #{nickname}, #{subMerchantId}, #{level}, #{mobile}, #{password}, #{avatar}, #{recommendedMobile}, #{recommendedPath}, #{belongTo}, #{status}, #{createdUser}, #{modifiedUser})
</insert>
<update id="resetPassword">
UPDATE youka_users
SET password = #{password}
WHERE
code = #{code}
</update>
<select id="getUserInfoByPassword" resultType="com.thinkgem.jeesite.modules.user.entity.UserEntity">
SELECT
yu.id,
yu.code,
yu.nickname,
yu.sub_merchant_id AS subMerchantId,
yu.level,
yu.mobile,
yu.password,
yu.avatar,
yu.recommended_mobile AS recommendedMobile,
yu.recommended_path AS recommendedPath,
yu.belong_to AS belongTo,
yu.status,
yu.create_date AS created,
yu.create_by AS createdUser,
yu.update_date AS modified,
yu.update_by AS modifiedUser
FROM
youka_users yu
WHERE
yu.mobile = #{mobile}
AND yu.password = #{password}
</select>
<select id="getUserDetailByCode" resultType="com.thinkgem.jeesite.modules.user.entity.UserDetailEntity">
SELECT
yud.id,
yud.code,
yud.user_code AS userCode,
yud.real_name AS realName,
yud.id_card AS idCard,
yud.id_card_place AS idCardPlace,
yud.id_card_front AS idCardFront,
yud.id_card_back AS idCardBack,
yud.id_card_hold AS idCardHold,
yud.debit_card AS debitCard,
yud.create_date AS created,
yud.create_by AS createdUser,
yud.update_date AS modified,
yud.update_by AS modifiedUser
FROM
youka_user_details yud
WHERE
yud.user_code = #{code}
</select>
<select id="getCardInfoByCode" resultType="com.thinkgem.jeesite.modules.user.entity.CardEntity">
SELECT
yc.id,
yc.code,
yc.user_code AS userCode,
yc.card_type AS cardType,
yc.card_no AS cardNo,
yc.card_mobile AS cardMobile,
yc.belong_bank AS belongBank,
yc.card_bank AS cardBank,
yc.card_place AS cardPlace,
yc.is_debit AS isDebit,
yc.create_date AS created,
yc.create_by AS createdUser,
yc.update_date AS modified,
yc.update_by AS modifiedUser,
yc.del_flag AS delFlag
FROM
youka_cards yc
WHERE
yc.user_code = #{code}
AND yc.is_debit = 'Y'
</select>
<select id="getCardsInfo" resultType="com.thinkgem.jeesite.modules.user.entity.CardEntity">
SELECT
yc.id,
yc.code,
yc.user_code AS userCode,
yc.card_type AS cardType,
yc.card_no AS cardNo,
yc.card_mobile AS cardMobile,
yc.belong_bank AS belongBank,
yc.card_bank AS cardBank,
yc.card_place AS cardPlace,
yc.is_debit AS isDebit,
yc.create_date AS created,
yc.create_by AS createdUser,
yc.update_date AS modified,
yc.update_by AS modifiedUser,
yc.del_flag AS delFlag
FROM
youka_cards yc
WHERE
yc.user_code = #{subMerchantCode}
AND yc.card_type = #{cardType}
AND yc.del_flag = '0'
</select>
<update id="removeCards">
UPDATE
youka_cards
SET
del_flag = '1'
WHERE code IN
<foreach collection="cardCodes" separator="," open="(" close=")" index="index" item="cardCode">
#{cardCode}
</foreach>
</update>
<insert id="addNewCard">
INSERT INTO youka_cards (
code,
user_code,
card_type,
card_no,
card_mobile,
belong_bank,
card_bank,
card_place,
is_debit,
create_by,
update_by,
del_flag
)
VALUES
(#{code}, #{userCode}, #{cardType}, #{cardNo}, #{cardMobile}, #{belongBank}, #{cardBank}, #{cardPlace}, #{isDebit}, #{createdUser}, #{modifiedUser}, #{delFlag})
</insert>
<insert id="addFeedback">
INSERT INTO youka_feedback (
code,
user_code,
feedback,
create_by,
update_by
)
VALUES
(#{code}, #{userCode}, #{feedback}, #{createdUser}, #{modifiedUser})
</insert>
<select id="getAboutUsInfo" resultType="com.thinkgem.jeesite.modules.user.entity.AboutUsEntity">
SELECT
yau.id,
yau.code,
yau.about_info AS aboutInfo,
yau.create_date AS created,
yau.create_by AS createdUser,
yau.update_date AS modified,
yau.update_by AS modifiedUse
FROM
youka_about_us yau
ORDER BYd
yau.update_date DESC
LIMIT 1
</select>
<insert id="saveUserDetail">
INSERT INTO youka_user_details (
code,
user_code,
real_name,
id_card,
id_card_place,
id_card_front,
id_card_back,
id_card_hold,
debit_card,
create_by,
update_by
)
VALUES
(#{code}, #{userCode}, #{realName}, #{idCard}, #{idCardPlace}, #{idCardFront}, #{idCardBack}, #{idCardHold}, #{debitCard}, #{createdUser}, #{modifiedUser})
</insert>
<update id="updateUserInfo">
UPDATE youka_users
SET code = #{code}
<if test="status != null and status !=''">
, status = #{status}
</if>
WHERE code = #{code}
</update>
</mapper>
\ No newline at end of file
......@@ -12,9 +12,12 @@
#mysql database setting
jdbc.type=mysql
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/youka?useUnicode=true&characterEncoding=utf-8
jdbc.username=root
jdbc.password=admin
#jdbc.url=jdbc:mysql://localhost:3306/youka?useUnicode=true&characterEncoding=utf-8
#jdbc.username=root
#jdbc.password=admin
jdbc.url=jdbc:mysql://mysql.zhennan-test.svc:3306/mydb?useUnicode=true&characterEncoding=utf-8
jdbc.username=myuser
jdbc.password=mypassword
#mssql database settings
#jdbc.type=mssql
......@@ -126,6 +129,7 @@ activiti.form.server.url=
#路径前缀
sys.pre.url=http://localhost:8080/
#图片文件保存地址
image.save.url=D:/youka/images/
#image.save.url=D:/youka/images/
image.save.url=/youka/image
#图片返回路径
image.return.url=images/
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment