64 KiB
64 KiB
缘池与许愿树管理端设计文档
版本:V2.0
更新日期:2025-12-30
设计范围:缘池社区 + 许愿树管理
核心特性:服务端实时存储,数据云端同步
一、设计概述
1.1 核心改动
将原本地存储改为服务端实时存储:
- ❌ 原方案:SharedPreferences本地存储,数据仅存在单设备
- ✅ 新方案:服务端API实时存储,数据云端同步,多端共享
1.2 数据流架构
┌─────────────┐ API请求 ┌─────────────┐ 数据库 ┌─────────────┐
│ 移动端APP │ ◄──────────────► │ 后端服务 │ ◄──────────────► │ MySQL │
└─────────────┘ └─────────────┘ └─────────────┘
│ │
│ │
▼ ▼
实时获取数据 管理端审核
发布/删除心愿 数据统计
点赞/评论 内容管理
1.3 功能对照
| 功能 | 原方案(本地) | 新方案(服务端) |
|---|---|---|
| 心愿存储 | SharedPreferences | MySQL + API |
| 数据同步 | 无 | 实时同步 |
| 多端访问 | 不支持 | 支持 |
| 内容审核 | 无 | 自动+人工审核 |
| 数据统计 | 无 | 管理端统计 |
| 用户互动 | 无 | 点赞/评论 |
二、移动端API设计(前台接口)
2.1 缘池移动端API
基础路径: /api/front/community
板块相关:
GET /categories # 获取板块列表(启用状态)
消息相关:
GET /messages # 获取消息列表
?categoryId={id}&page=1&limit=20
POST /messages # 发布消息(自动审核)
GET /messages/{id} # 获取消息详情
DELETE /messages/{id} # 删除我的消息
用户匹配:
GET /nearby-users # 获取附近用户(轨道展示)
?latitude={lat}&longitude={lng}&radius=5000&limit=6
2.2 许愿树移动端API
基础路径: /api/front/wishtree
节日相关:
GET /festivals # 获取节日列表(启用状态)
GET /festivals/current # 获取当前进行中的节日
心愿相关:
GET /wishes # 获取心愿列表
?festivalId={id}&page=1&limit=20
GET /wishes/my # 获取我的心愿列表
POST /wishes # 发布心愿(自动审核)
GET /wishes/{id} # 获取心愿详情
DELETE /wishes/{id} # 删除我的心愿
互动相关:
POST /wishes/{id}/like # 点赞心愿
DELETE /wishes/{id}/like # 取消点赞
GET /wishes/{id}/comments # 获取评论列表
POST /wishes/{id}/comments # 发表评论
素材相关:
GET /backgrounds # 获取背景素材列表
2.3 移动端请求/响应示例
发布心愿
// POST /api/front/wishtree/wishes
// Request:
{
"festivalId": 1,
"content": "新年快乐,万事如意!",
"backgroundId": 1
}
// Response:
{
"code": 200,
"message": "发布成功",
"data": {
"id": 10001,
"uid": 1001,
"festivalId": 1,
"content": "新年快乐,万事如意!",
"backgroundId": 1,
"status": 1,
"auditRemark": "自动审核通过",
"likeCount": 0,
"createTime": "2025-12-30 12:00:00"
}
}
获取我的心愿列表
// GET /api/front/wishtree/wishes/my?page=1&limit=10
// Response:
{
"code": 200,
"data": {
"list": [
{
"id": 10001,
"content": "新年快乐,万事如意!",
"festivalName": "元旦",
"festivalIcon": "🎉",
"backgroundImage": "https://xxx/bg1.jpg",
"status": 1,
"likeCount": 128,
"commentCount": 32,
"createTime": "2025-12-30 12:00:00"
}
],
"total": 5,
"page": 1,
"limit": 10
}
}
三、管理端前端设计
3.1 路由配置
文件:Zhibo/admin/src/router/modules/communityManage.js
import Layout from '@/layout';
const communityManageRouter = {
path: '/community',
component: Layout,
redirect: '/community/category',
name: 'Community',
alwaysShow: true,
meta: {
title: '缘池管理',
icon: 'el-icon-s-opportunity',
},
children: [
{
path: 'category',
component: () => import('@/views/community/category/index'),
name: 'CommunityCategory',
meta: { title: '板块管理' },
},
{
path: 'message',
component: () => import('@/views/community/message/index'),
name: 'CommunityMessage',
meta: { title: '消息管理' },
},
{
path: 'match-config',
component: () => import('@/views/community/matchConfig/index'),
name: 'MatchConfig',
meta: { title: '匹配配置' },
},
],
};
export default communityManageRouter;
文件:Zhibo/admin/src/router/modules/wishtreeManage.js
import Layout from '@/layout';
const wishtreeManageRouter = {
path: '/wishtree',
component: Layout,
redirect: '/wishtree/festival',
name: 'Wishtree',
alwaysShow: true,
meta: {
title: '许愿树管理',
icon: 'el-icon-present',
},
children: [
{
path: 'festival',
component: () => import('@/views/wishtree/festival/index'),
name: 'WishtreeFestival',
meta: { title: '节日管理' },
},
{
path: 'wish',
component: () => import('@/views/wishtree/wish/index'),
name: 'WishtreeWish',
meta: { title: '心愿管理' },
},
{
path: 'background',
component: () => import('@/views/wishtree/background/index'),
name: 'WishtreeBackground',
meta: { title: '背景素材' },
},
{
path: 'statistics',
component: () => import('@/views/wishtree/statistics/index'),
name: 'WishtreeStatistics',
meta: { title: '数据统计' },
},
],
};
export default wishtreeManageRouter;
3.2 API接口
文件:Zhibo/admin/src/api/community.js
import request from '@/utils/request';
// ==================== 板块管理 ====================
export function categoryList() {
return request({ url: '/admin/community/category/list', method: 'get' });
}
export function categorySave(data) {
return request({ url: '/admin/community/category/save', method: 'post', data });
}
export function categoryDelete(id) {
return request({ url: `/admin/community/category/delete/${id}`, method: 'delete' });
}
export function categoryStatus(data) {
return request({ url: '/admin/community/category/status', method: 'post', data });
}
// ==================== 消息管理 ====================
export function messageList(data) {
return request({ url: '/admin/community/message/list', method: 'post', data });
}
export function messageAudit(data) {
return request({ url: '/admin/community/message/audit', method: 'post', data });
}
export function messageDelete(id) {
return request({ url: `/admin/community/message/delete/${id}`, method: 'delete' });
}
// ==================== 匹配配置 ====================
export function getMatchConfig() {
return request({ url: '/admin/community/match/config', method: 'get' });
}
export function saveMatchConfig(data) {
return request({ url: '/admin/community/match/config/save', method: 'post', data });
}
文件:Zhibo/admin/src/api/wishtree.js
import request from '@/utils/request';
// ==================== 节日管理 ====================
export function festivalList(params) {
return request({ url: '/admin/wishtree/festival/list', method: 'get', params });
}
export function festivalSave(data) {
return request({ url: '/admin/wishtree/festival/save', method: 'post', data });
}
export function festivalDelete(id) {
return request({ url: `/admin/wishtree/festival/delete/${id}`, method: 'delete' });
}
export function festivalStatus(data) {
return request({ url: '/admin/wishtree/festival/status', method: 'post', data });
}
// ==================== 心愿管理 ====================
export function wishList(data) {
return request({ url: '/admin/wishtree/wish/list', method: 'post', data });
}
export function wishAudit(data) {
return request({ url: '/admin/wishtree/wish/audit', method: 'post', data });
}
export function wishDelete(id) {
return request({ url: `/admin/wishtree/wish/delete/${id}`, method: 'delete' });
}
// ==================== 背景素材 ====================
export function backgroundList(params) {
return request({ url: '/admin/wishtree/background/list', method: 'get', params });
}
export function backgroundSave(data) {
return request({ url: '/admin/wishtree/background/save', method: 'post', data });
}
export function backgroundDelete(id) {
return request({ url: `/admin/wishtree/background/delete/${id}`, method: 'delete' });
}
// ==================== 数据统计 ====================
export function getStatistics(params) {
return request({ url: '/admin/wishtree/statistics', method: 'get', params });
}
export function getWishTrend(params) {
return request({ url: '/admin/wishtree/statistics/trend', method: 'get', params });
}
3.3 页面设计
3.3.1 缘池 - 板块管理
┌─────────────────────────────────────────────────────────────────┐
│ [+ 新增板块] │
├─────────────────────────────────────────────────────────────────┤
│ 图标 │ 名称 │ 类型 │ 跳转页面 │ 排序 │ 状态 │ 操作 │
├──────┼────────────┼────────┼──────────────┼──────┼──────┼──────┤
│ 🎤 │ 语音匹配 │ 快捷 │ VoiceMatch │ 100 │ ●启用│ 编辑 │
│ 💕 │ 心动信号 │ 快捷 │ Heartbeat │ 99 │ ●启用│ 编辑 │
│ 💑 │ 在线处对象 │ 功能卡 │ OnlineDating │ 90 │ ●启用│ 编辑 │
│ 🎮 │ 找人玩游戏 │ 功能卡 │ FindGame │ 89 │ ●启用│ 编辑 │
│ 🎵 │ 一起KTV │ 功能卡 │ KTVTogether │ 88 │ ●启用│ 编辑 │
└─────────────────────────────────────────────────────────────────┘
3.3.2 缘池 - 消息管理
┌─────────────────────────────────────────────────────────────────────┐
│ 板块[全部▼] 状态[全部▼] 时间[起始-结束] [搜索] │
├─────────────────────────────────────────────────────────────────────┤
│ 用户 │ 板块 │ 内容 │ 状态 │ 审核 │ 时间 │ 操作 │
├──────────┼──────────┼──────────────┼────────┼────────┼───────┼──────┤
│ 👤张三 │ 找人玩游戏│ 有人一起.. │ 已通过 │ 自动 │ 12:30 │ 删除 │
│ 👤李四 │ 在线处对象│ 真诚交友.. │ 待审核 │ - │ 11:20 │ ✓ ✗ │
│ 👤王五 │ 一起KTV │ 周末约歌.. │ 已拒绝 │ 自动 │ 10:15 │ 删除 │
└─────────────────────────────────────────────────────────────────────┘
3.3.3 缘池 - 匹配配置
┌─────────────────────────────────────────────────────────────────┐
│ 用户匹配配置 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 匹配半径(公里) [____5____] │
│ │
│ 每次推荐用户数 [____6____] │
│ │
│ 优先显示在线用户 [========●] │
│ │
│ 优先显示同城用户 [========●] │
│ │
│ 优先显示异性用户 [========●] │
│ │
│ 自动审核开关 [========●] │
│ │
│ [保存配置] │
└─────────────────────────────────────────────────────────────────┘
3.3.4 许愿树 - 节日管理
┌─────────────────────────────────────────────────────────────────────┐
│ [+ 新增节日] │
├─────────────────────────────────────────────────────────────────────┤
│ 图标 │ 节日名称 │ 开始日期 │ 结束日期 │ 主题色 │ 状态 │ 操作 │
├──────┼──────────┼────────────┼────────────┼─────────┼──────┼───────┤
│ 🎉 │ 元旦 │ 12-31 │ 01-03 │ #FF6B6B │ ●启用│ 编辑 │
│ 🧧 │ 春节 │ 农历除夕 │ 正月十五 │ #E74C3C │ ●启用│ 编辑 │
│ 💕 │ 情人节 │ 02-13 │ 02-15 │ #FF69B4 │ ●启用│ 编辑 │
│ 🎂 │ 生日祝福 │ 全年 │ 全年 │ #FFB6C1 │ ●启用│ 编辑 │
│ ✨ │ 日常祝福 │ 全年 │ 全年 │ #9B59B6 │ ●启用│ 编辑 │
└─────────────────────────────────────────────────────────────────────┘
3.3.5 许愿树 - 心愿管理
┌─────────────────────────────────────────────────────────────────────┐
│ 节日[全部▼] 状态[全部▼] 时间[起始-结束] [搜索] │
├─────────────────────────────────────────────────────────────────────┤
│ 用户 │ 节日 │ 心愿内容 │ 状态 │ 审核 │ 时间 │ 操作 │
├──────────┼────────┼────────────────┼────────┼────────┼───────┼──────┤
│ 👤张三 │ 元旦 │ 新年快乐.. │ 已通过 │ 自动 │ 12:30 │ 删除 │
│ 👤李四 │ 生日 │ 祝自己生日.. │ 待审核 │ - │ 11:20 │ ✓ ✗ │
│ 👤王五 │ 日常 │ 希望一切.. │ 已通过 │ 自动 │ 10:15 │ 删除 │
└─────────────────────────────────────────────────────────────────────┘
3.3.6 许愿树 - 背景素材
┌─────────────────────────────────────────────────────────────────────┐
│ [+ 上传背景] 类型[全部▼] │
├─────────────────────────────────────────────────────────────────────┤
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ 🎄 │ │ 🧧 │ │ 💕 │ │ 🎂 │ │ ✨ │ │
│ │ 元旦 │ │ 春节 │ │ 情人节 │ │ 生日 │ │ 日常 │ │
│ │ [删除] │ │ [删除] │ │ [删除] │ │ [删除] │ │ [删除] │ │
│ └─────────┘ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │
│ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ 🌸 │ │ 🎈 │ │ 🌙 │ │
│ │ 妇女节 │ │ 儿童节 │ │ 七夕 │ │
│ │ [删除] │ │ [删除] │ │ [删除] │ │
│ └─────────┘ └─────────┘ └─────────┘ │
└─────────────────────────────────────────────────────────────────────┘
3.3.7 许愿树 - 数据统计
┌─────────────────────────────────────────────────────────────────────┐
│ 数据统计 时间范围[近7天▼] │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌────────────┐ │
│ │ 总心愿数 │ │ 今日新增 │ │ 待审核 │ │ 总点赞数 │ │
│ │ 12,580 │ │ 156 │ │ 23 │ │ 89,320 │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ └────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 心愿发布趋势 │ │
│ │ 📈 折线图 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
│ ┌──────────────────────────┐ ┌────────────────────────────────┐ │
│ │ 节日分布(饼图) │ │ 热门心愿TOP10 │ │
│ │ 🎉元旦 35% │ │ 1. 新年快乐... ❤️128 │ │
│ │ 🧧春节 28% │ │ 2. 万事如意... ❤️96 │ │
│ │ 💕情人节 15% │ │ 3. 心想事成... ❤️85 │ │
│ │ ✨日常 22% │ │ ... │ │
│ └──────────────────────────┘ └────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────┘
四、后端设计
4.1 移动端Controller(前台接口)
CommunityFrontController.java
@RestController
@RequestMapping("/api/front/community")
@Api(tags = "缘池-移动端")
public class CommunityFrontController {
@Autowired
private CommunityService communityService;
@ApiOperation("获取板块列表")
@GetMapping("/categories")
public CommonResult<List<CommunityCategory>> getCategories() {
return CommonResult.success(communityService.getEnabledCategories());
}
@ApiOperation("获取消息列表")
@GetMapping("/messages")
public CommonResult<PageInfo<CommunityMessageVO>> getMessages(
@RequestParam(required = false) Integer categoryId,
@RequestParam(defaultValue = "1") Integer page,
@RequestParam(defaultValue = "20") Integer limit) {
return CommonResult.success(communityService.getFrontMessageList(categoryId, page, limit));
}
@ApiOperation("发布消息")
@PostMapping("/messages")
public CommonResult<CommunityMessage> publishMessage(@RequestBody CommunityMessageRequest request) {
return CommonResult.success(communityService.publishMessage(request));
}
@ApiOperation("删除我的消息")
@DeleteMapping("/messages/{id}")
public CommonResult<String> deleteMyMessage(@PathVariable Long id) {
communityService.deleteMyMessage(id);
return CommonResult.success("删除成功");
}
@ApiOperation("获取附近用户")
@GetMapping("/nearby-users")
public CommonResult<List<NearbyUserVO>> getNearbyUsers(
@RequestParam Double latitude,
@RequestParam Double longitude,
@RequestParam(defaultValue = "5000") Integer radius,
@RequestParam(defaultValue = "6") Integer limit) {
return CommonResult.success(communityService.getNearbyUsers(latitude, longitude, radius, limit));
}
}
WishtreeFrontController.java
@RestController
@RequestMapping("/api/front/wishtree")
@Api(tags = "许愿树-移动端")
public class WishtreeFrontController {
@Autowired
private WishtreeService wishtreeService;
// ==================== 节日相关 ====================
@ApiOperation("获取节日列表")
@GetMapping("/festivals")
public CommonResult<List<WishtreeFestival>> getFestivals() {
return CommonResult.success(wishtreeService.getEnabledFestivals());
}
@ApiOperation("获取当前进行中的节日")
@GetMapping("/festivals/current")
public CommonResult<WishtreeFestival> getCurrentFestival() {
return CommonResult.success(wishtreeService.getCurrentFestival());
}
// ==================== 心愿相关 ====================
@ApiOperation("获取心愿列表")
@GetMapping("/wishes")
public CommonResult<PageInfo<WishtreeWishVO>> getWishes(
@RequestParam(required = false) Integer festivalId,
@RequestParam(defaultValue = "1") Integer page,
@RequestParam(defaultValue = "20") Integer limit) {
return CommonResult.success(wishtreeService.getFrontWishList(festivalId, page, limit));
}
@ApiOperation("获取我的心愿列表")
@GetMapping("/wishes/my")
public CommonResult<PageInfo<WishtreeWishVO>> getMyWishes(
@RequestParam(defaultValue = "1") Integer page,
@RequestParam(defaultValue = "10") Integer limit) {
return CommonResult.success(wishtreeService.getMyWishList(page, limit));
}
@ApiOperation("发布心愿")
@PostMapping("/wishes")
public CommonResult<WishtreeWish> publishWish(@RequestBody WishtreeWishRequest request) {
return CommonResult.success(wishtreeService.publishWish(request));
}
@ApiOperation("获取心愿详情")
@GetMapping("/wishes/{id}")
public CommonResult<WishtreeWishVO> getWishDetail(@PathVariable Long id) {
return CommonResult.success(wishtreeService.getWishDetail(id));
}
@ApiOperation("删除我的心愿")
@DeleteMapping("/wishes/{id}")
public CommonResult<String> deleteMyWish(@PathVariable Long id) {
wishtreeService.deleteMyWish(id);
return CommonResult.success("删除成功");
}
// ==================== 互动相关 ====================
@ApiOperation("点赞心愿")
@PostMapping("/wishes/{id}/like")
public CommonResult<String> likeWish(@PathVariable Long id) {
wishtreeService.likeWish(id);
return CommonResult.success("点赞成功");
}
@ApiOperation("取消点赞")
@DeleteMapping("/wishes/{id}/like")
public CommonResult<String> unlikeWish(@PathVariable Long id) {
wishtreeService.unlikeWish(id);
return CommonResult.success("取消成功");
}
@ApiOperation("获取评论列表")
@GetMapping("/wishes/{id}/comments")
public CommonResult<PageInfo<WishtreeCommentVO>> getComments(
@PathVariable Long id,
@RequestParam(defaultValue = "1") Integer page,
@RequestParam(defaultValue = "20") Integer limit) {
return CommonResult.success(wishtreeService.getCommentList(id, page, limit));
}
@ApiOperation("发表评论")
@PostMapping("/wishes/{id}/comments")
public CommonResult<WishtreeComment> addComment(
@PathVariable Long id,
@RequestBody WishtreeCommentRequest request) {
return CommonResult.success(wishtreeService.addComment(id, request));
}
// ==================== 素材相关 ====================
@ApiOperation("获取背景素材列表")
@GetMapping("/backgrounds")
public CommonResult<List<WishtreeBackground>> getBackgrounds() {
return CommonResult.success(wishtreeService.getEnabledBackgrounds());
}
}
4.2 管理端Controller(后台接口)
CommunityAdminController.java
文件:crmeb-admin/src/main/java/com/zbkj/admin/controller/CommunityAdminController.java
package com.zbkj.admin.controller;
import com.github.pagehelper.PageInfo;
import com.zbkj.common.model.community.*;
import com.zbkj.common.request.*;
import com.zbkj.common.response.*;
import com.zbkj.common.result.CommonResult;
import com.zbkj.service.service.CommunityService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/admin/community")
@Api(tags = "缘池管理")
public class CommunityAdminController {
@Autowired
private CommunityService communityService;
// ==================== 板块管理 ====================
@ApiOperation("板块列表")
@GetMapping("/category/list")
public CommonResult<List<CommunityCategory>> categoryList() {
return CommonResult.success(communityService.getCategoryList());
}
@ApiOperation("保存板块")
@PostMapping("/category/save")
public CommonResult<String> categorySave(@RequestBody CommunityCategory category) {
communityService.saveCategory(category);
return CommonResult.success("保存成功");
}
@ApiOperation("删除板块")
@DeleteMapping("/category/delete/{id}")
public CommonResult<String> categoryDelete(@PathVariable Integer id) {
communityService.deleteCategory(id);
return CommonResult.success("删除成功");
}
@ApiOperation("更新板块状态")
@PostMapping("/category/status")
public CommonResult<String> categoryStatus(@RequestBody CommunityCategory category) {
communityService.updateCategoryStatus(category.getId(), category.getStatus());
return CommonResult.success("更新成功");
}
// ==================== 消息管理 ====================
@ApiOperation("消息列表")
@PostMapping("/message/list")
public CommonResult<PageInfo<CommunityMessageVO>> messageList(
@RequestBody CommunityMessageRequest request) {
return CommonResult.success(communityService.getMessageList(request));
}
@ApiOperation("审核消息")
@PostMapping("/message/audit")
public CommonResult<String> messageAudit(@RequestBody AuditRequest request) {
communityService.auditMessage(request.getId(), request.getStatus(), request.getRemark());
return CommonResult.success("审核成功");
}
@ApiOperation("删除消息")
@DeleteMapping("/message/delete/{id}")
public CommonResult<String> messageDelete(@PathVariable Long id) {
communityService.deleteMessage(id);
return CommonResult.success("删除成功");
}
// ==================== 匹配配置 ====================
@ApiOperation("获取匹配配置")
@GetMapping("/match/config")
public CommonResult<CommunityMatchConfig> getMatchConfig() {
return CommonResult.success(communityService.getMatchConfig());
}
@ApiOperation("保存匹配配置")
@PostMapping("/match/config/save")
public CommonResult<String> saveMatchConfig(@RequestBody CommunityMatchConfig config) {
communityService.saveMatchConfig(config);
return CommonResult.success("保存成功");
}
}
WishtreeAdminController.java
文件:crmeb-admin/src/main/java/com/zbkj/admin/controller/WishtreeAdminController.java
package com.zbkj.admin.controller;
import com.github.pagehelper.PageInfo;
import com.zbkj.common.model.wishtree.*;
import com.zbkj.common.request.*;
import com.zbkj.common.response.*;
import com.zbkj.common.result.CommonResult;
import com.zbkj.service.service.WishtreeService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/admin/wishtree")
@Api(tags = "许愿树管理")
public class WishtreeAdminController {
@Autowired
private WishtreeService wishtreeService;
// ==================== 节日管理 ====================
@ApiOperation("节日列表")
@GetMapping("/festival/list")
public CommonResult<List<WishtreeFestival>> festivalList() {
return CommonResult.success(wishtreeService.getFestivalList());
}
@ApiOperation("保存节日")
@PostMapping("/festival/save")
public CommonResult<String> festivalSave(@RequestBody WishtreeFestival festival) {
wishtreeService.saveFestival(festival);
return CommonResult.success("保存成功");
}
@ApiOperation("删除节日")
@DeleteMapping("/festival/delete/{id}")
public CommonResult<String> festivalDelete(@PathVariable Integer id) {
wishtreeService.deleteFestival(id);
return CommonResult.success("删除成功");
}
@ApiOperation("更新节日状态")
@PostMapping("/festival/status")
public CommonResult<String> festivalStatus(@RequestBody WishtreeFestival festival) {
wishtreeService.updateFestivalStatus(festival.getId(), festival.getStatus());
return CommonResult.success("更新成功");
}
// ==================== 心愿管理 ====================
@ApiOperation("心愿列表")
@PostMapping("/wish/list")
public CommonResult<PageInfo<WishtreeWishVO>> wishList(@RequestBody WishtreeWishRequest request) {
return CommonResult.success(wishtreeService.getWishList(request));
}
@ApiOperation("审核心愿")
@PostMapping("/wish/audit")
public CommonResult<String> wishAudit(@RequestBody AuditRequest request) {
wishtreeService.auditWish(request.getId(), request.getStatus(), request.getRemark());
return CommonResult.success("审核成功");
}
@ApiOperation("删除心愿")
@DeleteMapping("/wish/delete/{id}")
public CommonResult<String> wishDelete(@PathVariable Long id) {
wishtreeService.deleteWish(id);
return CommonResult.success("删除成功");
}
// ==================== 背景素材 ====================
@ApiOperation("背景列表")
@GetMapping("/background/list")
public CommonResult<List<WishtreeBackground>> backgroundList() {
return CommonResult.success(wishtreeService.getBackgroundList());
}
@ApiOperation("保存背景")
@PostMapping("/background/save")
public CommonResult<String> backgroundSave(@RequestBody WishtreeBackground background) {
wishtreeService.saveBackground(background);
return CommonResult.success("保存成功");
}
@ApiOperation("删除背景")
@DeleteMapping("/background/delete/{id}")
public CommonResult<String> backgroundDelete(@PathVariable Integer id) {
wishtreeService.deleteBackground(id);
return CommonResult.success("删除成功");
}
}
4.3 Service核心方法
CommunityService.java(核心方法)
@Service
public class CommunityService {
@Autowired
private CommunityCategoryDao categoryDao;
@Autowired
private CommunityMessageDao messageDao;
@Autowired
private CommunityMatchConfigDao matchConfigDao;
@Autowired
private SensitiveWordService sensitiveWordService;
// 板块管理
public List<CommunityCategory> getCategoryList() {
return categoryDao.selectList(new QueryWrapper<CommunityCategory>()
.orderByDesc("sort"));
}
public void saveCategory(CommunityCategory category) {
if (category.getId() != null) {
categoryDao.updateById(category);
} else {
categoryDao.insert(category);
}
}
// 消息管理
public PageInfo<CommunityMessageVO> getMessageList(CommunityMessageRequest request) {
PageHelper.startPage(request.getPage(), request.getLimit());
List<CommunityMessageVO> list = messageDao.selectMessageList(request);
return new PageInfo<>(list);
}
// 自动审核
public void autoAuditMessage(CommunityMessage message) {
CommunityMatchConfig config = getMatchConfig();
if (config.getAutoAudit() != 1) {
message.setStatus(0);
return;
}
List<String> words = sensitiveWordService.findAll(message.getContent());
if (words.isEmpty()) {
message.setStatus(1);
message.setAuditRemark("自动审核通过");
} else {
message.setStatus(0);
message.setAuditRemark("含敏感词:" + String.join(",", words));
}
message.setAuditType(0);
}
// 匹配配置
public CommunityMatchConfig getMatchConfig() {
return matchConfigDao.selectById(1);
}
public void saveMatchConfig(CommunityMatchConfig config) {
config.setId(1);
matchConfigDao.updateById(config);
}
}
WishtreeService.java(核心方法)
@Service
public class WishtreeService {
@Autowired
private WishtreeFestivalDao festivalDao;
@Autowired
private WishtreeWishDao wishDao;
@Autowired
private WishtreeBackgroundDao backgroundDao;
@Autowired
private WishtreeLikeDao likeDao;
@Autowired
private WishtreeCommentDao commentDao;
@Autowired
private SensitiveWordService sensitiveWordService;
// ==================== 移动端方法 ====================
// 获取启用的节日列表
public List<WishtreeFestival> getEnabledFestivals() {
return festivalDao.selectList(new QueryWrapper<WishtreeFestival>()
.eq("status", 1)
.orderByDesc("sort"));
}
// 获取当前进行中的节日
public WishtreeFestival getCurrentFestival() {
// 根据当前日期匹配节日
return festivalDao.selectCurrentFestival();
}
// 获取心愿列表(移动端)
public PageInfo<WishtreeWishVO> getFrontWishList(Integer festivalId, Integer page, Integer limit) {
PageHelper.startPage(page, limit);
List<WishtreeWishVO> list = wishDao.selectFrontWishList(festivalId);
return new PageInfo<>(list);
}
// 获取我的心愿列表
public PageInfo<WishtreeWishVO> getMyWishList(Integer page, Integer limit) {
Integer uid = SecurityUtil.getLoginUserVo().getUser().getId();
PageHelper.startPage(page, limit);
List<WishtreeWishVO> list = wishDao.selectMyWishList(uid);
return new PageInfo<>(list);
}
// 发布心愿(自动审核)
@Transactional
public WishtreeWish publishWish(WishtreeWishRequest request) {
Integer uid = SecurityUtil.getLoginUserVo().getUser().getId();
WishtreeWish wish = new WishtreeWish();
wish.setUid(uid);
wish.setFestivalId(request.getFestivalId());
wish.setContent(request.getContent());
wish.setBackgroundId(request.getBackgroundId());
wish.setLikeCount(0);
wish.setCommentCount(0);
wish.setIsDelete(0);
// 自动审核
autoAuditWish(wish);
wishDao.insert(wish);
return wish;
}
// 删除我的心愿
public void deleteMyWish(Long id) {
Integer uid = SecurityUtil.getLoginUserVo().getUser().getId();
WishtreeWish wish = wishDao.selectById(id);
if (wish != null && wish.getUid().equals(uid)) {
wish.setIsDelete(1);
wishDao.updateById(wish);
}
}
// 点赞心愿
@Transactional
public void likeWish(Long wishId) {
Integer uid = SecurityUtil.getLoginUserVo().getUser().getId();
// 检查是否已点赞
WishtreeLike existing = likeDao.selectOne(new QueryWrapper<WishtreeLike>()
.eq("uid", uid).eq("wish_id", wishId));
if (existing != null) return;
// 添加点赞记录
WishtreeLike like = new WishtreeLike();
like.setUid(uid);
like.setWishId(wishId);
likeDao.insert(like);
// 更新点赞数
wishDao.incrementLikeCount(wishId);
}
// 取消点赞
@Transactional
public void unlikeWish(Long wishId) {
Integer uid = SecurityUtil.getLoginUserVo().getUser().getId();
likeDao.delete(new QueryWrapper<WishtreeLike>()
.eq("uid", uid).eq("wish_id", wishId));
wishDao.decrementLikeCount(wishId);
}
// 发表评论
@Transactional
public WishtreeComment addComment(Long wishId, WishtreeCommentRequest request) {
Integer uid = SecurityUtil.getLoginUserVo().getUser().getId();
WishtreeComment comment = new WishtreeComment();
comment.setWishId(wishId);
comment.setUid(uid);
comment.setContent(request.getContent());
comment.setStatus(1); // 自动通过或待审核
// 自动审核评论
List<String> words = sensitiveWordService.findAll(request.getContent());
if (!words.isEmpty()) {
comment.setStatus(0); // 待审核
}
commentDao.insert(comment);
// 更新评论数
if (comment.getStatus() == 1) {
wishDao.incrementCommentCount(wishId);
}
return comment;
}
// ==================== 管理端方法 ====================
// 节日管理
public List<WishtreeFestival> getFestivalList() {
return festivalDao.selectList(new QueryWrapper<WishtreeFestival>()
.orderByDesc("sort"));
}
public void saveFestival(WishtreeFestival festival) {
if (festival.getId() != null) {
festivalDao.updateById(festival);
} else {
festivalDao.insert(festival);
}
}
// 心愿管理
public PageInfo<WishtreeWishVO> getWishList(WishtreeWishRequest request) {
PageHelper.startPage(request.getPage(), request.getLimit());
List<WishtreeWishVO> list = wishDao.selectWishList(request);
return new PageInfo<>(list);
}
// 自动审核心愿
public void autoAuditWish(WishtreeWish wish) {
List<String> words = sensitiveWordService.findAll(wish.getContent());
if (words.isEmpty()) {
wish.setStatus(1);
wish.setAuditRemark("自动审核通过");
} else {
wish.setStatus(0);
wish.setAuditRemark("含敏感词:" + String.join(",", words));
}
wish.setAuditType(0);
}
// 数据统计
public WishtreeStatisticsVO getStatistics() {
WishtreeStatisticsVO vo = new WishtreeStatisticsVO();
vo.setTotalWishes(wishDao.countTotal());
vo.setTodayWishes(wishDao.countToday());
vo.setPendingWishes(wishDao.countPending());
vo.setTotalLikes(wishDao.sumLikes());
return vo;
}
// 背景素材
public List<WishtreeBackground> getBackgroundList() {
return backgroundDao.selectList(new QueryWrapper<WishtreeBackground>()
.orderByDesc("sort"));
}
public List<WishtreeBackground> getEnabledBackgrounds() {
return backgroundDao.selectList(new QueryWrapper<WishtreeBackground>()
.eq("status", 1)
.orderByDesc("sort"));
}
}
五、数据库设计
5.1 缘池相关表
-- ============================================
-- 缘池管理数据库表
-- ============================================
-- 1. 板块表
CREATE TABLE `eb_community_category` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '板块ID',
`name` varchar(50) NOT NULL COMMENT '板块名称',
`icon` varchar(255) DEFAULT '' COMMENT '图标',
`type` varchar(20) DEFAULT 'card' COMMENT '类型 quick=快捷入口 card=功能卡片',
`jump_page` varchar(100) DEFAULT '' COMMENT '跳转页面',
`sort` int DEFAULT 0 COMMENT '排序',
`status` tinyint DEFAULT 1 COMMENT '状态 0禁用 1启用',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='缘池板块表';
-- 2. 消息表
CREATE TABLE `eb_community_message` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '消息ID',
`uid` int NOT NULL COMMENT '用户ID',
`category_id` int NOT NULL COMMENT '板块ID',
`content` text COMMENT '消息内容',
`images` varchar(1000) DEFAULT '' COMMENT '图片(逗号分隔)',
`status` tinyint DEFAULT 1 COMMENT '状态 0待审核 1通过 2拒绝',
`audit_type` tinyint DEFAULT 0 COMMENT '审核方式 0自动 1人工',
`audit_remark` varchar(255) DEFAULT '' COMMENT '审核备注',
`is_delete` tinyint DEFAULT 0 COMMENT '是否删除',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_uid` (`uid`),
KEY `idx_category` (`category_id`),
KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='缘池消息表';
-- 3. 匹配配置表
CREATE TABLE `eb_community_match_config` (
`id` int NOT NULL AUTO_INCREMENT,
`match_radius` int DEFAULT 5 COMMENT '匹配半径(公里)',
`recommend_count` int DEFAULT 6 COMMENT '推荐用户数',
`priority_online` tinyint DEFAULT 1 COMMENT '优先在线用户',
`priority_same_city` tinyint DEFAULT 1 COMMENT '优先同城用户',
`priority_opposite_sex` tinyint DEFAULT 1 COMMENT '优先异性用户',
`auto_audit` tinyint DEFAULT 1 COMMENT '自动审核开关',
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='缘池匹配配置表';
-- 初始化匹配配置
INSERT INTO `eb_community_match_config` VALUES (1, 5, 6, 1, 1, 1, 1, NOW());
-- 初始化板块数据
INSERT INTO `eb_community_category` (`name`, `icon`, `type`, `jump_page`, `sort`) VALUES
('语音匹配', 'el-icon-microphone', 'quick', 'VoiceMatchActivity', 100),
('心动信号', 'el-icon-star-on', 'quick', 'HeartbeatSignalActivity', 99),
('在线处对象', 'el-icon-user', 'card', 'OnlineDatingActivity', 90),
('找人玩游戏', 'el-icon-video-play', 'card', 'FindGameActivity', 89),
('一起KTV', 'el-icon-headset', 'card', 'KTVTogetherActivity', 88),
('你画我猜', 'el-icon-edit', 'card', 'DrawGuessActivity', 87),
('和平精英', 'el-icon-aim', 'card', 'PeaceEliteActivity', 86),
('桌游', 'el-icon-s-grid', 'card', 'TableGamesActivity', 85);
5.2 许愿树相关表
-- ============================================
-- 许愿树管理数据库表
-- ============================================
-- 1. 节日表
CREATE TABLE `eb_wishtree_festival` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '节日ID',
`name` varchar(50) NOT NULL COMMENT '节日名称',
`icon` varchar(255) DEFAULT '' COMMENT '节日图标',
`start_date` varchar(20) DEFAULT '' COMMENT '开始日期(MM-DD或农历)',
`end_date` varchar(20) DEFAULT '' COMMENT '结束日期',
`is_lunar` tinyint DEFAULT 0 COMMENT '是否农历 0否 1是',
`theme_color` varchar(20) DEFAULT '#FF6B6B' COMMENT '主题色',
`sort` int DEFAULT 0 COMMENT '排序',
`status` tinyint DEFAULT 1 COMMENT '状态 0禁用 1启用',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='许愿树节日表';
-- 2. 心愿表
CREATE TABLE `eb_wishtree_wish` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '心愿ID',
`uid` int NOT NULL COMMENT '用户ID',
`festival_id` int DEFAULT 0 COMMENT '节日ID',
`content` varchar(500) NOT NULL COMMENT '心愿内容',
`background_id` int DEFAULT 0 COMMENT '背景ID',
`status` tinyint DEFAULT 1 COMMENT '状态 0待审核 1通过 2拒绝',
`audit_type` tinyint DEFAULT 0 COMMENT '审核方式 0自动 1人工',
`audit_remark` varchar(255) DEFAULT '' COMMENT '审核备注',
`like_count` int DEFAULT 0 COMMENT '点赞数',
`comment_count` int DEFAULT 0 COMMENT '评论数',
`is_delete` tinyint DEFAULT 0 COMMENT '是否删除',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_uid` (`uid`),
KEY `idx_festival` (`festival_id`),
KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='许愿树心愿表';
-- 3. 心愿点赞表
CREATE TABLE `eb_wishtree_like` (
`id` bigint NOT NULL AUTO_INCREMENT,
`uid` int NOT NULL COMMENT '用户ID',
`wish_id` bigint NOT NULL COMMENT '心愿ID',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_uid_wish` (`uid`, `wish_id`),
KEY `idx_wish` (`wish_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='许愿树点赞表';
-- 4. 心愿评论表
CREATE TABLE `eb_wishtree_comment` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '评论ID',
`wish_id` bigint NOT NULL COMMENT '心愿ID',
`uid` int NOT NULL COMMENT '用户ID',
`content` varchar(255) NOT NULL COMMENT '评论内容',
`parent_id` bigint DEFAULT 0 COMMENT '父评论ID',
`status` tinyint DEFAULT 1 COMMENT '状态 0待审核 1通过 2拒绝',
`is_delete` tinyint DEFAULT 0 COMMENT '是否删除',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_wish` (`wish_id`),
KEY `idx_uid` (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='许愿树评论表';
-- 5. 背景素材表
CREATE TABLE `eb_wishtree_background` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '背景ID',
`name` varchar(50) NOT NULL COMMENT '背景名称',
`image` varchar(255) NOT NULL COMMENT '背景图片',
`festival_id` int DEFAULT 0 COMMENT '关联节日ID(0=通用)',
`sort` int DEFAULT 0 COMMENT '排序',
`status` tinyint DEFAULT 1 COMMENT '状态',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='许愿树背景素材表';
-- 初始化节日数据
INSERT INTO `eb_wishtree_festival` (`name`, `icon`, `start_date`, `end_date`, `is_lunar`, `theme_color`, `sort`) VALUES
('元旦', '🎉', '12-31', '01-03', 0, '#FF6B6B', 100),
('春节', '🧧', '除夕', '正月十五', 1, '#E74C3C', 99),
('情人节', '💕', '02-13', '02-15', 0, '#FF69B4', 98),
('妇女节', '🌸', '03-07', '03-09', 0, '#FFB6C1', 97),
('清明节', '🌿', '清明', '清明后2天', 1, '#90EE90', 96),
('劳动节', '💪', '04-30', '05-03', 0, '#FFA500', 95),
('母亲节', '🌹', '5月第2周日', '5月第2周日', 0, '#FF1493', 94),
('儿童节', '🎈', '05-31', '06-02', 0, '#87CEEB', 93),
('端午节', '🐲', '五月初五', '五月初七', 1, '#228B22', 92),
('七夕', '🌙', '七月初七', '七月初七', 1, '#9370DB', 91),
('中秋节', '🥮', '八月十五', '八月十七', 1, '#FFD700', 90),
('国庆节', '🇨🇳', '09-30', '10-07', 0, '#FF0000', 89),
('圣诞节', '🎄', '12-24', '12-26', 0, '#228B22', 88),
('生日祝福', '🎂', '全年', '全年', 0, '#FF69B4', 50),
('日常祝福', '✨', '全年', '全年', 0, '#9B59B6', 49);
六、实体类设计
6.1 缘池实体类
// CommunityCategory.java
@Data
@TableName("eb_community_category")
public class CommunityCategory {
@TableId(type = IdType.AUTO)
private Integer id;
private String name;
private String icon;
private String type; // quick=快捷入口 card=功能卡片
private String jumpPage; // 跳转页面
private Integer sort;
private Integer status;
private Date createTime;
private Date updateTime;
}
// CommunityMessage.java
@Data
@TableName("eb_community_message")
public class CommunityMessage {
@TableId(type = IdType.AUTO)
private Long id;
private Integer uid;
private Integer categoryId;
private String content;
private String images;
private Integer status;
private Integer auditType;
private String auditRemark;
private Integer isDelete;
private Date createTime;
private Date updateTime;
}
// CommunityMatchConfig.java
@Data
@TableName("eb_community_match_config")
public class CommunityMatchConfig {
@TableId(type = IdType.AUTO)
private Integer id;
private Integer matchRadius; // 匹配半径
private Integer recommendCount; // 推荐用户数
private Integer priorityOnline; // 优先在线
private Integer prioritySameCity; // 优先同城
private Integer priorityOppositeSex; // 优先异性
private Integer autoAudit; // 自动审核
private Date updateTime;
}
6.2 许愿树实体类
// WishtreeFestival.java
@Data
@TableName("eb_wishtree_festival")
public class WishtreeFestival {
@TableId(type = IdType.AUTO)
private Integer id;
private String name;
private String icon;
private String startDate;
private String endDate;
private Integer isLunar; // 是否农历
private String themeColor;
private Integer sort;
private Integer status;
private Date createTime;
private Date updateTime;
}
// WishtreeWish.java
@Data
@TableName("eb_wishtree_wish")
public class WishtreeWish {
@TableId(type = IdType.AUTO)
private Long id;
private Integer uid;
private Integer festivalId;
private String content;
private Integer backgroundId;
private Integer status;
private Integer auditType;
private String auditRemark;
private Integer likeCount;
private Integer commentCount;
private Integer isDelete;
private Date createTime;
private Date updateTime;
}
// WishtreeLike.java
@Data
@TableName("eb_wishtree_like")
public class WishtreeLike {
@TableId(type = IdType.AUTO)
private Long id;
private Integer uid;
private Long wishId;
private Date createTime;
}
// WishtreeComment.java
@Data
@TableName("eb_wishtree_comment")
public class WishtreeComment {
@TableId(type = IdType.AUTO)
private Long id;
private Long wishId;
private Integer uid;
private String content;
private Long parentId;
private Integer status;
private Integer isDelete;
private Date createTime;
}
// WishtreeBackground.java
@Data
@TableName("eb_wishtree_background")
public class WishtreeBackground {
@TableId(type = IdType.AUTO)
private Integer id;
private String name;
private String image;
private Integer festivalId;
private Integer sort;
private Integer status;
private Date createTime;
}
6.3 VO/Request类
// WishtreeWishVO.java - 心愿响应VO
@Data
public class WishtreeWishVO {
private Long id;
private Integer uid;
private String nickname;
private String avatar;
private Integer festivalId;
private String festivalName;
private String festivalIcon;
private String content;
private Integer backgroundId;
private String backgroundImage;
private Integer status;
private Integer auditType;
private String auditRemark;
private Integer likeCount;
private Integer commentCount;
private Boolean isLiked; // 当前用户是否已点赞
private Date createTime;
}
// WishtreeWishRequest.java - 发布心愿请求
@Data
public class WishtreeWishRequest {
private Integer festivalId;
private String content;
private Integer backgroundId;
// 管理端查询用
private Integer page;
private Integer limit;
private Integer status;
}
// WishtreeCommentVO.java - 评论响应VO
@Data
public class WishtreeCommentVO {
private Long id;
private Long wishId;
private Integer uid;
private String nickname;
private String avatar;
private String content;
private Long parentId;
private Integer status;
private Date createTime;
}
// WishtreeCommentRequest.java - 发表评论请求
@Data
public class WishtreeCommentRequest {
private String content;
private Long parentId;
}
// WishtreeStatisticsVO.java - 统计数据VO
@Data
public class WishtreeStatisticsVO {
private Integer totalWishes;
private Integer todayWishes;
private Integer pendingWishes;
private Integer totalLikes;
private List<FestivalStatVO> festivalStats;
private List<WishtreeWishVO> hotWishes;
}
七、文件清单
7.1 前端文件
Zhibo/admin/src/
├── api/
│ ├── community.js # 缘池API
│ └── wishtree.js # 许愿树API
├── router/modules/
│ ├── communityManage.js # 缘池路由
│ └── wishtreeManage.js # 许愿树路由
└── views/
├── community/
│ ├── category/index.vue # 板块管理
│ ├── message/index.vue # 消息管理
│ └── matchConfig/index.vue # 匹配配置
└── wishtree/
├── festival/index.vue # 节日管理
├── wish/index.vue # 心愿管理
└── background/index.vue # 背景素材
7.2 后端文件
Zhibo/zhibo-h/
├── crmeb-admin/src/main/java/com/zbkj/admin/controller/
│ ├── CommunityAdminController.java # 缘池管理端
│ └── WishtreeAdminController.java # 许愿树管理端
├── crmeb-front/src/main/java/com/zbkj/front/controller/
│ ├── CommunityFrontController.java # 缘池移动端API
│ └── WishtreeFrontController.java # 许愿树移动端API
├── crmeb-service/src/main/java/com/zbkj/service/
│ ├── service/
│ │ ├── CommunityService.java
│ │ └── WishtreeService.java
│ └── dao/
│ ├── CommunityCategoryDao.java
│ ├── CommunityMessageDao.java
│ ├── CommunityMatchConfigDao.java
│ ├── WishtreeFestivalDao.java
│ ├── WishtreeWishDao.java
│ ├── WishtreeLikeDao.java
│ ├── WishtreeCommentDao.java
│ └── WishtreeBackgroundDao.java
└── crmeb-common/src/main/java/com/zbkj/common/
├── model/
│ ├── community/
│ │ ├── CommunityCategory.java
│ │ ├── CommunityMessage.java
│ │ └── CommunityMatchConfig.java
│ └── wishtree/
│ ├── WishtreeFestival.java
│ ├── WishtreeWish.java
│ ├── WishtreeLike.java
│ ├── WishtreeComment.java
│ └── WishtreeBackground.java
├── request/
│ ├── WishtreeWishRequest.java
│ └── WishtreeCommentRequest.java
└── response/
├── WishtreeWishVO.java
├── WishtreeCommentVO.java
└── WishtreeStatisticsVO.java
7.3 数据库表
缘池:
├── eb_community_category # 板块表
├── eb_community_message # 消息表
└── eb_community_match_config # 匹配配置表
许愿树:
├── eb_wishtree_festival # 节日表
├── eb_wishtree_wish # 心愿表
├── eb_wishtree_like # 点赞表
├── eb_wishtree_comment # 评论表
└── eb_wishtree_background # 背景素材表
八、菜单配置SQL
-- 缘池管理菜单
INSERT INTO `eb_system_menu` (`pid`, `name`, `icon`, `perms`, `component`, `menu_type`, `sort`, `is_show`) VALUES
(0, '缘池管理', 'el-icon-s-opportunity', '', '/community', 'M', 140, 1);
SET @community_id = LAST_INSERT_ID();
INSERT INTO `eb_system_menu` (`pid`, `name`, `perms`, `component`, `menu_type`, `sort`, `is_show`) VALUES
(@community_id, '板块管理', 'admin:community:category', '/community/category', 'C', 3, 1),
(@community_id, '消息管理', 'admin:community:message', '/community/message', 'C', 2, 1),
(@community_id, '匹配配置', 'admin:community:match', '/community/match-config', 'C', 1, 1);
-- 许愿树管理菜单
INSERT INTO `eb_system_menu` (`pid`, `name`, `icon`, `perms`, `component`, `menu_type`, `sort`, `is_show`) VALUES
(0, '许愿树管理', 'el-icon-present', '', '/wishtree', 'M', 139, 1);
SET @wishtree_id = LAST_INSERT_ID();
INSERT INTO `eb_system_menu` (`pid`, `name`, `perms`, `component`, `menu_type`, `sort`, `is_show`) VALUES
(@wishtree_id, '节日管理', 'admin:wishtree:festival', '/wishtree/festival', 'C', 4, 1),
(@wishtree_id, '心愿管理', 'admin:wishtree:wish', '/wishtree/wish', 'C', 3, 1),
(@wishtree_id, '背景素材', 'admin:wishtree:background', '/wishtree/background', 'C', 2, 1),
(@wishtree_id, '数据统计', 'admin:wishtree:statistics', '/wishtree/statistics', 'C', 1, 1);
九、移动端改造说明
9.1 WishTreeActivity改造
原本地存储改为API调用:
// 原代码(本地存储)
private void loadWishes() {
for (int i = 0; i < 7; i++) {
wishes[i] = prefs.getString("wish_" + i, "");
}
}
// 新代码(API调用)
private void loadWishes() {
ApiService.getInstance()
.getMyWishes(1, 10)
.enqueue(new Callback<ApiResponse<PageData<WishVO>>>() {
@Override
public void onResponse(Call<ApiResponse<PageData<WishVO>>> call,
Response<ApiResponse<PageData<WishVO>>> response) {
if (response.isSuccessful() && response.body() != null) {
List<WishVO> list = response.body().getData().getList();
updateWishCards(list);
}
}
@Override
public void onFailure(Call<ApiResponse<PageData<WishVO>>> call, Throwable t) {
Toast.makeText(WishTreeActivity.this, "加载失败", Toast.LENGTH_SHORT).show();
}
});
}
9.2 ApiService接口定义
public interface ApiService {
// ==================== 许愿树API ====================
@GET("api/front/wishtree/festivals")
Call<ApiResponse<List<Festival>>> getFestivals();
@GET("api/front/wishtree/festivals/current")
Call<ApiResponse<Festival>> getCurrentFestival();
@GET("api/front/wishtree/wishes")
Call<ApiResponse<PageData<WishVO>>> getWishes(
@Query("festivalId") Integer festivalId,
@Query("page") int page,
@Query("limit") int limit
);
@GET("api/front/wishtree/wishes/my")
Call<ApiResponse<PageData<WishVO>>> getMyWishes(
@Query("page") int page,
@Query("limit") int limit
);
@POST("api/front/wishtree/wishes")
Call<ApiResponse<Wish>> publishWish(@Body WishRequest request);
@DELETE("api/front/wishtree/wishes/{id}")
Call<ApiResponse<String>> deleteWish(@Path("id") long id);
@POST("api/front/wishtree/wishes/{id}/like")
Call<ApiResponse<String>> likeWish(@Path("id") long id);
@DELETE("api/front/wishtree/wishes/{id}/like")
Call<ApiResponse<String>> unlikeWish(@Path("id") long id);
@GET("api/front/wishtree/wishes/{id}/comments")
Call<ApiResponse<PageData<CommentVO>>> getComments(
@Path("id") long wishId,
@Query("page") int page,
@Query("limit") int limit
);
@POST("api/front/wishtree/wishes/{id}/comments")
Call<ApiResponse<Comment>> addComment(
@Path("id") long wishId,
@Body CommentRequest request
);
@GET("api/front/wishtree/backgrounds")
Call<ApiResponse<List<Background>>> getBackgrounds();
}
9.3 数据模型类
// WishVO.java
@Data
public class WishVO {
private Long id;
private Integer uid;
private String nickname;
private String avatar;
private Integer festivalId;
private String festivalName;
private String festivalIcon;
private String content;
private String backgroundImage;
private Integer likeCount;
private Integer commentCount;
private Boolean isLiked;
private String createTime;
}
// WishRequest.java
@Data
public class WishRequest {
private Integer festivalId;
private String content;
private Integer backgroundId;
}
// CommentVO.java
@Data
public class CommentVO {
private Long id;
private Integer uid;
private String nickname;
private String avatar;
private String content;
private String createTime;
}
// CommentRequest.java
@Data
public class CommentRequest {
private String content;
}
十、开发顺序
- 数据库 - 执行建表SQL(8张表)
- 后端实体类 - 创建Model、VO、Request类
- 后端DAO - 创建DAO接口和Mapper
- 后端Service - 实现业务逻辑(含自动审核)
- 后端Controller - 实现管理端API + 移动端API
- 前端API - 创建管理端接口文件
- 前端路由 - 配置路由并注册
- 前端页面 - 实现7个管理页面
- 菜单配置 - 执行菜单SQL
- 移动端改造 - 修改WishTreeActivity,接入API
十一、关键改动总结
| 项目 | 原方案 | 新方案 |
|---|---|---|
| 数据存储 | SharedPreferences | MySQL数据库 |
| 数据同步 | 无 | 实时API同步 |
| 心愿数量 | 固定7个 | 无限制 |
| 用户互动 | 无 | 点赞、评论 |
| 内容审核 | 无 | 自动+人工审核 |
| 多端访问 | 单设备 | 多端同步 |
| 数据统计 | 无 | 管理端统计 |
| 节日活动 | 无 | 可配置节日 |