## 安全与性能 - .env 环境变量、debug=False、except 改 mysql.connector.Error+logging - attach_common 批量 IN 查询消除 N+1 - 批量 esc() XSS 转义 ## 架构 - app.js 拆分为 7 模块 + admin.js - .form-ctrl 统一表单控件 ## 经营管理 - 字段改名:客户名称→项目名称、销售人员→商务负责人 - 必填:项目名称/商务负责人/经营负责人/签约月份/签约金额>0 - 视图切换:确收/毛利 ↔ 回款/费用 ## 重点工作与台账 - 统计卡片样式与经营管理统一 - 任务状态简化 3 态 - 优先级点击切换、右键菜单(重命名/副本) - 修复新建任务绑定错误项目 bug ## 用户体系 - 新增工作台:MCN·无界、无界·无界 - 新增账号:mcn/wuji - 账号管理后台(admin 限定) - sidebar 顶部头像+显示名,点击弹菜单 - sidebar sticky 定位 ## 其他 - 登录页样式优化(参考 UOC 平台) - 首页财务趋势拆 3 图 - 业务方案标准资料库双 Tab
34 lines
1.4 KiB
JavaScript
34 lines
1.4 KiB
JavaScript
// app.js — 入口文件(加载模块 + 初始化)
|
|
// 所有业务逻辑已拆分到 modules/ 目录:
|
|
// utils.js — 共享状态、工具函数、API 封装
|
|
// home.js — 首页 + 财务趋势图
|
|
// projects.js — 重点工作与台账(项目+任务+拖拽)
|
|
// proposals.js — 业务方案 + 文件管理
|
|
// products.js — 产品迭代
|
|
// finance.js — 经营管理(财务)
|
|
// drawer.js — 详情抽屉 + 评论 + 转移
|
|
|
|
// Tab 点击委托
|
|
document.querySelector("#tabs").addEventListener("click", (event) => {
|
|
const button = event.target.closest("button[data-tab]");
|
|
if (button) switchTab(button.dataset.tab);
|
|
});
|
|
|
|
// 恢复上次的工作台和标签页
|
|
const savedTenant = localStorage.getItem("opc-active-tenant");
|
|
if (savedTenant) {
|
|
state.tenant = savedTenant;
|
|
document.querySelectorAll(".workspace-nav-item").forEach(el => el.classList.toggle("active", el.dataset.tenant === savedTenant));
|
|
const label = savedTenant.replace("·无界", "");
|
|
document.querySelector("#workspaceTitle").textContent = label + " OPC 工作台";
|
|
}
|
|
const savedTab = localStorage.getItem("opc-active-tab");
|
|
|
|
// 初始化
|
|
applyUserTenants();
|
|
load().then(() => {
|
|
if (savedTab && savedTab !== "home") switchTab(savedTab);
|
|
}).catch((error) => {
|
|
document.querySelector("main").innerHTML = `<section class="card p-6 text-red-700">加载失败:${esc(error.message)}</section>`;
|
|
});
|