用户中心
diff --git a/src/main/java/com/supwisdom/dlpay/api/dao/AccountDao.java b/src/main/java/com/supwisdom/dlpay/api/dao/AccountDao.java
index 733a6c2..0f7265e 100644
--- a/src/main/java/com/supwisdom/dlpay/api/dao/AccountDao.java
+++ b/src/main/java/com/supwisdom/dlpay/api/dao/AccountDao.java
@@ -5,6 +5,11 @@
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.repository.*;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Lock;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.jpa.repository.QueryHints;
+import org.springframework.data.repository.query.Param;
 
 import javax.persistence.LockModeType;
 import javax.persistence.QueryHint;
@@ -34,5 +39,6 @@
   @Query("select a from TAccount a where a.userid = ?1 and a.subjno=?2")
   TAccount findByUseridAndSubjno(String userid, String subjno);
 
-  Page<TAccount> findAllByAccnameContaining(String accname, Pageable pageable);
+  @Query("select a from TAccount a where a.person.name like CONCAT('%',:accname,'%') ")
+  Page<TAccount> findAllByAccnameContaining(@Param("accname") String accname, Pageable pageable);
 }
diff --git a/src/main/java/com/supwisdom/dlpay/api/dao/PointsAccountDao.java b/src/main/java/com/supwisdom/dlpay/api/dao/PointsAccountDao.java
index aba2853..96940b9 100644
--- a/src/main/java/com/supwisdom/dlpay/api/dao/PointsAccountDao.java
+++ b/src/main/java/com/supwisdom/dlpay/api/dao/PointsAccountDao.java
@@ -1,10 +1,18 @@
 package com.supwisdom.dlpay.api.dao;
 
 import com.supwisdom.dlpay.api.domain.TPointsAccount;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
 import org.springframework.stereotype.Repository;
 
 @Repository
 public interface PointsAccountDao extends JpaRepository<TPointsAccount, String> {
   TPointsAccount findByUserid(String userid);
+
+  @Query("select a from TPointsAccount a where a.person.name like CONCAT('%',:name,'%') ")
+  Page<TPointsAccount> findAllByNameContaining(@Param("name") String name, Pageable pageable);
+
 }
diff --git a/src/main/java/com/supwisdom/dlpay/api/domain/TPointsAccount.java b/src/main/java/com/supwisdom/dlpay/api/domain/TPointsAccount.java
index 1fda8a1..d19e905 100644
--- a/src/main/java/com/supwisdom/dlpay/api/domain/TPointsAccount.java
+++ b/src/main/java/com/supwisdom/dlpay/api/domain/TPointsAccount.java
@@ -1,10 +1,8 @@
 package com.supwisdom.dlpay.api.domain;
 
 import com.supwisdom.dlpay.framework.util.MD5;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
+
+import javax.persistence.*;
 
 /**
  * 积分账户表
@@ -31,6 +29,18 @@
   @Column(name = "LASTSAVED", precision = 15)
   private String lastsaved;
 
+  @OneToOne
+  @JoinColumn(name = "USERID",insertable = false,updatable = false)
+  private TPerson person;
+
+  public TPerson getPerson() {
+    return person;
+  }
+
+  public void setPerson(TPerson person) {
+    this.person = person;
+  }
+
   public TPointsAccount() {
   }
 
diff --git a/src/main/java/com/supwisdom/dlpay/system/bean/IdTypeBean.java b/src/main/java/com/supwisdom/dlpay/system/bean/IdTypeBean.java
new file mode 100644
index 0000000..d7ac784
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/system/bean/IdTypeBean.java
@@ -0,0 +1,27 @@
+package com.supwisdom.dlpay.system.bean;
+
+public class IdTypeBean {
+    private String idtype;
+    private String typename;
+
+    public IdTypeBean(String idtype,String typename){
+        this.idtype = idtype;
+        this.typename = typename;
+    }
+
+    public String getIdtype() {
+        return idtype;
+    }
+
+    public void setIdtype(String idtype) {
+        this.idtype = idtype;
+    }
+
+    public String getTypename() {
+        return typename;
+    }
+
+    public void setTypename(String typename) {
+        this.typename = typename;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/system/controller/RoleController.java b/src/main/java/com/supwisdom/dlpay/system/controller/RoleController.java
index e8e4eb7..584953c 100644
--- a/src/main/java/com/supwisdom/dlpay/system/controller/RoleController.java
+++ b/src/main/java/com/supwisdom/dlpay/system/controller/RoleController.java
@@ -44,7 +44,6 @@
     }
 
     @GetMapping("/role/loadadd")
-    @PreAuthorize("hasPermission('/role/loadadd','')")
     public String loadadd() {
         return "system/role/form";
     }
diff --git a/src/main/java/com/supwisdom/dlpay/system/controller/UserController.java b/src/main/java/com/supwisdom/dlpay/system/controller/UserController.java
index 718fa53..a39aa52 100644
--- a/src/main/java/com/supwisdom/dlpay/system/controller/UserController.java
+++ b/src/main/java/com/supwisdom/dlpay/system/controller/UserController.java
@@ -1,17 +1,25 @@
 package com.supwisdom.dlpay.system.controller;
 
+import com.supwisdom.dlpay.api.bean.JsonResult;
 import com.supwisdom.dlpay.api.domain.TAccount;
 import com.supwisdom.dlpay.api.domain.TPerson;
+import com.supwisdom.dlpay.api.domain.TPersonIdentity;
+import com.supwisdom.dlpay.api.domain.TPointsAccount;
+import com.supwisdom.dlpay.framework.domain.TOperator;
 import com.supwisdom.dlpay.framework.util.PageResult;
+import com.supwisdom.dlpay.framework.util.StringUtil;
 import com.supwisdom.dlpay.framework.util.WebConstant;
+import com.supwisdom.dlpay.system.bean.IdTypeBean;
 import com.supwisdom.dlpay.system.bean.PersonParamBean;
 import com.supwisdom.dlpay.system.service.UserDataService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.List;
 
 @Controller
 public class UserController {
@@ -19,9 +27,10 @@
     private UserDataService userDataService;
 
     @GetMapping("/user/index")
-    public String sysparaView() {
+    public String index() {
         return "system/user/index";
     }
+
     @GetMapping("/user/list")
     @PreAuthorize("hasPermission('/user/list','')")
     @ResponseBody
@@ -41,6 +50,44 @@
             return new PageResult<>(99, "系统查询错误");
         }
     }
+
+    @GetMapping("/user/loadadd")
+    public String add(ModelMap map) {
+        List<IdTypeBean> list = new ArrayList<>();
+        list.add(new IdTypeBean("1", "身份证"));
+        list.add(new IdTypeBean("2", "护照"));
+        list.add(new IdTypeBean("3", "驾照"));
+        list.add(new IdTypeBean("4", "港澳通行证"));
+        list.add(new IdTypeBean("5", "学工号"));
+        list.add(new IdTypeBean("9", "其他"));
+        map.put("idtypes", list);
+        return "system/user/add";
+    }
+
+    @PostMapping("/user/add")
+    @PreAuthorize("hasPermission('/user/add','')")
+    @ResponseBody
+    public JsonResult add(@RequestBody TPerson person) {
+        if (StringUtil.isEmpty(person.getName())
+                || StringUtil.isEmpty(person.getSex())
+                || StringUtil.isEmpty(person.getIdno())
+                || StringUtil.isEmpty(person.getIdtype())
+                || StringUtil.isEmpty(person.getMobile())) {
+            return JsonResult.error("参数错误");
+        }
+        return userDataService.saveUser(person);
+    }
+
+    @PostMapping("/user/del")
+    @PreAuthorize("hasPermission('/user/del','')")
+    @ResponseBody
+    public JsonResult del(@RequestParam String userid) {
+        if (StringUtil.isEmpty(userid)) {
+            return JsonResult.error("参数错误");
+        }
+        return userDataService.deleteUser(userid);
+    }
+
     @GetMapping("/user/acc")
     public String acc() {
         return "system/user/account";
@@ -65,4 +112,53 @@
             return new PageResult<>(99, "系统查询错误");
         }
     }
+
+    @GetMapping("/user/point")
+    public String point() {
+        return "system/user/point";
+    }
+
+    @GetMapping("/user/pointlist")
+    @PreAuthorize("hasPermission('/user/pointlist','')")
+    @ResponseBody
+    public PageResult<TPointsAccount> getDataPointList(@RequestParam("page") Integer pageNo,
+                                                       @RequestParam("limit") Integer pageSize,
+                                                       @RequestParam(value = "searchkey", required = false) String searchKey) {
+        try {
+            if (null == pageNo || pageNo < 1) pageNo = WebConstant.PAGENO_DEFAULT;
+            if (null == pageSize || pageSize < 1) pageSize = WebConstant.PAGESIZE_DEFAULT;
+            PersonParamBean searchBean = new PersonParamBean();
+            searchBean.setPageNo(pageNo);
+            searchBean.setName(searchKey);
+            searchBean.setPageSize(pageSize);
+            return userDataService.getPointsByKey(searchBean);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return new PageResult<>(99, "系统查询错误");
+        }
+    }
+
+    @PostMapping("/user/delacc")
+    @PreAuthorize("hasPermission('/user/delacc','')")
+    @ResponseBody
+    public JsonResult delacc(@RequestParam String accno) {
+        if (StringUtil.isEmpty(accno)) {
+            return JsonResult.error("参数错误");
+        }
+        return userDataService.closeAccount(accno);
+    }
+    @PostMapping("/user/delpoint")
+    @PreAuthorize("hasPermission('/user/delpoint','')")
+    @ResponseBody
+    public JsonResult delpoint(@RequestParam String userid) {
+        if (StringUtil.isEmpty(userid)) {
+            return JsonResult.error("参数错误");
+        }
+        return userDataService.deletePoint(userid);
+    }
+    @GetMapping("/user/pointdtl")
+    public String pointdtl(@RequestParam String userid,ModelMap map) {
+        map.put("userid",userid);
+        return "system/user/pointdtl";
+    }
 }
diff --git a/src/main/java/com/supwisdom/dlpay/system/service/UserDataService.java b/src/main/java/com/supwisdom/dlpay/system/service/UserDataService.java
index 34748c7..942196e 100644
--- a/src/main/java/com/supwisdom/dlpay/system/service/UserDataService.java
+++ b/src/main/java/com/supwisdom/dlpay/system/service/UserDataService.java
@@ -1,12 +1,17 @@
 package com.supwisdom.dlpay.system.service;
 
+import com.supwisdom.dlpay.api.bean.JsonResult;
 import com.supwisdom.dlpay.api.domain.TAccount;
 import com.supwisdom.dlpay.api.domain.TPerson;
+import com.supwisdom.dlpay.api.domain.TPersonIdentity;
+import com.supwisdom.dlpay.api.domain.TPointsAccount;
 import com.supwisdom.dlpay.framework.util.PageResult;
 import com.supwisdom.dlpay.system.bean.PersonParamBean;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.List;
+
 public interface UserDataService {
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
     PageResult<TPerson> getPersonsByKey(PersonParamBean param);
@@ -14,4 +19,24 @@
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
     PageResult<TAccount> getAccountsByKey(PersonParamBean param);
 
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
+    PageResult<TPointsAccount> getPointsByKey(PersonParamBean param);
+
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+    JsonResult saveUser(TPerson person);
+
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+    JsonResult deleteUser(String userid);
+
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+    JsonResult closeAccount(String accno);
+
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+    JsonResult deletePoint(String userid);
+
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
+    List<TPersonIdentity> getPersonIdentity(String userid);
+
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
+    PageResult<TPointsAccount> getUserPointDTL(PersonParamBean param);
 }
diff --git a/src/main/java/com/supwisdom/dlpay/system/service/impl/UserDataServiceImpl.java b/src/main/java/com/supwisdom/dlpay/system/service/impl/UserDataServiceImpl.java
index 315927f..54694f5 100644
--- a/src/main/java/com/supwisdom/dlpay/system/service/impl/UserDataServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/system/service/impl/UserDataServiceImpl.java
@@ -1,11 +1,17 @@
 package com.supwisdom.dlpay.system.service.impl;
 
+import com.supwisdom.dlpay.api.bean.JsonResult;
 import com.supwisdom.dlpay.api.dao.AccountDao;
 import com.supwisdom.dlpay.api.dao.PersonDao;
+import com.supwisdom.dlpay.api.dao.PersonIdentityDao;
+import com.supwisdom.dlpay.api.dao.PointsAccountDao;
 import com.supwisdom.dlpay.api.domain.TAccount;
 import com.supwisdom.dlpay.api.domain.TPerson;
-import com.supwisdom.dlpay.framework.util.PageResult;
-import com.supwisdom.dlpay.framework.util.StringUtil;
+import com.supwisdom.dlpay.api.domain.TPersonIdentity;
+import com.supwisdom.dlpay.api.domain.TPointsAccount;
+import com.supwisdom.dlpay.framework.data.SystemDateTime;
+import com.supwisdom.dlpay.framework.service.SystemUtilService;
+import com.supwisdom.dlpay.framework.util.*;
 import com.supwisdom.dlpay.system.bean.PersonParamBean;
 import com.supwisdom.dlpay.system.service.UserDataService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -14,17 +20,26 @@
 import org.springframework.data.domain.Sort;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+import java.util.Optional;
+
 @Service
 public class UserDataServiceImpl implements UserDataService {
     @Autowired
     private PersonDao personDao;
     @Autowired
     private AccountDao accountDao;
+    @Autowired
+    private PointsAccountDao pointsAccountDao;
+    @Autowired
+    private SystemUtilService systemUtilService;
+    @Autowired
+    private PersonIdentityDao personIdentityDao;
 
     @Override
     public PageResult<TPerson> getPersonsByKey(PersonParamBean param) {
         Pageable pageable = PageRequest.of(param.getPageNo() - 1, param.getPageSize()
-                , Sort.by(Sort.Direction.DESC,"lastsaved"));
+                , Sort.by(Sort.Direction.DESC, "lastsaved"));
         if (!StringUtil.isEmpty(param.getName())) {
             return new PageResult<>(personDao.findAllByNameContaining(param.getName(), pageable));
         }
@@ -39,4 +54,125 @@
         }
         return new PageResult<>(accountDao.findAll(pageable));
     }
+
+    @Override
+    public PageResult<TPointsAccount> getPointsByKey(PersonParamBean param) {
+        Pageable pageable = PageRequest.of(param.getPageNo() - 1, param.getPageSize());
+        if (!StringUtil.isEmpty(param.getName())) {
+            return new PageResult<>(pointsAccountDao.findAllByNameContaining(param.getName(), pageable));
+        }
+        return new PageResult<>(pointsAccountDao.findAll(pageable));
+    }
+
+    @Override
+    public JsonResult saveUser(TPerson person) {
+        if (!StringUtil.isEmpty(person.getUserid())) {
+            Optional<TPerson> temp = personDao.findById(person.getUserid());
+            if (!temp.isPresent()) {
+                return JsonResult.error("参数错误");
+            }
+            TPerson it = temp.get();
+            if (!person.getIdno().equals(it.getIdno())
+                    || !person.getIdtype().equals(it.getIdtype())) {
+                TPerson has = personDao.findByIdentity(person.getIdtype(), person.getIdno());
+                if (has != null && !has.getUserid().equals(person.getUserid())) {
+                    return JsonResult.error("证件类型、证件号已存在");
+                }
+            }
+            if (!person.getName().equals(it.getName())) {
+                TAccount account = accountDao.findByUserid(person.getUserid());
+                if (account != null) {
+                    account.setAccname(person.getName());
+                    accountDao.save(account);
+                }
+            }
+            if (StringUtil.isEmpty(person.getStatus())) {
+                person.setStatus(TradeDict.STATUS_NORMAL);
+            }
+            personDao.save(person);
+        } else {
+            TPerson has = personDao.findByIdentity(person.getIdtype(), person.getIdno());
+            if (has != null) {
+                return JsonResult.error("证件类型、证件号已存在");
+            }
+            SystemDateTime systemDateTime = systemUtilService.getSysdatetime();
+            person.setStatus(TradeDict.STATUS_NORMAL);
+            person.setLastsaved(systemDateTime.getHostdatetime());
+            person = personDao.save(person);
+
+            TAccount account = new TAccount();
+            account.setAccname(person.getName());
+            account.setSubjno(Subject.SUBJNO_PERSONAL_DEPOSIT);
+            account.setUserid(person.getUserid());
+            account.setStatus(person.getStatus());
+            account.setBalance(0.0);
+            account.setAvailbal(0.0);
+            account.setFrozebal(0.0);
+            account.setLowfreeFlag(false);
+            account.setMaxbal(systemUtilService.getSysparaValueAsDouble(SysparaUtil.SYSPARAID_NO1, SysparaUtil.SYSPARA_NO1_DEFAULT));
+            account.setLasttransdate(systemDateTime.getHostdate());
+            account.setLastdayDpsamt(0.0);
+            account.setLastdayTransamt(0.0);
+            account.setOpendate(systemDateTime.getHostdate());
+            account.setTac(account.generateTac());
+            accountDao.save(account);
+        }
+        return JsonResult.ok("添加成功");
+    }
+
+    @Override
+    public JsonResult deleteUser(String userid) {
+        TAccount account = accountDao.findByUserid(userid);
+        if (account != null) {
+            if (!TradeDict.STATUS_CLOSED.equals(account.getStatus()) && account.getBalance() != 0) {
+                return JsonResult.error("该用户账户未注销且余额不为0,无法删除");
+            } else {
+                accountDao.delete(account);
+            }
+        }
+        TPointsAccount pointsAccount = pointsAccountDao.findByUserid(userid);
+        if (pointsAccount != null) {
+            if (pointsAccount.getPoints() != 0) {
+                return JsonResult.error("该用户账户积分不为0,无法删除,若要删除请先删除积分账户");
+            } else {
+                pointsAccountDao.delete(pointsAccount);
+            }
+        }
+        personDao.deleteById(userid);
+        return JsonResult.ok("操作成功");
+    }
+
+    @Override
+    public JsonResult closeAccount(String accno) {
+        Optional<TAccount> opt = accountDao.findById(accno);
+        if (opt.isPresent()) {
+            TAccount acc = opt.get();
+            acc.setStatus(TradeDict.STATUS_CLOSED);
+            accountDao.save(acc);
+            return JsonResult.ok("操作成功");
+        } else {
+            return JsonResult.error("参数错误");
+        }
+    }
+
+    @Override
+    public JsonResult deletePoint(String userid) {
+        Optional<TPointsAccount> pointsAccount = pointsAccountDao.findById(userid);
+        if (pointsAccount.isPresent()) {
+            pointsAccountDao.delete(pointsAccount.get());
+            return JsonResult.ok("操作成功");
+        }else {
+            return JsonResult.error("参数错误");
+        }
+    }
+
+    @Override
+    public List<TPersonIdentity> getPersonIdentity(String userid) {
+        return null;
+    }
+
+    @Override
+    public PageResult<TPointsAccount> getUserPointDTL(PersonParamBean param) {
+        return null;
+    }
 }
diff --git a/src/main/resources/templates/system/function/index.html b/src/main/resources/templates/system/function/index.html
index 3696dc7..4071d7d 100755
--- a/src/main/resources/templates/system/function/index.html
+++ b/src/main/resources/templates/system/function/index.html
@@ -10,9 +10,9 @@
         <div class="layui-form toolbar">

             搜索:

             <input id="search-value" class="layui-input search-input" type="text" placeholder="输入功能名称"/>&emsp;

-            <button id="btn-search" class="layui-btn icon-btn" data-type="search"><i class="layui-icon">&#xe615;</i>搜索

+            <button id="btn-search-func" class="layui-btn icon-btn" data-type="search"><i class="layui-icon">&#xe615;</i>搜索

             </button>

-            <button id="btn-add" class="layui-btn icon-btn" data-type="add"><i class="layui-icon"></i>添加父功能</button>

+            <button id="btn-add-func" class="layui-btn icon-btn" data-type="add"><i class="layui-icon"></i>添加父功能</button>

         </div>

         <table class="layui-table" id="table" lay-filter="table"></table>

     </div>

@@ -71,11 +71,11 @@
             ]

         });

         // 搜索按钮点击事件

-        $('#btn-search').click(function () {

+        $('#btn-search-func').click(function () {

             let key = $('#search-value').val();

             table.reload('table', {where: {searchkey: key}, page: {curr: 1}});

         });

-        $('#btn-add').click(function () {

+        $('#btn-add-func').click(function () {

             showModel();

         });

         let showModel = function (data) {

diff --git a/src/main/resources/templates/system/param/paytype.html b/src/main/resources/templates/system/param/paytype.html
index 63a0cee..f7909f4 100644
--- a/src/main/resources/templates/system/param/paytype.html
+++ b/src/main/resources/templates/system/param/paytype.html
@@ -11,11 +11,11 @@
             搜索:
             <input id="search-paytype" class="layui-input search-input" type="text" maxlength="40" style="width: 300px;"
                    placeholder="输入支付方式查询"/>
-            <button id="btn-search" class="layui-btn icon-btn" data-type="search"><i class="layui-icon">&#xe615;</i>搜索
+            <button id="btn-search-param" class="layui-btn icon-btn" data-type="search"><i class="layui-icon">&#xe615;</i>搜索
             </button>
-            <button id="btn-add" class="layui-btn icon-btn" data-type="add"><i class="layui-icon">&#xe654;</i>新 增
+            <button id="btn-add-param" class="layui-btn icon-btn" data-type="add"><i class="layui-icon">&#xe654;</i>新 增
             </button>
-            <button id="btn-reset" class="layui-btn layui-btn-primary" data-type="reset"><i class="layui-icon"></i>清 空
+            <button id="btn-reset-param" class="layui-btn layui-btn-primary" data-type="reset"><i class="layui-icon"></i>清 空
             </button>
         </div>
         <table class="layui-table" id="paytypeTable" lay-filter="paytypeTable-filter"></table>
@@ -105,12 +105,12 @@
             ]
         });
         // 搜索按钮点击事件
-        $('#btn-search').click(function () {
+        $('#btn-search-param').click(function () {
             var paytype = $("#search-paytype").val();
             table.reload('paytypeTable', {where: {paytype: paytype}, page: {curr: 1}});
         });
 
-        $('#btn-add').click(function () {
+        $('#btn-add-param').click(function () {
             admin.popupCenter({
                 title: "新增支付能力",
                 path: '/param/load4addpaytype',
@@ -120,7 +120,7 @@
             });
         });
 
-        $('#btn-reset').click(function () {
+        $('#btn-reset-param').click(function () {
             $("#search-paytypeTable").val("");
         });
 
diff --git a/src/main/resources/templates/system/param/syspara.html b/src/main/resources/templates/system/param/syspara.html
index ae17c1d..79d94ec 100644
--- a/src/main/resources/templates/system/param/syspara.html
+++ b/src/main/resources/templates/system/param/syspara.html
@@ -11,9 +11,9 @@
             搜索:
             <input id="search-paraid" class="layui-input search-input" maxlength="9" type="text" placeholder="输入参数ID"/>&emsp;
             <input id="search-paraname" class="layui-input search-input" type="text" maxlength="30" placeholder="输入参数名称"/>&emsp;
-            <button id="btn-search" class="layui-btn icon-btn" data-type="search"><i class="layui-icon">&#xe615;</i>搜索
+            <button id="btn-search-sysparam" class="layui-btn icon-btn" data-type="search"><i class="layui-icon">&#xe615;</i>搜索
             </button>
-            <button id="btn-reset" class="layui-btn layui-btn-primary" data-type="reset"><i class="layui-icon"></i>清 空</button>
+            <button id="btn-reset-sysparam" class="layui-btn layui-btn-primary" data-type="reset"><i class="layui-icon"></i>清 空</button>
         </div>
         <table class="layui-table" id="sysparaTable" lay-filter="sysparaTable-filter"></table>
     </div>
@@ -50,7 +50,7 @@
             ]
         });
         // 搜索按钮点击事件
-        $('#btn-search').click(function () {
+        $('#btn-search-sysparam').click(function () {
             var paraid = $("#search-paraid").val();
             var paraname = $("#search-paraname").val();
             if (null != paraid && paraid.length > 0 && !(/^\d+$/.test(paraid))) {
@@ -60,7 +60,7 @@
             }
         });
 
-        $('#btn-reset').click(function () {
+        $('#btn-reset-sysparam').click(function () {
             $("#search-paraid").val("");
             $("#search-paraname").val("");
         });
diff --git a/src/main/resources/templates/system/role/index.html b/src/main/resources/templates/system/role/index.html
index e2208e0..029e3ef 100644
--- a/src/main/resources/templates/system/role/index.html
+++ b/src/main/resources/templates/system/role/index.html
@@ -10,9 +10,9 @@
         <div class="layui-form toolbar">
             搜索:
             <input id="search-value" class="layui-input search-input" type="text" placeholder="输入角色名称"/>&emsp;
-            <button id="btn-search" class="layui-btn icon-btn" data-type="search"><i class="layui-icon">&#xe615;</i>搜索
+            <button id="btn-search-role" class="layui-btn icon-btn" data-type="search"><i class="layui-icon">&#xe615;</i>搜索
             </button>
-            <button id="btn-add" class="layui-btn icon-btn" data-type="add"><i class="layui-icon"></i>添加角色</button>
+            <button id="btn-add-role" class="layui-btn icon-btn" data-type="add"><i class="layui-icon"></i>添加角色</button>
         </div>
         <table class="layui-table" id="roletable" lay-filter="roletable"></table>
     </div>
@@ -48,11 +48,11 @@
             ]
         });
         // 搜索按钮点击事件
-        $('#btn-search').click(function () {
+        $('#btn-search-role').click(function () {
             let key = $('#search-value').val();
             table.reload('roletable', {where: {searchkey: key}, page: {curr: 1}});
         });
-        $('#btn-add').click(function () {
+        $('#btn-add-role').click(function () {
             showModel();
         });
         let showModel = function (data) {
diff --git a/src/main/resources/templates/system/user/account.html b/src/main/resources/templates/system/user/account.html
index bd23479..2475cf9 100644
--- a/src/main/resources/templates/system/user/account.html
+++ b/src/main/resources/templates/system/user/account.html
@@ -9,8 +9,8 @@
     <div class="layui-card-body">
         <div class="layui-form toolbar">
             搜索:
-            <input id="search-value" class="layui-input search-input" type="text" placeholder="输入用户名称"/>&emsp;
-            <button id="btn-search" class="layui-btn icon-btn" data-type="search"><i class="layui-icon">&#xe615;</i>搜索
+            <input id="search-value-account" class="layui-input search-input" type="text" placeholder="输入用户名称"/>&emsp;
+            <button id="btn-search-account" class="layui-btn icon-btn" data-type="search"><i class="layui-icon">&#xe615;</i>搜索
             </button>
         </div>
         <table class="layui-table" id="accounttable" lay-filter="accounttable"></table>
@@ -31,15 +31,18 @@
                 [
                     {field: 'accno', title: '账号',fixed: 'left', width: 100},
                     {field: 'person', title: '名称', width: 80,fixed: 'left', sort: true, templet: function (item) {
+                            if(item.accname!=null){
+                                return item.accname;
+                            }
                             return item.person.name;
-                        }},
+                    }},
                     {field: 'status', title: '状态',fixed: 'left',width: 80 , templet: function (item) {
                             if (item.status == 'normal') {
-                                return '正常'
+                                return '<span class="layui-badge layui-bg-green">正常</span>'
                             } else if (item.status == 'closed') {
-                                return '注销'
+                                return '<span class="layui-badge">注销</span>'
                             } else if (item.status == 'locked') {
-                                return '锁定'
+                                return '<span class="layui-badge layui-bg-orange">锁定</span>'
                             }  else {
                                 return '异常'
                             }
@@ -51,42 +54,23 @@
                     {field: 'lasttransdate', title: '最后交易日期', width: 120,fixed: 'left', sort: true},
                     {field: 'opendate', title: '开户日期', width: 100,fixed: 'left', sort: true},
                     {
-                        field: 'userid', align: 'center', title: '操作', fixed: 'right', templet: function (item) {
-                            let html =  ' <a class="layui-btn  layui-btn-xs" lay-event="edit"><i class="layui-icon layui-icon-edit"></i>初始化支付密码</a> ';
-                             html +=  ' <a class="layui-btn  layui-btn-xs" lay-event="edit"><i class="layui-icon layui-icon-edit"></i>初始化登录密码</a> ';
-                            return html;
+                        field: 'accno', align: 'center', title: '操作', fixed: 'right', templet: function (item) {
+                            if (item.status != 'closed') {
+                                let html = ' <a class="layui-btn  layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>注销</a> ';
+                                return html;
+                            }else {
+                                return '';
+                            }
                         }
                     }
                 ]
             ]
         });
         // 搜索按钮点击事件
-        $('#btn-search').click(function () {
-            let key = $('#search-value').val();
-            table.reload('roletable', {where: {searchkey: key}, page: {curr: 1}});
+        $('#btn-search-account').click(function () {
+            let key = $('#search-value-account').val();
+            table.reload('accounttable', {where: {searchkey: key}, page: {curr: 1}});
         });
-        $('#btn-add').click(function () {
-            showModel();
-        });
-        let showModel = function (data) {
-            let title = data ? '编辑角色' : '添加角色';
-            admin.putTempData('t_func', data);
-            admin.popupCenter({
-                title: title,
-                path: '/role/loadadd',
-                finish: function () {
-                    table.reload('roletable', {});
-                }
-            });
-        };
-        let showFuncModel = function (data) {
-            let title = '分配功能';
-            admin.putTempData('roleId', data.roleId);
-            admin.popupCenter({
-                title: title,
-                path: '/role/loadfunc'
-            });
-        };
         // 工具条点击事件
         table.on('tool(accounttable)', function (obj) {
             let data = obj.data;
@@ -94,19 +78,17 @@
             console.log(data);
             if (layEvent === 'edit') {
                 showModel(data);
-            } else if (layEvent === 'addfunc') {
-                showFuncModel(data);
             } else if (layEvent === 'del') {
                 showDelete(data);
             }
         });
         let showDelete = function (data) {
-            layer.confirm('用户分配的该角色都将被删除,确定删除吗?', function (i) {
+            layer.confirm('确定注销账户吗,注销后该用户将无法使用余额?', function (i) {
                 layer.close(i);
                 layer.load(2);
                 let token = $("meta[name='_csrf_token']").attr("value");
-                admin.go('/role/del', {
-                    roleid: data.roleId,
+                admin.go('/user/delacc', {
+                    accno: data.accno,
                     _csrf: token
                 }, function (data) {
                     console.log(data.code);
@@ -121,11 +103,15 @@
                     } else {
                         layer.msg(data.msg, {icon: 2});
                     }
-                    table.reload('roletable', {});
+                    table.reload('accounttable', {});
                 }, function (ret) {
                     console.log(ret);
                     layer.closeAll('loading');
-                    layer.msg('请求失败了,请稍后再试', {icon: 2});
+                    if(ret.status==403){
+                        layer.msg('没有权限', {icon: 2});
+                    }else{
+                        layer.msg('请求失败了,请稍后再试', {icon: 2});
+                    }
                 });
             });
         }
diff --git a/src/main/resources/templates/system/user/add.html b/src/main/resources/templates/system/user/add.html
new file mode 100755
index 0000000..d2893e6
--- /dev/null
+++ b/src/main/resources/templates/system/user/add.html
@@ -0,0 +1,110 @@
+<!-- operator表单弹窗 -->

+<form id="user-form" lay-filter="user-form" class="layui-form model-form">

+    <input name="userid" id="userid" type="hidden"/>

+    <div class="layui-form-item">

+        <label class="layui-form-label">姓名*</label>

+        <div class="layui-input-block">

+            <input name="name" placeholder="请输入名称" type="text" class="layui-input" maxlength="100"

+                   lay-verify="required" required/>

+        </div>

+    </div>

+    <div class="layui-form-item">

+        <label class="layui-form-label">性别</label>

+        <div class="layui-input-block">

+            <input type="radio" name="sex" value="male" title="男" checked/>

+            <input type="radio" name="sex" value="female" title="女"/>

+        </div>

+    </div>

+    <div class="layui-form-item">

+        <label class="layui-form-label">证件类型*</label>

+        <div class="layui-input-block">

+            <select name="idtype" id="idtype" lay-verify="required">

+                <option th:each="bean : ${idtypes}" th:value="${bean.idtype}">[[${bean.typename}]]</option>

+            </select>

+        </div>

+    </div>

+    <div class="layui-form-item">

+        <label class="layui-form-label">证件号*</label>

+        <div class="layui-input-block">

+            <input name="idno" placeholder="请输入证件号" type="text" class="layui-input" maxlength="100"

+                   lay-verify="required" required/>

+        </div>

+    </div>

+

+    <div class="layui-form-item">

+        <label class="layui-form-label">手机号*</label>

+        <div class="layui-input-block">

+            <input name="mobile" placeholder="请输入手机号" type="text" class="layui-input" maxlength="11"

+                   lay-verify="required" required/>

+        </div>

+    </div>

+    <div class="layui-form-item">

+        <label class="layui-form-label">邮箱</label>

+        <div class="layui-input-block">

+            <input name="email" placeholder="请输入邮箱" type="text" class="layui-input" maxlength="100" />

+        </div>

+    </div>

+    <div class="layui-form-item">

+        <label class="layui-form-label">地址</label>

+        <div class="layui-input-block">

+            <input name="addr" placeholder="请输入地址" type="text" class="layui-input" maxlength="300" />

+        </div>

+    </div>

+

+    <div class="layui-form-item model-form-footer">

+        <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>

+        <button class="layui-btn" lay-filter="user-form-submit" lay-submit  id="submitbtn">保存</button>

+    </div>

+</form>

+

+<script>

+    layui.use(['layer', 'admin', 'form', 'formSelects'], function () {

+        var layer = layui.layer;

+        var admin = layui.admin;

+        var form = layui.form;

+        var url = '/user/add';

+        form.render('radio');

+        form.render('select');

+        // 回显user数据

+        var bean = admin.getTempData('t_bean');

+        if (bean) {

+            form.val('user-form', bean);

+        }

+        // 表单提交事件

+        form.on('submit(user-form-submit)', function (data) {

+            layer.load(2);

+            let token = $("meta[name='_csrf_token']").attr("value");

+            $.ajax({

+                type : "POST",

+                dataType : "json",

+                url : url,

+                headers: {

+                    'Accept': 'application/json',

+                    'Content-Type': 'application/json',

+                    'X-CSRF-TOKEN':token,

+                },

+                data : JSON.stringify(data.field),

+                success : function(result) {

+                    layer.closeAll('loading');

+                    if (result.code == 200) {

+                        layer.msg(result.msg, {icon: 1});

+                        admin.finishPopupCenter();

+                    } else if (result.code == 401) {

+                        layer.msg(result.msg, {icon: 2, time: 1500}, function () {

+                            location.replace('/login');

+                        }, 1000);

+                        return;

+                    } else {

+                        console.log('err:' + result.code);

+                        layer.msg(result.msg, {icon: 2});

+                    }

+                },

+                error : function() {

+                    layer.closeAll('loading');

+                    layer.msg("请求服务器失败!", {icon: 2});

+                }

+            });

+            return false;

+        });

+    });

+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/system/user/bind.html b/src/main/resources/templates/system/user/bind.html
new file mode 100755
index 0000000..dd5561e
--- /dev/null
+++ b/src/main/resources/templates/system/user/bind.html
@@ -0,0 +1,76 @@
+<div style="padding:20px;">

+    <table class="layui-table" id="userbindtable" lay-filter="userbindtable">

+    </table>

+    <input type="hidden" id="userid" th:value="${userid}">

+</div>

+<script>

+    layui.use(['form', 'table', 'layer', 'admin', 'element'], function () {

+        let form = layui.form;

+        let admin = layui.admin;

+        form.render('select');

+        let table = layui.table;

+        let userid = admin.getTempData('userid');

+        table.render({

+            elem: '#userbindtable',

+            url: '/user/bind?userid=' + userid,

+            cols: [

+                [

+                    {field: 'id', title: '资源ID', width: 80, fixed: 'left', sort: true},

+                    {field: 'name', title: '资源名称', sort: true},

+                    {

+                        field: 'functionId', title: '所属功能', sort: true, align: 'center', templet: function (item) {

+                            return $("#functionname").val();

+                        }

+                    },

+                    {field: 'uri', title: '路径'},

+                    {field: 'code', sort: true, width: 80, title: '代码'},

+                    {

+                        field: 'id', align: 'center', title: '操作',  templet: function (item) {

+                            return '<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a>'

+                        }

+                    }

+                ]

+            ]

+        });

+        // 工具条点击事件

+        table.on('tool(userbindtable)', function (obj) {

+            let data = obj.data;

+            let layEvent = obj.event;

+            console.log(data);

+            if (layEvent === 'del') {

+                showDelete(data);

+            }

+        });

+

+        let showDelete = function (data) {

+            layer.confirm('确定删除吗?', function (i) {

+                layer.close(i);

+                layer.load(2);

+                let token = $("meta[name='_csrf_token']").attr("value");

+                admin.go('/user/delbind', {

+                    resid: data.id,

+                    _csrf:token

+                }, function (data) {

+                    console.log(data.code);

+                    layer.closeAll('loading');

+                    if (data.code == 200) {

+                        layer.msg(data.msg, {icon: 1});

+                    } else if (data.code == 401) {

+                        layer.msg(data.msg, {icon: 2, time: 1500}, function () {

+                            location.replace('/login');

+                        }, 1000);

+                        return;

+                    }

+                    else {

+                        layer.msg(data.msg, {icon: 2});

+                    }

+                    table.reload('restable', {});

+                },function(ret){

+                    console.log(ret);

+                    layer.closeAll('loading');

+                    layer.msg('请求失败了,请稍后再试', {icon: 2});

+                });

+            });

+        }

+    });

+</script>

diff --git a/src/main/resources/templates/system/user/index.html b/src/main/resources/templates/system/user/index.html
index e2a4921..3a9d6fa 100644
--- a/src/main/resources/templates/system/user/index.html
+++ b/src/main/resources/templates/system/user/index.html
@@ -9,10 +9,10 @@
     <div class="layui-card-body">
         <div class="layui-form toolbar">
             搜索:
-            <input id="search-value" class="layui-input search-input" type="text" placeholder="输入用户名称"/>&emsp;
-            <button id="btn-search" class="layui-btn icon-btn" data-type="search"><i class="layui-icon">&#xe615;</i>搜索
+            <input id="search-value-user" class="layui-input search-input" type="text" placeholder="输入用户名称"/>&emsp;
+            <button id="btn-search-user" class="layui-btn icon-btn" data-type="search"><i class="layui-icon">&#xe615;</i>搜索
             </button>
-            <button id="btn-add" class="layui-btn icon-btn" data-type="add"><i class="layui-icon"></i>添加用户</button>
+            <button id="btn-add-user" class="layui-btn icon-btn" data-type="add"><i class="layui-icon"></i>添加用户</button>
         </div>
         <table class="layui-table" id="usertable" lay-filter="usertable"></table>
     </div>
@@ -31,14 +31,23 @@
             cols: [
                 [
                     {field: 'name', title: '名称', width: 80,fixed: 'left', sort: true},
-                    {field: 'sex', title: '性别',fixed: 'left', width: 80},
+                    {field: 'sex', title: '性别',fixed: 'left', width: 80, templet: function (item) {
+                            if (item.sex == 'male') {
+                                return '男'
+                            } else if (item.sex == 'female') {
+                                return '女'
+                            } else {
+                                return '男'
+                            }
+                        }
+                    },
                     {field: 'status', title: '状态',fixed: 'left',width: 80 , templet: function (item) {
                             if (item.status == 'normal') {
-                                return '正常'
+                                return '<span class="layui-badge layui-bg-green">正常</span>'
                             } else if (item.status == 'closed') {
-                                return '注销'
+                                return '<span class="layui-badge">注销</span>'
                             } else if (item.status == 'locked') {
-                                return '锁定'
+                                return '<span class="layui-badge layui-bg-orange">锁定</span>'
                             }  else {
                                 return '异常'
                             }
@@ -61,19 +70,16 @@
                         }
                     },
                     {field: 'idno', title: '证件号', width: 120,fixed: 'left', sort: true},
-                    {field: 'country', title: '国籍', width: 100,fixed: 'left', sort: true},
-                    {field: 'nation', title: '民族', width: 100,fixed: 'left', sort: true},
                     {field: 'email', title: '邮箱', width: 100,fixed: 'left', sort: true},
-                    {field: 'mobile', title: '手机', width: 100,fixed: 'left', sort: true},
+                    {field: 'mobile', title: '手机', width: 120,fixed: 'left', sort: true},
                     {field: 'tel', title: '电话', width: 100,fixed: 'left', sort: true},
-                    {field: 'addr', title: '地址', width: 100,fixed: 'left', sort: true},
-                    {field: 'zipcode', title: '邮编', width: 100,fixed: 'left', sort: true},
-                    {field: 'lastsaved', title: '最后修改时间', width: 120,fixed: 'left', sort: true},
+                    {field: 'addr', title: '地址', width: 200,fixed: 'left', sort: true},
+                    {field: 'lastsaved', title: '最后修改时间', width: 140,fixed: 'left', sort: true},
                     {
                         field: 'userid', align: 'center', title: '操作', fixed: 'right', templet: function (item) {
                             let html =  ' <a class="layui-btn  layui-btn-xs" lay-event="edit"><i class="layui-icon layui-icon-edit"></i>编辑</a> ';
-                            html +=  ' <a class="layui-btn  layui-btn-xs" lay-event="other"><i class="layui-icon layui-icon-edit"></i>绑定关系</a> ';
                             html +='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a>';
+                            /*html +=  '<a class="layui-btn  layui-btn-xs" lay-event="other"><i class="layui-icon layui-icon-link"></i>交易记录</a> ';*/
                             return html;
                         }
                     }
@@ -81,52 +87,43 @@
             ]
         });
         // 搜索按钮点击事件
-        $('#btn-search').click(function () {
-            let key = $('#search-value').val();
-            table.reload('roletable', {where: {searchkey: key}, page: {curr: 1}});
+        $('#btn-search-user').click(function () {
+            let key = $('#search-value-user').val();
+            table.reload('usertable', {where: {searchkey: key}, page: {curr: 1}});
         });
-        $('#btn-add').click(function () {
+        $('#btn-add-user').click(function () {
             showModel();
         });
         let showModel = function (data) {
-            let title = data ? '编辑角色' : '添加角色';
-            admin.putTempData('t_func', data);
+            let title = data ? '编辑用户' : '添加用户';
+            admin.putTempData('t_bean', data);
             admin.popupCenter({
                 title: title,
-                path: '/role/loadadd',
+                path: '/user/loadadd',
                 finish: function () {
-                    table.reload('roletable', {});
+                    table.reload('usertable', {});
                 }
             });
         };
-        let showFuncModel = function (data) {
-            let title = '分配功能';
-            admin.putTempData('roleId', data.roleId);
-            admin.popupCenter({
-                title: title,
-                path: '/role/loadfunc'
-            });
-        };
         // 工具条点击事件
         table.on('tool(usertable)', function (obj) {
             let data = obj.data;
             let layEvent = obj.event;
-            console.log(data);
             if (layEvent === 'edit') {
                 showModel(data);
-            } else if (layEvent === 'addfunc') {
-                showFuncModel(data);
+            } else if (layEvent === 'other') {
+                showOtherModel(data);
             } else if (layEvent === 'del') {
                 showDelete(data);
             }
         });
         let showDelete = function (data) {
-            layer.confirm('用户分配的该角色都将被删除,确定删除吗?', function (i) {
+            layer.confirm('确定删除该用户吗?', function (i) {
                 layer.close(i);
                 layer.load(2);
                 let token = $("meta[name='_csrf_token']").attr("value");
-                admin.go('/role/del', {
-                    roleid: data.roleId,
+                admin.go('/user/del', {
+                    userid: data.userid,
                     _csrf: token
                 }, function (data) {
                     console.log(data.code);
@@ -141,11 +138,15 @@
                     } else {
                         layer.msg(data.msg, {icon: 2});
                     }
-                    table.reload('roletable', {});
+                    table.reload('usertable', {});
                 }, function (ret) {
                     console.log(ret);
                     layer.closeAll('loading');
-                    layer.msg('请求失败了,请稍后再试', {icon: 2});
+                    if(ret.status==403){
+                        layer.msg('没有权限', {icon: 2});
+                    }else{
+                        layer.msg('请求失败了,请稍后再试', {icon: 2});
+                    }
                 });
             });
         }
diff --git a/src/main/resources/templates/system/user/point.html b/src/main/resources/templates/system/user/point.html
new file mode 100644
index 0000000..036815c
--- /dev/null
+++ b/src/main/resources/templates/system/user/point.html
@@ -0,0 +1,96 @@
+<div class="layui-card">
+    <div class="layui-card-header">
+        <h2 class="header-title">积分管理</h2>
+        <span class="layui-breadcrumb pull-right">
+          <a href="#">用户中心</a>
+          <a><cite>积分管理</cite></a>
+        </span>
+    </div>
+    <div class="layui-card-body">
+        <div class="layui-form toolbar">
+            搜索:
+            <input id="search-value-point" class="layui-input search-input" type="text" placeholder="输入用户名称"/>&emsp;
+            <button id="btn-search-point" class="layui-btn icon-btn" data-type="search"><i class="layui-icon">&#xe615;</i>搜索
+            </button>
+        </div>
+        <table class="layui-table" id="pointtable" lay-filter="pointtable"></table>
+    </div>
+</div>
+<script>
+    layui.use(['form', 'table', 'layer', 'admin', 'element'], function () {
+        let form = layui.form;
+        let table = layui.table;
+        let admin = layui.admin;
+        form.render('select');
+        // 渲染表格
+        table.render({
+            elem: '#pointtable',
+            url: '/user/pointlist',
+            page: true,
+            cols: [
+                [
+                    {field: 'person', title: '名称',fixed: 'left', sort: true, templet: function (item) {
+                            return item.person.name;
+                        }},
+                    {field: 'points', title: '可用积分', fixed: 'left', sort: true},
+                    {field: 'lastsaved', title: '最后修改时间', fixed: 'left', sort: true},
+                    {field: 'accumPoints', title: '累计获得积分', fixed: 'left', sort: true},
+                    {field: 'sumpayPoints', title: '累计消费积分',fixed: 'left', sort: true},
+                    {
+                        field: 'userid', align: 'center', title: '操作', fixed: 'right', templet: function (item) {
+                            let html ='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a>';
+                            /*html +=  '<a class="layui-btn  layui-btn-xs" th:lay-href="/user/pointdtl?userid="'+item.userid+'><i class="layui-icon layui-icon-link"></i>交易记录</a> ';*/
+                            return html;
+                        }
+                    }
+                ]
+            ]
+        });
+        // 搜索按钮点击事件
+        $('#btn-search-point').click(function () {
+            let key = $('#search-value-point').val();
+            table.reload('pointtable', {where: {searchkey: key}, page: {curr: 1}});
+        });
+        // 工具条点击事件
+        table.on('tool(pointtable)', function (obj) {
+            let data = obj.data;
+            let layEvent = obj.event;
+            if (layEvent === 'del') {
+                showDelete(data);
+            }
+        });
+        let showDelete = function (data) {
+            layer.confirm('确认删除吗,删除后将无法恢复', function (i) {
+                layer.close(i);
+                layer.load(2);
+                let token = $("meta[name='_csrf_token']").attr("value");
+                admin.go('/user/delpoint', {
+                    userid: data.userid,
+                    _csrf: token
+                }, function (data) {
+                    console.log(data.code);
+                    layer.closeAll('loading');
+                    if (data.code == 200) {
+                        layer.msg(data.msg, {icon: 1});
+                    } else if (data.code == 401) {
+                        layer.msg(data.msg, {icon: 2, time: 1500}, function () {
+                            location.replace('/login');
+                        }, 1000);
+                        return;
+                    } else {
+                        layer.msg(data.msg, {icon: 2});
+                    }
+                    table.reload('pointtable', {});
+                }, function (ret) {
+                    console.log(ret);
+                    layer.closeAll('loading');
+                    if(ret.status==403){
+                        layer.msg('没有权限', {icon: 2});
+                    }else{
+                        layer.msg('请求失败了,请稍后再试', {icon: 2});
+                    }
+                });
+            });
+        }
+    });
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/system/user/pointdtl.html b/src/main/resources/templates/system/user/pointdtl.html
new file mode 100644
index 0000000..522063b
--- /dev/null
+++ b/src/main/resources/templates/system/user/pointdtl.html
@@ -0,0 +1,97 @@
+<div class="layui-card">
+    <div class="layui-card-header">
+        <h2 class="header-title">积分交易记录</h2>
+        <span class="layui-breadcrumb pull-right">
+          <a href="#">用户中心</a>
+          <a><cite>积分交易记录</cite></a>
+        </span>
+    </div>
+    <div class="layui-card-body">
+        <div class="layui-form toolbar">
+            搜索:
+            <input id="search-value-point" class="layui-input search-input" type="text" placeholder="输入用户名称"/>&emsp;
+            <button id="btn-search-point" class="layui-btn icon-btn" data-type="search"><i class="layui-icon">&#xe615;</i>搜索
+            </button>
+        </div>
+        <table class="layui-table" id="pointtable" lay-filter="pointtable"></table>
+    </div>
+    <input type="hidden" id="userid" th:value="${userid}">
+</div>
+<script>
+    layui.use(['form', 'table', 'layer', 'admin', 'element'], function () {
+        let form = layui.form;
+        let table = layui.table;
+        let admin = layui.admin;
+        form.render('select');
+        // 渲染表格
+        table.render({
+            elem: '#pointtable',
+            url: '/user/pointlist',
+            page: true,
+            cols: [
+                [
+                    {field: 'person', title: '名称',fixed: 'left', sort: true, templet: function (item) {
+                            return item.person.name;
+                        }},
+                    {field: 'points', title: '可用积分', fixed: 'left', sort: true},
+                    {field: 'lastsaved', title: '最后修改时间', fixed: 'left', sort: true},
+                    {field: 'accumPoints', title: '累计获得积分', fixed: 'left', sort: true},
+                    {field: 'sumpayPoints', title: '累计消费积分',fixed: 'left', sort: true},
+                    {
+                        field: 'userid', align: 'center', title: '操作', fixed: 'right', templet: function (item) {
+                            let html ='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a>';
+                            html +=  '<a class="layui-btn  layui-btn-xs" th:lay-href="/user/pointdtl?userid="'+item.userid+'><i class="layui-icon layui-icon-link"></i>交易记录</a> ';
+                            return html;
+                        }
+                    }
+                ]
+            ]
+        });
+        // 搜索按钮点击事件
+        $('#btn-search-point').click(function () {
+            let key = $('#search-value-point').val();
+            table.reload('pointtable', {where: {searchkey: key}, page: {curr: 1}});
+        });
+        // 工具条点击事件
+        table.on('tool(pointtable)', function (obj) {
+            let data = obj.data;
+            let layEvent = obj.event;
+            if (layEvent === 'del') {
+                showDelete(data);
+            }
+        });
+        let showDelete = function (data) {
+            layer.confirm('确认删除吗,删除后将无法恢复', function (i) {
+                layer.close(i);
+                layer.load(2);
+                let token = $("meta[name='_csrf_token']").attr("value");
+                admin.go('/user/delpoint', {
+                    userid: data.userid,
+                    _csrf: token
+                }, function (data) {
+                    console.log(data.code);
+                    layer.closeAll('loading');
+                    if (data.code == 200) {
+                        layer.msg(data.msg, {icon: 1});
+                    } else if (data.code == 401) {
+                        layer.msg(data.msg, {icon: 2, time: 1500}, function () {
+                            location.replace('/login');
+                        }, 1000);
+                        return;
+                    } else {
+                        layer.msg(data.msg, {icon: 2});
+                    }
+                    table.reload('pointtable', {});
+                }, function (ret) {
+                    console.log(ret);
+                    layer.closeAll('loading');
+                    if(ret.status==403){
+                        layer.msg('没有权限', {icon: 2});
+                    }else{
+                        layer.msg('请求失败了,请稍后再试', {icon: 2});
+                    }
+                });
+            });
+        }
+    });
+</script>
\ No newline at end of file