Node.js + SQLite(内置 node:sqlite,零 npm 依赖),数据存储于 server-js/data/city_update.db,种子数据对齐小程序端 mock。
/api/health/api/categories 分类列表/api/categories 新增分类(key 唯一)/api/categories/商业建筑 更新中心点/缩放/图标/api/categories/商业建筑 删除分类(引用数据迁移到「居住建筑」)/api/map-data?category=居住建筑 center + markers + polygons/api/projects?category=产业&keyword=和平里 筛选/搜索/api/projects/P177 详情(嵌套 area/population)/api/projects 新增(自动生成 P+时间戳 id)/api/projects/P177 更新/api/projects/P177 软删除(archived);加 ?hard=1 彻底删除(含关联采集记录)/api/export/projects?status=all 导出项目 Excel(status: all 全部/active 在用/archived 归档;含「项目照片」列——本地照片以缩略图嵌入单元格)/api/import/projects 导入 Excel 项目(base64 + mode: overwrite/skip/insert_only)/api/collections?project_id=&category=&limit=/api/collections geometry 存 GeoJSON/api/collections/1/api/settings userConfig / appMeta/api/settings/userConfig/api/users 采集员列表/api/users/:openid PUT 为 upsert(昵称/头像/角色)/api/cloud/tempfileurl 云存储 fileID 列表 → 微信临时 HTTPS 链接(需 cloud-config.json 配置 appid/secret)/api/avatar/upload base64 头像 → 返回 /avatars/xxx.png/avatars/:filename 头像静态文件(含路径穿越防护)/api/project-image/upload base64 照片 → 返回 /project-images/xxx.jpg,随项目 PUT/POST 保存到 images 数组/project-images/:filename 项目照片静态文件(含路径穿越防护)images: ["/project-images/a.jpg"],小程序用 assetUrl() 转完整地址| 表 | 说明 | 种子 |
|---|---|---|
| categories | 5 大分类 + 地图中心点/缩放 | 5 |
| projects | 项目全字段(对齐详情页截图) | 6 |
| map_markers | 地图采集标注 | 15 |
| map_polygons | 红色采集区多边形 | 5 |
| collections | 用户绘制采集记录 | 0 |
| users | 采集员/管理员 | 0 |
| settings | 配置项(JSON) | 2 |