From b3ec53a9da0c09dd03da33bfc27f278d13a5d8f9 Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期四, 16 二月 2023 19:08:23 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 management/guns-admin/src/main/webapp/static/modular/system/tAppUser/tAppUserException.js                          |  274 +++
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOrderMapper.java                        |   16 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/util/ExcelUtil.java               |   56 
 management/guns-admin/src/main/webapp/static/modular/system/tAppUser/tOrder.js                                     |  122 +
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TCouponMapper.java                       |   18 
 management/guns-admin/src/main/webapp/WEB-INF/view/common/_right.html                                              |    4 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TOrderController.java     |  153 +
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrder/tOrder.html                                       |   38 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrder.java                            |  375 ++++
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/enums/CouponStatusEnum.java                  |   52 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TAppUser.java                          |  260 +++
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tCoupon/tCoupon_edit.html                                |   28 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/req/CouponSendReq.java            |   33 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/resp/TAppUserDetailOrderResp.java |   67 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tAppUser/tAppUserStartAndStop.html                       |   32 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tCoupon/tCoupon_add.html                                 |   28 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tAppUser/tAppUser.html                                   |   74 
 management/guns-admin/src/main/webapp/static/modular/system/tOrder/tOrder.js                                       |  122 +
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITCouponService.java                 |   16 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TAppUserServiceImpl.java        |   89 +
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TAppUserMapper.java                      |   19 
 management/guns-admin/src/main/webapp/static/modular/system/tAppUser/tAppUserDetailOrder.js                        |  108 +
 management/guns-admin/src/main/webapp/static/modular/system/tCoupon/tCoupon_info.js                                |   95 +
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOrderMapper.xml                 |   40 
 management/guns-admin/src/main/webapp/WEB-INF/view/index.html                                                      |    2 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tAppUser/tAppUserDetail.html                             |  177 ++
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITOrderService.java                  |   16 
 management/guns-admin/pom.xml                                                                                      |    5 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TAppUserMapper.xml               |   29 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TCouponServiceImpl.java         |   20 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserMapper.xml                   |    4 
 management/guns-admin/src/main/webapp/WEB-INF/view/login.html                                                      |   36 
 management/guns-admin/src/main/webapp/static/modular/system/tOrder/tOrder_info.js                                  |  118 +
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/User.java                              |    4 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderServiceImpl.java          |   20 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tAppUser/tAppUserDetailException.html                    |  177 ++
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TCouponMapper.xml                |   27 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tCoupon/tCoupon.html                                     |   38 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrder/tOrder_edit.html                                  |   51 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TCouponController.java    |  176 ++
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TCoupon.java                           |  187 ++
 management/guns-admin/src/main/resources/application.yml                                                           |   10 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrder/tOrder_add.html                                   |   51 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tAppUser/tAppUserException.html                          |   70 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITAppUserService.java                |   35 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tAppUser/tAppUser_edit.html                              |   38 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TAppUserController.java   |  395 ++++
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tAppUser/tAppUser_add.html                               |   38 
 management/guns-admin/src/main/webapp/static/modular/system/tAppUser/tCoupon.js                                    |  145 +
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tAppUser/tAppUserStartAndStopException.html              |   32 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tAppUser/tCouponException.html                           |   35 
 management/guns-admin/src/main/webapp/static/modular/system/tCoupon/tCoupon.js                                     |  107 +
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/util/WebUtils.java                |  169 ++
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/exports/TAppUserExceptionExport.java         |  120 +
 management/guns-admin/src/main/webapp/static/modular/system/tAppUser/tAppUser.js                                   |  257 +++
 management/guns-admin/src/main/webapp/WEB-INF/view/404.html                                                        |    2 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/LoginController.java       |   73 
 management/guns-admin/src/main/webapp/static/modular/system/tAppUser/tAppUser_info.js                              |  116 +
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tAppUser/tCoupon.html                                    |   34 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/req/TAppUserReq.java              |   92 +
 60 files changed, 4,982 insertions(+), 43 deletions(-)

diff --git a/management/guns-admin/pom.xml b/management/guns-admin/pom.xml
index d05d5a9..e1db7c5 100644
--- a/management/guns-admin/pom.xml
+++ b/management/guns-admin/pom.xml
@@ -72,12 +72,12 @@
         <dependency>
             <groupId>org.apache.poi</groupId>
             <artifactId>poi</artifactId>
-            <version>RELEASE</version>
+            <version>5.0.0</version>
         </dependency>
         <dependency>
             <groupId>org.apache.poi</groupId>
             <artifactId>poi-ooxml</artifactId>
-            <version>RELEASE</version>
+            <version>5.0.0</version>
         </dependency>
 
         <!--shiro依赖-->
@@ -157,6 +157,7 @@
             <groupId>io.jsonwebtoken</groupId>
             <artifactId>jjwt</artifactId>
         </dependency>
+
 		<dependency>
 		    <groupId>commons-io</groupId>
 		    <artifactId>commons-io</artifactId>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TAppUserController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TAppUserController.java
new file mode 100644
index 0000000..216eed1
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TAppUserController.java
@@ -0,0 +1,395 @@
+package com.stylefeng.guns.modular.system.controller.general;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import com.stylefeng.guns.modular.system.controller.util.ExcelUtil;
+import com.stylefeng.guns.modular.system.enums.CouponStatusEnum;
+import com.stylefeng.guns.modular.system.exports.TAppUserExceptionExport;
+import com.stylefeng.guns.modular.system.model.TAppUser;
+import com.stylefeng.guns.modular.system.model.TCoupon;
+import com.stylefeng.guns.modular.system.service.ITAppUserService;
+import com.stylefeng.guns.modular.system.service.ITCouponService;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.OutputStream;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+/**
+ * 控制器
+ *
+ * @author fengshuonan
+ * @Date 2023-02-14 08:55:42
+ */
+@Controller
+@RequestMapping("/tAppUser")
+public class TAppUserController extends BaseController {
+
+    private String PREFIX = "/system/tAppUser/";
+
+    @Autowired
+    private ITAppUserService tAppUserService;
+    @Autowired
+    private ITCouponService tCouponService;
+
+    /**
+     * 跳转到首页
+     */
+    @RequestMapping("")
+    public String index() {
+        return PREFIX + "tAppUser.html";
+    }
+
+    /**
+     * 跳转到添加
+     */
+    @RequestMapping("/tAppUser_add")
+    public String tAppUserAdd() {
+        return PREFIX + "tAppUser_add.html";
+    }
+
+    /**
+     * 赠送优惠券查询页面
+     * @return
+     */
+    @RequestMapping("/sendCoupon")
+    public String sendCoupon( String userIds,Model model) {
+        model.addAttribute("userIds",userIds);
+        return PREFIX + "tCoupon.html";
+    }
+
+    /**
+     * 赠送优惠券查询页面
+     * @return
+     */
+    @RequestMapping("/sendCouponException")
+    public String sendCouponException( String userIds,Model model) {
+        model.addAttribute("userIds",userIds);
+        return PREFIX + "tCouponException.html";
+    }
+
+    /**
+     * 跳转异常用户页面
+     * @return
+     */
+    @RequestMapping("/tAppUser_exception")
+    public String tAppUserException(Integer isException,Model model) {
+        isException = 2;
+        model.addAttribute("isException",isException);
+        return PREFIX + "tAppUserException.html";
+    }
+
+    /**
+     * 跳转冻结页面
+     * @return
+     */
+    @RequestMapping("/tAppUser_start_and_stop")
+    public String tAppUserStartAndStop( Integer id,
+                                      Model model) {
+        TAppUser tAppUser = tAppUserService.selectById(id);
+
+        model.addAttribute("id",id);
+        model.addAttribute("status",tAppUser.getStatus());
+        return PREFIX + "tAppUserStartAndStop.html";
+    }
+
+    /**
+     * 异常页面跳转冻结页面
+     * @return
+     */
+    @RequestMapping("/tAppUserException_start_and_stop")
+    public String tAppUserExceptionStartAndStop( Integer id,
+                                        Model model) {
+        TAppUser tAppUser = tAppUserService.selectById(id);
+
+        model.addAttribute("id",id);
+        model.addAttribute("status",tAppUser.getStatus());
+        return PREFIX + "tAppUserStartAndStopException.html";
+    }
+
+    /**
+     * 跳转到修改
+     */
+    @RequestMapping("/tAppUser_update/{tAppUserId}")
+    public String tAppUserUpdate(@PathVariable Integer tAppUserId, Model model) {
+        TAppUser tAppUser = tAppUserService.selectById(tAppUserId);
+        model.addAttribute("item",tAppUser);
+        LogObjectHolder.me().set(tAppUser);
+        return PREFIX + "tAppUser_edit.html";
+    }
+
+    /**
+     * 跳转详情页面
+     */
+    @RequestMapping("/userDetail")
+    public String userDetail(Integer tAppUserId, Model model) {
+        tAppUserService.detail(tAppUserId,model);
+
+        return PREFIX + "tAppUserDetail.html";
+    }
+
+    /**
+     * 异常页面跳转详情页面
+     */
+    @RequestMapping("/userDetailException")
+    public String userDetailException(Integer tAppUserId, Model model) {
+        tAppUserService.detail(tAppUserId,model);
+        return PREFIX + "tAppUserDetailException.html";
+    }
+
+    @ApiOperation(value = "异常用户页面列表")
+    @RequestMapping("/exceptionUserList")
+    @ResponseBody
+    public Object exceptionUserList(String createTime,
+                                    String nickname,
+                                    String phone,
+                                    Integer id,
+                                    Integer status) {
+
+        EntityWrapper<TAppUser> wrapper = tAppUserService.getUserListWrapper(createTime,nickname,phone,id,status);
+        // 是否异常
+        wrapper.eq("is_exception",2);
+        return tAppUserService.selectList(wrapper);
+    }
+
+
+    /**
+     * 获取列表
+     */
+    @ApiOperation(value = "用户页面列表")
+    @RequestMapping(value = "/list")
+    @ResponseBody
+    public Object getList(String createTime,
+                          String nickname,
+                          String phone,
+                          Integer id,
+                          Integer status) {
+        EntityWrapper<TAppUser> wrapper = tAppUserService.getUserListWrapper(createTime,nickname,phone,id,status);
+        return tAppUserService.selectList(wrapper);
+    }
+
+    /**
+     * 获取列表
+     */
+    @RequestMapping(value = "/list-back")
+    @ResponseBody
+    public Object list(String condition) {
+        return tAppUserService.selectList(null);
+    }
+
+    /**
+     * 新增
+     */
+    @RequestMapping(value = "/add")
+    @ResponseBody
+    public Object add(TAppUser tAppUser) {
+        tAppUserService.insert(tAppUser);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 删除
+     */
+    @RequestMapping(value = "/delete")
+    @ResponseBody
+    public Object delete(@RequestParam Integer tAppUserId) {
+        tAppUserService.deleteById(tAppUserId);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 修改
+     */
+    @RequestMapping(value = "/update-status")
+    @ResponseBody
+    public Object updateStatus(Integer id,
+                               Integer status,
+                               String remark) {
+        TAppUser tAppUser = tAppUserService.selectById(id);
+        if(1 == status){
+            tAppUser.setStatus(2);
+        }
+        if(2 == status){
+            tAppUser.setStatus(1);
+        }
+        tAppUser.setRemark(remark);
+        tAppUserService.updateById(tAppUser);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 修改
+     */
+    @RequestMapping(value = "/update")
+    @ResponseBody
+    public Object update(TAppUser tAppUser) {
+        tAppUserService.updateById(tAppUser);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 详情
+     */
+    @RequestMapping(value = "/detail/{tAppUserId}")
+    @ResponseBody
+    public Object detail(@PathVariable("tAppUserId") Integer tAppUserId) {
+        return tAppUserService.selectById(tAppUserId);
+    }
+
+    @ApiOperation(value = "导出用户列表",notes="导出用户列表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "Authorization", value = "用户token(Bearer +token)", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9....."),
+    })
+    @RequestMapping(value = "/export-userInfo")
+    @ResponseBody
+    public void exportUserInfo(String createTime,
+                                 String nickname,
+                                 String phone,
+                                 Integer id,
+                                 Integer status, HttpServletResponse response) {
+        try {
+            Date date = new Date();
+            DateFormat format = new SimpleDateFormat("yyyyMMdd");
+            String time1 = format.format(date);
+            String fileName = "UserInfo"+time1+".xls";
+            String[] title = new String[] {"用户ID","用户昵称","手机号","性别","头像","微信openid",
+                    "微信unionid","紧急联系人","紧急联系电话","账户余额","用户标签id","状态","添加时间"};
+            EntityWrapper<TAppUser> wrapper = tAppUserService.getUserListWrapper(createTime,nickname,phone,id,status);
+            // 是否异常
+            wrapper.eq("is_exception",2);
+            List<TAppUser> list = tAppUserService.selectList(wrapper);
+
+            String[][] values = new String[list.size()][];
+            for (int i = 0; i < list.size(); i++) {
+                TAppUser d = list.get(i);
+                values[i] = new String[title.length];
+                values[i][0] = d.getId().toString();
+                values[i][1] = d.getNickname();
+                values[i][2] = d.getPhone();
+                Integer sex = d.getSex();
+                if(1 == sex){
+                    values[i][3] = "男";
+                }else if(2 == sex){
+                    values[i][3] = "女";
+                }else {
+                    values[i][3] = "未知";
+                }
+                values[i][4] = d.getAvatar();
+                values[i][5] = d.getOpenid();
+                values[i][6] = d.getUnionid();
+                values[i][7] = d.getEmergencyContact();
+                values[i][8] = d.getEmergencyPhone();
+                values[i][9] = d.getAccountBalance().toString();
+                values[i][10] = d.getUserTagId().toString();
+                Integer status1 = d.getStatus();
+                if(1 == status1){
+                    values[i][11] = "正常";
+                }else if(2 == status1){
+                    values[i][11] = "冻结";
+                }else {
+                    values[i][11] = "删除";
+                }
+                values[i][12] = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(d.getCreateTime());
+            }
+            HSSFWorkbook wb = ExcelUtil.getHSSFWorkbook("Variance"+time1, title, values, null);
+            ExcelUtil.setResponseHeader(response, fileName);
+            OutputStream os = response.getOutputStream();
+            wb.write(os);
+            os.flush();
+            os.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+
+    @ApiOperation(value = "导出异常用户列表",notes="导出异常用户列表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "Authorization", value = "用户token(Bearer +token)", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9....."),
+    })
+    @RequestMapping(value = "/export-exceptionUserInfo")
+    @ResponseBody
+    public void exportExceptionUserInfo(String createTime,
+                               String nickname,
+                               String phone,
+                               Integer id,
+                               Integer status, HttpServletResponse response) {
+        try {
+            Date date = new Date();
+            DateFormat format = new SimpleDateFormat("yyyyMMdd");
+            String time1 = format.format(date);
+            String fileName = "ExceptionUserInfo"+time1+".xls";
+            String[] title = new String[] {"注册时间","用户ID","用户昵称","手机号","剩余优惠券","优惠券总数",
+                    "消费次数","历史消费","最后一次消费时间","状态"};
+            EntityWrapper<TAppUser> wrapper = tAppUserService.getUserListWrapper(createTime,nickname,phone,id,status);
+            // 是否异常
+            wrapper.eq("is_exception",2);
+            List<TAppUser> list = tAppUserService.selectList(wrapper);
+
+            List<TAppUserExceptionExport> exportList = new ArrayList<>(list.size());
+            for (TAppUser tAppUser : list) {
+                TAppUserExceptionExport export = new TAppUserExceptionExport();
+                BeanUtils.copyProperties(tAppUser,export);
+                // 查询优惠券
+                List<TCoupon> tCoupons = tCouponService.selectList(new EntityWrapper<TCoupon>().eq("user_id", tAppUser.getId()));
+                // 优惠券总数
+                export.setCouponsSum(tCoupons.size());
+                tCoupons = tCoupons.stream().filter(coupon->coupon.getCouponStatus().equals(CouponStatusEnum.NOT_USED.getCode())).collect(Collectors.toList());
+                // 剩余优惠券
+                export.setRemainingCoupons(tCoupons.size());
+                // TODO 查询消费记录
+                exportList.add(export);
+            }
+            String[][] values = new String[list.size()][];
+            for (int i = 0; i < list.size(); i++) {
+                TAppUserExceptionExport d = exportList.get(i);
+                values[i] = new String[title.length];
+                values[i][0] = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(d.getCreateTime());
+                values[i][1] = d.getId().toString();
+                values[i][2] = d.getNickname();
+                values[i][3] = d.getPhone();
+                values[i][4] = d.getRemainingCoupons().toString();
+                values[i][5] = d.getCouponsSum().toString();
+                values[i][6] = d.getConsumptionTimes().toString();
+                values[i][7] = d.getHistoricalConsumption().toString();
+                if(Objects.nonNull(d.getLastConsumptionTime())){
+                    values[i][8] = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(d.getLastConsumptionTime());
+                }else {
+                    values[i][8] = "";
+                }
+                Integer status1 = d.getStatus();
+                if(1 == status1){
+                    values[i][9] = "正常";
+                }else if(2 == status1){
+                    values[i][9] = "冻结";
+                }else {
+                    values[i][9] = "删除";
+                }
+            }
+            HSSFWorkbook wb = ExcelUtil.getHSSFWorkbook("Variance"+time1, title, values, null);
+            ExcelUtil.setResponseHeader(response, fileName);
+            OutputStream os = response.getOutputStream();
+            wb.write(os);
+            os.flush();
+            os.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TCouponController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TCouponController.java
new file mode 100644
index 0000000..b7814cb
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TCouponController.java
@@ -0,0 +1,176 @@
+package com.stylefeng.guns.modular.system.controller.general;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.modular.system.controller.req.CouponSendReq;
+import com.stylefeng.guns.modular.system.enums.CouponStatusEnum;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.stereotype.Controller;
+import org.springframework.util.Assert;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import org.springframework.web.bind.annotation.RequestParam;
+import com.stylefeng.guns.modular.system.model.TCoupon;
+import com.stylefeng.guns.modular.system.service.ITCouponService;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * 控制器
+ *
+ * @author fengshuonan
+ * @Date 2023-02-14 10:59:23
+ */
+@Controller
+@RequestMapping("/tCoupon")
+public class TCouponController extends BaseController {
+
+    private String PREFIX = "/system/tCoupon/";
+
+    @Autowired
+    private ITCouponService tCouponService;
+
+    /**
+     * 跳转到首页
+     */
+    @RequestMapping("")
+    public String index() {
+        return PREFIX + "tCoupon.html";
+    }
+
+    /**
+     * 跳转到添加
+     */
+    @RequestMapping("/tCoupon_add")
+    public String tCouponAdd() {
+        return PREFIX + "tCoupon_add.html";
+    }
+
+    /**
+     * 跳转到修改
+     */
+    @RequestMapping("/tCoupon_update/{tCouponId}")
+    public String tCouponUpdate(@PathVariable Integer tCouponId, Model model) {
+        TCoupon tCoupon = tCouponService.selectById(tCouponId);
+        model.addAttribute("item",tCoupon);
+        LogObjectHolder.me().set(tCoupon);
+        return PREFIX + "tCoupon_edit.html";
+    }
+
+    /**
+     * 获取列表
+     */
+    @RequestMapping(value = "/list")
+    @ResponseBody
+    public Object list(String condition) {
+        EntityWrapper<TCoupon> wrapper = new EntityWrapper<>();
+        if(StringUtils.hasLength(condition)){
+            wrapper.like("coupon_name",condition);
+        }
+        wrapper.groupBy(true,"coupon_name");
+        return tCouponService.selectList(wrapper);
+    }
+
+    /**
+     * 获取列表
+     */
+    @RequestMapping(value = "/list-back")
+    @ResponseBody
+    public Object listBack(String condition) {
+        return tCouponService.selectList(null);
+    }
+
+    /**
+     * 新增
+     */
+    @RequestMapping(value = "/add")
+    @ResponseBody
+    public Object add(TCoupon tCoupon) {
+        tCouponService.insert(tCoupon);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 删除
+     */
+    @RequestMapping(value = "/delete")
+    @ResponseBody
+    public Object delete(@RequestParam Integer tCouponId) {
+        tCouponService.deleteById(tCouponId);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 修改
+     */
+    @RequestMapping(value = "/update")
+    @ResponseBody
+    public Object update(TCoupon tCoupon) {
+        tCouponService.updateById(tCoupon);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 详情
+     */
+    @RequestMapping(value = "/detail/{tCouponId}")
+    @ResponseBody
+    public Object detail(@PathVariable("tCouponId") Integer tCouponId) {
+        return tCouponService.selectById(tCouponId);
+    }
+
+    /**
+     * 发放优惠券
+     */
+    @ApiOperation(value = "发放优惠券")
+    @RequestMapping(value = "/sendCouponToUser")
+    @ResponseBody
+    public Object sendCouponToUser(CouponSendReq couponSendReq) {
+
+        List<Integer> userIds = couponSendReq.getUserIds();
+
+        // 查询该优惠券的列表
+        List<TCoupon> tCoupons = tCouponService.selectList(new EntityWrapper<TCoupon>().eq("coupon_name", couponSendReq.getCouponName())
+                .eq("coupon_status",CouponStatusEnum.UNISSUED.getCode()));
+        Assert.isTrue(!CollectionUtils.isEmpty(tCoupons),"该优惠券不存在!");
+        List<TCoupon> tCouponList = new ArrayList<>();
+        // 判断是选中的人多还是优惠券的数量较多
+        if(tCoupons.size() > userIds.size()){
+            for (Integer userId : userIds) {
+                Iterator<TCoupon> iterator = tCoupons.iterator();
+                while (iterator.hasNext()){
+                    TCoupon next = iterator.next();
+                    next.setCouponStatus(CouponStatusEnum.NOT_USED.getCode());
+                    next.setUserId(userId);
+                    tCouponList.add(next);
+                    iterator.remove();
+                    break;
+                }
+            }
+        }else {
+            for (TCoupon tCoupon : tCoupons) {
+                Iterator<Integer> iterator = userIds.iterator();
+                while (iterator.hasNext()){
+                    tCoupon.setCouponStatus(CouponStatusEnum.NOT_USED.getCode());
+                    tCoupon.setUserId(iterator.next());
+                    tCouponList.add(tCoupon);
+                    iterator.remove();
+                    break;
+                }
+            }
+        }
+        if(!CollectionUtils.isEmpty(tCouponList)){
+            tCouponService.updateBatchById(tCouponList);
+        }
+        return SUCCESS_TIP;
+    }
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TOrderController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TOrderController.java
new file mode 100644
index 0000000..e29171a
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TOrderController.java
@@ -0,0 +1,153 @@
+package com.stylefeng.guns.modular.system.controller.general;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.modular.system.controller.resp.TAppUserDetailOrderResp;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import org.springframework.web.bind.annotation.RequestParam;
+import com.stylefeng.guns.modular.system.model.TOrder;
+import com.stylefeng.guns.modular.system.service.ITOrderService;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * 控制器
+ *
+ * @author fengshuonan
+ * @Date 2023-02-15 11:57:13
+ */
+@Controller
+@RequestMapping("/tOrder")
+public class TOrderController extends BaseController {
+
+    private String PREFIX = "/system/tOrder/";
+
+    @Autowired
+    private ITOrderService tOrderService;
+
+    /**
+     * 跳转到首页
+     */
+    @RequestMapping("")
+    public String index() {
+        return PREFIX + "tOrder.html";
+    }
+
+    /**
+     * 跳转到添加
+     */
+    @RequestMapping("/tOrder_add")
+    public String tOrderAdd() {
+        return PREFIX + "tOrder_add.html";
+    }
+
+    /**
+     * 跳转到修改
+     */
+    @RequestMapping("/tOrder_update/{tOrderId}")
+    public String tOrderUpdate(@PathVariable Integer tOrderId, Model model) {
+        TOrder tOrder = tOrderService.selectById(tOrderId);
+        model.addAttribute("item",tOrder);
+        LogObjectHolder.me().set(tOrder);
+        return PREFIX + "tOrder_edit.html";
+    }
+
+    /**
+     * 获取列表
+     */
+    @ApiOperation(value = "获取订单列表")
+    @RequestMapping(value = "/list")
+    @ResponseBody
+    public Object list(String condition,Integer userId) {
+        EntityWrapper<TOrder> wrapper = new EntityWrapper<>();
+        if(Objects.nonNull(userId)){
+            wrapper.eq("user_id",userId);
+        }
+        return tOrderService.selectList(wrapper);
+    }
+
+    /**
+     * 获取列表
+     */
+    @ApiOperation(value = "获取用户详情里的订单列表")
+    @RequestMapping(value = "/appUserDetailList")
+    @ResponseBody
+    public Object appUserDetailList(String condition,Integer userId) {
+        List<TAppUserDetailOrderResp> list = new ArrayList<>();
+
+
+        EntityWrapper<TOrder> wrapper = new EntityWrapper<>();
+        if(Objects.nonNull(userId)){
+            wrapper.eq("user_id",userId);
+        }
+        List<TOrder> tOrders = tOrderService.selectList(wrapper);
+        for (TOrder tOrder : tOrders) {
+            TAppUserDetailOrderResp tAppUserDetailOrderResp = new TAppUserDetailOrderResp();
+            BeanUtils.copyProperties(tOrder,tAppUserDetailOrderResp);
+
+            // TODO 查询里程数等参数
+
+            list.add(tAppUserDetailOrderResp);
+        }
+        return list;
+    }
+
+
+    /**
+     * 获取列表
+     */
+    @RequestMapping(value = "/list-back")
+    @ResponseBody
+    public Object listBack(String condition) {
+        return tOrderService.selectList(null);
+    }
+
+    /**
+     * 新增
+     */
+    @RequestMapping(value = "/add")
+    @ResponseBody
+    public Object add(TOrder tOrder) {
+        tOrderService.insert(tOrder);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 删除
+     */
+    @RequestMapping(value = "/delete")
+    @ResponseBody
+    public Object delete(@RequestParam Integer tOrderId) {
+        tOrderService.deleteById(tOrderId);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 修改
+     */
+    @RequestMapping(value = "/update")
+    @ResponseBody
+    public Object update(TOrder tOrder) {
+        tOrderService.updateById(tOrder);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 详情
+     */
+    @RequestMapping(value = "/detail/{tOrderId}")
+    @ResponseBody
+    public Object detail(@PathVariable("tOrderId") Integer tOrderId) {
+        return tOrderService.selectById(tOrderId);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/req/CouponSendReq.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/req/CouponSendReq.java
new file mode 100644
index 0000000..8b1224e
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/req/CouponSendReq.java
@@ -0,0 +1,33 @@
+package com.stylefeng.guns.modular.system.controller.req;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.List;
+
+@ApiModel(value = "优惠券发放的Req")
+public class CouponSendReq implements Serializable {
+
+    @ApiModelProperty(value = "用户id集合")
+    private List<Integer> userIds;
+
+    @ApiModelProperty(value = "优惠券名称")
+    private String couponName;
+
+    public List<Integer> getUserIds() {
+        return userIds;
+    }
+
+    public void setUserIds(List<Integer> userIds) {
+        this.userIds = userIds;
+    }
+
+    public String getCouponName() {
+        return couponName;
+    }
+
+    public void setCouponName(String couponName) {
+        this.couponName = couponName;
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/req/TAppUserReq.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/req/TAppUserReq.java
new file mode 100644
index 0000000..2e3dc96
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/req/TAppUserReq.java
@@ -0,0 +1,92 @@
+package com.stylefeng.guns.modular.system.controller.req;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+public class TAppUserReq implements Serializable {
+
+    private Date startTime;
+
+    private Date endTime;
+
+    private Integer id;
+
+    private String nickName;
+
+    private String phone;
+
+    private Integer status;
+
+    public TAppUserReq() {
+    }
+
+    public TAppUserReq(Date startTime, Date endTime, Integer id, String nickName, String phone, Integer status) {
+        this.startTime = startTime;
+        this.endTime = endTime;
+        this.id = id;
+        this.nickName = nickName;
+        this.phone = phone;
+        this.status = status;
+    }
+
+    public Date getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
+    }
+
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getNickName() {
+        return nickName;
+    }
+
+    public void setNickName(String nickName) {
+        this.nickName = nickName;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    @Override
+    public String toString() {
+        return "TAppUserReq{" +
+                "startTime=" + startTime +
+                ", endTime=" + endTime +
+                ", id=" + id +
+                ", nickName='" + nickName + '\'' +
+                ", phone='" + phone + '\'' +
+                ", status=" + status +
+                '}';
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/resp/TAppUserDetailOrderResp.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/resp/TAppUserDetailOrderResp.java
new file mode 100644
index 0000000..e0170d7
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/resp/TAppUserDetailOrderResp.java
@@ -0,0 +1,67 @@
+package com.stylefeng.guns.modular.system.controller.resp;
+
+import com.stylefeng.guns.modular.system.model.TOrder;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.math.BigDecimal;
+
+public class TAppUserDetailOrderResp extends TOrder {
+
+    @ApiModelProperty(value = "总行驶里程(公里)")
+    private Integer mileageSum;
+
+    @ApiModelProperty(value = "总行驶时间(分)")
+    private  Integer travelTimeSum;
+
+    @ApiModelProperty(value = "基础费用(元)")
+    private BigDecimal basicExpenses;
+
+//    @ApiModelProperty(value = "等待时间(5)分钟")
+//    private BigDecimal waitTimePrice;
+
+    @ApiModelProperty(value = "里程费(8.0)公里")
+    private BigDecimal mileagePrice;
+
+    @ApiModelProperty(value = "恶劣天气")
+    private Integer badWeather;
+
+    public Integer getMileageSum() {
+        return mileageSum;
+    }
+
+    public void setMileageSum(Integer mileageSum) {
+        this.mileageSum = mileageSum;
+    }
+
+    public Integer getTravelTimeSum() {
+        return travelTimeSum;
+    }
+
+    public void setTravelTimeSum(Integer travelTimeSum) {
+        this.travelTimeSum = travelTimeSum;
+    }
+
+    public BigDecimal getBasicExpenses() {
+        return basicExpenses;
+    }
+
+    public void setBasicExpenses(BigDecimal basicExpenses) {
+        this.basicExpenses = basicExpenses;
+    }
+
+    public BigDecimal getMileagePrice() {
+        return mileagePrice;
+    }
+
+    public void setMileagePrice(BigDecimal mileagePrice) {
+        this.mileagePrice = mileagePrice;
+    }
+
+    public Integer getBadWeather() {
+        return badWeather;
+    }
+
+    public void setBadWeather(Integer badWeather) {
+        this.badWeather = badWeather;
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/LoginController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/LoginController.java
index 3965c83..5fcf581 100644
--- a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/LoginController.java
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/LoginController.java
@@ -2,12 +2,15 @@
 
 import com.google.code.kaptcha.Constants;
 import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.common.constant.Const;
 import com.stylefeng.guns.core.common.exception.InvalidKaptchaException;
 import com.stylefeng.guns.core.log.LogManager;
 import com.stylefeng.guns.core.log.factory.LogTaskFactory;
 import com.stylefeng.guns.core.node.MenuNode;
 import com.stylefeng.guns.core.shiro.ShiroKit;
 import com.stylefeng.guns.core.shiro.ShiroUser;
+import com.stylefeng.guns.core.shiro.factory.IShiro;
+import com.stylefeng.guns.core.shiro.factory.ShiroFactroy;
 import com.stylefeng.guns.core.util.ApiMenuFilter;
 import com.stylefeng.guns.core.util.KaptchaUtil;
 import com.stylefeng.guns.core.util.SinataUtil;
@@ -16,6 +19,7 @@
 import com.stylefeng.guns.modular.system.service.IMenuService;
 import com.stylefeng.guns.modular.system.service.IUserService;
 import com.stylefeng.guns.modular.system.util.AESUtils;
+import org.apache.shiro.authc.SimpleAuthenticationInfo;
 import org.apache.shiro.authc.UsernamePasswordToken;
 import org.apache.shiro.subject.Subject;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -103,7 +107,8 @@
      * 跳转到登录页面
      */
     @RequestMapping(value = "/login", method = RequestMethod.GET)
-    public String login() {
+    public String login(Model model) {
+        model.addAttribute("number",0);
         if (ShiroKit.isAuthenticated() || ShiroKit.getUser() != null) {
             return REDIRECT + "/";
         } else {
@@ -148,29 +153,52 @@
 
         Integer f = loginFailures.get(username);
         f = f == null ? 0 : f;
-        Long t = loginTime.get(username);
-        t = null == t ? 0 : t;
-        if(System.currentTimeMillis() - t > (30 * 60 * 1000)){
-            loginFailures.put(username, f = 1);
-            loginTime.put(username, System.currentTimeMillis());
-        }else{
+        // 校验账号,密码是否正确,如果错误,对次数进行加1
+        IShiro shiroFactory = ShiroFactroy.me();
+        User user = userService.getByAccount(username);
+        password = AESUtils.decrypt(password);
+        if(null == user){
             f++;
             loginFailures.put(username, f);
-        }
-
-        if(f > 5 && (System.currentTimeMillis() - t) <= (30 * 60 * 1000)){
-            model.addAttribute("tips", "登录次数过多,请等30分钟再试!");
-            return "/login.html";
-        }
-        //验证验证码是否正确
-        if (KaptchaUtil.getKaptchaOnOff()) {
-            String kaptcha = super.getPara("kaptcha").trim();
-            String code = (String) super.getSession().getAttribute(Constants.KAPTCHA_SESSION_KEY);
-            if (ToolUtil.isEmpty(kaptcha) || !kaptcha.equalsIgnoreCase(code)) {
-                throw new InvalidKaptchaException();
+        }else {
+            // 校验密码
+            ShiroUser shiroUser1 = shiroFactory.shiroUser(user);
+            SimpleAuthenticationInfo info = shiroFactory.info(shiroUser1, user, username);
+            System.out.println(info.getCredentials());
+            String pass = ShiroKit.md5(password, user.getSalt());
+            System.out.println(pass);
+            if(!info.getCredentials().equals(pass)){
+                f++;
+                loginFailures.put(username, f);
+                if(f<5){
+                    model.addAttribute("number", "3");
+                }
+                if(f==5){
+                    model.addAttribute("number", "5");
+                }
+                return "/login.html";
             }
         }
-        password = AESUtils.decrypt(password);
+        model.addAttribute("number", "3");
+        /*if(f > 5 ){
+            model.addAttribute("tips", "登录次数过多,请等30分钟再试!");
+            if (KaptchaUtil.getKaptchaOnOff()) {
+                String kaptcha = super.getPara("kaptcha").trim();
+                String code = (String) super.getSession().getAttribute(Constants.KAPTCHA_SESSION_KEY);
+                if (ToolUtil.isEmpty(kaptcha) || !kaptcha.equalsIgnoreCase(code)) {
+                    throw new InvalidKaptchaException();
+                }
+            }
+            return "/login.html";
+        }*/
+        //验证验证码是否正确
+//        if (KaptchaUtil.getKaptchaOnOff()) {
+//            String kaptcha = super.getPara("kaptcha").trim();
+//            String code = (String) super.getSession().getAttribute(Constants.KAPTCHA_SESSION_KEY);
+//            if (ToolUtil.isEmpty(kaptcha) || !kaptcha.equalsIgnoreCase(code)) {
+//                throw new InvalidKaptchaException();
+//            }
+//        }
         Subject currentUser = ShiroKit.getSubject();
         UsernamePasswordToken token = new UsernamePasswordToken(username, password.toCharArray());
 
@@ -179,11 +207,12 @@
 //        } else {
 //            token.setRememberMe(false);
 //        }
-
         token.setRememberMe(false);//关闭记住我功能
-
         currentUser.login(token);
 
+        // 登录成功,错误次数值改0
+        loginFailures.put(username, 0);
+
         ShiroUser shiroUser = ShiroKit.getUser();
         super.getSession().setAttribute("shiroUser", shiroUser);
         super.getSession().setAttribute("username", shiroUser.getAccount());
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/util/ExcelUtil.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/util/ExcelUtil.java
new file mode 100644
index 0000000..e551eae
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/util/ExcelUtil.java
@@ -0,0 +1,56 @@
+package com.stylefeng.guns.modular.system.controller.util;
+
+
+import org.apache.poi.hssf.usermodel.*;
+import org.apache.poi.ss.usermodel.CellType;
+import org.apache.poi.ss.usermodel.HorizontalAlignment;
+
+import javax.servlet.http.HttpServletResponse;
+
+public class ExcelUtil {
+	public static HSSFWorkbook getHSSFWorkbook(String sheetName, String[] title, String[][] values, HSSFWorkbook wb) {
+		// 第一步,创建一个webbook,对应一个Excel文件
+		if (wb == null) {
+			wb = new HSSFWorkbook();
+		}
+		// 第二步,在webbook中添加一个sheet,对应Excel文件中的sheet
+		HSSFSheet sheet = wb.createSheet(sheetName);
+		// 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制short
+		HSSFRow row = sheet.createRow(0);
+		// 第四步,创建单元格,并设置值表头 设置表头居中
+		HSSFCellStyle style = wb.createCellStyle();
+		style.setAlignment(HorizontalAlignment.CENTER); // 创建一个居中格式
+
+		HSSFCell cell = null;
+		// 创建标题
+		for (int i = 0; i < title.length; i++) {
+			cell = row.createCell(i);
+			cell.setCellType(CellType.STRING);
+			cell.setCellValue(title[i]);
+			cell.setCellStyle(style);
+		}
+		if(values!=null){
+			// 创建内容
+			for (int i = 0; i < values.length; i++) {
+				row = sheet.createRow(i + 1);
+				for (int j = 0; j < values[i].length; j++) {
+					row.createCell(j).setCellValue(values[i][j]);
+				}
+			}
+
+		}
+		return wb;
+	}
+
+	public static void setResponseHeader(HttpServletResponse response, String fileName) {
+		try {
+			response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
+			response.setContentType("application/vnd.ms-excel;charset=UTF-8");
+			response.addHeader("Pragma", "no-cache");
+			response.addHeader("Cache-Control", "no-cache");
+		} catch (Exception ex) {
+			ex.printStackTrace();
+		}
+	}
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/util/WebUtils.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/util/WebUtils.java
new file mode 100644
index 0000000..7380788
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/util/WebUtils.java
@@ -0,0 +1,169 @@
+package com.stylefeng.guns.modular.system.controller.util;
+
+
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * web工具类
+ *
+ * @author ck
+ */
+public final class WebUtils extends org.springframework.web.util.WebUtils {
+
+    /**
+     * 当前请求
+     */
+    public static HttpServletRequest request() {
+        return contextHolder() == null ? null : contextHolder().getRequest();
+    }
+
+    /**
+     * 当前响应
+     */
+    public static HttpServletResponse response() {
+        return contextHolder() == null ? null : contextHolder().getResponse();
+    }
+
+    /**
+     * 当前session
+     */
+    public static HttpSession session() {
+        return request() == null ? null : request().getSession();
+    }
+
+    /**
+     * 当前ServletRequest
+     */
+    public static ServletRequestAttributes contextHolder() {
+        return (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+    }
+
+    /**
+     * 判断请求是否为 AJAX
+     *
+     * @param request 当前请求
+     */
+    public static boolean isAjax(HttpServletRequest request) {
+        return "XMLHttpRequest".equals(request.getHeader("X-Requested-With"));
+    }
+
+    /**
+     * 获取操作系统,浏览器及浏览器版本信息
+     *
+     * @param request
+     * @return
+     */
+    public static Map<String, String> getOsAndBrowserInfo(HttpServletRequest request) {
+        Map<String, String> map = new HashMap<>(2);
+        String browserDetails = request.getHeader("User-Agent");
+        String userAgent = browserDetails;
+        String user = userAgent.toLowerCase();
+
+        String os = "";
+        String browser = "";
+        //=================OS Info=======================
+        if (userAgent.toLowerCase().contains("windows")) {
+            os = "Windows";
+        } else if (userAgent.toLowerCase().contains("mac")) {
+            os = "Mac";
+        } else if (userAgent.toLowerCase().contains("x11")) {
+            os = "Unix";
+        } else if (userAgent.toLowerCase().contains("android")) {
+            os = "Android";
+        } else if (userAgent.toLowerCase().contains("iphone")) {
+            os = "IPhone";
+        } else {
+            os = "UnKnown, More-Info: " + userAgent;
+        }
+        //===============Browser===========================
+        if (user.contains("edge")) {
+            browser = (userAgent.substring(userAgent.indexOf("Edge")).split(" ")[0]).replace("/", "-");
+        } else if (user.contains("msie")) {
+            String substring = userAgent.substring(userAgent.indexOf("MSIE")).split(";")[0];
+            browser = substring.split(" ")[0].replace("MSIE", "IE") + "-" + substring.split(" ")[1];
+        } else if (user.contains("safari") && user.contains("version")) {
+            browser = (userAgent.substring(userAgent.indexOf("Safari")).split(" ")[0]).split("/")[0]
+                    + "-" + (userAgent.substring(userAgent.indexOf("Version")).split(" ")[0]).split("/")[1];
+        } else if (user.contains("opr") || user.contains("opera")) {
+            if (user.contains("opera")) {
+                browser = (userAgent.substring(userAgent.indexOf("Opera")).split(" ")[0]).split("/")[0]
+                        + "-" + (userAgent.substring(userAgent.indexOf("Version")).split(" ")[0]).split("/")[1];
+            } else if (user.contains("opr")) {
+                browser = ((userAgent.substring(userAgent.indexOf("OPR")).split(" ")[0]).replace("/", "-"))
+                        .replace("OPR", "Opera");
+            }
+        } else if (user.contains("chrome")) {
+            browser = (userAgent.substring(userAgent.indexOf("Chrome")).split(" ")[0]).replace("/", "-");
+        } else if ((user.contains("mozilla/7.0")) || (user.contains("netscape6")) ||
+                (user.contains("mozilla/4.7")) || (user.contains("mozilla/4.78")) ||
+                (user.contains("mozilla/4.08")) || (user.contains("mozilla/3"))) {
+            browser = "Netscape-?";
+        } else if (user.contains("firefox")) {
+            browser = (userAgent.substring(userAgent.indexOf("Firefox")).split(" ")[0]).replace("/", "-");
+        } else if (user.contains("rv")) {
+            String IEVersion = (userAgent.substring(userAgent.indexOf("rv")).split(" ")[0]).replace("rv:", "-");
+            browser = "IE" + IEVersion.substring(0, IEVersion.length() - 1);
+        } else {
+            browser = "UnKnown, More-Info: " + userAgent;
+        }
+        map.put("os", os);
+        map.put("browser", browser);
+        return map;
+    }
+
+    /**
+     * 读取cookie
+     *
+     * @param name cookie name
+     * @return cookie value
+     */
+    public String getCookieVal(String name) {
+        return getCookieVal(request(), name);
+    }
+
+    /**
+     * 读取cookie
+     *
+     * @param request HttpServletRequest
+     * @param name    cookie name
+     * @return cookie value
+     */
+    public String getCookieVal(HttpServletRequest request, String name) {
+        Cookie cookie = getCookie(request, name);
+        return cookie != null ? cookie.getValue() : null;
+    }
+
+    /**
+     * 清除 某个指定的cookie
+     *
+     * @param response HttpServletResponse
+     * @param key      cookie key
+     */
+    public void removeCookie(HttpServletResponse response, String key) {
+        setCookie(response, key, null, 0);
+    }
+
+    /**
+     * 设置cookie
+     *
+     * @param response        HttpServletResponse
+     * @param name            cookie name
+     * @param value           cookie value
+     * @param maxAgeInSeconds maxage
+     */
+    public void setCookie(HttpServletResponse response, String name, String value, int maxAgeInSeconds) {
+        Cookie cookie = new Cookie(name, value);
+        cookie.setPath("/");
+        cookie.setMaxAge(maxAgeInSeconds);
+        //cookie.setHttpOnly(true);
+        response.addCookie(cookie);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TAppUserMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TAppUserMapper.java
new file mode 100644
index 0000000..49600f3
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TAppUserMapper.java
@@ -0,0 +1,19 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.stylefeng.guns.modular.system.model.TAppUser;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.mybatis.spring.annotation.MapperScan;
+
+/**
+ * <p>
+ * 用户基础信息 Mapper 接口
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2023-02-14
+ */
+@Mapper
+public interface TAppUserMapper extends BaseMapper<TAppUser> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TCouponMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TCouponMapper.java
new file mode 100644
index 0000000..20d6fc3
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TCouponMapper.java
@@ -0,0 +1,18 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.stylefeng.guns.modular.system.model.TCoupon;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 优惠券 Mapper 接口
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2023-02-14
+ */
+@Mapper
+public interface TCouponMapper extends BaseMapper<TCoupon> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOrderMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOrderMapper.java
new file mode 100644
index 0000000..0b99902
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOrderMapper.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.stylefeng.guns.modular.system.model.TOrder;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 订单 Mapper 接口
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2023-02-15
+ */
+public interface TOrderMapper extends BaseMapper<TOrder> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TAppUserMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TAppUserMapper.xml
new file mode 100644
index 0000000..b7a32d7
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TAppUserMapper.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.TAppUserMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.TAppUser">
+        <id column="id" property="id" />
+        <result column="nickname" property="nickname" />
+        <result column="phone" property="phone" />
+        <result column="sex" property="sex" />
+        <result column="avatar" property="avatar" />
+        <result column="openid" property="openid" />
+        <result column="unionid" property="unionid" />
+        <result column="emergencyContact" property="emergencyContact" />
+        <result column="emergencyPhone" property="emergencyPhone" />
+        <result column="accountBalance" property="accountBalance" />
+        <result column="userTagId" property="userTagId" />
+        <result column="status" property="status" />
+        <result column="createTime" property="createTime" />
+        <result column="is_exception" property="isException" />
+        <result column="remark" property="remark" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, nickname, phone, sex, avatar, openid, unionid, emergencyContact, emergencyPhone, accountBalance, userTagId, status, createTime,is_exception,remark
+    </sql>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TCouponMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TCouponMapper.xml
new file mode 100644
index 0000000..0cc461d
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TCouponMapper.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.TCouponMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.TCoupon">
+        <id column="id" property="id" />
+        <result column="user_id" property="userId" />
+        <result column="createtime" property="createtime" />
+        <result column="coupon_name" property="couponName" />
+        <result column="coupon_type" property="couponType" />
+        <result column="coupon_code" property="couponCode" />
+        <result column="coupon_status" property="couponStatus" />
+        <result column="coupon_service_type" property="couponServiceType" />
+        <result column="coupon_conditional_amount" property="couponConditionalAmount" />
+        <result column="coupon_preferential_amount" property="couponPreferentialAmount" />
+        <result column="coupon_validity" property="couponValidity" />
+        <result column="coupon_send_quantity" property="couponSendQuantity" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id,user_id, createtime, coupon_name,coupon_type,coupon_code,coupon_status,coupon_service_type,coupon_conditional_amount,
+            coupon_preferential_amount,coupon_validity,coupon_send_quantity
+    </sql>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOrderMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOrderMapper.xml
new file mode 100644
index 0000000..307cc05
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOrderMapper.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.TOrderMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.TOrder">
+        <id column="id" property="id" />
+        <result column="code" property="code" />
+        <result column="userId" property="userId" />
+        <result column="driverId" property="driverId" />
+        <result column="source" property="source" />
+        <result column="agentId" property="agentId" />
+        <result column="branchOfficeId" property="branchOfficeId" />
+        <result column="startTime" property="startTime" />
+        <result column="startAddress" property="startAddress" />
+        <result column="startLat" property="startLat" />
+        <result column="startLng" property="startLng" />
+        <result column="endAddress" property="endAddress" />
+        <result column="endLat" property="endLat" />
+        <result column="endLng" property="endLng" />
+        <result column="boardingTime" property="boardingTime" />
+        <result column="getoffTime" property="getoffTime" />
+        <result column="estimatedPrice" property="estimatedPrice" />
+        <result column="orderMoney" property="orderMoney" />
+        <result column="payMoney" property="payMoney" />
+        <result column="discountedPrice" property="discountedPrice" />
+        <result column="couponId" property="couponId" />
+        <result column="payType" property="payType" />
+        <result column="payTime" property="payTime" />
+        <result column="state" property="state" />
+        <result column="status" property="status" />
+        <result column="createTime" property="createTime" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, code, userId, driverId, source, agentId, branchOfficeId, startTime, startAddress, startLat, startLng, endAddress, endLat, endLng, boardingTime, getoffTime, estimatedPrice, orderMoney, payMoney, discountedPrice, couponId, payType, payTime, state, status, createTime
+    </sql>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserMapper.xml
index 39c0cf3..b82af71 100644
--- a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserMapper.xml
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserMapper.xml
@@ -8,7 +8,7 @@
 		<result column="avatar" property="avatar" />
 		<result column="account" property="account" />
 		<result column="password" property="password" />
-		<result column="passWordUpdate" property="passWordUpdate"/>
+		<result column="pass_word_update" property="passWordUpdate"/>
 		<result column="salt" property="salt" />
 		<result column="name" property="name" />
 		<result column="birthday" property="birthday" />
@@ -20,6 +20,8 @@
 		<result column="status" property="status" />
 		<result column="createtime" property="createtime" />
 		<result column="version" property="version" />
+		<result column="role_type" property="roleType" />
+		<result column="object_id" property="objectId" />
 	</resultMap>
 
 	<sql id="Base_Column_List">
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/enums/CouponStatusEnum.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/enums/CouponStatusEnum.java
new file mode 100644
index 0000000..671111b
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/enums/CouponStatusEnum.java
@@ -0,0 +1,52 @@
+package com.stylefeng.guns.modular.system.enums;
+
+
+
+/**
+ * @Description 优惠券状态枚举
+ * @Author xiaochen
+ * @Date 2023/02/15 9:42
+ */
+public enum CouponStatusEnum {
+
+    UNISSUED(1, "未发放"),
+    NOT_USED(2, "未使用"),
+    USED(3, "已使用"),
+    EXPIRED(4,"已过期");
+
+    private String desc;
+
+
+    private int code;
+
+
+    CouponStatusEnum(int code, String desc) {
+        this.code = code;
+        this.desc = desc;
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+
+    public int getCode() {
+        return code;
+    }
+
+    /**
+     * 通过code获取枚举
+     *
+     * @param code
+     * @return
+     */
+    public static CouponStatusEnum fromCode(Integer code) {
+        CouponStatusEnum[] resultTypes = CouponStatusEnum.values();
+        for (CouponStatusEnum resultType : resultTypes) {
+            if (code.equals(resultType.getCode())) {
+                return resultType;
+            }
+        }
+        return null;
+    }
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/exports/TAppUserExceptionExport.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/exports/TAppUserExceptionExport.java
new file mode 100644
index 0000000..e357e73
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/exports/TAppUserExceptionExport.java
@@ -0,0 +1,120 @@
+package com.stylefeng.guns.modular.system.exports;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+public class TAppUserExceptionExport implements Serializable {
+
+    @ApiModelProperty(value = "用户ID")
+    private Integer id;
+
+    @ApiModelProperty(value = "昵称")
+    private String nickname;
+
+    @ApiModelProperty(value = "手机号")
+    private String phone;
+
+    @ApiModelProperty(value = "状态")
+    private Integer status;
+
+    @ApiModelProperty(value = "注册时间")
+    private Date createTime;
+
+    @ApiModelProperty(value = "剩余优惠券")
+    private Integer remainingCoupons;
+
+    @ApiModelProperty(value = "优惠券总数")
+    private Integer couponsSum;
+
+    @ApiModelProperty(value = "消费次数")
+    private Integer ConsumptionTimes = 0;
+
+    @ApiModelProperty(value = "历史消费")
+    private BigDecimal HistoricalConsumption = new BigDecimal("0.00");
+
+    @ApiModelProperty(value = "最后一次消费时间")
+    private Date lastConsumptionTime;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getNickname() {
+        return nickname;
+    }
+
+    public void setNickname(String nickname) {
+        this.nickname = nickname;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public Integer getRemainingCoupons() {
+        return remainingCoupons;
+    }
+
+    public void setRemainingCoupons(Integer remainingCoupons) {
+        this.remainingCoupons = remainingCoupons;
+    }
+
+    public Integer getCouponsSum() {
+        return couponsSum;
+    }
+
+    public void setCouponsSum(Integer couponsSum) {
+        this.couponsSum = couponsSum;
+    }
+
+    public Integer getConsumptionTimes() {
+        return ConsumptionTimes;
+    }
+
+    public void setConsumptionTimes(Integer consumptionTimes) {
+        ConsumptionTimes = consumptionTimes;
+    }
+
+    public BigDecimal getHistoricalConsumption() {
+        return HistoricalConsumption;
+    }
+
+    public void setHistoricalConsumption(BigDecimal historicalConsumption) {
+        HistoricalConsumption = historicalConsumption;
+    }
+
+    public Date getLastConsumptionTime() {
+        return lastConsumptionTime;
+    }
+
+    public void setLastConsumptionTime(Date lastConsumptionTime) {
+        this.lastConsumptionTime = lastConsumptionTime;
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TAppUser.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TAppUser.java
new file mode 100644
index 0000000..1a8df42
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TAppUser.java
@@ -0,0 +1,260 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.enums.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 用户基础信息
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2023-02-14
+ */
+@TableName("t_app_user")
+public class TAppUser extends Model<TAppUser> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 用户昵称
+     */
+    private String nickname;
+    /**
+     * 手机号
+     */
+    private String phone;
+    /**
+     * 性别(1=男,2=女)
+     */
+    private Integer sex;
+    /**
+     * 头像
+     */
+    private String avatar;
+    /**
+     * 微信openid
+     */
+    private String openid;
+    /**
+     * 微信unionid
+     */
+    private String unionid;
+    /**
+     * 紧急联系人
+     */
+    private String emergencyContact;
+    /**
+     * 紧急联系电话
+     */
+    private String emergencyPhone;
+    /**
+     * 账户余额
+     */
+    private Double accountBalance;
+    /**
+     * 用户标签id
+     */
+    private Integer userTagId;
+    /**
+     * 状态(1=正常,2=冻结,3=删除)
+     */
+    private Integer status;
+    /**
+     * 添加时间
+     */
+    private Date createTime;
+
+    /**
+     * 是否异常 1正常 0异常
+     */
+    @TableField(value = "is_exception")
+    private Integer isException;
+
+    /**
+     * 启用冻结理由
+     */
+    @TableField(value = "remark")
+    private String remark;
+
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "注册开始时间")
+    private Date startTime;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "注册结束时间")
+    private Date endTime;
+
+    public Integer getIsException() {
+        return isException;
+    }
+
+    public void setIsException(Integer isException) {
+        this.isException = isException;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public Date getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
+    }
+
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getNickname() {
+        return nickname;
+    }
+
+    public void setNickname(String nickname) {
+        this.nickname = nickname;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public Integer getSex() {
+        return sex;
+    }
+
+    public void setSex(Integer sex) {
+        this.sex = sex;
+    }
+
+    public String getAvatar() {
+        return avatar;
+    }
+
+    public void setAvatar(String avatar) {
+        this.avatar = avatar;
+    }
+
+    public String getOpenid() {
+        return openid;
+    }
+
+    public void setOpenid(String openid) {
+        this.openid = openid;
+    }
+
+    public String getUnionid() {
+        return unionid;
+    }
+
+    public void setUnionid(String unionid) {
+        this.unionid = unionid;
+    }
+
+    public String getEmergencyContact() {
+        return emergencyContact;
+    }
+
+    public void setEmergencyContact(String emergencyContact) {
+        this.emergencyContact = emergencyContact;
+    }
+
+    public String getEmergencyPhone() {
+        return emergencyPhone;
+    }
+
+    public void setEmergencyPhone(String emergencyPhone) {
+        this.emergencyPhone = emergencyPhone;
+    }
+
+    public Double getAccountBalance() {
+        return accountBalance;
+    }
+
+    public void setAccountBalance(Double accountBalance) {
+        this.accountBalance = accountBalance;
+    }
+
+    public Integer getUserTagId() {
+        return userTagId;
+    }
+
+    public void setUserTagId(Integer userTagId) {
+        this.userTagId = userTagId;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "TAppUser{" +
+        "id=" + id +
+        ", nickname=" + nickname +
+        ", phone=" + phone +
+        ", sex=" + sex +
+        ", avatar=" + avatar +
+        ", openid=" + openid +
+        ", unionid=" + unionid +
+        ", emergencyContact=" + emergencyContact +
+        ", emergencyPhone=" + emergencyPhone +
+        ", accountBalance=" + accountBalance +
+        ", userTagId=" + userTagId +
+        ", status=" + status +
+        ", createTime=" + createTime +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TCoupon.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TCoupon.java
new file mode 100644
index 0000000..e4cee29
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TCoupon.java
@@ -0,0 +1,187 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.enums.IdType;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 优惠券
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2023-02-14
+ */
+@TableName("t_coupon")
+public class TCoupon extends Model<TCoupon> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 创建时间
+     */
+    private Date createtime;
+
+    @ApiModelProperty(value = "用户id")
+    @TableField("user_id")
+    private Integer userId;
+
+    @ApiModelProperty(value = "优惠券名称")
+    @TableField("coupon_name")
+    private String couponName;
+
+    @ApiModelProperty(value = "优惠券类型 1活动券 2新人券")
+    @TableField("coupon_type")
+    private Integer couponType;
+
+    @ApiModelProperty(value = "优惠券码")
+    @TableField("coupon_code")
+    private String couponCode;
+
+    @ApiModelProperty(value = "优惠券状态 1未发放 2未使用 3已使用 4已过期")
+    @TableField("coupon_status")
+    private Integer couponStatus;
+
+    @ApiModelProperty(value = "服务类型 1通用券")
+    @TableField("coupon_service_type")
+    private Integer couponServiceType;
+
+    @ApiModelProperty(value = "条件金额")
+    @TableField("coupon_conditional_amount")
+    private BigDecimal couponConditionalAmount;
+
+    @ApiModelProperty(value = "优惠金额")
+    @TableField("coupon_preferential_amount")
+    private BigDecimal couponPreferentialAmount;
+
+    @ApiModelProperty(value = "有效期")
+    @TableField("coupon_validity")
+    private Integer couponValidity;
+
+    @ApiModelProperty(value = "赠送数量 新人券")
+    @TableField("coupon_send_quantity")
+    private Integer couponSendQuantity;
+
+    public Integer getCouponValidity() {
+        return couponValidity;
+    }
+
+    public void setCouponValidity(Integer couponValidity) {
+        this.couponValidity = couponValidity;
+    }
+
+    public Integer getCouponSendQuantity() {
+        return couponSendQuantity;
+    }
+
+    public void setCouponSendQuantity(Integer couponSendQuantity) {
+        this.couponSendQuantity = couponSendQuantity;
+    }
+
+    public Integer getCouponServiceType() {
+        return couponServiceType;
+    }
+
+    public void setCouponServiceType(Integer couponServiceType) {
+        this.couponServiceType = couponServiceType;
+    }
+
+    public BigDecimal getCouponConditionalAmount() {
+        return couponConditionalAmount;
+    }
+
+    public void setCouponConditionalAmount(BigDecimal couponConditionalAmount) {
+        this.couponConditionalAmount = couponConditionalAmount;
+    }
+
+    public BigDecimal getCouponPreferentialAmount() {
+        return couponPreferentialAmount;
+    }
+
+    public void setCouponPreferentialAmount(BigDecimal couponPreferentialAmount) {
+        this.couponPreferentialAmount = couponPreferentialAmount;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public Integer getCouponType() {
+        return couponType;
+    }
+
+    public void setCouponType(Integer couponType) {
+        this.couponType = couponType;
+    }
+
+    public String getCouponCode() {
+        return couponCode;
+    }
+
+    public void setCouponCode(String couponCode) {
+        this.couponCode = couponCode;
+    }
+
+    public Integer getCouponStatus() {
+        return couponStatus;
+    }
+
+    public void setCouponStatus(Integer couponStatus) {
+        this.couponStatus = couponStatus;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Date getCreatetime() {
+        return createtime;
+    }
+
+    public void setCreatetime(Date createtime) {
+        this.createtime = createtime;
+    }
+
+    public String getCouponName() {
+        return couponName;
+    }
+
+    public void setCouponName(String couponName) {
+        this.couponName = couponName;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "TCoupon{" +
+        "id=" + id +
+        ", createtime=" + createtime +
+        ", couponName=" + couponName +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrder.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrder.java
new file mode 100644
index 0000000..cc84797
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrder.java
@@ -0,0 +1,375 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import java.math.BigDecimal;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 订单
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2023-02-15
+ */
+@TableName("t_order")
+public class TOrder extends Model<TOrder> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 编号
+     */
+    private String code;
+    /**
+     * 用户id
+     */
+    private Integer userId;
+    /**
+     * 司机id
+     */
+    private Integer driverId;
+    /**
+     * 订单来源(1=小程序)
+     */
+    private Integer source;
+    /**
+     * 代理商id
+     */
+    private Integer agentId;
+    /**
+     * 分公司id
+     */
+    private Integer branchOfficeId;
+    /**
+     * 开始服务时间
+     */
+    private Date startTime;
+    /**
+     * 起点地址
+     */
+    private String startAddress;
+    /**
+     * 起点纬度
+     */
+    private String startLat;
+    /**
+     * 起点经度
+     */
+    private String startLng;
+    /**
+     * 终点地址
+     */
+    private String endAddress;
+    /**
+     * 终点纬度
+     */
+    private String endLat;
+    /**
+     * 终点经度
+     */
+    private String endLng;
+    /**
+     * 上车时间
+     */
+    private Date boardingTime;
+    /**
+     * 下车时间
+     */
+    private Date getoffTime;
+    /**
+     * 预估价
+     */
+    private BigDecimal estimatedPrice;
+    /**
+     * 订单金额
+     */
+    private BigDecimal orderMoney;
+    /**
+     * 支付金额
+     */
+    private BigDecimal payMoney;
+    /**
+     * 优惠金额
+     */
+    private BigDecimal discountedPrice;
+    /**
+     * 优惠券id
+     */
+    private Integer couponId;
+    /**
+     * 支付类型(1=线上)
+     */
+    private Integer payType;
+    /**
+     * 支付时间
+     */
+    private Date payTime;
+    /**
+     * 订单状态(1=待接单,2=已接单,3=)
+     */
+    private Integer state;
+    /**
+     * 状态(1=正常,2=冻结,3=删除)
+     */
+    private Integer status;
+    /**
+     * 添加时间
+     */
+    private Date createTime;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public Integer getDriverId() {
+        return driverId;
+    }
+
+    public void setDriverId(Integer driverId) {
+        this.driverId = driverId;
+    }
+
+    public Integer getSource() {
+        return source;
+    }
+
+    public void setSource(Integer source) {
+        this.source = source;
+    }
+
+    public Integer getAgentId() {
+        return agentId;
+    }
+
+    public void setAgentId(Integer agentId) {
+        this.agentId = agentId;
+    }
+
+    public Integer getBranchOfficeId() {
+        return branchOfficeId;
+    }
+
+    public void setBranchOfficeId(Integer branchOfficeId) {
+        this.branchOfficeId = branchOfficeId;
+    }
+
+    public Date getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
+    }
+
+    public String getStartAddress() {
+        return startAddress;
+    }
+
+    public void setStartAddress(String startAddress) {
+        this.startAddress = startAddress;
+    }
+
+    public String getStartLat() {
+        return startLat;
+    }
+
+    public void setStartLat(String startLat) {
+        this.startLat = startLat;
+    }
+
+    public String getStartLng() {
+        return startLng;
+    }
+
+    public void setStartLng(String startLng) {
+        this.startLng = startLng;
+    }
+
+    public String getEndAddress() {
+        return endAddress;
+    }
+
+    public void setEndAddress(String endAddress) {
+        this.endAddress = endAddress;
+    }
+
+    public String getEndLat() {
+        return endLat;
+    }
+
+    public void setEndLat(String endLat) {
+        this.endLat = endLat;
+    }
+
+    public String getEndLng() {
+        return endLng;
+    }
+
+    public void setEndLng(String endLng) {
+        this.endLng = endLng;
+    }
+
+    public Date getBoardingTime() {
+        return boardingTime;
+    }
+
+    public void setBoardingTime(Date boardingTime) {
+        this.boardingTime = boardingTime;
+    }
+
+    public Date getGetoffTime() {
+        return getoffTime;
+    }
+
+    public void setGetoffTime(Date getoffTime) {
+        this.getoffTime = getoffTime;
+    }
+
+    public BigDecimal getEstimatedPrice() {
+        return estimatedPrice;
+    }
+
+    public void setEstimatedPrice(BigDecimal estimatedPrice) {
+        this.estimatedPrice = estimatedPrice;
+    }
+
+    public BigDecimal getOrderMoney() {
+        return orderMoney;
+    }
+
+    public void setOrderMoney(BigDecimal orderMoney) {
+        this.orderMoney = orderMoney;
+    }
+
+    public BigDecimal getPayMoney() {
+        return payMoney;
+    }
+
+    public void setPayMoney(BigDecimal payMoney) {
+        this.payMoney = payMoney;
+    }
+
+    public BigDecimal getDiscountedPrice() {
+        return discountedPrice;
+    }
+
+    public void setDiscountedPrice(BigDecimal discountedPrice) {
+        this.discountedPrice = discountedPrice;
+    }
+
+    public Integer getCouponId() {
+        return couponId;
+    }
+
+    public void setCouponId(Integer couponId) {
+        this.couponId = couponId;
+    }
+
+    public Integer getPayType() {
+        return payType;
+    }
+
+    public void setPayType(Integer payType) {
+        this.payType = payType;
+    }
+
+    public Date getPayTime() {
+        return payTime;
+    }
+
+    public void setPayTime(Date payTime) {
+        this.payTime = payTime;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "TOrder{" +
+        "id=" + id +
+        ", code=" + code +
+        ", userId=" + userId +
+        ", driverId=" + driverId +
+        ", source=" + source +
+        ", agentId=" + agentId +
+        ", branchOfficeId=" + branchOfficeId +
+        ", startTime=" + startTime +
+        ", startAddress=" + startAddress +
+        ", startLat=" + startLat +
+        ", startLng=" + startLng +
+        ", endAddress=" + endAddress +
+        ", endLat=" + endLat +
+        ", endLng=" + endLng +
+        ", boardingTime=" + boardingTime +
+        ", getoffTime=" + getoffTime +
+        ", estimatedPrice=" + estimatedPrice +
+        ", orderMoney=" + orderMoney +
+        ", payMoney=" + payMoney +
+        ", discountedPrice=" + discountedPrice +
+        ", couponId=" + couponId +
+        ", payType=" + payType +
+        ", payTime=" + payTime +
+        ", state=" + state +
+        ", status=" + status +
+        ", createTime=" + createTime +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/User.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/User.java
index 64b5373..58a9ed9 100644
--- a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/User.java
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/User.java
@@ -2,6 +2,7 @@
 
 import com.baomidou.mybatisplus.activerecord.Model;
 
+import com.baomidou.mybatisplus.annotations.TableField;
 import com.baomidou.mybatisplus.annotations.TableId;
 import com.baomidou.mybatisplus.annotations.TableName;
 import com.baomidou.mybatisplus.enums.IdType;
@@ -42,6 +43,7 @@
 	/**
 	 * 密码修改时间
 	 */
+	@TableField(value = "pass_word_update")
 	private Date passWordUpdate;
     /**
      * md5密码盐
@@ -90,10 +92,12 @@
 	/**
 	 * 角色类型 1=平台 2=分公司 3=加盟商
 	 */
+	@TableField(value = "role_type")
 	private Integer roleType;
 	/**
 	 * 对象ID
 	 */
+	@TableField(value = "object_id")
 	private Integer objectId;
 
 	public Integer getRoleType() {
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITAppUserService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITAppUserService.java
new file mode 100644
index 0000000..4c79c9b
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITAppUserService.java
@@ -0,0 +1,35 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.stylefeng.guns.modular.system.model.TAppUser;
+import com.baomidou.mybatisplus.service.IService;
+import org.springframework.ui.Model;
+
+/**
+ * <p>
+ * 用户基础信息 服务类
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2023-02-14
+ */
+public interface ITAppUserService extends IService<TAppUser> {
+
+    /**
+     * 详情页面跳转
+     * @param tAppUserId
+     * @param model
+     */
+    void detail(Integer tAppUserId, Model model);
+
+    /**
+     * 封装用户列表查询wrapper
+     * @param createTime
+     * @param nickname
+     * @param phone
+     * @param id
+     * @param status
+     * @return
+     */
+    EntityWrapper<TAppUser> getUserListWrapper(String createTime, String nickname, String phone, Integer id, Integer status);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITCouponService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITCouponService.java
new file mode 100644
index 0000000..f5af6c0
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITCouponService.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.stylefeng.guns.modular.system.model.TCoupon;
+import com.baomidou.mybatisplus.service.IService;
+
+/**
+ * <p>
+ * 优惠券 服务类
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2023-02-14
+ */
+public interface ITCouponService extends IService<TCoupon> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITOrderService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITOrderService.java
new file mode 100644
index 0000000..29fb92b
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITOrderService.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.stylefeng.guns.modular.system.model.TOrder;
+import com.baomidou.mybatisplus.service.IService;
+
+/**
+ * <p>
+ * 订单 服务类
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2023-02-15
+ */
+public interface ITOrderService extends IService<TOrder> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TAppUserServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TAppUserServiceImpl.java
new file mode 100644
index 0000000..63c5f13
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TAppUserServiceImpl.java
@@ -0,0 +1,89 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.stylefeng.guns.core.util.DateUtil;
+import com.stylefeng.guns.modular.system.dao.TCouponMapper;
+import com.stylefeng.guns.modular.system.enums.CouponStatusEnum;
+import com.stylefeng.guns.modular.system.model.TAppUser;
+import com.stylefeng.guns.modular.system.dao.TAppUserMapper;
+import com.stylefeng.guns.modular.system.model.TCoupon;
+import com.stylefeng.guns.modular.system.service.ITAppUserService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.ui.Model;
+import org.springframework.util.StringUtils;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 用户基础信息 服务实现类
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2023-02-14
+ */
+@Service
+public class TAppUserServiceImpl extends ServiceImpl<TAppUserMapper, TAppUser> implements ITAppUserService {
+
+    @Autowired
+    private TAppUserMapper tAppUserMapper;
+    @Autowired
+    private TCouponMapper tCouponMapper;
+
+    @Override
+    public void detail(Integer tAppUserId, Model model) {
+        // 用户资料
+        TAppUser tAppUser = tAppUserMapper.selectById(tAppUserId);
+        model.addAttribute("avatar",tAppUser.getAvatar());
+        model.addAttribute("status",tAppUser.getStatus());
+        model.addAttribute("id",tAppUser.getId());
+        model.addAttribute("nickname",tAppUser.getNickname());
+        model.addAttribute("remark",tAppUser.getRemark());
+        model.addAttribute("createTime",tAppUser.getCreateTime());
+        // 消费信息:优惠券数据
+        List<TCoupon> tCoupons = tCouponMapper.selectList(new EntityWrapper<TCoupon>().eq("user_id", tAppUserId));
+        List<TCoupon> notUsedList = tCoupons.stream().filter(coupon -> coupon.getCouponStatus().equals(CouponStatusEnum.NOT_USED.getCode())).collect(Collectors.toList());
+        List<TCoupon> usedList = tCoupons.stream().filter(coupon -> coupon.getCouponStatus().equals(CouponStatusEnum.USED.getCode())).collect(Collectors.toList());
+        List<TCoupon> expiredList = tCoupons.stream().filter(coupon -> coupon.getCouponStatus().equals(CouponStatusEnum.EXPIRED.getCode())).collect(Collectors.toList());
+        model.addAttribute("notUsedCount",notUsedList.size());
+        model.addAttribute("usedCount",usedList.size());
+        model.addAttribute("expiredCount",expiredList.size());
+    }
+
+    @Override
+    public EntityWrapper<TAppUser> getUserListWrapper(String createTime, String nickname, String phone, Integer id, Integer status) {
+        EntityWrapper<TAppUser> wrapper = new EntityWrapper<>();
+        // 昵称
+        if(StringUtils.hasLength(nickname)){
+            wrapper.like("nickname",nickname);
+        }
+        // 手机号
+        if(StringUtils.hasLength(phone)){
+            wrapper.like("phone",phone);
+        }
+        // id
+        if(Objects.nonNull(id)){
+            wrapper.eq("id",id);
+        }
+        // 开始,结束时间
+        if(StringUtils.hasLength(createTime)){
+            String[] split = createTime.split(" - ");
+            Date startTime = DateUtil.getDate_str4(split[0]);
+            Date endTime = DateUtil.getDate_str4(split[1]);
+            wrapper.between("createtime",startTime,endTime);
+        }
+//        if(Objects.nonNull(startTime) && Objects.nonNull(endTime)){
+//            wrapper.between("createtime",startTime,endTime);
+//        }
+        // 状态
+        if(Objects.nonNull(status)){
+            wrapper.eq("status",status);
+        }
+        return wrapper;
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TCouponServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TCouponServiceImpl.java
new file mode 100644
index 0000000..45d2582
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TCouponServiceImpl.java
@@ -0,0 +1,20 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.stylefeng.guns.modular.system.model.TCoupon;
+import com.stylefeng.guns.modular.system.dao.TCouponMapper;
+import com.stylefeng.guns.modular.system.service.ITCouponService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 优惠券 服务实现类
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2023-02-14
+ */
+@Service
+public class TCouponServiceImpl extends ServiceImpl<TCouponMapper, TCoupon> implements ITCouponService {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderServiceImpl.java
new file mode 100644
index 0000000..75171ba
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderServiceImpl.java
@@ -0,0 +1,20 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.stylefeng.guns.modular.system.model.TOrder;
+import com.stylefeng.guns.modular.system.dao.TOrderMapper;
+import com.stylefeng.guns.modular.system.service.ITOrderService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 订单 服务实现类
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2023-02-15
+ */
+@Service
+public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> implements ITOrderService {
+
+}
diff --git a/management/guns-admin/src/main/resources/application.yml b/management/guns-admin/src/main/resources/application.yml
index 2671d7b..f4ab612 100644
--- a/management/guns-admin/src/main/resources/application.yml
+++ b/management/guns-admin/src/main/resources/application.yml
@@ -3,7 +3,7 @@
 
 guns:
   swagger-open: true              #是否开启swagger (true/false)
-  kaptcha-open: false             #是否开启登录时验证码 (true/false)
+  kaptcha-open: true             #是否开启登录时验证码 (true/false)
   spring-session-open: false      #是否开启spring session,如果是多机环境需要开启(true/false)
   session-invalidate-time: 1800     #session失效时间(只在单机环境下生效,多机环境在SpringSessionConfig类中配置) 单位:秒
   session-validation-interval: 900  #多久检测一次失效的session(只在单机环境下生效) 单位:秒
@@ -16,6 +16,12 @@
 spring:
   profiles:
     active: local
+  datasource:
+    url: jdbc:mysql://192.168.0.80:3306/super_save_driving?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=GMT%2B8
+    username: root
+    password: 123456
+    db-name: super_save_driving #用来搜集数据库的所有表
+    filters: wall,mergeStat
   mvc:
     static-path-pattern: /static/**
     view:
@@ -67,7 +73,7 @@
     url: jdbc:mysql://192.168.0.80:3306/super_save_driving?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=GMT%2B8
     username: root
     password: 123456
-    db-name: oktravel #用来搜集数据库的所有表
+    db-name: super_save_driving #用来搜集数据库的所有表
     filters: wall,mergeStat
 
 
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/404.html b/management/guns-admin/src/main/webapp/WEB-INF/view/404.html
index 7c3e291..ea202d7 100644
--- a/management/guns-admin/src/main/webapp/WEB-INF/view/404.html
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/404.html
@@ -7,7 +7,7 @@
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
 
 
-    <title>OK出行 - 404 页面</title>
+    <title>超省新代驾 - 404 页面</title>
     <link rel="shortcut icon" href="${ctxPath}/static/favicon1.ico"> <link href="${ctxPath}/static/css/bootstrap.min.css?v=3.3.6" rel="stylesheet">
     <link href="${ctxPath}/static/css/font-awesome.css?v=4.4.0" rel="stylesheet">
     <link href="${ctxPath}/static/css/style.css?v=4.1.0" rel="stylesheet">
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/common/_right.html b/management/guns-admin/src/main/webapp/WEB-INF/view/common/_right.html
index 795564a..5d39d78 100644
--- a/management/guns-admin/src/main/webapp/WEB-INF/view/common/_right.html
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/common/_right.html
@@ -4,7 +4,7 @@
             <div class="navbar-header"><a class="navbar-minimalize minimalize-styl-2 btn btn-primary " href="#"><i class="fa fa-bars"></i> </a>
                 <form role="search" class="navbar-form-custom" method="post" action="search_results.html">
                     <div class="form-group">
-                        <input type="text" placeholder="OK出行后台管理系统 …" class="form-control" name="top-search" id="top-search" value="OK出行后台管理系统" disabled>
+                        <input type="text" placeholder="超省代驾后台管理系统 …" class="form-control" name="top-search" id="top-search" value="超省新代驾后台管理系统" disabled>
                     </div>
                 </form>
                 <h3 style="float: right;line-height: 50px;color: red;">${passwordHint}</h3>
@@ -53,7 +53,7 @@
         <iframe class="J_iframe" name="iframe0" width="100%" height="100%" src="${ctxPath}/blackboard?type=${type}" frameborder="0" data-id="${ctxPath}/blackboard" seamless></iframe>
     </div>
     <div class="footer">
-        <div class="pull-right">&copy; 2019-2021 <a href="#" onclick="return false" target="_blank">OK出行</a>
+        <div class="pull-right">&copy; 2019-2021 <a href="#" onclick="return false" target="_blank">超省新代驾</a>
         </div>
     </div>
 </div>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/index.html b/management/guns-admin/src/main/webapp/WEB-INF/view/index.html
index 3202f8e..780f3fd 100644
--- a/management/guns-admin/src/main/webapp/WEB-INF/view/index.html
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/index.html
@@ -4,7 +4,7 @@
     <meta charset="utf-8">
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
     <meta name="renderer" content="webkit">
-    <title>OK出行 - 主页</title>
+    <title>超省新代驾 - 主页</title>
     <link rel="shortcut icon" href="${ctxPath}/static/favicon1.ico">
     <link href="${ctxPath}/static/css/bootstrap.min.css?v=3.3.6" rel="stylesheet">
     <link href="${ctxPath}/static/css/font-awesome.min.css?v=4.4.0" rel="stylesheet">
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/login.html b/management/guns-admin/src/main/webapp/WEB-INF/view/login.html
index e853409..84b2527 100644
--- a/management/guns-admin/src/main/webapp/WEB-INF/view/login.html
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/login.html
@@ -4,7 +4,7 @@
     <meta charset="utf-8">
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
 
-    <title>OK出行 - 登录</title>
+    <title>超省新代驾 - 登录</title>
 
     <link rel="shortcut icon" href="${ctxPath}/static/favicon1.ico">
     <link href="${ctxPath}/static/css/bootstrap.min.css?v=3.3.6" rel="stylesheet">
@@ -55,31 +55,34 @@
 <div style="display: flex;align-items: center;justify-content: center;height: 100%">
 
 
-<img src="${ctxPath}/static/img/index4.png" style="width: 300px;height: 400px;z-index: 1000">
+<!--<img src="${ctxPath}/static/img/index4.png" style="width: 300px;height: 400px;z-index: 1000">-->
 <div  style="position: relative;left: -20px; max-width: 300px;min-height: 300px;background: white;border-radius: 8px;box-sizing: border-box;padding: 0 30px 0 50px;display: flex;align-items: center;justify-content: center;">
     <div style="max-height: 100%">
-        <h3 style="color: black;"><img src="${ctxPath}/static/img/logo.png" width="30px" height="30px"/>&nbsp;OK出行管理后台</h3>
+        <h3 style="color: black;"><img src="${ctxPath}/static/img/logo.png" width="30px" height="30px"/>&nbsp;超省新代驾管理后台</h3>
         <br/>
         <h4 style="color: red;">${tips!}</h4>
         <form class="m-t" role="form" action="${ctxPath}/login" method="post">
             <div class="item">
                 <img src="${ctxPath}/static/img/account.png" />
+                <input hidden id="number" value="${number}">
                 <input class="itemInput" type="text" name="username" id="username"  placeholder="请输入您的账号" required="" value="">
             </div>
             <div  class="item">
                 <img src="${ctxPath}/static/img/password.png" />
                 <input class="itemInput" type="password" name="password" id="password"  placeholder="请输入您的密码" required="" value="">
             </div>
-            @if(kaptcha.getKaptchaOnOff() == true){
-            <div class="form-group" style="float: left;">
-                <div class="col-sm-8" style="padding-left: 0px; padding-right: 0px;">
-                    <input class="form-control" type="text" name="kaptcha" placeholder="验证码" required="">
-                </div>
-                <div class="col-sm-4" style="padding-left: 0px; padding-right: 0px;">
-                    <img src="${ctxPath}/kaptcha" id="kaptcha" width="100%" height="100%"/>
-                </div>
+            <div id="verify" style="display: none">
+                    @if(kaptcha.getKaptchaOnOff() == true){
+                    <div class="form-group" style="float: left;">
+                        <div class="col-sm-8" style="padding-left: 0px; padding-right: 0px;">
+                            <input class="form-control" type="text" name="kaptcha" id="verifyNumber"  placeholder="验证码" >
+                        </div>
+                        <div class="col-sm-4" style="padding-left: 0px; padding-right: 0px;">
+                            <img src="${ctxPath}/kaptcha" id="kaptcha" width="100%" height="100%"/>
+                        </div>
+                    </div>
+                @}
             </div>
-            @}
             <div class="form-group" style="float: left;">
                 <div class="checkbox" style="text-align: left">
                     <!--<label>
@@ -100,6 +103,15 @@
 <script src="${ctxPath}/static/crypto-js/crypto-js.js"></script>
 <script>
     $(function () {
+        console.log($("#number").val())
+        if($("#number").val()==5){
+            document.getElementById("verifyNumber").setAttribute("required","")
+            $("#verify").show()
+        }else {
+            $("#number").val(0)
+            $("#verify").hide()
+        }
+
         $("#kaptcha").on('click', function () {
             $("#kaptcha").attr('src', '${ctxPath}/kaptcha?' + Math.floor(Math.random() * 100)).fadeIn();
         });
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAppUser/tAppUser.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAppUser/tAppUser.html
new file mode 100644
index 0000000..f17efc6
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAppUser/tAppUser.html
@@ -0,0 +1,74 @@
+@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">
+                                <#TimeCon id="createTime" name="注册时间"/>
+                            </div>
+                            <div class="col-sm-2">
+                                <#NameCon id="id" name="用户ID" />
+                            </div>
+                            <div class="col-sm-2">
+                                <#NameCon id="nickName" name="昵称" />
+                            </div>
+                            <div class="col-sm-2">
+                                <#NameCon id="phone" name="手机号" />
+                            </div>
+                            <div class="col-sm-1">
+                                <select class="input-group" id="status" style="width: 80px;height: 33px" name="status">
+                                    <option value="">状态</option>
+                                    <option value="1">正常</option>
+                                    <option value="2">冻结</option>
+                                    <option value="3">已删除</option>
+                                </select>
+                            </div>
+                            <div class="col-sm-2">
+                                <#button name="搜索" icon="fa-search" clickFun="TAppUser.search()"/>
+                                <#button name="重置" icon="fa-trash" clickFun="TAppUser.resetSearch()" space="true"/>
+                            </div>
+                            <div class="col-sm-3">
+                                <button type="button" class="btn btn-primary " onclick="TAppUser.export()" id="export">
+                                    <i class="fa "></i>&nbsp;导出
+                                </button>
+                                <#button name="异常" icon="" clickFun="TAppUserException.tAppUserException()"/>
+                                <button type="button" class="btn btn-primary " onclick="TAppUser.searchCoupon()" id="">
+                                    <i class="fa "></i>&nbsp;赠送优惠劵
+                                </button>
+                            </div>
+                        </div>
+                        <!--<div class="hidden-xs" id="TAppUserTableToolbar" role="group">
+                            @if(shiro.hasPermission("/tAppUser/add")){
+                                <#button name="添加" icon="fa-plus" clickFun="TAppUser.openAddTAppUser()"/>
+                            @}
+                            @if(shiro.hasPermission("/tAppUser/update")){
+                                <#button name="修改" icon="fa-edit" clickFun="TAppUser.openTAppUserDetail()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tAppUser/delete")){
+                                <#button name="删除" icon="fa-remove" clickFun="TAppUser.delete()" space="true"/>
+                            @}
+                        </div>-->
+                        <#table id="TAppUserTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tAppUser/tAppUser.js"></script>
+<script src="${ctxPath}/static/modular/system/tAppUser/tCoupon.js"></script>
+<script src="${ctxPath}/static/modular/system/tAppUser/tAppUserException.js"></script>
+<script type="text/javascript">
+    laydate.render({
+        elem: '#createTime',
+        type: 'date',
+        range: true
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAppUser/tAppUserDetail.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAppUser/tAppUserDetail.html
new file mode 100644
index 0000000..787c3ff
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAppUser/tAppUserDetail.html
@@ -0,0 +1,177 @@
+@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">
+                        <hr/>
+                        <div class="initialLevel col-sm-12 control-label form-group"  >
+                            <div style="background-color: gray;height: 35px;line-height: 35px">
+                                <label style="color: #0C0C0C">用户资料</label>
+                            </div>
+                        </div>
+                        <hr/>
+
+                        <div class="initialLevel col-sm-12 control-label form-group"  >
+                            <div class="initialLevel col-sm-1 control-label form-group"  style="margin-left: 10px" >
+                                <img src="https://lmg.jj20.com/up/allimg/1114/040221103339/210402103339-7-1200.jpg" />
+                            </div>
+                            <div class="initialLevel col-sm-3 control-label form-group"  >
+                                <label class="control-label" >昵称:</label>
+                                <label>${nickname}</label>
+                            </div>
+                            <div class="initialLevel col-sm-2 control-label form-group" >
+                                <label class="control-label">ID:</label>
+                                <label>${id}</label>
+                            </div>
+                            <div class="initialLevel col-sm-3 control-label form-group" >
+                                <label class="control-label">注册时间:</label>
+                                <label>${createTime}</label>
+                            </div>
+                        </div>
+
+                        <div class="initialLevel col-sm-12 control-label form-group"  >
+                            <div class="initialLevel col-sm-3 control-label form-group"  style="margin-left: 150px">
+                                <label class="control-label">客户渠道:</label>
+                                <label>${expiredCount}</label>
+                            </div>
+                            <div class="initialLevel col-sm-2 control-label form-group"  style="margin-left: 150px">
+                                <label class="control-label" >下单次数:</label>
+                                <label>${expiredCount}</label>
+                            </div>
+                            <div class="initialLevel col-sm-3 control-label form-group" style="margin-left: 150px" >
+                                <label class="control-label" >取消次数:</label>
+                                <label>${expiredCount}</label>
+                            </div>
+                        </div>
+
+                        <hr/>
+                        <div class="initialLevel col-sm-12 control-label form-group"  >
+                            <div style="background-color: gray;height: 35px;line-height: 35px">
+                                <label style="color: #0C0C0C">消费信息</label>
+                            </div>
+                        </div>
+                        <hr/>
+
+                        <div class="initialLevel col-sm-12 control-label form-group"  >
+                            <div class="initialLevel col-sm-4 control-label form-group"  >
+                                <label class="col-sm-3 control-label" style="margin-left: -50px;font-weight: bolder;color: #0C0C0C;left: 100px">最近消费:</label>
+                            </div>
+                            <div class="initialLevel col-sm-4 control-label form-group"  >
+                                <label class="col-sm-2 control-label" style="margin-left: -50px;font-weight: bolder;color: #0C0C0C;left: 100px">优惠劵:</label>
+                            </div>
+                        </div>
+
+                        <div class="initialLevel col-sm-12 control-label form-group"  >
+                            <div class="initialLevel col-sm-4 control-label form-group"  style="margin-left: 70px">
+                                <label class="control-label">最近消费时间:</label>
+                                <label>${expiredCount}</label>
+                            </div>
+                            <div class="initialLevel col-sm-2 control-label form-group"  >
+                                <label class="control-label">未使用:</label>
+                                <label>${notUsedCount}</label>
+                            </div>
+                            <div class="initialLevel col-sm-3 control-label form-group"  >
+                                <label class="control-label">已使用:</label>
+                                <label>${usedCount}</label>
+                            </div>
+                        </div>
+
+                        <div class="initialLevel col-sm-12 control-label form-group"  >
+                            <div class="initialLevel col-sm-4 control-label form-group" style="margin-left: 70px" >
+                                <label class="control-label" >最近消费金额:</label>
+                                <label>${expiredCount}</label>
+                            </div>
+                            <div class="initialLevel col-sm-4 control-label form-group" >
+                                <label class="control-label">已过期:</label>
+                                <label>${expiredCount}</label>
+                            </div>
+                        </div>
+
+                        <div class="initialLevel col-sm-12 control-label form-group"  >
+                            <div class="initialLevel col-sm-4 control-label form-group"  >
+                                    <label class="col-sm-3 control-label" style="margin-left: -50px;font-weight: bolder;color: #0C0C0C;left: 100px">累计消费/售后:</label>
+                            </div>
+                            <div class="initialLevel col-sm-4 control-label form-group"  >
+                                    <label class="col-sm-2 control-label" style="margin-left: -50px;font-weight: bolder;color: #0C0C0C;left: 100px">金额:</label>
+                            </div>
+                        </div>
+
+                        <div class="initialLevel col-sm-12 control-label form-group"  >
+                            <div class="initialLevel col-sm-4 control-label form-group" style="margin-left: 70px" >
+                                    <label class="control-label">总消费金额:</label>
+                                    <label>${expiredCount}</label>
+                            </div>
+                            <div class="initialLevel col-sm-2 control-label form-group" >
+                                    <label class="control-label">剩余:</label>
+                                    <label>${expiredCount}</label>
+                            </div>
+                        </div>
+
+                        <div class="initialLevel col-sm-12 control-label form-group"  >
+                            <div class="initialLevel col-sm-4 control-label form-group" style="margin-left: 70px" >
+                                    <label class="control-label">总消费次数:</label>
+                                    <label>${expiredCount}</label>
+                            </div>
+                        </div>
+
+                        <input hidden id="status" value="${status}">
+                        <div>
+                            @if(status==1){
+                                <hr/>
+                                <div class="initialLevel col-sm-12 control-label form-group"  >
+                                    <div style="background-color: gray;height: 35px;line-height: 35px">
+                                        <label style="color: #0C0C0C">启用理由</label>
+                                    </div>
+                                </div>
+                                <hr/>
+                                <div  style="margin-left: 70px" >
+                                    <textarea id="stopRemark" style="width: 681px; height: 249px;" readonly>${remark}</textarea>
+                                </div>
+                            @}
+                            @if(status==2){
+                                <hr/>
+                                <div class="initialLevel col-sm-12 control-label form-group"  >
+                                    <div style="background-color: gray;height: 35px;line-height: 35px">
+                                        <label style="color: #0C0C0C">冻结理由</label>
+                                    </div>
+                                </div>
+                                <hr/>
+                                <div  style="margin-left: 70px" >
+                                    <textarea id="startRemark" style="width: 681px; height: 249px;" readonly>${remark}</textarea>
+                                </div>
+                            @}
+                        </div>
+
+                        <hr/>
+                        <div class="initialLevel col-sm-12 control-label form-group"  >
+                            <div style="background-color: gray;height: 35px;line-height: 35px">
+                                <label style="color: #0C0C0C">交易明细</label>
+                            </div>
+                        </div>
+                        <hr/>
+                        <!--订单表分页-->
+                        <#table id="TAppUserDetailOrderTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tAppUser/tAppUser.js"></script>
+<script src="${ctxPath}/static/modular/system/tAppUser/tCoupon.js"></script>
+<script src="${ctxPath}/static/modular/system/tAppUser/tAppUserException.js"></script>
+<script src="${ctxPath}/static/modular/system/tAppUser/tOrder.js"></script>
+<script src="${ctxPath}/static/modular/system/tAppUser/tAppUserDetailOrder.js"></script>
+<script type="text/javascript">
+    laydate.render({
+        elem: '#createTime',
+        type: 'date',
+        range: true
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAppUser/tAppUserDetailException.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAppUser/tAppUserDetailException.html
new file mode 100644
index 0000000..c53c9d7
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAppUser/tAppUserDetailException.html
@@ -0,0 +1,177 @@
+@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">
+                        <hr/>
+                        <div class="initialLevel col-sm-12 control-label form-group"  >
+                            <div style="background-color: gray;height: 35px;line-height: 35px">
+                                <label style="color: #0C0C0C">用户资料</label>
+                            </div>
+                        </div>
+                        <hr/>
+
+                        <div class="initialLevel col-sm-12 control-label form-group"  >
+                            <div class="initialLevel col-sm-1 control-label form-group"  style="margin-left: 10px" >
+                                <img src="https://lmg.jj20.com/up/allimg/1114/040221103339/210402103339-7-1200.jpg" />
+                            </div>
+                            <div class="initialLevel col-sm-3 control-label form-group" >
+                                <label class="control-label" >昵称:</label>
+                                <label>${nickname}</label>
+                            </div>
+                            <div class="initialLevel col-sm-2 control-label form-group">
+                                <label class="control-label">ID:</label>
+                                <label>${id}</label>
+                            </div>
+                            <div class="initialLevel col-sm-3 control-label form-group"  >
+                                <label class="control-label">注册时间:</label>
+                                <label>${createTime}</label>
+                            </div>
+                        </div>
+
+                        <div class="initialLevel col-sm-12 control-label form-group"  >
+                            <div class="initialLevel col-sm-3 control-label form-group"  style="margin-left: 150px">
+                                <label class="control-label">客户渠道:</label>
+                                <label>${expiredCount}</label>
+                            </div>
+                            <div class="initialLevel col-sm-2 control-label form-group"  >
+                                <label class="control-label" >下单次数:</label>
+                                <label>${expiredCount}</label>
+                            </div>
+                            <div class="initialLevel col-sm-3 control-label form-group" >
+                                <label class="control-label" >取消次数:</label>
+                                <label>${expiredCount}</label>
+                            </div>
+                        </div>
+
+                        <hr/>
+                        <div class="initialLevel col-sm-12 control-label form-group"  >
+                            <div style="background-color: gray;height: 35px;line-height: 35px">
+                                <label style="color: #0C0C0C">消费信息</label>
+                            </div>
+                        </div>
+                        <hr/>
+
+                        <div class="initialLevel col-sm-12 control-label form-group"  >
+                            <div class="initialLevel col-sm-4 control-label form-group"  >
+                                <label class="col-sm-3 control-label" style="margin-left: -50px;font-weight: bolder;color: #0C0C0C;left: 100px">最近消费:</label>
+                            </div>
+                            <div class="initialLevel col-sm-4 control-label form-group"  >
+                                <label class="col-sm-2 control-label" style="margin-left: -50px;font-weight: bolder;color: #0C0C0C;left: 100px">优惠劵:</label>
+                            </div>
+                        </div>
+
+                        <div class="initialLevel col-sm-12 control-label form-group"  >
+                            <div class="initialLevel col-sm-4 control-label form-group"  style="margin-left: 70px">
+                                <label class="control-label">最近消费时间:</label>
+                                <label>${expiredCount}</label>
+                            </div>
+                            <div class="initialLevel col-sm-2 control-label form-group"  >
+                                <label class="control-label">未使用:</label>
+                                <label>${notUsedCount}</label>
+                            </div>
+                            <div class="initialLevel col-sm-3 control-label form-group"  >
+                                <label class="control-label">已使用:</label>
+                                <label>${usedCount}</label>
+                            </div>
+                        </div>
+
+                        <div class="initialLevel col-sm-12 control-label form-group"  >
+                            <div class="initialLevel col-sm-4 control-label form-group" style="margin-left: 70px" >
+                                <label class="control-label" >最近消费金额:</label>
+                                <label>${expiredCount}</label>
+                            </div>
+                            <div class="initialLevel col-sm-4 control-label form-group" >
+                                <label class="control-label">已过期:</label>
+                                <label>${expiredCount}</label>
+                            </div>
+                        </div>
+
+                        <div class="initialLevel col-sm-12 control-label form-group"  >
+                            <div class="initialLevel col-sm-4 control-label form-group"  >
+                                <label class="col-sm-3 control-label" style="margin-left: -50px;font-weight: bolder;color: #0C0C0C;left: 100px">累计消费/售后:</label>
+                            </div>
+                            <div class="initialLevel col-sm-4 control-label form-group"  >
+                                <label class="col-sm-2 control-label" style="margin-left: -50px;font-weight: bolder;color: #0C0C0C;left: 100px">金额:</label>
+                            </div>
+                        </div>
+
+                        <div class="initialLevel col-sm-12 control-label form-group"  >
+                            <div class="initialLevel col-sm-4 control-label form-group" style="margin-left: 70px" >
+                                <label class="control-label">总消费金额:</label>
+                                <label>${expiredCount}</label>
+                            </div>
+                            <div class="initialLevel col-sm-2 control-label form-group" >
+                                <label class="control-label">剩余:</label>
+                                <label>${expiredCount}</label>
+                            </div>
+                        </div>
+
+                        <div class="initialLevel col-sm-12 control-label form-group"  >
+                            <div class="initialLevel col-sm-4 control-label form-group" style="margin-left: 70px" >
+                                <label class="control-label">总消费次数:</label>
+                                <label>${expiredCount}</label>
+                            </div>
+                        </div>
+
+                        <input hidden id="status" value="${status}">
+                        <div>
+                            @if(status==1){
+                            <hr/>
+                            <div class="initialLevel col-sm-12 control-label form-group"  >
+                                <div style="background-color: gray;height: 35px;line-height: 35px">
+                                    <label style="color: #0C0C0C">启用理由</label>
+                                </div>
+                            </div>
+                            <hr/>
+                            <div  style="margin-left: 70px" >
+                                <textarea id="stopRemark" style="width: 681px; height: 249px;" readonly>${remark}</textarea>
+                            </div>
+                            @}
+                            @if(status==2){
+                            <hr/>
+                            <div class="initialLevel col-sm-12 control-label form-group"  >
+                                <div style="background-color: gray;height: 35px;line-height: 35px">
+                                    <label style="color: #0C0C0C">冻结理由</label>
+                                </div>
+                            </div>
+                            <hr/>
+                            <div  style="margin-left: 70px" >
+                                <textarea id="startRemark" style="width: 681px; height: 249px;" readonly>${remark}</textarea>
+                            </div>
+                            @}
+                        </div>
+
+                        <hr/>
+                        <div class="initialLevel col-sm-12 control-label form-group"  >
+                            <div style="background-color: gray;height: 35px;line-height: 35px">
+                                <label style="color: #0C0C0C">交易明细</label>
+                            </div>
+                        </div>
+                        <hr/>
+                        <!--订单表分页-->
+                        <#table id="TAppUserDetailOrderTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tAppUser/tAppUser.js"></script>
+<script src="${ctxPath}/static/modular/system/tAppUser/tCoupon.js"></script>
+<script src="${ctxPath}/static/modular/system/tAppUser/tAppUserException.js"></script>
+<script src="${ctxPath}/static/modular/system/tAppUser/tOrder.js"></script>
+<script src="${ctxPath}/static/modular/system/tAppUser/tAppUserDetailOrder.js"></script>
+<script type="text/javascript">
+    laydate.render({
+        elem: '#createTime',
+        type: 'date',
+        range: true
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAppUser/tAppUserException.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAppUser/tAppUserException.html
new file mode 100644
index 0000000..54f5dfe
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAppUser/tAppUserException.html
@@ -0,0 +1,70 @@
+@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">
+                                <#TimeCon id="createTime" name="注册时间"/>
+                            </div>
+                            <div class="col-sm-2">
+                                <#NameCon id="id" name="用户ID" />
+                            </div>
+                            <div class="col-sm-2">
+                                <#NameCon id="nickName" name="昵称" />
+                            </div>
+                            <div class="col-sm-2">
+                                <#NameCon id="phone" name="手机号" />
+                            </div>
+                            <div class="col-sm-1">
+                                <select class="input-group" id="status" style="width: 80px;height: 33px" name="status">
+                                    <option value="">状态</option>
+                                    <option value="1">正常</option>
+                                    <option value="2">冻结</option>
+                                    <option value="3">已删除</option>
+                                </select>
+                            </div>
+                            <div class="col-sm-2">
+                                <#button name="搜索" icon="fa-search" clickFun="TAppUserException.search()"/>
+                                <#button name="重置" icon="fa-trash" clickFun="TAppUserException.resetSearch()" space="true"/>
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="导出" icon="" clickFun="TAppUserException.export()"/>
+                                <button type="button" class="btn btn-primary " onclick="TAppUserException.searchCoupon()" id="">
+                                    <i class="fa "></i>&nbsp;赠送优惠劵
+                                </button>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="TAppUserTableToolbar" role="group">
+                            @if(shiro.hasPermission("/tAppUser/add")){
+                                <#button name="添加" icon="fa-plus" clickFun="TAppUser.openAddTAppUser()"/>
+                            @}
+                            @if(shiro.hasPermission("/tAppUser/update")){
+                                <#button name="修改" icon="fa-edit" clickFun="TAppUser.openTAppUserDetail()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tAppUser/delete")){
+                                <#button name="删除" icon="fa-remove" clickFun="TAppUser.delete()" space="true"/>
+                            @}
+                        </div>
+                        <#table id="TAppUserExceptionTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tAppUser/tAppUserException.js"></script>
+<script src="${ctxPath}/static/modular/system/tAppUser/tCoupon.js"></script>
+<script type="text/javascript">
+    laydate.render({
+        elem: '#createTime',
+        type: 'date',
+        range: true
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAppUser/tAppUserStartAndStop.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAppUser/tAppUserStartAndStop.html
new file mode 100644
index 0000000..4d4a4e5
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAppUser/tAppUserStartAndStop.html
@@ -0,0 +1,32 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <input hidden id="id" value="${id}">
+                        <input hidden id="status" value="${status}">
+                        <div class="col-lg-3">
+                            @if(status==1){
+                                冻结理由:<textarea id="stopRemark" placeholder="请输入冻结理由" style="width: 681px; height: 249px;"></textarea>
+                            @}
+                            @if(status==2){
+                                启用理由:<textarea id="startRemark" placeholder="请输入启用理由" style="width: 681px; height: 249px;"></textarea>
+                            @}
+                        </div>
+                        <div class="hidden-xs" id="TAppUserTableToolbar" role="group"  style="margin-left:300px">
+                            <#button name="取消" icon="fa-plus" clickFun="TAppUserInfoDlg.close()" />
+                            <#button name="确定" icon="fa-plus" clickFun="TAppUser.updateStatus()"/>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tAppUser/tAppUser.js"></script>
+<script src="${ctxPath}/static/modular/system/tAppUser/tAppUser_info.js"></script>
+<script src="${ctxPath}/static/modular/system/tAppUser/tCoupon.js"></script>
+<script src="${ctxPath}/static/modular/system/tAppUser/tAppUserException.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAppUser/tAppUserStartAndStopException.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAppUser/tAppUserStartAndStopException.html
new file mode 100644
index 0000000..d18e878
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAppUser/tAppUserStartAndStopException.html
@@ -0,0 +1,32 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <input hidden id="id" value="${id}">
+                        <input hidden id="status" value="${status}">
+                        <div class="col-lg-3">
+                            @if(status==1){
+                                冻结理由:<textarea id="stopRemark" placeholder="请输入冻结理由" style="width: 681px; height: 249px;"></textarea>
+                            @}
+                            @if(status==2){
+                                启用理由:<textarea id="startRemark" placeholder="请输入启用理由" style="width: 681px; height: 249px;"></textarea>
+                            @}
+                        </div>
+                        <div class="hidden-xs" id="TAppUserTableToolbar" role="group"  style="margin-left:300px">
+                            <#button name="取消" icon="fa-plus" clickFun="TAppUserInfoDlg.closeException()" />
+                            <#button name="确定" icon="fa-plus" clickFun="TAppUserException.updateStatus()"/>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tAppUser/tAppUser.js"></script>
+<script src="${ctxPath}/static/modular/system/tAppUser/tAppUser_info.js"></script>
+<script src="${ctxPath}/static/modular/system/tAppUser/tCoupon.js"></script>
+<script src="${ctxPath}/static/modular/system/tAppUser/tAppUserException.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAppUser/tAppUser_add.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAppUser/tAppUser_add.html
new file mode 100644
index 0000000..9f5f854
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAppUser/tAppUser_add.html
@@ -0,0 +1,38 @@
+@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="nickname" name="用户昵称" underline="true"/>
+                            <#input id="phone" name="手机号" underline="true"/>
+                            <#input id="sex" name="性别(1=男,2=女)" underline="true"/>
+                            <#input id="avatar" name="头像" underline="true"/>
+                            <#input id="openid" name="微信openid" underline="true"/>
+                            <#input id="unionid" name="微信unionid"/>
+                </div>
+
+                <div class="col-sm-6">
+                            <#input id="emergencyContact" name="紧急联系人" underline="true"/>
+                            <#input id="emergencyPhone" name="紧急联系电话" underline="true"/>
+                            <#input id="accountBalance" name="账户余额" underline="true"/>
+                            <#input id="userTagId" name="用户标签id" underline="true"/>
+                            <#input id="status" name="状态(1=正常,2=冻结,3=删除)" underline="true"/>
+                            <#input id="createTime" name="添加时间" 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="TAppUserInfoDlg.addSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TAppUserInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tAppUser/tAppUser_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAppUser/tAppUser_edit.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAppUser/tAppUser_edit.html
new file mode 100644
index 0000000..68fb469
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAppUser/tAppUser_edit.html
@@ -0,0 +1,38 @@
+@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="nickname" name="用户昵称" value="${item.nickname}" underline="true"/>
+                            <#input id="phone" name="手机号" value="${item.phone}" underline="true"/>
+                            <#input id="sex" name="性别(1=男,2=女)" value="${item.sex}" underline="true"/>
+                            <#input id="avatar" name="头像" value="${item.avatar}" underline="true"/>
+                            <#input id="openid" name="微信openid" value="${item.openid}" underline="true"/>
+                            <#input id="unionid" name="微信unionid" value="${item.unionid}" />
+                </div>
+
+                <div class="col-sm-6">
+                            <#input id="emergencyContact" name="紧急联系人" value="${item.emergencyContact}" underline="true"/>
+                            <#input id="emergencyPhone" name="紧急联系电话" value="${item.emergencyPhone}" underline="true"/>
+                            <#input id="accountBalance" name="账户余额" value="${item.accountBalance}" underline="true"/>
+                            <#input id="userTagId" name="用户标签id" value="${item.userTagId}" underline="true"/>
+                            <#input id="status" name="状态(1=正常,2=冻结,3=删除)" value="${item.status}" underline="true"/>
+                            <#input id="createTime" name="添加时间" value="${item.createTime}" />
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TAppUserInfoDlg.editSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TAppUserInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tAppUser/tAppUser_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAppUser/tCoupon.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAppUser/tCoupon.html
new file mode 100644
index 0000000..2146c3f
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAppUser/tCoupon.html
@@ -0,0 +1,34 @@
+@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">
+                        <input hidden id="userIds" value="${userIds}">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#NameCon id="condition" name="优惠券名称" placeholder="请输入优惠券名称"/>
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="TCoupon.search()"/>
+                            </div>
+                        </div>
+                        <#table id="TCouponTable"/>
+                        <div class="hidden-xs" id="TAppUserTableToolbar" role="group"  style="margin-left:650px">
+                            <#button name="取消" icon="fa-plus" clickFun="TAppUserInfoDlg.close()" />
+                            <#button name="确定" icon="fa-plus" clickFun="TCoupon.sendCouponToUser()"/>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tCoupon/tCoupon.js"></script>
+<script src="${ctxPath}/static/modular/system/tAppUser/tCoupon.js"></script>
+<script src="${ctxPath}/static/modular/system/tAppUser/tAppUser_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAppUser/tCouponException.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAppUser/tCouponException.html
new file mode 100644
index 0000000..108d236
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAppUser/tCouponException.html
@@ -0,0 +1,35 @@
+@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">
+                        <input hidden id="userIds" value="${userIds}">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#NameCon id="condition" name="优惠券名称" placeholder="请输入优惠券名称"/>
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="TCoupon.search()"/>
+                            </div>
+                        </div>
+                        <#table id="TCouponTable"/>
+                        <div class="hidden-xs" id="TAppUserTableToolbar" role="group"  style="margin-left:650px">
+                            <#button name="取消" icon="fa-plus" clickFun="TAppUserInfoDlg.closeException()" />
+                            <#button name="确定" icon="fa-plus" clickFun="TAppUserException.sendCouponToUserException()"/>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tCoupon/tCoupon.js"></script>
+<script src="${ctxPath}/static/modular/system/tAppUser/tCoupon.js"></script>
+<script src="${ctxPath}/static/modular/system/tAppUser/tAppUserException.js"></script>
+<script src="${ctxPath}/static/modular/system/tAppUser/tAppUser_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCoupon/tCoupon.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCoupon/tCoupon.html
new file mode 100644
index 0000000..f8fd961
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCoupon/tCoupon.html
@@ -0,0 +1,38 @@
+@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="condition" name="名称" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="TCoupon.search()"/>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="TCouponTableToolbar" role="group">
+                            @if(shiro.hasPermission("/tCoupon/add")){
+                                <#button name="添加" icon="fa-plus" clickFun="TCoupon.openAddTCoupon()"/>
+                            @}
+                            @if(shiro.hasPermission("/tCoupon/update")){
+                                <#button name="修改" icon="fa-edit" clickFun="TCoupon.openTCouponDetail()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tCoupon/delete")){
+                                <#button name="删除" icon="fa-remove" clickFun="TCoupon.delete()" space="true"/>
+                            @}
+                        </div>
+                        <#table id="TCouponTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tCoupon/tCoupon.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCoupon/tCoupon_add.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCoupon/tCoupon_add.html
new file mode 100644
index 0000000..5bf8512
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCoupon/tCoupon_add.html
@@ -0,0 +1,28 @@
+@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="createtime" name="创建时间"/>
+                </div>
+
+                <div class="col-sm-6">
+                            <#input id="couponName" name="优惠券名称" 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/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCoupon/tCoupon_edit.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCoupon/tCoupon_edit.html
new file mode 100644
index 0000000..e4c611b
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCoupon/tCoupon_edit.html
@@ -0,0 +1,28 @@
+@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="createtime" name="创建时间" value="${item.createtime}" />
+                </div>
+
+                <div class="col-sm-6">
+                            <#input id="couponName" name="优惠券名称" value="${item.couponName}" />
+                </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/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrder/tOrder.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrder/tOrder.html
new file mode 100644
index 0000000..ec76def
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrder/tOrder.html
@@ -0,0 +1,38 @@
+@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="condition" name="名称" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="TOrder.search()"/>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="TOrderTableToolbar" role="group">
+                            @if(shiro.hasPermission("/tOrder/add")){
+                                <#button name="添加" icon="fa-plus" clickFun="TOrder.openAddTOrder()"/>
+                            @}
+                            @if(shiro.hasPermission("/tOrder/update")){
+                                <#button name="修改" icon="fa-edit" clickFun="TOrder.openTOrderDetail()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tOrder/delete")){
+                                <#button name="删除" icon="fa-remove" clickFun="TOrder.delete()" space="true"/>
+                            @}
+                        </div>
+                        <#table id="TOrderTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tOrder/tOrder.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrder/tOrder_add.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrder/tOrder_add.html
new file mode 100644
index 0000000..e974cb9
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrder/tOrder_add.html
@@ -0,0 +1,51 @@
+@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="code" name="编号" underline="true"/>
+                            <#input id="userId" name="用户id" underline="true"/>
+                            <#input id="driverId" name="司机id" underline="true"/>
+                            <#input id="source" name="订单来源(1=小程序)" underline="true"/>
+                            <#input id="agentId" name="代理商id" underline="true"/>
+                            <#input id="branchOfficeId" name="分公司id" underline="true"/>
+                            <#input id="startTime" name="开始服务时间" underline="true"/>
+                            <#input id="startAddress" name="起点地址" underline="true"/>
+                            <#input id="startLat" name="起点纬度" underline="true"/>
+                            <#input id="startLng" name="起点经度" underline="true"/>
+                            <#input id="endAddress" name="终点地址" underline="true"/>
+                            <#input id="endLat" name="终点纬度"/>
+                </div>
+
+                <div class="col-sm-6">
+                            <#input id="endLng" name="终点经度" underline="true"/>
+                            <#input id="boardingTime" name="上车时间" underline="true"/>
+                            <#input id="getoffTime" name="下车时间" underline="true"/>
+                            <#input id="estimatedPrice" name="预估价" underline="true"/>
+                            <#input id="orderMoney" name="订单金额" underline="true"/>
+                            <#input id="payMoney" name="支付金额" underline="true"/>
+                            <#input id="discountedPrice" name="优惠金额" underline="true"/>
+                            <#input id="couponId" name="优惠券id" underline="true"/>
+                            <#input id="payType" name="支付类型(1=线上)" underline="true"/>
+                            <#input id="payTime" name="支付时间" underline="true"/>
+                            <#input id="state" name="订单状态(1=待接单,2=已接单,3=)" underline="true"/>
+                            <#input id="status" name="状态(1=正常,2=冻结,3=删除)" underline="true"/>
+                            <#input id="createTime" name="添加时间" 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="TOrderInfoDlg.addSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TOrderInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tOrder/tOrder_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrder/tOrder_edit.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrder/tOrder_edit.html
new file mode 100644
index 0000000..3213b25
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrder/tOrder_edit.html
@@ -0,0 +1,51 @@
+@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="code" name="编号" value="${item.code}" underline="true"/>
+                            <#input id="userId" name="用户id" value="${item.userId}" underline="true"/>
+                            <#input id="driverId" name="司机id" value="${item.driverId}" underline="true"/>
+                            <#input id="source" name="订单来源(1=小程序)" value="${item.source}" underline="true"/>
+                            <#input id="agentId" name="代理商id" value="${item.agentId}" underline="true"/>
+                            <#input id="branchOfficeId" name="分公司id" value="${item.branchOfficeId}" underline="true"/>
+                            <#input id="startTime" name="开始服务时间" value="${item.startTime}" underline="true"/>
+                            <#input id="startAddress" name="起点地址" value="${item.startAddress}" underline="true"/>
+                            <#input id="startLat" name="起点纬度" value="${item.startLat}" underline="true"/>
+                            <#input id="startLng" name="起点经度" value="${item.startLng}" underline="true"/>
+                            <#input id="endAddress" name="终点地址" value="${item.endAddress}" underline="true"/>
+                            <#input id="endLat" name="终点纬度" value="${item.endLat}" />
+                </div>
+
+                <div class="col-sm-6">
+                            <#input id="endLng" name="终点经度" value="${item.endLng}" underline="true"/>
+                            <#input id="boardingTime" name="上车时间" value="${item.boardingTime}" underline="true"/>
+                            <#input id="getoffTime" name="下车时间" value="${item.getoffTime}" underline="true"/>
+                            <#input id="estimatedPrice" name="预估价" value="${item.estimatedPrice}" underline="true"/>
+                            <#input id="orderMoney" name="订单金额" value="${item.orderMoney}" underline="true"/>
+                            <#input id="payMoney" name="支付金额" value="${item.payMoney}" underline="true"/>
+                            <#input id="discountedPrice" name="优惠金额" value="${item.discountedPrice}" underline="true"/>
+                            <#input id="couponId" name="优惠券id" value="${item.couponId}" underline="true"/>
+                            <#input id="payType" name="支付类型(1=线上)" value="${item.payType}" underline="true"/>
+                            <#input id="payTime" name="支付时间" value="${item.payTime}" underline="true"/>
+                            <#input id="state" name="订单状态(1=待接单,2=已接单,3=)" value="${item.state}" underline="true"/>
+                            <#input id="status" name="状态(1=正常,2=冻结,3=删除)" value="${item.status}" underline="true"/>
+                            <#input id="createTime" name="添加时间" value="${item.createTime}" />
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TOrderInfoDlg.editSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TOrderInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tOrder/tOrder_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tAppUser/tAppUser.js b/management/guns-admin/src/main/webapp/static/modular/system/tAppUser/tAppUser.js
new file mode 100644
index 0000000..77e7147
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tAppUser/tAppUser.js
@@ -0,0 +1,257 @@
+/**
+ * 管理初始化
+ */
+var TAppUser = {
+    id: "TAppUserTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+TAppUser.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: false},
+            {title: '用户ID', field: 'id', visible: true, align: 'center', valign: 'middle'},
+            {title: '用户昵称', field: 'nickname', visible: true, align: 'center', valign: 'middle'},
+            {title: '手机号', field: 'phone', visible: true, align: 'center', valign: 'middle'},
+            {title: '性别', field: 'sex', visible: true, align: 'center', valign: 'middle'},
+            {title: '头像', field: 'avatar', visible: true, align: 'center', valign: 'middle'},
+            {title: '微信openid', field: 'openid', visible: true, align: 'center', valign: 'middle'},
+            {title: '微信unionid', field: 'unionid', visible: true, align: 'center', valign: 'middle'},
+            {title: '紧急联系人', field: 'emergencyContact', visible: true, align: 'center', valign: 'middle'},
+            {title: '紧急联系电话', field: 'emergencyPhone', visible: true, align: 'center', valign: 'middle'},
+            {title: '账户余额', field: 'accountBalance', visible: true, align: 'center', valign: 'middle'},
+            {title: '用户标签id', field: 'userTagId', visible: true, align: 'center', valign: 'middle'},
+            {title: '状态', field: 'status', visible: true, align: 'center', valign: 'middle'},
+            {title: '添加时间', field: 'createTime', visible: true, align: 'center', valign: 'middle'},
+            // {title: '是否异常', field: 'isException', hidden:true, visible: true, align: 'center', valign: 'middle'},
+            // {title: '启用冻结理由', field: 'remark', hidden:true,visible: true, align: 'center', valign: 'middle'},
+            {title: '操作', visible: true, align: 'center', valign: 'middle',width:150,
+                formatter: function (value, row) {
+                    if (row.status === 1){
+                        return '<a href="#" onclick="TAppUser.stop('+row.id+','+row.status+')" style="color:red">停用</a>' +'&nbsp;' +
+                        '<a href="#" onclick="TAppUser.searchTAppUserDetail('+row.id+','+row.status+')" style="color:green">详情</a>'
+                    }else if (row.status === 2){
+                        return '<a href="#" onclick="TAppUser.start('+row.id+','+row.status+')" style="color:green">启用</a>' +'&nbsp;' +
+                            '<a href="#" onclick="TAppUser.searchTAppUserDetail('+row.id+','+row.status+')" style="color:green">详情</a>'
+                    }
+                }
+            }
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+TAppUser.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        TAppUser.seItem = selected[0];
+        return true;
+    }
+};
+
+
+/**
+ * 用户信息导出
+ */
+TAppUser.export=function(){
+    var nickName=$("#nickName").val()
+    var status=$("#status").val()
+    var id=$("#id").val()
+    var createTime=$("#createTime").val()
+    var phone=$("#phone").val()
+    window.location.href=Feng.ctxPath + "/tAppUser/export-userInfo?nickname="+nickName
+        +"&status="+status
+        +"&id="+id
+        +"&createTime="+createTime
+        +"&phone="+phone
+    ;
+}
+
+
+/**
+ * 点击添加
+ */
+TAppUser.openAddTAppUser = function () {
+    var index = layer.open({
+        type: 2,
+        title: '添加',
+        area: ['800px', '420px'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tAppUser/tAppUser_add'
+    });
+    this.layerIndex = index;
+};
+
+
+
+/**
+ * 停用
+ */
+TAppUser.stop = function (id) {
+    var index = layer.open({
+        type: 2,
+        title: '停用',
+        area: ['45%', '50%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tAppUser/tAppUser_start_and_stop?id='+id
+    });
+    this.layerIndex = index;
+};
+
+/**
+ * 启动
+ */
+TAppUser.start = function (id) {
+    var index = layer.open({
+        type: 2,
+        title: '启用',
+        area: ['45%', '50%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tAppUser/tAppUser_start_and_stop?id='+id
+    });
+    this.layerIndex = index;
+};
+
+/**
+ * 提交启用冻结
+ */
+TAppUser.updateStatus = function () {
+        var ajax = new $ax(Feng.ctxPath + "/tAppUser/update-status", function (data) {
+            console.log(111111)
+            Feng.success("修改成功!");
+            TAppUserInfoDlg.close();
+            parent.TAppUser.table.refresh();
+        }, function (data) {
+            Feng.error("修改失败!" + data.responseJSON.message + "!");
+        });
+        ajax.set("id",$("#id").val());
+        ajax.set("status",$("#status").val());
+        if($("#status").val() == 1){
+            ajax.set("remark",$("#stopRemark").val());
+        }
+        if($("#status").val() == 2){
+            ajax.set("remark",$("#startRemark").val());
+        }
+        ajax.start();
+};
+
+/**
+ * 打开查看详情
+ */
+TAppUser.openTAppUserDetail = function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '详情',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tAppUser/tAppUser_update/' + TAppUser.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 打开查看详情(使用中)
+ */
+TAppUser.searchTAppUserDetail = function (id) {
+    var index = layer.open({
+        type: 2,
+        title: '详情',
+        area: ['100%', '100%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tAppUser/userDetail?tAppUserId=' + id
+    });
+    this.layerIndex = index;
+};
+
+/**
+ * 删除
+ */
+TAppUser.delete = function () {
+    if (this.check()) {
+        var ajax = new $ax(Feng.ctxPath + "/tAppUser/delete", function (data) {
+            Feng.success("删除成功!");
+            TAppUser.table.refresh();
+        }, function (data) {
+            Feng.error("删除失败!" + data.responseJSON.message + "!");
+        });
+        ajax.set("tAppUserId",this.seItem.id);
+        ajax.start();
+    }
+};
+
+/**
+ * 查询异常列表
+ */
+TAppUser.searchExceptionList = function () {
+    var queryData = {};
+    queryData.status = 2;
+    TAppUser.table.refresh({query: queryData});
+};
+
+/**
+ * 查询列表
+ */
+TAppUser.search = function () {
+    var queryData = {};
+    queryData.nickname = $("#nickName").val();
+    queryData.phone = $("#phone").val();
+    queryData.createTime = $("#createTime").val();
+    queryData.id = $("#id").val();
+    queryData.status = $("#status").val();
+    TAppUser.table.refresh({query: queryData});
+};
+
+/**
+ * 跳转优惠卷页面
+ */
+TAppUser.searchCoupon = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    var data = [];
+    for (let i = 0; i < selected.length; i++) {
+        data[i] = selected[i].id;
+    }
+    if(this.check()){
+        var index = layer.open({
+            type: 2,
+            title: '赠送优惠券',
+            area: ['80%', '80%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tAppUser/sendCoupon?userIds=' + data
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 重置
+ */
+TAppUser.resetSearch = function (){
+    $("#nickName").val('');
+    $("#phone").val('');
+    $("#createTime").val('');
+    $("#id").val('');
+    $("#status").val('');
+}
+
+$(function () {
+    var defaultColunms = TAppUser.initColumn();
+    var table = new BSTable(TAppUser.id, "/tAppUser/list", defaultColunms);
+    table.setPaginationType("client");
+    TAppUser.table = table.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tAppUser/tAppUserDetailOrder.js b/management/guns-admin/src/main/webapp/static/modular/system/tAppUser/tAppUserDetailOrder.js
new file mode 100644
index 0000000..cccb965
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tAppUser/tAppUserDetailOrder.js
@@ -0,0 +1,108 @@
+/**
+ * 管理初始化
+ */
+var TAppUserDetailOrderTable = {
+    id: "TAppUserDetailOrderTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+TAppUserDetailOrderTable.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+            // {title: '主键', field: 'id', visible: true, align: 'center', valign: 'middle'},
+            {title: '订单编号', field: 'code', visible: true, align: 'center', valign: 'middle'},
+        {title: '创建时间', field: 'createTime', visible: true, align: 'center', valign: 'middle'},
+        {title: '起始地', field: 'startAddress', visible: true, align: 'center', valign: 'middle'},
+        {title: '目的地', field: 'endAddress', visible: true, align: 'center', valign: 'middle'},
+        {title: '总行驶里程(公里)', field: 'mileageSum', visible: true, align: 'center', valign: 'middle'},
+        {title: '总行驶时间(分)', field: 'travelTimeSum', visible: true, align: 'center', valign: 'middle'},
+        {title: '基础费用(元)', field: 'basicExpenses', visible: true, align: 'center', valign: 'middle'},
+        {title: '等待时间(5)分钟', field: 'waitTimePrice', visible: true, align: 'center', valign: 'middle'},
+        {title: '里程费(8.0)公里', field: 'mileagePrice', visible: true, align: 'center', valign: 'middle'},
+        {title: '恶劣天气', field: 'badWeather', visible: true, align: 'center', valign: 'middle'},
+        {title: '支付金额', field: 'payMoney', visible: true, align: 'center', valign: 'middle'},
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+TAppUserDetailOrderTable.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        TOrder.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 点击添加
+ */
+TAppUserDetailOrderTable.openAddTOrder = function () {
+    var index = layer.open({
+        type: 2,
+        title: '添加',
+        area: ['800px', '420px'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tOrder/tOrder_add'
+    });
+    this.layerIndex = index;
+};
+
+/**
+ * 打开查看详情
+ */
+TAppUserDetailOrderTable.openTOrderDetail = function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '详情',
+            area: ['800px', '420px'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tOrder/tOrder_update/' + TAppUserDetailOrderTable.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 删除
+ */
+TAppUserDetailOrderTable.delete = function () {
+    if (this.check()) {
+        var ajax = new $ax(Feng.ctxPath + "/tOrder/delete", function (data) {
+            Feng.success("删除成功!");
+            TAppUserDetailOrderTable.table.refresh();
+        }, function (data) {
+            Feng.error("删除失败!" + data.responseJSON.message + "!");
+        });
+        ajax.set("tOrderId",this.seItem.id);
+        ajax.start();
+    }
+};
+
+/**
+ * 查询列表
+ */
+TAppUserDetailOrderTable.search = function () {
+    var queryData = {};
+    queryData['condition'] = $("#condition").val();
+    TAppUserDetailOrderTable.table.refresh({query: queryData});
+};
+
+$(function () {
+    var defaultColunms = TAppUserDetailOrderTable.initColumn();
+    var table = new BSTable(TAppUserDetailOrderTable.id, "/tOrder/appUserDetailList", defaultColunms);
+    table.setPaginationType("client");
+    TAppUserDetailOrderTable.table = table.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tAppUser/tAppUserException.js b/management/guns-admin/src/main/webapp/static/modular/system/tAppUser/tAppUserException.js
new file mode 100644
index 0000000..2627ee3
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tAppUser/tAppUserException.js
@@ -0,0 +1,274 @@
+/**
+ * 管理初始化
+ */
+var TAppUserException = {
+    id: "TAppUserExceptionTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+TAppUserException.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: false},
+            {title: '注册时间', field: 'createTime', visible: true, align: 'center', valign: 'middle'},
+            {title: '用户ID', field: 'id', visible: true, align: 'center', valign: 'middle'},
+            {title: '用户昵称', field: 'nickname', visible: true, align: 'center', valign: 'middle'},
+            {title: '手机号', field: 'phone', visible: true, align: 'center', valign: 'middle'},
+            {title: '剩余优惠券', field: 'sex', visible: true, align: 'center', valign: 'middle'},
+            {title: '优惠券总数', field: 'avatar', visible: true, align: 'center', valign: 'middle'},
+            {title: '消费次数', field: 'openid', visible: true, align: 'center', valign: 'middle'},
+            {title: '历史消费', field: 'unionid', visible: true, align: 'center', valign: 'middle'},
+            {title: '最后一次消费时间', field: 'emergencyContact', visible: true, align: 'center', valign: 'middle'},
+            {title: '状态', field: 'status', visible: true, align: 'center', valign: 'middle'},
+            {title: '操作', visible: true, align: 'center', valign: 'middle',width:150,
+                formatter: function (value, row) {
+                    if (row.status === 1){
+                        return '<a href="#" onclick="TAppUserException.stop('+row.id+','+row.status+')" style="color:red">停用</a>' +'&nbsp;' +
+                            '<a href="#" onclick="TAppUserException.searchTAppUserDetailException('+row.id+','+row.status+')" style="color:green">详情</a>'
+                    }else if (row.status === 2){
+                        return '<a href="#" onclick="TAppUserException.start('+row.id+','+row.status+')" style="color:green">启用</a>' +'&nbsp;' +
+                            '<a href="#" onclick="TAppUserException.searchTAppUserDetailException('+row.id+','+row.status+')" style="color:green">详情</a>'
+                    }
+                }
+            }
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+TAppUserException.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        TAppUserException.seItem = selected[0];
+        return true;
+    }
+};
+
+
+/**
+ * 异常页面导出
+ */
+TAppUserException.export = function(){
+    var nickName=$("#nickName").val()
+    var status=$("#status").val()
+    var id=$("#id").val()
+    var createTime=$("#createTime").val()
+    var phone=$("#phone").val()
+    window.location.href=Feng.ctxPath + "/tAppUser/export-exceptionUserInfo?nickname="+nickName
+        +"&status="+status
+        +"&id="+id
+        +"&createTime="+createTime
+        +"&phone="+phone
+    ;
+}
+
+/**
+ * 点击添加
+ */
+TAppUserException.openAddTAppUser = function () {
+    var index = layer.open({
+        type: 2,
+        title: '添加',
+        area: ['800px', '420px'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tAppUser/tAppUser_add'
+    });
+    this.layerIndex = index;
+};
+
+/**
+ * 停用
+ */
+TAppUserException.stop = function (id) {
+    var index = layer.open({
+        type: 2,
+        title: '停用',
+        area: ['45%', '50%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tAppUser/tAppUserException_start_and_stop?id='+id
+    });
+    this.layerIndex = index;
+};
+
+/**
+ * 启动
+ */
+TAppUserException.start = function (id) {
+    var index = layer.open({
+        type: 2,
+        title: '启用',
+        area: ['45%', '50%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tAppUser/tAppUserException_start_and_stop?id='+id
+    });
+    this.layerIndex = index;
+};
+
+/**
+ * 提交启用冻结
+ */
+TAppUserException.updateStatus = function () {
+    var ajax = new $ax(Feng.ctxPath + "/tAppUser/update-status", function (data) {
+        Feng.success("修改成功!");
+        TAppUserInfoDlg.closeException();
+        parent.TAppUserException.table.refresh();
+    }, function (data) {
+        Feng.error("修改失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set("id",$("#id").val());
+    ajax.set("status",$("#status").val());
+    if($("#status").val() == 1){
+        ajax.set("remark",$("#stopRemark").val());
+    }
+    if($("#status").val() == 2){
+        ajax.set("remark",$("#startRemark").val());
+    }
+    ajax.start();
+};
+
+/**
+ * 打开查看详情
+ */
+TAppUserException.openTAppUserDetail = function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '详情',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tAppUser/tAppUser_update/' + TAppUserException.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 删除
+ */
+TAppUserException.delete = function () {
+    if (this.check()) {
+        var ajax = new $ax(Feng.ctxPath + "/tAppUser/delete", function (data) {
+            Feng.success("删除成功!");
+            TAppUserException.table.refresh();
+        }, function (data) {
+            Feng.error("删除失败!" + data.responseJSON.message + "!");
+        });
+        ajax.set("tAppUserId",this.seItem.id);
+        ajax.start();
+    }
+};
+
+/**
+ * 用户异常列表
+ */
+TAppUserException.tAppUserException = function () {
+    var index = layer.open({
+        type: 2,
+        title: '用户异常列表',
+        area: ['100%', '100%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tAppUser/tAppUser_exception'
+    });
+    this.layerIndex = index;
+};
+
+/**
+ * 查询列表
+ */
+TAppUserException.search = function () {
+    var queryData = {};
+    queryData.nickname = $("#nickName").val();
+    queryData.phone = $("#phone").val();
+    queryData.createTime = $("#createTime").val();
+    queryData.id = $("#id").val();
+    queryData.status = $("#status").val();
+    TAppUserException.table.refresh({query: queryData});
+};
+
+/**
+ * 打开查看详情(使用中)
+ */
+TAppUserException.searchTAppUserDetailException = function (id) {
+    var index = layer.open({
+        type: 2,
+        title: '详情',
+        area: ['100%', '100%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tAppUser/userDetailException?tAppUserId=' + id
+    });
+    this.layerIndex = index;
+};
+
+/**
+ * 跳转优惠卷页面
+ */
+TAppUserException.searchCoupon = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    var data = [];
+    for (let i = 0; i < selected.length; i++) {
+        data[i] = selected[i].id;
+    }
+    if(this.check()){
+        var index = layer.open({
+            type: 2,
+            title: '赠送优惠券',
+            area: ['80%', '80%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tAppUser/sendCouponException?userIds=' + data
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 发送优惠券
+ */
+TAppUserException.sendCouponToUserException = function () {
+    if(TCoupon.check()){
+        var ajax = new $ax(Feng.ctxPath + "/tCoupon/sendCouponToUser", function (data) {
+            Feng.success("发放成功!");
+            TAppUserInfoDlg.closeException();
+            parent.TAppUserException.table.refresh();
+        }, function (data) {
+            Feng.error("发放失败!" + data.responseJSON.message + "!");
+        });
+        ajax.setData({
+            userIds:$("#userIds").val(),
+            couponName:TCoupon.seItem.couponName
+        })
+        ajax.start();
+    }
+};
+
+/**
+ * 重置
+ */
+TAppUserException.resetSearch = function (){
+    $("#nickName").val('');
+    $("#phone").val('');
+    $("#createTime").val('');
+    $("#id").val('');
+    $("#status").val('');
+}
+
+$(function () {
+    var defaultColunms = TAppUserException.initColumn();
+    var table = new BSTable(TAppUserException.id, "/tAppUser/exceptionUserList", defaultColunms);
+    table.setPaginationType("client");
+    TAppUserException.table = table.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tAppUser/tAppUser_info.js b/management/guns-admin/src/main/webapp/static/modular/system/tAppUser/tAppUser_info.js
new file mode 100644
index 0000000..7792b26
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tAppUser/tAppUser_info.js
@@ -0,0 +1,116 @@
+/**
+ * 初始化详情对话框
+ */
+var TAppUserInfoDlg = {
+    tAppUserInfoData : {}
+};
+
+/**
+ * 清除数据
+ */
+TAppUserInfoDlg.clearData = function() {
+    this.tAppUserInfoData = {};
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TAppUserInfoDlg.set = function(key, val) {
+    this.tAppUserInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
+    return this;
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TAppUserInfoDlg.get = function(key) {
+    return $("#" + key).val();
+}
+
+/**
+ * 关闭此对话框
+ */
+TAppUserInfoDlg.close = function() {
+    parent.layer.close(window.parent.TAppUser.layerIndex);
+}
+
+/**
+ * 关闭此对话框
+ */
+TAppUserInfoDlg.closeException = function() {
+    parent.layer.close(window.parent.TAppUserException.layerIndex);
+}
+
+/**
+ * 取消冻结
+ */
+/**
+ * 收集数据
+ */
+TAppUserInfoDlg.collectData = function() {
+    this
+    .set('id')
+    .set('nickname')
+    .set('phone')
+    .set('sex')
+    .set('avatar')
+    .set('openid')
+    .set('unionid')
+    .set('emergencyContact')
+    .set('emergencyPhone')
+    .set('accountBalance')
+    .set('userTagId')
+    .set('status')
+    .set('createTime')
+        .set('remark');
+}
+
+/**
+ * 提交添加
+ */
+TAppUserInfoDlg.addSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tAppUser/add", function(data){
+        Feng.success("添加成功!");
+        window.parent.TAppUser.table.refresh();
+        TAppUserInfoDlg.close();
+    },function(data){
+        Feng.error("添加失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tAppUserInfoData);
+    ajax.start();
+}
+
+/**
+ * 提交修改
+ */
+TAppUserInfoDlg.editSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tAppUser/update", function(data){
+        Feng.success("修改成功!");
+        window.parent.TAppUser.table.refresh();
+        TAppUserInfoDlg.close();
+    },function(data){
+        Feng.error("修改失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tAppUserInfoData);
+    ajax.start();
+}
+
+$(function() {
+
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tAppUser/tCoupon.js b/management/guns-admin/src/main/webapp/static/modular/system/tAppUser/tCoupon.js
new file mode 100644
index 0000000..2b6198e
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tAppUser/tCoupon.js
@@ -0,0 +1,145 @@
+/**
+ * 管理初始化
+ */
+var TCoupon = {
+    id: "TCouponTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+TCoupon.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+            {title: '主键', field: 'id', visible: true, align: 'center', valign: 'middle'},
+            {title: '创建时间', field: 'createtime', visible: true, align: 'center', valign: 'middle'},
+            {title: '优惠券名称', field: 'couponName', visible: true, align: 'center', valign: 'middle'},
+            {title: '优惠券类型', field: 'couponType', visible: true, align: 'center', valign: 'middle'},
+            {title: '优惠券码', field: 'couponCode', visible: true, align: 'center', valign: 'middle'},
+            {title: '优惠券状态', field: 'couponStatus', visible: true, align: 'center', valign: 'middle'},
+            {title: '服务类型', field: 'couponServiceType', visible: true, align: 'center', valign: 'middle'},
+            {title: '条件金额', field: 'couponConditionalAmount', visible: true, align: 'center', valign: 'middle'},
+            {title: '优惠金额', field: 'couponPreferentialAmount', visible: true, align: 'center', valign: 'middle'},
+            {title: '有效期', field: 'couponValidity', visible: true, align: 'center', valign: 'middle'},
+            {title: '赠送数量', field: 'couponSendQuantity', visible: true, align: 'center', valign: 'middle'}
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+TCoupon.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        TCoupon.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 点击添加
+ */
+TCoupon.openAddTCoupon = function () {
+    var index = layer.open({
+        type: 2,
+        title: '添加',
+        area: ['800px', '420px'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tCoupon/tCoupon_add'
+    });
+    this.layerIndex = index;
+};
+
+/**
+ * 打开查看详情
+ */
+TCoupon.openTCouponDetail = function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '详情',
+            area: ['800px', '420px'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tCoupon/tCoupon_update/' + TCoupon.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 删除
+ */
+TCoupon.delete = function () {
+    if (this.check()) {
+        var ajax = new $ax(Feng.ctxPath + "/tCoupon/delete", function (data) {
+            Feng.success("删除成功!");
+            TCoupon.table.refresh();
+        }, function (data) {
+            Feng.error("删除失败!" + data.responseJSON.message + "!");
+        });
+        ajax.set("tCouponId",this.seItem.id);
+        ajax.start();
+    }
+};
+
+/**
+ * 发送优惠券
+ */
+TCoupon.sendCouponToUser = function () {
+    if(this.check()){
+        var ajax = new $ax(Feng.ctxPath + "/tCoupon/sendCouponToUser", function (data) {
+            Feng.success("发放成功!");
+            TAppUserInfoDlg.close();
+            parent.TAppUser.table.refresh();
+        }, function (data) {
+            Feng.error("发放失败!" + data.responseJSON.message + "!");
+        });
+        ajax.setData({
+            userIds:$("#userIds").val(),
+            couponName:this.seItem.couponName
+        })
+        ajax.start();
+    }
+};
+
+/**
+ * 跳转优惠卷页面
+ * ids : 用户id
+ */
+TCoupon.searchCoupon = function () {
+    if(this.check()){
+        var index = layer.open({
+            type: 2,
+            title: '赠送优惠券',
+            area: ['80%', '80%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tAppUser/sendCoupon'
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 查询列表
+ */
+TCoupon.search = function () {
+    var queryData = {};
+    queryData['condition'] = $("#condition").val();
+    TCoupon.table.refresh({query: queryData});
+};
+
+$(function () {
+    var defaultColunms = TCoupon.initColumn();
+    var table = new BSTable(TCoupon.id, "/tCoupon/list", defaultColunms);
+    table.setPaginationType("client");
+    TCoupon.table = table.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tAppUser/tOrder.js b/management/guns-admin/src/main/webapp/static/modular/system/tAppUser/tOrder.js
new file mode 100644
index 0000000..b3a9016
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tAppUser/tOrder.js
@@ -0,0 +1,122 @@
+/**
+ * 管理初始化
+ */
+var TOrder = {
+    id: "TOrderTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+TOrder.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+            {title: '主键', field: 'id', visible: true, align: 'center', valign: 'middle'},
+            {title: '编号', field: 'code', visible: true, align: 'center', valign: 'middle'},
+            {title: '用户id', field: 'userId', visible: true, align: 'center', valign: 'middle'},
+            {title: '司机id', field: 'driverId', visible: true, align: 'center', valign: 'middle'},
+            {title: '订单来源(1=小程序)', field: 'source', visible: true, align: 'center', valign: 'middle'},
+            {title: '代理商id', field: 'agentId', visible: true, align: 'center', valign: 'middle'},
+            {title: '分公司id', field: 'branchOfficeId', visible: true, align: 'center', valign: 'middle'},
+            {title: '开始服务时间', field: 'startTime', visible: true, align: 'center', valign: 'middle'},
+            {title: '起点地址', field: 'startAddress', visible: true, align: 'center', valign: 'middle'},
+            {title: '起点纬度', field: 'startLat', visible: true, align: 'center', valign: 'middle'},
+            {title: '起点经度', field: 'startLng', visible: true, align: 'center', valign: 'middle'},
+            {title: '终点地址', field: 'endAddress', visible: true, align: 'center', valign: 'middle'},
+            {title: '终点纬度', field: 'endLat', visible: true, align: 'center', valign: 'middle'},
+            {title: '终点经度', field: 'endLng', visible: true, align: 'center', valign: 'middle'},
+            {title: '上车时间', field: 'boardingTime', visible: true, align: 'center', valign: 'middle'},
+            {title: '下车时间', field: 'getoffTime', visible: true, align: 'center', valign: 'middle'},
+            {title: '预估价', field: 'estimatedPrice', visible: true, align: 'center', valign: 'middle'},
+            {title: '订单金额', field: 'orderMoney', visible: true, align: 'center', valign: 'middle'},
+            {title: '支付金额', field: 'payMoney', visible: true, align: 'center', valign: 'middle'},
+            {title: '优惠金额', field: 'discountedPrice', visible: true, align: 'center', valign: 'middle'},
+            {title: '优惠券id', field: 'couponId', visible: true, align: 'center', valign: 'middle'},
+            {title: '支付类型(1=线上)', field: 'payType', visible: true, align: 'center', valign: 'middle'},
+            {title: '支付时间', field: 'payTime', visible: true, align: 'center', valign: 'middle'},
+            {title: '订单状态(1=待接单,2=已接单,3=)', field: 'state', visible: true, align: 'center', valign: 'middle'},
+            {title: '状态(1=正常,2=冻结,3=删除)', field: 'status', visible: true, align: 'center', valign: 'middle'},
+            {title: '添加时间', field: 'createTime', visible: true, align: 'center', valign: 'middle'}
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+TOrder.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        TOrder.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 点击添加
+ */
+TOrder.openAddTOrder = function () {
+    var index = layer.open({
+        type: 2,
+        title: '添加',
+        area: ['800px', '420px'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tOrder/tOrder_add'
+    });
+    this.layerIndex = index;
+};
+
+/**
+ * 打开查看详情
+ */
+TOrder.openTOrderDetail = function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '详情',
+            area: ['800px', '420px'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tOrder/tOrder_update/' + TOrder.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 删除
+ */
+TOrder.delete = function () {
+    if (this.check()) {
+        var ajax = new $ax(Feng.ctxPath + "/tOrder/delete", function (data) {
+            Feng.success("删除成功!");
+            TOrder.table.refresh();
+        }, function (data) {
+            Feng.error("删除失败!" + data.responseJSON.message + "!");
+        });
+        ajax.set("tOrderId",this.seItem.id);
+        ajax.start();
+    }
+};
+
+/**
+ * 查询列表
+ */
+TOrder.search = function () {
+    var queryData = {};
+    queryData['userId'] = $("#userId").val();
+    TOrder.table.refresh({query: queryData});
+};
+
+$(function () {
+    var defaultColunms = TOrder.initColumn();
+    var table = new BSTable(TOrder.id, "/tOrder/list", defaultColunms);
+    table.setPaginationType("client");
+    TOrder.table = table.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tCoupon/tCoupon.js b/management/guns-admin/src/main/webapp/static/modular/system/tCoupon/tCoupon.js
new file mode 100644
index 0000000..bf6cfce
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tCoupon/tCoupon.js
@@ -0,0 +1,107 @@
+/**
+ * 管理初始化
+ */
+var TCoupon = {
+    id: "TCouponTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+TCoupon.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+            {title: '主键', field: 'id', visible: true, align: 'center', valign: 'middle'},
+            {title: '创建时间', field: 'createtime', visible: true, align: 'center', valign: 'middle'},
+            {title: '优惠券名称', field: 'couponName', visible: true, align: 'center', valign: 'middle'},
+            {title: '优惠券类型', field: 'couponType', visible: true, align: 'center', valign: 'middle'},
+            {title: '优惠券码', field: 'couponCode', visible: true, align: 'center', valign: 'middle'},
+            {title: '优惠券状态', field: 'couponStatus', visible: true, align: 'center', valign: 'middle'},
+            {title: '服务类型', field: 'couponServiceType', visible: true, align: 'center', valign: 'middle'},
+            {title: '条件金额', field: 'couponConditionalAmount', visible: true, align: 'center', valign: 'middle'},
+            {title: '优惠金额', field: 'couponPreferentialAmount', visible: true, align: 'center', valign: 'middle'},
+            {title: '有效期', field: 'couponValidity', visible: true, align: 'center', valign: 'middle'},
+            {title: '赠送数量', field: 'couponSendQuantity', visible: true, align: 'center', valign: 'middle'}
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+TCoupon.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        TCoupon.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 点击添加
+ */
+TCoupon.openAddTCoupon = function () {
+    var index = layer.open({
+        type: 2,
+        title: '添加',
+        area: ['800px', '420px'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tCoupon/tCoupon_add'
+    });
+    this.layerIndex = index;
+};
+
+/**
+ * 打开查看详情
+ */
+TCoupon.openTCouponDetail = function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '详情',
+            area: ['800px', '420px'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tCoupon/tCoupon_update/' + TCoupon.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 删除
+ */
+TCoupon.delete = function () {
+    if (this.check()) {
+        var ajax = new $ax(Feng.ctxPath + "/tCoupon/delete", function (data) {
+            Feng.success("删除成功!");
+            TCoupon.table.refresh();
+        }, function (data) {
+            Feng.error("删除失败!" + data.responseJSON.message + "!");
+        });
+        ajax.set("tCouponId",this.seItem.id);
+        ajax.start();
+    }
+};
+
+/**
+ * 查询列表
+ */
+TCoupon.search = function () {
+    var queryData = {};
+    queryData['condition'] = $("#condition").val();
+    TCoupon.table.refresh({query: queryData});
+};
+
+$(function () {
+    var defaultColunms = TCoupon.initColumn();
+    var table = new BSTable(TCoupon.id, "/tCoupon/list", defaultColunms);
+    table.setPaginationType("client");
+    TCoupon.table = table.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tCoupon/tCoupon_info.js b/management/guns-admin/src/main/webapp/static/modular/system/tCoupon/tCoupon_info.js
new file mode 100644
index 0000000..40ac2a9
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tCoupon/tCoupon_info.js
@@ -0,0 +1,95 @@
+/**
+ * 初始化详情对话框
+ */
+var TCouponInfoDlg = {
+    tCouponInfoData : {}
+};
+
+/**
+ * 清除数据
+ */
+TCouponInfoDlg.clearData = function() {
+    this.tCouponInfoData = {};
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TCouponInfoDlg.set = function(key, val) {
+    this.tCouponInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
+    return this;
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TCouponInfoDlg.get = function(key) {
+    return $("#" + key).val();
+}
+
+/**
+ * 关闭此对话框
+ */
+TCouponInfoDlg.close = function() {
+    parent.layer.close(window.parent.TCoupon.layerIndex);
+}
+
+/**
+ * 收集数据
+ */
+TCouponInfoDlg.collectData = function() {
+    this
+    .set('id')
+    .set('createtime')
+    .set('couponName');
+}
+
+/**
+ * 提交添加
+ */
+TCouponInfoDlg.addSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tCoupon/add", function(data){
+        Feng.success("添加成功!");
+        window.parent.TCoupon.table.refresh();
+        TCouponInfoDlg.close();
+    },function(data){
+        Feng.error("添加失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tCouponInfoData);
+    ajax.start();
+}
+
+/**
+ * 提交修改
+ */
+TCouponInfoDlg.editSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tCoupon/update", function(data){
+        Feng.success("修改成功!");
+        window.parent.TCoupon.table.refresh();
+        TCouponInfoDlg.close();
+    },function(data){
+        Feng.error("修改失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tCouponInfoData);
+    ajax.start();
+}
+
+$(function() {
+
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tOrder/tOrder.js b/management/guns-admin/src/main/webapp/static/modular/system/tOrder/tOrder.js
new file mode 100644
index 0000000..3dc9fae
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tOrder/tOrder.js
@@ -0,0 +1,122 @@
+/**
+ * 管理初始化
+ */
+var TOrder = {
+    id: "TOrderTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+TOrder.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+            {title: '主键', field: 'id', visible: true, align: 'center', valign: 'middle'},
+            {title: '编号', field: 'code', visible: true, align: 'center', valign: 'middle'},
+            {title: '用户id', field: 'userId', visible: true, align: 'center', valign: 'middle'},
+            {title: '司机id', field: 'driverId', visible: true, align: 'center', valign: 'middle'},
+            {title: '订单来源(1=小程序)', field: 'source', visible: true, align: 'center', valign: 'middle'},
+            {title: '代理商id', field: 'agentId', visible: true, align: 'center', valign: 'middle'},
+            {title: '分公司id', field: 'branchOfficeId', visible: true, align: 'center', valign: 'middle'},
+            {title: '开始服务时间', field: 'startTime', visible: true, align: 'center', valign: 'middle'},
+            {title: '起点地址', field: 'startAddress', visible: true, align: 'center', valign: 'middle'},
+            {title: '起点纬度', field: 'startLat', visible: true, align: 'center', valign: 'middle'},
+            {title: '起点经度', field: 'startLng', visible: true, align: 'center', valign: 'middle'},
+            {title: '终点地址', field: 'endAddress', visible: true, align: 'center', valign: 'middle'},
+            {title: '终点纬度', field: 'endLat', visible: true, align: 'center', valign: 'middle'},
+            {title: '终点经度', field: 'endLng', visible: true, align: 'center', valign: 'middle'},
+            {title: '上车时间', field: 'boardingTime', visible: true, align: 'center', valign: 'middle'},
+            {title: '下车时间', field: 'getoffTime', visible: true, align: 'center', valign: 'middle'},
+            {title: '预估价', field: 'estimatedPrice', visible: true, align: 'center', valign: 'middle'},
+            {title: '订单金额', field: 'orderMoney', visible: true, align: 'center', valign: 'middle'},
+            {title: '支付金额', field: 'payMoney', visible: true, align: 'center', valign: 'middle'},
+            {title: '优惠金额', field: 'discountedPrice', visible: true, align: 'center', valign: 'middle'},
+            {title: '优惠券id', field: 'couponId', visible: true, align: 'center', valign: 'middle'},
+            {title: '支付类型(1=线上)', field: 'payType', visible: true, align: 'center', valign: 'middle'},
+            {title: '支付时间', field: 'payTime', visible: true, align: 'center', valign: 'middle'},
+            {title: '订单状态(1=待接单,2=已接单,3=)', field: 'state', visible: true, align: 'center', valign: 'middle'},
+            {title: '状态(1=正常,2=冻结,3=删除)', field: 'status', visible: true, align: 'center', valign: 'middle'},
+            {title: '添加时间', field: 'createTime', visible: true, align: 'center', valign: 'middle'}
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+TOrder.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        TOrder.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 点击添加
+ */
+TOrder.openAddTOrder = function () {
+    var index = layer.open({
+        type: 2,
+        title: '添加',
+        area: ['800px', '420px'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tOrder/tOrder_add'
+    });
+    this.layerIndex = index;
+};
+
+/**
+ * 打开查看详情
+ */
+TOrder.openTOrderDetail = function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '详情',
+            area: ['800px', '420px'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tOrder/tOrder_update/' + TOrder.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 删除
+ */
+TOrder.delete = function () {
+    if (this.check()) {
+        var ajax = new $ax(Feng.ctxPath + "/tOrder/delete", function (data) {
+            Feng.success("删除成功!");
+            TOrder.table.refresh();
+        }, function (data) {
+            Feng.error("删除失败!" + data.responseJSON.message + "!");
+        });
+        ajax.set("tOrderId",this.seItem.id);
+        ajax.start();
+    }
+};
+
+/**
+ * 查询列表
+ */
+TOrder.search = function () {
+    var queryData = {};
+    queryData['condition'] = $("#condition").val();
+    TOrder.table.refresh({query: queryData});
+};
+
+$(function () {
+    var defaultColunms = TOrder.initColumn();
+    var table = new BSTable(TOrder.id, "/tOrder/list", defaultColunms);
+    table.setPaginationType("client");
+    TOrder.table = table.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tOrder/tOrder_info.js b/management/guns-admin/src/main/webapp/static/modular/system/tOrder/tOrder_info.js
new file mode 100644
index 0000000..fe13585
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tOrder/tOrder_info.js
@@ -0,0 +1,118 @@
+/**
+ * 初始化详情对话框
+ */
+var TOrderInfoDlg = {
+    tOrderInfoData : {}
+};
+
+/**
+ * 清除数据
+ */
+TOrderInfoDlg.clearData = function() {
+    this.tOrderInfoData = {};
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TOrderInfoDlg.set = function(key, val) {
+    this.tOrderInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
+    return this;
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TOrderInfoDlg.get = function(key) {
+    return $("#" + key).val();
+}
+
+/**
+ * 关闭此对话框
+ */
+TOrderInfoDlg.close = function() {
+    parent.layer.close(window.parent.TOrder.layerIndex);
+}
+
+/**
+ * 收集数据
+ */
+TOrderInfoDlg.collectData = function() {
+    this
+    .set('id')
+    .set('code')
+    .set('userId')
+    .set('driverId')
+    .set('source')
+    .set('agentId')
+    .set('branchOfficeId')
+    .set('startTime')
+    .set('startAddress')
+    .set('startLat')
+    .set('startLng')
+    .set('endAddress')
+    .set('endLat')
+    .set('endLng')
+    .set('boardingTime')
+    .set('getoffTime')
+    .set('estimatedPrice')
+    .set('orderMoney')
+    .set('payMoney')
+    .set('discountedPrice')
+    .set('couponId')
+    .set('payType')
+    .set('payTime')
+    .set('state')
+    .set('status')
+    .set('createTime');
+}
+
+/**
+ * 提交添加
+ */
+TOrderInfoDlg.addSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tOrder/add", function(data){
+        Feng.success("添加成功!");
+        window.parent.TOrder.table.refresh();
+        TOrderInfoDlg.close();
+    },function(data){
+        Feng.error("添加失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tOrderInfoData);
+    ajax.start();
+}
+
+/**
+ * 提交修改
+ */
+TOrderInfoDlg.editSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tOrder/update", function(data){
+        Feng.success("修改成功!");
+        window.parent.TOrder.table.refresh();
+        TOrderInfoDlg.close();
+    },function(data){
+        Feng.error("修改失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tOrderInfoData);
+    ajax.start();
+}
+
+$(function() {
+
+});

--
Gitblit v1.7.1