批量优化功能
This commit is contained in:
@@ -364,6 +364,26 @@
|
||||
<el-form-item label="模板消息ID">
|
||||
<el-input v-model="wechatCfg.template_id" placeholder="认证后在公众号后台申请,用于提醒/公告推送" clearable />
|
||||
</el-form-item>
|
||||
<el-form-item label="关注二维码">
|
||||
<div class="qr-upload">
|
||||
<template v-if="wechatCfg.follow_qrcode">
|
||||
<img :src="wechatCfg.follow_qrcode" class="qr-preview" alt="关注二维码" />
|
||||
<el-button type="danger" plain size="small" @click="removeFollowQrcode">删除</el-button>
|
||||
</template>
|
||||
<el-upload
|
||||
v-else
|
||||
:show-file-list="false"
|
||||
accept="image/jpeg,image/png,image/gif,image/webp,image/bmp"
|
||||
:http-request="handleFollowQrcodeUpload"
|
||||
>
|
||||
<el-button :loading="followQrcodeUploading">上传二维码图片</el-button>
|
||||
</el-upload>
|
||||
</div>
|
||||
<div class="form-tip">
|
||||
上传公众号的「关注二维码」(公众号后台「账号设置 → 二维码」下载,2MB 内图片)。<br />
|
||||
用户在租户端「绑定微信」页扫码进入公众号会话 → 发送「验证码」→ 回页填码完成绑定(未认证公众号无法生成带参二维码,统一使用此图片)。
|
||||
</div>
|
||||
</el-form-item>
|
||||
<el-form-item label="服务器地址">
|
||||
<el-input v-model="wechatCfg.callback_url" readonly>
|
||||
<template #append>
|
||||
@@ -379,12 +399,19 @@
|
||||
<el-form-item>
|
||||
<el-button type="primary" :loading="wechatSaving" @click="saveWechatConfig">保存配置</el-button>
|
||||
<el-button :loading="wechatTesting" @click="testWechatConfig">连接测试</el-button>
|
||||
<el-button type="warning" plain :loading="wechatMenuPublishing" @click="publishWechatMenu">
|
||||
发布「扫码登录」菜单
|
||||
</el-button>
|
||||
<div class="form-tip">
|
||||
在公众号底部菜单追加「扫码登录」(点击事件,键值 LOGIN):用户点一下即可收到确认登录链接,无需输入。<br />
|
||||
菜单接口需公众号已认证;未认证会提示 errcode=48001,此时用「公众号内发送登录」的兜底路径。
|
||||
</div>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</el-card>
|
||||
|
||||
<!-- 绑定我的微信 -->
|
||||
<el-card shadow="never" class="settings-card bind-card">
|
||||
<!-- <el-card shadow="never" class="settings-card bind-card">
|
||||
<template #header>
|
||||
<div class="card-header"><span>绑定我的微信(接收提醒 / 公告)</span></div>
|
||||
</template>
|
||||
@@ -426,10 +453,10 @@
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
</el-card>
|
||||
</el-card> -->
|
||||
|
||||
<!-- 粉丝列表 -->
|
||||
<el-card shadow="never" class="settings-card bind-card">
|
||||
<!-- <el-card shadow="never" class="settings-card bind-card">
|
||||
<template #header>
|
||||
<div class="card-header">
|
||||
<span>关注用户(粉丝)</span>
|
||||
@@ -481,10 +508,10 @@
|
||||
:page-size="followerQuery.pageSize"
|
||||
@current-change="handleFollowerPage"
|
||||
/>
|
||||
</el-card>
|
||||
</el-card> -->
|
||||
|
||||
<!-- 消息推送 -->
|
||||
<el-card shadow="never" class="settings-card bind-card">
|
||||
<!-- <el-card shadow="never" class="settings-card bind-card">
|
||||
<template #header>
|
||||
<div class="card-header"><span>消息推送(提醒 / 公告)</span></div>
|
||||
</template>
|
||||
@@ -526,7 +553,7 @@
|
||||
</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</el-card>
|
||||
</el-card> -->
|
||||
</div>
|
||||
</el-tab-pane>
|
||||
|
||||
@@ -597,6 +624,9 @@ import {
|
||||
getWechatMpConfig,
|
||||
saveWechatMpConfig,
|
||||
testWechatMpConnection,
|
||||
publishWechatMpMenu,
|
||||
uploadWechatFollowQrcode,
|
||||
deleteWechatFollowQrcode,
|
||||
startWechatMpBind,
|
||||
getWechatMpBindStatus,
|
||||
confirmWechatMpBind,
|
||||
@@ -942,6 +972,7 @@ const wechatCfg = reactive({
|
||||
verified: 0,
|
||||
enabled: 0,
|
||||
callback_url: "",
|
||||
follow_qrcode: "",
|
||||
configured: false,
|
||||
});
|
||||
const wechatSaving = ref(false);
|
||||
@@ -1018,6 +1049,57 @@ const saveWechatConfig = async () => {
|
||||
}
|
||||
};
|
||||
|
||||
// 关注二维码上传/删除(存 data URL,供租户端「绑定微信」页展示扫码)
|
||||
const followQrcodeUploading = ref(false);
|
||||
const handleFollowQrcodeUpload = async ({ file }) => {
|
||||
followQrcodeUploading.value = true;
|
||||
try {
|
||||
const fd = new FormData();
|
||||
fd.append("file", file);
|
||||
const res = await uploadWechatFollowQrcode(fd);
|
||||
if (res.code === 200) {
|
||||
wechatCfg.follow_qrcode = res.data?.follow_qrcode || "";
|
||||
ElMessage.success("二维码上传成功");
|
||||
} else {
|
||||
ElMessage.error(res.msg || "上传失败");
|
||||
}
|
||||
} catch (e) {
|
||||
ElMessage.error(e?.message || "上传失败");
|
||||
} finally {
|
||||
followQrcodeUploading.value = false;
|
||||
}
|
||||
};
|
||||
const removeFollowQrcode = async () => {
|
||||
try {
|
||||
const res = await deleteWechatFollowQrcode();
|
||||
if (res.code === 200) {
|
||||
wechatCfg.follow_qrcode = "";
|
||||
ElMessage.success("已删除");
|
||||
} else {
|
||||
ElMessage.error(res.msg || "删除失败");
|
||||
}
|
||||
} catch (e) {
|
||||
ElMessage.error(e?.message || "删除失败");
|
||||
}
|
||||
};
|
||||
|
||||
const wechatMenuPublishing = ref(false);
|
||||
const publishWechatMenu = async () => {
|
||||
wechatMenuPublishing.value = true;
|
||||
try {
|
||||
const res = await publishWechatMpMenu();
|
||||
if (res.code === 200) {
|
||||
ElMessage.success(res.msg || "菜单发布成功");
|
||||
} else {
|
||||
ElMessage.error(res.msg || "发布失败");
|
||||
}
|
||||
} catch (e) {
|
||||
ElMessage.error(e?.message || "发布失败");
|
||||
} finally {
|
||||
wechatMenuPublishing.value = false;
|
||||
}
|
||||
};
|
||||
|
||||
const testWechatConfig = async () => {
|
||||
wechatTesting.value = true;
|
||||
try {
|
||||
@@ -1453,6 +1535,22 @@ watch(activeSubTab, (tab) => {
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
|
||||
.qr-upload {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 12px;
|
||||
}
|
||||
|
||||
.qr-preview {
|
||||
width: 120px;
|
||||
height: 120px;
|
||||
object-fit: contain;
|
||||
border: 1px solid #dcdfe6;
|
||||
border-radius: 6px;
|
||||
padding: 4px;
|
||||
background: #fff;
|
||||
}
|
||||
|
||||
.push-url {
|
||||
margin-top: 8px;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user