每天记录学习,每天会有好心情。*^_^*
今天将为大家分析一个文档管理系统(现有的文档管理系统虽然保证了文档的安全管理,但是对文件夹的权限进行设置后,该种权限就作用于该文件夹下的文件,而不能对文件夹里的文件进行单独的权限设置。随着文档数量的增多,管理者已经不再满足于文档与用户访问权限的单一设置,而希望能对存放文件的文件夹以及单个文件设置访问控制权限,以便达到信息的及时共享。显然,现有的文档管理系统不能满足管理者的需求。),该项目使用框架为SSM(MYECLIPSE),选用开发工具为MYECLIPSE。文档管理系统为一个 后台项目。
为了完成该系统,我们首先需要对该系统进行需求分析。一个文档管理系统应包含用户角色有管理员。为了能让用户顺利登陆系统完成相关操作,需要为每种登陆角色设置账户和密码字段。
总结得出该系统所有数据为:管理员(admin)、文档(wendang)
管理员表
字段名 | 类型 | 属性 | 描述 id | INT(11) | PRIMARY KEY | 管理员id username | VARCHAR(255) | | 账号 passowrd | VARCHAR(255) | | 密码
文档表
字段名 | 类型 | 属性 | 描述 id | INT(11) | PRIMARY KEY | 文档id mingcheng | VARCHAR(255) | | 名称 miaoshu | VARCHAR(255) | | 描述 wenjian | VARCHAR(255) | | 文件
package org.mypro.front; import java.io.File; import java.io.IOException; import java.math.BigDecimal; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Collections; import java.util.Date; import java.util.List; import javax.jms.Session; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.mypro.dao.WendangMapper; import org.mypro.entity.Wendang; import org.mypro.entity.WendangExample; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.multipart.MultipartFile; @Controller @RequestMapping(VALUE = "/") public class WendangController { private static final Log logger = LogFactory.getLog(WendangController.class); @Autowired private WendangMapper wendangdao; //定义方法tianjiawendang,响应页面tianjiawendang请求 @RequestMapping(VALUE = "tianjiawendang") public String tianjiawendang(HttpServletRequest request, HttpServletResponse response,HttpSession SESSION,String backurl) { logger.debug("WendangController.tianjiawendang ......"); IF(backurl != NULL && backurl.indexOf("tianjiawendang.action") == -1){ RETURN "forward:/" + backurl; } RETURN "tianjiawendang"; } @RequestMapping(VALUE = "tianjiawendangact") public String tianjiawendangact(HttpServletRequest request,HttpSession SESSION, HttpServletResponse response,Wendang wendang,String backurl,MultipartFile wenjianfile) throws IOException { logger.debug("WendangController.tianjiawendangact ......"); IF(!wenjianfile.isEmpty()){ String wenjian = uploadUtile(wenjianfile, request); wendang.setWenjian(wenjian); } wendangdao.insert(wendang); request.setAttribute("message", "添加文档成功"); IF(backurl != NULL && backurl.indexOf("tianjiawendangact.action") == -1){ RETURN "forward:/" + backurl; } //返回tianjiawendang方法 RETURN "forward:/tianjiawendang.action"; } //定义wendangguanli方法响应页面请求 @RequestMapping(VALUE = "wendangguanli") public String wendangguanli(HttpServletRequest request,HttpSession SESSION, HttpServletResponse response,String backurl) { logger.debug("WendangController.wendangguanli ......"); WendangExample example = NEW WendangExample(); List wendangall = wendangdao.selectByExample(example); request.setAttribute("wendangall", wendangall); IF(backurl != NULL && backurl.indexOf("wendangguanli.action") == -1){ RETURN "forward:/" + backurl; } RETURN "wendangguanli"; } // 定义 wendangchakan方法 @RequestMapping(VALUE = "wendangchakan") public String wendangchakan(HttpServletRequest request,HttpSession SESSION, HttpServletResponse response,String backurl) { logger.debug("WendangController.wendangchakan ......"); WendangExample example = NEW WendangExample(); List wendangall = wendangdao.selectByExample(example); request.setAttribute("wendangall", wendangall); IF(backurl != NULL && backurl.indexOf("wendangchakan.action") == -1){ RETURN "forward:/" + backurl; } RETURN "wendangchakan"; } // 定义 xiugaiwendang方法 @RequestMapping(VALUE = "xiugaiwendang") public String xiugaiwendang(HttpServletRequest request, HttpServletResponse response,HttpSession SESSION,INT id,String backurl){ logger.debug("WendangController.xiugaiwendang ......"); Wendang wendang = wendangdao.selectByPrimaryKey(id); request.setAttribute("wendang", wendang); IF(backurl != NULL && backurl.indexOf("xiugaiwendang.action") == -1){ RETURN "forward:/" + backurl; } RETURN "xiugaiwendang"; } // 定义xiugaiwendangact处理文档修改 @RequestMapping(VALUE = "xiugaiwendangact") public String xiugaiwendangact(HttpServletRequest request, HttpServletResponse response,Wendang wendang,HttpSession SESSION,String backurl,MultipartFile wenjianfile) throws IOException { logger.debug("WendangController.xiugaiwendangact ......"); IF(!wenjianfile.isEmpty()){ String wenjian = uploadUtile(wenjianfile, request); wendang.setWenjian(wenjian); } wendangdao.updateByPrimaryKeySelective(wendang); request.setAttribute("message", "修改文档信息成功"); IF(backurl != NULL && backurl.indexOf("xiugaiwendangact.action") == -1){ RETURN "forward:/" + backurl; } RETURN "forward:/wendangguanli.action"; } // 定义shanchuwendang,处理删除文档 @RequestMapping(VALUE = "shanchuwendang") public String shanchuwendang(HttpServletRequest request, HttpServletResponse response,HttpSession SESSION,INT id,String backurl){ logger.debug("WendangController.shanchuwendang ......"); wendangdao.deleteByPrimaryKey(id); request.setAttribute("message", "删除文档成功"); IF(backurl != NULL && backurl.indexOf("shanchuwendang.action") == -1){ RETURN "forward:/" + backurl; } RETURN "forward:/wendangguanli.action"; } // 定义sousuowendang方法,处理搜索操作 @RequestMapping(VALUE = "sousuowendang") public String sousuowendang(HttpServletRequest request, HttpServletResponse response,HttpSession SESSION,String SEARCH,String backurl) { logger.debug("WendangController.sousuowendang ......"); WendangExample example = NEW WendangExample(); WendangExample.Criteria criteria = example.createCriteria(); IF(SEARCH != NULL){ criteria.andMingchengLike("%" + SEARCH + "%"); } List wendangall = wendangdao.selectByExample(example); request.setAttribute("wendangall", wendangall); IF(backurl != NULL && backurl.indexOf("sousuowendang.action") == -1){ RETURN "forward:/" + backurl; } RETURN "sousuowendang"; } // 定义WendangpinglunMapper@RequestMapping (VALUE = "wendangxiangqing")public String wendangxiangqing (HttpServletRequest request,HttpSession SESSION, HttpServletResponse response,INT id,String backurl) {logger .debug("WendangController.wendangxiangqing ......");Wendang wendang = wendangdao.selectByPrimaryKey(id);request .setAttribute("wendang", wendang); IF(backurl != NULL && backurl.indexOf("wendangxiangqing.action") == -1){ RETURN "forward:/" + backurl; } RETURN "wendangxiangqing"; } // 上传文件图片等public String uploadUtile (MultipartFile file, HttpServletRequest request) throws IOException { // 根据当前时间生成时间字符串SimpleDateFormat sdf = NEW SimpleDateFormat("yyyyMMddHHmmssSS");String res = sdf.format(NEW DATE()); // uploads文件夹位置String rootPath = request.getSession().getServletContext().getRealPath("resource/uploads/"); // 原始名称String originalFileName = file.getOriginalFilename(); // 新文件名String newFileName = "sliver" + res + originalFileName.substring(originalFileName.lastIndexOf(".")); // 创建年月文件夹Calendar DATE = Calendar.getInstance();File dateDirs = NEW File(DATE.get(Calendar.YEAR) + File.separator + (DATE.get(Calendar.MONTH)+1)); // 新文件File newFile = NEW File(rootPath + File.separator + dateDirs + File.separator + newFileName); // 判断目标文件所在目录是否存在 IF( !newFile.getParentFile().exists()) { // 如果目标文件所在的目录不存在,则创建父目录newFile .getParentFile().mkdirs(); }System .out.println(newFile); // 将内存中的数据写入磁盘file .transferTo(newFile); // 完整的urlString fileUrl = DATE.get(Calendar.YEAR) + "/" + (DATE.get(Calendar.MONTH)+1) + "/" + newFileName; RETURN fileUrl; }}
添加文档模块:
系统中存在添加文档功能,通过点击添加文档可以跳转到该功能模块,在该功能模块中,填写对应的文档信息。文档包含信息名称,描述,文件,填写完所有信息后,通过post方法将数据提交到tianjiawendang.action中,该地址将在服务器中wendangController类中的tianjiawendangact方法中进行响应。响应结果为,获取所有的文档信息,封装一个wendang类,使用wendangController类中定义的wendangdao的insert方法,将文档数据插入到数据库的wendang表中。并给出用户提示信息,添加文档成功,将该信息保存到request的message中,该信息将在页面中进行展示。该部分核心代码如下:
通过wendangdao的insert方法将页面传输的文档添加到数据库中 wendangdao.insert(wendang);
将添加文档成功信息,保存到request的message中,在页面中给出用户提示 request.setAttribute("message", "添加文档成功");
返回文档管理界面
return "forward:/tianjiawendang.action";
查询文档模块:
在浏览器中进入文档查询页面时,此时浏览器的地址栏为wendangguanli.action,该地址将响应wendangController类中的wendangguanli,在该方法中,通过selectByexample方法获取所有的文档信息,并将该信息保存到request中,在页面进行循环展示。该部分核心代码如下:
生成文档样例类,通过example定义查询条件 WendangExample example = new WendangExample();
通过wendangdao的selectByExample方法查询出所有的文档信息 List wendangall = wendangdao.selectByExample(example);
将文档信息,保存到request中,在页面通过foreach方法进行展示 request.setAttribute("wendangall", wendangall);
返回文档管理界面
return "forward:/wendangguanli.action";
修改文档模块:
点击修改按钮,可以跳转到文档修改页面。在文档修改页面中,将初始化该文档的所有信息,并将信息一一对应填充到对应编辑栏中。编辑完文档信息后,页面通过post方法将数据封装为一个文档实体,传入到wendangController中。在xiugaiwendang中进行接收,接收完毕后,调用wendangMapper中的updateByPrimaryKeySelective方法进行修改。该部分代码如下:
通过wendangdao的修改方法根据id修改对应的文档 wendangdao.updateByPrimaryKeySelective(wendang);
将修改文档成功信息,保存到request的message中,在页面中给出用户提示 request.setAttribute("message", "修改文档信息成功");
返回文档管理界面
return "forward:/wendangguanli.action";
删除文档模块:
在管理页面中,点击删除。页面将通过a标签的href属性,使用get方法将该文档
的id上传到服务器中,在服务器中通过wendangController类中的shanchuwendang进行接收,之后调用wendangMapper中的deleteByPrimaryKey方法根据ID进行删除。将删除信息保存到request的message中,在页面给出用户删除成功的提示信息,该部分核心代码如下:
通过wendangdao的删除方法根据id删除对应的文档 wendangdao.deleteByPrimaryKey(id);
将删除文档成功信息,保存到request的message中,在页面中给出用户提示 request.setAttribute("message", "删除文档成功");
返回文档管理界面
return "forward:/wendangguanli.action";