当前位置: 首页 > 编程日记 > 正文

动软代码生成器教程——懒人有福了

很多时候项目必须是三层架构模式,但是很多繁琐的代码让多数程序员闹心……那有没有一个省时省力的工具快速的帮我们搞定三层架构呢?回答是肯定的,很早之前技术牛人李天平就开发出了这么一款工具,目前该工具还在不断的更新,更多的功能也出现了。实在是让那些老鸟们省了不少力气。

废话不多时,看教程。

一. 功能介绍
动软代码生成器 是一款为程序员设计的全功能自动代码生成器,也是一个智能化软件开发平台,它可以生成基于面向对象的思想和三层架构设计的代码,结合了软件开发中经典的思想和设计模式,融入了工厂模式,反射机制等等一些思想。主要实现在对应数据库中表的基类代码的自动生成,包括生成属性、添加、修改、删除、查询、存在性、Model类构造等基础代码片断,支持不同架构代码生成,使程序员可以节省大量机械录入的时间和重复劳动,而将精力集中于核心业务逻辑的开发。新版本中除了程序集组件模板,也同样支持用户自定义文本模板,像写ASPX代码一样写模板,一键代码生成,更方便,更灵活。
动软让软件开发变得轻松而快乐!让企业不断提升开发效率,同样的时间创造出更大的价值。
二. 下载安装
1. 系统要求: Microsoft Windows2000/XP/2003/7 或者更高。机器必须安装.NET Framework v2.0。
2. 官方下载地址:http://www.maticsoft.com/download.aspx
3. 下载解压后安装包有如下文件:
Codematic2.msi 是动软.NET代码生成器的安装文件。
Builder文件夹是代码生成插件的源码,动软.NET代码生成器支持可扩展的代码生成插件,用户可以定制自己的代码生成的插件,根据接口开发自己的代码生成方式,按自己的需求进行代码生成。
Codematic_Data.MDF和Codematic_Log.LDF 是通过动软新建项目中所带管理模块所需要的数据库文件。后台管理员默认登录用户名:admin 密码:1
4. 双击Codematic2.msi 进行直接安装即可。
安装动软时,如果用户机器360弹出警告,那仅仅是个签名认证提示,并非木马,选择“继续安装”,然后点击“确定”即可。
动软郑重声明: 动软.NET代码生成器,绝无插件木马,纯绿色软件。请放心安装。
5. 安装成功后,在开始-菜单和桌面上会有动软.NET代码生成器的图标。


三. 模板代码生成
1. 在左侧【数据库视图】,选中表,右键菜单【模板代码生成】
2. 然后,出现单表的代码生成器界面,我们设置自己需要更改的信息
备注:代码还有一些生成规则,是在菜单【工具】-【选项】-【代码生成设置】中进行设置。
3. 然后,点击工具栏【生成代码】或者【生成代码】按钮,即可生成该类的代码。生成的代码,可以直接复制到项目文件中,也可以右键保存成CS文件。通过窗体下面的Tab按钮可以来回切换设计视图和代码。
4. 设置模板目录
5. 模板保存

四. 模板代码批量生成
1. 选中数据库或者表,然后单击右键菜单【模板代码批量生成】
2. 出现的窗口和新建项目基本相似,只是多了一个选中架构的选项:
3. 选则要生成的表,然后点击【导出】。
4. 在生成的文件夹中,我们可以看到:
批量生成代码只生成业务表的代码,不再有解决方案文件和项目文件,以及其它类库等。我们可以将生成的这些文件直接拖到现有的解决方案中即可


五. 代码生成规则设置
打开菜单【工具】-【选项】-【代码生成设置】
这些配置保存后,在生成代码的时候将按照这个规则进行生成。
代码生成的规则设置范围还在不断增加中。
另外,不同数据库类型的数据类型各有不同,这里提供了字段类型和C#中的类型建立映射关系,生成代码时将按映射关系来生成代码字段属性的类型。

六. 模板编写教程
模板的大体分为5块内容:模板指令声明,代码语句块,表达式块,类功能控制块,文本块输出。下面我们分别来介绍一下这5块内容的语法和使用说明。
1. 模板指令声明块 <#@ #>
和ASP.NET页面的指令一样,它们出现在文件头,通过<#@„#>表示。其中<#@ template „#>指令是必须的,用于定义模板的基本属性。
(1) 模板指令
<#@ template [language="VB"] [hostspecific="true"] [debug="true"] [inherits="templateBaseClass"] [culture="code"] [compilerOptions="options"] #>
例如 <#@ template language="C#v3.5" hostSpecific="true" debug="true" #>
Language 这里可以指定模板使用的语言。
hostSpecific="true" 表示是否使用特定的host,host里面包含了模板使用的各种对象。
注意:
所有属性值必须用双引号都括起来。如果值本身包含引号,则必须使用 \ 字符对这些引号进行转义。 指令通常是模板文件或包含的文件中的第一个元素。
(2) 参数指令 <#@ parameter type="Full.TypeName" name="ParameterName" #>
(3) 输出指令 <#@ output extension=".fileNameExtension" encoding="encoding" #>
output extension=".cs" 指定生成文件的扩展名。
encoding="encoding" 指定生成文件的编码。
(4) 程序集指令 <#@ assembly name="System.Data" #>
用于添加程序集引用,如果要使用第三方程序集,那么最好在项目中添加引用。
注:您应使用绝对路径的名称,或者路径名称中使用标准的宏的名称。
例如: <#@ assembly name="$(SolutionDir)library\MyAssembly.dll" #>
(5) 导入指令 <#@ import namespace="System.Data" #>
导入要使用的命名空间,注意:这里的命名空间必须要在前面指定的程序集里面找得到的,比如我指定命名空间"System.Data","System.Data.Common",这些在程序集System.Data中都有的
(6) 包含指令 <#@ include file="test.tt" #> 导入模板,类似Html的include用法
include 指令插入其他模板文件的文本。
例如,下面的指令插入 test.txt 的内容。 <#@ include file="c:\test.txt" #>
在处理时,被包含内容就像是包含文本模板的组成部分一样。 不过,即使 include 指令后跟普通文本块和标准控制块,也可以包含编写有类功能块 <#+...#> 的文件

2. 代码语句块: <# #>
在模板文件中,可以混合使用任意数量的文本块和标准控制块。中间是一段通过相应编程语言编写的程序调用,我们可以通过代码语句快控制文本转化的流程。
注意:不能在控制块中嵌套控制块。
<#@ output extension=".txt" #>
<#
for(int i = 0; i < 4; i++)
{
#>
Hello!
<#
}
#>


3. 表达式块:<#= #>
表达式控制块计算表达式并将其转换为字符串。 该字符串将插入到输出文件中。
例如: <#= 2 + 3 #>
表达式可以包含作用域中的任何变量。 例如,下面的块输出数字行:
<#@ output extension=".txt" #>
<#
for(int i = 0; i < 4; i++)
{
#>
This is hello number <#= i+1 #>: Hello!
<#
}
#>


4. 类功能控制块:<#+ #>
如果文本转化需要一些比较复杂的逻辑,我们需要写在一个单独的辅助方法中,甚至是定义一些单独的类,我们就是将它们定义在类特性块中。类功能控制块定义属性、方法或不应包含在主转换中的所有其他代码。 类功能块常用于编写帮助器函数。 通常,类功能块位于单独的文件中,这样它们可以包含在多个文本模板中。 类功能控制块以 <#+ ... #> 符号分隔。
例如,下面的模板文件声明并使用一个方法:
<#@ output extension=".txt" #>
Squares:
<#
for(int i = 0; i < 4; i++)
{
#>
The square of <#= i #> is <#= Square(i+1) #>.
<# #>
That is the end of the list.
<#+ // Start of class feature block
private int Square(int i)
{
return i*i;
}
#>
类功能必须编写在文件末尾。不过,即使 include指令后跟标准块和文本,也可以 <#@include #> 包含类功能的文件。例如下面代码则会报错:
List of Squares:
<#
for(int i = 0; i < 4; i++)
{ WriteSquareLine(i); }
#>
End of list.
<#+ // Class feature block
private void WriteSquareLine(int i)
{
#>
The square of <#= i #> is <#= i*i #>.
<#
}
#>


5. 文本块输出
可以使用 Write() 和 WriteLine() 方法在标准代码块内追加文本,而不必使用表达式代码块。 它们可帮助缩进输出和报告错误。
下面两个代码块在功能上是等效的。
包含表达式块的代码块
<#
int i = 10;
while (i-- > 0)
{ #>
<#= i #>
<# }
#>
使用 WriteLine() 的代码块
<#
int i = 10;
while (i-- > 0)
{
WriteLine((i.ToString()));
}
#>
Write() 和 WriteLine() 方法有两个重载,其中一个重载接受单个字符串参数,另一个重载接受一个复合格式字符串以及将包含在字符串中的对象数组(与 Console.WriteLine() 方法类似)。
下面两种 WriteLine() 用法在功能上是等效的:
<#
string msg = "Say: {0}, {1}, {2}";
string s1 = "hello";
string s2 = "goodbye";
string s3 = "farewell";
WriteLine(msg, s1, s2, s3);
WriteLine("Say: hello, goodbye, farewell");
#>
设置文本模板输出缩进的格式。
CurrentIndent 字符串属性显示文本模板中的当前缩进,该类还具有一个 indentLengths 字段,该字段是已添加的缩进的列表。
PushIndent() 方法增加缩进,
PopIndent() 方法减少缩进。
ClearIndent() 方法,删除所有缩进。
下面的代码块演示这些方法的用法:
<#
WriteLine(CurrentIndent + "Hello");
PushIndent(" ");
WriteLine(CurrentIndent + "Hello");
PushIndent(" ");
WriteLine(CurrentIndent + "Hello");
ClearIndent();
WriteLine(CurrentIndent + "Hello");
PushIndent(" ");
WriteLine(CurrentIndent + "Hello");
#>
此代码块产生以下输出:
Hello
Hello
Hello
Hello
Hello
可以使用错误和警告实用工具方法向 Visual Studio 错误列表添加消息。 例如,下面的代码向错误列表添加一条错误消息。
<#
try
{
string str = null;
Write(str.Length.ToString());
}
catch (Exception e)
{
Error(e.Message);
}
#>


7. 模板示例讲解


8. Host对象属性列表
Host提供了一下属性和方法,方便编写模板时调用。 TableHost属性 类型 说明 DbName string 当前数据库名。
DbType
string
当前数据库类型:SQL2000,SQL2005,SQL2008,Oracle,OleDb,MySQL,SQLite TableList List<TableInfo> 当前数据库所有的表集合,返回List<TableInfo>
ViewList
List<TableInfo>
当前数据库所有的视图集合,返回List<TableInfo> ProcedureList List<TableInfo> 当前数据库所有的存储过程集合,返回List<TableInfo>
DbHelperName
string
数据库访问类名,例如:DbHelperSQL ProjectName string 项目名称
ProcPrefix
string
存储过程前缀,例如sp_ ModelPrefix string Model类名前缀
ModelSuffix
string
Model类名后缀 BLLPrefix string BLL类名前缀
BLLSuffix
string
BLL类名后缀 DALPrefix string DAL类名前缀
DALSuffix
string
DAL类名后缀 TabNameRule string 类命名规则: same(保持原样) lower(全部小写) upper(全部大写) 工具-选项-代码生成设置中进行设置。
DbParaDbType
string
得到数据库字段DbType的类名。例如:SqlDbType preParameter string 当前数据库类型对应的存储过程参数符号,例如:@
Folder
string
所属文件夹 TableName string 表名
TableDescription
string
表的描述信息 Fieldlist List<ColumnInfo> 字段集合
Keys
List<ColumnInfo>
主键字段集合 IdentityKey ColumnInfo 自动增长标识列;如果没有则返回null。

9. Host对象方法列表
TableHost方法 说明 string GetModelClass(string TabName) 组合得到Model类名: 前缀+类名+后缀
string GetBLLClass(string TabName)
组合得到BLL类名: 前缀+类名+后缀 string GetDALClass(string TabName) 组合得到DAL类名: 前缀+类名+后缀

10. TableInfo 表对象属性
属性 类型 说明 TabName string 表名称
TabUser
string
用户对象 TabType string 表类型
TabDate
string
创建日期


11. ProcedureHost 表对象属性
属性 类型 说明 ProcedureName string 表名称
Parameterlist
List<ColumnInfo>
参数列表 OutParameter ColumnInfo 输出参数字段信息


12. ColumnInfo 字段信息对象
属性 类型 说明 ColumnOrder string 序号
ColumnName
string
字段名 TypeName string 字段类型
Length
string
长度 Precision string 精度
Scale
string
小数位数 IsIdentity bool 是否是标识列
IsPrimaryKey
bool
是否是主键 Nullable bool 是否允许空
DefaultVal
string
默认值 Description string 备注


13. CodeCommon工具类常用方法 CodeCommon方法 说明
string DbTypeToCS(string dbtype) 得到“数据库字段类型”对应的“c#类型”
bool isValueType(string cstype)
是否C#中的值(可空)类型 string DbTypeLength(string dbtype,string datatype, string Length) 得到数据库字段DbType的类型和长度
ColumnInfo GetIdentityKey(List<ColumnInfo> keys)
得到自动增长标识列字段 string DbParaDbType(string DbType) 得到不同数据库DbType类名,例如SqlDbType
string preParameter(string DbType)
得到不同数据库的存储过程参数符号,例如:@ string GetWhereParameterExpression(List<ColumnInfo> keys, bool IdentityisPrior, string DbType) 得到Where条件语句 - Parameter方式 (例如:用于Exists Delete GetModel 的where) 例如:where NewsId=@NewsId
string GetPreParameter(List<ColumnInfo> keys, bool IdentityisPrior, string DbType)
生成sql语句中的参数列表(例如:用于 Exists Delete GetModel 的where参数赋值) string GetInParameter(List<ColumnInfo> keys, bool IdentityisPrior) 得到方法输入参数定义的列表 (例如:用于Exists Delete GetModel 的参数传入)
string GetFieldstrlist(List<ColumnInfo> keys, bool IdentityisPrior)
字段的 select 列表,和方法传递的参数值 string GetWhereExpression(List<ColumnInfo> keys, bool IdentityisPrior) 得到Where条件语句 - SQL方式 (例如:用于Exists Delete GetModel 的where)
string GetModelWhereExpression(List<ColumnInfo> keys, bool IdentityisPrior)
得到Where条件语句 - SQL方式 (例如:用于Exists Delete GetModel 的where) string CutDescText( string descText,int cutLen,string ReplaceText) 字符串描述截取:要截取的字符串,长度,替代字符串。
输出效果模板代码:(复制到模板代码生成器中执行即可看到效果)
<#@ template language="c#" HostSpecific="True" #>
<#@ output extension= ".cs" #>
<#
TableHost host = (TableHost)(Host);
ColumnInfo identityKey=host.IdentityKey;
#>
数据库名:<#= host.DbName #>
数据库类型:<#= host.DbType #>
表名:<#= host.TableName #>
表描述:<#= host.TableDescription #>
数据库访问类名:<#= host.DbHelperName #>
项目名称:<#= host.ProjectName #>
存储过程前缀:<#= host.ProcPrefix #>
类命名规则:<#= host.TabNameRule #>
数据库DbType类名:<#= host.DbParaDbType #>
存储过程参数符号:<#= host.preParameter #>
表集合:
<# foreach (TableInfo tab in host.TableList)
{
WriteLine(tab.TabName);
} #>
字段集合:
<# foreach (ColumnInfo c in host.Fieldlist)
{
WriteLine("public {0} {1} {{ get; set; }}",CodeCommon.DbTypeToCS(c.TypeName),c.ColumnName );
} #>
字段集合增加连接符号:
<# for(int i=0;i< host.Keys.Count;i++)
{ ColumnInfo key = host.Keys[i]; #>
<# if (key.IsPrimaryKey || !key.IsIdentity)
{#>
strSql.Append(" <#= key.ColumnName#> = <#=preParameter#><#=key.ColumnName#> <# if (i< host.Keys.Count-1 ) {#>and <#}#> ");
<#}#>
<# }#>
主键字段集合集合:
<# foreach (ColumnInfo c in host.Keys)
{
WriteLine("public {0} {1} {{ get; set; }}",CodeCommon.DbTypeToCS(c.TypeName),c.ColumnName );
} #>
Model类名:<#= host.GetModelClass(host.TableName) #>
BLL类名:<#= host.GetBLLClass(host.TableName) #>
DAL类名:<#= host.GetDALClass(host.TableName) #>
<#= CodeCommon.DbParaDbType(host.DbType) #>
<#= CodeCommon.preParameter(host.DbType) #>
<#= CodeCommon.GetWhereParameterExpression(host.Keys,true,host.DbType) #>
<#= CodeCommon.GetPreParameter(host.Keys,true,host.DbType) #>
<#= CodeCommon.GetInParameter(host.Keys,true) #>
<#= CodeCommon.GetFieldstrlist(host.Keys,true) #>
<#= CodeCommon.GetWhereExpression(host.Keys,true) #>

其他详细教程见开发者李天平博客:http://www.cnblogs.com/ltp/archive/2011/05/25/2057151.html

转载于:https://www.cnblogs.com/gyweiUSTC/archive/2011/07/12/2104168.html

相关文章:

unity3d做简单小游戏可以吗?

可以吗&#xff1f;当然。如果是独立开发&#xff0c;主要在美工&#xff0c;这类的游戏程序简单&#xff0c;有些基础就行&#xff0c;美工要做得好可不容易&#xff0c;要是效果要求不高&#xff0c;随便在max拉几个模型吧。unity方面&#xff0c;熟悉一下&#xff0c;如果有…

逻辑覆盖测试(一)语句覆盖

语句覆盖&#xff1a; 设计测试用例时保证程序的每条语句至少执行一次。 简单来说&#xff0c;就是每个语句都覆盖一遍。 例子&#xff1a; 流程图如下&#xff1a; 测试用例如下&#xff1a; x4,z9&#xff0c;第一个if语句执行到了&#xff1b; x4,y7,第二个if语句为true…

「小程序JAVA实战」小程序的视频展示页面初始化(63)

转自&#xff1a;https://idig8.com/2018/09/24/xiaochengxujavashizhanxiaochengxudeshipinzhanshiyemianchushihua62/ 进入列表详情&#xff0c;展示点赞状态用户的名称&#xff0c;头像名称。源码&#xff1a;https://github.com/limingios/wxProgram.git 中No.15和springbo…

.NET判断字符串是否是数值型或xxx型

using System.Text.RegularExpressions; Regex digitregex new Regex("^[0-9]\d*[.]?\d*$"); if (!digitregex.IsMatch(TextBox1.Text)) { TextBox1.Text""; MessageBox.Show("只能输入数字&#xff01;","提示…

Spring.net使用说明

使用方法&#xff1a;1.在配置文件设置Spring.net 节点在配置节中&#xff0c;声明Spring.net&#xff0c;配置 context&#xff0c;objects 标签&#xff0c;来源&#xff08;type&#xff09;<!--配置节&#xff1a;主要用来 配置 asp.net框架之外的 标签&#xff0c;告诉…

逻辑覆盖测试(三)条件覆盖

条件覆盖&#xff1a;设计测试用例时应保证程序中每个复合判定表达式中&#xff0c;每个简单判定条件的取真和取假情况至少执行一次。 例子&#xff1a; 流程图&#xff1a; 测试用例&#xff1a; 程序中一共两个if语句&#xff0c;都是复合判定条件&#xff0c;其中的简单…

Linux UserSpace Back-Door、Rootkit SSH/PAM Backdoor Attack And Defensive Tchnology

catalog 0. 引言 1. Pam后门 2. SSH后门 3. Hijacking SSH 4. Hijacking SSH By Setup A Tunnel Which Allows Multiple Sessions Over The Same SSH Connection Without Re-Authentication 5. Hijacking Active SSH Screen Sessions 0. 引言 0x1: 安全攻防观点 1. Know Your …

澳大利亚多地热浪来袭 最高温度超40摄氏度

中新网1月24日电 据澳洲网报道&#xff0c;近日&#xff0c;澳大利亚多地热浪来袭&#xff0c;其中&#xff0c;南澳和维州的部分地区气温将飙升至40摄氏度以上。维州政府发布声明&#xff0c;提醒民众做好应对高温天气的准备。资料图&#xff1a;当地时间1月21日&#xff0c;澳…

Multithread 之 introduction

Why multithreading?&#xff08;摘自《win32 多线程程序设计》&#xff09;单线程程序就像超级市场中唯一的一位出纳&#xff0c;这个出纳对于小量采购可以快速结账。但如果有人采购了一大车货品&#xff0c;结账就需要点时间了&#xff0c;其他每个人都必须等待。多线程程序…

逻辑覆盖测试(四)判定/条件覆盖

判定/条件覆盖&#xff1a;测试用例的设计应满足判定节点的取真和取假分支至少执行一次&#xff0c;且每个简单判定条件的取真和取假情况也至少执行一次。 简单来说&#xff0c;就是判定覆盖和条件覆盖取交集。 例子&#xff1a; 流程图&#xff1a; 当判定覆盖和条件覆盖…

jQuery选择器的工作原理和优化

至于有那些选择器&#xff0c;在帮助手册中都有&#xff0c;自己去看&#xff0c;这篇主要是分析他的工作原理&#xff0c;而优化我们写 的选择器&#xff0c;尤其在页面内容很多的情况下&#xff0c;更应该需要优化。下边就言归正传。 每次申明一个jQuery对象的时候&#xff0…

webservice发送字符串

假设只是发送一个字符串client&#xff0c;这是很easy&#xff0c;只需要输入xfire包&#xff0c;编写接口&#xff0c;编写的实现方法。变化。 假设你要传输的数组或自定义类。到用于接口准备的需要agexis文件。更复杂。 尝试传输这些假设没有成功。在发送成功的字符串&#x…

600余名外出务工者免费乘高铁“返乡专列”回云南过春节

中新网昆明1月25日电(缪超)记者25日从中国铁路昆明局集团获悉&#xff0c;云南与广东两省人社部门近日组织开行高铁“返乡专列”&#xff0c;免费安排600多名云南籍外出务工人员乘坐高铁动车返乡过春节。图为志愿者与乘务员为外出务工人员精心准备的歌舞节目。中国铁路昆明局集…

逻辑覆盖测试(六)--路径测试

路径覆盖&#xff1a;设计足够多的测试用例&#xff0c;使得程序中所有可能的路径都被至少被执行一次。 例子&#xff1a; 测试用例&#xff1a; 思路&#xff1a; 先是都经过a&#xff0c;到一个if分支&#xff0c;可以有a 、b和 a、c&#xff0c;然后到第二个if分支&#…

浅谈MVP设计模式

最近公司在做一个医疗项目&#xff0c;使用WinForm界面作为客户端交互界面。在整个客户端解决方案中。使用了MVP模式实现。由于之前没有接触过该设计模式&#xff0c;所以在项目完成到某个阶段时&#xff0c;将使用MVP的体会写在博客里面。 所谓的MVP指的是Model&#xff0c;Vi…

C#委托与事件

之前写过一篇关于C#委托与事件的文章&#xff08;见《C#委托和事件例析》&#xff09;&#xff0c;不过还是收到一些网友的提问。所以&#xff0c;今天再换另一个角度来详解一下这个问题。 一、在控制台下使用委托和事件 我们都知道&#xff0c;C#中有“接口”这个概念&#xf…

Docker for mac安装

Mac安装Docker docker下载地址: https://hub.docker.com/editions/community/docker-ce-desktop-mac docker for mac document: https://docs.docker.com/docker-for-mac/ 系统要求 Docker Desktop - Mac适用于OS X Sierra 10.12和更新的macOS版本。 获得Docker 稳定边缘Stable…

白盒测试--基本路径测试法

1.为什么要有基本路径测试法&#xff1f; 对于路径测试&#xff0c;最理想的情况是路径全部覆盖&#xff0c;单对于复杂的大程序要做到路径覆盖是不可能的&#xff0c;因此可以采用基本路径测试。 2.基本路径测试法的步骤&#xff1f; &#xff08;1&#xff09;画出程序的控制…

Postmortem报告

1. 每个成员在beta 阶段的实践和alpha 阶段有何改进? 2. 团队在beta 阶段吸取了那些alpha 阶段的经验教训? 在alpha阶段中&#xff0c;虽然我们团队已经对软件主要功能核心代码完成了&#xff0c;但是由于我们团队现有掌握有关于安卓开发的技术并不成熟&#xff0c;无法对软件…

是否可以人为修改发表时间

是否可以人为修改发表时间转载于:https://blog.51cto.com/14188306/2346747

关于win7_iis报500.19和500.21错误的解决方法

关于win7_iis报500.19和500.21错误的解决方法HTTP 错误 500.19 Internal Server Error的解决方法WIN7下.Net开发遇到的又一问题&#xff1a;HTTP 错误 500.19 - Internal Server Error&#xff0c;无法访问请求的页面&#xff0c;因为该页的相关配置数据无效。详细错误信息模块…

黑盒测试--因果图法

例子&#xff1a; (1)根据题目可以得到原因和结果分别是&#xff1a; &#xff08;2&#xff09;画出因果图 根据题意来画因果图&#xff0c;输入第一个字符是A或B要写成一个状态&#xff0c;且第二个字符为数字。 画因果图主要就是理清不同状态之间的关系&#xff0c;还有有…

php 学习笔记 数组1

1、一般情况下$name[tom]和$name[tom]是相同的&#xff1b;但没有引号的键不能和常量区别开&#xff0c;如&#xff1a;define(index, 5)时&#xff1b;$name[tom]和$name[tom]不同 2、双引号里的变量一般要用{}括起来是好习惯&#xff0c;如&#xff1a; echo "{$name}&q…

Linux的文件系统

一、文件的属性 linux文件属性的格式为- --- --- ---。第一位为文件的类型&#xff0c;剩下的9位&#xff0c;每三位为一组&#xff0c;分别对应文件所有者&#xff0c;文件所以者所属的用户组&#xff0c;其他人的关系。 r为可读&#xff0c;w为可写&#xff0c;x为可执行。如…

Python-100 练习题 01 列表推导式

最近打算好好练习下 python&#xff0c;因此找到一个练习题网站&#xff0c;打算每周练习 3-5 题吧。 www.runoob.com/python/pyth… 另外&#xff0c;这个网站其实也还有 Python 的教程&#xff0c;从基础到高级的知识都有。 Example-1 三位数组合 题目&#xff1a;有四个数字…

在思科模拟器下搭建WWW、DNS、FTP、Email服务

目录一、搭建基本的拓扑结构二、配置基本IP三、配置静态路由Router0&#xff1a;Router1:四、搭建WWW服务0号服务器&#xff1a;1号服务器&#xff1a;五、在pc0上测试www服务六、搭建FTP服务对于3号服务器&#xff1a;七、在pc0上测试搭建的FTP服务八、搭建E-mail服务对于2号服…

Android SQLite数据库之事务的学习

SQLite是Android系统内置的一款轻量级的关系型数据库&#xff0c;它的运算速度非常快&#xff0c;占用资源很少&#xff0c;通常只需要几百K的内存就足够了。SQLite不仅支持标准的SQL语法&#xff0c;还遵循了数据库的ACID事务。 模拟一个应用场景&#xff1a;进行一次转账操作…

1组合逻辑电路--多路选择器与多路分解器

1.2多路选择器 1.2.1不带优先级的多路选择器 四路选择器如下 代码如下 View Code 1 module multiplexer 2 ( 3 input iA, 4 input iB, 5 input iC, 6 input iD, 7 input [1:0] iSel, 8 output reg oQ 9 );10 11 always (*)12 begin13 case(iSel)1…

java——慎用可变参数列表

说起可变参数&#xff0c;我们先看下面代码段&#xff0c;对它有个直观的认识&#xff0c;下方的红字明确地解释了可变参数的意思&#xff1a; 1 public class VarargsDemo{2 3 static int sum(int... args) {4 int sum 0;5 for(int arg:args)6 …

一位老码农的分享:一线程序员该如何面对「中年危机」?

如果这是第二次看到我的文章&#xff0c;欢迎文末扫码订阅我个人的公众号&#xff08;跨界架构师&#xff09;哟~ 本文长度为2728字&#xff0c;建议阅读8分钟。坚持原创&#xff0c;每一篇都是用心之作&#xff5e;先来聊一下这个问题的背景吧。前两天有小伙伴问到Z哥这个问题…