diff --git a/playlet-admin/src/main/java/com/playlet/web/controller/app/PlayletUserAppController.java b/playlet-admin/src/main/java/com/playlet/web/controller/app/PlayletUserAppController.java new file mode 100644 index 0000000..f5fffdc --- /dev/null +++ b/playlet-admin/src/main/java/com/playlet/web/controller/app/PlayletUserAppController.java @@ -0,0 +1,35 @@ +package com.playlet.web.controller.app; + +import com.playlet.common.core.domain.Result; +import com.playlet.system.domain.PlayletUser; +import com.playlet.web.service.app.PlayletUserAppService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + + +@Slf4j +@Api(tags = "小程序*短剧用户接口") +@RestController +@RequestMapping(value = "/app/user") +@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +public class PlayletUserAppController { + + private final PlayletUserAppService playletUserAppService; + + @ResponseBody + @PostMapping(value = "/loginByOpenid") + @ApiOperation(value = "小程序通过openid登录系统", httpMethod = "post") + public Result loginByOpenid(@RequestParam(value = "openid") String openid){ + try { + return Result.success(playletUserAppService.getByOpenId(openid)); + }catch (Exception e){ + return Result.error(e.getMessage()); + } + + } + +} diff --git a/playlet-admin/src/main/java/com/playlet/web/controller/tool/OssFileController.java b/playlet-admin/src/main/java/com/playlet/web/controller/tool/OssFileController.java index 4ac85bf..fd217ef 100644 --- a/playlet-admin/src/main/java/com/playlet/web/controller/tool/OssFileController.java +++ b/playlet-admin/src/main/java/com/playlet/web/controller/tool/OssFileController.java @@ -4,6 +4,7 @@ import com.playlet.common.core.domain.Result; import com.playlet.web.service.OssService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -13,12 +14,12 @@ import org.springframework.web.multipart.MultipartFile; * @author clunt */ @RestController -@Api(tags = "App*文件上传") +@Api(tags = "通用*文件上传") @RequestMapping(value = "/tool/oss") +@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class OssFileController { - @Autowired - private OssService ossService; + private final OssService ossService; @ResponseBody @PostMapping(value = "/upload") diff --git a/playlet-admin/src/main/java/com/playlet/web/controller/tool/SmsController.java b/playlet-admin/src/main/java/com/playlet/web/controller/tool/SmsController.java new file mode 100644 index 0000000..2858da0 --- /dev/null +++ b/playlet-admin/src/main/java/com/playlet/web/controller/tool/SmsController.java @@ -0,0 +1,38 @@ +package com.playlet.web.controller.tool; + +import com.playlet.common.core.domain.Result; +import com.playlet.web.service.SmsService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + *

短信接口

+ * @author clunt + */ +@Slf4j +@RestController +@Api(tags = "通用*短信接口") +@RequestMapping(value = "/tool/sms") +@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +public class SmsController { + + private final SmsService smsService; + + @ApiOperation(value = "发送短信验证码", httpMethod = "post") + @GetMapping("/sendSmsCode") + @ResponseBody + public Result sendSmsCode(@RequestParam(value = "phone") String phone){ + try { + smsService.sendSmsCode(phone); + return Result.success(); + }catch (Exception e){ + log.error("调用短信服务异常:{}", e.getMessage(), e); + return Result.error(); + } + } + +} diff --git a/playlet-admin/src/main/java/com/playlet/web/controller/tool/TestController.java b/playlet-admin/src/main/java/com/playlet/web/controller/tool/TestController.java index 09fd0da..2d64c17 100644 --- a/playlet-admin/src/main/java/com/playlet/web/controller/tool/TestController.java +++ b/playlet-admin/src/main/java/com/playlet/web/controller/tool/TestController.java @@ -27,7 +27,7 @@ import io.swagger.annotations.ApiOperation; * * @author ruoyi */ -@Api("用户信息管理") +//@Api("用户信息管理") @RestController @RequestMapping("/test/user") public class TestController extends BaseController diff --git a/playlet-admin/src/main/java/com/playlet/web/controller/tool/WxController.java b/playlet-admin/src/main/java/com/playlet/web/controller/tool/WxController.java new file mode 100644 index 0000000..951e543 --- /dev/null +++ b/playlet-admin/src/main/java/com/playlet/web/controller/tool/WxController.java @@ -0,0 +1,33 @@ +package com.playlet.web.controller.tool; + +import com.playlet.common.core.domain.Result; +import com.playlet.web.service.WxService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +/** + *

微信服务端接口

+ * @author clunt + */ +@Controller +@Api(tags = "小程序*微信接口") +@RequestMapping("/tool/wx") +@CrossOrigin(origins = "*", maxAge = 3600) +@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +public class WxController { + + private final WxService wxService; + + @ApiOperation(value = "获取openId", httpMethod = "post") + @GetMapping("/getOpenidByCode") + @ResponseBody + public Result getOpenidByCode(@RequestParam(value = "code") String code){ + return Result.success(wxService.getOpenidByCode(code)); + } + + +} diff --git a/playlet-admin/src/main/java/com/playlet/web/core/config/SmsConfig.java b/playlet-admin/src/main/java/com/playlet/web/core/config/SmsConfig.java new file mode 100644 index 0000000..11d21d6 --- /dev/null +++ b/playlet-admin/src/main/java/com/playlet/web/core/config/SmsConfig.java @@ -0,0 +1,17 @@ +package com.playlet.web.core.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +@Data +@Configuration +@ConfigurationProperties(prefix = "sms") +public class SmsConfig { + + private String accessKeyId; + private String accessKeySecret; + private String signName; + private String templateCode; + +} diff --git a/playlet-admin/src/main/java/com/playlet/web/core/config/WxConfig.java b/playlet-admin/src/main/java/com/playlet/web/core/config/WxConfig.java new file mode 100644 index 0000000..724bcf3 --- /dev/null +++ b/playlet-admin/src/main/java/com/playlet/web/core/config/WxConfig.java @@ -0,0 +1,18 @@ +package com.playlet.web.core.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +@Data +@Configuration +@ConfigurationProperties(prefix = "wx") +public class WxConfig { + + /*微信小程序AppId*/ + public String appId; + + /*微信小程序Secret*/ + public String secret; + +} diff --git a/playlet-admin/src/main/java/com/playlet/web/req/PlayUserReq.java b/playlet-admin/src/main/java/com/playlet/web/req/PlayUserReq.java new file mode 100644 index 0000000..906df83 --- /dev/null +++ b/playlet-admin/src/main/java/com/playlet/web/req/PlayUserReq.java @@ -0,0 +1,24 @@ +package com.playlet.web.req; + +import io.swagger.annotations.ApiModel; +import lombok.Data; + +/** + *

短剧请求对象

+ * @author clunt + */ +@Data +@ApiModel(value = "短剧请求对象") +public class PlayUserReq { + + private String nickName; + + private String phone; + + private String code; + + private String password; + + private String inviteCode; + +} diff --git a/playlet-admin/src/main/java/com/playlet/web/resp/PlayUserResp.java b/playlet-admin/src/main/java/com/playlet/web/resp/PlayUserResp.java new file mode 100644 index 0000000..133013b --- /dev/null +++ b/playlet-admin/src/main/java/com/playlet/web/resp/PlayUserResp.java @@ -0,0 +1,14 @@ +package com.playlet.web.resp; + +import lombok.Data; + +/** + *

短剧响应对象

+ * @author clunt + */ +@Data +public class PlayUserResp { + + + +} diff --git a/playlet-admin/src/main/java/com/playlet/web/service/SmsService.java b/playlet-admin/src/main/java/com/playlet/web/service/SmsService.java new file mode 100644 index 0000000..eed0da9 --- /dev/null +++ b/playlet-admin/src/main/java/com/playlet/web/service/SmsService.java @@ -0,0 +1,14 @@ +package com.playlet.web.service; + +/** + *

短信验证码service

+ * @author clunt + */ +public interface SmsService { + + /** + * @param phone 接收短信手机号 + */ + void sendSmsCode(String phone) throws Exception; + +} diff --git a/playlet-admin/src/main/java/com/playlet/web/service/WxService.java b/playlet-admin/src/main/java/com/playlet/web/service/WxService.java new file mode 100644 index 0000000..9beb27e --- /dev/null +++ b/playlet-admin/src/main/java/com/playlet/web/service/WxService.java @@ -0,0 +1,13 @@ +package com.playlet.web.service; + +/** + *

微信service类

+ * @author clunt + */ +public interface WxService { + + String getAccessToken(); + + String getOpenidByCode(String code); + +} diff --git a/playlet-admin/src/main/java/com/playlet/web/service/app/PlayletUserAppService.java b/playlet-admin/src/main/java/com/playlet/web/service/app/PlayletUserAppService.java new file mode 100644 index 0000000..c477498 --- /dev/null +++ b/playlet-admin/src/main/java/com/playlet/web/service/app/PlayletUserAppService.java @@ -0,0 +1,17 @@ +package com.playlet.web.service.app; + +import com.playlet.system.domain.PlayletUser; + +/** + *

短剧小程序用户service

+ * @author clunt + */ +public interface PlayletUserAppService { + + /** + * @param openid 微信唯一凭证 + * @return 短剧用户 + */ + PlayletUser getByOpenId(String openid); + +} diff --git a/playlet-admin/src/main/java/com/playlet/web/service/app/impl/PlayletUserAppServiceImpl.java b/playlet-admin/src/main/java/com/playlet/web/service/app/impl/PlayletUserAppServiceImpl.java new file mode 100644 index 0000000..ea5f5ea --- /dev/null +++ b/playlet-admin/src/main/java/com/playlet/web/service/app/impl/PlayletUserAppServiceImpl.java @@ -0,0 +1,35 @@ +package com.playlet.web.service.app.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.playlet.common.constant.PlayletConstants; +import com.playlet.system.domain.PlayletUser; +import com.playlet.system.service.IPlayletUserService; +import com.playlet.web.service.app.PlayletUserAppService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Date; + +@Slf4j +@Service +@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +public class PlayletUserAppServiceImpl implements PlayletUserAppService { + + private final IPlayletUserService iPlayletUserService; + + @Override + public PlayletUser getByOpenId(String openid) { + PlayletUser playletUser = iPlayletUserService.lambdaQuery().eq(PlayletUser::getOpenId, openid).one(); + if(ObjectUtil.isNull(playletUser)){ + playletUser = new PlayletUser(); + playletUser.setOpenId(openid); + playletUser.setCreateBy(PlayletConstants.DEFAULT_CREATE); + playletUser.setCreateTime(new Date()); + iPlayletUserService.save(playletUser); + } + return playletUser; + } + +} diff --git a/playlet-admin/src/main/java/com/playlet/web/service/impl/SmsServiceImpl.java b/playlet-admin/src/main/java/com/playlet/web/service/impl/SmsServiceImpl.java new file mode 100644 index 0000000..82b6914 --- /dev/null +++ b/playlet-admin/src/main/java/com/playlet/web/service/impl/SmsServiceImpl.java @@ -0,0 +1,58 @@ +package com.playlet.web.service.impl; + +import com.aliyun.dysmsapi20170525.Client; +import com.aliyun.dysmsapi20170525.models.SendSmsRequest; +import com.aliyun.dysmsapi20170525.models.SendSmsResponse; +import com.aliyun.teaopenapi.models.Config; +import com.aliyun.teautil.models.RuntimeOptions; +import com.playlet.web.core.config.SmsConfig; +import com.playlet.web.service.SmsService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +public class SmsServiceImpl implements SmsService { + + private final SmsConfig smsConfig; + + private final StringRedisTemplate stringRedisTemplate; + + @Override + public void sendSmsCode(String phone) throws Exception{ + // 短信验证码 + String code = String.valueOf((int)((Math.random() * 9 + 1) * Math.pow(10,5))); + // 工程代码泄露可能会导致AccessKey泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378657.html + Client client = createClient(smsConfig.getAccessKeyId(), smsConfig.getAccessKeySecret()); + SendSmsRequest sendSmsRequest = new SendSmsRequest() + .setSignName(smsConfig.getSignName()) + .setTemplateCode(smsConfig.getTemplateCode()) + .setPhoneNumbers(phone) + .setTemplateParam("{\"code\":"+ code +"}"); + RuntimeOptions runtime = new RuntimeOptions(); + // 复制代码运行请自行打印 API 的返回值 + SendSmsResponse sendSmsResponse = client.sendSmsWithOptions(sendSmsRequest, runtime); + log.info("发送给{}短信响应为{}", phone, sendSmsResponse); + } + + /** + * 使用AK&SK初始化账号Client + * @param accessKeyId key + * @param accessKeySecret 密钥 + * @throws Exception 异常信息 + */ + public static Client createClient(String accessKeyId, String accessKeySecret) throws Exception { + Config config = new Config() + // 必填,您的 AccessKey ID + .setAccessKeyId(accessKeyId) + // 必填,您的 AccessKey Secret + .setAccessKeySecret(accessKeySecret); + // 访问的域名 + config.endpoint = "dysmsapi.aliyuncs.com"; + return new Client(config); + } +} diff --git a/playlet-admin/src/main/java/com/playlet/web/service/impl/WxServiceImpl.java b/playlet-admin/src/main/java/com/playlet/web/service/impl/WxServiceImpl.java new file mode 100644 index 0000000..2de505d --- /dev/null +++ b/playlet-admin/src/main/java/com/playlet/web/service/impl/WxServiceImpl.java @@ -0,0 +1,45 @@ +package com.playlet.web.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.playlet.common.constant.PlayletConstants; +import com.playlet.common.utils.http.HttpUtils; +import com.playlet.web.core.config.WxConfig; +import com.playlet.web.service.WxService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +public class WxServiceImpl implements WxService { + + private final WxConfig wxConfig; + + @Override + public String getAccessToken() { + String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + wxConfig.getAppId() + "&secret=" + wxConfig.getSecret(); + log.info("调用微信获取access_token,入参url:{}", url); + String result = HttpUtils.sendGet(url); + log.info("调用微信获取access_token,响应内容:{}", result); + JSONObject json = JSONObject.parseObject(result); + if(json.containsKey(PlayletConstants.ACCESS_TOKEN)){ + return json.getString(PlayletConstants.ACCESS_TOKEN); + } + return null; + } + + @Override + public String getOpenidByCode(String code) { + String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="+ wxConfig.getAppId() + "&secret=" + wxConfig.getSecret() + "&code=" + code + "&grant_type=authorization_code"; + log.info("调用微信获取openId,入参url:{}", url); + String result = HttpUtils.sendGet(url); + log.info("调用微信获取openId,响应内容:{}", result); + JSONObject json = JSONObject.parseObject(result); + if(json.containsKey(PlayletConstants.OPEN_ID)){ + return json.getString(PlayletConstants.OPEN_ID); + } + return null; + } +} diff --git a/playlet-admin/src/main/resources/application.yml b/playlet-admin/src/main/resources/application.yml index 9b47c46..5fae754 100644 --- a/playlet-admin/src/main/resources/application.yml +++ b/playlet-admin/src/main/resources/application.yml @@ -16,7 +16,7 @@ ruoyi: # 开发环境配置 server: # 服务器的HTTP端口,默认为80 - port: 80 + port: 18080 servlet: # 应用的访问路径 context-path: / @@ -145,9 +145,22 @@ swagger: # 是否开启swagger enabled: true +#小程序配置 +wx: + appId: 'wx60fa92c432e05ed1' + secret: '8ff8ab065446e2ad552e88a37780d8fe' + +#阿里云OSS配置 aliyun: access-key-id: LTAI5tADpNeJG3YL1qQJiDk7 access-key-secret: BbxcqZjvx6yupekOLUbKDMINhbOioa bucket-name: qiepian2024 endpoint: http://oss-cn-shenzhen.aliyuncs.com url-prefix: http://qiepian2024.oss-cn-shenzhen.aliyuncs.com/ + +#阿里云短信验证码配置 +sms: + access-key-id: LTAI5tADpNeJG3YL1qQJiDk7 + access-key-secret: BbxcqZjvx6yupekOLUbKDMINhbOioa + sign-name: 微信小程序短剧切片 + template-code: SMS_465346724 diff --git a/playlet-admin/src/main/resources/templates/login.html b/playlet-admin/src/main/resources/templates/login.html index 8ce99d3..a814109 100644 --- a/playlet-admin/src/main/resources/templates/login.html +++ b/playlet-admin/src/main/resources/templates/login.html @@ -3,7 +3,7 @@ - 登录麻雀短剧系统 + 追风者 @@ -65,7 +65,9 @@ diff --git a/playlet-admin/src/main/resources/templates/system/playlet/project/project.html b/playlet-admin/src/main/resources/templates/system/playlet/project/project.html index 69e2696..a0fff6a 100644 --- a/playlet-admin/src/main/resources/templates/system/playlet/project/project.html +++ b/playlet-admin/src/main/resources/templates/system/playlet/project/project.html @@ -78,7 +78,7 @@