【思路】-分页-双top分页算法的原理

描述:实现分页的一种算法
大致过程:访客访问不同的分页,为这个当前页生成动态的查询SQL,然后送到数据库中执行
输入:总条数,每页多少条,第几页,查询的SQL,排序的字段
注意:传入的排序字段需要构成唯一记录,这就意味着不能单独的使用SortOrder这个单独排序
字段反转:SortOrder asc,PostID desc;反转之后是SortOrder desc,PostID asc;

实现过程

  • 访问第一页
  • 访问最后一页
  • 访问前半数分页
  • 访问后半数分页

100条数据 每页显示4条 按照ID降序 排序
当取第一页时:直接对所有数据降序取出前4条
当取第二页时:
1.先按降序获得前8条数据,然后升序排列着8条数据,
2.这样第二页的数据直接跑到了前面,取出4条,
3.然后在倒叙回去就是第二页的数据

同样的以此往下类推

当后半数分页时:
当取最后一页时:将所有数据升序过来,取出前4条即可

观察生成的过程

访问前半数分页

访问后半数分页

https://zcxueyuan.blog.csdn.net/article/details/104037030

【思路】-单文件下载器

单文件下载器
功能描述:用来下载迅雷无法下载的资源,单线程操作
输入:一个http文本,要求每一个链接都是唯一的并且文件名不能重复,如果重复的话,下载之后文件会被覆盖掉

注意事项:要求保证充分的异常处理,保证cmd命令窗口不被退出
事项过程:文件流打开文本,循环读里面的每一行,得到下载地址,得到文件名,得到要保存的文件绝对路径,开始下载
扩展:记录下载失败的链接,并加入速度提示

【思路】-浏览次数功能设计

系统浏览次数
都见过这个东西,实现思路

用户访问某篇文章,将这个ViewCount加上1然后更新到数据库中去
都知道这个功能,访问量大的时候会挂掉数据库,所以上面那种实时更新数据库的方式都被淘汰了

实现思路:浏览次数缓存在系统的静态变量中,然后通过系统的定时器,每隔多长时间更新一次数据库,来解决上一种思路频繁的访问数据库带来的访问压力
所以是静态变量+定时器 这两个技术来解决上面这个问题

实现过程:使用字典类型的数据结构 int int 保存ID和Viewcount的数据
两个方法GetView和SetView 频繁的对这个数据结构做修改【因为是静态的,所以不会有什么阻塞,反正在内存中,你该怎么玩儿就怎么玩儿】

到时间之后,定时器会访问这个数据结构,执行一次事务方式的更新
注意点:记得更新成功之后,你需要重新对字典类型做一次加载,保证浏览次数和数据库的保持一致

难点来了:
如果页面做了静态的html缓存,看看上面这个功能还能用么?
这个时候访客访问的是你的html缓存内容,根本就不会执行你的后台 ViewCout++这个代码,你还能用么?

不行了,哈哈怎么办?听火星人说好像ajax这个东西可以呢,哈哈谁知道呢?骚年去试试吧。火星人给你提供了思路哦!!!
像我这种每天手敲文章的人还有多少,其实也挺快乐的,把自己的思想分享给大家,天天写其实会上瘾的哦
那我得到了多少好处呢?锻炼了自己的思维和写作能力,难道我通过这个赚取了百万的收益也会告诉你吗?哈哈说漏了

【思路】-【StaticHTML】

总结一下StaticHTML相关的问题
围绕几个点来写

用还是不用?
冲突的存在
放在前面还是后面?


StaticHTML:用来生成html代码的缓存,将请求的html结果直接以二进制的方式保存在一个文件中,当用户下载访问的时候,直接输出这个文件中的信息
输出方式:先输出响应头信息;然后输出响应体信息
适用场景:不变html网站;比如一些cms之类的 会提高响应能力

冲突
网站的一些浏览次数,登录状态,301的跳转都会失效

建议:放在url重写模块的前面,这样StaticHTML会首先拦截系统所有的请求,不用再经过url的重写系统,会极大的提高响应速度

【思路】-URL重写

URL重写
重写原理
过程分析
疑惑地方

lookfor app.Request.ApplicationPath 如果有子目录的话 这个地方可能会起到作用,暂时不确定
bool flag = url.IndexOf(‘.’) != -1; 标记,表示如果请求后缀包含“.”的我们才进行重写的执行

主要思路:使用筛选器拦截系统所有的请求,
第一步:去除掉不需要重写的请求
第二步:加载系统的重写配置规则
第三步:循环遍历每条规则,如果匹配使用系统的context.RewritePath函数将拦截的请求,转发到我们指定的ashx处理程序当中去
lookfor 到 sendto


注意地方

如何获得系统所有的请求呢?
使用app.Request.Path 【获取当前请求的虚拟路径】表示所用的来到系统当中的请求,通过识别这个值来断定请求是否转发
使用这个还有一个好处,它不带域名,可以实现二级域名的转发操作

循环判断每条规则
每一个请求到达系统当中,都需要匹配每一条规则,每次切换规则,都需要用正则表达式一个实例对象,一旦匹配成功直接跳出循环,这里是比较好性能的地方

正则注意点
完全匹配 ^$ 注意这两个符号,表示来完全匹配一个请求的虚拟路径,上面提到的Path

301的实现
301用来将非www的链接,重定向到www上面去,注意不仅仅是首页的非www跳转
是全站的跳转,所以这个地方的要求就在于必须在for规则循环判断里面写
实现的关键点是app.Request.Url.AbsoluteUri.ToLower(),识别这个绝对url,如果绝对url里面包含一条规则
http://abc.com|http://www.abc.com
也就是StartsWith http://abc.com 就应用301的函数
总结:URL的重写需要把握以上几个关键点,所以请思考
URL重写本质是什么?就是将一条请求路由到我们想路由的处理程序当中去
URL重写入口点在哪里?app.Request.Path 获得拦截的所有请求
URL重写是怎么识别判断的?通过正则表达式

重写后的参数处理
重写的url如果携带参数? 还是通过app.Request.Path

如何从lockfor中也就是重写的url中分离出请求相关的参数呢?
使用正则表达式的Replace函数,来做参数的分离,这个地方是个关键的地方

扩展1
301转发:系统拦截了所有的请求之后,那就可以对请求做任意的转发
扩展2
实现子目录的重写【思考中。。。】
主要的思路都清楚,但是有些细节的地方还不是特别的清楚

【思路】-思路模式

思路编写格式,可以从以下几个方面来描述

  • 输入
  • 输出
  • 功能描述
  • 思路分析
  • 注意事项
  • 扩展方面
  • 如何提问

思路分析法——一切都是思路

要获得一种思路

  • 第一步:首先要确定你的问题和需求
  • 第二步:分析筛选,可以实时的思路
  • 第三步:分步骤
  • 第四部:反复重复这一个过程【不断求证】
  • 第五步:关键点在哪里?
  • 总结:要让一切都可圈可点,而不仅仅都只是停留在大脑中

先把问题搞清楚

获得一个新思路比什么都重要

一个好的思路比什么都重要

先把需求搞清楚

有时候我不便于把一些东西说出来,比如为什么要这样做,要这样设计?只可意会不可言传吧。遇到这些的我只能表示抱歉了

其实还是和需求有关,你的需求是怎样的?你想要什么样儿?你就怎样设计?这就是是为什么要这样设计的原因

【思路】-分页条 分页下的导航条算法

实现:分页下的导航条算法

输入:总页数 ,每页显示条数,第几页,链接,中间页数

输出:一段固定的html代码,然后配合Css样式实现分页的效果

规则:

  • 当是第一页时:上一页处于禁用状态
  • 当是最后一页:下一页处于禁用状态
  • 当页数比较多时,中间显示省略号表示有很多页,防止分页条过长

分析过程

将整个分页条拆分出几个部分来组成

上一页

下一页

首页

最后一页

总条数

中间页面

这六个部分组成 其中首页和最后一页都是固定的

实现过程

第一步:

计算出总页数

总页数对每页显示条数求整运算,然后在做求余运算,余数大于0

就要在求整的结果上加上1

就得到总页数了

第二步:

每个步骤的链接

首页的链接是1,ReplaceStr(linkUrl, “id”, “1”)

最后一页的ID是总页数

上一页的链接是 当前页减去1

下一页的链接是 当前页加上1

第三步:

何时禁用按钮呢?

当当前页==1是 上一页禁用

当当期页==总页数是下一页禁用

难点在中间页码该如何计算处理

最后使用全局变量 逐个追加各个变量

扩展:

增加下拉框功能

增加快速跳转到多少页功能

分页条具有多种格式

比如

只显示上一页下一页,不展示中间页码【访客不知道我们网站到底有多少条数据】

【思路】-博客-自动发布功能设计思路-只说思路具体实现靠自己

VTSBlog自动发布

wordpress有自动发布的功能,我的实现过程是

在Post的表中设计一个PublishTime的字段 例如“2016-06-16 08:56:00”表示这个Post在这个时间开始发布

那么在前台调用数据的时候只需要让发布时间和当前时间做比对进行筛选,小于等于当前时间的就是已发布的,大于当前时间的就是未发布的

本质:就是一个比较时间大小的问题

自动发布:就是表中PublishTime字段按照一定的时间间隔来排列,这样每天查询出的数据都是最新的数据,从而实现自定发布的功能.

如何为系统中的所有Post实现自动的时间间隔呢?间隔时间的生成

问题:我想每天自动发布5条数据
比如有100条数据,我们想办法为这100条数据生成一段连续的时间间隔,就可以不用管网站了,每天都是自定发布

输入:起始发布时间,每天发布多少条,要发布的PostID列表
输出:每个PostID对应的发布时间

最后:采用批量更新的方式更新你的数据表,整个过程就完成了
这是一道数学题

100条数据每天发布5条,发布其实时间从今天00:00:00开始计算 就需要20天才能发布完
也就是100条数据生成20个发布时间间隔,每5个为一组,从二十个时间间隔中取出一个,直到完全取完

注意考虑:没有除尽的情况 101条的话就要21个发布时间间隔了
好了这个数学题思路我都说完了,还可以进行很多的扩展。

比如:设置间隔发布时间
有人说间隔时间怎么弄啊Datetime 有一个加天 加小时的函数。

【思路】-IP访问控制AccessControl-Httpmodule设计实现

IP访问控制AccessControl
用途:用来封杀访客的请求,基于访客IP的控制:可以访问?不可以访问?分时段访问?等等一些特殊的要求

实现思路如下
第一步:需要获得访客的IP,获取方式如下
通过.net内置的函数实现,可能没法知道访客是不是通过代理来访问的【当然也没必要做的那么死】
通过第三方的js代码,这种靠谱一些【需要访客在第一次访问我们网站的时候使用Ajax的方式将IP发送到我们的系统中去】
http://pv.sohu.com/cityjson?ie=utf-8
js代码这种方式也有可能不准备【不过要寻找到好的获取IP的第三方的扩展】
第二步:和我们系统中一个IP段,txt格式的做匹配
如果这个客户的IP在我们的IP访问段当中了,我们就做自己想做的事情

难点1:算法 IP和IP段匹配的过程
有几种实现的方式:
我采用了最笨的一种方法:效率比较低 但是非常好理解
如果一个IP在一个IP段内,它的四个值 必定是大于等于起始段 并且小于等于结束段 【每个值都是如此,不信你来找我】
所以我逐个判断IP的四个值,最终确定这个IP是不是在这个IP段中
难点2:IP范围数据量大
比如:禁止美国访客的访问;或者禁止中国的访客访问等等
光美国的IP的条数 就有5000多条,就意味着需要这个访客IP要在这5000数据中循环匹配5000多次,效率的话就不太好
需要优化这个算法,更快的执行判断
暂时想到的
1.5000条数据缓存在Memcahed中去,避免在当前的进程中占用过多的内存
2.分离中这些IP段的头一个值,和访客的IP的第一个值 在接下来做文章【设想中。。。未实现】
目的:就是尽量减少IP的匹配次数
扩展:既然可以做IP的访问控制,那也就可以通过UA来控制基于浏览设备的控制,骚年继续思考吧

【思路】-【ImagesRename】-检查图片是否存在的设计思路

重命名

输入主图列和详细图列【竖线分割的文件名】,图片源目录,
输出重命名之后的图片和新命名的主图名字和详细图名字【保存在E盘】

如果文件不存在,那么新名字一行将为空
读取Excel获得Reader,然后循环处理每一行
获得主图原名称,获得文件的扩展后缀,生成新的名字。命名方式:随机编号 ;基于主图名字;基于产品名字;
随机编号:采用时间命名,为了防止程序过快重复,追加一个后缀变量i,来保证新名字每个都是唯一的
主图名字:西欧字符有可能不能正确命名,采用一个函数,逐个过滤每个字符串,只保留a-z 0-9 空格,下划线,减号等字符,保证新名称 每一个都是唯一的
详细图:兼容zencart的命名格式,在主图的基础上追加”_“+i的方式生成

处理完成一列之后,如果图片重命名成功之后,在Stringbulider 变量中保存这个新名字,处理完成一行直接换行
先复制主图,主图复制完成之后在复制详细图
Path.GetExtension 可能因为字符的问题引发异常,所默认需要给一个默认的后缀名

如何保存生成之后的新的详细图列呢?
使用一个变量:复制成功之后就在整个变量上累加”|”,如果不成功就累加空
每次处理完一行之后,重新将整个变量置为空
可以扩展到任意后缀的文件重命名
增加复制成功的图片个数统计
用来校队图片文件数

检查


用来检查Excel图片列中的主图列在文件目录中都是存在的,防止图片不存在
循环读取Excel的每一行,获得名字,获得文件的路径地址,判断文件是否存在,如果不存在变量递增1
函数从第二行开始计算
最后检查变量如果不存在的图片为0,表示图片和名字一一对应上,大于0表示 名字和图片文件没有对象需要重命名

过滤


用来将图片文件从众多的图片中分离出来,保存在另一个目录
【前提】Excel列中保存的图片名字都不重复,必须在对图片重命名之后,才使用此功能
输入源目录 保存目录 数据Excel文件
循环读取Excel中的每一行,获得文件名,获得文件地址。判断存在,开始复制
分文件夹过滤
Excel中包含文件夹列:用来将图片分别复制到不同的文件夹中去
读取一行,读取文件名 读取文件名名
如果文件不存在,创建文件夹,开始复制文件

检查重复


输入一个Excel文件,将需要检查的一列命名成“重复”
用来检查Excel中的名字列是否有重复的,可以检查图片的下载链接
创建一个List集合,使用Contains函数,如果包含这个字符串就输出这个字符串
否则就添加到集合中去

创建文件
用来根据Excel中的表格数据,创建生成IndexFile和Resource表的SQL语句