feat(wxcp): 新增企业微信模块页面与扫码登录入口
一、活动管理
- 列表:按标题/状态/推送状态检索,行内可编辑、发布、推送、看二维码与统计
- 新建/编辑:标题、地点、活动时间、报名窗口、名额上限(0 表示不限)
- 推送弹窗:选择推送范围后调用推送接口,失败时把企业微信返回的原因直接展示
- 二维码弹窗:以 Blob 方式取回图片(img 标签带不了认证头),支持下载与复制报名链接
- 统计弹窗:有效报名、未签到、已签到、已取消、报名进度、签到率,
以及按部门 / 按日期 / 按来源三组分布;不限名额时不显示进度条
- 报名记录:检索、签到、取消报名,并可查看成员提交的参与说明与上传的图片附件
二、通知管理
- 列表、新建/编辑、发布、推送、撤回
- 推送弹窗复用同一套推送范围选择器
三、推送范围选择器(components/push-scope-picker.vue)
- 支持全员 / 指定部门 / 指定成员三种范围
- 部门与成员数据实时取自企业微信通讯录,做了「按需加载 + 只加载一次」的缓存,
避免每次打开弹窗都打企业微信接口(通讯录接口有频率限制)
- 切换范围时清空已选目标,防止把成员账号当成部门 ID 提交
四、登录入口
- 登录页新增「企业微信登录」按钮,复用现有微信图标
- 点击后取授权地址并整页跳转到企业微信扫码页
- redirectUri 用 location.origin 拼接,并预先 encode 一次 type 参数
(配合 social-login 页的 getUrlValue 使用,否则回跳后 type 会丢失)
五、其他
- 根 package.json 补声明 axios(vite.config.ts 的 optimizeDeps.include 需要它,
但根从未声明,会导致 Vite 依赖预构建失败、dev server 崩溃)
- pnpm-lock.yaml 随之更新;其中 @lezer/highlight、style-mod、typed-array-byte-offset
三个传递依赖被 pnpm 顺带做了补丁级升级,与本次功能无关
Co-Authored-By: Claude <noreply@anthropic.com>