From 56fcde8c93a1a10bc50fac775e370a2db57f520e Mon Sep 17 00:00:00 2001
From: rk <94314517@qq.com>
Date: 星期二, 20 一月 2026 17:08:30 +0800
Subject: [PATCH] 小程序   接口开发

---
 server/dmmall_web/src/main/java/com/doumee/api/web/ActivityApi.java                               |    2 
 server/dmmall_service/src/main/java/com/doumee/dao/web/response/goods/GoodsInfoResponse.java      |    5 
 server/dmmall_service/src/main/java/com/doumee/dao/business/CollectMapper.java                    |    3 
 server/dmmall_service/src/main/java/com/doumee/dao/system/dto/PlatformConfigDTO.java              |    2 
 server/dmmall_service/src/main/java/com/doumee/core/utils/GeneratePicUtil.java                    |  134 ++++++
 server/dmmall_web/src/main/java/com/doumee/api/web/CoffeeBeanTaskApi.java                         |    2 
 server/dmmall_web/src/main/java/com/doumee/api/web/CollectApi.java                                |   56 ++
 server/dmmall_web/src/main/java/com/doumee/api/web/NoticeApi.java                                 |    2 
 server/dmmall_web/src/main/java/com/doumee/api/web/SharesApi.java                                 |   55 ++
 server/dmmall_web/src/main/java/com/doumee/api/web/ShopFollowApi.java                             |    2 
 server/dmmall_web/src/main/java/com/doumee/api/web/mall/GoodsApi.java                             |    5 
 server/dmmall_web/src/main/java/com/doumee/api/web/ApiController.java                             |    3 
 server/dmmall_web/src/main/java/com/doumee/api/web/CouponApi.java                                 |    5 
 server/dmmall_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java       |  183 +++++---
 server/dmmall_web/src/main/java/com/doumee/api/web/AccountApi.java                                |    7 
 server/dmmall_service/src/main/java/com/doumee/service/business/MemberService.java                |    2 
 server/dmmall_service/src/main/java/com/doumee/service/business/impl/GoodsServiceImpl.java        |   15 
 server/dmmall_web/src/main/java/com/doumee/api/web/SignupApi.java                                 |    2 
 server/dmmall_web/src/main/java/com/doumee/api/web/ShopMenuApi.java                               |    2 
 server/dmmall_web/src/main/java/com/doumee/api/web/ZanApi.java                                    |    2 
 server/dmmall_service/src/main/java/com/doumee/service/business/GoodsService.java                 |    2 
 server/dmmall_service/src/main/java/com/doumee/service/business/InviteRecordService.java          |   26 +
 server/dmmall_service/src/main/java/com/doumee/core/utils/Constants.java                          |   67 +++
 server/dmmall_service/src/main/java/com/doumee/dao/business/model/InviteRecord.java               |   78 +++
 server/dmmall_service/src/main/java/com/doumee/dao/business/model/MemberCoupon.java               |   44 ++
 server/dmmall_web/src/main/java/com/doumee/api/web/ShopNewsApi.java                               |    2 
 server/dmmall_service/src/main/java/com/doumee/service/business/CollectService.java               |    5 
 server/dmmall_service/src/main/java/com/doumee/dao/web/response/InviteInfoResponse.java           |   36 +
 server/dmmall_web/src/main/java/com/doumee/api/web/CardApi.java                                   |    2 
 server/dmmall_service/src/main/java/com/doumee/dao/business/InviteRecordMapper.java               |   15 
 server/dmmall_web/src/main/java/com/doumee/api/web/ArticleApi.java                                |    2 
 server/dmmall_service/src/main/java/com/doumee/service/business/impl/InviteRecordServiceImpl.java |  142 +++++++
 server/dmmall_web/src/main/java/com/doumee/api/web/CreationApplyApi.java                          |    2 
 server/dmmall_service/src/main/java/com/doumee/dao/web/request/WxPhoneRequest.java                |    2 
 server/dmmall_service/src/main/java/com/doumee/service/business/impl/CollectServiceImpl.java      |   92 ++++
 server/dmmall_web/src/main/java/com/doumee/api/web/LabelsApi.java                                 |    2 
 server/dmmall_service/src/main/java/com/doumee/dao/web/request/CollectSaveRequest.java            |   26 +
 server/dmmall_web/src/main/java/com/doumee/api/web/mall/AftersaleApi.java                         |    2 
 server/dmmall_service/src/main/java/com/doumee/core/utils/RichTextProcessor.java                  |   28 +
 server/dmmall_service/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java   |   63 +++
 server/dmmall_service/src/main/java/com/doumee/service/business/impl/MemberCouponServiceImpl.java |    4 
 server/dmmall_service/src/main/java/com/doumee/dao/business/model/Collect.java                    |   40 +
 server/pom.xml                                                                                    |   16 
 server/dmmall_web/src/main/java/com/doumee/api/web/ShopCommentApi.java                            |    2 
 server/dmmall_web/src/main/java/com/doumee/api/web/MemberApi.java                                 |    2 
 45 files changed, 1,051 insertions(+), 140 deletions(-)

diff --git a/server/dmmall_service/src/main/java/com/doumee/core/utils/Constants.java b/server/dmmall_service/src/main/java/com/doumee/core/utils/Constants.java
index be04e8f..b334fb7 100644
--- a/server/dmmall_service/src/main/java/com/doumee/core/utils/Constants.java
+++ b/server/dmmall_service/src/main/java/com/doumee/core/utils/Constants.java
@@ -1,15 +1,22 @@
 package com.doumee.core.utils;
 
+import cn.binarywang.wx.miniapp.bean.WxMaCodeLineColor;
+import com.doumee.core.wx.WxMiniConfig;
 import com.doumee.dao.business.model.Areas;
 import io.swagger.annotations.ApiModelProperty;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
 
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
 import java.math.BigDecimal;
 import java.net.URLDecoder;
 import java.util.*;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+@Slf4j
 public class Constants {
 
     public static final String[]  ALL_SPELL_LIST_FIRST = new String[]{"A", "B", "C", "D", "E", "F", "G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
@@ -137,6 +144,18 @@
     public static final String COFFEE_ARTICLE_BACKGROUND = "COFFEE_ARTICLE_BACKGROUND";
 
     public static final String TRANSFER_FILE = "TRANSFER_FILE";
+
+    public static final String INVITE_RULE = "INVITE_RULE";
+
+    public static final String INVITE_IMG = "INVITE_IMG";
+
+    public static final String SHARES_FILE = "SHARES_FILE";
+
+    public static final String INVITE_IMG_URL = "INVITE_IMG_URL";
+
+
+
+
 
 
     public interface RedisKeys {
@@ -1228,4 +1247,52 @@
             this.info = info;
         }
     }
+
+
+    public static InputStream generateWxMiniImgStream(String scene, String page, boolean isUsePage) {
+        //鐢熸垚鍥剧墖涓婁紶OSS
+        Map<String,Object> body = new HashMap<>();
+        // 鍦烘櫙鐮侊紝涓庡墠绔害瀹氾紝鏈�缁堟槸闇�瑕佸墠绔В鏋�
+        body.put("scene", scene);
+        // 姝e紡鐗堜负 "release"锛屼綋楠岀増涓� "trial"锛屽紑鍙戠増涓� "develop"銆傞粯璁ゆ槸姝e紡鐗堛��
+        String env_version = "release";
+        body.put("env_version", env_version);
+        if(isUsePage){
+            body.put("page", page);
+        }
+        //body.put("page", "pages/index/index");
+        // 閫忔槑锛屾牴鎹綘鐨勫満鏅嚜琛岃缃産ody鍙傛暟
+        body.put("is_hyaline", true);
+        try {
+            WxMaCodeLineColor codeLineColor = new WxMaCodeLineColor("0","0","0");
+            byte[]  bytes =  WxMiniConfig.wxMaService.getQrcodeService().createWxaCodeUnlimitBytes
+                    (scene,null,false,env_version,300,false,codeLineColor,false);
+            if (bytes !=null) {
+                InputStream inputStream = new ByteArrayInputStream(bytes);
+              /* ByteArrayOutputStream baos = new ByteArrayOutputStream();
+                    byte[] buffer = new byte[1024];
+                    int len = -1;
+                    while ((len = inputStream.read(buffer)) != -1) {
+                        baos.write(buffer, 0, len);
+                    }
+                 System.out.println("data:mediatype;base64," + Base64.getEncoder().encodeToString(baos.toByteArray()));*/
+                log.error("鐢熸垚灏忕▼搴忕爜鎴愬姛:============"+inputStream.available());
+                return inputStream;
+            }else{
+                log.error("鐢熸垚灏忕▼搴忕爜澶辫触:============");
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error("鐢熸垚灏忕▼搴忕爜澶辫触:============"+e.getMessage());
+        }
+        return  null;
+    }
+
+
+    public static Integer getInviteCode(String inviteStr){
+        if(StringUtils.isNotBlank(inviteStr)&&inviteStr.startsWith("m_")){
+            return Integer.valueOf(inviteStr.replace("m_",""));
+        }
+        return null;
+    }
 }
diff --git a/server/dmmall_service/src/main/java/com/doumee/core/utils/GeneratePicUtil.java b/server/dmmall_service/src/main/java/com/doumee/core/utils/GeneratePicUtil.java
index 8a443f0..0c7b424 100644
--- a/server/dmmall_service/src/main/java/com/doumee/core/utils/GeneratePicUtil.java
+++ b/server/dmmall_service/src/main/java/com/doumee/core/utils/GeneratePicUtil.java
@@ -1,6 +1,8 @@
 package com.doumee.core.utils;
 
 import com.google.zxing.common.BitMatrix;
+import lombok.extern.slf4j.Slf4j;
+import net.coobird.thumbnailator.Thumbnails;
 import org.apache.commons.fileupload.FileItem;
 import org.apache.commons.fileupload.FileItemFactory;
 import org.apache.commons.fileupload.disk.DiskFileItemFactory;
@@ -12,12 +14,14 @@
 import javax.imageio.stream.ImageOutputStream;
 import java.awt.*;
 import java.awt.geom.Ellipse2D;
+import java.awt.geom.RoundRectangle2D;
 import java.awt.image.BufferedImage;
 import java.io.*;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.net.URL;
 
+@Slf4j
 public class GeneratePicUtil {
 
     static String bg="https://shoeslxkj.oss-cn-beijing.aliyuncs.com/file/20230404/SysBaseBackGround/D56231512C0B4A4C9D06B02F9566B0B0.png";
@@ -268,7 +272,137 @@
         return resMatrix;
     }
 
+    public static BufferedImage getImgIO(String imgurl) {
+        try {
+            return     ImageIO.read(new URL(imgurl));
+        }catch (Exception e){
+            log.error("娴锋姤==>鎷夊彇鍥剧墖鎶ラ敊锛�"+e.getMessage());
+        }return null;
+    }
 
+    private static BufferedImage getImgIO(InputStream is) {
+        if(is ==null){
+            log.error("=============================qrcode error 灏忕▼搴忕爜涓虹┖");
+        }else{
+
+            log.error("=============================qrcode okay 灏忕▼搴忕爜鏈夋湁鏁告摎");
+        }
+        try {
+            return     ImageIO.read(is);
+        }catch (Exception e){
+            log.error("=============================qrcode error 灏忕▼搴忕爜涓虹┖11111111111:"+e.getMessage());
+
+        }
+        return null;
+    }
+
+    public static int th = 30;
+    public static InputStream generateShareWithUserImg(BufferedImage imgurl, InputStream mpCode) throws IOException {
+        int w = imgurl.getWidth();
+        int h = imgurl.getHeight();
+        double rate = (double)w/750d;
+
+        //寰楀埌瀹冪殑缁樺埗鐜(杩欏紶鍥剧墖鐨勭瑪)
+        Graphics2D g2 = (Graphics2D) imgurl.getGraphics();
+        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+        g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
+        //鑳屾櫙鍥剧墖
+        g2.setColor(Color.white);
+        Font font =new Font("榛戜綋", Font.PLAIN, (int)(24 * rate));
+        g2.setFont(font);
+        FontMetrics fontMetrics = g2.getFontMetrics(font);
+        int textWidth = fontMetrics.stringWidth("鎵爜鐪嬫洿澶�");
+        g2.drawString("鎵爜鐪嬫洿澶�", (int)(w -(textWidth+20*rate)),h-(int)(rate*(50-th)));
+
+        BufferedImage img3 = getImgIO(mpCode);
+        if(img3!=null){
+            g2.setColor(Color.white);
+            g2.fillOval((int)(w-130*rate), (int)(h-rate*150), (int)(100*rate) , (int)(100*rate));
+            g2.drawImage(img3, (int)(w-130*rate), (int)(h-rate*150), (int)(100*rate) , (int)(100*rate), null);
+        }
+        InputStream inputStream = bufferedImageToInputStream(imgurl);
+        return inputStream;
+    }
+
+    /**
+     * 鍥剧墖璁剧疆鍦嗚
+     * @param srcImage
+     * @return
+     * @throws
+     */
+    public static BufferedImage setRadius(BufferedImage srcImage, int radius, int border, int padding){
+        int width = srcImage.getWidth();
+        int height = srcImage.getHeight();
+        int canvasWidth = width + padding * 2;
+        int canvasHeight = height + padding * 2;
+
+        BufferedImage image = new BufferedImage(canvasWidth, canvasHeight, BufferedImage.TYPE_INT_ARGB);
+        Graphics2D gs = image.createGraphics();
+        gs.setComposite(AlphaComposite.Src);
+        gs.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+        gs.setColor(Color.WHITE);
+        gs.fill(new RoundRectangle2D.Float(0, 0, canvasWidth, canvasHeight, radius, radius));
+        gs.setComposite(AlphaComposite.SrcAtop);
+        gs.drawImage(setClip(srcImage, radius), padding, padding, null);
+        if(border !=0){
+            gs.setColor(Color.white);
+            gs.setStroke(new BasicStroke(border));
+            gs.drawRoundRect(padding, padding, canvasWidth - 2 * padding, canvasHeight - 2 * padding, radius, radius);
+        }
+        gs.dispose();
+        return image;
+    }
+
+    /**
+     * 鍥剧墖鍒囧渾瑙�
+     * @param srcImage
+     * @param radius
+     * @return
+     */
+    public static BufferedImage setClip(BufferedImage srcImage, int radius){
+        int width = srcImage.getWidth();
+        int height = srcImage.getHeight();
+        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
+        Graphics2D gs = image.createGraphics();
+
+        gs.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+        gs.setClip(new RoundRectangle2D.Double(0, 0, width, height, radius, radius));
+        gs.drawImage(srcImage, 0, 0, null);
+        gs.dispose();
+        return image;
+    }
+
+    public static BufferedImage transfromToImage(String imgUrl,String suffix){
+        BufferedImage originalImage = null;
+        try {
+            originalImage = ImageIO.read(new URL(imgUrl));
+        } catch (IOException e) {
+            log.error("娴锋姤==>鎷夊彇鍥剧墖鎶ラ敊锛�"+e.getMessage());
+            return null;
+        }
+        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+        try {
+            Thumbnails.of(originalImage)
+                    .scale(1)
+                    .outputFormat("png".equals(suffix.toLowerCase())?"PNG":"JPEG")
+                    .outputQuality(0.8)
+                    .imageType(BufferedImage.TYPE_INT_RGB)
+                    .toOutputStream(outputStream);
+        } catch (IOException e) {
+            log.error("娴锋姤==>鍘嬬缉鍥剧墖鎶ラ敊锛�"+e.getMessage());
+            return null;
+        }
+        byte[] data = outputStream.toByteArray();
+        // 2. 鍖呰涓鸿緭鍏ユ祦
+        ByteArrayInputStream bis = new ByteArrayInputStream(data);
+        // 3. 瑙g爜涓� BufferedImage
+        try {
+            return ImageIO.read(bis);
+        } catch (IOException e) {
+            log.error("娴锋姤==>杞祦鎶ラ敊锛�"+e.getMessage());
+            return null;
+        }
+    }
 
 
 }
diff --git a/server/dmmall_service/src/main/java/com/doumee/core/utils/RichTextProcessor.java b/server/dmmall_service/src/main/java/com/doumee/core/utils/RichTextProcessor.java
new file mode 100644
index 0000000..962e16b
--- /dev/null
+++ b/server/dmmall_service/src/main/java/com/doumee/core/utils/RichTextProcessor.java
@@ -0,0 +1,28 @@
+package com.doumee.core.utils;
+
+import org.jsoup.Jsoup;
+
+/**
+ * Created by IntelliJ IDEA.
+ *
+ * @Author : Rk
+ * @create 2026/1/20 16:58
+ */
+public class RichTextProcessor {
+
+    /**
+     * 浠嶩TML涓彁鍙栫函鏂囨湰
+     */
+    public static String extractPlainTextFromHtml(String htmlContent) {
+        if (htmlContent == null || htmlContent.isEmpty()) {
+            return "";
+        }
+
+        // 鐩存帴鎻愬彇鏂囨湰鍐呭锛屽幓闄ゆ墍鏈塇TML鏍囩
+        return Jsoup.parse(htmlContent).text();
+    }
+
+
+
+
+}
diff --git a/server/dmmall_service/src/main/java/com/doumee/dao/business/CollectMapper.java b/server/dmmall_service/src/main/java/com/doumee/dao/business/CollectMapper.java
index 7703f3e..31474f5 100644
--- a/server/dmmall_service/src/main/java/com/doumee/dao/business/CollectMapper.java
+++ b/server/dmmall_service/src/main/java/com/doumee/dao/business/CollectMapper.java
@@ -2,11 +2,12 @@
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.doumee.dao.business.model.Collect;
+import com.github.yulichang.base.mapper.MPJJoinMapper;
 
 /**
  * @author 姹熻箘韫�
  * @date 2023/03/21 15:48
  */
-public interface CollectMapper extends BaseMapper<Collect> {
+public interface CollectMapper extends MPJJoinMapper<Collect> {
 
 }
diff --git a/server/dmmall_service/src/main/java/com/doumee/dao/business/InviteRecordMapper.java b/server/dmmall_service/src/main/java/com/doumee/dao/business/InviteRecordMapper.java
new file mode 100644
index 0000000..2d95be6
--- /dev/null
+++ b/server/dmmall_service/src/main/java/com/doumee/dao/business/InviteRecordMapper.java
@@ -0,0 +1,15 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.Integral;
+import com.doumee.dao.business.model.InviteRecord;
+import com.github.yulichang.base.mapper.MPJJoinMapper;
+
+/**
+ * 鐢ㄦ埛閭�璇疯褰�
+ * @author 姹熻箘韫�
+ * @date 2026骞�1鏈�20鏃�09:32:12
+ */
+public interface InviteRecordMapper extends MPJJoinMapper<InviteRecord> {
+
+}
diff --git a/server/dmmall_service/src/main/java/com/doumee/dao/business/model/Collect.java b/server/dmmall_service/src/main/java/com/doumee/dao/business/model/Collect.java
index 5f44532..94b14dd 100644
--- a/server/dmmall_service/src/main/java/com/doumee/dao/business/model/Collect.java
+++ b/server/dmmall_service/src/main/java/com/doumee/dao/business/model/Collect.java
@@ -1,5 +1,6 @@
 package com.doumee.dao.business.model;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.doumee.core.annotation.excel.ExcelColumn;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -8,6 +9,8 @@
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
 import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.math.BigDecimal;
 import java.util.Date;
 
 /**
@@ -59,7 +62,7 @@
     @ExcelColumn(name="瀵硅薄缂栫爜")
     private Integer objId;
 
-    @ApiModelProperty(value = "瀵硅薄绫诲瀷 0娲诲姩鎺㈠簵鍜ㄨ", example = "1")
+    @ApiModelProperty(value = "瀵硅薄绫诲瀷 0娲诲姩鎺㈠簵鍜ㄨ 1鍟嗗搧", example = "1")
     @ExcelColumn(name="瀵硅薄绫诲瀷 0娲诲姩鎺㈠簵鍜ㄨ")
     private Integer objType;
 
@@ -75,4 +78,39 @@
     @ExcelColumn(name="瀵硅薄鍏宠仈鐢ㄦ埛缂栫爜锛堝叧鑱攎ember琛級")
     private Integer objMemberId;
 
+    @ApiModelProperty(value = "鍟嗗搧灏侀潰鍥�/鏂囩珷鍒楄〃鍥�")
+    @TableField(exist = false)
+    private String imgUrl;
+
+    @ApiModelProperty(value = "鍟嗗搧鍚嶇О/鏂囩珷鍚嶇О")
+    @TableField(exist = false)
+    private String name;
+
+    @ApiModelProperty(value = "鍟嗗搧浠锋牸")
+    @TableField(exist = false)
+    private BigDecimal price;
+
+    @ApiModelProperty(value = "鍒掔嚎浠�")
+    @TableField(exist = false)
+    private BigDecimal linePrice;
+
+    @ApiModelProperty(value = "鏂囩珷鍒嗙被鍚嶇О")
+    @TableField(exist = false)
+    private String labelName;
+
+    @ApiModelProperty(value = "闃呰閲�")
+    @TableField(exist = false)
+    private Integer readNum;
+
+    @ApiModelProperty(value = "鏂囩珷鍙戝竷鏃堕棿")
+    @TableField(exist = false)
+    private Date releaseDate;
+
+    @ApiModelProperty(value = "鏂囩珷鍐呭")
+    @TableField(exist = false)
+    private String content;
+
+
+
+
 }
diff --git a/server/dmmall_service/src/main/java/com/doumee/dao/business/model/InviteRecord.java b/server/dmmall_service/src/main/java/com/doumee/dao/business/model/InviteRecord.java
new file mode 100644
index 0000000..0d1893a
--- /dev/null
+++ b/server/dmmall_service/src/main/java/com/doumee/dao/business/model/InviteRecord.java
@@ -0,0 +1,78 @@
+package com.doumee.dao.business.model;
+
+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.doumee.core.annotation.excel.ExcelColumn;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 鐢ㄦ埛閭�璇疯褰�
+ * @author 姹熻箘韫�
+ * @date 2026骞�1鏈�20鏃�09:32:12
+ */
+@Data
+@ApiModel("鐢ㄦ埛閭�璇疯褰�")
+@TableName("`invite_record`")
+public class InviteRecord {
+
+    @ApiModelProperty(value = "涓婚敭", example = "1")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty(value = "鍒涘缓浜虹紪鐮�", example = "1")
+    private Integer creator;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    @ExcelColumn(name="浜ゆ槗鏃堕棿" ,index =1,width = 10)
+    private Date createDate;
+
+    @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
+    private Integer editor;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+
+    private Date editDate;
+
+    @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�", example = "1")
+    private Integer isdeleted;
+
+    @ApiModelProperty(value = "澶囨敞")
+    private String remark;
+
+    @ApiModelProperty(value = "閭�璇蜂汉涓婚敭锛堝叧鑱攎ember琛級", example = "1")
+    private Integer inviteId;
+
+    @ApiModelProperty(value = "琚個璇蜂汉涓婚敭锛堝叧鑱攎ember琛級", example = "1")
+    private Integer memberId;
+
+    @ApiModelProperty(value = "琚個璇蜂汉鎵嬫満鍙�")
+    private String phone;
+
+    @ApiModelProperty(value = "鏄惁瀹屾垚棣栧崟锛�0鍚� 1鏄�", example = "1")
+    private Integer firstOrderStatus;
+
+    @ApiModelProperty(value = "瀹屾垚棣栧崟鏃堕棿")
+    private Date firstFinishDate;
+
+    @ApiModelProperty(value = "閭�璇峰鍔辩Н鍒�")
+    private BigDecimal rewardIntegral;
+
+    @ApiModelProperty(value = "瀹屾垚棣栧崟濂栧姳绉垎")
+    private BigDecimal firstRewardIntegral;
+
+    @ApiModelProperty(value = "琚個璇蜂汉澶村儚")
+    @TableField(exist = false)
+    private String imgUrl;
+
+    @ApiModelProperty(value = "琚個璇蜂汉鍚嶇О")
+    @TableField(exist = false)
+    private String memberName;
+
+}
diff --git a/server/dmmall_service/src/main/java/com/doumee/dao/business/model/MemberCoupon.java b/server/dmmall_service/src/main/java/com/doumee/dao/business/model/MemberCoupon.java
index ea8cd73..9d6bff5 100644
--- a/server/dmmall_service/src/main/java/com/doumee/dao/business/model/MemberCoupon.java
+++ b/server/dmmall_service/src/main/java/com/doumee/dao/business/model/MemberCoupon.java
@@ -2,6 +2,9 @@
 
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.doumee.core.annotation.excel.ExcelColumn;
+import com.doumee.core.model.LoginUserInfo;
+import com.doumee.core.utils.Constants;
+import com.doumee.core.utils.DateUtil;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import com.baomidou.mybatisplus.annotation.IdType;
@@ -11,6 +14,7 @@
 import com.fasterxml.jackson.annotation.JsonFormat;
 import java.util.Date;
 import java.math.BigDecimal;
+import java.util.Objects;
 
 /**
  * 鐢ㄦ埛浼樻儬鍒稿叧鑱旇〃
@@ -136,4 +140,44 @@
     @TableField(exist = false)
     private BigDecimal   couponPrice     ;
 
+
+    public static MemberCoupon couponToBean(Coupon coupon, Member member , Date now, Integer getMethod, LoginUserInfo loginUserInfo){
+        MemberCoupon insert = new MemberCoupon();
+        insert.setCreateDate(now);
+        insert.setEditDate(now);
+        insert.setCreator(Objects.nonNull(loginUserInfo)?loginUserInfo.getId():null);
+        insert.setEditor(Objects.nonNull(loginUserInfo)?loginUserInfo.getId():null);
+        insert.setIsdeleted(Constants.ZERO);
+        insert.setRemark(Constants.equalsInteger(getMethod, Constants.ZERO)?"娉ㄥ唽璧犻��":Constants.equalsInteger(getMethod, Constants.ONE)?"閭�璇峰ソ鍙�":"瀹氬悜鍙戞斁");
+        insert.setMemberId(member.getId());
+        insert.setShopId(coupon.getShopId());
+        insert.setType(coupon.getType());
+        insert.setCouponType(coupon.getType());
+        insert.setLimitPrice(coupon.getLimitPrice());
+        insert.setPrice(coupon.getPrice());
+        if(Constants.equalsObject(coupon.getUseType(),Constants.ZERO)){
+            //濡傛灉鏄浐瀹氭椂娈�
+            insert.setStartDate(coupon.getStartDate());
+            insert.setEndDate(coupon.getEndDate());
+        }else{
+            //鍥哄畾鏃堕暱 //鎺ㄨ繜澶╂暟
+            insert.setEndDate(DateUtil.addDaysToDate(now,Constants.formatIntegerNum(coupon.getValidDays())));
+            insert.setStartDate(now);
+        }
+        insert.setGetMethod(getMethod);//娉ㄥ唽璧犻��
+        insert.setIntegral(coupon.getIntegral());
+        insert.setStatus(Constants.ZERO);//鏈娇鐢�
+        insert.setInfo(coupon.getInfo());
+        insert.setName(coupon.getName());
+        insert.setApplyIds(coupon.getApplyIds());
+        insert.setApplyType(coupon.getApplyType());
+        insert.setCouponId(coupon.getId());
+        return  insert;
+
+    }
+
+
+
+
+
 }
diff --git a/server/dmmall_service/src/main/java/com/doumee/dao/system/dto/PlatformConfigDTO.java b/server/dmmall_service/src/main/java/com/doumee/dao/system/dto/PlatformConfigDTO.java
index 59a3cdb..88b1822 100644
--- a/server/dmmall_service/src/main/java/com/doumee/dao/system/dto/PlatformConfigDTO.java
+++ b/server/dmmall_service/src/main/java/com/doumee/dao/system/dto/PlatformConfigDTO.java
@@ -32,7 +32,7 @@
     @ApiModelProperty(value = "閭�璇峰ソ鍙嬬Н鍒嗗鍔辨暟閲�")
     private BigDecimal shareIntegralReward;
 
-    @ApiModelProperty(value = "娉ㄥ唽浼樻儬鍒稿鍔遍泦鍚�")
+    @ApiModelProperty(value = "娉ㄥ唽浼樻儬鍒稿鍔遍泦鍚�") //[{"num":"2","couponId":6},{"num":"3","couponId":5}]
     private List<JSONObject> regCouponRewardList;
     @ApiModelProperty(value = "閭�璇峰ソ鍙嬩紭鎯犲埜濂栧姳闆嗗悎")
     private List<JSONObject> shareCouponRewardList;
diff --git a/server/dmmall_service/src/main/java/com/doumee/dao/web/request/CollectSaveRequest.java b/server/dmmall_service/src/main/java/com/doumee/dao/web/request/CollectSaveRequest.java
new file mode 100644
index 0000000..8dbd2d7
--- /dev/null
+++ b/server/dmmall_service/src/main/java/com/doumee/dao/web/request/CollectSaveRequest.java
@@ -0,0 +1,26 @@
+package com.doumee.dao.web.request;
+
+import com.doumee.core.utils.Constants;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * Created by IntelliJ IDEA.
+ *
+ * @Author : Rk
+ * @create 2023/4/13 16:47
+ */
+@Data
+@ApiModel("鏀惰棌涓氬姟淇濆瓨璇锋眰绫�")
+public class CollectSaveRequest {
+
+    @ApiModelProperty(value = "涓氬姟涓婚敭")
+    private Integer objId;
+
+    @ApiModelProperty(value = "瀵硅薄涓婚敭")
+    private Integer type;
+
+}
diff --git a/server/dmmall_service/src/main/java/com/doumee/dao/web/request/WxPhoneRequest.java b/server/dmmall_service/src/main/java/com/doumee/dao/web/request/WxPhoneRequest.java
index 9d90da6..970e6e1 100644
--- a/server/dmmall_service/src/main/java/com/doumee/dao/web/request/WxPhoneRequest.java
+++ b/server/dmmall_service/src/main/java/com/doumee/dao/web/request/WxPhoneRequest.java
@@ -35,6 +35,6 @@
     private String openid;
 
     @ApiModelProperty(value = "閭�璇风爜")
-    private Integer recId;
+    private String recId;
 
 }
diff --git a/server/dmmall_service/src/main/java/com/doumee/dao/web/response/InviteInfoResponse.java b/server/dmmall_service/src/main/java/com/doumee/dao/web/response/InviteInfoResponse.java
new file mode 100644
index 0000000..efcaa37
--- /dev/null
+++ b/server/dmmall_service/src/main/java/com/doumee/dao/web/response/InviteInfoResponse.java
@@ -0,0 +1,36 @@
+package com.doumee.dao.web.response;
+
+import com.doumee.dao.business.model.InviteRecord;
+import com.doumee.dao.business.model.Member;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * Created by IntelliJ IDEA.
+ *
+ * @Author : Rk
+ * @create 2023/3/23 9:25
+ */
+@Data
+@ApiModel("閭�璇疯褰曡繑鍥炰俊鎭�")
+public class InviteInfoResponse{
+
+    @ApiModelProperty(value = "閭�璇蜂汉鏁�")
+    private Integer inviteNum;
+
+    @ApiModelProperty(value = "閭�璇疯禒閫佺Н鍒嗘暟閲�")
+    private Long num;
+
+    @ApiModelProperty(value = "閭�璇疯鍒�")
+    private String inviteRule;
+
+    @ApiModelProperty(value = "閭�璇疯褰�")
+    private List<InviteRecord> inviteRecordList;
+
+
+
+}
diff --git a/server/dmmall_service/src/main/java/com/doumee/dao/web/response/goods/GoodsInfoResponse.java b/server/dmmall_service/src/main/java/com/doumee/dao/web/response/goods/GoodsInfoResponse.java
index 188a90f..d8557bc 100644
--- a/server/dmmall_service/src/main/java/com/doumee/dao/web/response/goods/GoodsInfoResponse.java
+++ b/server/dmmall_service/src/main/java/com/doumee/dao/web/response/goods/GoodsInfoResponse.java
@@ -85,6 +85,11 @@
     @ApiModelProperty(value = "鐪熷疄搴撳瓨")
     private Integer stock;
 
+    @ApiModelProperty(value = "鏀惰棌鐘舵�侊細0=鏈敹钘忥紱1=宸叉敹钘�")
+    private Integer collectStatus;
+
+
+
 //    @ApiModelProperty(value = "鍟嗗搧鏍囩")
 //    private List<Labels> labelsList;
 
diff --git a/server/dmmall_service/src/main/java/com/doumee/service/business/CollectService.java b/server/dmmall_service/src/main/java/com/doumee/service/business/CollectService.java
index 0d3816a..79486b9 100644
--- a/server/dmmall_service/src/main/java/com/doumee/service/business/CollectService.java
+++ b/server/dmmall_service/src/main/java/com/doumee/service/business/CollectService.java
@@ -4,6 +4,7 @@
 import com.doumee.core.model.PageWrap;
 import com.doumee.dao.business.model.Collect;
 import com.doumee.dao.web.dto.CollectDTO;
+import com.doumee.dao.web.request.CollectSaveRequest;
 
 import java.util.List;
 import java.util.Map;
@@ -105,4 +106,8 @@
      * @return long
      */
     Map<Integer, CollectDTO> count(List<Integer> objIds);
+
+    void saveCollect(CollectSaveRequest request, Integer memberId);
+
+    List<Collect> myCollect(Integer memberId,Integer type);
 }
diff --git a/server/dmmall_service/src/main/java/com/doumee/service/business/GoodsService.java b/server/dmmall_service/src/main/java/com/doumee/service/business/GoodsService.java
index 57bff2b..fc41eaf 100644
--- a/server/dmmall_service/src/main/java/com/doumee/service/business/GoodsService.java
+++ b/server/dmmall_service/src/main/java/com/doumee/service/business/GoodsService.java
@@ -130,7 +130,7 @@
      * @param goodsId
      * @return
      */
-    GoodsInfoResponse getGoodsInfo(Integer goodsId);
+    GoodsInfoResponse getGoodsInfo(Integer goodsId,Integer memberId);
 
 
     /**
diff --git a/server/dmmall_service/src/main/java/com/doumee/service/business/InviteRecordService.java b/server/dmmall_service/src/main/java/com/doumee/service/business/InviteRecordService.java
new file mode 100644
index 0000000..1b7ae55
--- /dev/null
+++ b/server/dmmall_service/src/main/java/com/doumee/service/business/InviteRecordService.java
@@ -0,0 +1,26 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.Integral;
+import com.doumee.dao.web.dto.IntegralDTO;
+import com.doumee.dao.web.dto.IntegralRecordDTO;
+import com.doumee.dao.web.request.DealIntegralRequest;
+import com.doumee.dao.web.response.IntegralDataResponse;
+import com.doumee.dao.web.response.InviteInfoResponse;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 鐢ㄦ埛閭�璇疯褰�
+ * @author 姹熻箘韫�
+ * @date 2026骞�1鏈�20鏃�09:32:12
+ */
+public interface InviteRecordService {
+
+    InviteInfoResponse getInviteInfo(Integer memberId);
+
+    String createShareImg(Integer memberId) throws Exception;
+}
+
diff --git a/server/dmmall_service/src/main/java/com/doumee/service/business/MemberService.java b/server/dmmall_service/src/main/java/com/doumee/service/business/MemberService.java
index af571b1..49d34da 100644
--- a/server/dmmall_service/src/main/java/com/doumee/service/business/MemberService.java
+++ b/server/dmmall_service/src/main/java/com/doumee/service/business/MemberService.java
@@ -127,7 +127,7 @@
      * @param code
      * @return
      */
-    AccountResponse wxLogin(String code,Integer recId);
+    AccountResponse wxLogin(String code);
 
 
     AccountResponse wxLoginTest( Integer recId);
diff --git a/server/dmmall_service/src/main/java/com/doumee/service/business/impl/CollectServiceImpl.java b/server/dmmall_service/src/main/java/com/doumee/service/business/impl/CollectServiceImpl.java
index f574463..ff3368d 100644
--- a/server/dmmall_service/src/main/java/com/doumee/service/business/impl/CollectServiceImpl.java
+++ b/server/dmmall_service/src/main/java/com/doumee/service/business/impl/CollectServiceImpl.java
@@ -1,23 +1,33 @@
 package com.doumee.service.business.impl;
 
+import com.doumee.biz.system.SystemDictDataBiz;
 import com.doumee.core.model.LoginUserInfo;
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Constants;
+import com.doumee.core.utils.RichTextProcessor;
 import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.ActivityMapper;
+import com.doumee.dao.business.ArticleMapper;
 import com.doumee.dao.business.CollectMapper;
-import com.doumee.dao.business.model.Collect;
+import com.doumee.dao.business.GoodsMapper;
+import com.doumee.dao.business.model.*;
 import com.doumee.dao.web.dto.CollectDTO;
+import com.doumee.dao.web.request.CollectSaveRequest;
 import com.doumee.service.business.CollectService;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import org.apache.commons.collections4.MapUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.shiro.SecurityUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
@@ -34,9 +44,16 @@
     @Autowired
     private CollectMapper collectMapper;
 
+    @Autowired
+    private GoodsMapper goodsMapper;
+
+    @Autowired
+    private ActivityMapper activityMapper;
+
+    @Autowired
+    private SystemDictDataBiz systemDictDataBiz;
     @Override
     public Integer create(Collect collect,Integer memberId) {
-
         Collect target = new Collect();
         target.setCreateDate(new Date());
         target.setEditDate(new Date());
@@ -178,4 +195,75 @@
         }).collect(Collectors.toMap(s -> s.getObjId(), s -> s));
         return collect;
     }
+
+
+
+
+    @Override
+    public void saveCollect(CollectSaveRequest request, Integer memberId){
+        if(collectMapper.selectCount(new QueryWrapper<Collect>().lambda()
+                .eq(Collect::getMemberId,memberId)
+                .eq(Collect::getObjType,request.getType())
+                .eq(Collect::getObjId,request.getObjId())
+        )<= Constants.ZERO){
+            Collect target = new Collect();
+            target.setCreateDate(new Date());
+            target.setEditDate(new Date());
+            target.setMemberId(memberId);
+            target.setObjId(request.getObjId());
+            target.setObjType(request.getType());
+            collectMapper.insert(target);
+        };
+    }
+
+
+
+    @Override
+    public List<Collect> myCollect(Integer memberId,Integer type){
+        List<Collect> collectList = new ArrayList<>();
+        if(Constants.equalsInteger(type,Constants.ZERO)){
+            collectList = collectMapper.selectJoinList(Collect.class,new MPJLambdaWrapper<Collect>()
+                            .selectAll(Collect.class)
+                            .selectAs(Goods::getName,Collect::getName)
+                            .selectAs(Goods::getPrice,Collect::getPrice)
+                            .selectAs(Goods::getImgurl,Collect::getImgurl)
+                            .select(" ifnull(( select min(gs.PRICE) from goods_sku gs where gs.GOODS_ID = t1.id ),0) ", Collect::getLinePrice)
+                            .leftJoin(Goods.class,Goods::getId,Collect::getObjId)
+                    .eq(Collect::getIsdeleted,Constants.ZERO)
+                    .eq(Collect::getMemberId,memberId)
+                    .eq(Collect::getObjType,type)
+                    .orderByDesc(Collect::getId)
+            );
+            if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(collectList)){
+                String preFixPath = systemDictDataBiz.getPreFixPath(Constants.RESOURCE_PATH, Constants.GOODS_FILE);
+                collectList.forEach(s->s.setImgurl(preFixPath+s.getImgurl()));
+            }
+        }else{
+            collectList = collectMapper.selectJoinList(Collect.class,new MPJLambdaWrapper<Collect>()
+                    .selectAll(Collect.class)
+                    .selectAs(Activity::getName,Collect::getName)
+                    .selectAs(Activity::getCreateDate,Collect::getReleaseDate)
+                    .selectAs(Activity::getLooknum,Collect::getReadNum)
+                    .selectAs(Activity::getImgurl,Collect::getImgurl)
+                    .selectAs(Labels::getName,Collect::getLabelName)
+                    .selectAs(Activity::getContent,Collect::getContent)
+                    .leftJoin(Activity.class,Activity::getId,Collect::getObjId)
+                    .leftJoin(Labels.class,Labels::getId,Activity::getLabelId)
+                    .eq(Collect::getIsdeleted,Constants.ZERO)
+                    .eq(Collect::getMemberId,memberId)
+                    .eq(Collect::getObjType,type)
+                    .orderByDesc(Collect::getId)
+            );
+            if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(collectList)){
+                String preFixPath = systemDictDataBiz.getPreFixPath(Constants.RESOURCE_PATH, Constants.ACTIVITY_FILE);
+                collectList.forEach(s->s.setImgurl(preFixPath+s.getImgurl()));
+                collectList.stream().filter(s-> StringUtils.isNotBlank(s.getContent())).forEach(s->s.setContent(RichTextProcessor.extractPlainTextFromHtml(s.getContent())));
+            }
+        }
+        return collectList;
+    }
+
+
+
+
 }
diff --git a/server/dmmall_service/src/main/java/com/doumee/service/business/impl/GoodsServiceImpl.java b/server/dmmall_service/src/main/java/com/doumee/service/business/impl/GoodsServiceImpl.java
index 34a05c7..f275e49 100644
--- a/server/dmmall_service/src/main/java/com/doumee/service/business/impl/GoodsServiceImpl.java
+++ b/server/dmmall_service/src/main/java/com/doumee/service/business/impl/GoodsServiceImpl.java
@@ -83,6 +83,9 @@
     @Autowired
     private MultifileService multifileService;
 
+    @Autowired
+    private CollectMapper collectMapper;
+
 
     @Autowired
     private GoodsAdminJoinMapper goodsAdminJoinMapper;
@@ -865,7 +868,6 @@
         if (!CollectionUtils.isEmpty(page.getRecords())){
             String preFixPath = systemDictDataBiz.getPreFixPath(Constants.RESOURCE_PATH, Constants.GOODS_FILE);
             page.getRecords().forEach(s->s.setImgurl(preFixPath+s.getImgurl()));
-
         }
         return page;
     }
@@ -935,8 +937,7 @@
 
 
     @Override
-    public GoodsInfoResponse getGoodsInfo(Integer goodsId) {
-
+    public GoodsInfoResponse getGoodsInfo(Integer goodsId,Integer memberId) {
         String fullUrl = systemDictDataBiz.queryByCode(Constants.OSS,Constants.RESOURCE_PATH).getCode()+
                 systemDictDataBiz.queryByCode(Constants.OSS,Constants.GOODS_FILE).getCode();
         GoodsInfoResponse goodsResponse = goodsMapper.getGoodsInfo(goodsId);
@@ -958,6 +959,14 @@
                                                                                             Constants.GOODS_FILE);
         List<MultiFileDTO> multiFileDTOS = objAllFileUrl.get(Constants.MultiFile.PLATFORM_GOOD_ROTATION.getKey());
         goodsResponse.setGoodBannerMultiFiles(multiFileDTOS);
+        goodsResponse.setCollectStatus(Constants.ZERO);
+        if(Objects.nonNull(memberId)){
+            goodsResponse.setCollectStatus(collectMapper.selectCount(new QueryWrapper<Collect>().lambda()
+                    .eq(Collect::getMemberId,memberId)
+                    .eq(Collect::getObjId,goodsId)
+                    .eq(Collect::getObjType,Constants.ONE)
+            )>Constants.ZERO?Constants.ONE:Constants.ZERO);
+        }
 
         return goodsResponse;
     }
diff --git a/server/dmmall_service/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java b/server/dmmall_service/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java
index c2cc064..80590c6 100644
--- a/server/dmmall_service/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java
+++ b/server/dmmall_service/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java
@@ -85,6 +85,12 @@
     private ShopGoodsRelationMapper shopGoodsRelationMapper;
     @Autowired
     private MemberMapper memberMapper;
+    @Autowired
+    private CouponMapper couponMapper;
+    @Autowired
+    private MemberCouponJoinMapper memberCouponJoinMapper;
+    @Autowired
+    private InviteRecordMapper inviteRecordMapper;
 
     @Autowired
     private GoodsorderDetailMapper goodsorderDetailMapper;
@@ -1682,11 +1688,66 @@
         //鏍规嵁璁㈠崟绫诲瀷杩涜绉垎璧犻��
         //涓嬪崟纭鏀惰揣 锛岃禒閫佺粡閿�鍟嗙Н鍒�
         this.orderAddShopIntegral(goodsorder);
+        //涓嬪崟瀹屾垚 鏍规嵁淇℃伅纭鏄惁闇�瑕佽禒閫侀個璇疯�呬紭鎯犲埜
+        this.orderDoneRewardInviteCoupon(goodsorder);
         //娑堣垂鑰呯‘璁ゆ敹璐�
         this.orderAddMemberIntegral(goodsorder);
         //缁忛攢鍟� 缁撶畻閲戦
         this.orderAddShopCash(goodsorder);
     }
+
+
+    /**
+     * 璁㈠崟纭鏀惰揣锛岃禒閫侀個璇疯�呬紭鎯犲埜
+     * @param
+     */
+    public void orderDoneRewardInviteCoupon(Goodsorder goodsorder){
+        PlatformConfigDTO platformConfigDTO = systemDictDataService.getPlatformConfigDTO();
+        if (platformConfigDTO.getShareCouponRewardStatus().equals(Constants.ONE)) {
+            return;
+        }
+        Member member = memberMapper.selectById(goodsorder.getMemberId());
+        if(Objects.isNull(member)||member.getIsdeleted().equals(Constants.ONE)){
+            return;
+        }
+        InviteRecord inviteRecord = inviteRecordMapper.selectOne(new QueryWrapper<InviteRecord>().lambda()
+                .eq(InviteRecord::getMemberId,member.getId())
+                .eq(InviteRecord::getIsdeleted,Constants.ZERO)
+                .eq(InviteRecord::getFirstOrderStatus,Constants.ZERO)
+                .last("limit 1")
+        );
+        if(Objects.isNull(inviteRecord)){
+            return;
+        }
+        Member inviteMember = memberMapper.selectById(inviteRecord.getInviteId());
+        if(Objects.isNull(inviteMember)||inviteMember.getIsdeleted().equals(Constants.ONE)){
+            return;
+        }
+
+        List<JSONObject> shareCouponRewardList = platformConfigDTO.getShareCouponRewardList();
+        //[{"num":"2","couponId":6},{"num":"3","couponId":5}]
+        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(shareCouponRewardList)){
+            List<MemberCoupon> memberCouponList = new ArrayList<>();
+            for (JSONObject jsonObject:shareCouponRewardList) {
+                Integer couponId = jsonObject.getInteger("couponId");
+                Integer num = jsonObject.getInteger("num");
+                Coupon coupon =  couponMapper.selectById(couponId);
+                if(Objects.isNull(coupon)||Constants.equalsInteger(coupon.getIsdeleted(),Constants.ONE)&&num>Constants.ZERO){
+                    continue;
+                }
+                MemberCoupon memberCoupon = MemberCoupon.couponToBean(coupon,inviteMember,new Date(),Constants.ONE,null);
+                for (int i = 0; i < num; i++) {
+                    memberCouponList.add(memberCoupon);
+                }
+            }
+            if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(memberCouponList)){
+                memberCouponJoinMapper.insert(memberCouponList);
+            }
+        }
+    }
+
+
+
 
     /**
      * 璁㈠崟鏍搁攢
@@ -1721,6 +1782,8 @@
         if(Constants.equalsInteger(goodsorder.getPayMethod(),Constants.ZERO)){
             //璧犻�佹秷璐硅�呯Н鍒�
             this.orderAddMemberIntegral(goodsorder);
+            //涓嬪崟瀹屾垚 鏍规嵁淇℃伅纭鏄惁闇�瑕佽禒閫侀個璇疯�呬紭鎯犲埜
+            this.orderDoneRewardInviteCoupon(goodsorder);
             //缁忛攢鍟� 娣诲姞璧犻�佺Н鍒�
             this.orderAddShopIntegral(goodsorder);
             //缁忛攢鍟� 缁撶畻閲戦
diff --git a/server/dmmall_service/src/main/java/com/doumee/service/business/impl/InviteRecordServiceImpl.java b/server/dmmall_service/src/main/java/com/doumee/service/business/impl/InviteRecordServiceImpl.java
new file mode 100644
index 0000000..b304208
--- /dev/null
+++ b/server/dmmall_service/src/main/java/com/doumee/service/business/impl/InviteRecordServiceImpl.java
@@ -0,0 +1,142 @@
+package com.doumee.service.business.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.doumee.biz.system.SystemDictDataBiz;
+import com.doumee.core.constants.ResponseStatus;
+import com.doumee.core.exception.BusinessException;
+import com.doumee.core.model.LoginUserInfo;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Constants;
+import com.doumee.core.utils.DateUtil;
+import com.doumee.core.utils.GeneratePicUtil;
+import com.doumee.core.utils.Utils;
+import com.doumee.core.utils.aliyun.ALiYunUtil;
+import com.doumee.core.wx.WxMiniConfig;
+import com.doumee.dao.business.IntegralMapper;
+import com.doumee.dao.business.InviteRecordMapper;
+import com.doumee.dao.business.MemberMapper;
+import com.doumee.dao.business.ShopMapper;
+import com.doumee.dao.business.join.IntegralJoinMapper;
+import com.doumee.dao.business.model.Integral;
+import com.doumee.dao.business.model.InviteRecord;
+import com.doumee.dao.business.model.Member;
+import com.doumee.dao.business.model.Shop;
+import com.doumee.dao.web.dto.IntegralDTO;
+import com.doumee.dao.web.dto.IntegralRecordDTO;
+import com.doumee.dao.web.request.DealIntegralRequest;
+import com.doumee.dao.web.response.IntegralDataResponse;
+import com.doumee.dao.web.response.InviteInfoResponse;
+import com.doumee.service.business.IntegralService;
+import com.doumee.service.business.InviteRecordService;
+import com.github.xiaoymin.knife4j.core.util.CollectionUtils;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.http.util.TextUtils;
+import org.apache.shiro.SecurityUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.awt.image.BufferedImage;
+import java.io.IOException;
+import java.io.InputStream;
+import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 鐢ㄦ埛閭�璇疯褰�
+ * @author 姹熻箘韫�
+ * @date 2026骞�1鏈�20鏃�09:32:12
+ */
+@Service
+public class InviteRecordServiceImpl implements InviteRecordService {
+
+    @Autowired
+    private InviteRecordMapper inviteRecordMapper;
+
+    @Autowired
+    private SystemDictDataBiz systemDictDataBiz;
+
+    @Override
+    public InviteInfoResponse getInviteInfo(Integer memberId){
+        InviteInfoResponse inviteInfoResponse = new InviteInfoResponse();
+        inviteInfoResponse.setInviteNum(Constants.ZERO);
+        inviteInfoResponse.setNum(0l);
+        inviteInfoResponse.setInviteRule(systemDictDataBiz.queryByCode(Constants.ORDER_SET,Constants.INVITE_RULE).getCode());
+
+        List<InviteRecord> inviteRecordList = inviteRecordMapper.selectJoinList(InviteRecord.class,
+                new MPJLambdaWrapper<InviteRecord>()
+                        .selectAll(InviteRecord.class)
+                        .selectAs(Member::getNickname,InviteRecord::getMemberName)
+                        .selectAs(Member::getImgurl,InviteRecord::getImgUrl)
+                        .leftJoin(Member.class,Member::getId,InviteRecord::getMemberId)
+                        .eq(InviteRecord::getIsdeleted,Constants.ZERO)
+                        .eq(InviteRecord::getMemberId,memberId)
+                        .orderByDesc(InviteRecord::getId)
+        );
+
+        if (CollectionUtils.isNotEmpty(inviteRecordList)) {
+            inviteInfoResponse.setInviteRecordList(inviteRecordList);
+            inviteInfoResponse.setInviteNum(inviteRecordList.size());
+            BigDecimal num = BigDecimal.ZERO;
+            String path  = systemDictDataBiz.queryByCode(Constants.OSS,Constants.RESOURCE_PATH).getCode()+
+                            systemDictDataBiz.queryByCode(Constants.OSS,Constants.MEMBER_FILE).getCode();
+            for (InviteRecord inviteRecord:inviteRecordList) {
+                if(StringUtils.isNotBlank(inviteRecord.getImgUrl())){
+                    inviteRecord.setImgUrl(path + inviteRecord.getImgUrl());
+                }
+                num = num.add(inviteRecord.getRewardIntegral()).add(inviteRecord.getFirstRewardIntegral());
+            }
+            inviteInfoResponse.setNum(num.longValue());
+        }
+
+        return inviteInfoResponse;
+    }
+
+
+    @Override
+    public String createShareImg(Integer memberId) throws Exception {
+        String imgUrl = systemDictDataBiz.queryByCode(Constants.ORDER_SET,Constants.INVITE_IMG_URL).getCode();
+        BufferedImage img1  = GeneratePicUtil.transfromToImage(imgUrl,imgUrl.substring(imgUrl.lastIndexOf(".") + 1));
+        if (img1 == null) {
+            return imgUrl;
+        }
+        String url = null;
+        String scene = "m_" + memberId;
+        //鍐呭鍒嗕韩娴锋姤鍥剧墖
+        InputStream mpCode = Constants.generateWxMiniImgStream(
+                scene,
+                "",
+                false);//灏忕▼搴�
+        InputStream inputStream = GeneratePicUtil.generateShareWithUserImg(
+                img1
+                , mpCode);
+        ALiYunUtil obs = new ALiYunUtil(
+        systemDictDataBiz.queryByCode(Constants.OSS,Constants.ENDPOINT).getCode()
+                ,systemDictDataBiz.queryByCode(Constants.OSS,Constants.ACCESS_ID).getCode(), systemDictDataBiz.queryByCode(Constants.OSS,Constants.ACCESS_KEY).getCode());
+        String shareFolder = systemDictDataBiz.queryByCode(Constants.RESOURCE_PATH, Constants.SHARES_FILE).getCode();
+        String key = DateUtil.getNowShortDate() + "/" + UUID.randomUUID().toString() + ".jpg";
+        String fileName = shareFolder + key;
+        if (obs.uploadOnlineObject(inputStream,systemDictDataBiz.queryByCode(Constants.OSS, Constants.BUCKETNAME).getCode(), key,null)) {
+            url = systemDictDataBiz.queryByCode(Constants.OSS,Constants.RESOURCE_PATH).getCode() + fileName;
+        }
+        return url;
+
+
+    }
+
+
+
+
+
+
+
+
+
+}
diff --git a/server/dmmall_service/src/main/java/com/doumee/service/business/impl/MemberCouponServiceImpl.java b/server/dmmall_service/src/main/java/com/doumee/service/business/impl/MemberCouponServiceImpl.java
index f146ea2..2d94d81 100644
--- a/server/dmmall_service/src/main/java/com/doumee/service/business/impl/MemberCouponServiceImpl.java
+++ b/server/dmmall_service/src/main/java/com/doumee/service/business/impl/MemberCouponServiceImpl.java
@@ -87,7 +87,7 @@
             for(Member member : memberList){
                 for (int i = 0; i < Constants.formatLongNum(param.getNum()); i++) {
                     //鎸ㄤ釜閫�
-                    addList.add(initMemberCouponByParam(coupon,member,loginUserInfo,now));
+                    addList.add(MemberCoupon.couponToBean(coupon,member,now,Constants.TWO,loginUserInfo));
                 }
             }
             index++;
@@ -99,6 +99,7 @@
         return "鎿嶄綔鎴愬姛,鎴愬姛浜哄憳鏁伴噺锛�"+memberList.size()+",鍏卞彂鏀句紭鎯犲埜鏁伴噺锛�"+addList.size();
 
     }
+/*
 
     private MemberCoupon initMemberCouponByParam(Coupon coupon, Member member, LoginUserInfo loginUserInfo ,Date now) {
         MemberCoupon insert = new MemberCoupon();
@@ -134,6 +135,7 @@
         insert.setCouponId(coupon.getId());
         return  insert;
     }
+*/
 
     private Coupon getCouponFromListById(Integer id, List<Coupon> couponList) {
         for(Coupon c : couponList){
diff --git a/server/dmmall_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java b/server/dmmall_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
index f405e38..51363f3 100644
--- a/server/dmmall_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
+++ b/server/dmmall_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
@@ -27,6 +27,7 @@
 import com.doumee.dao.business.model.*;
 import com.doumee.dao.system.SystemUserMapper;
 import com.doumee.dao.system.dto.MemberRechargeDTO;
+import com.doumee.dao.system.dto.PlatformConfigDTO;
 import com.doumee.dao.web.dto.MemberOwnDTO;
 import com.doumee.dao.web.dto.shop.Position;
 import com.doumee.dao.system.model.SystemUser;
@@ -42,6 +43,7 @@
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.doumee.service.system.SystemDictDataService;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import io.swagger.models.auth.In;
 import io.swagger.util.Yaml;
@@ -79,6 +81,10 @@
     @Autowired
     private MemberMapper memberMapper;
     @Autowired
+    private CouponMapper couponMapper;
+    @Autowired
+    private MemberCouponJoinMapper memberCouponJoinMapper;
+    @Autowired
     private IntegralMapper integralMapper;
     @Autowired
     private ShopMapper shopMapper;
@@ -93,12 +99,18 @@
     @Autowired
     private MemberJoinMapper memberJoinMapper;
 
+    @Autowired
+    private InviteRecordMapper inviteRecordMapper;
+
 
     @Autowired
     private SystemUserMapper systemUserMapper;
 
     @Autowired
     private SystemDictDataBiz systemDictDataBiz;
+
+    @Autowired
+    private SystemDictDataService systemDictDataService;
 
     @Autowired
     private UploadFileService uploadFileService;
@@ -287,7 +299,7 @@
 
 
     @Override
-    public AccountResponse wxLogin(String code,Integer recId){
+    public AccountResponse wxLogin(String code){
         try {
             //鑾峰彇寰俊鏁忔劅鏁版嵁
             WxMaJscode2SessionResult session = WxMiniConfig.wxMaService.getUserService().getSessionInfo(code);
@@ -304,9 +316,6 @@
             AccountResponse accountResponse = new AccountResponse();
             accountResponse.setSessionKey(session.getSessionKey());
             if(Objects.nonNull(member)){
-                if(Objects.isNull(member.getRecId())){
-                    member.setRecId(recId);
-                }
                 memberMapper.updateById(member);
                 member.setImgFullUrl(systemDictDataBiz.queryByCode(Constants.OSS,Constants.RESOURCE_PATH).getCode()+
                         systemDictDataBiz.queryByCode(Constants.OSS,Constants.MEMBER_FILE).getCode()+member.getImgurl());
@@ -333,80 +342,6 @@
         return accountResponse;
     }
 
-
-    /**
-     * 鏍规嵁openid鑾峰彇鏄惁缁戝畾浜嗗晢鎴�
-     * @param openid
-     * @param memberId
-     * @return
-     */
-    public AccountResponse shopOpenidLogin(String openid, Integer memberId){
-        Shop shop = shopMapper.selectOne(new QueryWrapper<Shop>().lambda().eq(Shop::getOpenId, openid)
-                .eq(Shop::getIsdeleted,Constants.ZERO)
-                .last("limit 1")
-        );
-        AccountResponse accountResponse = new AccountResponse();
-        accountResponse.setOpenid(openid);
-        if(Objects.nonNull(shop)){
-            if(Objects.isNull(memberId)
-             && ( Objects.isNull(shop.getMemberId())
-                    || !Constants.equalsInteger(shop.getMemberId(),memberId))){
-                shopMapper.update(null,new UpdateWrapper<Shop>().lambda()
-                        .set(Shop::getMemberId,memberId)
-                        .eq(Shop::getId,shop.getId())
-                );
-            }
-            JwtPayLoad payLoad = new JwtPayLoad(Constants.SHOP_PREFIX+shop.getId());
-            String token = JwtTokenUtil.generateToken(payLoad);
-            accountResponse.setToken(token);
-        }
-        return accountResponse;
-    }
-
-
-    /**
-     * 鍟嗘埛璐﹀彿瀵嗙爜鐧诲綍
-     * @param userName
-     * @param password
-     * @param openid
-     * @param memberId
-     * @return
-     */
-    public AccountResponse shopPasswordLogin(String userName,String password,String openid,String memberId){
-        if(StringUtils.isBlank(userName)
-             || StringUtils.isBlank(password)){
-            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鐢ㄦ埛鍚嶆垨瀵嗙爜涓嶈兘涓虹┖");
-        }
-        Shop shop = shopMapper.selectOne(new QueryWrapper<Shop>().lambda().eq(Shop::getUsername, userName)
-                .eq(Shop::getIsdeleted,Constants.ZERO)
-                .last("limit 1")
-        );
-        if(shop==null){
-            throw new BusinessException(ResponseStatus.ACCOUNT_INCORRECT);
-        }
-        //鍔犲瘑瀵嗙爜
-        String pwd = Utils.Secure.encryptPassword(password, shop.getSalt());
-        if(!pwd.equals(shop.getPassword())){
-            throw new BusinessException(ResponseStatus.ACCOUNT_INCORRECT);
-        }
-        //鍒涘缓token
-        JwtPayLoad payLoad = new JwtPayLoad(Constants.SHOP_PREFIX+shop.getId());
-        String token = JwtTokenUtil.generateToken(payLoad);
-        AccountResponse accountResponse = new AccountResponse();
-        accountResponse.setToken(token);
-        shopMapper.update(null,new UpdateWrapper<Shop>().lambda()
-                .set(Shop::getOpenId,openid)
-                .set(Shop::getMemberId,memberId)
-                .eq(Shop::getId,shop.getId())
-        );
-        shopMapper.update(null,new UpdateWrapper<Shop>().lambda()
-                .set(Shop::getOpenId,null)
-                .eq(Shop::getOpenId,openid)
-                .ne(Shop::getId,shop.getId())
-        );
-        return accountResponse;
-    }
-
     @Override
     public AccountResponse wxPhone(WxPhoneRequest wxPhoneRequest){
         try {
@@ -428,7 +363,9 @@
                 member.setIsdeleted(Constants.ZERO);
                 member.setType(Constants.ZERO);
                 member.setOrigin(Constants.ZERO);
-                member.setRecId(wxPhoneRequest.getRecId());
+                if(!this.checkIsCreateInvite(phone)){
+                    member.setRecId(Constants.getInviteCode(wxPhoneRequest.getRecId()));
+                }
                 member.setOpenId(wxPhoneRequest.getOpenid());
             }
             member.setPhone(phone);
@@ -437,6 +374,11 @@
                     systemDictDataBiz.queryByCode(Constants.OSS,Constants.MEMBER_FILE).getCode()+member.getImgurl());
             if(Objects.isNull(member.getId())){
                 memberMapper.insert(member);
+
+                PlatformConfigDTO platformConfigDTO = systemDictDataService.getPlatformConfigDTO();
+                this.createRegionReward(member,platformConfigDTO);
+                //鍒涘缓閭�璇疯褰�
+                this.createInviteRecord(member,platformConfigDTO);
                 member.setSharingCode(this.createShareCode(member.getId()));
                 memberMapper.updateById(member);
             }else{
@@ -458,6 +400,89 @@
     }
 
 
+    /**
+     * 鍙戞斁娉ㄥ唽濂栧姳淇℃伅
+     * @param member
+     * @param platformConfigDTO
+     */
+    public void createRegionReward(Member member,PlatformConfigDTO platformConfigDTO){
+        //鏌ヨ鐢ㄦ埛鏄惁娉ㄩ攢杩�
+        if(memberMapper.selectCount(new QueryWrapper<Member>().lambda()
+                .eq(Member::getIsdeleted,Constants.ONE)
+                .eq(Member::getPhone,member.getPhone())
+        )>Constants.ZERO){
+            return;
+        }
+        //寮�鍚敞鍐岄�佺Н鍒�
+        if(Constants.equalsInteger(platformConfigDTO.getRegIntegralRewardStatus(),Constants.ZERO)){
+            DealIntegralRequest dealIntegralRequest = new DealIntegralRequest();
+            dealIntegralRequest.setIntegralNum(platformConfigDTO.getRegIntegralReward());
+            dealIntegralRequest.setDealType(Constants.ZERO);
+            dealIntegralRequest.setMemberId(member.getId());
+            dealIntegralRequest.setIntegralObjType(Constants.IntegralObjType.REGISTER);
+            integralService.dealIntegral(dealIntegralRequest);
+        }
+        //寮�鍚敞鍐岄�佷紭鎯犲埜
+        if(Constants.equalsInteger(platformConfigDTO.getRegCouponRewardStatus(),Constants.ZERO)){
+            List<JSONObject> regCouponRewardList = platformConfigDTO.getRegCouponRewardList();
+            //[{"num":"2","couponId":6},{"num":"3","couponId":5}]
+            if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(regCouponRewardList)){
+                List<MemberCoupon> memberCouponList = new ArrayList<>();
+                for (JSONObject jsonObject:regCouponRewardList) {
+                    Integer couponId = jsonObject.getInteger("couponId");
+                    Integer num = jsonObject.getInteger("num");
+                    Coupon coupon =  couponMapper.selectById(couponId);
+                    if(Objects.isNull(coupon)||Constants.equalsInteger(coupon.getIsdeleted(),Constants.ONE)&&num>Constants.ZERO){
+                        continue;
+                    }
+                    MemberCoupon memberCoupon = MemberCoupon.couponToBean(coupon,member,new Date(),Constants.ZERO,null);
+                    for (int i = 0; i < num; i++) {
+                        memberCouponList.add(memberCoupon);
+                    }
+                }
+                if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(memberCouponList)){
+                    memberCouponJoinMapper.insert(memberCouponList);
+                }
+            }
+        }
+    }
+
+
+    /**
+     * 鍒涘缓閭�璇疯褰�
+     * @param member
+     */
+    public void createInviteRecord(Member member,PlatformConfigDTO platformConfigDTO){
+        if(Objects.isNull(member.getRecId())){
+            return;
+        }
+        InviteRecord inviteRecord = new InviteRecord();
+        inviteRecord.setCreateDate(new Date());
+        inviteRecord.setIsdeleted(Constants.ZERO);
+        inviteRecord.setInviteId(member.getRecId());
+        inviteRecord.setMemberId(member.getId());
+        inviteRecord.setPhone(member.getPhone());
+        inviteRecord.setRewardIntegral(Objects.nonNull(platformConfigDTO)&&Constants.equalsInteger(platformConfigDTO.getShareIntegralRewardStatus(),Constants.ZERO)?
+                platformConfigDTO.getShareIntegralReward():BigDecimal.ZERO);
+        inviteRecord.setFirstOrderStatus(Constants.ZERO);
+        inviteRecordMapper.insert(inviteRecord);
+    }
+
+
+    /**
+     * 鏌ヨ鏄惁鍒涘缓杩囬個璇�
+     * @param mobile
+     * @return
+     */
+    public Boolean checkIsCreateInvite(String mobile){
+        return inviteRecordMapper.selectCount(new QueryWrapper<InviteRecord>()
+                .lambda()
+                .eq(InviteRecord::getPhone,mobile)
+        )>Constants.ZERO?true:false;
+    }
+
+
+
 
     public String createShareCode(Integer memberId){
         //鐢熸垚鍒嗕韩鐮�
diff --git a/server/dmmall_web/src/main/java/com/doumee/api/web/AccountApi.java b/server/dmmall_web/src/main/java/com/doumee/api/web/AccountApi.java
index 19c6c9e..2d61391 100644
--- a/server/dmmall_web/src/main/java/com/doumee/api/web/AccountApi.java
+++ b/server/dmmall_web/src/main/java/com/doumee/api/web/AccountApi.java
@@ -40,11 +40,10 @@
     @ApiOperation(value = "灏忕▼搴忕櫥闄嗘柟寮�", notes = "灏忕▼搴忕")
     @GetMapping("/wxLogin")
     @ApiImplicitParams({
-            @ApiImplicitParam(paramType = "query", dataType = "String", name = "code", value = "寰俊code", required = true),
-            @ApiImplicitParam(paramType = "query", dataType = "Integer", name = "recId", value = "鍒嗕韩鐮�", required = false)
+            @ApiImplicitParam(paramType = "query", dataType = "String", name = "code", value = "寰俊code", required = true)
     })
-    public ApiResponse<AccountResponse> wxLogin(@RequestParam String code, Integer recId) {
-        return  ApiResponse.success(memberService.wxLogin(code,recId));
+    public ApiResponse<AccountResponse> wxLogin(@RequestParam String code) {
+        return  ApiResponse.success(memberService.wxLogin(code));
     }
 
     @LoginRequired
diff --git a/server/dmmall_web/src/main/java/com/doumee/api/web/ActivityApi.java b/server/dmmall_web/src/main/java/com/doumee/api/web/ActivityApi.java
index 6d10230..00556aa 100644
--- a/server/dmmall_web/src/main/java/com/doumee/api/web/ActivityApi.java
+++ b/server/dmmall_web/src/main/java/com/doumee/api/web/ActivityApi.java
@@ -25,7 +25,7 @@
  */
 @Api(tags = "娲诲姩涓氬姟")
 @Trace(exclude = true)
-@RestController
+//@RestController
 @RequestMapping("/web/activity")
 @Slf4j
 public class ActivityApi extends ApiController{
diff --git a/server/dmmall_web/src/main/java/com/doumee/api/web/ApiController.java b/server/dmmall_web/src/main/java/com/doumee/api/web/ApiController.java
index 6095cae..8ab6bf6 100644
--- a/server/dmmall_web/src/main/java/com/doumee/api/web/ApiController.java
+++ b/server/dmmall_web/src/main/java/com/doumee/api/web/ApiController.java
@@ -145,6 +145,9 @@
     @Autowired
     public FundService fundService;
 
+    @Autowired
+    public InviteRecordService inviteRecordService;
+
 
     /**
      * 寰楀埌request瀵硅薄
diff --git a/server/dmmall_web/src/main/java/com/doumee/api/web/ArticleApi.java b/server/dmmall_web/src/main/java/com/doumee/api/web/ArticleApi.java
index 2002ee6..ccbe1b3 100644
--- a/server/dmmall_web/src/main/java/com/doumee/api/web/ArticleApi.java
+++ b/server/dmmall_web/src/main/java/com/doumee/api/web/ArticleApi.java
@@ -23,7 +23,7 @@
  * @create 2023/3/23 17:33
  */
 @Api(tags = "鍜栧暋鐧剧")
-@RestController
+//@RestController
 @RequestMapping("/web/article")
 @Slf4j
 public class ArticleApi extends ApiController{
diff --git a/server/dmmall_web/src/main/java/com/doumee/api/web/CardApi.java b/server/dmmall_web/src/main/java/com/doumee/api/web/CardApi.java
index b60c079..465abe6 100644
--- a/server/dmmall_web/src/main/java/com/doumee/api/web/CardApi.java
+++ b/server/dmmall_web/src/main/java/com/doumee/api/web/CardApi.java
@@ -14,7 +14,7 @@
  */
 @Api(tags = "鍏呭�煎崱淇℃伅")
 @Trace(exclude = true)
-@RestController
+//@RestController
 @RequestMapping("/web/card")
 @LoginRequired
 @Slf4j
diff --git a/server/dmmall_web/src/main/java/com/doumee/api/web/CoffeeBeanTaskApi.java b/server/dmmall_web/src/main/java/com/doumee/api/web/CoffeeBeanTaskApi.java
index 1b41bf3..7885e4d 100644
--- a/server/dmmall_web/src/main/java/com/doumee/api/web/CoffeeBeanTaskApi.java
+++ b/server/dmmall_web/src/main/java/com/doumee/api/web/CoffeeBeanTaskApi.java
@@ -20,7 +20,7 @@
  */
 @Api(tags = "鍜栬眴浠诲姟涓氬姟")
 @Trace(exclude = true)
-@RestController
+//@RestController
 @RequestMapping("/web/coffeeBeanTask")
 @Slf4j
 @LoginRequired
diff --git a/server/dmmall_web/src/main/java/com/doumee/api/web/CollectApi.java b/server/dmmall_web/src/main/java/com/doumee/api/web/CollectApi.java
index 655116e..5cbd493 100644
--- a/server/dmmall_web/src/main/java/com/doumee/api/web/CollectApi.java
+++ b/server/dmmall_web/src/main/java/com/doumee/api/web/CollectApi.java
@@ -4,13 +4,16 @@
 import com.doumee.core.annotation.pr.PreventRepeat;
 import com.doumee.core.model.ApiResponse;
 import com.doumee.dao.business.model.Collect;
+import com.doumee.dao.web.request.CollectSaveRequest;
 import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import org.apache.shiro.authz.annotation.RequiresPermissions;
-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.ArrayList;
+import java.util.List;
 
 
 /**
@@ -20,13 +23,48 @@
 @Api(tags = "鐢ㄦ埛鏀惰棌淇℃伅琛�")
 @RestController
 @RequestMapping("/web/collect")
-@LoginRequired
 public class CollectApi extends ApiController{
 
+    @LoginRequired
     @PreventRepeat
-    @ApiOperation("鏂板缓")
-    @PostMapping("/create")
-    public ApiResponse create(@RequestBody Collect collect) {
-        return ApiResponse.success(collectService.create(collect,getMemberId()));
+    @ApiOperation("鍒涘缓鏀惰棌")
+    @PostMapping("/saveCollect")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true),
+    })
+    public ApiResponse saveCollect(@RequestBody CollectSaveRequest request) {
+        collectService.saveCollect(request,getMemberId());
+        return ApiResponse.success("鎿嶄綔鎴愬姛");
     }
+
+
+    @LoginRequired
+    @ApiOperation("鍙栨秷鏀惰棌")
+    @GetMapping("/cancel/batch")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true),
+    })
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        collectService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @LoginRequired
+    @ApiOperation("鎴戠殑鏀惰棌")
+    @GetMapping("/myCollectList")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true),
+    })
+    public ApiResponse myCollectList(@RequestParam Integer type) {
+        return ApiResponse.success(collectService.myCollect(getMemberId(),type));
+    }
+
+
+
+
 }
diff --git a/server/dmmall_web/src/main/java/com/doumee/api/web/CouponApi.java b/server/dmmall_web/src/main/java/com/doumee/api/web/CouponApi.java
index 0825206..e8310e9 100644
--- a/server/dmmall_web/src/main/java/com/doumee/api/web/CouponApi.java
+++ b/server/dmmall_web/src/main/java/com/doumee/api/web/CouponApi.java
@@ -16,12 +16,9 @@
 import org.springframework.web.bind.annotation.RestController;
 
 @Api(tags = "浼樻儬鍒镐笟鍔�")
-@RestController
+//@RestController
 @RequestMapping("/web/coupon")
 public class CouponApi extends ApiController{
-
-
-
 
 
 
diff --git a/server/dmmall_web/src/main/java/com/doumee/api/web/CreationApplyApi.java b/server/dmmall_web/src/main/java/com/doumee/api/web/CreationApplyApi.java
index 4b5af83..e60be61 100644
--- a/server/dmmall_web/src/main/java/com/doumee/api/web/CreationApplyApi.java
+++ b/server/dmmall_web/src/main/java/com/doumee/api/web/CreationApplyApi.java
@@ -16,7 +16,7 @@
  * @date 2023/03/21 15:48
  */
 @Api(tags = "鍒涗綔涓績鐢充笟鍔�")
-@RestController
+//@RestController
 @RequestMapping("/web/creationApply")
 public class CreationApplyApi extends ApiController{
 
diff --git a/server/dmmall_web/src/main/java/com/doumee/api/web/LabelsApi.java b/server/dmmall_web/src/main/java/com/doumee/api/web/LabelsApi.java
index 9e84140..02f2c10 100644
--- a/server/dmmall_web/src/main/java/com/doumee/api/web/LabelsApi.java
+++ b/server/dmmall_web/src/main/java/com/doumee/api/web/LabelsApi.java
@@ -21,7 +21,7 @@
  */
 @Api(tags = "鏍囩淇℃伅琛ㄤ笟鍔�")
 @Trace(exclude = true)
-@RestController
+//@RestController
 @RequestMapping("/web/labels")
 @Slf4j
 public class LabelsApi  extends ApiController{
diff --git a/server/dmmall_web/src/main/java/com/doumee/api/web/MemberApi.java b/server/dmmall_web/src/main/java/com/doumee/api/web/MemberApi.java
index 5eaaa42..a97ba88 100644
--- a/server/dmmall_web/src/main/java/com/doumee/api/web/MemberApi.java
+++ b/server/dmmall_web/src/main/java/com/doumee/api/web/MemberApi.java
@@ -22,7 +22,7 @@
 @Api(tags = "鐢ㄦ埛member涓氬姟")
 @Trace(exclude = true)
 @LoginRequired
-@RestController
+//@RestController
 @RequestMapping("/web/member")
 @Slf4j
 public class MemberApi extends ApiController{
diff --git a/server/dmmall_web/src/main/java/com/doumee/api/web/NoticeApi.java b/server/dmmall_web/src/main/java/com/doumee/api/web/NoticeApi.java
index 5cd6e50..df5942a 100644
--- a/server/dmmall_web/src/main/java/com/doumee/api/web/NoticeApi.java
+++ b/server/dmmall_web/src/main/java/com/doumee/api/web/NoticeApi.java
@@ -16,7 +16,7 @@
 @Api(tags = "娑堟伅閫氱煡淇′笟鍔�")
 @Trace(exclude = true)
 @LoginRequired
-@RestController
+//@RestController
 @RequestMapping("/web/notice")
 @Slf4j
 public class NoticeApi extends ApiController{
diff --git a/server/dmmall_web/src/main/java/com/doumee/api/web/SharesApi.java b/server/dmmall_web/src/main/java/com/doumee/api/web/SharesApi.java
index 0990e6f..2613066 100644
--- a/server/dmmall_web/src/main/java/com/doumee/api/web/SharesApi.java
+++ b/server/dmmall_web/src/main/java/com/doumee/api/web/SharesApi.java
@@ -1,15 +1,20 @@
 package com.doumee.api.web;
 
+import com.doumee.config.annotation.LoginRequired;
 import com.doumee.core.annotation.trace.Trace;
 import com.doumee.core.model.ApiResponse;
 import com.doumee.dao.business.model.Shares;
+import com.doumee.dao.web.request.WxPhoneRequest;
+import com.doumee.dao.web.response.AccountResponse;
+import com.doumee.dao.web.response.InviteInfoResponse;
 import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
-import io.swagger.v3.oas.annotations.parameters.RequestBody;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
 
 @Api(tags = "鐢ㄦ埛鍒嗕韩涓氬姟")
 @Trace(exclude = true)
@@ -19,16 +24,38 @@
 public class SharesApi extends ApiController{
 
 
-    /**
-     * 鍒涘缓
-     *
-     * @param shares 瀹炰綋瀵硅薄
-     * @return Integer
-     */
-    @ApiOperation(value = "鐢ㄦ埛鍒涘缓鍒嗕韩", notes = "灏忕▼搴忕")
-    @GetMapping("/getMemberDTO")
-    public ApiResponse<Integer> create(@RequestBody Shares shares){
-        return ApiResponse.success(sharesService.create(shares,getMemberId()));
+//    /**
+//     * 鍒涘缓
+//     *
+//     * @param shares 瀹炰綋瀵硅薄
+//     * @return Integer
+//     */
+//    @ApiOperation(value = "鐢ㄦ埛鍒涘缓鍒嗕韩", notes = "灏忕▼搴忕")
+//    @GetMapping("/getMemberDTO")
+//    public ApiResponse<Integer> create(@RequestBody Shares shares){
+//        return ApiResponse.success(sharesService.create(shares,getMemberId()));
+//    }
+
+    @LoginRequired
+    @ApiOperation(value = "鑾峰彇閭�璇蜂俊鎭�", notes = "灏忕▼搴忕")
+    @GetMapping("/getInviteInfo")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true)
+    })
+    public ApiResponse<InviteInfoResponse> getInviteInfo() {
+        return  ApiResponse.success(inviteRecordService.getInviteInfo(getMemberId()));
     }
 
+
+    @LoginRequired
+    @ApiOperation(value = "鐢熸垚閭�璇锋捣鎶�", notes = "灏忕▼搴忕")
+    @GetMapping("/getShareImg")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true)
+    })
+    public ApiResponse<String> getShareImg()  throws Exception{
+        return  ApiResponse.success(inviteRecordService.createShareImg(getMemberId()));
+    }
+
+
 }
diff --git a/server/dmmall_web/src/main/java/com/doumee/api/web/ShopCommentApi.java b/server/dmmall_web/src/main/java/com/doumee/api/web/ShopCommentApi.java
index 2157a6c..2601c30 100644
--- a/server/dmmall_web/src/main/java/com/doumee/api/web/ShopCommentApi.java
+++ b/server/dmmall_web/src/main/java/com/doumee/api/web/ShopCommentApi.java
@@ -16,7 +16,7 @@
 
 @Api(tags = "鍟嗗璇勮绠$悊涓氬姟")
 @Trace(exclude = true)
-@RestController
+//@RestController
 @RequestMapping("/web/shopComment")
 @Slf4j
 public class ShopCommentApi extends ApiController{
diff --git a/server/dmmall_web/src/main/java/com/doumee/api/web/ShopFollowApi.java b/server/dmmall_web/src/main/java/com/doumee/api/web/ShopFollowApi.java
index 784df5d..5c91ae2 100644
--- a/server/dmmall_web/src/main/java/com/doumee/api/web/ShopFollowApi.java
+++ b/server/dmmall_web/src/main/java/com/doumee/api/web/ShopFollowApi.java
@@ -17,7 +17,7 @@
 
 @Api(tags = "搴楅摵鍏虫敞涓氬姟")
 @Trace(exclude = true)
-@RestController
+//@RestController
 @RequestMapping("/web/shopFollow")
 @Slf4j
 public class ShopFollowApi extends ApiController{
diff --git a/server/dmmall_web/src/main/java/com/doumee/api/web/ShopMenuApi.java b/server/dmmall_web/src/main/java/com/doumee/api/web/ShopMenuApi.java
index ce0d934..11fe647 100644
--- a/server/dmmall_web/src/main/java/com/doumee/api/web/ShopMenuApi.java
+++ b/server/dmmall_web/src/main/java/com/doumee/api/web/ShopMenuApi.java
@@ -15,7 +15,7 @@
 
 @Api(tags = "搴楅摵鑿滃搧涓氬姟")
 @Trace(exclude = true)
-@RestController
+//@RestController
 @RequestMapping("/web/shopMenu")
 @Slf4j
 public class ShopMenuApi extends ApiController{
diff --git a/server/dmmall_web/src/main/java/com/doumee/api/web/ShopNewsApi.java b/server/dmmall_web/src/main/java/com/doumee/api/web/ShopNewsApi.java
index 5e6de3f..a1b91c4 100644
--- a/server/dmmall_web/src/main/java/com/doumee/api/web/ShopNewsApi.java
+++ b/server/dmmall_web/src/main/java/com/doumee/api/web/ShopNewsApi.java
@@ -16,7 +16,7 @@
 
 @Api(tags = "鍟嗗鏂伴矞浜�")
 @Trace(exclude = true)
-@RestController
+//@RestController
 @RequestMapping("/web/shopNew")
 @Slf4j
 public class ShopNewsApi extends ApiController {
diff --git a/server/dmmall_web/src/main/java/com/doumee/api/web/SignupApi.java b/server/dmmall_web/src/main/java/com/doumee/api/web/SignupApi.java
index c8d9610..3358bdd 100644
--- a/server/dmmall_web/src/main/java/com/doumee/api/web/SignupApi.java
+++ b/server/dmmall_web/src/main/java/com/doumee/api/web/SignupApi.java
@@ -16,7 +16,7 @@
 
 @Api(tags = "绛惧埌涓氬姟")
 @Trace(exclude = true)
-@RestController
+//@RestController
 @RequestMapping("/web/signup")
 @Slf4j
 @LoginRequired
diff --git a/server/dmmall_web/src/main/java/com/doumee/api/web/ZanApi.java b/server/dmmall_web/src/main/java/com/doumee/api/web/ZanApi.java
index 347e3a5..619c970 100644
--- a/server/dmmall_web/src/main/java/com/doumee/api/web/ZanApi.java
+++ b/server/dmmall_web/src/main/java/com/doumee/api/web/ZanApi.java
@@ -18,7 +18,7 @@
  * @date 2023/03/21 15:48
  */
 @Api(tags = "鐢ㄦ埛鐐硅禐淇℃伅琛�")
-@RestController
+//@RestController
 @RequestMapping("/web/zan")
 public class ZanApi extends ApiController{
 
diff --git a/server/dmmall_web/src/main/java/com/doumee/api/web/mall/AftersaleApi.java b/server/dmmall_web/src/main/java/com/doumee/api/web/mall/AftersaleApi.java
index 31baf6c..2acd709 100644
--- a/server/dmmall_web/src/main/java/com/doumee/api/web/mall/AftersaleApi.java
+++ b/server/dmmall_web/src/main/java/com/doumee/api/web/mall/AftersaleApi.java
@@ -26,7 +26,7 @@
  */
 @Api(tags = "鍟嗗搧鍞悗")
 @Trace(exclude = true)
-@RestController
+//@RestController
 @RequestMapping("/web/aftersale")
 public class AftersaleApi extends ApiController {
     @Autowired
diff --git a/server/dmmall_web/src/main/java/com/doumee/api/web/mall/GoodsApi.java b/server/dmmall_web/src/main/java/com/doumee/api/web/mall/GoodsApi.java
index 5ee0dfc..151d927 100644
--- a/server/dmmall_web/src/main/java/com/doumee/api/web/mall/GoodsApi.java
+++ b/server/dmmall_web/src/main/java/com/doumee/api/web/mall/GoodsApi.java
@@ -44,9 +44,10 @@
     @ApiImplicitParams({
             @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true),
             @ApiImplicitParam(paramType = "query", dataType = "Integer", name = "goodsId", value = "鍟嗗搧涓婚敭", required = true),
+            @ApiImplicitParam(paramType = "query", dataType = "Integer", name = "memberId", value = "鐢ㄦ埛涓婚敭", required = true),
     })
-    public ApiResponse<GoodsInfoResponse> goodsInfo(@RequestParam Integer goodsId) {
-        GoodsInfoResponse goodsInfoResponse = goodsService.getGoodsInfo(goodsId);
+    public ApiResponse<GoodsInfoResponse> goodsInfo(@RequestParam Integer goodsId,Integer memberId) {
+        GoodsInfoResponse goodsInfoResponse = goodsService.getGoodsInfo(goodsId,memberId);
         return ApiResponse.success("鏌ヨ鎴愬姛",goodsInfoResponse);
     }
 
diff --git a/server/pom.xml b/server/pom.xml
index b078b94..98782a5 100644
--- a/server/pom.xml
+++ b/server/pom.xml
@@ -40,7 +40,7 @@
     <!-- hutool 宸ュ叿鐩稿叧-->
     <hutool.version>5.5.8</hutool.version>
     <!-- 寰俊灏忕▼搴� -->
-    <weixin-java-miniapp.version>4.1.0</weixin-java-miniapp.version>
+    <weixin-java-miniapp.version>4.7.8-20251023.110018</weixin-java-miniapp.version>
     <!-- 寰俊鏀粯 -->
     <weixin-java-pay.version>4.1.0</weixin-java-pay.version>
     <!-- 闃块噷浜慜SS瀛樺偍 -->
@@ -270,6 +270,20 @@
       <artifactId>rocketmq-client-java</artifactId>
       <version>5.0.4</version>
     </dependency>
+
+    <!--鍥剧墖鍘嬬缉-->
+    <dependency>
+      <groupId>net.coobird</groupId>
+      <artifactId>thumbnailator</artifactId>
+      <version>0.4.20</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.jsoup</groupId>
+      <artifactId>jsoup</artifactId>
+      <version>1.15.3</version>
+    </dependency>
+
     <!--<dependency>
       <groupId>com.aliyun.openservices</groupId>
       <artifactId>ons-client</artifactId>

--
Gitblit v1.9.3