Discuz!NT代码阅读笔记(2)--网站安装自动化--论坛程序安装及初始化过程
相关链接:
二、网站安装自动化--论坛程序安装及初始化过程
论坛的安装文件位于Discuz.Web中的Instal文件夹中。该文件夹中的文件index.aspx为安装的起始页。
论坛程序的安装过程同样也要经过ReUrl_BeginRequest的处理。只是,ReUrl_BeginRequest没有对对页面/install/index.aspx的请求进行任何操作,因此我们在浏览器中看到的地址是:http://localhost:1543/install/index.aspx这种样式的。
安装起始页中没有进行什么操作可以简单地当作一个Html页面来看待。选中界面中的“ 接受”点击下一步,进入下一页:在代码中可以看到下一步按钮的信息如下:
<button type="button" name="next" id="next" disabled="disabled" onclick="location.href='step2.aspx'">下一步</button>
通过onclick将页面跳转到step2.aspx。废话不多说,开始安装
系统按照下边的过程完成安装
(1)环境检测
第二页的顶部有一行代码如下:
<%@ Page Language="c#" AutoEventWireup="false" Inherits="Discuz.Install.install" %>
这里定义了 ASP.NET 页分析器和编译器使用的页特定(.aspx 文件)属性。其中Inherits属性定义供页继承的代码隐藏类,这个类可以是从Page派生的任何类。Inherits="Discuz.Install.install"说明该页面继承自类Discuz.Install.install。这个类位于项目Discuz.Install中的step3.aspx.cs文件中。(不知道DNT为什么。明明是安装的第二页,非要放到step3.aspx.cs中)
用我的大白话说:这个页面中的函数都来自于step3.aspx.cs中的类install。
页面显示前,程序通过step3.aspx.cs文件中的install类的Page_Load函数加载了程序的一些配置信息,如连接字符串等。这些暂时都不需要的!
程序在step2.aspx页面中完成对安装环境的检测。step2.aspx中有一段代码是这样的:
<ul class="list">
<%
bool err = false;
Response.Write(SetupPage.InitialSystemValidCheck(ref err));
%>
</ul>
环境检测功能使用了Discuz.Install程序集中的SetupPage类中的函数。由于install类继承自SetupPage,所以这里可以直接使用SetupPage中的Public函数。
函数InitialSystemValidCheck完成对安装环境的检测。具体检测过程如下:
1、首先检测Bin目录下的DLL是由齐全:
通过函数IISSystemBINCheck(ref error)实现。
2、检测DNT.Config文件的有效性:
通过函数GetRootDntconfigPath()实现
3、检测程序文件目录(admin,aspx,avatars,cache,config,editor,images,templates,upload)的读写权限
通过循环调用函数SystemFolderCheck()来检测
4、检查对文件(admin\\xml\\navmenu.config,javascript\\common.js,install\\systemfile.aspx,upgrade\\systemfile.aspx)的读写权限
通过函数SystemFileCheck(file)来实现
5、检测对系统临时目录的读写权限
通过函数TempTest()实现
6、config文件反序列化检测
通过函数SerialiazeTest()实现
检查结果和样式信息保存在一个StringBuilder中永远用于输出。
如果这些检查都通过了,就可以进入下一步进入step3.aspx开始安装。
(2)配置数据库信息
step3.aspx页面头部也包含了:
<%@ Page Language="c#" Inherits="Discuz.Install.install" %>
该页面同样是继承自继承自类Discuz.Install.install。在这个页面加载前,程序首先读取默认的DNT.config文件中读取配置信息,提取连接字符串填充页面上的信息。实现如下:
//读取默认dnt.config文件内容
BaseConfigInfo dntConfigInfo = BaseConfigProvider.GetRealBaseConfig(); //读取DNT.config文件
if (dntConfigInfo != null)
{
FillDatabaseInfo(dntConfigInfo.Dbconnectstring);提取连接字符串
tablePrefix = dntConfigInfo.Tableprefix;
}
待用户填写自己的数据库配置信息后,通过函数EditDntConfig将配置信息保存到DNT.config文件中。
填写好这些信息之后,点击下一步 这里有个二次提交我不怎么理解。
根据跟踪结果,二次提交之后,首先将刚才的连接字符串填充到页面。之后通过FillDatabaseInfo()来检查刚才输入数据库信息是否正确:即是否能练到相应的数据库。如果数据库连接成功则通过下面的代码保存刚才的配置后,跳转到下一页:
EditDntConfig(Request["sql_ip"], Request["sql_username"], Request["sql_password"], Request["sql_name"], Request["table_prefix"]);
ClientScript.RegisterStartupScript(typeof(Page), "error", "location.href='step4.aspx'", true);
(3)配置论坛路径和管理员信息并执行脚本初始化数据库
页面step4.aspx继承自Discuz.Install.InstallStep4.这个页面完成数据库的初始化(建表和存储过程,表中输入管理员信息等)。Discuz.Install.InstallStep4同样是继承自SetupPage。页面重写了SetupPage中的Setup函数。在重写的函数从调用CreateTableAndSP() 和InitDB()函数完成数据库的初始化。
这两个函数是通过加载安装目录中表和存储过程的创建脚本来创建表的。加载完脚本,是由DbHelper.ExecuteCommandWithSplitter函数来执行脚本即完成了数据库的初始化工作。
初始化完成了,通过Server.Transfer("succeed.aspx", true);跳转到安装成功页面。
(4)到这里安装过程全部结束