当前位置: 首页 > 编程日记 > 正文

基于Metronic的Bootstrap开发框架经验总结(7)--数据的导入、导出及附件的查看处理...

在很多系统模块里面,我们可能都需要进行一定的数据交换处理,也就是数据的导入或者导出操作,这样的批量处理能给系统用户更好的操作体验,也提高了用户录入数据的效率。我在较早时期的EasyUI的Web框架上,也介绍过通过Excel进行的数据导入导出操作,随笔文章为《基于MVC4+EasyUI的Web开发框架经验总结(10)--在Web界面上实现数据的导入和导出》,本文基于Bootstrap的框架基础上,再对这个模块进行更新处理,以及Office文档或者图片等附件的查看处理。

1、数据的导入操作

一般系统模块里面,都有数据导入和导出操作,因此在界面自动生成的时候,我都倾向于给用户自动生成这些标准的查询、导入、导出等操作功能,界面效果如下所示。

导入操作,在Bootstrap框架里面,我把它作为一个层的,都统一放在index.cshtml文件里面,这样可以使得整个界面的处理更加紧密一点,示例代码如下所示。

下面这些代码一般情况下,都是自动生成的,包括所需的全部字段,我们一般是根据需要进行字段的裁剪,以适应我们的业务和实际需要。

<!--导入数据操作层-->
<div id="import" class="modal fade bs-modal-lg" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true"><div class="modal-dialog modal-lg"><div class="modal-content"><div class="modal-header bg-primary"><button type="button" class="close" data-dismiss="modal" aria-hidden="true"></button><h4 class="modal-title">文件导入</h4></div><div class="modal-body"><div style="text-align:right;padding:5px"><a href="~/Content/Template/User-模板.xls" onclick="javascript:Preview();"><img alt="测试用户信息-模板" src="~/Content/images/ico_excel.png" /><span style="font-size:larger;font-weight:200;color:red">User-模板.xls</span></a></div><hr/><form id="ffImport" method="post"><div title="Excel导入操作" style="padding: 5px" data-options="iconCls:'icon-key'"><input class="easyui-validatebox" type="hidden" id="AttachGUID" name="AttachGUID" />    <input id="file_upload" name="file_upload" type="file" multiple="multiple">                    <a href="javascript:;" class="btn btn-primary" id="btnUpload" onclick="javascript: $('#file_upload').uploadify('upload', '*')">上传</a><a href="javascript:;" class="btn btn-default" id="btnCancelUpload" onclick="javascript: $('#file_upload').uploadify('cancel', '*')">取消</a><div id="fileQueue" class="fileQueue"></div><br />                    <hr style="width:98%" />                    <div id="div_files"></div><br />                    </div></form><!--数据显示表格--><table id="gridImport" class="table table-striped table-bordered table-hover" cellpadding="0" cellspacing="0" border="0" class="display" width="100%"><thead id="gridImport_head"><tr><th class="table-checkbox" style="width:40px"><input class="group-checkable" type="checkbox" onclick="selectAll(this)"></th><th>用户编码</th><th>用户名/登录名</th><th>真实姓名</th><th>职务头衔</th><th>移动电话</th><th>办公电话</th><th>邮件地址</th><th>性别</th><th>QQ号码</th><th>备注</th></tr></thead><tbody id="gridImport_body"></tbody></table></div><div class="modal-footer"><button type="button" class="btn btn-default" data-dismiss="modal">关闭</button><button type="button" class="btn btn-primary" onclick="SaveImport()">保存</button></div></div></div>
</div>

我们如果要显示导入操作界面,那么只需要把这个层显示出来即可,如下脚本所示。

        //显示导入界面function ShowImport() {$("#import").modal("show");}

这里的文件上传处理,主要使用了Uploadify的这个控件进行处理的,当然也可以利用我前面介绍过的File Input上传控件进行处理,都可以很好实现这些导入操作。

一般情况下的Uploadify控件的初始化代码如下所示

        $(function () {//添加界面的附件管理$('#file_upload').uploadify({'swf': '/Content/JQueryTools/uploadify/uploadify.swf',  //FLash文件路径'buttonText': '浏  览',                                 //按钮文本'uploader': '/FileUpload/Upload',                       //处理上传的页面'queueID': 'fileQueue',                         //队列的ID'queueSizeLimit': 1,                            //队列最多可上传文件数量,默认为999'auto': false,                                  //选择文件后是否自动上传,默认为true'multi': false,                                 //是否为多选,默认为true'removeCompleted': true,                        //是否完成后移除序列,默认为true'fileSizeLimit': '10MB',                        //单个文件大小,0为无限制,可接受KB,MB,GB等单位的字符串值'fileTypeDesc': 'Excel Files',                  //文件描述'fileTypeExts': '*.xls',                        //上传的文件后缀过滤器'onQueueComplete': function (event, data) {     //所有队列完成后事件//业务处理代码//提示用户Excel格式是否正常,如果正常加载数据
                },'onUploadStart': function (file) {InitUpFile();//上传文件前 ,重置GUID,每次不同$("#file_upload").uploadify("settings", 'formData', { 'folder': '数据导入文件', 'guid': $("#AttachGUID").val() }); //动态传参数
                },'onUploadError': function (event, queueId, fileObj, errorObj) {//alert(errorObj.type + ":" + errorObj.info);
                }});});

关键的逻辑就是:

//业务处理代码

一般情况下,我们在这里已经在服务器里面获得了Excel文件了,因此需要对这个文件的格式进行处理,如果格式正确,那么我们把数据显示出来,供导入用户进行记录的选择,决定导入那些记录即可。

处理检查Excel数据格式的代码如下所示。

                    //提示用户Excel格式是否正常,如果正常加载数据
                    $.ajax({url: '/User/CheckExcelColumns?guid=' + guid,type: 'get',dataType: 'json',success: function (data) {if (data.Success) {InitGrid(); //重新刷新表格数据showToast("文件已上传,数据加载完毕!");}else {showToast("上传的Excel文件检查不通过。请根据页面右上角的Excel模板格式进行数据录入。", "error");}}});

我们就是在后台增加一个CheckExcelColumns的方法,用来检查Excel文件的字段格式的,只有符合格式要求的文件,才被获取数据并显示在界面上。

显示在界面上的JS代码,也就是主要把Excel文件的内容提取出来,并绑定在Table元素上即可。

        //根据条件查询并绑定结果function InitGrid() {var guid = $("#AttachGUID").val();var url = "/User/GetExcelData?guid=" + guid;$.getJSON(url, function (data) {$("#gridImport_body").html("");$.each(data.rows, function (i, item) {var tr = "<tr>";tr += "<td><input class='checkboxes' type=\"checkbox\" name=\"checkbox\" ></td>";tr += "<td>" + item.HandNo + "</td>";tr += "<td>" + item.Name + "</td>";tr += "<td>" + item.FullName + "</td>";   tr += "<td>" + item.Title + "</td>";tr += "<td>" + item.MobilePhone + "</td>";tr += "<td>" + item.OfficePhone + "</td>";tr += "<td>" + item.Email + "</td>";tr += "<td>" + item.Gender + "</td>";tr += "<td>" + item.QQ + "</td>";tr += "<td>" + item.Note + "</td>";tr += "</tr>";$("#gridImport_body").append(tr);});});}

为了更进一步获取用户导入到具体的部门,那么我们还可以弹出一个对话框用然后选择具体的信息,最后才提交数据到后台进行处理。

操作代码如下所示。

        //保存导入的数据function SaveImport() {//赋值给对象$("#Company_ID3").select2("val", @Session["Company_ID"]).trigger('change');$("#Dept_ID3").select2("val", @Session["Dept_ID"]).trigger('change');$("#selectDept").modal("show");}

这样我们确认保存的时候,只需要通过Ajax把数据提交给后台处理即可,具体JS代码如下所示。

            $.ajax({url: '/User/SaveExcelData',type: 'post',dataType: 'json',contentType: 'application/json;charset=utf-8',traditional: true,success: function (data) {if (data.Success) {//保存成功  1.关闭弹出层,2.清空记录显示 3.刷新主列表showToast("保存成功");$("#import").modal("hide");$(bodyTag).html("");Refresh();}else {showToast("保存失败:" + data.ErrorMessage, "error");}},data: postData});

Uploadify的处理在我之前基于EasyUI的界面里面也有说明,有兴趣可以参考《基于MVC4+EasyUI的Web开发框架经验总结(10)--在Web界面上实现数据的导入和导出》、《基于MVC4+EasyUI的Web开发框架形成之旅--附件上传组件uploadify的使用》以及《Web开发中的文件上传组件uploadify的使用》。

2、数据的导出操作

数据的导出操作相对比较简单,一般情况下,我们把数据写入一个固定的Excel表里面,然后提供URL给用户下载即可。

        //导出Excel数据function ShowExport() {var url = "/User/Export";var condition = $("#ffSearch").serialize();//获取条件
executeExport(url, condition);//执行导出}

具体的逻辑代码如下所示

//执行导出操作,输出文件
function executeExport(url, condition) {$.ajax({type: "POST",url: url,data: condition,success: function (filePath) {var downUrl = '/FileUpload/DownloadFile?file=' + filePath;window.location = downUrl;}});
}

3、附件的查看处理

多数情况下,我们可能需要查看上传的文件,包括Office文档、图片等可以进行预览的,是在不行,可以提供下载本地打开查看。

我在基于EasyUI的Web开发也介绍了Office的预览处理:《基于MVC4+EasyUI的Web开发框架经验总结(8)--实现Office文档的预览》,这里我们改进一下即可实现具体的Office预览和图片查看功能了。

上篇文件介绍了Office的预览有两种途径,一种是利用微软Office的预览地址进行预览,一种是用控件生成HTML进行预览,两种可以结合使用,根据需要进行配置即可。

        /// <summary>/// 根据附件ID,获取对应查看的视图URL。/// 一般规则如果是图片文件,返回视图URL地址'/FileUpload/ViewAttach';/// 如果是Office文件(word、PPT、Excel)等,可以通过微软的在线查看地址进行查看:'http://view.officeapps.live.com/op/view.aspx?src=',/// 也可以进行本地生成HTML文件查看。如果是其他文件,可以直接下载地址。/// </summary>/// <param name="id">附件的ID</param>/// <returns></returns>public ActionResult GetAttachViewUrl(string id){string viewUrl = "";FileUploadInfo info = BLLFactory<FileUpload>.Instance.FindByID(id);if (info != null){string ext = info.FileExtend.Trim('.').ToLower();string filePath = GetFilePath(info);bool officeInternetView = false;//是否使用互联网在线预览string hostName = HttpUtility.UrlPathEncode("http://www.iqidi.com/");//可以配置一下,如果有必要if (ext == "xls" || ext == "xlsx" || ext == "doc" || ext == "docx" || ext == "ppt" || ext == "pptx"){if (officeInternetView){//返回一个微软在线浏览Office的地址,需要加上互联网域名或者公网IP地址viewUrl = string.Format("http://view.officeapps.live.com/op/view.aspx?src={0}{1}", hostName, filePath);}else{#region 动态第一次生成文件//检查本地Office文件是否存在,如不存在,先生成文件,然后返回路径供查看string webPath = string.Format("/GenerateFiles/Office/{0}.htm", info.ID);string generateFilePath = Server.MapPath(webPath);if (!FileUtil.FileIsExist(generateFilePath)){string templateFile = BLLFactory<FileUpload>.Instance.GetFilePath(info);templateFile = Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, templateFile.Replace("\\", "/"));if (ext == "doc" || ext == "docx"){Aspose.Words.Document doc = new Aspose.Words.Document(templateFile);doc.Save(generateFilePath, Aspose.Words.SaveFormat.Html);}else if (ext == "xls" || ext == "xlsx"){Workbook workbook = new Workbook(templateFile);workbook.Save(generateFilePath, SaveFormat.Html);}else if (ext == "ppt" || ext == "pptx"){templateFile = templateFile.Replace("/", "\\");PresentationEx pres = new PresentationEx(templateFile);pres.Save(generateFilePath, Aspose.Slides.Export.SaveFormat.Html);}}#endregionviewUrl = webPath;}}else{viewUrl = filePath;}}return Content(viewUrl);}

通过这个后台处理代码,我们可以正确知道Office预览的时候,使用的是哪个URL了。

这样在前端页面,我们只需要判断具体是那种文件,然后进行展示即可了。

        if(type =="image") {var imgContent = '<img src="'+ viewUrl + '" />';$("#divViewFile").html(imgContent);$("#file").modal("show");} else {$.ajax({type: 'GET',url: viewUrl,//async: false, //同步//dataType: 'json',success: function (json) {$("#divViewFile").html(json);$("#file").modal("show");},error: function (xhr, status, error) {showError("操作失败" + xhr.responseText); //xhr.responseText
                }}); }  

其中的代码

$("#file").modal("show");

是我们调用全局对话框,用来展示具体的内容的,效果如下所示。

word文档预览效果如下所示:

或者我们查看图片文件的时候,可以获得界面效果如下所示:

以上就是 数据的导入、导出及附件的查看处理的介绍内容,希望对大家学习有帮助。

如果有兴趣,可以继续参考系列文章:

基于Metronic的Bootstrap开发框架经验总结(1)-框架总览及菜单模块的处理

基于Metronic的Bootstrap开发框架经验总结(2)--列表分页处理和插件JSTree的使用

基于Metronic的Bootstrap开发框架经验总结(3)--下拉列表Select2插件的使用

基于Metronic的Bootstrap开发框架经验总结(4)--Bootstrap图标的提取和利用

基于Metronic的Bootstrap开发框架经验总结(5)--Bootstrap文件上传插件File Input的使用

基于Metronic的Bootstrap开发框架经验总结(6)--对话框及提示框的处理和优化

基于Metronic的Bootstrap开发框架经验总结(7)--数据的导入、导出及附件的查看处理

基于Metronic的Bootstrap开发框架经验总结(8)--框架功能总体界面介绍

基于Metronic的Bootstrap开发框架经验总结(9)--实现Web页面内容的打印预览和保存操作

转载于:https://www.cnblogs.com/wuhuacong/p/4777720.html

相关文章:

resin php,resin竟然开始支持PHP

真是好消息&#xff0c;resin开始支持PHP了&#xff0c;早上查资料&#xff0c;意外的看到了这个消息。由Resin 3.0.17开始&#xff0c;Resin里多了一个称为Quercus的东西&#xff0c;Quercus其实就是用Java实作的PHP语言模组。一直以来WEB语言都是各自为政&#xff0c;都有自己…

NSD WINDOWS--2014.8.11

实验01&#xff1a;不同网段的计算机远程配置交换机实验目标&#xff1a;实现不同网段的计算机远程配置交换机实验环境:实验步骤&#xff1a;一、分别配置pc0和pc1的ip地址网关二、配置交换机的管理ip地址和网关三、配置交换机远程管理密码和enable密码四、配置路由器的ip地址五…

day1-数据库基础

数据库基本概念 数据库是什么 数据库是用来存储数据的仓库&#xff0c;本质上就是一套基于CS架构的服务端和客户端程序&#xff0c;最终将数据存储在服务器端的磁盘中。之前学过的数据存储方式有&#xff1a; 列表 字典......等等&#xff0c;是在内存中的数据&#xff0c;缺点…

双重指针作为函数参数的妙用

双重指针作为函数参数&#xff0c;可以在函数函数内部修改外部指针的值。主要用法包括&#xff1a; 1. 在函数内部分配内存&#xff0c;作为函数参数返回&#xff1b; 2. 在函数内部设置指针为空&#xff1b; #include <stdio.h> #include <stdlib.h> #include …

什么是常函数?

类的成员函数后面加 const&#xff0c;表明这个函数不会对这个类对象的数据成员&#xff08;准确地说是非静态数据成员&#xff09;作任何改变。 在设计类的时候&#xff0c;一个原则就是对于不改变数据成员的成员函数都要在后面加 const&#xff0c;而对于改变数据成员的成…

matlab整型和浮点的区别,技术帖 | 心理学MATLAB初学者教程--简单数据类型介绍(逻辑型数据,整型/浮点型数据,字符型)......

1.2.1 什么是变量和变量名变量这个词似乎在许多地方都有出现&#xff0c;在计算机中变量是指是一段有名字的连续存储空间(摘自百度百科)&#xff0c;而这个所谓的名字就叫做变量名。举个例子说现在我们再MATLAB的命令窗口中输入&#xff1a;A 1 然后按回车&#xff0c;我们会看…

为窗口添加滚动条事件

为窗口添加滚动条事件其实非常的简单&#xff0c; window.οnscrοllfunction(){};注意在获取滚动条距离的时候谷歌不识别document.documentElement.scrollTop&#xff0c;必须要加上document.body.scrollTop&#xff1b;即var scrolltopdocument.documentElement.scrollTop||d…

当远程桌面到Windows终端服务器,出现终端服务器超出了最大允许连接数,怎么办...

如果是老版本的MSTSC则使用 MSTSC /console /v:ip如果是新版本 MSTSC /admin /v:ip转载于:https://www.cnblogs.com/SharkXu/archive/2012/10/08/MSTSC.html

连续地址数据(数组或者malloc的内存)作为函数参数

在编程时&#xff0c;一簇连续的内存单元&#xff0c;比如数组或者malloc的内存块,如下的数组a 或者指针p. int a[4]; int *p malloc(4 * sizeof(int)); 我们要想修改上述连续的内存块&#xff0c;可以写一个函数(一维指针做参数传入起始地址即可&#xff09;来搞定。 If …

Linux 文件系统及 ext2 文件系统

linux 支持的文件系统类型 Ext2:有点像 UNIX 文件系统。有 blocks,inodes,directories 的概念。Ext3:Ext2 的加强版&#xff0c;添加了日志的功能。支持 POSIX ACL(Access control Lists,访问控制列表) 。Isofs(iso9660):CDROM 文件系统。Sysfs:基于 ram 的文件系统&#xff0c…

php每分钟刷新一次的验证码,php如何在进入页面的时候自动刷新一次验证码

页面直接进入login页面的时候无法获取到$_SESSION["auth"]值&#xff0c;只能刷新一次验证码才能获取到值&#xff0c;怎么才能在用户访问的时候自动刷新一次验证码&#xff0c;求大神支招。。。验证码回复讨论(解决方案)哪里获取到$_SESSION["auth"]值&am…

vs2010快捷方式

【窗口快捷键】 CtrlW,W: 浏览器窗口 CtrlW,S: 解决方案管理器 CtrlW,C: 类视图 CtrlW,E: 错误列表 CtrlW,O: 输出视图 trlW,P: 属性窗口 CtrlW,T: 任务列表 CtrlW,X: 工具箱 CtrlW,B: 书签窗口 CtrlW,U: 文档大纲 CtrlD,B: 断点窗口 CtrlD,I: 即时窗口 CtrlTab: 活…

移动端rem屏幕设置

//修改页面title var pageTitledocument.getElementsByTagName("title")[0].innerHTML; if(location.href.indexOf("index.html")>-1 || location.href.indexOf("html")-1){document.getElementsByTagName("title")[0].innerHTML&q…

二维指针操作链表

背景 Linus slashdot: https://meta.slashdot.org/story/12/10/11/0030249 Linus大婶在slashdot上回答一些编程爱好者的提问&#xff0c;其中一个人问他什么样的代码是他所喜好的&#xff0c;大婶表述了自己一些观点之后&#xff0c;举了一个指针的例子&#xff0c;解释了…

php多选框怎么传值,tp3.2如何处理多选框传参和判断状态

创建多选框&#xff1a;(1)普通的多选&#xff1a;123(2)在数据库中遍历出来的多选框,value和data-id都要赋值(大家都懂&#xff0c;我就不说啦)&#xff1a;{$vo.title} 2.我是用jq做的异步,我是使用英文“&#xff0c;”分割字段存储的。我们的前端是自己封装过的,大家根据自…

UIWebView和UIActivityIndicatorView的结合使用

环境&#xff1a;Xcode6.1 UIWebView是iOS开发中常用的一个控件&#xff0c;是内置的浏览器控件&#xff0c;我们可以用它来浏览网页&#xff0c;加载文档等。这篇文件将结合UIActivityIndicatorView控件制作一个小实例(加载apple的官网)。效果如下&#xff1a; 一.建立一个Sin…

Python对象类型——字符串、列表、元组

字符串Python连接多个字符串可用“”号&#xff0c;但这个操作不如把所有子字符串放到一个列表或可迭代对象中&#xff0c;然后调用一个join方法来把所有内容连接在一起节约内存。原始字符串操作符&#xff08;R/r&#xff09;&#xff1a;相当于取消“\”转义&#xff0c;在使…

leetcode--1:(python)Two Sum

2019.5.25: #1 Given an array of integers, return indices of the two numbers such that they add up to a specific target. You may assume that each input would have exactly one solution, and you may not use the same element twice. Example: 我的解法&#xff1…

memset初始化内存

在suse 9,运行man memset 查看memset的解释如下&#xff1a; “NAME memset - fill memory with a constant byte SYNOPSIS #include <string.h> void *memset(void *s, int c, size_t n); DESCRIPTION The memset() function fills the fir…

php 数字变量,php入门变量之数字_PHP教程

在介绍变量时&#xff0c;我明确指出PHP具有整型和浮点型(小数)数字类型。但是&#xff0c;依据我的经验&#xff0c;这两种类型都可以归类到一般的数字之下(在极大程度上是这样的)。下面列举下PHP中有效的数字类型的变量&#xff1a;83.1410980843985-4.23985084.4e2注意&…

BZOJ 1597: [Usaco2008 Mar]土地购买( dp + 斜率优化 )

既然每块都要买, 那么一块土地被另一块包含就可以不考虑. 先按长排序, 去掉不考虑的土地, 剩下的土地长x递增, 宽y递减dp(v) min{ dp(p)xv*yp1 }假设dp(v)由i转移比由j转移优(i>j), 那么dp(i)xv*yi1 < dp(j)xv*yj1化简得 (dp(i) - dp(j))/(yi1-yj1) > -xv然后就斜率优…

雨季来临 对车辆涉水说“NO”

七月的上海开始进入暴雨频发的季节。在城市排水系统受到考验的同时&#xff0c;车主们的车辆也同样经受着雨水的考验。而每年都会有相当一部分车辆因为“水害”&#xff0c;使车辆自身的价值受到很大的影响。为此开新通过以下案例为大家做个分析。并推荐几个实用的技巧以备不时…

C#编写dll进行sql server数据库扩展储存过程

一、编写C#函数文件 1、新建一个类库文件 备注&#xff1a;sqlserver 2008只能用.net3.5版本。 2、如有想加入强命名的话可如下步骤&#xff1a; 参考博文&#xff1a;https://blog.csdn.net/donnie88888888/article/details/52743064 1、运行在“开始菜单”-“程序”-“Micros…

malloc(0)-malloc 0 字节

C17中有如下描述&#xff1a; 7.22.3 Memory management functions 1 The order and contiguity of storage allocated by successive calls to the aligned_alloc, calloc, malloc, and realloc functions is unspecified. The pointer returned if the allocation succeeds …

php常见排序算去,PHP兑现常见排序算法

PHP实现常见排序算法//插入排序(一维数组)function insert_sort($arr){$count count($arr);for($i1; $i$tmp $arr[$i];$j $i - 1;while($arr[$j] > $tmp){$arr[$j1] $arr[$j];$arr[$j] $tmp;$j--;}}return $arr;}//选择排序(一维数组)function select_sort($arr){$coun…

C#中 int.TryParse 的用法

int i -1;bool b int.TryParse(null, out i);执行完毕后&#xff0c;b等于false&#xff0c;i等于0&#xff0c;而不是等于-1&#xff0c;切记。 int i -1;bool b int.TryParse("123", out i); 执行完毕后&#xff0c;b等于true&#xff0c;i等于123&#xff1b;…

2022-2028年中国综艺节目市场深度调研及投资前景预测报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国综艺节目行业市场行业相关概述、中国综艺节目行业市场行业运行环境、分析了中国综艺节目行…

cocos2d-js 自定义事件监听派发

熟悉js的dom事件或者flash事件的&#xff0c;基本都能立马明白cc.eventManager的用法。 cc.eventManager有两种注册监听器的方式&#xff0c;一种是原生事件&#xff0c;例如 cc.eventManager.addListener({ event: cc.EventListener.KEYBOARD, onKeyReleased: function(keyCod…

URL编码转义,冒号和/不转,否则导致http链接失效

URL含有中文需要转义 参考 https://blog.csdn.net/benbenxiongyuan/article/details/10608095 自己写一个 1 public boolean checkURLFileIsExist(String stringURL){2 boolean isExist false;3 String sEncodeURL;4 5 try{6 // URL内中文…

C面向对象之透明指针的运用

不透明指针(opaque pointer)可以用来在C中实现封装。 什么是不透明指针(opaque pointer) 从字面意思来看&#xff0c;“不透明”意味着看不到内部&#xff0c;因此“不透明指针”即看不到内部定义的指针。这样说有些抽象&#xff0c;我们来看个例子&#xff1a; #include &l…