From aa43a92c7ec9053dbaef92fe5ccb3011b670442c Mon Sep 17 00:00:00 2001 From: puzhibing <393733352@qq.com> Date: 星期三, 12 七月 2023 11:46:21 +0800 Subject: [PATCH] 更新线上视频奖励模块接口 --- cloud-server-course/src/main/java/com/dsh/course/model/CoursePackageList.java | 2 cloud-server-other/src/main/java/com/dsh/other/controller/BannerController.java | 56 + cloud-server-account/src/main/java/com/dsh/account/service/UserIntegralChangesService.java | 10 cloud-server-activity/src/main/java/com/dsh/activity/model/BenefitsVideoClassificationListVo.java | 22 cloud-server-activity/src/main/java/com/dsh/activity/service/impl/BenefitsVideoClassificationServiceImpl.java | 15 cloud-server-competition/src/main/java/com/dsh/competition/model/CompetitionInfo.java | 2 cloud-server-activity/src/main/java/com/dsh/activity/service/IBenefitsVideoClassificationService.java | 11 cloud-server-activity/src/main/java/com/dsh/activity/feignclient/course/model/Course.java | 48 + cloud-server-course/src/main/java/com/dsh/course/entity/TCourse.java | 2 cloud-server-account/src/main/java/com/dsh/account/controller/UserIntegralChangesController.java | 33 + cloud-server-account/src/main/java/com/dsh/account/service/impl/UserIntegralChangesServiceImpl.java | 28 cloud-server-activity/src/main/java/com/dsh/activity/feignclient/course/CourseClient.java | 21 cloud-server-activity/src/main/java/com/dsh/activity/model/BenefitsVideosInfoVo.java | 30 + cloud-server-account/src/main/java/com/dsh/account/mapper/UserIntegralChangesMapper.java | 2 cloud-server-competition/src/main/java/com/dsh/competition/service/CompetitionService.java | 6 cloud-server-competition/src/main/java/com/dsh/CompetitionApplication.java | 2 cloud-server-activity/src/main/java/com/dsh/activity/mapper/UserBenefitsVideosMapper.java | 11 cloud-server-competition/src/main/resources/mapper/CompetitionMapper.xml | 10 cloud-server-activity/src/main/java/com/dsh/activity/model/BenefitsVideosListVo.java | 26 cloud-server-competition/src/main/java/com/dsh/competition/service/impl/CompetitionServiceImpl.java | 40 cloud-server-account/src/main/java/com/dsh/account/util/PayMoneyUtil.java | 144 ++-- cloud-server-activity/src/main/java/com/dsh/activity/feignclient/account/model/SaveUserIntegralChangesVo.java | 23 cloud-server-activity/src/main/java/com/dsh/activity/service/IUserBenefitsVideosService.java | 11 cloud-server-course/src/main/java/com/dsh/course/controller/CourseController.java | 17 cloud-server-activity/src/main/java/com/dsh/activity/mapper/BenefitsVideosMapper.java | 16 cloud-server-competition/src/main/java/com/dsh/competition/mapper/CompetitionMapper.java | 10 cloud-server-competition/src/main/java/com/dsh/competition/service/impl/PaymentCompetitionServiceImpl.java | 4 cloud-server-other/src/main/java/com/dsh/other/service/IBannerService.java | 11 cloud-server-gateway/src/main/java/cn/mb/cloud/gateway/auth/AuthService.java | 2 cloud-server-gateway/src/main/java/cn/mb/cloud/gateway/auth/ResultUtil.java | 5 cloud-server-competition/src/main/java/com/dsh/competition/util/JuHeUtil.java | 44 + cloud-server-activity/src/main/resources/mapper/BenefitsVideoClassificationMapper.xml | 6 cloud-server-course/src/main/java/com/dsh/course/util/PayMoneyUtil.java | 144 ++-- cloud-server-competition/src/main/java/com/dsh/competition/service/impl/ParticipantServiceImpl.java | 14 cloud-server-activity/src/main/java/com/dsh/activity/service/impl/UserBenefitsVideosServiceImpl.java | 15 cloud-server-activity/src/main/java/com/dsh/activity/controller/BenefitVideoController.java | 110 +++ cloud-server-activity/src/main/java/com/dsh/activity/mapper/BenefitsVideoClassificationMapper.java | 11 cloud-server-activity/src/main/java/com/dsh/activity/service/impl/BenefitsVideosServiceImpl.java | 158 +++++ cloud-server-activity/src/main/java/com/dsh/activity/feignclient/account/UserIntegralChangesClient.java | 21 cloud-server-competition/src/main/java/com/dsh/competition/util/PayMoneyUtil.java | 144 ++-- cloud-server-other/src/main/java/com/dsh/other/entity/Banner.java | 53 + cloud-server-other/src/main/java/com/dsh/other/mapper/BannerMapper.java | 11 cloud-server-competition/src/main/java/com/dsh/competition/util/TaskUtil.java | 31 + cloud-server-activity/src/main/java/com/dsh/activity/entity/BenefitsVideos.java | 24 cloud-server-activity/src/main/java/com/dsh/activity/service/BenefitsVideosService.java | 44 + cloud-server-activity/src/main/java/com/dsh/config/Sharding_jdbc/ShardingConfig.java | 21 cloud-server-activity/src/main/resources/mapper/UserBenefitsVideosMapper.xml | 6 cloud-server-activity/src/main/java/com/dsh/activity/entity/BenefitsVideoClassification.java | 43 + cloud-server-other/src/main/java/com/dsh/other/model/BannerVo.java | 20 cloud-server-other/src/main/java/com/dsh/other/service/impl/BannerServiceImpl.java | 15 cloud-server-activity/src/main/resources/mapper/BenefitsVideosMapper.xml | 28 cloud-server-account/src/main/java/com/dsh/account/model/SaveUserIntegralChangesVo.java | 23 cloud-server-account/src/main/java/com/dsh/account/entity/UserIntegralChanges.java | 16 cloud-server-competition/src/main/java/com/dsh/competition/model/EditParticipant.java | 16 cloud-server-activity/src/main/java/com/dsh/activity/entity/UserBenefitsVideos.java | 48 + 55 files changed, 1,424 insertions(+), 262 deletions(-) diff --git a/cloud-server-account/src/main/java/com/dsh/account/controller/UserIntegralChangesController.java b/cloud-server-account/src/main/java/com/dsh/account/controller/UserIntegralChangesController.java new file mode 100644 index 0000000..41f6691 --- /dev/null +++ b/cloud-server-account/src/main/java/com/dsh/account/controller/UserIntegralChangesController.java @@ -0,0 +1,33 @@ +package com.dsh.account.controller; + +import com.dsh.account.model.SaveUserIntegralChangesVo; +import com.dsh.account.service.UserIntegralChangesService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @author zhibing.pu + * @date 2023/7/12 11:25 + */ +@RestController +@RequestMapping("") +public class UserIntegralChangesController { + + @Autowired + private UserIntegralChangesService userIntegralChangesService; + + + /** + * 保存用户积分变动记录 + * @param vo + */ + @ResponseBody + @PostMapping("/userIntegralChanges/saveUserIntegralChanges") + public void saveUserIntegralChanges(@RequestBody SaveUserIntegralChangesVo vo){ + try { + userIntegralChangesService.saveUserIntegralChanges(vo); + }catch (Exception e){ + e.printStackTrace(); + } + } +} diff --git a/cloud-server-account/src/main/java/com/dsh/account/entity/UserIntegralChanges.java b/cloud-server-account/src/main/java/com/dsh/account/entity/UserIntegralChanges.java index 7930442..305748a 100644 --- a/cloud-server-account/src/main/java/com/dsh/account/entity/UserIntegralChanges.java +++ b/cloud-server-account/src/main/java/com/dsh/account/entity/UserIntegralChanges.java @@ -1,14 +1,14 @@ package com.dsh.account.entity; -import com.baomidou.mybatisplus.enums.IdType; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; import java.util.Date; -import com.baomidou.mybatisplus.annotations.TableId; -import com.baomidou.mybatisplus.activerecord.Model; -import com.baomidou.mybatisplus.annotations.TableName; import java.io.Serializable; -import com.baomidou.mybatisplus.annotations.Version; +import com.baomidou.mybatisplus.extension.activerecord.Model; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; @@ -37,26 +37,32 @@ /** * 用户id */ + @TableField("appUserId") private Integer appUserId; /** * 积分类型(1=赠送积分,2=兑换商品,3=完成课后练习,4=观看教学视频) */ + @TableField("type") private Integer type; /** * 历史积分 */ + @TableField("oldIntegral") private Integer oldIntegral; /** * 新积分 */ + @TableField("newIntegral") private Integer newIntegral; /** * 备注 */ + @TableField("remark") private String remark; /** * 添加时间 */ + @TableField("insertTime") private Date insertTime; diff --git a/cloud-server-account/src/main/java/com/dsh/account/mapper/UserIntegralChangesMapper.java b/cloud-server-account/src/main/java/com/dsh/account/mapper/UserIntegralChangesMapper.java index 5e9a97d..72bff09 100644 --- a/cloud-server-account/src/main/java/com/dsh/account/mapper/UserIntegralChangesMapper.java +++ b/cloud-server-account/src/main/java/com/dsh/account/mapper/UserIntegralChangesMapper.java @@ -1,7 +1,7 @@ package com.dsh.account.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.dsh.account.entity.UserIntegralChanges; -import com.baomidou.mybatisplus.mapper.BaseMapper; /** * <p> diff --git a/cloud-server-account/src/main/java/com/dsh/account/model/SaveUserIntegralChangesVo.java b/cloud-server-account/src/main/java/com/dsh/account/model/SaveUserIntegralChangesVo.java new file mode 100644 index 0000000..57a33db --- /dev/null +++ b/cloud-server-account/src/main/java/com/dsh/account/model/SaveUserIntegralChangesVo.java @@ -0,0 +1,23 @@ +package com.dsh.account.model; + +import lombok.Data; + +/** + * @author zhibing.pu + * @date 2023/7/12 11:26 + */ +@Data +public class SaveUserIntegralChangesVo { + /** + * 用户id + */ + private Integer appUserId; + /** + * 积分类型(1=赠送积分,2=兑换商品,3=完成课后练习,4=观看教学视频) + */ + private Integer type; + /** + * 积分 + */ + private Integer integral; +} diff --git a/cloud-server-account/src/main/java/com/dsh/account/service/UserIntegralChangesService.java b/cloud-server-account/src/main/java/com/dsh/account/service/UserIntegralChangesService.java index 2e21559..2d1b48a 100644 --- a/cloud-server-account/src/main/java/com/dsh/account/service/UserIntegralChangesService.java +++ b/cloud-server-account/src/main/java/com/dsh/account/service/UserIntegralChangesService.java @@ -1,7 +1,8 @@ package com.dsh.account.service; -import com.baomidou.mybatisplus.service.IService; +import com.baomidou.mybatisplus.extension.service.IService; import com.dsh.account.entity.UserIntegralChanges; +import com.dsh.account.model.SaveUserIntegralChangesVo; import com.dsh.account.model.vo.userBenefitDetail.IntegralDetailsResponse; /** @@ -16,4 +17,11 @@ IntegralDetailsResponse queryUserPointsDetails(String yearMonth, Integer recordId, Integer userIdFormRedis); + + /** + * 保存用户积分变动 + * @param vo + * @throws Exception + */ + void saveUserIntegralChanges(SaveUserIntegralChangesVo vo) throws Exception; } diff --git a/cloud-server-account/src/main/java/com/dsh/account/service/impl/UserIntegralChangesServiceImpl.java b/cloud-server-account/src/main/java/com/dsh/account/service/impl/UserIntegralChangesServiceImpl.java index 0280cee..309550a 100644 --- a/cloud-server-account/src/main/java/com/dsh/account/service/impl/UserIntegralChangesServiceImpl.java +++ b/cloud-server-account/src/main/java/com/dsh/account/service/impl/UserIntegralChangesServiceImpl.java @@ -1,11 +1,12 @@ package com.dsh.account.service.impl; -import com.baomidou.mybatisplus.mapper.EntityWrapper; -import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dsh.account.entity.TAppUser; import com.dsh.account.entity.UserIntegralChanges; import com.dsh.account.mapper.TAppUserMapper; import com.dsh.account.mapper.UserIntegralChangesMapper; +import com.dsh.account.model.SaveUserIntegralChangesVo; import com.dsh.account.model.vo.userBenefitDetail.IntegralDetailsResponse; import com.dsh.account.service.UserIntegralChangesService; import com.dsh.account.util.DateTimeHelper; @@ -49,10 +50,10 @@ monthStart = DateTimeHelper.getCurrentMouthStart(); monthEnd = DateTimeHelper.getCurrentMouthEnd(); } - List<UserIntegralChanges> userIntegralChanges = this.baseMapper.selectList(new EntityWrapper<UserIntegralChanges>() + List<UserIntegralChanges> userIntegralChanges = this.baseMapper.selectList(new QueryWrapper<UserIntegralChanges>() .eq("appUserId",userIdFormRedis ) .between("insertTime",monthStart,monthEnd) - .orderBy("insertTime",false)); + .orderByDesc("insertTime")); if (userIntegralChanges.size() > 0 ){ for (UserIntegralChanges userIntegralChange : userIntegralChanges) { IntegralDetailsResponse.IntegralsData detail= new IntegralDetailsResponse.IntegralsData(); @@ -96,4 +97,23 @@ } return vo; } + + + /** + * 保存用户积分变动 + * @param vo + * @throws Exception + */ + @Override + public void saveUserIntegralChanges(SaveUserIntegralChangesVo vo) throws Exception { + TAppUser appUser = tauMapper.selectById(vo.getAppUserId()); + UserIntegralChanges userIntegralChanges = new UserIntegralChanges(); + userIntegralChanges.setAppUserId(vo.getAppUserId()); + userIntegralChanges.setOldIntegral(appUser.getIntegral()); + userIntegralChanges.setType(vo.getType()); + appUser.setIntegral(appUser.getIntegral() + vo.getIntegral()); + userIntegralChanges.setNewIntegral(appUser.getIntegral()); + userIntegralChanges.setInsertTime(new Date()); + this.save(userIntegralChanges); + } } diff --git a/cloud-server-account/src/main/java/com/dsh/account/util/PayMoneyUtil.java b/cloud-server-account/src/main/java/com/dsh/account/util/PayMoneyUtil.java index 2d2a81b..0ffecf3 100644 --- a/cloud-server-account/src/main/java/com/dsh/account/util/PayMoneyUtil.java +++ b/cloud-server-account/src/main/java/com/dsh/account/util/PayMoneyUtil.java @@ -41,13 +41,13 @@ */ @Component public class PayMoneyUtil { - private String aliAppid = "";//支付宝appid + private String aliAppid = "2021004103650328";//支付宝appid - private String appPrivateKey = "";//支付宝开发者应用私钥 + private String appPrivateKey = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCSsBy+F6k1CTL4b0qQssuhf6x2aeqSn2eBmv0mJALK9iqRgA9EG0buYVnV/tsNGYvKCgX56onb+Cv+f9/TShZzp0FVGemIcgPhrjK0WW2RJBMq9EmPzc2x+7SkygKO1H6S3CwWhYdc7TCNL9OnFAHSEa+FfGNWXg0jM0mSXI7/me8icbWZd5mdiLTV+OWx5ONAE0GfVPhUPnb9faunE6gvZCamZnS+H6ACzzidO7ksVkZq5PBsI3Jew2oAcAJSktsljMZNqDrVknzUbvKBXSw80zZD66i5twx8+8els5VLo6qu9PD80l+K430r2eMqxzXm9mRXZSPSxoOm5c+0cNiHAgMBAAECggEAR+EIlJWfkp+JXHecgD88zUx0xCmuil6WJ8o81h27SJ1LyrSHxoXfQhxuGxChYk/sUfqLZyVonGOFm1Yp5a1eRxnkR8FE0FmeUU49Bmbz67VTty6xhUgBzX9by4w5qKezxl8hM4AHDqAjtGuFOU/yfG+yJKUJQF8h7OfK22+DmveglMt+W8buCf+IJahMyxYLWnA5eG8X1KjOC5PnpQEEBBB3g8fJpdbcoUteGGKzGhkSMKXuM//m2T8bU1sNZytnV+rDblg4E9IZIJwhory7WBxDzykEGpbM+RwJ6E6bAp6MXMUKbed1Uf/40d8C5yItWhjUh1a+ZDS0XbsMP+C/IQKBgQDmYhUr5wcqNQHqpKZWd0l/UZyR+Ykjk7WNvWFQIoMZmCWCGcepyQHAdXpk29evgTqcF9v9dlGDc7waFc93L2uxEYOaSk5UK8Sf6yoXHDocKwauY5DDvAuyy2b9QQDNqisi/MN872RaefBILz/DYN2ZbTtp8i/udSaRl01h6EXQfwKBgQCi/5+eIEcQZTa4zhq5CXKKVbcU2Y8uVsM1tgLaxOwQFr0Xd0ckQiJdkN7qhjgeSuOz0BOXo1xovzN4ZIKISB5sZDadgQCZi7O1YeKc8ElLPnV/WfKBGAxSBpURyMUOYH1mno5QG+QiGmTgH0/OhmqWfp+dVWHNwlx0EwMOpCBz+QKBgBRuVlpSXrxLfyQD/gxk/8uevTfk3VieXNd5GAw3Q1EdwRXMm3xfKxyaToRrSrFx0HTPWN8dgxUZSnE1xfRX7EEDwJwKQvAMAZ/9BvqNskmVNz537fqtzovIphWHkj6q/LBZoiyOPmQXtEtyhUEacgyNN1up8r4+/XCj7mTkaGyZAoGBAIx+GG6LE7WmB8yymYX0Bq4Fw5BNFYSzc/7PqxY1teMINmQLg15VQpmzTPCIT8aMdkd+ieSiAfynEQ4sU/ZzcwWqOwj3MDUonPUyMcljs0kPxObH+KYcvEHXOpXhnzgNIwlYkQGriK98YIZtdrRkV2rwKVPLTEm1xUqnOHNeNDrBAoGASnewOvqzZQVnzbGYur7nbEBQaMKWP2IYKozr57+EHQ40QFyTzFUx+jhxnQ2TIoXQEbozNp11eWGm9TZenHxUbOZmAmPKGq5DQzBgwj/V9QPNPpulCEkgjEqIn0gdCNaEilZXTpdsLPxmZ/J9IxGJt+y/5OYhbIwfSS9gbvVEook=";//支付宝开发者应用私钥 - private String alipayPublicKey = "";//支付宝应用公钥 + private String alipayPublicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwRiMpvwg288WxCwJTBxeqQcFlkZR1p+hZn3/GshrYgRKhGu34IfnRbEnb70YJBq0N1AmdJRU4tYMS1qqFcvKdXnUrdPz+yx4F/uWv+Vz7ftzAEZ1JJh1s9IhJ1ayE4NNWBczj12cIrinUcIHNoITmPFSpcizk9jGnzZZDK4u2oZQEontseu6QyLoc4bBXgy3J1Cux7Q3kO0m3unr0j14PSOAY6kMmgPOyAyuP5Vl655OFJz1x4YDiXs6c+fHLzEZh+Bmm4kCedE7PeJ69xpxSo+i0qia9mhiR4L3LmX7yAzDffHfSQHdxzN0UR34ZF9ChZi/tGOeGABbC35tzGiWWQIDAQAB";//支付宝应用公钥 - private String alipay_public_key = "";//支付宝支付公钥 + private String alipay_public_key = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmu8n/4yTHWbn7VOrNc9OsLtDL1bEQ8gC1dHkj8Wy5z0mkaOsjJRIG/28ze12M0V8jdCKuuDr5Z1OPKiqf+XO3ypguEh+mYUVMBM/cZodDFQfTY1TKLWjvQCuaqlA+QUTCK6f7T7stsgyQ1o9Jj0rXZDz6PM4QHSTzjrLIBaeqM5WIBvH+fy/X+QG5Utd+/UT0kc0JyvuKhZ65yVUd/C9VcwJJAPliRsAQNrqYterwAJ9zvw9tF11wj9W0XgJ8Ccu4x3gR1vrlLRJJo/OA97RmxPQ+5hSacWQZCUd1dwiBq+YCrKVHGTj14izRHXrLc0yBlRXo7tBOIqcy3IsvKVthQIDAQAB";//支付宝支付公钥 private String appid = "";//微信appid @@ -73,83 +73,83 @@ * 支付宝支付 */ public ResultUtil alipay(String body, String subject, String passbackParams, String outTradeNo, String amount, String notifyUrl){ - //构造client - CertAlipayRequest certAlipayRequest = new CertAlipayRequest (); - //设置网关地址 - certAlipayRequest.setServerUrl("https://openapi.alipay.com/gateway.do"); - //设置应用Id - certAlipayRequest.setAppId(aliAppid); - //设置应用私钥 - certAlipayRequest.setPrivateKey(appPrivateKey); - //设置请求格式,固定值json - certAlipayRequest.setFormat("json"); - //设置字符集 - certAlipayRequest.setCharset("UTF-8"); - //设置签名类型 - certAlipayRequest.setSignType("RSA2"); - //设置应用公钥证书路径 - certAlipayRequest.setCertPath(app_cert_path); - //设置支付宝公钥证书路径 - certAlipayRequest.setAlipayPublicCertPath(alipay_cert_path); - //设置支付宝根证书路径 - certAlipayRequest.setRootCertPath(alipay_root_cert_path); - //构造client - AlipayClient alipayClient = null; - try { - alipayClient = new DefaultAlipayClient(certAlipayRequest); - } catch (AlipayApiException e) { - e.printStackTrace(); - } - //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay - AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest (); - //SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。 - AlipayTradeAppPayModel model = new AlipayTradeAppPayModel (); - model.setBody(body); - model.setSubject (subject); - model.setOutTradeNo (outTradeNo); - model.setTimeoutExpress ("30m" ); - model.setTotalAmount (amount); - model.setProductCode ( "QUICK_MSECURITY_PAY" ); - model.setPassbackParams(passbackParams);//自定义参数 - request.setBizModel ( model ); - request.setNotifyUrl (callbackPath + notifyUrl); - try { - //这里和普通的接口调用不同,使用的是sdkExecute - AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request); - Map<String, String> map = new HashMap<>(); - map.put("orderString", response.getBody()); - System.out.println(map);//就是orderString 可以直接给客户端请求,无需再做处理。 - return ResultUtil.success(map); - } catch (AlipayApiException e ) { - e.printStackTrace(); - } - - -// //实例化客户端 -// AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", aliAppid, appPrivateKey, "json", "UTF-8", alipay_public_key, "RSA2"); -// //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay -// AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest(); -// //SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。 -// AlipayTradeAppPayModel model = new AlipayTradeAppPayModel(); -// model.setBody(body);//对一笔交易的具体描述信息。如果是多种商品,请将商品描述字符串累加传给body。 -// model.setSubject(subject);//商品的标题/交易标题/订单标题/订单关键字等。 -// model.setOutTradeNo(outTradeNo);//商户网站唯一订单号 -// model.setTimeoutExpress("30m"); -// model.setTotalAmount(amount);//付款金额 -// model.setProductCode("QUICK_MSECURITY_PAY"); -// model.setPassbackParams(passbackParams);//自定义参数 -// request.setBizModel(model); -// request.setNotifyUrl(callbackPath + notifyUrl); +// //构造client +// CertAlipayRequest certAlipayRequest = new CertAlipayRequest (); +// //设置网关地址 +// certAlipayRequest.setServerUrl("https://openapi.alipay.com/gateway.do"); +// //设置应用Id +// certAlipayRequest.setAppId(aliAppid); +// //设置应用私钥 +// certAlipayRequest.setPrivateKey(appPrivateKey); +// //设置请求格式,固定值json +// certAlipayRequest.setFormat("json"); +// //设置字符集 +// certAlipayRequest.setCharset("UTF-8"); +// //设置签名类型 +// certAlipayRequest.setSignType("RSA2"); +// //设置应用公钥证书路径 +// certAlipayRequest.setCertPath(app_cert_path); +// //设置支付宝公钥证书路径 +// certAlipayRequest.setAlipayPublicCertPath(alipay_cert_path); +// //设置支付宝根证书路径 +// certAlipayRequest.setRootCertPath(alipay_root_cert_path); +// //构造client +// AlipayClient alipayClient = null; // try { +// alipayClient = new DefaultAlipayClient(certAlipayRequest); +// } catch (AlipayApiException e) { +// e.printStackTrace(); +// } +// //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay +// AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest (); +// //SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。 +// AlipayTradeAppPayModel model = new AlipayTradeAppPayModel (); +// model.setBody(body); +// model.setSubject (subject); +// model.setOutTradeNo (outTradeNo); +// model.setTimeoutExpress ("30m" ); +// model.setTotalAmount (amount); +// model.setProductCode ( "QUICK_MSECURITY_PAY" ); +// model.setPassbackParams(passbackParams);//自定义参数 +// request.setBizModel ( model ); +// request.setNotifyUrl (callbackPath + notifyUrl); +// try { // //这里和普通的接口调用不同,使用的是sdkExecute // AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request); // Map<String, String> map = new HashMap<>(); // map.put("orderString", response.getBody()); // System.out.println(map);//就是orderString 可以直接给客户端请求,无需再做处理。 // return ResultUtil.success(map); -// } catch (AlipayApiException e) { +// } catch (AlipayApiException e ) { // e.printStackTrace(); // } + + + //实例化客户端 + AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", aliAppid, appPrivateKey, "json", "UTF-8", alipay_public_key, "RSA2"); + //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay + AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest(); + //SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。 + AlipayTradeAppPayModel model = new AlipayTradeAppPayModel(); + model.setBody(body);//对一笔交易的具体描述信息。如果是多种商品,请将商品描述字符串累加传给body。 + model.setSubject(subject);//商品的标题/交易标题/订单标题/订单关键字等。 + model.setOutTradeNo(outTradeNo);//商户网站唯一订单号 + model.setTimeoutExpress("30m"); + model.setTotalAmount(amount);//付款金额 + model.setProductCode("QUICK_MSECURITY_PAY"); + model.setPassbackParams(passbackParams);//自定义参数 + request.setBizModel(model); + request.setNotifyUrl(callbackPath + notifyUrl); + try { + //这里和普通的接口调用不同,使用的是sdkExecute + AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request); + Map<String, String> map = new HashMap<>(); + map.put("orderString", response.getBody()); + System.out.println(map);//就是orderString 可以直接给客户端请求,无需再做处理。 + return ResultUtil.success(map); + } catch (AlipayApiException e) { + e.printStackTrace(); + } return null; } diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/controller/BenefitVideoController.java b/cloud-server-activity/src/main/java/com/dsh/activity/controller/BenefitVideoController.java index 971a10f..8cf32c6 100644 --- a/cloud-server-activity/src/main/java/com/dsh/activity/controller/BenefitVideoController.java +++ b/cloud-server-activity/src/main/java/com/dsh/activity/controller/BenefitVideoController.java @@ -3,12 +3,19 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.dsh.activity.entity.BenefitsVideos; +import com.dsh.activity.model.BenefitsVideoClassificationListVo; +import com.dsh.activity.model.BenefitsVideosInfoVo; +import com.dsh.activity.model.BenefitsVideosListVo; import com.dsh.activity.service.BenefitsVideosService; +import com.dsh.activity.util.ResultUtil; +import com.dsh.activity.util.TokenUtil; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; + +import java.util.List; @RestController @RequestMapping("") @@ -18,6 +25,10 @@ @Autowired private BenefitsVideosService bfvService; + @Autowired + private TokenUtil tokenUtil; + + @PostMapping("base/benefitVideo/getList") @@ -26,4 +37,95 @@ } + + + @ResponseBody + @PostMapping("/api/benefitsVideo/queryClassificationBenefitsVideosList") + @ApiOperation(value = "获取视频列表", tags = {"APP-线上课得积分", "APP-看视频得奖励"}) + @ApiImplicitParams({ + @ApiImplicitParam(value = "位置(1=线上课得积分,2=看视频得奖励)", name = "position", dataType = "int", required = true), + @ApiImplicitParam(value = "搜索内容", name = "search", dataType = "string", required = false), + @ApiImplicitParam(name = "Authorization", value = "用户token(Bearer +token)", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....") + }) + public ResultUtil<List<BenefitsVideoClassificationListVo>> queryClassificationBenefitsVideosList(Integer position, String search){ + try { + Integer uid = tokenUtil.getUserIdFormRedis(); + if(null == uid){ + return ResultUtil.tokenErr(); + } + List<BenefitsVideoClassificationListVo> listVos = bfvService.queryClassificationBenefitsVideosList(uid, position, search); + return ResultUtil.success(listVos); + }catch (Exception e){ + e.printStackTrace(); + return ResultUtil.runErr(); + } + } + + + @ResponseBody + @PostMapping("/api/benefitsVideo/queryBenefitsVideosList") + @ApiOperation(value = "获取视频列表", tags = {"APP-线上课得积分", "APP-看视频得奖励"}) + @ApiImplicitParams({ + @ApiImplicitParam(value = "视频分类id", name = "classificationId", dataType = "int", required = true), + @ApiImplicitParam(value = "页码,首页1", name = "pageSize", dataType = "int", required = true), + @ApiImplicitParam(value = "页条数", name = "pageNo", dataType = "int", required = true), + @ApiImplicitParam(name = "Authorization", value = "用户token(Bearer +token)", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....") + }) + public ResultUtil<List<BenefitsVideosListVo>> queryBenefitsVideosList(Integer classificationId, Integer pageSize, Integer pageNo){ + try { + Integer uid = tokenUtil.getUserIdFormRedis(); + if(null == uid){ + return ResultUtil.tokenErr(); + } + List<BenefitsVideosListVo> benefitsVideosListVos = bfvService.queryBenefitsVideosList(uid, classificationId, pageSize, pageNo); + return ResultUtil.success(benefitsVideosListVos); + }catch (Exception e){ + e.printStackTrace(); + return ResultUtil.runErr(); + } + } + + + + @ResponseBody + @PostMapping("/api/benefitsVideo/queryBenefitsVideosInfo") + @ApiOperation(value = "获取视频详情", tags = {"APP-线上课得积分", "APP-看视频得奖励"}) + @ApiImplicitParams({ + @ApiImplicitParam(value = "视频id", name = "id", dataType = "int", required = true), + @ApiImplicitParam(name = "Authorization", value = "用户token(Bearer +token)", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....") + }) + public ResultUtil<BenefitsVideosInfoVo> queryBenefitsVideosInfo(Integer id){ + try { + Integer uid = tokenUtil.getUserIdFormRedis(); + if(null == uid){ + return ResultUtil.tokenErr(); + } + BenefitsVideosInfoVo benefitsVideosInfoVo = bfvService.queryBenefitsVideosInfo(uid, id); + return ResultUtil.success(benefitsVideosInfoVo); + }catch (Exception e){ + e.printStackTrace(); + return ResultUtil.runErr(); + } + } + + @ResponseBody + @PostMapping("/api/benefitsVideo/receiveAward") + @ApiOperation(value = "观看视频结束后领取奖励", tags = {"APP-线上课得积分", "APP-看视频得奖励"}) + @ApiImplicitParams({ + @ApiImplicitParam(value = "视频id", name = "id", dataType = "int", required = true), + @ApiImplicitParam(name = "Authorization", value = "用户token(Bearer +token)", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....") + }) + public ResultUtil receiveAward(Integer id) { + try { + Integer uid = tokenUtil.getUserIdFormRedis(); + if(null == uid){ + return ResultUtil.tokenErr(); + } + bfvService.receiveAward(uid, id); + return ResultUtil.success(); + }catch (Exception e){ + e.printStackTrace(); + return ResultUtil.runErr(); + } + } } diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/entity/BenefitsVideoClassification.java b/cloud-server-activity/src/main/java/com/dsh/activity/entity/BenefitsVideoClassification.java new file mode 100644 index 0000000..f1fe293 --- /dev/null +++ b/cloud-server-activity/src/main/java/com/dsh/activity/entity/BenefitsVideoClassification.java @@ -0,0 +1,43 @@ +package com.dsh.activity.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +/** + * @author zhibing.pu + * @date 2023/7/11 17:28 + */ +@Data +@TableName("t_benefits_video_classification") +public class BenefitsVideoClassification { + /** + * 主键 + */ + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + /** + * 分类名称 + */ + @TableField("name") + private String name; + /** + * 位置(1=线上课得积分,2=看视频得奖励) + */ + @TableField("position") + private Integer position; + /** + * 排序 + */ + @TableField("sort") + private Integer sort; + /** + * 添加时间 + */ + @TableField("insertTime") + private Date insertTime; +} diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/entity/BenefitsVideos.java b/cloud-server-activity/src/main/java/com/dsh/activity/entity/BenefitsVideos.java index b603c57..5246b77 100644 --- a/cloud-server-activity/src/main/java/com/dsh/activity/entity/BenefitsVideos.java +++ b/cloud-server-activity/src/main/java/com/dsh/activity/entity/BenefitsVideos.java @@ -1,6 +1,7 @@ package com.dsh.activity.entity; import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.extension.activerecord.Model; @@ -35,34 +36,27 @@ /** * 分类id */ + @TableField("benefitsVideoClassificationId") private Integer benefitsVideoClassificationId; /** - * 视频名称 + * 课程id */ - private String name; - /** - * 视频封面 - */ - private String cover; - /** - * 视频简介 - */ - private String introduction; - /** - * 视频地址 - */ - private String videos; + @TableField("courseId") + private Integer courseId; /** * 可得积分 */ - private String integral; + @TableField("integral") + private Integer integral; /** * 状态(1=正常,2=冻结,3=删除) */ + @TableField("state") private Integer state; /** * 添加时间 */ + @TableField("insertTime") private Date insertTime; diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/entity/UserBenefitsVideos.java b/cloud-server-activity/src/main/java/com/dsh/activity/entity/UserBenefitsVideos.java new file mode 100644 index 0000000..251fc00 --- /dev/null +++ b/cloud-server-activity/src/main/java/com/dsh/activity/entity/UserBenefitsVideos.java @@ -0,0 +1,48 @@ +package com.dsh.activity.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +/** + * @author zhibing.pu + * @date 2023/7/12 9:12 + */ +@Data +@TableName("t_user_benefits_videos") +public class UserBenefitsVideos { + /** + * 主键 + */ + @TableId(value = "id", type = IdType.INPUT) + private Long id; + /** + * 用户id + */ + @TableField("appUserId") + private Integer appUserId; + /** + * 分类id + */ + @TableField("benefitsVideoClassificationId") + private Integer benefitsVideoClassificationId; + /** + * 福利视频id + */ + @TableField("benefitsVideosId") + private Integer benefitsVideosId; + /** + * 获取积分 + */ + @TableField("integral") + private Integer integral; + /** + * 添加时间 + */ + @TableField("insertTime") + private Date insertTime; +} diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/account/UserIntegralChangesClient.java b/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/account/UserIntegralChangesClient.java new file mode 100644 index 0000000..6420526 --- /dev/null +++ b/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/account/UserIntegralChangesClient.java @@ -0,0 +1,21 @@ +package com.dsh.activity.feignclient.account; + +import com.dsh.activity.feignclient.account.model.SaveUserIntegralChangesVo; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; + +/** + * @author zhibing.pu + * @date 2023/7/12 11:40 + */ +@FeignClient("mb-cloud-account") +public interface UserIntegralChangesClient { + + + /** + * 保存用户积分变动记录 + * @param vo + */ + @PostMapping("/userIntegralChanges/saveUserIntegralChanges") + void saveUserIntegralChanges(SaveUserIntegralChangesVo vo); +} diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/account/model/SaveUserIntegralChangesVo.java b/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/account/model/SaveUserIntegralChangesVo.java new file mode 100644 index 0000000..c76eebf --- /dev/null +++ b/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/account/model/SaveUserIntegralChangesVo.java @@ -0,0 +1,23 @@ +package com.dsh.activity.feignclient.account.model; + +import lombok.Data; + +/** + * @author zhibing.pu + * @date 2023/7/12 11:26 + */ +@Data +public class SaveUserIntegralChangesVo { + /** + * 用户id + */ + private Integer appUserId; + /** + * 积分类型(1=赠送积分,2=兑换商品,3=完成课后练习,4=观看教学视频) + */ + private Integer type; + /** + * 积分 + */ + private Integer integral; +} diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/course/CourseClient.java b/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/course/CourseClient.java new file mode 100644 index 0000000..4373a9d --- /dev/null +++ b/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/course/CourseClient.java @@ -0,0 +1,21 @@ +package com.dsh.activity.feignclient.course; + +import com.dsh.activity.feignclient.course.model.Course; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; + +/** + * @author zhibing.pu + * @date 2023/7/12 9:57 + */ +@FeignClient("mb-cloud-course") +public interface CourseClient { + + /** + * 根据id获取课程详情 + * @param id + * @return + */ + @PostMapping("/course/queryCourseById") + Course queryCourseById(Integer id); +} diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/course/model/Course.java b/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/course/model/Course.java new file mode 100644 index 0000000..0273c7b --- /dev/null +++ b/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/course/model/Course.java @@ -0,0 +1,48 @@ +package com.dsh.activity.feignclient.course.model; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.util.Date; + +/** + * @author zhibing.pu + * @date 2023/7/12 9:58 + */ +@Data +public class Course { + private Integer id; + /** + * 课程名称 + */ + private String name; + /** + * 类型(1=课后练习,2=运动教学视频,3=器材教学视频) + */ + private Integer type; + /** + * 介绍 + */ + private String introduce; + /** + * 封面图 + */ + private String coverDrawing; + /** + * 介绍图 + */ + private String introductionDrawing; + /** + * 课程视频 + */ + private String courseVideo; + /** + * 状态(1=正常,2=冻结,3=删除) + */ + private Integer state; + /** + * 添加时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date insertTime; +} diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/mapper/BenefitsVideoClassificationMapper.java b/cloud-server-activity/src/main/java/com/dsh/activity/mapper/BenefitsVideoClassificationMapper.java new file mode 100644 index 0000000..a7c8261 --- /dev/null +++ b/cloud-server-activity/src/main/java/com/dsh/activity/mapper/BenefitsVideoClassificationMapper.java @@ -0,0 +1,11 @@ +package com.dsh.activity.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dsh.activity.entity.BenefitsVideoClassification; + +/** + * @author zhibing.pu + * @date 2023/7/11 17:30 + */ +public interface BenefitsVideoClassificationMapper extends BaseMapper<BenefitsVideoClassification> { +} diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/mapper/BenefitsVideosMapper.java b/cloud-server-activity/src/main/java/com/dsh/activity/mapper/BenefitsVideosMapper.java index eaa063c..6d94acb 100644 --- a/cloud-server-activity/src/main/java/com/dsh/activity/mapper/BenefitsVideosMapper.java +++ b/cloud-server-activity/src/main/java/com/dsh/activity/mapper/BenefitsVideosMapper.java @@ -1,7 +1,12 @@ package com.dsh.activity.mapper; +import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.dsh.activity.entity.BenefitsVideos; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; /** * <p> @@ -13,4 +18,15 @@ */ public interface BenefitsVideosMapper extends BaseMapper<BenefitsVideos> { + + /** + * 获取福利课程列表 + * @param uid + * @param classificationId + * @param pageSize + * @param pageNo + * @return + */ + List<Map<String, Object>> queryBenefitsVideosList(@Param("uid") Integer uid, @Param("classificationId") Integer classificationId, + @Param("pageSize") Integer pageSize, @Param("pageNo") Integer pageNo); } diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/mapper/UserBenefitsVideosMapper.java b/cloud-server-activity/src/main/java/com/dsh/activity/mapper/UserBenefitsVideosMapper.java new file mode 100644 index 0000000..fa8ce72 --- /dev/null +++ b/cloud-server-activity/src/main/java/com/dsh/activity/mapper/UserBenefitsVideosMapper.java @@ -0,0 +1,11 @@ +package com.dsh.activity.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dsh.activity.entity.UserBenefitsVideos; + +/** + * @author zhibing.pu + * @date 2023/7/12 9:14 + */ +public interface UserBenefitsVideosMapper extends BaseMapper<UserBenefitsVideos> { +} diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/model/BenefitsVideoClassificationListVo.java b/cloud-server-activity/src/main/java/com/dsh/activity/model/BenefitsVideoClassificationListVo.java new file mode 100644 index 0000000..67f9692 --- /dev/null +++ b/cloud-server-activity/src/main/java/com/dsh/activity/model/BenefitsVideoClassificationListVo.java @@ -0,0 +1,22 @@ +package com.dsh.activity.model; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @author zhibing.pu + * @date 2023/7/11 17:57 + */ +@Data +@ApiModel +public class BenefitsVideoClassificationListVo { + @ApiModelProperty("数据id") + private Integer id; + @ApiModelProperty("分类名称") + private String name; + @ApiModelProperty("视频列表") + private List<BenefitsVideosListVo> list; +} diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/model/BenefitsVideosInfoVo.java b/cloud-server-activity/src/main/java/com/dsh/activity/model/BenefitsVideosInfoVo.java new file mode 100644 index 0000000..94886fd --- /dev/null +++ b/cloud-server-activity/src/main/java/com/dsh/activity/model/BenefitsVideosInfoVo.java @@ -0,0 +1,30 @@ +package com.dsh.activity.model; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author zhibing.pu + * @date 2023/7/12 10:36 + */ +@Data +@ApiModel +public class BenefitsVideosInfoVo { + @ApiModelProperty("数据id") + private Integer id; + @ApiModelProperty("视频名称") + private String name; + @ApiModelProperty("封面图") + private String cover; + @ApiModelProperty("视频简介") + private String introduce; + @ApiModelProperty("视频介绍") + private String introductionDrawing; + @ApiModelProperty("视频地址") + private String courseVideo; + @ApiModelProperty("积分") + private Integer integral; + @ApiModelProperty("学习状态(0=未学习,1=已学习)") + private Integer study; +} diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/model/BenefitsVideosListVo.java b/cloud-server-activity/src/main/java/com/dsh/activity/model/BenefitsVideosListVo.java new file mode 100644 index 0000000..be41431 --- /dev/null +++ b/cloud-server-activity/src/main/java/com/dsh/activity/model/BenefitsVideosListVo.java @@ -0,0 +1,26 @@ +package com.dsh.activity.model; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author zhibing.pu + * @date 2023/7/11 17:56 + */ +@Data +@ApiModel +public class BenefitsVideosListVo { + @ApiModelProperty("数据id") + private Integer id; + @ApiModelProperty("视频名称") + private String name; + @ApiModelProperty("封面图") + private String cover; + @ApiModelProperty("视频简介") + private String introduce; + @ApiModelProperty("积分") + private Integer integral; + @ApiModelProperty("学习状态(0=未学习,1=已学习)") + private Integer study; +} diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/service/BenefitsVideosService.java b/cloud-server-activity/src/main/java/com/dsh/activity/service/BenefitsVideosService.java index 4727bae..b49ec9d 100644 --- a/cloud-server-activity/src/main/java/com/dsh/activity/service/BenefitsVideosService.java +++ b/cloud-server-activity/src/main/java/com/dsh/activity/service/BenefitsVideosService.java @@ -2,6 +2,11 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.dsh.activity.entity.BenefitsVideos; +import com.dsh.activity.model.BenefitsVideoClassificationListVo; +import com.dsh.activity.model.BenefitsVideosInfoVo; +import com.dsh.activity.model.BenefitsVideosListVo; + +import java.util.List; /** * <p> @@ -13,4 +18,43 @@ */ public interface BenefitsVideosService extends IService<BenefitsVideos> { + + /** + * 获取福利视频分类列表数据 + * @param uid + * @param search + * @return + * @throws Exception + */ + List<BenefitsVideoClassificationListVo> queryClassificationBenefitsVideosList(Integer uid, Integer position, String search) throws Exception; + + + /** + * 获取福利视频列表 + * @param uid + * @param classificationId + * @param pageSize + * @param pageNo + * @return + * @throws Exception + */ + List<BenefitsVideosListVo> queryBenefitsVideosList(Integer uid, Integer classificationId, Integer pageSize, Integer pageNo) throws Exception; + + + /** + * 获取福利视频详情 + * @param uid + * @param id + * @return + * @throws Exception + */ + BenefitsVideosInfoVo queryBenefitsVideosInfo(Integer uid, Integer id) throws Exception; + + + /** + * 视频观看完毕后获得奖励 + * @param id + * @throws Exception + */ + void receiveAward(Integer uid, Integer id) throws Exception; } diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/service/IBenefitsVideoClassificationService.java b/cloud-server-activity/src/main/java/com/dsh/activity/service/IBenefitsVideoClassificationService.java new file mode 100644 index 0000000..a6b909d --- /dev/null +++ b/cloud-server-activity/src/main/java/com/dsh/activity/service/IBenefitsVideoClassificationService.java @@ -0,0 +1,11 @@ +package com.dsh.activity.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dsh.activity.entity.BenefitsVideoClassification; + +/** + * @author zhibing.pu + * @date 2023/7/11 17:31 + */ +public interface IBenefitsVideoClassificationService extends IService<BenefitsVideoClassification> { +} diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/service/IUserBenefitsVideosService.java b/cloud-server-activity/src/main/java/com/dsh/activity/service/IUserBenefitsVideosService.java new file mode 100644 index 0000000..bf1b870 --- /dev/null +++ b/cloud-server-activity/src/main/java/com/dsh/activity/service/IUserBenefitsVideosService.java @@ -0,0 +1,11 @@ +package com.dsh.activity.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dsh.activity.entity.UserBenefitsVideos; + +/** + * @author zhibing.pu + * @date 2023/7/12 9:15 + */ +public interface IUserBenefitsVideosService extends IService<UserBenefitsVideos> { +} diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/service/impl/BenefitsVideoClassificationServiceImpl.java b/cloud-server-activity/src/main/java/com/dsh/activity/service/impl/BenefitsVideoClassificationServiceImpl.java new file mode 100644 index 0000000..9369d4e --- /dev/null +++ b/cloud-server-activity/src/main/java/com/dsh/activity/service/impl/BenefitsVideoClassificationServiceImpl.java @@ -0,0 +1,15 @@ +package com.dsh.activity.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dsh.activity.entity.BenefitsVideoClassification; +import com.dsh.activity.mapper.BenefitsVideoClassificationMapper; +import com.dsh.activity.service.IBenefitsVideoClassificationService; +import org.springframework.stereotype.Service; + +/** + * @author zhibing.pu + * @date 2023/7/11 17:31 + */ +@Service +public class BenefitsVideoClassificationServiceImpl extends ServiceImpl<BenefitsVideoClassificationMapper, BenefitsVideoClassification> implements IBenefitsVideoClassificationService { +} diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/service/impl/BenefitsVideosServiceImpl.java b/cloud-server-activity/src/main/java/com/dsh/activity/service/impl/BenefitsVideosServiceImpl.java index 1a7dc72..aad419a 100644 --- a/cloud-server-activity/src/main/java/com/dsh/activity/service/impl/BenefitsVideosServiceImpl.java +++ b/cloud-server-activity/src/main/java/com/dsh/activity/service/impl/BenefitsVideosServiceImpl.java @@ -1,10 +1,33 @@ package com.dsh.activity.service.impl; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dsh.activity.entity.BenefitsVideoClassification; import com.dsh.activity.entity.BenefitsVideos; +import com.dsh.activity.entity.UserBenefitsVideos; +import com.dsh.activity.feignclient.account.UserIntegralChangesClient; +import com.dsh.activity.feignclient.account.model.SaveUserIntegralChangesVo; +import com.dsh.activity.feignclient.course.CourseClient; +import com.dsh.activity.feignclient.course.model.Course; import com.dsh.activity.mapper.BenefitsVideosMapper; +import com.dsh.activity.model.BenefitsVideoClassificationListVo; +import com.dsh.activity.model.BenefitsVideosInfoVo; +import com.dsh.activity.model.BenefitsVideosListVo; import com.dsh.activity.service.BenefitsVideosService; +import com.dsh.activity.service.IBenefitsVideoClassificationService; +import com.dsh.activity.service.IUserBenefitsVideosService; +import com.dsh.activity.util.ToolUtil; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; /** * <p> @@ -17,4 +40,139 @@ @Service public class BenefitsVideosServiceImpl extends ServiceImpl<BenefitsVideosMapper, BenefitsVideos> implements BenefitsVideosService { + @Autowired + private IBenefitsVideoClassificationService benefitsVideoClassificationService; + + @Autowired + private IUserBenefitsVideosService userBenefitsVideosService; + + @Resource + private CourseClient courseClient; + + @Resource + private UserIntegralChangesClient userIntegralChangesClient; + + + + + + /** + * 获取福利视频分类列表数据 + * @param uid + * @param search + * @return + * @throws Exception + */ + @Override + public List<BenefitsVideoClassificationListVo> queryClassificationBenefitsVideosList(Integer uid, Integer position, String search) throws Exception { + QueryWrapper<BenefitsVideoClassification> wrapper = new QueryWrapper<BenefitsVideoClassification>().eq("position", position); + if(ToolUtil.isNotEmpty(search)){ + wrapper.like("name", search); + } + List<BenefitsVideoClassification> list = benefitsVideoClassificationService.list(wrapper.orderByAsc("sort")); + List<UserBenefitsVideos> userBenefitsVideos = userBenefitsVideosService.list(new QueryWrapper<UserBenefitsVideos>().eq("appUserId", uid)); + List<Integer> collect = userBenefitsVideos.stream().map(UserBenefitsVideos::getBenefitsVideosId).collect(Collectors.toList()); + + List<BenefitsVideoClassificationListVo> listVos = new ArrayList<>(); + for (BenefitsVideoClassification benefitsVideoClassification : list) { + BenefitsVideoClassificationListVo benefitsVideoClassificationListVo = new BenefitsVideoClassificationListVo(); + benefitsVideoClassificationListVo.setId(benefitsVideoClassification.getId()); + benefitsVideoClassificationListVo.setName(benefitsVideoClassification.getName()); + + List<BenefitsVideos> list1 = this.list(new QueryWrapper<BenefitsVideos>().eq("state", 1).notIn("id", collect).orderByDesc("insertTime").last(" limit 4")); + List<BenefitsVideosListVo> lists = new ArrayList<>(); + for (BenefitsVideos benefitsVideos : list1) { + Integer courseId = benefitsVideos.getCourseId(); + Course course = courseClient.queryCourseById(courseId); + BenefitsVideosListVo benefitsVideosListVo = new BenefitsVideosListVo(); + benefitsVideosListVo.setId(benefitsVideos.getId()); + benefitsVideosListVo.setName(course.getName()); + benefitsVideosListVo.setCover(course.getCoverDrawing()); + benefitsVideosListVo.setIntroduce(course.getIntroduce()); + lists.add(benefitsVideosListVo); + } + benefitsVideoClassificationListVo.setList(lists); + listVos.add(benefitsVideoClassificationListVo); + } + return listVos; + } + + + @Override + public List<BenefitsVideosListVo> queryBenefitsVideosList(Integer uid, Integer classificationId, Integer pageSize, Integer pageNo) throws Exception { + pageSize = (pageSize - 1) * pageNo; + List<Map<String, Object>> benefitsVideos = this.baseMapper.queryBenefitsVideosList(uid, classificationId, pageSize, pageNo); + List<BenefitsVideosListVo> lists = new ArrayList<>(); + for (Map<String, Object> benefitsVideo : benefitsVideos) { + Integer id = Integer.valueOf(benefitsVideo.get("id").toString()); + Integer courseId = Integer.valueOf(benefitsVideo.get("courseId").toString()); + Integer integral = Integer.valueOf(benefitsVideo.get("integral").toString()); + Integer study = Integer.valueOf(benefitsVideo.get("study").toString()); + Course course = courseClient.queryCourseById(courseId); + BenefitsVideosListVo benefitsVideosListVo = new BenefitsVideosListVo(); + benefitsVideosListVo.setId(id); + benefitsVideosListVo.setName(course.getName()); + benefitsVideosListVo.setCover(course.getCoverDrawing()); + benefitsVideosListVo.setIntroduce(course.getIntroduce()); + benefitsVideosListVo.setIntegral(integral); + benefitsVideosListVo.setStudy(study); + lists.add(benefitsVideosListVo); + } + return lists; + } + + + /** + * 获取福利视频详情 + * @param uid + * @param id + * @return + * @throws Exception + */ + @Override + public BenefitsVideosInfoVo queryBenefitsVideosInfo(Integer uid, Integer id) throws Exception { + BenefitsVideos benefitsVideos = this.getById(id); + Integer courseId = benefitsVideos.getCourseId(); + Course course = courseClient.queryCourseById(courseId); + BenefitsVideosInfoVo benefitsVideosInfoVo = new BenefitsVideosInfoVo(); + benefitsVideosInfoVo.setId(id); + benefitsVideosInfoVo.setName(course.getName()); + benefitsVideosInfoVo.setCover(course.getCoverDrawing()); + benefitsVideosInfoVo.setIntroduce(course.getIntroduce()); + benefitsVideosInfoVo.setIntroductionDrawing(course.getIntroductionDrawing()); + benefitsVideosInfoVo.setCourseVideo(course.getCourseVideo()); + benefitsVideosInfoVo.setIntegral(benefitsVideos.getIntegral()); + UserBenefitsVideos one = userBenefitsVideosService.getOne(new QueryWrapper<UserBenefitsVideos>().eq("appUserId", uid).eq("benefitsVideosId", id)); + benefitsVideosInfoVo.setStudy(null == one ? 0 : 1); + return benefitsVideosInfoVo; + } + + + /** + * 视频观看完毕后获得奖励 + * @param uid + * @param id + * @throws Exception + */ + @Override + public void receiveAward(Integer uid, Integer id) throws Exception { + BenefitsVideos benefitsVideos = this.getById(id); + UserBenefitsVideos one = userBenefitsVideosService.getOne(new QueryWrapper<UserBenefitsVideos>().eq("appUserId", uid).eq("benefitsVideosId", id)); + if(null == one){ + one = new UserBenefitsVideos(); + one.setAppUserId(uid); + one.setBenefitsVideoClassificationId(benefitsVideos.getBenefitsVideoClassificationId()); + one.setBenefitsVideosId(id); + one.setInsertTime(new Date()); + one.setIntegral(benefitsVideos.getIntegral()); + userBenefitsVideosService.save(one); + + //添加积分 + SaveUserIntegralChangesVo vo = new SaveUserIntegralChangesVo(); + vo.setAppUserId(uid); + vo.setIntegral(benefitsVideos.getIntegral()); + vo.setType(4); + userIntegralChangesClient.saveUserIntegralChanges(vo); + } + } } diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/service/impl/UserBenefitsVideosServiceImpl.java b/cloud-server-activity/src/main/java/com/dsh/activity/service/impl/UserBenefitsVideosServiceImpl.java new file mode 100644 index 0000000..7a5eff8 --- /dev/null +++ b/cloud-server-activity/src/main/java/com/dsh/activity/service/impl/UserBenefitsVideosServiceImpl.java @@ -0,0 +1,15 @@ +package com.dsh.activity.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dsh.activity.entity.UserBenefitsVideos; +import com.dsh.activity.mapper.UserBenefitsVideosMapper; +import com.dsh.activity.service.IUserBenefitsVideosService; +import org.springframework.stereotype.Service; + +/** + * @author zhibing.pu + * @date 2023/7/12 9:15 + */ +@Service +public class UserBenefitsVideosServiceImpl extends ServiceImpl<UserBenefitsVideosMapper, UserBenefitsVideos> implements IUserBenefitsVideosService { +} diff --git a/cloud-server-activity/src/main/java/com/dsh/config/Sharding_jdbc/ShardingConfig.java b/cloud-server-activity/src/main/java/com/dsh/config/Sharding_jdbc/ShardingConfig.java index bb66dd0..7e0a34d 100644 --- a/cloud-server-activity/src/main/java/com/dsh/config/Sharding_jdbc/ShardingConfig.java +++ b/cloud-server-activity/src/main/java/com/dsh/config/Sharding_jdbc/ShardingConfig.java @@ -84,6 +84,15 @@ result2.getKeyGenerators().put("t_user_points_merchandise-snowflake", new AlgorithmConfiguration("SNOWFLAKE", new Properties())); linkedList.add(result2); + //分片规则配置 + ShardingRuleConfiguration result3 = new ShardingRuleConfiguration(); + result3.getTables().add(getUserBenefitsVideosTableRuleConfiguration()); + Properties props3 = new Properties(); + props3.setProperty("algorithm-expression", "t_user_benefits_videos$->{appUserId % 5 + 1}"); + result3.getShardingAlgorithms().put("t_user_benefits_videos-inline", new AlgorithmConfiguration("INLINE", props3)); + result3.getKeyGenerators().put("t_user_benefits_videos-snowflake", new AlgorithmConfiguration("SNOWFLAKE", new Properties())); + linkedList.add(result3); + return linkedList; } @@ -111,4 +120,16 @@ return result; } + + /** + * 分片算法配置 + * @return + */ + private ShardingTableRuleConfiguration getUserBenefitsVideosTableRuleConfiguration() { + ShardingTableRuleConfiguration result = new ShardingTableRuleConfiguration("t_user_benefits_videos", "m_$->{0}.t_user_benefits_videos$->{1..5}");//30 + result.setTableShardingStrategy(new StandardShardingStrategyConfiguration("appUserId", "t_user_benefits_videos-inline")); + result.setKeyGenerateStrategy(new KeyGenerateStrategyConfiguration("id", "t_user_benefits_videos-snowflake")); + return result; + } + } diff --git a/cloud-server-activity/src/main/resources/mapper/BenefitsVideoClassificationMapper.xml b/cloud-server-activity/src/main/resources/mapper/BenefitsVideoClassificationMapper.xml new file mode 100644 index 0000000..df28755 --- /dev/null +++ b/cloud-server-activity/src/main/resources/mapper/BenefitsVideoClassificationMapper.xml @@ -0,0 +1,6 @@ +<?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.dsh.activity.mapper.BenefitsVideoClassificationMapper"> + + +</mapper> diff --git a/cloud-server-activity/src/main/resources/mapper/BenefitsVideosMapper.xml b/cloud-server-activity/src/main/resources/mapper/BenefitsVideosMapper.xml index 8350761..a89bf74 100644 --- a/cloud-server-activity/src/main/resources/mapper/BenefitsVideosMapper.xml +++ b/cloud-server-activity/src/main/resources/mapper/BenefitsVideosMapper.xml @@ -3,4 +3,32 @@ <mapper namespace="com.dsh.activity.mapper.BenefitsVideosMapper"> + <select id="queryBenefitsVideosList" resultType="map"> + select * from ( + (select + id, + courseId, + integral, + 0 as study + from t_benefits_videos where state = 1 and id not in (select benefitsVideosId from t_user_benefits_videos where appUserId = #{uid}) + <if test="null != classificationId"> + and benefitsVideoClassificationId = #{classificationId} + </if> + order by insertTime desc) + + union all + + (select + id, + courseId, + integral, + 1 as study + from t_benefits_videos where state = 1 and id in (select benefitsVideosId from t_user_benefits_videos where appUserId = #{uid}) + <if test="null != classificationId"> + and benefitsVideoClassificationId = #{classificationId} + </if> + order by insertTime desc) + ) as a limit #{pageSize}, #{pageNo} + </select> + </mapper> diff --git a/cloud-server-activity/src/main/resources/mapper/UserBenefitsVideosMapper.xml b/cloud-server-activity/src/main/resources/mapper/UserBenefitsVideosMapper.xml new file mode 100644 index 0000000..860436f --- /dev/null +++ b/cloud-server-activity/src/main/resources/mapper/UserBenefitsVideosMapper.xml @@ -0,0 +1,6 @@ +<?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.dsh.activity.mapper.UserBenefitsVideosMapper"> + + +</mapper> diff --git a/cloud-server-competition/src/main/java/com/dsh/CompetitionApplication.java b/cloud-server-competition/src/main/java/com/dsh/CompetitionApplication.java index a5a0ac8..a464f60 100644 --- a/cloud-server-competition/src/main/java/com/dsh/CompetitionApplication.java +++ b/cloud-server-competition/src/main/java/com/dsh/CompetitionApplication.java @@ -9,6 +9,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Import; import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; +import org.springframework.scheduling.annotation.EnableScheduling; import springfox.documentation.swagger2.annotations.EnableSwagger2; import javax.annotation.PostConstruct; @@ -18,6 +19,7 @@ * @author jason */ @EnableSwagger2 +@EnableScheduling @EnableFeignClients @MBCloudApplication @Import({WebConfig.class}) diff --git a/cloud-server-competition/src/main/java/com/dsh/competition/mapper/CompetitionMapper.java b/cloud-server-competition/src/main/java/com/dsh/competition/mapper/CompetitionMapper.java index 69a7c85..f1c1c47 100644 --- a/cloud-server-competition/src/main/java/com/dsh/competition/mapper/CompetitionMapper.java +++ b/cloud-server-competition/src/main/java/com/dsh/competition/mapper/CompetitionMapper.java @@ -29,4 +29,14 @@ List<CompetitionListVo> queryCompetitionList(@Param("cityCode") String cityCode, @Param("content") String content, @Param("registerCondition") Integer registerCondition, @Param("heat") Integer heat); + + /** + * 定时任务修改赛事状态 + */ + void taskSetStatusStart(); + + + + void taskSetStatusEnd(); + } diff --git a/cloud-server-competition/src/main/java/com/dsh/competition/model/CompetitionInfo.java b/cloud-server-competition/src/main/java/com/dsh/competition/model/CompetitionInfo.java index 6ffed56..4bf4f7b 100644 --- a/cloud-server-competition/src/main/java/com/dsh/competition/model/CompetitionInfo.java +++ b/cloud-server-competition/src/main/java/com/dsh/competition/model/CompetitionInfo.java @@ -59,4 +59,6 @@ private Integer apply; @ApiModelProperty("报名参赛人员") private List<ParticipantVo> participant; + @ApiModelProperty("状态(1=未开始,2=进行中,3=已结束,4=已取消)") + private Integer status; } diff --git a/cloud-server-competition/src/main/java/com/dsh/competition/model/EditParticipant.java b/cloud-server-competition/src/main/java/com/dsh/competition/model/EditParticipant.java index 3bb658e..d7ae2fe 100644 --- a/cloud-server-competition/src/main/java/com/dsh/competition/model/EditParticipant.java +++ b/cloud-server-competition/src/main/java/com/dsh/competition/model/EditParticipant.java @@ -1,7 +1,10 @@ package com.dsh.competition.model; +import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModelProperty; import lombok.Data; + +import java.util.Date; /** * @author zhibing.pu @@ -11,10 +14,19 @@ public class EditParticipant { @ApiModelProperty(value = "数据id", dataType = "int", required = true) private Integer id; - @ApiModelProperty(value = "身高(CM)", dataType = "int", required = true) + @ApiModelProperty(value = "身高(CM)", dataType = "int", required = false) private Integer height; - @ApiModelProperty(value = "体重(KG)", dataType = "double", required = true) + @ApiModelProperty(value = "体重(KG)", dataType = "double", required = false) private Double weight; @ApiModelProperty(value = "联系电话", dataType = "string", required = false) private String phone; + @ApiModelProperty(value = "姓名", dataType = "string", required = false) + private String name; + @ApiModelProperty(value = "生日", dataType = "string", required = false) + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + private Date birthday; + @ApiModelProperty(value = "性别(1=男,2=女)", dataType = "int", required = false) + private Integer gender; + @ApiModelProperty(value = "身份证号码", dataType = "string", required = false) + private String idcard; } diff --git a/cloud-server-competition/src/main/java/com/dsh/competition/service/CompetitionService.java b/cloud-server-competition/src/main/java/com/dsh/competition/service/CompetitionService.java index 005e215..570cb53 100644 --- a/cloud-server-competition/src/main/java/com/dsh/competition/service/CompetitionService.java +++ b/cloud-server-competition/src/main/java/com/dsh/competition/service/CompetitionService.java @@ -47,4 +47,10 @@ * @throws Exception */ ResultUtil paymentCompetition(Integer uid, PaymentCompetitionVo paymentCompetitionVo) throws Exception; + + + /** + * 定时任务修改赛事状态 + */ + void taskSetStatus(); } diff --git a/cloud-server-competition/src/main/java/com/dsh/competition/service/impl/CompetitionServiceImpl.java b/cloud-server-competition/src/main/java/com/dsh/competition/service/impl/CompetitionServiceImpl.java index cae574a..b0f2838 100644 --- a/cloud-server-competition/src/main/java/com/dsh/competition/service/impl/CompetitionServiceImpl.java +++ b/cloud-server-competition/src/main/java/com/dsh/competition/service/impl/CompetitionServiceImpl.java @@ -104,16 +104,18 @@ competitionInfo.setImgs(competition.getImgs()); competitionInfo.setName(competition.getName()); competitionInfo.setRegisterCondition(competition.getRegisterCondition()); - Store store = storeClient.queryStoreById(competition.getStoreId()); - competitionInfo.setStoreName(store.getName()); - competitionInfo.setStoreAddress(store.getAddress()); - competitionInfo.setStoreLon(store.getLon()); - competitionInfo.setStoreLat(store.getLat()); - competitionInfo.setStoreCoverDrawing(store.getCoverDrawing()); - if(ToolUtil.isNotEmpty(lon) && ToolUtil.isNotEmpty(lat)){ - Map<String, Double> distance = GeodesyUtil.getDistance(lon + "," + lat, store.getLon() + "," + store.getLat()); - double wgs84 = new BigDecimal(distance.get("WGS84")).divide(new BigDecimal(1000)).setScale(2, RoundingMode.HALF_EVEN).doubleValue(); - competitionInfo.setDistance(wgs84); + if(null != competition.getStoreId()){ + Store store = storeClient.queryStoreById(competition.getStoreId()); + competitionInfo.setStoreName(store.getName()); + competitionInfo.setStoreAddress(store.getAddress()); + competitionInfo.setStoreLon(store.getLon()); + competitionInfo.setStoreLat(store.getLat()); + competitionInfo.setStoreCoverDrawing(store.getCoverDrawing()); + if(ToolUtil.isNotEmpty(lon) && ToolUtil.isNotEmpty(lat)){ + Map<String, Double> distance = GeodesyUtil.getDistance(lon + "," + lat, store.getLon() + "," + store.getLat()); + double wgs84 = new BigDecimal(distance.get("WGS84")).divide(new BigDecimal(1000)).setScale(2, RoundingMode.HALF_EVEN).doubleValue(); + competitionInfo.setDistance(wgs84); + } } competitionInfo.setRegisterEndTime(sdf.format(competition.getRegisterEndTime())); competitionInfo.setStartTime(sdf.format(competition.getStartTime())); @@ -127,11 +129,12 @@ competitionInfo.setIntroduction(competition.getIntroduction()); competitionInfo.setRegistrationNotes(competition.getRegistrationNotes()); competitionInfo.setApply(0); - PaymentCompetition one = paymentCompetitionService.getOne(new QueryWrapper<PaymentCompetition>().eq("competitionId", id).eq("appUserId", uid).eq("payStatus", 2)); + competitionInfo.setStatus(competition.getStatus()); + PaymentCompetition one = paymentCompetitionService.getOne(new QueryWrapper<PaymentCompetition>().eq("competitionId", id).eq("appUserId", uid).ne("payStatus", 1).orderByDesc("insertTime").last(" limit 1")); if(null != one){ competitionInfo.setApply(1); List<ParticipantVo> participant = new ArrayList<>(); - List<UserCompetition> list = userCompetitionService.list(new QueryWrapper<UserCompetition>().eq("competitionId", id).eq("appUserId", uid)); + List<UserCompetition> list = userCompetitionService.list(new QueryWrapper<UserCompetition>().eq("paymentCompetitionId", one.getId())); List<Integer> collect = list.stream().map(UserCompetition::getParticipantId).collect(Collectors.toList()); List<Participant> participants = participantService.listByIds(collect); SimpleDateFormat sdf_year = new SimpleDateFormat("yyyy"); @@ -145,6 +148,9 @@ participant.add(participantVo); } competitionInfo.setParticipant(participant); + if(one.getPayStatus() == 3){ + competitionInfo.setStatus(4); + } } return competitionInfo; } @@ -369,4 +375,14 @@ } return alipay; } + + + /** + * 定时任务修改赛事状态 + */ + @Override + public void taskSetStatus() { + this.baseMapper.taskSetStatusStart(); + this.baseMapper.taskSetStatusEnd(); + } } diff --git a/cloud-server-competition/src/main/java/com/dsh/competition/service/impl/ParticipantServiceImpl.java b/cloud-server-competition/src/main/java/com/dsh/competition/service/impl/ParticipantServiceImpl.java index 2e4e589..14bb0d3 100644 --- a/cloud-server-competition/src/main/java/com/dsh/competition/service/impl/ParticipantServiceImpl.java +++ b/cloud-server-competition/src/main/java/com/dsh/competition/service/impl/ParticipantServiceImpl.java @@ -12,6 +12,7 @@ import com.dsh.competition.model.ParticipantVo; import com.dsh.competition.model.SaveParticipant; import com.dsh.competition.service.IParticipantService; +import com.dsh.competition.util.JuHeUtil; import com.dsh.competition.util.ResultUtil; import com.dsh.competition.util.ToolUtil; import org.springframework.beans.BeanUtils; @@ -53,6 +54,13 @@ if(null != one){ return ResultUtil.error("电话号码重复"); } + if(ToolUtil.isNotEmpty(addParticipant.getName()) && ToolUtil.isNotEmpty(addParticipant.getIdcard())){ + Boolean aBoolean = JuHeUtil.idcardAuthentication(addParticipant.getIdcard(), addParticipant.getName()); + if(!aBoolean){ + return ResultUtil.error("身份证和姓名不匹配"); + } + } + Participant participant = new Participant(); BeanUtils.copyProperties(addParticipant, participant); participant.setAppUserId(uid); @@ -106,6 +114,12 @@ if(null != one && one.getId().compareTo(editParticipant.getId()) != 0){ return ResultUtil.error("电话号码重复"); } + if(ToolUtil.isNotEmpty(editParticipant.getName()) && ToolUtil.isNotEmpty(editParticipant.getIdcard())){ + Boolean aBoolean = JuHeUtil.idcardAuthentication(editParticipant.getIdcard(), editParticipant.getName()); + if(!aBoolean){ + return ResultUtil.error("身份证和姓名不匹配"); + } + } Participant participant = this.getById(editParticipant.getId()); participant.setHeight(editParticipant.getHeight()); participant.setWeight(editParticipant.getWeight()); diff --git a/cloud-server-competition/src/main/java/com/dsh/competition/service/impl/PaymentCompetitionServiceImpl.java b/cloud-server-competition/src/main/java/com/dsh/competition/service/impl/PaymentCompetitionServiceImpl.java index 6db453b..c2e3036 100644 --- a/cloud-server-competition/src/main/java/com/dsh/competition/service/impl/PaymentCompetitionServiceImpl.java +++ b/cloud-server-competition/src/main/java/com/dsh/competition/service/impl/PaymentCompetitionServiceImpl.java @@ -135,6 +135,10 @@ participant.add(participantVo); } competitionInfo.setParticipant(participant); + competitionInfo.setStatus(competition.getStatus()); + if(paymentCompetition.getPayStatus() == 3){ + competitionInfo.setStatus(4); + } return competitionInfo; } diff --git a/cloud-server-competition/src/main/java/com/dsh/competition/util/JuHeUtil.java b/cloud-server-competition/src/main/java/com/dsh/competition/util/JuHeUtil.java new file mode 100644 index 0000000..572ea37 --- /dev/null +++ b/cloud-server-competition/src/main/java/com/dsh/competition/util/JuHeUtil.java @@ -0,0 +1,44 @@ +package com.dsh.competition.util; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.dsh.competition.util.httpClinet.HttpClientUtil; +import com.dsh.competition.util.httpClinet.HttpResult; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author zhibing.pu + * @date 2023/7/11 12:05 + */ +public class JuHeUtil { + + + /** + * 校验实名认证 + * @param idcard + * @param name + * @return + * @throws Exception + */ + public static Boolean idcardAuthentication(String idcard, String name) throws Exception{ + Map<String, Object> params = new HashMap<>(); + params.put("idcard", idcard); + params.put("realname", name); + params.put("key", "29fec4bbe3108e4fbf52704e5a906fe0"); + HttpResult httpResult = HttpClientUtil.pushHttpRequset("POST", "http://op.juhe.cn/idcard/query", params, null, "form"); + if(httpResult.getCode() != 200){ + return false; + } + JSONObject jsonObject = JSON.parseObject(httpResult.getData()); + Integer error_code = jsonObject.getInteger("error_code"); + if(0 == error_code){ + JSONObject result = jsonObject.getJSONObject("result"); + Integer res = result.getInteger("res"); + return res == 1 ? true : false; + } + return false; + } + +} diff --git a/cloud-server-competition/src/main/java/com/dsh/competition/util/PayMoneyUtil.java b/cloud-server-competition/src/main/java/com/dsh/competition/util/PayMoneyUtil.java index 5a67746..e2c8a61 100644 --- a/cloud-server-competition/src/main/java/com/dsh/competition/util/PayMoneyUtil.java +++ b/cloud-server-competition/src/main/java/com/dsh/competition/util/PayMoneyUtil.java @@ -41,13 +41,13 @@ */ @Component public class PayMoneyUtil { - private String aliAppid = "";//支付宝appid + private String aliAppid = "2021004103650328";//支付宝appid - private String appPrivateKey = "";//支付宝开发者应用私钥 + private String appPrivateKey = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCSsBy+F6k1CTL4b0qQssuhf6x2aeqSn2eBmv0mJALK9iqRgA9EG0buYVnV/tsNGYvKCgX56onb+Cv+f9/TShZzp0FVGemIcgPhrjK0WW2RJBMq9EmPzc2x+7SkygKO1H6S3CwWhYdc7TCNL9OnFAHSEa+FfGNWXg0jM0mSXI7/me8icbWZd5mdiLTV+OWx5ONAE0GfVPhUPnb9faunE6gvZCamZnS+H6ACzzidO7ksVkZq5PBsI3Jew2oAcAJSktsljMZNqDrVknzUbvKBXSw80zZD66i5twx8+8els5VLo6qu9PD80l+K430r2eMqxzXm9mRXZSPSxoOm5c+0cNiHAgMBAAECggEAR+EIlJWfkp+JXHecgD88zUx0xCmuil6WJ8o81h27SJ1LyrSHxoXfQhxuGxChYk/sUfqLZyVonGOFm1Yp5a1eRxnkR8FE0FmeUU49Bmbz67VTty6xhUgBzX9by4w5qKezxl8hM4AHDqAjtGuFOU/yfG+yJKUJQF8h7OfK22+DmveglMt+W8buCf+IJahMyxYLWnA5eG8X1KjOC5PnpQEEBBB3g8fJpdbcoUteGGKzGhkSMKXuM//m2T8bU1sNZytnV+rDblg4E9IZIJwhory7WBxDzykEGpbM+RwJ6E6bAp6MXMUKbed1Uf/40d8C5yItWhjUh1a+ZDS0XbsMP+C/IQKBgQDmYhUr5wcqNQHqpKZWd0l/UZyR+Ykjk7WNvWFQIoMZmCWCGcepyQHAdXpk29evgTqcF9v9dlGDc7waFc93L2uxEYOaSk5UK8Sf6yoXHDocKwauY5DDvAuyy2b9QQDNqisi/MN872RaefBILz/DYN2ZbTtp8i/udSaRl01h6EXQfwKBgQCi/5+eIEcQZTa4zhq5CXKKVbcU2Y8uVsM1tgLaxOwQFr0Xd0ckQiJdkN7qhjgeSuOz0BOXo1xovzN4ZIKISB5sZDadgQCZi7O1YeKc8ElLPnV/WfKBGAxSBpURyMUOYH1mno5QG+QiGmTgH0/OhmqWfp+dVWHNwlx0EwMOpCBz+QKBgBRuVlpSXrxLfyQD/gxk/8uevTfk3VieXNd5GAw3Q1EdwRXMm3xfKxyaToRrSrFx0HTPWN8dgxUZSnE1xfRX7EEDwJwKQvAMAZ/9BvqNskmVNz537fqtzovIphWHkj6q/LBZoiyOPmQXtEtyhUEacgyNN1up8r4+/XCj7mTkaGyZAoGBAIx+GG6LE7WmB8yymYX0Bq4Fw5BNFYSzc/7PqxY1teMINmQLg15VQpmzTPCIT8aMdkd+ieSiAfynEQ4sU/ZzcwWqOwj3MDUonPUyMcljs0kPxObH+KYcvEHXOpXhnzgNIwlYkQGriK98YIZtdrRkV2rwKVPLTEm1xUqnOHNeNDrBAoGASnewOvqzZQVnzbGYur7nbEBQaMKWP2IYKozr57+EHQ40QFyTzFUx+jhxnQ2TIoXQEbozNp11eWGm9TZenHxUbOZmAmPKGq5DQzBgwj/V9QPNPpulCEkgjEqIn0gdCNaEilZXTpdsLPxmZ/J9IxGJt+y/5OYhbIwfSS9gbvVEook=";//支付宝开发者应用私钥 - private String alipayPublicKey = "";//支付宝应用公钥 + private String alipayPublicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwRiMpvwg288WxCwJTBxeqQcFlkZR1p+hZn3/GshrYgRKhGu34IfnRbEnb70YJBq0N1AmdJRU4tYMS1qqFcvKdXnUrdPz+yx4F/uWv+Vz7ftzAEZ1JJh1s9IhJ1ayE4NNWBczj12cIrinUcIHNoITmPFSpcizk9jGnzZZDK4u2oZQEontseu6QyLoc4bBXgy3J1Cux7Q3kO0m3unr0j14PSOAY6kMmgPOyAyuP5Vl655OFJz1x4YDiXs6c+fHLzEZh+Bmm4kCedE7PeJ69xpxSo+i0qia9mhiR4L3LmX7yAzDffHfSQHdxzN0UR34ZF9ChZi/tGOeGABbC35tzGiWWQIDAQAB";//支付宝应用公钥 - private String alipay_public_key = "";//支付宝支付公钥 + private String alipay_public_key = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmu8n/4yTHWbn7VOrNc9OsLtDL1bEQ8gC1dHkj8Wy5z0mkaOsjJRIG/28ze12M0V8jdCKuuDr5Z1OPKiqf+XO3ypguEh+mYUVMBM/cZodDFQfTY1TKLWjvQCuaqlA+QUTCK6f7T7stsgyQ1o9Jj0rXZDz6PM4QHSTzjrLIBaeqM5WIBvH+fy/X+QG5Utd+/UT0kc0JyvuKhZ65yVUd/C9VcwJJAPliRsAQNrqYterwAJ9zvw9tF11wj9W0XgJ8Ccu4x3gR1vrlLRJJo/OA97RmxPQ+5hSacWQZCUd1dwiBq+YCrKVHGTj14izRHXrLc0yBlRXo7tBOIqcy3IsvKVthQIDAQAB";//支付宝支付公钥 private String appid = "";//微信appid @@ -73,83 +73,83 @@ * 支付宝支付 */ public ResultUtil alipay(String body, String subject, String passbackParams, String outTradeNo, String amount, String notifyUrl){ - //构造client - CertAlipayRequest certAlipayRequest = new CertAlipayRequest (); - //设置网关地址 - certAlipayRequest.setServerUrl("https://openapi.alipay.com/gateway.do"); - //设置应用Id - certAlipayRequest.setAppId(aliAppid); - //设置应用私钥 - certAlipayRequest.setPrivateKey(appPrivateKey); - //设置请求格式,固定值json - certAlipayRequest.setFormat("json"); - //设置字符集 - certAlipayRequest.setCharset("UTF-8"); - //设置签名类型 - certAlipayRequest.setSignType("RSA2"); - //设置应用公钥证书路径 - certAlipayRequest.setCertPath(app_cert_path); - //设置支付宝公钥证书路径 - certAlipayRequest.setAlipayPublicCertPath(alipay_cert_path); - //设置支付宝根证书路径 - certAlipayRequest.setRootCertPath(alipay_root_cert_path); - //构造client - AlipayClient alipayClient = null; - try { - alipayClient = new DefaultAlipayClient(certAlipayRequest); - } catch (AlipayApiException e) { - e.printStackTrace(); - } - //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay - AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest (); - //SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。 - AlipayTradeAppPayModel model = new AlipayTradeAppPayModel (); - model.setBody(body); - model.setSubject (subject); - model.setOutTradeNo (outTradeNo); - model.setTimeoutExpress ("30m" ); - model.setTotalAmount (amount); - model.setProductCode ( "QUICK_MSECURITY_PAY" ); - model.setPassbackParams(passbackParams);//自定义参数 - request.setBizModel ( model ); - request.setNotifyUrl (callbackPath + notifyUrl); - try { - //这里和普通的接口调用不同,使用的是sdkExecute - AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request); - Map<String, String> map = new HashMap<>(); - map.put("orderString", response.getBody()); - System.out.println(map);//就是orderString 可以直接给客户端请求,无需再做处理。 - return ResultUtil.success(map); - } catch (AlipayApiException e ) { - e.printStackTrace(); - } - - -// //实例化客户端 -// AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", aliAppid, appPrivateKey, "json", "UTF-8", alipay_public_key, "RSA2"); -// //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay -// AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest(); -// //SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。 -// AlipayTradeAppPayModel model = new AlipayTradeAppPayModel(); -// model.setBody(body);//对一笔交易的具体描述信息。如果是多种商品,请将商品描述字符串累加传给body。 -// model.setSubject(subject);//商品的标题/交易标题/订单标题/订单关键字等。 -// model.setOutTradeNo(outTradeNo);//商户网站唯一订单号 -// model.setTimeoutExpress("30m"); -// model.setTotalAmount(amount);//付款金额 -// model.setProductCode("QUICK_MSECURITY_PAY"); -// model.setPassbackParams(passbackParams);//自定义参数 -// request.setBizModel(model); -// request.setNotifyUrl(callbackPath + notifyUrl); +// //构造client +// CertAlipayRequest certAlipayRequest = new CertAlipayRequest (); +// //设置网关地址 +// certAlipayRequest.setServerUrl("https://openapi.alipay.com/gateway.do"); +// //设置应用Id +// certAlipayRequest.setAppId(aliAppid); +// //设置应用私钥 +// certAlipayRequest.setPrivateKey(appPrivateKey); +// //设置请求格式,固定值json +// certAlipayRequest.setFormat("json"); +// //设置字符集 +// certAlipayRequest.setCharset("UTF-8"); +// //设置签名类型 +// certAlipayRequest.setSignType("RSA2"); +// //设置应用公钥证书路径 +// certAlipayRequest.setCertPath(app_cert_path); +// //设置支付宝公钥证书路径 +// certAlipayRequest.setAlipayPublicCertPath(alipay_cert_path); +// //设置支付宝根证书路径 +// certAlipayRequest.setRootCertPath(alipay_root_cert_path); +// //构造client +// AlipayClient alipayClient = null; // try { +// alipayClient = new DefaultAlipayClient(certAlipayRequest); +// } catch (AlipayApiException e) { +// e.printStackTrace(); +// } +// //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay +// AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest (); +// //SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。 +// AlipayTradeAppPayModel model = new AlipayTradeAppPayModel (); +// model.setBody(body); +// model.setSubject (subject); +// model.setOutTradeNo (outTradeNo); +// model.setTimeoutExpress ("30m" ); +// model.setTotalAmount (amount); +// model.setProductCode ( "QUICK_MSECURITY_PAY" ); +// model.setPassbackParams(passbackParams);//自定义参数 +// request.setBizModel ( model ); +// request.setNotifyUrl (callbackPath + notifyUrl); +// try { // //这里和普通的接口调用不同,使用的是sdkExecute // AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request); // Map<String, String> map = new HashMap<>(); // map.put("orderString", response.getBody()); // System.out.println(map);//就是orderString 可以直接给客户端请求,无需再做处理。 // return ResultUtil.success(map); -// } catch (AlipayApiException e) { +// } catch (AlipayApiException e ) { // e.printStackTrace(); // } + + + //实例化客户端 + AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", aliAppid, appPrivateKey, "json", "UTF-8", alipay_public_key, "RSA2"); + //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay + AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest(); + //SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。 + AlipayTradeAppPayModel model = new AlipayTradeAppPayModel(); + model.setBody(body);//对一笔交易的具体描述信息。如果是多种商品,请将商品描述字符串累加传给body。 + model.setSubject(subject);//商品的标题/交易标题/订单标题/订单关键字等。 + model.setOutTradeNo(outTradeNo);//商户网站唯一订单号 + model.setTimeoutExpress("30m"); + model.setTotalAmount(amount);//付款金额 + model.setProductCode("QUICK_MSECURITY_PAY"); + model.setPassbackParams(passbackParams);//自定义参数 + request.setBizModel(model); + request.setNotifyUrl(callbackPath + notifyUrl); + try { + //这里和普通的接口调用不同,使用的是sdkExecute + AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request); + Map<String, String> map = new HashMap<>(); + map.put("orderString", response.getBody()); + System.out.println(map);//就是orderString 可以直接给客户端请求,无需再做处理。 + return ResultUtil.success(map); + } catch (AlipayApiException e) { + e.printStackTrace(); + } return null; } diff --git a/cloud-server-competition/src/main/java/com/dsh/competition/util/TaskUtil.java b/cloud-server-competition/src/main/java/com/dsh/competition/util/TaskUtil.java new file mode 100644 index 0000000..73a09f3 --- /dev/null +++ b/cloud-server-competition/src/main/java/com/dsh/competition/util/TaskUtil.java @@ -0,0 +1,31 @@ +package com.dsh.competition.util; + +import com.dsh.competition.service.CompetitionService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +/** + * @author zhibing.pu + * @date 2023/7/11 8:39 + */ +@Component +public class TaskUtil { + + @Autowired + private CompetitionService competitionService; + + + /** + * 每隔一分钟去处理的定时任务 + */ + @Scheduled(fixedRate = 60000) + public void taskMinute(){ + try { + //定时修改赛事状态 + competitionService.taskSetStatus(); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/cloud-server-competition/src/main/resources/mapper/CompetitionMapper.xml b/cloud-server-competition/src/main/resources/mapper/CompetitionMapper.xml index df40070..dad9994 100644 --- a/cloud-server-competition/src/main/resources/mapper/CompetitionMapper.xml +++ b/cloud-server-competition/src/main/resources/mapper/CompetitionMapper.xml @@ -35,4 +35,14 @@ order by aa.heat desc </if> </select> + + + <update id="taskSetStatusStart"> + update t_competition set status = 2 where status = 1 and state = 1 and auditStatus = 2 and now() between startTime and endTime + </update> + + + <update id="taskSetStatusEnd"> + update t_competition set status = 3 where status = 2 and state = 1 and auditStatus = 2 and now() >= endTime + </update> </mapper> diff --git a/cloud-server-course/src/main/java/com/dsh/course/controller/CourseController.java b/cloud-server-course/src/main/java/com/dsh/course/controller/CourseController.java index a6579c8..30ff749 100644 --- a/cloud-server-course/src/main/java/com/dsh/course/controller/CourseController.java +++ b/cloud-server-course/src/main/java/com/dsh/course/controller/CourseController.java @@ -242,4 +242,21 @@ e.printStackTrace(); } } + + + /** + * 根据id获取课程数据 + * @param id + * @return + */ + @ResponseBody + @PostMapping("/course/queryCourseById") + public TCourse queryCourseById(@RequestBody Integer id){ + try { + return courseService.getById(id); + }catch (Exception e){ + e.printStackTrace(); + return null; + } + } } diff --git a/cloud-server-course/src/main/java/com/dsh/course/entity/TCourse.java b/cloud-server-course/src/main/java/com/dsh/course/entity/TCourse.java index c499789..f29e090 100644 --- a/cloud-server-course/src/main/java/com/dsh/course/entity/TCourse.java +++ b/cloud-server-course/src/main/java/com/dsh/course/entity/TCourse.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; @@ -70,6 +71,7 @@ * 添加时间 */ @TableField("insertTime") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date insertTime; diff --git a/cloud-server-course/src/main/java/com/dsh/course/model/CoursePackageList.java b/cloud-server-course/src/main/java/com/dsh/course/model/CoursePackageList.java index 847cb56..bd9c817 100644 --- a/cloud-server-course/src/main/java/com/dsh/course/model/CoursePackageList.java +++ b/cloud-server-course/src/main/java/com/dsh/course/model/CoursePackageList.java @@ -17,7 +17,7 @@ private String lat; @ApiModelProperty(value = "课程类型id", dataType = "int", required = false) private Integer coursePackageTypeId; - @ApiModelProperty(value = "门店id", dataType = "int", required = false) + @ApiModelProperty(value = "门店id", dataType = "int", required = true) private Integer storeId; @ApiModelProperty(value = "搜索内容", dataType = "string", required = false) private String search; diff --git a/cloud-server-course/src/main/java/com/dsh/course/util/PayMoneyUtil.java b/cloud-server-course/src/main/java/com/dsh/course/util/PayMoneyUtil.java index 39debe3..656bdf7 100644 --- a/cloud-server-course/src/main/java/com/dsh/course/util/PayMoneyUtil.java +++ b/cloud-server-course/src/main/java/com/dsh/course/util/PayMoneyUtil.java @@ -42,13 +42,13 @@ */ @Component public class PayMoneyUtil { - private String aliAppid = "";//支付宝appid + private String aliAppid = "2021004103650328";//支付宝appid - private String appPrivateKey = "";//支付宝开发者应用私钥 + private String appPrivateKey = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCSsBy+F6k1CTL4b0qQssuhf6x2aeqSn2eBmv0mJALK9iqRgA9EG0buYVnV/tsNGYvKCgX56onb+Cv+f9/TShZzp0FVGemIcgPhrjK0WW2RJBMq9EmPzc2x+7SkygKO1H6S3CwWhYdc7TCNL9OnFAHSEa+FfGNWXg0jM0mSXI7/me8icbWZd5mdiLTV+OWx5ONAE0GfVPhUPnb9faunE6gvZCamZnS+H6ACzzidO7ksVkZq5PBsI3Jew2oAcAJSktsljMZNqDrVknzUbvKBXSw80zZD66i5twx8+8els5VLo6qu9PD80l+K430r2eMqxzXm9mRXZSPSxoOm5c+0cNiHAgMBAAECggEAR+EIlJWfkp+JXHecgD88zUx0xCmuil6WJ8o81h27SJ1LyrSHxoXfQhxuGxChYk/sUfqLZyVonGOFm1Yp5a1eRxnkR8FE0FmeUU49Bmbz67VTty6xhUgBzX9by4w5qKezxl8hM4AHDqAjtGuFOU/yfG+yJKUJQF8h7OfK22+DmveglMt+W8buCf+IJahMyxYLWnA5eG8X1KjOC5PnpQEEBBB3g8fJpdbcoUteGGKzGhkSMKXuM//m2T8bU1sNZytnV+rDblg4E9IZIJwhory7WBxDzykEGpbM+RwJ6E6bAp6MXMUKbed1Uf/40d8C5yItWhjUh1a+ZDS0XbsMP+C/IQKBgQDmYhUr5wcqNQHqpKZWd0l/UZyR+Ykjk7WNvWFQIoMZmCWCGcepyQHAdXpk29evgTqcF9v9dlGDc7waFc93L2uxEYOaSk5UK8Sf6yoXHDocKwauY5DDvAuyy2b9QQDNqisi/MN872RaefBILz/DYN2ZbTtp8i/udSaRl01h6EXQfwKBgQCi/5+eIEcQZTa4zhq5CXKKVbcU2Y8uVsM1tgLaxOwQFr0Xd0ckQiJdkN7qhjgeSuOz0BOXo1xovzN4ZIKISB5sZDadgQCZi7O1YeKc8ElLPnV/WfKBGAxSBpURyMUOYH1mno5QG+QiGmTgH0/OhmqWfp+dVWHNwlx0EwMOpCBz+QKBgBRuVlpSXrxLfyQD/gxk/8uevTfk3VieXNd5GAw3Q1EdwRXMm3xfKxyaToRrSrFx0HTPWN8dgxUZSnE1xfRX7EEDwJwKQvAMAZ/9BvqNskmVNz537fqtzovIphWHkj6q/LBZoiyOPmQXtEtyhUEacgyNN1up8r4+/XCj7mTkaGyZAoGBAIx+GG6LE7WmB8yymYX0Bq4Fw5BNFYSzc/7PqxY1teMINmQLg15VQpmzTPCIT8aMdkd+ieSiAfynEQ4sU/ZzcwWqOwj3MDUonPUyMcljs0kPxObH+KYcvEHXOpXhnzgNIwlYkQGriK98YIZtdrRkV2rwKVPLTEm1xUqnOHNeNDrBAoGASnewOvqzZQVnzbGYur7nbEBQaMKWP2IYKozr57+EHQ40QFyTzFUx+jhxnQ2TIoXQEbozNp11eWGm9TZenHxUbOZmAmPKGq5DQzBgwj/V9QPNPpulCEkgjEqIn0gdCNaEilZXTpdsLPxmZ/J9IxGJt+y/5OYhbIwfSS9gbvVEook=";//支付宝开发者应用私钥 - private String alipayPublicKey = "";//支付宝应用公钥 + private String alipayPublicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwRiMpvwg288WxCwJTBxeqQcFlkZR1p+hZn3/GshrYgRKhGu34IfnRbEnb70YJBq0N1AmdJRU4tYMS1qqFcvKdXnUrdPz+yx4F/uWv+Vz7ftzAEZ1JJh1s9IhJ1ayE4NNWBczj12cIrinUcIHNoITmPFSpcizk9jGnzZZDK4u2oZQEontseu6QyLoc4bBXgy3J1Cux7Q3kO0m3unr0j14PSOAY6kMmgPOyAyuP5Vl655OFJz1x4YDiXs6c+fHLzEZh+Bmm4kCedE7PeJ69xpxSo+i0qia9mhiR4L3LmX7yAzDffHfSQHdxzN0UR34ZF9ChZi/tGOeGABbC35tzGiWWQIDAQAB";//支付宝应用公钥 - private String alipay_public_key = "";//支付宝支付公钥 + private String alipay_public_key = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmu8n/4yTHWbn7VOrNc9OsLtDL1bEQ8gC1dHkj8Wy5z0mkaOsjJRIG/28ze12M0V8jdCKuuDr5Z1OPKiqf+XO3ypguEh+mYUVMBM/cZodDFQfTY1TKLWjvQCuaqlA+QUTCK6f7T7stsgyQ1o9Jj0rXZDz6PM4QHSTzjrLIBaeqM5WIBvH+fy/X+QG5Utd+/UT0kc0JyvuKhZ65yVUd/C9VcwJJAPliRsAQNrqYterwAJ9zvw9tF11wj9W0XgJ8Ccu4x3gR1vrlLRJJo/OA97RmxPQ+5hSacWQZCUd1dwiBq+YCrKVHGTj14izRHXrLc0yBlRXo7tBOIqcy3IsvKVthQIDAQAB";//支付宝支付公钥 private String appid = "";//微信appid @@ -74,83 +74,83 @@ * 支付宝支付 */ public ResultUtil alipay(String body, String subject, String passbackParams, String outTradeNo, String amount, String notifyUrl){ - //构造client - CertAlipayRequest certAlipayRequest = new CertAlipayRequest (); - //设置网关地址 - certAlipayRequest.setServerUrl("https://openapi.alipay.com/gateway.do"); - //设置应用Id - certAlipayRequest.setAppId(aliAppid); - //设置应用私钥 - certAlipayRequest.setPrivateKey(appPrivateKey); - //设置请求格式,固定值json - certAlipayRequest.setFormat("json"); - //设置字符集 - certAlipayRequest.setCharset("UTF-8"); - //设置签名类型 - certAlipayRequest.setSignType("RSA2"); - //设置应用公钥证书路径 - certAlipayRequest.setCertPath(app_cert_path); - //设置支付宝公钥证书路径 - certAlipayRequest.setAlipayPublicCertPath(alipay_cert_path); - //设置支付宝根证书路径 - certAlipayRequest.setRootCertPath(alipay_root_cert_path); - //构造client - AlipayClient alipayClient = null; - try { - alipayClient = new DefaultAlipayClient(certAlipayRequest); - } catch (AlipayApiException e) { - e.printStackTrace(); - } - //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay - AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest (); - //SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。 - AlipayTradeAppPayModel model = new AlipayTradeAppPayModel (); - model.setBody(body); - model.setSubject (subject); - model.setOutTradeNo (outTradeNo); - model.setTimeoutExpress ("30m" ); - model.setTotalAmount (amount); - model.setProductCode ( "QUICK_MSECURITY_PAY" ); - model.setPassbackParams(passbackParams);//自定义参数 - request.setBizModel ( model ); - request.setNotifyUrl (callbackPath + notifyUrl); - try { - //这里和普通的接口调用不同,使用的是sdkExecute - AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request); - Map<String, String> map = new HashMap<>(); - map.put("orderString", response.getBody()); - System.out.println(map);//就是orderString 可以直接给客户端请求,无需再做处理。 - return ResultUtil.success(map); - } catch (AlipayApiException e ) { - e.printStackTrace(); - } - - -// //实例化客户端 -// AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", aliAppid, appPrivateKey, "json", "UTF-8", alipay_public_key, "RSA2"); -// //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay -// AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest(); -// //SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。 -// AlipayTradeAppPayModel model = new AlipayTradeAppPayModel(); -// model.setBody(body);//对一笔交易的具体描述信息。如果是多种商品,请将商品描述字符串累加传给body。 -// model.setSubject(subject);//商品的标题/交易标题/订单标题/订单关键字等。 -// model.setOutTradeNo(outTradeNo);//商户网站唯一订单号 -// model.setTimeoutExpress("30m"); -// model.setTotalAmount(amount);//付款金额 -// model.setProductCode("QUICK_MSECURITY_PAY"); -// model.setPassbackParams(passbackParams);//自定义参数 -// request.setBizModel(model); -// request.setNotifyUrl(callbackPath + notifyUrl); +// //构造client +// CertAlipayRequest certAlipayRequest = new CertAlipayRequest (); +// //设置网关地址 +// certAlipayRequest.setServerUrl("https://openapi.alipay.com/gateway.do"); +// //设置应用Id +// certAlipayRequest.setAppId(aliAppid); +// //设置应用私钥 +// certAlipayRequest.setPrivateKey(appPrivateKey); +// //设置请求格式,固定值json +// certAlipayRequest.setFormat("json"); +// //设置字符集 +// certAlipayRequest.setCharset("UTF-8"); +// //设置签名类型 +// certAlipayRequest.setSignType("RSA2"); +// //设置应用公钥证书路径 +// certAlipayRequest.setCertPath(app_cert_path); +// //设置支付宝公钥证书路径 +// certAlipayRequest.setAlipayPublicCertPath(alipay_cert_path); +// //设置支付宝根证书路径 +// certAlipayRequest.setRootCertPath(alipay_root_cert_path); +// //构造client +// AlipayClient alipayClient = null; // try { +// alipayClient = new DefaultAlipayClient(certAlipayRequest); +// } catch (AlipayApiException e) { +// e.printStackTrace(); +// } +// //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay +// AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest (); +// //SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。 +// AlipayTradeAppPayModel model = new AlipayTradeAppPayModel (); +// model.setBody(body); +// model.setSubject (subject); +// model.setOutTradeNo (outTradeNo); +// model.setTimeoutExpress ("30m" ); +// model.setTotalAmount (amount); +// model.setProductCode ( "QUICK_MSECURITY_PAY" ); +// model.setPassbackParams(passbackParams);//自定义参数 +// request.setBizModel ( model ); +// request.setNotifyUrl (callbackPath + notifyUrl); +// try { // //这里和普通的接口调用不同,使用的是sdkExecute // AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request); // Map<String, String> map = new HashMap<>(); // map.put("orderString", response.getBody()); // System.out.println(map);//就是orderString 可以直接给客户端请求,无需再做处理。 // return ResultUtil.success(map); -// } catch (AlipayApiException e) { +// } catch (AlipayApiException e ) { // e.printStackTrace(); // } + + + //实例化客户端 + AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", aliAppid, appPrivateKey, "json", "UTF-8", alipay_public_key, "RSA2"); + //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay + AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest(); + //SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。 + AlipayTradeAppPayModel model = new AlipayTradeAppPayModel(); + model.setBody(body);//对一笔交易的具体描述信息。如果是多种商品,请将商品描述字符串累加传给body。 + model.setSubject(subject);//商品的标题/交易标题/订单标题/订单关键字等。 + model.setOutTradeNo(outTradeNo);//商户网站唯一订单号 + model.setTimeoutExpress("30m"); + model.setTotalAmount(amount);//付款金额 + model.setProductCode("QUICK_MSECURITY_PAY"); + model.setPassbackParams(passbackParams);//自定义参数 + request.setBizModel(model); + request.setNotifyUrl(callbackPath + notifyUrl); + try { + //这里和普通的接口调用不同,使用的是sdkExecute + AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request); + Map<String, String> map = new HashMap<>(); + map.put("orderString", response.getBody()); + System.out.println(map);//就是orderString 可以直接给客户端请求,无需再做处理。 + return ResultUtil.success(map); + } catch (AlipayApiException e) { + e.printStackTrace(); + } return null; } diff --git a/cloud-server-gateway/src/main/java/cn/mb/cloud/gateway/auth/AuthService.java b/cloud-server-gateway/src/main/java/cn/mb/cloud/gateway/auth/AuthService.java index 3c84935..b1aba3f 100644 --- a/cloud-server-gateway/src/main/java/cn/mb/cloud/gateway/auth/AuthService.java +++ b/cloud-server-gateway/src/main/java/cn/mb/cloud/gateway/auth/AuthService.java @@ -40,7 +40,7 @@ // 签名无 not sign if (StringUtils.isBlank(sign) || !sign.equals(signUrlEncode)) { - return ResultUtil.sign(); + return ResultUtil.sign(signUrl); } } catch (Exception e) { e.printStackTrace(); diff --git a/cloud-server-gateway/src/main/java/cn/mb/cloud/gateway/auth/ResultUtil.java b/cloud-server-gateway/src/main/java/cn/mb/cloud/gateway/auth/ResultUtil.java index 6894e2f..3a54146 100644 --- a/cloud-server-gateway/src/main/java/cn/mb/cloud/gateway/auth/ResultUtil.java +++ b/cloud-server-gateway/src/main/java/cn/mb/cloud/gateway/auth/ResultUtil.java @@ -182,4 +182,9 @@ return ResultUtil.getResult(ResultUtil.SIGN_ERROR, SIGN); } + + public static <T> ResultUtil<T> sign(String msg){ + return ResultUtil.getResult(ResultUtil.SIGN_ERROR, msg); + } + } diff --git a/cloud-server-other/src/main/java/com/dsh/other/controller/BannerController.java b/cloud-server-other/src/main/java/com/dsh/other/controller/BannerController.java new file mode 100644 index 0000000..f4d73c3 --- /dev/null +++ b/cloud-server-other/src/main/java/com/dsh/other/controller/BannerController.java @@ -0,0 +1,56 @@ +package com.dsh.other.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.dsh.other.entity.Banner; +import com.dsh.other.model.BannerVo; +import com.dsh.other.service.IBannerService; +import com.dsh.other.util.ResultUtil; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.BeanUtils; +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.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author zhibing.pu + * @date 2023/7/11 17:48 + */ +@RestController +@RequestMapping("") +public class BannerController { + + @Autowired + private IBannerService bannerService; + + + + + @ResponseBody + @PostMapping("/base/banner/queryBannerList") + @ApiOperation(value = "获取banner数据", tags = {"APP-加入玩湃"}) + @ApiImplicitParams({ + @ApiImplicitParam(value = "位置(1=首页,2=首页底部,3=线上课得积分,4=看视频得奖励,5=常见问题)", name = "position", dataType = "int", required = true), + }) + public ResultUtil<List<BannerVo>> queryBannerList(Integer position){ + try { + List<Banner> list = bannerService.list(new QueryWrapper<Banner>().eq("position", position).eq("state", 1).orderByAsc("sort")); + List<BannerVo> list1 = new ArrayList<>(); + for (Banner banner : list) { + BannerVo bannerVo = new BannerVo(); + BeanUtils.copyProperties(banner, bannerVo); + list1.add(bannerVo); + } + return ResultUtil.success(list1); + }catch (Exception e){ + e.printStackTrace(); + return ResultUtil.runErr(); + } + } +} diff --git a/cloud-server-other/src/main/java/com/dsh/other/entity/Banner.java b/cloud-server-other/src/main/java/com/dsh/other/entity/Banner.java new file mode 100644 index 0000000..a664590 --- /dev/null +++ b/cloud-server-other/src/main/java/com/dsh/other/entity/Banner.java @@ -0,0 +1,53 @@ +package com.dsh.other.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +/** + * @author zhibing.pu + * @date 2023/7/11 17:35 + */ +@Data +@TableName("t_banner") +public class Banner { + /** + * 主键 + */ + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + /** + * 位置(1=首页,2=首页底部,3=线上课得积分,4=看视频得奖励,5=常见问题) + */ + @TableField("position") + private Integer position; + /** + * 图片地址 + */ + @TableField("img") + private String img; + /** + * 跳转页面 + */ + @TableField("jumpPage") + private String jumpPage; + /** + * 排序 + */ + @TableField("sort") + private Integer sort; + /** + * 状态(1=正常,2=冻结,3=删除) + */ + @TableField("state") + private Integer state; + /** + * 添加时间 + */ + @TableField("insertTime") + private Date insertTime; +} diff --git a/cloud-server-other/src/main/java/com/dsh/other/mapper/BannerMapper.java b/cloud-server-other/src/main/java/com/dsh/other/mapper/BannerMapper.java new file mode 100644 index 0000000..0f3cbeb --- /dev/null +++ b/cloud-server-other/src/main/java/com/dsh/other/mapper/BannerMapper.java @@ -0,0 +1,11 @@ +package com.dsh.other.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dsh.other.entity.Banner; + +/** + * @author zhibing.pu + * @date 2023/7/11 17:46 + */ +public interface BannerMapper extends BaseMapper<Banner> { +} diff --git a/cloud-server-other/src/main/java/com/dsh/other/model/BannerVo.java b/cloud-server-other/src/main/java/com/dsh/other/model/BannerVo.java new file mode 100644 index 0000000..bb95ea3 --- /dev/null +++ b/cloud-server-other/src/main/java/com/dsh/other/model/BannerVo.java @@ -0,0 +1,20 @@ +package com.dsh.other.model; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author zhibing.pu + * @date 2023/7/11 17:50 + */ +@Data +@ApiModel +public class BannerVo { + @ApiModelProperty("数据id") + private Integer id; + @ApiModelProperty("图片路径") + private String img; + @ApiModelProperty("跳转页面") + private String jumpPage; +} diff --git a/cloud-server-other/src/main/java/com/dsh/other/service/IBannerService.java b/cloud-server-other/src/main/java/com/dsh/other/service/IBannerService.java new file mode 100644 index 0000000..cf7c7d5 --- /dev/null +++ b/cloud-server-other/src/main/java/com/dsh/other/service/IBannerService.java @@ -0,0 +1,11 @@ +package com.dsh.other.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dsh.other.entity.Banner; + +/** + * @author zhibing.pu + * @date 2023/7/11 17:47 + */ +public interface IBannerService extends IService<Banner> { +} diff --git a/cloud-server-other/src/main/java/com/dsh/other/service/impl/BannerServiceImpl.java b/cloud-server-other/src/main/java/com/dsh/other/service/impl/BannerServiceImpl.java new file mode 100644 index 0000000..7982499 --- /dev/null +++ b/cloud-server-other/src/main/java/com/dsh/other/service/impl/BannerServiceImpl.java @@ -0,0 +1,15 @@ +package com.dsh.other.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dsh.other.entity.Banner; +import com.dsh.other.mapper.BannerMapper; +import com.dsh.other.service.IBannerService; +import org.springframework.stereotype.Service; + +/** + * @author zhibing.pu + * @date 2023/7/11 17:47 + */ +@Service +public class BannerServiceImpl extends ServiceImpl<BannerMapper, Banner> implements IBannerService { +} -- Gitblit v1.7.1