搭建门户网站子模块
在父工程下新建门户子模块protal—web
注意springmvc.xml文件中需要对dubbo进行设置
导入静态原型,controller实现类等文件。
搭建广告service模块
1、在父工程下引入两个子模块,分别是广告content的service接口,一个是广告content的service的Impl实现类。
注意:在实现类的pom文件中,添加一个Tomcat的配置,
2、导入对应的content广告的接口和实现类。
运营商(manager-web)广告列表的展示
一、前端部分
1、在content.html页面中引入js文件,这里需要分页的配置
<script src="../plugins/angularjs/angular.min.js"></script>
<script type="text/javascript" src="../plugins/angularjs/pagination.js"></script>
<link rel="stylesheet" href="../plugins/angularjs/pagination.css">
<script src="../js/base_pagination.js"></script>
<script src="../js/service/contentService.js"></script>
<script src="../js/service/uploadService.js"></script>
<script src="../js/service/contentCategoryService.js"></script>
<script src="../js/controller/baseController.js"></script>
<script src="../js/controller/contentController.js"></script>
2、在页面进行模型绑定和init方法的绑定
注意:由于使用了分页的配置,所以不需要在init中写默认方法就可以实现自动搜索所有的列表信息。
在页面下方添加分页的配置
3、在js的controller和service中添加对应的方法
注意:我们要显示所有的广告信息,需要在页面加载时查询所有的广告信息,并将对象放入list的模型对象中。
流程分析:当页面改变时,baseController.js分页配置中的onchange方法执行。调用reloadList方法,reloadList方法调用search方法,执行contentController.js文件中的search方法。
二、后端部分
常规操作。
广告新增商品分类下拉列表的显示
在点击新增上商品后,会弹出窗口,有一个下拉菜单可以选择广告所属的分类
一、前端部分
1、页面的模型绑定,需要使用ng-options标签
2、init中添加默认方法findCategoryList
3、在js文件contentController.js中引入contentCategoryService
4、调用contentCategoryService中的findAll方法
二、后端部分
引入对应的controller类后常规操作。
广告新增的实现
1、页面模型绑定
略
仅需注意是否生效的状态勾选。在页面中勾选是true,没勾选是false。
但是数据库中设置的输入长度为1。所有在前端需要进行值判断。勾选是1,没勾选是0;
2、保存按钮绑定方法
略
广告修改
页面的修改按钮调用findOne方法即可,传入id。
修改保存和新建保存使用的是同一个save方法,在controller会做id时候存在的判断,如 果存在代表是修改,不存在代表是新增。代码如下:
//保存
$scope.save=function(){
var serviceObject;//服务层对象
if($scope.entity.id!=null){//如果有ID
serviceObject=contentService.update( $scope.entity ); //修改
}else{
serviceObject=contentService.add( $scope.entity );//增加
}
serviceObject.success(
function(response){
if(response.success){
//重新查询
$scope.reloadList();//重新加载
}else{
alert(response.message);
}
}
);
}
广告删除
一、前端部分
1、在页面按钮绑定删除方法
2、在复选框添加项selectIds数组添加id的方法
3、在js文件controller定义删除方法
二、后端部分
1、在impl层遍历数组删除所有广告对象
门户网站根据分类id获取分类下的所有广告
一、前端部分
1、页面模型绑定
注意图片中的其中一张的标签要添加active,表示默认第一张。
使用了前端页面的三元运算符
2、由于不使用分页,所以在init中添加方法findByParentId,由于是轮播广告,所以传入固定值1。
3、在js文件中添加对应方法
controller
app.controller('contentController',function ($scope, contentService) {
//根据分类id获取该分类下的所有列表数据
$scope.findByCategoryId =function (id) {
contentService.findByCategoryId(id).success(
function (response) {
$scope.list = response;
//alert(JSON.stringify($scope.list)); //json对象转字符串
}
)
}
})
service
app.service('contentService',function ($http) {
//查询该分类下的所有广告数据
this.findByCategoryId = function (id) {
return $http.get('content/findByCategoryId.do?id='+id);
}
})
二、后端部分
在模块中新建controller类,添加对应方法
注意:为了使用ContentService,需要引入content-service模块
package com.pinyougou.protal.controller;
import com.alibaba.dubbo.config.annotation.Reference;
import com.pinyougou.content.service.ContentService;
import com.pinyougou.pojo.TbContent;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("/content")
public class ContentController {
@Reference
private ContentService contentService;
/**
* 根据分类id获取该分类下的所有广告数据
* @param id
* @return
*/
@RequestMapping("/findByCategoryId")
public List<TbContent> findByCategoryId(Long id){
return contentService.findByCategoryId(id);
}
}
实现广告排序,状态等条件的设定
在content的serviceImpl实现类中添加条件实现筛选
Linux安装redis
1、将linux版的安装包赋值到soft目录下,解压到当前soft目录。
2、进入解压后的文件夹中,执行安装指令,指令和指定的目录是:
make install PREFIX=/usr/local/redis-cluster/redis
3、打开安装好的文件目录,将解压出来的文件夹中的redis-conf文件复制进来。
4、在安装好的目录下,打开bin文件夹,执行命令redis-server运行,出现如下图示,即代表开启完成。
广告列表保存到redis
1、将redis-config.properties配置文件放入common模块中,引入common模块
redis-config.properties配置文件全文如下:(密码空指的是没有空格,不能加空格)
# Redis settings
# server IP
redis.host=192.168.25.128
# server port
redis.port=6379
# server pass
redis.pass=
# use dbIndex
redis.database=0
# \u63A7\u5236\u4E00\u4E2Apool\u6700\u591A\u6709\u591A\u5C11\u4E2A\u72B6\u6001\u4E3Aidle(\u7A7A\u95F2\u7684)\u7684jedis\u5B9E\u4F8B
redis.maxIdle=300
# \u8868\u793A\u5F53borrow(\u5F15\u5165)\u4E00\u4E2Ajedis\u5B9E\u4F8B\u65F6\uFF0C\u6700\u5927\u7684\u7B49\u5F85\u65F6\u95F4\uFF0C\u5982\u679C\u8D85\u8FC7\u7B49\u5F85\u65F6\u95F4(\u6BEB\u79D2)\uFF0C\u5219\u76F4\u63A5\u629B\u51FAJedisConnectionException\uFF1B
redis.maxWait=3000
# \u5728borrow\u4E00\u4E2Ajedis\u5B9E\u4F8B\u65F6\uFF0C\u662F\u5426\u63D0\u524D\u8FDB\u884Cvalidate\u64CD\u4F5C\uFF1B\u5982\u679C\u4E3Atrue\uFF0C\u5219\u5F97\u5230\u7684jedis\u5B9E\u4F8B\u5747\u662F\u53EF\u7528\u7684
redis.testOnBorrow=true
2、在需要使用redis的contentServiceImpl中添加applicationContext-redis.xml配置文件
applicationContext-redis.xml配置文件全文如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:cache="http://www.springframework.org/schema/cache"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/cache
http://www.springframework.org/schema/cache/spring-cache.xsd">
<context:property-placeholder location="classpath*:properties/*.properties" />
<!-- redis 相关配置 -->
<bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxIdle" value="${redis.maxIdle}" />
<property name="maxWaitMillis" value="${redis.maxWait}" />
<property name="testOnBorrow" value="${redis.testOnBorrow}" />
</bean>
<bean id="JedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
p:host-name="${redis.host}" p:port="${redis.port}" p:password="${redis.pass}" p:pool-config-ref="poolConfig"/>
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
<property name="connectionFactory" ref="JedisConnectionFactory" />
</bean>
</beans>
applicationContext-service.xml配置文件全文如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<dubbo:protocol name="dubbo" port="20882"></dubbo:protocol>
<dubbo:application name="myApplication-content-service"/>
<dubbo:registry address="zookeeper://192.168.25.128:2181"/>
<dubbo:annotation package="com.myApplication.content.service.impl"/>
</beans>
3、在contentServiceImpl实现类中引入RedisTemplate对象。
4、在查找广告全部分类时,先从redis中判断,如果没有再去数据库中查找,将查到的结果再放到redis数据库中。
广告数据同步问题
分析:当后台对广告进行了增删改,先放在redis中的数据不会改变,造成了数据不同步的现象。解决办法:在对应方法上,添加使数据同步的代码。
增加:
删除:
注意:需要先查找,再删除,否则都删除了,查不到了。
修改更新:
注意:最为特殊
注意:在修改时,可能会修改分类,当我们清空缓存时,清空的是新分类下的缓存。
新分类下是正确的。但是原先分类中没有删除,相当于原来分类中多了一个
解决办法:在更新之前先查找出这个分类,在完成更新后将两个分类id进行比对,
如果不相同,需要将原来分类的id缓存也请清空
Redis常用命令集
1)连接操作命令
quit:关闭连接(connection)
auth:简单密码认证
help cmd: 查看cmd帮助,例如:help quit
2)持久化
save:将数据同步保存到磁盘
bgsave:将数据异步保存到磁盘
lastsave:返回上次成功将数据保存到磁盘的Unix时戳
shundown:将数据同步保存到磁盘,然后关闭服务
3)远程服务控制
info:提供服务器的信息和统计
monitor:实时转储收到的请求
slaveof:改变复制策略设置
config:在运行时配置Redis服务器
4)对value操作的命令
exists(key):确认一个key是否存在
del(key):删除一个key
type(key):返回值的类型
keys(pattern):返回满足给定pattern的所有key
randomkey:随机返回key空间的一个
keyrename(oldname, newname):重命名key
dbsize:返回当前数据库中key的数目
expire:设定一个key的活动/生存时间(s)
ttl:获得一个key的活动/生存时间
select(index):按索引查询
move(key, dbindex):移动当前数据库中的key到dbindex数据库
flushdb:删除当前选择数据库中的所有key
flushall:删除所有数据库中的所有key
5)String
set(key, value):给数据库中名称为key的string赋予值value
get(key):返回数据库中名称为key的string的value
getset(key, value):给名称为key的string赋予上一次的value
mget(key1, key2,…, key N):返回库中多个string的value
setnx(key, value):添加string,名称为key,值为value
setex(key, time, value):向库中添加string,设定过期时间time
mset(key N, value N):批量设置多个string的值
msetnx(key N, value N):如果所有名称为key i的string都不存在
incr(key):名称为key的string增1操作
incrby(key, integer):名称为key的string增加integer
decr(key):名称为key的string减1操作
decrby(key, integer):名称为key的string减少integer
append(key, value):名称为key的string的值附加value
substr(key, start, end):返回名称为key的string的value的子串
6)List
rpush(key, value):在名称为key的list尾添加一个值为value的元素
lpush(key, value):在名称为key的list头添加一个值为value的 元素
llen(key):返回名称为key的list的长度
lrange(key, start, end):返回名称为key的list中start至end之间的元素
ltrim(key, start, end):截取名称为key的list
lindex(key, index):返回名称为key的list中index位置的元素
lset(key, index, value):给名称为key的list中index位置的元素赋值
lrem(key, count, value):删除count个key的list中值为value的元素
lpop(key):返回并删除名称为key的list中的首元素
rpop(key):返回并删除名称为key的list中的尾元素
blpop(key1, key2,… key N, timeout):lpop命令的block版本。
brpop(key1, key2,… key N, timeout):rpop的block版本。
rpoplpush(srckey, dstkey):返回并删除名称为srckey的list的尾元素,并将该元素添加到名称为dstkey的list的头部
7)Set
sadd(key, member):向名称为key的set中添加元素member
srem(key, member) :删除名称为key的set中的元素member
spop(key) :随机返回并删除名称为key的set中一个元素
smove(srckey, dstkey, member) :移到集合元素
scard(key) :返回名称为key的set的基数
sismember(key, member) :member是否是名称为key的set的元素
sinter(key1, key2,…key N) :求交集
sinterstore(dstkey, (keys)) :求交集并将交集保存到dstkey的集合
sunion(key1, (keys)) :求并集
sunionstore(dstkey, (keys)) :求并集并将并集保存到dstkey的集合
sdiff(key1, (keys)) :求差集
sdiffstore(dstkey, (keys)) :求差集并将差集保存到dstkey的集合
smembers(key) :返回名称为key的set的所有元素
srandmember(key) :随机返回名称为key的set的一个元素
8)Hash
hset(key, field, value):向名称为key的hash中添加元素field
hget(key, field):返回名称为key的hash中field对应的value
hmget(key, (fields)):返回名称为key的hash中field i对应的value
hmset(key, (fields)):向名称为key的hash中添加元素field
hincrby(key, field, integer):将名称为key的hash中field的value增加integer
hexists(key, field):名称为key的hash中是否存在键为field的域
hdel(key, field):删除名称为key的hash中键为field的域
hlen(key):返回名称为key的hash中元素个数
hkeys(key):返回名称为key的hash中所有键
hvals(key):返回名称为key的hash中所有键对应的value
hgetall(key):返回名称为key的hash中所有的键(field)及其对应的value