- 在movable-view中嵌套uni-datetime-picker,弹出框变得很大,怎么解决?
<template> <view class="container"> <view v-if="loadstate"> <movable-area scale-area> <movable-view direction="horizontal" scale scale-min="0.5" scale-max="2" animation="false" :scale-value="scale"> <view class="meetingsummary"> <view class="table"> <view class="table-row"> <view class="table-cell label-cell left">会议时间</view> <view class="table-cell value-cell"> <uni-datetime-picker class="time" type="date" v-model="item.time" @change="updateMeet" clear-icon /> </view> </view> <view class="table-row"> <view class="table-cell label-cell left">会议地点及方式</view> <view class="table-cell value-cell"> <uni-easyinput type="text" v-model="item.place" @blur="updateMeet" maxlength="-1" :inputBorder="false" selectable="true" /> </view> </view> <view class="table-row"> <view class="table-cell label-cell left">会议组织及主持</view> <view class="table-cell value-cell"> <uni-easyinput type="text" v-model="item.organize" @blur="updateMeet" maxlength="-1" :inputBorder="false" selectable="true" /> </view> </view> <view class="table-row"> <view class="table-cell label-cell left">会议监督</view> <view class="table-cell value-cell"> <uni-easyinput type="text" v-model="item.supervise" @blur="updateMeet" maxlength="-1" :inputBorder="false" selectable="true" /> </view> </view> <view class="table-row"> <view class="table-cell label-cell left">会议记录</view> <view class="table-cell value-cell"> <uni-easyinput type="text" v-model="item.record" @blur="updateMeet" maxlength="-1" :inputBorder="false" /> </view> </view> <view class="table-row"> <view class="table-cell label-cell left">参会人员</view> <view class="table-cell value-cell"> <uni-easyinput type="text" v-model="item.staff" @blur="updateMeet" maxlength="-1" :inputBorder="false" selectable="true" /> </view> </view> <view class="table-row"> <view class="table-cell label-cell left">未参会人员</view> <view class="table-cell value-cell"> <uni-easyinput type="text" v-model="item.outstaff" @blur="updateMeet" maxlength="-1" :inputBorder="false" selectable="true" /> </view> </view> </view> </view> <view class="work-list"> <uni-table ref="table" border stripe emptyText="暂无更多数据"> <uni-tr> <uni-th width="70" align="center">序号</uni-th> <uni-th width="400" align="center">完成事项</uni-th> <uni-th width="400" align="center">完成标准</uni-th> <uni-th width="200" align="center">责任人</uni-th> <uni-th width="200" align="center">完成时间</uni-th> <uni-th width="200" align="center">进度情况</uni-th> <uni-th width="200" align="center">完成情况</uni-th> <uni-th width="100" align="center">延迟天数</uni-th> <uni-th width="100" align="center">操作</uni-th> </uni-tr> <uni-tr v-for="(work, index) in works" :key="work._id" class="work-item"> <uni-td align="center"> <uni-easyinput :clearable="false" type="number" v-model="work.number" maxlength="-1" :inputBorder="false" @blur="updateWork(work)" auto-height /> </uni-td> <uni-td align="center"> <uni-easyinput type="textarea" v-model="work.task" maxlength="-1" :inputBorder="false" @blur="updateWork(work)" auto-height></uni-easyinput> </uni-td> <uni-td align="center"> <uni-easyinput type="textarea" v-model="work.standard" maxlength="-1" :inputBorder="false" @blur="updateWork(work)" auto-height></uni-easyinput> </uni-td> <uni-td align="center"> <uni-easyinput type="textarea" v-model="work.responsible" maxlength="-1" :inputBorder="false" @blur="updateWork(work)" auto-height></uni-easyinput> </uni-td> <uni-td align="center"> <uni-datetime-picker type="date" :clear-icon="true" v-model="work.completetime" @change="updateWork(work)" class="time"/> </uni-td> <uni-td align="center"> <uni-easyinput type="textarea" v-model="work.schedule" maxlength="-1" :inputBorder="false" @blur="updateWork(work)" auto-height></uni-easyinput> </uni-td> <uni-td align="center"> <uni-easyinput type="textarea" v-model="work.completestatus" maxlength="-1" :inputBorder="false" @blur="updateWork(work)" auto-height></uni-easyinput> </uni-td> <uni-td align="center">{{ work.delayDays }}</uni-td> <uni-td align="center"> <button class="delete-button" type="warn" size="mini" @click.stop="delwork(work._id)">删除</button> </uni-td> </uni-tr> </uni-table> <view class="add-button" style="margin-top: 20px"> <text class="iconfont icon-tianjia" style="font-size: 40px;color: black;" @click="addNewWork()"></text> <text class="iconfont icon-sync-copy" style="font-size: 40px;color: black;margin-left: 20px;" @click="reload()"></text> </view> </view> </movable-view> </movable-area> <view style="height: 200px;"></view> </view> <view v-else> <uni-load-more status="loading"></uni-load-more> </view> </view> </template> <script> const auth = uniCloud.getCurrentUserInfo(); let id; const ch1 = uniCloud.importObject("fwzxch"); const chwork1 = uniCloud.importObject("fwzxchdetail"); export default { data() { return { auth: '', scale: 1, loadstate: false, item: {}, works: [], showpopup: false, allFwzxchworks: [], work: { number: '', task: '', standard: '', responsible: '', completetime: '', schedule: '', completestatus: '', fwzxchid: '', time: '', delayDays: '' }, }; }, onLoad(e) { id = e.id; this.getFwzxchAndwork() .then(() => { return this.updateDelayDaysAndSave(); // 确保延迟天数更新后再渲染 }) .then(() => { // 数据更新完成后再进行渲染 this.loadstate = true; // 更新加载状态 }) .catch(err => { console.error('Error loading data:', err); }); }, // 配置分享 onShareAppMessage() { return { title: `${this.item.time} 服务中心晨会会议纪要`, // 使用 JavaScript 模板字符串来动态拼接标题 path: `/pages/fwzxchdetail/fwzxchdetail?id=${id}`, // 分享的页面路径 }; }, onPullDownRefresh() { this.updateDelayDaysAndSave().then(() => { return this.getFwzxchAndwork().then(() => { uni.stopPullDownRefresh(); // 停止下拉刷新状态 console.log("下拉刷新完成"); }).catch(err => { uni.stopPullDownRefresh(); // 停止刷新,即使出错 console.error(err); }); }); }, methods: { reload() { this.getFwzxchAndwork() }, getFwzxchAndwork() { return Promise.all([ ch1.getfwzxchdetail(id, auth).then(res => { this.item = res.data[0]; }), chwork1.getfwzxchwork(id, auth).then(res => { this.allFwzxchworks = res.data; this.works = [...this.allFwzxchworks]; // 初始化数据 this.loadstate = true; }), ]); }, async addNewWork() { const work = { number: this.works.length + 1, task: '', standard: '', responsible: '', completetime: '', schedule: '', completestatus: '', delayDays: 0, fwzxchid: id, // 需要确保这个字段是有效的 time: this.item.time, // 如果时间是必要的,也确保它是有效的 }; try { const res = await chwork1.addfwzxchwork(work, auth); if (res.code === 1) { uni.showToast({ title: '权限不足', icon: 'error', duration: 1000 }); } else if (res.code === 0) { uni.showToast({ title: '新增成功', icon: 'success', duration: 1000 }); work._id = res.data.id; this.works.push(work); } else { uni.showToast({ title: '操作失败,请稍后重试', icon: 'none' }); } } catch (err) { console.error("新增失败", err); } }, async updateWork(work) { if (!work._id) { console.error("更新失败,缺少 _id"); return; } try { work.number = Number(work.number); const result = await chwork1.updatefwzxchwork(work, auth) if (result.code === 1) { uni.showToast({ title: '权限不足', icon: 'error', duration: 1000 }); } else if (result.code === 0) { uni.showToast({ title: '修改成功', icon: 'success', duration: 1000 }); } else { uni.showToast({ title: '操作失败,请稍后重试', icon: 'none' }); } } catch (err) { console.error(err); uni.showToast({ title: '操作失败,请稍后重试', icon: 'none' }); } }, delwork(id) { uni.showModal({ title: '确认删除', content: '确定要删除此项吗?', success: async (res) => { if (res.confirm) { try { const result = await chwork1.delfwzxchwork(id, auth); if (result.code === 1) { uni.showToast({ title: '权限不足', icon: 'error', duration: 1000 }); } else if (result.code === 0) { uni.showToast({ title: '删除成功', icon: 'success', duration: 1000 }); await this.getFwzxchAndwork(); // 确保数据加载完成 } else { uni.showToast({ title: '操作失败,请稍后重试', icon: 'none' }); } } catch (err) { console.error('Error deleting data:', err); } } else if (res.cancel) { uni.showToast({ title: '取消删除', icon: 'error', duration: 1000 // 提示框显示的时长,单位为毫秒,可根据需要调整 }); } } }); }, updateDelayDaysAndSave() { const db = uniCloud.database(); const collection = db.collection('fwzxchwork'); const currentDate = new Date(); return Promise.all(this.works.map((work) => { if (!work._id) { console.error("工作项缺少 _id:", work); return Promise.resolve(); // 如果没有 _id,跳过此项 } const completeTimeDate = new Date(work.completetime); const completeTimeDateStart = new Date(completeTimeDate); completeTimeDateStart.setHours(0, 0, 0, 0); // 设置完成时间的开始时刻 const completeTimeDateEnd = new Date(completeTimeDate); completeTimeDateEnd.setHours(18, 0, 0, 0); // 设置完成时间的结束时刻 let delayDays = 0; if (currentDate < completeTimeDateStart) { delayDays = 0; // 如果当前时间在完成时间之前,则没有延迟 } else if (currentDate >= completeTimeDateStart && currentDate <= completeTimeDateEnd) { // 如果当前时间在完成时间的当天,并且在 18:00 之前 if (work.schedule && work.completestatus) { delayDays = 0; // 如果有进度和完成情况,则没有延迟 } } else if (currentDate > completeTimeDateEnd) { // 如果当前时间超过了完成时间的 18:00 if (work.schedule && work.completestatus) { delayDays = work.delayDays || 0; // 如果有进度和完成情况,保留当前延迟天数 } else { // 否则,计算延迟天数 const timeDiff = currentDate.getTime() - completeTimeDateEnd.getTime(); delayDays = Math.ceil(timeDiff / (1000 * 3600 * 24)); // 向上取整以确保是完整的天数 } } console.log("延迟天数:", delayDays); // 更新数据库中的延迟天数 return collection.doc(work._id).update({ delayDays: delayDays, }).then(() => { // 更新本地数据 this.$set(work, 'delayDays', delayDays); // 确保 Vue 响应式更新 }).catch((err) => { console.error("更新延迟天数失败:", err); }); })); }, async updateMeet() { const result = await ch1.updatefwzxch(this.item, auth); if (result.code === 1) { uni.showToast({ title: '权限不足', icon: 'error', duration: 1000 }); } else if (result.code === 0) { uni.showToast({ title: '更新成功', icon: 'success', duration: 1000 }); this.works.forEach(async (work) => { // 如果工作项的时间不同于当前 item.time,则更新 if (work.time !== this.item.time) { work.time = this.item.time; // 更新本地数据 // 更新数据库中的时间 try { const updateResult = await chwork1.updatefwzxchwork(work,auth); if (updateResult.code === 1) { uni.showToast({ title: '权限不足', icon: 'error', duration: 1000 }); } else if (updateResult.code === 0) { uni.showToast({ title: '更新成功', icon: 'success', duration: 1000 }); } else { uni.showToast({ title: '更新失败,请稍后重试', icon: 'none' }); } } catch (err) { console.error('更新失败:', err); uni.showToast({ title: '更新失败,请稍后重试', icon: 'none' }); } } }); } else { uni.showToast({ title: '操作失败,请稍后重试', icon: 'none' }); } }, } } </script> <style scoped> .container { margin-top: 20px; padding-left: 20px; padding-right: 20px; } .work-list { margin-top: 20px; } /* 表格宽度自适应内容 */ .table { display: table; width: auto; /* 使表格宽度自适应内容 */ table-layout: auto; /* 自动根据内容调整列宽 */ border-collapse: collapse; /* 去除单元格间的空隙 */ } /* 表格的每一行 */ .table-row { display: table-row; width: 100%; border-bottom: 1px solid black; } /* 每一列的单元格 */ .table-cell { font-size: 18px; display: table-cell; padding: 10px; /* 为单元格添加内边距 */ border: 1px solid black; /* 给每个单元格加边框 */ word-wrap: break-word; /* 自动换行,防止文本溢出 */ white-space: nowrap; /* 禁止换行,保证长文本不会折行 */ min-width: 120px; /* 防止列宽过窄 */ box-sizing: border-box; /* 包含内边距在内 */ vertical-align: middle; /* 垂直居中对齐 */ } /* 标签列的宽度(固定) */ .label-cell { width: 120px; /* 设置标签列的固定宽度 */ text-align: center; border: 1px solid black; } .left { color: black; } /* 内容列的宽度(自适应) */ .value-cell { border: 1px solid black; width: auto; /* 内容列宽度自适应 */ text-align: left; /* max-width: 400px; */ /* 如果内容过长,可以限制最大宽度,防止过度拉伸 */ word-wrap: break-word; /* 确保文本内容不会超出单元格 */ } /* 响应式优化:小屏幕设备下,调整表格布局 */ @media (max-width: 600px) { .table { width: 1200px; /* 设置一个固定宽度,避免超出屏幕 */ } .label-cell, .value-cell { padding: 8px; /* 减小内边距以适应小屏 */ } .value-cell { min-width: 150px; } /* 小屏幕下的表格标题文字居中 */ .table-cell { /* text-align: center; */ } .left { text-align: center; } } @media (min-width: 600px) { .table { width: 100%; /* 设置一个固定宽度,避免超出屏幕 */ min-width: 0; /* 移除固定的最小宽度 */ /* 设置表格的最大宽度为屏幕宽度,避免超出 */ max-width: 100%; } .label-cell, .value-cell { padding: 8px; /* 减小内边距以适应小屏 */ } .value-cell { min-width: 150px; /* 设置最小宽度,以避免内容被压缩 */ } /* 小屏幕下的表格标题文字居中 */ .table-cell { /* text-align: center; */ } .left { text-align: center; } } /* 表格组件样式 */ .uni-table { width: 100%; table-layout: fixed; /* 使表格宽度固定 */ border-collapse: collapse; /* 去除单元格间的空隙 */ border: 1px solid black; } /* textarea 样式 */ /* textarea { width: 100%; min-height: 40px; font-size: 16px; resize: none; padding: 5px; border: none; white-space: pre-wrap; word-wrap: break-word; outline: none; box-sizing: border-box; } */ /* flex布局,确保每行内容竖直居中 */ .uni-table-tr { display: flex; align-items: center; /* 确保每行内容竖直居中 */ justify-content: space-between; /* 保证每个单元格均匀分布 */ width: 100%; } /* 强制表格单元格垂直对齐 */ ::v-deep .uni-table-td { height: 100% !important; vertical-align: middle !important; } .uni-table-td { padding: 5px 5px 0 5px !important; border: 1px solid black !important; } .uni-easyinput__content-textarea { font-size: 18px !important; line-height: 1.5 !important; text-align: left !important; } .uni-easyinput__content-input { font-size: 18px !important; } movable-view { height: 100vh; width: auto; } movable-area { height: 3000px; width: auto; overflow: hidden; } </style>
2天前 - 订阅消息在企业微信中出现错误,怎么解决?
// 判断是否是企业微信PC端 async isEnterpriseWeChatPC() { const { platform, environment } = await wx.getSystemInfo(); console.log('平台、环境',platform,environment) if (platform === 'windows' && environment === 'wxwork') { return true } else { return false } }, // 请求订阅消息 async requestSubscribeMessage() { return new Promise((resolve, reject) => { uni.requestSubscribeMessage({ tmplIds: [this.templateId], success: () => { uni.showToast({ title: "订阅成功", icon: "none" }).then(() => this.updateSubscription()); resolve(); // 授权成功 }, fail: (err) => { console.error('订阅消息请求失败:', err); reject(err); // 授权失败 } }); }); }, // 更新订阅信息 async updateSubscription() { try { const userInfo = uni.getStorageSync('uni-id-pages-userInfo'); const userId = userInfo._id; const nickname = userInfo.nickname; await subscription1.updateSubscriptionCount(userId, nickname, this.templateId); console.log('订阅信息更新成功'); } catch (error) { console.error('更新订阅信息失败:', error); } }, async navigateTofwzx(){ const result = await this.isEnterpriseWeChatPC(); if (result) { // 企业微信PC端直接跳转 uni.navigateTo({ url: `/pages/fwzx/fwzx` }); } else { // 手机端触发订阅消息请求后再跳转 try { await this.requestSubscribeMessage(); // 请求订阅消息 uni.navigateTo({ url: `/pages/fwzx/fwzx` }); // 跳转到目标页面 } catch (err) { console.error('订阅消息授权失败,无法跳转至目标页面:', err); } } },小程序在微信手机端、pc端都可以正常运行,现在在企业微信手机端、pc端都出现错误errMsg: "requestSubscribeMessage:fail can only be invoked by user TAP gesture."
2024-12-11 - 订阅消息云函数运行成功,但是微信用户没有收到消息?
unicloud设置云函数定时发送订阅消息,看到运行日志,可以正常运行 [图片] 这是怎么回事?
2024-11-01