实现安全绿色的网络空间课堂的数据结构及C++Builder核心代码
本博文主要提供实现安全绿色的网络空间课堂的数据结构及C++Builder核心代码,全文分为三个部分:
程序下载网址:网盘下载
链接:https://pan.baidu.com/s/1blzPOVRUrCbKIeu8XOaSVg
提取码:r80x
第一部分:用5种状态进行控制,实现脚本解析的C++Builder代码
用5种状态进行控制,实现脚本解析的C++Builder代码,在Win10+Embarcadero RAD Studio 10.3下调试通过,基于IdHTTPServer中间件的“普鲁托安全Web应用服务程序”Pluto.exe运行正常稳定。目前,最新稳定版本为V1.9.9.2版,也是文章投稿时的版本。
函数声明:AnsiString videoPlay(AnsiString sFileName,AnsiString sID);
//const int BUFF 2048;//1024
//AnsiString sRetVideo;
AnsiString sFileContent=sTsimpleVideo;//Memo2->Lines->Text;// "";
/*定义变量:标题,作者,视频文件名称*/
String sSpaceName="";
String sTitle="";
String sAuthor="";
String sFile="";
String sFooter="<!--自定义html-->";
FILE *licFile = fopen(sFileName.c_str(),"r");
if (licFile == NULL)
{
printf("OPEN失败\n");
}
else
{
char sLine[FILEBUFF];//[1024];
AnsiString stLine;
memset(sLine, 0, FILEBUFF);//1024);
int istatus=0;// 状态:0初始态,1逐行态,2数组态开始,3数组态结束,4代码态sCode,5结束态
//一行行读
while ((fgets(sLine, FILEBUFF, licFile))!= NULL && istatus<5)
{
stLine=sLine;
//RichEdit1->Lines->Add(stLine);
//剔除行后注释
int iPos =stLine.Pos("//");// str.find(target); //int iLen =stLine.Length();
// RichEdit1->Lines->Add(iPos);
if(iPos==1)
continue;//break; //跳过注释行,继续读取下一行
else if(iPos>1)
stLine=stLine.SubString(1,iPos-1);
//else
// RichEdit1->Lines->Add(istatus);
//sFileContent+=sLine;
//RichEdit1->Lines->Add(stLine);
if(stLine.Pos("<%")>0)
{
istatus=1;//开始
continue;
}
//stLine=StringReplace(sCode,"\n","",TReplaceFlags()<<rfReplaceAll<<rfIgnoreCase);
switch(istatus)
{
case 0:
break;
case 1:
//逐行开始
if(stLine.Pos("sSpaceName=")>0)
{
sSpaceName=StringReplace(stLine,"sSpaceName=","",TReplaceFlags()<<rfReplaceAll<<rfIgnoreCase);
}
else if(stLine.Pos("sTitle=")>0)
{
sTitle=StringReplace(stLine,"sTitle=","",TReplaceFlags()<<rfReplaceAll<<rfIgnoreCase);
}
else if(stLine.Pos("sAuthor=")>0)
{
sAuthor=StringReplace(stLine,"sAuthor=","",TReplaceFlags()<<rfReplaceAll<<rfIgnoreCase);
}
else if(stLine.Pos("sFile=")>0)
{
sFile=StringReplace(stLine,"sFile=","",TReplaceFlags()<<rfReplaceAll<<rfIgnoreCase);
}
else if(stLine.Pos("[]=")>0)
{
istatus=2;
}
else if(stLine.Pos("sFooter=")>0)
{
istatus=4;
}
break;
case 2: //数组态开始
if(stLine.Pos("[]end")>0)
{
istatus=3; //数组结束 //sFile=StringReplace(stLine,"sFile=","",TReplaceFlags()<<rfReplaceAll<<rfIgnoreCase); //RichEdit1->Lines->Add(sFile);
}
else
{
AnsiString sTempID;
if(stLine.Pos(":")>1)
{
sTempID=stLine.SubString(1,stLine.Pos(":")-1);
if(sFooter.Pos(" target= _blank>" + sTempID + "</a> ")<1)
sFooter+="<a href=\"?ycsID=" + sTempID + "\" target= _blank>" + sTempID + "</a> ";
if(sTempID==sID)
{
//RichEdit1->Lines->Add(sID);
stLine=stLine.SubString(stLine.Pos(":")+1,stLine.Length()-stLine.Pos(":"));
// RichEdit1->Lines->Add(stLine);
if(stLine.Pos("sSpaceName=")>0)
{ sSpaceName=StringReplace(stLine,"sSpaceName=","",TReplaceFlags()<<rfReplaceAll<<rfIgnoreCase);
//sFileContent=StringReplace(sFileContent,"<%=sSpaceName%>",sSpaceName,TReplaceFlags()<<rfReplaceAll<<rfIgnoreCase);
//RichEdit1->Lines->Add(sSpaceName);
}
else if(stLine.Pos("sTitle=")>0)
{
sTitle=StringReplace(stLine,"sTitle=","",TReplaceFlags()<<rfReplaceAll<<rfIgnoreCase);
//sFileContent=StringReplace(sFileContent,"<%=sTitle%>",sTitle,TReplaceFlags()<<rfReplaceAll<<rfIgnoreCase);
// RichEdit1->Lines->Add(sTitle);
}
else if(stLine.Pos("sAuthor=")>0)
{
sAuthor=StringReplace(stLine,"sAuthor=","",TReplaceFlags()<<rfReplaceAll<<rfIgnoreCase);
//sFileContent=StringReplace(sFileContent,"<%=sAuthor%>",sAuthor,TReplaceFlags()<<rfReplaceAll<<rfIgnoreCase);
//RichEdit1->Lines->Add(sAuthor);
}
else if(stLine.Pos("sFile=")>0)
{ sFile=StringReplace(stLine,"sFile=","",TReplaceFlags()<<rfReplaceAll<<rfIgnoreCase);
}
}
}
}
break;
case 3://数组结束
if(stLine.Pos("sFooter=")>0)
istatus=4; //代码态开始
break;
case 4://代码态
if(stLine.Pos("%>")>0)
{
istatus=5; //结束态
//RichEdit1->Lines->Add(sFooter);
//sFileContent=StringReplace(sFileContent,"<%=sFooter%>",sFooter,TReplaceFlags()<<rfReplaceAll<<rfIgnoreCase);
}
else
{
sFooter+=stLine;
}
break;
case 5: //结束态
;
break;
}
}
fclose(licFile);
sFileContent=StringReplace(sFileContent,"<%=sSpaceName%>",sSpaceName,TReplaceFlags()<<rfReplaceAll<<rfIgnoreCase);
sFileContent=StringReplace(sFileContent,"<%=sTitle%>",sTitle,TReplaceFlags()<<rfReplaceAll<<rfIgnoreCase);
sFileContent=StringReplace(sFileContent,"<%=sAuthor%>",sAuthor,TReplaceFlags()<<rfReplaceAll<<rfIgnoreCase);
sFileContent=StringReplace(sFileContent,"<%=sFile%>",sFile,TReplaceFlags()<<rfReplaceAll<<rfIgnoreCase);
sFileContent=StringReplace(sFileContent,"<%=sFooter%>",sFooter,TReplaceFlags()<<rfReplaceAll<<rfIgnoreCase);
}
return sFileContent;
//作者:一策书(湘岳阳万江波)
第二部分:以yanzhou.vsp脚本文件为例,讲解《2016——2019xx市数学中考试卷压轴题解析》的视频集制作的示例代码
示例代码文件为yanzhou.vsp,示例内容如下:
//定义变量:标题,作者,视频文件名称*
//String sSpaceName="";
//String sTitle="";
//String sAuthor="";
//String sFile="";
<%
sSpaceName=2016——2019岳阳市数学中考试卷压轴题解析
sAuthor=张大庆
sTitle=岳阳市数学中考试卷2016年第08题
sFile=yazhou/16-08.mp4
[]=;//数组开始,标题,作者,文件路径
16-08:sTitle=岳阳市数学中考试卷2016年第08题
16-08:sFile=yazhou/16-08.mp4
16-16:sTitle=岳阳市数学中考试卷2016年第16题
16-16:sFile=yazhou/16-16.mp4
16-23:sTitle=岳阳市数学中考试卷2016年第23题
16-23:sFile=yazhou/16-23.mp4
16-24:sTitle=岳阳市数学中考试卷2016年第24题
16-24:sFile=yazhou/16-24.mp4
17-08:sTitle=岳阳市数学中考试卷2017年第08题
17-08:sFile=yazhou/17-08.mp4
17-16:sTitle=岳阳市数学中考试卷2017年第16题
17-16:sFile=yazhou/17-16.mp4
17-23:sTitle=岳阳市数学中考试卷2017年第23题
17-23:sFile=yazhou/17-23.mp4
17-24:sTitle=岳阳市数学中考试卷2017年第24题
17-24:sFile=yazhou/17-24.mp4
18-08:sTitle=岳阳市数学中考试卷2018年第08题
18-08:sFile=yazhou/18-08.mp4
18-16:sTitle=岳阳市数学中考试卷2018年第16题
18-16:sFile=yazhou/18-16.mp4
18-23:sTitle=岳阳市数学中考试卷2018年第23题
18-23:sFile=yazhou/18-23.mp4
18-24:sTitle=岳阳市数学中考试卷2018年第24题
18-24:sFile=yazhou/18-24.mp4
19-08:sTitle=岳阳市数学中考试卷2019年第08题
19-08:sFile=yazhou/19-08.mp4
19-16:sTitle=岳阳市数学中考试卷2019年第16题
19-16:sFile=yazhou/19-16.mp4
19-23:sTitle=岳阳市数学中考试卷2019年第23题
19-23:sFile=yazhou/19-23.mp4
19-24:sTitle=岳阳市数学中考试卷2019年第24题
19-24:sFile=yazhou/19-24.mp4
[]end;//数组结束
sFooter=<!--添加你的Html代码-->
<p><br/></p>
%>
//作者:一策书(湘岳阳万江波)
第三部分:判断文件名设置不同的ContentType的类型值,解决了.js,.zip等文件的问题。
AnsiString TfrmHttpServer::GetContentType(AnsiString strReq)
{
AnsiString strctype;
if(strReq.Pos(".mp4")>0) //文件类型
{
strctype = "video/mpeg4";
}
else if(strReq.Pos(".mp3")>0) //文件类型,
{
strctype = "audio/mp3";
}
else if(strReq.Pos(".jpg")>0) //文件类型,
{
strctype = "image/jpeg";
}
else if(strReq.Pos(".png")>0) //文件类型,
{
strctype = "application/x-png";
}
else if(strReq.Pos(".css")>0) //文件类型,
{
strctype = "text/css";
}
else if(strReq.Pos(".js")>0) //文件类型,
{
strctype = "application/x-javascript";
}
//else if(strReq.Pos(".mp4")>0) //文件类型
//{
// strctype = "video/mpeg4";
//}
else if(strReq.Pos(".ico")>0) //文件类型
{
strctype = "image/x-icon";
}
else if(strReq.Pos(".html")>0|strReq.Pos(".htm")>0|strReq.Pos(".vsp")>0) //文件类型
{
strctype ="text/html";
}
else
{
strctype ="application/octet-stream";//.*( 二进制流,不知道下载文件类型)
}
return strctype;
//参考文献:response的contentType 几种类型 https://blog.csdn.net/qq_37651267/article/details/91380351
}
作者:一策书(湘岳阳万江波)
AnsiString videoPlay(AnsiString sFileName,AnsiString sID); //const int BUFF 2048;//1024 //AnsiString sRetVideo; AnsiString sFileContent=sTsimpleVideo;//Memo2->Lines->Text;// ""; /*定义变量:标题,作者,视频文件名称*/ String sSpaceName=""; String sTitle=""; String sAuthor=""; String sFile=""; String sFooter="<!--自定义html-->"; FILE *licFile = fopen(sFileName.c_str(),"r"); if (licFile == NULL) { printf("OPEN失败\n"); } else { char sLine[FILEBUFF];//[1024]; AnsiString stLine; memset(sLine, 0, FILEBUFF);//1024); int istatus=0;// 状态:0初始态,1逐行态,2数组态开始,3数组态结束,4代码态sCode,5结束态 //一行行读 while ((fgets(sLine, FILEBUFF, licFile))!= NULL && istatus<5) { stLine=sLine; //RichEdit1->Lines->Add(stLine); //剔除行后注释 int iPos =stLine.Pos("//");// str.find(target); //int iLen =stLine.Length(); // RichEdit1->Lines->Add(iPos); if(iPos==1) continue;//break; //跳过注释行,继续读取下一行 else if(iPos>1) stLine=stLine.SubString(1,iPos-1); //else // RichEdit1->Lines->Add(istatus); //sFileContent+=sLine; //RichEdit1->Lines->Add(stLine); if(stLine.Pos("<%")>0) { istatus=1;//开始 continue; } //stLine=StringReplace(sCode,"\n","",TReplaceFlags()<<rfReplaceAll<<rfIgnoreCase); switch(istatus) { case 0: break; case 1: //逐行开始 if(stLine.Pos("sSpaceName=")>0) { sSpaceName=StringReplace(stLine,"sSpaceName=","",TReplaceFlags()<<rfReplaceAll<<rfIgnoreCase); } else if(stLine.Pos("sTitle=")>0) { sTitle=StringReplace(stLine,"sTitle=","",TReplaceFlags()<<rfReplaceAll<<rfIgnoreCase); } else if(stLine.Pos("sAuthor=")>0) { sAuthor=StringReplace(stLine,"sAuthor=","",TReplaceFlags()<<rfReplaceAll<<rfIgnoreCase); } else if(stLine.Pos("sFile=")>0) { sFile=StringReplace(stLine,"sFile=","",TReplaceFlags()<<rfReplaceAll<<rfIgnoreCase); } else if(stLine.Pos("[]=")>0) { istatus=2; } else if(stLine.Pos("sFooter=")>0) { istatus=4; } break; case 2: //数组态开始 if(stLine.Pos("[]end")>0) { istatus=3; //数组结束 //sFile=StringReplace(stLine,"sFile=","",TReplaceFlags()<<rfReplaceAll<<rfIgnoreCase); //RichEdit1->Lines->Add(sFile); } else { AnsiString sTempID; if(stLine.Pos(":")>1) { sTempID=stLine.SubString(1,stLine.Pos(":")-1); if(sFooter.Pos(" target= _blank>" + sTempID + "</a> ")<1) sFooter+="<a href=\"?ycsID=" + sTempID + "\" target= _blank>" + sTempID + "</a> "; if(sTempID==sID) { //RichEdit1->Lines->Add(sID); stLine=stLine.SubString(stLine.Pos(":")+1,stLine.Length()-stLine.Pos(":")); // RichEdit1->Lines->Add(stLine); if(stLine.Pos("sSpaceName=")>0) { sSpaceName=StringReplace(stLine,"sSpaceName=","",TReplaceFlags()<<rfReplaceAll<<rfIgnoreCase); //sFileContent=StringReplace(sFileContent,"<%=sSpaceName%>",sSpaceName,TReplaceFlags()<<rfReplaceAll<<rfIgnoreCase); //RichEdit1->Lines->Add(sSpaceName); } else if(stLine.Pos("sTitle=")>0) { sTitle=StringReplace(stLine,"sTitle=","",TReplaceFlags()<<rfReplaceAll<<rfIgnoreCase); //sFileContent=StringReplace(sFileContent,"<%=sTitle%>",sTitle,TReplaceFlags()<<rfReplaceAll<<rfIgnoreCase); // RichEdit1->Lines->Add(sTitle); } else if(stLine.Pos("sAuthor=")>0) { sAuthor=StringReplace(stLine,"sAuthor=","",TReplaceFlags()<<rfReplaceAll<<rfIgnoreCase); //sFileContent=StringReplace(sFileContent,"<%=sAuthor%>",sAuthor,TReplaceFlags()<<rfReplaceAll<<rfIgnoreCase); //RichEdit1->Lines->Add(sAuthor); } else if(stLine.Pos("sFile=")>0) { sFile=StringReplace(stLine,"sFile=","",TReplaceFlags()<<rfReplaceAll<<rfIgnoreCase); } } } } break; case 3://数组结束 if(stLine.Pos("sFooter=")>0) istatus=4; //代码态开始 break; case 4://代码态 if(stLine.Pos("%>")>0) { istatus=5; //结束态 //RichEdit1->Lines->Add(sFooter); //sFileContent=StringReplace(sFileContent,"<%=sFooter%>",sFooter,TReplaceFlags()<<rfReplaceAll<<rfIgnoreCase); } else { sFooter+=stLine; } break; case 5: //结束态 ; break; } } fclose(licFile); sFileContent=StringReplace(sFileContent,"<%=sSpaceName%>",sSpaceName,TReplaceFlags()<<rfReplaceAll<<rfIgnoreCase); sFileContent=StringReplace(sFileContent,"<%=sTitle%>",sTitle,TReplaceFlags()<<rfReplaceAll<<rfIgnoreCase); sFileContent=StringReplace(sFileContent,"<%=sAuthor%>",sAuthor,TReplaceFlags()<<rfReplaceAll<<rfIgnoreCase); sFileContent=StringReplace(sFileContent,"<%=sFile%>",sFile,TReplaceFlags()<<rfReplaceAll<<rfIgnoreCase); sFileContent=StringReplace(sFileContent,"<%=sFooter%>",sFooter,TReplaceFlags()<<rfReplaceAll<<rfIgnoreCase); } return sFileContent; //作者:一策书(湘岳阳万江波)
元·刘因《村居杂诗》
芳芬皆可籍,缓步即吾车[jū];
乘兴三杯酒,随行一策书[xū]。
——智慧人生,始自田园美景。 (一策书(湘岳阳万江波))。
蒲公《咏史》
良马非不骏,盐坂徒悲鸣。
美玉非不贵,抱璞为世轻。
高士卧隆中,畴乃知其名?
从容起南阳,谈笑魏吴惊。
男儿事蚕桑,后世有何称?
——智慧世界,源自码农寒士。(一策书(湘岳阳万江波))。