9,mongodb实现文档操作
1,环境准备
1、下载Mongodb安装包,下载地址:https://fastdl.mongodb.org/win32/mongodb-win32-x86_64-2008plus-ssl-3.2.21-signed.msi
2、
3、
4、在安装路径下创建mongod.cfg配置文件
systemLog:
destination: file
path: D:\developer\env\MongoDB\data\log\mongod.log
storage:
dbPath: D:\developer\env\MongoDB\data\db
5、安装为服务(运行命令需要用管理员权限)
6、服务相关命令
启动服务:net start MongoDB
关闭服务:net stop MongoDB
移除服务:D:\developer\env\MongoDB\bin\mongod.exe --remove
7、下载客户端程序:https://download.robomongo.org/1.2.1/windows/robo3t-1.2.1-windows-x86_64-3e50a65.zip
8、解压到指定目录,打开robo3t.exe并连接到localhost:27017
2、代码部分
2.1、config
GlobalCorsConfig
package com.macro.mall.portal.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
/**
* 全局跨域相关配置
* Created by macro on 2019/7/27.
*/
@Configuration
public class GlobalCorsConfig {
/**
* 允许跨域调用的过滤器
*/
@Bean
public CorsFilter corsFilter() {
CorsConfiguration config = new CorsConfiguration();
//允许所有域名进行跨域调用
config.addAllowedOrigin("*");
//允许跨越发送cookie
config.setAllowCredentials(true);
//放行全部原始头信息
config.addAllowedHeader("*");
//允许所有请求方法跨域调用
config.addAllowedMethod("*");
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", config);
return new CorsFilter(source);
}
}
JacksonConfig
package com.macro.mall.portal.config;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
/**
* Jackson相关配置类
* json不返回null的字段
* Created by macro on 2018/8/2.
*/
@Configuration
public class JacksonConfig {
@Bean
@Primary
@ConditionalOnMissingBean(ObjectMapper.class)
public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
ObjectMapper objectMapper = builder.createXmlMapper(false).build();
// 通过该方法对mapper对象进行设置,所有序列化的对象都将按改规则进行系列化
// Include.Include.ALWAYS 默认
// Include.NON_DEFAULT 属性为默认值不序列化
// Include.NON_EMPTY 属性为 空("") 或者为 NULL 都不序列化,则返回的json是没有这个字段的。这样对移动端会更省流量
// Include.NON_NULL 属性为NULL 不序列化,就是为null的字段不参加序列化
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
// 字段保留,将null值转为""
// objectMapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>()
// {
// @Override
// public void serialize(Object o, JsonGenerator jsonGenerator,
// SerializerProvider serializerProvider)
// throws IOException, JsonProcessingException
// {
// jsonGenerator.writeString("");
// }
// });
return objectMapper;
}
}
MallSecurityConfig
package com.macro.mall.portal.config;
import com.macro.mall.portal.service.UmsMemberService;
import com.macro.mall.security.config.SecurityConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.core.userdetails.UserDetailsService;
/**
* mall-security模块相关配置
* Created by macro on 2019/11/5.
*/
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class MallSecurityConfig extends SecurityConfig {
@Autowired
private UmsMemberService memberService;
@Bean
public UserDetailsService userDetailsService() {
//获取登录用户信息
return username -> memberService.loadUserByUsername(username);
}
}
MyBatisConfig
package com.macro.mall.portal.config;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
/**
* MyBatis相关配置
* Created by macro on 2019/4/8.
*/
@Configuration
@EnableTransactionManagement
@MapperScan({"com.macro.mall.mapper","com.macro.mall.portal.dao"})
public class MyBatisConfig {
}
SpringTaskConfig
package com.macro.mall.portal.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
/**
* 定时任务相关配置
* Created by macro on 2019/4/8.
*/
@Configuration
@EnableScheduling
public class SpringTaskConfig {
}
SwaggerConfig
package com.macro.mall.portal.config;
import com.macro.mall.common.config.BaseSwaggerConfig;
import com.macro.mall.common.domain.SwaggerProperties;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
/**
* Swagger2API文档的配置
* Created by macro on 2018/4/26.
*/
@Configuration
@EnableSwagger2
public class SwaggerConfig extends BaseSwaggerConfig {
@Override
public SwaggerProperties swaggerProperties() {
return SwaggerProperties.builder()
.apiBasePackage("com.macro.mall.portal.controller")
.title("mall前台系统")
.description("mall前台相关接口文档")
.contactName("macro")
.version("1.0")
.enableSecurity(true)
.build();
}
}
2.2、domain
MemberDetails
package com.macro.mall.portal.domain;
import com.macro.mall.model.UmsMember;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import java.util.Arrays;
import java.util.Collection;
/**
* 会员详情封装
* Created by macro on 2018/8/3.
*/
public class MemberDetails implements UserDetails {
private UmsMember umsMember;
public MemberDetails(UmsMember umsMember) {
this.umsMember = umsMember;
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
//返回当前用户的权限
return Arrays.asList(new SimpleGrantedAuthority("TEST"));
}
@Override
public String getPassword() {
return umsMember.getPassword();
}
@Override
public String getUsername() {
return umsMember.getUsername();
}
@Override
public boolean isAccountNonExpired() {
return true;
}
@Override
public boolean isAccountNonLocked() {
return true;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
return umsMember.getStatus()==1;
}
public UmsMember getUmsMember() {
return umsMember;
}
}
MemberReadHistory
package com.macro.mall.portal.domain;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.Document;
import java.util.Date;
/**
* 用户商品浏览历史记录
* Created by macro on 2018/8/3.
*/
@Document
public class MemberReadHistory {
@Id
private String id;
@Indexed
private Long memberId;
private String memberNickname;
private String memberIcon;
@Indexed
private Long productId;
private String productName;
private String productPic;
private String productSubTitle;
private String productPrice;
private Date createTime;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public Long getMemberId() {
return memberId;
}
public void setMemberId(Long memberId) {
this.memberId = memberId;
}
public String getMemberNickname() {
return memberNickname;
}
public void setMemberNickname(String memberNickname) {
this.memberNickname = memberNickname;
}
public String getMemberIcon() {
return memberIcon;
}
public void setMemberIcon(String memberIcon) {
this.memberIcon = memberIcon;
}
public Long getProductId() {
return productId;
}
public void setProductId(Long productId) {
this.productId = productId;
}
public String getProductName() {
return productName;
}
public void setProductName(String productName) {
this.productName = productName;
}
public String getProductPic() {
return productPic;
}
public void setProductPic(String productPic) {
this.productPic = productPic;
}
public String getProductSubTitle() {
return productSubTitle;
}
public void setProductSubTitle(String productSubTitle) {
this.productSubTitle = productSubTitle;
}
public String getProductPrice() {
return productPrice;
}
public void setProductPrice(String productPrice) {
this.productPrice = productPrice;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
}
2.3、CacheException
package com.macro.mall.security.annotation;
import java.lang.annotation.*;
/**
* 自定义注解,有该注解的缓存方法会抛出异常
*/
@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CacheException {
}
2.4、repository
package com.macro.mall.portal.repository;
import com.macro.mall.portal.domain.MemberReadHistory;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.repository.MongoRepository;
/**
* 会员商品浏览历史Repository
* Created by macro on 2018/8/3.
*/
public interface MemberReadHistoryRepository extends MongoRepository<MemberReadHistory,String> {
Page<MemberReadHistory> findByMemberIdOrderByCreateTimeDesc(Long memberId, Pageable pageable);
void deleteAllByMemberId(Long memberId);
}
2.5、service
MemberReadHistoryService
package com.macro.mall.portal.service;
import com.macro.mall.portal.domain.MemberReadHistory;
import org.springframework.data.domain.Page;
import java.util.List;
/**
* 会员浏览记录管理Service
* Created by macro on 2018/8/3.
*/
public interface MemberReadHistoryService {
/**
* 生成浏览记录
*/
int create(MemberReadHistory memberReadHistory);
/**
* 批量删除浏览记录
*/
int delete(List<String> ids);
/**
* 分页获取用户浏览历史记录
*/
Page<MemberReadHistory> list(Integer pageNum, Integer pageSize);
/**
* 清空浏览记录
*/
void clear();
}
UmsMemberCacheService
package com.macro.mall.portal.service;
import com.macro.mall.model.UmsMember;
/**
* 会员信息缓存业务类
* Created by macro on 2020/3/14.
*/
public interface UmsMemberCacheService {
/**
* 删除会员用户缓存
*/
void delMember(Long memberId);
/**
* 获取会员用户缓存
*/
UmsMember getMember(String username);
/**
* 设置会员用户缓存
*/
void setMember(UmsMember member);
/**
* 设置验证码
*/
void setAuthCode(String telephone, String authCode);
/**
* 获取验证码
*/
String getAuthCode(String telephone);
}
UmsMemberService
package com.macro.mall.portal.service;
import com.macro.mall.model.UmsMember;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.transaction.annotation.Transactional;
/**
* 会员管理Service
* Created by macro on 2018/8/3.
*/
public interface UmsMemberService {
/**
* 根据用户名获取会员
*/
UmsMember getByUsername(String username);
/**
* 根据会员编号获取会员
*/
UmsMember getById(Long id);
/**
* 用户注册
*/
@Transactional
void register(String username, String password, String telephone, String authCode);
/**
* 生成验证码
*/
String generateAuthCode(String telephone);
/**
* 修改密码
*/
@Transactional
void updatePassword(String telephone, String password, String authCode);
/**
* 获取当前登录会员
*/
UmsMember getCurrentMember();
/**
* 根据会员id修改会员积分
*/
void updateIntegration(Long id, Integer integration);
/**
* 获取用户信息
*/
UserDetails loadUserByUsername(String username);
/**
* 登录后获取token
*/
String login(String username, String password);
/**
* 刷新token
*/
String refreshToken(String token);
}
2.6、serviceimpl
MemberReadHistoryServiceImpl
package com.macro.mall.portal.service.impl;
import com.macro.mall.model.UmsMember;
import com.macro.mall.portal.domain.MemberReadHistory;
import com.macro.mall.portal.repository.MemberReadHistoryRepository;
import com.macro.mall.portal.service.MemberReadHistoryService;
import com.macro.mall.portal.service.UmsMemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* 会员浏览记录管理Service实现类
* Created by macro on 2018/8/3.
*/
@Service
public class MemberReadHistoryServiceImpl implements MemberReadHistoryService {
@Autowired
private MemberReadHistoryRepository memberReadHistoryRepository;
@Autowired
private UmsMemberService memberService;
@Override
public int create(MemberReadHistory memberReadHistory) {
UmsMember member = memberService.getCurrentMember();
memberReadHistory.setMemberId(member.getId());
memberReadHistory.setMemberNickname(member.getNickname());
memberReadHistory.setMemberIcon(member.getIcon());
memberReadHistory.setId(null);
memberReadHistory.setCreateTime(new Date());
memberReadHistoryRepository.save(memberReadHistory);
return 1;
}
@Override
public int delete(List<String> ids) {
List<MemberReadHistory> deleteList = new ArrayList<>();
for(String id:ids){
MemberReadHistory memberReadHistory = new MemberReadHistory();
memberReadHistory.setId(id);
deleteList.add(memberReadHistory);
}
memberReadHistoryRepository.deleteAll(deleteList);
return ids.size();
}
@Override
public Page<MemberReadHistory> list(Integer pageNum, Integer pageSize) {
UmsMember member = memberService.getCurrentMember();
Pageable pageable = PageRequest.of(pageNum-1, pageSize);
return memberReadHistoryRepository.findByMemberIdOrderByCreateTimeDesc(member.getId(),pageable);
}
@Override
public void clear() {
UmsMember member = memberService.getCurrentMember();
memberReadHistoryRepository.deleteAllByMemberId(member.getId());
}
}
UmsMemberCacheServiceImpl
package com.macro.mall.portal.service.impl;
import com.macro.mall.common.service.RedisService;
import com.macro.mall.mapper.UmsMemberMapper;
import com.macro.mall.model.UmsMember;
import com.macro.mall.portal.service.UmsMemberCacheService;
import com.macro.mall.security.annotation.CacheException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
/**
* UmsMemberCacheService实现类
* Created by macro on 2020/3/14.
*/
@Service
public class UmsMemberCacheServiceImpl implements UmsMemberCacheService {
@Autowired
private RedisService redisService;
@Autowired
private UmsMemberMapper memberMapper;
@Value("${redis.database}")
private String REDIS_DATABASE;
@Value("${redis.expire.common}")
private Long REDIS_EXPIRE;
@Value("${redis.expire.authCode}")
private Long REDIS_EXPIRE_AUTH_CODE;
@Value("${redis.key.member}")
private String REDIS_KEY_MEMBER;
@Value("${redis.key.authCode}")
private String REDIS_KEY_AUTH_CODE;
@Override
public void delMember(Long memberId) {
UmsMember umsMember = memberMapper.selectByPrimaryKey(memberId);
if (umsMember != null) {
String key = REDIS_DATABASE + ":" + REDIS_KEY_MEMBER + ":" + umsMember.getUsername();
redisService.del(key);
}
}
@Override
public UmsMember getMember(String username) {
String key = REDIS_DATABASE + ":" + REDIS_KEY_MEMBER + ":" + username;
return (UmsMember) redisService.get(key);
}
@Override
public void setMember(UmsMember member) {
String key = REDIS_DATABASE + ":" + REDIS_KEY_MEMBER + ":" + member.getUsername();
redisService.set(key, member, REDIS_EXPIRE);
}
@CacheException
@Override
public void setAuthCode(String telephone, String authCode) {
String key = REDIS_DATABASE + ":" + REDIS_KEY_AUTH_CODE + ":" + telephone;
redisService.set(key,authCode,REDIS_EXPIRE_AUTH_CODE);
}
@CacheException
@Override
public String getAuthCode(String telephone) {
String key = REDIS_DATABASE + ":" + REDIS_KEY_AUTH_CODE + ":" + telephone;
return (String) redisService.get(key);
}
}
UmsMemberServiceImpl
package com.macro.mall.portal.service.impl;
import com.macro.mall.common.exception.Asserts;
import com.macro.mall.mapper.UmsMemberLevelMapper;
import com.macro.mall.mapper.UmsMemberMapper;
import com.macro.mall.model.UmsMember;
import com.macro.mall.model.UmsMemberExample;
import com.macro.mall.model.UmsMemberLevel;
import com.macro.mall.model.UmsMemberLevelExample;
import com.macro.mall.portal.domain.MemberDetails;
import com.macro.mall.portal.service.UmsMemberCacheService;
import com.macro.mall.portal.service.UmsMemberService;
import com.macro.mall.security.util.JwtTokenUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.Date;
import java.util.List;
import java.util.Random;
/**
* 会员管理Service实现类
* Created by macro on 2018/8/3.
*/
@Service
public class UmsMemberServiceImpl implements UmsMemberService {
private static final Logger LOGGER = LoggerFactory.getLogger(UmsMemberServiceImpl.class);
@Autowired
private PasswordEncoder passwordEncoder;
@Autowired
private JwtTokenUtil jwtTokenUtil;
@Autowired
private UmsMemberMapper memberMapper;
@Autowired
private UmsMemberLevelMapper memberLevelMapper;
@Autowired
private UmsMemberCacheService memberCacheService;
@Value("${redis.key.authCode}")
private String REDIS_KEY_PREFIX_AUTH_CODE;
@Value("${redis.expire.authCode}")
private Long AUTH_CODE_EXPIRE_SECONDS;
@Override
public UmsMember getByUsername(String username) {
UmsMember member = memberCacheService.getMember(username);
if(member!=null) return member;
UmsMemberExample example = new UmsMemberExample();
example.createCriteria().andUsernameEqualTo(username);
List<UmsMember> memberList = memberMapper.selectByExample(example);
if (!CollectionUtils.isEmpty(memberList)) {
member = memberList.get(0);
memberCacheService.setMember(member);
return member;
}
return null;
}
@Override
public UmsMember getById(Long id) {
return memberMapper.selectByPrimaryKey(id);
}
@Override
public void register(String username, String password, String telephone, String authCode) {
//验证验证码
if(!verifyAuthCode(authCode,telephone)){
Asserts.fail("验证码错误");
}
//查询是否已有该用户
UmsMemberExample example = new UmsMemberExample();
example.createCriteria().andUsernameEqualTo(username);
example.or(example.createCriteria().andPhoneEqualTo(telephone));
List<UmsMember> umsMembers = memberMapper.selectByExample(example);
if (!CollectionUtils.isEmpty(umsMembers)) {
Asserts.fail("该用户已经存在");
}
//没有该用户进行添加操作
UmsMember umsMember = new UmsMember();
umsMember.setUsername(username);
umsMember.setPhone(telephone);
umsMember.setPassword(passwordEncoder.encode(password));
umsMember.setCreateTime(new Date());
umsMember.setStatus(1);
//获取默认会员等级并设置
UmsMemberLevelExample levelExample = new UmsMemberLevelExample();
levelExample.createCriteria().andDefaultStatusEqualTo(1);
List<UmsMemberLevel> memberLevelList = memberLevelMapper.selectByExample(levelExample);
if (!CollectionUtils.isEmpty(memberLevelList)) {
umsMember.setMemberLevelId(memberLevelList.get(0).getId());
}
memberMapper.insert(umsMember);
umsMember.setPassword(null);
}
@Override
public String generateAuthCode(String telephone) {
StringBuilder sb = new StringBuilder();
Random random = new Random();
for(int i=0;i<6;i++){
sb.append(random.nextInt(10));
}
memberCacheService.setAuthCode(telephone,sb.toString());
return sb.toString();
}
@Override
public void updatePassword(String telephone, String password, String authCode) {
UmsMemberExample example = new UmsMemberExample();
example.createCriteria().andPhoneEqualTo(telephone);
List<UmsMember> memberList = memberMapper.selectByExample(example);
if(CollectionUtils.isEmpty(memberList)){
Asserts.fail("该账号不存在");
}
//验证验证码
if(!verifyAuthCode(authCode,telephone)){
Asserts.fail("验证码错误");
}
UmsMember umsMember = memberList.get(0);
umsMember.setPassword(passwordEncoder.encode(password));
memberMapper.updateByPrimaryKeySelective(umsMember);
memberCacheService.delMember(umsMember.getId());
}
@Override
public UmsMember getCurrentMember() {
SecurityContext ctx = SecurityContextHolder.getContext();
Authentication auth = ctx.getAuthentication();
MemberDetails memberDetails = (MemberDetails) auth.getPrincipal();
return memberDetails.getUmsMember();
}
@Override
public void updateIntegration(Long id, Integer integration) {
UmsMember record=new UmsMember();
record.setId(id);
record.setIntegration(integration);
memberMapper.updateByPrimaryKeySelective(record);
memberCacheService.delMember(id);
}
@Override
public UserDetails loadUserByUsername(String username) {
UmsMember member = getByUsername(username);
if(member!=null){
return new MemberDetails(member);
}
throw new UsernameNotFoundException("用户名或密码错误");
}
@Override
public String login(String username, String password) {
String token = null;
//密码需要客户端加密后传递
try {
UserDetails userDetails = loadUserByUsername(username);
if(!passwordEncoder.matches(password,userDetails.getPassword())){
throw new BadCredentialsException("密码不正确");
}
UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(authentication);
token = jwtTokenUtil.generateToken(userDetails);
} catch (AuthenticationException e) {
LOGGER.warn("登录异常:{}", e.getMessage());
}
return token;
}
@Override
public String refreshToken(String token) {
return jwtTokenUtil.refreshHeadToken(token);
}
//对输入的验证码进行校验
private boolean verifyAuthCode(String authCode, String telephone){
if(StringUtils.isEmpty(authCode)){
return false;
}
String realAuthCode = memberCacheService.getAuthCode(telephone);
return authCode.equals(realAuthCode);
}
}
2.7、controller
MemberReadHistoryController
package com.macro.mall.portal.controller;
import com.macro.mall.common.api.CommonPage;
import com.macro.mall.common.api.CommonResult;
import com.macro.mall.portal.domain.MemberReadHistory;
import com.macro.mall.portal.service.MemberReadHistoryService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 会员商品浏览记录管理Controller
* Created by macro on 2018/8/3.
*/
@Controller
@Api(tags = "MemberReadHistoryController", description = "会员商品浏览记录管理")
@RequestMapping("/member/readHistory")
public class MemberReadHistoryController {
@Autowired
private MemberReadHistoryService memberReadHistoryService;
@ApiOperation("创建浏览记录")
@RequestMapping(value = "/create", method = RequestMethod.POST)
@ResponseBody
public CommonResult create(@RequestBody MemberReadHistory memberReadHistory) {
int count = memberReadHistoryService.create(memberReadHistory);
if (count > 0) {
return CommonResult.success(count);
} else {
return CommonResult.failed();
}
}
@ApiOperation("删除浏览记录")
@RequestMapping(value = "/delete", method = RequestMethod.POST)
@ResponseBody
public CommonResult delete(@RequestParam("ids") List<String> ids) {
int count = memberReadHistoryService.delete(ids);
if (count > 0) {
return CommonResult.success(count);
} else {
return CommonResult.failed();
}
}
@ApiOperation("清空除浏览记录")
@RequestMapping(value = "/clear", method = RequestMethod.POST)
@ResponseBody
public CommonResult clear() {
memberReadHistoryService.clear();
return CommonResult.success(null);
}
@ApiOperation("分页获取用户浏览记录")
@RequestMapping(value = "/list", method = RequestMethod.GET)
@ResponseBody
public CommonResult<CommonPage<MemberReadHistory>> list(@RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum,
@RequestParam(value = "pageSize", defaultValue = "5") Integer pageSize) {
Page<MemberReadHistory> page = memberReadHistoryService.list(pageNum, pageSize);
return CommonResult.success(CommonPage.restPage(page));
}
}
UmsMemberController
package com.macro.mall.portal.controller;
import com.macro.mall.common.api.CommonResult;
import com.macro.mall.model.UmsMember;
import com.macro.mall.portal.service.UmsMemberService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
import java.security.Principal;
import java.util.HashMap;
import java.util.Map;
/**
* 会员登录注册管理Controller
* Created by macro on 2018/8/3.
*/
@Controller
@Api(tags = "UmsMemberController", description = "会员登录注册管理")
@RequestMapping("/sso")
public class UmsMemberController {
@Value("${jwt.tokenHeader}")
private String tokenHeader;
@Value("${jwt.tokenHead}")
private String tokenHead;
@Autowired
private UmsMemberService memberService;
@ApiOperation("会员注册")
@RequestMapping(value = "/register", method = RequestMethod.POST)
@ResponseBody
public CommonResult register(@RequestParam String username,
@RequestParam String password,
@RequestParam String telephone,
@RequestParam String authCode) {
memberService.register(username, password, telephone, authCode);
return CommonResult.success(null,"注册成功");
}
@ApiOperation("会员登录")
@RequestMapping(value = "/login", method = RequestMethod.POST)
@ResponseBody
public CommonResult login(@RequestParam String username,
@RequestParam String password) {
String token = memberService.login(username, password);
if (token == null) {
return CommonResult.validateFailed("用户名或密码错误");
}
Map<String, String> tokenMap = new HashMap<>();
tokenMap.put("token", token);
tokenMap.put("tokenHead", tokenHead);
return CommonResult.success(tokenMap);
}
@ApiOperation("获取会员信息")
@RequestMapping(value = "/info", method = RequestMethod.GET)
@ResponseBody
public CommonResult info(Principal principal) {
if(principal==null){
return CommonResult.unauthorized(null);
}
UmsMember member = memberService.getCurrentMember();
return CommonResult.success(member);
}
@ApiOperation("获取验证码")
@RequestMapping(value = "/getAuthCode", method = RequestMethod.GET)
@ResponseBody
public CommonResult getAuthCode(@RequestParam String telephone) {
String authCode = memberService.generateAuthCode(telephone);
return CommonResult.success(authCode,"获取验证码成功");
}
@ApiOperation("修改密码")
@RequestMapping(value = "/updatePassword", method = RequestMethod.POST)
@ResponseBody
public CommonResult updatePassword(@RequestParam String telephone,
@RequestParam String password,
@RequestParam String authCode) {
memberService.updatePassword(telephone,password,authCode);
return CommonResult.success(null,"密码修改成功");
}
@ApiOperation(value = "刷新token")
@RequestMapping(value = "/refreshToken", method = RequestMethod.GET)
@ResponseBody
public CommonResult refreshToken(HttpServletRequest request) {
String token = request.getHeader(tokenHeader);
String refreshToken = memberService.refreshToken(token);
if (refreshToken == null) {
return CommonResult.failed("token已经过期!");
}
Map<String, String> tokenMap = new HashMap<>();
tokenMap.put("token", refreshToken);
tokenMap.put("tokenHead", tokenHead);
return CommonResult.success(tokenMap);
}
}
2.8、MallPortalApplication
package com.macro.mall.portal;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
@SpringBootApplication(scanBasePackages = "com.macro.mall")
public class MallPortalApplication {
public static void main(String[] args) {
SpringApplication.run(MallPortalApplication.class, args);
}
}
2.9、application
application.yml
spring:
application:
name: mall-portal
profiles:
active: dev #默认为开发环境
mybatis:
mapper-locations:
- classpath:dao/*.xml
- classpath*:com/**/mapper/*.xml
jwt:
tokenHeader: Authorization #JWT存储的请求头
secret: mall-portal-secret #JWT加解密使用的密钥
expiration: 604800 #JWT的超期限时间(60*60*24*7)
tokenHead: 'Bearer ' #JWT负载中拿到开头
secure:
ignored:
urls: #安全路径白名单
- /swagger-ui.html
- /swagger-resources/**
- /swagger/**
- /**/v2/api-docs
- /**/*.js
- /**/*.css
- /**/*.png
- /**/*.ico
- /webjars/springfox-swagger-ui/**
- /druid/**
- /actuator/**
- /sso/**
- /home/**
- /product/**
- /brand/**
# 自定义redis key
redis:
database: mall
key:
authCode: 'ums:authCode'
orderId: 'oms:orderId'
member: 'ums:member'
expire:
authCode: 90 # 验证码超期时间
common: 86400 # 24小时
# 消息队列定义
rabbitmq:
queue:
name:
cancelOrder: cancelOrderQueue
application-dev.yml
server:
port: 8085
spring:
datasource:
url: jdbc:mysql://localhost:3306/mall?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
username: root
password: ljs
druid:
initial-size: 5 #连接池初始化大小
min-idle: 10 #最小空闲连接数
max-active: 20 #最大连接数
web-stat-filter:
exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*" #不统计这些请求数据
stat-view-servlet: #访问监控网页的登录用户名和密码
login-username: druid
login-password: druid
data:
mongodb:
host: localhost
port: 27017
database: mall-port
redis:
host: xxxxx # Redis服务器地址
database: 0 # Redis数据库索引(默认为0)
port: 6379 # Redis服务器连接端口
password: # Redis服务器连接密码(默认为空)
timeout: 300ms # 连接超时时间(毫秒)
logging:
level:
root: info
com.macro.mall: debug
logstash:
host: localhost
2.10、pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.macro.mall</groupId>
<artifactId>mall-portal</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>mall-portal</name>
<description>mall-portal project for mall</description>
<parent>
<groupId>mall2</groupId>
<artifactId>com.mall2</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<dependencies>
<dependency>
<groupId>com.macro.mall</groupId>
<artifactId>mall-mbg</artifactId>
</dependency>
<dependency>
<groupId>com.macro.mall</groupId>
<artifactId>mall-security</artifactId>
</dependency>
<!--mongodb依赖配置-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<!--redis依赖配置-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--集成消息队列-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
3、启动调试
1、会员注册前先获取验证码
2、注册
3、登陆获取token
4、将token作为header拼接到swagger
5、调用mongo插入文档接口
6、调用mongo查询接口
说明插入是成功的
7、查看robo3T