09、搭建门户网站子模块、运营商广告列表的实现、广告CRUD、广告状态修改、门户网站轮播图广告、实现广告排序,状态等条件的设定、Linux安装redis、广告列表保存到redis、广告数据同步问题

搭建门户网站子模块

在父工程下新建门户子模块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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值