app/src/main/java/com/ks/app/controller/admin/vip/VipCenterAdminController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
app/src/main/resources/static/index.html | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
app/src/main/resources/static/views/vip/vipCenter-list.html | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
facade-vip/src/main/java/com/ks/vip/exception/VipCenterException.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
facade-vip/src/main/java/com/ks/vip/pojo/VO/VipCenterVO.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
facade-vip/src/main/java/com/ks/vip/service/VipCenterService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
pom.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
service-lijin/pom.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
service-vip/pom.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
service-vip/src/main/java/com/ks/vip/service/remote/VipCenterServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
app/src/main/java/com/ks/app/controller/admin/vip/VipCenterAdminController.java
New file @@ -0,0 +1,96 @@ package com.ks.app.controller.admin.vip; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import com.ks.app.pojo.DTO.OptionDTO; import com.ks.app.pojo.VO.PageEntity; import com.ks.app.pojo.VO.Result; import com.ks.app.util.ResultUtils; import com.ks.vip.exception.VipCenterException; import com.ks.vip.pojo.DO.VipCenter; import com.ks.vip.pojo.DO.VipGrade; import com.ks.vip.pojo.Enums.VIPEnum; import com.ks.vip.pojo.VO.VipCenterVO; import com.ks.vip.service.VipCenterService; import com.ks.vip.service.VipCenterService; import com.ks.vip.service.VipGradeService; import org.apache.commons.beanutils.BeanUtils; import org.apache.dubbo.config.annotation.Reference; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import javax.servlet.http.HttpServletRequest; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @Controller @RequestMapping("admin/api/vip/vipCenter") public class VipCenterAdminController { @Reference(version = "1.0") private VipCenterService vipCenterService; @Reference(version = "1.0") private VipGradeService vipGradeService; @ResponseBody @RequestMapping(value = "listByPage") public Result listByPage(int page, int pageSize, VipCenter t, HttpServletRequest request) { try { List<VipCenterVO> listVO = new ArrayList<>(); List<VipCenter> list = vipCenterService.listByPage(page, pageSize, t); if (list != null && list.size() > 0) { for (VipCenter vipCenter: list) { VipCenterVO vipCenterVO = new VipCenterVO(); BeanUtils.copyProperties(vipCenter, vipCenterVO); VipGrade vipGrade = vipGradeService.selectByPrimaryKey(vipCenter.getGradeId()); if (vipGrade != null) { vipCenterVO.setGradeName(vipGrade.getName()); } // 用户明查询 TODO listVO.add(vipCenterVO); } } long count = vipCenterService.count(t); int totalPage = (int) (count % pageSize == 0 ? count / pageSize : count / pageSize + 1); PageEntity pe = new PageEntity(page, pageSize, count, totalPage); Map<String, Object> map = new HashMap<>(); map.put("pe", pe); map.put("list", listVO); return ResultUtils.loadTrue(map); } catch (Exception e) { e.printStackTrace(); return ResultUtils.loadFalse("查询失败!"); } } @ResponseBody @RequestMapping(value = "save") public Result save(VipCenter t, HttpServletRequest request) { try { vipCenterService.saveManageWeb(t); return ResultUtils.loadTrue(); } catch (VipCenterException e) { return ResultUtils.loadFalse(e.getMsg()); } catch (Exception e) { e.printStackTrace(); return ResultUtils.loadFalse("保存失败!"); } } } app/src/main/resources/static/index.html
@@ -110,11 +110,11 @@ <i class="iconfont"></i> <cite>套餐管理</cite></a> </li> <!--<li> <a onclick="xadmin.add_tab('订单管理','/views/vip/order-list.html')"> <li> <a onclick="xadmin.add_tab('会员管理','/views/vip/vipCenter-list.html')"> <i class="iconfont"></i> <cite>订单管理</cite></a> </li>--> <cite>会员管理</cite></a> </li> </ul> </li> </ul> app/src/main/resources/static/views/vip/vipCenter-list.html
New file @@ -0,0 +1,258 @@ <!DOCTYPE html> <html class="x-admin-sm"> <head> <meta charset="UTF-8"> <title>特价管理系统</title> <meta name="renderer" content="webkit"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <meta name="viewport" content="width=device-width,user-scalable=yes, minimum-scale=0.4, initial-scale=0.8,target-densitydpi=low-dpi"/> <link rel="stylesheet" href="../../css/font.css"> <link rel="stylesheet" href="../../css/xadmin.css"> <script src="../../lib/layui/layui.js" charset="utf-8"></script> <link rel="stylesheet" href="../../css/theme3049.min.css"> <script type="text/javascript" src="../../js/vue.min.js" charset="utf-8"></script> <script type="text/javascript" src="../../js/xadmin.js"></script> <script type="text/javascript" src="../../js/http.js" charset="utf-8"></script> <script type="text/javascript" src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script> <!--[if lt IE 9]> <script src="https://cdn.staticfile.org/html5shiv/r29/html5.min.js"></script> <script src="https://cdn.staticfile.org/respond.js/1.4.2/respond.min.js"></script> <![endif]--> <style type="text/css"> .layui-table-view .layui-table th{ overflow:hidden; } .layui-table-view .layui-table { width: 100%; } </style> </head> <body> <div class="x-nav"> <span class="layui-breadcrumb"> <a href="">会员管理</a> <a> <cite>会员中心列表</cite></a> </span> <a class="layui-btn layui-btn-small" style="line-height:1.6em;margin-top:3px;float:right" onclick="location.reload()" title="刷新"> <i class="layui-icon layui-icon-refresh" style="line-height:30px"></i> </a> </div> <div class="layui-fluid"> <div class="layui-row layui-col-space15"> <div class="layui-col-md12"> <div class="layui-card"> <div class="layui-card-body "> <form class="layui-form layui-col-space5" id="searchForm"> <div class="layui-inline layui-show-xs-block"> <input class="layui-input" autocomplete="off" placeholder="开始日" name="start" id="start" :value="start"> </div> <div class="layui-inline layui-show-xs-block"> <input class="layui-input" autocomplete="off" placeholder="截止日" name="end" id="end" :value="end"></div> <div class="layui-inline layui-show-xs-block"> <input type="text" name="appname" placeholder="请输入应用名称" :value="key" autocomplete="off" class="layui-input"></div> <div class="layui-inline layui-show-xs-block"> <button class="layui-btn" lay-submit="" lay-filter="sreach"> <i class="layui-icon"></i></button> </div> </form> </div> <div class="layui-card-body "> <table class="layui-table" id="table_list" lay-filter="app"> </table> </div> </div> </div> </div> </div> </body> <script type="text/html" id="toolbar"> <div class="layui-btn-container"> <button class="layui-btn" onclick="xadmin.open('添加等级','grade-add.html',500,480)"><i class="layui-icon"></i>添加 </button> </div> </script> <script type="text/html" id="barAction"> <a class="layui-btn layui-btn-danger layui-btn-xs" onclick="member_del(this,{{d.LAY_INDEX }},{{d.gradeId}})" >删除</a> </script> <script> function member_del(obj, index, id) { layer.confirm('确认要删除吗?', function (index) { app.delete(obj, index, id); //发异步删除数据 }); } </script> <script type="text/html" id="gradeAction"> <a class="layui-btn layui-btn-danger layui-btn-xs" onclick="gradeAction({{d.uid}})" >删除</a> </script> <script> function gradeAction(obj, index, id) { layer.confirm('确认要删除吗?', function (index) { app.delete(obj, index, id); //发异步删除数据 }); } </script> <script type="text/html" id="dateFomat"> <div>{{layui.util.toDateString(d.updateTime, 'yyyy-MM-dd HH:mm:ss')}}</div> </script> <script type="text/html" id="switchTpl"> <input type="checkbox" name="sex" value="{{d.id}}" lay-skin="switch" lay-text="启用|停用" lay-filter="stateBox" {{ d.state== 1 ? 'checked': ''}} > </script> <script> layui.use('laydate', function () { var laydate = layui.laydate; //执行一个laydate实例 laydate.render({ elem: '#start' //指定元素 }); //执行一个laydate实例 laydate.render({ elem: '#end' //指定元素 }); }); </script> <script> var app = null; layui.use('table', function () { //搜索表单的vue赋值 app = new Vue({ el: "#searchForm", data: { key: '', start: '', end: '' }, methods: { delete: function (obj, index, id) { var ids = new Array(); ids.push(id); app.deleteList(ids, function () { $(obj).parents("tr").remove(); layer.msg('已删除!', {icon: 1, time: 1000}); }); }, deleteList: function (ids, success) { ksapp.post("/admin/api/vip/vipCenter/delete", {ids: JSON.stringify(ids)}, function (e) { if (e.code == 0) { success(); } else { layer.msg(e.msg); } }, function (e) { }); }, update: function (id, params) { params.id = id; ksapp.post("/admin/api/vip/vipCenter/modify", params, function (e) { if (e.code == 0) { layer.msg("修改成功"); } else layer.msg(e.msg); }, function (e) { }); } } }); app.key = ksapp.getQueryParam("appname") != null ? ksapp.getQueryParam("appname") : ''; app.start = ksapp.getQueryParam("start"); app.end = ksapp.getQueryParam("end"); var table = layui.table; var url = "/admin/api/vip/vipCenter/listByPage?page=1&pageSize=20&key=" + encodeURIComponent(app.key) + "&startDate=" + app.start + "&endDate=" + app.end; table.render({ elem: '#table_list', url: url, toolbar: "#toolbar", totalRow: true, cols: [ [{type: 'checkbox', title: "ID"}, {field: 'uid', width: 80, sort: true, title: "用户ID"}, {field: 'userName', edit: 'text', width: 150, title: "用户名称"}, {field: 'gradeName', edit: 'text', width: 150, title: "对应等级", templet:"#gradeAction"}, {field: 'startTime',edit: 'text', width: 120, sort: true, title: "开始时间"}, {field: 'endTime', edit: 'text', width: 150, title: "结束时间"}, {field: 'updateTime', sort: true, width: 150, title: "修改时间", templet:"#dateFomat"}, {fixed: 'right', width: 250, title: "操作", toolbar: '#barAction'}, ] ], page: true, parseData: function (res) { //res 即为原始返回的数据 return { "code": res.code, //解析接口状态 "msg": res.msg, //解析提示文本 "count": res.data.pe.totalCount, //解析数据长度 "data": res.data.list //解析数据列表 }; } //,…… //其他参数 }); //监听单元格编辑 table.on('edit(app)', function (obj) { var value = obj.value, //得到修改后的值 data = obj.data, //得到所在行所有键值 field = obj.field; //得到字段 //修改接口 var params = {id: data.id}; params[field] = value; app.update(data.id, params); }); //头工具栏事件 table.on('toolbar(app)', function (obj) { var checkStatus = table.checkStatus(obj.config.id); switch (obj.event) { case 'delete': var data = checkStatus.data; if (data == null || data.length == 0) { layer.msg("未选择选项"); return; } app.deleteList(); break; }; }); //监听状态操作 layui.form.on('switch(stateBox)', function(obj){ var state = 0; if (obj.elem.checked) { state = 1; } var params = {id: this.value, state: state}; app.update(this.value, params); }); });</script> </html> facade-vip/src/main/java/com/ks/vip/exception/VipCenterException.java
New file @@ -0,0 +1,19 @@ package com.ks.vip.exception; import com.ks.lib.common.exception.BaseException; public class VipCenterException extends BaseException { public VipCenterException(int code, String msg) { super(code, msg); } public VipCenterException() { super(); } @Override public synchronized Throwable fillInStackTrace() { return this; } } facade-vip/src/main/java/com/ks/vip/pojo/VO/VipCenterVO.java
New file @@ -0,0 +1,39 @@ package com.ks.vip.pojo.VO; import com.ks.vip.pojo.DO.VipCenter; public class VipCenterVO extends VipCenter { // 用户名 private String userName; // 等级名称 private String gradeName; // 等级状态 private String statedesc; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getGradeName() { return gradeName; } public void setGradeName(String gradeName) { this.gradeName = gradeName; } public String getStatedesc() { return statedesc; } public void setStatedesc(String statedesc) { this.statedesc = statedesc; } } facade-vip/src/main/java/com/ks/vip/service/VipCenterService.java
@@ -1,6 +1,7 @@ package com.ks.vip.service; import com.ks.vip.exception.VipCenterException; import com.ks.vip.pojo.DO.VipCenter; import com.ks.vip.pojo.DO.VipCombo; import com.ks.vip.pojo.DO.VipGrade; @@ -71,5 +72,10 @@ */ public VIPEnum getVIPEnumByUid(String uid, Date date); /** * 后台保存会员信息 * @param t * @throws VipCenterException */ public void saveManageWeb(VipCenter t) throws VipCenterException; } pom.xml
@@ -9,12 +9,14 @@ <module>service-vip</module> <module>app</module> </modules> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.5.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.ks</groupId> <artifactId>tejia</artifactId> <version>0.0.1-SNAPSHOT</version> service-lijin/pom.xml
@@ -170,6 +170,8 @@ <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.4.1</version> </plugin> <!-- MyBatis插件 --> <!--<plugin>--> service-vip/pom.xml
@@ -177,7 +177,6 @@ <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> service-vip/src/main/java/com/ks/vip/service/remote/VipCenterServiceImpl.java
@@ -1,6 +1,7 @@ package com.ks.vip.service.remote; import com.ks.vip.exception.VipCenterException; import com.ks.vip.mapper.VipCenterMapper; import com.ks.vip.mapper.VipCenterRecordMapper; import com.ks.vip.mapper.VipComboMapper; @@ -12,6 +13,7 @@ import org.apache.dubbo.config.annotation.Service; import org.springframework.transaction.annotation.Transactional; import org.yeshi.utils.DateUtil; import org.yeshi.utils.StringUtil; import javax.annotation.Resource; import java.util.Date; @@ -186,4 +188,45 @@ } return vipGradeService.selectByPrimaryKey(list.get(0).getGradeId()).getIdentity(); } @Override @Transactional(rollbackFor = Exception.class) public void saveManageWeb(VipCenter t) throws VipCenterException { if (t== null || StringUtil.isNullOrEmpty(t.getUid())) { throw new VipCenterException(1, "用户ID不存在"); } if (t.getGradeId() == null) { throw new VipCenterException(1, "请选择用户等级"); } if (t.getStartTime() == null) { throw new VipCenterException(1, "请选择开始时间"); } if (t.getEndTime() == null) { throw new VipCenterException(1, "请选择结束时间"); } VipCenter vipCenter = vipCenterMapper.selectForUpdate(t.getUid()); if (vipCenter == null) { t.setCreateTime(new Date()); vipCenterMapper.insertSelective(t); } else { t.setUpdateTime(new Date()); vipCenterMapper.updateByPrimaryKeySelective(t); } // 保存记录 VipCenterRecord record = new VipCenterRecord(); record.setStartTime(t.getStartTime()); record.setEndTime(t.getEndTime()); record.setUid(t.getUid()); record.setGradeId(t.getGradeId()); record.setCreateTime(new Date()); vipCenterRecordService.insertSelective(record); } }