From a634fb040f5414a127df967321d4465f03720950 Mon Sep 17 00:00:00 2001
From: luo <2855143437@qq.com>
Date: 星期六, 23 九月 2023 17:32:14 +0800
Subject: [PATCH] 学员4

---
 cloud-server-management/src/main/webapp/WEB-INF/view/system/coursePackage/TCouponEdit.html                |   80 +
 cloud-server-management/src/main/java/com/dsh/course/util/ChineseMoneyUtils.java                          |  104 ++
 cloud-server-management/src/main/java/com/dsh/course/model/MoneyBack.java                                 |   22 
 cloud-server-course/src/main/java/com/dsh/course/mapper/MoneyBackMapper.java                              |    8 
 cloud-server-management/src/main/java/com/dsh/course/model/dto/InsertBackDto.java                         |    9 
 cloud-server-management/src/main/webapp/static/modular/system/tStudent/htmlToPdf.js                       |   66 +
 cloud-server-course/src/main/java/com/dsh/course/entity/InsertBackDto.java                                |    9 
 cloud-server-other/src/main/java/com/dsh/other/model/dto/siteDto/SelectDto.java                           |    9 
 cloud-server-other/src/main/java/com/dsh/other/model/dto/siteDto/GiftSearchDto.java                       |    9 
 cloud-server-course/src/main/java/com/dsh/course/mapper/CourseCounsumMapper.java                          |    8 
 cloud-server-management/src/main/webapp/WEB-INF/view/system/tCoupon/tCoupon_add.html                      |   56 +
 cloud-server-course/src/main/java/com/dsh/course/entity/MoneyBack.java                                    |   28 
 cloud-server-management/src/main/java/com/dsh/guns/modular/system/util/BigDecimalToChineseAmountUtil.java |   80 +
 cloud-server-account/src/main/java/com/dsh/account/entity/GiftSearchDto.java                              |   11 
 cloud-server-course/src/main/java/com/dsh/course/service/CourseCounsumService.java                        |    9 
 cloud-server-management/src/main/webapp/WEB-INF/view/system/tCoupon/tCoupon_edit.html                     |   56 +
 cloud-server-course/src/main/java/com/dsh/course/entity/CourseCounsum.java                                |   28 
 .idea/workspace.xml                                                                                       |   14 
 cloud-server-management/src/main/java/com/dsh/course/util/HtmlToPdfUtils.java                             |   53 +
 cloud-server-management/src/main/webapp/static/modular/system/coursePackage/TCoupon.js                    |  337 ++++++++
 cloud-server-course/src/main/java/com/dsh/course/entity/dto/ConsumeQuery.java                             |   18 
 cloud-server-course/src/main/java/com/dsh/course/service/impl/CourseCounsumServiceImpl.java               |   14 
 cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/dto/ToHoliDto.java                |   13 
 cloud-server-management/src/main/webapp/WEB-INF/view/system/tStudent/banckmoney.html                      |  347 ++++++++
 cloud-server-management/src/main/webapp/WEB-INF/view/system/tStudent/trans.html                           |  128 +++
 cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/dto/GiftSearchDto.java            |   11 
 cloud-server-management/src/main/webapp/WEB-INF/view/system/coursePackage/TCoupon.html                    |   80 +
 cloud-server-course/src/main/java/com/dsh/course/service/impl/MoneyBackServiceImpl.java                   |   14 
 cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/dto/ConsumeQuery.java             |   19 
 cloud-server-management/src/main/webapp/static/modular/system/coursePackage/TCouponEdit.js                |  314 +++++++
 cloud-server-course/src/main/java/com/dsh/course/service/MoneyBackService.java                            |    9 
 cloud-server-course/src/main/java/com/dsh/course/entity/dto/ToHoliDto.java                                |   13 
 cloud-server-management/src/main/webapp/WEB-INF/view/system/tStudent/classelct.html                       |  283 ++++++
 cloud-server-course/src/main/java/com/dsh/course/model/dto/ToClassDto.java                                |    9 
 cloud-server-management/src/main/webapp/WEB-INF/view/system/tStudent/tStudentEditTTT.html                 |  136 +++
 cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/CourseCounsum.java                |   19 
 cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/dto/HoliSelect.java               |    5 
 cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/dto/ToClassDto.java               |   10 
 38 files changed, 2,436 insertions(+), 2 deletions(-)

diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index 44f2970..3dda1b2 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -272,6 +272,7 @@
       <workItem from="1695255303249" duration="37521000" />
       <workItem from="1695342171677" duration="37810000" />
       <workItem from="1695430054273" duration="24454000" />
+      <workItem from="1695461202457" duration="322000" />
     </task>
     <task id="LOCAL-00001" summary="后台代码删除">
       <created>1690249807612</created>
@@ -380,7 +381,15 @@
       <option name="project" value="LOCAL" />
       <updated>1695461057360</updated>
     </task>
-    <option name="localTasksCounter" value="16" />
+    <task id="LOCAL-00016" summary="学员2">
+      <option name="closed" value="true" />
+      <created>1695461216122</created>
+      <option name="number" value="00016" />
+      <option name="presentableId" value="LOCAL-00016" />
+      <option name="project" value="LOCAL" />
+      <updated>1695461216122</updated>
+    </task>
+    <option name="localTasksCounter" value="17" />
     <servers />
   </component>
   <component name="TypeScriptGeneratedFilesManager">
@@ -402,7 +411,8 @@
     <MESSAGE value="后台代码" />
     <MESSAGE value="9.15" />
     <MESSAGE value="学员" />
-    <option name="LAST_COMMIT_MESSAGE" value="学员" />
+    <MESSAGE value="学员2" />
+    <option name="LAST_COMMIT_MESSAGE" value="学员2" />
   </component>
   <component name="XDebuggerManager">
     <breakpoint-manager>
diff --git a/cloud-server-account/src/main/java/com/dsh/account/entity/GiftSearchDto.java b/cloud-server-account/src/main/java/com/dsh/account/entity/GiftSearchDto.java
new file mode 100644
index 0000000..712302d
--- /dev/null
+++ b/cloud-server-account/src/main/java/com/dsh/account/entity/GiftSearchDto.java
@@ -0,0 +1,11 @@
+package com.dsh.account.entity;
+
+import io.swagger.models.auth.In;
+import lombok.Data;
+
+@Data
+public class GiftSearchDto {
+    String name;
+    String phone;
+    Integer id;
+}
diff --git a/cloud-server-course/src/main/java/com/dsh/course/entity/CourseCounsum.java b/cloud-server-course/src/main/java/com/dsh/course/entity/CourseCounsum.java
new file mode 100644
index 0000000..0725d67
--- /dev/null
+++ b/cloud-server-course/src/main/java/com/dsh/course/entity/CourseCounsum.java
@@ -0,0 +1,28 @@
+package com.dsh.course.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.models.auth.In;
+import lombok.Data;
+
+import java.util.Date;
+
+
+@Data
+@TableName("t_course_consum")
+public class CourseCounsum {
+    @TableId(value = "id", type = IdType.AUTO)
+    Integer id;
+    @TableField("changeType")
+    Integer changeType;
+    @TableField("num")
+    Integer num;
+    @TableField("reason")
+    String reason;
+    @TableField("paymentId")
+    Long paymentId;
+    @TableField("insertTime")
+    Date insertTime;
+}
diff --git a/cloud-server-course/src/main/java/com/dsh/course/entity/InsertBackDto.java b/cloud-server-course/src/main/java/com/dsh/course/entity/InsertBackDto.java
new file mode 100644
index 0000000..8fc3e85
--- /dev/null
+++ b/cloud-server-course/src/main/java/com/dsh/course/entity/InsertBackDto.java
@@ -0,0 +1,9 @@
+package com.dsh.course.entity;
+
+import lombok.Data;
+
+@Data
+public class InsertBackDto {
+    Integer id;
+    String ids;
+}
diff --git a/cloud-server-course/src/main/java/com/dsh/course/entity/MoneyBack.java b/cloud-server-course/src/main/java/com/dsh/course/entity/MoneyBack.java
new file mode 100644
index 0000000..1ce9e05
--- /dev/null
+++ b/cloud-server-course/src/main/java/com/dsh/course/entity/MoneyBack.java
@@ -0,0 +1,28 @@
+package com.dsh.course.entity;
+
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+@TableName("t_back_money")
+public class MoneyBack {
+    @TableId(value = "id", type = IdType.AUTO)
+    Integer id;
+    @TableField("ids")
+    String ids;
+    @TableField("studentId")
+    Integer studentId;
+    @TableField("status")
+    Integer status;
+    @TableField("insertTime")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    Date insertTime;
+
+}
diff --git a/cloud-server-course/src/main/java/com/dsh/course/entity/dto/ConsumeQuery.java b/cloud-server-course/src/main/java/com/dsh/course/entity/dto/ConsumeQuery.java
new file mode 100644
index 0000000..ea49194
--- /dev/null
+++ b/cloud-server-course/src/main/java/com/dsh/course/entity/dto/ConsumeQuery.java
@@ -0,0 +1,18 @@
+package com.dsh.course.entity.dto;
+
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class ConsumeQuery {
+
+
+    Date start;
+    Date end;
+    Integer changeType;
+
+    String reason;
+
+    Integer payId;
+}
diff --git a/cloud-server-course/src/main/java/com/dsh/course/entity/dto/ToHoliDto.java b/cloud-server-course/src/main/java/com/dsh/course/entity/dto/ToHoliDto.java
new file mode 100644
index 0000000..09e6ceb
--- /dev/null
+++ b/cloud-server-course/src/main/java/com/dsh/course/entity/dto/ToHoliDto.java
@@ -0,0 +1,13 @@
+package com.dsh.course.entity.dto;
+
+import io.swagger.models.auth.In;
+import lombok.Data;
+
+import java.util.List;
+@Data
+public class ToHoliDto {
+    Integer id;
+    Integer classId;
+    Integer classNum;
+    String[] ids;
+}
diff --git a/cloud-server-course/src/main/java/com/dsh/course/mapper/CourseCounsumMapper.java b/cloud-server-course/src/main/java/com/dsh/course/mapper/CourseCounsumMapper.java
new file mode 100644
index 0000000..228421f
--- /dev/null
+++ b/cloud-server-course/src/main/java/com/dsh/course/mapper/CourseCounsumMapper.java
@@ -0,0 +1,8 @@
+package com.dsh.course.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.dsh.course.entity.CourseCounsum;
+import com.dsh.course.entity.CoursePackagePaymentConfig;
+
+public interface CourseCounsumMapper extends BaseMapper<CourseCounsum> {
+}
diff --git a/cloud-server-course/src/main/java/com/dsh/course/mapper/MoneyBackMapper.java b/cloud-server-course/src/main/java/com/dsh/course/mapper/MoneyBackMapper.java
new file mode 100644
index 0000000..328996c
--- /dev/null
+++ b/cloud-server-course/src/main/java/com/dsh/course/mapper/MoneyBackMapper.java
@@ -0,0 +1,8 @@
+package com.dsh.course.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.dsh.course.entity.CourseCounsum;
+import com.dsh.course.entity.MoneyBack;
+
+public interface MoneyBackMapper extends BaseMapper<MoneyBack> {
+}
diff --git a/cloud-server-course/src/main/java/com/dsh/course/model/dto/ToClassDto.java b/cloud-server-course/src/main/java/com/dsh/course/model/dto/ToClassDto.java
new file mode 100644
index 0000000..2f28104
--- /dev/null
+++ b/cloud-server-course/src/main/java/com/dsh/course/model/dto/ToClassDto.java
@@ -0,0 +1,9 @@
+package com.dsh.course.model.dto;
+
+import lombok.Data;
+
+@Data
+public class ToClassDto {
+    Integer id;
+    Integer toStudentId;
+}
diff --git a/cloud-server-course/src/main/java/com/dsh/course/service/CourseCounsumService.java b/cloud-server-course/src/main/java/com/dsh/course/service/CourseCounsumService.java
new file mode 100644
index 0000000..99f8528
--- /dev/null
+++ b/cloud-server-course/src/main/java/com/dsh/course/service/CourseCounsumService.java
@@ -0,0 +1,9 @@
+package com.dsh.course.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.dsh.course.entity.CancelledClasses;
+import com.dsh.course.entity.CourseCounsum;
+
+public interface CourseCounsumService extends IService<CourseCounsum> {
+
+}
diff --git a/cloud-server-course/src/main/java/com/dsh/course/service/MoneyBackService.java b/cloud-server-course/src/main/java/com/dsh/course/service/MoneyBackService.java
new file mode 100644
index 0000000..bee5744
--- /dev/null
+++ b/cloud-server-course/src/main/java/com/dsh/course/service/MoneyBackService.java
@@ -0,0 +1,9 @@
+package com.dsh.course.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.dsh.course.entity.CourseCounsum;
+import com.dsh.course.entity.MoneyBack;
+
+public interface MoneyBackService extends IService<MoneyBack> {
+
+}
diff --git a/cloud-server-course/src/main/java/com/dsh/course/service/impl/CourseCounsumServiceImpl.java b/cloud-server-course/src/main/java/com/dsh/course/service/impl/CourseCounsumServiceImpl.java
new file mode 100644
index 0000000..5f4467c
--- /dev/null
+++ b/cloud-server-course/src/main/java/com/dsh/course/service/impl/CourseCounsumServiceImpl.java
@@ -0,0 +1,14 @@
+package com.dsh.course.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.dsh.course.entity.CancelledClasses;
+import com.dsh.course.entity.CourseCounsum;
+import com.dsh.course.mapper.CancelledClassesMapper;
+import com.dsh.course.mapper.CourseCounsumMapper;
+import com.dsh.course.service.CancelledClassesService;
+import com.dsh.course.service.CourseCounsumService;
+import org.springframework.stereotype.Service;
+
+@Service
+public class CourseCounsumServiceImpl extends ServiceImpl<CourseCounsumMapper, CourseCounsum> implements CourseCounsumService {
+}
diff --git a/cloud-server-course/src/main/java/com/dsh/course/service/impl/MoneyBackServiceImpl.java b/cloud-server-course/src/main/java/com/dsh/course/service/impl/MoneyBackServiceImpl.java
new file mode 100644
index 0000000..75c9b66
--- /dev/null
+++ b/cloud-server-course/src/main/java/com/dsh/course/service/impl/MoneyBackServiceImpl.java
@@ -0,0 +1,14 @@
+package com.dsh.course.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.dsh.course.entity.CourseCounsum;
+import com.dsh.course.entity.MoneyBack;
+import com.dsh.course.mapper.CourseCounsumMapper;
+import com.dsh.course.mapper.MoneyBackMapper;
+import com.dsh.course.service.CourseCounsumService;
+import com.dsh.course.service.MoneyBackService;
+import org.springframework.stereotype.Service;
+
+@Service
+public class MoneyBackServiceImpl extends ServiceImpl<MoneyBackMapper, MoneyBack> implements MoneyBackService {
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/course/model/MoneyBack.java b/cloud-server-management/src/main/java/com/dsh/course/model/MoneyBack.java
new file mode 100644
index 0000000..017bb80
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/course/model/MoneyBack.java
@@ -0,0 +1,22 @@
+package com.dsh.course.model;
+
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.models.auth.In;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class MoneyBack {
+
+    Integer id;
+    String ids;
+    Integer studentId;
+    Integer status;
+    @TableField("insertTime")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    Date insertTime;
+
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/course/model/dto/InsertBackDto.java b/cloud-server-management/src/main/java/com/dsh/course/model/dto/InsertBackDto.java
new file mode 100644
index 0000000..7a3161c
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/course/model/dto/InsertBackDto.java
@@ -0,0 +1,9 @@
+package com.dsh.course.model.dto;
+
+import lombok.Data;
+
+@Data
+public class InsertBackDto {
+    Integer id;
+    String ids;
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/course/util/ChineseMoneyUtils.java b/cloud-server-management/src/main/java/com/dsh/course/util/ChineseMoneyUtils.java
new file mode 100644
index 0000000..022557f
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/course/util/ChineseMoneyUtils.java
@@ -0,0 +1,104 @@
+package com.dsh.course.util;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+
+public class ChineseMoneyUtils {
+    /**
+     * 中文数字
+     */
+    final static private String[] CHINESE_NUMBER = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };
+    /**
+     * 中文数字单位
+     */
+    final static private String[] CHINESE_NUMBER_UNIT = { "", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟" };
+    /**
+     * 人民币单位
+     */
+    final static private String[] CHINESE_MONEY_UNIT = { "圆", "角", "分" };
+
+    public static void main(String[] args) {
+        String chineseMoney = toChineseMoney(new BigDecimal("320"));
+        System.out.println("chineseMoney = " + chineseMoney);
+    }
+
+    /**
+     * @param sourceMoney 要转换的数值,最多支持到亿
+     * @return 结果
+     */
+    public static String toChineseMoney(BigDecimal sourceMoney) {
+        if (new BigDecimal("1000000000000").compareTo(sourceMoney) <= 0
+                && BigDecimal.ZERO.compareTo(sourceMoney) >= 0) {
+            throw new RuntimeException("支持转换的金额范围为0~1万亿");
+        }
+        StringBuilder sb = new StringBuilder();
+        // 整数部分
+        BigDecimal intPart = sourceMoney.setScale(0, RoundingMode.DOWN);
+        // 小数部分
+        BigDecimal decimalPart = sourceMoney.subtract(intPart).multiply(new BigDecimal(100)).setScale(0,
+                RoundingMode.DOWN);
+
+        // 处理整数部分圆
+        if (intPart.compareTo(BigDecimal.ZERO) > 0) {
+            String intPartNumberString = intPart.toPlainString();
+            int length = intPartNumberString.length();
+            // 统计末尾的零,末尾零不做处理
+            int zeroCount = 0;
+            for (int i = length - 1; i >= 0; i--) {
+                int number = Integer.parseInt(String.valueOf(intPartNumberString.charAt(i)));
+                if (number == 0) {
+                    zeroCount++;
+                } else {
+                    break;
+                }
+            }
+            for (int i = 0; i < length; i++) {
+                // 如果转换到末尾0,则停止转换
+                if (i + zeroCount == length) {
+                    break;
+                }
+                int number = Integer.parseInt(String.valueOf(intPartNumberString.charAt(i)));
+                // 获取中文数字
+                String chineseNumber = CHINESE_NUMBER[number];
+                // 获取中文数字单位
+                String chineseNumberUnit = CHINESE_NUMBER_UNIT[length - i - 1];
+                sb.append(chineseNumber).append(chineseNumberUnit);
+            }
+            // 统计完后加上金额单位
+            sb.append(CHINESE_MONEY_UNIT[0]);
+        } else {
+            sb.append(CHINESE_NUMBER[0]).append(CHINESE_MONEY_UNIT[0]);
+        }
+
+        // 处理小数部分
+        if (decimalPart.compareTo(new BigDecimal(10)) >= 0) {
+            // 角
+            String jiao = decimalPart.toPlainString();
+            int number = Integer.parseInt(String.valueOf(jiao.charAt(0)));
+            if (number != 0) {
+                String chineseNumber = CHINESE_NUMBER[number];
+                sb.append(chineseNumber).append(CHINESE_MONEY_UNIT[1]);
+            }
+
+            // 分
+            String fen = decimalPart.toPlainString();
+            number = Integer.parseInt(String.valueOf(fen.charAt(1)));
+            if (number != 0) {
+                String chineseNumber = CHINESE_NUMBER[number];
+                sb.append(chineseNumber).append(CHINESE_MONEY_UNIT[2]);
+            }
+        } else if (decimalPart.compareTo(BigDecimal.ZERO) > 0) {
+             // 分
+            String fen = decimalPart.toPlainString();
+            int number = Integer.parseInt(String.valueOf(fen.charAt(0)));
+            if (number != 0) {
+                String chineseNumber = CHINESE_NUMBER[number];
+                sb.append(chineseNumber).append(CHINESE_MONEY_UNIT[2]);
+            }
+        } else {
+            sb.append("整");
+        }
+        return sb.toString();
+    }
+
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/course/util/HtmlToPdfUtils.java b/cloud-server-management/src/main/java/com/dsh/course/util/HtmlToPdfUtils.java
new file mode 100644
index 0000000..62463d6
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/course/util/HtmlToPdfUtils.java
@@ -0,0 +1,53 @@
+package com.dsh.course.util;
+
+import com.itextpdf.html2pdf.ConverterProperties;
+import com.itextpdf.html2pdf.HtmlConverter;
+import com.itextpdf.kernel.events.PdfDocumentEvent;
+import com.itextpdf.kernel.font.PdfFont;
+import com.itextpdf.kernel.font.PdfFontFactory;
+import com.itextpdf.kernel.geom.PageSize;
+import com.itextpdf.kernel.pdf.PdfDocument;
+import com.itextpdf.kernel.pdf.PdfWriter;
+import com.itextpdf.layout.font.FontProvider;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+/**
+ * @author zhibing.pu
+ * @Date 2023/8/14 11:13
+ */
+public class HtmlToPdfUtils {
+
+    public static void convertToPdf(InputStream inputStream, String waterMark, OutputStream outputStream) throws IOException {
+
+        PdfWriter pdfWriter = new PdfWriter(outputStream);
+        PdfDocument pdfDocument = new PdfDocument(pdfWriter);
+        //设置为A4大小
+        pdfDocument.setDefaultPageSize(PageSize.A4);
+        //添加水印
+//        pdfDocument.addEventHandler(PdfDocumentEvent.END_PAGE, new WaterMarkEventHandler(waterMark));
+
+        //添加页码
+        //pdfDocument.addEventHandler(PdfDocumentEvent.END_PAGE,new PageEventHandler());
+        //添加中文字体支持
+        ConverterProperties properties = new ConverterProperties();
+        FontProvider fontProvider = new FontProvider();
+
+        PdfFont sysFont = PdfFontFactory.createFont("STSongStd-Light", "UniGB-UCS2-H", false);
+        fontProvider.addFont(sysFont.getFontProgram(), "UniGB-UCS2-H");
+
+        //添加自定义字体,例如微软雅黑
+        /*if (StringUtils.isNotBlank(fontPath)){
+            PdfFont microsoft = PdfFontFactory.createFont(fontPath, PdfEncodings.IDENTITY_H, false);
+            fontProvider.addFont(microsoft.getFontProgram(), PdfEncodings.IDENTITY_H);
+        }*/
+
+        properties.setFontProvider(fontProvider);
+        HtmlConverter.convertToPdf(inputStream, pdfDocument, properties);
+
+        pdfWriter.close();
+        pdfDocument.close();
+    }
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/CourseCounsum.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/CourseCounsum.java
new file mode 100644
index 0000000..d90ee06
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/CourseCounsum.java
@@ -0,0 +1,19 @@
+package com.dsh.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.models.auth.In;
+import lombok.Data;
+
+import java.util.Date;
+
+
+@Data
+public class CourseCounsum {
+
+    Integer id;
+    Integer changeType;
+    Integer num;
+    String reason;
+    Long paymentId;
+    Date insertTime;
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/dto/ConsumeQuery.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/dto/ConsumeQuery.java
new file mode 100644
index 0000000..cb17e8b
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/dto/ConsumeQuery.java
@@ -0,0 +1,19 @@
+package com.dsh.guns.modular.system.model.dto;
+
+import io.swagger.models.auth.In;
+import lombok.Data;
+import org.apache.catalina.util.Introspection;
+
+import java.util.Date;
+@Data
+public class ConsumeQuery {
+
+
+    Date start;
+    Date end;
+    Integer changeType;
+
+    String reason;
+
+    Integer payId;
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/dto/GiftSearchDto.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/dto/GiftSearchDto.java
new file mode 100644
index 0000000..61424c4
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/dto/GiftSearchDto.java
@@ -0,0 +1,11 @@
+package com.dsh.guns.modular.system.model.dto;
+
+import io.swagger.models.auth.In;
+import lombok.Data;
+
+@Data
+public class GiftSearchDto {
+    String name;
+    String phone;
+    Integer id;
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/dto/HoliSelect.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/dto/HoliSelect.java
new file mode 100644
index 0000000..b6ffeec
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/dto/HoliSelect.java
@@ -0,0 +1,5 @@
+package com.dsh.guns.modular.system.model.dto;
+
+public class HoliSelect {
+
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/dto/ToClassDto.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/dto/ToClassDto.java
new file mode 100644
index 0000000..5ac720f
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/dto/ToClassDto.java
@@ -0,0 +1,10 @@
+package com.dsh.guns.modular.system.model.dto;
+
+import io.swagger.models.auth.In;
+import lombok.Data;
+
+@Data
+public class ToClassDto {
+    Integer id;
+    Integer toStudentId;
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/dto/ToHoliDto.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/dto/ToHoliDto.java
new file mode 100644
index 0000000..04b57d0
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/dto/ToHoliDto.java
@@ -0,0 +1,13 @@
+package com.dsh.guns.modular.system.model.dto;
+
+import io.swagger.models.auth.In;
+import lombok.Data;
+
+import java.util.List;
+@Data
+public class ToHoliDto {
+    Integer id;
+    Integer classId;
+    Integer classNum;
+    String[] ids;
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/util/BigDecimalToChineseAmountUtil.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/util/BigDecimalToChineseAmountUtil.java
new file mode 100644
index 0000000..1b267de
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/util/BigDecimalToChineseAmountUtil.java
@@ -0,0 +1,80 @@
+package com.dsh.guns.modular.system.util;
+
+import java.math.BigDecimal;
+
+public class BigDecimalToChineseAmountUtil {
+    private static final String[] CN_UPPER_NUMBER = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
+    private static final String[] CN_UPPER_MONETRAY_UNIT = {"分", "角", "元", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟", "兆", "拾", "佰", "仟"};
+    private static final String CN_FULL = "整";
+    private static final String CN_NEGATIVE = "负";
+    private static final int MONEY_PRECISION = 2;
+
+    public static String convertToChineseAmount(BigDecimal number) {
+        StringBuilder builder = new StringBuilder();
+
+        if (number.compareTo(BigDecimal.ZERO) < 0) {
+            builder.append(CN_NEGATIVE);
+            number = number.abs();
+        }
+
+        long integralPart = number.longValue();
+        BigDecimal decimalPart = number.subtract(BigDecimal.valueOf(integralPart)).multiply(BigDecimal.TEN.pow(MONEY_PRECISION));
+
+        if (decimalPart.compareTo(BigDecimal.ZERO) == 0) {
+            builder.append(CN_FULL);
+        }
+
+        long integralPartTemp = integralPart;
+        int unit = 0;
+        boolean isZero = true;
+        boolean needZero = false;
+
+        while (integralPartTemp > 0) {
+            long tempNumber = integralPartTemp % 10;
+            if (tempNumber > 0) {
+                if (needZero) {
+                    builder.insert(0, CN_UPPER_NUMBER[0]);
+                }
+                builder.insert(0, CN_UPPER_MONETRAY_UNIT[unit]);
+                builder.insert(0, CN_UPPER_NUMBER[(int) tempNumber]);
+                isZero = false;
+                needZero = false;
+            } else {
+                if (!isZero) {
+                    needZero = true;
+                }
+                if (unit == 2 || unit == 6 || unit == 10 || unit == 14) {
+                    builder.insert(0, CN_UPPER_MONETRAY_UNIT[unit]);
+                    isZero = true;
+                }
+            }
+            integralPartTemp = integralPartTemp / 10;
+            unit++;
+        }
+
+        if (decimalPart.compareTo(BigDecimal.ZERO) > 0) {
+            builder.append(convertDecimalToChinese(decimalPart));
+        }
+
+        return builder.toString();
+    }
+
+    private static String convertDecimalToChinese(BigDecimal decimalPart) {
+        StringBuilder builder = new StringBuilder();
+
+        for (int i = 0; i < MONEY_PRECISION; i++) {
+            int num = decimalPart.intValue() % 10;
+            builder.insert(0, CN_UPPER_NUMBER[num]);
+            builder.append(CN_UPPER_MONETRAY_UNIT[i + 2]);
+            decimalPart = decimalPart.multiply(BigDecimal.TEN);
+        }
+
+        return builder.toString();
+    }
+
+    public static void main(String[] args) {
+        BigDecimal number = new BigDecimal("12345.67");
+        String chineseAmount = convertToChineseAmount(number);
+        System.out.println(chineseAmount); // Output: 壹万贰仟叁佰肆拾伍元陆角柒分
+    }
+}
\ No newline at end of file
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/coursePackage/TCoupon.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/coursePackage/TCoupon.html
new file mode 100644
index 0000000..670f376
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/coursePackage/TCoupon.html
@@ -0,0 +1,80 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>优惠券管理</h5>
+            </div>
+            <div class="ibox-content">
+
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#NameCon id="name" name="优惠券名称" />
+                                <input type="hidden" id="index" value="${index}">
+                            </div>
+<!--                            <div class="col-sm-3">-->
+<!--                                <#SelectCon id="type" name="优惠券类型" >-->
+<!--                                <option value="">全部</option>-->
+<!--                                <option value="1">满减券</option>-->
+<!--                                <option value="2">折扣券</option>-->
+<!--                                <option value="3">体验券</option>-->
+<!--                            </#SelectCon>-->
+<!--                        </div>-->
+<!--                        <div class="col-sm-3">-->
+<!--                            <#SelectCon id="distributionMethod" name="发放方式" >-->
+<!--                            <option value="">全部</option>-->
+<!--                            <option value="1">积分购买</option>-->
+<!--                            <option value="2">注册赠送</option>-->
+<!--                            <option value="3">自动发券</option>-->
+<!--                        </#SelectCon>-->
+<!--                    </div>-->
+<!--                    <div class="col-sm-3">-->
+<!--                        <#SelectCon id="userPopulation" name="用户人群" >-->
+<!--                        <option value="">全部</option>-->
+<!--                        <option value="1">全部用户</option>-->
+<!--                        <option value="2">年度会员</option>-->
+<!--                        <option value="3">已有学员用户</option>-->
+<!--                    </#SelectCon>-->
+<!--                </div>-->
+<!--                <div class="col-sm-3">-->
+<!--                    <#SelectCon id="status" name="活动状态" >-->
+<!--                    <option value="">全部</option>-->
+<!--                    <option value="1">未开始</option>-->
+<!--                    <option value="2">已开始</option>-->
+<!--                    <option value="3">已结束</option>-->
+<!--                </#SelectCon>-->
+<!--            </div>-->
+<!--                    <div class="col-sm-3">-->
+<!--                <#SelectCon id="state" name="可售状态" >-->
+<!--                <option value="">全部</option>-->
+<!--                <option value="1">已上架</option>-->
+<!--                <option value="2">已下架</option>-->
+<!--                </#SelectCon>-->
+<!--                        </div>-->
+<!--        <div class="col-sm-3">-->
+            <#button name="搜索" icon="fa-search" clickFun="TCoupon.search()"/>
+<!--            <#button name="重置" icon="fa-trash" clickFun="TCoupon.resetSearch()"/>-->
+        </div>
+                        </div>
+<!--                        <div class="hidden-xs" id="TCouponTableToolbar" role="group">-->
+<!--                            <#button name="添加" icon="fa-plus" clickFun="TCoupon.backids(${index})" />-->
+<!--                            <#button name="编辑" icon="fa-edit" clickFun="TCoupon.openChange()" space="true" hidden='hidden'/>-->
+<!--                            <#button name="上架" icon="fa-remove" clickFun="TCoupon.onShelf(1)" space="true" hidden='hidden'/>-->
+<!--                            <#button name="下架" icon="fa-remove" clickFun="TCoupon.onShelf(2)" space="true" hidden='hidden'/>-->
+<!--                            <#button name="查看详情" icon="fa-remove" clickFun="TCoupon.openDetail()" space="true" hidden='hidden'/>-->
+<!--                            <#button name="领取记录" icon="fa-remove" clickFun="TCoupon.openCollectionRecord()" space="true" hidden='hidden'/>-->
+<!--                        </div>-->
+                        <#table id="TCouponTable"/>
+    <div style="display: flex">                             <#button name="添加" icon="fa-plus" clickFun="TCoupon.backids(${index})"/>
+    </div>
+                    </div>
+                </div>
+            </div>
+
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/modular/system/coursePackage/TCoupon.js"></script>
+@}
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/coursePackage/TCouponEdit.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/coursePackage/TCouponEdit.html
new file mode 100644
index 0000000..fb57482
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/coursePackage/TCouponEdit.html
@@ -0,0 +1,80 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>优惠券管理</h5>
+            </div>
+            <div class="ibox-content">
+
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#NameCon id="name" name="优惠券名称" />
+                                <input type="text" id="conpund" value="${conpund}">
+                                <input type="text" id="index" value="${index}">
+
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="type" name="优惠券类型" >
+                                <option value="">全部</option>
+                                <option value="1">满减券</option>
+                                <option value="2">折扣券</option>
+                                <option value="3">体验券</option>
+                            </#SelectCon>
+                        </div>
+                        <div class="col-sm-3">
+                            <#SelectCon id="distributionMethod" name="发放方式" >
+                            <option value="">全部</option>
+                            <option value="1">积分购买</option>
+                            <option value="2">注册赠送</option>
+                            <option value="3">自动发券</option>
+                        </#SelectCon>
+                    </div>
+                    <div class="col-sm-3">
+                        <#SelectCon id="userPopulation" name="用户人群" >
+                        <option value="">全部</option>
+                        <option value="1">全部用户</option>
+                        <option value="2">年度会员</option>
+                        <option value="3">已有学员用户</option>
+                    </#SelectCon>
+                </div>
+                <div class="col-sm-3">
+                    <#SelectCon id="status" name="活动状态" >
+                    <option value="">全部</option>
+                    <option value="1">未开始</option>
+                    <option value="2">已开始</option>
+                    <option value="3">已结束</option>
+                </#SelectCon>
+            </div>
+                    <div class="col-sm-3">
+                <#SelectCon id="state" name="可售状态" >
+                <option value="">全部</option>
+                <option value="1">已上架</option>
+                <option value="2">已下架</option>
+                </#SelectCon>
+                        </div>
+        <div class="col-sm-3">
+            <#button name="搜索" icon="fa-search" clickFun="TCoupon.search()"/>
+            <#button name="重置" icon="fa-trash" clickFun="TCoupon.resetSearch()"/>
+        </div>
+                        </div>
+                        <div class="hidden-xs" id="TCouponTableToolbar" role="group">
+                            <#button name="添加" icon="fa-plus" clickFun="TCoupon.backids(${index})"/>
+                            <#button name="编辑" icon="fa-edit" clickFun="TCoupon.openChange()" space="true"/>
+                            <#button name="上架" icon="fa-remove" clickFun="TCoupon.onShelf(1)" space="true"/>
+                            <#button name="下架" icon="fa-remove" clickFun="TCoupon.onShelf(2)" space="true"/>
+                            <#button name="查看详情" icon="fa-remove" clickFun="TCoupon.openDetail()" space="true"/>
+                            <#button name="领取记录" icon="fa-remove" clickFun="TCoupon.openCollectionRecord()" space="true"/>
+                        </div>
+                        <#table id="TCouponTable"/>
+                    </div>
+                </div>
+            </div>
+
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/modular/system/coursePackage/TCouponEdit.js"></script>
+@}
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tCoupon/tCoupon_add.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tCoupon/tCoupon_add.html
new file mode 100644
index 0000000..1ff93e8
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tCoupon/tCoupon_add.html
@@ -0,0 +1,56 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+
+            <div class="row">
+                <div class="col-sm-6 b-r">
+                            <#input id="id" name="主键" underline="true"/>
+                            <#input id="name" name="优惠券名称" underline="true"/>
+                            <#input id="type" name="优惠券类型(1=满减券,2=代金券,3=体验券)" underline="true"/>
+                            <#input id="content" name="优惠券规则JSON
+格式:
+{
+	"conditionalAmount": 5,
+	"deductionAmount": 6.8,
+	"experienceName": ""
+}" underline="true"/>
+                            <#input id="illustrate" name="优惠券说明" underline="true"/>
+                            <#input id="distributionMethod" name="发放方式(1=积分购买,2=注册赠送,3=自动发券)" underline="true"/>
+                            <#input id="redemptionMethod" name="兑换方式(1=积分,2=积分+现金)" underline="true"/>
+                            <#input id="cash" name="所需现金" underline="true"/>
+                            <#input id="integral" name="所属积分" underline="true"/>
+                            <#input id="userPopulation" name="用户人群(1=全部用户,2=年度会员,3=已有学员用户)" underline="true"/>
+                            <#input id="quantityIssued" name="发放数量" underline="true"/>
+                            <#input id="pickUpQuantity" name="限领数量" underline="true"/>
+                            <#input id="startTime" name="开始时间"/>
+                </div>
+
+                <div class="col-sm-6">
+                            <#input id="endTime" name="结束时间" underline="true"/>
+                            <#input id="useScope" name="使用范围(1=全国,2=指定城市,3=指定门店)" underline="true"/>
+                            <#input id="auditStatus" name="审核状态(1=待审核,2=已通过,3=已拒绝)" underline="true"/>
+                            <#input id="auditUserId" name="审核人id" underline="true"/>
+                            <#input id="auditRemark" name="审核备注" underline="true"/>
+                            <#input id="status" name="状态(1=未开始,2=已开始,3=已结束,4=已取消)" underline="true"/>
+                            <#input id="state" name="状态(1=正常,2=冻结,3=删除)" underline="true"/>
+                            <#input id="insertTime" name="添加时间" underline="true"/>
+                            <#input id="cover" name="封面图" underline="true"/>
+                            <#input id="productImages" name="图片" underline="true"/>
+                            <#input id="publisherType" name="发布人类型 1=城市管理者 2=平台管理者3=门店" underline="true"/>
+                            <#input id="cityManagerId" name="城市管理者id" underline="true"/>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TCouponInfoDlg.addSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TCouponInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tCoupon/tCoupon_info.js"></script>
+@}
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tCoupon/tCoupon_edit.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tCoupon/tCoupon_edit.html
new file mode 100644
index 0000000..e8e8c75
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tCoupon/tCoupon_edit.html
@@ -0,0 +1,56 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+
+            <div class="row">
+                <div class="col-sm-6 b-r">
+                            <#input id="id" name="主键" value="${item.id}" underline="true"/>
+                            <#input id="name" name="优惠券名称" value="${item.name}" underline="true"/>
+                            <#input id="type" name="优惠券类型(1=满减券,2=代金券,3=体验券)" value="${item.type}" underline="true"/>
+                            <#input id="content" name="优惠券规则JSON
+格式:
+{
+	"conditionalAmount": 5,
+	"deductionAmount": 6.8,
+	"experienceName": ""
+}" value="${item.content}" underline="true"/>
+                            <#input id="illustrate" name="优惠券说明" value="${item.illustrate}" underline="true"/>
+                            <#input id="distributionMethod" name="发放方式(1=积分购买,2=注册赠送,3=自动发券)" value="${item.distributionMethod}" underline="true"/>
+                            <#input id="redemptionMethod" name="兑换方式(1=积分,2=积分+现金)" value="${item.redemptionMethod}" underline="true"/>
+                            <#input id="cash" name="所需现金" value="${item.cash}" underline="true"/>
+                            <#input id="integral" name="所属积分" value="${item.integral}" underline="true"/>
+                            <#input id="userPopulation" name="用户人群(1=全部用户,2=年度会员,3=已有学员用户)" value="${item.userPopulation}" underline="true"/>
+                            <#input id="quantityIssued" name="发放数量" value="${item.quantityIssued}" underline="true"/>
+                            <#input id="pickUpQuantity" name="限领数量" value="${item.pickUpQuantity}" underline="true"/>
+                            <#input id="startTime" name="开始时间" value="${item.startTime}" />
+                </div>
+
+                <div class="col-sm-6">
+                            <#input id="endTime" name="结束时间" value="${item.endTime}" underline="true"/>
+                            <#input id="useScope" name="使用范围(1=全国,2=指定城市,3=指定门店)" value="${item.useScope}" underline="true"/>
+                            <#input id="auditStatus" name="审核状态(1=待审核,2=已通过,3=已拒绝)" value="${item.auditStatus}" underline="true"/>
+                            <#input id="auditUserId" name="审核人id" value="${item.auditUserId}" underline="true"/>
+                            <#input id="auditRemark" name="审核备注" value="${item.auditRemark}" underline="true"/>
+                            <#input id="status" name="状态(1=未开始,2=已开始,3=已结束,4=已取消)" value="${item.status}" underline="true"/>
+                            <#input id="state" name="状态(1=正常,2=冻结,3=删除)" value="${item.state}" underline="true"/>
+                            <#input id="insertTime" name="添加时间" value="${item.insertTime}" underline="true"/>
+                            <#input id="cover" name="封面图" value="${item.cover}" underline="true"/>
+                            <#input id="productImages" name="图片" value="${item.productImages}" underline="true"/>
+                            <#input id="publisherType" name="发布人类型 1=城市管理者 2=平台管理者3=门店" value="${item.publisherType}" underline="true"/>
+                            <#input id="cityManagerId" name="城市管理者id" value="${item.cityManagerId}" />
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TCouponInfoDlg.editSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TCouponInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tCoupon/tCoupon_info.js"></script>
+@}
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tStudent/banckmoney.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tStudent/banckmoney.html
new file mode 100644
index 0000000..a148919
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tStudent/banckmoney.html
@@ -0,0 +1,347 @@
+<!DOCTYPE html>
+<html lang="zh">
+<head>
+  <meta charset="UTF-8" />
+  <title>amis demo</title>
+  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+  <meta
+          name="viewport"
+          content="width=device-width, initial-scale=1, maximum-scale=1"
+  />
+  <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
+  <link rel="stylesheet" href="${ctxPath}/sdk/sdk.css" />
+  <link rel="stylesheet" href="${ctxPath}/sdk/helper.css" />
+  <link rel="stylesheet" href="${ctxPath}/sdk/iconfont.css" />
+  <!-- 这是默认主题所需的,如果是其他主题则不需要 -->
+  <!-- 从 1.1.0 开始 sdk.css 将不支持 IE 11,如果要支持 IE11 请引用这个 css,并把前面那个删了 -->
+  <!-- <link rel="stylesheet" href="sdk-ie11.css" /> -->
+  <!-- 不过 amis 开发团队几乎没测试过 IE 11 下的效果,所以可能有细节功能用不了,如果发现请报 issue -->
+  <style>
+    html,
+    body,
+    .app-wrapper {
+      position: relative;
+      width: 100%;
+      height: 100%;
+      margin: 0;
+      padding: 0;
+    }
+    th {
+      background-color: white;
+    }
+  </style>
+</head>
+<body>
+<div id="root" class="app-wrapper"></div>
+<script src="${ctxPath}/sdk/sdk.js"></script>
+<script type="text/javascript">
+  (function () {
+    let amis = amisRequire('amis/embed');
+    // 通过替换下面这个配置来生成不同页面
+    let amisJSON = {
+      "type": "page",
+      "title": "",
+      "body": [
+        {
+          "type": "form",
+          "title": "表单",
+          "body": [
+            {
+              "label": "文本",
+              "type": "input-text",
+              "name": "id",
+              "id": "u:99d3d8869d55"
+            },
+            {
+              "label": "文本",
+              "type": "input-text",
+              "name": "ids",
+              "id": "u:5b12dc7c90"
+            }
+          ],
+          "api": {
+            "url": "ttt",
+            "method": "post",
+            "requestAdaptor": "",
+            "adaptor": "",
+            "messages": {},
+            "dataType": "form"
+          },
+          "id": "u:285d560cf7ab"
+        },
+        {
+          "type": "property",
+          "id": "u:844144d9d3d8",
+          "title": "学员课包退费申请表",
+          "items": [
+            {
+              "label": "用户姓名",
+              "content": `${userName}`,
+              "span": 1
+            },
+            {
+              "label": "学员姓名",
+              "content": `${tStudentDto.name}`,
+              "span": 1
+            },
+            {
+              "label": "性别",
+              "content": `${tStudentDto.sex == 1 ? '男':'女'}`,
+              "span": 1
+            },
+            {
+              "label": "申请时间",
+              "content": `${reDate}`,
+              "span": 3
+            },
+            {
+              "label": "联系电话",
+              "content": `${tStudentDto.phone}`,
+              "span": 1
+            },
+            {
+              "label": "收款户名",
+              "content": "",
+              "span": 2
+            },
+            {
+              "label": "收款账号",
+              "content": "",
+              "span": 3
+            },
+            {
+              "label": "银行开户行",
+              "content": "",
+              "span": 8
+            },
+            {
+              "label": "申请推费原因",
+              "content": "",
+              "span": 8
+            },
+            {
+              "label": "课包项目明细",
+              "content": "",
+              "span": 8
+            }
+      @for(pay in coursePackagePayments){
+            ,
+            {
+              "label": "",
+              "span": 1,
+              "content": '课包明细'+`${index++}`
+            },
+            {
+              "label": "课包编号",
+              "content": `${pay.id}`,
+              "span": 2
+            },
+            {
+              "label": "课包名称",
+              "content": `${pay.name}`,
+              "span": 1
+            },
+            {
+              "label": "物品赠送",
+              "content": "",
+              "span": 2
+            },
+            {
+              "label": "",
+              "content": "",
+              "span": 1
+            },
+            {
+              "label": "课包总课时",
+              "content": `${pay.totalClassHours}`,
+              "span": 1
+            },
+            {
+              "label": "课包单价",
+              "content": `${pay.onePrice}`,
+              "span": 1
+            },
+            {
+              "label": "课包总金额",
+              "content": `${pay.cashPayment}`,
+              "span": 3
+            },
+            {
+              "label": "",
+              "content": "",
+              "span": 1
+            },
+            {
+              "label": "已学课时",
+              "content": `${pay.hasHours}`,
+              "span": 1
+            },
+            {
+              "label": "剩余课时",
+              "content": `${pay.laveClassHours}`,
+              "span": 1
+            },
+            {
+              "label": "剩余课时金额",
+              "content": `${pay.restPrice}`,
+              "span": 3
+            },
+            {
+              "label": "",
+              "content": "",
+              "span": 1
+            },
+            {
+              "label": "合计",
+              "content": `${countAll}`,
+              "span": 1
+            },
+            {
+              "label": "大写",
+              "content": `${allprice}`,
+              "span": 4
+            }
+
+            @}
+            ,
+            {
+              "label": "",
+              "content": "申请退费",
+              "span": 1
+            },
+            {
+              "label": "申请退费金额",
+              "content": "${countAll}",
+              "span": 1
+            },
+            {
+              "label": "物品赠送",
+              "content": "",
+              "span": 1
+            },
+            {
+              "label": "手续费",
+              "content": "",
+              "span": 3
+            },
+            {
+              "label": "",
+              "content": "",
+              "span": 1
+            },
+            {
+              "label": "实际退费",
+              "content": "",
+              "span": 1
+            },
+            {
+              "label": "大写",
+              "content": "",
+              "span": 4
+            },
+            {
+              "label": "申请人签字",
+              "content": "",
+              "span": 2
+            },
+            {
+              "label": "店长意见及签字",
+              "content": {
+                "type": "tpl",
+                "tpl": "<br/><br/></pre>",
+                "id": "u:c14b6d167a7c"
+              },
+              "span": 4
+            },
+            {
+              "label": "退费记录",
+              "content": {
+                "type": "tpl",
+                "tpl": "<br/><br/></pre>",
+                "id": "u:c14b6d167a7c"
+              },
+              "span": 6
+            },
+            {
+              "label": "备注",
+              "content": {
+                "type": "tpl",
+                "tpl": "<br/><br/></pre>",
+                "id": "u:c14b6d167a7c"
+              },
+              "span": 1
+            }
+          ],
+          "column": 6,
+          "mode": "table",
+
+        "className": "font-bold"
+        },
+    {
+      "type": "flex",
+            "className": "p-1",
+            "items": [
+      {
+        "type": "button",
+        "id": "u:6c0b8f917bf7",
+        "label": "关闭",
+        "onEvent": {
+          "click": {
+            "actions": [{
+              "actionType": "custom",
+              "args": {},
+              "script": "window.close()"
+            }
+            ]
+          }
+        }
+      },
+      {
+        "type": "button",
+        "id": "u:6c0b8f917bf7",
+        "label": "导出",
+        "level":"info",
+        "onEvent": {
+          "click": {
+            "actions": [
+              {
+                "script": "\r\nwindow.print()",
+                "actionType": "custom"
+              },
+              {
+                "componentId": "u:285d560cf7ab",
+                "actionType": "submit"
+              },
+              {
+                "actionType": "custom",
+                "args": {},
+                "script": "window.close()"
+              }
+            ]
+          }
+        }
+      }
+    ],
+            "style": {
+      "position": "relative"
+    },
+      "id": "u:8254704349a2"
+    }
+      ],
+      "id": "u:fea3d370178c"
+    };
+    let amisScoped = amis.embed('#root', amisJSON);
+
+
+  })();
+
+  function test(){
+    console.log("测试成功")
+  }
+
+  var myButton = document.getElementById("ttt");
+  myButton.addEventListener("click",test);
+</script>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tStudent/classelct.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tStudent/classelct.html
new file mode 100644
index 0000000..5fbc47d
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tStudent/classelct.html
@@ -0,0 +1,283 @@
+<!DOCTYPE html>
+<html lang="zh">
+<head>
+  <meta charset="UTF-8" />
+  <title>amis demo</title>
+  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+  <meta
+          name="viewport"
+          content="width=device-width, initial-scale=1, maximum-scale=1"
+  />
+  <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
+  <link rel="stylesheet" href="${ctxPath}/sdk/sdk.css" />
+  <link rel="stylesheet" href="${ctxPath}/sdk/helper.css" />
+  <link rel="stylesheet" href="${ctxPath}/sdk/iconfont.css" />
+  <!-- 这是默认主题所需的,如果是其他主题则不需要 -->
+  <!-- 从 1.1.0 开始 sdk.css 将不支持 IE 11,如果要支持 IE11 请引用这个 css,并把前面那个删了 -->
+  <!-- <link rel="stylesheet" href="sdk-ie11.css" /> -->
+  <!-- 不过 amis 开发团队几乎没测试过 IE 11 下的效果,所以可能有细节功能用不了,如果发现请报 issue -->
+  <style>
+    html,
+    body,
+    .app-wrapper {
+      position: relative;
+      width: 100%;
+      height: 100%;
+      margin: 0;
+      padding: 0;
+    }
+  </style>
+</head>
+<body>
+<div id="root" class="app-wrapper"></div>
+<script src="${ctxPath}/sdk/sdk.js"></script>
+<script type="text/javascript">
+  (function () {
+    let amis = amisRequire('amis/embed');
+    // 通过替换下面这个配置来生成不同页面
+    let amisJSON ={
+      "type": "page",
+      "title": "",
+      "body": [
+        {
+          "type": "form",
+          "title": "",
+          "body": [
+            {
+              "type": "tpl",
+              "tpl": "&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp",
+              "inline": true,
+              "wrapperComponent": "",
+              "id": "u:5b414d7db416"
+            },
+            {
+              "type": "tpl",
+              "id": "u:5b414d7db416",
+              "inline": true,
+              "tpl": "&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp",
+              "wrapperComponent": ""
+            },
+            {
+              "type": "tpl",
+              "id": "u:5b414d7db416",
+              "tpl": "&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp",
+              "inline": true,
+              "wrapperComponent": ""
+            },
+            {
+              "type": "flex",
+              "items": [
+                {
+                  "type": "tpl",
+                  "tpl": "课包种类",
+                  "id": "u:55654c208e7a",
+                  "inline": true,
+                  "wrapperComponent": "h2"
+                }
+              ],
+              "id": "u:0623e832135d",
+              "style": {
+                "position": "static",
+                "flexWrap": "nowrap",
+                "flexDirection": "row",
+                "justifyContent": "center",
+                "overflowY": "auto"
+              },
+              "isFixedHeight": false,
+              "isFixedWidth": false
+            },
+            {
+              "type": "flex",
+              "items": [
+                {
+                  "type": "radios",
+                  "id": "u:afa09262555b",
+                  "inline": true,
+                  "label": " 请选择:",
+                  "name": "radios",
+                  "options": [
+                    {
+                      "label": "常规课程",
+                      "value": "1"
+                    },
+                    {
+                      "label": "假期课程",
+                      "value": "2"
+                    },
+                    {
+                      "label": "体验课程",
+                      "value": "3"
+                    }
+                  ],
+                  "mode": "inline",
+                  "value": "A",
+                  "horizontal": {
+                    "left": 1,
+                    "right": 11
+                  }
+                }
+              ],
+              "id": "u:f7852087ea18",
+              "style": {
+                "position": "static",
+                "flexWrap": "nowrap",
+                "flexDirection": "row",
+                "justifyContent": "center",
+                "overflowY": "auto"
+              },
+              "isFixedHeight": false,
+              "isFixedWidth": false
+            },
+            {
+              "type": "flex",
+              "items": [
+                {
+                  "type": "tpl",
+                  "id": "u:5035e51732f1",
+                  "inline": true,
+                  "tpl": "1.常规课程:设置课时扣课的常规课程包。",
+                  "wrapperComponent": "h3"
+                }
+              ],
+              "id": "u:ba0c4f9a5fc3",
+              "style": {
+                "position": "static",
+                "flexWrap": "nowrap",
+                "flexDirection": "row",
+                "justifyContent": "space-around",
+                "overflowY": "auto"
+              },
+              "isFixedHeight": false,
+              "isFixedWidth": false
+            },
+            {
+              "type": "flex",
+              "items": [
+                {
+                  "type": "tpl",
+                  "id": "u:fc5edd1fd19a",
+                  "inline": true,
+                  "tpl": "&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp2.假期课程:预设时间段上课,时间到期课程既结束。",
+                  "wrapperComponent": "h3"
+                }
+              ],
+              "id": "u:d23c02e12b83",
+              "style": {
+                "position": "static",
+                "flexWrap": "nowrap",
+                "flexDirection": "row",
+                "justifyContent": "space-around",
+                "overflowY": "auto"
+              },
+              "isFixedHeight": false,
+              "isFixedWidth": false
+            },
+            {
+              "type": "flex",
+              "items": [
+                {
+                  "type": "tpl",
+                  "id": "u:c519152df166",
+                  "inline": true,
+                  "tpl": "3.体验课程:单次购买的课程。&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp",
+                  "wrapperComponent": "h3"
+                }
+              ],
+              "id": "u:c720cb31edf8",
+              "style": {
+                "position": "static",
+                "flexWrap": "nowrap",
+                "flexDirection": "row",
+                "justifyContent": "space-around",
+                "overflowY": "auto"
+              },
+              "isFixedHeight": false,
+              "isFixedWidth": false
+            },
+            {
+              "type": "flex",
+              "items": [
+                {
+                  "type": "button",
+                  "id": "u:5b4f1fa2ae10",
+                  "label": "确认",
+                  "onEvent": {
+                    "click": {
+                      "actions": [
+                        {
+                          "actionType": "url",
+                          "args": {
+                            "url": "/coursePackage/openAddCoursePackage?type=$radios",
+                            "blank": false
+                          }
+                        }
+                      ]
+                    }
+                  }
+                }
+              ],
+              "id": "u:43e7d3d6e5f7",
+              "style": {
+                "position": "static",
+                "flexWrap": "nowrap",
+                "flexDirection": "row",
+                "justifyContent": "space-around",
+                "overflowY": "auto"
+              },
+              "isFixedHeight": false,
+              "isFixedWidth": false
+            },
+            {
+              "type": "tpl",
+              "id": "u:5b414d7db416",
+              "tpl": "&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp",
+              "inline": true,
+              "wrapperComponent": ""
+            },
+            {
+              "type": "button",
+              "label": "确认",
+              "onEvent": {
+                "click": {
+                  "actions": [
+                    {
+                      "actionType": "url",
+                      "args": {
+                        "url": "/coursePackage/openAddCoursePackage?type=$radios",
+                        "blank": false
+                      }
+                    }
+                  ]
+                }
+              },
+              "id": "u:5b4f1fa2ae10"
+            }
+          ],
+          "id": "u:339c517e4f3c",
+          "api": {
+            "url": "/coursePackage/openAddCoursePackage?$radios",
+            "method": "get",
+            "requestAdaptor": "",
+            "adaptor": "",
+            "messages": {
+            }
+          }
+        }
+      ],
+      "id": "u:039339c3720d"
+    };
+    let amisScoped = amis.embed('#root', amisJSON);
+
+
+  })();
+
+  function test(){
+    console.log("测试成功")
+  }
+
+  var myButton = document.getElementById("ttt");
+  myButton.addEventListener("click",test);
+</script>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tStudent/tStudentEditTTT.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tStudent/tStudentEditTTT.html
new file mode 100644
index 0000000..b348230
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tStudent/tStudentEditTTT.html
@@ -0,0 +1,136 @@
+<!DOCTYPE html>
+<html lang="zh">
+<head>
+  <meta charset="UTF-8" />
+  <title>amis demo</title>
+  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+  <meta
+          name="viewport"
+          content="width=device-width, initial-scale=1, maximum-scale=1"
+  />
+  <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
+  <link rel="stylesheet" href="${ctxPath}/sdk/sdk.css" />
+  <link rel="stylesheet" href="${ctxPath}/sdk/helper.css" />
+  <link rel="stylesheet" href="${ctxPath}/sdk/iconfont.css" />
+  <!-- 这是默认主题所需的,如果是其他主题则不需要 -->
+  <!-- 从 1.1.0 开始 sdk.css 将不支持 IE 11,如果要支持 IE11 请引用这个 css,并把前面那个删了 -->
+  <!-- <link rel="stylesheet" href="sdk-ie11.css" /> -->
+  <!-- 不过 amis 开发团队几乎没测试过 IE 11 下的效果,所以可能有细节功能用不了,如果发现请报 issue -->
+  <style>
+    html,
+    body,
+    .app-wrapper {
+      position: relative;
+      width: 100%;
+      height: 100%;
+      margin: 0;
+      padding: 0;
+    }
+  </style>
+</head>
+<body>
+<div id="root" class="app-wrapper"></div>
+<script src="${ctxPath}/sdk/sdk.js"></script>
+<script type="text/javascript">
+  (function () {
+    let amis = amisRequire('amis/embed');
+    // 通过替换下面这个配置来生成不同页面
+    let amisJSON = {
+      "type": "page",
+      "title": "",
+      "body": [
+        {
+          "type": "form",
+          "title": "",
+          "body": [
+            {
+              "type": "form",
+              "title": "",
+              "body": [
+                {
+                  "type": "tpl",
+                  "tpl": "&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp报名假期班",
+                  "inline": true,
+                  "wrapperComponent": "h2",
+                  "id": "u:194f160daab4"
+                },
+                {
+                  "type": "input-text",
+                  "label": "id",
+                  "name": "id",
+                  "id": "u:d038053014ca",
+                  "mode": "horizontal",
+                  "size": "md"
+                },
+                {
+                  "type": "input-text",
+                  "label": "ids",
+                  "name": "ids",
+                  "id": "u:223b7f2a1a5b",
+                  "mode": "horizontal",
+                  "size": "md"
+                },
+                {
+                  "label": "换课课程:",
+                  "type": "select",
+                  "name": "holiId",
+                  "id": "u:e205156867e3",
+                  "multiple": false,
+                  "mode": "horizontal",
+                  "source": {
+                    "url": "/tStudent/getholi/$id",
+                    "method": "get",
+                    "requestAdaptor": "",
+                    "adaptor": "",
+                    "messages": {
+                    }
+                  },
+                  "value": "",
+                  "labelField": "value",
+                  "valueField": "id",
+                  "size": "md",
+                  "searchable": true
+                },
+                {
+                  "type": "input-text",
+                  "label": "扣除课时数:",
+                  "name": "classNum",
+                  "id": "u:0333b5c5d05c",
+                  "mode": "horizontal",
+                  "size": "md"
+                }
+              ],
+              "api": {
+                "url": "/tStudent/Toholi",
+                "method": "post",
+                "requestAdaptor": "",
+                "adaptor": "",
+                "messages": {
+                },
+                "dataType": "form-data"
+              },
+              "id": "u:8860df492a12"
+            }
+          ],
+          "id": "u:710cbc62ec24",
+          "actions": [
+          ]
+        }
+      ],
+      "id": "u:42603b55fcf2"
+    };
+    let amisScoped = amis.embed('#root', amisJSON);
+
+
+  })();
+
+  function test(){
+    console.log("测试成功")
+  }
+
+  var myButton = document.getElementById("ttt");
+  myButton.addEventListener("click",test);
+</script>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tStudent/trans.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tStudent/trans.html
new file mode 100644
index 0000000..f7e742c
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tStudent/trans.html
@@ -0,0 +1,128 @@
+<!DOCTYPE html>
+<html lang="zh">
+<head>
+  <meta charset="UTF-8" />
+  <title>amis demo</title>
+  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+  <meta
+          name="viewport"
+          content="width=device-width, initial-scale=1, maximum-scale=1"
+  />
+  <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
+  <link rel="stylesheet" href="${ctxPath}/sdk/sdk.css" />
+  <link rel="stylesheet" href="${ctxPath}/sdk/helper.css" />
+  <link rel="stylesheet" href="${ctxPath}/sdk/iconfont.css" />
+  <!-- 这是默认主题所需的,如果是其他主题则不需要 -->
+  <!-- 从 1.1.0 开始 sdk.css 将不支持 IE 11,如果要支持 IE11 请引用这个 css,并把前面那个删了 -->
+  <!-- <link rel="stylesheet" href="sdk-ie11.css" /> -->
+  <!-- 不过 amis 开发团队几乎没测试过 IE 11 下的效果,所以可能有细节功能用不了,如果发现请报 issue -->
+  <style>
+    html,
+    body,
+    .app-wrapper {
+      position: relative;
+      width: 100%;
+      height: 100%;
+      margin: 0;
+      padding: 0;
+    }
+  </style>
+</head>
+<body>
+<div id="root" class="app-wrapper"></div>
+<script src="${ctxPath}/sdk/sdk.js"></script>
+<script type="text/javascript">
+  (function () {
+    let amis = amisRequire('amis/embed');
+    // 通过替换下面这个配置来生成不同页面
+    let amisJSON = {
+      "type": "page",
+      "title": "",
+      "body": [
+        {
+          "type": "form",
+          "id": "u:710cbc62ec24",
+          "title": "",
+          "body": [
+            {
+              "type": "form",
+              "title": "",
+              "body": [
+                {
+                  "type": "tpl",
+                  "tpl": "&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp换课",
+                  "inline": true,
+                  "wrapperComponent": "h2",
+                  "id": "u:194f160daab4"
+                },
+                {
+                  "type": "input-text",
+                  "label": "id",
+                  "name": "id",
+                  "id": "u:d038053014ca",
+                  "mode": "horizontal",
+                  "size": "md"
+                },
+                {
+                  "type": "input-text",
+                  "label": "ids",
+                  "name": "ids",
+                  "id": "u:223b7f2a1a5b",
+                  "mode": "horizontal",
+                  "size": "md"
+                },
+                {
+                  "label": "换课课程:",
+                  "type": "select",
+                  "name": "holiId",
+                  "id": "u:e205156867e3",
+                  "multiple": false,
+                  "mode": "horizontal",
+                  "source": {
+                    "url": "/tStudent/gettrans/$id",
+                    "method": "get",
+                    "requestAdaptor": "",
+                    "adaptor": "",
+                    "messages": {
+                    }
+                  },
+                  "value": "",
+                  "labelField": "value",
+                  "valueField": "id",
+                  "size": "md",
+                  "searchable": true
+                }
+              ],
+              "api": {
+                "url": "/tStudent/ToTrans",
+                "method": "post",
+                "requestAdaptor": "",
+                "adaptor": "",
+                "messages": {
+                },
+                "dataType": "form-data"
+              },
+              "id": "u:8860df492a12"
+            }
+          ],
+          "actions": [
+          ]
+        }
+      ],
+      "id": "u:42603b55fcf2"
+    };
+    let amisScoped = amis.embed('#root', amisJSON);
+
+
+  })();
+
+  function test(){
+    console.log("测试成功")
+  }
+
+  var myButton = document.getElementById("ttt");
+  myButton.addEventListener("click",test);
+</script>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/cloud-server-management/src/main/webapp/static/modular/system/coursePackage/TCoupon.js b/cloud-server-management/src/main/webapp/static/modular/system/coursePackage/TCoupon.js
new file mode 100644
index 0000000..962bc3d
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/static/modular/system/coursePackage/TCoupon.js
@@ -0,0 +1,337 @@
+/**
+ * 管理初始化
+ */
+var TCoupon = {
+    id: "TCouponTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+// console.log("父级页面"+window.parent.getElementById("counpons"+$("#index").val()));
+console.log("父级页面" + window.parent.document.getElementById("counpons" + $("#index").val()).value);
+console.log( $("#index").val());
+
+var ids = window.parent.document.getElementById("counpons" + $("#index").val()).value;
+
+// console.log("==========radio=="+ids)
+/**
+ * 初始化表格的列
+ */
+TCoupon.initColumn = function () {
+    return [
+        {field: 'selectItem', checkbox: true,   formatter: function (value,row) {
+                if(ids.indexOf(row.id)!= -1){
+                    return {checked:true};
+                }}},
+        {title: 'id', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        {title: '优惠券名称', field: 'name', visible: true, align: 'center', valign: 'middle'},
+        {title: '适用范围', field: 'useScope', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row, index) {
+                return {1: "全国", 2: "指定城市", 3: "指定门店"}[value]
+            }
+        },
+        {title: '优惠券类型', field: 'type', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row, index) {
+                return {1: "满减券", 2: "代金券", 3: "体验券"}[value]
+            }},
+        {title: '发放方式', field: 'distributionMethod', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row, index) {
+                return {1: "积分购买", 2: "注册赠送", 3: "自动发券"}[value]
+            }},
+        {title: '有效期', field: 'timeValue', visible: true, align: 'center', valign: 'middle'},
+        {title: '用户人群', field: 'userPopulation', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row, index) {
+                return {1: "全部用户", 2: "年度会员", 3: "已有学员用户"}[value]
+            }},
+        {title: '发放数量', field: 'quantityIssued', visible: true, align: 'center', valign: 'middle'},
+        {title: '限领数量', field: 'pickUpQuantity', visible: true, align: 'center', valign: 'middle'},
+        {title: '已领数量', field: 'hasPickQty', visible: true, align: 'center', valign: 'middle'},
+        {title: '活动状态', field: 'status', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row, index) {
+                return {1: "未开始", 2: "已开始", 3: "已结束"}[value]
+            }},
+        {title: '可售状态', field: 'state', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row, index) {
+                return {1: "上架", 2: "下架"}[value]
+            }},
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+TCoupon.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        TCoupon.seItem = selected[0];
+        TCoupon.seItem1 = selected;
+
+        return true;
+    }
+};
+
+/**
+ * 点击添加
+ */
+TCoupon.openAdd = function () {
+    var index = layer.open({
+        type: 2,
+        title: '添加',
+        area: ['100%', '100%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tCouponManage/coupon_add'
+    });
+    this.layerIndex = index;
+};
+
+
+
+TCoupon.backids = function (i) {
+    console.log("aaaaaa"+i)
+    if (this.check()) {
+
+        var ids = TCoupon.seItem1.map(function(item) {
+            return item.id;
+        }).join(",");
+        // console.log("aaaaaa"+TCoupon.seItem1.map(function(item) {
+        //     return item.id;
+        // }).join(","))
+
+
+        // if (window.parent.document.getElementById("counpons"+i).value==null||window.parent.document.getElementById("counpons"+i).value==""){
+            window.parent.document.getElementById("counpons"+i).value = ids;
+        // }else {
+        //     window.parent.document.getElementById("counpons"+i).value =  window.parent.document.getElementById("counpons"+i).value + ','+TCoupon.seItem.id;
+        //
+        // }
+        window.parent.layer.closeAll();
+    }
+
+};
+
+/**
+ * 点击编辑
+ */
+TCoupon.openChange = function () {
+    if (this.check()){
+        let id = TCoupon.seItem.id
+        let name = TCoupon.seItem.name
+        let quantityIssued = TCoupon.seItem.quantityIssued
+        let pickUpQuantity = TCoupon.seItem.pickUpQuantity
+        let illustrate = TCoupon.seItem.illustrate
+        let hasPickQty = TCoupon.seItem.hasPickQty
+        var index = layer.load(1,{
+            type: 1
+            , title: '编辑优惠券'
+            , area: ['50%', '50%']
+            , offset: 'auto' //具体配置参考:http://www.layui.com/doc/modules/layer.html#offset
+            , id: 'layerDemo' //防止重复弹出cge
+            , content: '<div class="form-horizontal">' +
+                '                    <div class="col-sm-11" >' +
+                '                    <div class="col-sm-11">' +
+                '                        <div class="form-group">\n' +
+                '                            <label class="col-sm-3 control-label">优惠券名称:</label>\n' +
+                '                         <div class="col-sm-9">\n' +
+                '                                  <label class="form-control"  id="name" >'+name+'</label> '+
+                '                          </div>\n' +
+                '                        </div>\n'+
+            '                        <div class="form-group">\n' +
+                    '                            <label class="col-sm-3 control-label">发放数量:</label>\n' +
+                '                         <div class="col-sm-9">\n' +
+                '                                  <input class="form-control"  id="num" value="'+quantityIssued+'" > '+
+                '                          </div>\n' +
+                '                        </div>\n' +
+                '                        <div class="form-group">\n' +
+                '                            <label class="col-sm-3 control-label">限领数量:</label>\n' +
+                '                         <div class="col-sm-9">\n' +
+                '                                  <input class="form-control"  id="num1" value="'+pickUpQuantity+'" > '+
+                '                          </div>\n' +
+                '                        </div>\n' +
+                '                        <div class="form-group">\n' +
+                '                            <label class="col-sm-3 control-label">优惠券说明:</label>\n' +
+                '                         <div class="col-sm-9">\n' +
+                '                                  <textarea class="form-control"  id="text"  >'+illustrate+'</textarea> '+
+                '                          </div>\n' +
+                '                        </div>\n' +
+                '                       </div>' +
+                '                   </div>' +
+                '</div>'
+            , btn: ['关闭', '保存']
+            , btnAlign: 'c' //按钮居中
+            , shade:  0.5 //不显示遮罩
+            ,load:1
+            , yes: function () {
+                layer.closeAll();
+            },
+            btn2:function () {
+                let num = $("#num").val()
+                if(num==''){
+                    Feng.info("请输入发放数量")
+                    return false;
+                }
+                let num1 = $("#num1").val()
+                if(num1==''){
+                    Feng.info("请输入限领数量")
+                    return false;
+                }
+                let text = $("#text").val()
+                if(text==''){
+                    Feng.info("请输入优惠券说明")
+                    return false;
+                }
+
+                if(num<hasPickQty){
+                    Feng.info("发放数量不能小于已领取数量")
+                    return false;
+                }
+                var ajax = new $ax(Feng.ctxPath + "/tCouponManage/update", function (data) {
+                    if (data.code == 200) {
+                        Feng.success("操作成功!");
+                        window.location.reload();
+                        window.parent.layer.closeAll();
+                    } else if(data=="repeat"){
+                        window.location.reload();
+                        window.parent.layer.closeAll();
+                        Feng.error("请勿重复操作");
+                    }else {
+                        return  Feng.error(data.msg);
+                    }
+                }, function (data) {
+                    Feng.error("操作失败!")
+                    window.location.reload();
+                    window.parent.layer.closeAll();
+                    return   Feng.error("操作失败!");
+                });
+                ajax.set("id", id);
+                ajax.set("num", num);
+                ajax.set("num1", num1);
+                ajax.set("text", text);
+                ajax.start();
+                layer.closeAll();
+            }
+        });
+
+        this.layerIndex = index;
+    }
+};
+
+
+
+/**
+ * 上架
+ */
+
+
+/**
+ * 下架
+ */
+TCoupon.offShelf = function () {
+
+
+};
+
+
+/**
+ * 打开查看详情
+ */
+TCoupon.openDetail = function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '详情',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tCouponManage/coupon_detail/' + TCoupon.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+
+
+
+/**
+ * 打开领取记录
+ */
+TCoupon.openCollectionRecord = function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '详情',
+            area: ['800px', '420px'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tCouponManage/coupon_record/' + TCoupon.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+TCoupon.onShelf = function (e) {
+    if (this.check()) {
+        var ajax = new $ax(Feng.ctxPath + "/tCouponManage/onShelf", function(data){
+            if(data.code==200){
+                Feng.success("操作成功!")
+                TCoupon.table.refresh();
+            }
+        },function(data){
+            Feng.error("操作失败!" + data.responseJSON.message + "!");
+        });
+        ajax.set("id",TCoupon.seItem.id)
+        ajax.set("type",e)
+        ajax.start();
+    }
+};
+
+
+
+/**
+ * 查询列表
+ */
+TCoupon.search = function () {
+    var queryData = {};
+    queryData['name'] = $("#name").val();
+    queryData['type'] = $("#type").val();
+    queryData['distributionMethod'] = $("#distributionMethod").val();
+    queryData['userPopulation'] = $("#userPopulation").val();
+    queryData['status'] = $("#status").val();
+    queryData['state'] = $("#state").val();
+    TCoupon.table.refresh({query: queryData});
+};
+
+
+/**
+ * 重置搜索
+ */
+TCoupon.resetSearch = function () {
+    $("#name").val('');
+    $("#type").val('');
+    $("#distributionMethod").val('');
+    $("#userPopulation").val('');
+    $("#status").val('');
+    $("#state").val('');
+    TCoupon.search();
+};
+
+$(function () {
+    // console.log("父级"+window.parent.document.getElementById("cityCode").val())
+    console.log("父级" + window.parent.document.getElementById("cityCode").value);
+    var defaultColunms = TCoupon.initColumn();
+    var table = new BSTable(TCoupon.id, "/tCouponManage/list1", defaultColunms);
+    table.setPaginationType("client");
+    // table.queryParams = function (params) {
+    //     // 在这里添加您的自定义参数
+    //     params.cityCode = window.parent.document.getElementById("cityCode").value;
+    //     params.customParam2 = window.parent.document.getElementById("cityCode").value;
+    //     return params;
+    // };
+
+    table.queryParams = {'cityCode': window.parent.document.getElementById("cityCode").value,'storeId': window.parent.document.getElementById("storeId").value}
+    table.height=400
+    TCoupon.table = table.init();
+});
diff --git a/cloud-server-management/src/main/webapp/static/modular/system/coursePackage/TCouponEdit.js b/cloud-server-management/src/main/webapp/static/modular/system/coursePackage/TCouponEdit.js
new file mode 100644
index 0000000..f781b6a
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/static/modular/system/coursePackage/TCouponEdit.js
@@ -0,0 +1,314 @@
+/**
+ * 管理初始化
+ */
+var TCoupon = {
+    id: "TCouponTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+var ids = $("#conpund").val();
+
+console.log("==========radio=="+ids)
+/**
+ * 初始化表格的列
+ */
+TCoupon.initColumn = function () {
+    return [
+        {field: 'selectItem', checkbox: true,   formatter: function (value,row) {
+                if(ids.indexOf(row.id)!= -1){
+                    return {checked:true};
+                }}},
+        {title: 'id', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        {title: '优惠券名称', field: 'name', visible: true, align: 'center', valign: 'middle'},
+        {title: '适用范围', field: 'useScope', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row, index) {
+                return {1: "全国", 2: "指定城市", 3: "指定门店"}[value]
+            }
+        },
+        {title: '优惠券类型', field: 'type', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row, index) {
+                return {1: "满减券", 2: "代金券", 3: "体验券"}[value]
+            }},
+        {title: '发放方式', field: 'distributionMethod', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row, index) {
+                return {1: "积分购买", 2: "注册赠送", 3: "自动发券"}[value]
+            }},
+        {title: '有效期', field: 'timeValue', visible: true, align: 'center', valign: 'middle'},
+        {title: '用户人群', field: 'userPopulation', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row, index) {
+                return {1: "全部用户", 2: "年度会员", 3: "已有学员用户"}[value]
+            }},
+        {title: '发放数量', field: 'quantityIssued', visible: true, align: 'center', valign: 'middle'},
+        {title: '限领数量', field: 'pickUpQuantity', visible: true, align: 'center', valign: 'middle'},
+        {title: '已领数量', field: 'hasPickQty', visible: true, align: 'center', valign: 'middle'},
+        {title: '活动状态', field: 'status', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row, index) {
+                return {1: "未开始", 2: "已开始", 3: "已结束"}[value]
+            }},
+        {title: '可售状态', field: 'state', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row, index) {
+                return {1: "上架", 2: "下架"}[value]
+            }},
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+TCoupon.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        TCoupon.seItem = selected[0];
+        TCoupon.seItem1 = selected;
+
+        return true;
+    }
+};
+
+/**
+ * 点击添加
+ */
+TCoupon.openAdd = function () {
+    var index = layer.open({
+        type: 2,
+        title: '添加',
+        area: ['100%', '100%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tCouponManage/coupon_add'
+    });
+    this.layerIndex = index;
+};
+
+
+
+TCoupon.backids = function (i) {
+    console.log("aaaaaa"+i)
+    if (this.check()) {
+
+        var ids = TCoupon.seItem1.map(function(item) {
+            return item.id;
+        }).join(",");
+
+        window.parent.document.getElementById("counpons"+i).value = ids;
+
+        window.parent.layer.closeAll();
+    }
+
+};
+
+/**
+ * 点击编辑
+ */
+TCoupon.openChange = function () {
+    if (this.check()){
+        let id = TCoupon.seItem.id
+        let name = TCoupon.seItem.name
+        let quantityIssued = TCoupon.seItem.quantityIssued
+        let pickUpQuantity = TCoupon.seItem.pickUpQuantity
+        let illustrate = TCoupon.seItem.illustrate
+        let hasPickQty = TCoupon.seItem.hasPickQty
+        var index = layer.load(1,{
+            type: 1
+            , title: '编辑优惠券'
+            , area: ['50%', '50%']
+            , offset: 'auto' //具体配置参考:http://www.layui.com/doc/modules/layer.html#offset
+            , id: 'layerDemo' //防止重复弹出cge
+            , content: '<div class="form-horizontal">' +
+                '                    <div class="col-sm-11" >' +
+                '                    <div class="col-sm-11">' +
+                '                        <div class="form-group">\n' +
+                '                            <label class="col-sm-3 control-label">优惠券名称:</label>\n' +
+                '                         <div class="col-sm-9">\n' +
+                '                                  <label class="form-control"  id="name" >'+name+'</label> '+
+                '                          </div>\n' +
+                '                        </div>\n'+
+            '                        <div class="form-group">\n' +
+                    '                            <label class="col-sm-3 control-label">发放数量:</label>\n' +
+                '                         <div class="col-sm-9">\n' +
+                '                                  <input class="form-control"  id="num" value="'+quantityIssued+'" > '+
+                '                          </div>\n' +
+                '                        </div>\n' +
+                '                        <div class="form-group">\n' +
+                '                            <label class="col-sm-3 control-label">限领数量:</label>\n' +
+                '                         <div class="col-sm-9">\n' +
+                '                                  <input class="form-control"  id="num1" value="'+pickUpQuantity+'" > '+
+                '                          </div>\n' +
+                '                        </div>\n' +
+                '                        <div class="form-group">\n' +
+                '                            <label class="col-sm-3 control-label">优惠券说明:</label>\n' +
+                '                         <div class="col-sm-9">\n' +
+                '                                  <textarea class="form-control"  id="text"  >'+illustrate+'</textarea> '+
+                '                          </div>\n' +
+                '                        </div>\n' +
+                '                       </div>' +
+                '                   </div>' +
+                '</div>'
+            , btn: ['关闭', '保存']
+            , btnAlign: 'c' //按钮居中
+            , shade:  0.5 //不显示遮罩
+            ,load:1
+            , yes: function () {
+                layer.closeAll();
+            },
+            btn2:function () {
+                let num = $("#num").val()
+                if(num==''){
+                    Feng.info("请输入发放数量")
+                    return false;
+                }
+                let num1 = $("#num1").val()
+                if(num1==''){
+                    Feng.info("请输入限领数量")
+                    return false;
+                }
+                let text = $("#text").val()
+                if(text==''){
+                    Feng.info("请输入优惠券说明")
+                    return false;
+                }
+
+                if(num<hasPickQty){
+                    Feng.info("发放数量不能小于已领取数量")
+                    return false;
+                }
+                var ajax = new $ax(Feng.ctxPath + "/tCouponManage/update", function (data) {
+                    if (data.code == 200) {
+                        Feng.success("操作成功!");
+                        window.location.reload();
+                        window.parent.layer.closeAll();
+                    } else if(data=="repeat"){
+                        window.location.reload();
+                        window.parent.layer.closeAll();
+                        Feng.error("请勿重复操作");
+                    }else {
+                        return  Feng.error(data.msg);
+                    }
+                }, function (data) {
+                    Feng.error("操作失败!")
+                    window.location.reload();
+                    window.parent.layer.closeAll();
+                    return   Feng.error("操作失败!");
+                });
+                ajax.set("id", id);
+                ajax.set("num", num);
+                ajax.set("num1", num1);
+                ajax.set("text", text);
+                ajax.start();
+                layer.closeAll();
+            }
+        });
+
+        this.layerIndex = index;
+    }
+};
+
+
+
+/**
+ * 上架
+ */
+
+
+/**
+ * 下架
+ */
+TCoupon.offShelf = function () {
+
+
+};
+
+
+/**
+ * 打开查看详情
+ */
+TCoupon.openDetail = function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '详情',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tCouponManage/coupon_detail/' + TCoupon.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+
+
+
+/**
+ * 打开领取记录
+ */
+TCoupon.openCollectionRecord = function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '详情',
+            area: ['800px', '420px'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tCouponManage/coupon_record/' + TCoupon.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+TCoupon.onShelf = function (e) {
+    if (this.check()) {
+        var ajax = new $ax(Feng.ctxPath + "/tCouponManage/onShelf", function(data){
+            if(data.code==200){
+                Feng.success("操作成功!")
+                TCoupon.table.refresh();
+            }
+        },function(data){
+            Feng.error("操作失败!" + data.responseJSON.message + "!");
+        });
+        ajax.set("id",TCoupon.seItem.id)
+        ajax.set("type",e)
+        ajax.start();
+    }
+};
+
+
+
+/**
+ * 查询列表
+ */
+TCoupon.search = function () {
+    var queryData = {};
+    queryData['name'] = $("#name").val();
+    queryData['type'] = $("#type").val();
+    queryData['distributionMethod'] = $("#distributionMethod").val();
+    queryData['userPopulation'] = $("#userPopulation").val();
+    queryData['status'] = $("#status").val();
+    queryData['state'] = $("#state").val();
+    TCoupon.table.refresh({query: queryData});
+};
+
+
+/**
+ * 重置搜索
+ */
+TCoupon.resetSearch = function () {
+    $("#name").val('');
+    $("#type").val('');
+    $("#distributionMethod").val('');
+    $("#userPopulation").val('');
+    $("#status").val('');
+    $("#state").val('');
+    TCoupon.search();
+};
+
+$(function () {
+    var defaultColunms = TCoupon.initColumn();
+    var table = new BSTable(TCoupon.id, "/tCouponManage/list", defaultColunms);
+    table.setPaginationType("client");
+    TCoupon.table = table.init();
+});
diff --git a/cloud-server-management/src/main/webapp/static/modular/system/tStudent/htmlToPdf.js b/cloud-server-management/src/main/webapp/static/modular/system/tStudent/htmlToPdf.js
new file mode 100644
index 0000000..983a829
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/static/modular/system/tStudent/htmlToPdf.js
@@ -0,0 +1,66 @@
+// 页面导出为pdf格式
+import html2Canvas from 'html2canvas';
+import jsPDF from 'jspdf';
+
+const htmlToPdf = {
+  getPdf(title, loading) {
+    return html2Canvas(document.querySelector('#pdfDom'), {
+      allowTaint: false,
+      taintTest: false,
+      logging: false,
+      useCORS: true,
+      dpi: window.devicePixelRatio * 4, //将分辨率提高到特定的DPI 提高四倍
+      scale: 4, //按比例增加分辨率
+    }).then((canvas) => {
+      var pdf = new jsPDF('p', 'mm', 'a4'); //A4纸,纵向
+      var ctx = canvas.getContext('2d'),
+        a4w = 190,
+        a4h = 272, //A4大小,210mm x 297mm,四边各保留10mm的边距,显示区域190x277
+        // imgHeight = Math.floor((a4h * canvas.width) / a4w), //按A4显示比例换算一页图像的像素高度
+        imgHeight = canvas.height, //按A4显示比例换算一页图像的像素高度
+
+        renderedHeight = 0;
+
+      while (renderedHeight < canvas.height) {
+        var page = document.createElement('canvas');
+        page.width = canvas.width;
+        page.height = Math.min(imgHeight, canvas.height - renderedHeight); //可能内容不足一页
+
+        //用getImageData剪裁指定区域,并画到前面创建的canvas对象中
+        page
+          .getContext('2d')
+          .putImageData(
+            ctx.getImageData(
+              0,
+              renderedHeight,
+              canvas.width,
+              Math.min(imgHeight, canvas.height - renderedHeight),
+            ),
+            0,
+            0,
+          );
+        pdf.addImage(
+          page.toDataURL('image/jpeg', 1.0),
+          'JPEG',
+          10,
+          10,
+          a4w,
+          Math.min(a4h, (a4w * page.height) / page.width),
+        ); //添加图像到页面,保留10mm边距
+
+        renderedHeight += imgHeight;
+        if (renderedHeight < canvas.height) {
+          pdf.addPage(); //如果后面还有内容,添加一个空页
+        }
+        // delete page;
+      }
+      //保存文件
+      // pdf.save(title + '.pdf');
+      // loading = false;
+      // 删除本地存储的base64字段
+      return pdf.output('datauristring')//获取base64Pdf
+    });
+  },
+};
+
+export default htmlToPdf;
diff --git a/cloud-server-other/src/main/java/com/dsh/other/model/dto/siteDto/GiftSearchDto.java b/cloud-server-other/src/main/java/com/dsh/other/model/dto/siteDto/GiftSearchDto.java
new file mode 100644
index 0000000..abcc814
--- /dev/null
+++ b/cloud-server-other/src/main/java/com/dsh/other/model/dto/siteDto/GiftSearchDto.java
@@ -0,0 +1,9 @@
+package com.dsh.other.model.dto.siteDto;
+
+import lombok.Data;
+
+@Data
+public class GiftSearchDto {
+    String name;
+    String phone;
+}
diff --git a/cloud-server-other/src/main/java/com/dsh/other/model/dto/siteDto/SelectDto.java b/cloud-server-other/src/main/java/com/dsh/other/model/dto/siteDto/SelectDto.java
new file mode 100644
index 0000000..132eea7
--- /dev/null
+++ b/cloud-server-other/src/main/java/com/dsh/other/model/dto/siteDto/SelectDto.java
@@ -0,0 +1,9 @@
+package com.dsh.other.model.dto.siteDto;
+
+import lombok.Data;
+
+@Data
+public class SelectDto {
+    Integer id;
+    String value;
+}

--
Gitblit v1.7.1