配置与部署
配置项
| 配置 | 默认 | 含义 |
|---|---|---|
| ConnectionStrings:DefaultConnection | LocalDB / EARSystem | 开发数据库;生产切换 SQL Server Express |
| Demo:Enabled | Development=true,其余=false | 是否生成/展示快捷演示账号入口;Production 始终禁止快捷登录与自动生成 |
| Demo:Longitude / Latitude | 120.155 / 30.274 | 新建演示库的杭州 GCJ-02 中心;修改后不会移动已有样本 |
| AMap:WebServiceKey | 空 | 服务器坐标转换、地理编码与周边搜索 |
| AMap:BrowserKey | 空 | JS API 2.0 Key,公开于需要地图的页面 |
| AMap:JsSecurityCode | 空 | 安全代理补充的服务器密钥 |
| AMap:AllowExternalReferences | false | 预留配置;本版不启用第三方地点持久化 |
| BootstrapAdmin:Email / Password | 空 | 首次部署创建管理员,之后不会改写已有账号密码 |
| AllowedHosts | localhost;127.0.0.1 | 部署时设置实际站点域名 |
Development 配置支持 dotnet user-secrets。生产通过受保护的环境变量或部署系统提供配置。环境变量使用双下划线,例如 AMap__WebServiceKey 和 ConnectionStrings__DefaultConnection。不要把真实密钥或数据库密码写进仓库。
时间统一以 UTC 保存,查询与周报使用北京时间。SQL 表中主要时间字段存 UTC ticks,DemoSeededAt 为 UTC datetimeoffset;这些均由 EF 映射,无须应用自行转换。
LocalDB 与迁移
开发连接:
Server=(localdb)\MSSQLLocalDB;Database=EARSystem;Trusted_Connection=True;TrustServerCertificate=True
Development 启动自动迁移;生产不自动迁移。也可显式执行:
dotnet tool restore
dotnet ef database update --project src/EARSystem.Infrastructure --startup-project src/EARSystem.Web
DesignTimeDbContextFactory 读取 ConnectionStrings__DefaultConnection 环境变量,否则使用上述开发连接。部署迁移时务必设置该变量;设计时工厂不读取 Web 的 user-secrets。
包含两份迁移:初始业务/Identity 模型,演示数据完成标记。标记避免重启后重新生成用户已经删除的示例内容。
演示生成器使用固定随机种子构造虚构地点、波动自评、留空日期和体验;所有密码随机生成。需要重新演示一套完整样本时,设置新的开发库名再运行 --seed-demo;该工具不执行删除或重置。
Windows IIS + SQL Server Express
以下为部署流程,当前交付没有向公网发布。生产数据库应与演示库分开。
- 安装 IIS 和与 .NET 10 对应的 ASP.NET Core Hosting Bundle;为应用创建独立站点及应用池。Hosting Bundle 为 IIS 提供 ASP.NET Core 模块,发布后的 web.config 负责启动应用。微软 IIS 部署文档
- 建立 SQL Server Express 数据库 EARSystemProd,给应用所用数据库身份最小必要的业务读写权限;迁移使用单独具有建表权限的部署身份。启用可信服务器证书。
- 在管理员终端设置迁移连接字符串并执行迁移。示意连接为 Server=YOUR-SERVER\SQLEXPRESS;Database=EARSystemProd;Integrated Security=True;Encrypt=True;TrustServerCertificate=False。请替换实际服务器;不要在共享终端回显连接凭据。
- 发布应用:
dotnet publish src/EARSystem.Web -c Release -o artifacts/publish
- 将发布目录配置为 IIS 站点根目录;配置可信 HTTPS 证书、实际主机名和防火墙规则。本站路由以根目录为基准,第一版不支持部署在虚拟子路径下。
- 为站点配置 ASPNETCORE_ENVIRONMENT=Production、AllowedHosts、ConnectionStrings__DefaultConnection、AMap__*。保持 Demo__Enabled=false。
- 首次启动前配置 BootstrapAdmin__Email 和一个符合 Identity 要求的强密码(至少 10 位,大小写、数字、符号)。成功建立管理员后,从部署环境移除 BootstrapAdmin__Password。已存在的管理员不会在后续启动被改密。
- 给应用池身份发布目录的读取权限和 App_Data/keys 的读写权限;该目录用于持久化 Cookie 的 Data Protection 密钥。服务器静态文件只从 wwwroot 提供,App_Data 不可作为公共目录映射。
- 访问 HTTPS 站点,创建普通用户,依次完成日记、在线查询、独立地点收藏、体验和回顾验收。进入管理员后台维护具有独立授权来源的地点目录。
IIS 会转发 HTTPS 协议;本应用在 Production 启用 HSTS、HTTPS 重定向以及 Secure Cookie。如果部署在其他反向代理后,需要先配置可信代理和 ForwardedHeaders,再使用重定向;当前交付以 IIS 部署为准。
SQL Server 的 Integrated Security 需要授予 IIS 应用池身份对应权限;远程数据库可采用专用服务账户或数据库身份。不要沿用 LocalDB 的 TrustServerCertificate=True 作为生产证书策略。
运行与恢复
- 外部查询 8 秒超时;每个账号的地图相关入口限流 30 次/分钟,超过返回 429。
- 推荐历史只存目标、模式、算法版本、耗时和独立地点引用;不存查询坐标、距离分项、日记正文或实时供应商响应。
- SQL 日志不启用敏感数据输出;地图 HttpClient 请求日志关闭,避免记录带 Key 的 URL。
- 日记和体验用版本号检查并发。遇到 409,界面保留输入,重新加载记录后再提交。
- 保存体验并同步日记在同一事务内执行。取消同步或删除体验时保留已有日记内容,并解除关联。
- 有效氛围采用每个用户最新的一份评分统计;数据库另限制同用户同地点同一天一份体验。撤回同意、删除或修改后,下次查询重新聚合。
- 定期备份数据库和 App_Data/keys;恢复时保留一致的 Data Protection 密钥,否则旧 Cookie 会失效。生产备份与恢复操作由部署者执行。
当前集成边界
提供真实高德接入代码和模拟 HTTP 测试;本次没有真实 Key,因此未完成真实配额、地图瓦片和跨设备 HTTPS 定位验收。现场演示可以全程使用演示模式;正式启用在线模式前按上述步骤进行真实服务验收。
在线地点营业状态当前显示未知,不对复杂营业时间文本作确定判断。未知价格保留,未知评分使用中性值;勾选“仅营业中”时,未知营业状态会被过滤。
演示反馈不计入 Collected 地点的真实氛围。独立样本基线保留来源说明,用户文字感受仅本人可见;匿名贡献只参与六个结构化氛围均值。