Parcourir la source

feat(h5): 修改展示信息

Go il y a 5 ans
Parent
commit
262513cd17
25 fichiers modifiés avec 919 ajouts et 206 suppressions
  1. 33 38
      front/project/admin/routes/setting/service/page.js
  2. 2 2
      front/project/h5/routes/page/open/page.js
  3. 2 2
      front/project/h5/routes/product/main/page.js
  4. 5 0
      front/project/h5/routes/product/serviceDetail/index.less
  5. 5 4
      front/project/h5/routes/product/serviceDetail/page.js
  6. 10 2
      front/project/h5/stores/my.js
  7. 7 0
      server/data/src/main/java/com/qxgmat/data/dao/UserOrderCheckoutMapper.java
  8. 28 28
      server/data/src/main/java/com/qxgmat/data/dao/entity/Pay.java
  9. 127 4
      server/data/src/main/java/com/qxgmat/data/dao/entity/UserOrder.java
  10. 300 0
      server/data/src/main/java/com/qxgmat/data/dao/entity/UserOrderCheckout.java
  11. 5 5
      server/data/src/main/java/com/qxgmat/data/dao/mapping/PayMapper.xml
  12. 23 0
      server/data/src/main/java/com/qxgmat/data/dao/mapping/UserOrderCheckoutMapper.xml
  13. 7 2
      server/data/src/main/java/com/qxgmat/data/dao/mapping/UserOrderMapper.xml
  14. 4 0
      server/data/src/main/resources/mybatis-generator.xml
  15. 32 0
      server/gateway-api/src/main/java/com/qxgmat/controller/api/CourseController.java
  16. 17 2
      server/gateway-api/src/main/java/com/qxgmat/controller/api/MyController.java
  17. 128 0
      server/gateway-api/src/main/java/com/qxgmat/controller/api/OrderController.java
  18. 0 91
      server/gateway-api/src/main/java/com/qxgmat/controller/api/ShopController.java
  19. 14 0
      server/gateway-api/src/main/java/com/qxgmat/dto/request/PayOrderDto.java
  20. 0 26
      server/gateway-api/src/main/java/com/qxgmat/dto/request/PayProductDto.java
  21. 12 0
      server/gateway-api/src/main/java/com/qxgmat/dto/request/RecordAddDto.java
  22. 38 0
      server/gateway-api/src/main/java/com/qxgmat/service/inline/CourseExperienceService.java
  23. 11 0
      server/gateway-api/src/main/java/com/qxgmat/service/inline/CourseTeacherService.java
  24. 80 0
      server/gateway-api/src/main/java/com/qxgmat/service/inline/UserOrderCheckoutService.java
  25. 29 0
      server/gateway-api/src/main/java/com/qxgmat/service/inline/UserOrderRecordService.java

+ 33 - 38
front/project/admin/routes/setting/service/page.js

@@ -57,15 +57,10 @@ export default class extends Page {
   }
 
   changeMapValue(field, second, index, key, value) {
-    const data = this.state[field] ? this.state[field][second] || {} : {};
-    data[index] = data[index] || {};
-    data[index][key] = value;
-    this.setState({ [field]: data });
-  }
-
-  changeValue(field, key, value) {
     const data = this.state[field] || {};
-    data[key] = value;
+    data[second] = data[second] || [];
+    data[second][index] = data[second][index] || {};
+    data[second][index][key] = value;
     this.setState({ [field]: data });
   }
 
@@ -122,8 +117,8 @@ export default class extends Page {
               { required: true, message: '输入千行Cat名称' },
             ],
           })(
-            <Input placeholder='请输入千行Cat名称' onChange={(value) => {
-              this.changeMapValue('qx_cat', 'package', 0, 'title', value);
+            <Input placeholder='请输入千行Cat名称' onChange={(e) => {
+              this.changeMapValue('qx_cat', 'package', 0, 'title', e.target.value);
             }} style={{ width: '200px' }} />,
           )}
         </Form.Item>
@@ -133,8 +128,8 @@ export default class extends Page {
               { required: true, message: '输入千行Cat服务简介' },
             ],
           })(
-            <Input placeholder='请输入千行Cat服务简介' onChange={(value) => {
-              this.changeMapValue('qx_cat', 'package', 0, 'description', value);
+            <Input placeholder='请输入千行Cat服务简介' onChange={(e) => {
+              this.changeMapValue('qx_cat', 'package', 0, 'description', e.target.value);
             }} style={{ width: '200px' }} />,
           )}
         </Form.Item>
@@ -144,8 +139,8 @@ export default class extends Page {
               { required: true, message: '输入千行Cat有效期说明' },
             ],
           })(
-            <Input placeholder='请输入千行Cat有效期说明' onChange={(value) => {
-              this.changeMapValue('qx_cat', 'package', 0, 'expire_info', value);
+            <Input placeholder='请输入千行Cat有效期说明' onChange={(e) => {
+              this.changeMapValue('qx_cat', 'package', 0, 'expire_info', e.target.value);
             }} style={{ width: '200px' }} />,
           )}
         </Form.Item>
@@ -155,8 +150,8 @@ export default class extends Page {
               { required: true, message: '输入千行Cat退款政策' },
             ],
           })(
-            <Input placeholder='请输入千行Cat退款政策' onChange={(value) => {
-              this.changeMapValue('qx_cat', 'package', 0, 'refund_policy', value);
+            <Input placeholder='请输入千行Cat退款政策' onChange={(e) => {
+              this.changeMapValue('qx_cat', 'package', 0, 'refund_policy', e.target.value);
             }} style={{ width: '200px' }} />,
           )}
         </Form.Item>
@@ -166,8 +161,8 @@ export default class extends Page {
               { required: true, message: '输入千行Cat版权说明' },
             ],
           })(
-            <Input placeholder='请输入千行Cat版权说明' onChange={(value) => {
-              this.changeMapValue('qx_cat', 'package', 0, 'copyright_notes', value);
+            <Input placeholder='请输入千行Cat版权说明' onChange={(e) => {
+              this.changeMapValue('qx_cat', 'package', 0, 'copyright_notes', e.target.value);
             }} style={{ width: '200px' }} />,
           )}
         </Form.Item>
@@ -240,8 +235,8 @@ export default class extends Page {
               { required: true, message: '输入数学机经名称' },
             ],
           })(
-            <Input placeholder='请输入数学机经名称' onChange={(value) => {
-              this.changeMapValue('textbook', 'package', 0, 'title', value);
+            <Input placeholder='请输入数学机经名称' onChange={(e) => {
+              this.changeMapValue('textbook', 'package', 0, 'title', e.target.value);
             }} style={{ width: '200px' }} />,
           )}
         </Form.Item>
@@ -251,8 +246,8 @@ export default class extends Page {
               { required: true, message: '输入数学机经服务简介' },
             ],
           })(
-            <Input placeholder='请输入数学机经服务简介' onChange={(value) => {
-              this.changeMapValue('textbook', 'package', 0, 'description', value);
+            <Input placeholder='请输入数学机经服务简介' onChange={(e) => {
+              this.changeMapValue('textbook', 'package', 0, 'description', e.target.value);
             }} style={{ width: '200px' }} />,
           )}
         </Form.Item>
@@ -262,8 +257,8 @@ export default class extends Page {
               { required: true, message: '输入数学机经有效期说明' },
             ],
           })(
-            <Input placeholder='请输入数学机经有效期说明' onChange={(value) => {
-              this.changeMapValue('textbook', 'package', 0, 'expire_info', value);
+            <Input placeholder='请输入数学机经有效期说明' onChange={(e) => {
+              this.changeMapValue('textbook', 'package', 0, 'expire_info', e.target.value);
             }} style={{ width: '200px' }} />,
           )}
         </Form.Item>
@@ -273,8 +268,8 @@ export default class extends Page {
               { required: true, message: '输入数学机经退款政策' },
             ],
           })(
-            <Input placeholder='请输入数学机经退款政策' onChange={(value) => {
-              this.changeMapValue('textbook', 'package', 0, 'refund_policy', value);
+            <Input placeholder='请输入数学机经退款政策' onChange={(e) => {
+              this.changeMapValue('textbook', 'package', 0, 'refund_policy', e.target.value);
             }} style={{ width: '200px' }} />,
           )}
         </Form.Item>
@@ -284,8 +279,8 @@ export default class extends Page {
               { required: true, message: '输入数学机经版权说明' },
             ],
           })(
-            <Input placeholder='请输入数学机经版权说明' onChange={(value) => {
-              this.changeMapValue('textbook', 'package', 0, 'copyright_notes', value);
+            <Input placeholder='请输入数学机经版权说明' onChange={(e) => {
+              this.changeMapValue('textbook', 'package', 0, 'copyright_notes', e.target.value);
             }} style={{ width: '200px' }} />,
           )}
         </Form.Item>
@@ -339,8 +334,8 @@ export default class extends Page {
                   { required: true, message: '输入名称' },
                 ],
               })(
-                <Input placeholder={'输入名称'} onChange={(value) => {
-                  this.changeMapValue('vip', 'package', index, 'title', value);
+                <Input placeholder={'输入名称'} onChange={(e) => {
+                  this.changeMapValue('vip', 'package', index, 'title', e.target.value);
                 }} style={{ width: '200px' }} />,
               )}
             </Form.Item>
@@ -350,8 +345,8 @@ export default class extends Page {
                   { required: true, message: '输入服务简介' },
                 ],
               })(
-                <Input placeholder='请输入服务简介' onChange={(value) => {
-                  this.changeMapValue('vip', 'package', index, 'description', value);
+                <Input placeholder='请输入服务简介' onChange={(e) => {
+                  this.changeMapValue('vip', 'package', index, 'description', e.target.value);
                 }} style={{ width: '200px' }} />,
               )}
             </Form.Item>
@@ -361,8 +356,8 @@ export default class extends Page {
                   { required: true, message: '输入有效期说明' },
                 ],
               })(
-                <Input placeholder='请输入有效期说明' onChange={(value) => {
-                  this.changeMapValue('vip', 'package', index, 'expire_info', value);
+                <Input placeholder='请输入有效期说明' onChange={(e) => {
+                  this.changeMapValue('vip', 'package', index, 'expire_info', e.target.value);
                 }} style={{ width: '200px' }} />,
               )}
             </Form.Item>
@@ -372,8 +367,8 @@ export default class extends Page {
                   { required: true, message: '输入退款政策' },
                 ],
               })(
-                <Input placeholder='请输入退款政策' onChange={(value) => {
-                  this.changeMapValue('vip', 'package', index, 'refund_policy', value);
+                <Input placeholder='请输入退款政策' onChange={(e) => {
+                  this.changeMapValue('vip', 'package', index, 'refund_policy', e.target.value);
                 }} style={{ width: '200px' }} />,
               )}
             </Form.Item>
@@ -383,8 +378,8 @@ export default class extends Page {
                   { required: true, message: '输入版权说明' },
                 ],
               })(
-                <Input placeholder='请输入版权说明' onChange={(value) => {
-                  this.changeMapValue('vip', 'package', index, 'copyright_notes', value);
+                <Input placeholder='请输入版权说明' onChange={(e) => {
+                  this.changeMapValue('vip', 'package', index, 'copyright_notes', e.target.value);
                 }} style={{ width: '200px' }} />,
               )}
             </Form.Item>

+ 2 - 2
front/project/h5/routes/page/open/page.js

@@ -13,7 +13,7 @@ const ServiceKeyMap = getMap(ServiceKey, 'value', 'label');
 export default class extends Page {
   initData() {
     const { id } = this.params;
-    My.getOrderRecord(id)
+    My.getRecord(id)
       .then(result => {
         this.setState(result);
       });
@@ -62,7 +62,7 @@ export default class extends Page {
         <div className="icon">
           <Assets name="img3" />
         </div>
-        <div className="title">您正在开通“{ServiceKeyMap[service]}”</div>
+        <div className="title">您正在开通“{ServiceKeyMap[service]}”服务</div>
         <div className="tip">有效期至:{formatDate(endTime, 'YYYY-MM-DD')}</div>
         {service === 'textbook' && <div className="check">
           <Checkbox checked={!!this.state.checked} onClick={() => {

+ 2 - 2
front/project/h5/routes/product/main/page.js

@@ -26,11 +26,11 @@ export default class extends Page {
       this.courseVsMap = getMap(list, 'vsType');
       this.setState({ vsList: list });
     });
-    Course.listVideo({ page: 1, size: 3 })
+    Course.listVideo({ page: 1, size: 4, order: 'saleNumber', direction: 'desc' })
       .then(result => {
         this.setState({ courseTop: result.list });
       });
-    Course.listData({ page: 1, size: 3 })
+    Course.listData({ page: 1, size: 4, order: 'saleNumber', direction: 'desc' })
       .then((result) => {
         this.setState({ dataTop: result.list });
       });

+ 5 - 0
front/project/h5/routes/product/serviceDetail/index.less

@@ -32,6 +32,11 @@
     .g-special-radio-group {
       margin-bottom: 15px;
     }
+
+    h3 {
+      font-size: 14px;
+      color: #303036;
+    }
   }
 
   .fixed {

+ 5 - 4
front/project/h5/routes/product/serviceDetail/page.js

@@ -18,7 +18,7 @@ export default class extends Page {
     Main.getService(service)
       .then(result => {
         result.package = (result.package || []).map((row, index) => {
-          row.label = row.title;
+          row.label = `¥${row.price}/${row.title}`;
           row.value = index;
           return row;
         });
@@ -35,6 +35,7 @@ export default class extends Page {
   //   expire_info: '',
   renderView() {
     const { data = {}, index } = this.state;
+    data.package = data.package || [];
     const item = data.package[index] || {};
     return (
       <div>
@@ -47,11 +48,11 @@ export default class extends Page {
           {data.package.length > 1 && <SpecialRadioGroup list={data.package} value={index} onChange={(value) => this.setState({ index: value })} />}
           {data.package.length > 1 && <div className="division" />}
           <div className="title">服务介绍</div>
-          <h2>服务</h2>
+          <h3>服务</h3>
           <p>{item.description} {item.expire_info}</p>
-          <h2>退款政策</h2>
+          <h3>退款政策</h3>
           <p>{item.refund_policy}</p>
-          <h2>版权说明</h2>
+          <h3>版权说明</h3>
           <p>{item.copyright_nnotes}</p>
         </div>
         <div className="fixed">

+ 10 - 2
front/project/h5/stores/my.js

@@ -280,11 +280,19 @@ export default class MyStore extends BaseStore {
   }
 
   /**
+   * 获取所有已购记录
+   * @param {*} param0
+   */
+  listRecord({ page, size }) {
+    return this.apiGet('/my/record/list', { page, size });
+  }
+
+  /**
    * 获取订单记录
    * @param {*} id
    */
-  getOrderRecord(id) {
-    return this.apiGet('/my/order/record', { id });
+  getRecord(id) {
+    return this.apiGet('/my/record/detail', { id });
   }
 
   /**

+ 7 - 0
server/data/src/main/java/com/qxgmat/data/dao/UserOrderCheckoutMapper.java

@@ -0,0 +1,7 @@
+package com.qxgmat.data.dao;
+
+import com.nuliji.tools.mybatis.Mapper;
+import com.qxgmat.data.dao.entity.UserOrderCheckout;
+
+public interface UserOrderCheckoutMapper extends Mapper<UserOrderCheckout> {
+}

+ 28 - 28
server/data/src/main/java/com/qxgmat/data/dao/entity/Pay.java

@@ -55,6 +55,12 @@ public class Pay implements Serializable {
     private String module;
 
     /**
+     * 模块扩展id
+     */
+    @Column(name = "`module_extend`")
+    private Integer moduleExtend;
+
+    /**
      * 商品标题
      */
     @Column(name = "`subject`")
@@ -109,12 +115,6 @@ public class Pay implements Serializable {
     private Date updateTime;
 
     /**
-     * 模块扩展信息
-     */
-    @Column(name = "`module_extend`")
-    private String moduleExtend;
-
-    /**
      * 支付传递的扩展参数
      */
     @Column(name = "`pay_info`")
@@ -269,6 +269,24 @@ public class Pay implements Serializable {
     }
 
     /**
+     * 获取模块扩展id
+     *
+     * @return module_extend - 模块扩展id
+     */
+    public Integer getModuleExtend() {
+        return moduleExtend;
+    }
+
+    /**
+     * 设置模块扩展id
+     *
+     * @param moduleExtend 模块扩展id
+     */
+    public void setModuleExtend(Integer moduleExtend) {
+        this.moduleExtend = moduleExtend;
+    }
+
+    /**
      * 获取商品标题
      *
      * @return subject - 商品标题
@@ -431,24 +449,6 @@ public class Pay implements Serializable {
     }
 
     /**
-     * 获取模块扩展信息
-     *
-     * @return module_extend - 模块扩展信息
-     */
-    public String getModuleExtend() {
-        return moduleExtend;
-    }
-
-    /**
-     * 设置模块扩展信息
-     *
-     * @param moduleExtend 模块扩展信息
-     */
-    public void setModuleExtend(String moduleExtend) {
-        this.moduleExtend = moduleExtend;
-    }
-
-    /**
      * 获取支付传递的扩展参数
      *
      * @return pay_info - 支付传递的扩展参数
@@ -498,6 +498,7 @@ public class Pay implements Serializable {
         sb.append(", clientIp=").append(clientIp);
         sb.append(", money=").append(money);
         sb.append(", module=").append(module);
+        sb.append(", moduleExtend=").append(moduleExtend);
         sb.append(", subject=").append(subject);
         sb.append(", body=").append(body);
         sb.append(", transactionNo=").append(transactionNo);
@@ -507,7 +508,6 @@ public class Pay implements Serializable {
         sb.append(", payType=").append(payType);
         sb.append(", createTime=").append(createTime);
         sb.append(", updateTime=").append(updateTime);
-        sb.append(", moduleExtend=").append(moduleExtend);
         sb.append(", payInfo=").append(payInfo);
         sb.append(", resultInfo=").append(resultInfo);
         sb.append("]");
@@ -604,11 +604,11 @@ public class Pay implements Serializable {
         }
 
         /**
-         * 设置模块扩展信息
+         * 设置模块扩展id
          *
-         * @param moduleExtend 模块扩展信息
+         * @param moduleExtend 模块扩展id
          */
-        public Builder moduleExtend(String moduleExtend) {
+        public Builder moduleExtend(Integer moduleExtend) {
             obj.setModuleExtend(moduleExtend);
             return this;
         }

+ 127 - 4
server/data/src/main/java/com/qxgmat/data/dao/entity/UserOrder.java

@@ -1,5 +1,6 @@
 package com.qxgmat.data.dao.entity;
 
+import com.alibaba.fastjson.JSONArray;
 import java.io.Serializable;
 import java.math.BigDecimal;
 import java.util.Date;
@@ -22,7 +23,7 @@ public class UserOrder implements Serializable {
      * 包含的订单类型:json
      */
     @Column(name = "`product_types`")
-    private String productTypes;
+    private JSONArray productTypes;
 
     /**
      * 支付方式
@@ -37,14 +38,32 @@ public class UserOrder implements Serializable {
     private BigDecimal money;
 
     /**
+     * 原价
+     */
+    @Column(name = "`origin_money`")
+    private BigDecimal originMoney;
+
+    /**
      * 开票费用
      */
     @Column(name = "`invoice_money`")
     private BigDecimal invoiceMoney;
 
+    @Column(name = "`pay_id`")
+    private String payId;
+
+    /**
+     * 支付状态
+     */
+    @Column(name = "`pay_status`")
+    private Integer payStatus;
+
     @Column(name = "`create_time`")
     private Date createTime;
 
+    @Column(name = "`pay_time`")
+    private Date payTime;
+
     private static final long serialVersionUID = 1L;
 
     /**
@@ -84,7 +103,7 @@ public class UserOrder implements Serializable {
      *
      * @return product_types - 包含的订单类型:json
      */
-    public String getProductTypes() {
+    public JSONArray getProductTypes() {
         return productTypes;
     }
 
@@ -93,7 +112,7 @@ public class UserOrder implements Serializable {
      *
      * @param productTypes 包含的订单类型:json
      */
-    public void setProductTypes(String productTypes) {
+    public void setProductTypes(JSONArray productTypes) {
         this.productTypes = productTypes;
     }
 
@@ -134,6 +153,24 @@ public class UserOrder implements Serializable {
     }
 
     /**
+     * 获取原价
+     *
+     * @return origin_money - 原价
+     */
+    public BigDecimal getOriginMoney() {
+        return originMoney;
+    }
+
+    /**
+     * 设置原价
+     *
+     * @param originMoney 原价
+     */
+    public void setOriginMoney(BigDecimal originMoney) {
+        this.originMoney = originMoney;
+    }
+
+    /**
      * 获取开票费用
      *
      * @return invoice_money - 开票费用
@@ -152,6 +189,38 @@ public class UserOrder implements Serializable {
     }
 
     /**
+     * @return pay_id
+     */
+    public String getPayId() {
+        return payId;
+    }
+
+    /**
+     * @param payId
+     */
+    public void setPayId(String payId) {
+        this.payId = payId;
+    }
+
+    /**
+     * 获取支付状态
+     *
+     * @return pay_status - 支付状态
+     */
+    public Integer getPayStatus() {
+        return payStatus;
+    }
+
+    /**
+     * 设置支付状态
+     *
+     * @param payStatus 支付状态
+     */
+    public void setPayStatus(Integer payStatus) {
+        this.payStatus = payStatus;
+    }
+
+    /**
      * @return create_time
      */
     public Date getCreateTime() {
@@ -165,6 +234,20 @@ public class UserOrder implements Serializable {
         this.createTime = createTime;
     }
 
+    /**
+     * @return pay_time
+     */
+    public Date getPayTime() {
+        return payTime;
+    }
+
+    /**
+     * @param payTime
+     */
+    public void setPayTime(Date payTime) {
+        this.payTime = payTime;
+    }
+
     @Override
     public String toString() {
         StringBuilder sb = new StringBuilder();
@@ -176,8 +259,12 @@ public class UserOrder implements Serializable {
         sb.append(", productTypes=").append(productTypes);
         sb.append(", payMethod=").append(payMethod);
         sb.append(", money=").append(money);
+        sb.append(", originMoney=").append(originMoney);
         sb.append(", invoiceMoney=").append(invoiceMoney);
+        sb.append(", payId=").append(payId);
+        sb.append(", payStatus=").append(payStatus);
         sb.append(", createTime=").append(createTime);
+        sb.append(", payTime=").append(payTime);
         sb.append("]");
         return sb.toString();
     }
@@ -216,7 +303,7 @@ public class UserOrder implements Serializable {
          *
          * @param productTypes 包含的订单类型:json
          */
-        public Builder productTypes(String productTypes) {
+        public Builder productTypes(JSONArray productTypes) {
             obj.setProductTypes(productTypes);
             return this;
         }
@@ -242,6 +329,16 @@ public class UserOrder implements Serializable {
         }
 
         /**
+         * 设置原价
+         *
+         * @param originMoney 原价
+         */
+        public Builder originMoney(BigDecimal originMoney) {
+            obj.setOriginMoney(originMoney);
+            return this;
+        }
+
+        /**
          * 设置开票费用
          *
          * @param invoiceMoney 开票费用
@@ -252,6 +349,24 @@ public class UserOrder implements Serializable {
         }
 
         /**
+         * @param payId
+         */
+        public Builder payId(String payId) {
+            obj.setPayId(payId);
+            return this;
+        }
+
+        /**
+         * 设置支付状态
+         *
+         * @param payStatus 支付状态
+         */
+        public Builder payStatus(Integer payStatus) {
+            obj.setPayStatus(payStatus);
+            return this;
+        }
+
+        /**
          * @param createTime
          */
         public Builder createTime(Date createTime) {
@@ -259,6 +374,14 @@ public class UserOrder implements Serializable {
             return this;
         }
 
+        /**
+         * @param payTime
+         */
+        public Builder payTime(Date payTime) {
+            obj.setPayTime(payTime);
+            return this;
+        }
+
         public UserOrder build() {
             return this.obj;
         }

+ 300 - 0
server/data/src/main/java/com/qxgmat/data/dao/entity/UserOrderCheckout.java

@@ -0,0 +1,300 @@
+package com.qxgmat.data.dao.entity;
+
+import java.io.Serializable;
+import java.util.Date;
+import javax.persistence.*;
+
+@Table(name = "user_order_checkout")
+public class UserOrderCheckout implements Serializable {
+    @Id
+    @Column(name = "`id`")
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Integer id;
+
+    /**
+     * 用户id
+     */
+    @Column(name = "`user_id`")
+    private Integer userId;
+
+    /**
+     * 关联订单
+     */
+    @Column(name = "`order_id`")
+    private Integer orderId;
+
+    /**
+     * 产品类型
+     */
+    @Column(name = "`product_type`")
+    private String productType;
+
+    /**
+     * 产品id
+     */
+    @Column(name = "`product_id`")
+    private Integer productId;
+
+    /**
+     * 服务
+     */
+    @Column(name = "`service`")
+    private String service;
+
+    /**
+     * 服务参数
+     */
+    @Column(name = "`param`")
+    private String param;
+
+    @Column(name = "`create_time`")
+    private Date createTime;
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * @return id
+     */
+    public Integer getId() {
+        return id;
+    }
+
+    /**
+     * @param id
+     */
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    /**
+     * 获取用户id
+     *
+     * @return user_id - 用户id
+     */
+    public Integer getUserId() {
+        return userId;
+    }
+
+    /**
+     * 设置用户id
+     *
+     * @param userId 用户id
+     */
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    /**
+     * 获取关联订单
+     *
+     * @return order_id - 关联订单
+     */
+    public Integer getOrderId() {
+        return orderId;
+    }
+
+    /**
+     * 设置关联订单
+     *
+     * @param orderId 关联订单
+     */
+    public void setOrderId(Integer orderId) {
+        this.orderId = orderId;
+    }
+
+    /**
+     * 获取产品类型
+     *
+     * @return product_type - 产品类型
+     */
+    public String getProductType() {
+        return productType;
+    }
+
+    /**
+     * 设置产品类型
+     *
+     * @param productType 产品类型
+     */
+    public void setProductType(String productType) {
+        this.productType = productType;
+    }
+
+    /**
+     * 获取产品id
+     *
+     * @return product_id - 产品id
+     */
+    public Integer getProductId() {
+        return productId;
+    }
+
+    /**
+     * 设置产品id
+     *
+     * @param productId 产品id
+     */
+    public void setProductId(Integer productId) {
+        this.productId = productId;
+    }
+
+    /**
+     * 获取服务
+     *
+     * @return service - 服务
+     */
+    public String getService() {
+        return service;
+    }
+
+    /**
+     * 设置服务
+     *
+     * @param service 服务
+     */
+    public void setService(String service) {
+        this.service = service;
+    }
+
+    /**
+     * 获取服务参数
+     *
+     * @return param - 服务参数
+     */
+    public String getParam() {
+        return param;
+    }
+
+    /**
+     * 设置服务参数
+     *
+     * @param param 服务参数
+     */
+    public void setParam(String param) {
+        this.param = param;
+    }
+
+    /**
+     * @return create_time
+     */
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    /**
+     * @param createTime
+     */
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append(getClass().getSimpleName());
+        sb.append(" [");
+        sb.append("Hash = ").append(hashCode());
+        sb.append(", id=").append(id);
+        sb.append(", userId=").append(userId);
+        sb.append(", orderId=").append(orderId);
+        sb.append(", productType=").append(productType);
+        sb.append(", productId=").append(productId);
+        sb.append(", service=").append(service);
+        sb.append(", param=").append(param);
+        sb.append(", createTime=").append(createTime);
+        sb.append("]");
+        return sb.toString();
+    }
+
+    public static UserOrderCheckout.Builder builder() {
+        return new UserOrderCheckout.Builder();
+    }
+
+    public static class Builder {
+        private UserOrderCheckout obj;
+
+        public Builder() {
+            this.obj = new UserOrderCheckout();
+        }
+
+        /**
+         * @param id
+         */
+        public Builder id(Integer id) {
+            obj.setId(id);
+            return this;
+        }
+
+        /**
+         * 设置用户id
+         *
+         * @param userId 用户id
+         */
+        public Builder userId(Integer userId) {
+            obj.setUserId(userId);
+            return this;
+        }
+
+        /**
+         * 设置关联订单
+         *
+         * @param orderId 关联订单
+         */
+        public Builder orderId(Integer orderId) {
+            obj.setOrderId(orderId);
+            return this;
+        }
+
+        /**
+         * 设置产品类型
+         *
+         * @param productType 产品类型
+         */
+        public Builder productType(String productType) {
+            obj.setProductType(productType);
+            return this;
+        }
+
+        /**
+         * 设置产品id
+         *
+         * @param productId 产品id
+         */
+        public Builder productId(Integer productId) {
+            obj.setProductId(productId);
+            return this;
+        }
+
+        /**
+         * 设置服务
+         *
+         * @param service 服务
+         */
+        public Builder service(String service) {
+            obj.setService(service);
+            return this;
+        }
+
+        /**
+         * 设置服务参数
+         *
+         * @param param 服务参数
+         */
+        public Builder param(String param) {
+            obj.setParam(param);
+            return this;
+        }
+
+        /**
+         * @param createTime
+         */
+        public Builder createTime(Date createTime) {
+            obj.setCreateTime(createTime);
+            return this;
+        }
+
+        public UserOrderCheckout build() {
+            return this.obj;
+        }
+    }
+}

+ 5 - 5
server/data/src/main/java/com/qxgmat/data/dao/mapping/PayMapper.xml

@@ -13,6 +13,7 @@
     <result column="client_ip" jdbcType="VARCHAR" property="clientIp" />
     <result column="money" jdbcType="DECIMAL" property="money" />
     <result column="module" jdbcType="VARCHAR" property="module" />
+    <result column="module_extend" jdbcType="INTEGER" property="moduleExtend" />
     <result column="subject" jdbcType="VARCHAR" property="subject" />
     <result column="body" jdbcType="VARCHAR" property="body" />
     <result column="transaction_no" jdbcType="VARCHAR" property="transactionNo" />
@@ -27,7 +28,6 @@
     <!--
       WARNING - @mbg.generated
     -->
-    <result column="module_extend" jdbcType="LONGVARCHAR" property="moduleExtend" />
     <result column="pay_info" jdbcType="LONGVARCHAR" property="payInfo" />
     <result column="result_info" jdbcType="LONGVARCHAR" property="resultInfo" />
   </resultMap>
@@ -35,14 +35,14 @@
     <!--
       WARNING - @mbg.generated
     -->
-    `id`, `no`, `user_id`, `channel`, `pid`, `client_ip`, `money`, `module`, `subject`, 
-    `body`, `transaction_no`, `currency`, `trade_status`, `pay_time`, `pay_type`, `create_time`, 
-    `update_time`
+    `id`, `no`, `user_id`, `channel`, `pid`, `client_ip`, `money`, `module`, `module_extend`, 
+    `subject`, `body`, `transaction_no`, `currency`, `trade_status`, `pay_time`, `pay_type`, 
+    `create_time`, `update_time`
   </sql>
   <sql id="Blob_Column_List">
     <!--
       WARNING - @mbg.generated
     -->
-    `module_extend`, `pay_info`, `result_info`
+    `pay_info`, `result_info`
   </sql>
 </mapper>

+ 23 - 0
server/data/src/main/java/com/qxgmat/data/dao/mapping/UserOrderCheckoutMapper.xml

@@ -0,0 +1,23 @@
+<?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="com.qxgmat.data.dao.UserOrderCheckoutMapper">
+  <resultMap id="BaseResultMap" type="com.qxgmat.data.dao.entity.UserOrderCheckout">
+    <!--
+      WARNING - @mbg.generated
+    -->
+    <id column="id" jdbcType="INTEGER" property="id" />
+    <result column="user_id" jdbcType="INTEGER" property="userId" />
+    <result column="order_id" jdbcType="INTEGER" property="orderId" />
+    <result column="product_type" jdbcType="VARCHAR" property="productType" />
+    <result column="product_id" jdbcType="INTEGER" property="productId" />
+    <result column="service" jdbcType="VARCHAR" property="service" />
+    <result column="param" jdbcType="VARCHAR" property="param" />
+    <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
+  </resultMap>
+  <sql id="Base_Column_List">
+    <!--
+      WARNING - @mbg.generated
+    -->
+    `id`, `user_id`, `order_id`, `product_type`, `product_id`, `service`, `param`, `create_time`
+  </sql>
+</mapper>

+ 7 - 2
server/data/src/main/java/com/qxgmat/data/dao/mapping/UserOrderMapper.xml

@@ -7,16 +7,21 @@
     -->
     <id column="id" jdbcType="INTEGER" property="id" />
     <result column="user_id" jdbcType="INTEGER" property="userId" />
-    <result column="product_types" jdbcType="VARCHAR" property="productTypes" />
+    <result column="product_types" jdbcType="VARCHAR" property="productTypes" typeHandler="com.nuliji.tools.mybatis.handler.JsonArrayHandler" />
     <result column="pay_method" jdbcType="VARCHAR" property="payMethod" />
     <result column="money" jdbcType="DECIMAL" property="money" />
+    <result column="origin_money" jdbcType="DECIMAL" property="originMoney" />
     <result column="invoice_money" jdbcType="DECIMAL" property="invoiceMoney" />
+    <result column="pay_id" jdbcType="VARCHAR" property="payId" />
+    <result column="pay_status" jdbcType="INTEGER" property="payStatus" />
     <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
+    <result column="pay_time" jdbcType="TIMESTAMP" property="payTime" />
   </resultMap>
   <sql id="Base_Column_List">
     <!--
       WARNING - @mbg.generated
     -->
-    `id`, `user_id`, `product_types`, `pay_method`, `money`, `invoice_money`, `create_time`
+    `id`, `user_id`, `product_types`, `pay_method`, `money`, `origin_money`, `invoice_money`, 
+    `pay_id`, `pay_status`, `create_time`, `pay_time`
   </sql>
 </mapper>

+ 4 - 0
server/data/src/main/resources/mybatis-generator.xml

@@ -166,5 +166,9 @@
             <columnOverride column="supply_list" javaType="com.alibaba.fastjson.JSONArray" jdbcType="VARCHAR" typeHandler="com.nuliji.tools.mybatis.handler.JsonArrayHandler"/>
             <columnOverride column="note_list" javaType="com.alibaba.fastjson.JSONArray" jdbcType="VARCHAR" typeHandler="com.nuliji.tools.mybatis.handler.JsonArrayHandler"/>
         </table>
+        <table schema="qianxing" tableName="user_order" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false" delimitAllColumns="true">
+            <generatedKey column="id" sqlStatement="Mysql" identity="true"/>
+            <columnOverride column="product_types" javaType="com.alibaba.fastjson.JSONArray" jdbcType="VARCHAR" typeHandler="com.nuliji.tools.mybatis.handler.JsonArrayHandler"/>
+        </table>
     </context>
 </generatorConfiguration>

+ 32 - 0
server/gateway-api/src/main/java/com/qxgmat/controller/api/CourseController.java

@@ -47,6 +47,9 @@ public class CourseController {
     private CourseTeacherService courseTeacherService;
 
     @Autowired
+    private CourseExperienceService courseExperienceService;
+
+    @Autowired
     private PreviewService previewService;
 
     @Autowired
@@ -173,6 +176,35 @@ public class CourseController {
         return ResponseHelp.success(courseData);
     }
 
+    @RequestMapping(value = "/teacher/list", method = RequestMethod.GET)
+    @ApiOperation(value = "资料列表", httpMethod = "GET")
+    public Response<List<CourseTeacher>> listTeacher(
+            @RequestParam(required = false) Integer courseId,
+            HttpSession session) {
+
+        List<CourseTeacher> p = courseTeacherService.allByCourse(courseId);
+
+        return ResponseHelp.success(p);
+    }
+
+    @RequestMapping(value = "/experience/list", method = RequestMethod.GET)
+    @ApiOperation(value = "心经列表", httpMethod = "GET")
+    public Response<PageMessage<CourseExperience>> listExperience(
+            @RequestParam(required = false, defaultValue = "1") int page,
+            @RequestParam(required = false, defaultValue = "100") int size,
+            @RequestParam(required = false) String prepareStatus,
+            @RequestParam(required = false) String prepareExaminationTime,
+            @RequestParam(required = false) String experienceScore,
+            @RequestParam(required = false) String experiencePercent,
+            @RequestParam(required = false, defaultValue = "id") String order,
+            @RequestParam(required = false, defaultValue = "desc") String direction,
+            HttpSession session) {
+
+        Page<CourseExperience> p = courseExperienceService.list(page, size, prepareStatus, prepareExaminationTime, experienceScore, experiencePercent, order, DirectionStatus.ValueOf(direction));
+
+        return ResponseHelp.success(p, page, size, p.getTotal());
+    }
+
     @RequestMapping(value = "/progress", method = RequestMethod.GET)
     @ApiOperation(value = "获取课程进度", notes = "获取所有课程及状态进度", httpMethod = "GET")
     public Response<List<UserCourseDetailDto>> progress()  {

+ 17 - 2
server/gateway-api/src/main/java/com/qxgmat/controller/api/MyController.java

@@ -903,7 +903,7 @@ public class MyController {
 
     @RequestMapping(value = "/report/list", method = RequestMethod.GET)
     @ApiOperation(value = "获取报告列表", notes = "获取报告列表", httpMethod = "GET")
-    public Response<PageMessage<UserPaperDto>> reportList(
+    public Response<PageMessage<UserPaperDto>> listReport(
             @RequestParam(required = false, defaultValue = "1") int page,
             @RequestParam(required = false, defaultValue = "100") int size,
             @RequestParam(required = true) String origin,
@@ -985,7 +985,22 @@ public class MyController {
         return ResponseHelp.success(true);
     }
 
-    @RequestMapping(value = "/order/record", method = RequestMethod.GET)
+    @RequestMapping(value = "/record/list", method = RequestMethod.GET)
+    @ApiOperation(value = "获取订单记录列表", notes = "获取订单记录列表", httpMethod = "GET")
+    public Response<PageMessage<UserOrderRecord>> listRecord(
+            @RequestParam(required = false, defaultValue = "1") int page,
+            @RequestParam(required = false, defaultValue = "100") int size,
+            @RequestParam(required = false, defaultValue = "id") String order,
+            @RequestParam(required = false, defaultValue = "desc") String direction,
+            HttpSession session)  {
+        User user = (User) shiroHelp.getLoginUser();
+
+        Page<UserOrderRecord> p = userOrderRecordService.list(page, size, user.getId(), order, DirectionStatus.ValueOf(direction));
+
+        return ResponseHelp.success(p, page, size, p.getTotal());
+    }
+
+    @RequestMapping(value = "/record/detail", method = RequestMethod.GET)
     @ApiOperation(value = "获取订单记录", notes = "获取订单记录", httpMethod = "GET")
     public Response<UserOrderRecord> getOrderRecord(
             @RequestParam(required = true) Integer id

+ 128 - 0
server/gateway-api/src/main/java/com/qxgmat/controller/api/OrderController.java

@@ -0,0 +1,128 @@
+package com.qxgmat.controller.api;
+
+import com.alibaba.fastjson.JSONObject;
+import com.nuliji.tools.Response;
+import com.nuliji.tools.ResponseHelp;
+import com.nuliji.tools.exception.ParameterException;
+import com.nuliji.tools.pay.data.PayResponseData;
+import com.qxgmat.data.constants.enums.trade.PayChannel;
+import com.qxgmat.data.dao.entity.*;
+import com.qxgmat.dto.request.PayOrderDto;
+import com.qxgmat.dto.request.RecordAddDto;
+import com.qxgmat.help.ShiroHelp;
+import com.qxgmat.service.extend.TradeService;
+import com.qxgmat.service.inline.*;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.math.BigDecimal;
+
+@RestController
+@RequestMapping("/api/order")
+@Api(tags = "订单接口", description = "订单相关接口", produces = MediaType.APPLICATION_JSON_VALUE)
+public class OrderController {
+
+    @Autowired
+    private ShiroHelp shiroHelp;
+
+    @Autowired
+    private SettingService settingService;
+
+    @Autowired
+    private TradeService tradeService;
+
+    @Autowired
+    private PayService payService;
+
+    @Autowired
+    private UserOrderService userOrderService;
+
+    @Autowired
+    private UserOrderRecordService userOrderRecordService;
+
+    @Autowired
+    private UserOrderCheckoutService userOrderCheckoutService;
+
+    @RequestMapping(value = "/checkout/all", method = RequestMethod.GET)
+    @ApiOperation(value = "全部购物车", notes = "全部购物车", httpMethod = "GET")
+    public Response<List<>> allCheckout(HttpServletRequest request) throws Exception {
+        User user = (User) shiroHelp.getLoginUser();
+        PayResponseData data = tradeService.pay(user.getId(), "", "", dto.getModule(), JSONObject.parseObject(JSONObject.toJSONString(dto.getModuleExtend())), BigDecimal.valueOf(0), PayChannel.WECHAT_QR, request);
+        return ResponseHelp.success(data);
+    }
+
+    @RequestMapping(value = "/checkout/add", method = RequestMethod.POST)
+    @ApiOperation(value = "添加购物车", notes = "添加购物车", httpMethod = "POST")
+    public Response<PayResponseData> addCheckout(@RequestBody @Validated RecordAddDto dto, HttpServletRequest request) throws Exception {
+        User user = (User) shiroHelp.getLoginUser();
+        PayResponseData data = tradeService.pay(user.getId(), "", "", dto.getModule(), JSONObject.parseObject(JSONObject.toJSONString(dto.getModuleExtend())), BigDecimal.valueOf(0), PayChannel.WECHAT_QR, request);
+        return ResponseHelp.success(data);
+    }
+
+    @RequestMapping(value = "/checkout/delete", method = RequestMethod.DELETE)
+    @ApiOperation(value = "删除购物车", notes = "删除购物车", httpMethod = "DELETE")
+    public Response<PayResponseData> deleteCheckout(@RequestParam int id, HttpServletRequest request) throws Exception {
+        User user = (User) shiroHelp.getLoginUser();
+        PayResponseData data = tradeService.pay(user.getId(), "", "", dto.getModule(), JSONObject.parseObject(JSONObject.toJSONString(dto.getModuleExtend())), BigDecimal.valueOf(0), PayChannel.WECHAT_QR, request);
+        return ResponseHelp.success(data);
+    }
+
+    @RequestMapping(value = "/pay/confirm", method = RequestMethod.POST)
+    @ApiOperation(value = "确认支付", notes = "确认支付", httpMethod = "POST")
+    public Response<PayResponseData> addCheckout(@RequestBody @Validated RecordAddDto dto, HttpServletRequest request) throws Exception {
+        User user = (User) shiroHelp.getLoginUser();
+        PayResponseData data = tradeService.pay(user.getId(), "", "", dto.getModule(), JSONObject.parseObject(JSONObject.toJSONString(dto.getModuleExtend())), BigDecimal.valueOf(0), PayChannel.WECHAT_QR, request);
+        return ResponseHelp.success(data);
+    }
+
+    @RequestMapping(value = "/pay/speed", method = RequestMethod.POST)
+    @ApiOperation(value = "确认支付", notes = "确认支付", httpMethod = "POST")
+    public Response<PayResponseData> addCheckout(@RequestBody @Validated RecordAddDto dto, HttpServletRequest request) throws Exception {
+        User user = (User) shiroHelp.getLoginUser();
+        PayResponseData data = tradeService.pay(user.getId(), "", "", dto.getModule(), JSONObject.parseObject(JSONObject.toJSONString(dto.getModuleExtend())), BigDecimal.valueOf(0), PayChannel.WECHAT_QR, request);
+        return ResponseHelp.success(data);
+    }
+
+    @RequestMapping(value = "/pay/wechat_qr", method = RequestMethod.POST)
+    @ApiOperation(value = "通过微信二维码支付", notes = "通过微信二维码支付", httpMethod = "POST")
+    public Response<PayResponseData> wechatQr(@RequestBody @Validated PayOrderDto dto, HttpServletRequest request) throws Exception {
+        User user = (User) shiroHelp.getLoginUser();
+        PayResponseData data = tradeService.pay(user.getId(), "", "", dto.getModule(), JSONObject.parseObject(JSONObject.toJSONString(dto.getModuleExtend())), BigDecimal.valueOf(0), PayChannel.WECHAT_QR, request);
+        return ResponseHelp.success(data);
+    }
+
+    @RequestMapping(value = "/pay/wechat_js", method = RequestMethod.POST)
+    @ApiOperation(value = "通过微信内支付", notes = "通过微信内支付", httpMethod = "POST")
+    public Response<PayResponseData> wechatJs(@RequestBody @Validated PayOrderDto dto, HttpServletRequest request) throws Exception {
+        User user = (User) shiroHelp.getLoginUser();
+        PayResponseData data = tradeService.pay(user.getId(), "", "", dto.getModule(), JSONObject.parseObject(JSONObject.toJSONString(dto.getModuleExtend())), BigDecimal.valueOf(0), PayChannel.WECHAT_JS, request);
+        return ResponseHelp.success(data);
+    }
+
+    @RequestMapping(value = "/pay/alipay_qr", method = RequestMethod.POST)
+    @ApiOperation(value = "通过支付宝二维码支付", notes = "通过支付宝二维码支付", httpMethod = "POST")
+    public Response<PayResponseData> alipayQr(@RequestBody @Validated PayOrderDto dto, HttpServletRequest request) throws Exception {
+        User user = (User) shiroHelp.getLoginUser();
+        PayResponseData data = tradeService.pay(user.getId(), "", "", dto.getModule(), JSONObject.parseObject(JSONObject.toJSONString(dto.getModuleExtend())), BigDecimal.valueOf(0), PayChannel.ALIPAY_QR, request);
+        return ResponseHelp.success(data);
+    }
+
+    @RequestMapping(value = "/pay/query", method = RequestMethod.GET)
+    @ApiOperation(value = "支付结果查询", notes = "支付结果查询", httpMethod = "GET")
+    public Response<Boolean> response(
+            @RequestParam(required = true, name="id") Long payId
+    ) {
+        Pay pay = payService.get(payId);
+        User user = (User) shiroHelp.getLoginUser();
+
+        if (!pay.getUserId().equals(user.getId())){
+            throw new ParameterException("支付信息不存在");
+        }
+        return ResponseHelp.success(payService.isPayed(pay));
+    }
+}

+ 0 - 91
server/gateway-api/src/main/java/com/qxgmat/controller/api/ShopController.java

@@ -1,91 +0,0 @@
-package com.qxgmat.controller.api;
-
-import com.alibaba.fastjson.JSONObject;
-import com.nuliji.tools.Response;
-import com.nuliji.tools.ResponseHelp;
-import com.nuliji.tools.exception.ParameterException;
-import com.nuliji.tools.pay.data.PayRequestData;
-import com.nuliji.tools.pay.data.PayResponseData;
-import com.qxgmat.data.constants.enums.SettingKey;
-import com.qxgmat.data.constants.enums.trade.PayChannel;
-import com.qxgmat.data.dao.entity.*;
-import com.qxgmat.dto.request.PayProductDto;
-import com.qxgmat.help.ShiroHelp;
-import com.qxgmat.service.extend.TradeService;
-import com.qxgmat.service.inline.*;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.MediaType;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpSession;
-import java.math.BigDecimal;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-@RestController
-@RequestMapping("/api/base")
-@Api(tags = "商城接口", description = "商城相关接口", produces = MediaType.APPLICATION_JSON_VALUE)
-public class ShopController {
-
-    @Autowired
-    private ShiroHelp shiroHelp;
-
-    @Autowired
-    private SettingService settingService;
-
-    @Autowired
-    private TradeService tradeService;
-
-    @Autowired
-    private PayService payService;
-
-    @RequestMapping(value = "/list", method = RequestMethod.GET)
-    @ApiOperation(value = "商品信息", httpMethod = "GET")
-    private Response<JSONObject> index(){
-        Setting entity = settingService.getByKey(SettingKey.INDEX);
-        return ResponseHelp.success(entity.getValue());
-    }
-
-    @RequestMapping(value = "/pay/wechat_qr", method = RequestMethod.POST)
-    @ApiOperation(value = "通过微信二维码支付", notes = "通过微信二维码支付", httpMethod = "POST")
-    public Response<PayResponseData> wechatQr(@RequestBody @Validated PayProductDto dto, HttpServletRequest request) throws Exception {
-        User user = (User) shiroHelp.getLoginUser();
-        PayResponseData data = tradeService.pay(user.getId(), "", "", dto.getModule(), JSONObject.parseObject(JSONObject.toJSONString(dto.getModuleExtend())), BigDecimal.valueOf(0), PayChannel.WECHAT_QR, request);
-        return ResponseHelp.success(data);
-    }
-
-    @RequestMapping(value = "/pay/wechat_js", method = RequestMethod.POST)
-    @ApiOperation(value = "通过微信内支付", notes = "通过微信内支付", httpMethod = "POST")
-    public Response<PayResponseData> wechatJs(@RequestBody @Validated PayProductDto dto, HttpServletRequest request) throws Exception {
-        User user = (User) shiroHelp.getLoginUser();
-        PayResponseData data = tradeService.pay(user.getId(), "", "", dto.getModule(), JSONObject.parseObject(JSONObject.toJSONString(dto.getModuleExtend())), BigDecimal.valueOf(0), PayChannel.WECHAT_JS, request);
-        return ResponseHelp.success(data);
-    }
-
-    @RequestMapping(value = "/pay/alipay_qr", method = RequestMethod.POST)
-    @ApiOperation(value = "通过支付宝二维码支付", notes = "通过支付宝二维码支付", httpMethod = "POST")
-    public Response<PayResponseData> alipayQr(@RequestBody @Validated PayProductDto dto, HttpServletRequest request) throws Exception {
-        User user = (User) shiroHelp.getLoginUser();
-        PayResponseData data = tradeService.pay(user.getId(), "", "", dto.getModule(), JSONObject.parseObject(JSONObject.toJSONString(dto.getModuleExtend())), BigDecimal.valueOf(0), PayChannel.ALIPAY_QR, request);
-        return ResponseHelp.success(data);
-    }
-
-    @RequestMapping(value = "/pay/query", method = RequestMethod.GET)
-    @ApiOperation(value = "支付结果查询", notes = "支付结果查询", httpMethod = "GET")
-    public Response<Boolean> response(
-            @RequestParam(required = true, name="id") Long payId
-    ) {
-        Pay pay = payService.get(payId);
-        User user = (User) shiroHelp.getLoginUser();
-
-        if (!pay.getUserId().equals(user.getId())){
-            throw new ParameterException("支付信息不存在");
-        }
-        return ResponseHelp.success(payService.isPayed(pay));
-    }
-}

+ 14 - 0
server/gateway-api/src/main/java/com/qxgmat/dto/request/PayOrderDto.java

@@ -0,0 +1,14 @@
+package com.qxgmat.dto.request;
+
+public class PayOrderDto {
+
+    private Integer orderId;
+
+    public Integer getOrderId() {
+        return orderId;
+    }
+
+    public void setOrderId(Integer orderId) {
+        this.orderId = orderId;
+    }
+}

+ 0 - 26
server/gateway-api/src/main/java/com/qxgmat/dto/request/PayProductDto.java

@@ -1,26 +0,0 @@
-package com.qxgmat.dto.request;
-
-import com.alibaba.fastjson.JSONObject;
-
-public class PayProductDto {
-
-    private String module;
-
-    private Object moduleExtend;
-
-    public String getModule() {
-        return module;
-    }
-
-    public void setModule(String module) {
-        this.module = module;
-    }
-
-    public Object getModuleExtend() {
-        return moduleExtend;
-    }
-
-    public void setModuleExtend(Object moduleExtend) {
-        this.moduleExtend = moduleExtend;
-    }
-}

+ 12 - 0
server/gateway-api/src/main/java/com/qxgmat/dto/request/RecordAddDto.java

@@ -0,0 +1,12 @@
+package com.qxgmat.dto.request;
+
+public class RecordAddDto {
+    private String productType;
+
+    private Integer productId;
+
+    private String service;
+
+    private String param;
+
+}

+ 38 - 0
server/gateway-api/src/main/java/com/qxgmat/service/inline/CourseExperienceService.java

@@ -53,6 +53,44 @@ public class CourseExperienceService extends AbstractService {
         return select(courseExperienceMapper, example, page, size);
     }
 
+    public Page<CourseExperience> list(int page, int size, String prepareStatus, String prepareExaminationTime, String experienceScore, String experiencePercent, String order, DirectionStatus direction){
+        Example example = new Example(CourseExperience.class);
+        if(prepareStatus != null){
+            example.and(
+                    example.createCriteria()
+                            .andEqualTo("prepareStatus", prepareStatus)
+            );
+        }
+        if(prepareExaminationTime != null){
+            example.and(
+                    example.createCriteria()
+                            .andEqualTo("prepareExaminationTime", prepareExaminationTime)
+            );
+        }
+        if(experienceScore != null){
+            example.and(
+                    example.createCriteria()
+                            .andEqualTo("experienceScore", experienceScore)
+            );
+        }
+        if(experiencePercent != null){
+            example.and(
+                    example.createCriteria()
+                            .andEqualTo("experiencePercent", experiencePercent)
+            );
+        }
+        if(order == null || order.isEmpty()) order = "id";
+        switch(direction){
+            case ASC:
+                example.orderBy(order).asc();
+                break;
+            case DESC:
+            default:
+                example.orderBy(order).desc();
+        }
+        return select(courseExperienceMapper, example, page, size);
+    }
+
     public CourseExperience add(CourseExperience courseData){
         int result = insert(courseExperienceMapper, courseData);
         courseData = one(courseExperienceMapper, courseData.getId());

+ 11 - 0
server/gateway-api/src/main/java/com/qxgmat/service/inline/CourseTeacherService.java

@@ -37,6 +37,17 @@ public class CourseTeacherService extends AbstractService {
         return select(courseTeacherMapper, example, page, size);
     }
 
+    public List<CourseTeacher> allByCourse(Integer courseId){
+        Example example = new Example(CourseTeacher.class);
+        if(courseId != null){
+            example.and(
+                    example.createCriteria()
+                            .andEqualTo("courseId", courseId)
+            );
+        }
+        return select(courseTeacherMapper, example);
+    }
+
     public CourseTeacher add(CourseTeacher courseData){
         int result = insert(courseTeacherMapper, courseData);
         courseData = one(courseTeacherMapper, courseData.getId());

+ 80 - 0
server/gateway-api/src/main/java/com/qxgmat/service/inline/UserOrderCheckoutService.java

@@ -0,0 +1,80 @@
+package com.qxgmat.service.inline;
+
+import com.github.pagehelper.Page;
+import com.nuliji.tools.AbstractService;
+import com.nuliji.tools.exception.ParameterException;
+import com.nuliji.tools.exception.SystemException;
+import com.nuliji.tools.mybatis.Example;
+import com.qxgmat.data.constants.enums.ServiceKey;
+import com.qxgmat.data.constants.enums.module.CourseModule;
+import com.qxgmat.data.constants.enums.module.ProductType;
+import com.qxgmat.data.constants.enums.status.DirectionStatus;
+import com.qxgmat.data.dao.UserOrderCheckoutMapper;
+import com.qxgmat.data.dao.UserOrderRecordMapper;
+import com.qxgmat.data.dao.entity.UserOrderCheckout;
+import com.qxgmat.data.dao.entity.UserOrderRecord;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.Collection;
+import java.util.Date;
+import java.util.List;
+
+@Service
+public class UserOrderCheckoutService extends AbstractService {
+    private static final Logger logger = LoggerFactory.getLogger(UserOrderCheckoutService.class);
+
+    @Resource
+    private UserOrderCheckoutMapper userOrderCheckoutMapper;
+
+    public UserOrderCheckout add(UserOrderCheckout record){
+        int result = insert(userOrderCheckoutMapper, record);
+        record = one(userOrderCheckoutMapper, record.getId());
+        if(record == null){
+            throw new SystemException("服务记录添加失败");
+        }
+        return record;
+    }
+
+    public UserOrderCheckout edit(UserOrderCheckout service){
+        UserOrderCheckout in = one(userOrderCheckoutMapper, service.getId());
+        if(in == null){
+            throw new ParameterException("服务记录不存在");
+        }
+        int result = update(userOrderCheckoutMapper, service);
+        return service;
+    }
+
+    public boolean delete(Number id){
+        UserOrderCheckout in = one(userOrderCheckoutMapper, id);
+        if(in == null){
+            throw new ParameterException("服务记录不存在");
+        }
+        int result = delete(userOrderCheckoutMapper, id);
+        return result > 0;
+    }
+
+    public UserOrderCheckout get(Number id){
+        UserOrderCheckout in = one(userOrderCheckoutMapper, id);
+
+        if(in == null){
+            throw new ParameterException("服务记录不存在");
+        }
+        return in;
+    }
+
+    public Page<UserOrderCheckout> select(int page, int pageSize){
+        return select(userOrderCheckoutMapper, page, pageSize);
+    }
+
+    public Page<UserOrderCheckout> select(Integer[] ids){
+        return page(()->select(userOrderCheckoutMapper, ids), 1, ids.length);
+    }
+
+    public List<UserOrderCheckout> select(Collection ids){
+        return select(userOrderCheckoutMapper, ids);
+    }
+
+}

+ 29 - 0
server/gateway-api/src/main/java/com/qxgmat/service/inline/UserOrderRecordService.java

@@ -8,6 +8,7 @@ import com.nuliji.tools.mybatis.Example;
 import com.qxgmat.data.constants.enums.ServiceKey;
 import com.qxgmat.data.constants.enums.module.CourseModule;
 import com.qxgmat.data.constants.enums.module.ProductType;
+import com.qxgmat.data.constants.enums.status.DirectionStatus;
 import com.qxgmat.data.dao.UserOrderRecordMapper;
 import com.qxgmat.data.dao.entity.UserOrder;
 import com.qxgmat.data.dao.entity.UserOrderRecord;
@@ -26,6 +27,32 @@ public class UserOrderRecordService extends AbstractService {
     private UserOrderRecordMapper userOrderRecordMapper;
 
     /**
+     * 获取已购买记录
+     * @param order
+     * @param direction
+     * @return
+     */
+    public Page<UserOrderRecord> list(int page, int size, Integer userId, String order, DirectionStatus direction){
+        Example example = new Example(UserOrderRecord.class);
+        example.and(
+                example.createCriteria()
+                        .andEqualTo("userId", userId)
+                        .andEqualTo("isStop", 0)
+        );
+
+        if(order == null || order.isEmpty()) order = "id";
+        switch(direction){
+            case ASC:
+                example.orderBy(order).asc();
+                break;
+            case DESC:
+            default:
+                example.orderBy(order).desc();
+        }
+        return select(userOrderRecordMapper, example, page, size);
+    }
+
+    /**
      * 获取未使用的购买信息:根据模块
      * @param userId
      * @param productType
@@ -38,6 +65,7 @@ public class UserOrderRecordService extends AbstractService {
                         .andEqualTo("userId", userId)
                         .andEqualTo("productType", productType.key)
                         .andEqualTo("isUsed", 0)
+                        .andEqualTo("isStop", 0)
         );
         return select(userOrderRecordMapper, example);
     }
@@ -56,6 +84,7 @@ public class UserOrderRecordService extends AbstractService {
                         .andEqualTo("service", key.key)
                         .andGreaterThanOrEqualTo("startTime", new Date())
                         .andLessThan("endTime", new Date())
+                        .andEqualTo("isStop", 0)
         );
         example.orderBy("startTime").asc();
         UserOrderRecord record = one(userOrderRecordMapper, example);