spring和mybatis结合做简单的增删查改系统_档案管理系统

开发工具:idea,Mysql,TomCat 8.0,svn

使用技术:Menvan+spring+springMVC+myBatis+easyUI+shiro

项目简介:

项目名称:档案管理系统

简单描述:项目为以宜家档案管理业务为信息来源,覆盖档案管理的方方面面。实现档案的全过程记录与流程化管理,形成高效、统一的管理制度。主要模块为基础模块、权限模块、档案借阅归还模块、档案损坏丢失模块、数据维护模块。整个项目通过Menvan多模块构建,svn集中式开发,实现契约编程。前段页面主要采用JSP、CSS结合easyui框架,后台通过集成SSM进行业务组件的组装关联,权限模块主要通过shiro安全框架开发。实现了登录验证、授权、密码学等功能。

责任描述:数据备份模块、数据恢复模块、aop系统日志

技术要点:

1. 数据备份模块:

1) 自动备份

3b3798949972b0d4946e4e3bac77fd4b.png

用户通过在页面上设置自动备份时间,系统会在指定时间将数据库中的信息保存到本地。

1. 导入jar包

<!-- 定时调度 -->
<dependency>
<groupId>quartz</groupId>
<artifactId>quartz</artifactId>
<version>1.5.2</version>
</dependency>

2. controller层

public AjaxResult automateBackup(Long id) {try {
SchedulerFactory gSchedulerFactory = new StdSchedulerFactory();
Scheduler sche = gSchedulerFactory.getScheduler();
String job_name = "动态任务调度";if (id!=null && !"".equals(id)) {if (id == 1) {//调度任务,每天9点15分执行任务
QuartzManager.addJob(sche, job_name, QuartzService.class, "0 15 9 * * ?");
}if (id == 2) {/*每周一9点15分执行*/
QuartzManager.addJob(sche, job_name, QuartzService.class, "0 57 9 ? * MON");
}if (id == 3) {/*每月一号9点15分执行*/
QuartzManager.addJob(sche, job_name, QuartzService.class, "0 15 9 1 * ?");/*QuartzManager.modifyJobTime(sche, job_name, "0 15 9 1 * ?");*/
}return AjaxResult.success();
}else {/*禁止自动备份*/
QuartzManager.removeJob(sche, job_name);return AjaxResult.success();
}
} catch (SchedulerException e) {
e.printStackTrace();return AjaxResult.error("设定失败"+e.getMessage());
}
}

3. 备份的逻辑代码

public class QuartzService implements Job {
@Autowiredprivate IDatabackupService databackupService;
@Overridepublic void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {try {
Runtime rt = Runtime.getRuntime();// 调用 调用mysql的安装目录的命令
Process child = null;
child = rt.exec("C:Program Files (x86)MySQLMySQL Server 5.5bin/mysqldump -hlocalhost -uroot -proot --set-charset=utf8 archives");
InputStream in = child.getInputStream();
InputStreamReader xx = new InputStreamReader(in, "utf-8");
String inStr;
StringBuffer sb = new StringBuffer("");
String outStr;// 组合控制台输出信息字符串
BufferedReader br = new BufferedReader(xx);while ((inStr = br.readLine()) != null) {
sb.append(inStr + "rn");
}
outStr = sb.toString();// 要用来做导入用的sql目标文件:
String format = new SimpleDateFormat("HH-mm-ss").format(new Date());//区分文件的凭证
FileOutputStream fout = new FileOutputStream("G:/sql/" + format+"-archives.sql");
OutputStreamWriter writer = new OutputStreamWriter(fout, "utf-8");
writer.write(outStr);
writer.flush();/*在数据库中保存信息*/
Databackup databackup = new Databackup();
databackup.setBackupDate(new Date());
databackup.setFileName(format+"-archives.sql");
databackup.setDescs("这是一个备份文件");
databackup.setUrl("G:/sql/" + format+"-archives.sql");
databackup.setOperatorId(1L);
//关闭资源
writer.close();
fout.close();
br.close();
xx.close();
in.close();
//确定备份文件的大小
File file = new File("G:/sql/" + format+"-archives.sql");
FileInputStream fis = new FileInputStream(file);int available = fis.available();
databackup.setFileSize(available+"B");
fis.close();

/*调用方法进行保存*/databackupService.insert(databackup);
} catch (Exception e) {
e.printStackTrace();
}
}
}

4.

2) 手动备份

用户点击备份按钮,系统会将指定数据库中的信息保存到本地指定文件夹中。。。。。业务逻辑与自动备份的逻辑一样

2. 数据恢复模块:

9353073c8174562c67e43ed975deafd5.png

1) 数据还原功能

用户选中一行数据点击还原按钮,系统会将指定文件恢复到数据库,并将本地文件删除(根据需求)

业务代码:

public AjaxResult load(Long id, String url) {
System.out.println("----------------接收url="+url);try {
String fPath = url;
Runtime rt = Runtime.getRuntime();

/*指定数据还原到的数据库*/
Process child = rt.exec("mysql -uroot -proot ssj");
OutputStream out = child.getOutputStream();
String inStr;
StringBuffer sb = new StringBuffer("");
String outStr;
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(fPath), "utf-8"));while ((inStr = br.readLine()) != null){
sb.append(inStr + "rn");
}
outStr = sb.toString();
OutputStreamWriter writer = new OutputStreamWriter(out, "utf-8");
writer.write(outStr);
writer.flush();
writer.close();
br.close();
out.close();//删除数据中的备份文件信息
delete(id);//删除本地的备份文件
File file = new File(url);if(file.exists()){boolean delete = file.delete();
System.out.println("----------------删除本地文件"+delete);
}return AjaxResult.success();
} catch (Exception e){
e.printStackTrace();return AjaxResult.error("还原失败"+e.getMessage());
}
}

2) 基础编辑删除功能

注意点:还原文件只能编辑文件名和备注

3. Aop系统日志:

系统管理员可以在日志中看到登录的用户对系统进行的操作,只能查询,不能对信息进行增删改。

1ce7f0089adc22bbf2d5b22754a3e56c.png

1) 导入jar包

<dependency>
<groupId>aopalliance</groupId>
<artifactId>aopalliance</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.6.8</version>
</dependency>

2) 自定义注解

@Target(ElementType.METHOD) // 方法注解
@Retention(RetentionPolicy.RUNTIME) // 运行时可见public @interface SystemLogController {
String operateType();// 记录日志的操作类型
}

3) 核心业务代码

@Component
@Aspectpublic class ArchivesLog {
@Autowiredprivate ILogService logService;// 日志Service /** * 环绕通知记录日志通过注解匹配到需要增加日志功能的方法*/
@Around("@annotation(cn.itsource.web.controller.SystemLogController)")public Object aroundAdvice(ProceedingJoinPoint pjp) throws Throwable {// 1.方法执行前的处理,相当于前置通知// 获取方法签名
MethodSignature methodSignature = (MethodSignature) pjp.getSignature();// 获取方法
Method method = methodSignature.getMethod();// 获取方法上面的注解
SystemLogController systemLogController = method.getAnnotation(SystemLogController.class);// 获取操作描述的属性值
String operateType = systemLogController.operateType();// 创建一个日志对象(准备记录日志)
Log log = new Log();
log.setOperateType(operateType);// 操作说明// 整合了Struts,所有用这种方式获取session中属性// User user = (User) ServletActionContext.getRequest().getSession().getAttribute("userinfo");//获取session中的user对象进而获取操作人名字
log.setOperateorId(1L);// 设置操作人
Object result = null;try {// 相当于后置通知(方法成功执行之后走这里)
log.setOperateResult("成功");// 设置操作结果//让代理方法执行
result = pjp.proceed();
} catch (SQLException e) {// 3.相当于异常通知部分
log.setOperateResult("失败");// 设置操作结果
} finally {// 4.相当于最终通知
log.setOperateDate(new Date());// 设置操作日期logService.insert(log);// 添加日志记录
}return result;
}
}

4) 在需要记录的方法前都加入注解

32670571e20da317ef24a865274b6f71.png

心得体会:

在做项目期间,遇到了各种各样的问题,tomcat启动报错,依赖包导入报错,访问页面数据加载不出来,打了断点之后没效果等等。有些错误是自己独立解决,有些错误是在别人的帮助下解决,还有些错误是通过百度搜索,然后解决的,反正解决问题的办法有很多,只有能够解决问题,那么无论采用哪一种解决办法,都是可以的。在不断的报错,不断的解决错误的过程中,我对错误的认识,也有了很大的提升,遇到类似的错误,能够快速知道,大致是什么地方出了问题,出错的原因,以及解决错误的办法。因为是第一次用mybatis+svn团队协作开发的,所以在做项目过程中,遇到了很多错误,例如:表的设计不合理,整个项目各个模块业务之间的逻辑关系不清楚,公共代码的设计等等。总而言之,以后的这种团队开发项目,一定要把项目业务逻辑分析清楚,每个人负责的模块分清楚,以及必须把各个模块之间的关联梳理得清清楚楚,表的设计也要设计的规范,合情合理。这样,到后面做项目,各种业务之间的逻辑关系,就能够很清楚的知道,做起项目来,思路也能够很清楚。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值