@ -0,0 +1,40 @@ | |||
package org.jeecg.modules.api.teambuyController; | |||
import io.swagger.annotations.Api; | |||
import io.swagger.annotations.ApiOperation; | |||
import lombok.extern.slf4j.Slf4j; | |||
import org.jeecg.common.api.vo.Result; | |||
import org.jeecg.modules.apiService.LoginApiService; | |||
import org.jeecg.modules.bean.LoginReq; | |||
import org.springframework.web.bind.annotation.GetMapping; | |||
import org.springframework.web.bind.annotation.RequestMapping; | |||
import org.springframework.web.bind.annotation.RestController; | |||
import javax.annotation.Resource; | |||
@Api(tags="登录-登录相关接口") | |||
@RestController | |||
@RequestMapping("/teambuy/login") | |||
@Slf4j | |||
public class ApiLoginController { | |||
/******************************************************************************************************************/ | |||
//工作信息 | |||
@Resource | |||
private LoginApiService loginApiService; | |||
/******************************************************************************************************************/ | |||
//小程序-微信授权登录接口 | |||
@ApiOperation(value="小程序-微信授权登录接口", notes="小程序-微信授权登录接口") | |||
@GetMapping("/login") | |||
public Result<?> login(LoginReq loginReq){ | |||
return loginApiService.login(loginReq); | |||
} | |||
//绑定手机号码 | |||
@ApiOperation(value="小程序-绑定手机号码", notes="小程序-绑定手机号码") | |||
@GetMapping(value = "/bindPhone") | |||
public Result<Object> bindPhone(String phoneCode){ | |||
return loginApiService.bindPhone(phoneCode); | |||
} | |||
} |
@ -0,0 +1,44 @@ | |||
package org.jeecg.modules.api.teambuyController; | |||
import io.swagger.annotations.Api; | |||
import io.swagger.annotations.ApiOperation; | |||
import lombok.extern.slf4j.Slf4j; | |||
import org.jeecg.common.api.vo.Result; | |||
import org.jeecg.modules.apiBean.PageBean; | |||
import org.jeecg.modules.apiService.RecommendService; | |||
import org.springframework.web.bind.annotation.RequestHeader; | |||
import org.springframework.web.bind.annotation.RequestMapping; | |||
import org.springframework.web.bind.annotation.RequestMethod; | |||
import org.springframework.web.bind.annotation.RestController; | |||
import javax.annotation.Resource; | |||
@Api(tags="我的-邀请好友&我的团队相关接口") | |||
@RestController | |||
@RequestMapping("/teambuy/share") | |||
@Slf4j | |||
public class RecommendController { | |||
/******************************************************************************************************************/ | |||
//邀请好友 | |||
@Resource | |||
private RecommendService recommendService; | |||
/******************************************************************************************************************/ | |||
//邀请好友-获取推荐二维码 | |||
@ApiOperation(value="我的-获取推荐二维码", notes="我的-获取推荐二维码") | |||
@RequestMapping(value = "/getInviteCode", method = {RequestMethod.POST}) | |||
public Result<?> getInviteCode(@RequestHeader("X-Access-Token") String token){ | |||
return recommendService.getInviteCode(token); | |||
} | |||
//我的团队-查询直推用户列表 | |||
@ApiOperation(value="我的团队-查询直推用户列表", notes="我的-获取直推用户列表") | |||
@RequestMapping(value = "/queryRecommendUserList", method = {RequestMethod.POST}) | |||
public Result<?> queryRecommendUserList(@RequestHeader("X-Access-Token") String token, PageBean pageBean){ | |||
return recommendService.queryRecommendUserList(token, pageBean); | |||
} | |||
} |
@ -0,0 +1,19 @@ | |||
package org.jeecg.modules.apiBean; | |||
import io.swagger.annotations.ApiModelProperty; | |||
import lombok.Data; | |||
@Data | |||
public class PageBean { | |||
/**显示条数*/ | |||
@ApiModelProperty(value = "显示条数" ) | |||
private Integer pageSize; | |||
/**当前页*/ | |||
@ApiModelProperty(value = "当前页" ) | |||
private Integer pageNo; | |||
public PageBean() { | |||
this.pageNo = 1; | |||
this.pageSize = 1000; | |||
} | |||
} |
@ -0,0 +1,14 @@ | |||
package org.jeecg.modules.apiBean; | |||
import io.swagger.annotations.ApiModelProperty; | |||
import lombok.Data; | |||
@Data | |||
public class WxQrCodeVo { | |||
/**图片地址*/ | |||
@ApiModelProperty(value = "图片地址") | |||
private String url; | |||
@ApiModelProperty(value = "名称") | |||
private String name; | |||
} |
@ -0,0 +1,12 @@ | |||
package org.jeecg.modules.apiService; | |||
import org.jeecg.common.api.vo.Result; | |||
import org.jeecg.modules.bean.LoginReq; | |||
public interface LoginApiService { | |||
//小程序-微信授权登录接口 | |||
public Result<?> login(LoginReq loginReq); | |||
//绑定手机号码 | |||
public Result<Object> bindPhone(String phoneCode); | |||
} |
@ -0,0 +1,12 @@ | |||
package org.jeecg.modules.apiService; | |||
import org.jeecg.common.api.vo.Result; | |||
import org.jeecg.modules.apiBean.PageBean; | |||
public interface RecommendService { | |||
//邀请好友-获取推荐二维码 | |||
public Result<?> getInviteCode(String token); | |||
//我的团队-查询直推用户列表 | |||
public Result<?> queryRecommendUserList(String token, PageBean pageBean); | |||
} |
@ -0,0 +1,168 @@ | |||
package org.jeecg.modules.apiService.impl; | |||
import com.alibaba.fastjson.JSONObject; | |||
import org.apache.commons.lang3.StringUtils; | |||
import org.jeecg.common.api.vo.Result; | |||
import org.jeecg.common.constant.CommonConstant; | |||
import org.jeecg.common.exception.JeecgBootException; | |||
import org.jeecg.common.system.util.JwtUtil; | |||
import org.jeecg.common.util.RedisUtil; | |||
import org.jeecg.modules.apiService.LoginApiService; | |||
import org.jeecg.modules.bean.HttpConf; | |||
import org.jeecg.modules.bean.LoginReq; | |||
import org.jeecg.modules.hanHaiMember.entity.HanHaiMember; | |||
import org.jeecg.modules.hanHaiMember.service.IHanHaiMemberService; | |||
import org.springframework.stereotype.Service; | |||
import javax.annotation.Resource; | |||
import java.io.BufferedReader; | |||
import java.io.DataOutputStream; | |||
import java.io.InputStreamReader; | |||
import java.net.HttpURLConnection; | |||
import java.net.URL; | |||
import java.nio.charset.StandardCharsets; | |||
import java.util.HashMap; | |||
import java.util.Map; | |||
@Service | |||
public class LoginApiServiceImpl implements LoginApiService { | |||
/******************************************************************************************************************/ | |||
//微信小程序appid(敢为人鲜) | |||
private static final String mpAppId = "wx94a640f07969d6c9"; | |||
//微信小程序appSecret(敢为人鲜) | |||
private static final String mpAppSecret = ""; | |||
@Resource | |||
private RedisUtil redisUtil; | |||
@Resource | |||
private IHanHaiMemberService hanHaiMemberService; | |||
@Resource | |||
private HttpConf httpConf; | |||
/******************************************************************************************************************/ | |||
@Override | |||
public Result<?> login(LoginReq loginReq) { | |||
Result<Object> result = new Result<>(); | |||
Map<String, Object> map = new HashMap<>(); | |||
if (StringUtils.isBlank(loginReq.getCode())) { | |||
throw new JeecgBootException("小程序code为空"); | |||
} | |||
String loginUrl = "https://api.weixin.qq.com/sns/jscode2session?appid=" + mpAppId + "&secret=" + mpAppSecret+ "&js_code=" + loginReq.getCode() + "&grant_type=authorization_code"; | |||
//使用工具类 | |||
JSONObject json_test = httpConf.getJSONObject(loginUrl); | |||
String wxOpenid = json_test.getString("openid"); | |||
String sessionKey = json_test.getString("session_key"); | |||
if (StringUtils.isBlank(wxOpenid)) { | |||
throw new JeecgBootException("未获取到openid"); | |||
} | |||
HanHaiMember member = hanHaiMemberService.lambdaQuery().eq(HanHaiMember::getAppletOpenid,wxOpenid).one(); | |||
if (member == null) { | |||
//如果user等于null说明该用户第一次登录,数据库没有该用户信息。 | |||
loginReq.setOpenid(wxOpenid); | |||
loginReq.setSession_key(sessionKey); | |||
member = new HanHaiMember(); | |||
// member.setSesssionKey(sessionKey); | |||
member.setAppletOpenid(wxOpenid); | |||
member.setNickName(loginReq.getNickName()); | |||
member.setHeadImage(loginReq.getHeadimgurl()); | |||
// 生成token返回给小程序端 | |||
String token = JwtUtil.sign(member.getAppletOpenid(), wxOpenid); | |||
hanHaiMemberService.save(member); | |||
redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, token); | |||
// 设置超时时间 | |||
redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, JwtUtil.EXPIRE_TIME / 100); | |||
map.put("userInfo", member); | |||
map.put("token", token); | |||
result.setCode(200); | |||
result.setResult(map); | |||
return result; | |||
} else { | |||
// member.setHeadImage(loginReq.getHeadimgurl()); | |||
// member.setSessionKey(sessionKey); | |||
// memberService.saveOrUpdate(member); | |||
// 生成token返回给小程序端 | |||
String token = JwtUtil.sign(member.getAppletOpenid(), wxOpenid); | |||
redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, token); | |||
// 设置超时时间 | |||
redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, JwtUtil.EXPIRE_TIME / 100); | |||
map.put("userInfo", member); | |||
map.put("token", token); | |||
//用户id做im账号 | |||
result.setResult(map); | |||
result.setCode(200); | |||
// result.setMessage(member.getNickName()+"已于"+member.getCreateTime()+"注册成功!请勿重复注册!"); | |||
// // 未绑定手机号,跳转授权绑定手机号 | |||
// if (StringUtils.isBlank(member.getPhone())) { | |||
// result.setMessage("该微信用户尚未绑定手机号,请授权手机进行绑定"); | |||
// result.setCode(905); | |||
// result.setResult(map); | |||
// return result; | |||
// } | |||
} | |||
return result; | |||
} | |||
@Override | |||
public Result<Object> bindPhone(String phoneCode) { | |||
try { | |||
String phoneNumber = this.getPhoneNumber(phoneCode); | |||
return Result.OK(phoneNumber); | |||
}catch (Exception e){ | |||
return Result.error(e.getMessage()); | |||
} | |||
} | |||
private static final String API_URL = "https://api.weixin.qq.com/wxa/business/getuserphonenumber"; | |||
public String getPhoneNumber(String code) throws Exception { | |||
URL url = new URL(API_URL + "?access_token=" + this.getAccessToken()); | |||
HttpURLConnection conn = (HttpURLConnection) url.openConnection(); | |||
conn.setRequestMethod("POST"); | |||
conn.setRequestProperty("Content-Type", "application/json; utf-8"); | |||
conn.setRequestProperty("Accept", "application/json"); | |||
conn.setDoOutput(true); | |||
JSONObject jsonInput = new JSONObject(); | |||
jsonInput.put("code", code); | |||
try (DataOutputStream os = new DataOutputStream(conn.getOutputStream())) { | |||
byte[] input = jsonInput.toString().getBytes(StandardCharsets.UTF_8); | |||
os.write(input, 0, input.length); | |||
} | |||
try (BufferedReader br = new BufferedReader( | |||
new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8))) { | |||
StringBuilder response = new StringBuilder(); | |||
String responseLine; | |||
while ((responseLine = br.readLine()) != null) { | |||
response.append(responseLine.trim()); | |||
} | |||
//获取手机号码 | |||
return response.toString(); | |||
} | |||
} | |||
private static final String TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s"; | |||
public String getAccessToken() throws Exception { | |||
String requestUrl = String.format(TOKEN_URL, mpAppId, mpAppSecret); | |||
URL url = new URL(requestUrl); | |||
HttpURLConnection conn = (HttpURLConnection) url.openConnection(); | |||
conn.setRequestMethod("GET"); | |||
try (BufferedReader br = new BufferedReader( | |||
new InputStreamReader(conn.getInputStream(), "UTF-8"))) { | |||
StringBuilder response = new StringBuilder(); | |||
String responseLine; | |||
while ((responseLine = br.readLine()) != null) { | |||
response.append(responseLine.trim()); | |||
} | |||
org.json.JSONObject jsonResponse = new org.json.JSONObject(response.toString()); | |||
return jsonResponse.getString("access_token"); | |||
} | |||
} | |||
} |
@ -0,0 +1,263 @@ | |||
package org.jeecg.modules.apiService.impl; | |||
import com.alibaba.fastjson.JSON; | |||
import com.alibaba.fastjson.TypeReference; | |||
import com.aliyun.oss.OSS; | |||
import com.aliyun.oss.OSSClientBuilder; | |||
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; | |||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | |||
import org.apache.commons.fileupload.FileItem; | |||
import org.apache.commons.fileupload.disk.DiskFileItemFactory; | |||
import org.jeecg.common.api.vo.Result; | |||
import org.jeecg.config.shiro.ShiroRealm; | |||
import org.jeecg.modules.apiBean.HttpClientUtil; | |||
import org.jeecg.modules.apiBean.PageBean; | |||
import org.jeecg.modules.apiBean.WxQrCodeVo; | |||
import org.jeecg.modules.apiService.RecommendService; | |||
import org.jeecg.modules.hanHaiMember.entity.HanHaiMember; | |||
import org.jeecg.modules.hanHaiMember.service.IHanHaiMemberService; | |||
import org.jeecg.modules.teambuyConfig.entity.TeambuyConfig; | |||
import org.jeecg.modules.teambuyConfig.service.ITeambuyConfigService; | |||
import org.springframework.beans.factory.annotation.Value; | |||
import org.springframework.http.HttpMethod; | |||
import org.springframework.http.ResponseEntity; | |||
import org.springframework.stereotype.Service; | |||
import org.springframework.util.LinkedMultiValueMap; | |||
import org.springframework.util.MultiValueMap; | |||
import org.springframework.web.client.RestTemplate; | |||
import org.springframework.web.multipart.MultipartFile; | |||
import org.springframework.web.multipart.commons.CommonsMultipartFile; | |||
import javax.annotation.Resource; | |||
import java.io.*; | |||
import java.util.HashMap; | |||
import java.util.Map; | |||
@Service | |||
public class RecommendServiceImpl implements RecommendService { | |||
/*************************************************************************************/ | |||
//权限验证 | |||
@Resource | |||
private ShiroRealm shiroRealm; | |||
//用户信息 | |||
@Resource | |||
private IHanHaiMemberService hanHaiMemberService; | |||
//配置信息 | |||
@Resource | |||
private ITeambuyConfigService teambuyConfigService; | |||
private String appid = "wx94a640f07969d6c9";//小程序appid | |||
private String secret = "";//小程序密钥 | |||
@Value("${jeecg.oss.endpoint}") | |||
private String endpoint; | |||
@Value("${jeecg.oss.accessKey}") | |||
private String accessKey; | |||
@Value("${jeecg.oss.secretKey}") | |||
private String secretKey; | |||
@Value("${jeecg.oss.bucketName}") | |||
private String bucketName; | |||
@Value("${jeecg.oss.staticDomain}") | |||
private String staticDomain; | |||
/*************************************************************************************/ | |||
//获取个人推荐二维码 | |||
@Override | |||
public Result<?> getInviteCode(String token) { | |||
//权限验证 | |||
HanHaiMember hanHaiMember = shiroRealm.checkUserTokenIsEffectHanHaiOpenId(token); | |||
//获取版本信息 | |||
TeambuyConfig vsion = teambuyConfigService.lambdaQuery() | |||
.eq(TeambuyConfig::getParamCode, "v_sion") | |||
.one(); | |||
Integer vsionStr = Integer.parseInt(vsion.getParamValueText()); | |||
String trial = "release"; | |||
if(vsionStr == 0){ | |||
trial= "release"; | |||
}else if(vsionStr == 1){ | |||
trial= "trial"; | |||
}else{ | |||
trial= "develop"; | |||
} | |||
Map<String, Object> param = new HashMap<>(); | |||
//获取跳转路径信息 | |||
TeambuyConfig xcxSharePage = teambuyConfigService.lambdaQuery() | |||
.eq(TeambuyConfig::getParamCode, "xcxSharePage") | |||
.one(); | |||
String key = "shareId=" + hanHaiMember.getId(); | |||
param.put("path", xcxSharePage.getParamValueText() + "?" + key); //跳转页面 | |||
String accessToken = this.getAccessToken(); | |||
RestTemplate rest = new RestTemplate(); | |||
InputStream inputStream = null; | |||
OutputStream outputStream = null; | |||
File file = null; | |||
//获取存储地址 | |||
TeambuyConfig oneImage = teambuyConfigService.lambdaQuery() | |||
.eq(TeambuyConfig::getParamCode, "codeImg") | |||
.one(); | |||
String codeImg = oneImage.getParamValueText(); | |||
try{ | |||
String url = "https://api.weixin.qq.com/wxa/getwxacode?access_token=" + accessToken; | |||
param.put("scene", hanHaiMember.getId()); | |||
param.put("width", 150); | |||
param.put("auto_color", false); | |||
param.put("env_version", trial); | |||
Map<String, Object> line_color = new HashMap<>(); | |||
line_color.put("r", 0); | |||
line_color.put("g", 0); | |||
line_color.put("b", 0); | |||
param.put("line_color", line_color); | |||
MultiValueMap<String, String> headers = new LinkedMultiValueMap<>(); | |||
org.springframework.http.HttpEntity requestEntity = new org.springframework.http.HttpEntity(JSON.toJSONString(param), headers); | |||
ResponseEntity<byte[]> entity = rest.exchange(url, HttpMethod.POST, requestEntity, byte[].class, new Object[0]); | |||
byte[] result = entity.getBody(); | |||
inputStream = new ByteArrayInputStream(result); | |||
String tempSave = codeImg; | |||
String filePath = tempSave; | |||
file = new File(filePath); | |||
if (!file.exists()) { | |||
file.createNewFile(); | |||
} | |||
outputStream = new FileOutputStream(file); | |||
int len = 0; | |||
byte[] buf = new byte[1024]; | |||
while ((len = inputStream.read(buf, 0, 1024)) != -1) { | |||
outputStream.write(buf, 0, len); | |||
} | |||
outputStream.flush(); | |||
//将文件上传至阿里云 | |||
DiskFileItemFactory factory = new DiskFileItemFactory(16, null); | |||
FileItem item = factory.createItem("File", "text/plain", true, file.getName()); | |||
int bytesRead = 0; | |||
byte[] buffer = new byte[8192]; | |||
try { | |||
FileInputStream fis = new FileInputStream(file); | |||
OutputStream os = item.getOutputStream(); | |||
while ((bytesRead = fis.read(buffer, 0, 8192)) != -1) { | |||
os.write(buffer, 0, bytesRead); | |||
} | |||
os.close(); | |||
fis.close(); | |||
} catch (IOException e) { | |||
e.printStackTrace(); | |||
} | |||
MultipartFile mf = new CommonsMultipartFile(item); | |||
//返回图片下载地址 | |||
WxQrCodeVo wxCodeVo = new WxQrCodeVo(); | |||
wxCodeVo.setUrl(staticDomain+this.uploadAliYunOss(mf)); | |||
wxCodeVo.setName("敢为人鲜欢迎您"); | |||
return Result.OK(wxCodeVo); | |||
} catch (Exception e) { | |||
e.printStackTrace(); | |||
} finally { | |||
if (inputStream != null) { | |||
try { | |||
inputStream.close(); | |||
} catch (IOException e) { | |||
e.printStackTrace(); | |||
} | |||
} | |||
if (outputStream != null) { | |||
try { | |||
outputStream.close(); | |||
} catch (IOException e) { | |||
e.printStackTrace(); | |||
} | |||
} | |||
//删除文件 | |||
if (file.exists()) { | |||
file.delete(); | |||
} | |||
} | |||
return null; | |||
} | |||
//我的团队-查询直推用户列表 | |||
@Override | |||
public Result<?> queryRecommendUserList(String token, PageBean pageBean) { | |||
//权限验证 | |||
HanHaiMember hanHaiMember = shiroRealm.checkUserTokenIsEffectHanHaiOpenId(token); | |||
//返回信息 | |||
String massege = ""; | |||
//分页信息 | |||
Page<HanHaiMember> page = null; | |||
//查询信息 | |||
LambdaQueryChainWrapper<HanHaiMember> query = null; | |||
//返回信息 | |||
Page<HanHaiMember> pageList = null; | |||
try{ | |||
//分页 | |||
page = new Page<HanHaiMember>(pageBean.getPageNo(), pageBean.getPageSize()); | |||
query = hanHaiMemberService | |||
.lambdaQuery(); | |||
//组装查询条件 | |||
query.eq(HanHaiMember::getVid, hanHaiMember.getId()); | |||
//按照创建时间降序排列 | |||
query.orderByAsc(HanHaiMember::getCreateTime); | |||
//获取直推用户信息 | |||
pageList = query.page(page); | |||
return Result.OK("直推用户列表", pageList); | |||
}catch (Exception e){ | |||
e.printStackTrace(); | |||
return Result.error("直推用户列表查询失败"); | |||
} | |||
} | |||
/** | |||
* 获取令牌 | |||
* | |||
* @return | |||
*/ | |||
private String getAccessToken() { | |||
String requestUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appid + "&secret=" + secret; | |||
String doGet2 = HttpClientUtil.doGet2(requestUrl); | |||
Map<String, String> map = JSON.parseObject(doGet2, new TypeReference<Map<String, String>>() { | |||
}); | |||
return map.get("access_token"); | |||
} | |||
/** | |||
* 上传文件至阿里云oss | |||
* | |||
* @return | |||
*/ | |||
private String uploadAliYunOss(MultipartFile mf) throws Exception { | |||
String uploadFile = "massage"; | |||
String fileName = new StringBuffer(mf.getOriginalFilename()).append(".jpg").toString();// 获取文件名 | |||
String dbpath = uploadFile + File.separator + fileName; | |||
if (dbpath.contains("\\")) { | |||
dbpath = dbpath.replace("\\", "/"); | |||
} | |||
String endpoint = this.endpoint; | |||
String accessKey = this.accessKey; | |||
String secretKey = this.secretKey; | |||
// 创建OSSClient实例。 | |||
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKey, secretKey); | |||
// 上传Byte数组。 | |||
byte[] content = mf.getBytes(); | |||
String bucketName = this.bucketName; | |||
ossClient.putObject(bucketName, dbpath, new ByteArrayInputStream(content)); | |||
// 关闭OSSClient。 | |||
ossClient.shutdown(); | |||
return dbpath; | |||
} | |||
} |