From ffa8ca9776d58340c492c114c2d1bba7f10fc8d3 Mon Sep 17 00:00:00 2001 From: hanbo <2608504783@qq.com> Date: Wed, 3 Nov 2021 17:17:33 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BA=BA=E5=91=98=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/backend/AccountController.java | 129 ++++++--- .../controller/backend/BaseController.java | 4 + src/main/java/cn/palmte/work/model/Admin.java | 113 ++++++-- .../work/model/AdminRepositoryImpl.java | 30 +- .../cn/palmte/work/model/UserPosition.java | 40 +++ .../work/model/UserPositionRepository.java | 7 + .../palmte/work/service/AccountService.java | 62 ++++- .../cn/palmte/work/utils/InterfaceUtil.java | 4 +- .../templates/admin/account_input.ftl | 256 +++++++++--------- .../templates/admin/account_list.ftl | 253 ++++++++++++----- 10 files changed, 626 insertions(+), 272 deletions(-) create mode 100644 src/main/java/cn/palmte/work/model/UserPosition.java create mode 100644 src/main/java/cn/palmte/work/model/UserPositionRepository.java diff --git a/src/main/java/cn/palmte/work/controller/backend/AccountController.java b/src/main/java/cn/palmte/work/controller/backend/AccountController.java index 7644cd7..78669a6 100644 --- a/src/main/java/cn/palmte/work/controller/backend/AccountController.java +++ b/src/main/java/cn/palmte/work/controller/backend/AccountController.java @@ -3,12 +3,22 @@ package cn.palmte.work.controller.backend; import cn.palmte.work.bean.ResponseMsg; import cn.palmte.work.config.Constant; import cn.palmte.work.model.Admin; +import cn.palmte.work.model.DeptRepository; +import cn.palmte.work.model.UserPositionRepository; import cn.palmte.work.pojo.ModifyPasswordRequest; import cn.palmte.work.service.AccountService; import cn.palmte.work.service.AdminService; import cn.palmte.work.service.SysRoleService; import cn.palmte.work.utils.InterfaceUtil; +import cn.palmte.work.utils.Utils; +import cn.palmte.work.utils.excel.ExcelLogs; +import cn.palmte.work.utils.excel.ExcelUtil; +import cn.palmte.work.utils.excel.ExportUtils; +import com.alibaba.fastjson.JSON; import org.apache.commons.lang.StringUtils; +import org.apache.poi.EncryptedDocumentException; +import org.apache.poi.openxml4j.exceptions.InvalidFormatException; +import org.apache.poi.poifs.filesystem.OfficeXmlFileException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -16,11 +26,14 @@ import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.multipart.MultipartFile; import top.jfunc.common.crypto.symmetric.DESAS; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; +import java.util.Collection; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -38,6 +51,12 @@ public class AccountController extends BaseController { @Autowired private SysRoleService sysRoleService; + @Autowired + private DeptRepository deptRepository; + + @Autowired + private UserPositionRepository userPositionRepository; + @RequestMapping(value = "/updatePassword") @ResponseBody public ResponseMsg updatePassword(HttpServletRequest request, ModifyPasswordRequest modifyPasswordRequest){ @@ -65,10 +84,40 @@ public class AccountController extends BaseController { setModel(keywords, model); ConcurrentHashMap<String, String> searchInfo = getSearchInfo(keywords, model); model.put("roleList", sysRoleService.getAllEnableSysRole()); + model.put("deptList", deptRepository.findAll()); + model.put("positionList", userPositionRepository.findAll()); model.put("pager", accountService.getAdminList(searchInfo, pageSize, pageNumber)); return "/admin/account_list"; } + /** + * 跳转到新增页面 + */ + @RequestMapping("/add") + public String add(HttpServletRequest request, Map<String, Object> model) { + genRSAKeyPair(request, model); + model.put("userId", -1); + model.put("account", new Admin()); + model.put("roleList", sysRoleService.getAllEnableSysRole()); + model.put("deptList", deptRepository.findAll()); + model.put("positionList", userPositionRepository.findAll()); + return "/admin/account_input"; + } + + /** + * 跳转编辑页面 + */ + @RequestMapping("/edit") + public String edit(@RequestParam("userId") int userId, Map<String, Object> model) { + Admin admin = accountService.findUserById(userId); + model.put("account", admin); + model.put("userId", userId); + model.put("roleList", sysRoleService.getAllEnableSysRole()); + model.put("deptList", deptRepository.findAll()); + model.put("positionList", userPositionRepository.findAll()); + return "/admin/account_input"; + } + /** * 保存或更新用户 */ @@ -97,19 +146,6 @@ public class AccountController extends BaseController { return "redirect:/account/list"; } - /** - * 跳转到新增页面 - */ - @RequestMapping("/add") - public String add(HttpServletRequest request, Map<String, Object> model) { - genRSAKeyPair(request, model); - model.put("userId", -1); - model.put("account", new Admin()); - //获取所有角色 - model.put("roleList", sysRoleService.getAllEnableSysRole()); - return "/admin/account_input"; - } - /** * 启用、禁用用户 */ @@ -123,26 +159,6 @@ public class AccountController extends BaseController { } } - /** - * 根据ID查询用户信息编辑 - */ - @RequestMapping("/edit") - public String edit(@RequestParam("userId") int userId, Map<String, Object> model) { - model.put("userId", userId); - Admin admin = accountService.findUserById(userId); - model.put("roleId", String.valueOf(admin.getRoleId())); - model.put("roleType", admin.getRoleType()); - model.put("roleLevel", admin.getRoleLevel()); - model.put("realName", admin.getRealName()); - model.put("userName", admin.getUserName()); - model.put("telephone", admin.getTelephone()); - model.put("regionId", admin.getRegionId()); - model.put("account", admin); - //获取所有角色 - model.put("roleList", sysRoleService.getAllEnableSysRole()); - return "/admin/account_input"; - } - /** * 根据删除用户 */ @@ -197,7 +213,6 @@ public class AccountController extends BaseController { model.put("SysUser", admin); genRSAKeyPair(request,model); return "/admin/account_password"; - } private void setModel(@RequestParam(value = "keywords", required = false) String keywords, Map<String, Object> model) { @@ -205,6 +220,52 @@ public class AccountController extends BaseController { model.put("keywords", keywords); } + /** + * 导出 + * @param keywords + * @param model + * @param response + * @throws IOException + */ + @RequestMapping("/export") + public void export(@RequestParam(value = "keywords",required = false) String keywords,Map<String, Object> model, + HttpServletResponse response) throws IOException { + // 初始化参数 + ConcurrentHashMap<String, String> searchInfo = getSearchInfo(keywords,model); + downloadHeader(response , Utils.generateExcelName("人员信息")); + accountService.exportExcel(response,searchInfo); + } + /** + * 模板下载 + */ + @RequestMapping("/template") + public void template(HttpServletResponse response) throws Exception{ + + String[] headers = new String[]{"工号", "手机号码", "姓名", "常驻地", "一级部门", "直接主管", "职位", "所属角色", "公司邮件地址"}; + downloadHeader(response , Utils.generateExcelName("人员信息批量导入模板")); + ExportUtils exportUtils = new ExportUtils(headers); + exportUtils.write(response.getOutputStream()); + } + + /** + * 批量导入 + */ + @RequestMapping("/batchImport") + @ResponseBody + public String batchImport(MultipartFile file) { + try { + ExcelLogs logs = new ExcelLogs(); + Collection<Map> maps = ExcelUtil.importExcel(Map.class, file.getInputStream(), + "yyyy/MM/dd HH:mm:ss", logs, 0); + synchronized (this) { + return JSON.toJSONString(accountService.check(maps)); + } + } catch (OfficeXmlFileException | EncryptedDocumentException | InvalidFormatException e) { + return JSON.toJSONString(ResponseMsg.buildFailedMsg("格式错误,请上传excel 2003/2007格式文件")); + } catch (Exception e) { + return JSON.toJSONString(ResponseMsg.buildFailedMsg("导入数据失败,请联系管理员")); + } + } } diff --git a/src/main/java/cn/palmte/work/controller/backend/BaseController.java b/src/main/java/cn/palmte/work/controller/backend/BaseController.java index 422db18..4d9accc 100644 --- a/src/main/java/cn/palmte/work/controller/backend/BaseController.java +++ b/src/main/java/cn/palmte/work/controller/backend/BaseController.java @@ -55,6 +55,10 @@ public class BaseController { return getRequest().getSession(); } + protected void downloadHeader(HttpServletResponse response, String fileName) { + downloadHeader(response, fileName, "application/octet-stream"); + } + /** * 处理下载文件的http header * diff --git a/src/main/java/cn/palmte/work/model/Admin.java b/src/main/java/cn/palmte/work/model/Admin.java index 75d0204..6acca03 100644 --- a/src/main/java/cn/palmte/work/model/Admin.java +++ b/src/main/java/cn/palmte/work/model/Admin.java @@ -31,6 +31,8 @@ public class Admin implements Serializable{ @Column(name = "user_name") private String userName; private String password; + @Column(name = "emp_code") + private String empCode; private String salt; @Column(name = "real_name") private String realName; @@ -58,19 +60,100 @@ public class Admin implements Serializable{ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date lastUpdatedTime; - @Column(name = "region_id") - private int regionId; - @Column(name = "region_name") - private String regionName; + @Column(name = "role_id") + private int roleId; + @Column(name = "role_name") + private String roleName; @Column(name = "updated__password_time") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date updatedPasswordTime; - @Transient - private int roleId; - @Transient - private String roleName; + @Column(name = "work_location") + private String workLocation; + + @Column(name = "dept_id") + private int deptId; + + @Column(name = "dept_name") + private String deptName; + + @Column(name = "direct_manager") + private String directManager; + + @Column(name = "position_id") + private int positionId; + + @Column(name = "position_name") + private String positionName; + + @Column(name = "company_email") + private String companyEmail; + + public String getEmpCode() { + return empCode; + } + + public void setEmpCode(String empCode) { + this.empCode = empCode; + } + + public String getWorkLocation() { + return workLocation; + } + + public void setWorkLocation(String workLocation) { + this.workLocation = workLocation; + } + + public int getDeptId() { + return deptId; + } + + public void setDeptId(int deptId) { + this.deptId = deptId; + } + + public String getDeptName() { + return deptName; + } + + public void setDeptName(String deptName) { + this.deptName = deptName; + } + + public String getDirectManager() { + return directManager; + } + + public void setDirectManager(String directManager) { + this.directManager = directManager; + } + + public int getPositionId() { + return positionId; + } + + public void setPositionId(int positionId) { + this.positionId = positionId; + } + + public String getPositionName() { + return positionName; + } + + public void setPositionName(String positionName) { + this.positionName = positionName; + } + + public String getCompanyEmail() { + return companyEmail; + } + + public void setCompanyEmail(String companyEmail) { + this.companyEmail = companyEmail; + } + @Transient private int roleType; @Transient @@ -262,21 +345,7 @@ public class Admin implements Serializable{ this.roleTypeName = roleTypeName; } - public int getRegionId() { - return regionId; - } - public void setRegionId(int regionId) { - this.regionId = regionId; - } - - public String getRegionName() { - return regionName; - } - - public void setRegionName(String regionName) { - this.regionName = regionName; - } } diff --git a/src/main/java/cn/palmte/work/model/AdminRepositoryImpl.java b/src/main/java/cn/palmte/work/model/AdminRepositoryImpl.java index 4c84bbf..3534054 100644 --- a/src/main/java/cn/palmte/work/model/AdminRepositoryImpl.java +++ b/src/main/java/cn/palmte/work/model/AdminRepositoryImpl.java @@ -116,8 +116,8 @@ public class AdminRepositoryImpl implements AdminRepositoryCustom { } @Override - public Page getAdminList(ConcurrentHashMap<String, String> searchInfo, int pageSize, int pageNum) { - Page page = new Page(pageNum, pageSize); + public Page<Admin> getAdminList(ConcurrentHashMap<String, String> searchInfo, int pageSize, int pageNum) { + Page<Admin> page = new Page(pageNum, pageSize); int thisPage = (pageNum - 1) * pageSize; String sql = getSelect() + getSqlExceptSelect(searchInfo) + " limit " + thisPage + "," + pageSize; String countSql = " SELECT COUNT(*) FROM(" + getSelect() + getSqlExceptSelect(searchInfo) + ") count_table"; @@ -135,6 +135,13 @@ public class AdminRepositoryImpl implements AdminRepositoryCustom { admin.setRealName(ObjectKit.toString(objects[2])); admin.setTelephone(ObjectKit.toString(objects[7])); admin.setRoleName(ObjectKit.toString(objects[6])); + + admin.setWorkLocation(ObjectKit.toString(objects[10])); + admin.setEmpCode(ObjectKit.toString(objects[9])); + admin.setDeptName(ObjectKit.toString(objects[11])); + admin.setPositionName(ObjectKit.toString(objects[13])); + admin.setDirectManager(ObjectKit.toString(objects[12])); + admin.setCompanyEmail(ObjectKit.toString(objects[14])); try { admin.setCreatedTime(ObjectKit.toDate(objects[3])); } catch (ParseException e) { @@ -147,7 +154,7 @@ public class AdminRepositoryImpl implements AdminRepositoryCustom { } public String getSelect() { - String select = " select u.id,u.user_name,u.real_name,u.created_time,u.enabled,r.type,r.name,u.telephone,u.region_name"; + String select = " select u.id,u.user_name,u.real_name,u.created_time,u.enabled,r.type,r.name,u.telephone,u.role_name,u.emp_code,u.work_location,u.dept_name,u.direct_manager,u.position_name,u.company_email"; return select; } @@ -168,13 +175,21 @@ public class AdminRepositoryImpl implements AdminRepositoryCustom { private String buildQuery(Map.Entry<String, String> item) { String sql = ""; - if (item.getKey().equals("userName")) { - sql += " and u.user_name like '%" + item.getValue() + "%' "; + if (item.getKey().equals("realName")) { + sql += " and u.real_name like '%" + item.getValue() + "%' "; } else if (item.getKey().equals("telephone")) { sql += " and u.telephone= " + item.getValue(); - } else if (item.getKey().equals("regionId")) { + } else if (item.getKey().equals("empCode")) { + sql += " and u.emp_code= " + item.getValue(); + } else if (item.getKey().equals("workLocation")) { + sql += " and u.work_location= " + item.getValue(); + } else if (item.getKey().equals("startTime")) { + sql += " and u.created_time >= " + item.getValue() + " 00:00:00"; + } else if (item.getKey().equals("endTime")) { + sql += " and u.created_time <= " + item.getValue() + " 23:59:59"; + } else if (item.getKey().equals("deptId")) { if (!item.getValue().equals("-1")) { - sql += " and u.region_id= " + item.getValue(); + sql += " and u.dept_id= " + item.getValue(); } } else if (item.getKey().equals("roleId")) { if (!item.getValue().equals("-1")) { @@ -219,7 +234,6 @@ public class AdminRepositoryImpl implements AdminRepositoryCustom { admin.setRoleType(ObjectKit.toInt(objects[3])); admin.setRoleId(ObjectKit.toInt(objects[4])); admin.setTelephone(ObjectKit.toString(objects[5])); - admin.setRegionId(ObjectKit.toInt(objects[6])); admin.setRoleLevel(ObjectKit.toInt(objects[7])); } } diff --git a/src/main/java/cn/palmte/work/model/UserPosition.java b/src/main/java/cn/palmte/work/model/UserPosition.java new file mode 100644 index 0000000..a8548e4 --- /dev/null +++ b/src/main/java/cn/palmte/work/model/UserPosition.java @@ -0,0 +1,40 @@ +package cn.palmte.work.model; + +import org.hibernate.annotations.GenericGenerator; + +import javax.persistence.*; + +/** + * 职位 + */ +@Entity +@Table(name = "user_position") +public class UserPosition { + + /** + * id + */ + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @GenericGenerator(name = "persistenceGenerator", strategy = "increment") + private Integer id; + + @Column(name = "position_name") + private String positionName; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getPositionName() { + return positionName; + } + + public void setPositionName(String positionName) { + this.positionName = positionName; + } +} \ No newline at end of file diff --git a/src/main/java/cn/palmte/work/model/UserPositionRepository.java b/src/main/java/cn/palmte/work/model/UserPositionRepository.java new file mode 100644 index 0000000..81deccb --- /dev/null +++ b/src/main/java/cn/palmte/work/model/UserPositionRepository.java @@ -0,0 +1,7 @@ +package cn.palmte.work.model; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface UserPositionRepository extends JpaRepository<UserPosition,Integer> { + +} diff --git a/src/main/java/cn/palmte/work/service/AccountService.java b/src/main/java/cn/palmte/work/service/AccountService.java index 0949fcf..cfa3725 100644 --- a/src/main/java/cn/palmte/work/service/AccountService.java +++ b/src/main/java/cn/palmte/work/service/AccountService.java @@ -1,14 +1,17 @@ package cn.palmte.work.service; import cn.palmte.work.bean.RegexConstant; +import cn.palmte.work.bean.ResponseMsg; import cn.palmte.work.model.*; import cn.palmte.work.utils.DESCrypto; import cn.palmte.work.utils.InterfaceUtil; import cn.palmte.work.utils.StrKit; +import cn.palmte.work.utils.excel.ExportUtils; import org.apache.commons.lang.RandomStringUtils; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -16,8 +19,12 @@ import top.jfunc.common.db.QueryHelper; import top.jfunc.common.db.bean.Page; import top.jfunc.common.db.utils.Pagination; +import javax.servlet.http.HttpServletResponse; import java.beans.Transient; +import java.io.IOException; +import java.util.Collection; import java.util.Date; +import java.util.Map; import java.util.concurrent.ConcurrentHashMap; /** @@ -37,13 +44,20 @@ public class AccountService { public SysUserRoleRepository sysUserRoleRepository; @Autowired - Pagination pagination; + private Pagination pagination; @Autowired private SysRoleRepository sysRoleRepository; - public Page getAdminList(ConcurrentHashMap<String, String> searchInfo, int pageSize, int pageNum) { - return adminRepositoryImpl.getAdminList(searchInfo, pageSize, pageNum); + @Autowired + private DeptRepository deptRepository; + + @Autowired + private UserPositionRepository userPositionRepository; + + public Page<Admin> getAdminList(ConcurrentHashMap<String, String> searchInfo, int pageSize, int pageNum) { + Page<Admin> adminList = adminRepositoryImpl.getAdminList(searchInfo, pageSize, pageNum); + return adminList; } public Page<Admin> list(ConcurrentHashMap<String, String> searchInfo, int pageNumber, int pageSize) { @@ -77,11 +91,7 @@ public class AccountService { } public Admin findUserById(int userId) { - Admin admin = adminRepositoryImpl.findAdminById(userId); - SysRole sysRole = sysRoleRepository.findOne(admin.getRoleId()); - if(null != sysRole){ - admin.setRoleName(sysRole.getName()); - } + Admin admin = adminRepository.findOne(userId); return admin; } @@ -89,30 +99,45 @@ public class AccountService { public void saveOrUpdateAccount(int userId, int roleId, Admin admin, String privateKey) { int createAdminId = InterfaceUtil.getAdminId(); Admin oldAdmin = adminRepository.findOne(userId); + Dept dept = deptRepository.findOne(admin.getDeptId()); + SysRole sysRole = sysRoleRepository.findOne(admin.getRoleId()); + UserPosition userPosition = userPositionRepository.findOne(admin.getPositionId()); if (oldAdmin == null) { oldAdmin = new Admin(); String userName = admin.getUserName(); oldAdmin.setUserName(userName); String salt = RandomStringUtils.randomAlphanumeric(6).toUpperCase(); - String newPassword = decEncPassword(admin.getTelephone().substring(5), salt, privateKey); + + BeanUtils.copyProperties(admin, oldAdmin); + + oldAdmin.setRealName(sysRole.getName()); + oldAdmin.setDeptName(dept.getName()); + oldAdmin.setPositionName(userPosition.getPositionName()); oldAdmin.setPassword(newPassword); oldAdmin.setSalt(salt); oldAdmin.setEnabled(1); - oldAdmin.setRealName(admin.getRealName()); oldAdmin.setCreatedBy(createAdminId); oldAdmin.setTelephone(admin.getTelephone()); oldAdmin.setCreatedTime(new Date()); + } else { String userName = admin.getUserName(); + oldAdmin.setDeptId(admin.getDeptId()); + oldAdmin.setPositionId(admin.getPositionId()); + oldAdmin.setRealName(sysRole.getName()); + oldAdmin.setDeptName(dept.getName()); + oldAdmin.setPositionName(userPosition.getPositionName()); + oldAdmin.setEmpCode(admin.getEmpCode()); + oldAdmin.setWorkLocation(admin.getWorkLocation()); + oldAdmin.setDirectManager(admin.getDirectManager()); + oldAdmin.setCompanyEmail(admin.getCompanyEmail()); oldAdmin.setUserName(userName); oldAdmin.setRealName(admin.getRealName()); oldAdmin.setTelephone(admin.getTelephone()); oldAdmin.setLastUpdatedBy(createAdminId); oldAdmin.setLastUpdatedTime(new Date()); } - oldAdmin.setRegionId(admin.getRegionId()); - oldAdmin.setRoleId(admin.getRoleId()); SysRole one = sysRoleRepository.findOne(admin.getRoleId()); if (null != one) { @@ -129,7 +154,6 @@ public class AccountService { sysUserRole.setCreatedBy(createAdminId); sysUserRole.setCreatedTime(new Date()); sysUserRoleRepository.save(sysUserRole); - } /** @@ -231,4 +255,16 @@ public class AccountService { return false; } + public void exportExcel(HttpServletResponse response, ConcurrentHashMap<String, String> searchInfo) throws IOException { + String[] headers = {"工号", "手机号码", "姓名", "常驻地", "一级部门", "直接主管", "职位", "所属角色", "公司邮件地址"}; + String[] exportColumns = {"empCode", "telephone", "workLocation", "deptName", "directManager", "positionName", "roleName", "companyEmail"}; + ExportUtils.exportToExcel(headers, exportColumns, 1, 5000, + response.getOutputStream(), (pN, pS) -> getAdminList(searchInfo, pN, pS).getList()); + } + + public ResponseMsg check(Collection<Map> maps) { + + + return null; + } } diff --git a/src/main/java/cn/palmte/work/utils/InterfaceUtil.java b/src/main/java/cn/palmte/work/utils/InterfaceUtil.java index 740482e..fe57131 100644 --- a/src/main/java/cn/palmte/work/utils/InterfaceUtil.java +++ b/src/main/java/cn/palmte/work/utils/InterfaceUtil.java @@ -43,8 +43,8 @@ public class InterfaceUtil { return principal.getAdmin(); } - public static int getRegionId() { + /*public static int getRegionId() { return Optional.ofNullable(getAdmin()).map(Admin::getRegionId).orElse(0); - } + }*/ } diff --git a/src/main/resources/templates/admin/account_input.ftl b/src/main/resources/templates/admin/account_input.ftl index bb2e07b..4c127a5 100644 --- a/src/main/resources/templates/admin/account_input.ftl +++ b/src/main/resources/templates/admin/account_input.ftl @@ -6,8 +6,8 @@ <div class="admin-content"> <div class="admin-content-body"> <div class="am-cf am-padding"> - <div class="am-fl am-cf"><strong class="am-text-primary am-text-lg">账号管理</strong> / - <small><#if userId!=-1>编辑<#else>新增</#if>后端账号</small> + <div class="am-fl am-cf"><strong class="am-text-primary am-text-lg">人员管理</strong> / + <small><#if userId!=-1>编辑<#else>新增</#if>人员账号</small> </div> </div> <form method="post" class="am-form" id="tmpForm" action="${base}/account/save"> @@ -15,60 +15,25 @@ <div class="am-tabs am-margin" data-am-tabs> <ul class="am-tabs-nav am-nav am-nav-tabs"> <li class="am-active"> - <a href="#tab1"><#if userId!=-1>编辑<#else>新增</#if>用户信息</a> + <a href="#tab1"><#if userId!=-1>编辑<#else>新增</#if>人员信息</a> </li> </ul> <div class="am-tabs-bd"> <div class="am-tab-panel am-fade am-in am-active" id="tab1"> <input name="userId" id="userId" type="hidden" value="${userId!}"/> - <#--<input name="userId" id="userId" type="hidden" value="${userId!}"/> - <input name="level" id="level" type="hidden" value="${roleLevel!}"/> - <#if userId!=-1><input name="roleId" id="roleId" type="hidden" value="${roleId!}"/></#if>--> - <#--<div class="am-g am-form-group am-margin-top" <#if userId!=-1> style="display:none;" </#if>> - <div class="am-u-sm-4 am-u-md-2 am-text-right"> - <span style="color: red;">*</span> - 账号角色 - </div> - <div class="am-u-sm-6 am-u-md-6"> - <select data-am-selected onchange="roleChange(this)" name="roleId" id="roleId"/> - <option value="-1" tag="-1" <#if roleId == "-1" > selected </#if>>请选择</option> - <#list roleList as roleNode > - <option value="${roleNode.id}" - tag="${roleNode.type}" - level="${roleNode.level}" <#if roleId==roleNode.id?string> - selected </#if>> - ${roleNode.name}</option> - </#list> - </select> - </div> - <div class="am-u-sm-2 am-u-md-4 input-msg"></div> - </div>--> - <div class="am-g am-form-group am-margin-top"> - <div class="am-u-sm-4 am-u-md-2 am-text-right"> - <span style="color: red;">*</span> - 登录名称 - </div> - <div class="am-u-sm-6 am-u-md-6"> - <input name="userName" class="js-ajax-validate" - data-validate-async data-validation-message="请输入登录名称(20字符以内)" - type="text" id="userName" value="${account.userName!}" minlength="1" maxlength="20" - required <#if userId!=-1>readonly</#if> - placeholder="请输入登录名称(20字符以内)"/> - </div> - <div class="am-u-sm-2 am-u-md-4 input-msg"></div> - </div> <div class="am-g am-form-group am-margin-top"> <div class="am-u-sm-4 am-u-md-2 am-text-right"> <span style="color: red;">*</span> - 姓名 + 工号 </div> <div class="am-u-sm-6 am-u-md-6"> - <input name="realName" class="js-ajax-validate" - data-validate-async data-validation-message="请输入账户名称(20字符以内)" - type="text" id="realName" value="${account.realName!}" minlength="1" maxlength="20" - required - placeholder="请输入账户名称(20字符以内)" onKeyUp="clearValidInfo()"/> + <input name="empCode" class="js-ajax-validate" + data-validate-async data-validation-message="请输入工号" + type="text" id="empCode" value="${account.empCode!}" minlength="1" + maxlength="20" + required <#if userId!=-1>readonly</#if> + placeholder="请输入工号"/> </div> <div class="am-u-sm-2 am-u-md-4 input-msg"></div> </div> @@ -84,13 +49,112 @@ onkeyup="value=value.replace(/[^\d]/g,'')" type="text" id="telephone" value="${account.telephone!}" minlength="11" maxlength="11" - required <#if userId!=-1>readonly</#if> + required placeholder="请输入正确格式手机号码!" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"/> </div> <div class="am-u-sm-2 am-u-md-4 input-msg"></div> </div> + <div class="am-g am-form-group am-margin-top"> + <div class="am-u-sm-4 am-u-md-2 am-text-right"> + <span style="color: red;">*</span> + 登录名称 + </div> + <div class="am-u-sm-6 am-u-md-6"> + <input name="userName" class="js-ajax-validate" + data-validate-async data-validation-message="请输入登录名称(20字符以内)" + type="text" id="userName" value="${account.userName!}" minlength="1" + maxlength="20" + required <#if userId!=-1>readonly</#if> + placeholder="请输入登录名称(20字符以内)"/> + </div> + <div class="am-u-sm-2 am-u-md-4 input-msg"></div> + </div> + + <div class="am-g am-form-group am-margin-top"> + <div class="am-u-sm-4 am-u-md-2 am-text-right"> + <span style="color: red;">*</span> + 姓名 + </div> + <div class="am-u-sm-6 am-u-md-6"> + <input name="realName" class="js-ajax-validate" + data-validate-async data-validation-message="请输入账户名称(20字符以内)" + type="text" id="realName" value="${account.realName!}" minlength="1" + maxlength="20" <#if userId!=-1>readonly</#if> + required placeholder="请输入账户名称(20字符以内)"/> + </div> + <div class="am-u-sm-2 am-u-md-4 input-msg"></div> + </div> + + <div class="am-g am-form-group am-margin-top"> + <div class="am-u-sm-4 am-u-md-2 am-text-right"> + <span style="color: red;">*</span> + 常驻地 + </div> + <div class="am-u-sm-6 am-u-md-6"> + <input name="workLocation" class="js-ajax-validate" + data-validate-async data-validation-message="请输入常驻地" + type="text" id="workLocation" value="${account.workLocation!}" minlength="1" + maxlength="20" + required placeholder="请输入常驻地"/> + </div> + <div class="am-u-sm-2 am-u-md-4 input-msg"></div> + </div> + + <div class="am-g am-form-group am-margin-top"> + <div class="am-u-sm-4 am-u-md-2 am-text-right"> + <span style="color: red;">*</span> + 一级部门 + </div> + <div class="am-u-sm-8 am-u-md-10"> + <select id="deptId" name="deptId" + data-am-selected="{btnSize: 'sm',maxHeight: 200,searchBox: 1}"> + <option value="-1">请选择</option> + <#if deptList?exists> + <#list deptList as node> + <option value="${node.id!}" <#if account.deptId! == node.id > + selected </#if>>${node.name}</option> + </#list> + </#if> + </select> + </div> + </div> + + <div class="am-g am-form-group am-margin-top"> + <div class="am-u-sm-4 am-u-md-2 am-text-right"> + <span style="color: red;">*</span> + 直接主管 + </div> + <div class="am-u-sm-6 am-u-md-6"> + <input name="directManager" class="js-ajax-validate" + data-validate-async data-validation-message="请输入直接主管" + type="text" id="directManager" value="${account.directManager!}" + minlength="1" maxlength="20" <#if userId!=-1>readonly</#if> + required placeholder="请输入直接主管"/> + </div> + <div class="am-u-sm-2 am-u-md-4 input-msg"></div> + </div> + + <div class="am-g am-form-group am-margin-top"> + <div class="am-u-sm-4 am-u-md-2 am-text-right"> + <span style="color: red;">*</span> + 职位 + </div> + <div class="am-u-sm-8 am-u-md-10"> + <select id="positionId" name="positionId" + data-am-selected="{btnSize: 'sm',maxHeight: 200,searchBox: 1}"> + <option value="-1">请选择</option> + <#if positionList?exists> + <#list positionList as node> + <option value="${node.id!}" <#if account.positionId! == node.id > + selected </#if>>${node.positionName}</option> + </#list> + </#if> + </select> + </div> + </div> + <div class="am-g am-form-group am-margin-top"> <div class="am-u-sm-4 am-u-md-2 am-text-right"> <span style="color: red;">*</span> @@ -110,6 +174,20 @@ </div> </div> + <div class="am-g am-form-group am-margin-top"> + <div class="am-u-sm-4 am-u-md-2 am-text-right"> + <span style="color: red;">*</span> + 公司邮件地址 + </div> + <div class="am-u-sm-6 am-u-md-6"> + <input name="companyEmail" class="js-ajax-validate" + data-validate-async data-validation-message="请输入公司邮件地址" + type="text" id="companyEmail" value="${account.companyEmail!}" minlength="1" + maxlength="30" + required placeholder="请输入公司邮件地址"/> + </div> + <div class="am-u-sm-2 am-u-md-4 input-msg"></div> + </div> <div class="am-g am-form-group am-margin-top"> <div class="am-u-sm-4 am-u-md-2 am-text-right"> @@ -142,63 +220,10 @@ </@defaultLayout.layout> -<#macro bpTree nodes> - <#list nodes as node> - <tr level="${node.level}" class="level-${node.level}" - <#if node.hasLeafNode > - type="file" - <#else> - type="folder" - </#if> - > - <td align="center"> - </td> - </tr> - <#if (!node.hasLeafNode) && node.subNodes?? && node.subNodes?size gt 0> - <@bpTree nodes=node.subNodes /> - </#if> - </#list> -</#macro> - - <script type="text/javascript"> var urlBase = "${base}"; var url; - function showDialog(msgTitle, message, msgType, msgTimer) { - sendMessage({ - title: msgTitle, - text: message, - type: msgType, - timer: msgTimer, - confirmButtonText: false - }); - } - - function roleChange() { - var child = $("#roleId").find("option:selected").attr("tag"); - var level = $("#roleId").find("option:selected").attr("level"); - $("#level").val(level); - console.info(child); - if (child == 2) { - document.getElementById('capitalAccount').style.display = 'block'; - } else { - document.getElementById('capitalAccount').style.display = 'none'; - } - - if (level == 2) { - document.getElementById('regionIdInput').style.display = 'block'; - document.getElementById('areaInput').style.display = 'none'; - } else if (level == 3) { - document.getElementById('regionIdInput').style.display = 'block'; - document.getElementById('areaInput').style.display = 'block'; - } else { - document.getElementById('regionIdInput').style.display = 'none'; - document.getElementById('areaInput').style.display = 'none'; - } - } - - $(function () { /*表单验证:begin*/ //自定义规则,用法:验证元素上加class="js-pattern-sort" @@ -241,41 +266,10 @@ } }); /*表单验证:end*/ - }) - /*var selectArea = function () { - var regionSelectedVal = $("#regionId").val(); - $.ajax({ - url: "${base}/gov/areas", - data: {regionId: regionSelectedVal}, - type: "post", - dataType: "json", - async: false, - success: function (data) { - var areas = data.data; - //清空下拉项 - $("#areaCode option").remove(); - $.each(areas, function () { - //为Select追加一个Option(下拉项) - jQuery("#areaCode").append("<option value='" + this.id + "'>" + this.areaName + "</option>"); - }); - } - }); - };*/ - - var submit_function = function () { - var level = $("#level").val(); - var regionId = $("#regionId").val(); - var areaCode = $("#areaCode").val(); - if (level == 2 && regionId <= 0) { - parent.layer.msg('请选择正确的地市'); - } else if (level == 3 && (regionId <= 0 || areaCode <= 0)) { - parent.layer.msg('请选择正确的地市和区县'); - } else { - $("#tmpForm").submit(); - } + $("#tmpForm").submit(); } </script> diff --git a/src/main/resources/templates/admin/account_list.ftl b/src/main/resources/templates/admin/account_list.ftl index 48958ae..362e1d5 100644 --- a/src/main/resources/templates/admin/account_list.ftl +++ b/src/main/resources/templates/admin/account_list.ftl @@ -5,8 +5,8 @@ <div class="admin-content"> <div class="am-cf am-padding" style="padding:1rem 1.6rem 1.6rem 1rem;margin:0px;"> <!-- padding:1px 2px 3px 4px;上、右、下,和左 --> - <div class="am-fl am-cf"><strong class="am-text-primary am-text-lg">系统管理</strong> / - <small>后端账号管理</small> + <div class="am-fl am-cf"><strong class="am-text-primary am-text-lg">人员管理</strong> / + <small>人员列表</small> </div> </div> <div class="am-g"> @@ -16,11 +16,39 @@ <table class="am-table am-table-bordered am-table-radius table-main" style="padding:0;"> <tbody> <tr> - <th class="am-text-middle">登录名称</th> + <th class="am-text-middle">姓名</th> <td> <div class="am-u-sm-10"> - <input type="text" id="userName" class="am-form-field am-input-sm" - value="${userName!}"/> + <input type="text" id="realName" class="am-form-field am-input-sm" + value="${realName!}"/> + </div> + </td> + <th class="am-text-middle">手机号</th> + <td> + <div class="am-u-sm-10"> + <input type="text" id="telephone" class="am-form-field am-input-sm" + value="${telephone!}"/> + </div> + </td> + <th class="am-text-middle">工号</th> + <td> + <div class="am-u-sm-10"> + <input type="text" id="empCode" class="am-form-field am-input-sm" + value="${empCode!}"/> + </div> + </td> + </tr> + <tr> + <th class="am-text-middle">一级部门</th> + <td> + <div class="am-u-sm-10"> + <select data-am-selected id="deptId" name="deptId"> + <option value="-1">全部</option> + <#list deptList as dept> + <option value=${dept.id!} <#if deptId! =="${dept.id}" > + selected</#if>>${dept.name!}</option> + </#list> + </select> </div> </td> <th class="am-text-middle">账号角色</th> @@ -36,37 +64,41 @@ </select> </div> </td> - </tr> - <tr> - <th class="am-text-middle">手机号</th> + <th class="am-text-middle">常驻地</th> <td> <div class="am-u-sm-10"> - <input type="text" id="telephone" class="am-form-field am-input-sm" - value="${telephone!}"/> - </div> - </td> - <th class="am-text-middle">所属区域</th> - <td> - <div class="am-u-sm-10"> - <select id="regionId" name="regionId" - data-am-selected="{btnSize: 'sm',maxHeight: 200,searchBox: 1}"> - <option value="-1">全部</option> - <#if regionList?exists> - <#list regionList as node> - <option value="${node.id!}" <#if regionId! == "${node.id}" > - selected </#if>>${node.name}</option> - </#list> - </#if> - - </select> + <input type="text" id="workLocation" class="am-form-field am-input-sm" + value="${workLocation!}"/> </div> </td> </tr> <tr> + <th class="am-text-middle">创建时间</th> + <td> + <div class="am-u-sm-10"> + <div class="am-form am-form-inline"> + <div class="am-form-group am-form-icon"> + <i class="am-icon-calendar"></i> + <input type="text" class="am-form-field am-input-sm" id="startTime" + value="${startTime!}" placeholder="开始日期" data-am-datepicker> + </div> + <div class="am-form-group">至</div> + <div class="am-form-group am-form-icon"> + <i class="am-icon-calendar"></i> + <input type="text" class="am-form-field am-input-sm" id="endTime" + value="${endTime!}" + placeholder="结束日期" data-am-datepicker> + </div> + </div> + </div> + </td> <td colspan="4"> <div align='right'> <button type="button" class="am-btn am-btn-default am-btn-sm am-text-secondary" - id="submit-btn">搜索 + id="submit-btn" onclick="sub_function('query')">搜索 + </button> + <button type="button" class="am-btn am-btn-default am-btn-sm am-text-secondary" + id="submit-btn-export" onclick="sub_function('export')">导出 </button> </div> </td> @@ -85,6 +117,21 @@ </button> </@shiro.hasPermission> </div> + <div class="am-btn-group am-btn-group-xs"> + <div class="am-btn-group am-btn-group-xs am-form-file"> + <button type="button" id="bt_import" class="am-btn am-btn-default"> + <span class="am-icon-archive"></span> + 批量导入 + </button> + <input id="doc-form-file" type="file" name="file" + onChange="ajaxUploadFile('doc-form-file','${base}/account/batchImport')" + multiple> + </div> + <button type="button" class="am-btn am-btn-default" + onclick="location.href='${base}/account/template'"> + <span class="am-icon-archive"></span> 导入模板下载 + </button> + </div> </div> </div> </div> @@ -95,22 +142,30 @@ <table class="am-table am-table-striped am-table-hover table-main"> <thead> <tr class="am-text-nowrap"> - <th class="table-title">登录名称</th> - <th class="table-title">账号名称</th> - <th class="table-title">手机号</th> - <th class="table-title">账号角色</th> - <th class="table-title">创建时间</th> + <th class="table-title">工号</th> + <th class="table-title">手机号码</th> + <th class="table-title">姓名</th> + <th class="table-title">常驻地</th> + <th class="table-title">一级部门</th> + <th class="table-title">直接主管</th> + <th class="table-title">职位</th> + <th class="table-title">所属角色</th> + <th class="table-title">公司邮件地址</th> <th class="table-title">操作</th> </tr> </thead> <tbody> - <#list pager.list as list> + <#list pager.list as list> <tr> - <td>${list.userName!}</td> - <td>${list.realName!}</td> + <td>${list.empCode!}</td> <td>${list.telephone!}</td> + <td>${list.realName!}</td> + <td>${list.workLocation!}</td> + <td>${list.deptName!}</td> + <td>${list.directManager!}</td> + <td>${list.positionName!}</td> <td>${list.roleName!}</td> - <td><#if list.createdTime??>${list.createdTime?datetime}</#if></td> + <td>${list.companyEmail!}</td> <td> <div class="am-btn-toolbar"> <div class="am-btn-group am-btn-group-xs"> @@ -128,16 +183,6 @@ class="am-icon-pencil-square-o"></span>密码重置 </button> </@shiro.hasPermission> - <@shiro.hasPermission name="ACCOUNT_BINDING"> - <#if (list.roleName) = "工地巡查员"> - <button type="button" - class="am-btn am-btn-default am-btn-xs am-text-secondary" - onclick="location.href='${base}/binding/select?id=${list.id?c}&type=sys'"> - <span class="am-icon-pencil-square-o"></span> - 绑定工地 - </button> - </#if> - </@shiro.hasPermission> </div> <div class="am-btn-group am-btn-group-xs"> <div class="switch-button"> @@ -188,6 +233,12 @@ </footer> </div> </@defaultLayout.layout> +<script type="text/javascript" src="${base}/common/js/jquery.ajaxfileupload.js"></script> +<script src="${base}/common/jQuery-File-Upload/js/vendor/jquery.ui.widget.js"></script> +<script type="text/javascript" src="${base}/common/jQuery-File-Upload/js/jquery.iframe-transport.js"></script> +<script type="text/javascript" src="${base}/common/jQuery-File-Upload/js/jquery.fileupload.js"></script> +<script src="${base}/common/jQuery-File-Upload/js/jquery.fileupload-process.js"></script> +<script src="${base}/common/jQuery-File-Upload/js/jquery.fileupload-validate.js"></script> <script src="../assets/js/amazeui.switch.js"></script> <script type="text/javascript"> $(function () { @@ -199,41 +250,120 @@ $mycheckbox.each(function () { var myid = $(this).attr("id"); var prop = $(this).attr("prop"); - $(this).on({ 'switchChange.bootstrapSwitch': function (event, state) { toggle(myid, state ? 1 : 0); } }); - }); - }); var keywordsObj = {}; $("#submit-btn").on("click", function () { - $("#pageNumber").val(1); - if ($("#userName").val()) - keywordsObj.userName = $("#userName").val(); + if ($("#realName").val()) + keywordsObj.realName = $("#realName").val(); + if ($("#telephone").val()) + keywordsObj.telephone = $("#telephone").val(); + if ($("#empCode").val()) + keywordsObj.empCode = $("#empCode").val(); + if ($("#deptId").val()) + keywordsObj.deptId = $("#deptId").val(); if ($("#roleId").val()) keywordsObj.roleId = $("#roleId").val(); - if ($("#telephone").val()) - keywordsObj.telephone = parseInt($("#telephone").val()); - if ($("#regionId").val()) - keywordsObj.regionId = parseInt($("#regionId").val()); + if ($("#workLocation").val()) + keywordsObj.workLocation = $("#workLocation").val(); + if ($("#startTime").val()) + keywordsObj.startTime = $("#startTime").val(); + if ($("#endTime").val()) + keywordsObj.endTime = $("#endTime").val(); + var startTime = $("#startTime").val(); + var endTime = $("#endTime").val(); + if(startTime > endTime){ + window.confirm('开始日期应早于结束日期'); + } var keywords = ""; if (!$.isEmptyObject(keywordsObj)) { keywords = JSON.stringify(keywordsObj); } - console.log("keywords = " + keywords); - $("#keywords").val(keywords); $("#listForm").submit(); }); - - }); + function ajaxUploadFile(id, url) { + $.ajaxFileUpload({ + url: url, + secureuri: false, + fileElementId: id,// file标签的id + dataType: 'json',// 返回数据的类型 + success: function (data, status) { + console.log("--------success---------" + data) + if (data.status == 0) { + var list = data.data; + var content = ''; + $.each(list, function (i, r) { + content += (i + 1) + '、' + r + '<br>'; + }); + console.log('---> ' + content); + parent.layer.open({ + title: '导入结果:', + content: data.msg + '<br><br>' + content + }); + } else { + parent.layer.msg(data.msg); + } + + window.location.reload(); + $("#" + id).val(""); + }, + error: function (data, status, e) { + console.log("--------error---------" + data) + alert("-----------------" + data); + // if ($('#modal')) { + // $('#modal').modal('close'); + // } + alert(e); + $("#" + id).val(""); + } + }); + }; + + function initSearch() { + var keywordsObj = {}; + if ($("#realName").val()) + keywordsObj.realName = $("#realName").val(); + if ($("#telephone").val()) + keywordsObj.telephone = $("#telephone").val(); + if ($("#empCode").val()) + keywordsObj.empCode = $("#empCode").val(); + if ($("#deptId").val()) + keywordsObj.deptId = $("#deptId").val(); + if ($("#roleId").val()) + keywordsObj.roleId = $("#roleId").val(); + if ($("#workLocation").val()) + keywordsObj.workLocation = $("#workLocation").val(); + if ($("#startTime").val()) + keywordsObj.startTime = $("#startTime").val(); + if ($("#endTime").val()) + keywordsObj.endTime = $("#endTime").val(); + var keywords = ""; + if (!$.isEmptyObject(keywordsObj)) { + keywords = JSON.stringify(keywordsObj); + } + $("#keywords").val(keywords); + }; + + var sub_function = function (type) { + initSearch(); + if (type == 'export') { + $("#listForm").attr("action", "${base}/account/export"); + } + if(type == 'query'){ + $("#listForm").attr("action", "${base}/account/list"); + } + $("#listForm").submit(); + }; + var resetPassword = function (url) { var params = {}; if (window.confirm('确定要重置密码吗?')) { @@ -254,8 +384,7 @@ } }); } - } - + }; //启用或者禁用 var toggle = function (id, status) {