基于Autofac框架+EF框架的MVC模式.Net项目总结。(架构、流程、技术栈)Part2:业务逻辑概要

开发业务逻辑的实现,业务关键要点记录,本人踩过的坑,优化的关键技术

1.登陆实现
1)废除旧思维
在以往的认知里面,登陆一般是直接校验账号密码登陆,除了防止sql注入漏洞之外,一般都是直接拿到用户输入的真实的账号密码去数据库检索,符合则是登陆成功,这样其实安全性很差的,试想一下,假如数据库被黑客入侵了,大量的账号密码信息可以随意被利用,如果涉及到支付业务后果是不可想象的!
所以数据库里面存放的不能是真正的密码,本人推荐的是封装成密码哈希值进行存放,而且在生成哈希值的时候给密码加盐,加盐是防止用户设置一些简单的密码,好比如有很多人把密码设置成123456,虽然本身MD5算法是不可逆的(有兴趣了解底层的可以参考MD5算法底层原理),他们经过md5生成的密文是也是相同的,所以黑客很容易根据经验反推原始密码,
密码哈希=(原始密码+盐)通过MD5算法生成,其中密码盐最好是设置成随机数之类的,用户实体类的属性都应该有密码盐
2)设置验证码和登陆次数,防止恶意访问和攻击增加服务器压力
设置验证码是为了防止一些黑客写脚本对账号进行恶意注册,我采用的是CaptchaGen这个组件,网上还有很多验证码组件,可以自行选用,一般都是生成 几个随机数,再生成文件图片流FileStream返回给客户端,还有一些拖动的验证码(好像是机器学习的一些算法可以识别出来是人拖动的?)验证码放在TempData里面而不是放在session里面,因为TempData读取一次就失效了,session的话30分钟才会失效,这里用于处理错误一次密码或者账号重新校验的时候保证TempData里面是最新的数据。
设置密码错误次数,可以设置固定时间之内密码错误多少次就不允许登陆,这里推荐下C#的TimeSpan,用来表示一个时间段,亲测不错,用时间间隔比较告知是否可以继续登陆,登陆之后把相关的信息记录带session
2.浏览主页信息,分页处理
为了降低系统的压力,好比如有1w条房源数据量,不可可能一次性加载出来吧?这显然不符合实际系统的承压情况,所以采用分页,在类库封装一个分页方法利用 StringBuilder 对字符串进行拼接,需要理解清楚的是页容量当前页总页数等等之间的关系
3.筛选功能实现
1).对属性进行排序或者筛选,类似如下
在这里插入图片描述
这里要实现这样,要自己封装一个函数,通过响应不同的要求动态生成相应的地址栏,底层方法借助NameValueCollection(方便判断)和StringBuilder(动态生成地址栏)

4.后台管理员上传图片/附件

1)一般的话用户上传量很少的时候,可以采用放在项目的目录底下,其实这样数量大了以后对服务器压力大,而且一旦磁盘位置出现故障,图片无法给用户呈现,所以这种方法,在业务量大了之后不再适用,而且读取速度没有上传至云服务器快。
2)采用云存储的优势,不用担心系统磁盘不够,或者坏掉,造成用户读取不了等等一系列问题,推荐阿里云/腾讯云等等,性价比还是很高的!!
在这里插入图片描述
还有一个很大的优势,就是读取速度,看下放在系统磁盘的读取情况在这里插入图片描述
也就是说无论在全国各地,无论距离如何,访问的地点都是同一个,这样距离远的用户的速度会很慢
来看下云存储的情况
在这里插入图片描述
这种自动匹配最近云存储服务器的特点是采用云存储给我们带来最大的好处
3)注意一些问题,给图片加水印,缩略图转换(注意流指针要归零)等等
。文件上传到 “年/ 月/ 日/md5. 后缀”,如果使用用户选择图片的文件名会有重名的问题,用md5 的好处(同一天上传同一个文件不会重复)。过经过 md5 运算后,指针在末尾,再写入就没的可写了,因此用stream.Position=0 指针归零。
5.权限管理模块
1)介绍一个叫RBAC模型的东西
在这里插入图片描述
通俗的说就是一个用户拥有多个角色,一个角色拥有多个权限项,这样就灵活地实现了权限控制,随时随地给用户配置权限
2)实现校验
这里运用到AOP的思维:通俗点是“一夫当关,万夫模块”,通过给方法标志属性,请求action的时候,先通过过滤器去校验,比如自定义 IAuthorizeFilter , 实现全局权限验证, 自定义一个[HasPermission(“User.Add”)]的 的 Attribute。 个 这样每次访问的时候检查当前用户请求的这个 Action 上标注的[HasPermission(“User.Add”)]),具体的搭建配置内容可以自行上网查找,
在这里插入图片描述
6.高并发抢单
1)描述下业务情形:当一个前台用户提交了预约,后台有多个管理员可以看到这个订单,会对这个订单进行抢夺。这样就产生了一个并发的问题!!
一般这种问题都是采用两个常用方法悲观锁和乐观锁(他们的底层原理和区别自行百度),悲观锁其实对系统性能损耗很大,原理就是给读取出来的数据加行锁,而且EF还不支持悲观锁(这才是最蛋疼的,只能写SQL),注意下悲观锁全程加锁解锁都在一个事务里面就行。
2)悲观锁容易引起死锁,而且性能低,大部分系统的特点都是“读多、写少”,因此除非特殊情况,否则都推荐使用乐观锁。本次项目我使用的是乐观锁,就是在设计实体类的时候加上类型的字段timestamp,MySQL在codefist的时候生成字段的时候有坑!!(注意注意),我更加推荐使用SQL server,他们两个在乐观锁的区别是MySQL生成的timestamp其实是一个时间戳,而SQL server生成的是一个 二进制数据保存的,原理是一样,实现有很大区别,MySQL特别在FluentAPI配置的时候坑巨多,采用SQL server实体类中对应的属性,类型要写成 byte[]。然后 FluentAPI 中配置: Property(e => e.RowVersion).IsRowVersion();
7.全文搜索
1)误区:大多数刚刚入门的人都是通过sql语句Like语句进行模糊匹配,这样的操作其实是很傻瓜化的,对表的所有数据都检索一遍,这样数据量大的话,系统会出现卡死等等情况
2)在这里我推荐使用Lucene引擎,基于 Lucene 的搜索引擎服务器,主要有 Solr、Elastic Search 等,这里的话我使用Elastic Search,这玩意配置的过程还是有点复杂的,而且需要用到Java的环境,简单说一下就是配置JAVA_HOME->配置环境变量指向->cmd运行bat脚本文件启动->安装.NetSDK等等步骤很多的。一般来说这个东西推荐跑在Linux上面,其实这个就是个数据库,而且是帮你建立好搜索索引的数据库,我实现的话主要是在新增数据的时候就拷贝一份放到这个引擎里面,关键字查找的时候再往这个引擎里面读取,注意这个引擎不能停掉,停掉就相当于关掉服务,不能运行了!!
3)具体用法自行百度,步骤太多了!
8.缓存和静态优化
缓存的话不推荐使用.net内置的缓存机制,上网查了一下是这个原因ASP.Net 内置的 Cache 是“内存 Cache”,是放到 Web 服务器中的,在多台 Web 服务器组成的集群中,无法实现共享。而且如果数据量大会占用 Web 服务器内存,网上有很多种缓存的方法比如redis和Memcached,各有优势和区别(自行百度)
2)我采用的是Memcached,和redis一样都是键值对存放,只不过这个的数据放在内存里面的,并不是想redis一样放在磁盘,我用这个是因为它的读取速度比redis快,ps:使用它的实体类记得把实体类进行可序列化[Serializable](坑!!!!)
3)每次数据读取一个数据,我都会先询问缓存有没有这个数据键值对,有的话直接读取,没有的话先直接读取数据库的,并且顺便把这个数据也存放到缓存
4)缓存是是降低服务器压力的一种方式(实质是数据库的压力,因为也是要通过服务器判断读取),但是这个方式也是频繁访问数据库的,我后来上网查找了另外一种优化的方法–生成静态页面
生成静态页面是我在每一个房源的详细信息在创建的时候都生成他的详细html页面,这里采用字符拼接的方法生成,而且把html文件也放在云存储服务器,先看下他们的区别
非静态:
在这里插入图片描述
静态:
在这里插入图片描述
这个方法适用于那些不经常改动而经常访问的页面比如一些广告新闻之类的,如果涉及银行支付业务的,最好还是不要使用,因为实时性不高!!!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值