目录
图
实现
1.1前端事件
$(function () {
$("#login_btn").click(function () {
$.post("User/login",$("#loginForm").serialize(),function (data) {
if (data.flag) {
//如果后端判断成功,则跳转
location.href = "index.html";
}else {
$("#errorMsg").html(data.errorMsg);
$("#checkCode").attr("src","checkCode?"+new Date().getTime())
}
})
})
})
1.2验证码与非空检查
/**
* 登录
* */
public void login(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
UserService userService = new UserServiceImpl();
//获取用户名非空判断
String username = request.getParameter("username");
//获取密码非空判断
String password = request.getParameter("password");
//获取验证码
String check = request.getParameter("check");
//封装表单查数据库
Map<String, String[]> parameterMap = request.getParameterMap();
User user = new User();
try {
BeanUtils.populate(user, parameterMap);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
ResultInfo resultInfo = new ResultInfo();
HttpSession session = request.getSession();
String checkcode_server = (String) session.getAttribute("CHECKCODE_SERVER");
//健壮性
session.removeAttribute("CHECKCODE_SERVER");
//验证码的判断
if (checkcode_server == null || !checkcode_server.equalsIgnoreCase(check)) {
resultInfo = new ResultInfo();
resultInfo.setFlag(false);
resultInfo.setErrorMsg("验证码错误!");
/**
* 未封装的方法
* */
/*ObjectMapper mapper = new ObjectMapper();*/
/*mapper = new ObjectMapper();
String json = mapper.writeValueAsString(resultInfo);
response.setContentType("application/json;charset=utf-8");
response.getWriter().write(json);*/
/**
* 封装后的方法
* */
writeValue(resultInfo,response);
} else {
//非空判断
if ((password != null && !"".equals(password)) && (username != null && !"".equals(username))) {
User result = userService.findUsernameAndPassword(user);
//数据库查询
if (result != null && "Y".equals(result.getStatus())) {
resultInfo.setFlag(true);
//设置全局变量
session.setAttribute("user",result);
System.out.println(result.toString());
/**
* 未封装的方法
* */
/*String successJson = mapper.writeValueAsString(resultInfo);
response.setContentType("application/json;charset=utf-8");
response.getWriter().write(successJson);
System.out.println(successJson + "---------------1");*/
/**
* 封装后的方法
* */
writeValue(resultInfo,response);
}
//验证码判断,
if (result != null &&!"Y".equals(result.getStatus())) {
resultInfo.setFlag(false);
resultInfo.setErrorMsg("账户未激活!");
/**
* 未封装的方法
* */
/*response.setContentType("application/json;charset=utf-8");
String json = mapper.writeValueAsString(resultInfo);
response.getWriter().write(json);*/
/**
* 封装后的方法
* */
writeValue(resultInfo,response);
}
if (result == null) {
resultInfo.setFlag(false);
resultInfo.setErrorMsg("账户或密码错误,请检查!");
/**
* 未封装的方法
* */
/*String json = mapper.writeValueAsString(resultInfo);
response.setContentType("application/json;charset=utf-8");
response.getWriter().write(json);
System.out.println(json);
System.out.println(json + "------------------3");*/
/**
* 封装后的方法
* */
writeValue(resultInfo,response);
}
} else {
resultInfo.setFlag(false);
resultInfo.setErrorMsg("账户或密码为空,请检查!");
/**
* 未封装的方法
* */
/*String json = mapper.writeValueAsString(resultInfo);
response.setContentType("application/json;charset=utf-8");
response.getWriter().write(json);
System.out.println(json);
System.out.println("------------------4");*/
/**
* 封装后的方法
* */
writeValue(resultInfo,response);
}
}
}
1.3用户名和密码数据库查询service
@Override
public User findUsernameAndPassword(User user) {
User result = userDao.findUsernameAndPassword(user);
return result;
}
}
1.3用户名和密码数据库查询dao
@Override
public User findUsernameAndPassword(User user) {
User result = null;
try {
String sql = " select * from tab_user where username = ? and password = ? ";
result = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<User>(User.class), user.getUsername(),user.getPassword());
} catch (DataAccessException e) {
}
return result;
}
}
1.4退出操作
/**
* 退出方法
* */
public void exit(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//删除所有session
request.getSession().invalidate();
//重定向到登录页面
response.sendRedirect(request.getContextPath() + "/login.html");
}
1.5退出操作前端
/**
* 用户信息显示
* */
$(function () {
//页面加载完隐藏用户信息界面
$("#login_div").hide()
//显示退出页面
$("#login_out").show()
$.get("User/findOne", {}, function (data) {
//欢迎标语---》“欢迎回来,杨皓”
var msg = "欢迎回来," + data.name
$("#span_name").html(msg);
//显示用户信息
$("#login_div").show()
//隐藏退出按钮
$("#login_out").hide()
})
})
1.6分类列表前端
/**
* category显示
* */
$(function () {
$.get("Category/findAll",{},function (data) {
var lis = '<li class="nav-active"><a href="index.html">首页</a></li>'
for (let i = 0; i < data.length; i++) {
var li ='<li><a href="route_list.html?cid='+data[i].cid+'">'+data[i].cname+'</a></li>';
lis += li;
}
lis += '<li><a href="favoriterank.html">收藏排行榜</a></li>';
$("#category").append(lis);
})
})
1.7分类列表后端
/**
* @ClassName CategoryServlet
* @Description 分类列表
* @Author Yanghao2
* @Date 2021/11/24 10:19
* @Version V1.0
*/
@WebServlet("/Category/*")
public class CategoryServlet extends BaseServlet{
private CategoryService categoryService = new CategoryServiceImpl();
public void findAll(HttpServletRequest request, HttpServletResponse response) throws IOException {
//调dao
List<Category> all = categoryService.findAll();
//写回前端
writeValue(all,response);
}
}
1.8分类列表service
/**
* @ClassName CategoryServiceImpl
* @Description
* @Author Yanghao2
* @Date 2021/11/24 10:32
* @Version V1.0
*/
public class CategoryServiceImpl implements CategoryService {
CategoryDao dao = new CategoryDaoImpl();
/**
* 从缓存查数据
* */
@Override
public List<Category> findAll() {
/*List<Category> categories = dao.findAll();*/
//获取jedis对象
Jedis jedis = JedisUtil.getJedis();
//查缓存内key为category的所有数据,如果有数据更新,zrange就会出现数据查询重复和遗漏的情况。而zrangeWithScore却由于符合条件则全部查询出来的特性,而不会出现重复和遗漏。
/*Set<String> categoryS = jedis.zrange("category", 0, -1);*/
Set<Tuple> categoryS = jedis.zrangeWithScores("category", 0, -1);
List<Category> cs = null;
if (categoryS == null || categoryS.size() == 0) {
//如果缓存为空则查数据库
cs = dao.findAll();
//遍历查询出来的数据
for (int i = 0; i < cs.size(); i++) {
//将数据按照数据库内的主键排序,对相关业务员较友好
jedis.zadd("category",cs.get(i).getCid(),cs.get(i).getCname());
System.out.println("从数据查询");
}
}else {
//如果缓存有数据则取缓存的数据
cs = new ArrayList<Category>();
//遍历缓存内的数据
for (Tuple tuple : categoryS) {
//获取category实体类对象
Category category = new Category();
//设置cname
category.setCname(tuple.getElement());
//设置cid
category.setCid((int) tuple.getScore()) ;
//将实体类存入一个列表,返回值要求是一个集合,以保证可以返回
cs.add(category);
}
System.out.println("从缓存查询");
}
//返回集合
return cs;
}
}
1.8分类列表dao
/**
* @ClassName CategoryImpl
* @Description
* @Author Yanghao2
* @Date 2021/11/24 10:28
* @Version V1.0
*/
public class CategoryDaoImpl implements CategoryDao {
JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
@Override
public List<Category> findAll() {
String sql = "select * from tab_category";
List<Category> categories = template.query(sql, new BeanPropertyRowMapper<Category>(Category.class));
return categories;
}
}