diff --git a/ruoyi-auth/src/main/java/com/ruoyi/auth/RuoYiAuthApplication.java b/ruoyi-auth/src/main/java/com/ruoyi/auth/RuoYiAuthApplication.java index 00a499df..ead31ba4 100644 --- a/ruoyi-auth/src/main/java/com/ruoyi/auth/RuoYiAuthApplication.java +++ b/ruoyi-auth/src/main/java/com/ruoyi/auth/RuoYiAuthApplication.java @@ -4,6 +4,9 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import com.ruoyi.common.security.annotation.EnableRyFeignClients; +import org.springframework.boot.web.client.RestTemplateBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.web.client.RestTemplate; /** * 认证授权中心 diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/CacheConstants.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/CacheConstants.java index 20971d35..94912243 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/CacheConstants.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/CacheConstants.java @@ -52,8 +52,29 @@ public class CacheConstants */ public static final String PWD_ERR_CNT_KEY = "pwd_err_cnt:"; + /** + * 赛会推广的二维码缓存地址key + */ + public static final String COMPETITION_SPREAD_AQR_CODE="competition:spread:aqr:code:"; /** * 存放赛程循环赛的锁的key */ public static final String ARRANGE_TEAM_GROUP_SCHEDULE="arrange:team:group:schedule:"; + + /** + * 小程序ACCESS_TOKEN缓存key + */ + public static final String WX_APPLETS_REDIS_ACCESS_TOKEN_KEY="wx.applets.access.token.key"; + /** + * 微信小程序--服务器验证专用token + */ + public static final String WX_APPLETS_TOKEN="oHDqn56DWSxUHyiOnqLAyawfUj0k"; + /** + * 微信小程序--开发者账号的appid + */ + public static final String WX_APPLETS_APP_ID="wxd4300820f84a6d6b"; + /** + * 微信小程序--开发者账号的AppSecret + */ + public static final String WX_APPLETS_APP_SERCERT="16daf686025b3d9755976d79615b254f"; } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/RuoYiSystemApplication.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/RuoYiSystemApplication.java index dfe390fa..dc0f8a64 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/RuoYiSystemApplication.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/RuoYiSystemApplication.java @@ -5,6 +5,9 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import com.ruoyi.common.security.annotation.EnableCustomConfig; import com.ruoyi.common.security.annotation.EnableRyFeignClients; import com.ruoyi.common.swagger.annotation.EnableCustomSwagger2; +import org.springframework.boot.web.client.RestTemplateBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.web.client.RestTemplate; /** * 系统模块 @@ -31,4 +34,9 @@ public class RuoYiSystemApplication " | | \\ / \\ / \n" + " ''-' `'-' `-..-' "); } + + @Bean + public RestTemplate restTemplate(RestTemplateBuilder builder) { + // Do any additional configuration here + return builder.build(); } } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/CompetitionController.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/CompetitionController.java index 7b44b859..b5fa4373 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/CompetitionController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/CompetitionController.java @@ -3,6 +3,8 @@ package com.ruoyi.system.controller; import java.util.List; import java.io.IOException; import javax.servlet.http.HttpServletResponse; + +import com.ruoyi.system.api.domain.vo.WxAppletsCodeVo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; @@ -81,6 +83,14 @@ public class CompetitionController extends BaseController return toAjax(competitionService.insertCompetition(competition)); } + @RequiresPermissions("system:competition:genCompetitionCommonAqrSpread") + @Log(title = "生成赛会普通微信推广码", businessType = BusinessType.OTHER) + @PostMapping("/genCompetitionCommonAqrSpread") + public AjaxResult genCompetitionCommonAqrSpread(@RequestBody WxAppletsCodeVo wxAppletsCodeVo) + { + return AjaxResult.success(competitionService.genCompetitionCommonAqrSpread(wxAppletsCodeVo)); + } + /** * 修改比赛信息 */ diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/WxApplesCodeController.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/WxApplesCodeController.java new file mode 100644 index 00000000..f252b78c --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/WxApplesCodeController.java @@ -0,0 +1,44 @@ +package com.ruoyi.system.controller; + +import com.ruoyi.common.core.web.controller.BaseController; +import com.ruoyi.common.core.web.domain.AjaxResult; +import com.ruoyi.common.core.web.page.TableDataInfo; +import com.ruoyi.common.log.annotation.Log; +import com.ruoyi.common.log.enums.BusinessType; +import com.ruoyi.common.security.annotation.RequiresPermissions; +import com.ruoyi.system.api.domain.vo.WxAppletsCodeVo; +import com.ruoyi.system.domain.UserWxAqrCode; +import com.ruoyi.system.domain.vo.UserWxAqrCodeVo; +import com.ruoyi.system.service.IWxUserService; +import com.ruoyi.system.service.WxApplesCodeService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @author 吴一博 + * @date 2022年11月17日 17:10 + * @Description 微信小程序代码控制 + */ +@RestController +@RequestMapping("/wxApplesCode") +public class WxApplesCodeController extends BaseController { + @Resource + private WxApplesCodeService wxApplesCodeService; + + @RequiresPermissions("system:wxApplesCode:getWxApplesAccessToken") + @GetMapping("/getWxApplesAccessToken") + public AjaxResult getWxApplesAccessToken() + { + return AjaxResult.success(wxApplesCodeService.getWxApplesAccessToken()); + } + @RequiresPermissions("system:wxApplesCode:genWxApplesAqrCode") + @Log(title = "生成微信小程序二维码", businessType = BusinessType.OTHER) + @PostMapping("/genWxApplesAqrCode") + public AjaxResult genWxApplesAqrCode(@RequestBody WxAppletsCodeVo wxAppletsCodeVo) + { + return AjaxResult.success(wxApplesCodeService.genWxApplesAqrCode(wxAppletsCodeVo)); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ICompetitionService.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ICompetitionService.java index 343f34ac..f723b545 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ICompetitionService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ICompetitionService.java @@ -1,6 +1,8 @@ package com.ruoyi.system.service; import java.util.List; + +import com.ruoyi.system.api.domain.vo.WxAppletsCodeVo; import com.ruoyi.system.domain.Competition; /** @@ -58,4 +60,6 @@ public interface ICompetitionService * @return 结果 */ public int deleteCompetitionById(Long id); + + WxAppletsCodeVo genCompetitionCommonAqrSpread(WxAppletsCodeVo wxAppletsCodeVo); } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/WxApplesCodeService.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/WxApplesCodeService.java new file mode 100644 index 00000000..c2c1b10c --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/WxApplesCodeService.java @@ -0,0 +1,20 @@ +package com.ruoyi.system.service; + +import com.ruoyi.system.api.domain.vo.WxAppletsCodeVo; + +/** + * @author 吴一博 + * @date 2022年11月17日 17:11 + * @Description + */ +public interface WxApplesCodeService { + /** + * @description 获取微信小程序AccessToken + * @author 吴一博 + * @date 2022/11/17 17:13 + * @return java.lang.String + */ + String getWxApplesAccessToken(); + + WxAppletsCodeVo genWxApplesAqrCode(WxAppletsCodeVo wxAppletsCodeVo); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/CompetitionServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/CompetitionServiceImpl.java index beb1e1dd..de8be2ff 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/CompetitionServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/CompetitionServiceImpl.java @@ -1,12 +1,21 @@ package com.ruoyi.system.service.impl; import java.util.List; +import java.util.concurrent.TimeUnit; + +import com.ruoyi.common.core.constant.CacheConstants; +import com.ruoyi.common.redis.service.RedisService; +import com.ruoyi.system.api.domain.vo.WxAppletsCodeVo; +import com.ruoyi.system.service.WxApplesCodeService; +import org.apache.commons.lang3.ObjectUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.ruoyi.system.mapper.CompetitionMapper; import com.ruoyi.system.domain.Competition; import com.ruoyi.system.service.ICompetitionService; +import javax.annotation.Resource; + /** * 比赛信息Service业务层处理 * @@ -16,9 +25,12 @@ import com.ruoyi.system.service.ICompetitionService; @Service public class CompetitionServiceImpl implements ICompetitionService { - @Autowired + @Resource private CompetitionMapper competitionMapper; - + @Resource + private WxApplesCodeService wxApplesCodeService; + @Resource + private RedisService redisService; /** * 查询比赛信息 * @@ -90,4 +102,16 @@ public class CompetitionServiceImpl implements ICompetitionService { return competitionMapper.deleteCompetitionById(id); } + + @Override + public WxAppletsCodeVo genCompetitionCommonAqrSpread(WxAppletsCodeVo wxAppletsCodeVo) { + Object key = redisService.getCacheObject(CacheConstants.COMPETITION_SPREAD_AQR_CODE + wxAppletsCodeVo.getScene()); + if(ObjectUtils.isEmpty(key)){ + wxAppletsCodeVo = wxApplesCodeService.genWxApplesAqrCode(wxAppletsCodeVo); + redisService.setCacheObject(CacheConstants.COMPETITION_SPREAD_AQR_CODE + wxAppletsCodeVo.getScene(),wxAppletsCodeVo.getCodeImgUrl(),30L, TimeUnit.DAYS); + }else { + wxAppletsCodeVo.setCodeImgUrl((String) key); + } + return wxAppletsCodeVo; + } } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/WxApplesCodeServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/WxApplesCodeServiceImpl.java new file mode 100644 index 00000000..8cf92c63 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/WxApplesCodeServiceImpl.java @@ -0,0 +1,157 @@ +package com.ruoyi.system.service.impl; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.ruoyi.common.core.constant.CacheConstants; +import com.ruoyi.common.redis.service.RedisService; +import com.ruoyi.system.api.domain.vo.WxAppletsCodeVo; +import com.ruoyi.system.service.WxApplesCodeService; +import lombok.extern.log4j.Log4j2; +import org.apache.commons.lang3.ObjectUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.web.client.RestTemplateBuilder; +import org.springframework.cloud.client.loadbalancer.LoadBalanced; +import org.springframework.context.annotation.Bean; +import org.springframework.http.HttpEntity; +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.util.StringUtils; +import org.springframework.web.client.RestTemplate; + +import javax.annotation.Resource; +import java.io.*; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.TimeUnit; + +/** + * @author 吴一博 + * @date 2022年11月17日 17:12 + * @Description + */ +@Log4j2 +@Service +public class WxApplesCodeServiceImpl implements WxApplesCodeService { + @Autowired + private RestTemplate restTemplate; + @Resource + private RedisService redisService; + + @Value("${image.location.linux}") + private String linuxLocation; + @Value("${image.domainName}") + private String domainName; + @Override + public String getWxApplesAccessToken() { + String accessToken=null; + //如果已经获取就不需要再次请求了 + if(ObjectUtils.isEmpty(redisService.getCacheObject(CacheConstants.WX_APPLETS_REDIS_ACCESS_TOKEN_KEY))) { + //获取access_token + String appid = CacheConstants.WX_APPLETS_APP_ID; + String appsecret = CacheConstants.WX_APPLETS_APP_SERCERT; + String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential" + + "&appid=" + appid + "&secret=" + appsecret; + if (restTemplate == null) { + restTemplate = new RestTemplate(); + } + String json = restTemplate.getForObject(url, String.class); + JSONObject myJson = JSONObject.parseObject(json); + log.info("获取AccessToken={}", JSON.toJSONString(myJson)); + //保存到缓存 + accessToken = myJson.get("access_token").toString(); + Long expires_in=myJson.getLong("expires_in"); + redisService.setCacheObject(CacheConstants.WX_APPLETS_REDIS_ACCESS_TOKEN_KEY,accessToken,expires_in-100, TimeUnit.SECONDS); + return accessToken; + }else { + return (String) redisService.getCacheObject(CacheConstants.WX_APPLETS_REDIS_ACCESS_TOKEN_KEY); + } + } + + @Override + public WxAppletsCodeVo genWxApplesAqrCode(WxAppletsCodeVo wxAppletsCodeVo) { + if(restTemplate==null){ + restTemplate = new RestTemplate(); + } + InputStream inputStream = null; + OutputStream outputStream = null; + //根据APPid和密钥获取存取令牌 + try { + String url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + this.getWxApplesAccessToken(); + //定义生产二维码所需的参数、样式 + Map param = new HashMap<>(); + param.put("scene", wxAppletsCodeVo.getScene()); + param.put("page", wxAppletsCodeVo.getPage()); + param.put("width", org.apache.commons.lang3.StringUtils.isEmpty(wxAppletsCodeVo.getPage())?10:wxAppletsCodeVo.getPage()); + param.put("auto_color", wxAppletsCodeVo.getAutoColor()==null?false:wxAppletsCodeVo.getAutoColor()); + param.put("is_hyaline",wxAppletsCodeVo.getIsHyaline()==null?false:wxAppletsCodeVo.getIsHyaline()); + Map 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); + System.out.println(param+"调用微信URL传参"); + MultiValueMap headers = new LinkedMultiValueMap<>(); + HttpEntity requestEntity = new HttpEntity(param, headers); + // System.out.println("协议请求头"+headers+""+requestEntity); + ResponseEntity entity = restTemplate.exchange(url, HttpMethod.POST, requestEntity, byte[].class, new Object[0]); + // LOG.info("调用小程序生成微信永久小程序码URL接口返回结果:" + entity.getBody()); + // System.out.println("返回结果"+entity.getBody()+".."+entity); + byte[] result = entity.getBody(); +// LOG.info(Base64.encodeBase64String(result)); + // System.out.println("不知道是什么:"+Base64.encodeBase64String(result)); + inputStream = new ByteArrayInputStream(result); +// 生成随机数命名图片 + String filename = UUID.randomUUID().toString(); + // System.out.println(filename); + Date date = new Date(); + String time = new SimpleDateFormat("yyyy-MM-dd").format(date); + String[] str = time.split("-");//根据‘-’进行拆分字符串 拆分出来的日期有,年,日,月,根据年日月创建文件夹 + String datePath="/"+str[0]+"/"+str[1]+"/"+str[2]+"/"; + //创建文件夹 + String xdpath = datePath+filename+".png"; + String filePath = linuxLocation+datePath+filename+".png"; +// 服务器存放位置 + File file = new File(filePath); + //文件目录不存在需要先创建 + if(!file.getParentFile().exists()){ + file.getParentFile().mkdirs(); + } + 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(); + wxAppletsCodeVo.setCodeImgUrl(domainName+xdpath); + return wxAppletsCodeVo; + + } catch (Exception e) { +// LOG.error("调用小程序生成微信永久小程序码URL接口异常", e); + } finally { + if (inputStream != null) { + try { + inputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + System.out.println("获取二维码"); + return wxAppletsCodeVo; + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/bootstrap.yml b/ruoyi-modules/ruoyi-system/src/main/resources/bootstrap.yml index 827f5136..ab14fc6f 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/bootstrap.yml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/bootstrap.yml @@ -10,3 +10,10 @@ spring: application: # 应用名称 name: ruoyi-system + +image: + #图片域名 + domainName: "https://adu.shjmall.cn/liguanghui/image/" + location: + linux: /bt/pic/ + windows: D://test// diff --git a/ruoyi-ui/src/api/system/competition.js b/ruoyi-ui/src/api/system/competition.js index 35af9a04..b6132330 100644 --- a/ruoyi-ui/src/api/system/competition.js +++ b/ruoyi-ui/src/api/system/competition.js @@ -25,7 +25,13 @@ export function addCompetition(data) { data: data }) } - +export function genCompetitionCommonAqrSpread(data) { + return request({ + url: '/system/competition/genCompetitionCommonAqrSpread', + method: 'post', + data: data + }) +} // 修改比赛信息 export function updateCompetition(data) { return request({ diff --git a/ruoyi-ui/src/api/system/wxApplesCode.js b/ruoyi-ui/src/api/system/wxApplesCode.js new file mode 100644 index 00000000..25191ece --- /dev/null +++ b/ruoyi-ui/src/api/system/wxApplesCode.js @@ -0,0 +1,20 @@ +import request from '@/utils/request' + +// 获取微信accessToken +export function getWxApplesAccessToken(query) { + return request({ + url: '/system/wxApplesCode/getWxApplesAccessToken', + method: 'get', + params: query + }) +} + +// 查询约战详细 +export function genWxApplesAqrCode(data) { + return request({ + url: '/system/wxApplesCode/genWxApplesAqrCode', + method: 'post', + data: data + }) +} + diff --git a/ruoyi-ui/src/views/system/competitionSet/index.vue b/ruoyi-ui/src/views/system/competitionSet/index.vue index c17a19c9..5c7dd697 100644 --- a/ruoyi-ui/src/views/system/competitionSet/index.vue +++ b/ruoyi-ui/src/views/system/competitionSet/index.vue @@ -30,8 +30,8 @@ 隐藏 显示 - {{competitionObj.enrollBeginTime}}-{{competitionObj.enrollEndTime}} - {{competitionObj.competitionBeginTime}}-{{competitionObj.competitionEndTime}} + {{competitionObj.enrollBeginTime}} 至 {{competitionObj.enrollEndTime}} + {{competitionObj.competitionBeginTime}} 至 {{competitionObj.competitionEndTime}} {{competitionObj.organizer}} {{competitionObj.undertake}} {{competitionObj.contacts}} @@ -252,7 +252,83 @@ - 赛会推广 赛会推广 + 赛会推广 + + + + + + +
+ 赛会名称:{{competitionObj.competitionName}} +
+ + 获取赛会推广码 +
+
+ 推广二维码 +
+ +
+ 注:点击预览可以分享或者保存哦 +
+
+
+
+ + + + + +
+ 赛会名称:{{competitionObj.competitionName}} +
+ +
+
+
+ 推广海报 + + + + + +
+ + + + + +
+
+
+
+ +
+
+
+
邀请你和我一起做篮球兄弟!
+
长按二维码,开启你的篮球之旅
+ +
+
+
+
+ 注:请截图保存或者分享哦 +
+
+
+
+
+