xin
2025-06-04 9931d6f56816aecb09333cef2d12777c08793547
系统:订阅消息列表
7 files added
5 files modified
380 ■■■■■ changed files
oying-system/src/main/java/com/oying/modules/security/service/WeiXinService.java 32 ●●●● patch | view | raw | blame | history
oying-system/src/main/java/com/oying/modules/system/domain/UserSubscribe.java 57 ●●●●● patch | view | raw | blame | history
oying-system/src/main/java/com/oying/modules/system/domain/dto/UserSubscribeQueryCriteria.java 30 ●●●●● patch | view | raw | blame | history
oying-system/src/main/java/com/oying/modules/system/mapper/UserMapper.java 2 ●●●●● patch | view | raw | blame | history
oying-system/src/main/java/com/oying/modules/system/mapper/UserSubscribeMapper.java 22 ●●●●● patch | view | raw | blame | history
oying-system/src/main/java/com/oying/modules/system/rest/UserSubscribeController.java 54 ●●●●● patch | view | raw | blame | history
oying-system/src/main/java/com/oying/modules/system/service/UserService.java 2 ●●●●● patch | view | raw | blame | history
oying-system/src/main/java/com/oying/modules/system/service/UserSubscribeService.java 53 ●●●●● patch | view | raw | blame | history
oying-system/src/main/java/com/oying/modules/system/service/impl/UserServiceImpl.java 5 ●●●●● patch | view | raw | blame | history
oying-system/src/main/java/com/oying/modules/system/service/impl/UserSubscribeServiceImpl.java 74 ●●●●● patch | view | raw | blame | history
oying-system/src/main/resources/mapper/system/UserMapper.xml 9 ●●●●● patch | view | raw | blame | history
oying-system/src/main/resources/mapper/system/UserSubscribeMapper.xml 40 ●●●●● patch | view | raw | blame | history
oying-system/src/main/java/com/oying/modules/security/service/WeiXinService.java
@@ -2,6 +2,10 @@
import com.alibaba.fastjson2.JSONObject;
import com.oying.modules.security.config.WeiXinProperties;
import com.oying.modules.system.domain.User;
import com.oying.modules.system.domain.UserSubscribe;
import com.oying.modules.system.service.UserService;
import com.oying.modules.system.service.UserSubscribeService;
import com.oying.utils.HttpRequest;
import com.oying.utils.RedisUtils;
import lombok.extern.slf4j.Slf4j;
@@ -24,6 +28,10 @@
    private RedisUtils redisUtils;
    @Value("${wx.enabled}")
    private Boolean wxEnabled;
    @Resource
    private UserSubscribeService subscribeService;
    @Resource
    private UserService userService;
    /**
     * POST 获取稳定版接口调用凭据 获取小程序全局唯一后台接口调用凭据,token有效期为7200s,开发者需要进行妥善保存。
@@ -82,21 +90,29 @@
     * POST 该接口用于发送订阅消息。
     *
     * @param data 请求参数
     * @param openId 用户openId
     * @param openid     用户openId
     * @param templateId 订阅模板id
     * @param page 小程序跳转链接
     * @return JSONObject
     */
    public JSONObject sendMessage(Map<String, Object> data, String openId, String templateId, String page) {
    public void sendMessage(Map<String, Object> data, String openid, String templateId, String page) {
        JSONObject jsonObject = new JSONObject();
        if (wxEnabled) {
            String url = weiXinProperties.getSendMessage();
            url = url.replace("{accessToken}", getStableAccessToken());
            Map<String, Object> map = getSendMessageDto(data, openId, templateId, page);
            return HttpRequest.exchangeJsonObject(HttpMethod.POST, url, map);
        }
        JSONObject jsonObject = new JSONObject();
            Map<String, Object> map = getSendMessageDto(data, openid, templateId, page);
            jsonObject = HttpRequest.exchangeJsonObject(HttpMethod.POST, url, map);
        } else {
        jsonObject.put("message", "测试环境");
        return jsonObject;
        }
        User user = userService.findByOpenid(openid);
        UserSubscribe sub = new UserSubscribe();
        sub.setSubType(templateId);
        sub.setUserId(user.getId());
        sub.setOpenid(openid);
        sub.setUsername(user.getUsername());
        sub.setSendMessage(JSONObject.toJSONString(data));
        sub.setSubMessage(jsonObject.toJSONString());
        subscribeService.save(sub);
    }
    private Map<String, Object> getSendMessageDto(Map<String, Object> data, String openId, String templateId, String page) {
oying-system/src/main/java/com/oying/modules/system/domain/UserSubscribe.java
New file
@@ -0,0 +1,57 @@
package com.oying.modules.system.domain;
import com.oying.base.BaseEntity;
import cn.hutool.core.bean.BeanUtil;
import io.swagger.annotations.ApiModelProperty;
import cn.hutool.core.bean.copier.CopyOptions;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Getter;
import lombok.Setter;
/**
* @description /
* @author lixin
* @date 2025-06-04
**/
@Getter
@Setter
@TableName("sys_user_subscribe")
public class UserSubscribe extends BaseEntity implements Serializable {
    @TableId(value = "sub_id", type = IdType.AUTO)
    @ApiModelProperty(value = "主键")
    private Long subId;
    @NotBlank
    @ApiModelProperty(value = "消息类型")
    private String subType;
    @NotNull
    @ApiModelProperty(value = "用户ID")
    private Long userId;
    @NotBlank
    @ApiModelProperty(value = "openid")
    private String openid;
    @NotBlank
    @ApiModelProperty(value = "账号")
    private String username;
    @NotBlank
    @ApiModelProperty(value = "发送消息")
    private String sendMessage;
    @NotBlank
    @ApiModelProperty(value = "返回消息")
    private String subMessage;
    public void copy(UserSubscribe source){
        BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true));
    }
}
oying-system/src/main/java/com/oying/modules/system/domain/dto/UserSubscribeQueryCriteria.java
New file
@@ -0,0 +1,30 @@
package com.oying.modules.system.domain.dto;
import lombok.Data;
import java.sql.Timestamp;
import java.util.List;
import io.swagger.annotations.ApiModelProperty;
/**
* @author lixin
* @date 2025-06-04
**/
@Data
public class UserSubscribeQueryCriteria{
    @ApiModelProperty(value = "页码", example = "1")
    private Integer page = 1;
    @ApiModelProperty(value = "每页数据量", example = "10")
    private Integer size = 10;
    @ApiModelProperty(value = "消息类型")
    private String subType;
    @ApiModelProperty(value = "openid")
    private String openid;
    @ApiModelProperty(value = "手机号")
    private String phone;
    private List<Timestamp> createTime;
}
oying-system/src/main/java/com/oying/modules/system/mapper/UserMapper.java
@@ -27,6 +27,8 @@
    User findByUsername(@Param("username") String username);
    User findByOpenid(@Param("openid") String openid);
    User findByEmail(@Param("email") String email);
    User findByPhone(@Param("phone") String phone);
oying-system/src/main/java/com/oying/modules/system/mapper/UserSubscribeMapper.java
New file
@@ -0,0 +1,22 @@
package com.oying.modules.system.mapper;
import com.oying.modules.system.domain.UserSubscribe;
import com.oying.modules.system.domain.dto.UserSubscribeQueryCriteria;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
/**
* @author lixin
* @date 2025-06-04
**/
@Mapper
public interface UserSubscribeMapper extends BaseMapper<UserSubscribe> {
    IPage<UserSubscribe> findAll(@Param("criteria") UserSubscribeQueryCriteria criteria, Page<Object> page);
    List<UserSubscribe> findAll(@Param("criteria") UserSubscribeQueryCriteria criteria);
}
oying-system/src/main/java/com/oying/modules/system/rest/UserSubscribeController.java
New file
@@ -0,0 +1,54 @@
package com.oying.modules.system.rest;
import com.oying.annotation.Log;
import com.oying.modules.system.domain.UserSubscribe;
import com.oying.modules.system.service.UserSubscribeService;
import com.oying.modules.system.domain.dto.UserSubscribeQueryCriteria;
import lombok.RequiredArgsConstructor;
import java.util.List;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import io.swagger.annotations.*;
import java.io.IOException;
import javax.servlet.http.HttpServletResponse;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.oying.utils.PageResult;
/**
* @author lixin
* @date 2025-06-04
**/
@RestController
@RequiredArgsConstructor
@Api(tags = "系统:订阅消息列表")
@RequestMapping("/api/userSubscribe")
public class UserSubscribeController {
    private final UserSubscribeService userSubscribeService;
    @ApiOperation("导出数据")
    @GetMapping(value = "/download")
    @PreAuthorize("@el.check('userSubscribe:list')")
    public void exportUserSubscribe(HttpServletResponse response, UserSubscribeQueryCriteria criteria) throws IOException {
        userSubscribeService.download(userSubscribeService.queryAll(criteria), response);
    }
    @GetMapping
    @ApiOperation("查询订阅消息")
    @PreAuthorize("@el.check('userSubscribe:list')")
    public ResponseEntity<PageResult<UserSubscribe>> queryUserSubscribe(UserSubscribeQueryCriteria criteria){
        Page<Object> page = new Page<>(criteria.getPage(), criteria.getSize());
        return new ResponseEntity<>(userSubscribeService.queryAll(criteria,page),HttpStatus.OK);
    }
    @DeleteMapping
    @Log("删除订阅消息")
    @ApiOperation("删除订阅消息")
    @PreAuthorize("@el.check('userSubscribe:del')")
    public ResponseEntity<Object> deleteUserSubscribe(@ApiParam(value = "传ID数组[]") @RequestBody List<Long> ids) {
        userSubscribeService.deleteAll(ids);
        return new ResponseEntity<>(HttpStatus.OK);
    }
}
oying-system/src/main/java/com/oying/modules/system/service/UserService.java
@@ -53,6 +53,8 @@
     */
    User findByName(String userName);
    User findByOpenid(String openId);
    /**
     * 根据用户名查询
     * @param userName /
oying-system/src/main/java/com/oying/modules/system/service/UserSubscribeService.java
New file
@@ -0,0 +1,53 @@
package com.oying.modules.system.service;
import com.oying.modules.system.domain.UserSubscribe;
import com.oying.modules.system.domain.dto.UserSubscribeQueryCriteria;
import java.util.List;
import java.io.IOException;
import javax.servlet.http.HttpServletResponse;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.oying.utils.PageResult;
/**
* @description 服务接口
* @author lixin
* @date 2025-06-04
**/
public interface UserSubscribeService extends IService<UserSubscribe> {
    /**
    * 查询数据分页
    * @param criteria 条件
    * @param page 分页参数
    * @return PageResult
    */
    PageResult<UserSubscribe> queryAll(UserSubscribeQueryCriteria criteria, Page<Object> page);
    /**
    * 查询所有数据不分页
    * @param criteria 条件参数
    * @return List<UserSubscribeDto>
    */
    List<UserSubscribe> queryAll(UserSubscribeQueryCriteria criteria);
    /**
    * 创建
    * @param resources /
    */
    void create(UserSubscribe resources);
    /**
    * 多选删除
    * @param ids /
    */
    void deleteAll(List<Long> ids);
    /**
    * 导出数据
    * @param all 待导出的数据
    * @param response /
    * @throws IOException /
    */
    void download(List<UserSubscribe> all, HttpServletResponse response) throws IOException;
}
oying-system/src/main/java/com/oying/modules/system/service/impl/UserServiceImpl.java
@@ -178,6 +178,11 @@
    }
    @Override
    public User findByOpenid(String openid) {
        return userMapper.findByOpenid(openid);
    }
    @Override
    public User getLoginData(String userName) {
        return userMapper.findByUsername(userName);
    }
oying-system/src/main/java/com/oying/modules/system/service/impl/UserSubscribeServiceImpl.java
New file
@@ -0,0 +1,74 @@
package com.oying.modules.system.service.impl;
import com.oying.modules.system.domain.UserSubscribe;
import com.oying.utils.FileUtil;
import lombok.RequiredArgsConstructor;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.oying.modules.system.service.UserSubscribeService;
import com.oying.modules.system.domain.dto.UserSubscribeQueryCriteria;
import com.oying.modules.system.mapper.UserSubscribeMapper;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.oying.utils.PageUtil;
import java.util.List;
import java.util.Map;
import java.io.IOException;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import com.oying.utils.PageResult;
/**
* @description 服务实现
* @author lixin
* @date 2025-06-04
**/
@Service
@RequiredArgsConstructor
public class UserSubscribeServiceImpl extends ServiceImpl<UserSubscribeMapper, UserSubscribe> implements UserSubscribeService {
    private final UserSubscribeMapper userSubscribeMapper;
    @Override
    public PageResult<UserSubscribe> queryAll(UserSubscribeQueryCriteria criteria, Page<Object> page){
        return PageUtil.toPage(userSubscribeMapper.findAll(criteria, page));
    }
    @Override
    public List<UserSubscribe> queryAll(UserSubscribeQueryCriteria criteria){
        return userSubscribeMapper.findAll(criteria);
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void create(UserSubscribe resources) {
        userSubscribeMapper.insert(resources);
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void deleteAll(List<Long> ids) {
        userSubscribeMapper.deleteBatchIds(ids);
    }
    @Override
    public void download(List<UserSubscribe> all, HttpServletResponse response) throws IOException {
        List<Map<String, Object>> list = new ArrayList<>();
        for (UserSubscribe userSubscribe : all) {
            Map<String, Object> map = new LinkedHashMap<>();
            map.put("消息类型", userSubscribe.getSubType());
            map.put("用户ID", userSubscribe.getUserId());
            map.put("openid", userSubscribe.getOpenid());
            map.put("手机号", userSubscribe.getUsername());
            map.put("发送消息", userSubscribe.getSendMessage());
            map.put("返回消息", userSubscribe.getSubMessage());
            map.put("创建者", userSubscribe.getCreateBy());
            map.put("创建时间", userSubscribe.getCreateTime());
            map.put("修改者", userSubscribe.getUpdateBy());
            map.put("修改时间", userSubscribe.getUpdateTime());
            list.add(map);
        }
        FileUtil.downloadExcel(list, response);
    }
}
oying-system/src/main/resources/mapper/system/UserMapper.xml
@@ -116,6 +116,15 @@
        where u.username = #{username}
    </select>
    <select id="findByOpenid" resultMap="BaseResultMap">
        select
        u.password user_password, u.is_admin user_is_admin,
        <include refid="Base_Column_List"/>
        from sys_user u
        left join sys_dept d on u.dept_id = d.dept_id
        where u.openid = #{openid}
    </select>
    <select id="findByEmail" resultType="com.oying.modules.system.domain.User">
        select user_id as id, username from sys_user
        where email = #{email}
oying-system/src/main/resources/mapper/system/UserSubscribeMapper.xml
New file
@@ -0,0 +1,40 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.oying.modules.system.mapper.UserSubscribeMapper">
    <resultMap id="BaseResultMap" type="com.oying.modules.system.domain.UserSubscribe">
        <id column="sub_id" property="subId"/>
        <result column="sub_type" property="subType"/>
        <result column="user_id" property="userId"/>
        <result column="openid" property="openid"/>
        <result column="username" property="username"/>
        <result column="send_message" property="sendMessage"/>
        <result column="sub_message" property="subMessage"/>
        <result column="create_by" property="createBy"/>
        <result column="create_time" property="createTime"/>
        <result column="update_by" property="updateBy"/>
        <result column="update_time" property="updateTime"/>
    </resultMap>
    <sql id="Base_Column_List">
        sub_id, sub_type, user_id, openid, username, send_message, sub_message, create_by, create_time, update_by, update_time
    </sql>
    <select id="findAll" resultMap="BaseResultMap">
        select
        <include refid="Base_Column_List"/>
        from sys_user_subscribe
        <where>
            <if test="criteria.subType != null">
                and sub_type = #{criteria.subType}
            </if>
            <if test="criteria.blurry != null and criteria.blurry != ''">
                and (openid like concat('%',#{criteria.openid},'%')
                or username like concat('%',#{criteria.username},'%'))
            </if>
            <if test="criteria.createTime != null and criteria.createTime.size() > 0">
                AND create_time BETWEEN #{criteria.createTime[0]} AND #{criteria.createTime[1]}
            </if>
        </where>
        order by sub_id desc
    </select>
</mapper>