2024年最全Java+Vue导出zip压缩包前后端实现_java 导出zip前端,web前端开发培训教程

React

  • 介绍一下react

  • React单项数据流

  • react生命周期函数和react组件的生命周期

  • react和Vue的原理,区别,亮点,作用

  • reactJs的组件交流

  • 有了解过react的虚拟DOM吗,虚拟DOM是怎么对比的呢

  • 项目里用到了react,为什么要选择react,react有哪些好处

  • 怎么获取真正的dom

  • 选择react的原因

  • react的生命周期函数

  • setState之后的流程

  • react高阶组件知道吗?

  • React的jsx,函数式编程

  • react的组件是通过什么去判断是否刷新的

  • 如何配置React-Router

  • 路由的动态加载模块

  • Redux中间件是什么东西,接受几个参数

  • redux请求中间件如何处理并发

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

    // ... 此处省略数据查询条件...
	// 查询数据
    List<ProQrcode> list = service.list(queryWrapper);
    int width = 800;
    if (StringUtils.isNotBlank(widthStr)) {
        width = Integer.parseInt(widthStr);
    }
    byte[] data = genQrcodeImg(list, width);
    zip(response, data);
}
/\*\*

* 批量生产图片zip压缩包数据
* */
private byte[] genQrcodeImg(List list, int width) {
try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ZipOutputStream zip = new ZipOutputStream(outputStream)) {

        for (int i = 0; i < list.size(); i++) {
            ProQrcode qrcode = list.get(i);
            try {
                // 添加到zip,设置文件名,后缀.png
                zip.putNextEntry(new ZipEntry(String.format("%d.%s.png", i + 1, qrcode.getCode())));
                // 查询是否配置了logo,如果有logo,则把logo添加到二维码中
                BufferedImage logo = CustomerBrandCache.getLogo(qrcode.getCustomerBrandId());
                QrConfig config = new QrConfig();
                config.setWidth(width).setHeight(width);
                if (logo != null) {
                    config.setImg(logo);
                }
                // 生成二维码图片
                byte[] bytes = QrCodeUtil.generatePng(qrcode.getLinkUrl(), config);
                // 将byte[]写入到压缩包中
                IOUtils.write(bytes, zip);
                zip.flush();
                zip.closeEntry();
            } catch (IOException e) {
                log.error("addQrcode,error:", e);
            }
        }
        return outputStream.toByteArray();
    } catch (Exception e) {
        log.error("", e);
    }
    return new byte[0];
}

/\*\*

* 生成zip文件,设置响应头为文件下载
*/
private void zip(HttpServletResponse response, byte[] data) throws IOException {
response.reset();
response.addHeader(“Access-Control-Allow-Origin”, “*”);
response.addHeader(“Access-Control-Expose-Headers”, “Content-Disposition”);
response.setHeader(“Content-Disposition”, “attachment; filename=“qrcode.zip””);
response.addHeader(“Content-Length”, “” + data.length);
response.setContentType(“application/octet-stream; charset=UTF-8”);
IOUtils.write(data, response.getOutputStream());
}



> 
> * 通过`cn.hutool.extra.qrcode.QrCodeUtil`生成二维码图片,得到`byte[]`
> * 通过`java.util.zip.ZipOutputStream`将`byte[]`写入压缩包
> * 通过`java.io.ByteArrayOutputStream`返回完整的`byte[]`
> * 全部写入完成后,得到完整的`byte[]`输出到`HttpServletResponse`
> * 设置`HttpServletResponse`响应头数据,标记为文件下载
> 
> 
> 


### 二、Vue前端调用后端接口实现下载



/**
* 导出二维码数据
*/
export const exportQrcode = async (name, params) => {
const data = await defHttp.get({ url: Api.exportQrcode, params, responseType: ‘blob’, timeout: 30000 }, { isTransformResponse: false })
if (!data) {
createMessage.warning(‘文件下载失败’)
return
}
if (!name || typeof name != ‘string’) {
name = ‘导出文件’
}
const blobOptions = { type: ‘application/octet-stream’ }
const fileSuffix = ‘.zip’
debugger
if (typeof window.navigator.msSaveBlob !== ‘undefined’) {
window.navigator.msSaveBlob(new Blob([data], blobOptions), name + fileSuffix)
} else {
const url = window.URL.createObjectURL(new Blob([data], blobOptions))
const link = document.createElement(‘a’)
link.style.display = ‘none’
link.href = url

React

  • 介绍一下react

  • React单项数据流

  • react生命周期函数和react组件的生命周期

  • react和Vue的原理,区别,亮点,作用

  • reactJs的组件交流

  • 有了解过react的虚拟DOM吗,虚拟DOM是怎么对比的呢

  • 项目里用到了react,为什么要选择react,react有哪些好处

  • 怎么获取真正的dom

  • 选择react的原因

  • react的生命周期函数

  • setState之后的流程

  • react高阶组件知道吗?

  • React的jsx,函数式编程

  • react的组件是通过什么去判断是否刷新的

  • 如何配置React-Router

  • 路由的动态加载模块

  • Redux中间件是什么东西,接受几个参数

  • redux请求中间件如何处理并发

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

  • 12
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
/* *author:XudongChen *Date:2010-03-09 *QQ:233828249 81023617(不才) *Email:xznd@163.com */ 2009-8-13 1.加载分块地图 2.添加全景标记窗体 2009-8-14 1.增加控制条 2.增加全景标记、公交车标记显示层 3.解决地图定位问题 4.增加经纬度层功能 5.未修正图标层的定位 2009-8-15 1.已修正8.14地图定位错误,还存在放大缩小时定位不准 2.存在ie内存泄漏问题 2009-8-16 1.已修正8.15 ie内存泄漏问题,chrome下可能还存在内存泄漏 2.增加图标定位功能 3.增加鼠标滚轮事件(http://yongzhi.blog.hexun.com/5057947_d.html) 4.通过jquery加载json数据文件(图标显示层数据) 2009-8-17 1.增加建筑物高亮显示(还需完成鼠标mouseover和mouseout事件) 2009-8-18 1.完成建筑物高亮显示,有点小bug 2009-8-19 1.增加记录原始缩放比例的全局变量 2.解决建筑物高亮显示bug 2009-8-20 1.增加三维全景展示功能 2.浏览建筑详细功能 2009-8-21 1.引入jqueryAlert插件,美化弹出窗体 2009-8-23 1.增加搜索功能 2.清理建筑信息显示页和公交信息页多余数据 2009-10-22 1.增加小沙盘拖动类(鹰眼视图) BirdEye.js 完成小沙盘到地图的同步,同步方法:检测mouseup事件触发->修改url->request->计算坐标->同步行为 2.增加小沙盘样式表BirdEye.css 地图图片路径birdeyemap 3.完成window.parent地图->小沙盘的同步 问题:小沙盘->window.parent地图存在bug,可以尝试开启 2009-10-23 1.在小沙盘中增加浮动绿色框 2009-11-6 1.实现“鹰眼地图”不需移动,一幅可以看到见全景, 当主场景移动时,“鹰眼地图”只有小框在移动。 同时“小框” 主场景也在移动。 2009-12-17 1.测距功能事件配置 2009-12-21 1.完成测距功能 2009-12-22 1.配置搜索功能,后台改用s2sh框架 2.完成hessian+spring+hibernate整合,提供建筑信息和公司信息hessian查找服务 2009-12-23 1.配置hessian服务端缓存 2.配置hessian日志记录,输出到文件/log/wzucxd/html 3.完成建筑信息显示页,配置2级缓存 4.配置oscache 5.配置新闻信息模块 2010-1-13 1.完成chrome和ff下的搜索功能 2.搜索功能支持ie6.0+ //设置Theodolite$setPoint var cpointtmp = new CPoint(this.holder.offsetLeft + evt.clientX - this.mvl.offsetLeft, this.mvl.offsetTop + evt.clientY - this.mvl.offsetTop); Theodolite$setPoint(cpointtmp);
实现Java+Vue的家谱前后端分离系统,可以分为以下几个步骤: 1. 设计数据库表结构:可以设计Person表来存储每个人的信息,包括姓名、性别、父亲ID、母亲ID等字段。 2. 创建Java后端API:使用Spring Boot框架创建后端API,提供获取所有人、获取某个人、添加人等接口,通过JPA或MyBatis等框架操作数据库。 3. 创建Vue前端页面:使用Vue框架创建前端页面,包括家谱的展示、添加人、查找人等功能,使用axios等库调用后端API获取数据或提交数据。 以下是Java+Vue实现家谱前后端分离系统的示例代码: Java后端API: ```java @RestController @RequestMapping("/api") public class FamilyTreeController { @Autowired private PersonRepository personRepository; @GetMapping("/people") public List<Person> getAllPeople() { return personRepository.findAll(); } @GetMapping("/person/{id}") public Person getPerson(@PathVariable Long id) { return personRepository.findById(id).orElse(null); } @PostMapping("/person") public Person addPerson(@RequestBody Person person) { return personRepository.save(person); } } ``` Vue前端页面: ```html <template> <div> <h1>家谱</h1> <ul> <li v-for="person in people" :key="person.id"> {{ person.name }} <ul> <li v-for="child in getChildren(person)" :key="child.id"> {{ child.name }} </li> </ul> </li> </ul> <div> <h2>添加人</h2> <form @submit.prevent="addPerson"> <label>姓名:</label> <input type="text" v-model="newPerson.name"> <label>性别:</label> <select v-model="newPerson.gender"> <option value="male">男</option> <option value="female">女</option> </select> <label>父亲:</label> <select v-model="newPerson.fatherId"> <option v-for="person in people" :value="person.id" :key="person.id"> {{ person.name }} </option> </select> <label>母亲:</label> <select v-model="newPerson.motherId"> <option v-for="person in people" :value="person.id" :key="person.id"> {{ person.name }} </option> </select> <button type="submit">添加</button> </form> </div> </div> </template> <script> import axios from 'axios'; export default { data() { return { people: [], newPerson: { name: '', gender: 'male', fatherId: null, motherId: null } } }, created() { this.loadPeople(); }, methods: { loadPeople() { axios.get('/api/people') .then(response => { this.people = response.data; }); }, getChildren(person) { return this.people.filter(p => p.fatherId == person.id || p.motherId == person.id); }, addPerson() { axios.post('/api/person', this.newPerson) .then(response => { this.people.push(response.data); this.newPerson = { name: '', gender: 'male', fatherId: null, motherId: null }; }); } } } </script> ``` 在上面的代码中,`FamilyTreeController`类是Java后端API的实现,提供获取所有人、获取某个人、添加人等接口。`vue`文件是Vue前端页面的实现,包括家谱的展示、添加人等功能。通过axios等库调用后端API获取数据或提交数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值