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