如何用vue+免费的webdb 实现一个世界杯足球竞猜系统

news2024/9/21 4:21:49

一、前言

最近世界杯在如火如荼的进行。我们都知道,中国也派出了我们的一支强大的队伍:中国建筑队,全程参与了世界杯的所有比赛。

哈哈开个玩笑,不过说到世界杯,还真有不少朋友,不仅仅是看球,还切身参与了。比如足彩,世界杯竞猜等等活动。

那么今天我们就通过kintone来自己实现一个世界杯竞猜系统吧!

二、视频学习

开始学习前,可以先来看看本文的视频“如何用vue+免费的web db,来实现一个世界杯足球竞猜系统”,可以帮助你更好的理解本文的思路,更能提高学习的效率。配合着视频我们快来学习吧!

三、功能梳理

想要实现的功能如下:

用户竞猜前台:

1 每个人拥有自己独立的积分

2 有比赛列表,赔付率信息。能实现各自投票。

3 有个人信息界面,列出我的积分,往期竞猜信息及结果。

竞猜系统后台:

1 可以录入比赛信息,赔付率信息。可以到期进行开奖。

2 可以查询用户的竞猜信息。

3 用户的积分变化有迹可查。

四、效果图

五、如何实现?

效果看完了,那这个世界杯竞猜系统是如何通过kintone实现的呢?

1、应用准备

这个世界杯竞猜系统可以简单通过以下应用进行搭建 

1 球队信息应用:

记录球队名,球队国旗等。

2 比赛信息应用:

记录比赛的两支球队,场次,该场比分,赔付率等。

3 用户竞猜信息应用:

记录用户id,他的竞猜的比赛场次,胜负,竞猜使用的积分等。

4 积分变更履历应用:

记录用户积分变化的履历,每个场次押注所获得或者付出的积分。

5 轮播图应用

记录一些比赛精彩图片,美化页面。

2、系统开发

接下来分享下这个系统是如何开发的。

整个投注系统使用Vue3框架来实现。

引入根节点

首先通过kintone的 JS API来获取门户上方的空白部分的元素 kintone.portal.getContentSpaceElement(),将其作为根节点。这样就能把Vue产生的页面挂载到这个根结点上。同时可以引入Pinia作为集中式状态管理,Element UI 作为我们的UI框架。

1

2

3

4

5

6

7

8

9

10

11

12

13

import { createApp } from "vue";

import App from "./App.vue";

import installElementPlus from "@/libs/element";

import { createPinia } from "pinia";

/* eslint-disable */

kintone.events.on("portal.show", (event) => {

    const myContainer = kintone.portal.getContentSpaceElement();

    const app = createApp(App);

    installElementPlus(app);

    app.use(createPinia());

    app.mount(myContainer);

    return event;

});

准备数据源,获取数据

然后通过kintone的REST API就能将kintone各个应用中的数据取出来,并在页面上进行展示。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

import { KintoneRestAPIClient } from "@kintone/rest-api-client";

const client = new KintoneRestAPIClient();

//获取比赛列表

export const GetMatchList = async () => {

    const app = appList.matchInfo;

    import {appList,matchInfoField,usersField,userChipInField,picField} from "@/config";

    try {

        const params = {

            app,

        };

        const resp = await client.record.getRecords(params);

        if (resp.records.length > 0) {

        return resp.records.map((record) => {

            return dataConvert(record);

        });

        else {

            return null;

        }

    catch (err) {

        console.log(err);

    }

};

多语言开发

同时通过kintone.getLoginUser()我们可以获取到当前登陆用户的信息。其中包含了他的语言信息。根据语言信息,我们可以配置I18N做多语言的开发。

1

2

const { language } = kintone.getLoginUser();

//   'language': 'zh'

集中式状态管理

可以将用户的剩余积分,比赛下注信息等写入集中式状态管理,因为他可能会在多页面进行响应式变化。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

import {

  GetLeftScore,

  GetChipInList,

  GetMatchList,

} from "@/services/kintoneApi";

import { defineStore } from "pinia";

export const useStore = defineStore("store", {

  state: () => {

    return {

      myScore: 0,

      chipInList: [],

    };

  },

  getters: {

    chipListShow(state) {

      return state.chipInList.map((record) => {

        if (record.Score_result == 0) {

          record.scoreWin = "--";

          record.teamInfo.Score = "--";

          record.type = "chip in";

        else if (record.Score_result < 0) {

          record.scoreWin = `--`;

          record.type = "loss";

        else {

          record.scoreWin = `+ ${record.Score_result}`;

          record.type = "win";

        }

        return record;

      });

    },

  },

  actions: {

    async init() {

      const initLeftScorePromise = this.getLeftScore();

      const initChipInListPromise = this.getChipInList();

      return Promise.all([initLeftScorePromise, initChipInListPromise]);

    },

    async getLeftScore() {

      this.myScore = await GetLeftScore();

    },

    async getChipInList() {

      const chipInList = await GetChipInList();

      const matches = await GetMatchList();

      const matchMapping = {};

      for (const item of matches) {

        matchMapping[item.Match_id] = {

          FlagA: item.FlagA,

          FlagB: item.FlagB,

          TeamA_name: item.TeamA_name,

          TeamB_name: item.TeamB_name,

          Score: `${item.ScoreA}:${item.ScoreB}`,

        };

      }

      chipInList.map((chip) => {

        chip.teamInfo = matchMapping[chip.Match_id];

        return chip;

      });

      this.chipInList = chipInList;

    },

  },

});

3、竞猜系统整体说明

首先是可以通过管理员给每个用户录入一些初始积分,用户有了积分可以进行比赛的胜负平的竞猜。比赛场次,胜负平赔付率可以通过取出后台数据后进行展示。

当用户进行竞猜后,会将记录写入用户竞猜信息应用。同时还可以计算出用户的剩余积分,用户的竞猜列表等。

4、开奖系统整体说明

开奖系统可以直接对比赛信息应用进行自定义开发。

当比赛结束出来结果后,管理员可以录入比分,自动计算出比赛结果。然后可以一键开奖,系统自动计算出哪些用户猜对了比赛,并且通过赔付率计算出他所获得的积分。并且写入到用户的积分履历中去。

5、开发上的注意点

因为这里没有后端系统,所以可能存在用户自行通过伪造请求等方式生成投票数据。这样就有可能出现:

1 帮别人投票,让别人无分可投

2 让自己的投票超出自己的积分

3 比赛结束后进行投票

等等一系列的问题。那这边如何一一化解呢?

1 伪造别人投票:可以通过应用的创建者字段来实现。因为这个字段是系统后端自动生成,所以不再有这个困扰。

2 让自己的投票超出自己的积分:为防止这种篡改积分的情况,这里将用户的竞猜列表和积分列表分开。竞猜列表用户有读写权限,但是积分列表用户只有读取权限。

通过kintone的权限设置,普通登录用户都是只读权限,没有修改权限。然后通过管理员用户的开奖系统对用户的竞猜进行审核。过滤后,由管理员进行修改(当然这些都是代码自动实现的。)

比如判断用户的投票时,会先计算出他当前没有开奖的投票总数是否大于他剩余的积分。这样就能防止他是否会进行伪造投票。

3 超过时间的投票:通过kintone自带的更新时间字段(这是用户无法自行修改的特点),判断用户该条投票记录的更新时间是否超过该场比赛的投票截止时间,就能过滤掉用户的超时伪造投票。

经过以上种种的判断,就能很好的避免了用户伪造的数据,让这次投票无需服务器,也能变得安全可靠了。

六、Demo演示

这边做了这么一个demo,大家先来看下效果吧。

如何用vue+免费的web db,来实现一个世界杯足球竞猜系统

七、最后

感觉如何?

一开始感觉很复杂的竞猜系统,通过本文的梳理,是不是变得简而易懂了呢?

思路打开,通过这个程序,你还能做出比如投票系统、积分系统等等,是个非常实用的范例!

还在等什么,赶快来试下吧!

有兴趣查看完整代码的小伙伴,请点击👉:用kintone实现一个世界杯竞猜系统

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/68260.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]Python计算机毕业设计Django疫情防控管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

手把手教你成为荣耀开发者:数据报表使用指引

荣耀开发者服务平台是荣耀面向开发者的统一生态入口&#xff0c;通过聚合周边内外部系统&#xff0c;分全球多站点部署&#xff0c;为全球开发者提供业务全生命周期的商业支撑服务&#xff0c;拥有应用分发、智慧服务、开放能力、HONOR Connect等众多业务等您来合作。 “数据报…

Partial differential equation

In mathematics, a partial differential equation (PDE) is an equation which imposes relations between the various partial derivatives of a multivariable function. The function is often thought of as an “unknown” to be solved for, similarly to how x is th…

【三维目标检测】SASSD(一)

SASSD是用于点云三维目标检测模型算法&#xff0c;发表在CVPR 2020《Structure Aware Single-stage 3D Object Detection from Point Cloud》&#xff0c;论文地址为“https://www4.comp.polyu.edu.hk/~cslzhang/paper/SA-SSD.pdf”。SASSD与基于Anchor的目标检测模型的结构基本…

Kafka(四)- Kafka 生产者

文章目录一、生产者消息发送流程1. 发送流程2. 生产者重要参数列表二、异步发送 API1. 普通异步发送2. 带回调函数的异步发送3. 同步发送三、生产者分区1. 分区好处2. 生产者发送消息的分区策略&#xff08;1&#xff09;默认的分区器 DefaultPartitioner&#xff08;2&#xf…

行业沙龙第四期丨企业供应链协同的数字化解痛之道

当前&#xff0c;数字经济正在蓬勃发展&#xff0c;我们正在迈向一个协同一体的全球化时代。所谓协同&#xff0c;协者&#xff0c;众和之同也&#xff0c;多方能够协作才能达到一个共同的目标。其中&#xff0c;数据是实现协同的基本要素&#xff0c;技术是实现协同重要途径&a…

网络安全 核心基础篇总结

目录 前言 网络安全三大要素 CIA含义 1. Confidentiality&#xff08;机密性&#xff09; 1.1 机密性主要三个解决方法 1.1.1 加密 1.1.2 权限管理 1.1.3 敏感信息暴露 2. Integrity&#xff08;完整性&#xff09; 3. Availabitity&#xff08;可用性&#xff09; 威胁…

基于51单片机水塔水箱液水位WIFI监控报警设计proteus仿真原理图PCB

功能&#xff1a; 0.本项目采用STC89C52作为单片机系统的控制MCU 1.WIFI实时上传当前水位状态 2.通过液位传感器检测液位&#xff0c;检测到最低液位和最高液位时&#xff0c;超过设定阈值将声光报警 3.通过状态指示灯显示当前液位情况&#xff0c;三种颜色&#xff0c;红色代表…

快来给你的宠物视频加个表情特效吧

摘要&#xff1a;我们将给猫贴一张卡通脸&#xff0c;给 Elon Musk 贴上小胡子&#xff0c;给小狗贴上驯鹿角&#xff01;本文分享自华为云社区《视频AI&#xff0c;给你的宠物加个表情特效&#xff01;》&#xff0c;作者&#xff1a;HWCloudAI。 GAN 监督学习是一种联合端到…

Android适配【入坑指南+解决痛点】

Android适配是一个大坑&#xff0c;你可能早有耳闻。适配问题到底有多坑&#xff1f;为什么坑&#xff1f;以及如何从坑里爬出来&#xff1f; 概述 Android屏幕尺寸各异&#xff0c;而我们不可能根据各种尺寸都设计一套原型图去匹配&#xff0c;我们需要利用适配这一个过程把…

冷热电气多能互补的微能源网鲁棒优化调度附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

基于Session的认证与授权实践

Spring Security系列文章 认证与授权之Cookie、Session、Token、JWT基于Session的认证与授权实践 基于Session的认证方式 基于 session 的认证方式如下图&#xff1a; 基于 Session 的认证机制由 Servlet 规范定制&#xff0c;Servlet 容器已实现&#xff0c;用户通过 HttpSes…

Matplotlib入门[05]——注释与标签

Matplotlib入门[05]——注释与标签 参考&#xff1a; https://ailearning.apachecn.org/ Matplotlib官网 plt.legend参数 使用Jupyter进行练习 注释 使用文本框进行注释 import numpy.random import matplotlib.pyplot as pltfig plt.figure(1, figsize(5,5)) # plt.clf…

ag-Grid Enterprise v28.2.1 企业版注册版

世界上最好的 JavaScript 网格 ag-Grid Enterprise v28.2.1 功能丰富 ag-Grid Enterprise v28.2.1 的性能、功能集和质量在 JavaScript 数据网格中前所未见。AG Grid 中的许多功能都是 AG Grid 独有的&#xff0c;并且只是将 AG Grid 归为一类&#xff0c;而不会影响质量或性能…

(详解错误情况,及解决方法)Vue 数据更新了但页面没有更新的情况

点个关注&#xff0c;赞一下栓Q 背景 在vue项目中&#xff0c;有些我们会遇到修改完数据&#xff0c;但是视图却没有更新的情况。具体的场景不一样&#xff0c;解决问题的方法也不一样。在网上看了很多文章&#xff0c;在此总结汇总一下。针对&#xff0c;数据更新视图没有更…

你知道哪些常用快捷键?电脑快捷键大全,打工人必备!

所谓的电脑快捷键&#xff0c;就是利用电脑键盘上的一个或几个按键组合完成一个功能命令&#xff0c;从而提高电脑的操作速度&#xff0c;带给我们更便捷的操作方式。电脑常用的快捷键是什么&#xff1f;以下是一些常用电脑快捷键的使用和功能的简要介绍。希望电脑快捷键大全能…

演讲实录 | OpenMLDB 整合自动特征工程

本文整理自 OpenMLDB 社区开发者、伊利诺伊大学 徐鹏程 在 OpenMLDB Meetup No.7 中的分享——《OpenMLDB 整合自动特征工程》。 大家好&#xff0c;我是来自伊利诺伊大学的硕士在读学生&#xff0c;也是 OpenMLDB 开源社区的贡献者——徐鹏程。我参与开发的项目&#xff0c;也…

RabbitMQ——RabbitMQ的六种工作模式详解

RabbitMQ 是一个开源的消息代理和队列服务器&#xff0c;用来通过普通协议在完全不同的应用之间共享数据&#xff0c;RabbitMQ是使用Erlang(高并发语言)语言来编写的&#xff0c;并且RabbitMQ是基于AMQP协议的 AMQP协议 Advanced Message Queuing Protocol&#xff08;高级消…

JVM之垃圾回收器一

如何判断对象是否存活 引用计数器 给对象中添加一个引用计数器&#xff0c;每当有一个地方引用它时&#xff0c;计数器值就加1&#xff1b;当引用失效时&#xff0c;计数器值就减1&#xff1b;任何时刻计数器都为0的对象就是不可能再被使用的。 Java语言中没有选用引用计数算法…

对比分析小游戏引擎孰优孰劣

随着微信生态中&#xff0c;小程序应用指数级的增长&#xff0c;许多休闲游戏变成为了众多游戏厂商流量变现的新手段。以近期很火的“羊了个羊”为例&#xff0c;它便是我们常常所说的小游戏。 游戏和小游戏的区别 要盘点小游戏开发引擎之前&#xff0c;我们得先来了解下游戏…