全部资源

全国全栈开发资源中心

摒弃重复劳动,聚焦核心创新。为全国企业提供高价值商业级技术底座与实战指南。

PySide6 视觉工作台启动指南:Python 环境、依赖检查与首次登录
技术指南

PySide6 视觉工作台启动指南:Python 环境、依赖检查与首次登录

拿到桌面视觉项目后,我更倾向于先确认解释器、依赖和工作目录,再打开图形界面。否则,看起来是按钮失效的问题,实际可能是终端与应用用了不同的 Python,或者程序没有找到数据目录。这篇以配套工作台的入口和配置代码为线索,梳理第一次启动时最值得确认的几件事。 配套工作台的真实训练参数界面,截图用于说明模块布局。 1. 先认清运行方式:它是一套本地桌面应用 主入口 main.py 创建 PySide6 的 QApplication,加载配置、登录窗口和现代化主窗口。程序需要桌面会话,不能直接当作 PHP 网站放进服务器目录运行。安装验证优先使用 Windows 与 Python 3.10 的独立环境;本次界面检查使用的也是 Python 3.10 环境。 GPU 是训练加速选项。第一次启动可以先检查 CPU 路径和界面,等数据与模型能够正确加载后,再核对驱动和 PyTorch 的 GPU 构建,减少同时排查多个变量的成本。 2. 让安装和运行始终使用同一个解释器 在源码根目录执行下面的 Windows 命令。这里显式使用虚拟环境里的 python.exe,可以避免 pip 把包装进其他环境。PyTorch 的 CPU/GPU 版本需结合实际机器选择;原依赖清单是版本范围,安装完成后应保存自己的已验证环境记录。 py -3.10 -m venv .venv .\.venv\Scripts\python.exe -m pip install --upgrade pip .\.venv\Scripts\python.exe -m pip install -r requirements-minimal.txt .\.venv\Scripts\python.exe -m pip check .\.venv\Scripts\python.exe main.py 3. 把依赖检查拆成可定位的几步 先确认 PySide6、OpenCV、PyTorch 和 Ultralytics 可以导入,再检查 torch.cuda.is_available()。返回 False 只表示当前环境没有可用的 CUDA 计算设备,不能据此断言整个程序不可用。 若错误发生在 Matplotlib 的 Qt 后端,先检查当前解释器中的 Qt 绑定与 Matplotlib 版本,保留第一条异常信息。不要通过在不同终端重复安装一整套依赖来碰运气。 import sys import PySide6 import cv2 import torch from ultralytics import YOLO print('Python:', sys.executable) print('PySide6:', PySide6.__version__) print('OpenCV:', cv2.__version__) print('PyTorch:', torch.__version__) print('CUDA available:', torch.cuda.is_available()) 4. 首次登录与工作目录分别检查 认证模块 AuthManager 在没有用户文件时会初始化本地演示管理员,源码中的初始账号为 admin、密码为 admin123。它属于桌面应用,和网站后台账号没有关系。首次进入后应更换密码;整理副本没有携带原使用者的用户、会话和登录日志。 DatasetManager 默认使用相对目录 workspace/datasets,因此应从源码根目录启动。全局配置由 core/config.py 管理,并支持显式指定配置路径。若换一个启动目录就看不到数据,先核对实际工作目录和配置,不要急着删除数据集或重新标注。 5. 可选功能按目标补齐依赖 本地 API 服务依赖 FastAPI、Uvicorn 和文件上传组件;不同模型导出格式还依赖相应运行时。建议按实际需求逐项安装和验证,避免一次加入所有可选工具后增加版本冲突。 当前源码的 launcher.py 引用了未随目录提供的依赖安装器文件。依赖准备完成后,可以按上述方式直接运行 main.py。完成界面启动、登录、导航和小样本数据导入后,再进入训练或推理验证。本文的操作步骤不代表已经在所有系统和 GPU 上完成测试。 对应源码模块与配套项目本文结合本次整理源码编写,主要对应:main.py、launcher.py、core/config.py、auth/manager.py、data/dataset_manager.py。 项目介绍、界面截图与资料清单:桌面视觉模型训练与推理一体化工作台。

15 浏览
阅读详情 →
从标注到 data.yaml:视觉工作台的数据集整理与检查方法
技术指南

从标注到 data.yaml:视觉工作台的数据集整理与检查方法

训练参数再丰富,也无法补救类别映射错位、图片与标签不匹配等问题。我通常把数据集检查放在调模型之前:先让一张图片、一条标签和一份配置能够互相对应,再扩大数据量。配套工作台提供了数据集流程界面,下面结合它的目录管理和 YAML 生成代码,说明一份可以交给训练模块的数据资料应该长什么样。 数据集工作流从创建数据集开始,按步骤推进到生成训练资料。 1. 明确项目元数据与训练资料的区别 DatasetManager 创建数据集时,会保存 dataset_info.json,并建立 images、labels、annotations、versions 等目录。这些内容用于工作台管理和版本记录。最终生成训练资料时,工作流还会组织拆分后的图片、标签及 data.yaml。 不能只复制一个名称相同的目录就认为数据集迁移完成。还要确认元数据中的路径、类别列表以及训练配置实际指向的位置,尤其是从别的机器迁移后留下的绝对路径。 2. 类别编号一旦开始标注,就要保持稳定 YOLO 检测标签中的第一列是类别编号,编号从 0 开始。例如,类别表中 0 对应 person、1 对应 helmet,那么所有标签都必须沿用这个映射。中途调整类别名称的顺序,会让同一个数字被解释成另一种目标。 下面是一条检测框示例。中心点和宽高均按图像尺寸归一化;它用于说明格式,不能代替分割、多边形或关键点任务各自的标签规范。 # class_id center_x center_y width height 0 0.500000 0.500000 0.200000 0.300000 3. 在拆分前检查图片、标签和目标范围 工作流源码包含对归一化坐标范围的检查。对学习实验来说,可以先采用手动标注和检查作为基线;计划加入 AI 辅助标注时,应核实相应入口的实际实现,并为自动结果保留人工复核步骤。 确认图片能正常解码,并检查空白图片、重复图片和异常尺寸。 核对图片与标签的文件名映射,区分有意保留的负样本与意外缺少标签的样本。 检查类别编号是否存在,坐标是否有效,检测框是否超出图像边界。 先预览一小批标注叠加结果,再执行批量生成;不要只依据标签文件存在就认定标注正确。 4. 训练集与验证集要尽量反映真实差异 界面的默认拆分比例为训练 70%、验证 20%、测试 10%,实际比例应结合样本规模和任务目标调整。比例本身不是关键,关键是避免同一段视频的相邻帧或同一拍摄对象的大量近重复图片同时进入训练集和验证集。 如果需要按视频、拍摄批次或场景分组拆分,应先准备好分组方案,并确认当前流程是否满足要求;不要直接把逐张随机拆分的结果当作独立场景评估。保留拆分清单,后续比较模型时尽量复用同一份验证集。 5. 核对生成后的 data.yaml,再交给训练模块 当前工作流生成器使用 train/images、val/images,存在测试集时再加入 test/images,并写入 nc 与编号到名称的映射。下面展示两类别数据的配置结构;路径是示例,应替换成自己的输出目录。 源码会将数据目录解析为绝对路径。因此目录搬家后,旧 data.yaml 不会自动跟着变化。重新生成或核对路径后,再确认训练页选择的是新配置。完成这一轮检查,才能把训练失败与数据路径错误区分开。 train: D:/vision-data/demo/train/images val: D:/vision-data/demo/val/images test: D:/vision-data/demo/test/images nc: 2 names: 0: person 1: helmet 对应源码模块与配套项目本文结合本次整理源码编写,主要对应:data/dataset_manager.py、data/formats.py、gui/widgets/dataset_workflow_widget.py。 项目介绍、界面截图与资料清单:桌面视觉模型训练与推理一体化工作台。

16 浏览
阅读详情 →
先跑通再调优:视觉工作台的小样本训练、评估与断点恢复
技术指南

先跑通再调优:视觉工作台的小样本训练、评估与断点恢复

第一次验证训练流程时,我会先把目标定为:程序能读取数据、完成少量轮次并留下可解释的结果。等链路稳定,再逐步增加模型规模和训练时间。配套工作台将环境检查、参数设置、训练过程和完成结果拆成不同页面,适合沿着这个顺序定位问题。 训练参数页包含模型、数据集、设备、批次大小与图片尺寸等配置入口。 1. 确认模型、数据和任务类型能够对上 选择模型前,先检查 data.yaml 的图片路径、类别数量与标签格式,再确认权重对应的模型和任务。项目中提供了多个本地权重文件,但文件名相似不代表它们一定能被同一个旧版 Ultralytics 正确加载。 用于验证流程的数据量可以较小,但应同时覆盖训练集和验证集,并包含实际要识别的类别。先预览数据,再启动任务,通常比训练结束后才发现类别顺序不一致更省时间。 2. 给第一次训练设定较小的验证配置 下面用三轮、较小 batch 和较小图片尺寸说明验证参数。命令需在已安装相应依赖、准备好数据和可信权重的环境中运行;它是操作示例,本次文章发布没有代替读者执行模型训练。 Windows 初次排错时可以先将 workers 设为 0,减少多进程数据加载引入的变量。CPU 验证通过后,再切换到已确认可用的 GPU,逐项增加 batch 或图片尺寸。不要把自动选择设备理解为驱动和运行环境一定正确。 from ultralytics import YOLO def main(): model = YOLO('weights/yolov8n.pt') model.train( data='workspace/datasets/demo/data.yaml', epochs=3, batch=2, imgsz=320, device='cpu', workers=0, project='runs/train', name='smoke_test', ) if __name__ == '__main__': main() 3. 观察实际输出,不只看进度条 工作台训练页面包含从 results.csv 读取指标和曲线的逻辑。排错时应同时核对训练日志、输出目录和 CSV 是否持续更新,并确认界面展示的是当前实验。界面能够打开,不能说明模型已经训练成功。 先确认至少完成一轮、写出结果文件并能重新读取权重,再分析精确率、召回率和 mAP。不同版本可能使用不同列名,读取脚本应检查 CSV 表头,不要写死一套列名后把缺失数据直接显示成 0。 4. 分清 best.pt、last.pt 与断点续训 常见训练输出中,best.pt 用于保存训练器按当前评价标准选出的较优权重,last.pt 对应最后保存的检查点。具体保存条件以训练器版本及配置为准,不能仅凭文件名判断它已经适合业务部署。 配套训练模块包含检查点查找与恢复入口。准备恢复前,应确认检查点来自哪次实验、数据和类别映射是否一致,以及所需的训练状态是否完整。若只是拿权重重新开始一项实验,应把它与恢复原实验区分开,并保存新的实验记录。 5. 评估先固定口径,再比较参数 调参时尽量只改变一组关键变量,例如保持验证集不变,只比较两种 batch 或图片尺寸,并同时记录解释器、依赖版本、数据版本和设备。若模型与数据划分一起变动,就很难判断指标变化来自哪里。 验证集用于选择与调整方案,独立测试集用于后续评估。要同时查看误检、漏检和典型失败图片,而不是只追求单个汇总数字。小样本流程跑通后,仍需要按目标场景扩大验证;本文没有提供未经实测的准确率或速度承诺。 对应源码模块与配套项目本文结合本次整理源码编写,主要对应:gui/widgets/training_widget.py、gui/widgets/evaluation_widget.py、core/config.py。 项目介绍、界面截图与资料清单:桌面视觉模型训练与推理一体化工作台。

14 浏览
阅读详情 →
模型导出与推理联调:从本地图片到 ONNX 和 API 服务
技术指南

模型导出与推理联调:从本地图片到 ONNX 和 API 服务

拿到训练权重后,我会先用一张固定图片建立推理基线,再尝试导出和接口封装。这个顺序能把模型问题、格式转换问题与服务调用问题分开。配套工作台分别提供推理、导出和部署组件,也为按实际业务扩展功能留下了相对清晰的入口。 推理模块的真实配置界面;当前截图没有加载模型或生成检测结果。 1. 用固定图片建立可复核的推理基线 准备一张自己理解标注结果的测试图片,记录模型版本、图片尺寸、置信度阈值和设备。先核对类别、检测框与显示坐标,再比较不同参数的结果。下面是与推理模块调用思路一致的最小示例,路径需要替换成自己的实验输出。 这段代码针对检测框结果。分割或姿态任务还需要读取对应的数据结构,不能把 result.boxes 当作所有任务的统一输出。 from ultralytics import YOLO model = YOLO('runs/train/smoke_test/weights/best.pt') results = model.predict( source='samples/test.jpg', imgsz=320, conf=0.25, device='cpu', ) for result in results: if result.boxes is not None: print(result.boxes.xyxy.cpu().tolist()) print(result.boxes.conf.cpu().tolist()) print(result.boxes.cls.cpu().tolist()) 2. 输出类别与坐标要约定清楚 当前推理组件将检测结果整理为类别编号、类别名称、置信度和 bbox,坐标来自 xyxy。做二次开发时,应明确框坐标对应原图还是缩放后的画面,并在显示端执行一致的坐标换算。 视频和摄像头还要考虑帧序号、时间戳、队列长度与界面刷新频率。模型推理不宜长时间占用 GUI 主线程;保留后台任务与界面信号之间的边界,有助于后续扩展批量处理、自动标注或其他输入源。 3. 导出先选一种目标格式完成验证 导出组件会检查各格式依赖,再调用模型的 export 方法。缺少运行时或目标环境不支持时,某个格式可能被跳过或失败;出现格式选项不等于所有机器都具备导出能力。 例如,准备使用 ONNX 时,先按目标环境安装相应依赖,再导出一个模型。导出文件存在后,还应在目标运行时加载它,并用同一张图片比较输入尺寸、归一化、类别映射、后处理和输出坐标。格式转换成功不自动等于预测一致或速度更快。 from ultralytics import YOLO model = YOLO('runs/train/smoke_test/weights/best.pt') exported = model.export(format='onnx', imgsz=320) print('Exported model:', exported) 4. 本地 API 要把依赖、端口和请求形式对齐 部署组件包含生成本地 FastAPI 服务脚本并启动子进程的逻辑,提供 /health 和使用文件上传的 /predict 入口。测试时先准备 FastAPI、Uvicorn 和 python-multipart,选择有效模型,并在页面确认监听地址和端口。 如果在页面设置为 127.0.0.1:8000,可以按下面的方式检查健康接口和图片上传。请求采用 multipart 文件字段 file;把图片路径当作普通 JSON 字符串发送,与这个接口约定不同。 curl.exe http://127.0.0.1:8000/health curl.exe -F "file=@samples/test.jpg" http://127.0.0.1:8000/predict 5. 按业务扩展时,从稳定的接口约定开始 建议先将模型加载、输入处理、推理调用和结果序列化拆开,再根据业务增加模型切换、批量任务、人工复核或自动标注。模型尽量复用,避免每张图片都重新初始化;失败结果应有明确错误信息,并能与对应输入关联。 现有本地服务是学习和联调起点。需要用于多人或远程访问时,还应补充身份认证、文件大小限制、并发控制、超时和日志策略。边缘转换与部分自动标注入口仍待完善,支持按实际需求二次开发;具体目标硬件和导出格式应分别验收。 对应源码模块与配套项目本文结合本次整理源码编写,主要对应:gui/widgets/inference_widget.py、gui/widgets/export_widget.py、gui/widgets/deploy_widget.py。 项目介绍、界面截图与资料清单:桌面视觉模型训练与推理一体化工作台。

14 浏览
阅读详情 →
活动报名动态表单怎么设计:字段配置、校验与版本管理
技术指南

活动报名动态表单怎么设计:字段配置、校验与版本管理

活动报名表单看起来只是若干输入框,真正影响后续运营的,是字段变化后数据还能不能解释、审核和导出。若每场活动都单独写一套页面,字段一调整就要改代码;完全依赖前端动态渲染,又容易漏掉服务端校验。先把表单定义成有版本的配置可将字段定义为结构化配置:稳定的字段标识、显示名称、控件类型、是否必填、校验规则和可见条件。用户提交的数据按字段标识保存,而不是按页面显示名称保存。这样即使运营人员把“联系电话”改成“手机号”,历史数据仍可正确读取。前后端各做一次校验前端根据配置显示控件并给出即时反馈。服务端根据该活动当前生效的表单版本重新校验必填、长度、格式和条件联动。保存提交时记录表单版本及字段快照,保证日后可以还原提交时的规则。不能只相信浏览器传来的字段清单或“已通过校验”标记;所有字段都应由服务端确认属于该活动的有效配置。处理字段演进已经有人报名后,建议发布新版本而不是覆盖旧配置。新报名使用新版本,历史报名保留原始快照;导出时再按统一列映射整理。对于身份证号、手机号等敏感字段,应限制可见角色、避免写入普通日志,并在导出前再次确认权限。落地时可以先从文本、单选、多选、日期等基础控件开始,再逐步增加条件显示。先明确数据结构和变更规则,后续扩展才不会被表单页面绑死。

21 浏览
阅读详情 →
活动报名审核流程:用状态机保证可追溯与不重单
技术指南

活动报名审核流程:用状态机保证可追溯与不重单

报名、审核、支付和签到经常被做成几个互不关联的按钮,结果是同一报名重复审核、支付成功却仍显示待确认,或者已签到的记录又被取消。把流程明确成状态机,是降低这些边界问题的第一步。先定义允许的状态迁移可以从“待审核、已通过、已拒绝、待支付、已确认、已取消、已签到”这些业务状态中选择实际需要的状态,并明确每种状态允许由谁、通过什么操作进入下一状态。免费活动不需要支付状态;无需审核的活动也不应经过审核节点。每次迁移都保留业务证据记录操作人、操作时间、原状态、新状态和备注。审核通过或拒绝时,以报名记录的当前状态作为更新条件,避免并发请求重复处理。涉及名额扣减时,在事务中完成状态迁移与名额更新;失败时整体回滚。对外部支付回调使用订单号和平台交易号做幂等校验,重复通知不重复生成报名或收入记录。状态日志与当前状态应分开保存:当前状态便于查询,日志用于审计和排查。管理员补录或撤销也应走明确操作并留下原因,而不是直接改数据库字段。把异常路径纳入验收测试重复点击、审核期间名额已满、支付超时后补回调、用户取消后再次支付、签到后尝试退款等情况。每个异常都要定义最终状态及用户提示。流程先求清晰,再考虑把审批、通知和对账拆成可独立扩展的服务。

19 浏览
阅读详情 →
小程序与 H5 活动签到核销:二维码、位置授权和幂等处理
技术指南

小程序与 H5 活动签到核销:二维码、位置授权和幂等处理

签到功能的核心不是展示一个二维码,而是证明“这条报名记录在指定活动和时间内,被有权限的工作人员确认到场”。小程序、H5 与后台核销端都不应仅凭前端传来的报名编号直接改成已签到。设计可验证的一次性凭证为报名记录生成短时有效、难以猜测的签到凭证,服务端核验凭证对应的活动、报名人、有效期和使用状态。核销成功时用原子更新确保同一凭证只能消费一次;重复扫码返回“已签到”结果,不重复计数。明确工作人员的核销范围核销账号需登录,并确认其被授权管理当前活动。扫码后由服务端校验活动状态、报名审核状态及凭证有效期。成功核销时写入时间、核销员工和渠道,供活动后复盘。工作人员离线或网络不稳定时,先显示待确认,不要将前端缓存当成最终签到结果。位置签到属于额外校验,需说明采集目的并取得用户授权。用户拒绝位置授权时,应提供合理的人工核验路径;地理围栏阈值还要考虑室内定位误差,不宜把定位失败直接等同于违规。关注隐私与现场体验签到页只展示完成核验所需的信息,避免把完整手机号等敏感资料暴露给扫码人员。现场应准备按姓名或报名码查询的备用流程,并对高峰扫码进行并发测试。真正可靠的核销,是服务端校验、幂等写入、操作留痕和现场兜底共同工作的结果。

18 浏览
阅读详情 →
活动订单与报名数据导出:支付回调、对账和隐私边界
技术指南

活动订单与报名数据导出:支付回调、对账和隐私边界

付费活动至少涉及报名、订单和支付三类数据。把三者混成一条“报名成功”记录,会让退款、支付超时和重复回调都难以处理。较稳妥的做法是分别保存报名单、订单状态和支付流水,并通过业务编号建立关联。以服务端支付结果为准前端支付完成页只负责提示,不作为入账依据。服务端接收支付平台通知后,应验证签名、商户与金额,检查订单号和交易号,再以幂等方式更新订单。重复通知只返回成功响应,不应重复创建流水或增加统计。让对账过程可复核保存订单金额、应付金额、优惠信息及退款状态的变更记录。定期按商户订单号、平台交易号、金额和时间核对平台账单。对支付成功但报名状态未更新的记录,提供可审计的补偿任务。退款需关联原支付流水,不能仅靠删除订单或手动改报名状态完成。导出时按照岗位提供最少必要字段。普通活动运营者通常只需要报名状态和联系信息的部分掩码;财务核对需要金额和交易号,但不一定需要完整报名问卷。导出操作应记录操作者、筛选范围、时间及用途。把数据质量当作功能为重复提交、同一用户多次报名、订单过期、部分退款和活动取消建立统一规则,并在统计口径中说明“报名数、支付人数、实到人数”的区别。这样导出表才能服务于运营和财务,而不是制造新的人工核对工作。

18 浏览
阅读详情 →
ThinkPHP OA 权限模型:组织架构、角色与数据范围如何分层
技术指南

ThinkPHP OA 权限模型:组织架构、角色与数据范围如何分层

企业 OA 的权限不仅是“能不能打开某个菜单”。用户可能有页面访问权限,却不应看到其他部门的合同;也可能可以查看项目,却不能修改任务。把菜单、操作和数据范围混为一谈,权限规则很快会变得难以维护。拆成三层授权菜单权限:决定用户能否进入工作台、审批、客户或项目等模块。操作权限:决定能否新增、编辑、审核、导出或删除具体记录。数据范围:决定用户能看哪些部门、本人负责或参与的业务数据。组织部门、岗位、角色与用户应分别建模。岗位描述职责,角色聚合权限,组织关系用于数据范围;一个人可拥有多个角色,但最终权限需要按清晰规则合并。在服务端统一执行数据范围列表、详情、导出和统计接口都应走同一套数据范围条件,不能只在页面按钮上隐藏功能。对“本人、所在部门、部门及下级、全部”等范围,先把规则转成可测试的查询条件,再应用到每个业务入口。详情页也要重新校验记录权限,防止通过猜测 ID 绕过列表限制。保持可审计、可回收角色授权变更记录操作者和变更内容;离职或调岗时优先停用账号并迁移业务归属,不要直接删除仍被合同、审批引用的用户。测试时至少覆盖跨部门访问、越权导出、禁用账号、多个角色叠加和管理员最小授权。权限清晰,比不断追加特例更容易长期维护。

17 浏览
阅读详情 →
分类审批工作流实践:状态迁移、并发审批与审计日志
技术指南

分类审批工作流实践:状态迁移、并发审批与审计日志

请假、报销、用章等申请常常共享“提交—审批—结束”的外观,但审批节点、金额规则和撤回条件各不相同。若把所有业务塞进一套写死的 if/else,后续新增流程会牵动大量代码;若只做可任意配置的流程引擎,又会提高维护门槛。从明确的业务状态开始为每种申请类型定义必要状态和合法迁移,例如草稿、审批中、已通过、已拒绝、已撤回。审批记录应保存节点、审批人、意见、时间和当时的申请内容快照。申请正文变化后,不能让既有审批记录失去对应依据。处理多人和并发操作多人会签应明确“全部通过”还是“任一通过”;或签则明确谁先处理生效。审批提交时检查记录版本或当前状态,避免两个并发请求重复完成同一节点。业务状态、审批日志和待办更新尽可能在事务中保持一致。通知可异步发送,但失败重试不能重复推进审批状态。撤回、转交、加签、补审等功能要明确可用节点和权限,并记录原因。不要通过直接修改申请表状态来代替审批操作,否则审计链会断开。把规则和界面分开审批规则由服务端决定,页面负责展示当前节点和可执行动作。针对金额阈值、部门负责人、申请人本人审批等边界,建立表格化测试案例。先让常用流程稳定,再逐步抽取通用节点配置,避免一开始追求过度通用的流程设计。

16 浏览
阅读详情 →
OA 工作台统计怎么做:待办聚合、索引与查询优化
技术指南

OA 工作台统计怎么做:待办聚合、索引与查询优化

工作台常见问题是把每张业务表的所有记录逐条取回,再由 PHP 计算待办和统计数。数据量小时看不出来,业务增长后首页会出现慢查询、重复计数和不同模块数字对不上的情况。先定义每个指标的口径“待审批”按当前待办节点和审批人计算;“我发起的申请”按申请人计算;“项目完成率”要说明分母是否排除取消任务。把指标口径写清楚,避免同一个数字在卡片、列表和报表中采用不同条件。让数据库做可索引的聚合查询只选工作台需要的字段,避免加载整条记录和关联大字段。为高频筛选组合建立合适索引,例如状态、处理人、部门与创建时间。检查分页、关联查询和统计查询的执行计划,避免 N+1 查询。跨多个模块的统计可设置短时缓存,但业务变更后要明确失效策略。不要把高频待办统计简单缓存很久,否则审批完成后用户仍看到旧提醒。可以把实时待办与低频历史汇总分开:待办尽量准确,趋势图或大盘统计允许短时间延迟。用真实数据验证性能测试时覆盖空数据、大部门、多角色、跨月统计和集中审批高峰。记录 SQL 执行时间与返回条数,优先优化最慢且调用最频繁的查询。工作台的目标不是堆满图表,而是让用户快速判断下一步要处理什么。

16 浏览
阅读详情 →
OA 项目协作模块:阶段、任务、工时与文档权限设计
技术指南

OA 项目协作模块:阶段、任务、工时与文档权限设计

项目管理模块要同时回答四个问题:项目当前在哪个阶段、谁负责什么任务、进度如何计算、相关文档谁能查看。若只把任务标题和完成状态放在一张表里,计划、责任与实际投入很难形成可用的项目视图。划清实体和归属关系项目记录负责人、成员、计划周期和当前阶段;阶段包含排序与计划时间;任务关联阶段、负责人、状态、优先级和截止日期;工时记录任务、填报人、日期和时长。文档单独保存元数据和访问范围,不要依赖文件路径本身充当权限。定义可解释的进度口径可以按任务权重计算阶段进度,也可以展示已完成任务占比,但要在界面说明口径。延期任务、暂停任务和取消任务应有明确规则。任务状态变化记录操作者和时间,重要计划调整保留历史,以便复盘。让权限跟随业务参与关系项目负责人可管理项目设置和成员。项目成员按授权查看任务与协作文档。工时修改或补录记录原因,财务或管理员可按职责查看汇总。文档下载、外链和导出采用与页面相同的数据权限。最后验证成员移出项目、负责人变更、任务转派、跨阶段移动、工时更正和项目归档等场景。把权限和进度规则设计清楚,项目协作才不会沦为一个简单的任务列表。

16 浏览
阅读详情 →