# 功能修改与问题分析文档

## 一、匿名发布功能

### 功能说明
- 动态所有人可见
- 显示发布者为"匿名用户"
- 其他用户**无法查看个人主页**
- 后台管理可查看真实用户信息

第一步先进行### 数据库变更
不然就会出现不能发布动态的情况

```sql
ALTER TABLE `husns_posts` ADD `is_anonymous` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否匿名发布：0否 1是' AFTER `user_id`;
```

> **注意**：将 `husns_` 替换为你实际的数据库前缀

### 功能流程

```
前端发布 → is_anonymous=1 → API接收 → Model保存 → 返回数据时隐藏用户信息
```

### 使用方法

1. 执行上述 SQL 语句
2. 用户登录后点击发布按钮
3. 点击"隐私"按钮（盾牌图标）开启匿名发布
4. 发布成功后，动态显示为"匿名用户"

## 二、功能修复与改进

### 1. 收藏功能修复

#### 问题
- 收藏页面显示的是用户自己发布的动态，而不是用户收藏的动态

#### 修复内容
- 修改 `content/api/MobileApiController.php` 中的 `userPosts` 方法，添加 `type` 参数支持
- 修改 `content/favorite/FavoriteModel.php` 中的 `getUserFavorites` 方法，调整返回格式与 `getUserPosts` 保持一致
- 确保收藏页面正确显示用户收藏的其他用户的动态

### 2. 私信功能实现

#### 功能说明
- 用户可以通过用户页面发送私信
- 私信通过弹窗形式发送
- 支持未登录用户显示登录弹窗

#### 实现细节
1. **前端**：添加私信弹窗和相关JavaScript函数
2. **后端**：添加 sendMessage API 端点和模型方法
3. **数据库**：需要创建 private_messages 表存储私信数据

#### 数据库变更

```sql
CREATE TABLE IF NOT EXISTS `husns_private_messages` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `sender_id` int(11) NOT NULL COMMENT '发送者ID',
    `receiver_id` int(11) NOT NULL COMMENT '接收者ID',
    `content` text NOT NULL COMMENT '私信内容',
    `created_at` int(11) NOT NULL COMMENT '创建时间',
    `is_read` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否已读',
    `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态',
    PRIMARY KEY (`id`),
    KEY `idx_sender` (`sender_id`),
    KEY `idx_receiver` (`receiver_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='私信表';
```

> **注意**：将 `husns_` 替换为你实际的数据库前缀

### 3. 其他功能修复

#### 涉及主题文件夹以外的文件修改

| 文件路径 | 修改内容 |
|---------|---------|
| `content/api/MobileApiController.php` | 修复点赞功能；修复置顶和加精功能；添加 sendMessage() 方法处理私信发送；添加IP地址转省份功能 |
| `content/favorite/FavoriteModel.php` | 修改 getUserFavorites() 方法返回格式，与 getUserPosts() 保持一致 |
| `content/post/PostModel.php` | publish() 方法保存 `is_anonymous` 字段到数据库 |
| `content/user/UserModel.php` | 添加 sendMessage() 方法用于发送私信 |

#### 主题文件夹内的文件修改

| 文件路径 | 修改内容 |
|---------|---------|
| `templates/mobile/app/index.php` | 添加 IS_ADMIN 全局变量，修复管理员下拉菜单；修复点赞功能API调用；优化用户信息布局，添加IP地址显示 |
| `templates/mobile/layouts/app.php` | 表情选择器修改，与默认主题保持一致；修复表情显示大小；添加私信弹窗和相关JavaScript函数 |
| `templates/mobile/FavoriteModel.php` | 辅助模型文件，处理收藏相关逻辑 |
| `templates/mobile/app/user.php` | 修复私信功能，调用弹窗而不是Toast；添加表情图片大小限制样式；优化用户信息布局，添加IP地址显示 |

## 三、通知页面分类筛选功能修复

### 问题描述
- 通知页面中，"赞"、"评论"和"@我的"三个标签显示的内容完全相同，无法正确筛选不同类型的通知

### 修复内容

#### 1. 修改 `content/mobile/MobileController.php`

在 `notification()` 方法中添加从 URL 获取 `type` 参数并传递给模板。

#### 2. 修改 `content/notification/NotificationModel.php`

**修改 `getUserNotifications()` 方法**：添加 `$type` 参数并根据类型构建 SQL 过滤条件。

**修改 `getUnreadCount()` 方法**：添加 `$type` 参数支持按类型统计未读数量。

## 四、移动端关注功能与通知完善

### 1. 移动端关注后发送通知

修复 `follow()` 方法添加发送关注通知功能。

### 2. 修复取消关注功能

修改 `handleFollow()` JS 函数，根据当前状态调用关注/取消关注接口。

### 3. 通知列表添加回关按钮

在关注类型的通知中显示"回关"按钮，支持直接关注/取消关注。

## 五、问题分析

### 用户页面问题分析

#### 涉及文件
- `content/mobile/MobileController.php` - 控制器
- `templates/mobile/app/user.php` - 用户页面视图
- `content/api/MobileApiController.php` - 用户资料 API
- `content/user/UserModel.php` - 用户模型

#### 解决方案
1. 检查用户是否存在
2. 确保参数传递正确
3. 检查 API 调用
4. 确认权限设置

### 注意事项
- 所有 SQL 语句中的 `husns_` 前缀需要替换为实际的数据库前缀
- 如遇到问题，建议检查服务器错误日志获取具体错误信息

## 六、用户在线状态功能

### 功能说明
- 在动态列表和用户主页显示用户是否在线的徽章
- 5分钟内活跃的用户显示为"在线"状态（绿色圆点）
- 超过5分钟未活跃的用户显示为"离线"状态（灰色圆点）

### 数据库变更

```sql
ALTER TABLE `husns_users` ADD `last_activity` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '最后活跃时间' AFTER `updated_at`;
```

### 实现细节

#### 1. 后端实现
- 在 `core/Upgrade.php` 中添加 `last_activity` 字段的自动创建逻辑
- 在 `content/user/UserModel.php` 中添加 `updateLastActivity()` 和 `isOnline()` 方法
- 在 `content/api/MobileApiController.php` 中：
  - `formatUser()` 方法返回 `is_online` 字段
  - `formatPost()` 方法返回 `is_online` 字段
  - 用户登录时自动更新 `last_activity`

#### 2. 前端实现
- **主页动态列表** (`templates/mobile/app/index.php`)：
  - 添加 `.online-badge` 和 `.online-badge.offline` CSS 样式
  - PHP 模板在用户名后显示在线状态徽章
  - JavaScript `createPostHTML()` 函数中动态添加在线状态徽章

- **用户主页** (`templates/mobile/app/user.php`)：
  - 添加 `.user-online-badge` CSS 样式
  - 用户资料卡片显示在线状态
  - 帖子列表和评论列表中的用户名后显示在线状态

### 判断逻辑
- 用户 `last_activity` 字段值距离当前时间小于 300 秒（5分钟）视为在线
- 匿名发布者的 `is_online` 始终为 `false`

## 七、视频上传功能修复

### 问题描述
- 动态发布框上传视频没有预览功能
- 上传视频后点击发布，动态列表中不显示视频
- 视频在列表中显示尺寸过大，影响布局美观

### 修复内容

#### 1. 后端视频上传处理
- **文件**：`content/api/MobileApiController.php`
  - 添加 `uploadVideo()` 方法处理视频上传（支持 mp4、mov、avi、wmv、flv、webm 格式，限制100MB）
  - 修改 `publish()` 方法支持视频文件上传
  - 修改 `formatPost()` 方法支持视频路径转换为完整URL

- **文件**：`content/post/PostModel.php`
  - 修改 `publish()` 方法支持 `videos` 字段存储

#### 2. 前端视频预览功能
- **文件**：`templates/mobile/layouts/app.php`
  - 添加视频预览功能（使用 FileReader API）
  - 添加视频移除功能
  - 修改发布提交逻辑，将视频文件添加到 FormData

#### 3. 动态列表视频显示
- **文件**：`templates/mobile/app/index.php`、`templates/mobile/app/user.php`、`templates/mobile/app/favorites.php`、`templates/mobile/app/hot.php`、`templates/mobile/app/topic.php`
  - 添加视频缩略图显示（120x67px，居中显示）
  - 添加视频播放器弹窗功能（点击播放、全屏切换、ESC关闭）
  - 添加视频缩略图生成功能（使用 Canvas API 截取第一帧）

#### 4. PC端兼容性修复
- **文件**：`templates/default/post/index.php`、`templates/defaultpro/post/index.php`
  - 添加视频数据格式兼容性处理（支持对象数组和字符串数组两种格式）

#### 5. 样式文件
- **文件**：`templates/mobile/css/video-player.css`
  - 添加视频缩略图样式（`.post-video-thumbnail`, `.post-video-play-btn`, `.post-video-badge`）
  - 添加视频播放器弹窗样式（`.video-player-overlay`, `.video-player-container`）

### 视频数据格式

**新格式（对象数组）：**
```json
[
    {
        "path": "video/20260428/xxx.mp4",
        "ext": "mp4",
        "name": "video.mp4",
        "size": 1024000
    }
]
```

**旧格式（字符串数组）：**
```json
["video/20260428/xxx.mp4"]
```

### 功能流程
```
前端选择视频 → 显示预览 → 提交FormData → 后端保存 → 返回视频信息 → 前端渲染缩略图 → 点击播放
```

## 八、话题页面修复

### 问题描述
- 移动端点击话题链接跳转到错误页面
- 话题页面显示"话题不存在"

### 修复内容

#### 1. 修改话题链接格式
- **文件**：`content/api/MobileApiController.php`
  - 将 `parseContent()` 的话题链接从 `mobile/topic?id=$1` 修改为 `mobile/topic?keyword=$1`

#### 2. 修改话题控制器
- **文件**：`content/mobile/MobileController.php`
  - 在 `topic()` 方法中添加获取话题相关帖子的逻辑
  - 处理图片、视频数据格式转换

#### 3. 修改话题页面模板
- **文件**：`templates/mobile/app/topic.php`
  - 将 `$topic` 变量改为使用 `$keyword`
  - 修复标签页链接使用 `keyword` 参数
  - 添加视频缩略图显示支持

## 九、图片上传功能依赖说明

### 问题描述
- 上传头像和背景图功能依赖 PHP 的 `fileinfo` 扩展来检测文件类型
- 如果生产环境未启用该扩展，会出现 `Call to undefined function finfo_open()` 错误

### 解决方案

#### 方案一：启用 fileinfo 扩展（推荐）

**Linux 服务器**：
```bash
# 在 php.ini 中启用扩展
sed -i 's/;extension=fileinfo/extension=fileinfo/' /etc/php.ini

# 或针对特定 PHP 版本
sed -i 's/;extension=fileinfo/extension=fileinfo/' /etc/php/7.4/cli/php.ini
sed -i 's/;extension=fileinfo/extension=fileinfo/' /etc/php/7.4/fpm/php.ini

# 重启 PHP-FPM
systemctl restart php-fpm
```

**Windows 服务器**：
编辑 `php.ini` 文件，取消注释以下行：
```ini
extension=fileinfo
```

#### 方案二：代码兼容处理

代码已内置兼容机制，当 `fileinfo` 扩展不可用时，会自动降级使用以下方案：
1. **优先方案**：`finfo_open()`（如果可用）
2. **备选方案**：`getimagesize()`（几乎所有 PHP 环境都支持）
3. **最后备选**：通过文件扩展名推断类型

### 涉及文件
- `content/api/MobileApiController.php` - 添加了 `getFileMimeType()` 方法处理文件类型检测

## 十、话题页面布局优化

### 1. 头部布局优化
- **文件**：`templates/mobile/app/topic.php`
- 将话题头部改为左右布局：左侧图标、中间名称描述和统计、右侧操作按钮
- 将帖子统计信息合并到头部中间区域，节省页面空间

### 2. 分享按钮修复
- **文件**：`templates/mobile/app/topic.php`
- 修复分享弹窗一直转圈的问题
- 添加兼容性检查：优先使用全局分享弹窗，回退到原生分享API，最后使用剪贴板复制
- 添加 `raw_content` 字段保存原始内容用于分享，避免HTML标签干扰

### 3. 操作按钮优化
- **文件**：`templates/mobile/app/topic.php`
- 添加操作按钮文字标签（分享、收藏）
- 移除点赞和评论按钮的文字标签（只保留图标和数字）
- 修复下拉菜单被容器裁剪的问题（移除 `overflow: hidden`）
- 修复下拉菜单层级问题（添加 `z-index: 1000`）

### 4. 话题图标优化
- **文件**：`templates/mobile/app/topic.php`
- 将话题图标从井号 `#` 改为显示话题的第一个汉字

### 5. Tab参数支持
- **文件**：`content/post/PostModel.php`、`content/mobile/MobileController.php`
- 修改 `getPostsByTopic()` 方法支持 `$tab` 参数
- `tab=hot`：按点赞数+评论数排序（热门）
- `tab=latest`：按创建时间排序（最新）

## 十一、热门页面时间标签筛选

### 问题描述
- 热门页面的"今日"、"本周"、"本月"标签显示相同内容

### 修复内容

#### 1. 前端修改
- **文件**：`templates/mobile/app/hot.php`
- 在 API 请求中添加 `type` 参数传递

#### 2. 后端修改
- **文件**：`content/api/MobileApiController.php`
- 根据 `type` 参数筛选不同时间范围的内容
- `type=day`：今日（从今天0点到现在）
- `type=week`：本周（从周一0点到现在）
- `type=month`：本月（从月初0点到现在）

## 十二、位置卡片功能实现

### 功能说明
- 在动态内容中添加位置信息显示，类似微信定位消息样式
- 支持通过浏览器 Geolocation API 获取精确经纬度
- 根据经纬度获取位置名称并显示
- 显示小地图卡片，包含位置名称和定位标记

### 数据库变更

```sql
ALTER TABLE `husns_posts` ADD `location_lat` DECIMAL(10,7) DEFAULT NULL COMMENT '纬度' AFTER `location_name`;
ALTER TABLE `husns_posts` ADD `location_lng` DECIMAL(10,7) DEFAULT NULL COMMENT '经度' AFTER `location_lat`;
```

> **注意**：将 `husns_` 替换为你实际的数据库前缀

### 实现细节

#### 1. 前端位置获取
- **文件**：`templates/mobile/layouts/app.php`
- 修改 `insertLocation()` 函数，使用 `navigator.geolocation.getCurrentPosition()` 获取经纬度
- 将经纬度保存到隐藏字段 `location_latlng`

#### 2. 后端位置处理
- **文件**：`content/post/PostModel.php`
- 添加 `getLocationName()` 方法，通过经纬度获取位置名称
- 优先使用百度地图 API，降级使用 ip-api 服务
- 修改 `publish()` 方法，处理 `location_latlng`、`location_lat`、`location_lng`、`location_name` 字段

#### 3. API 返回位置信息
- **文件**：`content/api/MobileApiController.php`
- 在 `formatPost()` 方法中返回位置信息（包含经纬度和名称）

#### 4. 前端位置卡片显示
- **文件**：`templates/mobile/app/index.php`
- 添加位置卡片 CSS 样式（`.moment-location-card`）
- 支持两种显示模式：
  - **完整地图卡片**：有经纬度时显示位置名称 + 地图图片 + 定位标记
  - **简化标签模式**：无经纬度时显示圆角标签样式
- 地图高度 100px，定位标记 32px，样式紧凑协调

### 显示效果

**完整地图卡片**（有精确位置时）：
```
┌─────────────────────────────┐
│  📍 北京市朝阳区某某街道    │  ← 位置名称
│  北京市朝阳区某某街道       │  ← 详细地址
├─────────────────────────────┤
│  [地图图片]                  │
│      ○                      │  ← 定位标记
│                             │
└─────────────────────────────┘
```

**简化标签模式**（无精确位置时）：
```
📍 北京市朝阳区
```

### 注意事项
- 需要配置百度地图 API Key（在 `PostModel.php` 和前端 JS 中替换 `your_baidu_map_api_key`）
- 位置卡片显示在动态内容、图片、视频之后，转发内容之前
- 不会遮挡用户发布的动态内容

## 十三、图片查看器功能完善

### 问题描述
- 点击图片查看器中的图片无法关闭查看器
- 图片放大后无法拖动查看
- 关闭按钮不够醒目

### 修复内容

#### 1. 点击图片关闭功能
- **文件**：`templates/mobile/app/js/image-viewer.js`
- 添加 `isZoomed` 状态变量，当图片未放大时点击图片关闭查看器

#### 2. 图片拖动查看功能
- **文件**：`templates/mobile/app/js/image-viewer.js`
- 添加拖动功能，图片放大后可单指拖动查看任意区域
- 添加拖动范围限制，防止拖出空白区域
- 使用 `getBoundingClientRect()` 获取图片实际尺寸计算拖动边界

#### 3. 关闭按钮样式优化
- **文件**：`templates/mobile/app/css/styles.css`
- 将关闭按钮背景改为红色 `#e53935`
- 添加红色阴影效果 `box-shadow: 0 2px 8px rgba(229, 57, 53, 0.4)`

#### 4. 双击缩放功能
- **文件**：`templates/mobile/app/js/image-viewer.js`
- 添加双击图片放大到2倍，再次双击恢复原尺寸

### 功能流程
```
点击图片 → 打开全屏查看器 → 双击放大 → 拖动查看 → 点击关闭
```

### 涉及文件
| 文件路径 | 修改内容 |
|---------|---------|
| `templates/mobile/app/js/image-viewer.js` | 添加点击关闭、双击缩放、拖动查看功能 |
| `templates/mobile/app/css/styles.css` | 优化关闭按钮样式为红色 |

## 十四、首页动态列表单图显示优化

### 问题描述
- 动态列表中单张图片显示不协调，两侧有灰色空白区域

### 修复内容
- **文件**：`templates/mobile/app/css/styles.css`
- 设置单图容器最大宽度为65%，靠左对齐
- 移除容器背景色，避免灰色空白区域
- 图片使用 `object-fit: contain` 保持原比例
- 限制图片最大高度为200px

### 样式配置
```css
.moment-image-grid.single-image {
    grid-template-columns: 1fr;
    max-width: 65%;
    background: transparent;
}

.moment-image-grid.single-image .moment-img {
    aspect-ratio: auto;
    max-height: 200px;
    object-fit: contain;
    background-color: transparent;
}
```

### 涉及文件
| 文件路径 | 修改内容 |
|---------|---------|
| `templates/mobile/app/css/styles.css` | 修复单图显示空白问题 |
| `templates/mobile/app/index.php` | 移除不必要的容器类名 |

---

## 十五、新增功能汇总

以下是对话中新增的完整功能列表：

### 1. 私信系统

#### 功能说明
- 用户可以通过用户页面或消息页面发送私信
- 支持查看对话列表和消息历史
- 支持未读消息计数

#### 实现细节
- **后端**：`content/api/MobileApiController.php` 添加私信相关API
  - `getConversations()` - 获取对话列表
  - `getMessages()` - 获取消息列表
  - `sendMessage()` - 发送私信
  - `markMessagesRead()` - 标记消息已读
  - `getMessageUnreadCount()` - 获取未读消息数量
- **模型**：`templates/mobile/MessageModel.php` 处理私信数据操作
- **前端**：`templates/mobile/app/messages.php` 消息列表页面
- **前端**：`templates/mobile/app/chat.php` 聊天页面

> 注意：私信表 (`private_messages`) 已在 `core/Upgrade.php` 中定义，无需重复创建。

---

### 2. 视频播放组件

#### 功能说明
- 支持全屏播放、自动播放、手势控制
- 点击视频缩略图打开全屏播放器
- 支持 ESC 键关闭播放器

#### 实现细节
- **前端**：`templates/mobile/layouts/app.php` 添加视频播放器弹窗
- **功能函数**：`openVideoPlayer()`、`closeVideoPlayer()`
- **样式**：`.video-player-overlay`、`.video-player-container`、`.video-player-fullscreen`

---

### 3. 评论楼中楼功能

#### 功能说明
- 支持嵌套回复（评论的评论）
- 支持展开/收起子评论
- 支持 @提醒 功能

#### 实现细节
- **后端**：`content/api/MobileApiController.php` 修改评论API支持 parent_id
- **前端**：`templates/mobile/layouts/app.php` 添加评论弹窗和楼中楼展示
- **功能函数**：`openCommentModal()`、`loadComments()`、`renderComments()`、`replyToComment()`

---

### 4. 推荐用户功能

#### 功能说明
- 根据粉丝数推荐用户
- 排除已关注用户
- 支持搜索和关注操作

#### 实现细节
- **后端**：`content/api/MobileApiController.php` 添加 `getRecommendedUsers()` 方法
- **模型**：`content/user/UserModel.php` 添加 `getRecommendedUsers()` 方法
- **前端**：`templates/mobile/app/recommend.php` 推荐用户页面

---

### 5. 热门话题榜

#### 功能说明
- 基于内容分析提取话题标签
- 根据互动数据排序
- 支持话题详情页面

#### 实现细节
- **后端**：`content/api/MobileApiController.php` 添加 `getHotTopics()` 方法
- **仓库**：`repository/PostRepository.php` 添加 `getHotTopics()` 方法
- **前端**：`templates/mobile/app/topics.php` 热门话题页面

---

### 6. 举报功能

#### 功能说明
- 支持多种举报原因（垃圾广告、色情低俗、暴力血腥、欺诈诈骗、人身攻击、侵犯隐私、抄袭侵权、其他）
- 支持补充说明
- 后台可查看处理举报

#### 实现细节
- **后端**：`content/api/MobileApiController.php` 添加 `reportPost()` 方法
- **前端**：`templates/mobile/layouts/app.php` 添加举报弹窗
- **功能函数**：`openReportModal()`、`submitReport()`

---

### 7. 积分等级系统

#### 功能说明
- 用户发布动态、评论、点赞等行为获得积分
- 积分累计升级
- 显示等级进度

#### 实现细节
- **后端**：`content/api/MobileApiController.php` 添加积分相关API
  - `getUserPoints()` - 获取用户积分
  - `getPointLogs()` - 获取积分记录
  - `getLevelConfig()` - 获取等级配置
- **模型**：`content/point/PointModel.php` 处理积分和等级逻辑
- **前端**：`templates/mobile/app/points.php` 积分等级页面

#### 等级配置示例
| 等级 | 所需积分 | 等级名称 |
|-----|---------|---------|
| 1 | 0 | 新手 |
| 2 | 100 | 初级会员 |
| 3 | 500 | 中级会员 |
| 4 | 1000 | 高级会员 |
| 5 | 2000 | 资深会员 |
| 6 | 5000 | 精英会员 |
| 7 | 10000 | 专家会员 |
| 8 | 20000 | 大师会员 |

---

### 8. 夜间模式

#### 功能说明
- 支持日间/夜间模式切换
- 自动检测系统主题偏好
- 状态持久化保存

#### 实现细节
- **前端**：`templates/mobile/layouts/app.php` 添加夜间模式样式
- **CSS变量**：定义深色主题配色（背景、文字、边框等）
- **功能函数**：`initDarkMode()`、`enableDarkMode()`、`disableDarkMode()`、`toggleDarkMode()`、`isDarkMode()`
- **存储**：使用 localStorage 持久化用户偏好

#### 深色主题配色
```css
.dark-mode {
    --background-color: #000000;
    --card-color: #1C1C1E;
    --text-color: #FFFFFF;
    --text-secondary-color: #8E8E93;
    --border-color: #3A3A3C;
    --primary-color: #007AFF;
    --hover-color: #2C2C2E;
}
```

---

### 9. 分享到外部平台

#### 功能说明
- 支持分享到微信、朋友圈、QQ、QQ空间、微博
- 支持复制链接
- 分享卡片预览

#### 实现细节
- **前端**：`templates/mobile/layouts/app.php` 添加分享弹窗
- **功能函数**：`openShareModal()`、`shareToWechat()`、`shareToMoments()`、`shareToQQ()`、`shareToQzone()`、`shareToWeibo()`、`shareToCopy()`
- **样式**：`.share-modal`、`.share-card-preview`、`.share-actions`、`.share-action`

---

### 十六、API路径修复

#### 问题描述
- 前端调用API时使用了错误的路径前缀 `api/mobile/`，导致404错误

#### 修复内容
将以下文件中的API路径从 `api/mobile/` 修改为 `mobileApi/`：

| 文件路径 | 修复的API |
|---------|----------|
| `templates/mobile/app/messages.php` | `getConversations` |
| `templates/mobile/app/points.php` | `getUserPoints`, `getPointLogs`, `getLevelConfig` |
| `templates/mobile/app/topics.php` | `getHotTopics` |
| `templates/mobile/app/recommend.php` | `getRecommendedUsers`, `follow` |
| `templates/mobile/app/chat.php` | `getMessages`, `sendMessage` |
| `templates/mobile/index.php` | `setTop`, `setEssence`, `deletePost` |

---

## 十七、推荐用户条件优化

### 修改日期
2026-04-29

### 问题描述
- 原推荐用户条件过于简单，只要不是已关注用户即可推荐
- 无法保证推荐用户的质量

### 优化后的推荐条件

成为推荐用户必须满足以下**全部条件**：

| 条件 | 说明 |
|------|------|
| 头像完整 | 必须设置过头像（avatar 不为空） |
| 发布过内容 | 至少发布过 1 条帖子 |
| 积分门槛 | 积分达到 **100 分**以上 |
| 最近活跃 | 7 天内有登录/活跃记录 |
| 状态正常 | 账号未被封禁 (status = 1) |
| 非管理员 | 不能是管理员账号 |

### 排序优先级

```
粉丝数 DESC > 积分 DESC > 最近活跃 DESC
```

### 修改文件

| 文件路径 | 修改内容 |
|---------|---------|
| `content/user/UserModel.php` | 优化 `getRecommendedUsers()` 方法，添加头像、帖子数、积分、活跃时间等筛选条件 |

### SQL 筛选逻辑

```php
INNER JOIN posts ON posts.user_id = u.id AND posts.status = 1  -- 必须有帖子
WHERE avatar IS NOT NULL AND avatar != ''  -- 头像不能为空
  AND points >= 100  -- 积分至少100
  AND last_activity >= 7天前  -- 7天内活跃
GROUP BY u.id
HAVING post_count >= 1  -- 至少1条帖子
```

### 设计目的
- 确保推荐的都是**活跃、优质、有内容产出**的用户
- 提高推荐列表的质量和用户关注转化率