宝玉

专注于web开发技术
随笔 - 114, 评论 - 4863 , 引用 - 594

对用户资料的补充

一、需求:
为了符合国内用户的使用习惯,首先从用户资料方面,有必要增加用户昵称,可以让用户除了一个唯一标志身份的英文登陆ID外,再有一个可以张扬个性的昵称字段,例如dotey(宝玉)。昵称是不能重复的,所以注册时需要判断昵称是否重复。
为了方便管理员对帐号的管理,可以记录用户的注册IP、最后登陆IP和最后活动IP。
QQ在国内的普及,可以增加QQ信息。

二、概要设计:
要修改用户资料,那么首先我们要更改User类,增加相关属性,如果有必要(见备注),我们要在数据库中增加相关字段。
由于用户类和数据库字段的更改,为了不使我们在从数据库中读取/创建/修改用户资料时、缺少这些新增的字段信息,那么我们必须修改相关存储过程和修改从DataReader转成User类的方法PopulateUserFromIDataReader。
为了使用户能输入这些新增的属性并获取用户的输入,那么在UI端我们需要增加相关控件,并将用户输入到控件的内容赋值到User类实例对应的属性中。


备注:在Asp.Net Forums中,将所有的不经常更新的、不需要检索的用户属性,如QQ、MSN、签名档等,处理成二进制流,直接存储在forums_UserProfile表中的StringNameValues[varbinary](7500)字段内。所以当新增这类属性时无需对数据库结构进行更改。现在我们要新增的这些,QQ信息属于这类情况。对于其他的,我们就只能是在数据库中增加相应字段,并修改存储过程了。
public String QQIM 
{
    get { return GetExtendedAttribute("qqIM"); }
    set { SetExtendedAttribute("qqIM", value); }
}

三、具体编码:
3.1 数据库部分:
3.11 首先,我们要在forums_Users表增加相关字段:
[NickName] [nvarchar] (64)  NOT NULL DEFAULT (''), --昵称字段
[IPCreated] [nvarchar] (32) NOT NULL DEFAULT (N'000.000.000.000') --注册IP
[IPLastLogin] [nvarchar] (32) NOT NULL DEFAULT (N'000.000.000.000') --最后一次登陆IP
[IPLastActive] [nvarchar] (32) NOT NULL DEFAULT (N'000.000.000.000') --最后一次活动IP——使用记住密码后无需登陆

3.12 这部分更改将可能影响到存储过程:
forums_system_Import_User --导入用户功能
forums_User_CreateUpdateDelete --注册/修改/删除用户资料,要注意注册和修改时都要增加判断当前昵称是否存在。
forums_User_Get --返回用户资料
forums_Users_Online --返回在线用户信息
forums_GetForumModerators --返回斑竹资料
 附件: update.sql

3.2 源代码部分:
3.21 在用户类(Components\Components\User.cs)中增加相应属性 Nickname、IPCreated、IPLastLogin、IPLastActive
DateTime dateCreated = DateTime.Now;
DateTime dateLastLogin = DateTime.Now;
DateTime dateLastActive = DateTime.Now;

string nickname;
string ipCreated;
string ipLastLogin;
string ipLastActive;

 

/// <summary>
/// 昵称
/// </summary>
public string Nickname
{
 get { return nickname;}
 set { nickname = value;}
}

/// <summary>
/// 注册IP
/// </summary>
public string IPCreated
{
 get { return ipCreated;}
 set { ipCreated = value;}
}

/// <summary>
/// 最后一次登陆IP
/// </summary>
public string IPLastLogin
{
 get { return ipLastLogin;}
 set { ipLastLogin = value;}
}

/// <summary>
/// 最后一次活动IP
/// </summary>
public string IPLastActive
{
 get { return ipLastActive;}
 set { ipLastActive = value;}
}

public String Language
{
get {
  string lan = GetExtendedAttribute("language");
  if (lan == null || lan == "")
   lan = Globals.Language;
  return lan;
 }
set { SetExtendedAttribute("language", value); }
}

3.22 从DataReader转成User类的方法PopulateUserFromIDataReader(Components\Provider\ForumsDataProvider.cs)中增加对新增字段的支持
user.Nickname                       = Convert.ToString(dr["Nickname"]);
user.IPCreated      = Convert.ToString(dr["IPCreated"]);
user.IPLastLogin     = Convert.ToString(dr["IPLastLogin"]);
user.IPLastActive                   = Convert.ToString(dr["IPLastActive"]);

3.23 在枚举类CreateUserStatus(Components\Enumerations\CreateUserStatus.cs)中增加DuplicateNickname类型,用来判断注册用户时昵称是否重复
/// <summary>
/// The username has been previously disallowed.
/// </summary>
DisallowedUsername,

/// <summary>
/// 重复的昵称
/// </summary>
DuplicateNickname
3.24 在Resources.xml(web\Languages\LanguageName\Resources.xml)中增加在注册/修改用户资料时对昵称字段的描述、昵称不能为空不能重复的提示信息。
<resource name = "CreateNewAccount_NickName">昵称</resource>
<resource name = "CreateNewAccount_NickNameDescription">在本站中将以此名字作为您的公共名称。用3-16个中英文、标点符号或数字组成。 </resource>
<resource name = "CreateNewAccount_nicknameValidator">昵称必须填写。</resource>
<resource name = "CreateNewAccount_CreateUserStatus_DuplicateNickname">昵称已被注册。</resource>
<resource name = "EditProfile_ContactPrivateNickname">昵称:</resource>

3.25在用户注册/修改所对应的皮肤文件(web\themes\SkinName\Skin-CreateNewAccount2.ascx)/(web\themes\SkinName\Skin-EditProfile.ascx)中增加相应控件
Skin-CreateNewAccount2.ascx
<tr>
<td>&nbsp;</td>
</tr>
<tr>
 <td align="left" class="fh2">
  <b><% = aspnetforums.Components.ResourceManager.GetString("CreateNewAccount_NickName") %></b>
  <br />
  <% = aspnetforums.Components.ResourceManager.GetString("CreateNewAccount_NickNameDescription") %>
  <br />
  <asp:textbox id="Nickname" MaxLength="64" runat="server" columns="40"></asp:textbox>
  <asp:RequiredFieldValidator EnableClientScript="false" id="nicknameValidator" runat="server" ControlToValidate="Nickname" Cssclass="validationWarning">*</asp:RequiredFieldValidator>     
 </td>
</tr>
Skin-EditProfile.ascx
<tr>
<td class="f" width="45%">
<% = aspnetforums.Components.ResourceManager.GetString("EditProfile_ContactPrivateNickname") %>
</td>
<td class="fh3">
<asp:TextBox id="Nickname" Size="50" runat="server" MaxLength="50"/>
</td>
</tr>

3.26 用户注册/修改控件(Controls\User\CreateUser.cs)/(Controls\User\EditProfile.cs)中,在InitializeSkin时对新增的几个控件进行初始化,在点击注册/更新事件部分将获取到的昵称内容赋值给用户实例的昵称属性。
CreateUser.cs

TextBox nickname;
RequiredFieldValidator nicknameValidator;

override protected void InitializeSkin(Control skin) {

            nickname = (TextBox) skin.FindControl("Nickname");


            nicknameValidator = (RequiredFieldValidator) skin.FindControl("nicknameValidator");
            nicknameValidator.ErrorMessage = aspnetforums.Components.ResourceManager.GetString("CreateNewAccount_nicknameValidator").Replace("'", @"\'");

}

private void CreateUser_Click(Object sender, EventArgs e) {

           // try to create the new user account
            User user = new User();
            user.Username = username.Text;   
     user.Nickname = Globals.HtmlEncode(nickname.Text);
            user.Email = emailAddress.Text;
   user.IPCreated = forumContext.Context.Request.UserHostAddress;

 


    // Nickname already exists!
    case CreateUserStatus.DuplicateNickname:
     placeHolderValidator.ErrorMessage = aspnetforums.Components.ResourceManager.GetString("CreateNewAccount_CreateUserStatus_DisallowedNickname");
     placeHolderValidator.IsValid = false;
     break;

}

EditProfile.cs

TextBox nickname;
override protected void InitializeSkin(Control skin) {

    nickname = (TextBox) skin.FindControl("Nickname");

    nickname.Text = Globals.HtmlDecode(userToEdit.Nickname);

}

public void Update_Click (Object sender, EventArgs e) {

 userToEdit.Nickname = Globals.HtmlEncode(nickname.Text);
}

3.27 在对数据库操作的方法CreateUpdateDeleteUser(SqlDataProvider\SqlDataProvider.cs)中,给存储过程传递昵称、注册IP参数
public override User CreateUpdateDeleteUser(User user, DataProviderAction action, out CreateUserStatus status) {

 myCommand.Parameters.Add("@NickName", SqlDbType.NVarChar, 64).Value = user.Nickname;
 myCommand.Parameters.Add("@IPCreated", SqlDbType.NVarChar, 32).Value = user.IPCreated;

}

上面列举的编码没有QQ资料的新增/修改,没有登陆IP、最后活动IP的记录,还需要补充。

发表于 2004年7月13日 8:35

评论

# re: 对用户资料的补充

HI,想请教下,我怎么下载了中文RC2后,解压缩后运行安装,但奇怪的是,我的安装可以成功,比如安装到forums虚拟目录,但我在IIS控制中怎么也找不到forums虚拟目录,我用VS。NET 2003直接打开解决方案,但也没办法正确完全打开,为什么呢?
2004/7/24 17:05 | mdot

# re: 对用户资料的补充

偶建议改动还是尽可能小一些好一点吧,如果E文版升级,中文版又有很多要改,太累

直接改动一下,允许中文用户名不就可以了吗

另外,发贴用的那个html编辑器似乎有很多的问题,经常性的出错,如果有可能,偶到是建议去掉那个东东,找个好点的编辑器来用,实在不行用text也行,就不用格式什么的了
2004/7/26 11:41 | Primer

# re: 对用户资料的补充

To mdot:
通过安装向导会直接将forums/web目录设置为虚拟目录的。如果没有也可以手动将该目录设置为Forums虚拟目录。
To Primer:
真的是这样子的,不过等2.0Release后,短期内没必要跟着英文版升级。编辑器我觉得还挺好,你也可以在源码中禁用:)
2004/7/26 14:47 | 宝玉

# re: 对用户资料的补充

宝玉兄弟:
能否讲讲各个项目的作用 ???
2004/10/21 6:51 | asenzh

# re: 对用户资料的补充

抱歉!
不用了,自己先看!!!
2004/10/21 6:57 | asenzh

# re: 对用户资料的补充

修改410255169用户的个人资料
2004/9/2 19:30 | 爱你

# re: 对用户资料的补充

5555555最近搞毕业论文,本来是要自己设计开发一个asp。net的论坛,后来老师让我把asp。net forums稍微改一改或者做一些分析,前段时间没抓紧,如今时间很紧了,宝玉能不能帮帮我呢?最好是4,5天以内了,多谢多些!!
2005/6/1 22:16 | Kristy

# re: 对用户资料的补充

宝玉,怎么我在本地调试好了,自己给自己发帖子,并没有出现你说的popup功能的啊?难道是哪里还要设置?
2006/5/29 19:32 | ufo0303

# re: 对用户资料的补充

YTMNTDYJSRY
2008/8/30 19:56 | 滕和

# Keep on posting on the same high level. You're surely someone that has something to tell that people need to know.

Keep on posting on the same high level. You're surely someone that has something to tell that people need to know.
2011/8/21 21:35 | UGGs

Post Comment

主题  
姓名  
主页
校验码  
内容   
京ICP备 05050892号