您现在的位置是:首页 > 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论坛常见问题解决方法
相关教程
- PHP join()函数:数组元素连接成字符串教程
- PHP implode()函数:数组元素连接成字符串教程
- PHP htmlspecialchars_decode()函数:HTML实体还原字符教程
- PHP htmlspecialchars()函数:特殊字符转HTML实体教程
- PHP html_entity_decode()函数:HTML实体还原字符教程
- PHP htmlentities()函数:字符转HTML实体教程
- PHP hex2bin()十六进制转ASCII字符函数详解
- PHP hebrev()函数教程:希伯来文视觉文本转换、maxcharline参数与经验
- PHP get_html_translation_table()函数详解:翻译表、编码标志与避坑指南
- PHP fprintf()函数:格式化字符串写入流指南
- PHP explode()函数:字符串分割与数组转换
- PHP echo()函数:字符串输出机制与工程实践
图文教程
Discuz自制模板带jquery时与discuz本身冲突怎么办
由于JQuery的效果很好,在制作模板时难免会用到各种jquery效果。可是做过模板的人就会发现加上自己的juery代码后,discuz自带的一些下拉功能就不可以使用了
discuz实现自动注册登录的方法
1.从原有系统进入论坛自动登录和注册2.实现弹框在本页面,不进行跳转3.js在页面加载时直接发起注册请求这个功能之前使用的uc_user_register这个函数来处理的,但是今天在开发用户空间时就会出现问题。
discuz接入七牛sdk的步骤方法
自己摸索了几天,找群里面的人各种问,都没有一个人回答我,哎,国内的开源精神呢,需要修改有以下几个:1.替换 /source/class/class_core.php 文件
Discuz!NT在64位Windows下运行常见问题
非常搞,等了快一年Discuz!NT的免费版本依旧不支持64位Windows。官方出了64位windows支持的指南居然是叫用户把IIS设置为32位兼容模式。说了等于没说
相关源码
-
(自适应)宽屏农业机械农耕设备类网站pbootcms模板免费下载为农机企业打造的现代化响应式网站模板,自动适配电脑、平板和手机,浏览体验一致,独立页面SEO设置,提升搜索引擎可见度。查看源码 -
(自适应)绿色LED灯具照明灯饰灯光灯泡pbootcms网站源码下载本模板基于PbootCMS内核开发,为LED照明、灯具制造及相关光电技术企业量身打造。设计充分考虑了照明行业的展示需求,从产品陈列到技术说明,从光源展示到工程案例,每一个细节都体现出专业照明行业的特点。查看源码 -
自适应响应式绿色装修公司定制家居类pbootcms网站下载(自适应手机端)响应式全屋装修定制家居类网站pbootcms模板 绿色装修公司网站源码下载PbootCMS内核开发的网站模板,该模板适用于装修定制网站、装查看源码 -
自适应新闻资讯技术博客个人网站pbootcms模板该模板基于PbootCMS开源内核深度开发,该模板适用于游戏新闻网站、游戏博客等企业或个人网站,新闻资讯技术博客pbootcms模板;采用六级分辨率断点适配技术查看源码 -
HTML5响应式健身俱乐部pbootcms网站模板下载为健身俱乐部、瑜伽中心及运动场馆设计的响应式网站模板,采用PbootCMS内核开发,支持一键替换图文适配健身器材销售、瑜伽工作室等多类型运动健康产业。查看源码 -
(自适应)帝国cms7.5模板自媒体文章新闻博客为帝国CMS7.5设计的响应式模板,采用H5技术构建现代化内容展示框架。通过智能断点检测技术实现手机、平板、PC三端适配查看源码
| 分享笔记 (共有 篇笔记) |
