您现在的位置是:首页 > cms教程 > Discuz教程Discuz教程
Discuz!NT网站安装也能自动化DNT安装时使用到的几个函数解析
乐丹2025-07-08Discuz教程已有人查阅
导读在DNT安装项目:Discuz.Install中,有9个CS文件。其中位于SetupPage.cs.文件中的SetupPage类是继承自System.Web.UI.Page。它是其安装过程中用到的其他页面类的基类。
前文提到:
在DNT安装项目:Discuz.Install中,有9个CS文件。其中位于SetupPage.cs.文件中的SetupPage类是继承自System.Web.UI.Page。它是其安装过程中用到的其他页面类的基类。
在SetupPage的构造函数中,程序组织了一些版权、版本等文本的Html。但在整个安装过程中,我没看见这些信息。
安装时,由于Index.Aspx没有隐藏任何类的信息,可以当作静态页面来看待。
安装过程中的第二和第三个页面完成信息收集工作,之后在第四个页面自信数据库脚本创建存储过程和表。前两个页面基层之文件step3.aspx.cs中的install类,之后一个页面基层自step4.aspx.cs文件中的InstallStep4类。这篇就说说安装过程中用到的几个有意思函数。
1、安装前软件BIN目录检测函数IISSystemBINCheck()
这个函数位于SetupPage类中,检查程序依赖的DLL是否都存在。通过File.Exists()判断文件是否存在。
2、检查对程序目录的读写权限函数SystemFolderCheck()
这个函数通过在程序主目录下创建一个文件,之后再删除这个文件来检查对程序根目录的读写权限
3、检查对操作系统临时目录的读写权限函数TempTest()
4、配置文件编辑函数EditDntConfig()
5、检测数据库是否存在函数
6、读取数据库脚本并执行的函数:CreateTableAndSP()
之后通过DBHelper类中执行脚本的函数ExecuteCommandWithSplitter()完成数据库和表的创建工作。
数据库内容初始化函数跟这个相似,也是读脚本-执行的过程。
7、代码中使用了很多DBHelper类和Utils类中的函数。
这个类是数据库操作类和配置类。在这里使用起来很方便,省去了很多数据库的初始化和连接的配置工作。这里可以看出分层和OOP的好处:写一个函数,大家调用。
8、一点点体会:
整个论坛程序的安装其实就是执行一些环境检测和数据库的初始化。环境检测主要是通过在需要检测的地方创建一个文件,向文件中些数据后读取这些数据,之后删除创建的文件这几个步骤来进行的。数据库检测是通过在try{ }。catch{ }。段中打开连接-执行一些操作来判断的。如果没有抛出异常,说明数据库正常,否则就是连接恶补正确。
DNT作了个这样的东西,虽然不大,但很方便。即使不懂ASPX的人也能看着帮助完成数据库程序的安装。所有安装操作和配置都在浏览器中进行,不用手动去改配置文件。
完善的数据库操作类用处非常大,可以省去很多代码。我之前写过一个类,每次用到数据库操作,都要新建一个诸如Command、Connection、SqlDataReader、SqlDataAdapter之类的对象,然后组织 Sql语句,一个个地写,麻烦大大地有。
这篇比较简单,有理解不透或语言组织不足之处还望大家指正。
DNT程序后台配置功能很强大,基本上可以达到一切皆可配置的地步。这种配置跟他的页面组织有很大关系。下一篇我先写写DNT如何处理页面显示的。
在DNT安装项目:Discuz.Install中,有9个CS文件。其中位于SetupPage.cs.文件中的SetupPage类是继承自System.Web.UI.Page。它是其安装过程中用到的其他页面类的基类。
在SetupPage的构造函数中,程序组织了一些版权、版本等文本的Html。但在整个安装过程中,我没看见这些信息。
安装时,由于Index.Aspx没有隐藏任何类的信息,可以当作静态页面来看待。
安装过程中的第二和第三个页面完成信息收集工作,之后在第四个页面自信数据库脚本创建存储过程和表。前两个页面基层之文件step3.aspx.cs中的install类,之后一个页面基层自step4.aspx.cs文件中的InstallStep4类。这篇就说说安装过程中用到的几个有意思函数。
1、安装前软件BIN目录检测函数IISSystemBINCheck()
这个函数位于SetupPage类中,检查程序依赖的DLL是否都存在。通过File.Exists()判断文件是否存在。
2、检查对程序目录的读写权限函数SystemFolderCheck()
这个函数通过在程序主目录下创建一个文件,之后再删除这个文件来检查对程序根目录的读写权限
3、检查对操作系统临时目录的读写权限函数TempTest()
private static bool TempTest()
{
string UserGuid = Guid.NewGuid().ToString();
string TempPath = Path.GetTempPath();
string path = TempPath + UserGuid;
try
{
using (StreamWriter sw = new StreamWriter(path))
{
sw.WriteLine(DateTime.Now);
}
using (StreamReader sr = new StreamReader(path))
{
sr.ReadLine();
return true;
}
}
catch
{
return false;
}
}
这个函数首先通过System.IO中的Path.GetTempPath();函数获取系统历史文件目录,之后使用Guid.NewGuid().ToString()在临时目录下随机生成一个文件目录名并创建一个文件,在文件中追加一行数据并读取,以测试对临时目录的权限。4、配置文件编辑函数EditDntConfig()
protected void EditDntConfig(string dataSource, string userID, string password, string databaseName, string tablePrefix)
{
BaseConfigInfo baseConfig = BaseConfigs.GetBaseConfig();
connectionString = string.Format(@"Data Source={0};User ID={1};Password={2};Initial Catalog={3};Pooling=true",
dataSource, userID, password, databaseName);
baseConfig.Dbconnectstring = connectionString;
baseConfig.Tableprefix = tablePrefix;
baseConfig.Dbtype = "SqlServer";
string dntPath = Utils.GetMapPath("~/DNT.config");
if (!Utils.FileExists(dntPath))
{
dntPath = Utils.GetMapPath("/DNT.config");
}
SerializationHelper.Save(baseConfig, dntPath);
DbHelper.ConnectionString = baseConfig.Dbconnectstring;
BaseConfigs.ResetRealConfig();
}
编辑网站根目录下DNT.Config文件使用。通过传入的参数,组织了连接字符串即:
connectionString = string.Format(@"Data Source={0};User ID={1};Password={2};Initial Catalog={3};Pooling=true",
dataSource, userID, password, databaseName);
然后将这个字符串保存到网站目录下的DNT.Config文件中。5、检测数据库是否存在函数
CheckDatabaseExists()
protected int CheckDatabaseExists()
{
int result = 0;
try
{
connectionString = string.Format(@"Data Source={0};User ID={1};Password={2};Initial Catalog={3};Pooling=false",
Request.QueryString["sql_ip"], Request.QueryString["sql_username"], Request.QueryString["sql_password"], Request.QueryString["sql_name"]);
commandText = string.Format("SELECT DB_ID('{0}')", Request.QueryString["sql_name"]);
result = ExcuteReader(commandText, connectionString);
//EditDntConfig(Request["sql_ip"], Request["sql_username"], Request["sql_password"], Request["sql_name"], Request["table_prefix"]);//执行成功后,将数据库连接信息写入DNT.config文件
}
catch (Exception)
{
Response.Write("{\"Result\":false,\"Message\":\"数据库不存在!请重新填写;或者选择自动创建数据库\"}");
Response.End();
return result;
}
if (result == 0)
{
Response.Write("{\"Result\":false,\"Message\":\"数据库不存在!请重新填写;或者选择自动创建数据库\"}");
Response.End();
return result;
}
else
{
Response.Write("{\"Result\":true,\"Message\":true}");
Response.End();
return result;
}
}
这个函数通过try{} catch{} 测试是否能连接到数据库。在Try中,根据用户输入信息组织一条语句,并在数据库中执行。如果能够执行,说明数据库连接正常。否则抛出异常,有Catch完成异常信息的显示和输出。6、读取数据库脚本并执行的函数:CreateTableAndSP()
/// <summary>
/// 建表和存储过程
/// </summary>
private void CreateTableAndSP()
{
tableprefix = BaseConfigs.GetTablePrefix;
#region 建表
StringBuilder sb = new StringBuilder();
using (StreamReader objReader = new StreamReader(Server.MapPath(dbScriptPath + "setup2.1.sql"), Encoding.UTF8))
{
sb.Append(objReader.ReadToEnd());
objReader.Close();
}
if (tableprefix.ToLower() == "dnt_")
{
DbHelper.ExecuteCommandWithSplitter(sb.ToString());
}
else
{
DbHelper.ExecuteCommandWithSplitter(sb.ToString().Replace("dnt_", tableprefix));
//DbHelper.ExecuteNonQuery(sb.ToString().Replace("dnt_",tableprefix));
}
#endregion
#region 建存储过程
sb.Remove(0, sb.Length); //将StringBuild内容清空
sqlServerVersion = DbHelper.ExecuteScalar(CommandType.Text, "SELECT @@VERSION").ToString().Substring(20, 24).Trim();
if (sqlServerVersion.IndexOf("2000") >= 0)
{
using (StreamReader objReader = new StreamReader(Server.MapPath(dbScriptPath + "setup2.2.sql"), Encoding.UTF8))
{
sb.Append(objReader.ReadToEnd());
objReader.Close();
}
}
else
{
using (StreamReader objReader = new StreamReader(Server.MapPath(dbScriptPath + "setup2.2 - 2005.sql"), Encoding.UTF8))
{
sb.Append(objReader.ReadToEnd());
objReader.Close();
}
}
if (tableprefix.ToLower() == "dnt_")
{
DbHelper.ExecuteCommandWithSplitter(sb.ToString().Trim().Replace("\"", "'"));
}
else
{
DbHelper.ExecuteCommandWithSplitter(sb.ToString().Trim().Replace("\"", "'").Replace("dnt_", tableprefix));
}
#endregion
}
这个函数中首先通过StreamReader读取数据库脚本,接下类根据用户输入的初始化表头前缀替换掉数据库脚本中的表盒存储过程的前缀dnt_。之后通过DBHelper类中执行脚本的函数ExecuteCommandWithSplitter()完成数据库和表的创建工作。
数据库内容初始化函数跟这个相似,也是读脚本-执行的过程。
7、代码中使用了很多DBHelper类和Utils类中的函数。
这个类是数据库操作类和配置类。在这里使用起来很方便,省去了很多数据库的初始化和连接的配置工作。这里可以看出分层和OOP的好处:写一个函数,大家调用。
8、一点点体会:
整个论坛程序的安装其实就是执行一些环境检测和数据库的初始化。环境检测主要是通过在需要检测的地方创建一个文件,向文件中些数据后读取这些数据,之后删除创建的文件这几个步骤来进行的。数据库检测是通过在try{ }。catch{ }。段中打开连接-执行一些操作来判断的。如果没有抛出异常,说明数据库正常,否则就是连接恶补正确。
DNT作了个这样的东西,虽然不大,但很方便。即使不懂ASPX的人也能看着帮助完成数据库程序的安装。所有安装操作和配置都在浏览器中进行,不用手动去改配置文件。
完善的数据库操作类用处非常大,可以省去很多代码。我之前写过一个类,每次用到数据库操作,都要新建一个诸如Command、Connection、SqlDataReader、SqlDataAdapter之类的对象,然后组织 Sql语句,一个个地写,麻烦大大地有。
这篇比较简单,有理解不透或语言组织不足之处还望大家指正。
DNT程序后台配置功能很强大,基本上可以达到一切皆可配置的地步。这种配置跟他的页面组织有很大关系。下一篇我先写写DNT如何处理页面显示的。
本文标签:
很赞哦! ()
下一篇:discuz论坛常见问题解决方法
相关教程
图文教程
centos7环境搭建Discuz论坛的方法
用centos7搭建搭建网络yum源。设置yum源自动挂载关闭SELinux和防火墙安装httpd安装net-tools工具(1)安装数据库服务
lamp+nginx代理discuz+wordpress+phpmyadmin的方法
实验课题:搭建LAMP,安装Nginx,作为代理,将MySQL安装在单独的机器,apache负责动态,nginx负责静态1、更换163下载源2、分别在设备A和B中下载各个软件;
Discuz自定义Discuz Code实现论坛地图插件
看了非常多的论坛地图插件和博客地图插件,总觉得不是很好用,不是安装太复杂就是使用太复杂,而且效果也是差强人意。最近在做MapURL.info的网站
Discuz!NT安装报错的解决方法
好久没有回来了。现在开始学习Discuz!NT。先来记录一下网站的发布。首先澄清一下,XP系统是无法发布的,即便是专业版。我用了半天时间,才发现权限问题通不过。
相关源码
-
(自适应响应式)pbootcms紫色美容整形机构企业模板下载基于PbootCMS内核开发的响应式网站模板,为医疗美容机构、整形医院等企业设计,提供完整的线上展示平台采用紫色系配色方案,整体风格专业大气。模板包含首页轮播、服务项目、专家团队、案例展示等核心模块,能够充分展示医疗美容机构的专业服务和特色优势。查看源码 -
PbootCMS(自适应手机端)智能电话AI机器人网站模板产品概述基于PbootCMS内核开发的智能电话AI机器人网站模板,为语音交互服务场景设计,采用HTML5+CSS3响应式布局技术,实现PC端与移动端数据实时同步展示。模板适用于智能电话查看源码 -
帝国CMS7.5漫画网站模板带手机端源码免费下载本模板为漫画内容平台设计开发,采用帝国CMS7.5内核构建,深度优化漫画作品展示结构与章节管理模式。前端采用响应式布局设计,适配各类漫画阅读场景,提供作品分类、连载追踪、热度排行等垂直领域功能模块。查看源码 -
(自适应)大型农业机械设备水稻玉米收割机网站pbootcms源码下载本模板基于PbootCMS内核开发,为农业机械设备制造与销售企业设计,特别适合水稻玉米收割机、拖拉机、播种机等农用机械展示。模板充分考虑了农机行业的特性,从产品展示到技术参数,从作业案例到售后服务查看源码 -
(PC+WAP)绿色市政园林建筑设计绿化营销型pbootcms网站模板本模板基于PbootCMS系统开发,为园林绿化、景观设计类企业设计,特别适合市政园林、景观工程、绿化养护等企业使用。采用双端适配技术查看源码 -
帝国CMS7.5手游资讯下载综合门户免费网站模板本模板基于帝国CMS7.5内核开发,为手游打造的综合门户网站解决方案。模板设计充分考虑了手业的特性,包含游戏资讯发布、手游下载、礼包发放、开测信息等核心功能模块,满足手游门户网站的各项业务需求。查看源码
| 分享笔记 (共有 篇笔记) |