# 直播开发【发券系统】 鱼票

### 需求分析

**给星球的小伙伴发布一个兑换券，凭借兑换券可以充值积分。**

#### 传统思路

在现有的系统上加功能？在同一个代码上去开发，或者就是该数据库。



---



## 业务流程

【腾讯文档】鱼票-发券中心项目流程图
https://docs.qq.com/flowchart/DUGlDTmZja05MUW12



#### 发兑换券（可以理解为激活码）的系统

1. 管理员
   1. 创建兑换券（设置规则 —— **一人一券** / 抢）
   2. 发券（设置数量、设置单个用户可以使用的次数）
2. 用户
   1. 输入券码来兑换奖品
   2. 查看自己用过的券码



## 技术选型

### 前端

1. Vue
2. Vite
3. Tencent UI

### 后端

1. Java
2. SpringBoot + SSM + MyBatis Plus



## 实现

### 前端

1. 管理员 √
   1. 创建兑换券，定义规则
      1. 兑换券的名称
      2. 兑换券的描述
      3. 回调接口地址
      4. 回调接口信息（json）
   2. 发券
      1. 选择已经定义好的券
      2. 数量
      3. 开始时间
      4. 过期时间
   3. 管理已发的券
      1. 查看所有类型的券
      2. 查看每个券的发放情况
2. 用户
   1. 输入券码来兑换奖品
   3. 查看自己用过的券码



### Vue3 的几种事件传递方式

1. 父组件通过 props 将方法传递给子组件
2. 子组件直接 emit，触发父组件的事件



## 后端

### 设计库表

#### ticket（定义了一类券的信息）

```
id int 主键
ticketName varchar 券名称
ticketDesc varchar 券描述
callbackUrl varchar 回调地址,
callbackInfo text 回调信息 json,
createTime date 创建时间
updateTime date 修改时间
deleteStatus tinyint 是否删除（逻辑删除）
```

#### sendTicket（发券情况）

```sql
id int 主键
ticketId int 券的类型
sendNum int 发圈数量
sendStatus int 发放状态（0 - 关闭，1 -开启）
expireTime date 过期时间 
createTime date 创建时间
updateTime date 修改时间
deleteStatus tinyint 是否删除（逻辑删除）
```



#### ticketDetail（每张券的信息）

```sql
id int 主键
ticketId int 主键
sendTicketId int 所属发券批次
token varchar 券码
useStatus int 使用状态 0 - 未使用 1- 已使用 2 - 使用失败
useInfo text 使用信息（用户自主输入）
useMessage text 用券情况信息 userId
useTime date 使用时间
createTime date 创建时间
updateTime date 修改时间
deleteStatus tinyint 是否删除（逻辑删除）
```



#### 创建券

校验券的信息

插入券

#### 发券

1. 校验请求参数是否合法
2. 校验这种券是否存在
3. 创建发券批次信息
4. 根据数量去创建多张券



### 优化发券 - 两个问题

1. 稳定性 —— 事务（可以解决不一致问题，保证原子性，要么都成功，要么都不成功）
2. 性能 —— 多线程 / 批量操作 - 减少重复创建连接



> 想要领取资料，跟着鱼皮直播做项目、1 对 1 交流答疑、和小伙伴一起交流学习的话：
>
> 欢迎加入鱼皮的编程星球 👉：http://dogyupi.com



