V3.0 交付体系 + 精准权限系统
交付环节优化: - 新建项目必填送达者(人)邮箱,项目完成/遇到无法绕开的难关时自动邮件及时通知 - 每个项目独立工作目录 data/workspace/project_<id>/,交付物分类存放互不污染(上传/下载/删除) - 网页交付物一键部署到 /demo/<id>/ 免登录公开 Demo,送达者直接打开链接查看 - 非网页交付物 zip 打包 data/packages/,随邮件附件发送送达者(含手动交付/完成交付/自动交付) - 任务全部完成自动收尾交付;失败任务触发难关通知(30分钟限频去重) 用户(人)管理 + 精准权限: - 管理员增删改用户,管理用户项目所属与 Worker 权限(授权弹窗 + 授权总览矩阵) - 角色体系:admin 全部 / auditor 全量只读 / member 按授权 - 项目授权 view/manage/admin;Worker 授权 view/use/manage;创建者自动成为项目管理员 - 仪表盘/成本报表/日志/协作/评估全部按权限过滤,越权访问 403 新表:project_deliverables / user_projects / user_workers;新模块 delivery.py
This commit is contained in:
@@ -16,6 +16,12 @@ CREATE TABLE IF NOT EXISTS projects (
|
||||
acceptance_criteria TEXT DEFAULT '',
|
||||
status TEXT DEFAULT 'active', -- planning/active/done/archived
|
||||
budget_limit REAL DEFAULT 0, -- 项目预算上限(元),0=不限
|
||||
deliver_email TEXT DEFAULT '', -- 送达者(人)邮箱,新建项目必填
|
||||
deliver_type TEXT DEFAULT 'web', -- 交付物类型 web=网页 / file=文件包
|
||||
deliver_note TEXT DEFAULT '', -- 交付说明
|
||||
workspace_dir TEXT DEFAULT '', -- 项目工作目录(相对 data/ 的目录名)
|
||||
demo_url TEXT DEFAULT '', -- 网页交付物 Demo 访问地址
|
||||
delivered_at INTEGER, -- 最近一次交付/送达时间
|
||||
created_at INTEGER,
|
||||
updated_at INTEGER
|
||||
);
|
||||
@@ -258,6 +264,44 @@ CREATE TABLE IF NOT EXISTS enterprise_settings (
|
||||
value TEXT DEFAULT ''
|
||||
);
|
||||
|
||||
-- ===================================================================
|
||||
-- V3 表结构:交付体系(工作目录/交付物/Demo/邮件送达) + 用户授权(项目/Worker 权限)
|
||||
-- ===================================================================
|
||||
CREATE TABLE IF NOT EXISTS project_deliverables (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
project_id INTEGER NOT NULL,
|
||||
name TEXT NOT NULL,
|
||||
kind TEXT DEFAULT 'file', -- file/dir/webpage/package
|
||||
path TEXT DEFAULT '', -- 相对项目工作目录路径 / 打包文件名
|
||||
demo_url TEXT DEFAULT '', -- 网页交付物的 Demo 访问地址
|
||||
size INTEGER DEFAULT 0,
|
||||
note TEXT DEFAULT '',
|
||||
created_at INTEGER
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS user_projects (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
user_id INTEGER NOT NULL,
|
||||
project_id INTEGER NOT NULL,
|
||||
perm TEXT DEFAULT 'view', -- view 查看 / manage 管理 / admin 管理员
|
||||
created_at INTEGER,
|
||||
UNIQUE(user_id, project_id)
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS user_workers (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
user_id INTEGER NOT NULL,
|
||||
worker_id INTEGER NOT NULL,
|
||||
perm TEXT DEFAULT 'view', -- view 查看 / use 使用(可指派任务)/ manage 管理(可改配置)
|
||||
created_at INTEGER,
|
||||
UNIQUE(user_id, worker_id)
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_deliverables_project ON project_deliverables(project_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_user_projects_user ON user_projects(user_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_user_projects_project ON user_projects(project_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_user_workers_user ON user_workers(user_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_user_workers_worker ON user_workers(worker_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_agent_steps_run ON agent_steps(run_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_agent_runs_status ON agent_runs(status);
|
||||
CREATE INDEX IF NOT EXISTS idx_eval_cases_ds ON eval_cases(dataset_id);
|
||||
@@ -286,6 +330,22 @@ def _migrate():
|
||||
conn.execute('ALTER TABLE tasks ADD COLUMN deleted INTEGER DEFAULT 0')
|
||||
conn.execute('ALTER TABLE tasks ADD COLUMN deleted_at INTEGER')
|
||||
conn.execute('CREATE INDEX IF NOT EXISTS idx_tasks_deleted ON tasks(deleted)')
|
||||
# V3:projects 交付字段
|
||||
pcols = {r['name'] for r in conn.execute('PRAGMA table_info(projects)')}
|
||||
for col, ddl in (
|
||||
('deliver_email', "ALTER TABLE projects ADD COLUMN deliver_email TEXT DEFAULT ''"),
|
||||
('deliver_type', "ALTER TABLE projects ADD COLUMN deliver_type TEXT DEFAULT 'web'"),
|
||||
('deliver_note', "ALTER TABLE projects ADD COLUMN deliver_note TEXT DEFAULT ''"),
|
||||
('workspace_dir', "ALTER TABLE projects ADD COLUMN workspace_dir TEXT DEFAULT ''"),
|
||||
('demo_url', "ALTER TABLE projects ADD COLUMN demo_url TEXT DEFAULT ''"),
|
||||
('delivered_at', 'ALTER TABLE projects ADD COLUMN delivered_at INTEGER'),
|
||||
):
|
||||
if col not in pcols:
|
||||
conn.execute(ddl)
|
||||
# V3:老项目补齐工作目录名
|
||||
for r in conn.execute("SELECT id, workspace_dir FROM projects WHERE workspace_dir IS NULL OR workspace_dir=''"):
|
||||
conn.execute('UPDATE projects SET workspace_dir=? WHERE id=?',
|
||||
('project_%d' % r['id'], r['id']))
|
||||
conn.commit()
|
||||
conn.close()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user