4 Commits
Author SHA1 Message Date
Masir01 1c9bf446dd Merge remote-tracking branch 'origin/dev-ma' 2026-08-16 19:52:31 +08:00
Masir01 1dd1cf9bc2 feat(freight-sfa-server): 初始化货代SFA服务端项目 2026-08-16 19:28:07 +08:00
alice 3d02548743 fix(侧栏): 修复移动端遮罩锁死并优化今日任务展示
- 移动端侧栏遮罩改为透明可穿透,避免打开抽屉后主内容无法操作
- 侧栏首页看板项支持拖拽排序,顺序持久化到 localStorage
- 重构今日任务区域:按客户聚合、分类配色、增加已查看勾选标记
- 新增备忘录日历功能:可按日期查看、添加、勾选待办,支持年月滚轮切换
- 等级分类仪表盘改为按等级多卡片聚合展示
- 清理顶部 S 图标与无用 CSS
2026-08-16 19:09:04 +08:00
alice f11c84911a chore: add .gitignore 2026-08-16 17:09:26 +08:00
5 changed files with 592 additions and 59 deletions
Vendored
BIN
View File
Binary file not shown.
+22
View File
@@ -4,6 +4,27 @@
- node --check 全量校验通过;onclick 函数与 getElementById ID 交叉检查全部匹配
- 部署 HTML 至资料库在线页面(绑定 4 张数据库),URL: https://www.workbuddy.cn/space/d/slZoYoQY3Jp8VuRAmizFemHTTP 200 验证通过
- 全部 6 项任务完成,交付用户
<<<<<<< HEAD
- 用户反馈后去掉 freight-sfa.html 顶栏的 S 图标(header-logo 内 SVG),仅保留标题文字
- 继续去掉顶栏最右侧用户头像中的字母 S(移除整个 #userAvatar 元素,JS 无引用)
- 用户反馈「侧边栏点不动」:根因是 init() 中 bindSidebar() 排在无 try-catch 的 loadSampleData() 之后,若数据加载抛错则事件不绑定。修复:将 bindSidebar/bindHeader/bindModals 提前到 init 最前面执行,loadState/loadSampleData/renderAll 全部包 try-catch,并校验 state 数组类型;bindSidebar 的 showPage 也加 try-catch 保证高亮/关抽屉不中断。侧边栏导航从此保证始终可点。
- 续:再次去掉顶栏右侧 #userAvatar(已删除元素)并清理无用 CSS `.user-avatar`header-logo 容器保留,favicon/PWA manifest 中的 "S" 未触及。
- 侧栏重构:把"首页看板"内 9 项包进 `#sideSortable` 容器,每项加 `draggable="true"` + `⋮⋮` 拖动手柄;新增 `bindSidebarSortable` 实现拖拽排序,按顺序持久化到 `localStorage[wb_freight_sfa_v1_side_order]`;dragstart 仅当指针在手柄上才响应,点文字/图标不进入拖拽、点击导航照常。"客户全量"→"所有客户""A类重点"→"等级分类",其 route 不变。
- 等级分类仪表盘改造:`renderVIPView` 重写为按 `state.options.grade` 分级(默认 A/B/C)多块聚合卡片(每级一张:客户数/占比/待跟进/累计货量),下方表格按分级分组、加分组头、点击"跳到表筛选"自动设置 `cf-grade` 并跳转到"所有客户"页(cf-grade=该等级)。空数据时显示引导。无客户时显示"请先在客户档案表新增"。
- 侧栏图标顺序:用户反馈图标要在最左侧,且点文字不可复制。把所有 15 个侧栏项的文字包进 <span class="side-label">CSS order 设为 `.ic=1, .side-label=2(flex:1 占满剩余), .drag-handle=3, .badge=4`,视觉顺序:🔷图标 → 文字 → ⋮⋮拖手柄 → 数字徽章。side-label 加 user-select:-webkit-/-moz-/-ms-/-none 全套禁止文本复制。
- 移动端侧栏 bug 修复:原本 `.drawer-mask` 是 rgba(0,0,0,.4) 深色全屏遮罩(pointer-events 默认 auto),页面变窄(≤1024px)打开左侧栏时整个画面变暗且被遮罩锁死无法点主内容。改为 `background:transparent + pointer-events:none`(透明可穿透,主画面不再变暗、可正常操作);同时移动端 `.sidebar``z-index:60` 保证抽屉浮于顶层。关闭方式不变:点导航项自动关、点菜单按钮 toggle 关(遮罩透明后点击遮罩外的 onclick 已无意义,靠按钮/导航项关闭)。
- 备忘录功能:state.memos=[{id,date('YYYY-MM-DD'),text,done,created}];在 today-bar 下方加 memo-bar (含输入框+日期选择器);首页 charts 后插入"备忘录日历"卡片(当月日历、每天显示"待 N / 完 N" pill、可翻上月/下月/今天、点击日期同步切换 today-bar 输入框日期)。函数: memoInit/memoAdd/memoToggle/memoDel/memoRenderBar/renderMemoCalendar/memoNavMonth/memoJumpDate/memoPills。已挂到 init 末尾与 renderDashboard 末尾同步刷新。
- 备忘录增强:①勾选完成时触发 `fireConfetti()` 彩带粒子动画(70 片随机颜色,translate+rotate+淡出);打勾后 `.memo-item.done` 只 opacity:.5 变暗、去掉了 text-decoration:line-through(不再加删除线)。②日历标题右侧改为"数字滚轮":年月各显示大号数字 `2026年 08月`,上下 ▲▼ 微调(memoWheelYear/memoWheelMonth),鼠标在导航区滚轮滑动切换月(shift+滚轮切年),旁边红色"今天"按钮 memoGoToday() 一键回到今天并高亮选中。函数 memoEnsureMonth/memoWheelYear/memoWheelMonth/memoGoToday/fireConfetti。滚轮绑定在 .memo-cal-nav 上(onwheel+e.preventDefault)。memoToggle 现返回新 done 状态供 UI 判断是否撒彩带。
- 备忘录日历微调:①把"年月合并"的滚轮拆成 .memo-wheels 两个独立 .memo-wheel —— 年轮(2026年) 与 月轮(08月) 各自 ▲▼ 微调;滚轮事件绑定到每个独立 wheel 上(hover 年轮滑动切年,hover 月轮滑动切月)。②`memoGoToday` 移除 scrollIntoView、改为展开 memoShowDetail(ds) 让用户立即看到今天待办。③日历网格下方新增 #memoDetail 详情面板,点击日期展开当天备忘录列表(含复选框/时间/删除)、再次点击同一日期收起(toggle 行为);另提供 ✕ 按钮手动收起。memoShowDetail / memoHideDetail / memoDetailIn 动画。
- 备忘录去重+解耦:①顶部"我的备忘录"去掉日期选择器(memoDate input),固定只显示今天(label 直接写"我的备忘录 · 今天")。②日历详情面板 #memoDetail 新增添加输入框 + "添加"按钮(回车也可 memoDetailAdd),可直接给任意日期加待办;勾选(memoToggleUI)/删除(memoDelUI) 与顶部共享 state.memos,两边数据即时同步。③引入 window._memoActiveDate 记录日历当前操作日期,memoSelectedDate()/memoDetailDate() 返回它(默认今天);顶部 memoRenderBar(todayStr()) 固定今天,详情 refreshMemoDetail() 用 active date。④memoShowDetail 改为生成头部/列表/输入框三块结构并调 refreshMemoDetail 填充;memoJumpDate/memoGoToday 不再依赖 memoDate 输入框。
- 今天要处理排版重排:HTML 把 todayTasks 从 today-row 内移到外(在 quick-stats 之后),CSS 改为 flex-direction:column.today-tasks+ .today-group/.today-group-head(含彩色 dot + 种类 emoji + 数量徽章)/.today-group-list(任务卡片堆叠)/ .today-empty/.today-tasks-empty。JS renderDashboard 不再按 alert 排序 + slice(0,6) 拍平,而是按 groups.followup/etd/overdue 分桶,渲染顺序固定"待跟进 → 今日开船 → 逾期回款",每个分组最多展示 5 条 + 「还有 N 条…」。同时 quick-stats 数字来源改为 groups.*.length(统一语义)。SI截关临近归入 etd 组。
- 【修正】"今天要处理"排版:之前误做成按种类分组的任务卡片,用户只要"头部一行(今天要处理+2待跟进+0今日开船+1逾期回款) + 下方直接列客户名"。改为:HTML 中 todayTasks 移到 today-row(label+quick-stats)之后;JS 用 custMap{name->{kinds:Set}} 去重收集今天要处理的客户,下方每行显示"客户名 + 类别标签(待跟进/今日开船/逾期回款 tag) + 查看按钮"alert 红色。quick-stats 改为按客户去重计数(followupCount/etdCount/overdueCount 用 Set)。CSS .today-tasks 改纵向 flex,加 .cust-name/.cust-kinds。
- 【修正】今天要处理顶/底数据源统一:之前顶部 quick-stats 用了独立的过滤循环统计客户数,下方 custMap 又用了略有不同的过滤条件,导致顶部"待跟进=0"但下方显示 2 个待跟进客户的不一致。改为:所有客户先收进 custMap(统一的过滤逻辑:逾期回款=回款状态逾期;待跟进=下次跟进==今天或<今天;今日开船=ETD==今天+SI截关临近),顶部三个数字 followupCount/etdCount/overdueCount 用 Object.values(custMap) 反向按 kinds 计数 Set.size。这样顶部数字与下方 row 数量必然一致。
- 【修正】今天要处理客户行配色协调:之前行用 c.alert 决定红/白底,与 followup/etd 标签色不对齐(如美西收货人:行红色但标签蓝色"待跟进")。改为:以"主类别"决定行配色(优先级 overdue > etd > followup),.today-task.row-followup(浅蓝)/.row-etd(浅橙)/.row-overdue(浅红) 三套独立样式;标签用 .tag.tag-followup/tag-etd/tag-overdue 颜色与行同色系。客户列表也按主类别排序,让同类颜色邻接。移除 .today-task.alert 旧规则。
- 今天要处理客户行加"已查看"勾选标记:新增 state.seenToday{客户名:时间戳}(本地 UI 记忆,绝不修改数据库状态;真正完成任务仍须在数据库表标记)。渲染时每行前加 .cust-seen 勾选框(data-name 存客户名,onclick=toggleSeenBy(this)),已勾选则行加 .seen(打勾、整体灰度+淡化 0.4、轻微去饱和)。再次点击可取消。存到现有 wb_freight_sfa_v1。toggleSeenBy 里 delete/add + saveState + renderDashboard 刷新。
=======
## freight-sfa 前后端分离重构(已完成,19 项冒烟测试通过)
@@ -33,3 +54,4 @@
- 前端两方案:A) Vue3+Vite+Pinia(推荐,SCHEMAS 抽 JSON 双端共享);B) 原生 ES Module 拆分(零依赖低成本)
- 迁移三步走:localStorage JSON 导出→/api/import 入库→后端先行 curl 验证→前端 API 对接
- 待用户拍板:是否多用户 auth、财务权限真隔离、是否保留 PWA 离线、部署形态(单机局域网 vs Docker/云)
>>>>>>> dev-ma
+3
View File
@@ -11,8 +11,11 @@
- 跟进记录表 JUfrTdkSYRL7bweIYBAbjK
- 功能:4表CRUD+8看板+跨表联动+双时间水印+三级供应商逻辑+内部字段权限隔离+选项自定义+CSV/JSON备份+PWA
- 数据本地存储 localStorage key 前缀:wb_freight_sfa_v1
- 侧栏"首页看板"区可拖拽排序(拖手柄 ⋮⋮),顺序持久化到 `wb_freight_sfa_v1_side_order`
- 等级分类(侧栏项,对应路由 `view-vip` 实际渲染按 ABC 多级汇总):顶部多卡片(每级一张:客户数/占比/待跟进/累计货量),下方分组表格(含"跳到表筛选"快捷跳到 `view-customers-table`
## 技术要点(避坑)
- import_html.py 的 token 必须用 `--token-stdin`stdin 传入),环境变量无效
- 资料库 select/multi_select 字段创建时 options 不能为空,空字段需放占位选项
- JS 对象字面量中含 `/``(``)` 的中文键名必须加引号(曾因此报 SyntaxError
- read_file/grep 看到的"五角星 path d=..."可能截断一部分(如 `M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z` 中含 `L7 14.14 2 9.27`),做精确替换前要先 `od -c``awk` 看真实字节再写 old_str
+2
View File
@@ -0,0 +1,2 @@
.DS_Store
.DS_Store
File diff suppressed because it is too large Load Diff