开发用户下单购买视频接口

VideoOrder模块下单接口开发

VideoOrderController.java

package net.ybclass.online_ybclass.controller;

import net.ybclass.online_ybclass.model.request.VideoOrderRequest;
import net.ybclass.online_ybclass.service.VideoOrderService;
import net.ybclass.online_ybclass.utils.JsonData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; @RestController
@RequestMapping("/api/v1/pri/order")
public class VideoOrderController {
@Autowired(required = false)
private VideoOrderService videoOrderService; /**
* 下单接口
*
* @return
*/
@RequestMapping("save")
public JsonData saveOrder(@RequestBody VideoOrderRequest videoOrderRequest, HttpServletRequest request) {
Integer userId = (Integer) request.getAttribute("user_id");
int rows = videoOrderService.save(userId, videoOrderRequest.getVideoId());
return rows == 0 ? JsonData.buildError("下单失败") : JsonData.buildSuccess();
}
}

VideoOrderService.java

package net.ybclass.online_ybclass.service;

public interface VideoOrderService {
int save(int userId, int videoId);
}

VideoOrderServiceImpl.java

package net.ybclass.online_ybclass.service.impl;

import net.ybclass.online_ybclass.mapper.UserMapper;
import net.ybclass.online_ybclass.mapper.VideoMapper;
import net.ybclass.online_ybclass.mapper.VideoOrderMapper;
import net.ybclass.online_ybclass.model.entity.Video;
import net.ybclass.online_ybclass.model.entity.VideoOrder;
import net.ybclass.online_ybclass.service.VideoOrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import java.util.Date;
import java.util.UUID; @Service
public class VideoOrderServiceImpl implements VideoOrderService {
@Autowired(required = false)
private VideoOrderMapper videoOrderMapper;
@Autowired(required = false)
private VideoMapper videoMapper; /**
* 下单操作
* 未来版本:优惠卷抵扣,风控用户检测,生成订单基础信息,生成支付信息
*
* @param userId
* @param videoId
* @return
*/
@Override
public int save(int userId, int videoId) {
//判断是否已经购买
VideoOrder videoOrder = videoOrderMapper.findByUserIdAndVideoIdAndState(userId, videoId, 1);
if (videoOrder != null) return 0;
Video video = videoMapper.findById(videoId);
VideoOrder newVideoOrder = new VideoOrder();
newVideoOrder.setCreateTime(new Date());
newVideoOrder.setOutTradeNo(UUID.randomUUID().toString());
newVideoOrder.setState(1);
newVideoOrder.setTotalFee(video.getPrice());
newVideoOrder.setUserId(userId);
newVideoOrder.setVideoId(videoId);
newVideoOrder.setVideoImg(video.getConverImg());
newVideoOrder.setVideoTitle(video.getTitle());
int rows = videoOrderMapper.saveOrder(newVideoOrder);
return rows;
}
}

VideoOrderMapper.java

package net.ybclass.online_ybclass.mapper;

import net.ybclass.online_ybclass.model.entity.VideoOrder;
import org.apache.ibatis.annotations.Param; public interface VideoOrderMapper {
/**
* 查询用户是否购买过此商品
*
* @param userId 用户id
* @param videoId 视频id
* @param state 状态
* @return
*/
VideoOrder findByUserIdAndVideoIdAndState(@Param("user_id") int userId, @Param("video_id") int videoId, @Param("state") int state); /**
* 下单
*
* @param videoOrder
* @return
*/
int saveOrder(VideoOrder videoOrder);
}

VideoOrderMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="net.ybclass.online_ybclass.mapper.VideoOrderMapper">
<!-- 查询用户是否购买过此商品 -->
<select id="findByUserIdAndVideoIdAndState" resultType="VideoOrder">
SELECT * FROM video_order WHERE user_id=#{user_id} AND video_id=#{video_id} AND state=#{state}
</select>
<!-- 下单,并返回主键值 -->
<insert id="saveOrder" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
INSERT INTO `video_order`( `out_trade_no`, `state`, `create_time`, `total_fee`, `video_id`, `video_title`, `video_img`, `user_id`)
VALUES (#{outTradeNo,jdbcType=VARCHAR},#{state,jdbcType=INTEGER}
,#{createTime,jdbcType=TIMESTAMP},#{totalFee,jdbcType=INTEGER}
,#{videoId,jdbcType=INTEGER},#{videoTitle,jdbcType=VARCHAR}
,#{videoImg,jdbcType=VARCHAR},#{userId,jdbcType=INTEGER});
</insert>
</mapper>

演示

yb课堂之用户下单模块开发 《十四》的更多相关文章

  1. STC8H开发(十四): I2C驱动RX8025T高精度实时时钟芯片

    目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...

  2. Gradle 1.12用户指南翻译——第二十四章. Groovy 插件

    其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://g ...

  3. python运维开发(十四)----HTML基本操作

    内容目录: HTML概述 head标签 body中常用标签 css选择器 css常用属性 HTML HTML概述 HTML是英文Hyper Text Mark-up Language(超文本标记语言) ...

  4. Java微信公众平台开发(十四)【番外篇】--微信web开发者工具使用

    转自:http://www.cuiyongzhi.com/post/58.html 为帮助开发者更方便.更安全地开发和调试基于微信的网页,微信推出了 web 开发者工具.它是一个桌面应用,通过模拟微信 ...

  5. Flask博客类登录注册验证模块代码(十四)

    1 文件系统 blog #博客类 App forms #表单 __init__.py user.py models #模型 __init__.py user.py static #静态文件 templ ...

  6. Linux学习之用户配置文件详解(十四)

    Linux学习之用户配置文件详解 目录 用户信息文件/etc/password 影子文件/etc/shadow 组信息文件/etc/group 组密码文件/etc/gshadow 用户信息文件/etc ...

  7. springmvc maven idea 多模块开发(四):建立Web子模块

    先建立web的父模块,其他子web模块建立在该父模块之下,该模块打包方式选择为pom 建立实际web模块,右键点击web-parent,建立方法同上,打包方式为war 建立好后的目录结构如下: 手工建 ...

  8. 【转】cocos2d-x游戏开发(十四)用shader使图片背景透明

    转自:http://blog.csdn.net/dawn_moon/article/details/8631783 好吧,终于抽时间写这篇文章了. 手头上有很多人物行走图,技能特效图等,但这些图都有个 ...

  9. 潭州课堂25班:Ph201805201 第十四课 异常,处理 (课堂笔记)

    程序难免会出现错误 : 语法错误 : 逻辑错误: AttributeError  -->>  试图访问一个对象没有的属性, IOError  ---->>  输入输出异常 In ...

  10. 爱创课堂每日一题第五十四天- 列举IE 与其他浏览器不一样的特性?

    IE支持currentStyle,FIrefox使用getComputStyle IE 使用innerText,Firefox使用textContent 滤镜方面:IE:filter:alpha(op ...

随机推荐

  1. java stream数据分组 stream().collect(groupingBy

    List<Map<String, Object>> foreList = forecastDataDao.getcityforeresults(param); Map<S ...

  2. Wang Tile的Shader简易实现

    在使用大面积的平铺纹理时,会导致重复感较强的贴图呈现在画面中.我们可以通过许多方法进行优化,WangTile就是其中一种. WangTile(王浩瓷砖)方法通过对每条边标记颜色,并在平铺时将相同颜色的 ...

  3. 用 C 语言开发一门编程语言 — 交互式解释器

    目录 文章目录 目录 前言 环境 编译型 vs 解释型 实现交互式解释器 使用 GNU Readline 函数库 前言 通过开发一门类 Lisp 的编程语言来理解编程语言的设计思想,本实践来自著名的& ...

  4. SSMS表设计器显示说明(注释)字段

    原文地址:https://www.giantliu.cn/2020/09/14/200914SSMSTableDesignAddDescription/ SQL Server Management S ...

  5. C# 程序集、模块和类型概念及关系

    目录 C# 程序集.模块和类型概念及关系 概述 程序集 模块 类型 程序集.模块和类型的关系 总结 引用 C# 程序集.模块和类型概念及关系 概述 在 C# 中,程序集.模块和类型是构成 .NET 应 ...

  6. 多个 GPU 上运行

    默认情况下,Easy Diffusion 自动在多个 GPU 上运行(如果您的电脑有多个 GPU).例如,两个任务将在两个 GPU 上并行运行(如果有的话). 我该如何使用这个? 如果您的电脑有多个 ...

  7. mysql binlog故障演练

    mysql备份恢复 mysqldump备份 企业故障恢复案例: 正在运行的网站系统 mysql数据库 数据量25G,日业务量10-15M 备份策略: 每天晚上23点通过计划任务调用mysqldump执 ...

  8. 记一次bug排除心得

    问题背景 要做一个需求,大概是检测到某输入重启,于是写一个demo调试一下 c语言程序,交叉编译后在adb shell下运行 思路 用 am 命令直接重启 我们先手动验证一下,发现这个设备不支持am命 ...

  9. proteus 器件名称被软件篡改bug的解决方案

    proteus v7.8 器件名称被软件篡改bug 的解决方案 BUG描述 在做单片机实验时,发现从某一个时间保存的设计图文件开始,在添加新的电子元件时会出现部分旧元件的名称被捆绑替换为新元件的名称, ...

  10. C#异步编程是怎么回事(番外)

    在上一篇通信协议碰到了多线程,阻塞.非阻塞.锁.信号量...,会碰到很多问题.因此我感觉很有必要研究多线程与异步编程. 首先以一个例子开始 我说明一下这个例子. 这是一个演示异步编程的例子. 输入jo ...