食堂区域管理
diff --git a/build.gradle b/build.gradle
index e60f773..464e7cf 100644
--- a/build.gradle
+++ b/build.gradle
@@ -25,6 +25,7 @@
 
 dependencies {
     implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
+    implementation 'org.springframework.boot:spring-boot-starter-tomcat'
     implementation 'org.springframework.boot:spring-boot-starter-data-redis'
     implementation 'org.springframework.boot:spring-boot-starter-web'
     implementation 'org.springframework.boot:spring-boot-starter-security'
diff --git a/config/application-devel-pg.properties b/config/application-devel-pg.properties
index 5bbedd3..f4d1f18 100644
--- a/config/application-devel-pg.properties
+++ b/config/application-devel-pg.properties
@@ -5,7 +5,7 @@
 spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults=false
 # Postgresql settings
 spring.datasource.platform=postgresql
-spring.datasource.url=jdbc:postgresql://172.28.201.70:15432/payapi
+spring.datasource.url=jdbc:postgresql://172.28.201.70:15432/restaurant
 spring.datasource.username=payapi
 spring.datasource.password=123456
 database.dbtype=postgresql
diff --git a/src/main/java/com/supwisdom/dlpay/area/bean/AreaSearchBean.java b/src/main/java/com/supwisdom/dlpay/area/bean/AreaSearchBean.java
new file mode 100644
index 0000000..b3c4509
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/area/bean/AreaSearchBean.java
@@ -0,0 +1,16 @@
+package com.supwisdom.dlpay.area.bean;
+
+import com.supwisdom.dlpay.system.bean.PageBean;
+
+public class AreaSearchBean extends PageBean {
+    private String areaname;
+
+    public String getAreaname() {
+        return areaname;
+    }
+
+    public void setAreaname(String functioname) {
+        this.areaname = functioname;
+    }
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/area/controller/AreaController.java b/src/main/java/com/supwisdom/dlpay/area/controller/AreaController.java
new file mode 100644
index 0000000..4c4baf1
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/area/controller/AreaController.java
@@ -0,0 +1,90 @@
+package com.supwisdom.dlpay.area.controller;
+
+
+import com.google.gson.Gson;
+import com.supwisdom.dlpay.api.bean.JsonResult;
+import com.supwisdom.dlpay.area.bean.AreaSearchBean;
+import com.supwisdom.dlpay.area.domain.TArea;
+import com.supwisdom.dlpay.area.service.AreaService;
+import com.supwisdom.dlpay.framework.util.PageResult;
+import com.supwisdom.dlpay.framework.util.WebConstant;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Controller
+@RequestMapping("/area")
+public class AreaController {
+
+    @Autowired
+    private AreaService areaService;
+
+    @RequestMapping("/index")
+    public String indexView(ModelMap model) {
+        List<TArea> lst = areaService.findAll();
+        Map<Integer, String> map = new HashMap<>();
+        for (TArea area : lst) {
+            map.put(area.getId(), area.getAreaname());
+        }
+        Gson gson = new Gson();
+        String gsonString = gson.toJson(map);
+        model.put("areaList", gsonString);
+        return "area/index";
+    }
+
+    @RequestMapping("/list")
+    @PreAuthorize("hasPermission('/area/index','')")
+    @ResponseBody
+    public PageResult<TArea> getDataList(@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;
+            AreaSearchBean searchBean = new AreaSearchBean();
+            searchBean.setPageNo(pageNo);
+            searchBean.setAreaname(searchKey);
+            searchBean.setPageSize(pageSize);
+            return areaService.getAreaByKey(searchBean);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return new PageResult<>(99, "系统查询错误");
+        }
+    }
+
+
+    @GetMapping("/loadadd")
+    @PreAuthorize("hasPermission('/area/loadadd','')")
+    public String loadadd(Model model) {
+        List<TArea> list = areaService.findAll();
+        model.addAttribute("arealist", list);
+        return "area/form";
+    }
+
+    @PostMapping("/add")
+    @PreAuthorize("hasPermission('/area/add','')")
+    @ResponseBody
+    public JsonResult add(@RequestBody TArea area) {
+        System.out.println(area);
+        if (area != null) {
+            return areaService.saveArea(area);
+        } else {
+            return JsonResult.error("添加失败");
+        }
+    }
+
+    @PostMapping("/delete")
+    @PreAuthorize("hasPermission('/area/delete','')")
+    @ResponseBody
+    public JsonResult delfunc(@RequestParam Integer id) {
+        return areaService.deleteArea(id);
+    }
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/area/dao/AreaDao.java b/src/main/java/com/supwisdom/dlpay/area/dao/AreaDao.java
new file mode 100644
index 0000000..0b7a308
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/area/dao/AreaDao.java
@@ -0,0 +1,17 @@
+package com.supwisdom.dlpay.area.dao;
+
+
+import com.supwisdom.dlpay.area.domain.TArea;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface AreaDao extends JpaRepository<TArea, Integer> {
+
+
+    Page<TArea> findAllByAreanameContaining(String name, Pageable pageable);
+
+    TArea findByAreaname(String areaname);
+}
diff --git a/src/main/java/com/supwisdom/dlpay/area/domain/TArea.java b/src/main/java/com/supwisdom/dlpay/area/domain/TArea.java
new file mode 100644
index 0000000..2148783
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/area/domain/TArea.java
@@ -0,0 +1,85 @@
+package com.supwisdom.dlpay.area.domain;
+
+import javax.persistence.*;
+
+@Entity
+@Table(name = "TB_AREA")
+@SequenceGenerator(name="SEQ_AREA",sequenceName="SEQ_AREA",allocationSize=1)
+public class TArea  {
+
+    private Integer id;
+    private String areaname;
+    private Integer fid;
+    private Integer arealevel;
+    private String addr;
+    private String remark;
+
+    @Id
+    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ_AREA")
+    @Column(name = "id", unique = true, nullable = false, length = 8)
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer areacode) {
+        this.id = areacode;
+    }
+
+
+    @Column(name = "AREANAME", length = 60)
+    public String getAreaname() {
+        return this.areaname;
+    }
+
+    public void setAreaname(String areaname) {
+        this.areaname = areaname;
+    }
+
+    @Column(name = "fid",  length = 8)
+    public Integer getFid() {
+        return fid;
+    }
+
+    public void setFid(Integer fid) {
+        this.fid = fid;
+    }
+
+    @Column(name = "AREALEVEL", precision = 9, scale = 0)
+    public Integer getArealevel() {
+        return this.arealevel;
+    }
+
+    public void setArealevel(Integer arealevel) {
+        this.arealevel = arealevel;
+    }
+
+    @Column(name = "ADDR", length = 240)
+    public String getAddr() {
+        return this.addr;
+    }
+
+    public void setAddr(String addr) {
+        this.addr = addr;
+    }
+
+    @Column(name = "REMARK", length = 240)
+    public String getRemark() {
+        return this.remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    @Override
+    public String toString() {
+        return "TArea{" +
+                "id=" + id +
+                ", areaname='" + areaname + '\'' +
+                ", fid=" + fid +
+                ", arealevel=" + arealevel +
+                ", addr='" + addr + '\'' +
+                ", remark='" + remark + '\'' +
+                '}';
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/supwisdom/dlpay/area/service/AreaService.java b/src/main/java/com/supwisdom/dlpay/area/service/AreaService.java
new file mode 100644
index 0000000..9bee95d
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/area/service/AreaService.java
@@ -0,0 +1,26 @@
+package com.supwisdom.dlpay.area.service;
+
+import com.supwisdom.dlpay.api.bean.JsonResult;
+import com.supwisdom.dlpay.area.bean.AreaSearchBean;
+import com.supwisdom.dlpay.area.domain.TArea;
+import com.supwisdom.dlpay.framework.util.PageResult;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+public interface AreaService {
+
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
+    PageResult<TArea> getAreaByKey(AreaSearchBean param);
+
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
+    List<TArea> findAll();
+
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+    JsonResult saveArea(TArea area);
+
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+    JsonResult deleteArea(Integer id);
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/area/service/impl/AreaServiceImpl.java b/src/main/java/com/supwisdom/dlpay/area/service/impl/AreaServiceImpl.java
new file mode 100644
index 0000000..6b19406
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/area/service/impl/AreaServiceImpl.java
@@ -0,0 +1,55 @@
+package com.supwisdom.dlpay.area.service.impl;
+
+import com.supwisdom.dlpay.api.bean.JsonResult;
+import com.supwisdom.dlpay.area.bean.AreaSearchBean;
+import com.supwisdom.dlpay.area.dao.AreaDao;
+import com.supwisdom.dlpay.area.domain.TArea;
+import com.supwisdom.dlpay.area.service.AreaService;
+import com.supwisdom.dlpay.framework.util.PageResult;
+import com.supwisdom.dlpay.framework.util.StringUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class AreaServiceImpl implements AreaService {
+    @Autowired
+    private AreaDao areaDao;
+
+    @Override
+    public PageResult<TArea> getAreaByKey(AreaSearchBean param) {
+        Pageable pageable = PageRequest.of(param.getPageNo() - 1, param.getPageSize()
+                , Sort.by("id"));
+        if (!StringUtil.isEmpty(param.getAreaname())) {
+            return new PageResult<>(areaDao.findAllByAreanameContaining(param.getAreaname(), pageable));
+        }
+        return new PageResult<>(areaDao.findAll(pageable));
+    }
+
+    @Override
+    public List<TArea> findAll() {
+        return areaDao.findAll();
+    }
+
+    @Override
+    public JsonResult saveArea(TArea area) {
+       /* TArea temp = areaDao.findByAreaname(area.getAreaname());
+        if (temp != null) {
+            return JsonResult.error("地区名重复");
+        }*/
+        area.setArealevel(2);
+
+        areaDao.save(area);
+        return JsonResult.ok("成功");
+    }
+
+    @Override
+    public JsonResult deleteArea(Integer id) {
+        areaDao.deleteById(id);
+        return JsonResult.ok("成功");
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/shopmanagement/ShopManageController.java b/src/main/java/com/supwisdom/dlpay/shopmanagement/ShopManageController.java
new file mode 100644
index 0000000..3fcc576
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/shopmanagement/ShopManageController.java
@@ -0,0 +1,223 @@
+package com.supwisdom.dlpay.shopmanagement;
+
+import com.supwisdom.dlpay.api.bean.JsonResult;
+import com.supwisdom.dlpay.framework.domain.TOperLog;
+import com.supwisdom.dlpay.framework.domain.TOperRole;
+import com.supwisdom.dlpay.framework.domain.TOperator;
+import com.supwisdom.dlpay.framework.security.OperUtil;
+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.LogBean;
+import com.supwisdom.dlpay.system.bean.OperatorSearchBean;
+import com.supwisdom.dlpay.system.service.OperatorService;
+import com.supwisdom.dlpay.system.service.RoleService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+
+@Controller
+@RequestMapping("/shop")
+public class ShopManageController {
+    @Autowired
+    private OperatorService operatorService;
+    @Autowired
+    private RoleService roleService;
+
+    @GetMapping("/index")
+    @PreAuthorize("hasPermission('/operator/index','')")
+    public String indexView(Model model) {
+        System.out.println("here is index");
+        return "system/operator/index";
+    }
+
+    @GetMapping("/list")
+    @ResponseBody
+    public PageResult<TOperator> getDataList(@RequestParam("page") Integer pageNo,
+                                             @RequestParam("limit") Integer pageSize,
+                                             @RequestParam(value = "searchkey", required = false) String searchKey,
+                                             @RequestParam(value = "searchvalue", required = false) String searchValue) {
+        try {
+
+            if (null == pageNo || pageNo < 1) pageNo = WebConstant.PAGENO_DEFAULT;
+            if (null == pageSize || pageSize < 1) pageSize = WebConstant.PAGESIZE_DEFAULT;
+            OperatorSearchBean searchBean = new OperatorSearchBean();
+            if (!StringUtil.isEmpty(searchValue)) {
+                if ("opercode".equals(searchKey)) {
+                    searchBean.setOpercode(searchValue.trim());
+                } else if ("opername".equals(searchKey)) {
+                    searchBean.setOpername(searchValue.trim());
+                } else if ("mobile".equals(searchValue.trim())) {
+                    searchBean.setMobile(searchValue.trim());
+                }
+            }
+            return operatorService.getOperatorsByPage(pageNo, pageSize, searchBean);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return new PageResult<>(99, "系统查询错误");
+        }
+    }
+
+    @GetMapping("/load4add")
+    @PreAuthorize("hasPermission('/operator/load4add','')")
+    public String load4addOperator(Model model) {
+        model.addAttribute("roles", roleService.findAllRoles());
+        return "system/operator/operator";
+    }
+
+    @GetMapping("/checkopercode")
+    @ResponseBody
+    public JsonResult checkOpercode(@RequestParam("opercode") String opercode,
+                                    @RequestParam(value = "operid", required = false) String operid) {
+        if (operatorService.checkOpercodeExists(opercode, operid)) {
+            return JsonResult.error("账号重复");
+        }
+        return JsonResult.ok("success");
+    }
+
+    @PostMapping("/getoperatorrole")
+    @ResponseBody
+    public JsonResult getoperatorrole(@RequestParam(value = "operid") String operid) {
+        List<TOperRole> roles = operatorService.getOperRoleByOperId(operid);
+        JsonResult ret = JsonResult.ok("success");
+        ret.put("roles", roles);
+        return ret;
+    }
+
+    @PostMapping("/add")
+    @PreAuthorize("hasPermission('/operator/add','')")
+    @ResponseBody
+    public JsonResult add(@RequestParam("operid") String operid, @RequestParam("opercode") String opercode,
+                          @RequestParam("opername") String opername, @RequestParam("sex") String sex,
+                          @RequestParam("mobile") String mobile, @RequestParam("email") String email,
+                          @RequestParam("roleId") String roleId, Model map) {
+        if (operatorService.checkOpercodeExists(opercode, operid)) {
+            return JsonResult.error("账号重复");
+        }
+        TOperator operator = new TOperator();
+        operator.setOpername(opername);
+        operator.setOpercode(opercode);
+        operator.setOperid(operid);
+        operator.setMobile(mobile);
+        operator.setEmail(email);
+        operator.setSex(sex);
+        boolean ret = operatorService.saveOperator(operator, roleId);
+        if (ret) {
+            return JsonResult.ok("操作成功");
+        } else {
+            return JsonResult.error("操作失败");
+        }
+    }
+
+    @PostMapping("/resetpwd")
+    @PreAuthorize("hasPermission('/operator/resetpwd','')")
+    @ResponseBody
+    public JsonResult resetpwd(@RequestParam("operid") String operid) {
+        if (operatorService.resetPwd(operid)) {
+            return JsonResult.ok("操作成功,密码重置为123456");
+        } else {
+            return JsonResult.error("操作失败");
+        }
+    }
+
+    @PostMapping("/updatestate")
+    @PreAuthorize("hasPermission('/operator/updatestate','')")
+    @ResponseBody
+    public JsonResult updatestate(@RequestParam("operid") String operid, @RequestParam("state") String state) {
+        if (operatorService.updateState(operid, state)) {
+            return JsonResult.ok("操作成功");
+        } else {
+            return JsonResult.error("操作失败");
+        }
+    }
+
+    @GetMapping("/logs")
+    public String logs() {
+        return "system/operator/logs";
+    }
+
+    @GetMapping("/logslist")
+    @PreAuthorize("hasPermission('/operator/logslist','')")
+    @ResponseBody
+    public PageResult<TOperLog> logslist(@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;
+            LogBean searchBean = new LogBean();
+            searchBean.setPageNo(pageNo);
+            searchBean.setOpername(searchKey);
+            searchBean.setPageSize(pageSize);
+            return operatorService.getOperLogs(searchBean);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return new PageResult<>(99, "系统查询错误");
+        }
+    }
+
+    @GetMapping("/userinfor")
+    public String userinfor(ModelMap map) {
+        TOperator operator = OperUtil.getCurrentOper();
+        if(operator!=null){
+            operator = operatorService.getOperatorByCode(operator.getOpercode());
+        }
+        map.put("user", operator);
+        return "system/operator/userinfor";
+    }
+
+    @PostMapping("/updateinfor")
+    @ResponseBody
+    public JsonResult updateinfor(@RequestBody TOperator oper) {
+        TOperator operator = OperUtil.getCurrentOper();
+        if (oper != null) {
+            operator.setSex(oper.getSex());
+            operator.setOpername(oper.getOpername());
+            operator.setEmail(oper.getEmail());
+            operator.setMobile(oper.getMobile());
+            operatorService.saveOperator(operator);
+        }
+        return JsonResult.ok("操作成功");
+    }
+
+    @GetMapping("/setpwd")
+    public String setpwd(ModelMap map) {
+        return "system/operator/setpwd";
+    }
+
+    @PostMapping("/dosetpwd")
+    @ResponseBody
+    public JsonResult dosetpwd(@RequestParam String curpwd,
+                               @RequestParam String newpwd, @RequestParam String renewpwd) {
+        if (StringUtil.isEmpty(curpwd)
+                || StringUtil.isEmpty(newpwd)
+                || StringUtil.isEmpty(renewpwd)) {
+            return JsonResult.error("参数粗错误");
+        }
+        BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
+        String encpwd = encoder.encode(curpwd);
+        TOperator operator = OperUtil.getCurrentOper();
+        if (operator == null) {
+            return JsonResult.error(401, "登录已过期,请重新登录");
+        }
+        if (!encoder.matches(curpwd,operator.getPassword())) {
+            return JsonResult.error("当前密码错误");
+        }
+        if (!newpwd.equals(renewpwd)) {
+            return JsonResult.error("两次密码不一致");
+        }
+        if(newpwd.length()<6||newpwd.length()>20){
+            return JsonResult.error("密码6~20个字符");
+        }
+        operator.setOperpwd(encoder.encode(newpwd));
+        operatorService.saveOperator(operator);
+        return JsonResult.ok("密码修改成功,请重新登录");
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/system/controller/OperatorController.java b/src/main/java/com/supwisdom/dlpay/system/controller/OperatorController.java
index dc0ef57..3b57620 100644
--- a/src/main/java/com/supwisdom/dlpay/system/controller/OperatorController.java
+++ b/src/main/java/com/supwisdom/dlpay/system/controller/OperatorController.java
@@ -33,6 +33,7 @@
     @GetMapping("/index")
     @PreAuthorize("hasPermission('/operator/index','')")
     public String indexView(Model model) {
+        System.out.println("here is index");
         return "system/operator/index";
     }
 
diff --git a/src/main/kotlin/com/supwisdom/dlpay/framework/service/impl/framework_service_impl.kt b/src/main/kotlin/com/supwisdom/dlpay/framework/service/impl/framework_service_impl.kt
index 56f2586..17e6ca9 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/framework/service/impl/framework_service_impl.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/framework/service/impl/framework_service_impl.kt
@@ -36,7 +36,7 @@
         try {
             return Manifests.read("Payapi-Version") ?: "version 1.0"
         } catch (ex: Exception) {
-//            ex.printStackTrace()
+            ex.printStackTrace()
             return "unknown"
         }
     }
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index 4c33b78..c1ec200 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -26,3 +26,29 @@
 ################################################
 # user password
 auth.password.bcrypt.length=10
+
+
+
+##
+spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
+spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults=false
+# Postgresql settings
+spring.datasource.platform=postgresql
+spring.datasource.url=jdbc:postgresql://172.28.201.70:15432/restaurant
+spring.datasource.username=payapi
+spring.datasource.password=123456
+database.dbtype=postgresql
+# Redis settings
+redis.server=172.28.201.101
+redis.port=16379
+redis.password=kingstar
+redis.database=0
+# jwt settings
+jwt.secret=Zj5taLomEbrM0lk+NMQZbHfSxaDU1wekjT+kiC3YzDw=
+# timeout seconds
+jwt.expiration=3600
+auth.password.bcrypt.seed=
+spring.jackson.serialization.fail-on-empty-beans=false
+
+
+
diff --git a/src/main/resources/db/migration/V1.0__init_data.sql b/src/main/resources/db/migration/V1.0__init_data.sql
index 0d0cc5e..8e765df 100644
--- a/src/main/resources/db/migration/V1.0__init_data.sql
+++ b/src/main/resources/db/migration/V1.0__init_data.sql
@@ -1,37 +1,139 @@
-insert into tb_apiclient(appid, secret, status, roles)
-values ('100001', 'oUw2NmA09ficiVWD4TUQLDOkPyzQa3VzbjjsW0B2qTk=', 'normal', 'ROLE_THIRD_ADMIN');
-INSERT INTO tb_operator(
-	operid, closedate, opendate, opercode, opername, operpwd, opertype, status)
-	VALUES ('LOR2IwRkbOjp+sVG9KR2BpHZbwGKepS4', '20500101', '20190101', 'system', '系统管理员', '$2a$10$Ex9xp11.vCaD8D0a7ahiUOKqDij1TcCUBwRAmrqXeDvAkmzLibn4.', 'oper', 'normal');
 
-INSERT INTO tb_role(
-	roleid, createtime, editflag, lastsaved, rolecode, roledesc, rolename)
-	VALUES ('d1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '20190101000000', 0, '', 'ROLE_ADMIN', '超级管理员', '超级管理员');
-
-INSERT INTO tb_oper_role(
-	id, operid, roleid)
-	VALUES ('1', 'LOR2IwRkbOjp+sVG9KR2BpHZbwGKepS4', 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-
--- 功能表
---Insert into TB_FUNCTION (ID,PARENTID,NAME,ORDERNUM,MENUURL,MENUICON,ISLEAF)
---values ('1','-1','系统中心',1,'#','layui-icon-set',0);
---Insert into TB_FUNCTION (ID,PARENTID,NAME,ORDERNUM,MENUURL,MENUICON,ISLEAF)
---values ('2','1','管理员维护',1,'#','layui-icon-set',1);
-
---Insert into TB_ROLE_FUNCTION (ID,FUNCTIONID,ROLEID) values ('1','1','d1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
---Insert into TB_ROLE_FUNCTION (ID,FUNCTIONID,ROLEID) values ('2','2','d1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-
-Insert into TB_FUNCTION (ID,CREATETIME,ISLEAF,LASTSAVED,MENUICON,MENUURL,NAME,ORDERNUM,PARENTID) values ('1',null,0,null,'layui-icon-home','#','主页',1,'-1');
-Insert into TB_FUNCTION (ID,CREATETIME,ISLEAF,LASTSAVED,MENUICON,MENUURL,NAME,ORDERNUM,PARENTID) values ('2',null,1,null,'layui-icon-home','/home/console','控制台',1,'1');
-Insert into TB_FUNCTION (ID,CREATETIME,ISLEAF,LASTSAVED,MENUICON,MENUURL,NAME,ORDERNUM,PARENTID) values ('3',null,0,null,'layui-icon-set','#','系统中心',2,'-1');
-Insert into TB_FUNCTION (ID,CREATETIME,ISLEAF,LASTSAVED,MENUICON,MENUURL,NAME,ORDERNUM,PARENTID) values ('4',null,1,null,'layui-icon-set','/operator/index','管理员维护',1,'3');
-Insert into TB_FUNCTION (ID,CREATETIME,ISLEAF,LASTSAVED,MENUICON,MENUURL,NAME,ORDERNUM,PARENTID) values ('5',null,1,null,'layui-icon-set','/role/index','角色管理',2,'3');
+INSERT INTO "tb_apiclient" VALUES ('200001', 'ROLE_THIRD_CONSUME,ROLE_THIRD_COMMON', 'oUw2NmA09ficiVWD4TUQLDOkPyzQa3VzbjjsW0B2qTk=', 'normal');
+INSERT INTO "tb_apiclient" VALUES ('100001', 'ROLE_THIRD_ADMIN', 'oUw2NmA09ficiVWD4TUQLDOkPyzQa3VzbjjsW0B2qTk=', 'normal');
 
 
-Insert into TB_ROLE_FUNCTION (ID,FUNCTIONID,ROLEID) values ('5','5','d1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-Insert into TB_ROLE_FUNCTION (ID,FUNCTIONID,ROLEID) values ('1','1','d1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-Insert into TB_ROLE_FUNCTION (ID,FUNCTIONID,ROLEID) values ('2','2','d1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-Insert into TB_ROLE_FUNCTION (ID,FUNCTIONID,ROLEID) values ('3','3','d1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-Insert into TB_ROLE_FUNCTION (ID,FUNCTIONID,ROLEID) values ('4','4','d1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO "tb_function" VALUES (1, NULL, 0, NULL, 'layui-icon-home', '#', '主页', 1, -1);
+INSERT INTO "tb_function" VALUES (2, NULL, 1, NULL, 'layui-icon-home', '/home/console', '控制台', 1, 1);
+INSERT INTO "tb_function" VALUES (3, NULL, 0, NULL, 'layui-icon-set', '#', '系统中心', 2, -1);
+INSERT INTO "tb_function" VALUES (5, NULL, 1, NULL, 'layui-icon-set', '/role/index', '角色管理', 2, 3);
+INSERT INTO "tb_function" VALUES (6, NULL, 1, NULL, 'layui-icon-set', '/operator/index', '操作员管理', 4, 3);
+INSERT INTO "tb_function" VALUES (4, NULL, 1, NULL, 'layui-icon-set', '/function/index', '功能维护', 1, 3);
+INSERT INTO "tb_function" VALUES (7, NULL, 0, NULL, 'layui-icon-release', '#', '商户中心', 4, -1);
+INSERT INTO "tb_function" VALUES (9, NULL, 1, NULL, '', '/operator/logs', '操作日志', 4, 3);
+INSERT INTO "tb_function" VALUES (10, NULL, 0, NULL, 'layui-icon-util', '#', '参数管理', 3, -1);
+INSERT INTO "tb_function" VALUES (11, NULL, 1, NULL, 'layui-icon-util', '/param/syspara', '全局参数配置', 1, 10);
+INSERT INTO "tb_function" VALUES (12, NULL, 1, NULL, 'layui-icon-util', '/param/businesspara', '业务参数配置', 2, 10);
+INSERT INTO "tb_function" VALUES (17, NULL, 1, NULL, 'layui-icon-util', '/param/apiclientpara', '应用参数配置', 3, 10);
+INSERT INTO "tb_function" VALUES (18, NULL, 1, NULL, 'layui-icon-util', '/param/paytype', '支付能力配置', 4, 10);
+INSERT INTO "tb_oper_role" VALUES ('2c9cab836a90185f016a901b005f001b', '402882816a8fe884016a8fe8c0530000', '2c9cab836a8af5d5016a8af6ece20000');
+INSERT INTO "tb_oper_role" VALUES ('ff8080816aaf2ec3016aaf30c1b60007', 'LOR2IwRkbOjp+sVG9KR2BpHZbwGKepS4', 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO "tb_oper_role" VALUES ('ff8080816ab96daf016ab9743dc60050', '2c9cab836a9666e0016a96694bbb0004', 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO "tb_operator" VALUES ('2c9cab836a9666e0016a96694bbb0004', NULL, '', '', '20190508', 'test1', 'test1', '$2a$10$lkfzdX.0ioX9FU2BmPzHz.tv2DTR8XvaZzA0vpkEYV5vx/IDtIsGy', 'oper', 'normal', 'male');
+INSERT INTO "tb_operator" VALUES ('402882816a8fe884016a8fe8c0530000', NULL, '', '', '20190507', 'test', '11112', '$2a$10$Xa/UKDQ/WkiKVQAyv5Hu4eiqt6HtwVK3YA0Glg1/y1uiEsXnG7ZeS', 'oper', 'normal', 'male');
+INSERT INTO "tb_operator" VALUES ('LOR2IwRkbOjp+sVG9KR2BpHZbwGKepS4', '20500101', '', '', '20190101', 'system', '系统管理员', '$2a$10$Ex9xp11.vCaD8D0a7ahiUOKqDij1TcCUBwRAmrqXeDvAkmzLibn4.', 'oper', 'normal', 'male');
+INSERT INTO "tb_permission" VALUES ('ff8080816aba2931016aba4518160054', 16, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO "tb_permission" VALUES ('ff8080816aba2931016aba4518160055', 17, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO "tb_permission" VALUES ('ff8080816aba2931016aba4518160056', 19, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO "tb_permission" VALUES ('ff8080816aba2931016aba4518160057', 20, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO "tb_permission" VALUES ('ff8080816aba2931016aba4518160058', 21, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO "tb_permission" VALUES ('ff8080816aba2931016aba451816005a', 6, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO "tb_permission" VALUES ('ff8080816aba2931016aba451816005b', 7, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO "tb_permission" VALUES ('ff8080816aba2931016aba451816005c', 8, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO "tb_permission" VALUES ('ff8080816aba2931016aba451816005d', 9, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO "tb_permission" VALUES ('ff8080816aba2931016aba451816005e', 22, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO "tb_permission" VALUES ('ff8080816aba2931016aba4518170060', 4, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO "tb_permission" VALUES ('ff8080816aba2931016aba4518170061', 5, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO "tb_permission" VALUES ('ff8080816aba2931016aba4518170062', 10, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO "tb_permission" VALUES ('ff8080816aba2931016aba4518170063', 11, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO "tb_permission" VALUES ('ff8080816aba2931016aba4518170064', 12, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO "tb_permission" VALUES ('ff8080816aba2931016aba4518170065', 13, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO "tb_permission" VALUES ('ff8080816aba2931016aba4518170066', 14, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO "tb_permission" VALUES ('ff8080816aba2931016aba4518180067', 15, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO "tb_permission" VALUES ('ff8080816aba2931016aba4518180069', 24, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO "tb_permission" VALUES ('ff8080816aba2931016aba451819006d', 27, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO "tb_permission" VALUES ('ff8080816aba2931016aba451819006e', 26, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO "tb_permission" VALUES ('ff8080816aba2931016aba4518190070', 28, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO "tb_permission" VALUES ('ff8080816aba2931016aba4518190071', 29, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO "tb_permission" VALUES ('ff8080816aba2931016aba4518190072', 30, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO "tb_permission" VALUES ('ff8080816aba2931016aba4518190073', 33, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO "tb_permission" VALUES ('ff8080816aba2931016aba4518190074', 32, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO "tb_permission" VALUES ('ff8080816aba2931016aba4518190076', 34, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO "tb_permission" VALUES ('ff8080816aba2931016aba45181a0077', 35, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO "tb_permission" VALUES ('ff8080816aba2931016aba45181a0078', 37, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO "tb_permission" VALUES ('ff8080816aba2931016aba45181a0079', 36, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO "tb_permission" VALUES ('ff8080816aba2931016aba45181a007a', 39, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO "tb_permission" VALUES ('ff8080816aba2931016aba45181a007b', 40, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO "tb_permission" VALUES ('ff8080816aba2931016aba45181b007d', 41, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO "tb_permission" VALUES ('ff8080816aaf2ec3016aaf4edaa80085', 16, NULL, '2c9cab836a8af5d5016a8af6ece20000');
+INSERT INTO "tb_permission" VALUES ('ff8080816aaf2ec3016aaf4edaa80086', 17, NULL, '2c9cab836a8af5d5016a8af6ece20000');
+INSERT INTO "tb_permission" VALUES ('ff8080816aaf2ec3016aaf4edaa90087', 19, NULL, '2c9cab836a8af5d5016a8af6ece20000');
+INSERT INTO "tb_permission" VALUES ('ff8080816aaf2ec3016aaf4edaa90088', 20, NULL, '2c9cab836a8af5d5016a8af6ece20000');
+INSERT INTO "tb_permission" VALUES ('ff8080816aaf2ec3016aaf4edaa90089', 21, NULL, '2c9cab836a8af5d5016a8af6ece20000');
+INSERT INTO "tb_permission" VALUES ('ff8080816aaf2ec3016aaf4edaa9008b', 6, NULL, '2c9cab836a8af5d5016a8af6ece20000');
+INSERT INTO "tb_permission" VALUES ('ff8080816aaf2ec3016aaf4edaa9008c', 7, NULL, '2c9cab836a8af5d5016a8af6ece20000');
+INSERT INTO "tb_permission" VALUES ('ff8080816aaf2ec3016aaf4edaa9008d', 8, NULL, '2c9cab836a8af5d5016a8af6ece20000');
+INSERT INTO "tb_permission" VALUES ('ff8080816aaf2ec3016aaf4edaa9008e', 9, NULL, '2c9cab836a8af5d5016a8af6ece20000');
+INSERT INTO "tb_permission" VALUES ('ff8080816aaf2ec3016aaf4edaa9008f', 22, NULL, '2c9cab836a8af5d5016a8af6ece20000');
+INSERT INTO "tb_permission" VALUES ('ff8080816aaf2ec3016aaf4edaa90091', 4, NULL, '2c9cab836a8af5d5016a8af6ece20000');
+INSERT INTO "tb_permission" VALUES ('ff8080816aaf2ec3016aaf4edaaa0092', 5, NULL, '2c9cab836a8af5d5016a8af6ece20000');
+INSERT INTO "tb_permission" VALUES ('ff8080816aaf2ec3016aaf4edaaa0093', 10, NULL, '2c9cab836a8af5d5016a8af6ece20000');
+INSERT INTO "tb_permission" VALUES ('ff8080816aaf2ec3016aaf4edaaa0094', 11, NULL, '2c9cab836a8af5d5016a8af6ece20000');
+INSERT INTO "tb_permission" VALUES ('ff8080816aaf2ec3016aaf4edaaa0095', 12, NULL, '2c9cab836a8af5d5016a8af6ece20000');
+INSERT INTO "tb_permission" VALUES ('ff8080816aaf2ec3016aaf4edaaa0096', 13, NULL, '2c9cab836a8af5d5016a8af6ece20000');
+INSERT INTO "tb_permission" VALUES ('ff8080816aaf2ec3016aaf4edaaa0097', 14, NULL, '2c9cab836a8af5d5016a8af6ece20000');
+INSERT INTO "tb_permission" VALUES ('ff8080816aaf2ec3016aaf4edaaa0098', 15, NULL, '2c9cab836a8af5d5016a8af6ece20000');
+INSERT INTO "tb_permission" VALUES ('ff8080816aaf2ec3016aaf4edaaa009a', 24, NULL, '2c9cab836a8af5d5016a8af6ece20000');
+INSERT INTO "tb_permission" VALUES ('ff8080816aaf2ec3016aaf4edaab009e', 26, NULL, '2c9cab836a8af5d5016a8af6ece20000');
+INSERT INTO "tb_permission" VALUES ('ff8080816aaf2ec3016aaf4edaac009f', 27, NULL, '2c9cab836a8af5d5016a8af6ece20000');
+INSERT INTO "tb_resource" VALUES (4, '1', 4, '添加功能', '/function/add');
+INSERT INTO "tb_resource" VALUES (5, '', 4, '添加父功能', '/function/loadadd');
+INSERT INTO "tb_resource" VALUES (6, '1', 6, '查询', '/operator/index');
+INSERT INTO "tb_resource" VALUES (7, '', 6, '添加查询', '/operator/load4add');
+INSERT INTO "tb_resource" VALUES (8, '', 6, '添加和修改', '/operator/add');
+INSERT INTO "tb_resource" VALUES (9, '', 6, '重置密码', '/operator/resetpwd');
+INSERT INTO "tb_resource" VALUES (10, '', 4, '查询', '/function/index');
+INSERT INTO "tb_resource" VALUES (11, '', 4, '删除', '/function/delfunc');
+INSERT INTO "tb_resource" VALUES (12, '', 4, '添加子功能', '/function/loadsubadd');
+INSERT INTO "tb_resource" VALUES (13, '', 4, '维护资源', '/function/loadres');
+INSERT INTO "tb_resource" VALUES (14, '', 4, '添加资源', '/function/addres');
+INSERT INTO "tb_resource" VALUES (15, '', 4, '删除资源', '/function/delres');
+INSERT INTO "tb_resource" VALUES (16, '', 5, '查询', '/role/index');
+INSERT INTO "tb_resource" VALUES (17, '', 5, '添加', '/role/add');
+INSERT INTO "tb_resource" VALUES (19, '', 5, '分配功能', '/role/addfunc');
+INSERT INTO "tb_resource" VALUES (20, '', 5, '加载分配功能', '/role/loadfunc');
+INSERT INTO "tb_resource" VALUES (21, '', 5, '删除角色', '/role/del');
+INSERT INTO "tb_resource" VALUES (22, '', 6, '修改状态', '/operator/updatestate');
+INSERT INTO "tb_resource" VALUES (24, '', 9, '查询', '/operator/logslist');
+INSERT INTO "tb_resource" VALUES (26, '', 11, '修改', '/param/sysparaupdate');
+INSERT INTO "tb_resource" VALUES (27, '', 11, '查询', '/param/syspara');
+INSERT INTO "tb_resource" VALUES (28, '', 12, '查询', '/param/businesspara');
+INSERT INTO "tb_resource" VALUES (29, '', 12, '删除', '/param/deletebusinesspara');
+INSERT INTO "tb_resource" VALUES (30, '', 12, '修改', '/param/businessparaupdate');
+INSERT INTO "tb_resource" VALUES (32, '', 12, '新增', '/param/addbusinesspara');
+INSERT INTO "tb_resource" VALUES (33, '', 12, '新增跳转', '/param/load4addbuspara');
+INSERT INTO "tb_resource" VALUES (34, '', 17, '查询', '/param/apiclientpara');
+INSERT INTO "tb_resource" VALUES (35, '', 17, '新增修改跳转', '/param/load4addapiclient');
+INSERT INTO "tb_resource" VALUES (36, '', 17, '修改状态', '/param/updateapiclientstate');
+INSERT INTO "tb_resource" VALUES (37, '', 17, '删除', '/param/deleteapiclient');
+INSERT INTO "tb_resource" VALUES (39, '', 17, '修改', '/param/updateapiclientpara');
+INSERT INTO "tb_resource" VALUES (40, '', 17, '新增', '/param/addapiclientpara');
+INSERT INTO "tb_resource" VALUES (41, '', 18, '查询', '/param/paytype');
+INSERT INTO "tb_role" VALUES ('d1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '20190101000000', 0, '', 'ROLE_ADMIN', '超级管理员', '超级管理员');
+INSERT INTO "tb_role" VALUES ('2c9cab836a8af5d5016a8af6ece20000', '20190506102639', 1, '', 'ROLE_ADMIN', '系统管理员', '系统管理员');
+INSERT INTO "tb_role_function" VALUES ('ff8080816aaf2ec3016aaf4edaa80081', 1, NULL, '2c9cab836a8af5d5016a8af6ece20000');
+INSERT INTO "tb_role_function" VALUES ('ff8080816aaf2ec3016aaf4edaa80082', 2, NULL, '2c9cab836a8af5d5016a8af6ece20000');
+INSERT INTO "tb_role_function" VALUES ('ff8080816aaf2ec3016aaf4edaa80083', 3, NULL, '2c9cab836a8af5d5016a8af6ece20000');
+INSERT INTO "tb_role_function" VALUES ('ff8080816aaf2ec3016aaf4edaa80084', 5, NULL, '2c9cab836a8af5d5016a8af6ece20000');
+INSERT INTO "tb_role_function" VALUES ('ff8080816aaf2ec3016aaf4edaa9008a', 6, NULL, '2c9cab836a8af5d5016a8af6ece20000');
+INSERT INTO "tb_role_function" VALUES ('ff8080816aaf2ec3016aaf4edaa90090', 4, NULL, '2c9cab836a8af5d5016a8af6ece20000');
+INSERT INTO "tb_role_function" VALUES ('ff8080816aaf2ec3016aaf4edaaa0099', 9, NULL, '2c9cab836a8af5d5016a8af6ece20000');
+INSERT INTO "tb_role_function" VALUES ('ff8080816aaf2ec3016aaf4edaaa009b', 7, NULL, '2c9cab836a8af5d5016a8af6ece20000');
+INSERT INTO "tb_role_function" VALUES ('ff8080816aaf2ec3016aaf4edaab009c', 10, NULL, '2c9cab836a8af5d5016a8af6ece20000');
+INSERT INTO "tb_role_function" VALUES ('ff8080816aaf2ec3016aaf4edaab009d', 11, NULL, '2c9cab836a8af5d5016a8af6ece20000');
+INSERT INTO "tb_role_function" VALUES ('ff8080816aba2931016aba4518150050', 1, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO "tb_role_function" VALUES ('ff8080816aba2931016aba4518150051', 2, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO "tb_role_function" VALUES ('ff8080816aba2931016aba4518150052', 3, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO "tb_role_function" VALUES ('ff8080816aba2931016aba4518150053', 5, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO "tb_role_function" VALUES ('ff8080816aba2931016aba4518160059', 6, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO "tb_role_function" VALUES ('ff8080816aba2931016aba451817005f', 4, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO "tb_role_function" VALUES ('ff8080816aba2931016aba4518180068', 9, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO "tb_role_function" VALUES ('ff8080816aba2931016aba451818006a', 7, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO "tb_role_function" VALUES ('ff8080816aba2931016aba451818006b', 10, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO "tb_role_function" VALUES ('ff8080816aba2931016aba451818006c', 11, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO "tb_role_function" VALUES ('ff8080816aba2931016aba451819006f', 12, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO "tb_role_function" VALUES ('ff8080816aba2931016aba4518190075', 17, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO "tb_role_function" VALUES ('ff8080816aba2931016aba45181b007c', 18, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
 
+INSERT INTO "tb_area" VALUES (1, '地区1', 1, '', 0, NULL);
 commit;
diff --git a/src/main/resources/db/migration/V1.1__init_paytype.sql b/src/main/resources/db/migration/V1.1__init_paytype.sql
index 0dfd06c..e618e16 100644
--- a/src/main/resources/db/migration/V1.1__init_paytype.sql
+++ b/src/main/resources/db/migration/V1.1__init_paytype.sql
@@ -1,5 +1,5 @@
 -- 支付方式
-Insert into TB_PAYTYPE (PAYTYPE,DPS_ENABLE,ENABLE,REVERSE_ENABLE) values ('yktpay','no','yes','yes');
+--Insert into TB_PAYTYPE (PAYTYPE,DPS_ENABLE,ENABLE,REVERSE_ENABLE) values ('yktpay','no','yes','yes');
 
 Insert into TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE) values ('yktpay','appid',null,'100005');
 Insert into TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE) values ('yktpay','appkey',null,'adc4ac6822fd462780f878b86cb94688');
diff --git a/src/main/resources/templates/area/form.html b/src/main/resources/templates/area/form.html
new file mode 100644
index 0000000..2bcc90d
--- /dev/null
+++ b/src/main/resources/templates/area/form.html
@@ -0,0 +1,118 @@
+<!-- operator表单弹窗 -->
+<form id="form" lay-filter="form" class="layui-form model-form">
+    <input name="id" id="id" type="hidden"/>
+    <div class="layui-form-item">
+        <label class="layui-form-label">区域名称</label>
+        <div class="layui-input-block">
+            <input name="areaname" placeholder="区域名不能重复" type="text" class="layui-input" maxlength="20"
+                   lay-verify="required|areaname" required/>
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label">父区域</label>
+        <div class="layui-input-block">
+            <select name="fid" id="fid" lay-verify="required">
+                <option th:each="area : ${arealist}" th:value="${area.id}">[[${area.areaname}]]</option>
+            </select>
+        </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"/>
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label">备注</label>
+        <div class="layui-input-block">
+            <input name="remark" placeholder="请输入" type="text" class="layui-input"/>
+        </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="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;
+        form.render('select');
+        form.render('radio');
+        /*form.verify({
+            "areaname": function (e) {
+                var msg = "";
+                $.ajax({
+                    type: "GET",
+                    url: '/area/checkname',
+                    async: false,
+                    data: {
+                        areaname: e,
+                    },
+                    success: function (result) {
+                        if (result.code != 200) {
+                            msg = result.msg;
+                        }
+                    },
+                    error: function (error) {
+                        msg = "请求服务器校验账号失败";
+                    }
+                });
+            }
+        });*/
+
+        var url = '/area/add';
+        // 回显user数据
+        var func = admin.getTempData('t_area');
+        if (func) {
+            $('input[name="id"]').attr('readonly', 'readonly');
+            form.val('form', func);
+        }
+        let fid = admin.getTempData("fid");
+        if (fid) {
+            form.val('form', {"fid": fid});
+        }
+        // 表单提交事件
+        form.on('submit(form-submit)', function (data) {
+            layer.load(2);
+            let token = $("meta[name='_csrf_token']").attr("value");
+            debugger
+            $.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/area/index.html b/src/main/resources/templates/area/index.html
new file mode 100644
index 0000000..ed16a4c
--- /dev/null
+++ b/src/main/resources/templates/area/index.html
@@ -0,0 +1,152 @@
+<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" 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>
+            <button id="btn-add" 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>
+</div>
+<input hidden th:value="${areaList}" id="arealist">
+<script>
+
+    var rawlist=$("#arealist").val();
+    var arealist=JSON.parse(rawlist);
+    $(function () {
+        console.log(arealist);
+    });
+
+    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: '#table',
+            url: '/area/list',
+            page: true,
+            cols: [
+                [
+                    {field: 'id', title: '区域号', width: 80, fixed: 'left', sort: true},
+                    {field: 'areaname', title: '区域名称', sort: true},
+                    {
+                        field: 'arealevel',
+                        title: '区域级别',
+                        sort: true,
+                        width: 80,
+                        align: 'center',
+                        templet: function (item) {
+                            if (item.arealevel == 1) {
+                                return '<span class="layui-badge ">父</span>'
+                            } else if (item.arealevel == 2) {
+                                return '<span class="layui-badge layui-bg-green">子</span>'
+                            } else {
+                                return ''
+                            }
+                        }
+                    },
+                    {
+                        field: 'fid',
+                        title: '父区域',
+                        sort: true,
+                        width: 80,
+                        align: 'center',
+                        templet: function (item) {
+                            if (item.arealevel == 1) {
+                                return '0';
+                            } else if (item.arealevel == 2) {
+                                return arealist[item.fid];
+                            } else {
+                                return ''
+                            }
+
+                           // return areaList.get(item.id);
+                        }
+                    },
+                    {field: 'addr', sort: true, width: 80, title: '地址'},
+                    {field: 'remark', sort: true, width: 80, title: '注释'},
+                    {
+                        field: 'id', align: 'center', title: '操作', fixed: 'right', templet: function (item) {
+                            return ' <a class="layui-btn  layui-btn-xs" lay-event="edit"><i class="layui-icon layui-icon-edit"></i>编辑</a> ' +
+                                ' <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a>'
+                        }
+                    }
+                ]
+            ]
+        });
+        // 搜索按钮点击事件
+        $('#btn-search').click(function () {
+            let key = $('#search-value').val();
+            table.reload('table', {where: {searchkey: key}, page: {curr: 1}});
+        });
+        $('#btn-add').click(function () {
+            showModel();
+        });
+        let showModel = function (data) {
+            let title = data ? '修改区域' : '添加区域';
+            admin.putTempData('t_area', data);
+            admin.popupCenter({
+                title: title,
+                path: '/area/loadadd',
+                finish: function () {
+                    table.reload('table', {});
+                }
+            });
+        };
+
+
+        // 工具条点击事件
+        table.on('tool(table)', function (obj) {
+            let data = obj.data;
+            let layEvent = obj.event;
+            console.log(data);
+            if (layEvent === 'edit') {
+                showModel(data);
+            } else 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('/area/delete', {
+                    id: 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('table', {});
+                }, function (ret) {
+                    console.log(ret);
+                    layer.closeAll('loading');
+                    layer.msg('请求失败了,请稍后再试', {icon: 2});
+                });
+            });
+        }
+    });
+</script>