Discuz!NT 2.5 正式版 下载
beta、RC版升级补丁
Comsenz 招聘信息
首届Discuz!NT 模板大赛圆满结束
著名音乐网站SoGua网、分贝网
采用Discuz!NT搭建社区
FIFA Online2官网论坛使用Discuz!NT
游戏城寨论坛使用Discuz!NT搭建
第二届优秀版主评选揭晓
Discuz!NT 2.5正式开源 Discuz!NT文档中心
用户整合说明文档
Discuz!NT亮相微软Tech-Ed 2007
Discuz!NT情景搞笑短片抢先看
1/2页12 跳转到查看:1713
发新话题 回复该主题

[经验] DNT2.0交友信息插件制作全攻略(附源代码)

DNT2.0交友信息插件制作全攻略(附源代码)

源代码下载地址(792K)

交友插件主要功能是让会员填写更详细的个人信息和个性信息,并让其他人能够查看,通过这些信息,加深会员间的了解。

一、需求:
1、允许注册1个字符长度的帐户

2、会员可以填写个人信息,可以修改自己的信息,可以查看别人的信息。

二、结果:
该插件通过修改源代码和模板,实现了与DNT2.0的无缝结合,外观表现和操作都非常自然。在用户中心添加了“编辑个人信息”页,允许用户自由修改资料;修改“查看用户信息”页,将会员资料展示在其中。

三、修改前要准备和规划的:
a、得到DNT2.0源代码,并用vs2005打开解决方案sln。打开Discuz.Web项目中的\aspx\1目录,这里面是Discuz.ForumPage命名空间的逻辑层代码所在地,我们大部分页面逻辑要添加在里面。

b、打开\templates\default目录,这是原始模板的地址,页面表现需要对其中部分进行修改,并有新的模板文件要被创建。

c、规划一下,共要修改4个模板,新建1个模板;修改2个页面逻辑,新建1个页面逻辑;数据库要加1个表;采用单层来写这个表的对应DAL;使用XML实现数字字典来管理个人信息。

d、用管理后台将模板生成的页面会自动加上Inherits="Discuz.ForumPage.xxxxxx",就是说页面逻辑需要写在Discuz.Web项目中并进行编译才是最干净的做法,这样可以避免像“会员生日插件”那样需要在模板中添加命名空间的引用。


=============下面具体说明我是如何修改的===============

四、建立Discuz.Plugin.Friend插件项目,该项目主要功能是对Personinfo表进行增改查操作,对个人信息的勾选部分进行字典支持,是信息的底层。
1、建立数据库PersonInfo表,用于储存会员的个人信息,信息具体内容参考截图。

--详见附件中代码
CREATE TABLE [dbo].[PersonInfo] (
        [id] [int] IDENTITY (1, 1) NOT NULL ,
        [uid] [int] NULL ,
        [Lookfor] [int] NULL ,
        [Title] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
        [Intro] [nvarchar] (300) COLLATE Chinese_PRC_CI_AS NULL ,
        [Height] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
        [Stature] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
        [Marriagestate] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
        [Industry] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
        [Job] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
        [Constellation] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
        [Blood] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
        [EduLevel] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
        [School] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
        [Earning] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
        [Personality] [nvarchar] (1400) COLLATE Chinese_PRC_CI_AS NULL ,
        [Describing] [nvarchar] (1400) COLLATE Chinese_PRC_CI_AS NULL ,
        [Predominance] [nvarchar] (1400) COLLATE Chinese_PRC_CI_AS NULL ,
        [Fond] [nvarchar] (1400) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO


2、编写数据库对象的操作类,利用SqlHelper:

namespace Discuz.Plugin.Friend
{
    public class PersonInfo
    {
        public static int Add(PersonInfo model)
        {
            //见附件中代码
        }

        public static PersonInfo GetModel(int uid)
        {
            //见附件中代码
        }

        public static void UpdateModel(PersonInfo model)
        {
            //见附件中代码
        }
    }
}


3、编写获得字典的方法:

        /// <summary>
        /// 个人信息类型
        /// </summary>
        public enum PersonInfoType
        {
            /// <summary>
            /// 个性
            /// </summary>
            Personality,
            /// <summary>
            /// 形容
            /// </summary>
            Describing,
            /// <summary>
            /// 优势
            /// </summary>
            Predominance,
            /// <summary>
            /// 爱好
            /// </summary>
            Fond
        }
        public static DataTable GetEnum(PersonInfoType pit)
        {
            //见附件中代码
        }


4、字典部分内容:

<?xml version="1.0" encoding="utf-8" ?>
<PersonInfo>
    <Personality>
        <PersonalityItem>冒险/疯狂</PersonalityItem>
        <PersonalityItem>稳重</PersonalityItem>
        <PersonalityItem>浪漫/脱俗</PersonalityItem>
    </Personality>
    <Describing>
        <DescribingItem>追求刺激</DescribingItem>
        <DescribingItem>电脑专家</DescribingItem>
    </Describing>
    <Predominance>
        <PredominanceItem>相貌</PredominanceItem>
        <PredominanceItem>身材</PredominanceItem>
    </Predominance>
    <Fond>
        <FondItem>情感</FondItem>
        <FondItem>文学</FondItem>
    </Fond>
</PersonInfo>


五、修改Discuz.Web项目中的文件register,以满足需求[1]。
1、添加Discuz.Plugin.Friend项目资源引用,并将item.config拷贝至web根目录中。

2、修改\aspx\1中的register.aspx.cs,将111行的字符数限制改为1。

                else if (Utils.GetStringLength(tmpUsername) < 1)
                {
                    AddErrLine("用户名不得小于1个字符");
                }


3、修改\templates\default中的register.htm模板,将248行和255行分别修改字符数限制。

if(unlen < 1 || unlen > 20) {


4、编译Discuz.Web项目,在后台生成register.htm模板,此时帐号注册字符数限制被修改为最少1个字符。


六、修改Discuz.Web项目中的文件userinfo,以满足需求[2]的第3点。
1、修改\aspx\1中的userinfo.aspx.cs,添加代码:

using Discuz.Plugin.Friend;
public PersonInfo person;
person = PersonInfo.GetModel(id);


2、修改\templates\default中的userinfo.htm模板,将id="firestmessage"附近代码进行调整,增加person相关字段信息

                <ul class="firestmessage">
                        <li class="navname"><span>用户名:</span> {user.username}

</li>
                        <li><span>用户ID:</span> {user.uid} </li>
                        <li><span>昵称:</span> {user.nickname}</li>
                        <li><span>用户组:</span> {group.grouptitle}</li>
                        <li><span>阅读权限:</span> {group.readaccess}</li>
                        <li> </li>
                        <li><span>我要寻找:</span> <%if {person.lookfor}==0%>
                                男性
                                <%/if%>
                                <%if {person.lookfor}==1%>
                                女性
                                <%/if%>
                                <%if {person.lookfor}==2%>
                                男女均可
                                <%/if%></li>       
                        <li><span>标题:</span> {person.title}</li>       
                        <li><span>自我介绍:</span> {person.intro}</li>       
                        <li><span>身高:</span> {person.height}</li>       
                        <li><span>体型:</span> {person.stature}</li>       
                        <li><span>目前是:</span> {person.marriagestate}</li>       
                        <li><span>从事的行业:</span> {person.industry}</li>       
                        <li><span>职业:</span> {person.job}</li>       
                        <li><span>星座:</span> {person.constellation}</li>       
                        <li><span>血型:</span> {person.blood}</li>       
                        <li><span>教育程度:</span> {person.eduLevel}</li>       
                        <li><span>毕业学校:</span> {person.school}</li>       
                        <li><span>月收入:</span> {person.earning}</li>       
                        <li> </li>       
                        <li><span>个性:</span> {person.personality}</li>       
                        <li><span>朋友形容我:</span> {person.describing}</li>       
                        <li><span>优势:</span> {person.predominance}</li>       
                        <li><span>兴趣爱好:</span> {person.fond}</li>       
                </ul>


3、编译Discuz.Web项目,在后台生成userinfo.htm模板,此时“查看用户信息”页已经如我所愿了。

(未完待续)

======================下面是附件================

附件

userinfo.png ()

2008-6-28 0:56:42

userinfo.png

userpersoninfo.png ()

2008-6-28 0:56:42

userpersoninfo.png

schema.png ()

2008-6-28 0:56:42

schema.png

project.png ()

2008-6-28 0:56:42

project.png

Discuz.Plugin.Friend.rar ()

2008-6-28 0:56:42


最后编辑killuakun 最后编辑于 2008-06-28 01:14:27

TOP

 

七、在Discuz.Web项目中新建userpersoninfo.aspx页面,编写对应逻辑,完成会员修改自己个人信息的功能,以满足需求[2]的前2点。
1、在\aspx\1中建立userpersoninfo.aspx页,会产生对应的.cs文件。

2、在userpersoninfo.aspx.cs文件中添加呈现逻辑,具体代码看附件。注意这时候没必要在userpersoninfo.aspx页中写什么,因为那是会被模板生成后替换掉的东西。

        /// <summary>
        /// 当前用户信息
        /// </summary>
        public UserInfo user = new UserInfo();

        public PersonInfo person;
        public DataTable personality;
        public DataTable describing;
        public DataTable predominance;
        public DataTable fond;

        protected override void ShowPage()
        {
            pagetitle = "用户控制面板";

            if (userid == -1)
            {
                AddErrLine("你尚未登录");

                return;
            }
            user = Users.GetUserInfo(userid);

            person = PersonInfo.GetModel(userid);
            personality = PersonInfo.GetEnum

(PersonInfo.PersonInfoType.Personality);
            describing = PersonInfo.GetEnum

(PersonInfo.PersonInfoType.Describing);
            predominance = PersonInfo.GetEnum

(PersonInfo.PersonInfoType.Predominance);
            fond = PersonInfo.GetEnum(PersonInfo.PersonInfoType.Fond);
        }


3、在\templates\default中复制一个usercpprofile.htm,改名为userpersoninfo.htm,在其基础上修改为我们需要的表现,如“编辑个人信息”图中所示。注意把呈现逻辑也一并写在.htm中,具体规则参考“DISCUZ!NT 2.0 模板说明文档.CHM”。
下面段代码是用于呈现大量的勾选框,是这张模板页制作的难点。

                                <label for="personality">个

性:</label>
                                <div style="width:100%">
                                <%loop personalityitem

personality%>
                                <div style="width:150px;

float:left;"><input name="personality" type="checkbox" value="{personalityitem

[PersonalityItem_Text]}"
                                <%csharp%>
                                if

(("{person.personality}").IndexOf("{personalityitem[PersonalityItem_Text]}") !=

-1)
                                {
                                templateBuilder.Append("

checked='checked'");
                                }
                                <%/csharp%>
                                />{personalityitem

[PersonalityItem_Text]}</div>
                                <%/loop%>
                        </div>
                                <br />


4、在userpersoninfo.aspx.cs文件中添加更新personinfo的逻辑,具体代码看附件。

                if (DNTRequest.IsPost())
                {
                    if (ForumUtils.IsCrossSitePost())
                    {
                        AddErrLine("您的请求来路不正确,无法提交。如果您安装了某种默认屏蔽来路信息的个人防火墙软件(如 Norton Internet Security),请设置其不要禁止来路信息后再试。");
                        return;
                    }

                    if (page_err == 0)
                    {
                        person.Lookfor = DNTRequest.GetInt("lookfor", 0);
                        person.Title = DNTRequest.GetString("title");
                        person.Intro = DNTRequest.GetString("intro");
                        person.Height = DNTRequest.GetString("height");
                        person.Stature = DNTRequest.GetString("stature");
                        person.Marriagestate = DNTRequest.GetString("marriagestate");
                        person.Industry = DNTRequest.GetString("industry");
                        person.Job = DNTRequest.GetString("job");
                        person.Constellation = DNTRequest.GetString("constellation");
                        person.Blood = DNTRequest.GetString("blood");
                        person.EduLevel = DNTRequest.GetString("eduLevel");
                        person.School = DNTRequest.GetString("school");
                        person.Earning = DNTRequest.GetString("earning");
                        person.Personality = DNTRequest.GetString("personality");
                        person.Describing = DNTRequest.GetString("describing");
                        person.Predominance = DNTRequest.GetString("predominance");
                        person.Fond = DNTRequest.GetString("fond");
                        PersonInfo.UpdateModel(person);

                        SetUrl("userpersoninfo.aspx");
                        SetMetaRefresh();
                        SetShowBackLink(true);
                        AddMsgLine("修改个人信息完毕");
                    }
                }


5、编译Discuz.Web项目,在后台生成userpersoninfo.htm模板,此时“编辑个人信息”页面基本完成,可以实现功能满足要求了。

八、以上功能基本都完成了,但在“编辑个人信息”页面并不能进去,因为没有对应的菜单。下面修改菜单模板,增加菜单和对应的一些逻辑。
1、修改_permenu.htm,增加“编辑个人信息”链接。

2、修改_menu.htm,增加“编辑个人信息”链接。

3、菜单想怎么摆就怎么摆吧,这块就比较简单了。生成模板,这时整个交友插件就修改制作完成了。

九、总结
1、这种修改方式有个弊端,就是必须要源代码,而且要修改模板,难度较大。

2、好处是和源文件结合的很紧密,前台表现非常好,与论坛天衣无缝的整合在一起,没什么破绽,是符合官方的开发思路的。

3、部分模板被修改了,如果要换皮肤,需要每次将修改的5张模板进行覆盖。

4、有新的2个DLL要替换:Discuz.Web.dll、Discuz.Plugin.Friend.dll。

5、用这种方式可以对DNT2.0的会员信息进行大幅度的扩展,对于网站整合来说,可以以DNT2.0的会员为核心,在其上添加更多的业务功能,或者与网站的业务流程进行交叉,灵活性非常大。我想能使用这种方式对DNT2.0进行修改的人,用DNT2.0进行网站整合和重组都不是什么问题。

(全文完)
最后编辑killuakun 最后编辑于 2008-06-28 01:24:35

TOP

 

第一次发贴,请多指教
最后编辑killuakun 最后编辑于 2008-06-28 01:10:30

TOP

 

第一次发贴,请多指教
最后编辑killuakun 最后编辑于 2008-06-28 01:10:39

TOP

 

2.5开源时再装上
算神工作室
基于Discuz!NT 2.5架构的论坛

TOP

 

支持楼主,非常棒,希望在2.5版本中还能看到你的作品
说出你对Discuz!NT的想法
MySQL版测试论坛暨Graffiti CMS中文论坛
feisibook  冠愉小传    图片故事

TOP

 

恩,谢谢鼓励,DNT是写的很不错的论坛,我会继续关注后面的新版本,也希望与大家分享一下自己的经验或技巧。

TOP

 

顶上去
www.okooh.com

TOP

 

准备装上
www.okooh.com

TOP

 

不错,有开发就很棒。

TOP

 
1/2页12 跳转到
发表新主题 回复该主题

相关主题

建议官方组织插件开发大赛
【图片收录插件】适用于Discus2.0-2.5的图片收录插件,让你的图片亮起来。
万年历插件
算神2.5系列插件之MP3附件自动播放
清溪湖官方论坛再次推出震撼强捍Discz!NT2.0-2.5通用版七格最新可定制版插件【更新8-18 见证完美表现】