EARSystem · 耳间
ASP.NET Core 10 MVC + Razor 实现的情绪记录与附近生活推荐网站。记录心情、精力、压力与想法,系统根据近期状态和六维氛围匹配地点;收藏、到访体验、情绪日历与周报构成完整闭环。
快速运行
需要 Windows、.NET SDK 10.0.401 或同系列兼容 SDK、SQL Server LocalDB。项目自带 Bootstrap 和 Chart.js,无外网时演示功能仍可使用。首次 NuGet 还原需要网络。
在解决方案目录执行:
dotnet restore EARSystem.sln
dotnet tool restore
dotnet run --project src/EARSystem.Web --launch-profile http
打开 http://localhost:5188,进入登录页,点击 体验演示账号。也可以注册自己的账号,体验没有历史记录时的推荐。
Development 环境首次启动自动迁移 LocalDB 数据库,并生成 60 个虚构地点、6 类场景、20 个示例账号和覆盖最近 90 天的合成记录。部分日期刻意留空。系统另有一个演示管理员,不计入 20 个示例用户。
演示账号与地点都有来源标识。初始化完成后不会重复填充,修改或删除示例记录后重启也会保持结果。需要一套全新样本时,请通过配置选择新的开发数据库名称;初始化工具不会清空已有数据库。
$env:ASPNETCORE_ENVIRONMENT = 'Development'
dotnet run --project src/EARSystem.Web --no-launch-profile -- --seed-demo
该命令初始化并退出,重复执行安全;Production 环境拒绝此命令。随机生成的账号密码仅写入本地忽略文件:
src/EARSystem.Web/App_Data/demo-credentials.txt
管理员邮箱为 admin@ear.local,密码从该文件读取;通过普通登录页登录后访问 /Admin。文件不在静态资源目录,不能通过网站下载。
HTTPS 开发配置:
dotnet run --project src/EARSystem.Web --launch-profile https
地址为 https://localhost:7188。开发证书需要在本机受信任;如尚未配置,请自行运行 dotnet dev-certs https --trust。当前本地预览使用 HTTP localhost,跨设备部署使用可信 HTTPS。
功能
| 入口 | 已实现 |
|---|---|
| 今日 | 状态摘要、近七天曲线、快速记录、最近片段 |
| 情绪日记 | 一天多次记录、补记、编辑与删除、文字标签确认、并发冲突提示 |
| 附近推荐 | 自动/手动目标、类别/预算/营业/距离筛选、列表与地图、来源与分项解释 |
| 地点详情 | 独立目录详情、六维氛围、收藏、真实地点路线入口 |
| 我的体验 | 满意度、前后心情、六维评价、私密感受、可选匿名评分及同步日记 |
| 情绪回顾 | 7/30 天趋势、最近 30 天日历、按周统计 |
| 想去清单 | 想去/去过筛选与取消收藏 |
| 个人设置 | 喜欢与屏蔽类别、屏蔽地点、默认预算和距离 |
| 管理后台 | 独立样本维护、权重版本与并发校验、数量和运行耗时;不展示日记正文 |
首页自评保存后重新加载服务端摘要,补记不会错误覆盖当前状态。趋势和日历使用北京时间当天最后一次自评;无记录日期留空。
高德地图配置
未配置密钥时,可直接运行演示模式与本地点分布示意图。真实查询需配置三个独立项:
dotnet user-secrets set 'AMap:WebServiceKey' '<Web 服务 API Key>' --project src/EARSystem.Web
dotnet user-secrets set 'AMap:BrowserKey' '<JS API Key>' --project src/EARSystem.Web
dotnet user-secrets set 'AMap:JsSecurityCode' '<JS API 安全密钥>' --project src/EARSystem.Web
Web 服务密钥和安全密钥只留在服务器;浏览器 Key 用于加载 JS API。安全代理使用官方要求的 /_AMapService 前缀,限定可转发的路径和上游域名。请在高德控制台配置适当的域名与密钥权限。接入依据见 高德安全密钥文档。
保存配置后重启应用,再切换在线模式。
切换“真实附近地点”后请求定位。定位失败可以展开位置面板,搜索地址、输入坐标或点击地图选点。WGS84 转换一次为 GCJ-02;默认 3 公里,可选 1/3/5/10 公里。外部查询共享 8 秒超时,失败时显示明确提示和演示模式入口。
供应商返回的评分、价格和营业信息可能缺失,页面显示“未知”。当前在线营业状态采取保守的未知值,因此“仅营业中”会排除这些实时地点。评分与氛围分开处理;商家评分不会转换为六维氛围。字段依据见 高德地点查询文档。
实时第三方地点支持浏览和路线查询,默认不复制到业务库,也不提供直接持久化收藏。长期收藏、体验与氛围贡献使用管理员维护的独立地点目录。演示数据和独立真实采集数据分开存储。
项目结构
EARSystem.sln
src/
EARSystem.Web/ MVC、Razor、Identity 登录与同源 JSON API
EARSystem.Core/ 领域实体、时间口径、情绪画像、目标规则与六项评分
EARSystem.Infrastructure/ EF Core、SQL Server、地图接入、聚合反馈与演示生成
tests/EARSystem.Tests/ xUnit、隔离数据库集成测试、HTTP 模拟与算法评估
tools/benchmark.mjs 20 个示例账号的本地并发基准
docs/ 配置、部署、架构/ER/业务流程、算法与验收材料
关键接口为 IEmotionProfileService、IRecommendationService、IPlaceProvider 与 IExperienceService。主算法位于 src/EARSystem.Core/Recommendation.cs。
验证
dotnet test EARSystem.sln -c Release --logger 'trx;LogFileName=release-tests.trx'
dotnet ef migrations has-pending-model-changes --project src/EARSystem.Infrastructure --startup-project src/EARSystem.Web
集成测试使用内存 SQLite,与开发 LocalDB 隔离。推荐基准使用运行中的开发服务器和合成账号,需要 Node.js 20 或更新版本:
node tools/benchmark.mjs http://localhost:5188
脚本限制目标为 localhost/127.0.0.1,不打印密码;20 人同时请求、预热后测 5 轮共 100 次。结果写入 artifacts/benchmark.json。算法对比测试输出 artifacts/evaluation.json:
dotnet test tests/EARSystem.Tests -c Release --filter 'Category=Evaluation'
合成偏好评估仅用于说明排序行为。真实用户试用的相关性与满意度需要单独采集和报告。
交付资料
天气、呼吸计时、记账、语音日记、大模型摘要、社区、支付和推广保持为后续扩展项。首版没有离线编辑队列;账号跨设备同步通过服务器数据库,重新加载页面即可读取最新内容。