原先三个菜单都是空壳,点「帮助与反馈」只弹「敬请期待」。
工作统计(statistics.vue)
- 时段切换:今日 / 本周 / 本月 / 自定义(含起止日期选择器)
- 「生产战绩」完成 / 被驳回 / 参与产品;「操作统计」接收 / 转交 / 上传备注
后者的口径与 PC「人员操作统计」严格同源,已逐字段交叉验证(4 人 × 4 指标
全部相等),工人自查的数与主管看到的面板对得上
- 时段边界显式拼 "+08:00":车间按北京时间作息,发裸字符串会被后端按服务器
本地时间解释,边界整体偏 8 小时
设置(settings.vue)
- 清理缓存:黑名单式,只删登记过的业务缓存(当前为 msg_seen_<product_id>,
即留言抽屉的已读位点,随扫过的设备数无上限增长)。未登记的 key 一律保留,
新增插件天然免疫;另有 NEVER_DELETE 兜底,任何情况下不动登录凭证与环境
配置。副标题实时显示待清理条数,卡片下方说明「不动什么」
- 检查更新:调用 utils/ota.js 的 checkAppUpdate({ manual: true })
- 退出登录:由 profile/index 迁入,加确认弹窗防误触
帮助与反馈(feedback.vue)
- 问题类型(系统问题/设备故障/其他)、描述文本域(500 字计数)、
图片上传最多 4 张,复用 utils/upload.js 的并发上传池
- api/feedback.js 采用「先真后假」:先按最终契约 POST /feedback/,
仅当 404(端点尚未实现)才回退本地 mock。后端补上接口后前端零改动即可
接上;而 400/422/断网仍照常抛出,不会被 mock 悄悄吞掉
路由
- pages.json 注册三个新页面(工作统计开启下拉刷新)
- profile/index.vue 用 MENU_ROUTES 映射 uni.navigateTo,移除「敬请期待」拦截
与退出登录按钮
74 lines
2.8 KiB
Vue
74 lines
2.8 KiB
Vue
<template>
|
||
<view class="page">
|
||
<view class="user-card">
|
||
<view class="avatar">{{ initial }}</view>
|
||
<view class="user-info">
|
||
<text class="user-name">{{ user?.display_name || '未登录' }}</text>
|
||
</view>
|
||
</view>
|
||
|
||
<view class="menu-card">
|
||
<view v-for="item in ['工作统计', '设置', '帮助与反馈', '关于']" :key="item"
|
||
class="menu-item" @click="handleMenuClick(item)">
|
||
<text class="menu-text">{{ item }}</text>
|
||
<text class="menu-arrow">›</text>
|
||
</view>
|
||
</view>
|
||
|
||
<view class="version">{{ appVersion }}</view>
|
||
</view>
|
||
</template>
|
||
|
||
<script setup>
|
||
import { ref, computed, onMounted } from "vue";
|
||
|
||
const user = ref(null);
|
||
try { const r = uni.getStorageSync("user"); if (r) user.value = JSON.parse(r); } catch {}
|
||
const initial = computed(() => (user.value?.display_name || "?")[0]);
|
||
|
||
// 🚀 动态版本号 — 热更新后自动变化
|
||
const appVersion = ref("T1.0.2");
|
||
onMounted(() => {
|
||
try {
|
||
const sysInfo = uni.getSystemInfoSync();
|
||
appVersion.value = sysInfo.appWgtVersion || sysInfo.appVersion || "T1.0.2";
|
||
} catch {}
|
||
});
|
||
|
||
// 菜单项 → 子页面路由。退出登录已迁到「设置」页,此处不再保留按钮
|
||
const MENU_ROUTES = {
|
||
"工作统计": "/pages/profile/statistics",
|
||
"设置": "/pages/profile/settings",
|
||
"帮助与反馈": "/pages/profile/feedback",
|
||
};
|
||
|
||
function handleMenuClick(item) {
|
||
const url = MENU_ROUTES[item];
|
||
if (url) {
|
||
uni.navigateTo({ url });
|
||
return;
|
||
}
|
||
if (item === "关于") {
|
||
uni.showModal({
|
||
title: "关于 Track",
|
||
content: "Track 生产流转管理系统\n当前版本:" + appVersion.value + "\n核心架构:FastAPI + Vue3 + uni-app",
|
||
showCancel: false,
|
||
});
|
||
}
|
||
}
|
||
</script>
|
||
|
||
<style scoped>
|
||
.page { min-height: 100vh; padding: 16px; padding-bottom: 80px; }
|
||
.user-card { display: flex; align-items: center; gap: 12px; background: #fff; border-radius: 12px; padding: 16px; margin-bottom: 16px; box-shadow: 0 1px 3px rgba(0,0,0,0.06); }
|
||
.avatar { width: 48px; height: 48px; border-radius: 50%; background: #dbeafe; color: #2563EB; font-size: 20px; font-weight: 700; display: flex; align-items: center; justify-content: center; }
|
||
.user-name { font-size: 16px; font-weight: 700; color: #1f2937; display: block; }
|
||
.user-role { font-size: 12px; color: #9ca3af; }
|
||
.menu-card { background: #fff; border-radius: 12px; box-shadow: 0 1px 3px rgba(0,0,0,0.06); overflow: hidden; }
|
||
.menu-item { display: flex; align-items: center; justify-content: space-between; padding: 14px 16px; border-bottom: 1px solid #f3f4f6; }
|
||
.menu-item:last-child { border-bottom: none; }
|
||
.menu-text { font-size: 14px; color: #374151; }
|
||
.menu-arrow { font-size: 18px; color: #d1d5db; }
|
||
.version { text-align: center; font-size: 11px; color: #d1d5db; margin-top: 24px; }
|
||
</style>
|