游戏道具平台|基于Springboot+Vue实现游戏道具平台系统

简介: 游戏道具平台|基于Springboot+Vue实现游戏道具平台系统

前言:

随着社会的进步和网络技术的快速发展,人们的生活娱乐方式逐渐丰富,电脑和网络已经融入了人们生活中的点点滴滴,无时无刻不在影响着我们的日常生活。越来越多的人感受到了网络带给人们的便捷与乐趣,越来越多的人喜欢通过网络游戏来释放压力、愉悦心身,用网络游戏来丰富精神生活。网络游戏的市场发展也推动着越来越多的玩家关注虚拟商品市场的交易,有了更多的需求和供应,便有了物品的交换,而虚拟世界中的虚拟物品也就有了自己的价值,网络游戏中的虚拟物品交易也便随之而来。在用户有很强烈的虚拟物品交易需求,一个便捷、高效与安全的游戏道具交易系统对网络游戏行业来说有很重要的意义,可以提升游戏用户的活跃,进一步加深游戏的社交化程度,拉长游戏的生命周期。所以开发一个游戏道具交易平台,可以为网络游戏带来更广泛的增值服务。

一,项目简介

游戏道具交易平台是面向用户而设计的,系统中存在三个角色:游客、用户、管理员,如图4-1-1

(1)游客:游客使用的是游戏道具交易平台的前台系统,当游客进入系统会首先到达系统首页

1)首页界面:游客可以在首页界面查看热销商品、查看热门游戏,可以通过点击热门游戏查看游戏详情;也可以通过点击热销商品查看商品详情;

2)游戏界面:游客可以在游戏界面查看所有的游戏中的8条数据,通过切换页面查看所有游戏中的其他游戏;游客可以点击其中一个游戏,查看游戏详情数据,还可以查看到该游戏下包含的所有出售商品;

3)我要买界面:游客可以在我要买界面查看所有商品,并且可以通过分类筛选快速查找到相关商品,也可以通过切换商品页面进行查找商品;游客还可以点击其中一个商品,查看商品详情数据,还可以查看该商品所属于那个游戏;

4)咨询中心界面:游客可以在咨询中心界面查看问题描述和问题解答,也可以通过搜索问题标题快速查找问题解答。

其中游客的用例图图如图所示:

(2)用户:用户使用的是游戏道具交易平台的前台系统,当用户进入系统会首先到达系统首页,用户拥有游客的所有功能

1)首页界面:用户在游客功能的基础上,可以在首页购买热销商品;

2)游戏界面:用户可以在游戏详情界面找到需要的商品进行购买;

3)我要买界面:用户可以在商品详情界面购买商品,并且对商品进行留言或者评价;

4)我要卖界面:用户同意相关平台规则,则可以进行发布商品。用户可以选择想发布的游戏,选择该游戏的道具分类,添加相关信息点击发布,便可把商品信息提交给管理员审核,待管理员审核完成,商品便真正被上架到游戏道具交易平台中的商品中;

5)咨询中心界面:当用户在咨询中心中找不到相关问题解答时,可以通过咨询中心中的咨询问题按钮向管理员提问,只需等待片刻便能得到管理员的回复,也可以前往个人中心查看咨询记录;

6)个人中心界面:当用户登录成功后,点击用户自己的头像便可以进入到用户的个人中心界面。在个人中心中主要有个人中心、商品管理、订单管理、用户收藏和用户咨询五个部分功能,在个人信息可以查看个人信息,进行修改个人信息,进行修改密码,设置收款帐号,咨询客服问题;在商品管理可以查看用户发布的商品,还可以查看用户下架的商品;在订单管理可以查看用户买到的商品,可以查看用户卖出的商品,还可以查看用户所有的订单;在用户收藏可以查看用户所有收藏商品,在用户咨询可以查看用户所有的咨询记录,查看管理员回复。

其用户用例图如图所示:

(3)管理员:管理员使用的是游戏道具交易平台的后台系统,需要管理员登录成功才能进入到游戏道具交易平台的后台系统中。

1)前台管理模块:前台管理模块包括轮播图管理、咨询管理、用户咨询。其中轮播图管理控制了游戏道具交易平台的前台系统轮播图的更换,方便管理员进行修改;咨询管理中包含了管理员发布的相关咨询问题,也包含了用户向管理员提问的咨询问题,管理员可以对这些咨询灵活选择向不向前台界面展示,咨询管理则是管理员向用户回复相关咨询问题答案,也可以选择比较好问题描述和问题解答向前台展示;

2)商品管理模块:商品管理模块包括游戏管理、分类列表、分类管理、商品管理。商品管理包含了对游戏的管理、游戏道具分类管理、分类列表、商品管理,游戏管理主要是填写相关游戏的介绍,让用户更加了解这个游戏,丰富游戏道具商品种类;分类列表则是方便管理员添加游戏道具商品的分类,通过Excel导入并树形展示;分类管理则是对导入的游戏道具商品分类标题不满意的地方进行修改或者删除;商品管理,则是管理游戏道具交易平台中所有的商品,管理商品的上架与下架,对不符合规则的商品对其进行下架处理;

3)销售管理模块:销售管理模块包括商品审核、订单管理、售后管理。其中商品审核则是对用户上架上来的商品进行审查,符合规则则给予上架,不符合的则进行下架处理;订单管理会将用户创建的所有订单显示处理,展示每条订单的相关情况,让管理员更好的了解订单情况;售后管理则是对用户不满意的订单进行处理,比如重新发货或者商品退款处理;

4)管理员功能模块:管理员功能模块包括用户管理、最新商品发布、管理员商品列表。其中用户管理展示了游戏道具交易平台中所有的前台用户,管理员可以对违反规定的用户进行删除操作;最新商品发布功能是可以让管理员去销售相关游戏的商品,可以更好更快的发布游戏道具商品,丰富商品的种类;管理员商品列表是可以查看管理自己发布的商品,可以对自己发布的商品进行编辑操作,也可以进行删除操作以便进行下架处理;

5)权限管理模块:权限管理模块包括用户管理、角色管理、菜单管理。其中用户管理是对后台的登录用户进行管理,因为游戏道具交易平台后台只能通过管理员添加用户进行登录,不能自己进行注册登录;角色管理则是管理员将相关权限添加到某个角色中,当给一个用户赋予这个角色时,这个用户就只能有这个角色的权限,这样可以方便管理员更好的管理游戏道具交易平台的后台系统;菜单管理,则是管理所有功能的路径、名称和位置,通过使用动态路由,可以更好的添加相关功能权限,方便管理员的使用和管理,也可以更好的分工合作,提高管理员的工作效率。

其管理员用例图如图所示:

二,环境介绍

语言环境:Java:  jdk1.8

数据库:Mysql: mysql5.7

应用服务器:Tomcat:  tomcat8.5.31

开发工具:IDEA或eclipse

后台开发技术:Springboot+Mybatis

前台开发技术:Vue+ElementUI

三,系统展示

账户登录注册

系统首页

个人中心

道具购买

我的收藏

我的评论

购买商品

我发布的商品

咨询记录

后台管理

四,核心代码展示

package com.qm.egorder.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.qm.commonutils.JwtUtils;
import com.qm.commonutils.R;
import com.qm.egorder.entity.TOrder;
import com.qm.egorder.service.TOrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
@RestController
@RequestMapping("/egorder/order")
public class TOrderController {
    @Autowired
    private TOrderService orderService;
    /**
     * TODO 1、生成订单的功能
     */
    @PostMapping("createOrder/{goodsId}")
    public R saveOrder(@PathVariable String goodsId, HttpServletRequest request) {
        // 通过token得到用户id
        String memberId = JwtUtils.getMemberIdByJwtToken(request);
        // 创建订单,返回订单号
        String orderNo = orderService.createOrder(goodsId,memberId);
        return R.ok().data("orderId",orderNo);
    }
    /**
     * TODO 2、根据订单id查询订单信息
     */
    @GetMapping("getOrderInfo/{orderId}")
    public R getOrderInfo(@PathVariable String orderId) {
        QueryWrapper<TOrder> wrapper = new QueryWrapper<>();
        wrapper.eq("order_no", orderId);
        TOrder order = orderService.getOne(wrapper);
        // 订单id不是表的id,是生成的订单号order_no
        return R.ok().data("item",order);
    }
    /**
     * TODO 3、根据课程id和用户id查询订单表中订单状态
     */
    @GetMapping("isBuyCourse/{goodsId}/{memberId}")
    public boolean isBuyCourse(@PathVariable String goodsId, @PathVariable String memberId) {
        QueryWrapper<TOrder> wrapper = new QueryWrapper<>();
        wrapper.eq("goods_id",goodsId);
        wrapper.eq("member_id",memberId);
        // 支付状态,1代表已经支付
        wrapper.eq("status",1);
        int count = orderService.count(wrapper);
        if (count > 0) {
            // 已经支付
            return true;
        } else {
            return false;
        }
    }
    /**
     * TODO 4、条件分页查询
     */
    @PostMapping("{current}/{limit}")
    public R pageOrders(@PathVariable Long current, @PathVariable Long limit, @RequestBody(required = false) TOrder order) {
        // 创建page对象
        Page<TOrder> pageOrder = new Page<>(current,limit);
        // 调用方法实现条件查询分页
        orderService.pageOrders(pageOrder,order);
        // 总记录数
        long total = pageOrder.getTotal();
        // 数据list集合
        List<TOrder> records = pageOrder.getRecords();
        return R.ok().data("total",total).data("rows",records);
    }
    /**
     * TODO 5、删除订单
     */
    @DeleteMapping("{id}")
    public R removeOrder(@PathVariable String id) {
        boolean flag = orderService.removeById(id);
        if (flag) {
            return R.ok();
        } else {
            return R.error();
        }
    }
}
package com.qm.egorder.controller;
import com.qm.commonutils.R;
import com.qm.egorder.service.TPayLogService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
@RestController
@RequestMapping("/egorder/paylog")
public class TPayLogController {
    @Autowired
    private TPayLogService payLogService;
    /**
     * TODO: 生成微信支付二维码接口
     * 参数是订单号
     */
    @GetMapping("createNative/{orderNo}")
    public R createNative(@PathVariable String orderNo) {
        // 返回信息,包含二维码地址,还有其他需要的信息
        Map map = payLogService.createNative(orderNo);
        System.out.println("=============返回二维码map集合:" + map);
        return R.ok().data(map);
    }
    /**
     * TODO: 查询订单支付状态
     * 参数:订单号,根据订单号查询支付状态
     */
    @GetMapping("queryPayStatus/{orderNo}")
    public R queryPayStatus(@PathVariable String orderNo) {
        Map<String, String> map = payLogService.queryPayStatus(orderNo);
        System.out.println("=============查询订单状态map集合:" + map);
        if (map == null) {
            return R.error().message("支付出错了");
        }
        // 如果返回map不为空,通过map获取订单状态
        if (map.get("trade_state").equals("SUCCESS")) {
            // 添加记录到支付表,更新订单表状态
            payLogService.updateOrderStatus(map);
            return R.ok().message("支付成功");
        }
        return R.ok().code(25000).message("支付中...");
    }
}
package com.qm.gameservice.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.qm.commonutils.R;
import com.qm.commonutils.vo.UcenterMemberVo;
import com.qm.gameservice.entity.EgGoods;
import com.qm.gameservice.entity.query.GoodsQuery;
import com.qm.gameservice.entity.vo.GoodsInfoFromVo;
import com.qm.gameservice.entity.vo.GoodsPublishVo;
import com.qm.gameservice.service.EgGameService;
import com.qm.gameservice.service.EgGoodsService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@Api(description="商品管理")
@RestController
@RequestMapping("/gameservice/goods")
public class EgGoodsController {
    @Autowired
    private EgGoodsService egGoodsService;
    /**
     * TODO 1.添加商品功能
     * @param goodsInfoFromVo
     * @return
     */
    @ApiOperation(value = "添加商品")
    @PostMapping("addGoods")
    public R addGoods(@RequestBody GoodsInfoFromVo goodsInfoFromVo) {
        String goodsId = egGoodsService.addGoods(goodsInfoFromVo);
        return R.ok().data("goodsId",goodsId);
    }
    /**
     * TODO 2.商品审核列表功能
     *
     */
    @ApiOperation(value = "商品审核列表功能")
    @PostMapping("/getGoodsList/{page}/{limit}")
    public R pageQuery(
            @ApiParam(name = "page", value = "当前页码", required = true)
            @PathVariable Long page,
            @ApiParam(name = "limit", value = "每页记录数", required = true)
            @PathVariable Long limit,
            @ApiParam(name = "goodsQuery", value = "查询对象")
            @RequestBody(required = false) GoodsQuery goodsQuery){
        Page<EgGoods> pageParam = new Page<>(page, limit);
        egGoodsService.pageQuery(pageParam, goodsQuery);
        List<EgGoods> records = pageParam.getRecords();
        long total = pageParam.getTotal();
        return  R.ok().data("total", total).data("rows", records);
    }
    /**
     * TODO 3.上架商品列表
     */
    @ApiOperation(value = "上架商品列表")
    @PostMapping("/goodsList/{page}/{limit}")
    public R goodsList(
            @ApiParam(name = "page", value = "当前页码", required = true)
            @PathVariable Long page,
            @ApiParam(name = "limit", value = "每页记录数", required = true)
            @PathVariable Long limit,
            @ApiParam(name = "goodsQuery", value = "查询对象")
            @RequestBody(required = false) GoodsQuery goodsQuery){
        Page<EgGoods> pageParam = new Page<>(page, limit);
        egGoodsService.goodsList(pageParam, goodsQuery);
        List<EgGoods> records = pageParam.getRecords();
        long total = pageParam.getTotal();
        return  R.ok().data("total", total).data("rows", records);
    }
    /**
     * TODO 4.管理员上架商品列表
     * @param page
     * @param limit
     * @param goodsQuery
     * @return
     */
    @ApiOperation(value = "管理员上架商品列表")
    @PostMapping("/goodAdminsList/{page}/{limit}")
    public R goodAdminsList(
            @ApiParam(name = "page", value = "当前页码", required = true)
            @PathVariable Long page,
            @ApiParam(name = "limit", value = "每页记录数", required = true)
            @PathVariable Long limit,
            @ApiParam(name = "goodsQuery", value = "查询对象")
            @RequestBody(required = false) GoodsQuery goodsQuery){
        Page<EgGoods> pageParam = new Page<>(page, limit);
        egGoodsService.goodAdminsList(pageParam, goodsQuery);
        List<EgGoods> records = pageParam.getRecords();
        long total = pageParam.getTotal();
        return  R.ok().data("total", total).data("rows", records);
    }
    /**
     * TODO 5.根据商品id查询商品基本信息
     */
    @GetMapping("getGoodsInfo/{goodsId}")
    public R getGoodsInfo(@PathVariable String goodsId) {
        GoodsInfoFromVo goodsInfoFromVo = egGoodsService.getGoodsInfo(goodsId);
        return R.ok().data("goodsInfoFromVo", goodsInfoFromVo);
    }
    /**
     * TODO 6.修改商品信息
     */
    @PostMapping("updateGoodsInfo")
    public R updateGoods(@RequestBody GoodsInfoFromVo goodsInfoFromVo) {
        egGoodsService.updateGoodsInfo(goodsInfoFromVo);
        return R.ok();
    }
    /**
     * TODO 7.根据课程id查询课程确认信息
     */
    @GetMapping("getPublish/{id}")
    public R getPublish(@PathVariable String id) {
        GoodsPublishVo goodsPublishVo = egGoodsService.publishGoodsInfo(id);
        return R.ok().data("publishGoods",goodsPublishVo);
    }
    /**
     * TODO 8.商品最终发布
     * 修改课程状态
     */
    @PostMapping("endGoods/{id}")
    public R publishCourse(@PathVariable String id) {
        egGoodsService.publishGoodsById(id);
        return R.ok();
    }
    /**
     * TODO 9.删除商品
     */
    @DeleteMapping("{id}")
    public R deleteGoods(@PathVariable String id) {
        egGoodsService.removeGoods(id);
        return R.ok();
    }
    /**
     * TODO 10.批准上架
     */
    @PostMapping("agreeGoods/{id}")
    public R agreeGoods(@PathVariable String id) {
        egGoodsService.agreeGoods(id);
        return R.ok();
    }
    /**
     * TODO 11.拒绝上架
     */
    @PostMapping("refuseGoods/{id}")
    public R refuseGoods(@PathVariable String id) {
        egGoodsService.refuseGoods(id);
        return R.ok();
    }
    /**
     * TODO 12.查询审核商品数
     * countAuditGoods
     */
    @PostMapping("countAuditGoods")
    public R countAuditGoods() {
        QueryWrapper<EgGoods> wrapper = new QueryWrapper<EgGoods>();
        wrapper.eq("status","UserSell");
        int count =egGoodsService.count(wrapper);
        return R.ok().data("count",count);
    }
    /**
     * TODO 13.查询用户发布商品
     */
    @PostMapping("/userGoodsList/{page}/{limit}/{user}")
    public R userGoodsList(
            @ApiParam(name = "page", value = "当前页码", required = true)
            @PathVariable Long page,
            @ApiParam(name = "limit", value = "每页记录数", required = true)
            @PathVariable Long limit,
            @PathVariable String user){
        Page<EgGoods> pageParam = new Page<>(page, limit);
        egGoodsService.userGoodsList(pageParam,user);
        List<EgGoods> records = pageParam.getRecords();
        long total = pageParam.getTotal();
        return  R.ok().data("total", total).data("rows", records);
    }
    /**
     * TODO 14.用户查询自己下架商品
     */
    @PostMapping("/refuseUserGoods/{page}/{limit}/{user}")
    public R refuseUserGoods(
            @ApiParam(name = "page", value = "当前页码", required = true)
            @PathVariable Long page,
            @ApiParam(name = "limit", value = "每页记录数", required = true)
            @PathVariable Long limit,
            @PathVariable String user){
        Page<EgGoods> pageParam = new Page<>(page, limit);
        egGoodsService.refuseUserGoods(pageParam,user);
        List<EgGoods> records = pageParam.getRecords();
        long total = pageParam.getTotal();
        return  R.ok().data("total", total).data("rows", records);
    }
//    @PostMapping
//    public R getUserG() {
//        String user = "许文哲";
//        String status = "RefuseSell";
//        GoodsPublishVo ggg =egGoodsService.selectG(status, user);
//        System.out.println(ggg);
//        return R.ok().data("ggg",ggg);
//    }
}

五,项目总结

游戏道具交易平台中分为前台系统和后台管理系统,前台系统包括用户信息模块、商品购买模块、出售管理模块、咨询管理模块;后台管理系统包括用户管理模块、游戏管理模块、销售管理模块。

前台系统主要功能:查看游戏详情、查看商品详情、购买商品、查看咨询、进行咨询、查看个人信息、修改个人信息、查看自己发布的商品、查看自己下架的商品、查看自己卖出去的商品、查看自己买到的商品、查看自己所有的订单,查看自己的收藏、查看自己的咨询记录等功能;

后台系统中主要功能:权限管理后台登录用户、管理前台轮播图、管理咨询、管理用户咨询、管理游戏、管理分类、管理商品、审核商品、订单管理、售后管理、前台用户管理、最新商品发布、管理员商品列表等功能。

相关文章
|
3天前
|
存储 JavaScript 前端开发
基于 SpringBoot 和 Vue 开发校园点餐订餐外卖跑腿Java源码
一个非常实用的校园外卖系统,基于 SpringBoot 和 Vue 的开发。这一系统源于黑马的外卖案例项目 经过站长的进一步改进和优化,提供了更丰富的功能和更高的可用性。 这个项目的架构设计非常有趣。虽然它采用了SpringBoot和Vue的组合,但并不是一个完全分离的项目。 前端视图通过JS的方式引入了Vue和Element UI,既能利用Vue的快速开发优势,
33 13
|
11天前
|
JavaScript 安全 Java
java版药品不良反应智能监测系统源码,采用SpringBoot、Vue、MySQL技术开发
基于B/S架构,采用Java、SpringBoot、Vue、MySQL等技术自主研发的ADR智能监测系统,适用于三甲医院,支持二次开发。该系统能自动监测全院患者药物不良反应,通过移动端和PC端实时反馈,提升用药安全。系统涵盖规则管理、监测报告、系统管理三大模块,确保精准、高效地处理ADR事件。
|
1月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,帮助开发者提高开发效率和应用的可维护性。
69 2
|
1月前
|
JavaScript NoSQL Java
CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro、Redis、Vue quasar 的前后端分离的后台管理系统
CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro、Redis、Vue quasar 的前后端分离的后台管理系统
40 0
|
22天前
|
JavaScript API 开发者
Vue是如何进行组件化的
Vue是如何进行组件化的
|
23天前
|
JavaScript 前端开发 开发者
vue 数据驱动视图
总之,Vue 数据驱动视图是一种先进的理念和技术,它为前端开发带来了巨大的便利和优势。通过理解和应用这一特性,开发者能够构建出更加动态、高效、用户体验良好的前端应用。在不断发展的前端领域中,数据驱动视图将继续发挥重要作用,推动着应用界面的不断创新和进化。
|
25天前
|
JavaScript 前端开发 开发者
vue学习第一章
欢迎来到我的博客!我是瑞雨溪,一名热爱前端的大一学生,专注于JavaScript与Vue,正向全栈进发。博客分享Vue学习心得、命令式与声明式编程对比、列表展示及计数器案例等。关注我,持续更新中!🎉🎉🎉
28 1
vue学习第一章
|
25天前
|
JavaScript 前端开发 索引
vue学习第三章
欢迎来到瑞雨溪的博客,一名热爱JavaScript与Vue的大一学生。本文介绍了Vue中的v-bind指令,包括基本使用、动态绑定class及style等,希望能为你的前端学习之路提供帮助。持续关注,更多精彩内容即将呈现!🎉🎉🎉
24 1
vue学习第三章
|
25天前
|
缓存 JavaScript 前端开发
vue学习第四章
欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript与Vue的大一学生。本文介绍了Vue中计算属性的基本与复杂使用、setter/getter、与methods的对比及与侦听器的总结。如果你觉得有用,请关注我,将持续更新更多优质内容!🎉🎉🎉
35 1
vue学习第四章
|
25天前
|
JavaScript 前端开发 算法
vue学习第7章(循环)
欢迎来到瑞雨溪的博客,一名热爱JavaScript和Vue的大一学生。本文介绍了Vue中的v-for指令,包括遍历数组和对象、使用key以及数组的响应式方法等内容,并附有综合练习实例。关注我,将持续更新更多优质文章!🎉🎉🎉
23 1
vue学习第7章(循环)