开发体育直播即时比分系统:赛事收藏功能的技术实现方案

简介: 本方案展示体育即时比分系统的收藏功能实现,涵盖多端技术栈。后端采用PHP + ThinkPHP,提供API接口处理数据与用户交互;安卓端(Java)和iOS端(Objective-C)调用API实现比赛数据展示及收藏操作;PC/H5前端基于Vue.js,使用Vue3与Element UI构建响应式界面,支持收藏筛选和动态更新。代码示例完整,适用于跨平台开发场景。

以下是基于“东莞梦幻网络科技”的体育即时比分系统收藏界面的技术实现方案,包括后端(PHP + ThinkPHP)、安卓(Java)、iOS(Objective-C)和PC/H5前端(Vue.js)的代码示例。

技术架构

后端(PHP + ThinkPHP):提供API接口,处理数据存储、用户管理、比赛数据获取等功能。

安卓端(Java):调用后端API,展示比赛列表,并实现收藏功能。

iOS端(Objective-C):实现与安卓端类似的功能,提供比赛数据展示和收藏功能。

PC/H5前端(Vue.js):基于Vue3 + Element UI 实现收藏比赛列表、赛事展示等功能。

代码实现

(1)后端(ThinkPHP)

<?php
namespace app\controller;

use think\Request;
use think\Db;

class MatchController {
   
    // 获取比赛数据(支持收藏筛选)
    public function getMatchList(Request $request) {
   
        $userId = $request->param('user_id');
        $isFavorite = $request->param('favorite', 0); // 0: 全部 1: 仅收藏

        $query = Db::table('matches')
            ->alias('m')
            ->field('m.id, m.time, m.team_home, m.team_away, m.status, f.id as favorite')
            ->leftJoin('favorites f', 'm.id = f.match_id AND f.user_id = '.$userId);

        if ($isFavorite) {
   
            $query->whereNotNull('f.id');
        }

        $matches = $query->order('m.time', 'asc')->select();
        return json(['code' => 200, 'data' => $matches]);
    }

    // 收藏比赛
    public function toggleFavorite(Request $request) {
   
        $userId = $request->param('user_id');
        $matchId = $request->param('match_id');

        $exists = Db::table('favorites')->where('user_id', $userId)->where('match_id', $matchId)->find();
        if ($exists) {
   
            Db::table('favorites')->where('user_id', $userId)->where('match_id', $matchId)->delete();
            return json(['code' => 200, 'message' => '取消收藏']);
        } else {
   
            Db::table('favorites')->insert(['user_id' => $userId, 'match_id' => $matchId]);
            return json(['code' => 200, 'message' => '收藏成功']);
        }
    }
}

(2)安卓端(Java)

public void fetchMatchList(boolean favoriteOnly) {
   
    ApiService apiService = RetrofitClient.getInstance().create(ApiService.class);
    Call<ApiResponse<List<Match>>> call = apiService.getMatchList(userId, favoriteOnly ? 1 : 0);

    call.enqueue(new Callback<ApiResponse<List<Match>>>() {
   
        @Override
        public void onResponse(Call<ApiResponse<List<Match>>> call, Response<ApiResponse<List<Match>>> response) {
   
            if (response.isSuccessful() && response.body() != null) {
   
                matchListAdapter.updateData(response.body().getData());
            }
        }

        @Override
        public void onFailure(Call<ApiResponse<List<Match>>> call, Throwable t) {
   
            Log.e("API_ERROR", "Failed to fetch matches");
        }
    });
}

public void toggleFavorite(int matchId) {
   
    ApiService apiService = RetrofitClient.getInstance().create(ApiService.class);
    Call<ApiResponse<String>> call = apiService.toggleFavorite(userId, matchId);

    call.enqueue(new Callback<ApiResponse<String>>() {
   
        @Override
        public void onResponse(Call<ApiResponse<String>> call, Response<ApiResponse<String>> response) {
   
            if (response.isSuccessful() && response.body() != null) {
   
                fetchMatchList(false); // 刷新比赛列表
            }
        }

        @Override
        public void onFailure(Call<ApiResponse<String>> call, Throwable t) {
   
            Log.e("API_ERROR", "Failed to update favorite");
        }
    });
}

(3)iOS端(Objective-C )

- (void)fetchMatchList:(BOOL)favoriteOnly {
   
    NSDictionary *params = @{
   @"user_id": userId, @"favorite": @(favoriteOnly ? 1 : 0)};

    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    [manager GET:@"http://yourserver.com/api/match/list" parameters:params headers:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
   
        self.matches = responseObject[@"data"];
        [self.tableView reloadData];
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
   
        NSLog(@"API Error: %@", error.localizedDescription);
    }];
}

- (void)toggleFavorite:(NSInteger)matchId {
   
    NSDictionary *params = @{
   @"user_id": userId, @"match_id": @(matchId)};

    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    [manager POST:@"http://yourserver.com/api/match/toggleFavorite" parameters:params headers:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
   
        [self fetchMatchList:NO]; // 刷新列表
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
   
        NSLog(@"API Error: %@", error.localizedDescription);
    }];
}

(4)PC/H5前端(Vue.js)

<template>
  <div>
    <el-switch v-model="favoriteOnly" active-text="仅显示收藏" @change="fetchMatches" />
    <el-table :data="matches">
      <el-table-column prop="time" label="时间" />
      <el-table-column prop="team_home" label="主队" />
      <el-table-column prop="team_away" label="客队" />
      <el-table-column label="操作">
        <template #default="{ row }">
          <el-button :type="row.favorite ? 'danger' : 'primary'" @click="toggleFavorite(row.id)">
            {
  { row.favorite ? '取消收藏' : '收藏' }}
          </el-button>
        </template>
      </el-table-column>
    </el-table>
  </div>
</template>

<script>
import axios from "axios";

export default {
    
  data() {
    
    return {
    
      matches: [],
      favoriteOnly: false,
    };
  },
  mounted() {
    
    this.fetchMatches();
  },
  methods: {
    
    fetchMatches() {
    
      axios
        .get("/api/match/list", {
     params: {
     user_id: 1, favorite: this.favoriteOnly ? 1 : 0 } })
        .then((res) => {
    
          this.matches = res.data.data;
        });
    },
    toggleFavorite(matchId) {
    
      axios.post("/api/match/toggleFavorite", {
     user_id: 1, match_id: matchId }).then(() => {
    
        this.fetchMatches();
      });
    },
  },
};
</script>

收藏-过去14天.png
收藏-时间顺序.png

相关文章
|
存储 缓存 监控
蓝牙HID协议笔记【转】
蓝牙HID协议笔记 转自:http://blog.sina.com.cn/s/blog_69b5d2a50101emll.html 1.概述     The Human Interface Device (HID)定义了蓝牙在人机接口设备中的协议、特征和使用规程。
4684 0
|
存储 安全 信息无障碍
可信计算平台与安全芯片扫盲文
可信计算平台与安全芯片扫盲文
591 0
|
9月前
|
缓存 JSON JavaScript
体育应用怎么通过API接口接入数据源与直播源
本文介绍了体育类应用接入数据源与直播源的API接口方案。主要包括:1) 数据源API接入,涉及选择提供商、接入流程及常见数据类型;2) 直播源接入,涵盖直播源类型、提供商和技术方案;3) 技术实现要点,如数据缓存、实时更新机制和安全性考虑;4) 成本优化建议。附有HLS播放示例及Node.js完整集成代码,帮助开发者高效实现体育应用功能。
715 21
|
安全 数据中心
HTTP静态、动态住宅ip代理和数据中心代理是什么?有什么区别?
HTTP静态、动态住宅ip代理和数据中心代理是什么?有什么区别?
HTTP静态、动态住宅ip代理和数据中心代理是什么?有什么区别?
|
存储 固态存储 安全
阿里云服务器租用价格 2024年最新活动报价及租用收费标准参考
阿里云服务器租用价格是多少?阿里云服务器价格由云服务器配置、实例规格、带宽等组成,进入2024年,阿里云继续推出各种云服务器优惠政策。轻量应用服务器2核2G 61元1年,每天只需0.16元,2核4G 165元1年,每天不到5毛钱;云服务器2核2G3M活动价格只要99元1年,2核4G5M只要199元1年,4核8G最低仅需299元1年;更多配置的阿里云服务器价格表见下文。
2164 0
阿里云服务器租用价格 2024年最新活动报价及租用收费标准参考
|
测试技术
Vript:最为详细的视频文本数据集,每个视频片段平均超过140词标注 | 多模态大模型,文生视频
[Vript](https://github.com/mutonix/Vript) 是一个大规模的细粒度视频文本数据集,包含12K个高分辨率视频和400k+片段,以视频脚本形式进行密集注释,每个场景平均有145个单词的标题。除了视觉信息,还转录了画外音,提供额外背景。新发布的Vript-Bench基准包括三个挑战性任务:Vript-CAP(详细视频描述)、Vript-RR(视频推理)和Vript-ERO(事件时序推理),旨在推动视频理解的发展。
449 1
Vript:最为详细的视频文本数据集,每个视频片段平均超过140词标注 | 多模态大模型,文生视频
|
定位技术
在获取的静态住宅IP代理时需要注意哪些?
获取高质量静态住宅IP代理需注意三点:1) 确保IP为住宅环境,通过位置和ISP验证;2) 重视代理的稳定性和安全性,以保障服务连续性;3) 遵守法律,合法使用IP资源。
253 0
在获取的静态住宅IP代理时需要注意哪些?
|
存储 SQL 关系型数据库
MySQL数据库——存储过程-循环(while、repeat、loop)
MySQL数据库——存储过程-循环(while、repeat、loop)
2111 0
|
存储 前端开发 Java
Spring Boot中Spring MVC的表单标签库与数据绑定讲解与实战(附源码 超详细必看)
Spring Boot中Spring MVC的表单标签库与数据绑定讲解与实战(附源码 超详细必看)
272 0