当前位置: 首页 > wzjs >正文

手机商城官网旗舰店seo优化排名平台

手机商城官网旗舰店,seo优化排名平台,网站维护包括哪些内容,智慧团建网站官网电脑版前言:我通过第一轮的苍穹外卖写完了,现在新的知识增加了一点,现在想用新知识来写一下,也可以巩固旧知识。 在第一篇已经写出来,可以把mysql,redis,nginx部署在我的虚拟机,就可以直接…

          前言:我通过第一轮的苍穹外卖写完了,现在新的知识增加了一点,现在想用新知识来写一下,也可以巩固旧知识。

        在第一篇已经写出来,可以把mysql,redis,nginx部署在我的虚拟机,就可以直接连接,有兴趣的可以看【苍穹外卖|第一篇】。

先保证项目可以正常运行起来,修改sky-server的application.xml文件

sky:datasource:driver-class-name: com.mysql.cj.jdbc.Driverhost: 192.168.111.100         #虚拟机的地址#    host: localhostport: 3306database: sky_take_outusername: rootpassword: rootredis:host: 192.168.111.100#    host: localhostport: 6380password: 123456database: 10

        修改application-dev.yml文件

server:port: 8080spring:profiles:active: devmain:allow-circular-references: truedatasource:druid:driver-class-name: ${sky.datasource.driver-class-name}url: jdbc:mysql://${sky.datasource.host}:${sky.datasource.port}/${sky.datasource.database}?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=trueusername: ${sky.datasource.username}password: ${sky.datasource.password}redis:host: ${sky.redis.host}port: ${sky.redis.port}password: ${sky.redis.password}database: ${sky.redis.database}mybatis:#mapper配置文件mapper-locations: classpath:mapper/*.xmltype-aliases-package: com.sky.entityconfiguration:#开启驼峰命名map-underscore-to-camel-case: truelogging:level:com:sky:mapper: debugservice: infocontroller: infosky:jwt:# 设置jwt签名加密时使用的秘钥admin-secret-key: itcast# 设置jwt过期时间admin-ttl: 7200000# 设置前端传递过来的令牌名称admin-token-name: token

        现在是苍穹外卖增加mybatis-plus,增加RedisUtil工具类。

        一、增加mybatis-plus

                1、导入maven依赖

                在父工程的pom.xml导入mabatis-plus的依赖

           <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.3.1</version></dependency>

                在 sky-server 和sky-pojo都需要导mybatis-plus依赖

        <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId></dependency>

                2、修改需要使用mybatis-plus的类

EmploeeMapper需要继承BaseMapper<Employee>

@Mapper
public interface EmployeeMapper extends BaseMapper<Employee>{}
EmployeeService 需要继承 IService<Employee>
public interface EmployeeService extends IService<Employee> {}
EmployeeServiceImpl继承ServiceImpl<EmployeeMapper, Employee>

@Service
public class EmployeeServiceImpl extends ServiceImpl<EmployeeMapper, Employee> implements EmployeeService {
}

        二、增加RedisUtil工具类

在utils增加RedisUtil

package com.sky.utils;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;@Component
public final class RedisUtil {@Autowiredprivate RedisTemplate redisTemplate;// =============================common============================/*** 指定缓存失效时间** @param key  键* @param time 时间(秒)* @return*/public boolean expire(String key, long time) {try {if (time > 0) {redisTemplate.expire(key, time, TimeUnit.SECONDS);}return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 根据key 获取过期时间** @param key 键 不能为null* @return 时间(秒) 返回0代表为永久有效*/public long getExpire(String key) {return redisTemplate.getExpire(key, TimeUnit.SECONDS);}/*** 判断key是否存在** @param key 键* @return true 存在 false不存在*/public boolean hasKey(String key) {try {return redisTemplate.hasKey(key);} catch (Exception e) {e.printStackTrace();return false;}}/*** 分布式锁** @param key 键* @param value 值* @return true 存在 false不存在*/public boolean setNx(String key,Object value){Boolean result = redisTemplate.opsForValue().setIfAbsent(key, value);return result != null && result;}/*** 分布式锁,设置自动失效** @param key 键* @param value 值* @return true 存在 false不存在*/public boolean setNx(String key,Object value,long secondsDuration){Boolean result = redisTemplate.opsForValue().setIfAbsent(key, value,secondsDuration,TimeUnit.SECONDS);return result != null && result;}/*** 删除缓存** @param key 可以传一个值 或多个*/@SuppressWarnings("unchecked")public void del(String... key) {if (key != null && key.length > 0) {if (key.length == 1) {redisTemplate.delete(key[0]);} else {redisTemplate.delete(CollectionUtils.arrayToList(key));}}}// ============================String=============================/*** 普通缓存获取** @param key 键* @return 值*/public Object get(String key) {return key == null ? null : redisTemplate.opsForValue().get(key);}/*** 普通缓存放入** @param key   键* @param value 值* @return true成功 false失败*/public boolean set(String key, Object value) {try {redisTemplate.opsForValue().set(key, value);return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 普通缓存放入并设置时间** @param key   键* @param value 值* @param time  时间(秒) time要大于0 如果time小于等于0 将设置无限期* @return true成功 false 失败*/public boolean set(String key, Object value, long time) {try {if (time > 0) {redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);} else {set(key, value);}return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 递增** @param key   键* @param delta 要增加几(大于0)* @return*/public long incr(String key, long delta) {if (delta < 0) {throw new RuntimeException("递增因子必须大于0");}return redisTemplate.opsForValue().increment(key, delta);}/*** 递减** @param key   键* @param delta 要减少几(小于0)* @return*/public long decr(String key, long delta) {if (delta < 0) {throw new RuntimeException("递减因子必须大于0");}return redisTemplate.opsForValue().increment(key, -delta);}// ================================Map=================================/*** HashGet** @param key  键 不能为null* @param item 项 不能为null* @return 值*/public Object hget(String key, String item) {return redisTemplate.opsForHash().get(key, item);}/*** 获取hashKey对应的所有键值** @param key 键* @return 对应的多个键值*/public Map<Object, Object> hmget(String key) {return redisTemplate.opsForHash().entries(key);}/*** HashSet** @param key 键* @param map 对应多个键值* @return true 成功 false 失败*/public boolean hmset(String key, Map<String, Object> map) {try {redisTemplate.opsForHash().putAll(key, map);return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** HashSet 并设置时间** @param key  键* @param map  对应多个键值* @param time 时间(秒)* @return true成功 false失败*/public boolean hmset(String key, Map<String, Object> map, long time) {try {redisTemplate.opsForHash().putAll(key, map);if (time > 0) {expire(key, time);}return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 向一张hash表中放入数据,如果不存在将创建** @param key   键* @param item  项* @param value 值* @return true 成功 false失败*/public boolean hset(String key, String item, Object value) {try {redisTemplate.opsForHash().put(key, item, value);return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 向一张hash表中放入数据,如果不存在将创建** @param key   键* @param item  项* @param value 值* @param time  时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间* @return true 成功 false失败*/public boolean hset(String key, String item, Object value, long time) {try {redisTemplate.opsForHash().put(key, item, value);if (time > 0) {expire(key, time);}return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 删除hash表中的值** @param key  键 不能为null* @param item 项 可以使多个 不能为null*/public void hdel(String key, Object... item) {redisTemplate.opsForHash().delete(key, item);}/*** 判断hash表中是否有该项的值** @param key  键 不能为null* @param item 项 不能为null* @return true 存在 false不存在*/public boolean hHasKey(String key, String item) {return redisTemplate.opsForHash().hasKey(key, item);}/*** hash递增 如果不存在,就会创建一个 并把新增后的值返回** @param key  键* @param item 项* @param by   要增加几(大于0)* @return*/public double hincr(String key, String item, double by) {return redisTemplate.opsForHash().increment(key, item, by);}/*** hash递减** @param key  键* @param item 项* @param by   要减少记(小于0)* @return*/public double hdecr(String key, String item, double by) {return redisTemplate.opsForHash().increment(key, item, -by);}// ============================set=============================/*** 根据key获取Set中的所有值** @param key 键* @return*/public Set<Object> sGet(String key) {try {return redisTemplate.opsForSet().members(key);} catch (Exception e) {e.printStackTrace();return null;}}/*** 根据value从一个set中查询,是否存在** @param key   键* @param value 值* @return true 存在 false不存在*/public boolean sHasKey(String key, Object value) {try {return redisTemplate.opsForSet().isMember(key, value);} catch (Exception e) {e.printStackTrace();return false;}}/*** 将数据放入set缓存** @param key    键* @param values 值 可以是多个* @return 成功个数*/public long sSet(String key, Object... values) {try {return redisTemplate.opsForSet().add(key, values);} catch (Exception e) {e.printStackTrace();return 0;}}/*** 将set数据放入缓存** @param key    键* @param time   时间(秒)* @param values 值 可以是多个* @return 成功个数*/public long sSetAndTime(String key, long time, Object... values) {try {Long count = redisTemplate.opsForSet().add(key, values);if (time > 0)expire(key, time);return count;} catch (Exception e) {e.printStackTrace();return 0;}}/*** 获取set缓存的长度** @param key 键* @return*/public long sGetSetSize(String key) {try {return redisTemplate.opsForSet().size(key);} catch (Exception e) {e.printStackTrace();return 0;}}/*** 移除值为value的** @param key    键* @param values 值 可以是多个* @return 移除的个数*/public long setRemove(String key, Object... values) {try {Long count = redisTemplate.opsForSet().remove(key, values);return count;} catch (Exception e) {e.printStackTrace();return 0;}}// ===============================list=================================public Object leftPop(String key){try {return redisTemplate.opsForList().leftPop(key);} catch (Exception e) {e.printStackTrace();return null;}}public Object rightPop(String key){try {return redisTemplate.opsForList().rightPop(key);} catch (Exception e) {e.printStackTrace();return null;}}public Object leftPush(String key,Object o){try {return redisTemplate.opsForList().leftPush(key,o);} catch (Exception e) {e.printStackTrace();return null;}}public Object rightPush(String key,Object o){try {return redisTemplate.opsForList().rightPush(key,o);} catch (Exception e) {e.printStackTrace();return null;}}public Object leftPushAll(String key,Collection collection){try {return redisTemplate.opsForList().leftPushAll(key,collection);} catch (Exception e) {e.printStackTrace();return null;}}public Object rightPushAll(String key,Collection collection){try {return redisTemplate.opsForList().rightPushAll(key,collection);} catch (Exception e) {e.printStackTrace();return null;}}/*** 获取list缓存的内容** @param key   键* @param start 开始* @param end   结束 0 到 -1代表所有值* @return*/public List<Object> lrange(String key, long start, long end) {try {return redisTemplate.opsForList().range(key, start, end);} catch (Exception e) {e.printStackTrace();return null;}}/*** 获取list缓存的长度** @param key 键* @return*/public long lsize(String key) {try {return redisTemplate.opsForList().size(key);} catch (Exception e) {e.printStackTrace();return 0;}}/*** 通过索引 获取list中的值** @param key   键* @param index 索引 index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推* @return*/public Object lGetIndex(String key, long index) {try {return redisTemplate.opsForList().index(key, index);} catch (Exception e) {e.printStackTrace();return null;}}/*** 将list放入缓存** @param key   键* @param value 值* @param time  时间(秒)* @return*/public boolean lSet(String key, Object value) {try {redisTemplate.opsForList().rightPush(key, value);return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 将list放入缓存** @param key   键* @param value 值* @param time  时间(秒)* @return*/public boolean lSet(String key, Object value, long time) {try {redisTemplate.opsForList().rightPush(key, value);if (time > 0)expire(key, time);return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 将list放入缓存** @param key   键* @param value 值* @param time  时间(秒)* @return*/public boolean lSet(String key, List<Object> value) {try {redisTemplate.opsForList().rightPushAll(key, value);return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 将list放入缓存** @param key   键* @param value 值* @param time  时间(秒)* @return*/public boolean lSet(String key, List<Object> value, long time) {try {redisTemplate.opsForList().rightPushAll(key, value);if (time > 0)expire(key, time);return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 根据索引修改list中的某条数据** @param key   键* @param index 索引* @param value 值* @return*/public boolean lUpdateIndex(String key, long index, Object value) {try {redisTemplate.opsForList().set(key, index, value);return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 移除N个值为value** @param key   键* @param count 移除多少个* @param value 值* @return 移除的个数*/public long lRemove(String key, long count, Object value) {try {Long remove = redisTemplate.opsForList().remove(key, count, value);return remove;} catch (Exception e) {e.printStackTrace();return 0;}}
}

        三、修改登录代码

在config包下增加RedisKeys

@Configuration
public class RedisKeys {public final static String LOGIN_PASSWORD_ERROR_KEY = "login:error:"; //密码错误的key}

修改登录代码     EmployeeController

@RestController
@RequestMapping("/admin/employee")
@Slf4j
public class EmployeeController {@Autowiredprivate EmployeeService employeeService;@Autowiredprivate JwtProperties jwtProperties;@Autowiredprivate RedisUtil redisUtil;/*** 登录** @param employeeLoginDTO* @return*/@PostMapping("/login")public Result<EmployeeLoginVO> login(@RequestBody EmployeeLoginDTO employeeLoginDTO) {log.info("员工登录:{}", employeeLoginDTO);//先判断用户有没有被锁Integer errortimes  = (Integer) redisUtil.get(RedisKeys.LOGIN_PASSWORD_ERROR_KEY + employeeLoginDTO.getUsername());if (errortimes != null && errortimes >=5){log.info("账户被锁定");throw  new AccountLockedException(MessageConstant.ACCOUNT_LOCKED);}//和数据库中的密码比对String username = employeeLoginDTO.getUsername();String password = employeeLoginDTO.getPassword();QueryWrapper<Employee> wrapper = new QueryWrapper<>();wrapper.eq("username",username).eq("password", DigestUtils.md5DigestAsHex(password.getBytes()));List<Employee> employeeList = employeeService.list(wrapper);//如果账号被后台锁定if (employeeList.size() >0 &&  employeeList.get(0).getStatus() == StatusConstant.DISABLE){throw new AccountLockedException(MessageConstant.ACCOUNT_LOCKED);}if (employeeList != null && employeeList.size() >0){//账号密码正确,生成jwt令牌并且返回给前端Employee employee = employeeList.get(0);//对消息脱敏//登录成功后,生成jwt令牌Map<String, Object> claims = new HashMap<>();claims.put(JwtClaimsConstant.EMP_ID, employee.getId());String token = JwtUtil.createJWT(jwtProperties.getAdminSecretKey(),jwtProperties.getAdminTtl(),claims);EmployeeLoginVO employeeLoginVO = EmployeeLoginVO.builder().id(employee.getId()).userName(employee.getUsername()).name(employee.getName()).token(token).build();//并且是去掉redis中的错误次数redisUtil.del(RedisKeys.LOGIN_PASSWORD_ERROR_KEY + username);return Result.success(employeeLoginVO);}else {//密码或账号错误,锁增加一次错误redisUtil.incr(RedisKeys.LOGIN_PASSWORD_ERROR_KEY+username,1);redisUtil.expire(RedisKeys.LOGIN_PASSWORD_ERROR_KEY+username,60*5);throw new PasswordErrorException(MessageConstant.PASSWORD_ERROR);}}/*** 退出** @return*/@PostMapping("/logout")public Result<String> logout() {return Result.success();}}

启动项目在浏览器输入192.168.111.100:8080  具体的可以看上一篇,登录成功。

http://www.dtcms.com/wzjs/835296.html

相关文章:

  • 合肥网站建设 八八四八房地产免费网站建设
  • 哪家手机网站建设中山有哪些网站建立公司
  • 网站建设暖色调网站的平面设计图用ps做
  • 站长之家 wordpress 流量统计抚州 提供网站建站 公司
  • 杭州怎么做网站个人网站设计过程
  • 大连 商城网站制作公司装修网站排行榜前十名有哪些
  • 网站建设网站制作哪家好上海发布公众号官网
  • 小微企业网站建设宁波网站制作报价
  • 网站培训班wordpress产品内页怎么排
  • 北京市工商注册登记网seo专家招聘
  • 禅城区企业网站建设百度推广电话
  • 湖南新备案的网站深圳网站建设网牛天下
  • 做网站看好金石网络空间设计英文
  • 河东做网站赣州兼职网站建设
  • 广州市网站建设制作设计平台建站系统源码下载
  • 网站开发前端制作上海网站建设选缘魁 -企查
  • 专业的app网站开发外贸网站建设平台优化营销推广
  • 家具展示型网站做网站多长时间
  • 西安查派网站建设泰安网站建设培训
  • 达州科创网站建设公司淘宝网站建设策划案
  • 新媒体管家wordpressseo指什么
  • 网站 html空间搭建wordpress
  • 网站建设用英文怎么说网站建设的实验心得体会
  • 临沂中小企业网站制作百度seo关键词优化推荐
  • 民宿行业网站建设方案安徽省建设厅网站
  • 如何找做网站的公司北京想象力网站建设公司
  • 建设银行官方网站企业网银新手做免费网站
  • 广西建设科技在线网站甘肃建设厅职称查询官方网站
  • 网站建设哪种语言好国家工商网官网登录入口
  • 网站的优化排名怎么做可以做软件的网站有哪些内容