随着社会的进步和网络技术的快速发展,人们的生活娱乐方式逐渐丰富,电脑和网络已经融入了人们生活中的点点滴滴,无时无刻不在影响着我们的日常生活。越来越多的人感受到了网络带给人们的便捷与乐趣,越来越多的人喜欢通过网络游戏来释放压力、愉悦心身,用网络游戏来丰富精神生活。网络游戏的市场发展也推动着越来越多的玩家关注虚拟商品市场的交易,有了更多的需求和供应,便有了物品的交换,而虚拟世界中的虚拟物品也就有了自己的价值,网络游戏中的虚拟物品交易也便随之而来。在用户有很强烈的虚拟物品交易需求,一个便捷、高效与安全的游戏道具交易系统对网络游戏行业来说有很重要的意义,可以提升游戏用户的活跃,进一步加深游戏的社交化程度,拉长游戏的生命周期。所以开发一个游戏道具交易平台,可以为网络游戏带来更广泛的增值服务。
游戏道具交易平台是面向用户而设计的,系统中存在三个角色:游客、用户、管理员,如图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 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 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 pageOrder = new Page<>(current,limit);
// 调用方法实现条件查询分页
orderService.pageOrders(pageOrder,order);
// 总记录数
long total = pageOrder.getTotal();
// 数据list集合
List 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 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 pageParam = new Page<>(page, limit);
egGoodsService.pageQuery(pageParam, goodsQuery);
List 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 pageParam = new Page<>(page, limit);
egGoodsService.goodsList(pageParam, goodsQuery);
List 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 pageParam = new Page<>(page, limit);
egGoodsService.goodAdminsList(pageParam, goodsQuery);
List 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 wrapper = new QueryWrapper();
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 pageParam = new Page<>(page, limit);
egGoodsService.userGoodsList(pageParam,user);
List 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 pageParam = new Page<>(page, limit);
egGoodsService.refuseUserGoods(pageParam,user);
List 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);
// }
}
游戏道具交易平台中分为前台系统和后台管理系统,前台系统包括用户信息模块、商品购买模块、出售管理模块、咨询管理模块;后台管理系统包括用户管理模块、游戏管理模块、销售管理模块。
前台系统主要功能:查看游戏详情、查看商品详情、购买商品、查看咨询、进行咨询、查看个人信息、修改个人信息、查看自己发布的商品、查看自己下架的商品、查看自己卖出去的商品、查看自己买到的商品、查看自己所有的订单,查看自己的收藏、查看自己的咨询记录等功能;
后台系统中主要功能:权限管理后台登录用户、管理前台轮播图、管理咨询、管理用户咨询、管理游戏、管理分类、管理商品、审核商品、订单管理、售后管理、前台用户管理、最新商品发布、管理员商品列表等功能。