diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml
index 6eae7b860..19b8da228 100644
--- a/ruoyi-admin/src/main/resources/application.yml
+++ b/ruoyi-admin/src/main/resources/application.yml
@@ -128,7 +128,7 @@ gen:
# 作者
author: zhujj
# 默认生成包路径 system 需改成自己的模块名称 如 system monitor tool
- packageName: com.ruoyi.exam
+ packageName: com.ruoyi.vip
# 自动去除表前缀,默认是true
autoRemovePre: false
# 表前缀(类名不会包含表前缀)
diff --git a/ruoyi-cms/pom.xml b/ruoyi-cms/pom.xml
index 749d880ba..be3859c0d 100644
--- a/ruoyi-cms/pom.xml
+++ b/ruoyi-cms/pom.xml
@@ -33,5 +33,16 @@
ruoyi-exam
${ruoyi.version}
+
+
+ com.ruoyi
+ ruoyi-vip
+ ${ruoyi.version}
+
+
+ com.ruoyi
+ ruoyi-weixin
+ ${ruoyi.version}
+
\ No newline at end of file
diff --git a/ruoyi-cms/src/main/java/com/ruoyi/cms/controller/ApiWxPayController.java b/ruoyi-cms/src/main/java/com/ruoyi/cms/controller/ApiWxPayController.java
new file mode 100644
index 000000000..97ab6510f
--- /dev/null
+++ b/ruoyi-cms/src/main/java/com/ruoyi/cms/controller/ApiWxPayController.java
@@ -0,0 +1,132 @@
+package com.ruoyi.cms.controller;
+
+import cn.hutool.core.util.IdUtil;
+import com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse;
+import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult;
+import com.github.binarywang.wxpay.bean.notify.WxScanPayNotifyResult;
+import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
+import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderResult;
+import com.github.binarywang.wxpay.exception.WxPayException;
+import com.github.binarywang.wxpay.service.WxPayService;
+import com.ruoyi.common.base.AjaxResult;
+import com.ruoyi.common.utils.IpUtils;
+import com.ruoyi.framework.jwt.JwtUtil;
+import com.ruoyi.framework.web.base.BaseController;
+import com.ruoyi.framework.web.util.ServletUtils;
+import com.ruoyi.framework.web.util.ShiroUtils;
+import com.ruoyi.system.domain.SysUser;
+import com.ruoyi.system.service.ISysUserService;
+import com.ruoyi.train.course.domain.*;
+import com.ruoyi.train.course.service.ITrainCourseCategoryService;
+import com.ruoyi.train.course.service.ITrainCourseSectionService;
+import com.ruoyi.train.course.service.ITrainCourseService;
+import com.ruoyi.train.course.service.ITrainCourseUserService;
+import com.ruoyi.vip.domain.VipUserOrders;
+import com.ruoyi.vip.service.IVipUserOrdersService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 课程 信息操作处理
+ *
+ * @author zhujj
+ * @date 2018-12-23
+ */
+@RestController
+@RequestMapping("/api/v1/wx/pay")
+public class ApiWxPayController extends BaseController {
+ @Autowired
+ private ITrainCourseUserService trainCourseUserService ;
+
+ @Autowired
+ private IVipUserOrdersService vipUserOrdersService;
+
+ @Autowired
+ private WxPayService wxService;
+ @PostMapping("/notify/order")
+ public String parseOrderNotifyResult(@RequestBody String xmlData) throws WxPayException {
+ final WxPayOrderNotifyResult notifyResult = this.wxService.parseOrderNotifyResult(xmlData);
+ if (null != notifyResult && notifyResult.getReturnCode().equals("SUCCESS")) {
+ VipUserOrders userOrders = new VipUserOrders();
+ userOrders.setId(notifyResult.getOutTradeNo());
+ userOrders.setDelFlag("1");
+ vipUserOrdersService.updateSelectiveById(userOrders);
+ VipUserOrders vipUserOrders = vipUserOrdersService.selectById(notifyResult.getOutTradeNo());
+ TrainCourseUser courseUser = new TrainCourseUser();
+ courseUser.setVipUserId(vipUserOrders.getVipUserId());
+ courseUser.setTrainCourseId(vipUserOrders.getTrainCourseId());
+ trainCourseUserService.insert(courseUser);
+ }
+ return WxPayNotifyResponse.success("成功");
+ }
+
+ @ApiOperation(value = "扫码支付回调通知处理")
+ @PostMapping("/notify/scanpay")
+ public String parseScanPayNotifyResult(String xmlData) throws WxPayException {
+ final WxScanPayNotifyResult result = this.wxService.parseScanPayNotifyResult(xmlData);
+
+ // TODO 根据自己业务场景需要构造返回对象
+ return WxPayNotifyResponse.success("成功");
+ }
+ /**
+ * 调用统一下单接口,并组装生成支付所需参数对象.
+ *
+ * @param request 统一下单请求参数
+ * @param 请使用{@link com.github.binarywang.wxpay.bean.order}包下的类
+ * @return 返回 {@link com.github.binarywang.wxpay.bean.order}包下的类对象
+ *
+ * 示例参数
+ * {
+ "body":"测试商品",
+ "outTradeNo":"12344324242342342342554",
+ "totalFee":1.01,
+ "spbillCreateIp":"1.80.82.241",
+ "notifyUrl":"http://www.baidu.com",
+ "tradeType":"NATIVE",
+ "productId":"13652b4a71df2f49e3647c55c8e31a88"
+ }
+ 返回
+ {
+ "codeUrl": "weixin://wxpay/bizpayurl?pr=pK0R74G"
+ }
+ */
+ @ApiOperation(value = "统一下单,并组装所需支付参数")
+ @PostMapping("/createOrder")
+ public T createOrder(@RequestBody WxPayUnifiedOrderRequest request) throws WxPayException {
+ request.setOutTradeNo( IdUtil.simpleUUID());
+ request.setSpbillCreateIp( IpUtils.getIpAddr( ServletUtils.getRequest()));
+ VipUserOrders userOrders = new VipUserOrders();
+ userOrders.setId(request.getOutTradeNo());
+ userOrders.setVipUserId(ShiroUtils.getUserId().intValue());
+ userOrders.setTrainCourseId(Integer.parseInt(request.getProductId()));
+ //未支付订单
+ userOrders.setDelFlag("0");
+ vipUserOrdersService.insert(userOrders);
+ return this.wxService.createOrder(request);
+ }
+
+ /**
+ * 统一下单(详见https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1)
+ * 在发起微信支付前,需要调用统一下单接口,获取"预支付交易会话标识"
+ * 接口地址:https://api.mch.weixin.qq.com/pay/unifiedorder
+ *
+ * @param request 请求对象,注意一些参数如appid、mchid等不用设置,方法内会自动从配置对象中获取到(前提是对应配置中已经设置)
+ */
+ @ApiOperation(value = "原生的统一下单接口")
+ @PostMapping("/unifiedOrder")
+ public WxPayUnifiedOrderResult unifiedOrder(@RequestBody WxPayUnifiedOrderRequest request) throws WxPayException {
+ request.setOutTradeNo( IdUtil.simpleUUID());
+ request.setSpbillCreateIp( IpUtils.getIpAddr( ServletUtils.getRequest()));
+ VipUserOrders userOrders = new VipUserOrders();
+ userOrders.setId(request.getOutTradeNo());
+ userOrders.setVipUserId(ShiroUtils.getUserId().intValue());
+ userOrders.setTrainCourseId(Integer.parseInt(request.getProductId()));
+ //未支付订单
+ userOrders.setDelFlag("0");
+ vipUserOrdersService.insert(userOrders);
+ return this.wxService.unifiedOrder(request);
+ }
+}
diff --git a/ruoyi-train/pom.xml b/ruoyi-train/pom.xml
index e9cdb0027..7cec0c342 100644
--- a/ruoyi-train/pom.xml
+++ b/ruoyi-train/pom.xml
@@ -30,11 +30,6 @@
ruoyi-framework
${ruoyi.version}
-
- com.ruoyi
- ruoyi-weixin
- ${ruoyi.version}
-
com.aliyun
aliyun-java-sdk-core
diff --git a/ruoyi-train/src/main/java/com/ruoyi/train/course/controller/ApiTrainCourseController.java b/ruoyi-train/src/main/java/com/ruoyi/train/course/controller/ApiTrainCourseController.java
index a95454e85..9124fa01d 100644
--- a/ruoyi-train/src/main/java/com/ruoyi/train/course/controller/ApiTrainCourseController.java
+++ b/ruoyi-train/src/main/java/com/ruoyi/train/course/controller/ApiTrainCourseController.java
@@ -1,10 +1,6 @@
package com.ruoyi.train.course.controller;
import cn.hutool.json.JSONObject;
-import com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse;
-import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult;
-import com.github.binarywang.wxpay.exception.WxPayException;
-import com.github.binarywang.wxpay.service.WxPayService;
import com.ruoyi.common.base.AjaxResult;
import com.ruoyi.framework.jwt.JwtUtil;
import com.ruoyi.framework.web.base.BaseController;
@@ -109,16 +105,5 @@ public class ApiTrainCourseController extends BaseController {
success.put( "data", trainCourseSections );
return success;
}
- @Autowired
- private WxPayService wxService;
- @PostMapping("/notify/order")
- public AjaxResult parseOrderNotifyResult(@RequestBody String xmlData) throws WxPayException {
- final WxPayOrderNotifyResult notifyResult = this.wxService.parseOrderNotifyResult(xmlData);
- TrainCourseUser courseUser = new TrainCourseUser();
- courseUser.setVipUserId( ShiroUtils.getUserId().intValue() );
- trainCourseUserService.insert(courseUser);
- // TODO 根据自己业务场景需要构造返回对象
- return AjaxResult.success("成功");
- }
}
diff --git a/ruoyi-train/src/main/java/com/ruoyi/train/course/controller/TrainCourseController.java b/ruoyi-train/src/main/java/com/ruoyi/train/course/controller/TrainCourseController.java
index 159da2bb9..77c3f551f 100644
--- a/ruoyi-train/src/main/java/com/ruoyi/train/course/controller/TrainCourseController.java
+++ b/ruoyi-train/src/main/java/com/ruoyi/train/course/controller/TrainCourseController.java
@@ -115,7 +115,7 @@ public class TrainCourseController extends BaseController
@ResponseBody
public AjaxResult editSave(TrainCourse trainCourse)
{
- return toAjax(trainCourseService.updateById(trainCourse));
+ return toAjax(trainCourseService.updateSelectiveById(trainCourse));
}
/**
diff --git a/ruoyi-vip/src/main/java/com/ruoyi/vip/controller/VipUserOrdersController.java b/ruoyi-vip/src/main/java/com/ruoyi/vip/controller/VipUserOrdersController.java
new file mode 100644
index 000000000..4dc347c60
--- /dev/null
+++ b/ruoyi-vip/src/main/java/com/ruoyi/vip/controller/VipUserOrdersController.java
@@ -0,0 +1,126 @@
+package com.ruoyi.vip.controller;
+
+import java.util.List;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.vip.domain.VipUserOrders;
+import com.ruoyi.vip.service.IVipUserOrdersService;
+import com.ruoyi.framework.web.base.BaseController;
+import com.ruoyi.framework.web.page.TableDataInfo;
+import com.ruoyi.common.base.AjaxResult;
+import com.ruoyi.common.utils.ExcelUtil;
+
+/**
+ * 我的订单 信息操作处理
+ *
+ * @author zhujj
+ * @date 2019-01-25
+ */
+@Controller
+@RequestMapping("/vip/vipUserOrders")
+public class VipUserOrdersController extends BaseController
+{
+ private String prefix = "vip/vipUserOrders";
+
+ @Autowired
+ private IVipUserOrdersService vipUserOrdersService;
+
+ @RequiresPermissions("vip:vipUserOrders:view")
+ @GetMapping()
+ public String vipUserOrders()
+ {
+ return prefix + "/vipUserOrders";
+ }
+
+ /**
+ * 查询我的订单列表
+ */
+ @RequiresPermissions("vip:vipUserOrders:list")
+ @PostMapping("/list")
+ @ResponseBody
+ public TableDataInfo list(VipUserOrders vipUserOrders)
+ {
+ List list = vipUserOrdersService.selectVipUserOrdersPage(vipUserOrders);
+ return getDataTable(list);
+ }
+
+
+ /**
+ * 导出我的订单列表
+ */
+ @RequiresPermissions("vip:vipUserOrders:export")
+ @PostMapping("/export")
+ @ResponseBody
+ public AjaxResult export(VipUserOrders vipUserOrders)
+ {
+ List list = vipUserOrdersService.selectVipUserOrdersList(vipUserOrders);
+ ExcelUtil util = new ExcelUtil(VipUserOrders.class);
+ return util.exportExcel(list, "vipUserOrders");
+ }
+
+ /**
+ * 新增我的订单
+ */
+ @GetMapping("/add")
+ public String add()
+ {
+ return prefix + "/add";
+ }
+
+ /**
+ * 新增保存我的订单
+ */
+ @RequiresPermissions("vip:vipUserOrders:add")
+ @Log(title = "我的订单", businessType = BusinessType.INSERT)
+ @PostMapping("/add")
+ @ResponseBody
+ public AjaxResult addSave(VipUserOrders vipUserOrders)
+ {
+ return toAjax(vipUserOrdersService.insert(vipUserOrders));
+ }
+
+ /**
+ * 修改我的订单
+ */
+ @GetMapping("/edit/{id}")
+ public String edit(@PathVariable("id") String id, ModelMap mmap)
+ {
+ VipUserOrders vipUserOrders = vipUserOrdersService.selectById(id);
+ mmap.put("vipUserOrders", vipUserOrders);
+ return prefix + "/edit";
+ }
+
+ /**
+ * 修改保存我的订单
+ */
+ @RequiresPermissions("vip:vipUserOrders:edit")
+ @Log(title = "我的订单", businessType = BusinessType.UPDATE)
+ @PostMapping("/edit")
+ @ResponseBody
+ public AjaxResult editSave(VipUserOrders vipUserOrders)
+ {
+ return toAjax(vipUserOrdersService.updateById(vipUserOrders));
+ }
+
+ /**
+ * 删除我的订单
+ */
+ @RequiresPermissions("vip:vipUserOrders:remove")
+ @Log(title = "我的订单", businessType = BusinessType.DELETE)
+ @PostMapping( "/remove")
+ @ResponseBody
+ public AjaxResult remove(String ids)
+ {
+ return toAjax(vipUserOrdersService.deleteByIds(ids));
+ }
+
+}
diff --git a/ruoyi-vip/src/main/java/com/ruoyi/vip/domain/VipUserOrders.java b/ruoyi-vip/src/main/java/com/ruoyi/vip/domain/VipUserOrders.java
new file mode 100644
index 000000000..bc4bad747
--- /dev/null
+++ b/ruoyi-vip/src/main/java/com/ruoyi/vip/domain/VipUserOrders.java
@@ -0,0 +1,167 @@
+package com.ruoyi.vip.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.base.BaseEntity;
+ import javax.persistence.Id;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 我的订单表 vip_user_orders
+ *
+ * @author zhujj
+ * @date 2019-01-25
+ */
+public class VipUserOrders
+{
+private static final long serialVersionUID = 1L;
+
+ /** 订单号 */
+ @Id
+ private String id;
+ /** 会员代码 */
+ private Integer vipUserId;
+ /** 练习题代码 */
+ private Integer trainCourseId;
+ /** 支付金额 */
+ private BigDecimal price;
+ /** 创建者 */
+ private String createBy;
+ /** 创建时间 */
+ private Date createDate;
+ /** 更新者 */
+ private String updateBy;
+ /** 更新时间 */
+ private Date updateDate;
+ /** 备注信息 */
+ private String remarks;
+ /** 订单状态(0-默认,未支付 1-已支付) */
+ private String delFlag;
+
+ /** 设置订单号 */
+ public void setId(String id)
+ {
+ this.id = id;
+ }
+
+ /** 获取订单号 */
+ public String getId()
+ {
+ return id;
+ }
+ /** 设置会员代码 */
+ public void setVipUserId(Integer vipUserId)
+ {
+ this.vipUserId = vipUserId;
+ }
+
+ /** 获取会员代码 */
+ public Integer getVipUserId()
+ {
+ return vipUserId;
+ }
+ /** 设置练习题代码 */
+ public void setTrainCourseId(Integer trainCourseId)
+ {
+ this.trainCourseId = trainCourseId;
+ }
+
+ /** 获取练习题代码 */
+ public Integer getTrainCourseId()
+ {
+ return trainCourseId;
+ }
+ /** 设置支付金额 */
+ public void setPrice(BigDecimal price)
+ {
+ this.price = price;
+ }
+
+ /** 获取支付金额 */
+ public BigDecimal getPrice()
+ {
+ return price;
+ }
+ /** 设置创建者 */
+ public void setCreateBy(String createBy)
+ {
+ this.createBy = createBy;
+ }
+
+ /** 获取创建者 */
+ public String getCreateBy()
+ {
+ return createBy;
+ }
+ /** 设置创建时间 */
+ public void setCreateDate(Date createDate)
+ {
+ this.createDate = createDate;
+ }
+
+ /** 获取创建时间 */
+ public Date getCreateDate()
+ {
+ return createDate;
+ }
+ /** 设置更新者 */
+ public void setUpdateBy(String updateBy)
+ {
+ this.updateBy = updateBy;
+ }
+
+ /** 获取更新者 */
+ public String getUpdateBy()
+ {
+ return updateBy;
+ }
+ /** 设置更新时间 */
+ public void setUpdateDate(Date updateDate)
+ {
+ this.updateDate = updateDate;
+ }
+
+ /** 获取更新时间 */
+ public Date getUpdateDate()
+ {
+ return updateDate;
+ }
+ /** 设置备注信息 */
+ public void setRemarks(String remarks)
+ {
+ this.remarks = remarks;
+ }
+
+ /** 获取备注信息 */
+ public String getRemarks()
+ {
+ return remarks;
+ }
+ /** 设置订单状态(0-默认,未支付 1-已支付) */
+ public void setDelFlag(String delFlag)
+ {
+ this.delFlag = delFlag;
+ }
+
+ /** 获取订单状态(0-默认,未支付 1-已支付) */
+ public String getDelFlag()
+ {
+ return delFlag;
+ }
+
+public String toString() {
+ return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+ .append("id", getId())
+ .append("vipUserId", getVipUserId())
+ .append("trainCourseId", getTrainCourseId())
+ .append("price", getPrice())
+ .append("createBy", getCreateBy())
+ .append("createDate", getCreateDate())
+ .append("updateBy", getUpdateBy())
+ .append("updateDate", getUpdateDate())
+ .append("remarks", getRemarks())
+ .append("delFlag", getDelFlag())
+ .toString();
+ }
+ }
diff --git a/ruoyi-vip/src/main/java/com/ruoyi/vip/mapper/VipUserOrdersMapper.java b/ruoyi-vip/src/main/java/com/ruoyi/vip/mapper/VipUserOrdersMapper.java
new file mode 100644
index 000000000..11577dd6c
--- /dev/null
+++ b/ruoyi-vip/src/main/java/com/ruoyi/vip/mapper/VipUserOrdersMapper.java
@@ -0,0 +1,24 @@
+package com.ruoyi.vip.mapper;
+
+import com.ruoyi.vip.domain.VipUserOrders;
+import java.util.List;
+import com.ruoyi.framework.web.base.MyMapper;
+
+/**
+ * 我的订单 数据层
+ *
+ * @author zhujj
+ * @date 2019-01-25
+ */
+public interface VipUserOrdersMapper extends MyMapper
+{
+
+ /**
+ * 查询我的订单列表
+ *
+ * @param vipUserOrders 我的订单信息
+ * @return 我的订单集合
+ */
+ public List selectVipUserOrdersList(VipUserOrders vipUserOrders);
+
+}
\ No newline at end of file
diff --git a/ruoyi-vip/src/main/java/com/ruoyi/vip/service/IVipUserOrdersService.java b/ruoyi-vip/src/main/java/com/ruoyi/vip/service/IVipUserOrdersService.java
new file mode 100644
index 000000000..2db302501
--- /dev/null
+++ b/ruoyi-vip/src/main/java/com/ruoyi/vip/service/IVipUserOrdersService.java
@@ -0,0 +1,30 @@
+package com.ruoyi.vip.service;
+
+import com.ruoyi.vip.domain.VipUserOrders;
+import java.util.List;
+import com.ruoyi.framework.web.base.AbstractBaseService;
+/**
+ * 我的订单 服务层
+ *
+ * @author zhujj
+ * @date 2019-01-25
+ */
+public interface IVipUserOrdersService extends AbstractBaseService
+{
+ /**
+ * 查询我的订单分页列表
+ *
+ * @param vipUserOrders 我的订单信息
+ * @return 我的订单集合
+ */
+ public List selectVipUserOrdersPage(VipUserOrders vipUserOrders);
+ /**
+ * 查询我的订单列表
+ *
+ * @param vipUserOrders 我的订单信息
+ * @return 我的订单集合
+ */
+ public List selectVipUserOrdersList(VipUserOrders vipUserOrders);
+
+
+}
diff --git a/ruoyi-vip/src/main/java/com/ruoyi/vip/service/impl/VipUserOrdersServiceImpl.java b/ruoyi-vip/src/main/java/com/ruoyi/vip/service/impl/VipUserOrdersServiceImpl.java
new file mode 100644
index 000000000..251c3b39d
--- /dev/null
+++ b/ruoyi-vip/src/main/java/com/ruoyi/vip/service/impl/VipUserOrdersServiceImpl.java
@@ -0,0 +1,48 @@
+package com.ruoyi.vip.service.impl;
+
+import java.util.List;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.ruoyi.vip.mapper.VipUserOrdersMapper;
+import com.ruoyi.vip.domain.VipUserOrders;
+import com.ruoyi.vip.service.IVipUserOrdersService;
+import com.ruoyi.common.support.Convert;
+import com.ruoyi.framework.web.base.AbstractBaseServiceImpl;
+/**
+ * 我的订单 服务层实现
+ *
+ * @author zhujj
+ * @date 2019-01-25
+ */
+@Service
+public class VipUserOrdersServiceImpl extends AbstractBaseServiceImpl implements IVipUserOrdersService
+{
+ @Autowired
+ private VipUserOrdersMapper vipUserOrdersMapper;
+
+
+ /**
+ * 查询我的订单列表
+ *
+ * @param vipUserOrders 我的订单信息
+ * @return 我的订单集合
+ */
+ @Override
+ public List selectVipUserOrdersList(VipUserOrders vipUserOrders)
+ {
+ return vipUserOrdersMapper.selectVipUserOrdersList(vipUserOrders);
+ }
+ /**
+ * 查询我的订单分页列表
+ *
+ * @param vipUserOrders 我的订单信息
+ * @return 我的订单集合
+ */
+ @Override
+ public List selectVipUserOrdersPage(VipUserOrders vipUserOrders)
+ {
+ startPage();
+ return vipUserOrdersMapper.selectVipUserOrdersList(vipUserOrders);
+ }
+
+}
diff --git a/ruoyi-vip/src/main/resources/mapper/vip/VipUserOrdersMapper.xml b/ruoyi-vip/src/main/resources/mapper/vip/VipUserOrdersMapper.xml
new file mode 100644
index 000000000..6d8cc2aa4
--- /dev/null
+++ b/ruoyi-vip/src/main/resources/mapper/vip/VipUserOrdersMapper.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ id, vip_user_id, train_course_id, price, create_by, create_date, update_by, update_date, remarks, del_flag
+
+
+
+
+
\ No newline at end of file
diff --git a/ruoyi-vip/src/main/resources/templates/vip/vipUserOrders/add.html b/ruoyi-vip/src/main/resources/templates/vip/vipUserOrders/add.html
new file mode 100644
index 000000000..f1f60e33e
--- /dev/null
+++ b/ruoyi-vip/src/main/resources/templates/vip/vipUserOrders/add.html
@@ -0,0 +1,82 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/ruoyi-vip/src/main/resources/templates/vip/vipUserOrders/edit.html b/ruoyi-vip/src/main/resources/templates/vip/vipUserOrders/edit.html
new file mode 100644
index 000000000..987d80eec
--- /dev/null
+++ b/ruoyi-vip/src/main/resources/templates/vip/vipUserOrders/edit.html
@@ -0,0 +1,83 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/ruoyi-vip/src/main/resources/templates/vip/vipUserOrders/vipUserOrders.html b/ruoyi-vip/src/main/resources/templates/vip/vipUserOrders/vipUserOrders.html
new file mode 100644
index 000000000..9f9160cd9
--- /dev/null
+++ b/ruoyi-vip/src/main/resources/templates/vip/vipUserOrders/vipUserOrders.html
@@ -0,0 +1,161 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file