用了这么久的webform,还记得刚开始根本不知道程序要写成什么样,只知道功能实现了就行,有很多现实的问题都没考虑到。所以程序改了又改,最后连自己做的什么都不知道了。所以,现在来总结一下。

会员功能 模块 大致分为 注册 登陆 用户信息管理 用户参与网站业务 4个方面。

1、注册。

因为网站运营的需要,可能注册页面不止一个。所以将注册的后台功能剥离出来,用注册的时候直接将信息发送到 register.ashx页面。

所以网站结构大概是 register.aspx.cs-->register.aspx-->register.ashx-->注册成功跳转。

数据库

1、网站配置数据库。记录被禁止注册登陆的IP地址。注册时间间隔(也可写在web.config中)

2、用户登陆信息表-安全信息表-用户业务信息表

登陆表 存登陆就要用的信息。

安全信息表 存注册时间,安全问题等

业务信息表 存用户网站的业务信息,如:钱包,积分,不常用的个人信息:邮箱、qq、职业等,最后登陆时间。。。。

register.aspx.cs进入注册页面时运行,功能:判断注册次数,IP是否禁用,注册间隔(是否重复注册)

protected void Page_Load(object sender, EventArgs e)
{
    string sqlConfig="select top 1 * from Web_Config";
    DataTable table = SqlHelper.GetDateTable(sqlConfig);
    )
    {
    ]["IPDisabled"].ToString();//禁止注册IP
    ]["ReRegTimeSpan"];//注册间隔
    ]["maxRegCount"];//同一IP最大注册数量
    string ip=获得IP();
    判断当前IP是否被限制(strDIP,ip );
    判断是否为重复注册(regSpan);
    检测IP注册次数(maxRegCount,ip);
    //如果都满足条件,进入register.aspx页面填写表单
    }
}
private void 判断当前IP是否被限制(string strDIP,string ip )//判断IP是否被限制的方法
{
    List<string> list = new List<string>(str.Split(new char[] { ',' }));
    if (list.Contains("*.*.*.*"))
    {
        base.Response.Write("当前暂停注册,请稍后再来尝试。");
        base.Response.End();
    }
    ))) || list.Contains(CutIP(iP, ))) || list.Contains(CutIP(iP, )))
    {
        base.Response.Write("您的IP段在被限制的范围内,不能进行注册,请联系我们的客服进行咨询。");
        base.Response.End();
    }
}
public string CutIP(string ip, int len)//公共方法在common.cs中,为了看起方便,暂时写在register.aspx.cs中
{
    )
    {
        if (string.IsNullOrEmpty(ip))
        {
            return "";
        }
        Match match = new Regex(@"(\d+)\.(\d+)\.(\d+)\.(\d+)", RegexOptions.Compiled | RegexOptions.IgnoreCase).Match(ip);
        if (match.Success)
        {
            ) ? ].Value, (len >= ) ? ].Value, (len >= ) ? ].Value, (len >= ) ? ].Value });
        }
    }
    return ip;
}
private void 判断是否为重复注册(string num)//判断是否为重复注册
{
    object obj2 = BCSTCache.Default.Get<CookiesCache>("RegDateTime");//这个方法是调用的第三方的类库中操作cookies的方法,注册成功后会将时间写入cookies。
    if ((obj2 != null) && CommonManager.String.IsDateTime(obj2.ToString()))
    {
    TimeSpan span = (TimeSpan)(DateTime.Now - DateTime.Parse(obj2.ToString()));
    if (span.TotalMinutes < num)
    {
    base.Response.Write("请不要重复注册。");
    base.Response.End();
    }
}
private void 检测IP注册次数(string maxRegCount,string ip)
{
    )
    {
    int num3 = (int)DbSession.Default.FromSql("select COUNT(1) FROM dbo.Web_Users WHERE RegisterIP='" + iP + "' AND DATEDIFF(d,RegisterTM,GETDATE())=0").ToScalar();
    if (num3 >= maxRegCount)
    {
    base.Response.Write("您的IP今日注册人数已达到限制数。");
    base.Response.End();
    }
}
private string 获得IP()
{
    if ((Request.ServerVariables["HTTP_X_FORWARDED_FOR"] != null) && (Request.ServerVariables["HTTP_X_FORWARDED_FOR"] != ""))
    {
    return Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
    }
    return Request.ServerVariables["REMOTE_ADDR"];
}

好累啊,写文章和写代码果然不一样,代码写久了总会有一些自己收集的代码库,在文章中又不好表述。剩下的过两天再写。

(未完待续)

WebForm业务系列-会员功能的更多相关文章

  1. Dynamics AX 2012 R2 业务系列-销售业务流程

    在博文Dynamics AX R2 业务系列中,Reinhard对这个系列做了一个规划,下面我们就按照规划开始说业务吧. 1.销售的主要职责 其实这里说的职责主要是针对销售文员,并非整天外面满世界跑业 ...

  2. Dynamics AX 2012 R2 业务系列-采购业务流程

    在博文Dynamics AX R2 业务系列中,Reinhard对这个系列做了一个规划,下面我们就按照规划开始说业务吧. 国际惯例,从采购开始. 1.采购的主要职责 简单点说,采购的主要职责,是从供应 ...

  3. dede添加会员功能听语音

    http://jingyan.baidu.com/article/363872ec36d33f6e4ba16fb7.html 其实 dede里面的 会员功能就是圈子模版啦 圈子 安装了 基本上有 1, ...

  4. dede开启会员功能

    登陆后台,找到菜单里面的系统基本参数设置>会员设置>开启会员功能,选择“是”,保存即可

  5. 03.Web大前端时代之:HTML5+CSS3入门系列~H5功能元素

    Web大前端时代之:HTML5+CSS3入门系列:http://www.cnblogs.com/dunitian/p/5121725.html 2.功能元素 1.hgroup 对网页或区段(secti ...

  6. Dynamics AX 2012 R2 业务系列

    在之前的一系列博文里,Reinhard介绍了Dynamics AX Demo的安装与配置.相信同学们看完后,都已经成功拥有了一个测试环境. 众所周知的是,ERP作为一个特殊的软件系统,他有着背后的业务 ...

  7. Nginx实战系列之功能篇----后端节点健康检查(转)

    公司前一段对业务线上的nginx做了整理,重点就是对nginx上负载均衡器的后端节点做健康检查.目前,nginx对后端节点健康检查的方式主要有3种,这里列出:   1.ngx_http_proxy_m ...

  8. Nginx实战系列之功能篇----后端节点健康检查

    目前,nginx对后端节点健康检查的方式主要有3种,这里列出:   1.ngx_http_proxy_module 模块和ngx_http_upstream_module模块(自带)    官网地址: ...

  9. N32G4系列——复用功能重映射(USART为例)

    开发测试环境:SDK,N32G455x系列芯片 在国民MCU中G系列IO口有第二复用功能,这时需要用到重映射功能. 一.系列芯片手册定义 1.1.芯片IO口默认功能查看 如图,在该系列芯片的数据手册中 ...

随机推荐

  1. Json CPP 中文支持与入门示例

    在每一个Json Cpp自带*.cpp文件头加上: #include "stdafx.h" 将Json Cpp对自带的头文件的引用修改为单引号方式,例如json_reader.cp ...

  2. 开源物联网通讯框架ServerSuperIO,成功移植到Windows10 IOT,在物联网和集成系统建设中降低成本。附:“物联网”交流大纲

    [开源]C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 一.概述 经过一个多月晚上的时间,终于把开源物联网通讯框架ServerSuperIO成功移植到Windows10 IOT上, ...

  3. 好玩的Handler

    Android提供了Handler和Looper来满足线程间的通信; Handler和Activity的任务栈不同,它是先进先出原则; Handler:你可以构造Handler对象来与Looper沟通 ...

  4. css之浮动

    标准文档流 将窗体自上而下分成一行行, 并在每行中按从左至右的顺序排放元素,即为文档流.每个非浮动块级元素都独占一行, 浮动元素则按规定浮在行的一端. 若当前行容不下, 则另起新行再浮动. 标准流的微 ...

  5. 基于Spring+SpringMVC+Mybatis的Web系统搭建

    系统搭建的配置大同小异,本文在前人的基础上做了些许的改动,重写数据库,增加依据权限的动态菜单的实现,也增加了后台返回json格式数据的配置,详细参见完整源码. 主要的后端架构:Spring+Sprin ...

  6. android EditText 默认情况下不获取焦点(不弹出输入框)

    可以在EditText前面放置一个看不到的LinearLayout,让它率先获取焦点: <LinearLayout android:focusable="true" andr ...

  7. 【FLUENT案例】03:冲蚀

    1 引子2 问题描述3 模型准备4网格5模型设置6 材料设置7 设定注入器8 修改材料9 Cell zone Conditions设置10 边界条件设置10.1 inlet入口设置10.2 出口设置1 ...

  8. 【转】XenServer的架构之Xenopsd组件架构与运行机制

    一.Xenopsd概述 Xenopsd是XenServer的虚拟机管理器. Xenopsd负责:启动,停止,暂停,恢复,迁移虚拟机:热插拔虚拟磁盘(VBD):热插拔虚拟网卡(VIF):热插拔虚拟PCI ...

  9. (转)socket Aio demo

    原文地址: https://my.oschina.net/tangcoffee/blog/305656 参考文档: http://my.oschina.net/u/862897/blog/164425 ...

  10. BZOJ 2440: [中山市选2011]完全平方数 [容斥原理 莫比乌斯函数]

    2440: [中山市选2011]完全平方数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3028  Solved: 1460[Submit][Sta ...