大二暑假_SSM项目_培训教育板块

一、页面搭建

1)主要内容

做出下面这样的效果

在这里插入图片描述

2)部分代码

1、学习文档
(1)写个数据表,存放学习文档的信息(其中file字段是做后面的部分时才加上去的)

在这里插入图片描述

由于我们新增数据时并不需要知道ID值,所以ID设为了自增

(2)写实体类层和Dao层
写Dao层的时候有一个函数需要注意一下

即下面这个语句,模糊查询+按照日期降序排序+分页

	  <select id="selectbyname" resultType="com.factory.pro.entity.Studyfile">
		<!-- 具体的sql -->
		SELECT * FROM studyfile where (sname LIKE CONCAT('%',#{content},'%')) 
		  order by date DESC limit #{start}, #{limit}
	</select>

(3)写Service层和controller层,

Service层代码比较简单,不再演示

Controller层需要注意的是,在显示的时候学长让我加了一个按照名字搜索的功能,所以要分情况显示。
即搜索框中没有东西时,显示全部,有东西时仅显示搜索结果

	@RequestMapping(value = "/user/common/peixun/studyshow",produces="application/json;charset=utf-8")
		@ResponseBody
		public Map<String, Object>studyshow(int page,int limit,HttpServletRequest request) {
			
			String name=request.getParameter("name");
			System.out.println(name.toString());
			List<Studyfile> list =studyfileservice.selectall(page, limit);
			
			Map<String, Object> map = new HashMap<String,Object>();
			if(!name.equals("[object Object]"))
			{
				List<Studyfile> selectlist=studyfileservice.selectbyname(name, page, limit);
				System.out.println("selectlist"+selectlist);
				map.put("data",selectlist);
				map.put("count",selectlist.size()); 
			}
			else {
				System.out.println("list"+list);
				int count=studyfileservice.getStudyfileCount();
				map.put("data",list);
				map.put("count",count); 
			}
			map.put("code", 0);
			map.put("msg", "");
			return  map;
		}

可以看到我的判断方法比较简单粗暴,因为没输入东西时,传入的参数就是个Object对象,而他转为String类型就会变成“[object Object]”,据此可以判断出搜索框中是否有东西

(4)前端

参考了Layui的官网: Layui

利用选项卡做成了如下效果

在这里插入图片描述

其中那些图标是利用了阿里巴巴矢量库

选项卡:

  <ul class="layui-tab-title" style="height:200%">
    <li class="layui-this" style="width:18%">
    <i class="iconfont icon-wendang" style="font-size:200%"></i><br>学习文档</li>
    <li style="width:18%"> <i class="iconfont icon-huiyi" style="font-size:200%"></i><br>会议视频</li>
    <li style="width:18%"> <i class="iconfont icon-xinde--" style="font-size:200%"></i><br>培训情况</li>
    <li style="width:18%"> <i class="iconfont icon-kaoshi" style="font-size:200%"></i><br>考核结果</li>
    <li style="width:18%"> <i class="iconfont icon-dengpao" style="font-size:200%"></i><br>资质情况</li>
  </ul>

选项卡具体内容

    	<div class="demoTable" style="margin-top:3px" >
  			<div class="layui-inline" style="margin-top:7px">
    			<input class="layui-input" name="studyname" id="studyname" autocomplete="off" placeholder="请输入文档名">
 			 </div>
 			 <button id="study-btn-search" class="layui-btn"  style="margin-top: 7px" data-type="reload">搜索</button>
  				<span class="fl" style="margin-left:5px;">
        		<a class="layui-btn layui-btn-danger btn-delect" id="study-btn-refresh" style="margin-top:7px">刷新</a>
  				</span>
		 </div>
		 
		 <table id="zhengshuList" lay-filter="zhengshuList"></table>
    	
    	<script type="text/html" id="zhengshubarDemo">
 		 <a class="layui-btn layui-btn-xs" lay-event="view">查看文件</a> 
		</script>


javascript

    layui.use(['form','layer','table','laydate','util'],function aa(selectname){
        var form = layui.form,
            layer = parent.layer === undefined ? layui.layer : top.layer,
            $ = layui.jquery,
            laydate=layui.laydate,
            util = layui.util,
            table = layui.table;   
        studytableIns = table.render({
            elem: '#studyList',
            url : '${pageContext.request.contextPath}/user/common/peixun/studyshow?name='+encodeURI(selectname),
            cellMinWidth : 95,
            //toolbar: '#startListBar',
            page : true,
            height : "full-200",
            limits : [10,15,20,25],
            defaultToolbar: ['filter'],
            limit : 10,
            skin:'nob',
            id : "studyListTable",
            cols : [[
                {field: 'sname', title: '学习文档名', minWidth:130, align:"center"},
                {field: 'workshop', title: '部门', minWidth:80, align:"center"},
                {field: 'date', title: '发布时间', minWidth:130, align:"center"},
                {title: '操作', minWidth:260, templet:'#studybarDemo',fixed:"right",align:"center"}
            ]]
        });


//搜索按钮按下后的函数
        $('#study-btn-search').on('click', function(){
            var selectname=$("#studyname").val();
            aa(selectname);
		  });  
        $('#study-btn-refresh').on('click', function () {
        	$("#studyname").val('');
        	var name='';
        	 aa(name);
        }); 
        

2、会议视频等其他部分

基本和上面一样

唯一需要注意的是在做资质情况部分时,由于该部分要求是是显示当前用户的证书,所以需要改下数据表,让其与User表关联。并需要改下sql语句,查询当前用户对应的证书信息

3)遇到的困难

1、
困难:写前端时,学长让我加一些图标丰富页面,我不知道怎么弄

解决方法:搜了博客
阿里巴巴矢量库

2、
困难:第一次完全自己来写前端,连怎么让选项卡占满一行都不知道

解决方法:看了一篇博客,了解了一下标签的使用
div标签

3、
困难:不知道如何点击刷新按钮后删掉搜索框中内容

解决方法:看博客
jquery点击按钮删除文本框的内容

代码如下

        $('#study-btn-refresh').on('click', function () {
        	$("#studyname").val('');
        	var name='';
        	 aa(name);
        }); 

4、
困难:不知道如何判断输入框内是否输入了信息

解决方法:通过自己尝试,发现未输入信息时,参数selectname就是一个object对象,其转化为String后就是[object Object]

4)效果展示

学习文档

在这里插入图片描述

搜索

在这里插入图片描述

点击刷新

在这里插入图片描述

会议视频

在这里插入图片描述

其他不再演示

二、管理员上传文件

1)主要内容

在admin(系统管理员)的操作界面增加文档管理、视频管理等模块,用来进行文件的上传

2)部分代码

1、文档管理
(1)写个数据表,

与上面一样

(2)写实体类层和Dao层
需要注意的是下面这个插入语句,由于ID设为了自增,所以我们在插入时要么注明一下对哪些列进行插入,要么像下面这样,id的value写成0(必须写成0,其他任何值都不行),不然会报错

	<insert id="insertStudyfile" parameterType="com.factory.pro.entity.Studyfile">
		insert into studyfile
		values
		(0
		<if test='sname!=null'>
			,#{sname}
		</if>
		<if test='sname==null'>
			,null
		</if>
		<if test='workshop!=null'>
			,#{workshop}
		</if>
		<if test='workshop==null'>
			,null
		</if>
		<if test='date!=null'>
			,#{date}
		</if>
		<if test='date==null'>
			,null
		</if>
		<if test='file!=null'>
			,#{file}
		</if>
		<if test='file==null'>
			,null
		</if>
		);
	</insert>

(3)写Service层和controller层,
最主要的一个函数就是上传文件的函数了

@Override
	public void doImport(MultipartFile mfile,String workshop) throws IOException {
		Studyfile studyfile = new Studyfile();
		
		HttpServletRequest request=SessionUtils.getCurrentServletRequest();
		String realPath=request.getSession().getServletContext().getRealPath("/");
		String path=realPath+"WEB-INF/upload/"+mfile.getOriginalFilename();
		File file=new File(path);
		System.out.println(path);
		FileUtil.copy(mfile, file);
		
		studyfile.setWorkshop(workshop);
		
		String[] filenames=file.getName().split("\\.");//需要转义
		
		studyfile.setSname(filenames[0]);
		
		Date date=new Date(System.currentTimeMillis());
		
		studyfile.setDate(date);
		
		studyfile.setFile("WEB-INF/upload/"+mfile.getOriginalFilename());
			
		studyfiledao.insertStudyfile(studyfile);
				// 更新用户信息
	}
}

其中的文件工具类如下

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

import org.springframework.web.multipart.MultipartFile;
 
public class FileUtil {
	public static boolean copy(MultipartFile src,File dest){
		BufferedInputStream bufferedInputStream=null;
		BufferedOutputStream bufferedOutputStream=null;
		try {
	 bufferedInputStream=new BufferedInputStream(src.getInputStream());
	 bufferedOutputStream=new BufferedOutputStream(new FileOutputStream(dest));
	 byte[] bts=new byte[1024];
	 int len=-1;
	 while((len=bufferedInputStream.read(bts))!=-1){
		 bufferedOutputStream.write(bts,0,len);
	 }
	 return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
		finally{
			if(bufferedInputStream!=null){
				try {
					bufferedInputStream.close();
				} catch (Exception e2) {
					e2.printStackTrace();
				}
				
			}
			if(bufferedOutputStream!=null){
				try {
					bufferedOutputStream.close();
				} catch (Exception e3) {
					e3.printStackTrace();
				}
				
			}
		}
	}
}

由于文档名一般和文档路径的最后一部分一致,而日期显然就是上传文件时当天的日期,所以表中大部分字段都可以在上传文件时自动生成,不用我们手动输入。

只有部门字段需要手动输入一下,所以我们传入的参数也只有workshop这一个

除此以外,我们在删除数据库中的一条文档信息时,应该顺便把对应的文件一并删除,所以删除函数如下

	@Override
	public GlobalResult deleteStudyfile(Integer sid) {
	
			if (sid == null) {
				return new GlobalResult(400, "id为空,删除失败!", 400);
			}
			Studyfile studyfile = studyfiledao.selectbyid(sid);
			HttpServletRequest request=SessionUtils.getCurrentServletRequest();
			File delfile=new File(request.getSession().getServletContext().getRealPath("/")+studyfile.getFile());
			boolean tag=delfile.delete();
			Integer integer = studyfiledao.deleteStudyfileById(sid);
			if (integer == 0||!tag) {
				return new GlobalResult(400, "删除失败", null);
			} else {
				return new GlobalResult(200, "删除成功", null);
			}
		}
	

(4)前端

页面如下:

在这里插入图片描述

上传:

在这里插入图片描述

增删改代码较为简单,仅展示上传部分代码

html:

	<!-- 导入窗口 -->
	<div id="importDlg" class="easyui-window" >
		<form id="importForm" enctype="multipart/form-data">
		<table>
		<tr>
			<td>导入文件</td>
			<td><input type="file" name="file"></td>
		</tr>
		<tr>
			<td>部门</td>
			<td><input type="text" name="workshop"></td>
		</tr>
		</table>
		</form>
	</div>

js:

var importForm = document.getElementById('importForm');
	var formData = $('#importForm').serializeJSON();
	if (importForm) {
		$('#importDlg').dialog(
				{
					title : '导入数据',
					width : 330,
					height : 130,
					modal : true,
					closed : true,
					buttons : [ {
						text : '导入',
						handler : function() {
							$.ajax({
								url : name + 'doImport?workshop='+formData.workshop,
								data : new FormData($('#importForm')[0]),
								type : 'post',
								processData : false,
								contentType : false,
								dataType : 'json',
								success : function(data) {
									$.messager.alert('提示', data.msg,
											'info', function() {
												if (data.status==200) {
													$('#importDlg').dialog('close');
													$('#importForm').form('clear');
													$('#grid').datagrid('reload');
												}
											});
								}
							});
						}
					} ]
				});
	}

2、会议视频等
与上面基本一致,唯一需要注意的是在做会议视频部分时,由于视频一般较大,所以需要改下Springmvc配置文件中对上传文件大小的限制

	<bean id="multipartResolver" 
		class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<!-- 上传文件大小限制 -->
		<property name="maxUploadSize">  
            <value>1073741824</value>  
        </property>  
        <!-- 请求的编码格式, 和 jsp 页面一致 -->
        <property name="defaultEncoding">
            <value>UTF-8</value>
        </property>
	</bean>

这个数字代表1个G(1024的三次方),一般来说是够用了

3)遇到的困难

1、
困难:不清楚上传文件的具体过程

解决方法:看博客
如何向服务器上传文件

并参考使用了他的文件工具类

2、
困难:对File类的常用方法不太熟悉,不知道怎么获取文件路径的最后一级路径

解决方法:看博客
详述java的File类常用方法

3、
困难:写Service层时,我想分割把文件名和后缀分开,即把“a.txt”分成“a”和“txt”,但发现直接像下面这么写会报错

		String[] filenames=file.getName().split(".");//需要转义
		
		studyfile.setSname(filenames[0]);

解决方法:参考了博客
String.split()分割字符串,转义字符

知道了需要对小数点进行转义,即需要写成下面这样

	String[] filenames=file.getName().split("//.");//需要转义
		
		studyfile.setSname(filenames[0]);

4、
困难:不知道如何获取当前日期

解决方法:看博客
java如何获取当前日期和时间

最终采取了如下形式

Date date=new Date(System.currentTimeMillis());

5、
困难:上传文件完成后,发现只是上传到了Tomcat的文件夹中,而学长说需要上传至项目路径下

解决方法:看博客
Java 文件上传到工程中,上传成功但是目录中没有显示
修改Tomcat配置即可解决

其中配置选项的意思可参考如下博客
Server Options服务器4个选项功能说明

6、
困难:对文件的删除不太了解

解决方法:看博客
Java删除指定文件

4)效果展示

以学习文档为例

页面

在这里插入图片描述

导入

在这里插入图片描述

选择文件

在这里插入图片描述

点击导入

在这里插入图片描述

发现多了一条数据,其中日期、路径、文档名均为自动生成,ID为自增

在这里插入图片描述

查看项目,确实多了一个文件

在这里插入图片描述

修改文档名(路径设置为了只读,不可更改,如果乱改用可能会造成用户显示的时候找不到文件了)

在这里插入图片描述

点击保存

在这里插入图片描述

可以看到修改成功,

在这里插入图片描述

删除

在这里插入图片描述

数据表中少了一条数据

在这里插入图片描述

查看项目,发现对应的文件已被删除

在这里插入图片描述

其他部分不再演示

三、用户点击按钮查看文件

1)主要内容

点击按钮,查看文件(下载文件)

2)部分代码

1、学习文档

(1)写controller层,

以下为代码

	@RequestMapping("/user/common/peixun/studyshowfile")
		public void Studyshowfile(HttpServletResponse response,HttpServletRequest request,@PathParam("sid")String sid) throws IOException {
			
			Studyfile studyfile = studyfileservice.getStudyfilebyid(Integer.parseInt(sid));
			
			String realPath=request.getSession().getServletContext().getRealPath("/");
			File file = new File(realPath+studyfile.getFile());
			FileInputStream in =new FileInputStream(file);
			
			
			String[] filenames=studyfile.getFile().split("/");//需要转义
		 	String filename=filenames[filenames.length-1];
			 // 设置输出流,实现下载文件
				response.setHeader("Content-Disposition",
						"attachment;filename=" +URLEncoder.encode(filename,"UTF-8"));
						//FileOutputStream out = new FileOutputStream(response.getOutputStream());
				BufferedOutputStream out=new BufferedOutputStream(response.getOutputStream());
				int len=0;
				while((len=in.read())!=-1) {
					out.write(len);
					out.flush();
				}
				out.close();
				response.getOutputStream().close();
		}

(2)前端

按下按钮后的函数

table.on('tool(studyList)', function(obj){
            var layEvent = obj.event,
                data = obj.data;
            if(layEvent === 'view'){ //查看文件
                viewStudyFile(data);//data主当前点击的行
            }
        });
        
        function viewStudyFile(data){
        	
            window.open("${pageContext.request.contextPath}/user/common/peixun/studyshowfile/?sid="+data.sid);
        }
        

2、会议视频等

与上面基本一致

唯一需要注意的是,由于资质情况显示的是图片,而图片是可以直接查看的,不需要下载。

所以我们可以通过如下代码进行直接查看
(1)controller层

@RequestMapping(value="/user/common/peixun/toViewZhengshuImage",method=RequestMethod.GET)
		public String toViewProcessImage(HttpServletRequest request,Model model) {
			String id=request.getParameter("id");
			model.addAttribute("id", id);
			return "/user/common/peixun/viewZhengshuImage";
		}	
		
		@RequestMapping("/user/common/peixun/zhengshushowfile")
		public void Zhengshushowfile(HttpServletResponse response,HttpServletRequest request,@PathParam("id")String id) throws IOException {
			
			Zhengshu zhengshu = zhengshuservice.getZhengshubyid(Integer.parseInt(id));
			
			String realPath=request.getSession().getServletContext().getRealPath("/");
			File file = new File(realPath+zhengshu.getFile());
			FileInputStream in =new FileInputStream(file);

				try {
					BufferedImage image = ImageIO.read(in);
					ServletOutputStream outputStream = response.getOutputStream();
					ImageIO.write(image, "PNG", outputStream);
					in.close();
					outputStream.close();
				} catch (Exception e) {
					e.printStackTrace();
				}
		}
		

(2)前端
点击按钮后,转向另一个页面

  table.on('tool(zhengshuList)', function(obj){
            var layEvent = obj.event,
                data = obj.data;
            if(layEvent === 'view'){ //查看文件
                viewZhengshuFile(data);//data主当前点击的行
            }
        });
        function viewZhengshuFile(data){
            window.open("${pageContext.request.contextPath}/user/common/peixun/toViewZhengshuImage/?id="+data.id);
        }
        

查看图片页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>查看证书</title>
</head>

<body>
	<img alt="证书" src="${pageContext.request.contextPath}/user/common/peixun/zhengshushowfile?id=${id}">
</body>
</html>

3)遇到的困难

1、
困难:不知道如何进行下载文件

解决方法:看博客

ssm实现文件上传与下载

4)效果展示

学习文档页面:

在这里插入图片描述

点击查看文件

在这里插入图片描述

选择第一个

在这里插入图片描述

资质情况页面

在这里插入图片描述

点击查看文件会跳转至另一个界面

在这里插入图片描述

至此演示完毕。

由于该项目为商业项目,源代码就不传上来了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值