he2802 %!s(int64=2) %!d(string=hai) anos
pai
achega
51230df20a

+ 20 - 0
zhongzheng-api/src/main/java/com/zhongzheng/controller/cmmon/CommonController.java

@@ -27,6 +27,8 @@ import com.zhongzheng.modules.goods.vo.GoodsUserVo;
 import com.zhongzheng.modules.goods.vo.GoodsVo;
 import com.zhongzheng.modules.order.domain.Printer;
 import com.zhongzheng.modules.system.service.ISysConfigService;
+import com.zhongzheng.modules.wx.bo.WxInfoBo;
+import com.zhongzheng.modules.wx.bo.WxInfoQuery;
 import com.zhongzheng.modules.wx.bo.WxServerBody;
 import com.zhongzheng.modules.wx.domain.*;
 import io.swagger.annotations.Api;
@@ -63,6 +65,24 @@ public class CommonController extends BaseController {
 
     private final IGoodsSpecTemplateService iGoodsSpecTemplateService;
 
+    /**
+     * 获取微信小程序信息(网页跳转小程序)
+     */
+    @ApiOperation("获取微信小程序信息(网页跳转小程序)")
+    @GetMapping("/get/wx/info")
+    public AjaxResult<WxInfoBo> getWxInfo(WxInfoQuery query) {
+        return AjaxResult.success(wxLoginService.getWxInfo(query));
+    }
+
+    /**
+     * 获取小程序首页链接
+     */
+    @ApiOperation("获取小程序首页链接")
+    @GetMapping("/get/small/link")
+    public AjaxResult<Void> getWxSmallLink() {
+        return AjaxResult.success(wxLoginService.getWxSmallLink());
+    }
+
     /**
      * 获取商品专题页指定商品信息
      */

+ 73 - 3
zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/WxLoginService.java

@@ -7,6 +7,7 @@ import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.google.zxing.BarcodeFormat;
 import com.google.zxing.client.j2se.MatrixToImageWriter;
@@ -29,9 +30,7 @@ import com.zhongzheng.modules.user.entity.ClientLoginUser;
 import com.zhongzheng.modules.user.mapper.UserMapper;
 import com.zhongzheng.modules.user.service.IUserService;
 import com.zhongzheng.modules.user.service.IUserWxFollowService;
-import com.zhongzheng.modules.wx.bo.TemplatData;
-import com.zhongzheng.modules.wx.bo.WxLoginBody;
-import com.zhongzheng.modules.wx.bo.WxShareGoodsBo;
+import com.zhongzheng.modules.wx.bo.*;
 import com.zhongzheng.modules.wx.service.IWxLoginService;
 import org.apache.commons.codec.binary.Base64;
 import org.slf4j.Logger;
@@ -128,6 +127,10 @@ public class WxLoginService implements IWxLoginService {
 
     private String small_wxEnCodeParam = "access_token=%s";
 
+    private String small_LinkUrl = "https://api.weixin.qq.com/wxa/generate_urllink";
+
+    private String small_LinkParam = "access_token=%s";
+
     @Autowired
     private IUserService iUserService;
 
@@ -988,6 +991,73 @@ public class WxLoginService implements IWxLoginService {
         return result;
     }
 
+    @Override
+    public WxInfoBo getWxInfo(WxInfoQuery query) {
+        Long time = System.currentTimeMillis();
+        String nonceStr = UUID.randomUUID().toString();
+        String ticket = "";
+        String signature = "";
+        //获取ticket
+        String url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket";
+        String param = String.format("access_token=%s&type=jsapi", getWxSmallAccessToken());
+        String result = HttpUtils.sendGet(url, param);
+        JSONObject jsonObject = JSONObject.parseObject(result);
+        if (Integer.valueOf(jsonObject.get("errcode").toString()) != 0){
+            //请求失败(可能是access_token过期或者失效)刷新access_token
+            String key = "WX_SMALL_ACCESS_TOKEN";
+            redisCache.deleteObject(key);
+            param = String.format("access_token=%s&type=jsapi", getWxSmallAccessToken());
+            result = HttpUtils.sendGet(url, param);
+            jsonObject = JSONObject.parseObject(result);
+        }
+        ticket = jsonObject.get("ticket").toString();
+        if (StringUtils.isBlank(ticket)){
+            throw new CustomException("微信ticket获取失败");
+        }
+
+        //签名 = 随机串 + ticket + 时间戳 + URL(当前页面)
+        signature = nonceStr+ticket+time+query.getWebUrl();
+
+        WxInfoBo bo = new WxInfoBo();
+        bo.setWxAppId(appid);
+        bo.setTimestamp(time);
+        bo.setSignature(signature);
+        bo.setNonceStr(nonceStr);
+        bo.setAppUrl("pages/index/index");
+        bo.setUsername("gh_9bdfc9ccd1fa");
+        return bo;
+    }
+
+    @Override
+    public String getWxSmallLink() {
+        String wxGzhAccessToken = getWxSmallAccessToken();
+        String param = String.format(small_LinkParam, wxGzhAccessToken);
+        String url = small_LinkUrl + "?" + param;
+        JSONObject obj = new JSONObject();
+        obj.put("path", "pages/index/index");
+        obj.put("is_expire",true);
+        obj.put("expire_type",1);
+        obj.put("expire_interval",1);
+        obj.put("env_version",enCodeVersion);
+        String result = HttpUtils.sendPost(url, obj);
+        if (result.contains("errcode")){
+            List<String> codes = Arrays.asList("40001", "42001");
+            JSONObject jsonObject = JSONObject.parseObject(result);
+            if(ObjectUtils.isNotNull(jsonObject.get("errcode")) && codes.contains(jsonObject.get("errcode").toString())){
+                //微信access_token 过期或者失效,刷新access_token
+                String key = "WX_SMALL_ACCESS_TOKEN";
+                redisCache.deleteObject(key);
+                String wxGzhAccessTokenTo = getWxSmallAccessToken();
+                String paramTo = String.format(small_LinkParam, wxGzhAccessTokenTo);
+                String urlTo = small_LinkUrl + "?" + paramTo;
+                result = HttpUtils.sendPost(urlTo, obj);
+            }
+        }
+        JSONObject jsonObject = JSONObject.parseObject(result);
+
+        return jsonObject.get("url_link").toString();
+    }
+
     public Boolean subGzh(String openId) {
         String unionId = getWxGzhUserCgiInfo(openId);
         if (Validator.isNotEmpty(unionId)) {

+ 3 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/vo/GoodsUserVo.java

@@ -385,4 +385,7 @@ public class GoodsUserVo {
 	@Excel(name = "每天最大节学习数量")
 	@ApiModelProperty("每天最大节学习数量")
 	private Long sectionMaxNum;
+	@ApiModelProperty("0不限制 2限制整个目录顺序")
+	private Integer goodsLearningOrder;
+
 }

+ 3 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/vo/GoodsVo.java

@@ -322,4 +322,7 @@ public class GoodsVo {
 	@ApiModelProperty("默认规格模板ID")
 	private Long specTemplateId;
 
+	@ApiModelProperty("业务层次学习顺序:1限制章下做卷顺序 0不限制 2限制整个目录顺序")
+	private Integer goodsLearningOrder;
+
 }

+ 33 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/wx/bo/WxInfoBo.java

@@ -0,0 +1,33 @@
+package com.zhongzheng.modules.wx.bo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2022年11月03日 15:41
+ */
+@Data
+public class WxInfoBo implements Serializable {
+
+    @ApiModelProperty("小程序appID")
+    private String wxAppId;
+
+    @ApiModelProperty("时间戳")
+    private Long timestamp;
+
+    @ApiModelProperty("随机字符串")
+    private String nonceStr;
+
+    @ApiModelProperty("签名(ticket)")
+    private String signature;
+
+    @ApiModelProperty("跳转小程序的页面路径")
+    private String appUrl;
+
+    @ApiModelProperty("小程序账号ID")
+    private String username;
+
+}

+ 17 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/wx/bo/WxInfoQuery.java

@@ -0,0 +1,17 @@
+package com.zhongzheng.modules.wx.bo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2022年11月03日 15:41
+ */
+@Data
+public class WxInfoQuery implements Serializable {
+
+    @ApiModelProperty("当前页面url")
+    private String webUrl;
+}

+ 5 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/wx/service/IWxLoginService.java

@@ -2,6 +2,8 @@ package com.zhongzheng.modules.wx.service;
 
 
 import com.zhongzheng.modules.course.bo.SectionWatchPerBo;
+import com.zhongzheng.modules.wx.bo.WxInfoBo;
+import com.zhongzheng.modules.wx.bo.WxInfoQuery;
 import com.zhongzheng.modules.wx.bo.WxShareGoodsBo;
 
 import java.util.Map;
@@ -33,4 +35,7 @@ public interface IWxLoginService
 
     String shareGoodsCode(WxShareGoodsBo bo);
 
+    WxInfoBo getWxInfo(WxInfoQuery query);
+
+    String getWxSmallLink();
 }

+ 3 - 0
zhongzheng-system/src/main/resources/mapper/modules/course/CourseMapper.xml

@@ -207,6 +207,7 @@
         <result property="serviceEndTime" column="service_end_time"/>
         <result property="subjectNames" column="subject_names"/>
         <result property="sectionNum" column="section_num"/>
+        <result property="goodsLearningOrder" column="goods_learning_order"/>
     </resultMap>
 
     <resultMap type="com.zhongzheng.modules.grade.vo.ClassGradeVo" id="ClassGradeVoResult">
@@ -518,6 +519,7 @@
         og.grade_id,
         og.service_start_time,
         og.service_end_time,
+        cb.goods_learning_order,
         (SELECT cet.education_name FROM  course_education_type cet  where cet.id = g.education_type_id) as education_name,
         (SELECT cet.project_name FROM  course_project_type cet where cet.id = g.project_id) as project_name,
         (SELECT cet.business_name FROM  course_business cet  where cet.id = g.business_id) as business_name,
@@ -544,6 +546,7 @@
         `order` o
         LEFT JOIN order_goods og ON og.order_sn = o.order_sn
         LEFT JOIN goods g on og.goods_id = g.goods_id
+        LEFT JOIN course_business cb on g.business_id = cb.id
         <if test="userId != null and userId != ''">
             LEFT JOIN (SELECT * from  user_subscribe where subscribe_id in (SELECT MAX(subscribe_id) from user_subscribe where user_id = #{userId} and  subscribe_status = 1 GROUP BY order_goods_id)) us on us.order_goods_id = og.order_goods_id
         </if>

+ 2 - 0
zhongzheng-system/src/main/resources/mapper/modules/goods/GoodsMapper.xml

@@ -129,6 +129,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="examNum" column="exam_num"/>
         <result property="linePrice" column="line_price"/>
         <result property="specTemplateNumber" column="spec_template_number"/>
+        <result property="goodsLearningOrder" column="goods_learning_order"/>
     </resultMap>
 
     <resultMap type="com.zhongzheng.modules.exam.vo.ExamNumberGoodsVo" id="ExamNumberGoodsVoResult">
@@ -153,6 +154,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         cet.education_name,
         cpt.project_name,
         cb.business_name,
+        cb.goods_learning_order,
         s.school_name,
         m.category_name,
         (SELECT GROUP_CONCAT(subject_name)  from course_subject where FIND_IN_SET(id,g.subject_ids)) subject_names,

+ 2 - 2
zhongzheng-system/src/main/resources/mapper/modules/user/UserMapper.xml

@@ -205,10 +205,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             AND u.nickname like concat('%', #{nickname}, '%')
         </if>
         <if test="telphone != null and telphone != ''" >
-            AND u.telphone = #{telphone}
+            AND u.telphone like concat('%', #{telphone}, '%')
         </if>
         <if test="idCard != null and idCard != ''" >
-            AND u.id_card = #{idCard}
+            AND u.id_card like concat('%', #{idCard}, '%')
         </if>
         <if test="realname != null and realname != ''" >
             AND u.realname like concat('%', #{realname}, '%')