zxy 1 rok pred
rodič
commit
881879cfbe
28 zmenil súbory, kde vykonal 942 pridanie a 572 odobranie
  1. 229 545
      naqwzsjtj/naqwzsjtj/package-lock.json
  2. 0 1
      naqwzsjtj/naqwzsjtj/package.json
  3. 19 1
      naqwzsjtj/naqwzsjtj/src/router/index.js
  4. 67 0
      naqwzsjtj/naqwzsjtj/src/views/messagePush/MessagePush.vue
  5. 145 0
      naqwzsjtj/naqwzsjtj/src/views/messagePush/PushMessageDialog.vue
  6. 14 14
      nngkxxdp/src/main/java/com/example/nngkxxdp/NngkxxdpApplication.java
  7. 1 1
      nngkxxdp/src/main/java/com/example/nngkxxdp/configer/ProxyServletConfiguration.java
  8. 30 0
      nngkxxdp/src/main/java/com/example/nngkxxdp/program/controller/EventController.java
  9. 19 0
      nngkxxdp/src/main/java/com/example/nngkxxdp/program/controller/EventPushRecordController.java
  10. 35 0
      nngkxxdp/src/main/java/com/example/nngkxxdp/program/controller/MessagePushController.java
  11. 5 0
      nngkxxdp/src/main/java/com/example/nngkxxdp/program/dao/AppletUserDao.java
  12. 34 0
      nngkxxdp/src/main/java/com/example/nngkxxdp/program/dao/EventDao.java
  13. 12 0
      nngkxxdp/src/main/java/com/example/nngkxxdp/program/dao/EventPushRecordDao.java
  14. 11 0
      nngkxxdp/src/main/java/com/example/nngkxxdp/program/entity/DTO/Field.java
  15. 18 0
      nngkxxdp/src/main/java/com/example/nngkxxdp/program/entity/DTO/PushMessageDTO.java
  16. 25 0
      nngkxxdp/src/main/java/com/example/nngkxxdp/program/entity/Event.java
  17. 33 0
      nngkxxdp/src/main/java/com/example/nngkxxdp/program/entity/EventPushRecord.java
  18. 9 0
      nngkxxdp/src/main/java/com/example/nngkxxdp/program/service/AppletUserService.java
  19. 9 0
      nngkxxdp/src/main/java/com/example/nngkxxdp/program/service/EventPushRecordService.java
  20. 12 0
      nngkxxdp/src/main/java/com/example/nngkxxdp/program/service/EventService.java
  21. 21 0
      nngkxxdp/src/main/java/com/example/nngkxxdp/program/service/Impl/AppletUserServiceImpl.java
  22. 19 0
      nngkxxdp/src/main/java/com/example/nngkxxdp/program/service/Impl/EventPushRecordServiceImpl.java
  23. 28 0
      nngkxxdp/src/main/java/com/example/nngkxxdp/program/service/Impl/EventServiceImpl.java
  24. 109 0
      nngkxxdp/src/main/java/com/example/nngkxxdp/program/util/WxMessageUtil.java
  25. 1 7
      nngkxxdp/src/main/resources/application-dev.yml
  26. 16 0
      nngkxxdp/src/main/resources/mapper/EventDao.xml
  27. 18 0
      nngkxxdp/src/main/resources/mapper/EventPushRecordDao.xml
  28. 3 3
      nnzwminiapp/pages/myCenter/myCenter.js

Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 229 - 545
naqwzsjtj/naqwzsjtj/package-lock.json


+ 0 - 1
naqwzsjtj/naqwzsjtj/package.json

@@ -26,7 +26,6 @@
   },
   "devDependencies": {
     "@vue/cli-plugin-babel": "~4.5.15",
-    "@vue/cli-plugin-eslint": "~4.5.15",
     "@vue/cli-plugin-router": "~4.5.15",
     "@vue/cli-service": "~4.5.15",
     "@vue/eslint-config-prettier": "^6.0.0",

+ 19 - 1
naqwzsjtj/naqwzsjtj/src/router/index.js

@@ -369,9 +369,27 @@ export const constantRoutes = [{
         meta: {
           title: '纠错统计'
         }
-      }
+      },
     ]
   },
+  {
+    path: '/messagePush',
+    component: Layout,
+    redirect: '/messagePush/MessagePush',
+    name: 'MessagePush',
+    meta: {
+      title: '订阅消息',
+      icon: 'el-icon-message-solid'
+    },
+    children: [{
+        path: 'messagePush',
+        component: () => import('@/views/messagePush/MessagePush.vue'),
+        name: 'MessagePush',
+        meta: {
+          title: '订阅消息'
+        }
+      }]
+  },
 ]
 
 export const asyncRoutes = []

+ 67 - 0
naqwzsjtj/naqwzsjtj/src/views/messagePush/MessagePush.vue

@@ -0,0 +1,67 @@
+<template>
+  <div style="padding: 10px;">
+    <div>
+      <el-button @click="openDialog" type="primary">推送消息</el-button>
+    </div>
+    <el-table :data="tableData" style="width: 100%">
+      <el-table-column prop="date" label="日期" width="180"></el-table-column>
+      <el-table-column prop="name" label="姓名" width="180"></el-table-column>
+      <el-table-column prop="address" label="地址"></el-table-column>
+    </el-table>
+    <el-pagination
+        @size-change="handleSizeChange"
+        @current-change="handleCurrentChange"
+        :current-page.sync="currentPage"
+        :page-sizes="[10, 20, 30, 40, 50]"
+        :page-size="pageSize"
+        layout="prev,pager,next,jumper, total,sizes"
+        :total="total">
+    </el-pagination>
+    <!-- 推送订阅消息弹窗 -->
+    <PushMessageDialog ref="pushMessageDialog"></PushMessageDialog>
+  </div>
+</template>
+
+<script>
+import PushMessageDialog from './PushMessageDialog';
+import request from '../../utils/request.js';
+
+export default {
+  name: "MessagePush",
+  components: {PushMessageDialog},
+  data() {
+    return {
+      tableData: [],
+      currentPage: 1,
+      pageSize: 10,
+      total: 0
+    }
+  },
+  created() {
+    this.loadData()
+  },
+  methods: {
+    loadData() {
+      let _this = this;
+      /*request.get('api/event/page?page=' + _this.currentPage + "&limit=" + _this.pageSize).then(res => {
+        console.log(res)
+      })*/
+    },
+    handleSizeChange(pageSize) {
+      this.pageSize = pageSize
+      this.loadData()
+    },
+    handleCurrentChange(currentPage) {
+      this.currentPage = currentPage
+      this.loadData()
+    },
+    openDialog() {
+      this.$refs.pushMessageDialog.dialogVisible = true
+    }
+  }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 145 - 0
naqwzsjtj/naqwzsjtj/src/views/messagePush/PushMessageDialog.vue

@@ -0,0 +1,145 @@
+<template>
+  <div>
+    <el-dialog
+        title="推送订阅消息"
+        :visible.sync="dialogVisible"
+        width="70%">
+      <el-form :model="formData" :rules="rules" ref="pushForm" class="demo-form-inline" label-width='100px'>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="事件标题:" prop="eventTitle">
+              <el-input v-model="formData.eventTitle" placeholder="请输入事件标题"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="消息模板:" prop="priTmplId">
+              <el-select @change="priTmplIdChange" v-model="formData.priTmplId" placeholder="请选择订阅消息模板">
+                <el-option
+                    v-for="item in msgTemplateList"
+                    :key="item.priTmplId"
+                    :label="item.title"
+                    :value="item.priTmplId">
+                </el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="跳转地址:" prop="urlLink">
+              <el-input v-model="formData.urlLink" placeholder="请输入点击跳转地址"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="12" v-for="field in formData.fieldList" :key="field.key">
+            <el-form-item :label="field.label+':'" :prop="field.key">
+              <el-input v-model="field.value" :placeholder="'请输入'+field.label"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <div slot='footer' class='dialog-footer'>
+        <el-button @click="dialogVisible = false">取 消</el-button>
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import request from '../../utils/request.js'
+
+export default {
+  name: "PushMessageDialog",
+  watch: {
+    //监听dialog关闭清空表单
+    dialogVisible: {
+      // eslint-disable-next-line no-unused-vars
+      handler(newval, oldval) {
+        if (!newval) {
+          this.formData.fieldList = []
+          this.formData.priTmplId = ''
+          this.formData.urlLink = ''
+        }
+      }
+    }
+  },
+  data() {
+    return {
+      dialogVisible: false,
+      msgTemplateList: [],
+      formData: {
+        eventTitle: '',
+        priTmplId: '',
+        urlLink: '',
+        fieldList: []
+      },
+      rules: {
+        eventTitle: [
+          {required: true, message: '请输入事件标题', trigger: 'blur'},
+        ],
+        priTmplId: [
+          {required: true, message: '请选择订阅消息模板', trigger: 'blur'},
+        ],
+        urlLink: [
+          {required: true, message: '请输入点击跳转地址', trigger: 'blur'},
+        ]
+      }
+    }
+  },
+  created() {
+    this.loadMsgTemplateList()
+  },
+  methods: {
+    loadMsgTemplateList() {
+      request.get('msg/getMsgTemplate').then(res => {
+        if (!res.data.result) {
+          this.$message.error('订阅消息模板加载失败:' + res.data.msg);
+        }
+        this.msgTemplateList = res.data.data
+      })
+    },
+    priTmplIdChange() {
+      let _this = this
+      let msgTemplate = _this.msgTemplateList.filter(msgTemplate => msgTemplate.priTmplId == _this.formData.priTmplId)[0]
+      let fieldList = msgTemplate.content.split('\n');
+      fieldList = fieldList.filter(field => field).map(field => {
+        //field数据是'文书名称:{{thing1.DATA}}',需要处理一哈
+        let label = field.split(':{{') [0]
+        let key = field.substr(field.lastIndexOf('{') + 1, field.indexOf('}')).split(".")[0]
+        return {'label': label, 'key': key, value: ''}
+      })
+      _this.formData.fieldList = fieldList
+      //添加表单验证
+      /*_this.formData.fieldList.forEach((t,i) => {
+        _this.rules[t.key] = [
+          {required: true, message: '请输入' + t.label, trigger: 'blur'},
+        ]
+      })*/
+      _this.$forceUpdate
+    },
+    submitForm() {
+      let _this = this
+      _this.formData.templateId = _this.formData.priTmplId
+      _this.formData.content = _this.formData.fieldList
+      _this.$refs.pushForm.validate((valid) => {
+        if (valid) {
+          request.post('msg/pushMessage',_this.formData).then(res => {
+            if (!res.data.result) {
+              this.$message.error('推送订阅消息失败:' + res.data.msg);
+            } else {
+              this.$message.error('推送订阅消息成功。');
+            }
+          })
+          return true;
+        } else {
+          return false;
+        }
+      })
+    }
+  }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 14 - 14
nngkxxdp/src/main/java/com/example/nngkxxdp/NngkxxdpApplication.java

@@ -17,8 +17,8 @@ import org.springframework.scheduling.annotation.EnableScheduling;
 @MapperScan({"com.example.nngkxxdp.dao", "com.example.nngkxxdp.program.dao"})
 public class NngkxxdpApplication {
 
-    @Value("${http.port}")
-    private Integer port;
+//    @Value("${http.port}")
+//    private Integer port;
 
 
 
@@ -27,16 +27,16 @@ public class NngkxxdpApplication {
     }
 
 //    前面基本一致,只不过注入了一个http端口,主要改下面
-    @Bean
-    public ServletWebServerFactory servletContainer() {
-        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
-        tomcat.addAdditionalTomcatConnectors(createStandardConnector()); // 添加http
-        return tomcat;
-    }
-    // 配置http
-    private Connector createStandardConnector() {
-        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
-        connector.setPort(port);
-        return connector;
-    }
+//    @Bean
+//    public ServletWebServerFactory servletContainer() {
+//        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
+//        tomcat.addAdditionalTomcatConnectors(createStandardConnector()); // 添加http
+//        return tomcat;
+//    }
+//    // 配置http
+//    private Connector createStandardConnector() {
+//        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
+//        connector.setPort(port);
+//        return connector;
+//    }
 }

+ 1 - 1
nngkxxdp/src/main/java/com/example/nngkxxdp/configer/ProxyServletConfiguration.java

@@ -16,7 +16,7 @@ import java.util.HashMap;
 import java.util.Map;
 
 
-@Configuration
+//@Configuration
 public class ProxyServletConfiguration {
     /**
      * 读取配置文件中路由设置

+ 30 - 0
nngkxxdp/src/main/java/com/example/nngkxxdp/program/controller/EventController.java

@@ -0,0 +1,30 @@
+package com.example.nngkxxdp.program.controller;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.example.nngkxxdp.program.constant.MiniConstant;
+import com.example.nngkxxdp.program.service.EventService;
+import com.example.nngkxxdp.util.SendUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.Map;
+
+
+@Slf4j
+@RestController()
+@RequestMapping("/api/event")
+public class EventController {
+
+    @Resource
+    private EventService eventService;
+
+    @GetMapping("/page")
+    public Map<String, Object> page(Integer page, Integer limit, String eventTitle) {
+        if (ObjectUtil.hasEmpty(page, limit)) {
+            return SendUtil.send(false, "", MiniConstant.REQUEST_WRONGPARAMS);
+        }
+        return eventService.page(page, limit, eventTitle);
+    }
+
+}

+ 19 - 0
nngkxxdp/src/main/java/com/example/nngkxxdp/program/controller/EventPushRecordController.java

@@ -0,0 +1,19 @@
+package com.example.nngkxxdp.program.controller;
+
+import com.example.nngkxxdp.program.service.EventPushRecordService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+
+@Slf4j
+@RestController()
+@RequestMapping("/api/eventPushRecord")
+public class EventPushRecordController {
+
+    @Resource
+    private EventPushRecordService eventPushRecordService;
+
+
+}

+ 35 - 0
nngkxxdp/src/main/java/com/example/nngkxxdp/program/controller/MessagePushController.java

@@ -0,0 +1,35 @@
+package com.example.nngkxxdp.program.controller;
+
+import com.example.nngkxxdp.program.entity.DTO.PushMessageDTO;
+import com.example.nngkxxdp.program.util.WxMessageUtil;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/msg")
+public class MessagePushController {
+
+    @Resource
+    WxMessageUtil wxMessageUtil;
+
+    /**
+     * 获取订阅消息模板列表
+     * @return
+     */
+    @GetMapping("/getMsgTemplate")
+    public Map<String, Object> getMsgTemplate() {
+        return wxMessageUtil.getMsgTemplate();
+    }
+
+    /**
+     * 推送订阅消息
+     * @param pushMessageDTO
+     * @return
+     */
+    @PostMapping("/pushMessage")
+    public Map<String, Object> pushMessage(@RequestBody PushMessageDTO pushMessageDTO) {
+        return wxMessageUtil.pushMessage(pushMessageDTO);
+    }
+}

+ 5 - 0
nngkxxdp/src/main/java/com/example/nngkxxdp/program/dao/AppletUserDao.java

@@ -3,7 +3,9 @@ package com.example.nngkxxdp.program.dao;
 import com.example.nngkxxdp.program.entity.AppletUser;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
 
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -45,4 +47,7 @@ public interface AppletUserDao {
 
     String findUser(@Param("phoneNum") String phoneNum);
 
+    @Select("SELECT * FROM applet_user LIMIT #{page},#{size}")
+    List<AppletUser> queryPage(@Param("page") Integer page,@Param("size") Integer size);
+
 }

+ 34 - 0
nngkxxdp/src/main/java/com/example/nngkxxdp/program/dao/EventDao.java

@@ -0,0 +1,34 @@
+package com.example.nngkxxdp.program.dao;
+
+import com.example.nngkxxdp.program.entity.Event;
+import org.apache.ibatis.annotations.Insert;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.SelectKey;
+
+import java.util.List;
+
+public interface EventDao {
+
+    @Insert("INSERT INTO `nazw`.`t_event` (`event_title`, `template_id`, `template_content`, `link_url`, `create_time`)" +
+            " VALUES (#{eventTitle}, #{templateId}, #{templateContent}, #{linkUrl}, #{createTime})")
+    @SelectKey(statement = "SELECT LAST_INSERT_ID()", keyProperty = "id", keyColumn = "id", before = false, resultType = Integer.class)
+    Integer add(Event event);
+
+    @Select("<script>" +
+            "SELECT * FROM t_event where 1 = 1" +
+            "<if test=\"eventTitle != null and eventTitle != ''\">" +
+            " AND event_title LIKE CONCAT('%',#{title},'%')" +
+            "</if>" +
+            " LIMIT #{startRow},#{limit}" +
+            "</script>")
+    List<Event> page(@Param("startRow") Integer startRow, @Param("limit") Integer limit, @Param("eventTitle") String eventTitle);
+
+    @Select("<script>" +
+            "SELECT COUNT(1) FROM t_event where 1 = 1" +
+            "<if test=\"eventTitle != null and eventTitle != ''\">" +
+            " AND event_title LIKE CONCAT('%',#{title},'%')" +
+            "</if>" +
+            "</script>")
+    long pageCount(@Param("eventTitle")String eventTitle);
+}

+ 12 - 0
nngkxxdp/src/main/java/com/example/nngkxxdp/program/dao/EventPushRecordDao.java

@@ -0,0 +1,12 @@
+package com.example.nngkxxdp.program.dao;
+
+import com.example.nngkxxdp.program.entity.EventPushRecord;
+import org.apache.ibatis.annotations.Insert;
+
+public interface EventPushRecordDao  {
+
+    @Insert("INSERT INTO `nazw`.`t_event_push_record` (`event_id`, `user_nickname`, `name`, `user_phone`, `user_openid`," +
+            " `push_status`, `err_code`, `err_msg`, `push_time`)" +
+            " VALUES (#{eventId}, #{userNickname}, #{name}, #{userPhone}, #{userOpenid}, #{pushStatus}, #{errCode}, #{errMsg}, #{pushTime})")
+    int add(EventPushRecord eventPushRecord);
+}

+ 11 - 0
nngkxxdp/src/main/java/com/example/nngkxxdp/program/entity/DTO/Field.java

@@ -0,0 +1,11 @@
+package com.example.nngkxxdp.program.entity.DTO;
+
+import lombok.Data;
+
+@Data
+public class Field {
+    //订阅消息模板字段key
+    private String key;
+    //订阅消息模板字段value
+    private String value;
+}

+ 18 - 0
nngkxxdp/src/main/java/com/example/nngkxxdp/program/entity/DTO/PushMessageDTO.java

@@ -0,0 +1,18 @@
+package com.example.nngkxxdp.program.entity.DTO;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class PushMessageDTO {
+    //事件标题
+    private String eventTitle;
+    //订阅消息模板id
+    private String templateId;
+    //小程序点击跳转地址
+    private String urlLink;
+    //订阅消息模板内容  json字符串
+    private List<Field> content;
+}
+

+ 25 - 0
nngkxxdp/src/main/java/com/example/nngkxxdp/program/entity/Event.java

@@ -0,0 +1,25 @@
+package com.example.nngkxxdp.program.entity;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import lombok.Data;
+
+
+@Data
+public class Event implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+    private int id;
+
+    private String eventTitle;
+
+    private String templateId;
+
+    private String templateContent;
+
+    private String linkUrl;
+
+    private String createTime;
+
+}

+ 33 - 0
nngkxxdp/src/main/java/com/example/nngkxxdp/program/entity/EventPushRecord.java

@@ -0,0 +1,33 @@
+package com.example.nngkxxdp.program.entity;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import lombok.Data;
+
+
+@Data
+public class EventPushRecord implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+    private int id;
+
+    private int eventId;
+
+    private String userNickname;
+
+    private String name;
+
+    private String userPhone;
+
+    private String userOpenid;
+
+    private String pushStatus;
+
+    private Integer errCode;
+
+    private String errMsg;
+
+    private String pushTime;
+
+}

+ 9 - 0
nngkxxdp/src/main/java/com/example/nngkxxdp/program/service/AppletUserService.java

@@ -0,0 +1,9 @@
+package com.example.nngkxxdp.program.service;
+
+import com.example.nngkxxdp.program.entity.AppletUser;
+
+import java.util.List;
+
+public interface AppletUserService {
+    List<AppletUser> queryPage(Integer page,Integer size);
+}

+ 9 - 0
nngkxxdp/src/main/java/com/example/nngkxxdp/program/service/EventPushRecordService.java

@@ -0,0 +1,9 @@
+package com.example.nngkxxdp.program.service;
+
+
+import com.example.nngkxxdp.program.entity.EventPushRecord;
+
+public interface EventPushRecordService {
+
+    boolean add(EventPushRecord eventPushRecord);
+}

+ 12 - 0
nngkxxdp/src/main/java/com/example/nngkxxdp/program/service/EventService.java

@@ -0,0 +1,12 @@
+package com.example.nngkxxdp.program.service;
+
+import com.example.nngkxxdp.program.entity.Event;
+
+import java.util.Map;
+
+public interface EventService {
+
+    boolean add(Event event);
+
+    Map<String, Object> page(Integer page, Integer limit, String eventTitle);
+}

+ 21 - 0
nngkxxdp/src/main/java/com/example/nngkxxdp/program/service/Impl/AppletUserServiceImpl.java

@@ -0,0 +1,21 @@
+package com.example.nngkxxdp.program.service.Impl;
+
+import com.example.nngkxxdp.program.dao.AppletUserDao;
+import com.example.nngkxxdp.program.entity.AppletUser;
+import com.example.nngkxxdp.program.service.AppletUserService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+@Service
+public class AppletUserServiceImpl implements AppletUserService {
+
+    @Resource
+    private AppletUserDao appletUserDao;
+
+    @Override
+    public List<AppletUser> queryPage(Integer page, Integer size) {
+        return appletUserDao.queryPage(page,size);
+    }
+}

+ 19 - 0
nngkxxdp/src/main/java/com/example/nngkxxdp/program/service/Impl/EventPushRecordServiceImpl.java

@@ -0,0 +1,19 @@
+package com.example.nngkxxdp.program.service.Impl;
+
+import com.example.nngkxxdp.program.dao.EventPushRecordDao;
+import com.example.nngkxxdp.program.entity.EventPushRecord;
+import com.example.nngkxxdp.program.service.EventPushRecordService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+
+@Service
+public class EventPushRecordServiceImpl implements EventPushRecordService {
+    @Resource
+    private EventPushRecordDao eventPushRecordDao;
+
+    @Override
+    public boolean add(EventPushRecord eventPushRecord) {
+        return eventPushRecordDao.add(eventPushRecord) > 0;
+    }
+}

+ 28 - 0
nngkxxdp/src/main/java/com/example/nngkxxdp/program/service/Impl/EventServiceImpl.java

@@ -0,0 +1,28 @@
+package com.example.nngkxxdp.program.service.Impl;
+
+import com.example.nngkxxdp.program.dao.EventDao;
+import com.example.nngkxxdp.program.entity.Event;
+import com.example.nngkxxdp.program.service.EventService;
+import com.example.nngkxxdp.util.SendUtil;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.Map;
+
+@Service
+public class EventServiceImpl implements EventService {
+
+    @Resource
+    private EventDao eventDao;
+
+    @Override
+    public boolean add(Event event) {
+        return eventDao.add(event) > 0;
+    }
+
+    @Override
+    public Map<String, Object> page(Integer page, Integer limit, String eventTitle) {
+        int startRow = (page - 1) * limit;
+        return SendUtil.layuiTable(eventDao.pageCount(eventTitle), eventDao.page(startRow, limit, eventTitle));
+    }
+}

+ 109 - 0
nngkxxdp/src/main/java/com/example/nngkxxdp/program/util/WxMessageUtil.java

@@ -0,0 +1,109 @@
+package com.example.nngkxxdp.program.util;
+
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.thread.ThreadUtil;
+import cn.hutool.http.HttpRequest;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import com.example.nngkxxdp.program.entity.AppletUser;
+import com.example.nngkxxdp.program.entity.DTO.PushMessageDTO;
+import com.example.nngkxxdp.program.entity.Event;
+import com.example.nngkxxdp.program.entity.EventPushRecord;
+import com.example.nngkxxdp.program.service.AppletUserService;
+import com.example.nngkxxdp.program.service.EventPushRecordService;
+import com.example.nngkxxdp.program.service.EventService;
+import com.example.nngkxxdp.util.RedisUtil;
+import com.example.nngkxxdp.util.SendUtil;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+
+@AllArgsConstructor
+@Component
+public class WxMessageUtil {
+
+    private RedisUtil redisUtil;
+    private AppletUserService appletUserService;
+    private EventService eventService;
+    private EventPushRecordService eventPushRecordService;
+
+    private final String GETTEMPLATE_URL = "https://api.weixin.qq.com/wxaapi/newtmpl/gettemplate?access_token=%s";
+    private final String SEND_URL = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=%s";
+
+    /**
+     * 获取订阅消息模板列表
+     *
+     * @return
+     */
+    public Map<String, Object> getMsgTemplate() {
+        String templateResult = HttpRequest.get(String.format(GETTEMPLATE_URL, redisUtil.get("access_token"))).execute().body();
+        JSONObject templateData = JSONUtil.parseObj(templateResult);
+        if (templateData.getInt("errcode") != 0) {
+            return SendUtil.send(false, templateData.getStr("errmsg"));
+        }
+        return SendUtil.send(true, "", templateData.getJSONArray("data"));
+    }
+
+    /**
+     * 推送订阅消息
+     *
+     * @param pushMessageDTO
+     * @return
+     */
+    public Map<String, Object> pushMessage(PushMessageDTO pushMessageDTO) {
+        //保存事件
+        Event event = new Event();
+        event.setEventTitle(pushMessageDTO.getEventTitle());
+        event.setTemplateId(pushMessageDTO.getTemplateId());
+        event.setTemplateContent(pushMessageDTO.getContent().toString());
+        event.setLinkUrl(pushMessageDTO.getUrlLink());
+        event.setCreateTime(DateUtil.now());
+        eventService.add(event);
+        //推送消息 每次查2000条出来,行数小于2000停止循环
+        ThreadUtil.newExecutor().execute(() -> {
+            int page = 1;
+            int size = 2000;
+            List<AppletUser> appletUserList;
+            do {
+                appletUserList = appletUserService.queryPage((page - 1) * size, size);
+                this.push(event.getId(), appletUserList, pushMessageDTO);
+                ++page;
+            } while (appletUserList.size() == size);
+        });
+        return SendUtil.send(true, "", "");
+    }
+
+    private void push(Integer eventId, List<AppletUser> appletUserList, PushMessageDTO pushMessageDTO) {
+        appletUserList.forEach(appletUser -> {
+            //封装参数
+            JSONObject params = JSONUtil.createObj();
+            params.put("template_id", pushMessageDTO.getTemplateId());
+            params.put("page", "/pages/index/index");
+            params.put("touser", appletUser.getOpenid());
+            JSONObject data = JSONUtil.createObj();
+            //封装content参数
+            pushMessageDTO.getContent().forEach(field -> {
+                data.set(field.getKey(), JSONUtil.createObj().set("value", field.getValue()));
+            });
+            params.set("data", data);
+            params.set("miniprogram_state", "trial");
+            params.set("lang", "zh_CN");
+            String sendResult = HttpRequest.post(String.format(SEND_URL, redisUtil.get("access_token"))).body(params.toString()).execute().body();
+            JSONObject result = JSONUtil.parseObj(sendResult);
+            //保存推送记录
+            EventPushRecord eventPushRecord = new EventPushRecord();
+            eventPushRecord.setEventId(eventId);
+            eventPushRecord.setUserNickname(appletUser.getNickName());
+            eventPushRecord.setName(appletUser.getName());
+            eventPushRecord.setUserPhone(appletUser.getPhone());
+            eventPushRecord.setUserOpenid(appletUser.getOpenid());
+            eventPushRecord.setPushTime(DateUtil.now());
+            eventPushRecord.setErrCode(result.getInt("errcode"));
+            eventPushRecord.setErrMsg(result.getStr("errmsg"));
+            eventPushRecord.setPushStatus(0 == result.getInt("errcode") ? "success" : "fail");
+            eventPushRecordService.add(eventPushRecord);
+        });
+    }
+}

+ 1 - 7
nngkxxdp/src/main/resources/application-dev.yml

@@ -1,11 +1,5 @@
 server:
-  port: 7654
-  ssl:
-    key-store-password: fr22yXpV
-    key-store: classpath:8096160_data.pfx
-    key-store-type: PKCS12
-http:
-  port: 7777
+  port: 8082
 file:
   path: F:/upload/
   location: F:/upload/upload/

+ 16 - 0
nngkxxdp/src/main/resources/mapper/EventDao.xml

@@ -0,0 +1,16 @@
+<?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.example.nngkxxdp.program.dao.EventMapper">
+
+	<!-- 可根据自己的需求,是否要使用 -->
+   <resultMap type="com.example.nngkxxdp.program.entity.Event" id="eventMap">
+        <result property="id" column="id"/>
+        <result property="eventTitle" column="event_title"/>
+        <result property="templateId" column="template_id"/>
+        <result property="templateContent" column="template_content"/>
+        <result property="linkUrl" column="link_url"/>
+        <result property="createTime" column="create_time"/>
+    </resultMap>
+
+</mapper>

+ 18 - 0
nngkxxdp/src/main/resources/mapper/EventPushRecordDao.xml

@@ -0,0 +1,18 @@
+<?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.example.nngkxxdp.program.dao.EventPushRecordMapper">
+
+	<!-- 可根据自己的需求,是否要使用 -->
+   <resultMap type="com.example.nngkxxdp.program.entity.EventPushRecord" id="eventPushRecordMap">
+        <result property="id" column="id"/>
+        <result property="eventId" column="event_id"/>
+        <result property="userNickname" column="user_nickname"/>
+        <result property="userPhone" column="user_phone"/>
+        <result property="userOpenid" column="user_openid"/>
+        <result property="pushStatus" column="push_status"/>
+        <result property="errorMsg" column="error_msg"/>
+        <result property="pushTime" column="push_time"/>
+    </resultMap>
+
+</mapper>

+ 3 - 3
nnzwminiapp/pages/myCenter/myCenter.js

@@ -75,14 +75,14 @@ Page({
      * 生命周期函数--监听页面显示
      */
     onShow() {
-        wx.showModal({
+        /*wx.showModal({
             title: '提示',
             content: '提示用户订阅消息',
             success (res) {
               if (res.confirm) {
                 console.log('用户点击确定')
                 wx.requestSubscribeMessage({
-                    tmplIds: ['0Rh0woW2g6Mu6SDwDSs4x2pm6b5Re0xo_7Ugc_3pJps'],
+                    tmplIds: ['aGohosyMWmBOdzkjlD34qMRIsAPb2cVY6juinVIevgg'],
                     success (res) {
                      }
                   })
@@ -90,7 +90,7 @@ Page({
                 console.log('用户点击取消')
               }
             }
-          })
+          })*/
         // let token = wx.getStorageSync('token');
         let token = cacheGet('token');
         if (token != null && token != '') {

Niektoré súbory nie sú zobrazené, pretože je v týchto rozdielových dátach zmenené mnoho súborov