🏙️ 数智联城信息采集平台 · 服务端 API

Node.js + SQLite(内置 node:sqlite,零 npm 依赖),数据存储于 server-js/data/city_update.db,种子数据对齐小程序端 mock。

ADMIN进入数据管理后台 → 项目 / 分类 / 标注 / 采集区 / 采集记录 / 配置 增删改查
健康检查
GET/api/health

分类与地图

GET/api/categories 分类列表
POST/api/categories 新增分类(key 唯一)
PUT/api/categories/商业建筑 更新中心点/缩放/图标
DELETE/api/categories/商业建筑 删除分类(引用数据迁移到「居住建筑」)
GET/api/map-data?category=居住建筑 center + markers + polygons

项目

GET/api/projects?category=产业&keyword=和平里 筛选/搜索
GET/api/projects/P177 详情(嵌套 area/population)
POST/api/projects 新增(自动生成 P+时间戳 id)
PUT/api/projects/P177 更新
DELETE/api/projects/P177 软删除(archived);加 ?hard=1 彻底删除(含关联采集记录)
GET/api/export/projects?status=all 导出项目 Excel(status: all 全部/active 在用/archived 归档;含「项目照片」列——本地照片以缩略图嵌入单元格)
POST/api/import/projects 导入 Excel 项目(base64 + mode: overwrite/skip/insert_only)

采集记录(地图绘制 线/面/笔/刷)

GET/api/collections?project_id=&category=&limit=
POST/api/collections geometry 存 GeoJSON
DELETE/api/collections/1

配置

GET/api/settings userConfig / appMeta
GET PUT/api/settings/userConfig

采集员与头像

GET/api/users 采集员列表
GET PUT DELETE/api/users/:openid PUT 为 upsert(昵称/头像/角色)
POST/api/cloud/tempfileurl 云存储 fileID 列表 → 微信临时 HTTPS 链接(需 cloud-config.json 配置 appid/secret)
POST/api/avatar/upload base64 头像 → 返回 /avatars/xxx.png
GET/avatars/:filename 头像静态文件(含路径穿越防护)

项目照片(拍照/相册上传)

POST/api/project-image/upload base64 照片 → 返回 /project-images/xxx.jpg,随项目 PUT/POST 保存到 images 数组
GET/project-images/:filename 项目照片静态文件(含路径穿越防护)
images 字段 项目 JSON 中为相对路径数组:images: ["/project-images/a.jpg"],小程序用 assetUrl() 转完整地址

数据模型(表)

说明种子
categories5 大分类 + 地图中心点/缩放5
projects项目全字段(对齐详情页截图)6
map_markers地图采集标注15
map_polygons红色采集区多边形5
collections用户绘制采集记录0
users采集员/管理员0
settings配置项(JSON)2