java基础之导入(Excel)2
$(function(){ $("#linksCommonGrid").datagrid({ url:appPath+'/page/pageIndexMrgAct/queryPageIndexLinks', striped: true, remoteSort:false, pagination:true, rownumbers:true, singleSelect:false, height : 600, queryParams:getQueryParam1(), idField:'id', frozenColumns:[[{ field : 'ck', title:'全选', checkbox : true }]], columns:[[ {field:'opt',title:'操作',width:55,align:'center', formatter:function(value,rowData,rowIndex){ return "<img class='op-enable' src='"+appPath+"/js/lib/jquery-easyui/themes/icons/pencil.png' onClick='modifyLinksComm(\""+rowData.id+"\")' title='编辑'/>" + " <img class='op-enable' src='"+appPath+"/js/lib/jquery-easyui/themes/icons/cancel.png' onClick='cancelLinksComm("+rowData.id+")' title='删除'/> " ; } }, {field:'url',title:'URL',width:200,align:'center',sortable:true}, {field:'keywords1',title:'关键词',width:100,align:'center',sortable:true }, {field:'linkUrl1',title:'对方链接',width:200,align:'center',sortable:true }, {field:'qq',title:'对方QQ',width:100,align:'center',sortable:true }, {field:'phone',title:'对方手机',width:100,align:'center',sortable:true }, {field:'keywords2',title:'我方关键词',width:100,align:'center',sortable:true }, {field:'linkUrl2',title:'我方URL',width:200,align:'center',sortable:true }, {field:'addTime',title:'添加时间',width:100,align:'center',sortable:true } ]] }); }); function getQueryParam1() { var queryObject = new Object(); queryObject.linkType =Number($.trim($("#typeParam").val())); return queryObject; } function doQuery(){ $("#linksCommonGrid").datagrid('unselectAll'); $("#linksCommonGrid").datagrid('load',getQueryParam()); } function getQueryParam() { var queryObject = new Object(); queryObject.url = $.trim($("#queryUrl").val()); queryObject.keywords1 = $.trim($("#queryKeywords1").val()); queryObject.linkUrl1 = $.trim($("#queryLinkUrl1").val()); queryObject.qq = $.trim($("#queryqq").val()); queryObject.keywords2 = $.trim($("#queryKeywords2").val()); queryObject.linkUrl2 = $.trim($("#queryLinkUrl2").val()); queryObject.linkType =Number($.trim($("#typeParam").val())); return queryObject; } //新增友情链接 function addLinks (){ var iconStr = "icon-add"; var title = "添加友情链接"; initData(); $('#addDlg').window({ title : title, iconCls : iconStr, width : 580, height : 300, left : 200, modal : true, shadow : true, collapsible : false, minimizable : false, maximizable : false }); $('#addDlg').window('move', { top : 100 }); $('#addDlg').window('open'); } function closeWin(id) { if(id='addDlg'){ if($("#addUrl").val()=='' && $("#addKeywords1").val()=='' && $("#addLinkUrl1").val()==''){ $('#'+id).window('close'); }else{ $.messager.defaults = { ok: "是", cancel: "否,继续填写" }; $.messager.confirm('提示信息','将丢失已经填写的内容,是否继续关闭?',function(r){ if(r){ $('#'+id).window('close'); } }); } }else{ $('#'+id).window('close'); } } function initData(){ $('#addUrl').css("border","1px solid #A4BED4"); $('#addKeywords1').css("border","1px solid #A4BED4"); $('#addLinkUrl1').css("border","1px solid #A4BED4"); $("#addId").val(""); $("#addUrl").val(""); $("#addKeywords1").val(""); $("#addKeywords2").val(""); $("#addLinkUrl1").val(""); $("#addLinkUrl2").val(""); $("#addqq").val(""); $("#addPhone").val(""); } function save(){ if ($("#addUrl").val() == null || $("#addUrl").val() == '' || $("#addKeywords1").val() == null || $("#addKeywords1").val() == '' || $("#addLinkUrl1").val() == null || $("#addLinkUrl1").val() == '') { $.messager.alert('提示信息', '信息没有填写完整,请补充!', 'info'); return; } if($.trim($("#addUrl").val()).substr(0,7)!='http://'){ $.messager.alert('提示信息', 'URL格式错误,请以http://开头!', 'info'); $("#addUrl").css('border-color','red'); return; } var k1 = getByteLen($("#addKeywords1").val()) if(k1>40){ $.messager.alert('提示信息', '关键词最多20个中文字符', 'info'); $("#addKeywords1").css('border-color','red'); return; } if($.trim($("#addLinkUrl1").val()).substr(0,7)!='http://'){ $.messager.alert('提示信息', '对方链接格式错误,请以http://开头!', 'info'); $("#addLinkUrl1").css('border-color','red'); return; } if($("#addKeywords2").val() !=null && $("#addKeywords2").val() != ''){ var k2 = getByteLen($("#addKeywords2").val()); if(k2>40){ $.messager.alert('提示信息', '我方关键词最多20个中文字符', 'info'); return; } } if($("#addLinkUrl2").val() !=null && $("#addLinkUrl2").val() != ''){ if($.trim($("#addLinkUrl2").val()).substr(0,7)!='http://'){ $.messager.alert('提示信息', '我方URL格式错误,请以http://开头!', 'info'); $("#addUrl").css('border-color','red'); return; } } var modifyid =0; var pageIndexLinks = new Object(); if($("#addId").val()!=null && $("#addId").val()!=''){ modifyid=$("#addId").val(); pageIndexLinks.id=$("#addId").val(); } pageIndexLinks.linkType=Number($("#typeParam").val()); pageIndexLinks.url= $.trim($('#addUrl').val()); pageIndexLinks.keywords1=$.trim($("#addKeywords1").val()); pageIndexLinks.linkUrl1=$.trim($("#addLinkUrl1").val()); pageIndexLinks.qq=$.trim($("#addqq").val()); pageIndexLinks.phone=$.trim($("#addPhone").val()); pageIndexLinks.keywords2=$.trim($("#addKeywords2").val()); pageIndexLinks.linkUrl2=$.trim($("#addLinkUrl2").val()); doAjax({ url : appPath + '/page/pageIndexMrgAct/opreatePageIndexLinks', type : 'post', data : pageIndexLinks, success : function(data) { if (data.code == 0) { $.messager.alert('提示信息', '保存成功', 'success'); $('#addDlg').window('close'); doQuery(); }else if (data.code == -2){ var returnid=data.msg; if (returnid*1 != modifyid*1 ){ $('#addUrl').css("border","1px solid red"); $('#addKeywords1').css("border","1px solid red"); $('#addLinkUrl1').css("border","1px solid red"); $.messager.alert('提示信息', "该数据已经存在" + ',操作失败', 'error'); } }else if (data.code == -1){ $('#addUrl').css("border","1px solid red"); $('#addKeywords1').css("border","1px solid red"); $('#addLinkUrl1').css("border","1px solid red"); $.messager.alert('提示信息', "该数据已经存在" + ',操作失败', 'error'); }else { $.messager.alert('提示信息', data.msg + ',操作失败', 'error'); } }, error : function(XMLHttpRequest, textStatus, errorThrown) { $.messager.alert('提示信息', '操作未能完成' + textStatus, 'error'); } }); } //编辑 function modifyLinksComm (id){ initData(); var iconStr = "icon-edit"; var title = "编辑友情链接"; if (id != null) { doAjax({ url : appPath + '/page/pageIndexMrgAct/getPageIndexLinksId', type : 'post', data : { id : id }, dataType : 'json', success : function(data) { $("#addId").val(data.data.id); $("#addKeywords1").val(data.data.keywords1); $("#addLinkUrl1").val(data.data.linkUrl1); $("#addqq").val(data.data.qq); $("#addPhone").val(data.data.phone); $("#addKeywords2").val( data.data.keywords2); $("#addLinkUrl2").val(data.data.linkUrl2); $("#addUrl").val(data.data.url); }, error : function(XMLHttpRequest, textStatus, errorThrown) { $.messager.alert('提示信息', '操作未能完成' + textStatus, 'error'); } }); } $('#addDlg').window({ title : title, iconCls : iconStr, width : 580, height : 300, left : 200, modal : true, shadow : true, collapsible : false, minimizable : false, maximizable : false }); $('#addDlg').window('move', { top : 100 }); $('#addDlg').window('open'); } //单个删除 function cancelLinksComm (id){ var pageIndexLinks = new Object(); pageIndexLinks.id=id; pageIndexLinks.isDelete='Y'; $.messager.defaults = { ok: "确定", cancel: "取消" }; $.messager.confirm('提示信息','您确定要删除?',function(r){ if(r){ doAjax({ url : appPath + '/page/pageIndexMrgAct/deleteLinks', type : 'post', data : pageIndexLinks, success : function(data) { if (data.code == 0) { $.messager.alert('提示信息', '删除成功', 'success'); doQuery(); } else { $.messager.alert('提示信息', data.msg + ',操作失败', 'error'); } }, error : function(XMLHttpRequest, textStatus, errorThrown) { $.messager.alert('提示信息', '操作未能完成' + textStatus, 'error'); } }); } }); } //批量删除 function batchDeleteGoods(){ $.messager.defaults = { ok: "确定", cancel: "取消" }; var selections = $("#linksCommonGrid").datagrid('getSelections'); if (selections == null|| selections == '' || selections.length==0) { $.messager.alert('提示信息','请选择要删除的数据', 'info'); return; } $.messager.confirm('提示信息','您确定要删除这些记录?', function(r) { if (r) { var idStr = ''; for ( var i = 0; i < selections.length; i++) { if( i == (selections.length - 1)){ idStr += selections[i].id; }else{ idStr += selections[i].id + ","; } } doAjax({ url:appPath+'/page/pageIndexMrgAct/batchDeleteLinks', type:'post', data:{idStr:idStr}, success:function(data){ if(data='ok'){ $.messager.alert('提示信息','删除成功!','info'); } doQuery(); }, error:function(XMLHttpRequest, textStatus, errorThrown){ $.messager.alert('提示信息','删除失败!','info'); doQuery(); } }); } }); } //导出 function exportExcel(){ $.messager.confirm('提示信息','您确定要导出到Excel?',function(r){ if(r){ var columns = $("#linksCommonGrid").datagrid("options").columns[0]; //--------把标题grid标题和grid的field,拼接成字符串----------- var stringTitle = ""; var stringFields = ""; for(var i = 1; i < columns.length; i++){ stringTitle = stringTitle + columns[i].title + ","; stringFields = stringFields + columns[i].field + ","; } if(stringTitle.lastIndexOf(",") == (stringTitle.length-1)){ stringTitle = stringTitle.substring(0, stringTitle.lastIndexOf(",")); } if(stringFields.lastIndexOf(",") == (stringFields.length-1)){ stringFields = stringFields.substring(0, stringFields.lastIndexOf(",")); } var queryParams = $("#linksCommonGrid").datagrid("options").queryParams; queryParams.gridTitle = stringTitle; queryParams.gridField = stringFields; queryParams.moduleName = "友情链接.xls"; var formObj = $("<form></form>").attr("method","post").attr("action",appPath+"/page/pageIndexMrgAct/exportLinksList"); formObj.append("<input type='text' name='gridTitle'>") .append("<input type='text' name='gridField'>") .append("<input type='text' name='moduleName'>") .append("<input type='text' name='linkType'>") .append("<input type='text' name='url'>") .append("<input type='text' name='keywords1'>") .append("<input type='text' name='linkUrl1'>") .append("<input type='text' name='qq'>") .append("<input type='text' name='keywords2'>") .append("<input type='text' name='linkUrl2'>") .css('display','none') .appendTo("body"); formObj.form("load",queryParams); formObj.submit(); formObj.remove(); } }); } //批量导入新增 function batchaddLinks(){ var linkType=$.trim($("#typeParam").val()); var args1 = "height=350," + "width=650," + "toolbar =no," + "top =150," + "left =250," + "menubar=no," + "scrollbars=no," + "resizable=no," + "location=no," + "status=no"; window.open(appPath+"/jsp/homepage/links_import.jsp?linkType="+linkType,"",args1); } //返回val的字节长度 function getByteLen(val) { var len = 0; for (var i = 0; i < val.length; i++) { if (val[i].match(/[^\x00-\xff]/ig) != null) //全角 len += 2; else len += 1; } return len; }
=================================================================
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <c:set var="ctx" value="${pageContext.request.contextPath}" /> <html> <head> <jsp:include page="/jsp/common/header.jsp"></jsp:include> <title>友情链接</title> <script type="text/javascript" src="${ctx }/js/homepage/home_page_linkFriendly.js"></script> </head> <body> <input type="hidden" id="typeParam" value="<%=request.getParameter("typeParam")%>"> <table class="queryTable" > <tr> <td class="queryTitle" width="80px">URL:</td> <td class="queryContent"> <input class="inputText" id="queryUrl" /> </td> <td class="queryTitle" width="80px">关键词:</td> <td class="queryContent"> <input class="inputText" id="queryKeywords1" /> </td> <td class="queryTitle" width="80px">对方链接:</td> <td class="queryContent"> <input class="inputText" id="queryLinkUrl1" /> </td> <td class="queryTitle" width="80px">对方QQ:</td> <td class="queryContent"> <input class="inputText" id="queryqq" /> </td> </tr> <tr> <td class="queryTitle" width="80px">我方关键词:</td> <td class="queryContent"> <input class="inputText" id="queryKeywords2"/> </td> <td class="queryTitle" width="80px">我方URL:</td> <td class="queryContent"> <input class="inputText" id="queryLinkUrl2" /> </td> <td class="queryBtnTd" colspan="4"> <a href="javascript:void(0)" class="easyui-linkbutton" iconCls="icon-search" onclick="doQuery()">检 索</a> </td> </tr> </table> <div region="south" border="false" style="text-align:left;height:35px;line-height:30px;"> <a href="javascript:void(0)" class="easyui-linkbutton" iconCls="icon-add" onclick="addLinks()">新增友情链接</a> <a href="javascript:void(0)" class="easyui-linkbutton" iconCls="icon-add" onclick="batchaddLinks()">批量新增友情链接</a> <a href="javascript:void(0)" class="easyui-linkbutton" iconCls="icon-cancel" onclick="batchDeleteGoods()">批量删除</a> <a href="javascript:void(0)" class="easyui-linkbutton" iconCls="icon-exportExcel" onclick="exportExcel()">导出Excel</a> </div> <table id="linksCommonGrid" ></table> <div id="addDlg" class="easyui-window" title="" closed="true" iconCls="icon-save" style="width: 582px; height: 500px; text-align: center; background: #fafafa;"> <div class="easyui-layout" fit="true"> <div region="center" border="false" style="background: #fff; border: 1px solid #ccc; padding-left: 30px;"> <form id="addForm" method="POST" style="width: 580px; height: 210px; text-align: center;"> <table border="0" class="queryTable" width="450px" height="210px" style="margin-bottom: 0px"> <tr> <td class="queryTitle">*URL: <input id="addId" type="hidden" /> </td> <td class="queryContent"><input type="text" id="addUrl" name="addUrl" class="inputText easyui-validatebox" required="true" /><font color="red">(必须以http://开头)</font></td> </tr> <tr> <td class="queryTitle">*关键词:</td> <td class="queryContent"><input type="text" id="addKeywords1" name="addKeywords1" class="inputText easyui-validatebox" required="true" /><font color="red">(最多20个中文字符)</font></td> </tr> <tr> <td class="queryTitle">*对方链接:</td> <td class="queryContent"><input type="text" id="addLinkUrl1" name="addLinkUrl1" class="inputText easyui-validatebox" required="true" /> <font color="red">(必须以http://开头)</font></td> </tr> <tr> <td class="queryTitle">对方QQ:</td> <td class="queryContent"><input type="text" id="addqq" name="addqq" class="inputText easyui-validatebox" required="true" /></td> </tr> <tr> <td class="queryTitle" width="70px">对方手机:</td> <td class="queryContent"><input type="text" id="addPhone" class="inputText easyui-validatebox" required="true" /></td> </tr> <tr> <td class="queryTitle" width="70px">我方关键词:</td> <td class="queryContent"><input type="text" id="addKeywords2" class="inputText easyui-validatebox" required="true" /></td> </tr> <tr> <td class="queryTitle" width="70px">我方URL:</td> <td class="queryContent"><input type="text" id="addLinkUrl2" class="inputText easyui-validatebox" required="true" /> <font color="red">(必须以http://开头)</font></td> </tr> </table> </form> </div> <div region="south" border="false" style="text-align: center; height: 30px; line-height: 30px;"> <a class="easyui-linkbutton" iconCls="icon-ok" href="javascript:void(0)" onclick="save()">保存</a> <a class="easyui-linkbutton" iconCls="icon-cancel" href="javascript:void(0)" onclick="closeWin('addDlg')">关闭</a> </div> </div> </div> </body> </html>
=================================================
/** * 批量导入 * * @param request * @param response * @param uploadFile * @throws Exception */ @RequestMapping(value = "/linksImport", method = RequestMethod.POST) public void linksImport(HttpServletRequest request, HttpServletResponse response, @RequestParam("uploadFile") MultipartFile f) throws Exception { request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); Integer linkType=Integer.parseInt(request.getParameter("linkType")); HashMap<String, Object> map = new HashMap<String, Object>(); try { InputStream is = f.getInputStream(); Workbook wb = Workbook.getWorkbook(is); Sheet sheet = wb.getSheet(0); map = this.doImportLinks(sheet,linkType); response.getWriter().write(org.json.simple.JSONObject.toJSONString(map)); } catch (Exception e) { response.getWriter().write("{code:-3,msg:'inner error'}"); logger.error(e.getMessage(), e); } } ============================================================================= private HashMap<String, Object> doImportLinks(Sheet sheet,Integer linkType) { HashMap<String, Object> rslt = new HashMap<String, Object>(); List<PageIndexLinks> pageIndexLinksList=new ArrayList<PageIndexLinks>(); if(linkType==null){ rslt.put("code", -1); rslt.put("msg", "业务类型传输有错"); return rslt; } int countColumn = sheet.getColumns(); int countRow = sheet.getRows(); if (countColumn !=7) { rslt.put("code", -2);// Excel表格应该等于7列 } else if (countRow <= 1) { rslt.put("code", -2);// Excel表格应该大于1行 } else { Cell cell = null; for (int i = 1; i < countRow; i++) { PageIndexLinks pageIndexLinks=new PageIndexLinks(); pageIndexLinks.setLinkType(linkType); pageIndexLinks.setIsDelete("N"); for (int j = 0; j < countColumn; j++) { cell = sheet.getCell(j, i); String content = (null == cell.getContents()) ? "" : cell .getContents().trim(); if(j==0||j==1|j==2){ if(StringUtils.isEmpty(content)){ rslt.put("code", -1); rslt.put("msg", "提供的Excel数据存在空值"); return rslt; } } if(j==0 || j==2 ||( j==6&& content !=null&&content.length()>0)){ if(!content.substring(0, 7).equals("http://")){ rslt.put("code", -1); rslt.put("msg", "提供的Excel数据存在不合规格的url"); return rslt; } } if(j==0 ){ pageIndexLinks.setUrl(content); }else if (j==1){ if (content.length()>40 ) { rslt.put("code", -1); rslt.put("msg", "提供的Excel数据为:"+content+",超出长度,最多20个中文字符"); return rslt; }else { pageIndexLinks.setKeywords1(content); } }else if(j==2){ pageIndexLinks.setLinkUrl1(content); }else if (j==3 && content !=null &&content.length()>0 ){ pageIndexLinks.setQq(content); }else if (j==4 && content !=null &&content.length()>0 ){ pageIndexLinks.setPhone(content); }else if (j==5 && content !=null&&content.length()>0 ){ if (content.length()>40 ) { rslt.put("code", -1); rslt.put("msg", "提供的Excel数据为:"+content+",超出长度,最多20个中文字符"); return rslt; }else { pageIndexLinks.setKeywords2(content); } }else if(j==6 && content !=null && content.length()>0){ pageIndexLinks.setLinkUrl2(content); } } if(pageIndexLinks!=null){ pageIndexLinksList.add(pageIndexLinks); } } JSONArray json1=JSONArray.fromObject(pageIndexLinksList); rslt.put("code", 0); rslt.put("pageIndexLinksList", json1.toString()); return rslt; } return rslt; }
=====================================
java基础之导入(Excel)2的更多相关文章
- java数据库数据导入excel
data导出入excel中 controller: package com.longfor.hrssc.api.controller; import com.longfor.hrssc.api.mod ...
- Java 使用poi导入excel,结合xml文件进行数据验证的例子(增加了jar包)
ava 使用poi导入excel,结合xml文件进行数据验证的例子(增加了jar包) 假设现在要做一个通用的导入方法: 要求: 1.xml的只定义数据库表中的column字段,字段类型,是否非空等条件 ...
- java基础之导入(药师点评)
/** * 药师点评的导入 * @param request * @param response * @param f * @param tmallTcMessageImport * @return ...
- java的poi导入excel时解析日期
if (r.getCellType()==Cell.CELL_TYPE_NUMERIC){ if(HSSFDateUtil.isCellDateFormatted(r)){ //用于转化为日期格式 D ...
- java基础之导出(Excel)
function exportExcel() { $.messager .confirm( '提示信息', '您确定要导出到Excel?', function(r) { if (r) { var co ...
- [Java] 高效快速导入EXCEL数据
需求1.高效率的以excel表格的方式导入多条数据.2.以身份证号为唯一标识,如果身份证号已存在,则该条数据不导入. 分析刚开始的时候是传统的做法,解析excel数据,获取单个对象,判断身份证是否已存 ...
- java基础篇 -- 导出excel表格数据
本篇文章基于java把数据库中的数据以Excel的方式导出,欢迎各位大神吐槽: 1.基于maven jar包引入如下: <dependency> <groupId>net.so ...
- java 使用poi 导入Excel 数据到数据库
由于我个人电脑装的Excel是2016版本的,所以这地方我使用了XSSF 方式导入 . 1先手要制定一个Excel 模板 把模板放入javaWeb工程的某一个目录下如图: 2模板建好了后,先实现模板下 ...
- java 使用poi导入Excel通用方法
需要的jar: [XML] 纯文本查看 复制代码 ? 1 2 3 4 5 <dependency> <groupId>org.apache.poi< ...
随机推荐
- Swift和OC混编时, 关于@objc的作用
Objective-C 和 Swift 在底层使用的是两套完全不同的机制,Cocoa 中的 Objective-C 对象是基于运行时的,它从骨子里遵循了 KVC (Key-Value Coding,通 ...
- (五)Angularjs - 依赖注入
如何找到API? AngularJS提供了一些功能的封装,但是当你试图通过全局对象angular去 访问这些功能时,却发现与以往遇到的库大不相同. 比如,AngularJS暴露了一个全局对象:angu ...
- 你好,C++(22) 排排坐,吃果果——4.3.3 for循环:某个范围内…每个都…
4.3.3 for循环:某个范围内…每个都… 既然while语句和do…while…语句都已经可以满足我们表达循环现象的需要,那为什么C++还要专门提供for语句来表达循环现象呢?在现实世界中,常常 ...
- JS函数定义与匿名函数的调用
一.函数声明.函数表达式.匿名函数 函数声明:function fnName () {…};使用function关键字 声明一个函数,再指定一个函数名,叫函数声明. 函数表达式 var fnName ...
- PHPの页面跳转-常见方法
PHP页面跳转一.header()函数 header()函数是PHP中进行页面跳转的一种十分简单的方法.header()函数的主要功能是将HTTP协议标头(header)输出到浏览器. header( ...
- 图的建立——邻接矩阵表示(C语言+VC6.0平台)
图的邻接矩阵表示及其建立(无向图) #include <stdio.h> #include <stdlib.h> typedef char VertexType; ...
- 关于nginx架构探究(4)
事件管理机制 Nginx是以事件驱动的,也就是说Nginx内部流程的向前推进基本都是靠各种事件的触发来驱动,否则Nginx将一直阻塞在函数epoll_wait()或suspend函数,Nginx事件一 ...
- OSSEC配置
http://gavinshaw.blog.51cto.com/385947/1020540
- Ubuntu下Qt-4.7.1的静态编译
最近在学习Qt的静态编译,相比较来说windows的Qt静态编译比较容易,相反对于linux编译网上的文章实践下来都有这样那样的错误,这里简要小结一下自己的编译成果. 一.实验环境 1.Ubuntu ...
- 2015第28周六SVN和Git
svn作为一个优秀源码版本的管理工具,可以适合绝大多数项目.但是因为它的采用中心化管理,不可避免的存在本地代码的备份和版本管理问题.也就是说对于尚未或暂无法提交到Subversion服务器的本地代码来 ...