基于SSM實(shí)現(xiàn)圖書館座位預(yù)約系統(tǒng)
項(xiàng)目編號(hào):BS-XX-014
一,項(xiàng)目簡(jiǎn)介
在當(dāng)今建設(shè)創(chuàng)新型國(guó)家的形勢(shì)下,隨著國(guó)家相關(guān)戰(zhàn)略的大力落實(shí),政府單位密切關(guān)注高等教育的發(fā)展,不僅增加了許多有利的社會(huì)制度,并且也大力投入學(xué)?;A(chǔ)設(shè)施建設(shè)[1]。通過種種舉措,使得高校的辦學(xué)條件及學(xué)生學(xué)習(xí)環(huán)境得到質(zhì)的提高。如果說高校是孕育人才的搖籃,那么圖書館就是編制這個(gè)搖籃的藤條。而學(xué)生在面對(duì)當(dāng)今培育人才計(jì)劃的壓力,他們需要汲取更多的不同領(lǐng)域的知識(shí)來不斷擴(kuò)充自己的知識(shí)層面,包括通過考證考研來增加自身資本。由于個(gè)人條件能力有限,每個(gè)人都不可能擁有各個(gè)領(lǐng)域相關(guān)的全部書籍,這時(shí)候,圖書館就可以充分發(fā)揮作用,履行它自身的職能,為廣大師生提供書籍及相關(guān)資料,滿足他們的需求。
基于我國(guó)人口基數(shù)大的基本國(guó)情下,哪怕政府已多增加對(duì)高校建設(shè)的投入,人均資源占有量仍然偏低[1]。尤其在圖書館座位資源利用中,最常見的問題無非是座位短缺,大多數(shù)人也曾稱之為“一座難求”。圖書館不合理的座位管理會(huì)制約館內(nèi)的資源使用,而上述的常見問題亟待解決,如果沒有很好地處理問題,將會(huì)影響學(xué)生對(duì)圖書館的使用率,同時(shí)也是對(duì)國(guó)家政府大力投入資源的浪費(fèi)。
現(xiàn)當(dāng)今信息網(wǎng)絡(luò)發(fā)展迅速,移動(dòng)服務(wù)將會(huì)是現(xiàn)在乃至未來發(fā)展的主流。由我國(guó)互聯(lián)網(wǎng)絡(luò)信息中心用確切數(shù)據(jù)指出:在2017年12月前,中國(guó)手機(jī)網(wǎng)民數(shù)量達(dá)7.53億,且該數(shù)量連續(xù)三年上升[2]。由此可見,互聯(lián)網(wǎng)的普及度很廣。中國(guó)14億人口中就有一半以上使用微信,可以說大部分的日常社交生活是離不開微信,而微信推出的小程序比APP更方便快捷。因此針對(duì)圖書館座位管理問題,我選擇用微信小程序設(shè)計(jì)圖書館座位管理系統(tǒng),希望能為合理管理圖書館座位提供點(diǎn)建議。
本項(xiàng)目主要使用jsp+ssm+mysql實(shí)現(xiàn)的圖書館預(yù)約占座管理系統(tǒng),前端采用的是當(dāng)下最流行的easyui框架,后臺(tái)用的ssm(spring、springMVC、mybaits)框架,主要實(shí)現(xiàn)的功能有:
用戶管理、菜單管理、角色管理、權(quán)限管理、學(xué)生管理、教師管理、班級(jí)管理、圖書館閱覽室管理、學(xué)生信用管理、預(yù)約占座管理、發(fā)帖評(píng)論管理、違規(guī)統(tǒng)計(jì)、占座預(yù)約統(tǒng)計(jì)等,添加學(xué)生和教師時(shí)會(huì)自動(dòng)在用戶表中注冊(cè),定時(shí)任務(wù)會(huì)定時(shí)生成座位信息,閱覽室分類中可設(shè)置信用等級(jí),學(xué)生被扣分后信用等級(jí)低于相應(yīng)的值后不能預(yù)約相應(yīng)的閱覽室座位。
本系統(tǒng)有著完備的權(quán)限管理和控制系統(tǒng),基于用戶、角色、權(quán)限三方實(shí)現(xiàn),可以給不同的用戶分配不同的角色,為不同的角色分配不同的權(quán)限,角色即是一個(gè)系列權(quán)限的集合。
二,環(huán)境介紹
語言環(huán)境:Java:? jdk1.8
數(shù)據(jù)庫:Mysql: mysql5.7
應(yīng)用服務(wù)器:Tomcat:? tomcat8.5.31
開發(fā)工具:IDEA或eclipse
前端技術(shù):jsp+easyui+ajax+jquery
后端技術(shù):spring+springmvc+mybatis+定時(shí)任務(wù)
三,系統(tǒng)展示
下面展示一下系統(tǒng)的主要功能:
登陸頁面:

后臺(tái)系統(tǒng)首頁

用戶管理


菜單管理

信用積分


選座功能

查看空余選座

違規(guī)統(tǒng)計(jì)

占座統(tǒng)計(jì)

其它功能不在一一展示,所有菜單功能均己實(shí)現(xiàn)
四,核心代碼展示
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;/**
* 登錄
*/public class LoginController { private User user; private User currentUser;
private UserService<User> userService;
private MenuService<Menu> menuService; private Role role;
private RoleService<Role> roleService; private Map map;
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", "驗(yàn)證碼為空");
request.getRequestDispatcher("login.jsp").forward(request, response); return;
} if(!imageCode.equals(session.getAttribute("sRand"))){
request.setAttribute("error", "驗(yàn)證碼錯(cuò)誤");
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", "用戶名或密碼錯(cuò)誤");
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();
}
}
// 進(jìn)入系統(tǒng)主界面
public String toMain(HttpServletRequest request){ Object attribute = request.getSession().getAttribute("currentUser"); if(attribute == null){ return "redirect:login.htm";
} //return "main";
return "sys/main";
}
// 加載最上級(jí)左菜單樹
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;
}
// 判斷是不是有子孩子,人工結(jié)束遞歸樹
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;
}
// 更新密碼
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", "對(duì)不起!密碼修改失敗");
}
WriterUtil.write(response, result.toString());
}
//安全退出
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;/**
* 登錄
*/public class LoginController { private User user; private User currentUser;
private UserService<User> userService;
private MenuService<Menu> menuService; private Role role;
private RoleService<Role> roleService; private Map map;
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", "驗(yàn)證碼為空");
request.getRequestDispatcher("login.jsp").forward(request, response); return;
} if(!imageCode.equals(session.getAttribute("sRand"))){
request.setAttribute("error", "驗(yàn)證碼錯(cuò)誤");
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", "用戶名或密碼錯(cuò)誤");
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();
}
}
// 進(jìn)入系統(tǒng)主界面
public String toMain(HttpServletRequest request){ Object attribute = request.getSession().getAttribute("currentUser"); if(attribute == null){ return "redirect:login.htm";
} //return "main";
return "sys/main";
}
// 加載最上級(jí)左菜單樹
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;
}
// 判斷是不是有子孩子,人工結(jié)束遞歸樹
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;
}
// 更新密碼
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", "對(duì)不起!密碼修改失敗");
}
WriterUtil.write(response, result.toString());
}
//安全退出
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;/**
* 菜單管理
*/public class MenuController { private Menu menu; private Operation operation;
private MenuService<Menu> menuService;
private OperationService<Operation> operationService;
public String index(){ return "sys/menu";
}
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;
}
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); ?
// 更新他上級(jí)狀態(tài)。變成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", "對(duì)不起,操作失敗!");
}
WriterUtil.write(response, result.toString());
}
// 判斷是不是葉子節(jié)點(diǎn)
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;
}
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)) { ?//不是葉子節(jié)點(diǎn),說明有子菜單,不能刪除
result.put("errorMsg", "該菜單下面有子菜單,不能直接刪除");
} else {
menu = new Menu();
menu.setParentId(Integer.parseInt(parentId)); int sonNum = menuService.countMenu(menu); if (sonNum == 1) { ? // 只有一個(gè)孩子,刪除該孩子,且把父親狀態(tài)置為open
menu = new Menu();
menu.setMenuId(Integer.parseInt(parentId));
menu.setState("open");
menuService.updateMenu(menu);
menuService.deleteMenu(Integer.parseInt(menuId));
} else { //不只一個(gè)孩子,直接刪除
menuService.deleteMenu(Integer.parseInt(menuId));
}
result.put("success", true);
}
} catch (Exception e) {
e.printStackTrace();
result.put("errorMsg", "對(duì)不起,刪除失??!");
}
WriterUtil.write(response, result.toString());
}
}
五,項(xiàng)目總結(jié)
在國(guó)內(nèi),傳統(tǒng)的圖書館管理容易引起矛盾爭(zhēng)紛,“占座”現(xiàn)象一直是存在的,由該現(xiàn)象引起的矛盾也是絡(luò)繹不絕。許多高校在館內(nèi)隨處附上“禁止占座”的標(biāo)示語,管理員也會(huì)提醒學(xué)生離館時(shí)一定要把自己的物品都帶走,否則將全部清掉。然而有些學(xué)生視若無睹,管理員在閉館后還是要去收拾他們用來占座的物品,這在一定程度上,使得管理人員的工作量被增加了。當(dāng)隔天學(xué)生來找不到自己被清理掉的物品時(shí),又極度容易和管理員鬧不愉快,亦或者是學(xué)生間也會(huì)因?yàn)檎甲鶈栴}產(chǎn)生矛盾[3]。曲奎等人綜合多種因素總結(jié)出產(chǎn)生“占座”現(xiàn)象的原因,他們認(rèn)為用計(jì)算機(jī)管理可以解決這個(gè)問題,并在這個(gè)問題的基礎(chǔ)上,建議圖書館的座位需要有個(gè)系統(tǒng)來方便管理[4]。通過文獻(xiàn)查找發(fā)現(xiàn)高校中圖書館不乏有些可行方案,比如華北電力大學(xué)曾創(chuàng)建了基于VB的圖書館座位管理系統(tǒng),王炳江等人指出了該系統(tǒng)可以有效保障用戶使用圖書館的權(quán)力,同時(shí)遏止了占座陋習(xí)[5]。但是王孝亮等人認(rèn)為該系統(tǒng)通過刷卡進(jìn)行座位分配,用戶僅借書,系統(tǒng)也會(huì)隨機(jī)幫他們安排座位,這在一定程度上也會(huì)造成座位浪費(fèi)[6];河北工業(yè)大學(xué)曾利用RFID射頻技術(shù)進(jìn)行座位資源管理,韓慧在其論文中指出,該系統(tǒng)需要較多的硬件成本,且容易被數(shù)據(jù)收集、系統(tǒng)布線制約,存在一定局限性[1]。
國(guó)外教育發(fā)展早,他們十分重視圖書館在人類社會(huì)的作用,比如說德國(guó),它被稱為圖書館最多的國(guó)家之一,每年都有上億人來參觀[7]。專家們把圖書館資源當(dāng)作資源分配的問題來處理,在提高資源的利用性以及分配問題下了許多功夫,尤其是從九十年代以來,國(guó)外大多數(shù)學(xué)校通過網(wǎng)絡(luò)化來管理圖書館,這使得管理效率得到一定的提升,21世紀(jì)初,他們把社交媒體軟件融入到圖書館的網(wǎng)絡(luò)管理,如Facebook、Instagram等。國(guó)外的占座現(xiàn)象沒有像國(guó)內(nèi)這么普遍嚴(yán)重,但是這一現(xiàn)象也是不可避免地存在著,德國(guó)大學(xué)通過分散用戶需求來解決圖書館座位資源不充分的問題,該校把學(xué)生的上課時(shí)間和考試分散安排,這也能適當(dāng)緩解高峰時(shí)段過多的人流量給圖書館帶來的壓力[8]。目前大多數(shù)外國(guó)圖書館座位預(yù)約管理系統(tǒng)已經(jīng)獲得了較大的發(fā)展。