65.9K
CodeProject 正在变化。 阅读更多。
Home

创建带有 Active Desktop 界面的 Web待办事项列表

starIconstarIconstarIconstarIconstarIcon

5.00/5 (13投票s)

2002年5月16日

4分钟阅读

viewsIcon

210816

downloadIcon

2476

整理好你的事情,同时找到一个使用活动桌面的理由。

Sample Image - asptodolist_activedesktop.jpg

引言

我是一个非常没有条理的人。我通常依赖我那微弱的大脑来记住我需要修复的项目或 bug。不幸的是,我是一个非常普通的人,我偶尔会忘记一些重要的事情。所以,当我开始使用 Windows XP Professional(已方便地安装了 IIS)时,我决定做一个 Web“待办事项列表”来提醒我所有我需要做的重要事情。

我可以轻松地将这个 Web 应用程序保留在浏览器窗口中,但我认为终于能够利用活动桌面会非常酷。我的待办事项列表将始终显示在我的桌面上!

假设

当然,要使 Web 应用程序正常工作,您必须拥有一个可用的 Web 服务器。本项目使用 Internet Information Server 和 Active Server Pages 来执行大部分功能。

待办事项存储在数据库中(我使用的是 Sybase ASA 7),该数据库作为服务运行在 Web 服务器计算机上。只有两个表:itemuser,具体规格如下。

ToDoLists 数据库

  • Item
    item_num      integer      primary key
    description   char(256)
    status        char(1)
    user_id       char(10)
    date_entered  date
    date_due      date
    priority      char(1)
    
  • User
    user_id       char(10)     primary key
    name          char(80)
    password      char(20)

Active Server Pages

使用几个 ASP 页面来更新和显示 ToDoLists 数据库项。

首先,新用户将被引导到 login.asp,他们在那里输入用户 ID、姓名和密码。

<form id=FORM1 name=FORM1 action="default.asp" method=get>

如果您从未登录过,请选择一个用户 ID、密码和姓名。

<table>
<tr><td>User ID:</td><td><input name="U" size=5 maxlength=10></td></tr>
<tr>
   <td>Password:</td>
   <td><input type="password" name="P" size=10 maxlength=20></td>
</tr>
<tr><td>Name:</td><td><input name="N" size=20 maxlength=80></td></tr>
<tr>
  <td colspan=2><input type="submit" name="submit" value="Log In"></td>
</tr>
</table>
</form>

FORM 标签的 action 值会将表单数据提交到 default.asp,然后 default.asp 会添加新用户,或登录现有用户,并处理应用程序的主要用户界面。

用户通过 default.asp 登录后,用户可以执行三个主要功能:

  1. 插入新项
  2. 更新现有项
  3. 删除已完成的项。

这些功能中的每一个都在单独的 ASP 页面中执行,完成后会将用户重定向回 default.asp 以更新主用户界面。

插入新项

当用户填写“输入新项”表单并单击“保存”按钮时,表单数据将被发送到 insertitem.asp,然后添加到 item 数据库表中。之后,用户将被重定向到主页。

strUser = Request.QueryString("U")
strPwd = Request.QueryString("P")
strName = Request.QueryString("N")

strDesc = Request.QueryString("description")
strDueDate = Request.QueryString("due_date")
strPriority = Request.QueryString("priority")

if (Len(strDesc) > 255) then
    strDesc = Left(strDesc, 255)
end if

strSelect = "INSERT INTO item (description, date_entered, date_due, " &_
    "priority, status, user_id) VALUES ('" + strDesc + "', today(), " &_
    "'" + strDueDate + "', '" + strPriority + "', 'O', '" + strUser + "')"

...

Response.Redirect("default.asp?U=" + strUser + "&P=" + _
                              strPwd + "&N=" + strName)

更新现有项

列出的每个项目都显示在一个嵌套在表单中的表中。该表有三个单元格:一个用于“已完成”复选框,一个用于优先级指示器(低=无,中=*,高=!),还有一个用于项目描述。(目前,用户唯一可以更新的是该项目是否已完成,通过复选框。)当用户想要将项目标记为已完成时,他/她会勾选该框,表单将被提交到 updateitem.asp。该项目将在数据库中更新,然后用户将被重定向到主页。

strUser = Request.QueryString("U")
strPwd = Request.QueryString("P")
strName = Request.QueryString("N")

strSelect = "SELECT item_num FROM item WHERE user_id = '" + strUser + "'"
set adorItems = Server.CreateObject("ADODB.RecordSet")
adorItems.Open strSelect, Cnxn

while (not adorItems.EOF)
    strStatus = Request.QueryString(CStr(adorItems("item_num")))

    if (strStatus = "on") then
        strUpdate = "UPDATE item SET status = 'C' WHERE item_num = " &_
            + CStr(adorItems("item_num")) + _
            " AND user_id = '" + strUser + "'"
    else
        strUpdate = "UPDATE item SET status = 'O' WHERE item_num = " &_
            + CStr(adorItems("item_num")) + _
             " AND user_id = '" + strUser + "'"
    end if

    set adorCmd = Server.CreateObject("ADODB.Command")
    set adorCmd.ActiveConnection = Cnxn
    adorCmd.CommandText = strUpdate

    adorCmd.Execute()
    set adorCmd = nothing

    adorItems.MoveNext()
wend

...

Response.Redirect("default.asp?U=" + strUser + _
                 "&P=" + strPwd + "&N=" + strName)

删除已完成的项

当用户单击“删除已完成的项”按钮时,用户 ID、姓名和密码将被发送到 deletecompleted.asp,其中主页上勾选的所有项将从数据库中删除。之后,用户将再次被重定向到主页。

strUser = Request.QueryString("U")
strPwd = Request.QueryString("P")
strName = Request.QueryString("N")

strDelete = "DELETE FROM item WHERE status = 'C' AND user_id = '" + _
                                                      strUser + "'"

set adorCmd = Server.CreateObject("ADODB.Command")
set adorCmd.ActiveConnection = Cnxn
adorCmd.CommandText = strDelete

adorCmd.Execute()

...

Response.Redirect("default.asp?U=" + strUser + _
                    "&P=" + strPwd + "&N=" + strName)

活动桌面

为了利用活动桌面,我需要创建一个 Channel Definition Format (CDF) 文件,该文件用于将网页植入到桌面。

由于我们不希望一直看到登录页面,因此 default.asp 将通过在 URL 中发送用户 ID、姓名和密码来登录用户。这种额外的便利性使得无法为所有人提供通用的 CDF,因此我在用户登录后覆盖 CDF 文件,使 CDF 特定于该用户。

' create an active desktop cdf

dim objFileSys, objTextStream
dim sText

Set objFileSys = Server.CreateObject("Scripting.FileSystemObject")

Set objTextStream = _
  objFileSys.OpenTextFile("drive:yourpath\todolists\todolists_ad\" &_
  "activedesktop.cdf", ForWriting, true)

sText = "<?XML VERSION=""1.0""?>" &_
  "<Channel HREF=""http://yourdomain/todolists/default.asp?U=" + _
  strUser & + "&P=" + strPwd + "&N=" + strName + """" &_
  " SELF=""http://yourdomain/todolists/todolists_ad/activedesktop.cdf"">" &_
  "<ITEM HREF=""http://yourdomain/todolists/default.asp?U=" + strUser &_
  + "&P=" + strPwd + "&N=" + strName + """ LASTMOD=""2002-02-04"" >" &_
  "<TITLE>ToDo List</TITLE>" &_
  "<USAGE VALUE=""DesktopComponent""><OPENAS VALUE=""html"" />" &_
  <WIDTH VALUE=""350"" /><HEIGHT VALUE=""400"" />" &_
  "</USAGE></ITEM></CHANNEL>"

objTextStream.Write sText
objTextStream.Close

这可能会导致问题,如果用户 A 在用户 B 登录之前登录,并在用户 B 登录后添加了活动桌面频道。然后用户 A 的活动桌面频道将以用户 B 的身份登录他……糟糕,这并不完美。

要将频道添加到活动桌面,用户只需单击主页底部的“添加到活动桌面”按钮,瞧!每次用户重新启动时,待办事项列表都会一目了然。

结论

我希望本文档提供了足够的信息,能够让 CP 大神和所有普通程序员满意。如果不够,我已包含所有页面的源代码和一些截图。

总的来说,这是一个非常简单的项目,除了活动桌面实现。我花费了大量时间才弄清楚如何在不每次都打开新浏览器窗口的情况下刷新频道更新。经过大量的反复试验,我意识到似乎在调用一个单独的 ASP 然后快速重定向回主页后,它就能正常工作了。对于我第一次涉足活动桌面编程来说,我认为这是一个相当成功的尝试。

© . All rights reserved.