前端原生excel 导出 ,通过解析hmtl <table>...</table>  

本文介绍了一种使用前端技术将HTML表格数据导出为Excel文件的方法。该方法支持多种浏览器,并针对IE浏览器提供了特殊处理。代码实现了表格数据的清理与格式化,确保导出的Excel文件具有良好的可读性和兼容性。

前端原生excel 导出 ,通过解析hmtl <table>...</table>  

/**
 * 根據table的id導出Excel
 */
function AutomateExcel(tableid) {
	
	var div_Excelid = "div_Ex11_11";
	$("body").find("#" + div_Excelid).remove();
	var ExcelData = $("#" + tableid).clone(true);
	var vthead = ExcelData.find("thead");
	var vtbody = ExcelData.find("tbody");
	var vt = "<div id='" + div_Excelid + "' style='display:none'><table>"
			+ vthead.html() +vtbody.html()  + "</table></div>";
	
	$("body").append(vt);// 
	var tableExcelid = "div_Extb11_11";
	$("#"+div_Excelid+"").find("table").prop("id", tableExcelid);

	$("#" + tableExcelid).find("tr th").each(function() {
		var che=$(this).attr("name");
		if(che != 'flag'){
			var a = $(this).css("display");
			if (a == "none") {
				$(this).remove();
			}
		}
	});

	$("#" + tableExcelid).find("tr td").each(function() {
		var che=$(this).attr("name");
		if(che != 'flag'){
			var a = $(this).css("display");
			if (a == "none") {
				$(this).remove();
			}
		}
	});
	$("#" + tableExcelid).find("tbody").find("tr").each(function() {		
			var a = $(this).css("display");
			if (a == "none") {
				$(this).remove();
			}	
		
	});
	if (getExplorer() == 'ie') {
		var table = document.getElementById(tableExcelid);
		var Ref = document.body.createTextRange();
		Ref.moveToElementText(table);
		Ref.execCommand("Copy");
		try {
			var Excel = new ActiveXObject("Excel.Application");
		} catch (e) {
			// IE浏览器 →工具 → Internet选项 → 安全 → 自定义级别 → ActiveX 控件和插件 →
			// 对未标记为可安全执行脚本的ActiveX 控件初始化并执行脚本 → 启用 → 确定
			//
			alert("導出數據異常");
			return;
		}
		Excel.Visible = true;
		Excel.Workbooks.Add().Worksheets.Item(1).Paste();
		Excel = null;

	} else {
		tableToExcel(tableExcelid)
	}
}
/**
 * 非IE瀏覽器導出Excel
 */
var tableToExcel = (function() {
	var uri = 'data:application/vnd.ms-excel;base64,';
	var template = '<html><head><meta charset="UTF-8">             '
			+ ' <style>                                       '
			+ '  table {                                '
			+ '       table-layout: fixed;                    '
			+ '       empty-cells: show;                      '
			+ '       border-collapse: collapse;              '
			+ '       border: 1px solid #dddddd;              '
			+ '       margin:0 auto;                          '
			+ '       table-layout:fixed;                     '
			+ '   }                                           '
			+ '                                               '
			+ '  table td {                                   '
			+ '      border: 1px solid #dddddd;               '
			+ '      padding: 0 lem 0;                        '
			+ '      vertical-align: middle !important;       '
			+ '      text-align: center;                      '
			+ '      border: 1px solid #dddddd;               '
			+ '     width:80px;                              '
			+ '  }                                            '
			+ '  table th {                                   '
			+ '      border: 1px solid #dddddd;               '
			+ '      padding: 0 lem 0;                        '
			+ '      vertical-align: middle !important;       '
			+ '      text-align: center;                      '
			+ '      border: 1px solid #dddddd;               '
			+ '     width:80px;                              '
			+ '  }                                            '
			+ '  </style>                                     '
			+ '</head><body><table>{table}</table></body></html>';
	var base64 = function(s) {
		return window.btoa(unescape(encodeURIComponent(s)))
	}, format = function(s, c) {
		return s.replace(/{(\w+)}/g, function(m, p) {
			return c[p];
		})
	}
	return function(table, name) {
		if (!table.nodeType)
			table = document.getElementById(table)
		var ctx = {
			worksheet : name || 'Worksheet',
			table : table.innerHTML
		}
		window.location.href = uri + base64(format(template, ctx))
	}
})()
/**
 * 判斷瀏覽器
 */
function getExplorer() {
	var explorer = window.navigator.userAgent;
	// ie
	if (explorer.indexOf("MSIE") >= 0) {
		return 'ie';
	}
	// firefox
	else if (explorer.indexOf("Firefox") >= 0) {
		return 'Firefox';
	}
	// Chrome
	else if (explorer.indexOf("Chrome") >= 0) {
		return 'Chrome';
	}
	// Opera
	else if (explorer.indexOf("Opera") >= 0) {
		return 'Opera';
	}
	// Safari
	else if (explorer.indexOf("Safari") >= 0) {
		return 'Safari';
	}
};

今天发现一个不错的代码分享一下,上古前端大佬写的,至今已无从考证。(非本人写的)

<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0"/> <title>会计信息管理系统</title> <style> body { font-family: "Microsoft YaHei", sans-serif; background-color: #f4f6f9; margin: 0; padding: 0; color: #333; } header { background-color: #2c3e50; color: white; padding: 20px; text-align: center; } nav { background-color: #34495e; overflow: hidden; } nav a { float: left; display: block; color: white; text-align: center; padding: 14px 20px; text-decoration: none; } nav a:hover { background-color: #ddd; color: black; } .container { max-width: 1200px; margin: 20px auto; padding: 20px; background-color: white; border-radius: 8px; box-shadow: 0 0 10px rgba(0,0,0,0.1); } /* 卡片样式 */ .card-container { display: flex; flex-wrap: wrap; gap: 20px; margin-bottom: 30px; } .card { flex: 1; min-width: 250px; border: 1px solid #ddd; border-radius: 8px; padding: 20px; background-color: #f8f9fa; box-shadow: 0 2px 5px rgba(0,0,0,0.05); transition: transform 0.3s ease; } .card:hover { transform: translateY(-5px); box-shadow: 0 5px 15px rgba(0,0,0,0.1); } .card h3 { color: #2c3e50; margin-top: 0; } .card p { color: #666; line-height: 1.6; } table { width: 100%; border-collapse: collapse; margin-top: 20px; } table, th, td { border: 1px solid #ccc; } th, td { padding: 12px; text-align: center; } th { background-color: #ecf0f1; } .form-group { margin-bottom: 15px; } .form-group label { display: block; margin-bottom: 5px; font-weight: bold; } .form-group input, .form-group select { width: 100%; padding: 8px; border: 1px solid #ccc; border-radius: 4px; } button { background-color: #27ae60; color: white; padding: 10px 15px; border: none; border-radius: 4px; cursor: pointer; } button:hover { background-color: #219a52; } .btn-group { margin: 20px 0; } .btn { display: inline-block; padding: 10px 18px; background-color: #3498db; color: white; text-decoration: none; border-radius: 4px; margin-right: 10px; font-size: 14px; } .btn:hover { background-color: #2980b9; } .chart-container { margin-top: 30px; text-align: center; } footer { text-align: center; padding: 20px; background-color: #2c3e50; color: white; margin-top: 40px; } /* 隐藏非当前页面 */ .container > section { display: none; } </style> </head> <body> <header> <h1>会计信息网络化管理系统</h1> <p>实时财务数据 · 安全高效 · 多端同步</p> </header> <nav> <a href="#home">首页</a> <a href="#balance-sheet">资产负债表</a> <a href="#income-statement">利润表</a> <a href="#entry">凭证录入</a> <a href="#charts">数据可视化</a> </nav> <div class="container"> <!-- ============ 首页内容 ============ --> <section id="home"> <h2>欢迎使用会计信息管理系统</h2> <p>本系统提供企业财务数据的在线录入、查询、分析与可视化功能,支持多用户权限管理和数据加密传输。</p> <!-- 功能卡片 --> <div class="card-container"> <div class="card"> <h3>📊 财务报表</h3> <p>一键生成资产负债表、利润表、现金流量表,支持导出Excel 或 PDF 格式。</p> </div> <div class="card"> <h3>📝 凭证管理</h3> <p>支持会计凭证的增删改查,自动校验借贷平衡,确保账务准确无误。</p> </div> <div class="card"> <h3>📈 数据可视化</h3> <p>通过图表直观展示收入、支出、利润趋势,辅助管理层决策。</p> </div> <div class="card"> <h3>🔐 权限控制</h3> <p>支持多角色登录(管理员、会计、出纳),不同角色拥有不同操作权限。</p> </div> </div> <!-- 快捷操作 --> <div class="btn-group"> <a href="#entry" class="btn">➕ 录入新凭证</a> <a href="#balance-sheet" class="btn">📄 查看资产负债表</a> <a href="#income-statement" class="btn">📉 查看利润表</a> <a href="#charts" class="btn">📊 查看图表分析</a> </div> <!-- 最近凭证记录 --> <h3>近期凭证记录(模拟)</h3> <table> <thead> <tr> <th>编号</th> <th>日期</th> <th>摘要</th> <th>科目</th> <th>借方金额</th> <th>贷方金额</th> </tr> </thead> <tbody> <tr><td>PZ001</td><td>2025-04-01</td><td>销售商品收款</td><td>银行存款</td><td>50,000.00</td><td>-</td></tr> <tr><td>PZ002</td><td>2025-04-02</td><td>采购原材料</td><td>应付账款</td><td>-</td><td>30,000.00</td></tr> <tr><td>PZ003</td><td>2025-04-03</td><td>支付工资</td><td>银行存款</td><td>20,000.00</td><td>-</td></tr> <tr><td>PZ004</td><td>2025-04-04</td><td>收到投资款</td><td>实收资本</td><td>-</td><td>100,000.00</td></tr> </tbody> </table> </section> <!-- ============ 凭证录入 ============ --> <section id="entry"> <h3>会计凭证录入</h3> <form id="accountingForm"> <div class="form-group"> <label>凭证编号</label> <input type="text" id="voucherNo" required placeholder="如:PZ005" /> </div> <div class="form-group"> <label>日期</label> <input type="date" id="date" required /> </div> <div class="form-group"> <label>摘要</label> <input type="text" id="summary" placeholder="如:销售商品收入" required /> </div> <div class="form-group"> <label>科目</label> <select id="account" required> <option value="">--选择会计科目--</option> <option value="cash">库存现金</option> <option value="bank">银行存款</option> <option value="revenue">主营业务收入</option> <option value="payable">应付账款</option> <option value="receivable">应收账款</option> <option value="expense">管理费用</option> </select> </div> <div class="form-group"> <label>借方金额</label> <input type="number" id="debit" step="0.01" placeholder="请输入借方金额" /> </div> <div class="form-group"> <label>贷方金额</label> <input type="number" id="credit" step="0.01" placeholder="请输入贷方金额" /> </div> <button type="submit">保存凭证</button> </form> </section> <!-- ============ 资产负债表 ============ --> <section id="balance-sheet"> <h3>资产负债表(示例)</h3> <table> <thead> <tr> <th>项目</th> <th>期末余额(元)</th> <th>期初余额(元)</th> </tr> </thead> <tbody> <tr><td>货币资金</td><td>150,000.00</td><td>130,000.00</td></tr> <tr><td>应收账款</td><td>80,000.00</td><td>75,000.00</td></tr> <tr><td>存货</td><td>200,000.00</td><td>190,000.00</td></tr> <tr><td><strong>资产合计</strong></td><td><strong>430,000.00</strong></td><td><strong>395,000.00</strong></td></tr> <tr><td>应付账款</td><td>60,000.00</td><td>55,000.00</td></tr> <tr><td>应交税费</td><td>20,000.00</td><td>18,000.00</td></tr> <tr><td><strong>负债合计</strong></td><td><strong>80,000.00</strong></td><td><strong>73,000.00</strong></td></tr> <tr><td><strong>所有者权益</strong></td><td><strong>350,000.00</strong></td><td><strong>322,000.00</strong></td></tr> </tbody> </table> </section> <!-- ============ 利润表 ============ --> <section id="income-statement"> <h3>利润表(示例)</h3> <table> <thead> <tr> <th>项目</th> <th>本期金额(元)</th> <th>上期金额(元)</th> </tr> </thead> <tbody> <tr><td>一、营业收入</td><td>500,000.00</td><td>450,000.00</td></tr> <tr><td>减:营业成本</td><td>300,000.00</td><td>270,000.00</td></tr> <tr><td>税金及附加</td><td>20,000.00</td><td>18,000.00</td></tr> <tr><td>销售费用</td><td>30,000.00</td><td>28,000.00</td></tr> <tr><td>管理费用</td><td>40,000.00</td><td>38,000.00</td></tr> <tr><td><strong>二、营业利润</strong></td><td><strong>110,000.00</strong></td><td><strong>96,000.00</strong></td></tr> <tr><td>加:营业外收入</td><td>5,000.00</td><td>4,000.00</td></tr> <tr><td><strong>三、利润总额</strong></td><td><strong>115,000.00</strong></td><td><strong>100,000.00</strong></td></tr> <tr><td>减:所得税费用</td><td>28,750.00</td><td>25,000.00</td></tr> <tr><td><strong>四、净利润</strong></td><td><strong>86,250.00</strong></td><td><strong>75,000.00</strong></td></tr> </tbody> </table> </section> <!-- ============ 数据可视化 ============ --> <section id="charts" class="chart-container"> <h3>财务数据可视化</h3> <p>此处可集成 ECharts 或 Chart.js 实现柱状图、折线图等。</p> <img src="https://via.placeholder.com/600x300?text=收入+支出+趋势图" alt="图表占位图" style="max-width: 100%;" /> <p><small>提示:可添加月度收入对比图、利润变化趋势图等。</small></p> </section> </div> <footer> © 2025 会计信息网络化管理系统 | 技术支持:Web开发团队 </footer> <script> // 页面切换逻辑 document.querySelectorAll('nav a').forEach(link => { link.addEventListener('click', function(e) { e.preventDefault(); const targetId = this.getAttribute('href').substring(1); // 隐藏所有 section document.querySelectorAll('.container > section').forEach(section => { section.style.display = 'none'; }); // 显示目标页面 if (targetId === 'home') { document.getElementById('home').style.display = 'block'; } else { const targetSection = document.getElementById(targetId); if (targetSection) targetSection.style.display = 'block'; } }); }); // 表单提交处理 document.getElementById('accountingForm').addEventListener('submit', function(e) { e.preventDefault(); const voucherNo = document.getElementById('voucherNo').value; const date = document.getElementById('date').value; const summary = document.getElementById('summary').value; const account = document.getElementById('account').value; const debit = parseFloat(document.getElementById('debit').value || 0).toFixed(2); const credit = parseFloat(document.getElementById('credit').value || 0).toFixed(2); alert(`凭证已保存!\n编号:${voucherNo}\n摘要:${summary}\n借方:${debit}元\n贷方:${credit}元`); // 可在此处添加将数据插入“最近凭证记录”表格的逻辑 // 示例:动态添加一行到首页的表格中(略) }); // 默认显示首页 window.onload = () => { document.querySelectorAll('.container > section').forEach(s => s.style.display = 'none'); document.getElementById('home').style.display = 'block'; }; </script> </body> </html> 首页点击录入新凭证跳转录入凭证框,我需要完整代码
10-18
<template> <div class="app-container"> <!-- 搜索表单 --> <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="90px"> <el-form-item label="客户名称" prop="customerName"> <el-input v-model="queryParams.customerName" placeholder="请输入客户名称" clearable size="small" @keyup.enter.native="handleQuery"/> </el-form-item> <el-form-item label="项目名称" prop="projectName"> <el-input v-model="queryParams.projectName" placeholder="请输入项目名称" clearable size="small" @keyup.enter.native="handleQuery"/> </el-form-item> <el-form-item label="成品料号" prop="batteryFinishedPartNumber"> <el-input v-model="queryParams.batteryFinishedPartNumber" placeholder="请输入成品料号" clearable size="small" @keyup.enter.native="handleQuery"/> </el-form-item> <el-form-item label="半成品料号" prop="pcbSemiFinishedPartNumber"> <el-input v-model="queryParams.pcbSemiFinishedPartNumber" placeholder="请输入半成品料号" clearable size="small" @keyup.enter.native="handleQuery"/> </el-form-item> <el-form-item label="丝印" prop="mainBoardSilkScreen"> <el-input v-model="queryParams.mainBoardSilkScreen" placeholder="请输入丝印" clearable size="small" @keyup.enter.native="handleQuery"/> </el-form-item> <el-form-item label="文档版次" prop="materialColor"> <el-input v-model="queryParams.materialColor" placeholder="请输入文档版次" clearable size="small" @keyup.enter.native="handleQuery"/> </el-form-item> <el-form-item> <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button> <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button> </el-form-item> </el-form> <!-- 操作按钮 --> <el-row :gutter="10" class="mb8"> <el-col :span="1.5"> <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd" v-hasPermi="['cms:specificationdata:add']">新增</el-button> </el-col> <el-col :span="1.5"> <el-button type="success" plain icon="el-icon-edit" size="mini" :disabled="single" @click="handleUpdate" v-hasPermi="['cms:specificationdata:edit']">修改</el-button> </el-col> <el-col :span="1.5"> <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple" @click="handleDelete" v-hasPermi="['cms:specificationdata:remove']">删除</el-button> </el-col> <el-col :span="1.5"> <el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport" v-hasPermi="['cms:specificationdata:export']">导出列表</el-button> </el-col> <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"/> </el-row> <!-- 表格 --> <el-table v-loading="loading" :data="dataList" @selection-change="handleSelectionChange"> <el-table-column type="selection" width="30" align="center"/> <el-table-column label="ID" fixed="left" width="50" prop="id" align="center"/> <el-table-column label="项目名称" fixed="left" prop="projectName" align="center" sortable width="130"/> <el-table-column label="电芯品牌" prop="cellBrand" align="center" width="130"/> <el-table-column label="电芯型号" prop="cellModel" align="center"/> <el-table-column label="丝印" prop="mainBoardSilkScreen" align="center" width="130"/> <el-table-column label="料号" prop="mainBoardPartNumber" align="center" width="100"/> <el-table-column label="客户名称" prop="customerName" align="center"/> <el-table-column label="文档版次" prop="revision" align="center"/> <el-table-column label="更新人" prop="updateBy" align="center" width="100" sortable/> <el-table-column label="更新时间" prop="updateTime" align="center" width="100" sortable> <template slot-scope="scope"> <span>{{ parseTime(scope.row.updateTime || scope.row.createTime) }}</span> </template> </el-table-column> <el-table-column label="PCB顶图" align="center" width="150"> <template slot-scope="scope"> <el-button v-if="scope.row.pcbPlacementDiagramTopImg" type="text" icon="el-icon-document" @click="previewFile(scope.row.pcbPlacementDiagramTopImg)">查看顶图</el-button> <span v-else>—</span> </template> </el-table-column> <el-table-column label="PCB底图" align="center" width="150"> <template slot-scope="scope"> <el-button v-if="scope.row.pcbPlacementDiagramBottomImg" type="text" icon="el-icon-document" @click="previewFile(scope.row.pcbPlacementDiagramBottomImg)">查看底图</el-button> <span v-else>—</span> </template> </el-table-column> <el-table-column label="操作" align="center" fixed="right" width="160"> <template slot-scope="scope"> <el-button size="mini" type="text" icon="el-icon-download" @click="handleExportWord(scope.row)" v-hasPermi="['cms:specificationdata:export']">导出</el-button> <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)" v-hasPermi="['cms:specificationdata:edit']">修改</el-button> <el-button size="mini" type="text" icon="el-icon-document-copy" @click="handleCopy(scope.row)" v-hasPermi="['cms:specificationdata:add']">复制</el-button> <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)" v-hasPermi="['cms:specificationdata:remove']">删除</el-button> <el-button size="mini" type="text" icon="el-icon-download" v-show="scope.row.dwgLocalPath" @click="handleDownload(scope.row)" v-hasPermi="['cms:specificationdata:export']">下载附件</el-button> </template> </el-table-column> </el-table> <!-- 分页 --> <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize" @pagination="getList"/> <!-- 添加/编辑对话框 --> <el-dialog :title="title" :visible.sync="open" :before-close="cancel" :close-on-click-modal="false" width="95%" top="5vh" append-to-body > <el-tabs type="border-card"> <!-- 基本信息 --> <table class="basic-table"> <tr> <th class="label-cell">客户名称</th> <td> <el-input v-model="specForm.customerName" /> </td> </tr> <tr> <th class="label-cell">项目名称</th> <td> <el-input v-model="specForm.projectName" /> </td> </tr> <tr> <th class="label-cell">成品料号</th> <td> <el-input v-model="specForm.batteryFinishedPartNumber" /> </td> </tr> <tr> <th class="label-cell">半成品料号</th> <td> <el-input v-model="specForm.pcbSemiFinishedPartNumber" /> </td> </tr> </table> <h1 style="text-align: center;">生产规格书</h1> <!-- 保密等级 --> <h4>保密等级:</h4> <el-radio-group v-model="confidentialLevel" disabled> <el-radio label="绝密" class="custom-radio">绝密</el-radio> <el-radio label="机密" class="custom-radio">机密</el-radio> <el-radio label="内部公开" class="custom-radio">内部公开</el-radio> <el-radio label="外部公开" class="custom-radio">外部公开</el-radio> </el-radio-group> <!-- 审批信息 --> <h4>审批信息</h4> <table class="spec-table"> <tr> <th>拟制/日期<br>电子工程师</th> <th>审核/日期<br>直接上级</th> <th>审核/日期<br>DQE</th> <th>审核/日期<br>NPI</th> <th>批准/日期<br>经理</th> </tr> <tr> <td></td> <td></td> <td></td> <td></td> <td></td> </tr> </table> <!-- 文件修正记录 --> <h4>文件修正记录</h4> <div id="app"> <table class="spec-table"> <thead> <tr> <th>序号</th> <th>版次</th> <th>变更日期</th> <th>变更内容</th> <th>拟制</th> <th>审核</th> <th>批准</th> </tr> </thead> <tbody> <tr v-for="(item, index) in versionRecordList" :key="item.id"> <td>{{ index + 1 }}</td> <td><input type="text" v-model="item.revision" /></td> <td><input type="text" v-model="item.updateTime" /></td> <td><input type="text" v-model="item.changeDescription" /></td> <td><input type="text" v-model="item.updateBy" /></td> <td><input type="text" v-model="item.reviewedBy" /></td> <td><input type="text" v-model="item.approvedBy" /></td> </tr> </tbody> </table> <button @click="addRow">新增一行</button> </div> <hr class="divider"> <!-- 目录 --> <div class="directory-container"> <h2>目录</h2> <ul class="spec-directory"> <li>1 引言</li> <li>1.1 编写目的</li> <li>1.2 适用范围</li> <li>2 版本说明</li> <li>2.1 硬件版本</li> <li>2.2 软件版本</li> <li>2.3 上位机软件版本</li> <li>3 PCB贴片图</li> <li>4 PCM测试及检验规范</li> <li>4.1 PCM端口示意图</li> <li>4.2 烧录</li> <li>4.3 PCM测试</li> <li>4.4 PCBA半成品工艺要求</li> <li>5 半成品测试及检验规范</li> <li>5.1 电芯配组要求</li> <li>5.2 PCM组装上电顺序</li> <li>5.3 输出端口定义</li> <li>5.4 功能测试及检验标准</li> <li>6 成品测试及检验规范</li> <li>6.1 成品检测项目及标准</li> <li>6.2 成品结构尺寸</li> <li>6.3 成品打码规则</li> <li>6.4 追溯要求</li> <li>附录一</li> <li>附录二</li> </ul> </div> <hr class="divider"> <!-- 引言 --> <h3>1 引言</h3> <p>本文主要描述该项目产品的生产性能要求说明,明确整个产品在PCM、半成品、成品的性能测试标准及要求。</p> <h4>1.1 编写目的</h4> <p>本文档描述了本产品的生产过程性能测试要求及标准、工艺要求等。方便生产相关人员对本产品的制造和检验。</p> <h4>1.2 适用范围</h4> <p>本规格书适用于欣动能源科技有限公司设计的产品生产技术规范,适用于与之相关的生产和检验。</p> <hr class="divider"> <!-- 版本说明 --> <h4>2 版本说明</h4> <h5>2.1 硬件版本</h5> <table class="spec-table"> <thead> <tr> <th>序号</th> <th>PCB</th> <th>丝印</th> <th>料号</th> <th>备注</th> </tr> </thead> <tbody> <tr> <td>1</td> <td>主板</td> <td><input type="text" v-model="specForm.mainBoardSilkScreen" /></td> <td><input type="text" v-model="specForm.mainBoardPartNumber" /></td> <td></td> </tr> <tr> <td>2</td> <td>采集板</td> <td>/</td> <td>/</td> <td></td> </tr> <tr> <td>3</td> <td>灯板</td> <td>/</td> <td>/</td> <td></td> </tr> </tbody> </table> <h5>2.2 软件版本</h5> <table class="spec-table"> <thead> <tr> <th>序号</th> <th>PCM</th> <th>软件</th> <th>版本信息</th> <th>备注</th> </tr> </thead> <tbody> <tr><td>1</td><td rowspan="10">主板</td><td>Bootloader</td><td>/</td><td></td></tr> <tr><td>2</td><td>应用程序</td><td>/</td><td></td></tr> <tr><td>3</td><td>一体程序</td><td>/</td><td></td></tr> <tr><td rowspan="3">4</td><td rowspan="3">固件信息</td> <td>/</td><td rowspan="3"></td> </tr> <tr><td>/</td></tr> <tr><td>/</td></tr> <tr><td>5</td><td>烧录芯片选型</td><td>/</td><td></td></tr> <tr><td>6</td><td>固件烧录软件</td><td>/</td><td></td></tr> <tr><td>7</td><td>通讯设备</td><td>/</td><td></td></tr> </tbody> </table> <h5>2.3 上位机软件版本</h5> <h5 style="text-align: center;">生产上位机</h5> <table class="spec-table"> <thead> <tr> <th>序号</th> <th>上位机</th> <th>版本</th> <th>备注</th> </tr> </thead> <tbody> <tr><td>1</td><td>Bin对比上位机</td><td>/</td><td></td></tr> <tr><td>2</td><td>通讯/升级上位机</td><td>/</td><td></td></tr> <tr><td>3</td><td>自动对比上位机</td><td>/</td><td></td></tr> <tr><td>4</td><td>通信设备</td><td>/</td><td></td></tr> </tbody> </table> <h5 style="text-align: center;">生产文件</h5> <table class="spec-table"> <thead> <tr> <th>序号</th> <th>上位机</th> <th>版本</th> <th>备注</th> </tr> </thead> <tbody> <tr><td>1</td><td>Bin对比上位机</td><td>/</td><td></td></tr> <tr><td>2</td><td>通讯/升级上位机模板</td><td>/</td><td></td></tr> <tr><td>3</td><td>PCM自动对比模板</td><td>/</td><td></td></tr> <tr><td>4</td><td>半成品自动对比模板</td><td>/</td><td></td></tr> <tr><td>4</td><td>成品自动对比模板</td><td>/</td><td></td></tr> </tbody> </table> <!-- PCB贴片图 --> <hr class="divider"> <h4>3 PCB贴片图</h4> <div class="upload-group"> <label>顶面</label> <input type="file" @change="uploadPcbTopImage" /> <label>底面</label> <input type="file" @change="uploadPcbBottomImage" /> </div> <!-- PCM测试及检验规范 --> <hr class="divider"> <h4>4 PCM测试及检验规范</h4> <h5>4.1 PCM端口示意图</h5> <input type="file" @change="uploadPcmPortImage" /> <hr class="divider"> <h5>4.2 烧录</h5> <p>不涉及</p> <hr class="divider"> <h5>4.3 PCM测试</h5> <table class="spec-table"> <thead> <tr> <th colspan="2">检验项目</th> <th>性能要求</th> <th>必检项</th> <th>抽检项</th> <th>备注</th> </tr> </thead> <tbody> <tr> <td rowspan="16">充电保护</td> <td>过充电保护电压</td> <td>4.175±0.025V</td> <td><input type="checkbox" checked disabled /></td> <td><input type="checkbox" disabled/></td> <td>每节电芯</td> </tr> <tr> <td>过充电保护延时</td> <td>1.0±0.5S</td> <td><input type="checkbox" checked disabled /></td> <td><input type="checkbox" disabled/></td> <td></td> </tr> <tr> <td>过充电保护释放电压</td> <td>4.075±0.025V</td> <td><input type="checkbox" checked disabled /></td> <td><input type="checkbox" disabled/></td> <td>每节电芯</td> </tr> <tr> <td>过充电保护电压2</td> <td>4.25±0.025V</td> <td><input type="checkbox" checked disabled /></td> <td><input type="checkbox" disabled/></td> <td>每节电芯</td> </tr> <tr> <td>过充电保护延时2</td> <td>1.0±0.5S</td> <td><input type="checkbox" checked disabled /></td> <td><input type="checkbox" disabled/></td> <td></td> </tr> <tr> <td>过放电保护电压</td> <td>2.80±0.03V</td> <td><input type="checkbox" checked disabled /></td> <td><input type="checkbox" disabled/></td> <td>每节电芯</td> </tr> <tr> <td>过放电保护延时</td> <td>1.0±0.5 S</td> <td><input type="checkbox" checked disabled /></td> <td><input type="checkbox" disabled/></td> <td></td> </tr> <tr> <td>过放电保护释放电压</td> <td>3.0±0.03V</td> <td><input type="checkbox" checked disabled /></td> <td><input type="checkbox" disabled/></td> <td>每节电芯</td> </tr> <tr> <td>充电过流保护</td> <td>6.67±1.67A</td> <td><input type="checkbox" checked disabled /></td> <td><input type="checkbox" disabled/></td> <td></td> </tr> <tr> <td>充电过电流保护延时</td> <td>500±200ms</td> <td><input type="checkbox" checked disabled /></td> <td><input type="checkbox" disabled/></td> <td></td> </tr> <tr> <td>放电过流保护1</td> <td>16.67±2A</td> <td><input type="checkbox" checked disabled /></td> <td><input type="checkbox" disabled/></td> <td></td> </tr> <tr> <td>放电过电流保护1延时</td> <td>200±100ms</td> <td><input type="checkbox" checked disabled /></td> <td><input type="checkbox" disabled/></td> <td></td> </tr> <tr> <td>放电过流保护2</td> <td>33.2±4A</td> <td><input type="checkbox" checked disabled /></td> <td><input type="checkbox" disabled/></td> <td></td> </tr> <tr> <td>放电过电流保护2延时</td> <td>20±10ms</td> <td><input type="checkbox" checked disabled /></td> <td><input type="checkbox" disabled/></td> <td></td> </tr> <tr> <td>短路保护</td> <td>66±7A</td> <td><input type="checkbox" disabled/></td> <td><input type="checkbox" checked disabled /></td> <td></td> </tr> <tr> <td>短路保护延时</td> <td><1000us</td> <td><input type="checkbox" disabled/></td> <td><input type="checkbox" checked disabled /></td> <td></td> </tr> <tr> <td rowspan="2">充放电</td> <td>充电测试</td> <td>16.6V/5.3A@5S</td> <td><input type="checkbox" checked disabled /></td> <td><input type="checkbox" disabled/></td> <td>单边测试法满足5.3A@5S即可</td> </tr> <tr> <td>正常放电</td> <td>1A@2S</td> <td><input type="checkbox" checked disabled /></td> <td><input type="checkbox" disabled/></td> <td></td> </tr> <tr> <td rowspan="4">阻值测试</td> <td>NTC1阻值测试</td> <td>当前电池温度在附录一R-T表中所对应的阻值在该温度±3℃所对应的阻值范围内</td> <td><input type="checkbox" checked disabled /></td> <td><input type="checkbox" disabled/></td> <td>测试方法:检测测试点 RT1和B-1间阻值,并判断其是否在当前电池温度±3℃所对应的阻值范围内。生产时需检测并控制环境温度,按附录一 R-T表灵活调整阻值范围。(例,电池温度为25℃时,对应阻值范围为8.8KΩ~11.4KΩ)</td> </tr> <tr> <td>B-与P-之间阻值</td> <td>≤40mΩ</td> <td><input type="checkbox" checked disabled /></td> <td><input type="checkbox" disabled/></td> <td>不包括外部测试设备等阻值</td> </tr> <tr> <td>B+与P+之间阻值</td> <td>≤20mΩ</td> <td><input type="checkbox" checked disabled /></td> <td><input type="checkbox" disabled/></td> <td>不包括外部测试设备等阻值</td> </tr> <tr> <td>NTC与P-端子间阻值</td> <td>当前电池温度在附录二R-T表中所对应的阻值在该温度±3℃所对应的阻值范围内</td> <td><input type="checkbox" checked disabled /></td> <td><input type="checkbox" disabled/></td> <td>NTC和P-端子之间阻值,需要在在当前电池温度±3℃所对应的阻值范围内。参考附录二R-T表灵活调整阻值范围。(例,电池温度为 25℃时,对应阻值范围为8.8KΩ ~11.3KΩ)</td> </tr> <tr> <td rowspan="2">功耗</td> <td>工作功耗</td> <td>≤40uA</td> <td><input type="checkbox" checked disabled /></td> <td><input type="checkbox" disabled/></td> <td>工作模式</td> </tr> <tr> <td>休眠功耗</td> <td>≤15uA</td> <td><input type="checkbox" disabled/></td> <td><input type="checkbox" checked disabled /></td> <td>设备欠压保护32±8S后进入休眠模式</td> </tr> </tbody> </table> <h5>4.4 PCBA半成品工艺要求</h5> <div> <label>参见受控的 PCBA 半成品检验标准</label> </div> <h4>5 半成品测试及检验规范</h4> <h5>5.1 电芯配组要求</h5> <table class="spec-table"> <thead> <tr> <th>序号</th> <th>检查项</th> <th>要求</th> <th>备注</th> </tr> </thead> <tbody> <tr> <td>1</td> <td>电芯型号</td> <td><el-input v-model="specForm.cellModel" /></td> <td><el-input v-model="specForm.cellBrand" /></td> </tr> <tr> <td>2</td> <td>内阻差</td> <td> <el-input v-model="specForm.maxCellInternalResistanceMohm" /> </td> <td>单个电芯内阻≤<el-input v-model="specForm.maxCellGroupResistanceDiffMohm" style="display: inline-block; width: 200px;" /></td> </tr> <tr> <td>3</td> <td>电压差</td> <td> <el-input v-model="specForm.maxCellGroupVoltageDiffMv" /> </td> <td>根据电芯来料检验标准</td> </tr> <tr> <td>4</td> <td>容量差</td> <td> <el-input v-model="specForm.maxCellGroupCapacityDiffMah" /> </td> <td>容量差由电芯供应商管控</td> </tr> <tr> <td>5</td> <td>档位/批次</td> <td>同一组电芯组为同一批次电芯,容量档位不能混用</td> <td></td> </tr> </tbody> </table> <h5>5.2 PCM组装上电顺序</h5> <div><label>1)电芯上电顺序:<el-input v-model="specForm.cellPowerOnSequence" style="display: inline-block; width: 250px;" />;</label></div> <div><label>2)组装成半成品后,在半成品测试之前需焊接JP点。</label></div> <div><label>注:上电后不允许在PCM上焊接任何接线或端子</label></div> <h5>5.3 输出端口定义</h5> <table class="spec-table"> <thead> <tr> <th>Terminal<br>端子</th> <th>Name<br>名称</th> <th>Description<br>描述</th> </tr> </thead> <tbody> <tr> <td>Pin1</td> <td>P+</td> <td>UL1007 20AWG 红</td> </tr> <tr> <td>Pin2</td> <td>P+</td> <td>UL1007 20AWG 红</td> </tr> <tr> <td>Pin3</td> <td>NTC</td> <td>UL1007 24AWG 白</td> </tr> <tr> <td>Pin4</td> <td>P-</td> <td>UL1007 20AWG 黑</td> </tr> <tr> <td>Pin5</td> <td>P-</td> <td>UL1007 20AWG 黑</td> </tr> <tr> <th colspan="3">Battery pack output port diagram/电池组输出端口图</th> </tr> <tr> <td colspan="3"> <input type="file" @change="uploadBatteryPackOutputPortDiagramImg" /></td> </tr> </tbody> </table> <h5>5.4 功能测试及检验标准</h5> <table class="spec-table"> <thead> <tr> <th colspan="2">检验项目</th> <th>性能要求</th> <th>必检项</th> <th>抽检项</th> <th>备注</th> </tr> </thead> <tbody> <tr> <td rowspan="14">功能测试</td> <td>充电过流保护</td> <td><el-input v-model="specForm.chargeOvercurrentProtection" style="display: inline-block; width: 250px;" /></td> <td><el-input v-model="specForm.requiredinspection1" style="display: inline-block; width: 250px;" /></td> <td><el-input v-model="specForm.sampling1" style="display: inline-block; width: 250px;" /></td> <td></td> </tr> <tr> <td>充电过电流保护延时</td> <td><el-input v-model="specForm.chargeOvercurrentDelay" style="display: inline-block; width: 250px;" /></td> <td><el-input v-model="specForm.requiredinspection2" style="display: inline-block; width: 250px;" /></td> <td><el-input v-model="specForm.sampling2" style="display: inline-block; width: 250px;" /></td> <td></td> </tr> <tr> <td>放电过流保护1</td> <td><el-input v-model="specForm.level1DischargeOvercurrentProtection" style="display: inline-block; width: 250px;" /></td> <td><el-input v-model="specForm.requiredinspection3" style="display: inline-block; width: 250px;" /></td> <td><el-input v-model="specForm.sampling3" style="display: inline-block; width: 250px;" /></td> <td></td> </tr> <tr> <td>放电过电流保护1延时</td> <td><el-input v-model="specForm.level1DischargeOvercurrentDelay" style="display: inline-block; width: 250px;" /></td> <td><el-input v-model="specForm.requiredinspection4" style="display: inline-block; width: 250px;" /></td> <td><el-input v-model="specForm.sampling4" style="display: inline-block; width: 250px;" /></td> <td></td> </tr> <tr> <td>放电过流保护2</td> <td><el-input v-model="specForm.level2DischargeOvercurrentProtection" style="display: inline-block; width: 250px;" /></td> <td><el-input v-model="specForm.requiredinspection5" style="display: inline-block; width: 250px;" /></td> <td><el-input v-model="specForm.sampling5" style="display: inline-block; width: 250px;" /></td> <td></td> </tr> <tr> <td>放电过电流保护2延时</td> <td><el-input v-model="specForm.level2DischargeOvercurrentDelay" style="display: inline-block; width: 250px;" /></td> <td><el-input v-model="specForm.requiredinspection6" style="display: inline-block; width: 250px;" /></td> <td><el-input v-model="specForm.sampling6" style="display: inline-block; width: 250px;" /></td> <td></td> </tr> <tr> <td>短路保护</td> <td><el-input v-model="specForm.shortCircuitProtection" style="display: inline-block; width: 250px;" /></td> <td><el-input v-model="specForm.requiredinspection7" style="display: inline-block; width: 250px;" /></td> <td><el-input v-model="specForm.sampling7" style="display: inline-block; width: 250px;" /></td> <td></td> </tr> <tr> <td>短路保护延时</td> <td><el-input v-model="specForm.shortCircuitDelay" style="display: inline-block; width: 250px;" /></td> <td><el-input v-model="specForm.requiredinspection8" style="display: inline-block; width: 250px;" /></td> <td><el-input v-model="specForm.sampling8" style="display: inline-block; width: 250px;" /></td> <td></td> </tr> <tr> <td>充电测试</td> <td><el-input v-model="specForm.normalCharging" style="display: inline-block; width: 250px;" /></td> <td><el-input v-model="specForm.requiredinspection9" style="display: inline-block; width: 250px;" /></td> <td><el-input v-model="specForm.sampling9" style="display: inline-block; width: 250px;" /></td> <td></td> </tr> <tr> <td>正常放电</td> <td><el-input v-model="specForm.normalDischarging" style="display: inline-block; width: 250px;" /></td> <td><el-input v-model="specForm.requiredinspection10" style="display: inline-block; width: 250px;" /></td> <td><el-input v-model="specForm.sampling10" style="display: inline-block; width: 250px;" /></td> <td></td> </tr> <tr> <td>开路电压</td> <td><el-input v-model="specForm.openCircuitVoltage" style="display: inline-block; width: 250px;" /></td> <td><el-input v-model="specForm.requiredinspection11" style="display: inline-block; width: 250px;" /></td> <td><el-input v-model="specForm.sampling11" style="display: inline-block; width: 250px;" /></td> <td>单节3.6-3.7V</td> </tr> <tr> <td>PACK 内阻</td> <td><el-input v-model="specForm.packInternalResistanceMohm" style="display: inline-block; width: 250px;" /></td> <td><el-input v-model="specForm.requiredinspection12" style="display: inline-block; width: 250px;" /></td> <td><el-input v-model="specForm.sampling12" style="display: inline-block; width: 250px;" /></td> <td>不包括测试线材阻值</td> </tr> <tr> <td>JP点连通性测试</td> <td><el-input v-model="specForm.jPpointContinuityTest" style="display: inline-block; width: 250px;" /></td> <td><el-input v-model="specForm.requiredinspection13" style="display: inline-block; width: 250px;" /></td> <td><el-input v-model="specForm.sampling13" style="display: inline-block; width: 250px;" /></td> <td>测试点TD与B-之间电压</td> </tr> <tr> <td>NTC与P-端子间阻值</td> <td>当前电池温度在附录二R-T表中所对应的阻值在该温度±3℃所对应的阻值范围内</td> <td><el-input v-model="specForm.requiredinspection14" style="display: inline-block; width: 250px;" /></td> <td><el-input v-model="specForm.sampling14" style="display: inline-block; width: 250px;" /></td> <td>NTC和P-端子之间阻值,需要在在当前电池温度±3℃所对应的阻值范围内。参考附录二R-T表灵活调整阻值范围。(例,电池温度为 25℃时,对应阻值范围为8.8KΩ ~11.3KΩ)</td> </tr> <tr> <td rowspan="5">全程活化</td> <td>CC-CV充电</td> <td colspan="3"><el-input v-model="specForm.fullCcCvCharging" style="display: inline-block; width: 250px;" /></td> <td rowspan="7">试产阶段需全程活化,量产后可由团队评估是否简易活化</td> </tr> <tr> <td>搁置</td> <td colspan="3"><el-input v-model="specForm.fullStandby" style="display: inline-block; width: 250px;" /></td> </tr> <tr> <td>恒流放电</td> <td colspan="3"><el-input v-model="specForm.fullConstantCurrentDischarge" style="display: inline-block; width: 250px;" /></td> </tr> <tr> <td>搁置</td> <td colspan="3"><el-input v-model="specForm.fullStandby" style="display: inline-block; width: 250px;" /></td> </tr> <tr> <td>充电至出货电压</td> <td colspan="3"><el-input v-model="specForm.fullChargeToShipmentVoltage" style="display: inline-block; width: 250px;" /></td> </tr> <tr> <td rowspan="2">简易活化</td> <td>充电至出货电压</td> <td colspan="3"><el-input v-model="specForm.quickChargeToShipmentVoltage" style="display: inline-block; width: 250px;" /></td> </tr> <tr> <td>搁置</td> <td colspan="3"><el-input v-model="specForm.quickStandby" style="display: inline-block; width: 250px;" /></td> </tr> <tr> <td>活化标准</td> <td>放电容量</td> <td><el-input v-model="specForm.standardDischargeCapacity" style="display: inline-block; width: 250px;" /></td> <td><el-input v-model="specForm.requiredinspection15" style="display: inline-block; width: 250px;" /></td> <td><el-input v-model="specForm.sampling15" style="display: inline-block; width: 250px;" /></td> <td>全程活化放电容量</td> </tr> </tbody> </table> <!-- 附录上传 --> <hr class="divider"> <h4>附录</h4> <div class="upload-group"> <label>附录一</label> <input type="file" @change="uploadNtcTable1" /> </div> <div class="upload-group"> <label>附录二</label> <input type="file" @change="uploadNtcTable2" /> </div> </el-tabs> <div style="text-align: right; margin-top: 20px;"> <el-button @click="cancel">取消</el-button> <el-button type="primary" @click="submitForm">提交</el-button> </div> </el-dialog> </div> </template> <script> import { listData, getData, delData, addData, updateData } from "@/api/cms/specificationData"; import { parseTime } from "@/utils"; import { getToken } from "@/utils/auth"; export default { name: "SpecificationData", data() { return { confidentialLevel: "内部公开", loading: true, single: true, multiple: true, showSearch: true, total: 0, dataList: [], open: false, title: "", uploadUrl: process.env.VUE_APP_BASE_API + "/api/upload", uploadHeaders: { Authorization: "Bearer " + getToken() }, queryParams: { pageNum: 1, pageSize: 10, customerName: "", projectName: "", batteryFinishedPartNumber: "", pcbSemiFinishedPartNumber: "", mainBoardSilkScreen: "", materialColor: "" }, specForm: { id: null, customerName: "", projectName: "", batteryFinishedPartNumber: "", pcbSemiFinishedPartNumber: "", mainBoardSilkScreen: "", mainBoardPartNumber: "", revision: "", updateTime: "", changeDescription: "", updateBy: "", reviewedBy: "", approvedBy: "", confidentialLevel: "内部公开", materialColor: "", pcbPlacementDiagramTopImg: "", pcbPlacementDiagramBottomImg: "", topImgList: [], bottomImgList: [] }, versionRecordList: [ { revision: "", updateTime: "", changeDescription: "", updateBy: "", reviewedBy: "", approvedBy: "" } ], rules: { customerName: [{ required: true, message: "客户名称不能为空", trigger: "blur" }], projectName: [{ required: true, message: "项目名称不能为空", trigger: "blur" }], batteryFinishedPartNumber: [{ required: true, message: "成品料号不能为空", trigger: "blur" }], pcbSemiFinishedPartNumber: [{ required: true, message: "半成品料号不能为空", trigger: "blur" }], mainBoardSilkScreen: [{ required: true, message: "丝印不能为空", trigger: "blur" }] } }; }, created() { this.getList(); }, methods: { parseTime, getList() { this.loading = true; listData(this.queryParams).then(response => { this.dataList = response.rows; this.total = response.total; this.loading = false; }); }, handleQuery() { this.queryParams.pageNum = 1; this.getList(); }, resetQuery() { this.resetForm("queryForm"); this.handleQuery(); }, handleSelectionChange(selection) { this.ids = selection.map(item => item.id); this.single = selection.length !== 1; this.multiple = !selection.length; }, handleAdd() { this.resetForm(); this.open = true; this.title = "新增"; }, handleUpdate(row) { const id = row.id || this.ids; getData(id).then(response => { this.specForm = response.data; this.open = true; this.title = "修改生产规格书"; }); }, handleDelete(row) { const ids = row.id || this.ids; this.$confirm('是否确认删除编号为"' + ids + '"的数据项?', "警告", { confirmButtonText: "确定", cancelButtonText: "取消", type: "warning" }).then(() => { delData(ids).then(() => { this.getList(); this.$message.success("删除成功"); }); }); }, handleExport() { this.download('cms/specificationdata/export', { ...this.queryParams }, `data_${new Date().getTime()}.xlsx`); }, handleExportWord(row) { const id = row.id || this.ids; getData(id).then(response => { this.specForm = response.data; // 可添加导出逻辑 }); }, handleDownload(row) { const name = row.dwgLocalPath.substring(row.dwgLocalPath.lastIndexOf("-") + 1); const urlParts = row.dwgLocalPath.split("specificationDwg"); const url = '/profile/specificationDwg' + urlParts[1]; const a = document.createElement('a'); a.setAttribute('download', name); a.setAttribute('href', process.env.VUE_APP_BASE_API + url); a.click(); }, resetForm() { this.specForm = { id: null, customerName: "", projectName: "", batteryFinishedPartNumber: "", pcbSemiFinishedPartNumber: "", mainBoardSilkScreen: "", materialColor: "", pcbPlacementDiagramTopImg: "", pcbPlacementDiagramBottomImg: "", topImgList: [], bottomImgList: [] }; }, submitForm() { this.$refs.form.validate(valid => { if (valid) { if (this.specForm.id) { updateData(this.specForm).then(() => { this.$message.success("修改成功"); this.open = false; this.getList(); }); } else { addData(this.specForm).then(() => { this.$message.success("新增成功"); this.open = false; this.getList(); }); } } }); }, cancel() { this.open = false; this.resetForm(); }, handleTopImgSuccess(response) { this.specForm.pcbPlacementDiagramTopImg = response.url; }, handleBottomImgSuccess(response) { this.specForm.pcbPlacementDiagramBottomImg = response.url; }, beforeImgUpload(file) { const isValid = file.type.startsWith("image/"); if (!isValid) this.$message.error("只能上传图片文件"); return isValid; }, handleExceed(files) { this.$message.warning(`最多上传 1 个文件,本次选择了 ${files.length} 个文件`); }, uploadPcbTopImage(file) { console.log('上传PCB顶部图片', file); }, uploadPcbBottomImage(file) { console.log('上传PCB底部图片', file); }, uploadPcmPortImage(file) { console.log('上传PCM端口图', file); }, uploadBatteryPackOutputPortDiagramImg(file) { console.log('上传电池组输出端口图', file); }, uploadNtcTable1(file) { console.log('上传NTC表1', file); }, uploadNtcTable2(file) { console.log('上传NTC表2', file); } } }; </script> <style lang="scss" scoped> .app-container { padding: 20px; } .el-table { width: 100%; } .el-button--mini { padding: 5px 10px; font-size: 12px; } .el-form-item__content { width: 200px; } @media (max-width: 768px) { .el-form-item__content { width: 100%; } } .spec-table { width: 100%; border-collapse: collapse; margin-bottom: 20px; th, td { border: 1px solid #ccc; padding: 8px; text-align: center; } } .directory-container { max-width: 600px; margin: 0 auto; padding: 0 20px; box-sizing: border-box; } .directory-container h2 { text-align: center; /* 标题居中 */ margin-bottom: 16px; padding-left: 0; } .spec-directory { list-style: none; padding: 0; margin: 0; } .spec-directory li { text-align: left; margin: 4px 0; padding-left: 0; transform: translateX(45%); /* 向右移动 20% */ width: 100%; } .upload-group { margin-bottom: 10px; } .upload-group label { font-weight: bold; margin-right: 10px; } .basic-table { width: 100%; border-collapse: collapse; margin-bottom: 20px; th, td { border: 1px solid #ccc; padding: 8px; text-align: center; } } .divider { border: 0; height: 1px; background: #ccc; /* 灰色分界线 */ margin: 20px 0; /* 上下留白 */ width: 100%; /* 与容器宽度一致 */ } /* 隐藏原生 radio 的样式,而不是使用 aria-hidden */ .custom-radio .el-radio__original { opacity: 0; position: absolute; clip: rect(0 0 0 0); pointer-events: none; } </style> 。根据</template>帮我完成<script>
最新发布
11-21
``` <% List<test_information> list = (List<test_information>)session.getAttribute("date"); String jsonString = new com.google.gson.Gson().toJson(list); %> <div id="overlay" style="display:none; position:fixed; top:0; left:0; width:100%; height:100%; background-color:rgba(0,0,0,0.5); z-index:99;"></div> <div class = "tit">查看凭证</div> <div class = "Ribbon"> <table class = "R_t"> <tr> <td style="white-space: nowrap; border-right: none !important;" class = "left_Ribbon"> <!-- 按钮1 --> <input type="button" value="传统记账" class="R_button_1" onclick = "accounting.show()"> <!-- 表单2 - 导出 --> <form action="" class="inline-form"> <input type="submit" value="导出" class="R_button"> </form> <!-- 表单3 - 打印 --> <form id="printForm" action="white.jsp" method="post" class="inline-form"> <input type="hidden" id="selectedTelsHiddenField" name="telsToPrint"> <input type="submit" value="打印" onclick="return submitSelectedTels();" class="R_button"> </form> <!-- 按钮4 --> <input type="button" value="模板" onclick="template.show()" class="R_button"> </td> <td class = "search_box"> <input type = "text" name = "search_name"class = "search_text" placeholder = "搜索关键字"> <input type="button" value="搜索" onclick="performSearch()" class = "search_button"> </td> </tr> </table> </div> <div class="body"> <table class="cer" > <% for(test_information news:list) { %> <!-- 将每条记录分为两列展示 --> <tr class = "head_tr"> <td class="zero_box"> <input type="checkbox" name="selectedTels" value="<%=news.getTel()%>" onchange="updateSelection(this)" style = "zoom : 300%"> </td> <td class="first_box"> <table> <tr> <td class="material_box"><%= news.getMaterial() %></td> </tr> <tr> <td class="time_box"><%= news.getStart_time() %></td> </tr> </table> </td> <td class="second_box"> <%= news.getWashing_method() %> <br/> <%= news.getPrice() %> </td> <td class="third_box"> <form action =""> <input name = "id" value ="<%=news.getTel() %>" type = "hidden"> <input type ="submit" class = "func_button" value = "税费" ><br> <input type ="submit" class = "func_button" value = "查看凭证" ><br> <input type ="submit" class = "func_button" value = "删除凭证" > </form> </td> </tr> <% } %> </table>```怎么解决吧list转换成json格式后再table中的for循环无法使用的问题
03-20
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值