试用EF开发WEB应用程序(11): 在线留言系统
题记:用“易语言.飞扬”(EF)开发WEB应用程序,此前还没有先例。但因为EF本地开发包(EFNDK)已经发布,用C/C++开发一个EF类库,使其支持EF开发WEB应用程序,应该并非难事。当然也可想而知,其中必有诸多难点有待解决。此系列文章,为本人探索过程之记录,对外人未必有多大价值。如有网友乐观其事,还请理性待之。作者:liigo。转载请务必注明出处:http://blog.csdn.net/liigo/。在线留言。
试用EF开发WEB应用程序(11): 在线留言系统
在线留言系统入口 (非常感谢好友龚辟愚提供网络服务器)
此留言板的“易语言.飞扬”(EF)完整源代码如下:
引入 fastcgi, sqlite, 工具;
公开 类 启动类
{
静态 Sqlite数据库 _db;
公开 静态 启动()
{
_db = new Sqlite数据库();
_db.打开("../db/msgboard.file", true);
if(_db.表是否存在("messages") == false)
createTable();
FCGI fcgi = new FCGI;
while(fcgi.Accept() >= 0)
{
if(fcgi.REQUEST_METHOD.到小写() == "post")
fcgi.ReadContentAsQueryString();
文本 html = html_template.替换全部("$(title)", "留言板(由EF开发)");
if(fcgi.QUERY_STRING("name") != "" || fcgi.QUERY_STRING("message") != "")
insertMessage(fcgi);
//delete all messages
if(fcgi.QUERY_STRING("cleandb") == "byliigo")
_db.执行SQL("delete from messages where 1=1");
string messages; int count;
(messages,count) = listAllMessages();
html = html.替换("$(messages)", messages);
html = html.替换("$(count)", count.到文本());
fcgi.Output(html.到UTF8());
}
_db.关闭();
}
private static createTable()
{
Sqlite表结构 tdef = new Sqlite表结构();
tdef.添加字段("id", Sqlite字段类型.主键整数);
tdef.添加字段("name", Sqlite字段类型.文本);
tdef.添加字段("message", Sqlite字段类型.文本);
tdef.添加字段("ip", Sqlite字段类型.文本);
tdef.添加字段("date", Sqlite字段类型.文本);
_db.创建表("messages", tdef);
}
private static bool insertMessage(FCGI fcgi)
{
private static string GetDate()
{
日期时间类 t = new 日期时间类();
return t.年().到文本() + "/" + t.月().到文本() + "/" + t.日().到文本() + " " + t.时().到文本() + ":" + t.分().到文本() + ":" + t.秒().到文本();
}
string name = fcgi.QUERY_STRING("name");
if(name == "") name = "EF爱好者";
string message = fcgi.QUERY_STRING("message");
if(message == "") message = "他/她很懒,什么都没说:)";
string ip = fcgi.REMOTE_ADDR;
string date = GetDate();
string sql = "insert into messages(name, message, ip, date) values('" + name + "','" + message + "','" + ip + "','" + date + "')";
return _db.执行SQL(sql);
}
private static string,int listAllMessages()
{
private static string fixHTMLChars(string s)
{
s = s.替换全部("&", "&");
s = s.替换全部("<", "<");
s = s.替换全部(">", ">");
//someone note this? :)
s = s.替换全部("[b]", "<b>"); s = s.替换全部("[/b]", "</b>");
s = s.替换全部("[red]", "<font color="red">"); s = s.替换全部("[/red]", "</font>");
s = s.替换全部("[blue]", "<font color="blue">"); s = s.替换全部("[/blue]", "</font>");
s = s.替换全部("[green]", "<font color="green">"); s = s.替换全部("[/green]", "</font>");
return s;
}
private static string formatMessage(string name, string message, string ip, string date)
{
static string msg_template = "<p>$(name) ($(ip)) 于 $(date) 留言:$(message)</p> ";
string msg = msg_template.替换("$(name)", name);
msg = msg.替换("$(ip)", ip);
msg = msg.替换("$(message)", fixHTMLChars(message));
msg = msg.替换("$(date)", date);
return msg;
}
Sqlite记录集 query = new Sqlite记录集(_db, "select* from messages order by _ROWID_ desc");
string messages = "";
int count = 0;
if(query.打开())
{
count = query.取记录数();
while(query.到下一记录())
{
messages += formatMessage(query.读字段值("name", Sqlite字段类型.文本), query.读字段值("message", Sqlite字段类型.文本), query.读字段值("ip", Sqlite字段类型.文本), query.读字段值("date", Sqlite字段类型.文本));
}
}
return (messages, count);
}
常量 文本 html_template = ["Content-type: text/html
<html><head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title>$(title)</title>
</head>
<body>
<h1>$(title)</h1>
<hr></hr>
<form method="post">
<p>姓名:<input type="text" name="name" size=20 /></p>
<p>留言:<input type="text" name="message" size=100 /></p>
<p><input type="submit" value="提交留言"></input></p>
</form>
<p><a href="msgboard.txt" target="_blank">此留言板的EF源代码</a></p>
<hr></hr>
<h1>所有留言(共 $(count) 条)</h1>
$(messages)
<hr></hr>
<p>by liigo, <a href="http://blog.csdn.net/liigo/">http://blog.csdn.net/liigo/</a></p>
</body>
</html>
"];
}
公开 类 启动类
{
静态 Sqlite数据库 _db;
公开 静态 启动()
{
_db = new Sqlite数据库();
_db.打开("../db/msgboard.file", true);
if(_db.表是否存在("messages") == false)
createTable();
FCGI fcgi = new FCGI;
while(fcgi.Accept() >= 0)
{
if(fcgi.REQUEST_METHOD.到小写() == "post")
fcgi.ReadContentAsQueryString();
文本 html = html_template.替换全部("$(title)", "留言板(由EF开发)");
if(fcgi.QUERY_STRING("name") != "" || fcgi.QUERY_STRING("message") != "")
insertMessage(fcgi);
//delete all messages
if(fcgi.QUERY_STRING("cleandb") == "byliigo")
_db.执行SQL("delete from messages where 1=1");
string messages; int count;
(messages,count) = listAllMessages();
html = html.替换("$(messages)", messages);
html = html.替换("$(count)", count.到文本());
fcgi.Output(html.到UTF8());
}
_db.关闭();
}
private static createTable()
{
Sqlite表结构 tdef = new Sqlite表结构();
tdef.添加字段("id", Sqlite字段类型.主键整数);
tdef.添加字段("name", Sqlite字段类型.文本);
tdef.添加字段("message", Sqlite字段类型.文本);
tdef.添加字段("ip", Sqlite字段类型.文本);
tdef.添加字段("date", Sqlite字段类型.文本);
_db.创建表("messages", tdef);
}
private static bool insertMessage(FCGI fcgi)
{
private static string GetDate()
{
日期时间类 t = new 日期时间类();
return t.年().到文本() + "/" + t.月().到文本() + "/" + t.日().到文本() + " " + t.时().到文本() + ":" + t.分().到文本() + ":" + t.秒().到文本();
}
string name = fcgi.QUERY_STRING("name");
if(name == "") name = "EF爱好者";
string message = fcgi.QUERY_STRING("message");
if(message == "") message = "他/她很懒,什么都没说:)";
string ip = fcgi.REMOTE_ADDR;
string date = GetDate();
string sql = "insert into messages(name, message, ip, date) values('" + name + "','" + message + "','" + ip + "','" + date + "')";
return _db.执行SQL(sql);
}
private static string,int listAllMessages()
{
private static string fixHTMLChars(string s)
{
s = s.替换全部("&", "&");
s = s.替换全部("<", "<");
s = s.替换全部(">", ">");
//someone note this? :)
s = s.替换全部("[b]", "<b>"); s = s.替换全部("[/b]", "</b>");
s = s.替换全部("[red]", "<font color="red">"); s = s.替换全部("[/red]", "</font>");
s = s.替换全部("[blue]", "<font color="blue">"); s = s.替换全部("[/blue]", "</font>");
s = s.替换全部("[green]", "<font color="green">"); s = s.替换全部("[/green]", "</font>");
return s;
}
private static string formatMessage(string name, string message, string ip, string date)
{
static string msg_template = "<p>$(name) ($(ip)) 于 $(date) 留言:$(message)</p> ";
string msg = msg_template.替换("$(name)", name);
msg = msg.替换("$(ip)", ip);
msg = msg.替换("$(message)", fixHTMLChars(message));
msg = msg.替换("$(date)", date);
return msg;
}
Sqlite记录集 query = new Sqlite记录集(_db, "select* from messages order by _ROWID_ desc");
string messages = "";
int count = 0;
if(query.打开())
{
count = query.取记录数();
while(query.到下一记录())
{
messages += formatMessage(query.读字段值("name", Sqlite字段类型.文本), query.读字段值("message", Sqlite字段类型.文本), query.读字段值("ip", Sqlite字段类型.文本), query.读字段值("date", Sqlite字段类型.文本));
}
}
return (messages, count);
}
常量 文本 html_template = ["Content-type: text/html
<html><head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title>$(title)</title>
</head>
<body>
<h1>$(title)</h1>
<hr></hr>
<form method="post">
<p>姓名:<input type="text" name="name" size=20 /></p>
<p>留言:<input type="text" name="message" size=100 /></p>
<p><input type="submit" value="提交留言"></input></p>
</form>
<p><a href="msgboard.txt" target="_blank">此留言板的EF源代码</a></p>
<hr></hr>
<h1>所有留言(共 $(count) 条)</h1>
$(messages)
<hr></hr>
<p>by liigo, <a href="http://blog.csdn.net/liigo/">http://blog.csdn.net/liigo/</a></p>
</body>
</html>
"];
}