很多时候,我们在网上搜索官网demo源码时,总是找不到适合自己的,要么不好看要么源码复杂要么跟自己擅长的开发语言不同。
前端+后台。
springboot真的好用

springboot+thymeleaf+maven+html+css

源码

1.项目目录结构:

在这里插入图片描述
2.配置文件application.yml,启动完成,端口号8889访问(http://localhost:8889):

server:
   port: 8889
spring:
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss #可以对某个实体类属性做单独处理
    time-zone: GMT+8
    serialization:
      indent-output: false #格式化输出
      fail-on-empty-beans: true #忽略无法转换的对象
    default-property-inclusion: NON_NULL #设置空如何序列化(NON_EMPTY: 为空null""不序列化)
    deserialization:
      fail-on-unknown-properties: true #允许对象忽略json中不存在的属性
      
  thymeleaf:
    enabled: true
      
logging:
  level:
    com.yxsd.website: debug

package com.sys.website.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import com.sys.website.server.WebSocketServer;


@Controller
public class IndexController {
	@Autowired
	private WebSocketServer webSocketServer;
	
	/**
	 * 
	 * <p>Description: 首页</p>  
	 * @return
	 */
	@RequestMapping(value="/")
	public ModelAndView index() {
		return getIndexInfo();
	}
	
	@RequestMapping(value="/index")
	public ModelAndView indexIndex() {
		return getIndexInfo();
	}
	
	@RequestMapping(value="/index.html")
	public ModelAndView indexHtml() {
		return getIndexInfo();
	}
	
	@RequestMapping(value="/index.htm")
	public ModelAndView indexHtm() {
		return getIndexInfo();
	}
	
	private ModelAndView getIndexInfo() {
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("index");
		return modelAndView;
	}
	
//	@RequestMapping(value="/app/{sid}")
//	public void app(Session session,@PathVariable String sid) {
//		webSocketServer.onOpen(session, sid);
//	}
}

文件流形式读取视频播放:

package com.sys.website.controller;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStream;
import java.io.RandomAccessFile;
import java.nio.charset.StandardCharsets;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;


@Controller
public class NewsController {
	
	/**
	 * 
	 * <p>Description: 新闻中心</p>  
	 * @return
	 */
	@RequestMapping(value="/news")
	public ModelAndView getAppInfo() {
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("news");
		return modelAndView;
	}
	
	/**
	 * 
	 * <p>Description: 新闻详情</p>  
	 * @param id
	 * @return
	 */
	@RequestMapping(value="/news/detail/{id}")
	public ModelAndView listNewsForPageWeb(@PathVariable String id) {
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("new_detail");
		return modelAndView;
	}
	
	@RequestMapping(value="/news/video/{id}")
	public void video(@PathVariable String id,HttpServletRequest request,HttpServletResponse response) throws Exception {
		response.reset();
	    //获取从那个字节开始读取文件
	    String rangeString = request.getHeader("Range");
	
	    try {
	        //获取响应的输出流
	        OutputStream outputStream = response.getOutputStream();
	        File file = new File("/gw/video/"+id);
	        if(file.exists()){
	            RandomAccessFile targetFile = new RandomAccessFile(file, "r");
	            long fileLength = targetFile.length();
	            //播放
	            if(rangeString != null){
	
	                long range = Long.valueOf(rangeString.substring(rangeString.indexOf("=") + 1, rangeString.indexOf("-")));
	                //设置内容类型
	                response.setHeader("Content-Type", "video/mp4");
	                //设置此次相应返回的数据长度
	                response.setHeader("Content-Length", String.valueOf(fileLength - range));
	                //设置此次相应返回的数据范围
	                response.setHeader("Content-Range", "bytes "+range+"-"+(fileLength-1)+"/"+fileLength);
	                //返回码需要为206,而不是200
	                response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);
	                //设定文件读取开始位置(以字节为单位)
	                targetFile.seek(range);
	            }else {//下载
	
	                //设置响应头,把文件名字设置好
	                response.setHeader("Content-Disposition", "attachment; filename="+id );
	                //设置文件长度
	                response.setHeader("Content-Length", String.valueOf(fileLength));
	                //解决编码问题
	                response.setHeader("Content-Type","application/octet-stream");
	            }
	            byte[] cache = new byte[1024 * 300];
	            int flag;
	            while ((flag = targetFile.read(cache))!=-1){
	                outputStream.write(cache, 0, flag);
	            }
	        }else {
	        	String message = "file:"+id+" not exists";
	            //解决编码问题
	            response.setHeader("Content-Type","application/json");
	            outputStream.write(message.getBytes(StandardCharsets.UTF_8));
	        }
	
	        outputStream.flush();
	        outputStream.close();
	
	    } catch (FileNotFoundException e) {
	
	    } catch (IOException e) {
	
	    }
	}
}

3.首页轮播图:
在这里插入图片描述

含一、二级菜单
在这里插入图片描述
企业概况
在这里插入图片描述
新闻中心
在这里插入图片描述
新闻中心进去》新闻详情
在这里插入图片描述
产品实例等
在这里插入图片描述
产品特点
在这里插入图片描述
产品介绍
在这里插入图片描述
共享模块
在这里插入图片描述
联系我们,含地图:
在这里插入图片描述

完整源码 前往下载

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐