pull/2/head
wang ziting 3 months ago
parent b8bf02094c
commit 2e957a5782

@ -26,7 +26,7 @@ import java.io.UnsupportedEncodingException;
import java.util.List; import java.util.List;
/** /**
* Description: * Description: AdminControllerWeb
* *
* @Date: 2020/2/10 15:20 * @Date: 2020/2/10 15:20
* @Author: PeiChen * @Author: PeiChen
@ -34,7 +34,10 @@ import java.util.List;
@Controller @Controller
public class AdminController { public class AdminController {
// 依赖注入AdminService用于调用业务逻辑层相关方法来处理管理员数据
private AdminService adminService; private AdminService adminService;
// 通过@Autowired注解让Spring框架自动注入AdminService的实现类实例
@Autowired @Autowired
public void setAdminService(AdminService adminService) { public void setAdminService(AdminService adminService) {
this.adminService = adminService; this.adminService = adminService;
@ -42,44 +45,66 @@ public class AdminController {
/** /**
* *
* @param model *
* @param admin * @param model
* @param session * @param admin Admin
* @param request * @param session session
* @return * @param request HTTP
* @param response HTTP
* @return "main""login"
* @throws Exception
*/ */
@RequestMapping(value = "/login") @RequestMapping(value = "/login")
public String login(Model model, Admin admin, HttpSession session, HttpServletRequest request,HttpServletResponse response) throws Exception { public String login(Model model, Admin admin, HttpSession session, HttpServletRequest request, HttpServletResponse response) throws Exception {
// 设置请求的字符编码为utf-8防止中文乱码等问题
request.setCharacterEncoding("utf-8"); request.setCharacterEncoding("utf-8");
// 设置响应的字符编码为utf-8确保返回给客户端的数据编码正确
response.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8");
// 获取响应的输出流对象,用于向客户端输出数据(这里主要用于输出错误提示等文本信息)
PrintWriter writer = response.getWriter(); PrintWriter writer = response.getWriter();
// 如果传入的admin对象为空或者用户名、密码为空则直接返回登录页面
if (admin == null || admin.getUsername() == null || admin.getPassword() == null) { if (admin == null || admin.getUsername() == null || admin.getPassword() == null) {
return "login"; return "login";
} }
// 使用MD5Util工具类对用户输入的密码进行MD5加密以utf-8编码格式增强密码安全性
admin.setPassword(MD5Util.MD5EncodeUtf8(admin.getPassword())); admin.setPassword(MD5Util.MD5EncodeUtf8(admin.getPassword()));
// 调用adminService的方法根据传入的admin对象包含加密后的密码去数据库查找对应的管理员信息
Admin ad = adminService.findAdmin(admin); Admin ad = adminService.findAdmin(admin);
// 如果能查到对应的管理员信息,说明登录成功
if (ad != null) { if (ad != null) {
//登录信息存入session域 //登录成功后的管理员信息存入session域,方便后续在其他请求中获取登录用户信息
session.setAttribute("adminInfo",ad); session.setAttribute("adminInfo", ad);
//System.out.println(ad); // 返回主页面视图名称,通常对应着系统的主界面
return "main"; return "main";
} }
model.addAttribute("msg","用户名或密码错误,请重新输入!");
// 如果没查到,说明用户名或密码错误,向模型中添加错误提示信息
model.addAttribute("msg", "用户名或密码错误,请重新输入!");
// 返回登录页面视图名称,让用户重新输入登录信息
return "login"; return "login";
} }
//拦截后跳转至登录页 // 拦截后跳转至登录页,当用户未登录访问需要登录才能访问的资源时,可能会被拦截到此方法,然后跳转到登录页面
@RequestMapping("/to_login") @RequestMapping("/to_login")
public String Login() { public String Login() {
return "login"; return "login";
} }
/** /**
* 退 * 退使退
n */ *
* @param admin 使Spring MVC
* @param model 使
* @param session invalidate
* @return 退
*/
@RequestMapping(value = "/loginOut") @RequestMapping(value = "/loginOut")
public String loginOut(Admin admin,Model model,HttpSession session) { public String loginOut(Admin admin, Model model, HttpSession session) {
//通过session.invalidate()方法来注销当前的session // 通过session.invalidate()方法来注销当前的session,清除会话相关信息
session.invalidate(); session.invalidate();
return "login"; return "login";
@ -87,121 +112,193 @@ public class AdminController {
/** /**
* *
*
* @param page @RequestParam1使
* @param size @RequestParam5使
* @param request HTTP
* @param response HTTP
* @return ModelAndView
* @throws Exception
*/ */
@RequestMapping(value = "/findAllAdmin") @RequestMapping(value = "/findAllAdmin")
public ModelAndView findAll(@RequestParam(name = "page", required = true, defaultValue = "1") int page, @RequestParam(name = "size", required = true, defaultValue = "5") int size,HttpServletRequest request,HttpServletResponse response) throws Exception { public ModelAndView findAll(@RequestParam(name = "page", required = true, defaultValue = "1") int page, @RequestParam(name = "size", required = true, defaultValue = "5") int size, HttpServletRequest request, HttpServletResponse response) throws Exception {
// 设置请求的字符编码为utf-8
request.setCharacterEncoding("utf-8"); request.setCharacterEncoding("utf-8");
// 设置响应的字符编码为utf-8
response.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8");
// 创建一个ModelAndView对象用于封装要返回给视图的数据以及视图名称
ModelAndView mv = new ModelAndView(); ModelAndView mv = new ModelAndView();
// 用于存放查询到的管理员列表数据初始化为null
List<Admin> admins = null; List<Admin> admins = null;
// 从请求参数中获取查询关键字如果没有传递该参数则可能为null
String keyword = request.getParameter("keyword"); String keyword = request.getParameter("keyword");
// 如果关键字为空包括null、空字符串、长度为0等情况则查询所有管理员信息按照分页条件
if (keyword == null || keyword.trim().equals("") || keyword.length() == 0) { if (keyword == null || keyword.trim().equals("") || keyword.length() == 0) {
admins = adminService.findAll(page,size); admins = adminService.findAll(page, size);
}else { } else {
admins = adminService.serarchInfo(page,size,keyword); // 如果有关键字,则根据关键字进行模糊查询管理员信息(按照分页条件)
admins = adminService.serarchInfo(page, size, keyword);
} }
//PageInfo就是一个封装了分页数据的bean
// 使用PageInfo对查询到的管理员列表数据进行分页相关信息的封装方便在视图层展示分页导航等信息
PageInfo pageInfo = new PageInfo(admins); PageInfo pageInfo = new PageInfo(admins);
mv.addObject("pageInfo",pageInfo);
// 将封装好分页数据的PageInfo对象添加到ModelAndView中以便在视图中可以获取并展示分页数据
mv.addObject("pageInfo", pageInfo);
// 设置要跳转的视图名称为"admin-list",通常对应着展示管理员列表的页面
mv.setViewName("admin-list"); mv.setViewName("admin-list");
return mv; return mv;
} }
/** /**
* * idadminService
*
* @param request HTTPid
* @throws Exception
*/ */
@ResponseBody @ResponseBody
@RequestMapping(value = "/deleteAdmin") @RequestMapping(value = "/deleteAdmin")
public void deleteAdmin(HttpServletRequest request) throws Exception { public void deleteAdmin(HttpServletRequest request) throws Exception {
// 从请求参数中获取要删除的管理员的id
String id = request.getParameter("id"); String id = request.getParameter("id");
// 调用adminService的方法根据解析后的管理员id转换为整数类型来删除对应的管理员记录
adminService.deleteAdminById(Integer.parseInt(id)); adminService.deleteAdminById(Integer.parseInt(id));
} }
/** /**
* * adminService
*
* @param request HTTP
* @param response
* @throws Exception
*/ */
@RequestMapping(value = "/checkUserName") @RequestMapping(value = "/checkUserName")
public void checkUserName(HttpServletRequest request, HttpServletResponse response) throws Exception { public void checkUserName(HttpServletRequest request, HttpServletResponse response) throws Exception {
// 设置请求的字符编码为utf-8
request.setCharacterEncoding("utf-8"); request.setCharacterEncoding("utf-8");
// 设置响应的字符编码为utf-8
response.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8");
// 获取响应的输出流对象,用于向客户端输出校验结果信息
PrintWriter pw = response.getWriter(); PrintWriter pw = response.getWriter();
//取值
// 从请求参数中获取要校验的用户名
String u_name = request.getParameter("u_name"); String u_name = request.getParameter("u_name");
//调用service,用户名存在返回true不存在则返回false
// 调用adminService的方法校验用户名是否存在存在返回true不存在返回false
Boolean result = adminService.checkUserName(u_name); Boolean result = adminService.checkUserName(u_name);
//System.out.println(result);
//回调函数 // 根据校验结果,向客户端输出相应的提示信息
if (result) { if (result) {
//pw.write("用户名已存在,请重新输入!"); //pw.write("用户名已存在,请重新输入!");
pw.write("账号可用"); pw.write("账号可用");
}else { } else {
pw.write("账号不存在"); pw.write("账号不存在");
} }
} }
@RequestMapping(value = "/adminAdd") @RequestMapping(value = "/adminAdd")
public String adminAdd() { public String adminAdd() {
// 返回添加管理员页面的视图名称,通常对应着展示添加管理员表单的页面
return "admin-add"; return "admin-add";
} }
/** /**
* * AdminadminService
* @param admin *
* @param request * @param admin Admin
* @param response * @param request HTTP
* @throws Exception * @param response
* @throws Exception
*/ */
@RequestMapping("/addAdmin") @RequestMapping("/addAdmin")
public void addAdmin(Admin admin,HttpServletRequest request,HttpServletResponse response) throws Exception { public void addAdmin(Admin admin, HttpServletRequest request, HttpServletResponse response) throws Exception {
// 获取响应的输出流对象,用于向客户端输出添加操作的结果信息(成功或失败)
PrintWriter writer = response.getWriter(); PrintWriter writer = response.getWriter();
// 调用adminService的方法校验用户名是否已存在已存在则check为true不存在为false
Boolean check = adminService.checkUserName(admin.getUsername()); Boolean check = adminService.checkUserName(admin.getUsername());
//如果用户名已存在check为true不存在为false
// 如果用户名已存在,向客户端输出"false"表示添加失败,并结束方法执行
if (check) { if (check) {
writer.write("false"); writer.write("false");
return; return;
} }
// 如果传入的admin对象为空向客户端输出"false"表示添加失败,并结束方法执行
if (admin == null) { if (admin == null) {
writer.write("false"); writer.write("false");
return; return;
}else { } else {
if(admin.getUsername() == null || "".trim().equals(admin.getUsername()) // 进一步校验管理员对象的各个属性是否为空(去除两端空格后为空字符串也算空),只要有一个属性为空,就向客户端输出"false"表示添加失败,并结束方法执行
|| admin.getPassword() == null ||"".trim().equals(admin.getPassword()) if (admin.getUsername() == null || "".trim().equals(admin.getUsername())
|| admin.getPassword() == null || "".trim().equals(admin.getPassword())
|| admin.getName() == null || "".trim().equals(admin.getName()) || admin.getName() == null || "".trim().equals(admin.getName())
|| admin.getUid() == null || "".trim().equals(admin.getUid()) || admin.getUid() == null || "".trim().equals(admin.getUid())
|| admin.getPhone() == null || "".trim().equals(admin.getPhone()) || admin.getPhone() == null || "".trim().equals(admin.getPhone())
|| admin.getDescription() == null || "".trim().equals(admin.getDescription())) { || admin.getDescription() == null || "".trim().equals(admin.getDescription())) {
writer.write("false"); writer.write("false");
return; return;
} }
} }
// 校验学工号是否已被注册若已被注册返回的Admin对象不为null向客户端输出"false"表示添加失败,并结束方法执行
Admin isNull = adminService.checkUid(admin.getUid()); Admin isNull = adminService.checkUid(admin.getUid());
if (isNull != null) { if (isNull != null) {
writer.write("false"); writer.write("false");
return; return;
} }
// 使用MD5Util工具类对管理员密码进行MD5加密以utf-8编码格式
admin.setPassword(MD5Util.MD5EncodeUtf8(admin.getPassword())); admin.setPassword(MD5Util.MD5EncodeUtf8(admin.getPassword()));
// 调用adminService的方法将经过校验和加密密码后的管理员信息添加到数据库
adminService.addAdmin(admin); adminService.addAdmin(admin);
// 添加成功后,向客户端输出"true"表示添加成功
writer.write("true"); writer.write("true");
} }
//跳转管理员信息编辑页面,并回显信息
// 跳转管理员信息编辑页面并回显信息根据传入的管理员id从数据库查询对应的管理员信息然后将信息传递到编辑页面进行展示
@RequestMapping("/adminEdit") @RequestMapping("/adminEdit")
public ModelAndView editAdmin(HttpServletRequest request) throws Exception { public ModelAndView editAdmin(HttpServletRequest request) throws Exception {
// 创建一个ModelAndView对象用于封装要返回给视图的数据以及视图名称
ModelAndView mv = new ModelAndView(); ModelAndView mv = new ModelAndView();
// 从请求参数中获取要编辑的管理员的id
String id = request.getParameter("id"); String id = request.getParameter("id");
// 调用adminService的方法根据管理员id查询对应的管理员信息
Admin ad = adminService.findAdminById(Integer.parseInt(id)); Admin ad = adminService.findAdminById(Integer.parseInt(id));
mv.addObject("ad",ad);
//mv.addObject("id",id); // 将查询到的管理员信息添加到ModelAndView中以便在编辑页面可以获取并展示该信息
mv.addObject("ad", ad);
// 设置要跳转的视图名称为"admin-edit",通常对应着展示管理员信息编辑表单的页面
mv.setViewName("admin-edit"); mv.setViewName("admin-edit");
return mv; return mv;
} }
//修改管理员信息
// 修改管理员信息操作接收一个Admin对象包含修改后的管理员各项信息以及响应对象进行一系列校验后调用adminService的方法更新数据库中的管理员信息
@RequestMapping("/editAdmin") @RequestMapping("/editAdmin")
public void editAdmin(Admin admin,HttpServletResponse response) throws Exception { public void editAdmin(Admin admin, HttpServletResponse response) throws Exception {
// 获取响应的输出流对象,用于向客户端输出修改操作的结果信息(成功或失败)
PrintWriter writer = response.getWriter(); PrintWriter writer = response.getWriter();
// 如果传入的admin对象为空向客户端输出"false"表示修改失败,并结束方法执行
if (admin == null) { if (admin == null) {
writer.write("false"); writer.write("false");
return; return;
}else { } else {
if(admin.getUsername() == null || "".trim().equals(admin.getUsername()) // 校验管理员对象的各个属性是否为空(去除两端空格后为空字符串也算空),只要有一个属性为空,就向客户端输出"false"表示修改失败,并结束方法执行
if (admin.getUsername() == null || "".trim().equals(admin.getUsername())
|| admin.getName() == null || "".trim().equals(admin.getName()) || admin.getName() == null || "".trim().equals(admin.getName())
|| admin.getUid() == null || "".trim().equals(admin.getUid()) || admin.getUid() == null || "".trim().equals(admin.getUid())
|| admin.getPhone() == null || "".trim().equals(admin.getPhone()) || admin.getPhone() == null || "".trim().equals(admin.getPhone())
@ -210,63 +307,46 @@ public class AdminController {
return; return;
} }
} }
// 此处注释掉了密码加密代码,可能根据业务需求,修改管理员信息时不一定需要重新加密密码(具体看实际情况)
//admin.setPassword(MD5Util.MD5EncodeUtf8(admin.getPassword())); //admin.setPassword(MD5Util.MD5EncodeUtf8(admin.getPassword()));
// 调用adminService的方法根据传入的修改后的管理员信息更新数据库中的对应记录
adminService.updateAdmin(admin); adminService.updateAdmin(admin);
//更新成功进行提示信息回显
// 更新成功后,向客户端输出"true"表示更新成功
writer.write("true"); writer.write("true");
} }
/** /**
* * AdminadminService
*
* @param admin Admin
* @param response
* @throws Exception
*/ */
@RequestMapping("/put_power") @RequestMapping("/put_power")
public void put_power(Admin admin,HttpServletResponse response) throws Exception { public void put_power(Admin admin, HttpServletResponse response) throws Exception {
// 获取响应的输出流对象,用于向客户端输出授权操作的结果信息(成功或失败)
PrintWriter writer = response.getWriter(); PrintWriter writer = response.getWriter();
// 如果传入的admin对象为空向客户端输出"false"表示授权失败,并结束方法执行
if (admin == null) { if (admin == null) {
writer.write("false"); writer.write("false");
return; return;
} }
// 校验授权级别是否在合法范围内0到4之间不在则向客户端输出"false"表示授权失败,并结束方法执行
if (admin.getPower() < 0 || admin.getPower() > 4) { if (admin.getPower() < 0 || admin.getPower() > 4) {
writer.write("false"); writer.write("false");
return; return;
} }
adminService.put_power(admin);
writer.write("true");
}
/**
*
* @param response
* @throws Exception
*/
@RequestMapping("/exportAdminInfo")
public void exportAdminInfo(HttpServletResponse response) throws Exception {
InputStream is = adminService.getInputStream();
response.setContentType("application/vnd.ms-excel");
response.setHeader("contentDisposition", "attachment;filename=adminsInfo.xls");
ServletOutputStream outputStream = response.getOutputStream();
IOUtils.copy(is,outputStream);
}
/** // 调用adminService的方法进行授权相关的数据库操作具体操作由service层实现
* adminService.put_power(admin);
* @param request
* @param response
* @throws Exception
*/
@RequestMapping("/checkUid")
public void checkUid(HttpServletRequest request,HttpServletResponse response) throws Exception {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
PrintWriter writer = response.getWriter();
String uid = request.getParameter("uid");
Admin admin = adminService.checkUid(uid);
if (admin != null) {
writer.write("true");//uid已被注册
return;
}
// 授权成功后,向客户端输出"true"表示授权成功
writer.write("true");
} }
} }

@ -9,39 +9,80 @@ import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSession;
/** /**
* Description: * Description: Web
* 访访
* *
* @Date: 2020/2/14 16:50 * @Date: 2020/2/14 16:50
* @Author: PeiChen * @Author: PeiChen
*/ */
public class LoginInterceptor implements HandlerInterceptor { public class LoginInterceptor implements HandlerInterceptor {
/**
*
*
* @param request HTTPURL
* @param response HTTP
* @param handler Controller使
* @return true访false
* @throws Exception
*/
@Override @Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 获取请求的URL // 获取请求的URL(统一资源标识符),用于判断当前请求的是哪个页面或者资源路径。
String url = request.getRequestURI(); String url = request.getRequestURI();
// URL:除了login.jsp是可以公开访问的其它的URL都进行拦截控制
if(url.toLowerCase().indexOf("login")>=0){ // 进行URL判断这里设定的规则是除了包含"login"不区分大小写的URL是可以公开访问的比如登录页面本身其它的URL都要进行拦截控制。
// 如果URL中包含"login"则允许请求继续执行返回true。
if (url.toLowerCase().indexOf("login") >= 0) {
return true; return true;
} }
// 获取当前请求对应的HttpSession对象HttpSession用于在服务器端存储用户相关的会话信息比如用户登录后的身份信息等。
HttpSession session = request.getSession(); HttpSession session = request.getSession();
// 获取Session中的用户登录信息
// 尝试从Session中获取用户登录信息这里假设用户登录成功后将登录的管理员信息Admin对象存入了名为"adminInfo"的Session属性中。
// 通过强制类型转换获取存储在Session中的Admin对象如果不存在则返回null。
Admin admin = (Admin) session.getAttribute("adminInfo"); Admin admin = (Admin) session.getAttribute("adminInfo");
// 判断Session中是否有用户数据如果有则返回true,继续向下执行
if(admin != null){ // 判断Session中是否获取到了用户数据即Admin对象是否为null如果不为null说明用户已经登录允许请求继续向下执行返回true。
if (admin!= null) {
return true; return true;
} }
// 地址栏不符合条件的直接重定向到登录页面
// 如果经过前面的判断地址栏对应的URL不符合可直接访问的条件既不是登录相关页面且用户又未登录
// 则使用响应对象的sendRedirect方法将请求重定向到登录页面这里的"/hellossm/to_login"是登录页面的相对路径,根据实际项目配置可能会不同)。
// 并且返回false表示中断当前请求不再继续执行后续的处理器逻辑。
response.sendRedirect("/hellossm/to_login"); response.sendRedirect("/hellossm/to_login");
return false; return false;
} }
/**
*
*
*
* @param request HTTP
* @param response HTTP
* @param handler
* @param modelAndView
* @throws Exception ModelAndView
*/
@Override @Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
} }
/**
*
*
*
* @param request HTTP
* @param response HTTP
* @param handler
* @param ex
* @throws Exception
*/
@Override @Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
} }
} }

@ -8,101 +8,151 @@ import java.util.List;
/** /**
* Description: * Description:
* 访使MyBatisSQLadmins
* *
* @Date: 2020/2/10 15:33 * @Date: 2020/2/10 15:33
* @Author: PeiChen * @Author: PeiChen
*/ */
@Repository @Repository
public interface AdminDao {//sss public interface AdminDao {
/** /**
* *
* @param admin * 使MyBatis@SelectSQL"admins"Admin
* @return *
* @throws Exception * @param admin AdminMyBatis#{username}#{password}SQL
* @return AdminnullMyBatis
* @throws Exception SQL
*/ */
@Select("select * from admins where username = #{username} and password = #{password}") @Select("select * from admins where username = #{username} and password = #{password}")
Admin findAdmin(Admin admin) throws Exception; Admin findAdmin(Admin admin) throws Exception;
/** /**
* id * id
* 使@SelectSQL"admins"idAdmin
* #{id}idSQLid
*
* @param id
* @return Adminnull
* @throws Exception
*/ */
@Select("select * from admins where id = #{id}") @Select("select * from admins where id = #{id}")
Admin findAdminById(Integer id) throws Exception; Admin findAdminById(Integer id) throws Exception;
/** /**
* *
* 使@SelectSQL"admins"
* MyBatisPageHelper
*
* @return List<Admin>
* @throws Exception
*/ */
@Select("select * from admins") @Select("select * from admins")
List<Admin> findAll() throws Exception; List<Admin> findAll() throws Exception;
/** /**
* *
* @return * 使@SelectSQL"admins"便Excel
* @throws Exception *
* @return List<Admin>
* @throws Exception 访
*/ */
@Select("select * from admins") @Select("select * from admins")
List<Admin> exportAdminInfo() throws Exception; List<Admin> exportAdminInfo() throws Exception;
/** /**
* id * id
* @param id * 使@DeleteSQLid"admins"
* @throws Exception * #{id}idSQL
*
* @param id
* @throws Exception
*/ */
@Delete("delete from admins where id = #{id}") @Delete("delete from admins where id = #{id}")
void deleteAdminById(Integer id) throws Exception; void deleteAdminById(Integer id) throws Exception;
/** /**
* *
* @param admin * @UpdateSQLAdmin"admins"id
* @throws Exception * 使#{}AdminSQL
*
* @param admin Admin
* @throws Exception
*/ */
@Update("update admins set username= #{username},name = #{name},uid = #{uid}, phone = #{phone}, description = #{description} where id = #{id}") @Update("update admins set username= #{username},name = #{name},uid = #{uid}, phone = #{phone}, description = #{description} where id = #{id}")
void updateAdmin(Admin admin) throws Exception; void updateAdmin(Admin admin) throws Exception;
/** /**
* *
* @param admin * @InsertSQLAdmin"admins"
* @throws Exception * #{}AdminSQL
*
* @param admin Admin
* @throws Exception
*/ */
@Insert("insert into admins(username,password,name,uid,phone,power,description) values (#{username},#{password},#{name},#{uid},#{phone},#{power},#{description})") @Insert("insert into admins(username,password,name,uid,phone,power,description) values (#{username},#{password},#{name},#{uid},#{phone},#{power},#{description})")
void addAdmin(Admin admin) throws Exception; void addAdmin(Admin admin) throws Exception;
/** /**
* *
* 使@SelectSQL"admins"使
* truefalseMyBatis
*
* @param u_name
* @return truefalse
* @throws Exception
*/ */
@Select("select * from admins where username = #{u_name}") @Select("select * from admins where username = #{u_name}")
Boolean checkUserName(String u_name) throws Exception; Boolean checkUserName(String u_name) throws Exception;
/** /**
* / * /
* @param uid * @SelectSQL"admins"/uid/使
* @return * Adminnull/null
* @throws Exception *
* @param uid /
* @return /Adminnull
* @throws Exception 访
*/ */
@Select("select * from admins where uid = #{uid}") @Select("select * from admins where uid = #{uid}")
Admin checkUid(String uid) throws Exception; Admin checkUid(String uid) throws Exception;
/** /**
* *
* @param password * 使@UpdateSQLid"admins"
* @param id * #{password}#{id}SQL
* @throws Exception *
* @param password
* @param id
* @throws Exception
*/ */
@Update("update admins set password = #{password} where id = #{id}") @Update("update admins set password = #{password} where id = #{id}")
void updatePassword(String password,Integer id) throws Exception; void updatePassword(String password, Integer id) throws Exception;
//select * from admins where username like '%p%' or name like '%万%' or power like '%1%' or description like '%管理员%'; //select * from admins where username like '%p%' or name like '%万%' or power like '%1%' or description like '%管理员%';
//模糊搜索管理员信息查询结果返回一个list集合 //模糊搜索管理员信息查询结果返回一个list集合
/**
*
* 使@SelectLIKESQL"admins"/keyword
* ${keyword}SQL#{keyword}${}#{}SQLList<Admin>
* 使${}SQL
*
* @param keyword
* @return List<Admin>
* @throws Exception
*/
@Select("select * from admins where username like '%${keyword}%' or name like '%${keyword}%' or uid like '%${keyword}%' or phone like '%${keyword}%' or power like '%${keyword}%' or description like '%${keyword}%' ") @Select("select * from admins where username like '%${keyword}%' or name like '%${keyword}%' or uid like '%${keyword}%' or phone like '%${keyword}%' or power like '%${keyword}%' or description like '%${keyword}%' ")
List<Admin> serarchInfo(@Param(value="keyword") String keyword) throws Exception; List<Admin> serarchInfo(@Param(value="keyword") String keyword) throws Exception;
/** /**
* *
* 0 1 2 3 * 0 1 2 3
* @param admin * @UpdateSQLAdminidpower"admins"
* @throws Exception * #{power}#{id}AdminSQL
*
* @param admin idpowerAdmin
* @throws Exception
*/ */
@Update("update admins set power = #{power} where id = #{id} ") @Update("update admins set power = #{power} where id = #{id} ")
void put_power(Admin admin) throws Exception; void put_power(Admin admin) throws Exception;
} }

@ -4,23 +4,54 @@ import java.io.Serializable;
/** /**
* Description: * Description:
* Java
* Serializable便使
* *
* @Date: 2020/2/10 15:13 * @Date: 2020/2/10 15:13
* @Author: PeiChen * @Author: PeiChen
*/ */
public class Admin implements Serializable { public class Admin implements Serializable {
private Integer id; //id 主键自增
private String username; //用户名
private String password; //密码
private String name; //姓名
private String uid; //学/工号
private String phone; //手机号
private int power; //是否开启权限
private String description; //描述
// 管理员的唯一标识,通常对应数据库表中的主键字段,设置为自增类型,用于唯一确定一条管理员记录。
private Integer id;
// 管理员的用户名,用于登录系统等操作,存储用户名相关的字符串信息。
private String username;
// 管理员的密码,用于验证登录身份,存储密码相关的字符串信息,在实际应用中应进行加密存储等安全处理。
private String password;
// 管理员的真实姓名,用于展示和区分不同的管理员个体,存储姓名相关的字符串信息。
private String name;
// 学/工号,用于唯一标识管理员在学校或单位内的身份编号,存储相应的字符串信息。
private String uid;
// 管理员的手机号码,可用于联系管理员等相关用途,存储手机号码的字符串信息。
private String phone;
// 表示管理员是否开启权限的标识,整型变量,具体含义根据业务逻辑确定(例如不同数值对应不同权限级别等)。
private int power;
// 对管理员的相关描述信息,比如岗位描述、职责范围等,存储对应的字符串信息。
private String description;
// 默认的无参构造函数,在一些框架进行对象实例化等操作时可能会用到,例如通过反射机制创建对象时需要默认构造函数。
public Admin() { public Admin() {
} }
/**
* Admin便
*
* @param id
* @param username
* @param password
* @param name
* @param uid /
* @param phone
* @param power
* @param description
*/
public Admin(Integer id, String username, String password, String name, String uid, String phone, int power, String description) { public Admin(Integer id, String username, String password, String name, String uid, String phone, int power, String description) {
this.id = id; this.id = id;
this.username = username; this.username = username;
@ -32,70 +63,92 @@ public class Admin implements Serializable {
this.description = description; this.description = description;
} }
// 获取管理员的唯一标识id的方法供外部类访问该对象的id属性值。
public Integer getId() { public Integer getId() {
return id; return id;
} }
// 设置管理员的唯一标识id的方法供外部类修改该对象的id属性值。
public void setId(Integer id) { public void setId(Integer id) {
this.id = id; this.id = id;
} }
// 获取管理员用户名的方法供外部类访问该对象的username属性值。
public String getUsername() { public String getUsername() {
return username; return username;
} }
// 设置管理员用户名的方法供外部类修改该对象的username属性值。
public void setUsername(String username) { public void setUsername(String username) {
this.username = username; this.username = username;
} }
// 获取管理员密码的方法供外部类访问该对象的password属性值。
public String getPassword() { public String getPassword() {
return password; return password;
} }
// 设置管理员密码的方法供外部类修改该对象的password属性值。
public void setPassword(String password) { public void setPassword(String password) {
this.password = password; this.password = password;
} }
// 获取管理员真实姓名的方法供外部类访问该对象的name属性值。
public String getName() { public String getName() {
return name; return name;
} }
// 设置管理员真实姓名的方法供外部类修改该对象的name属性值。
public void setName(String name) { public void setName(String name) {
this.name = name; this.name = name;
} }
// 获取管理员学/工号的方法供外部类访问该对象的uid属性值。
public String getUid() { public String getUid() {
return uid; return uid;
} }
// 设置管理员学/工号的方法供外部类修改该对象的uid属性值。
public void setUid(String uid) { public void setUid(String uid) {
this.uid = uid; this.uid = uid;
} }
// 获取管理员手机号码的方法供外部类访问该对象的phone属性值。
public String getPhone() { public String getPhone() {
return phone; return phone;
} }
// 设置管理员手机号码的方法供外部类修改该对象的phone属性值。
public void setPhone(String phone) { public void setPhone(String phone) {
this.phone = phone; this.phone = phone;
} }
// 获取管理员权限标识的方法供外部类访问该对象的power属性值。
public int getPower() { public int getPower() {
return power; return power;
} }
// 设置管理员权限标识的方法供外部类修改该对象的power属性值。
public void setPower(int power) { public void setPower(int power) {
this.power = power; this.power = power;
} }
// 获取管理员描述信息的方法供外部类访问该对象的description属性值。
public String getDescription() { public String getDescription() {
return description; return description;
} }
// 设置管理员描述信息的方法供外部类修改该对象的description属性值。
public void setDescription(String description) { public void setDescription(String description) {
this.description = description; this.description = description;
} }
/**
* toString便Admin便
* "Admin{" + = + '}'
*
* @return Admin
*/
@Override @Override
public String toString() { public String toString() {
return "Admin{" + return "Admin{" +
@ -109,4 +162,4 @@ public class Admin implements Serializable {
", description='" + description + '\'' + ", description='" + description + '\'' +
'}'; '}';
} }
} }

@ -2,188 +2,237 @@ package cn.ppdxzz.poi;
import org.apache.poi.hssf.usermodel.*; import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.hssf.util.HSSFColor; import org.apache.poi.hssf.util.HSSFColor;
import java.io.*; import java.io.*;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
/** /**
* Description:Excel * Description:Excel
* ExcelExcel便Web
* *
* @Date: 2020/2/16 15:17 * @Date: 2020/2/16 15:17
* @Author: PeiChen * @Author: PeiChen
*/ */
public class WriteExcel { public class WriteExcel {
//导出表的列名
// 导出表的列名数组用于存储Excel表格每列的标题名称。
private String[] rowName; private String[] rowName;
//每行作为一个Object对象
private List<Object[]> dataList = new ArrayList<Object[]>();
//构造方法,传入要导出的数据:第一个参数传入一个列名数组第二个参数传入一个list集合Object对象数组 // 每行作为一个Object对象这里使用List来存储多个Object数组每个Object数组代表Excel表格中的一行数据除去列名那一行
public WriteExcel(String[] rowName,List<Object[]> dataList){ private List<Object[]> dataList = new ArrayList<Object[]>();
// 构造方法,传入要导出的数据
// 第一个参数传入一个列名数组用于设置Excel表格的列标题。
// 第二个参数传入一个list集合Object对象数组集合中的每个Object数组对应Excel表格中的一行具体数据。
public WriteExcel(String[] rowName, List<Object[]> dataList) {
this.dataList = dataList; this.dataList = dataList;
this.rowName = rowName; this.rowName = rowName;
} }
/* /**
* *
* */ * Excel簿Excel便
public InputStream export() throws Exception{ *
HSSFWorkbook workbook = new HSSFWorkbook(); // 创建工作簿对象 * @return InputStreamExcel
HSSFSheet sheet = workbook.createSheet("sheet1"); // 创建工作表 * @throws Exception 簿IO
*/
public InputStream export() throws Exception {
// 创建工作簿对象这是整个Excel文件的基础容器后续的工作表、单元格等都将添加到这个工作簿中。
HSSFWorkbook workbook = new HSSFWorkbook();
// 创建工作表,这里创建了一个名为"sheet1"的工作表,一个工作簿可以包含多个工作表,此处只创建了一个。
HSSFSheet sheet = workbook.createSheet("sheet1");
// 设置sheet表样式 // 设置sheet表样式
HSSFCellStyle columnTopStyle = this.getColumnTopStyle(workbook);//获取列头样式对象 // 获取列头样式对象用于设置Excel表格中列标题那一行单元格的样式。
HSSFCellStyle style = this.getColumnStyle(workbook); //单元格样式对象 HSSFCellStyle columnTopStyle = this.getColumnTopStyle(workbook);
// 获取单元格样式对象用于设置Excel表格中除列标题外其他数据单元格的样式。
HSSFCellStyle style = this.getColumnStyle(workbook);
// 定义所需列数 // 定义所需列数通过传入的列名数组长度来确定Excel表格的列数。
int columnNum = rowName.length; int columnNum = rowName.length;
HSSFRow rowRowName = sheet.createRow(0); // 在索引2的位置创建行(最顶端的行开始的第二行) // 在索引0的位置创建行Excel表格中最顶端的行用于设置列头信息。
HSSFRow rowRowName = sheet.createRow(0);
// 将列头设置到sheet的单元格中 // 将列头设置到sheet的单元格中
for(int n=0;n<columnNum;n++){ // 循环遍历每一列,创建对应的单元格并设置相关属性,包括数据类型、值以及样式等。
HSSFCell cellRowName = rowRowName.createCell(n); //创建列头对应个数的单元格 for (int n = 0; n < columnNum; n++) {
cellRowName.setCellType(HSSFCell.CELL_TYPE_STRING); //设置列头单元格的数据类型 // 创建列头对应个数的单元格每个单元格对应Excel表格中的一列标题。
HSSFCell cellRowName = rowRowName.createCell(n);
// 设置列头单元格的数据类型为字符串类型,以便后续正确设置列头的文本内容。
cellRowName.setCellType(HSSFCell.CELL_TYPE_STRING);
// 创建一个富文本字符串对象,将列名数组中的对应列名作为文本内容传入,用于设置单元格的值。
HSSFRichTextString text = new HSSFRichTextString(rowName[n]); HSSFRichTextString text = new HSSFRichTextString(rowName[n]);
cellRowName.setCellValue(text); //设置列头单元格的值 // 设置列头单元格的值,即将列名填充到对应的单元格中。
cellRowName.setCellStyle(columnTopStyle); //设置列头单元格样式 cellRowName.setCellValue(text);
// 设置列头单元格样式,应用之前获取的列头样式对象,使列头具有统一的样式外观。
cellRowName.setCellStyle(columnTopStyle);
} }
//将查询出的数据设置到sheet对应的单元格中 // 将查询出的数据设置到sheet对应的单元格中
for(int i=0;i<dataList.size();i++){ // 遍历数据列表将每一行数据填充到Excel表格对应的行和列的单元格中。
for (int i = 0; i < dataList.size(); i++) {
Object[] obj = dataList.get(i); //遍历每个对象 // 取出每一行数据即一个Object数组数组中的每个元素对应Excel表格该行中的一个单元格数据。
HSSFRow row = sheet.createRow(i+1); //创建所需的行数 Object[] obj = dataList.get(i);
for(int j=0; j<obj.length; j++){ // 创建所需的行数索引从1开始因为0行已经用于列头了每循环一次创建一行对应数据列表中的一行数据。
HSSFCell cell = null; //设置单元格的数据类型 HSSFRow row = sheet.createRow(i + 1);
cell = row.createCell(j,HSSFCell.CELL_TYPE_STRING); // 循环遍历该行数据中的每个元素,将其填充到对应的单元格中。
if(!"".equals(obj[j]) && obj[j] != null){ for (int j = 0; j < obj.length; j++) {
cell.setCellValue(obj[j].toString()); //设置单元格的值 HSSFCell cell = null;
// 设置单元格的数据类型为字符串类型,方便处理各种类型的数据转换为字符串后填充到单元格。
cell = row.createCell(j, HSSFCell.CELL_TYPE_STRING);
if (!"".equals(obj[j]) && obj[j]!= null) {
// 如果数据不为空且不为空字符串,则将其转换为字符串后设置为单元格的值。
cell.setCellValue(obj[j].toString());
} }
cell.setCellStyle(style); //设置单元格样式 // 设置单元格样式,应用之前获取的普通单元格样式对象,使数据单元格具有统一的样式。
cell.setCellStyle(style);
} }
} }
//让列宽随着导出的列长自动适应
// 让列宽随着导出的列长自动适应
// 通过遍历每一列以及每一行中的单元格内容长度,来动态调整每列的宽度,使表格内容能更好地展示。
for (int colNum = 0; colNum < columnNum; colNum++) { for (int colNum = 0; colNum < columnNum; colNum++) {
// 先获取当前列的初始宽度并将其转换为以字符为单位除以256方便后续比较和调整。
int columnWidth = sheet.getColumnWidth(colNum) / 256; int columnWidth = sheet.getColumnWidth(colNum) / 256;
// 遍历工作表中的每一行从第0行开始到最后一行查找当前列中最长的单元格内容长度以此来确定该列合适的宽度。
for (int rowNum = 0; rowNum < sheet.getLastRowNum(); rowNum++) { for (int rowNum = 0; rowNum < sheet.getLastRowNum(); rowNum++) {
HSSFRow currentRow; HSSFRow currentRow;
//如若当前行未被使用过,则新建一行 // 如若当前行未被使用过即为null,则新建一行,以便后续获取单元格进行操作。
if (sheet.getRow(rowNum) == null) { if (sheet.getRow(rowNum) == null) {
currentRow = sheet.createRow(rowNum); currentRow = sheet.createRow(rowNum);
} else { } else {
currentRow = sheet.getRow(rowNum); currentRow = sheet.getRow(rowNum);
} }
if (currentRow.getCell(colNum) != null) { if (currentRow.getCell(colNum)!= null) {
HSSFCell currentCell = currentRow.getCell(colNum); HSSFCell currentCell = currentRow.getCell(colNum);
if (currentCell.getCellType() == HSSFCell.CELL_TYPE_STRING) { if (currentCell.getCellType() == HSSFCell.CELL_TYPE_STRING) {
// 如果当前单元格的数据类型是字符串类型,则获取其字符串内容的字节长度,以此来衡量其显示宽度。
int length = currentCell.getStringCellValue().getBytes().length; int length = currentCell.getStringCellValue().getBytes().length;
if (columnWidth < length) { if (columnWidth < length) {
// 如果当前列宽小于该单元格内容长度对应的宽度,则更新列宽为该单元格内容长度对应的宽度,确保能完整显示内容。
columnWidth = length; columnWidth = length;
} }
} }
} }
} }
if(colNum == 0){ // 根据列的索引位置,对列宽进行适当的调整(减去或加上一定的偏移量,使表格看起来更美观、合适),然后设置为最终的列宽。
sheet.setColumnWidth(colNum, (columnWidth-2) * 256); if (colNum == 0) {
}else{ sheet.setColumnWidth(colNum, (columnWidth - 2) * 256);
sheet.setColumnWidth(colNum, (columnWidth+4) * 256); } else {
sheet.setColumnWidth(colNum, (columnWidth + 4) * 256);
} }
} }
// 生成一个文件名,文件名包含当前时间戳信息(取其中一部分),后缀为".xls"表示生成的是Excel 2003格式的文件。
String fileName = "Excel-" + String.valueOf(System.currentTimeMillis()).substring(4, 13) + ".xls"; String fileName = "Excel-" + String.valueOf(System.currentTimeMillis()).substring(4, 13) + ".xls";
// 设置响应头中的文件信息,指定文件名以及表示这是一个附件(用于文件下载场景),告知浏览器以附件形式处理该文件并显示给定的文件名。
String headStr = "attachment; filename=\"" + fileName + "\""; String headStr = "attachment; filename=\"" + fileName + "\"";
ByteArrayOutputStream os=new ByteArrayOutputStream();
// 创建一个字节数组输出流对象用于临时存储Excel工作簿写入的文件内容后续将其转换为字节数组再转换为输入流返回。
ByteArrayOutputStream os = new ByteArrayOutputStream();
try { try {
// 将工作簿的内容写入到字节数组输出流中即将Excel文件内容以字节形式存储到内存中的输出流里。
workbook.write(os); workbook.write(os);
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
byte[] content=os.toByteArray(); // 将字节数组输出流中的内容转换为字节数组,以便后续创建输入流。
InputStream is=new ByteArrayInputStream(content); byte[] content = os.toByteArray();
// 根据字节数组创建一个字节输入流对象该输入流指向的内容就是生成的Excel文件内容最终将其返回供外部使用如文件下载等操作
InputStream is = new ByteArrayInputStream(content);
return is; return is;
} }
/* /**
* *
* Excel
*
* @param workbook 簿簿
* @return HSSFCellStyle
*/ */
public HSSFCellStyle getColumnTopStyle(HSSFWorkbook workbook) { public HSSFCellStyle getColumnTopStyle(HSSFWorkbook workbook) {
// 设置字体 // 设置字体
HSSFFont font = workbook.createFont(); HSSFFont font = workbook.createFont();
//设置字体大小 // 设置字体大小为11号以指定列头字体的显示大小。
font.setFontHeightInPoints((short)11); font.setFontHeightInPoints((short) 11);
//字体加粗 // 设置字体加粗,使列头文字更加突出、醒目。
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
//设置字体名字 // 设置字体名字为"Courier New",指定列头文字使用的字体类型。
font.setFontName("Courier New"); font.setFontName("Courier New");
//设置样式;
// 设置样式
HSSFCellStyle style = workbook.createCellStyle(); HSSFCellStyle style = workbook.createCellStyle();
//设置底边框; // 设置底边框为细边框,定义了单元格底部边框的样式为细线类型。
style.setBorderBottom(HSSFCellStyle.BORDER_THIN); style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
//设置底边框颜色; // 设置底边框颜色为黑色,指定了单元格底部边框的颜色。
style.setBottomBorderColor(HSSFColor.BLACK.index); style.setBottomBorderColor(HSSFColor.BLACK.index);
//设置左边框; // 设置左边框为细边框,确定单元格左边框的样式。
style.setBorderLeft(HSSFCellStyle.BORDER_THIN); style.setBorderLeft(HSSFColor.BLACK.index);
//设置左边框颜色; // 设置左边框颜色为黑色,设定单元格左边框的颜色。
style.setLeftBorderColor(HSSFColor.BLACK.index); style.setLeftBorderColor(HSSFColor.BLACK.index);
//设置右边框; // 设置右边框为细边框,定义单元格右边框的样式。
style.setBorderRight(HSSFCellStyle.BORDER_THIN); style.setBorderRight(HSSFColor.BLACK.index);
//设置右边框颜色; // 设置右边框颜色为黑色,指定单元格右边框的颜色。
style.setRightBorderColor(HSSFColor.BLACK.index); style.setRightBorderColor(HSSFColor.BLACK.index);
//设置顶边框; // 设置顶边框为细边框,确定单元格顶部边框的样式。
style.setBorderTop(HSSFCellStyle.BORDER_THIN); style.setBorderTop(HSSFColor.BLACK.index);
//设置顶边框颜色; // 设置顶边框颜色为黑色,设定单元格顶部边框的颜色。
style.setTopBorderColor(HSSFColor.BLACK.index); style.setTopBorderColor(HSSFColor.BLACK.index);
//在样式用应用设置的字体; // 在样式中应用设置的字体,将之前创建的字体对象应用到该单元格样式中,使字体设置生效。
style.setFont(font); style.setFont(font);
//设置自动换行; // 设置自动换行属性为false即单元格内容超过列宽时不自动换行显示根据实际需求可调整
style.setWrapText(false); style.setWrapText(false);
//设置水平对齐的样式为居中对齐; // 设置水平对齐的样式为居中对齐,使列头内容在水平方向上居中显示,看起来更美观。
style.setAlignment(HSSFCellStyle.ALIGN_CENTER); style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
//设置垂直对齐的样式为居中对齐; // 设置垂直对齐的样式为居中对齐,让列头内容在垂直方向上也居中显示,整体排版更整齐。
style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
return style; return style;
} }
/* /**
* *
* Excel
*
* @param workbook 簿簿
* @return HSSFCellStyle
*/ */
public HSSFCellStyle getColumnStyle(HSSFWorkbook workbook) { public HSSFCellStyle getColumnStyle(HSSFWorkbook workbook) {
// 设置字体 // 设置字体
HSSFFont font = workbook.createFont(); HSSFFont font = workbook.createFont();
//设置字体名字 // 设置字体名字为"Courier New",指定数据单元格文字使用的字体类型。
font.setFontName("Courier New"); font.setFontName("Courier New");
//设置样式;
// 设置样式
HSSFCellStyle style = workbook.createCellStyle(); HSSFCellStyle style = workbook.createCellStyle();
//设置底边框; // 设置底边框为细边框,定义了单元格底部边框的样式为细线类型。
style.setBorderBottom(HSSFCellStyle.BORDER_THIN); style.setBorderBottom(HSSFColor.BLACK.index);
//设置底边框颜色; // 设置底边框颜色为黑色,指定了单元格底部边框的颜色。
style.setBottomBorderColor(HSSFColor.BLACK.index); style.setBottomBorderColor(HSSFColor.BLACK.index);
//设置左边框; // 设置左边框为细边框,确定单元格左边框的样式。
style.setBorderLeft(HSSFCellStyle.BORDER_THIN); style.setBorderLeft(HSSFColor.BLACK.index);
//设置左边框颜色; // 设置左边框颜色为黑色,设定单元格左边框的颜色。
style.setLeftBorderColor(HSSFColor.BLACK.index); style.setLeftBorderColor(HSSFColor.BLACK.index);
//设置右边框; // 设置右边框为细边框,定义单元格右边框的样式。
style.setBorderRight(HSSFCellStyle.BORDER_THIN); style.setBorderRight(HSSFColor.BLACK.index);
//设置右边框颜色; // 设置右边框颜色为黑色,指定单元格右边框的颜色。
style.setRightBorderColor(HSSFColor.BLACK.index); style.setRightBorderColor(HSSFColor.BLACK.index);
//设置顶边框; // 设置顶边框为细边框,确定单元格顶部边框的样式。
style.setBorderTop(HSSFCellStyle.BORDER_THIN); style.setBorderTop(HSSFColor.BLACK.index);
//设置顶边框颜色; // 设置顶边框颜色为黑色,设定单元格顶部边框的颜色。
style.setTopBorderColor(HSSFColor.BLACK.index); style.setTopBorderColor(HSSFColor.BLACK.index);
//在样式用应用设置的字体; // 在样式中应用设置的字体,将之前创建的字体对象应用到该单元格样式中,使字体设置生效。
style.setFont(font); style.setFont(font);
//设置自动换行; // 设置自动换行属性为false即单元格内容超过列宽时不自动换行显示根据实际需求可调整
style.setWrapText(false); style.setWrapText(false);
//设置水平对齐的样式为居中对齐; // 设置水平对齐的样式为居中对齐,使数据内容在水平方向上居中显示,看起来更美观。
style.setAlignment(HSSFCellStyle.ALIGN_CENTER); style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
//设置垂直对齐的样式为居中对齐; // 设置垂直对齐的样式为居中对齐,让数据内容在垂直方向上也居中显示,整体排版更整齐。
style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); style.setVerticalAlignment(HSSFColor.BLACK.index);
return style; return style;
} }
} }

@ -1,43 +1,139 @@
package cn.ppdxzz.service; package cn.ppdxzz.service;
import cn.ppdxzz.domain.Admin; import cn.ppdxzz.domain.Admin;
import java.io.InputStream; import java.io.InputStream;
import java.util.List; import java.util.List;
/** /**
* Description: * Description:
* AdminServiceImplControllerDao
* 使便
* *
* @Date: 2020/2/10 15:27 * @Date: 2020/2/10 15:27
* @Author: PeiChen * @Author: PeiChen
*/ */
public interface AdminService { public interface AdminService {
/** /**
* *
* Admin
* Adminnull
*
* @param admin Admin
* @return Adminnull
* @throws Exception
*/ */
Admin findAdmin(Admin admin) throws Exception; Admin findAdmin(Admin admin) throws Exception;
//通过id查询管理员信息
// 通过id查询管理员信息
/**
* id
* idAdminnull
*
* @param id
* @return Adminnull
* @throws Exception
*/
Admin findAdminById(Integer id) throws Exception; Admin findAdminById(Integer id) throws Exception;
List<Admin> findAll(int page,int size) throws Exception; /**
*
* pagesize
*
*
* @param page 1
* @param size
* @return List<Admin>
* @throws Exception 使
*/
List<Admin> findAll(int page, int size) throws Exception;
/**
* id
* idid
*
* @param id
* @throws Exception
*/
void deleteAdminById(Integer id) throws Exception; void deleteAdminById(Integer id) throws Exception;
/**
*
* Admin
*
*
* @param admin Admin
* @throws Exception
*/
void updateAdmin(Admin admin) throws Exception; void updateAdmin(Admin admin) throws Exception;
/**
*
* Admin
*
*
* @param admin Admin
* @throws Exception
*/
void addAdmin(Admin admin) throws Exception; void addAdmin(Admin admin) throws Exception;
/**
*
* 使
* truefalse
*
* @param u_name
* @return truefalse
* @throws Exception
*/
Boolean checkUserName(String u_name) throws Exception; Boolean checkUserName(String u_name) throws Exception;
//模糊搜索管理员信息查询结果返回一个list集合
List<Admin> serarchInfo(int page,int size,String keyword) throws Exception;
//授权 // 模糊搜索管理员信息查询结果返回一个list集合
/**
*
* pagesizekeyword
* 便
*
* @param page 1
* @param size
* @param keyword
* @return List<Admin>
* @throws Exception 使
*/
List<Admin> serarchInfo(int page, int size, String keyword) throws Exception;
// 授权
/**
*
* Admin
*
*
* @param admin Admin
* @throws Exception
*/
void put_power(Admin admin) throws Exception; void put_power(Admin admin) throws Exception;
//返回一个携带所有管理员信息数据的InputStream输入流 // 返回一个携带所有管理员信息数据的InputStream输入流
/**
*
* Excel
* InputStream
*
* @return InputStream
* @throws Exception
*/
InputStream getInputStream() throws Exception; InputStream getInputStream() throws Exception;
//校验学工号是否被注册 // 校验学工号是否被注册
/**
* /
* ///使
* Adminnullnull/
*
* @param uid /
* @return /Adminnull
* @throws Exception
*/
Admin checkUid(String uid) throws Exception; Admin checkUid(String uid) throws Exception;
} }

@ -18,7 +18,8 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
/** /**
* Description: * Description: AdminService
* AdminDao
* *
* @Date: 2020/2/10 15:30 * @Date: 2020/2/10 15:30
* @Author: PeiChen * @Author: PeiChen
@ -26,7 +27,10 @@ import java.util.List;
@Service("adminService") @Service("adminService")
public class AdminServiceImpl implements AdminService { public class AdminServiceImpl implements AdminService {
// 依赖注入AdminDao接口用于调用持久层的数据库操作方法。
private AdminDao adminDao; private AdminDao adminDao;
// 通过@Autowired注解让Spring框架自动注入AdminDao的实现类实例实现依赖注入。
@Autowired @Autowired
public void setAdminDao(AdminDao adminDao) { public void setAdminDao(AdminDao adminDao) {
this.adminDao = adminDao; this.adminDao = adminDao;
@ -34,9 +38,11 @@ public class AdminServiceImpl implements AdminService {
/** /**
* findAdmin() * findAdmin()
* @param admin * Admin
* @return *
* @throws Exception * @param admin Admin
* @return Adminnull
* @throws Exception
*/ */
@Override @Override
public Admin findAdmin(Admin admin) throws Exception { public Admin findAdmin(Admin admin) throws Exception {
@ -45,9 +51,11 @@ public class AdminServiceImpl implements AdminService {
/** /**
* id * id
* @param id * id
* @return Admin *
* @throws Exception * @param id
* @return Adminnull
* @throws Exception
*/ */
@Override @Override
public Admin findAdminById(Integer id) throws Exception { public Admin findAdminById(Integer id) throws Exception {
@ -56,19 +64,26 @@ public class AdminServiceImpl implements AdminService {
/** /**
* *
* @return * PageHelper
* @throws Exception *
* @param page
* @param size
* @return List<Admin>
* @throws Exception 使
*/ */
@Override @Override
public List<Admin> findAll(int page,int size) throws Exception { public List<Admin> findAll(int page, int size) throws Exception {
PageHelper.startPage(page,size); // 启动PageHelper分页功能设置当前页码和每页显示的记录数后续调用持久层查询方法时会自动应用分页逻辑。
PageHelper.startPage(page, size);
return adminDao.findAll(); return adminDao.findAll();
} }
/** /**
* id * id
* @param id * idid
* @throws Exception *
* @param id
* @throws Exception
*/ */
@Override @Override
public void deleteAdminById(Integer id) throws Exception { public void deleteAdminById(Integer id) throws Exception {
@ -77,8 +92,10 @@ public class AdminServiceImpl implements AdminService {
/** /**
* *
* @param admin * Admin
* @throws Exception *
* @param admin Admin
* @throws Exception
*/ */
@Override @Override
public void updateAdmin(Admin admin) throws Exception { public void updateAdmin(Admin admin) throws Exception {
@ -87,8 +104,11 @@ public class AdminServiceImpl implements AdminService {
/** /**
* *
* @param admin * 使Spring@Transactional
* @throws Exception * Admin
*
* @param admin Admin
* @throws Exception
*/ */
@Transactional @Transactional
@Override @Override
@ -96,11 +116,20 @@ public class AdminServiceImpl implements AdminService {
adminDao.addAdmin(admin); adminDao.addAdmin(admin);
} }
/**
*
* 使
* nulltruefalse
*
* @param u_name
* @return truefalse
* @throws Exception
*/
@Override @Override
public Boolean checkUserName(String u_name) throws Exception { public Boolean checkUserName(String u_name) throws Exception {
//System.out.println(adminDao.checkUserName(u_name)); //System.out.println(adminDao.checkUserName(u_name));
//用户名不存在则返回空直接false // 用户名不存在则返回空直接false
if (adminDao.checkUserName(u_name) != null) { if (adminDao.checkUserName(u_name)!= null) {
return true; return true;
} }
return false; return false;
@ -108,21 +137,28 @@ public class AdminServiceImpl implements AdminService {
/** /**
* *
* @param keyword * PageHelper
* @return *
* @throws Exception * @param page
* @param size
* @param keyword
* @return List<Admin>
* @throws Exception 使
*/ */
@Override @Override
public List<Admin> serarchInfo(int page,int size,String keyword) throws Exception { public List<Admin> serarchInfo(int page, int size, String keyword) throws Exception {
PageHelper.startPage(page,size); // 启动PageHelper分页功能设置当前页码和每页显示的记录数后续调用持久层模糊查询方法时会自动应用分页逻辑。
PageHelper.startPage(page, size);
List<Admin> list = adminDao.serarchInfo(keyword); List<Admin> list = adminDao.serarchInfo(keyword);
return list; return list;
} }
/** /**
* *
* @param admin * Admin
* @throws Exception *
* @param admin Admin
* @throws Exception
*/ */
@Override @Override
public void put_power(Admin admin) throws Exception { public void put_power(Admin admin) throws Exception {
@ -131,17 +167,23 @@ public class AdminServiceImpl implements AdminService {
/** /**
* *
* @return * Excel
* @throws Exception * WriteExcelExcelWeb
*
* @return InputStreamExcel
* @throws Exception Excel
*/ */
@Override @Override
public InputStream getInputStream() throws Exception { public InputStream getInputStream() throws Exception {
//Excel中的每列列名依次对应数据库的字段 // Excel中的每列列名依次对应数据库的字段用于设置导出的Excel表格的列标题。
String[] title = new String[]{"ID","用户名","密码","姓名","学/工号","手机号","权限","描述"}; String[] title = new String[]{"ID", "用户名", "密码", "姓名", "学/工号", "手机号", "权限", "描述"};
// 调用持久层的方法获取数据库中所有管理员的信息得到一个List<Admin>集合集合中的每个Admin对象代表一条管理员记录。
List<Admin> admins = adminDao.exportAdminInfo(); List<Admin> admins = adminDao.exportAdminInfo();
List<Object[]> dataList = new ArrayList<Object[]>(); // 创建一个用于存储每行数据的列表每个元素是一个Object数组代表Excel表格中的一行数据除去列标题行初始化为空列表。
List<Object[]> dataList = new ArrayList<Object[]>();
// 遍历从数据库获取的管理员信息列表将每条管理员记录的各个字段值提取出来整理成Object数组形式添加到数据列表中以便后续生成Excel文件。
for (int i = 0; i < admins.size(); i++) { for (int i = 0; i < admins.size(); i++) {
Object[] obj = new Object[7]; Object[] obj = new Object[8];
obj[0] = admins.get(i).getId(); obj[0] = admins.get(i).getId();
obj[1] = admins.get(i).getUsername(); obj[1] = admins.get(i).getUsername();
obj[2] = admins.get(i).getPassword(); obj[2] = admins.get(i).getPassword();
@ -152,20 +194,25 @@ public class AdminServiceImpl implements AdminService {
obj[7] = admins.get(i).getDescription(); obj[7] = admins.get(i).getDescription();
dataList.add(obj); dataList.add(obj);
} }
// 创建WriteExcel类的实例传入列名数组和整理好的数据列表用于生成Excel文件。
WriteExcel ex = new WriteExcel(title, dataList); WriteExcel ex = new WriteExcel(title, dataList);
InputStream in; InputStream in;
// 调用WriteExcel类的export方法生成包含管理员信息的Excel文件对应的输入流将其赋值给变量in。
in = ex.export(); in = ex.export();
return in; return in;
} }
/** /**
* / * /
* @param uid * //使
* @return * Adminnull/null
* @throws Exception *
* @param uid /
* @return /Adminnull
* @throws Exception
*/ */
@Override @Override
public Admin checkUid(String uid) throws Exception { public Admin checkUid(String uid) throws Exception {
return adminDao.checkUid(uid); return adminDao.checkUid(uid);
} }
} }

@ -4,59 +4,112 @@ import java.security.MessageDigest;
/** /**
* MD5 * MD5
* MD5
* UTF-8MD5便
*/ */
public class MD5Util { public class MD5Util {
/**
*
*
*
* @param b MD5
* @return
*/
private static String byteArrayToHexString(byte b[]) { private static String byteArrayToHexString(byte b[]) {
// 创建一个StringBuffer对象用于高效地拼接字符串存储最终转换后的十六进制字符串结果。
StringBuffer resultSb = new StringBuffer(); StringBuffer resultSb = new StringBuffer();
// 遍历字节数组中的每个字节
for (int i = 0; i < b.length; i++) for (int i = 0; i < b.length; i++)
// 调用byteToHexString方法将每个字节转换为十六进制字符串并添加到resultSb中
resultSb.append(byteToHexString(b[i])); resultSb.append(byteToHexString(b[i]));
return resultSb.toString(); return resultSb.toString();
} }
/**
*
* 44
*
*
* @param b
* @return 2
*/
private static String byteToHexString(byte b) { private static String byteToHexString(byte b) {
// 将字节转换为整数如果字节值是负数Java中字节是有符号的范围是 -128 到 127则通过加上256将其转换为正数范围0 到 255便于后续计算。
int n = b; int n = b;
if (n < 0) if (n < 0)
n += 256; n += 256;
// 获取该整数的高4位用于对应十六进制的高位数字通过除以16来得到十六进制中每一位代表16的幂次高4位对应的幂次为1
int d1 = n / 16; int d1 = n / 16;
// 获取该整数的低4位用于对应十六进制的低位数字通过取模16来得到。
int d2 = n % 16; int d2 = n % 16;
// 从预定义的十六进制字符数组中查找对应的字符拼接成十六进制字符串返回高4位在前低4位在后。
return hexDigits[d1] + hexDigits[d2]; return hexDigits[d1] + hexDigits[d2];
} }
/** /**
* MD5 * MD5
* MD5
* MessageDigestMD5
*
* @param origin MD5
* @param charsetname 使null使
* @return MD5null
*/ */
private static String MD5Encode(String origin, String charsetname) { private static String MD5Encode(String origin, String charsetname) {
String resultString = null; String resultString = null;
try { try {
// 先将传入的原始字符串赋值给结果字符串变量,这里可以根据实际需求考虑是否进行深拷贝等更严谨的处理(当前代码只是简单赋值)。
resultString = new String(origin); resultString = new String(origin);
// 获取MD5算法的MessageDigest实例用于进行MD5摘要计算通过传入"MD5"字符串指定使用MD5算法。
MessageDigest md = MessageDigest.getInstance("MD5"); MessageDigest md = MessageDigest.getInstance("MD5");
// 如果未指定字符编码或者字符编码为空字符串则使用默认方式将字符串转换为字节数组后进行MD5摘要计算再将摘要结果转换为十六进制字符串。
if (charsetname == null || "".equals(charsetname)) if (charsetname == null || "".equals(charsetname))
resultString = byteArrayToHexString(md.digest(resultString.getBytes())); resultString = byteArrayToHexString(md.digest(resultString.getBytes()));
else else
// 如果指定了字符编码则按照指定的字符编码将字符串转换为字节数组然后进行MD5摘要计算并转换为十六进制字符串。
resultString = byteArrayToHexString(md.digest(resultString.getBytes(charsetname))); resultString = byteArrayToHexString(md.digest(resultString.getBytes(charsetname)));
} catch (Exception exception) { } catch (Exception exception) {
// 当前代码只是简单捕获异常,未做详细的异常处理(如记录日志、抛出更具体的异常等),实际应用中可根据需求完善此处逻辑。
} }
return resultString.toUpperCase(); return resultString.toUpperCase();
} }
/**
* UTF-8MD5
* 便使UTF-8MD5Encode
* SaltMD5
*
* @param origin MD5
* @return UTF-8MD5
*/
public static String MD5EncodeUtf8(String origin) { public static String MD5EncodeUtf8(String origin) {
//盐值Salt加密 // 盐值Salt加密
//origin = origin + PropertiesUtil.getProperty("password.salt", ""); // 以下代码是预留的盐值加密逻辑通过从配置文件PropertiesUtil.getProperty方法调用此处未展示该类的实现中获取盐值
// 将盐值添加到原始字符串后面再进行MD5加密可以使相同的原始字符串在不同的盐值情况下加密结果不同增强安全性。
// 当前代码将其注释掉了,如果需要启用盐值加密,可取消注释并确保配置文件读取等相关逻辑正确实现。
// origin = origin + PropertiesUtil.getProperty("password.salt", "");
return MD5Encode(origin, "utf-8"); return MD5Encode(origin, "utf-8");
} }
// 预定义的十六进制字符数组用于在字节转换十六进制字符串时查找对应的字符表示按照十六进制的顺序排列从0到f。
private static final String hexDigits[] = {"0", "1", "2", "3", "4", "5", private static final String hexDigits[] = {"0", "1", "2", "3", "4", "5",
"6", "7", "8", "9", "a", "b", "c", "d", "e", "f"}; "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"};
/**
* MD5
* MD5Util
* MD5EncodeUtf8"123456"MD5便
*
* @param args 使
*/
public static void main(String[] args) { public static void main(String[] args) {
MD5Util md = new MD5Util(); MD5Util md = new MD5Util();
String psd = md.MD5EncodeUtf8("123456"); String psd = md.MD5EncodeUtf8("123456");
System.out.println(psd); System.out.println(psd);
} }
} }
Loading…
Cancel
Save