diff --git a/ruoyi-mall/src/main/java/com/cyl/manager/ums/controller/MemberLogininforController.java b/ruoyi-mall/src/main/java/com/cyl/manager/ums/controller/MemberLogininforController.java new file mode 100644 index 0000000..d043355 --- /dev/null +++ b/ruoyi-mall/src/main/java/com/cyl/manager/ums/controller/MemberLogininforController.java @@ -0,0 +1,97 @@ +package com.cyl.manager.ums.controller; + +import java.util.List; + +import com.cyl.h5.config.SecurityUtil; +import com.cyl.manager.ums.domain.Member; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.core.domain.model.LoginMember; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.framework.config.LocalDataUtil; +import com.ruoyi.framework.web.service.TokenService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Page; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.enums.BusinessType; +import com.cyl.manager.ums.convert.MemberLogininforConvert; +import com.cyl.manager.ums.domain.MemberLogininfor; +import com.cyl.manager.ums.pojo.query.MemberLogininforQuery; +import com.cyl.manager.ums.service.MemberLogininforService; +import com.cyl.manager.ums.pojo.vo.MemberLogininforVO; +import com.ruoyi.common.utils.poi.ExcelUtil; + +import javax.servlet.http.HttpServletRequest; + +/** + * 会员登录记录Controller + * + * @author zcc + * @date 2023-07-26 + */ +@Api(description ="会员登录记录接口列表") +@RestController +@RequestMapping("/ums/memberLogininfor") +public class MemberLogininforController extends BaseController { + @Autowired + private MemberLogininforService service; + @Autowired + private MemberLogininforConvert convert; + @Autowired + private TokenService tokenService; + + @ApiOperation("查询会员登录记录列表") + @PreAuthorize("@ss.hasPermi('ums:memberLogininfor:list')") + @PostMapping("/list") + public ResponseEntity> list(@RequestBody MemberLogininforQuery query, Pageable page) { + List list = service.selectList(query, page); + return ResponseEntity.ok(new PageImpl<>(list, page, ((com.github.pagehelper.Page)list).getTotal())); + } + + @ApiOperation("导出会员登录记录列表") + @PreAuthorize("@ss.hasPermi('ums:memberLogininfor:export')") + @Log(title = "会员登录记录", businessType = BusinessType.EXPORT) + @GetMapping("/export") + public ResponseEntity export(MemberLogininforQuery query) { + List list = service.selectList(query, null); + ExcelUtil util = new ExcelUtil<>(MemberLogininforVO.class); + return ResponseEntity.ok(util.writeExcel(convert.dos2vos(list), "会员登录记录数据")); + } + + @ApiOperation("获取会员登录记录详细信息") + @PreAuthorize("@ss.hasPermi('ums:memberLogininfor:query')") + @GetMapping(value = "/{id}") + public ResponseEntity getInfo(@PathVariable("id") Long id) { + return ResponseEntity.ok(service.selectById(id)); + } + + @ApiOperation("修改会员登录记录") + @PreAuthorize("@ss.hasPermi('ums:memberLogininfor:edit')") + @Log(title = "会员登录记录", businessType = BusinessType.UPDATE) + @PutMapping + public ResponseEntity edit(@RequestBody MemberLogininfor memberLogininfor) { + return ResponseEntity.ok(service.update(memberLogininfor)); + } + + @ApiOperation("删除会员登录记录") + @PreAuthorize("@ss.hasPermi('ums:memberLogininfor:remove')") + @Log(title = "会员登录记录", businessType = BusinessType.DELETE) + @DeleteMapping("/{id}") + public ResponseEntity remove(@PathVariable Long id) { + return ResponseEntity.ok(service.deleteById(id)); + } +} diff --git a/ruoyi-mall/src/main/java/com/cyl/manager/ums/convert/MemberLogininforConvert.java b/ruoyi-mall/src/main/java/com/cyl/manager/ums/convert/MemberLogininforConvert.java new file mode 100644 index 0000000..b395d6f --- /dev/null +++ b/ruoyi-mall/src/main/java/com/cyl/manager/ums/convert/MemberLogininforConvert.java @@ -0,0 +1,16 @@ +package com.cyl.manager.ums.convert; + +import org.mapstruct.Mapper; +import com.cyl.manager.ums.domain.MemberLogininfor; +import com.cyl.manager.ums.pojo.vo.MemberLogininforVO; +import java.util.List; +/** + * 会员登录记录 DO <=> DTO <=> VO / BO / Query + * + * @author zcc + */ +@Mapper(componentModel = "spring") +public interface MemberLogininforConvert { + + List dos2vos(List list); +} diff --git a/ruoyi-mall/src/main/java/com/cyl/manager/ums/domain/MemberLogininfor.java b/ruoyi-mall/src/main/java/com/cyl/manager/ums/domain/MemberLogininfor.java new file mode 100644 index 0000000..883f037 --- /dev/null +++ b/ruoyi-mall/src/main/java/com/cyl/manager/ums/domain/MemberLogininfor.java @@ -0,0 +1,51 @@ +package com.cyl.manager.ums.domain; + +import java.time.LocalDateTime; +import com.ruoyi.common.annotation.Excel; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import com.baomidou.mybatisplus.annotation.TableName; +/** + * 会员登录记录对象 ums_member_logininfor + * + * @author zcc + */ +@ApiModel(description="会员登录记录对象") +@Data +@TableName("ums_member_logininfor") +public class MemberLogininfor { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("ID") + private Long id; + + @ApiModelProperty("会员手机号") + @Excel(name = "会员手机号") + private String phone; + + @ApiModelProperty("会员id") + @Excel(name = "会员id") + private Long memberId; + + @ApiModelProperty("登录IP地址") + @Excel(name = "登录IP地址") + private String ipaddr; + + @ApiModelProperty("登录地点") + @Excel(name = "登录地点") + private String loginLocation; + + @ApiModelProperty("浏览器类型") + @Excel(name = "浏览器类型") + private String browser; + + @ApiModelProperty("操作系统") + @Excel(name = "操作系统") + private String os; + + @ApiModelProperty("登陆时间") + @Excel(name = "登陆时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime loginTime; + +} diff --git a/ruoyi-mall/src/main/java/com/cyl/manager/ums/mapper/MemberLogininforMapper.java b/ruoyi-mall/src/main/java/com/cyl/manager/ums/mapper/MemberLogininforMapper.java new file mode 100644 index 0000000..5f7f0b5 --- /dev/null +++ b/ruoyi-mall/src/main/java/com/cyl/manager/ums/mapper/MemberLogininforMapper.java @@ -0,0 +1,21 @@ +package com.cyl.manager.ums.mapper; + +import java.util.List; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; +import com.cyl.manager.ums.domain.MemberLogininfor; + +/** + * 会员登录记录Mapper接口 + * + * @author zcc + */ +public interface MemberLogininforMapper extends BaseMapper { + /** + * 查询会员登录记录列表 + * + * @param memberLogininfor 会员登录记录 + * @return 会员登录记录集合 + */ + List selectByEntity(MemberLogininfor memberLogininfor); +} diff --git a/ruoyi-mall/src/main/java/com/cyl/manager/ums/pojo/query/MemberLogininforQuery.java b/ruoyi-mall/src/main/java/com/cyl/manager/ums/pojo/query/MemberLogininforQuery.java new file mode 100644 index 0000000..41b65e3 --- /dev/null +++ b/ruoyi-mall/src/main/java/com/cyl/manager/ums/pojo/query/MemberLogininforQuery.java @@ -0,0 +1,37 @@ +package com.cyl.manager.ums.pojo.query; + +import java.time.LocalDateTime; +import lombok.Data; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * 会员登录记录 查询 对象 + * + * @author zcc + */ +@ApiModel(description="会员登录记录 查询 对象") +@Data +public class MemberLogininforQuery { + @ApiModelProperty("会员手机号 精确匹配") + private String phone; + + @ApiModelProperty("会员id 精确匹配") + private Long memberId; + + @ApiModelProperty("登录IP地址 精确匹配") + private String ipaddr; + + @ApiModelProperty("登录地点 精确匹配") + private String loginLocation; + + @ApiModelProperty("浏览器类型 精确匹配") + private String browser; + + @ApiModelProperty("操作系统 精确匹配") + private String os; + + @ApiModelProperty("登陆时间 精确匹配") + private LocalDateTime loginTime; + +} diff --git a/ruoyi-mall/src/main/java/com/cyl/manager/ums/pojo/vo/MemberLogininforVO.java b/ruoyi-mall/src/main/java/com/cyl/manager/ums/pojo/vo/MemberLogininforVO.java new file mode 100644 index 0000000..f04df78 --- /dev/null +++ b/ruoyi-mall/src/main/java/com/cyl/manager/ums/pojo/vo/MemberLogininforVO.java @@ -0,0 +1,38 @@ +package com.cyl.manager.ums.pojo.vo; + +import java.time.LocalDateTime; +import com.ruoyi.common.annotation.Excel; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +/** + * 会员登录记录 数据视图对象 + * + * @author zcc + */ +@Data +public class MemberLogininforVO { + /** ID */ + private Long id; + /** 会员手机号 */ + @Excel(name = "会员手机号") + private String phone; + /** 会员id */ + @Excel(name = "会员id") + private Long memberId; + /** 登录IP地址 */ + @Excel(name = "登录IP地址") + private String ipaddr; + /** 登录地点 */ + @Excel(name = "登录地点") + private String loginLocation; + /** 浏览器类型 */ + @Excel(name = "浏览器类型") + private String browser; + /** 操作系统 */ + @Excel(name = "操作系统") + private String os; + /** 登陆时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "登陆时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime loginTime; +} diff --git a/ruoyi-mall/src/main/java/com/cyl/manager/ums/service/MemberLogininforService.java b/ruoyi-mall/src/main/java/com/cyl/manager/ums/service/MemberLogininforService.java new file mode 100644 index 0000000..e1c969a --- /dev/null +++ b/ruoyi-mall/src/main/java/com/cyl/manager/ums/service/MemberLogininforService.java @@ -0,0 +1,110 @@ +package com.cyl.manager.ums.service; + +import java.time.LocalDateTime; +import java.util.Arrays; +import java.util.List; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.cyl.manager.ums.domain.Member; +import com.cyl.manager.ums.mapper.MemberMapper; +import com.github.pagehelper.PageHelper; +import com.ruoyi.common.core.domain.model.LoginMember; +import com.ruoyi.common.utils.ServletUtils; +import com.ruoyi.common.utils.ip.AddressUtils; +import com.ruoyi.common.utils.ip.IpUtils; +import eu.bitwalker.useragentutils.UserAgent; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Pageable; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; +import com.cyl.manager.ums.mapper.MemberLogininforMapper; +import com.cyl.manager.ums.domain.MemberLogininfor; +import com.cyl.manager.ums.pojo.query.MemberLogininforQuery; + +/** + * 会员登录记录Service业务层处理 + * + * + * @author zcc + */ +@Service +public class MemberLogininforService { + @Autowired + private MemberLogininforMapper memberLogininforMapper; + + @Autowired + private MemberMapper memberMapper; + + /** + * 查询会员登录记录 + * + * @param id 会员登录记录主键 + * @return 会员登录记录 + */ + public MemberLogininfor selectById(Long id) { + return memberLogininforMapper.selectById(id); + } + + /** + * 查询会员登录记录列表 + * + * @param query 查询条件 + * @param page 分页条件 + * @return 会员登录记录 + */ + public List selectList(MemberLogininforQuery query, Pageable page) { + if (page != null) { + PageHelper.startPage(page.getPageNumber() + 1, page.getPageSize()); + } + QueryWrapper qw = new QueryWrapper<>(); + String phone = query.getPhone(); + if (!StringUtils.isEmpty(phone)) { + qw.eq("phone", phone); + } + Long memberId = query.getMemberId(); + if (memberId != null) { + qw.eq("member_id", memberId); + } + String ipaddr = query.getIpaddr(); + if (!StringUtils.isEmpty(ipaddr)) { + qw.eq("ipaddr", ipaddr); + } + String loginLocation = query.getLoginLocation(); + if (!StringUtils.isEmpty(loginLocation)) { + qw.eq("login_location", loginLocation); + } + String browser = query.getBrowser(); + if (!StringUtils.isEmpty(browser)) { + qw.eq("browser", browser); + } + String os = query.getOs(); + if (!StringUtils.isEmpty(os)) { + qw.eq("os", os); + } + LocalDateTime loginTime = query.getLoginTime(); + if (loginTime != null) { + qw.eq("login_time", loginTime); + } + return memberLogininforMapper.selectList(qw); + } + + /** + * 修改会员登录记录 + * + * @param memberLogininfor 会员登录记录 + * @return 结果 + */ + public int update(MemberLogininfor memberLogininfor) { + return memberLogininforMapper.updateById(memberLogininfor); + } + + /** + * 删除会员登录记录信息 + * + * @param id 会员登录记录主键 + * @return 结果 + */ + public int deleteById(Long id) { + return memberLogininforMapper.deleteById(id); + } +} diff --git a/ruoyi-mall/src/main/resources/mapper/ums/MemberLogininforMapper.xml b/ruoyi-mall/src/main/resources/mapper/ums/MemberLogininforMapper.xml new file mode 100644 index 0000000..405b5e7 --- /dev/null +++ b/ruoyi-mall/src/main/resources/mapper/ums/MemberLogininforMapper.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + select id, phone, member_id, ipaddr, login_location, browser, os, login_time from ums_member_logininfor + + + + diff --git a/sql/ums/memberLogininfor.sql b/sql/ums/memberLogininfor.sql new file mode 100644 index 0000000..e60a01e --- /dev/null +++ b/sql/ums/memberLogininfor.sql @@ -0,0 +1,22 @@ +-- 菜单 SQL +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('会员登录记录', '3', '1', 'memberLogininfor', 'ums/memberLogininfor/index', 1, 0, 'C', '0', '0', 'ums:memberLogininfor:list', '#', 1, sysdate(), '', null, '会员登录记录菜单'); + +-- 按钮父菜单ID +SELECT @parentId := LAST_INSERT_ID(); + +-- 按钮 SQL +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('会员登录记录查询', @parentId, '1', '#', '', 1, 0, 'F', '0', '0', 'ums:memberLogininfor:query', '#', 1, sysdate(), '', null, ''); + +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('会员登录记录新增', @parentId, '2', '#', '', 1, 0, 'F', '0', '0', 'ums:memberLogininfor:add', '#', 1, sysdate(), '', null, ''); + +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('会员登录记录修改', @parentId, '3', '#', '', 1, 0, 'F', '0', '0', 'ums:memberLogininfor:edit', '#', 1, sysdate(), '', null, ''); + +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('会员登录记录删除', @parentId, '4', '#', '', 1, 0, 'F', '0', '0', 'ums:memberLogininfor:remove', '#', 1, sysdate(), '', null, ''); + +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('会员登录记录导出', @parentId, '5', '#', '', 1, 0, 'F', '0', '0', 'ums:memberLogininfor:export', '#', 1, sysdate(), '', null, '');