购物车 mongoDB

离线购物车
离线的情况下,用户可以添加商品到购物车
因为此时用户未进行登录,所以系统不知道用户是谁,只能将购物车信息存放到浏览器的cookie中.
用户到购物车页面可以查看自己选择的商品
等用户登录后,离线购物车会和在线购物车进行合并,离线购物车的内容会被清空,等退出后再次查看购物车将是空的

编写一个判断某对象有没有的方法时,不要简单的返回TRUE或false,应该返回这个对象或返回null.这样就可以直接使用了

什么是跨域,不同的域之间调用就是跨域
协议,ip地址(域名),端口号有任何一个不同就是不同的域

CORS cross-origin resource sharing 跨域资源共享 是一种跨域解决方案

解决的具体步骤
1.被访问的资源内
需要设置响应头
response.setHeader(“Access-Control-Allow-Origin”,“具体访问的服务器地址”) 服务器地址也可以用*来表示谁都可以访问
如果允许访问服务器携带cookie及http认证信息的话还需加一个响应头
response.setHeader(“Access-Control-Allow-Credentials”,“true”)
2.AjAx请求中在请求路径后面添加{‘withCredentials’:true}与前面的地址之间用逗号隔开(这样ajax请求时就会携带cookie和http认证信息了,默认情况下ajax是不会携带这些信息的,即使服务器设置了允许携带认证信息的响应头也是不行的)

针对服务器端的跨域设置springMVC框架进行封装,只需要进行@CrossOrigin(origin=“服务器地址”)注解即可以,其中AllowCredentials默认是TRUE,仅仅写一下服务器地址就可以

在做购物车的时候出现一个问题,就是cookie信息都有,但是就是获取不到,经过反复检查,发现原来是ajax发送时参数写错了,所以导致服务器端的cookie发不过来,那么访问的时候也就不能携带cookie也就查询不到(说到底除了粗心,还是没有理解透彻为什么设置不上的问题)

做前端的angularJS的时候,切记不要直接拿着angularJS变量进行一些循环等操作.要定义铺变量进行操作,最后再赋值给angular变量

写代码一定写注释,不然稍微复杂一点的逻辑,一会就把自己绕晕了,自己之前写的什么也搞不清楚了

在security集成cas中,购物车页面分为未登录和已登录,未登录的时候可以访问cart.html页面,这是放行的,但是页面相关的增删改查不能放行,因为放行后就没有经过security,那么也就不知道是哪个用户了.但是没登录拦住了又不让访问,那么我们可以让这些路径可以被匿名用户访问,那么就既经过了security,又可以访问这些资源了(因为未登录的用户默认就具有匿名用户的权限)

在发送ajax请求的时候,post方法后面只能带一个对象,带两个就会报错了,如果想带多个可以把多个对象封装到map中,然后后端以@RequestBody接收 到map中,但是map里面放的是字符串,还需要再JSON解析成我们的类型,直接强转是不行的. 另外前端经常会报属性未定义异常,所以前端如果是个对象封装数据的话,一定先定义出来这个对象,以及其中属性先定义个默认值,避免属性未定义异常(因为不定义对象,直接调属性,程序会认为不是对象的东西是没这个属性的)

QR Code quick response code 快速响应码 二维码

二维码生成插件 qrious.min.js

二维码里面能存储信息(文字,甚至声音,视频等),一般存储的是一个url地址,扫描后就会前往指定的页面

同一个controller.js文件,当两个页面都使用时,对于每一个页面它就是一个新的js文件,两个页面之间的变量是不会相互关联的,不要想着a页面刚才有什么变量,b页面直接用,除非b页面也触发了相应的方法.所以严格来说不同的页面需要有不同的controller 不同页面之间传递参数通过路由的方式,不同域之间通过跨域请求

什么是秒杀,商品的价格较低,数量较少,购买有时间限制,短时间内访问量较大,并发量较高

秒杀商品的业务和正常商品的业务要分开,以免秒杀业务影响到正常业务,秒杀的表都是单独的,秒杀商品表,秒杀订单表.

秒杀因为瞬时的并发访问量较大,所以要使用缓存以减小数据库的访问压力,此时部署redis集群的话至少部署6台,其中两两备份.

js代码在页面初次加载的时候就会整体的执行一次,其中的方法被触发时才执行,但是alert\赋值动作等就会直接执行,所以注意一些方法书写的位置,要写在方法里的千万不要写在外面,那么会直接报错的

定时任务:规定什么时候触发,干什么事情(执行什么程序)
spring框架中有springtask 创建一个web项目
使用步骤
1.扫描包作为springtask的组件
2.打开springtask注解驱动 task:annotation-driven
3.创建一个类 @Component
4.类中创建一个方法 @Scheduled注解,里面写cron表达式 (* * * * * ?) 每隔一秒执行一次方法里的内容

cron表达式 是6个或者7个域组成的字符串,域之间用空格隔开 最后一个是year的意思,可写可不写
其它字段分别代表的意思是 秒 分钟 小时 一个月的第几天 月份 一周的第几天

    • / , 是通用的字符 每月的第几天和一周的第几天还有别的字符,其它的域就只有这几个字符
      *代表所有取值 -代表范围取值 ,代表并列的关系 2/3代表 从2开始 每隔3执行一次
      ?只能用于每月的第几天 和每周的第几天 代表任意的意思,但是实际执行并不会都执行,因为它们两个会互相干扰,以确定的一方为准,不确定的一方用?
      L最后的意思,用于 每月的第几天 和每周的第几天 这两个域 代表 最后一天 而每周的第几天中用5L 代表最后一个周四
      W只能用于 dayOfMonth 代表工作日的意思,它会就近寻找 5w 如果5日是工作日,那5日就会执行, 如果5日是周六,那么4日执行 如果5日是周日,那么周一执行 但是不会跨月
      LW这两个字符可以连用,表示每月最后一个工作日
      #用于确定每月的第几个星期几 4#2 即表示每月的第二个星期三 星期是以周日开始的

boundHash.delete() 里面放的是key,不是value

mavenprofile解决的问题是,项目里不同的环境下使用不同的配置文件
如项目的端口号我们可以不固定写 而用${port}来定义
在中定义好9105那么就会按照9105来运行,这是默认的运行端口
那么如果有测试,开发,生产多个运行环境的话,可以配置,这样在运行mvn 时 mvn clean install tomcat7:run -P test 就按照test的端口运行了,其他的也是一样 如果不写-P 那么按照默认的执行


dev

9105


test

9106


mavenfilter的使用

dev



dev

dev



test

test


src/main/resources/filter/${env}_db.properties src/main/resources true

根据profile中定义的环境变量,就会过滤出需要的配置文件进行加载,达到不同的环境使用不同的数据库的目的 在resource文件夹下创建一个filter文件夹,里面放置不同环境下的数据库连接参数,而真正的数据库连接文件中value则使用${}变量来表示.

注册中心地址在每个web及service项目中都有,如果发生变化需要一个一个的去改,为此可以将它提取到工具类模块中,建立一个单独的dubbo.properties 和spring_dubbo.xml 然后还可以继续将dubbo.properties中的address的value配置成变量,在filter文件中建立不同环境的地址,在pom文件中再配置上面的profile filter那一套整个环境就都配置成可切换环境的状态了(前提是把可不可以加载的情况搞清楚,web和service的包名称不一致,web没有配置classpath*:properties/*.properties)

MongoDB是一个NOSQL的面向文档数据库 模式自由无需建表 mongoDB是面向集合的 它支持的数据结构非常松散是类似Json的Bson格式的数据,因此可以存储较复杂的数据类型 使用高效的二进制数据进行存储

用户的评价和收藏信息都放在mongoDB中

mongoDB的体系结构 逻辑结构database collection document 三部分构成 类似于关系型数据库的 数据库 表 和表数据的关系

mongodb的操作, use 数据库名便可以进入数据库 若不存在则创建
r={name:‘zhangsan’,age:18} 则定义了一个变量

增加:
db.student.save® 则将数据存入了student这个集合中 若不存在这个集合则创建这个集合
也可以不定义变量直接 db.student.save({name:‘zhangsan’,age:18}) 添加后自动生成一个 objectId类型的主键 也可以在创建的时候定义一个支持的主键类型

删除:db.student.remove({name:‘zhangsan’}) 只要满足此条件的都会删除

查询:
db.student.find() 查询所有
db.student.findOne() 查询一个
db.student.find({name:‘zhangsan’}) 查询所有满足条件的
db.student.findOne({name:‘zhangsan’}) 查询满足条件的第一个 .limit(2) 限制返回的个数

修改:
db.student.update({name:‘zhangsan’},{age:18}) 这样会将满足条件的都修改成后面的内容 如果想修改满足条件的文档年龄,那么这么写
db.student.update({name:‘zhangsan’},{$set:{age:18}})

模糊查询:是通过正则表达式来实现的
db.student.find({name:/八/}) 查询名字里面带八的
db.student.find({name:/^八/}) 查询名字以八开头的

null值的处理
修改的话直接将某字段设置为null便可以 db.student.update({name:‘zhangsan’},{age:null})
查询的话会将该字段为null 以及没有该字段的内容都查询出来 db.student.find({age:null})

大于小于 $gt大于 $lt小于 $gte 大于等于 $lte小于等于 KaTeX parse error: Expected '}', got 'EOF' at end of input: …ent.find({age:{gt:18}}) 查询年龄大于18 的

判断字段是否存在 KaTeX parse error: Expected '}', got 'EOF' at end of input: …ent.find({age:{exists:true}}) 查询年龄存在的内容

包含与不包含 $in KaTeX parse error: Expected '}', got 'EOF' at end of input: …ent.find({age:{in:[20,30,40]}}) 查询年龄是20,30,40的内容

统计
db.student.count() 查询student集合中文档的数量
db.student.count({age:18}) 查询student集合中年龄是18的文档的数量

多条件查询 并且 $and 或者 KaTeX parse error: Expected '}', got 'EOF' at end of input: …student.count({and:[{age:18},{address:/大/}]}); 查询年龄18并且地址中含"大"的内容

MongoDB默认使用的数字类型是64位的浮点型数值 8字节

java操作mongodb直接导入mongodb的驱动jar包就可以 mongodb-driver org.mongodb 创建客户端,获取数据库 获取collection 操作集合

mongodb的查询条件用 BasicDBObject封装 参数是key value

模糊查询还是用正则表达式 Pattern pattern=Pattern.compile("^.唐.$") 将正则表达式传入value中

而大于小于 或者 并且使用 basicDBObject的嵌套

插入数据是 insertOne(doc) 可以将map数据 填充到Document的构造函数中

删除数据则是 deleteOne(bosn) 删除满足条件的数据

修改数据则是传入两个bosn值,第一个是查询条件 第二个是嵌套的bosn

MongoClient被设计成线程安全的类,也就是在使用的时候我们不用考虑并发的问题,把mongoClient做成一个静态的变量,供线程公用,这用不用每次销毁,极大的提高了使用效率.这是mongoDB提供了内置的连接池来实现的

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值