多端同步的圈子系统同城圈子小程序:PHP后端+UniApp前端实现图文混排与视频上传

50

一、功能设计

  1. 图文混排发布
  • 前端交互(UniApp)
    • 富文本编辑器:集成第三方插件(如u-parse或自定义编辑器),支持:
      • 插入多张图片(本地选择/拍照上传)。
      • 调整图片位置(拖拽排序)。
      • 无序列表文字格式(加粗、斜体、超链接)。
    • 无序列表预览功能:发布前展示图文混排效果,支持手动调整布局。
  • 后端处理(PHP)
    • 内容解析:接收前端提交的HTML或JSON格式的富文本数据,过滤非法标签。
    • 图片存储:
      • 图片上传至OSS(阿里云/腾讯云)或本地服务器,生成CDN地址。
      • 记录图片与动态的关联关系(数据库表设计见下文)。
  1. 视频上传与播放
  • 前端交互(UniApp)

    • 视频录制/选择:调用设备相机或相册,支持多段视频拼接(需原生插件支持)。
    • 上传进度:显示上传百分比,支持断点续传(通过uni.uploadFile实现)
  • 无序列表后端处理(PHP)

    • 视频转码:通过FFmpeg生成缩略图和低分辨率版本(提升加载速度)。
    • 存储优化:
      • 视频文件分片存储(避免大文件传输失败)。
      • 记录视频元数据(时长、分辨率、封面图)。

点击获取圈子系统演示详情!!!


二、技术实现

  1. 图文混排上传(PHP后端)
// 接收富文本内容并解析图片
public function submitPost() {
    $userId = $_POST['user_id'];
    $content = $_POST['content']; // 包含HTML和图片临时路径
    
    // 解析图片并上传至CDN
    $dom = new DOMDocument();
    @$dom->loadHTML($content);
    $images = $dom->getElementsByTagName('img');
    
    $mediaUrls = [];
    foreach ($images as $img) {
        $tmpPath = $img->getAttribute('src'); // 临时路径(base64或本地路径)
        $cdnUrl = $this->uploadToCDN($tmpPath); // 上传至CDN
        $mediaUrls[] = $cdnUrl;
        $img->setAttribute('src', $cdnUrl); // 替换为CDN地址
    }
    
    // 保存动态内容
    $finalHtml = $dom->saveHTML();
    $this->db->query("INSERT INTO posts (user_id, content, media_type, media_urls) 
                     VALUES ($userId, '$finalHtml', 1, '".json_encode($mediaUrls)."')");
}
  1. 视频上传(UniApp前端)
// 选择视频并上传
uni.chooseVideo({
    sourceType: ['album', 'camera'],
    success: (res) => {
        const tempFilePath = res.tempFilePath;
        uni.uploadFile({
            url: 'https://api.example.com/upload/video',
            filePath: tempFilePath,
            name: 'video',
            formData: { userId: 123 },
            success: (uploadRes) => {
                const data = JSON.parse(uploadRes.data);
                this.mediaUrls.push(data.url); // 记录视频地址
            }
        });
    }
});

三、多端同步策略

  • 数据同步
    • 实时推送:通过WebSocket或UniApp的uni.onSocketMessage实现动态发布后的即时推送。
    • 离线缓存:使用UniApp的uni.setStorageSync缓存未同步数据,网络恢复后自动重试。
  • 跨平台适配
    • 图片显示:H5端使用,小程序端使用,通过条件编译统一处理。
      视频播放:
<video :src="videoUrl" controls v-if="mediaType === 2"></video>
浏览 (50)
充电
收藏
评论