目录结构
…
样式
因为直接用html那一套写按钮分布有点问题,所以这里记录一下,针对button使用如下样式不能生效,不能让按钮根据剩余空间进行伸缩的同时两端对齐
.button-group {
display: flex;
flex-direction: row;
justify-content: space-between;
align-items: center;
width: 100%;
}
只能在button外层加一个view块,然后让按钮均分父容器的宽度,让父容器100%宽度,这样可以自适应不同的机型
.button-group {
display: flex;
}
.accept-view{
width: 100%;
margin-right: 3px;
}
.delete-view{
width: 100%;
margin-left: 3px;
}
.accept-btn {
flex: 1; /*让按钮均分父容器的宽度 */
margin-top: 5px;
background-color: #1b9e52;
color: #fff;
border: none;
border-radius: 8px;
padding: 2px 2px;
font-size: 14px;
cursor: pointer;
font-weight: bold;
box-sizing: border-box;
}
.delete-btn {
flex: 1; /* 让按钮根据剩余空间进行伸缩 */
margin-top: 5px;
background-color: #e74c3c;
color: #fff;
border: none;
border-radius: 8px;
padding: 2px 2px;
font-size: 14px;
cursor: pointer;
font-weight: bold;
box-sizing: border-box;
}
<view class="button-group" wx:if="{{item.roomKey === null}}">
<view class="accept-view"><button bindtap="acceptMeeting" data-index="{{index}}" class="accept-btn">通过</button></view>
<view class="delete-view"><button bindtap="deleteMeeting" data-index="{{index}}" class="delete-btn">拒绝/删除</button></view>
</view>
订阅消息
注意使用箭头函数继承上下文,一定要先通过 requestSubscribeMessage 让用户接受对应模板ID的通知,然后才能发送通知否则会报错 43101 “user refuse to accept the msg rid: 65dfedc2-1365826f-74c2fe74”。
const tmplIds = "ulp2LOvYBDUmi8DE9emL57qxR237fb46_8_fTJBlXPs";//账户变动通知
wx.getSetting({
withSubscriptions: true, // 这里设置为true,下面才会返回mainSwitch
success: (getSettingRes) => {
console.log(getSettingRes)
// 调起授权界面弹窗
if (getSettingRes.subscriptionsSetting.mainSwitch) { // 用户打开了订阅消息总开关
// 用户同意总是保持是否推送消息的选择, 这里表示以后不会再拉起推送消息的授权
if(getSettingRes.subscriptionsSetting.itemSettings && getSettingRes.subscriptionsSetting.itemSettings[tmplIds] === 'accept'){
console.log('已经接受了消息推送');
}else{
// 当用户没有点击 ’总是保持以上选择,不再询问‘ 按钮。那每次执到这都会拉起授权弹窗
wx.showModal({
title: '提示',
content:'请授权开通服务通知',
showCancel: true,
success: (showModalRes) => {
console.log(showModalRes)
if (showModalRes.confirm) {
wx.requestSubscribeMessage({ // 调起消息订阅界面
tmplIds: [tmplIds],
success: (requestSubscribeMessageRes) => {
console.log('订阅消息 成功 ');
console.log(requestSubscribeMessageRes);
},
fail: (requestSubscribeMessageErr) => {
console.log("订阅消息 失败 ");
console.log(requestSubscribeMessageErr);
}
})
}
}
})
}
}else {
console.log('订阅消息未开启')
}
},
fail: (getSettingErr) => {
console.log(getSettingErr);
},
})
针对多个模板ID的情况,注意这里电脑上调试只显示订阅一个,手机上显示多个
const tmplIds = ["-dSnxVziE5KUX9VluIInFkbMWtbRS3XrGdKpprYo2Cs","FcPVsrCf1xUubE6lHnMu4NUJ_9NgeeMtNWId26um9mg","L4Ggja5tL6J2cVvD4C28afyRGuGzWx4p2j6r1e9mbRQ"];//普通用户接收预约通知
wx.getSetting({
withSubscriptions: true, // 这里设置为true,下面才会返回mainSwitch
success: (getSettingRes) => {
console.log(getSettingRes)
// 调起授权界面弹窗
if (getSettingRes.subscriptionsSetting.mainSwitch) { // 用户打开了订阅消息总开关
// 用户同意总是保持是否推送消息的选择, 这里表示以后不会再拉起推送消息的授权
let allAccepted = true; // 假设所有的ID都被接受
tmplIds.forEach(tmplId => {
if(!getSettingRes.subscriptionsSetting.itemSettings || getSettingRes.subscriptionsSetting.itemSettings[tmplId] !== 'accept'){
allAccepted = false; // 如果有任何一个ID没有被接受,更新allAccepted的状态
}
});
if(allAccepted){
console.log('已经接受了消息推送');
}else{
// 当用户没有点击 ’总是保持以上选择,不再询问‘ 按钮。那每次执到这都会拉起授权弹窗
wx.showModal({
title: '提示',
content:'请授权开通服务通知',
showCancel: true,
success: (showModalRes) => {
console.log(showModalRes)
if (showModalRes.confirm) {
wx.requestSubscribeMessage({ // 调起消息订阅界面
tmplIds: tmplIds,
success: (requestSubscribeMessageRes) => {
console.log('订阅消息 成功 ');
console.log(requestSubscribeMessageRes);
},
fail: (requestSubscribeMessageErr) => {
console.log("订阅消息 失败 ");
console.log(requestSubscribeMessageErr);
}
})
}
}
})
}
}else {
console.log('订阅消息未开启')
}
},
fail: (getSettingErr) => {
console.log(getSettingErr);
},
})
订阅消息数据类型
参数类别 参数说明 参数值限制 说明
thing.DATA 事物 20个以内字符 可汉字、数字、字母或符号组合
number.DATA 数字 32位以内数字 只能数字,可带小数
letter.DATA 字母 32位以内字母 只能字母
symbol.DATA 符号 5位以内符号 只能符号
character_string.DATA 字符串 32位以内数字、字母或符号 可数字、字母或符号组合
time.DATA 时间 24小时制时间格式(支持+年月日),支持填时间段,两个时间点之间用“~”符号连接 例如:15:01,或:2019年10月1日 15:01
date.DATA 日期 年月日格式(支持+24小时制时间),支持填时间段,两个时间点之间用“~”符号连接 例如:2019年10月1日,或:2019年10月1日 15:01
amount.DATA 金额 1个币种符号+10位以内纯数字,可带小数,结尾可带“元” 可带小数
phone_number.DATA 电话 17位以内,数字、符号 电话号码,例:+86-0766-66888866
car_number.DATA 车牌 8位以内,第一位与最后一位可为汉字,其余为字母或数字 车牌号码:粤A8Z888挂
name.DATA 姓名 10个以内纯汉字或20个以内纯字母或符号 中文名10个汉字内;纯英文名20个字母内;中文和字母混合按中文名算,10个字内
phrase.DATA 汉字 5个以内汉字 5个以内纯汉字,例如:配送中
发送
发送订阅消息一定不能把api.weixin.com写在前端,否则不能发送,后端接收方法可以采用@RequestBody String jsonData
JAVA将数据写入Word表格
package com.example.comweb.controller;
import org.apache.poi.xwpf.usermodel.*;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
public class test {
public static void main(String[] args) {
try {
// 加载Word文档
FileInputStream fis = new FileInputStream("E:\\Code\\Java\\Comweb\\comweb\\src\\main\\java\\com\\example\\comweb\\controller\\5.docx");
XWPFDocument document = new XWPFDocument(fis);
// 假设我们要填充的是文档中的第一个表格
List<XWPFTable> tables = document.getTables();
if (!tables.isEmpty()) {
XWPFTable table = tables.get(0); // 获取第一个表格
// 填充表格的某个单元格,例如第一行第二列(注意:行和列的索引都是从0开始的)
XWPFTableRow row = table.getRow(0); // 获取第一行
XWPFTableCell cell = row.getCell(3); // 获取第4列的单元格
// 清除单元格中的所有段落
cell.removeParagraph(0);
// 创建一个新的段落
XWPFParagraph paragraph = cell.addParagraph();
// 设置段落为居中对齐(水平居中)
paragraph.setAlignment(ParagraphAlignment.LEFT);
// 创建一个运行块
XWPFRun run = paragraph.createRun();
run.setText("文字");
// 设置单元格垂直对齐为居中
cell.setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER);
}
// 保存修改后的文档
FileOutputStream out = new FileOutputStream("E:\\Code\\Java\\Comweb\\comweb\\src\\main\\java\\com\\example\\comweb\\controller\\4.docx");
document.write(out);
// 关闭资源
out.close();
document.close();
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>