package cn.dreampie.function.user; import cn.dreampie.common.config.AppConstants; import cn.dreampie.common.ehcache.CacheNameRemove; import cn.dreampie.common.plugin.shiro.hasher.Hasher; import cn.dreampie.common.plugin.shiro.hasher.HasherInfo; import cn.dreampie.common.plugin.shiro.hasher.HasherUtils; import cn.dreampie.common.utils.SortUtils; import cn.dreampie.common.utils.SubjectUtils; import cn.dreampie.common.utils.ValidateUtils; import cn.dreampie.common.utils.tree.TreeUtils; import cn.dreampie.common.web.controller.Controller; import cn.dreampie.function.common.State; import com.google.common.collect.Lists; import com.jfinal.aop.Before; import com.jfinal.plugin.activerecord.Page; import com.jfinal.plugin.activerecord.tx.Tx; import com.jfinal.plugin.ehcache.CacheName; import org.apache.commons.lang3.StringUtils; import java.util.Date; import java.util.List; import java.util.Map; /** * Created by wangrenhui on 14-1-3. */ public class AdminController extends Controller { public void index() { dynaRender("/view/admin/index.ftl"); } @CacheName(AppConstants.DEFAULT_CACHENAME) public void user() { User user = SubjectUtils.me().getUser(); keepPara("user_search"); //查询当前用户的角色 UserRole userRole = UserRole.dao.findFirstBy("`userRole`.user_id=" + user.get("id")); //当前用户的子集角色 List<Role> roles = Role.dao.findChildrenById("`role`.deleted_at is null", userRole.get("role_id")); String roleIds = ""; if (roles != null) { int size = roles.size(); int i = 0; for (Role role : roles) { roleIds += role.get("id"); if (i < size - 1) { roleIds += ","; } i++; } } //只能查询当前用户以下的角色 String where = " `user`.id <> " + user.get("id") + " AND `userRole`.role_id in (" + roleIds + ")"; String user_search = getPara("user_search"); if (!ValidateUtils.me().isNullOrEmpty(user_search)) { where += " AND (INSTR(`user`.username,'" + user_search + "')>0 OR INSTR(`user`.full_name,'" + user_search + "')>0 " + "OR INSTR(`user`.mobile,'" + user_search + "')>0 OR INSTR(`province`.name,'" + user_search + "')>0 " + "OR INSTR(`city`.name,'" + user_search + "')>0 OR INSTR(`county`.name,'" + user_search + "')>0 " + "OR INSTR(`userInfo`.street,'" + user_search + "')>0 OR INSTR(`userInfo`.zip_code,'" + user_search + "')>0 " + "OR INSTR(`user`.created_at,'" + user_search + "')>0 OR INSTR(`user`.email,'" + user_search + "')>0) "; } // String start_at = getPara("start_at"); // if (ValidateUtils.me().isDateTime(start_at)) { // where += " AND `user`.created_at >= '" + start_at + "'"; // } // // String end_at = getPara("end_time"); // if (ValidateUtils.me().isDateTime(end_at)) { // where += " AND `user`.created_at <= '" + end_at + "'"; // } // // Boolean deleted = getParaToBoolean("deleted"); // if (!ValidateUtils.me().isNullOrEmpty(deleted) && deleted) { // where += " AND `user`.deleted_at is not null"; // } else { // where += " AND `user`.deleted_at is null"; // } Page<User> users = User.dao.paginateInfoBy(getParaToInt(0, 1), getParaToInt("pageSize", 15), where); Map userGroup = SortUtils.me().sort(users.getList(), "last_name"); setAttr("roles", roles); setAttr("users", users); setAttr("userGroup", userGroup); setAttr("userStates", State.dao.findBy("`state`.type='user.state'")); dynaRender("/view/admin/user.ftl"); } @CacheNameRemove(name = AppConstants.DEFAULT_CACHENAME) @Before({AdminValidator.deleteUserValidator.class, Tx.class}) public void deleteUser() { keepModel(User.class); User user = getModel(User.class); if (user.getDate("deleted_at") != null) { user.set("deleted_at", new Date()); } else { user.set("deleted_at", null); } if (user.update()) setAttr("state", "success"); else setAttr("state", "failure"); dynaRender("/view/admin/user.ftl"); } @CacheNameRemove(name = AppConstants.DEFAULT_CACHENAME) @Before({AdminValidator.UpdateRoleValidator.class, Tx.class}) public void updateRole() { keepModel(UserRole.class); UserRole userRole = getModel(UserRole.class); boolean result = true; List<UserRole> aroles = UserRole.dao.findBy("`userRole`.user_id=" + userRole.get("user_id")); boolean mustAdd = true; if (!ValidateUtils.me().isNullOrEmpty(aroles)) { //delete for (UserRole ar : aroles) { if (ar.get("role_id") != userRole.get("role_id")) { ar.delete(); } else { mustAdd = false; } } } //add if (mustAdd) { result = result && userRole.save(); } if (result) setAttr("state", "success"); else setAttr("state", "failure"); dynaRender("/view/admin/user.ftl"); } @CacheNameRemove(name = AppConstants.DEFAULT_CACHENAME) @Before({AdminValidator.UpdatePwdValidator.class, Tx.class}) public void updatePwd() { keepModel(User.class); User user = getModel(User.class); HasherInfo passwordInfo = HasherUtils.me().hash(user.getStr("password"), Hasher.DEFAULT); user.set("password", passwordInfo.getHashResult()); user.set("hasher", passwordInfo.getHasher().value()); user.set("salt", passwordInfo.getSalt()); if (user.update()) { setAttr("state", "success"); } else setAttr("state", "failure"); dynaRender("/view/admin/user.ftl"); } @CacheName(AppConstants.DEFAULT_CACHENAME) public void role() { User user = SubjectUtils.me().getUser(); keepPara("user_search"); //查询当前用户的角色 UserRole userRole = UserRole.dao.findFirstBy("`userRole`.user_id=" + user.get("id")); //当前用户的子集角色 List<Role> roles = Role.dao.findChildrenById("`role`.deleted_at is null", userRole.get("role_id")); roles.add(0, user.getRole()); if (!ValidateUtils.me().isNullOrEmpty(roles)) setAttr("role", user.getRole()); List<Permission> authories = Permission.dao.findBy("`permission`.deleted_at is NULL"); setAttr("rolestree", TreeUtils.toTree(roles)); setAttr("permissionestree", TreeUtils.toTreeLevel(authories, 2)); dynaRender("/view/admin/role.ftl"); } @CacheName(AppConstants.DEFAULT_CACHENAME) public void permIds() { Integer roleId = getParaToInt("role.id"); if (roleId > 0) { List<String> permIds = RolePermission.dao.findPermissionIds("`rolePermission`.role_id=" + roleId); setAttr("permIds", permIds); } dynaRender("/view/admin/role.ftl"); } @CacheNameRemove(name = AppConstants.DEFAULT_CACHENAME) @Before({AdminValidator.RoleSaveValidator.class, Tx.class}) public void roleSave() { Role role = getModel(Role.class); Role parent = null; if (role.getParentId() == 0) { parent = Role.dao.findFirstBy("`role`.pid=0 ORDER BY `role`.right_code DESC"); } else parent = Role.dao.findById(role.getParentId()); boolean result = false; if (!ValidateUtils.me().isNullOrEmpty(parent)) { Role.dao.updateBy("`role`.left_code=`role`.left_code+2", "`role`.left_code>=" + parent.get("right_code")); Role.dao.updateBy("`role`.right_code=`role`.right_code+2", "`role`.right_code>=" + parent.get("right_code")); role.set("left_code", parent.getLong("right_code")); role.set("right_code", parent.getLong("right_code") + 1); role.set("created_at", new Date()); if (ValidateUtils.me().isNullOrEmpty(role.get("id"))) { role.remove("id"); } result = role.save(); } if (result) { setAttr("state", "success"); } else { setAttr("state", "failure"); } dynaRender("/view/admin/role.ftl"); } @CacheNameRemove(name = AppConstants.DEFAULT_CACHENAME) @Before({AdminValidator.RoleUpdateValidator.class, Tx.class}) public void roleUpdate() { Role role = getModel(Role.class); if (ValidateUtils.me().isNullOrEmpty(role.get("pid"))) { role.remove("pid"); } role.set("updated_at", new Date()); if (role.update()) { setAttr("state", "success"); } else { setAttr("state", "failure"); } dynaRender("/view/admin/role.ftl"); } @CacheNameRemove(name = AppConstants.DEFAULT_CACHENAME) @Before({AdminValidator.RoleDeleteValidator.class, Tx.class}) public void roleDrop() { Integer id = getParaToInt("role.id"); Role role = Role.dao.findById(id); boolean result = false; if (!ValidateUtils.me().isNullOrEmpty(role)) { Role.dao.updateBy("`role`.left_code=`role`.left_code-2", "`role`.left_code>=" + role.get("left_code")); Role.dao.updateBy("`role`.right_code=`role`.right_code-2", "`role`.right_code>=" + role.get("right_code")); result = role.delete(); if (result) { RolePermission.dao.dropBy("role_id=" + role.get("id")); } } if (result) { setAttr("state", "success"); } else { setAttr("state", "failure"); } dynaRender("/view/admin/role.ftl"); } @CacheNameRemove(name = AppConstants.DEFAULT_CACHENAME) @Before({AdminValidator.PermSaveValidator.class, Tx.class}) public void permSave() { Permission permission = getModel(Permission.class); Permission parent = null; if (permission.getParentId() == 0) { parent = Permission.dao.findFirstBy("`permission`.pid=0 ORDER BY `permission`.right_code DESC"); } else parent = Permission.dao.findById(permission.getParentId()); boolean result = false; if (!ValidateUtils.me().isNullOrEmpty(parent)) { Permission.dao.updateBy("`permission`.left_code=`permission`.left_code+2", "`permission`.left_code>=" + parent.get("right_code")); Permission.dao.updateBy("`permission`.right_code=`permission`.right_code+2", "`permission`.right_code>=" + parent.get("right_code")); permission.set("left_code", parent.getLong("right_code")); permission.set("right_code", parent.getLong("right_code") + 1); permission.set("created_at", new Date()); if (ValidateUtils.me().isNullOrEmpty(permission.get("id"))) { permission.remove("id"); } result = permission.save(); } if (result) { Role admin = Role.dao.findFirstBy("`role`.pid=0"); admin.addPermission(permission); setAttr("state", "success"); } else { setAttr("state", "failure"); } dynaRender("/view/admin/role.ftl"); } @CacheNameRemove(name = AppConstants.DEFAULT_CACHENAME) @Before({AdminValidator.PermUpdateValidator.class, Tx.class}) public void permUpdate() { Permission permission = getModel(Permission.class); if (ValidateUtils.me().isNullOrEmpty(permission.get("pid"))) { permission.remove("pid"); } permission.set("updated_at", new Date()); if (permission.update()) { setAttr("state", "success"); } else { setAttr("state", "failure"); } dynaRender("/view/admin/role.ftl"); } @CacheNameRemove(name = AppConstants.DEFAULT_CACHENAME) @Before({AdminValidator.PermDeleteValidator.class, Tx.class}) public void permDrop() { Integer id = getParaToInt("permission.id"); Permission permission = Permission.dao.findById(id); boolean result = false; if (!ValidateUtils.me().isNullOrEmpty(permission)) { Permission.dao.updateBy("`permission`.left_code=`permission`.left_code-2", "`permission`.left_code>=" + permission.get("left_code")); Permission.dao.updateBy("`permission`.right_code=`permission`.right_code-2", "`permission`.right_code>=" + permission.get("right_code")); result = permission.delete(); if (result) { RolePermission.dao.dropBy("permission_id=" + permission.get("id")); } } if (result) { setAttr("state", "success"); } else { setAttr("state", "failure"); } dynaRender("/view/admin/role.ftl"); } @CacheNameRemove(name = AppConstants.DEFAULT_CACHENAME) @Before({AdminValidator.RolePermsValidator.class, Tx.class}) public void permsAdd() { String[] idsPara = getParaValues("permission.id"); Integer roleId = getParaToInt("role.id"); //需要添加的权限 List<String> ids = Lists.newArrayList(idsPara); //已存在的权限 List<String> permIds = RolePermission.dao.findPermissionIds("`rolePermission`.role_id=" + roleId); Integer id = null; //移除重复id for (int i = 0; i < ids.size(); i++) { id = new Integer(ids.get(i)); if (permIds.contains(id)) { permIds.remove(id); ids.remove(i); i--; } } boolean result = true; //添加关系 RolePermission rolePermission = null; for (int i = 0; i < ids.size(); i++) { rolePermission = new RolePermission(); rolePermission.set("role_id", roleId); rolePermission.set("permission_id", ids.get(i)); result = result && rolePermission.save(); } //删除关系 for (int i = 0; i < permIds.size(); i++) { result = result && RolePermission.dao.dropBy("role_id = ? AND permission_id = ?", roleId, permIds.get(i)); } if (result) { setAttr("state", "success"); } else { setAttr("state", "failure"); } dynaRender("/view/admin/role.ftl"); } }