版本:V1.0
日期:2026年2月01日
负责人:产品经理 - 尹智
文档编号:FRD-JUNENG-20231101
本项目为多功能综合性平台,整合社区论坛、工具服务、项目供需、知识付费四大核心模块,旨在打造一个集内容交流、生活服务、商业对接、知识变现于一体的生态平台。
一级分类:
发布流程:
发布参数:
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| title | String | 是 | 标题,5-50字 |
| category_id | Int | 是 | 分类ID |
| content | Text | 是 | 内容,支持富文本 |
| images | Array | 否 | 图片数组,最多9张 |
| video | String | 否 | 视频地址,最大100MB |
| tags | Array | 否 | 标签数组,最多5个 |
| location | Object | 否 | 位置信息 |
| is_anon | Boolean | 否 | 是否匿名发布 |
审核流程:
审核结果:
| 等级 | 名称 | 发帖权限 | 日发帖数 | 特权 |
|---|---|---|---|---|
| Lv1 | 新手上路 | 需审核 | 3 | 基础浏览 |
| Lv2 | 见习会员 | 需审核 | 5 | 发布图片 |
| Lv3 | 正式会员 | 自动审核 | 10 | 发布视频 |
| Lv4 | 活跃会员 | 自动审核 | 20 | 创建投票 |
| Lv5 | 核心会员 | 自动审核 | 30 | 内容置顶 |
| Lv6 | 论坛达人 | 自动审核 | 50 | 申请版主 |
| 行为 | 积分 | 每日上限 | 说明 |
|---|---|---|---|
| 发布帖子 | 10 | 100 | 审核通过后获得 |
| 发布精华帖 | 100 | - | 额外奖励 |
| 点赞 | 1 | 50 | 每个有效点赞 |
| 评论 | 5 | 100 | 非灌水评论 |
| 每日签到 | 5-50 | - | 连续签到递增 |
| 邀请好友 | 100 | - | 好友完成注册 |
| 内容被加精 | 200 | - | 作者获得 |
配置:
消息类型:
// WebSocket连接
const ws = new WebSocket('wss://api.example.com/ws');
// 消息监听
ws.onmessage = (event) => {
const data = JSON.parse(event.data);
switch(data.type) {
case 'new_post':
updatePostList(data.post);
break;
case 'new_comment':
updateComments(data.comment);
break;
case 'new_like':
updateLikeCount(data.like);
break;
}
};
// 发送消息
function sendMessage(type, data) {
ws.send(JSON.stringify({ type, data }));
}
// 前端调用示例
uni.request({
url: '/api/v1/tool/service',
method: 'POST',
data: {
service_type: 'mobile_recharge', // 服务类型
provider: 'china_mobile', // 服务商
phone: '13800138000', // 手机号
amount: 100, // 充值金额
order_id: 'ORDER_20231101123456' // 订单ID
},
success: (res) => {
// 实时返回结果
if (res.data.success) {
// 处理成功
} else {
// 处理失败
}
}
});
// 后端处理逻辑
class ToolServiceController {
public function handleRequest() {
// 1. 参数验证
$params = $this->validateParams();
// 2. 服务路由
$service = $this->routeService($params['service_type']);
// 3. 调用第三方API
$result = $service->callThirdPartyAPI($params);
// 4. 佣金计算
$commission = $this->calculateCommission($params, $result);
// 5. 记录日志
$this->logServiceCall($params, $result, $commission);
// 6. 实时返回
return $this->success([
'order_id' => $params['order_id'],
'status' => $result['status'],
'message' => $result['message'],
'commission' => $commission,
'estimated_time' => $result['estimated_time']
]);
}
}
| 服务类型 | 佣金计算方式 | 最低佣金 | 最高佣金 | 结算周期 |
|---|---|---|---|---|
| 话费充值 | 按比例(1%-3%) | 0.1元 | 15元 | 实时 |
| 机票预订 | 按比例(3%-8%) | 5元 | 500元 | T+1 |
| 火车票 | 固定(2-5元/张) | 2元 | 5元 | 实时 |
| 酒店预订 | 按比例(5%-12%) | 10元 | 300元 | T+3 |
| 电影票 | 固定或比例 | 5元 | 20元 | 实时 |
| 外卖 | 按比例(5%-15%) | 1元 | 50元 | T+7 |
| 快递寄件 | 固定(0.5-2元/单) | 0.5元 | 2元 | 月结 |
发布表单字段:
| 字段名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| title | String | 是 | 项目标题,10-50字 |
| category | String | 是 | 项目分类 |
| budget | Decimal | 是 | 预算范围 |
| deadline | Date | 是 | 截止日期 |
| description | Text | 是 | 详细描述 |
| attachments | Array | 否 | 附件文件 |
| skills | Array | 是 | 所需技能 |
| location | Object | 否 | 工作地点 |
| contact_type | String | 是 | 联系方式类型 |
| contact_info | String | 是 | 联系信息 |
| deposit | Decimal | 否 | 定金金额 |
审核维度:
触发条件:
发布者评级卡片:
账户结构:
资金流向监控:
project/ ├── pages/ # 页面文件 │ ├── index/ # 首页 │ ├── forum/ # 论坛模块 │ ├── tools/ # 工具模块 │ ├── project/ # 项目模块 │ └── knowledge/ # 知识模块 ├── components/ # 公共组件 │ ├── common/ # 通用组件 │ ├── forum/ # 论坛组件 │ ├── tools/ # 工具组件 │ └── payment/ # 支付组件 ├── static/ # 静态资源 ├── store/ # Vuex状态管理 ├── api/ # API接口封装 ├── utils/ # 工具函数 └── config/ # 配置文件
// store/modules/user.js
export default {
state: {
userInfo: null,
token: '',
unreadCount: 0,
balance: 0
},
mutations: {
SET_USER_INFO(state, info) {
state.userInfo = info;
},
SET_TOKEN(state, token) {
state.token = token;
}
},
actions: {
async login({ commit }, credentials) {
const res = await uni.request({
url: '/api/auth/login',
method: 'POST',
data: credentials
});
commit('SET_USER_INFO', res.data.user);
commit('SET_TOKEN', res.data.token);
uni.setStorageSync('token', res.data.token);
}
}
};
app/ ├── common/ # 公共模块 │ ├── lib/ # 公共库 │ ├── model/ # 公共模型 │ └── validate/ # 验证器 ├── controller/ # 控制器层 │ ├── v1/ # API v1 │ │ ├── ForumController.php │ │ ├── ToolController.php │ │ ├── ProjectController.php │ │ └── KnowledgeController.php │ └── admin/ # 后台管理 ├── model/ # 模型层 │ ├── UserModel.php │ ├── PostModel.php │ ├── OrderModel.php │ └── CourseModel.php ├── service/ # 服务层 │ ├── ThirdPartyService.php │ ├── PaymentService.php │ ├── AuditService.php │ └── CommissionService.php ├── middleware/ # 中间件 │ ├── AuthMiddleware.php │ ├── LogMiddleware.php │ └── RateLimitMiddleware.php └── config/ # 配置文件
// app/service/ThirdPartyService.php
class ThirdPartyService {
// 话费充值
public function mobileRecharge($phone, $amount, $provider) {
// 根据提供商选择不同的API
switch($provider) {
case 'china_mobile':
return $this->callChinaMobileAPI($phone, $amount);
case 'china_unicom':
return $this->callChinaUnicomAPI($phone, $amount);
case 'china_telecom':
return $this->callChinaTelecomAPI($phone, $amount);
default:
throw new Exception('不支持的运营商');
}
}
// 机票查询
public function flightSearch($params) {
// 调用携程/同程API
$result = $this->callCtripAPI($params);
// 数据处理和格式化
return $this->formatFlightData($result);
}
// 美团外卖
public function meituanOrder($params) {
// 美团API调用
return $this->callMeituanAPI($params);
}
}
// app/service/CommissionService.php
class CommissionService {
// 计算佣金
public function calculate($order) {
$serviceType = $order['service_type'];
$amount = $order['amount'];
// 获取佣金规则
$rule = $this->getCommissionRule($serviceType);
// 计算佣金
if ($rule['type'] == 'percentage') {
$commission = $amount * $rule['rate'];
} else {
$commission = $rule['fixed_amount'];
}
// 检查上下限
$commission = max($commission, $rule['min_amount']);
$commission = min($commission, $rule['max_amount']);
return round($commission, 2);
}
// 分润计算
public function calculateProfitSharing($order) {
$totalCommission = $this->calculate($order);
// 平台分成比例
$platformRatio = 0.3; // 30%
$userRatio = 0.7; // 70%
return [
'platform' => $totalCommission * $platformRatio,
'user' => $totalCommission * $userRatio,
'total' => $totalCommission
];
}
}
// websocket_server.php
use Workerman\Worker;
// 创建WebSocket服务器
$ws_worker = new Worker("websocket://0.0.0.0:2346");
// 4个进程
$ws_worker->count = 4;
// 连接建立时的回调
$ws_worker->onConnect = function($connection) {
echo "New connection\n";
};
// 收到消息时的回调
$ws_worker->onMessage = function($connection, $data) {
// 解析消息
$message = json_decode($data, true);
switch($message['type']) {
case 'chat':
// 处理聊天消息
break;
case 'notification':
// 处理通知消息
break;
case 'post_update':
// 处理帖子更新
break;
}
// 广播消息
foreach($ws_worker->connections as $client) {
$client->send($data);
}
};
// 运行worker
Worker::runAll();
// utils/websocket.js
class WebSocketManager {
constructor() {
this.ws = null;
this.reconnectTimer = null;
this.messageHandlers = {};
}
connect() {
this.ws = new WebSocket('wss://yourdomain.com/ws');
this.ws.onopen = () => {
console.log('WebSocket连接成功');
this.heartbeat();
};
this.ws.onmessage = (event) => {
this.handleMessage(JSON.parse(event.data));
};
this.ws.onclose = () => {
console.log('WebSocket连接关闭,尝试重连');
this.reconnect();
};
}
handleMessage(data) {
const handler = this.messageHandlers[data.type];
if (handler) {
handler(data.payload);
}
}
registerHandler(type, handler) {
this.messageHandlers[type] = handler;
}
sendMessage(type, payload) {
if (this.ws.readyState === WebSocket.OPEN) {
this.ws.send(JSON.stringify({ type, payload }));
}
}
heartbeat() {
setInterval(() => {
this.sendMessage('ping', { timestamp: Date.now() });
}, 30000);
}
reconnect() {
if (this.reconnectTimer) clearTimeout(this.reconnectTimer);
this.reconnectTimer = setTimeout(() => {
this.connect();
}, 3000);
}
}
| 字段名 | 类型 | 约束 | 说明 |
|---|---|---|---|
| id | BIGINT | PRIMARY KEY | 用户ID,自增 |
| username | VARCHAR(50) | UNIQUE | 用户名 |
| phone | VARCHAR(20) | UNIQUE | 手机号 |
| VARCHAR(100) | UNIQUE | 邮箱 | |
| password | VARCHAR(100) | 加密密码 | |
| avatar | VARCHAR(255) | 头像URL | |
| nickname | VARCHAR(30) | 昵称 | |
| real_name | VARCHAR(30) | 真实姓名 | |
| id_card | VARCHAR(20) | 身份证号 | |
| balance | DECIMAL(10,2) | DEFAULT 0 | 账户余额 |
| credit_score | INT | DEFAULT 100 | 信用评分 |
| level | INT | DEFAULT 1 | 用户等级 |
| vip_level | TINYINT | DEFAULT 0 | VIP等级 |
| status | TINYINT | DEFAULT 1 | 状态:1正常 0禁用 |
| created_at | TIMESTAMP | 创建时间 | |
| updated_at | TIMESTAMP | 更新时间 |
| 字段名 | 类型 | 约束 | 说明 |
|---|---|---|---|
| id | BIGINT | PRIMARY KEY | 帖子ID |
| user_id | BIGINT | INDEX | 作者ID |
| category_id | INT | INDEX | 分类ID |
| title | VARCHAR(100) | 标题 | |
| content | TEXT | 内容 | |
| images | JSON | 图片列表 | |
| video_url | VARCHAR(255) | 视频地址 | |
| view_count | INT | DEFAULT 0 | 浏览数 |
| like_count | INT | DEFAULT 0 | 点赞数 |
| comment_count | INT | DEFAULT 0 | 评论数 |
| share_count | INT | DEFAULT 0 | 分享数 |
| collect_count | INT | DEFAULT 0 | 收藏数 |
| status | TINYINT | DEFAULT 0 | 状态:0待审 1正常 2删除 |
| audit_score | INT | 审核评分 | |
| audit_result | VARCHAR(500) | 审核结果 | |
| is_top | TINYINT | DEFAULT 0 | 是否置顶 |
| is_essence | TINYINT | DEFAULT 0 | 是否精华 |
| created_at | TIMESTAMP | 创建时间 | |
| updated_at | TIMESTAMP | 更新时间 |
| 字段名 | 类型 | 约束 | 说明 |
|---|---|---|---|
| id | BIGINT | PRIMARY KEY | 订单ID |
| order_no | VARCHAR(32) | UNIQUE | 订单号 |
| user_id | BIGINT | INDEX | 用户ID |
| service_type | VARCHAR(50) | 服务类型 | |
| provider | VARCHAR(50) | 服务提供商 | |
| params | JSON | 请求参数 | |
| amount | DECIMAL(10,2) | 订单金额 | |
| commission | DECIMAL(10,2) | 佣金金额 | |
| status | TINYINT | DEFAULT 0 | 状态:0待支付 1处理中 2成功 3失败 |
| thirdparty_id | VARCHAR(100) | 第三方订单ID | |
| result_data | JSON | 结果数据 | |
| error_msg | VARCHAR(500) | 错误信息 | |
| paid_at | TIMESTAMP | 支付时间 | |
| completed_at | TIMESTAMP | 完成时间 | |
| created_at | TIMESTAMP | 创建时间 | |
| updated_at | TIMESTAMP | 更新时间 |
| 字段名 | 类型 | 约束 | 说明 |
|---|---|---|---|
| id | BIGINT | PRIMARY KEY | 项目ID |
| user_id | BIGINT | INDEX | 发布者ID |
| title | VARCHAR(100) | 项目标题 | |
| category | VARCHAR(50) | 项目分类 | |
| budget_min | DECIMAL(10,2) | 最低预算 | |
| budget_max | DECIMAL(10,2) | 最高预算 | |
| description | TEXT | 项目描述 | |
| skills | JSON | 所需技能 | |
| attachments | JSON | 附件 | |
| contact_type | VARCHAR(20) | 联系方式类型 | |
| contact_info | VARCHAR(100) | 联系信息 | |
| deposit | DECIMAL(10,2) | DEFAULT 0 | 定金金额 |
| status | TINYINT | DEFAULT 0 | 状态:0待审 1进行中 2已完成 3已关闭 |
| audit_status | TINYINT | DEFAULT 0 | 审核状态:0待审 1通过 2拒绝 |
| view_count | INT | DEFAULT 0 | 浏览数 |
| apply_count | INT | DEFAULT 0 | 申请数 |
| deadline | DATE | 截止日期 | |
| created_at | TIMESTAMP | 创建时间 | |
| updated_at | TIMESTAMP | 更新时间 |
| 字段名 | 类型 | 约束 | 说明 |
|---|---|---|---|
| id | BIGINT | PRIMARY KEY | 课程ID |
| teacher_id | BIGINT | INDEX | 讲师ID |
| title | VARCHAR(100) | 课程标题 | |
| subtitle | VARCHAR(200) | 副标题 | |
| cover_image | VARCHAR(255) | 封面图 | |
| price | DECIMAL(10,2) | 价格 | |
| original_price | DECIMAL(10,2) | 原价 | |
| type | TINYINT | 类型:1视频 2图文 3音频 4直播 | |
| category | VARCHAR(50) | 分类 | |
| tags | JSON | 标签 | |
| description | TEXT | 描述 | |
| content | JSON | 课程内容 | |
| duration | INT | 时长(分钟) | |
| student_count | INT | DEFAULT 0 | 学员数 |
| rating | DECIMAL(3,2) | DEFAULT 0 | 评分 |
| status | TINYINT | DEFAULT 1 | 状态:1上架 0下架 |
| is_recommend | TINYINT | DEFAULT 0 | 是否推荐 |
| created_at | TIMESTAMP | 创建时间 | |
| updated_at | TIMESTAMP | 更新时间 |
{
"code": 200, // 状态码
"message": "success", // 消息
"data": { // 数据
// 业务数据
},
"timestamp": 1698765432 // 时间戳
}
| 错误码 | 说明 |
|---|---|
| 200 | 成功 |
| 400 | 请求参数错误 |
| 401 | 未授权 |
| 403 | 权限不足 |
| 404 | 资源不存在 |
| 429 | 请求过于频繁 |
| 500 | 服务器内部错误 |
| 错误码 | 说明 |
|---|---|
| 1001 | 用户不存在 |
| 1002 | 密码错误 |
| 1003 | 验证码错误 |
| 1004 | 账号被禁用 |
| 2001 | 余额不足 |
| 2002 | 支付失败 |
| 3001 | 内容包含敏感词 |
| 3002 | 内容审核不通过 |
| 4001 | 订单已存在 |
| 4002 | 订单状态异常 |
// 发布帖子
POST /api/v1/forum/posts
Headers: Authorization: Bearer {token}
Body: {
"title": "帖子标题",
"category_id": 1,
"content": "帖子内容",
"images": ["url1", "url2"],
"tags": ["标签1", "标签2"]
}
// 获取帖子列表
GET /api/v1/forum/posts
Query: {
"page": 1,
"limit": 20,
"category_id": 1,
"sort": "hot" // hot, new, recommend
}
// 话费充值
POST /api/v1/tools/mobile/recharge
Headers: Authorization: Bearer {token}
Body: {
"phone": "13800138000",
"amount": 100,
"provider": "china_mobile"
}
// 机票查询
POST /api/v1/tools/flight/search
Headers: Authorization: Bearer {token}
Body: {
"departure": "北京",
"arrival": "上海",
"date": "2023-11-15",
"passenger_type": "adult"
}
// 发布项目
POST /api/v1/projects
Headers: Authorization: Bearer {token}
Body: {
"title": "网站开发项目",
"category": "网站开发",
"budget_min": 5000,
"budget_max": 10000,
"description": "需要开发一个电商网站",
"skills": ["PHP", "Vue.js", "MySQL"],
"deadline": "2023-12-31"
}
// 申请项目
POST /api/v1/projects/{id}/apply
Headers: Authorization: Bearer {token}
Body: {
"proposal": "项目实施方案",
"quote": 8000,
"timeline": "30天"
}
// 购买课程
POST /api/v1/courses/{id}/purchase
Headers: Authorization: Bearer {token}
Body: {
"coupon_code": "DISCOUNT10"
}
// 发起咨询
POST /api/v1/consultations
Headers: Authorization: Bearer {token}
Body: {
"consultant_id": 123,
"type": "video",
"duration": 60,
"question": "咨询问题描述",
"appointment_time": "2023-11-15 14:00:00"
}
| 岗位 | 人数 | 职责 |
|---|---|---|
| 产品经理 | 1人 | 需求分析、产品设计 |
| UI设计师 | 1人 | 界面设计、交互设计 |
| 前端开发 | 2人 | Uniapp开发、组件开发 |
| 后端开发 | 1人 | PHP开发、API开发 |
| 测试工程师 | 1人 | 功能测试、性能测试 |
| 运维工程师 | 1人 | 服务器部署、监控维护 |
| 风险项 | 概率 | 影响 | 应对措施 |
|---|---|---|---|
| 技术风险 | 中 | 高 | 技术预研、原型验证 |
| 时间风险 | 高 | 中 | 敏捷开发、阶段交付 |
| 成本风险 | 中 | 中 | 成本控制、预算管理 |
| 安全风险 | 高 | 高 | 安全测试、漏洞扫描 |
| 竞争风险 | 中 | 高 | 差异化定位、快速迭代 |
| 服务类型 | 服务商 | 接口文档地址 |
|---|---|---|
| 话费充值 | 三大运营商 | 运营商官网 |
| 机票预订 | 携程/同程 | 开放平台 |
| 酒店预订 | 去哪儿/携程 | 开放平台 |
| 电影票务 | 猫眼/淘票票 | 开放平台 |
| 外卖服务 | 美团/饿了么 | 开放平台 |
| 快递服务 | 快递100 | 开放平台 |
| 电子合同 | e签宝/法大大 | 开放平台 |
| AI审核 | DeepSeek | 官方API |
| 支付服务 | 微信/支付宝 | 开放平台 |
| 短信服务 | 阿里云短信 | 控制台 |
| 存储服务 | 阿里云OSS | 控制台 |
| 模块 | 测试账号 | 密码 |
|---|---|---|
| 社区论坛 | test_forum | Test123456 |
| 工具服务 | test_tool | Test123456 |
| 项目供需 | test_project | Test123456 |
| 知识付费 | test_knowledge | Test123456 |
| 管理员 | admin | Admin123456 |
服务器配置:
软件环境:
文档结束
说明: