nodejs+vue图书预约退换个性化推荐系统
Posted qq_3166678367
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nodejs+vue图书预约退换个性化推荐系统相关的知识,希望对你有一定的参考价值。
图书个性化推荐系统的主要使用者分为管理员和学生,实现功能包括管理员:首页、个人中心、学生管理、图书分类管理、图书信息管理、图书预约管理、退换图书管理、管理员管理、留言板管理、系统管理,学生:首页、个人中心、图书预约管理、退换图书管理、我的收藏管理,前台首页;首页、图书信息、好书推荐、留言反馈、个人中心、后台管理等功能。由于本系统的功能模块设计比较全面,所以使得整个图书个性化推荐系统信息管理的过程得以实现。
1、用户注册功能
2、用户登录功能、验证码逻辑、忘记密码功能。
3、封装基于axios的ajax功能
4、文件上传功能
5、权限功能
6、编写通用的基于axios的ajax功能
7、封装搜索组件
8、封装校验组件
9、 封装下拉组件
10、封装table组件
11、编写通用弹窗功能
12、编写路由组件
13、封装vuex
14、编写分页组件功能
15、编写通用时间utils工具类
16、编写富文本组件
17、编写表单组件
18、编写导航组件
19、编写饼图组件
整个系统是由多个功能模块组合而成的,要将所有的功能模块都一一列举出来,然后进行逐个的功能设计,使得每一个模块都有相对应的功能设计,然后进行系统整体的设计。
本图书个性化推荐系统结构图如图前端功能:
3.1首页
图书个性化推荐系统,在前台首页可以查看首页、图书信息、好书推荐、留言反馈、个人中心、后台管理等内容,如图
3.2图书信息
在图书信息页面通过查看图书编号、图书名称、图书类别、图片、作者、出版社、版次、数量、点击次数等信息进行预约、立即提交或点我收藏操作,如图
四、管理员模块
4.1首页
管理员登录进入图书个性化推荐系统可以查看首页、个人中心、学生管理、图书分类管理、图书信息管理、图书预约管理、退换图书管理、管理员管理、留言板管理、系统管理等信息。
4.2学生管理
在学生管理页面中可以通过查看学号、密码、学生姓名、性别、出生日期、联系电话、班级等内容进行修改、删除等操作,如图所示。还可以根据需要对图书分类管理进行修改或删除等详细操作,如图
4.3图书信息管理
在图书信息管理页面中可以查看图书编号、图书名称、图书类别、图片、作者、出版社、版次、数量等信息,并可根据需要对己有图书信息管理进行详情、预约、查看评论、修改或删除等操作,如图
4.4图书预约管理
在图书预约管理页面中可以查看图书编号、图书名称、图书类别、作者、出版社、版次、数量、学号、学生姓名、联系电话、申请日期、审核回复、审核信息等操作,如图
4.5退换图书管理
在退换图书管理页面中可以查看图书编号、图书名称、作者、出版社、版次、数量、学号、退换类型、退换原因、日期、审核回复、审核状态、审核等内容,并且根据需要对己有退换图书管理进行详情,修改或删除等详细操作,如图
4.6管理员管理
在管理员管理页面中可以查看用户名、密码、角色等内容,并且根据需要对已有管理员管理进行详情,修改或删除等详细操作,如图
五、学生功能模块
学生登录进入图书个性化推荐系统可以查看首页、个人中心、图书预约管理、退换图书管理、我的收藏管理等内容。
5.1个人信息
在个人信息页面中通过填写学号、密码、学生姓名、性别、出生日期、联系电话、班级等信息,还可以根据需要对个人信息进行修改等操作、如图
5.2图书预约管理
在图书预约管理页面中可以查看图书编号、图书名称、图书类别、作者、出版社、版次、数量、学号、学生姓名、联系电话、申请日期、审核回复、审核状态等信息内容,并且根据需要对已有
基于SSM实现图书馆座位预约系统
作者主页:编程指南针
作者简介:Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师
主要内容:Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助
文末获取源码
项目编号:BS-XX-140
一,项目简介
在当今建设创新型国家的形势下,随着国家相关战略的大力落实,政府单位密切关注高等教育的发展,不仅增加了许多有利的社会制度,并且也大力投入学校基础设施建设[1]。通过种种举措,使得高校的办学条件及学生学习环境得到质的提高。如果说高校是孕育人才的摇篮,那么图书馆就是编制这个摇篮的藤条。而学生在面对当今培育人才计划的压力,他们需要汲取更多的不同领域的知识来不断扩充自己的知识层面,包括通过考证考研来增加自身资本。由于个人条件能力有限,每个人都不可能拥有各个领域相关的全部书籍,这时候,图书馆就可以充分发挥作用,履行它自身的职能,为广大师生提供书籍及相关资料,满足他们的需求。
基于我国人口基数大的基本国情下,哪怕政府已多增加对高校建设的投入,人均资源占有量仍然偏低[1]。尤其在图书馆座位资源利用中,最常见的问题无非是座位短缺,大多数人也曾称之为“一座难求”。图书馆不合理的座位管理会制约馆内的资源使用,而上述的常见问题亟待解决,如果没有很好地处理问题,将会影响学生对图书馆的使用率,同时也是对国家政府大力投入资源的浪费。
现当今信息网络发展迅速,移动服务将会是现在乃至未来发展的主流。由我国互联网络信息中心用确切数据指出:在2017年12月前,中国手机网民数量达7.53亿,且该数量连续三年上升[2]。由此可见,互联网的普及度很广。中国14亿人口中就有一半以上使用微信,可以说大部分的日常社交生活是离不开微信,而微信推出的小程序比APP更方便快捷。因此针对图书馆座位管理问题,我选择用微信小程序设计图书馆座位管理系统,希望能为合理管理图书馆座位提供点建议。
本项目主要使用jsp+ssm+mysql实现的图书馆预约占座管理系统,前端采用的是当下最流行的easyui框架,后台用的ssm(spring、springMVC、mybaits)框架,主要实现的功能有:
用户管理、菜单管理、角色管理、权限管理、学生管理、教师管理、班级管理、图书馆阅览室管理、学生信用管理、预约占座管理、发帖评论管理、违规统计、占座预约统计等,添加学生和教师时会自动在用户表中注册,定时任务会定时生成座位信息,阅览室分类中可设置信用等级,学生被扣分后信用等级低于相应的值后不能预约相应的阅览室座位。
本系统有着完备的权限管理和控制系统,基于用户、角色、权限三方实现,可以给不同的用户分配不同的角色,为不同的角色分配不同的权限,角色即是一个系列权限的集合。
二,环境介绍
语言环境:Java: jdk1.8
数据库:Mysql: mysql5.7
应用服务器:Tomcat: tomcat8.5.31
开发工具:IDEA或eclipse
前端技术:jsp+easyui+ajax+jquery
后端技术:spring+springmvc+mybatis+定时任务
三,系统展示
下面展示一下系统的主要功能:
登陆页面:
后台系统首页
用户管理
菜单管理
信用积分
选座功能
查看空余选座
违规统计
占座统计
其它功能不在一一展示,所有菜单功能均己实现
四,核心代码展示
package dingzhen.controller;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import dingzhen.util.StringUtil;
import dingzhen.util.WriterUtil;
import dingzhen.entity.Menu;
import dingzhen.entity.Role;
import dingzhen.entity.User;
import dingzhen.service.MenuService;
import dingzhen.service.RoleService;
import dingzhen.service.UserService;
/**
* 登录
*/
@Controller
@SuppressWarnings("unchecked")
public class LoginController
private User user;
private User currentUser;
@Autowired
private UserService<User> userService;
@Autowired
private MenuService<Menu> menuService;
private Role role;
@Autowired
private RoleService<Role> roleService;
private Map map;
@RequestMapping("login")
public void login(HttpServletRequest request,HttpServletResponse response)
try
HttpSession session = request.getSession();
String userName=request.getParameter("userName");
String password=request.getParameter("password");
String imageCode=request.getParameter("imageCode");
request.setAttribute("userName", userName);
request.setAttribute("password", password);
request.setAttribute("imageCode", imageCode);
if(StringUtil.isEmpty(userName)||StringUtil.isEmpty(password))
request.setAttribute("error", "账户或密码为空");
request.getRequestDispatcher("login.jsp").forward(request, response);
return;
if(StringUtil.isEmpty(imageCode))
request.setAttribute("error", "验证码为空");
request.getRequestDispatcher("login.jsp").forward(request, response);
return;
if(!imageCode.equals(session.getAttribute("sRand")))
request.setAttribute("error", "验证码错误");
request.getRequestDispatcher("login.jsp").forward(request, response);
return;
map = new HashMap<String, String>();
map.put("userName", userName);
map.put("password", password);
currentUser = userService.loginUser(map);
if(currentUser==null)
request.setAttribute("error", "用户名或密码错误");
request.getRequestDispatcher("login.jsp").forward(request, response);
else
role = roleService.findOneRole(currentUser.getRoleId());
String roleName=role.getRoleName();
currentUser.setRoleName(roleName);
session.setAttribute("currentUser", currentUser);
session.setAttribute("currentOperationIds", role.getOperationIds());
response.sendRedirect("main.htm");
catch (Exception e)
e.printStackTrace();
// 进入系统主界面
@RequestMapping("main")
public String toMain(HttpServletRequest request)
Object attribute = request.getSession().getAttribute("currentUser");
if(attribute == null)
return "redirect:login.htm";
//return "main";
return "sys/main";
// 加载最上级左菜单树
@RequestMapping("menuTree")
public void getMenuTree(HttpServletRequest request,HttpServletResponse response)
try
String parentId = request.getParameter("parentId");
currentUser = (User) request.getSession().getAttribute("currentUser");
role = roleService.findOneRole(currentUser.getRoleId());
String[] menuIds = role.getMenuIds().split(",");
map = new HashMap();
map.put("parentId",parentId);
map.put("menuIds", menuIds);
JSONArray jsonArray = getMenusByParentId(parentId, menuIds);
WriterUtil.write(response, jsonArray.toString());
catch (Exception e)
e.printStackTrace();
// 递归加载所所有树菜单
public JSONArray getMenusByParentId(String parentId,String[] menuIds)throws Exception
JSONArray jsonArray=this.getMenuByParentId(parentId,menuIds);
for(int i=0;i<jsonArray.size();i++)
JSONObject jsonObject=jsonArray.getJSONObject(i);
if("open".equals(jsonObject.getString("state")))
continue;
else
jsonObject.put("children", getMenusByParentId(jsonObject.getString("id"),menuIds));
return jsonArray;
// 将所有的树菜单放入easyui要求格式的json
public JSONArray getMenuByParentId(String parentId,String[] menuIds)throws Exception
JSONArray jsonArray=new JSONArray();
map= new HashMap();
map.put("parentId",parentId);
map.put("menuIds", menuIds);
List<Menu> list = menuService.menuTree(map);
for(Menu menu : list)
JSONObject jsonObject = new JSONObject();
jsonObject.put("id", menu.getMenuId());
jsonObject.put("text", menu.getMenuName());
jsonObject.put("iconCls", menu.getIconCls());
JSONObject attributeObject = new JSONObject();
attributeObject.put("menuUrl", menu.getMenuUrl());
if(!hasChildren(menu.getMenuId(), menuIds))
jsonObject.put("state", "open");
else
jsonObject.put("state", menu.getState());
jsonObject.put("attributes", attributeObject);
jsonArray.add(jsonObject);
return jsonArray;
// 判断是不是有子孩子,人工结束递归树
public boolean hasChildren(Integer parentId,String[] menuIds)
boolean flag = false;
try
map= new HashMap();
map.put("parentId",parentId);
map.put("menuIds", menuIds);
List<Menu> list = menuService.menuTree(map);
if (list == null || list.size()==0)
flag = false;
else
flag = true;
catch (Exception e)
e.printStackTrace();
return flag;
// 更新密码
@RequestMapping("updatePassword")
public void updatePassword(HttpServletRequest request,HttpServletResponse response)
JSONObject result=new JSONObject();
try
String userId=request.getParameter("userId");
String newPassword=request.getParameter("newPassword");
user=new User();
user.setUserId(Integer.parseInt(userId));
user.setPassword(newPassword);
userService.updateUser(user);
result.put("success", "true");
catch (Exception e)
e.printStackTrace();
result.put("success", "true");
result.put("errorMsg", "对不起!密码修改失败");
WriterUtil.write(response, result.toString());
//安全退出
@SuppressWarnings("unused")
@RequestMapping("logout")
private void logout(HttpServletRequest request,HttpServletResponse response) throws Exception
request.getSession().invalidate();
response.sendRedirect("login.jsp");
package dingzhen.controller;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import dingzhen.util.StringUtil;
import dingzhen.util.WriterUtil;
import dingzhen.entity.Menu;
import dingzhen.entity.Role;
import dingzhen.entity.User;
import dingzhen.service.MenuService;
import dingzhen.service.RoleService;
import dingzhen.service.UserService;
/**
* 登录
*/
@Controller
@SuppressWarnings("unchecked")
public class LoginController
private User user;
private User currentUser;
@Autowired
private UserService<User> userService;
@Autowired
private MenuService<Menu> menuService;
private Role role;
@Autowired
private RoleService<Role> roleService;
private Map map;
@RequestMapping("login")
public void login(HttpServletRequest request,HttpServletResponse response)
try
HttpSession session = request.getSession();
String userName=request.getParameter("userName");
String password=request.getParameter("password");
String imageCode=request.getParameter("imageCode");
request.setAttribute("userName", userName);
request.setAttribute("password", password);
request.setAttribute("imageCode", imageCode);
if(StringUtil.isEmpty(userName)||StringUtil.isEmpty(password))
request.setAttribute("error", "账户或密码为空");
request.getRequestDispatcher("login.jsp").forward(request, response);
return;
if(StringUtil.isEmpty(imageCode))
request.setAttribute("error", "验证码为空");
request.getRequestDispatcher("login.jsp").forward(request, response);
return;
if(!imageCode.equals(session.getAttribute("sRand")))
request.setAttribute("error", "验证码错误");
request.getRequestDispatcher("login.jsp").forward(request, response);
return;
map = new HashMap<String, String>();
map.put("userName", userName);
map.put("password", password);
currentUser = userService.loginUser(map);
if(currentUser==null)
request.setAttribute("error", "用户名或密码错误");
request.getRequestDispatcher("login.jsp").forward(request, response);
else
role = roleService.findOneRole(currentUser.getRoleId());
String roleName=role.getRoleName();
currentUser.setRoleName(roleName);
session.setAttribute("currentUser", currentUser);
session.setAttribute("currentOperationIds", role.getOperationIds());
response.sendRedirect("main.htm");
catch (Exception e)
e.printStackTrace();
// 进入系统主界面
@RequestMapping("main")
public String toMain(HttpServletRequest request)
Object attribute = request.getSession().getAttribute("currentUser");
if(attribute == null)
return "redirect:login.htm";
//return "main";
return "sys/main";
// 加载最上级左菜单树
@RequestMapping("menuTree")
public void getMenuTree(HttpServletRequest request,HttpServletResponse response)
try
String parentId = request.getParameter("parentId");
currentUser = (User) request.getSession().getAttribute("currentUser");
role = roleService.findOneRole(currentUser.getRoleId());
String[] menuIds = role.getMenuIds().split(",");
map = new HashMap();
map.put("parentId",parentId);
map.put("menuIds", menuIds);
JSONArray jsonArray = getMenusByParentId(parentId, menuIds);
WriterUtil.write(response, jsonArray.toString());
catch (Exception e)
e.printStackTrace();
// 递归加载所所有树菜单
public JSONArray getMenusByParentId(String parentId,String[] menuIds)throws Exception
JSONArray jsonArray=this.getMenuByParentId(parentId,menuIds);
for(int i=0;i<jsonArray.size();i++)
JSONObject jsonObject=jsonArray.getJSONObject(i);
if("open".equals(jsonObject.getString("state")))
continue;
else
jsonObject.put("children", getMenusByParentId(jsonObject.getString("id"),menuIds));
return jsonArray;
// 将所有的树菜单放入easyui要求格式的json
public JSONArray getMenuByParentId(String parentId,String[] menuIds)throws Exception
JSONArray jsonArray=new JSONArray();
map= new HashMap();
map.put("parentId",parentId);
map.put("menuIds", menuIds);
List<Menu> list = menuService.menuTree(map);
for(Menu menu : list)
JSONObject jsonObject = new JSONObject();
jsonObject.put("id", menu.getMenuId());
jsonObject.put("text", menu.getMenuName());
jsonObject.put("iconCls", menu.getIconCls());
JSONObject attributeObject = new JSONObject();
attributeObject.put("menuUrl", menu.getMenuUrl());
if(!hasChildren(menu.getMenuId(), menuIds))
jsonObject.put("state", "open");
else
jsonObject.put("state", menu.getState());
jsonObject.put("attributes", attributeObject);
jsonArray.add(jsonObject);
return jsonArray;
// 判断是不是有子孩子,人工结束递归树
public boolean hasChildren(Integer parentId,String[] menuIds)
boolean flag = false;
try
map= new HashMap();
map.put("parentId",parentId);
map.put("menuIds", menuIds);
List<Menu> list = menuService.menuTree(map);
if (list == null || list.size()==0)
flag = false;
else
flag = true;
catch (Exception e)
e.printStackTrace();
return flag;
// 更新密码
@RequestMapping("updatePassword")
public void updatePassword(HttpServletRequest request,HttpServletResponse response)
JSONObject result=new JSONObject();
try
String userId=request.getParameter("userId");
String newPassword=request.getParameter("newPassword");
user=new User();
user.setUserId(Integer.parseInt(userId));
user.setPassword(newPassword);
userService.updateUser(user);
result.put("success", "true");
catch (Exception e)
e.printStackTrace();
result.put("success", "true");
result.put("errorMsg", "对不起!密码修改失败");
WriterUtil.write(response, result.toString());
//安全退出
@SuppressWarnings("unused")
@RequestMapping("logout")
private void logout(HttpServletRequest request,HttpServletResponse response) throws Exception
request.getSession().invalidate();
response.sendRedirect("login.jsp");
package dingzhen.controller;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import dingzhen.entity.Menu;
import dingzhen.entity.Operation;
import dingzhen.service.MenuService;
import dingzhen.service.OperationService;
import dingzhen.util.StringUtil;
import dingzhen.util.WriterUtil;
/**
* 菜单管理
*/
@RequestMapping("menu")
@Controller
public class MenuController
private Menu menu;
private Operation operation;
@Autowired
private MenuService<Menu> menuService;
@Autowired
private OperationService<Operation> operationService;
@RequestMapping("menuIndex")
public String index()
return "sys/menu";
@RequestMapping("treeGridMenu")
public void treeGridMenu(HttpServletRequest request,HttpServletResponse response)
try
String parentId=request.getParameter("parentId");
JSONArray jsonArray = getListByParentId(parentId);
WriterUtil.write(response, jsonArray.toString());
catch (Exception e)
e.printStackTrace();
public JSONArray getListByParentId(String parentId)throws Exception
JSONArray jsonArray=this.getTreeGridMenuByParentId(parentId);
for(int i=0;i<jsonArray.size();i++)
JSONObject jsonObject=jsonArray.getJSONObject(i);
if("open".equals(jsonObject.getString("state")))
continue;
else
jsonObject.put("children", getListByParentId(jsonObject.getString("id")));
return jsonArray;
public JSONArray getTreeGridMenuByParentId(String parentId)throws Exception
JSONArray jsonArray=new JSONArray();
menu = new Menu();
menu.setParentId(Integer.parseInt(parentId));
List<Menu> list = menuService.findMenu(menu);
for(Menu menu : list)
JSONObject jsonObject = new JSONObject();
Integer menuId = menu.getMenuId();
jsonObject.put("id", menuId);
jsonObject.put("text", menu.getMenuName());
jsonObject.put("iconCls", menu.getIconCls());
jsonObject.put("state", menu.getState());
jsonObject.put("seq", menu.getSeq());
jsonObject.put("menuUrl", menu.getMenuUrl());
jsonObject.put("menuDescription", menu.getMenuDescription());
// 加上该页面菜单下面的按钮
operation = new Operation();
operation.setMenuId(menuId);
List<Operation> operaList = operationService.findOperation(operation);
if (operaList!=null && operaList.size()>0)
String string = "";
for (Operation o : operaList)
string += o.getOperationName() + ",";
jsonObject.put("operationNames", string.substring(0,string.length()-1));
else
jsonObject.put("operationNames", "");
jsonArray.add(jsonObject);
return jsonArray;
@RequestMapping("reserveMenu")
public void reserveMenu(HttpServletRequest request,HttpServletResponse response,Menu menu)
String menuId = request.getParameter("menuId");
JSONObject result=new JSONObject();
try
if (StringUtil.isNotEmpty(menuId)) //更新操作
menu.setMenuId(Integer.parseInt(menuId));
menuService.updateMenu(menu);
else
String parentId = request.getParameter("parentId");
menu.setParentId(Integer.parseInt(parentId));
if (isLeaf(parentId))
// 添加操作
menuService.addMenu(menu);
// 更新他上级状态。变成CLOSED
menu = new Menu();
menu.setMenuId(Integer.parseInt(parentId));
menu.setState("closed");
menuService.updateMenu(menu);
else
menuService.addMenu(menu);
result.put("success", true);
catch (Exception e)
e.printStackTrace();
result.put("success", true);
result.put("errorMsg", "对不起,操作失败!");
WriterUtil.write(response, result.toString());
// 判断是不是叶子节点
public boolean isLeaf(String menuId)
boolean flag = false;
try
menu = new Menu();
menu.setParentId(Integer.parseInt(menuId));
List<Menu> list = menuService.findMenu(menu);
if (list==null || list.size()==0)
flag = true;
catch (Exception e)
e.printStackTrace();
return flag;
@RequestMapping("deleteMenu")
public void deleteMenu(HttpServletRequest request,HttpServletResponse response)
JSONObject result = new JSONObject();
try
String menuId = request.getParameter("menuId");
String parentId = request.getParameter("parentId");
if (!isLeaf(menuId)) //不是叶子节点,说明有子菜单,不能删除
result.put("errorMsg", "该菜单下面有子菜单,不能直接删除");
else
menu = new Menu();
menu.setParentId(Integer.parseInt(parentId));
int sonNum = menuService.countMenu(menu);
if (sonNum == 1)
// 只有一个孩子,删除该孩子,且把父亲状态置为open
menu = new Menu();
menu.setMenuId(Integer.parseInt(parentId));
menu.setState("open");
menuService.updateMenu(menu);
menuService.deleteMenu(Integer.parseInt(menuId));
else
//不只一个孩子,直接删除
menuService.deleteMenu(Integer.parseInt(menuId));
result.put("success", true);
catch (Exception e)
e.printStackTrace();
result.put("errorMsg", "对不起,删除失败!");
WriterUtil.write(response, result.toString());
五,项目总结
在国内,传统的图书馆管理容易引起矛盾争纷,“占座”现象一直是存在的,由该现象引起的矛盾也是络绎不绝。许多高校在馆内随处附上“禁止占座”的标示语,管理员也会提醒学生离馆时一定要把自己的物品都带走,否则将全部清掉。然而有些学生视若无睹,管理员在闭馆后还是要去收拾他们用来占座的物品,这在一定程度上,使得管理人员的工作量被增加了。当隔天学生来找不到自己被清理掉的物品时,又极度容易和管理员闹不愉快,亦或者是学生间也会因为占座问题产生矛盾[3]。曲奎等人综合多种因素总结出产生“占座”现象的原因,他们认为用计算机管理可以解决这个问题,并在这个问题的基础上,建议图书馆的座位需要有个系统来方便管理[4]。通过文献查找发现高校中图书馆不乏有些可行方案,比如华北电力大学曾创建了基于VB的图书馆座位管理系统,王炳江等人指出了该系统可以有效保障用户使用图书馆的权力,同时遏止了占座陋习[5]。但是王孝亮等人认为该系统通过刷卡进行座位分配,用户仅借书,系统也会随机帮他们安排座位,这在一定程度上也会造成座位浪费[6];河北工业大学曾利用RFID射频技术进行座位资源管理,韩慧在其论文中指出,该系统需要较多的硬件成本,且容易被数据收集、系统布线制约,存在一定局限性[1]。
国外教育发展早,他们十分重视图书馆在人类社会的作用,比如说德国,它被称为图书馆最多的国家之一,每年都有上亿人来参观[7]。专家们把图书馆资源当作资源分配的问题来处理,在提高资源的利用性以及分配问题下了许多功夫,尤其是从九十年代以来,国外大多数学校通过网络化来管理图书馆,这使得管理效率得到一定的提升,21世纪初,他们把社交媒体软件融入到图书馆的网络管理,如Facebook、Instagram等。国外的占座现象没有像国内这么普遍严重,但是这一现象也是不可避免地存在着,德国大学通过分散用户需求来解决图书馆座位资源不充分的问题,该校把学生的上课时间和考试分散安排,这也能适当缓解高峰时段过多的人流量给图书馆带来的压力[8]。目前大多数外国图书馆座位预约管理系统已经获得了较大的发展。
以上是关于nodejs+vue图书预约退换个性化推荐系统的主要内容,如果未能解决你的问题,请参考以下文章