Forráskód Böngészése

新增app用户管理

lishuwen79 6 éve
szülő
commit
6a4b5d4254

+ 77 - 0
src/main/java/com/lsw/controller/admin/work/news_column/ColumnController.java

@@ -0,0 +1,77 @@
+package com.lsw.controller.admin.work.news_column;
+
+import com.jfinal.aop.Before;
+import com.jfinal.plugin.activerecord.Db;
+import com.jfinal.plugin.activerecord.Page;
+import com.jfinal.plugin.activerecord.tx.Tx;
+import com.lsw.base.BaseController;
+import com.lsw.model.work.NewsColumn;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+
+import java.util.Date;
+
+public class ColumnController extends BaseController {
+
+    /**
+     * 列表
+     */
+    @RequiresPermissions("column:list")
+    public void list() {
+        render("list.html");
+    }
+
+    public void jsonList() {
+        Page<NewsColumn> pgaeList = NewsColumn.dao.jsonList(getPage(), getRows(), getPara("name"),getPara("mType"),getPara("sidx","mView"), getSord());
+        renderJson(getPage(pgaeList));
+    }
+
+    /**
+     * 视图页面
+     */
+    public void view() {
+        String op = getPara("op");
+        if (op.equals("edit")) {
+            NewsColumn column = NewsColumn.dao.findById(getPara("id"));
+            setAttr("column", column);
+        }
+        setAttr("op", op);
+        render("form.html");
+    }
+
+    /**
+     * 录入
+     */
+    @RequiresPermissions("column:add")
+    @Before(ColumnValidator.class)
+    public void add() {
+        NewsColumn column = getModel(NewsColumn.class, "", true);
+        column.setMDate(new Date());
+        column.save();
+        renderSuccess();
+    }
+
+
+    /**
+     * 编辑
+     */
+    @RequiresPermissions("column:edit")
+    @Before(ColumnValidator.class)
+    public void edit() {
+        NewsColumn column = getModel(NewsColumn.class, "", true);
+        column.update();
+        renderSuccess();
+    }
+
+    /**
+     * 删除
+     */
+    @RequiresPermissions("column:delete")
+    @Before(Tx.class)
+    public void delete() {
+        String ids = getPara("ids");
+        Db.update("delete from tb_news_column where id in(" + ids + ")");
+        renderSuccess();
+    }
+
+
+}

+ 12 - 0
src/main/java/com/lsw/controller/admin/work/news_column/ColumnValidator.java

@@ -0,0 +1,12 @@
+package com.lsw.controller.admin.work.news_column;
+
+import com.jfinal.core.Controller;
+import com.lsw.base.BaseValidator;
+
+public class ColumnValidator extends BaseValidator {
+
+    @Override
+    protected void validate(Controller c) {
+        validateRequiredString("mColumnName", "msg", "栏目名称不能为空");
+    }
+}

+ 82 - 0
src/main/java/com/lsw/controller/admin/work/user/UserController.java

@@ -0,0 +1,82 @@
+package com.lsw.controller.admin.work.user;
+
+import com.jfinal.plugin.activerecord.Db;
+import com.jfinal.plugin.activerecord.Page;
+import com.jfinal.plugin.ehcache.CacheKit;
+import com.lsw.base.BaseController;
+import com.lsw.commons.utils.Constant;
+import com.lsw.model.work.User;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+
+/**
+ * @author 李书文
+ * @description app用户管理
+ * @time 2017-8-23
+ */
+public class UserController extends BaseController {
+
+    /**
+     * 管理页面
+     */
+    @RequiresPermissions("appuser:list")
+    public void list() {
+        setAttr("typeId", getParaToInt(0, 1));
+        render("list.html");
+    }
+
+    /**
+     * 新闻json数据
+     */
+    public void jsonList() {
+        Page<User> pgaeList = User.dao.jsonList(getPage(), getRows(), getPara("field"),getPara("name"), getMinTime(), getMaxTime(), getSidx(), getSord());
+        renderJson(getPage(pgaeList));
+    }
+    /**
+     * 视图页面
+     */
+    public void view() {
+        User app = User.dao.findById(getPara("id"));
+        setAttr("app", app);
+        render("form.html");
+    }
+
+    /**
+     * 删除新闻
+     */
+    @RequiresPermissions("appuser:delete")
+    public void delete() {
+        String ids = getPara("ids");
+        int row = Db.update("delete from tb_user where id in(" + ids + ")");
+        if (row > 0) {
+            renderSuccess();
+        } else {
+            renderError("删除失败");
+        }
+    }
+    /**
+     * 锁定用户
+     */
+    @RequiresPermissions("appuser:lock")
+    public void lock(){
+        User user=new User();
+        user.setId(getParaToInt("id"));
+        user.setMSate(1);
+        user.update();
+        //更新用户登录缓存
+        CacheKit.remove(Constant.token,getPara("account"));
+        renderSuccess();
+    }
+    /**
+     * 启用用户
+     */
+    @RequiresPermissions("appuser:enable")
+    public void enable(){
+        User user=new User();
+        user.setId(getParaToInt("id"));
+        user.setMSate(0);
+        user.update();
+        //更新用户登录缓存
+        CacheKit.remove(Constant.token,getPara("account"));
+        renderSuccess();
+    }
+}

+ 28 - 0
src/main/java/com/lsw/model/work/User.java

@@ -0,0 +1,28 @@
+package com.lsw.model.work;
+
+import com.jfinal.kit.StrKit;
+import com.jfinal.plugin.activerecord.Page;
+import com.lsw.model.work.base.BaseUser;
+
+/**
+ * Generated by JFinal.
+ */
+@SuppressWarnings("serial")
+public class User extends BaseUser<User> {
+    public static final User dao = new User().dao();
+
+    public Page<User> jsonList(int page, int row, String field, String value,String min, String max, String sidx, String sord) {
+        String select = "SELECT *";
+        StringBuilder sb = new StringBuilder();
+        sb.append(" FROM tb_user u");
+        sb.append(" WHERE 1=1");
+        if (StrKit.notBlank(field)) {
+            sb.append(" AND u." + field + " LIKE '%" + value + "%'");
+        }
+        if (StrKit.notBlank(min)) {
+            sb.append(" AND u.mTime BETWEEN '" + min + "' AND '" + max + "'");
+        }
+        sb.append(" ORDER BY u." + sidx + " " + sord);
+        return dao.paginate(page, row, select, sb.toString());
+    }
+}

+ 1 - 0
src/main/java/com/lsw/model/work/_MappingKit.java

@@ -21,6 +21,7 @@ public class _MappingKit {
 		arp.addMapping("tb_news_column", "id", NewsColumn.class);
 		arp.addMapping("tb_position", "id", Position.class);
 		arp.addMapping("tb_token", "id", Token.class);
+		arp.addMapping("tb_user", "id", User.class);
 	}
 }
 

+ 116 - 0
src/main/java/com/lsw/model/work/base/BaseUser.java

@@ -0,0 +1,116 @@
+package com.lsw.model.work.base;
+
+import com.jfinal.plugin.activerecord.Model;
+import com.jfinal.plugin.activerecord.IBean;
+
+/**
+ * Generated by JFinal, do not modify this file.
+ */
+@SuppressWarnings("serial")
+public abstract class BaseUser<M extends BaseUser<M>> extends Model<M> implements IBean {
+
+	public void setId(java.lang.Integer id) {
+		set("id", id);
+	}
+
+	public java.lang.Integer getId() {
+		return getInt("id");
+	}
+
+	public void setAccount(java.lang.String account) {
+		set("account", account);
+	}
+
+	public java.lang.String getAccount() {
+		return getStr("account");
+	}
+
+	public void setPassword(java.lang.String password) {
+		set("password", password);
+	}
+
+	public java.lang.String getPassword() {
+		return getStr("password");
+	}
+
+	public void setHeader(java.lang.String header) {
+		set("header", header);
+	}
+
+	public java.lang.String getHeader() {
+		return getStr("header");
+	}
+
+	public void setSalt(java.lang.String salt) {
+		set("salt", salt);
+	}
+
+	public java.lang.String getSalt() {
+		return getStr("salt");
+	}
+
+	public void setNickName(java.lang.String nickName) {
+		set("nickName", nickName);
+	}
+
+	public java.lang.String getNickName() {
+		return getStr("nickName");
+	}
+
+	public void setAddress(java.lang.String address) {
+		set("address", address);
+	}
+
+	public java.lang.String getAddress() {
+		return getStr("address");
+	}
+
+	public void setEmail(java.lang.String email) {
+		set("email", email);
+	}
+
+	public java.lang.String getEmail() {
+		return getStr("email");
+	}
+
+	public void setCompany(java.lang.String company) {
+		set("company", company);
+	}
+
+	public java.lang.String getCompany() {
+		return getStr("company");
+	}
+
+	public void setPhone(java.lang.String phone) {
+		set("phone", phone);
+	}
+
+	public java.lang.String getPhone() {
+		return getStr("phone");
+	}
+
+	public void setMType(java.lang.Integer mType) {
+		set("mType", mType);
+	}
+
+	public java.lang.Integer getMType() {
+		return getInt("mType");
+	}
+
+	public void setMSate(java.lang.Integer mSate) {
+		set("mSate", mSate);
+	}
+
+	public java.lang.Integer getMSate() {
+		return getInt("mSate");
+	}
+
+	public void setMTime(java.util.Date mTime) {
+		set("mTime", mTime);
+	}
+
+	public java.util.Date getMTime() {
+		return get("mTime");
+	}
+
+}

+ 1 - 0
src/main/java/com/lsw/route/AdminRoute.java

@@ -44,6 +44,7 @@ public class AdminRoute extends Routes {
         add("/admin/work/column", ColumnController.class, "/work/news_column/"); // 新闻栏目管理
         add("/admin/work/position",PositionController.class, "/work/position/"); // 职位管理
         add("/admin/work/news",NewsController.class, "/work/news/"); // 新闻管理
+        add("/admin/work/user", com.lsw.controller.admin.work.user.UserController.class, "/work/user/"); // app用户管理
     }
 
 }

+ 19 - 14
src/main/webapp/WEB-INF/view/admin/work/news/form.html

@@ -15,34 +15,38 @@
         <table class="table">
             <tbody>
             <tr>
-                <td width="150">文章标题 <span>*</span></td>
-                <td colspan="3">
-                    <input type="text" class="form-control" v-model="item.mTitle">
+                <td class="l" width="150">文章标题 <span>*</span></td>
+                <td>
+                    <input type="text" class="form-control" v-model="item.mTitle" placeholder="输入文章标题">
+                </td>
+                <td class="l">发布时间 <span>*</span></td>
+                <td>
+                    <input type="date" class="form-control" placeholder="输入文章标题">
                 </td>
             </tr>
             <tr>
-                <td width="150">文章类型 <span>*</span></td>
+                <td class="l">文章类型 <span>*</span></td>
                 <td>
                     <select class="form-control"  v-model="item.typeName" @change="selected()">
                         <option :value="type.id"  v-for="type in type_list">{{type.name}}</option>
                     </select>
                 </td>
-                <td width="150">文章栏目 <span>*</span></td>
+                <td class="l">文章栏目 <span>*</span></td>
                 <td>
                     <select class="form-control" v-model="item.columnId">
                         <option :value="colmun.id" v-for="colmun in colmun_list">{{colmun.mColumnName}}</option>
                     </select>
                 </td>
             </tr>
-            <tr>
+            <!--<tr>
                 <td width="150">文章封面</td>
                 <td colspan="3" style="overflow: hidden;">
                     <img class="img" alt="添加封面" :src="mCove==''?'#(path)/static/ui/img/icon_p.png':mCove">
                     <input type="file" accept="image/*" accept='image/*' v-on:change="change($event,0)" style="margin-top:-128px;width:70%;margin-left: -30px;">
                 </td>
-            </tr>
+            </tr>-->
             <tr>
-                <td>文章置顶</td>
+                <td class="l">文章状态 <span>*</span></td>
                 <td>
                     <el-switch
                             v-model="item.isTop"
@@ -50,16 +54,17 @@
                             inactive-color="#ff4949">
                     </el-switch>
                 </td>
-                <td width="150">文章状态 <span>*</span></td>
+                <td class="l">文章置顶</td>
                 <td>
-                    <select class="form-control" v-model="item.mRelease">
-                        <option value="0">发布</option>
-                        <option value="1">不发布</option>
-                    </select>
+                    <el-switch
+                            v-model="item.isTop"
+                            active-color="#13ce66"
+                            inactive-color="#ff4949">
+                    </el-switch>
                 </td>
             </tr>
             <tr>
-                <td style="vertical-align: top;">文章内容 <span>*</span></td>
+                <td class="l" style="vertical-align: top;">文章内容 <span>*</span></td>
                 <td colspan="3"><script id="editor" type="text/plain"  style="width:100%;height:280px;text-align: left">{{item.mContent}}</script></td>
             </tr>
             </tbody>

+ 63 - 26
src/main/webapp/WEB-INF/view/admin/work/news/list.html

@@ -1,49 +1,55 @@
 #set(title="新闻管理")
 #@header()
 <style>
-    .flex{width: 200px;cursor: pointer;}
-    .flex .l{padding: 10px 20px 10px 20px;font-size: 15px;font-weight: bold;position: relative;}
-    .flex .l.active{border-bottom: 3px solid darkcyan;color:darkcyan}
-    .badge-danger{position:absolute;right:0;top:0;}
+    .input-text{width: 120px!important;}
+    .toolbar .search{width: 500px;}
 </style>
 <body>
 <div class="con">
-    <div class="toolbar">
+    <form class="form-inline toolbar">
         <!--权限操作按钮-->
         #@menu(menu_list)
-        <div class="input-group search">
+        <input type="text" class="form-control input-text Wdate" placeholder="开始日期"
+               onfocus="WdatePicker({maxDate:'#F{$dp.$D(\'max\')||\'%y-%M-%d\'}'})" id="min">
+        -
+        <input type="text" class="form-control input-text Wdate" placeholder="结束日期"
+               onfocus="WdatePicker({minDate:'#F{$dp.$D(\'min\')}',maxDate:'%y-%M-%d'})" id="max">
+        <div class="input-group search"  id="app">
             <div class="input-group-btn">
-                <!--查询条件-->
-                <select class="form-control select" id="mType">
+                <!--文章类型-->
+                <select class="form-control select" v-model="type" @change="selected(1)">
+                    <option :value="type.id"  v-for="type in type_list">{{type.name}}</option>
+                </select>
+            </div>
+            <div class="input-group-btn">
+                <!--文章栏目-->
+                <select class="form-control select" v-model="colmunId" @change="selected(2)">
                     <option value="">全部栏目</option>
-                    #for(column in column_list)
-                    <option value="1">#(column.mColumnName)</option>
-                    #end
+                    <option :value="colmun.id" v-for="colmun in colmun_list">{{colmun.mColumnName}}</option>
                 </select>
             </div>
-            <input type="text" id="name" placeholder="输入栏目名称名称" class="form-control">
-            <span class="input-group-btn"><button type="button" id="search" class="btn btn-primary">搜索</button></span>
+            <input type="text" id="name" placeholder="输入文章名称" class="form-control">
+            <span class="input-group-btn">
+                <button type="button" @click="search()" class="btn btn-primary">搜索</button>
+                <button type="reset" class="btn btn-default">重置</button>
+            </span>
         </div>
         <a class="pull-right refresh" href="javascript:location.replace(location.href);"><i class="fa fa-history"></i>&nbsp;刷新</a>
-    </div>
+    </form>
     <div class="mbox">
-        <div class="flex">
-            <div class="l active" onclick="selected(this,'时政信息')">时政信息 <span class="badge badge-danger">53</span></div>
-            <div class="l" onclick="selected(this,'政策宣传')">政策宣传 <span class="badge badge-danger">26</span></div>
-        </div>
         <table id="jqGrid"></table>
         <div id="jqGridPager"></div>
     </div>
 </div>
-#set(layer=true,util=true,jgrid=true)
+#set(layer=true,util=true,jgrid=true,vue=true,date=true)
 #@js()
 <script>
     var colModel=[
         { label: 'ID', name: 'id',hidden : true,frozen: true},
-        { label: '文章标题', name: 'mTitle',frozen: true,width:300},
+        { label: '文章标题', name: 'mTitle',frozen: true,width:330},
         { label: '文章栏目', name: 'mColumnName'},
         { label: '文章归类', name: 'typeName'},
-        { label: '文章状态', name: 'mRelease'},
+        { label: '文章状态', name: 'mRelease',formatter: mShow},
         { label: '是否置顶', name: 'isTop'},
         { label: '发布人', name: 'realName'},
         { label: '发布时间', name: 'mTime'},]
@@ -58,11 +64,6 @@
             return '<span class="label label-sm label-danger">不显示</span>';
         }
     }
-    function selected(e,typeName){
-        $(".l").removeClass("active");
-        $(e).addClass("active");
-        $("#jqGrid").jqGrid('setGridParam',{datatype:'json',postData:{type:typeName,name:'',columnId:'',mRelease:''},page:1}).trigger("reloadGrid");
-    }
     /**
      * 操作
      */
@@ -77,6 +78,42 @@
             deleteRows("#(path)/admin/work/news/delete?ids=");
         }
     }
+    var vm = new Vue({
+        el: "#app",
+        data: {
+            type:1,
+            type_list:[{name:'时政信息',id:1},{name:'政策宣传',id:2}],
+            colmun_list:[],
+            colmunId:''
+        },
+        mounted: function () {
+            this.getColmun(1);
+        },
+        methods: {
+            //选择栏目
+            selected:function(index){
+                if(index==1){
+                    this.getColmun(this.type);
+                    this.colmunId='';
+                    reloadGrid({type:this.type==1?'时政信息':'政策宣传',name:'',columnId:'',mRelease:''});
+                }
+                if(index==2){
+                    reloadGrid({columnId:this.colmunId,min:'',max:'',name:''});
+                }
+            },
+            //查询文章
+            search:function(){
+                reloadGrid({columnId:'',min: $("#min").val(),max: $("#max").val(),name: $("#name").val()});
+            },
+            //获取栏目
+            getColmun:function(e){
+                sendAjax("#(path)/admin/work/news/colmun_list",{type:e},function(res){
+                    vm.colmun_list=res;
+                    cancelLoding();
+                });
+            }
+        }
+    })
 </script>
 </body>
 </html>

+ 1 - 1
src/main/webapp/WEB-INF/view/admin/work/news_column/list.html

@@ -65,7 +65,7 @@
      * 选择
      */
     $("#mType").change(function(){
-        $("#jqGrid").jqGrid('setGridParam',{datatype:'json',postData:{mType:$("#mType").val()},page:1}).trigger("reloadGrid");
+        reloadGrid({mType:$("#mType").val()});
     });
     /**
      * 操作

+ 96 - 0
src/main/webapp/WEB-INF/view/admin/work/user/list.html

@@ -0,0 +1,96 @@
+#set(title="用户管理")
+#@header()
+<style>
+    .input-text{width: 120px!important;}
+</style>
+<body>
+<div class="con">
+    <form class="form-inline toolbar">
+        <!--权限操作按钮-->
+        #@menu(menu_list)
+        <input type="text" class="form-control input-text Wdate" placeholder="开始日期" onfocus="WdatePicker({maxDate:'#F{$dp.$D(\'max\')||\'%y-%M-%d\'}'})" id="min">
+        -
+        <input type="text" class="form-control input-text Wdate" placeholder="结束日期" onfocus="WdatePicker({minDate:'#F{$dp.$D(\'min\')}',maxDate:'%y-%M-%d'})" id="max">&nbsp;&nbsp;
+        <div class="input-group">
+            <div class="input-group-btn">
+                <!--查询条件-->
+                <select class="form-control m-b">
+                    <option value="account">账号</option>
+                    <option value="nickName">昵称</option>
+                </select>
+            </div>
+            <input type="text" class="form-control" id="name" placeholder="输入关键字">
+            <span class="input-group-btn">
+        <button type="button" id="search" class="btn btn-primary">搜索</button>
+        <button type="reset" class="btn btn-danger">重置</button>
+        </span>
+        </div>
+        <a class="pull-right refresh" href="javascript:location.replace(location.href);"><i class="fa fa-history"></i>&nbsp;刷新</a>
+    </form>
+        <div class="mbox">
+            <table id="jqGrid"></table>
+            <div id="jqGridPager"></div>
+        </div>
+</div>
+#set(layer=true,util=true,date=true,jgrid=true)
+#@js();
+<script>
+    var colModel = [
+        {label: 'ID', name: 'id', hidden: true,frozen: true},
+        {label: '头像', name: 'header', formatter: cover, width: 70,frozen: true},
+        {label: '账号', name: 'account',frozen: true},
+        {label: '昵称', name: 'nickName',frozen: true},
+        {label: '邮箱', name: 'email',width:230},
+        {label: '用户类型', name: 'mType', formatter: type},
+        {label: '状态', name: 'mSate', formatter: state},
+        {label: '注册时间', name: 'mTime'}];
+    jgrid('#(path)/admin/work/user/jsonList', colModel,{fixed: false, height: $('body').height() - 180});
+    /**
+     * 搜索
+     */
+    $("#search").click(function () {
+        reloadGrid({name: $("#name").val(), field: $("select").val(), min: $("#min").val(), max: $("#max").val()});
+    });
+    /**
+     * 头像显示显示
+     */
+    function cover(cellvalue, options, rowObject) {
+        return "<img class=img-circle style='width:45px;height:45px' src=#(path)" + cellvalue + ">";
+    }
+    /**
+     * 用户类型
+     */
+    function type(cellvalue, options, rowObject) {
+        return cellvalue == 0 ? '<span class="label badge-success">普通用户</span>' : '<span class="badge badge-warning">企业用户</span>'
+    }
+    /**
+     * 账号状态
+     */
+    function state(cellvalue, options, rowObject) {
+        return cellvalue == 0 ? '<span class="label label-info">正常</span>' : '<span class="label label-danger">锁定</span>'
+    }
+    /**
+     * 操作
+     */
+    function operate(op) {
+        if (op == 'lock') {
+            if(typeof(selectedRow())=='undefined'){return;}
+            layer.confirm('确定锁定该用户?', {icon: 3, btn: ['确认', '取消']}, function (index) {
+                ajaxSubmit("#(path)/admin/work/user/lock?id=" + selectedRow().id+"&account="+selectedRow().account);
+                layer.close(index);
+            });
+        }
+        if (op == 'enable') {
+            if(typeof(selectedRow())=='undefined'){return;}
+            layer.confirm('确定启用该用户?', {icon: 3, btn: ['确认', '取消']}, function (index) {
+                ajaxSubmit("#(path)/admin/work/user/enable?id=" + selectedRow().id+"&account="+selectedRow().account);
+                layer.close(index);
+            });
+        }
+        if (op == 'delete') {
+            deleteRows("#(path)/admin/work/user/delete?ids=");
+        }
+    }
+</script>
+</body>
+</html>

+ 33 - 0
src/main/webapp/WEB-INF/view/admin/work/user/look.html

@@ -0,0 +1,33 @@
+#set(title="日志查看")
+#@header()
+<body class="bg">
+<form id="addForm" method="post">
+    <table class="table table-bordered">
+        <tbody>
+        <tr>
+            <td class="l" width="150px">执行人</td>
+            <td>#(log.realName??'未知用户')</td>
+        </tr>
+        <tr>
+            <td class="l">ip信息</td>
+            <td>#(log.ip??)</td>
+        </tr>
+        <tr>
+            <td class="l">操作</td>
+            <td>#(log.operation??)</td>
+        </tr>
+        <tr>
+            <td class="l" width="150px">执行时间</td>
+            <td colspan="3">#(log.createDate??)</td>
+        </tr>
+        <tr>
+            <td class="l" style="vertical-align: top;">操作信息</td>
+            <td colspan="3">
+                <div>#(log.remark??)</div>
+            </td>
+        </tr>
+        </tbody>
+    </table>
+</form>
+</body>
+</html>

BIN
src/main/webapp/upload/images/header/ls.png