Merge remote-tracking branch 'origin/master'

This commit is contained in:
sin 2019-05-15 20:02:15 +08:00
commit 0010701e68
31 changed files with 347 additions and 144 deletions

View File

@ -16,6 +16,17 @@
> 一起交流Get 知识。 > 一起交流Get 知识。
* 我们迫切希望更多的参与进来,可以加入「交流群」,一起骚聊。 * 我们迫切希望更多的参与进来,可以加入「交流群」,一起骚聊。
* [《Onemall 电商开源项目 —— 应用分层》](http://www.iocoder.cn/Onemall/Application-layer/?vip&onemall)
# 近期计划
近期准备开发如下功能:
1. 微信 H5 网页登陆
2. 订单评价
3. 商品品牌
4. 短信接入
5. 访问日志、错误日志接入
# 演示 # 演示
@ -126,7 +137,7 @@ TODO 此处应有一个架构图的装逼 JPG 图。
| [Zookeeper](http://zookeeper.apache.org/) | 分布式系统协调 | 3.4.9 作为注册中心 | | [Zookeeper](http://zookeeper.apache.org/) | 分布式系统协调 | 3.4.9 作为注册中心 |
| [XXL-Job](http://www.xuxueli.com/xxl-job/) | 分布式任务调度平台 | 2.0.1 | | [XXL-Job](http://www.xuxueli.com/xxl-job/) | 分布式任务调度平台 | 2.0.1 |
| [springfox-swagger2](https://github.com/springfox/springfox/tree/master/springfox-swagger2) | API 文档 | 2.9.2 | | [springfox-swagger2](https://github.com/springfox/springfox/tree/master/springfox-swagger2) | API 文档 | 2.9.2 |
| [swagger-bootstrap-ui](https://gitee.com/xiaoym/swagger-bootstrap-ui) | API 文档 | 1.9.3 | | [swagger-bootstrap-ui](https://gitee.com/xiaoym/swagger-bootstrap-ui) | Swagger 增强 UI 实现 | 1.9.3 |
未来考虑引入 未来考虑引入

View File

@ -32,6 +32,11 @@
<artifactId>mybatis</artifactId> <artifactId>mybatis</artifactId>
</dependency> </dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-annotation</artifactId>
</dependency>
<!-- RPC 相关 --> <!-- RPC 相关 -->
<dependency> <dependency>
<groupId>org.apache.dubbo</groupId> <groupId>org.apache.dubbo</groupId>

View File

@ -1,5 +1,7 @@
package cn.iocoder.common.framework.dataobject; package cn.iocoder.common.framework.dataobject;
import com.baomidou.mybatisplus.annotation.TableLogic;
/** /**
* extends BaseDO 扩展 delete 操作 * extends BaseDO 扩展 delete 操作
* *
@ -11,6 +13,7 @@ public class DeletableDO extends BaseDO {
/** /**
* 是否删除 * 是否删除
*/ */
@TableLogic
private Integer deleted; private Integer deleted;
@Override @Override

View File

@ -37,7 +37,6 @@
- [ ] 短信管理 - [ ] 短信管理
- [ ] 短信模板 - [ ] 短信模板
- [ ] 发送日志 - [ ] 发送日志
- [ ] 用户访问日志
- [ ] 员工访问日志
- [ ] 员工操作日志 - [ ] 员工操作日志
- [ ] 访问日志
- [ ] 异常日志 - [ ] 异常日志

View File

@ -0,0 +1,100 @@
package cn.iocoder.mall.order.biz.dataobject;
import cn.iocoder.common.framework.dataobject.BaseDO;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* 订单评论表
*
* @author wtz
* @time 2019-05-14 20:48
*
*/
@Data
@Accessors(chain = true)
@TableName(value = "order_comment")
public class OrderCommentDO extends BaseDO {
/**
* 评论id
*/
private Integer id;
/**
* 订单id
*/
private Integer orderId;
/**
* 订单编号
*/
private String orderNo;
/**
* 商品SKUid
*/
private Integer productSkuId;
/**
* 商品SKU属性
*/
private String productSkuAttrs;
/**
* 用户id
*/
private Integer userId;
/**
* 用户头像
*/
private String userAvatar;
/**
* 用户的真实姓名
*/
private String userNickName;
/**
* 评价星
*/
private Integer star;
/**
* 商品描述
*/
private Integer productDescriptionStar;
/**
* 物流评价
*/
private Integer logisticsStar;
/**
* 商家评价
*/
private Integer merchantStar;
/**
* 回复条数
*/
private Integer replayCount;
/**
* 点赞数
*/
private Integer collectCount;
/**
* 评论的内容
*/
private String commentContent;
/**
* 评论的图片地址
*/
private String commentPics;
}

View File

@ -0,0 +1,85 @@
package cn.iocoder.mall.order.biz.dataobject;
import cn.iocoder.common.framework.dataobject.BaseDO;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* 商品评价回复表
*
* @author wtz
* @time 2019-05-14 21:00
*
*/
@Data
@Accessors(chain = true)
@TableName(value = "order_comment_replay")
public class OrderCommentReplayDO extends BaseDO {
/**
* 回复id
*/
private Integer id;
/**
* 评论id
*/
private Integer commentId;
/**
* 回复的类型
*/
private Integer replyType;
/**
* 父id
*/
private Integer parentId;
/**
* 回复目标用户id
*/
private Integer parentUserId;
/**
* 回复目标用户昵称
*/
private String parentUserNickName;
/**
* 回复目标用户头像
*/
private String parentUserAvatar;
/**
* 回复的数量
*/
private String replyContent;
/**
* 回复用户id
*/
private Integer replyUserId;
/**
* 回复用户昵称
*/
private String replyUserNickName;
/**
* 回复用户头像
*/
private String replyUserAvatar;
/**
* 回复用户身份
*/
private Integer replyUserType;
/**
* 回复点赞数
*/
private Integer replyCollectCount;
}

View File

@ -7,7 +7,7 @@ spring:
password: ${MALL_MYSQL_PASSWORD} password: ${MALL_MYSQL_PASSWORD}
# mybatis # mybatis
mybatis: #mybatis:
# config-location: classpath:mybatis-config.xml # config-location: classpath:mybatis-config.xml
# mapper-locations: classpath:mapper/*.xml # mapper-locations: classpath:mapper/*.xml
# type-aliases-package: cn.iocoder.mall.order.biz.dataobject # type-aliases-package: cn.iocoder.mall.order.biz.dataobject
@ -21,6 +21,7 @@ mybatis-plus:
id-type: auto id-type: auto
mapper-locations: classpath*:mapper/*.xml mapper-locations: classpath*:mapper/*.xml
type-aliases-package: cn.iocoder.mall.order.biz.dataobject type-aliases-package: cn.iocoder.mall.order.biz.dataobject
config-location: classpath:mybatis-config.xml
# dubbo # dubbo
dubbo: dubbo:

View File

@ -139,6 +139,11 @@
<artifactId>mybatis-spring-boot-starter</artifactId> <artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis-spring-boot-starter.version}</version> <version>${mybatis-spring-boot-starter.version}</version>
</dependency> </dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-annotation</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
<dependency> <dependency>
<groupId>com.baomidou</groupId> <groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId> <artifactId>mybatis-plus-boot-starter</artifactId>

View File

@ -26,7 +26,7 @@ mybatis-plus:
id-type: auto id-type: auto
mapper-locations: classpath*:mapper/*.xml mapper-locations: classpath*:mapper/*.xml
type-aliases-package: cn.iocoder.mall.promotion.biz.dataobject type-aliases-package: cn.iocoder.mall.promotion.biz.dataobject
config-location: classpath:mybatis-config.xml
# dubbo # dubbo
dubbo: dubbo:
application: application:

View File

@ -1,24 +1,24 @@
package cn.iocoder.mall.admin.application.controller.admins; package cn.iocoder.mall.admin.application.controller.admins;
import cn.iocoder.common.framework.constant.MallConstants;
import cn.iocoder.common.framework.vo.CommonResult; import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.mall.admin.api.AdminService; import cn.iocoder.mall.admin.api.AdminService;
import cn.iocoder.mall.admin.api.ResourceService; import cn.iocoder.mall.admin.api.ResourceService;
import cn.iocoder.mall.admin.api.RoleService; import cn.iocoder.mall.admin.api.RoleService;
import cn.iocoder.mall.admin.api.bo.AdminPageBO;
import cn.iocoder.mall.admin.api.bo.ResourceBO; import cn.iocoder.mall.admin.api.bo.ResourceBO;
import cn.iocoder.mall.admin.api.bo.RoleBO; import cn.iocoder.mall.admin.api.bo.RoleBO;
import cn.iocoder.mall.admin.api.bo.admin.AdminBO;
import cn.iocoder.mall.admin.api.bo.admin.AdminPageBO;
import cn.iocoder.mall.admin.api.constant.ResourceConstants; import cn.iocoder.mall.admin.api.constant.ResourceConstants;
import cn.iocoder.mall.admin.api.dto.AdminAddDTO; import cn.iocoder.mall.admin.api.dto.admin.AdminAddDTO;
import cn.iocoder.mall.admin.api.dto.AdminPageDTO; import cn.iocoder.mall.admin.api.dto.admin.AdminPageDTO;
import cn.iocoder.mall.admin.api.dto.AdminUpdateDTO; import cn.iocoder.mall.admin.api.dto.admin.AdminUpdateDTO;
import cn.iocoder.mall.admin.application.convert.AdminConvert; import cn.iocoder.mall.admin.application.convert.AdminConvert;
import cn.iocoder.mall.admin.application.convert.ResourceConvert; import cn.iocoder.mall.admin.application.convert.ResourceConvert;
import cn.iocoder.mall.admin.application.vo.AdminMenuTreeNodeVO; import cn.iocoder.mall.admin.application.vo.AdminMenuTreeNodeVO;
import cn.iocoder.mall.admin.application.vo.AdminPageVO; import cn.iocoder.mall.admin.application.vo.AdminPageVO;
import cn.iocoder.mall.admin.application.vo.AdminRoleVO; import cn.iocoder.mall.admin.application.vo.AdminRoleVO;
import cn.iocoder.mall.admin.application.vo.AdminVO;
import cn.iocoder.mall.admin.sdk.context.AdminSecurityContextHolder; import cn.iocoder.mall.admin.sdk.context.AdminSecurityContextHolder;
import cn.iocoder.common.framework.constant.MallConstants;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiImplicitParams;
@ -29,6 +29,8 @@ import org.springframework.web.bind.annotation.*;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static cn.iocoder.common.framework.vo.CommonResult.success;
@RestController @RestController
@RequestMapping(MallConstants.ROOT_PATH_ADMIN + "/admin") @RequestMapping(MallConstants.ROOT_PATH_ADMIN + "/admin")
@Api("管理员模块") @Api("管理员模块")
@ -70,7 +72,7 @@ public class AdminController {
.filter(node -> node.getPid().equals(ResourceConstants.PID_ROOT)) .filter(node -> node.getPid().equals(ResourceConstants.PID_ROOT))
// .sorted(Comparator.comparing(AdminMenuTreeNodeVO::getSort)) // .sorted(Comparator.comparing(AdminMenuTreeNodeVO::getSort))
.collect(Collectors.toList()); .collect(Collectors.toList());
return CommonResult.success(rootNodes); return success(rootNodes);
} }
@GetMapping("/url_resource_list") @GetMapping("/url_resource_list")
@ -78,7 +80,7 @@ public class AdminController {
// @ApiModelProperty(value = "data", example = "['/admin/role/add', '/admin/role/update']") 没效果 // @ApiModelProperty(value = "data", example = "['/admin/role/add', '/admin/role/update']") 没效果
public CommonResult<Set<String>> urlResourceList() { public CommonResult<Set<String>> urlResourceList() {
List<ResourceBO> resources = resourceService.getResourcesByTypeAndRoleIds(ResourceConstants.TYPE_URL, AdminSecurityContextHolder.getContext().getRoleIds()); List<ResourceBO> resources = resourceService.getResourcesByTypeAndRoleIds(ResourceConstants.TYPE_URL, AdminSecurityContextHolder.getContext().getRoleIds());
return CommonResult.success(resources.stream().map(ResourceBO::getHandler).collect(Collectors.toSet())); return success(resources.stream().map(ResourceBO::getHandler).collect(Collectors.toSet()));
} }
// =========== 管理员管理 API =========== // =========== 管理员管理 API ===========
@ -90,25 +92,16 @@ public class AdminController {
@ApiImplicitParam(name = "pageNo", value = "页码,从 1 开始", example = "1"), @ApiImplicitParam(name = "pageNo", value = "页码,从 1 开始", example = "1"),
@ApiImplicitParam(name = "pageSize", value = "每页条数", required = true, example = "10"), @ApiImplicitParam(name = "pageSize", value = "每页条数", required = true, example = "10"),
}) })
public CommonResult<AdminPageVO> page(@RequestParam(value = "nickname", required = false) String nickname, public CommonResult<AdminPageVO> page(AdminPageDTO adminPageDTO) {
@RequestParam(value = "pageNo", defaultValue = "0") Integer pageNo, // CommonResult<AdminPageBO> result = adminService.getAdminPage(new AdminPageDTO().setNickname(nickname).setPageNo(pageNo).setPageSize(pageSize));
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) { CommonResult<AdminPageBO> result = adminService.getAdminPage(adminPageDTO);
CommonResult<AdminPageBO> result = adminService.getAdminPage(new AdminPageDTO().setNickname(nickname).setPageNo(pageNo).setPageSize(pageSize));
return AdminConvert.INSTANCE.convert(result); return AdminConvert.INSTANCE.convert(result);
} }
@PostMapping("/add") @PostMapping("/add")
@ApiOperation(value = "创建管理员") @ApiOperation(value = "创建管理员")
@ApiImplicitParams({ public CommonResult<AdminBO> add(AdminAddDTO adminAddDTO) {
@ApiImplicitParam(name = "username", value = "账号", required = true, example = "15601691300"), return success(adminService.addAdmin(AdminSecurityContextHolder.getContext().getAdminId(), adminAddDTO));
@ApiImplicitParam(name = "nickname", value = "昵称", required = true, example = "小王"),
@ApiImplicitParam(name = "password", value = "密码", required = true, example = "buzhidao"),
})
public CommonResult<AdminVO> add(@RequestParam("username") String username,
@RequestParam("nickname") String nickname,
@RequestParam("password") String password) {
AdminAddDTO adminAddDTO = new AdminAddDTO().setUsername(username).setNickname(nickname).setPassword(password);
return AdminConvert.INSTANCE.convert2(adminService.addAdmin(AdminSecurityContextHolder.getContext().getAdminId(), adminAddDTO));
} }
@PostMapping("/update") @PostMapping("/update")
@ -157,7 +150,7 @@ public class AdminController {
List<AdminRoleVO> result = AdminConvert.INSTANCE.convert(allRoleList); List<AdminRoleVO> result = AdminConvert.INSTANCE.convert(allRoleList);
// 设置每个角色是否赋予给改管理员 // 设置每个角色是否赋予给改管理员
result.forEach(adminRoleVO -> adminRoleVO.setAssigned(adminRoleIdSet.contains(adminRoleVO.getId()))); result.forEach(adminRoleVO -> adminRoleVO.setAssigned(adminRoleIdSet.contains(adminRoleVO.getId())));
return CommonResult.success(result); return success(result);
} }
@PostMapping("/assign_role") @PostMapping("/assign_role")

View File

@ -1,8 +1,8 @@
package cn.iocoder.mall.admin.application.convert; package cn.iocoder.mall.admin.application.convert;
import cn.iocoder.common.framework.vo.CommonResult; import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.mall.admin.api.bo.AdminBO; import cn.iocoder.mall.admin.api.bo.admin.AdminBO;
import cn.iocoder.mall.admin.api.bo.AdminPageBO; import cn.iocoder.mall.admin.api.bo.admin.AdminPageBO;
import cn.iocoder.mall.admin.api.bo.RoleBO; import cn.iocoder.mall.admin.api.bo.RoleBO;
import cn.iocoder.mall.admin.application.vo.AdminInfoVO; import cn.iocoder.mall.admin.application.vo.AdminInfoVO;
import cn.iocoder.mall.admin.application.vo.AdminPageVO; import cn.iocoder.mall.admin.application.vo.AdminPageVO;

View File

@ -14,12 +14,16 @@ public class AdminVO {
@ApiModelProperty(value = "管理员编号", required = true, example = "1") @ApiModelProperty(value = "管理员编号", required = true, example = "1")
private Integer id; private Integer id;
@ApiModelProperty(value = "登陆账号", required = true, example = "15601691300") @ApiModelProperty(value = "登陆账号", required = true, example = "15601691300")
private String username; private String username;
@ApiModelProperty(value = "昵称", required = true, example = "小王") @ApiModelProperty(value = "昵称", required = true, example = "小王")
private String nickname; private String nickname;
@ApiModelProperty(value = "账号状态", required = true, example = "1") @ApiModelProperty(value = "账号状态", required = true, example = "1")
private Integer status; private Integer status;
@ApiModelProperty(value = "创建时间", required = true, example = "时间戳格式") @ApiModelProperty(value = "创建时间", required = true, example = "时间戳格式")
private Date createTime; private Date createTime;

View File

@ -16,7 +16,3 @@ management:
swagger: swagger:
enable: true # 暂时不去掉 enable: true # 暂时不去掉
title: 管理员子系统
description: 管理员子系统
version: 1.0.0
base-package: cn.iocoder.mall.admin.application.controller

View File

@ -27,4 +27,8 @@ qiniu:
bucket: onemall bucket: onemall
swagger: swagger:
enable: false # 暂时不去掉 enable: true # 暂时不去掉
title: 管理员子系统
description: 管理员子系统
version: 1.0.0
base-package: cn.iocoder.mall.admin.application.controller

View File

@ -19,6 +19,12 @@
<version>1.0-SNAPSHOT</version> <version>1.0-SNAPSHOT</version>
</dependency> </dependency>
<!-- Web 相关 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
</dependency>
<!-- 工具类相关 --> <!-- 工具类相关 -->
<dependency> <dependency>
<groupId>org.mapstruct</groupId> <groupId>org.mapstruct</groupId>

View File

@ -3,11 +3,11 @@ package cn.iocoder.mall.admin.api;
import cn.iocoder.common.framework.constant.CommonStatusEnum; import cn.iocoder.common.framework.constant.CommonStatusEnum;
import cn.iocoder.common.framework.validator.InEnum; import cn.iocoder.common.framework.validator.InEnum;
import cn.iocoder.common.framework.vo.CommonResult; import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.mall.admin.api.bo.AdminBO; import cn.iocoder.mall.admin.api.bo.admin.AdminBO;
import cn.iocoder.mall.admin.api.bo.AdminPageBO; import cn.iocoder.mall.admin.api.bo.admin.AdminPageBO;
import cn.iocoder.mall.admin.api.dto.AdminAddDTO; import cn.iocoder.mall.admin.api.dto.admin.AdminAddDTO;
import cn.iocoder.mall.admin.api.dto.AdminPageDTO; import cn.iocoder.mall.admin.api.dto.admin.AdminPageDTO;
import cn.iocoder.mall.admin.api.dto.AdminUpdateDTO; import cn.iocoder.mall.admin.api.dto.admin.AdminUpdateDTO;
import java.util.Set; import java.util.Set;
@ -18,7 +18,7 @@ public interface AdminService {
CommonResult<AdminPageBO> getAdminPage(AdminPageDTO adminPageDTO); CommonResult<AdminPageBO> getAdminPage(AdminPageDTO adminPageDTO);
CommonResult<AdminBO> addAdmin(Integer adminId, AdminAddDTO adminAddDTO); AdminBO addAdmin(Integer adminId, AdminAddDTO adminAddDTO);
CommonResult<Boolean> updateAdmin(Integer adminId, AdminUpdateDTO adminUpdateDTO); CommonResult<Boolean> updateAdmin(Integer adminId, AdminUpdateDTO adminUpdateDTO);

View File

@ -1,37 +0,0 @@
package cn.iocoder.mall.admin.api.bo;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
/**
* 管理员 BO
*/
@Data
@Accessors(chain = true)
public class AdminBO implements Serializable {
/**
* 管理员编号
*/
private Integer id;
/**
* 登陆账号
*/
private String username;
/**
* 昵称
*/
private String nickname;
/**
* 账号状态
*/
private Integer status;
/**
* 创建时间
*/
private Date createTime;
}

View File

@ -0,0 +1,31 @@
package cn.iocoder.mall.admin.api.bo.admin;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
@ApiModel("管理员 BO")
@Data
@Accessors(chain = true)
public class AdminBO implements Serializable {
@ApiModelProperty(value = "管理员编号", required = true, example = "1")
private Integer id;
@ApiModelProperty(value = "登陆账号", required = true, example = "15601691300")
private String username;
@ApiModelProperty(value = "昵称", required = true, example = "小王")
private String nickname;
@ApiModelProperty(value = "账号状态", required = true, example = "1", dataType= "CommonStatusEnum")
private Integer status;
@ApiModelProperty(value = "创建时间", required = true, example = "时间戳格式")
private Date createTime;
}

View File

@ -1,4 +1,4 @@
package cn.iocoder.mall.admin.api.bo; package cn.iocoder.mall.admin.api.bo.admin;
import lombok.Data; import lombok.Data;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;

View File

@ -1,5 +1,7 @@
package cn.iocoder.mall.admin.api.dto; package cn.iocoder.mall.admin.api.dto.admin;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
import org.hibernate.validator.constraints.Length; import org.hibernate.validator.constraints.Length;
@ -8,29 +10,23 @@ import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Pattern; import javax.validation.constraints.Pattern;
import java.io.Serializable; import java.io.Serializable;
/** @ApiModel("管理员添加 DTO")
* 管理员添加 DTO
*/
@Data @Data
@Accessors(chain = true) @Accessors(chain = true)
public class AdminAddDTO implements Serializable { public class AdminAddDTO implements Serializable {
/** @ApiModelProperty(value = "登陆账号", required = true, example = "15601691300")
* 登陆账号
*/
@NotEmpty(message = "登陆账号不能为空") @NotEmpty(message = "登陆账号不能为空")
@Length(min = 6, max = 16, message = "账号长度为 6-16 位") @Length(min = 6, max = 16, message = "账号长度为 6-16 位")
@Pattern(regexp = "^[A-Za-z0-9]+$", message = "账号格式为数字以及字母") @Pattern(regexp = "^[A-Za-z0-9]+$", message = "账号格式为数字以及字母")
private String username; private String username;
/**
* 昵称 @ApiModelProperty(value = "昵称", required = true, example = "小王")
*/
@NotEmpty(message = "昵称不能为空") @NotEmpty(message = "昵称不能为空")
@Length(max = 10, message = "昵称长度最大为 10 位") @Length(max = 10, message = "昵称长度最大为 10 位")
private String nickname; private String nickname;
/**
* 密码 @ApiModelProperty(value = "密码", required = true, example = "buzhidao")
*/
@NotEmpty(message = "密码不能为空") @NotEmpty(message = "密码不能为空")
@Length(min = 6, max = 16, message = "密码长度为 6-16 位") @Length(min = 6, max = 16, message = "密码长度为 6-16 位")
private String password; private String password;

View File

@ -1,4 +1,4 @@
package cn.iocoder.mall.admin.api.dto; package cn.iocoder.mall.admin.api.dto.admin;
import lombok.Data; import lombok.Data;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;

View File

@ -1,5 +1,7 @@
package cn.iocoder.mall.admin.api.dto; package cn.iocoder.mall.admin.api.dto.admin;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import lombok.Data; import lombok.Data;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
import org.hibernate.validator.constraints.Length; import org.hibernate.validator.constraints.Length;
@ -14,6 +16,12 @@ import java.io.Serializable;
*/ */
@Data @Data
@Accessors(chain = true) @Accessors(chain = true)
@ApiImplicitParams({
@ApiImplicitParam(name = "id", value = "管理员编号", required = true, example = "1"),
@ApiImplicitParam(name = "username", value = "账号", required = true, example = "15601691300"),
@ApiImplicitParam(name = "nickname", value = "昵称", required = true, example = "小王"),
@ApiImplicitParam(name = "password", value = "密码", example = "buzhidao"),
})
public class AdminUpdateDTO implements Serializable { public class AdminUpdateDTO implements Serializable {
/** /**

View File

@ -1,6 +1,9 @@
package cn.iocoder.mall.admin.config; package cn.iocoder.mall.admin.config;
import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector;
import com.baomidou.mybatisplus.core.injector.ISqlInjector;
import org.mybatis.spring.annotation.MapperScan; import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement; import org.springframework.transaction.annotation.EnableTransactionManagement;
@ -11,4 +14,9 @@ public class DatabaseConfiguration {
// 数据库连接池 Druid // 数据库连接池 Druid
@Bean
public ISqlInjector sqlInjector() {
return new DefaultSqlInjector(); // MyBatis Plus 逻辑删除
}
} }

View File

@ -1,8 +1,8 @@
package cn.iocoder.mall.admin.convert; package cn.iocoder.mall.admin.convert;
import cn.iocoder.mall.admin.api.bo.AdminBO; import cn.iocoder.mall.admin.api.bo.admin.AdminBO;
import cn.iocoder.mall.admin.api.dto.AdminAddDTO; import cn.iocoder.mall.admin.api.dto.admin.AdminAddDTO;
import cn.iocoder.mall.admin.api.dto.AdminUpdateDTO; import cn.iocoder.mall.admin.api.dto.admin.AdminUpdateDTO;
import cn.iocoder.mall.admin.dataobject.AdminDO; import cn.iocoder.mall.admin.dataobject.AdminDO;
import org.mapstruct.Mapper; import org.mapstruct.Mapper;
import org.mapstruct.Mappings; import org.mapstruct.Mappings;

View File

@ -1,17 +1,19 @@
package cn.iocoder.mall.admin.dao; package cn.iocoder.mall.admin.dao;
import cn.iocoder.mall.admin.dataobject.AdminDO; import cn.iocoder.mall.admin.dataobject.AdminDO;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import java.util.List; import java.util.List;
@Repository @Repository
public interface AdminMapper { public interface AdminMapper extends BaseMapper<AdminDO> {
AdminDO selectById(@Param("id") Integer id); default AdminDO selectByUsername(@Param("username") String username) {
return selectOne(new QueryWrapper<AdminDO>().eq("username", username));
AdminDO selectByUsername(@Param("username") String username); }
List<AdminDO> selectListByNicknameLike(@Param("nickname") String nickname, List<AdminDO> selectListByNicknameLike(@Param("nickname") String nickname,
@Param("offset") Integer offset, @Param("offset") Integer offset,
@ -19,8 +21,6 @@ public interface AdminMapper {
Integer selectCountByNicknameLike(@Param("nickname") String nickname); Integer selectCountByNicknameLike(@Param("nickname") String nickname);
void insert(AdminDO admin);
int update(AdminDO admin); int update(AdminDO admin);
} }

View File

@ -1,12 +1,14 @@
package cn.iocoder.mall.admin.dataobject; package cn.iocoder.mall.admin.dataobject;
import cn.iocoder.common.framework.dataobject.DeletableDO; import cn.iocoder.common.framework.dataobject.DeletableDO;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data; import lombok.Data;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
/** /**
* 管理员实体 * 管理员实体
*/ */
@TableName(value = "admin")
@Data @Data
@Accessors(chain = true) @Accessors(chain = true)
public class AdminDO extends DeletableDO { public class AdminDO extends DeletableDO {

View File

@ -5,13 +5,13 @@ import cn.iocoder.common.framework.constant.DeletedStatusEnum;
import cn.iocoder.common.framework.util.ServiceExceptionUtil; import cn.iocoder.common.framework.util.ServiceExceptionUtil;
import cn.iocoder.common.framework.vo.CommonResult; import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.mall.admin.api.AdminService; import cn.iocoder.mall.admin.api.AdminService;
import cn.iocoder.mall.admin.api.bo.AdminBO; import cn.iocoder.mall.admin.api.bo.admin.AdminBO;
import cn.iocoder.mall.admin.api.bo.AdminPageBO; import cn.iocoder.mall.admin.api.bo.admin.AdminPageBO;
import cn.iocoder.mall.admin.api.constant.AdminConstants; import cn.iocoder.mall.admin.api.constant.AdminConstants;
import cn.iocoder.mall.admin.api.constant.AdminErrorCodeEnum; import cn.iocoder.mall.admin.api.constant.AdminErrorCodeEnum;
import cn.iocoder.mall.admin.api.dto.AdminAddDTO; import cn.iocoder.mall.admin.api.dto.admin.AdminAddDTO;
import cn.iocoder.mall.admin.api.dto.AdminPageDTO; import cn.iocoder.mall.admin.api.dto.admin.AdminPageDTO;
import cn.iocoder.mall.admin.api.dto.AdminUpdateDTO; import cn.iocoder.mall.admin.api.dto.admin.AdminUpdateDTO;
import cn.iocoder.mall.admin.convert.AdminConvert; import cn.iocoder.mall.admin.convert.AdminConvert;
import cn.iocoder.mall.admin.dao.AdminMapper; import cn.iocoder.mall.admin.dao.AdminMapper;
import cn.iocoder.mall.admin.dao.AdminRoleMapper; import cn.iocoder.mall.admin.dao.AdminRoleMapper;
@ -79,10 +79,10 @@ public class AdminServiceImpl implements AdminService {
} }
@Override @Override
public CommonResult<AdminBO> addAdmin(Integer adminId, AdminAddDTO adminAddDTO) { public AdminBO addAdmin(Integer adminId, AdminAddDTO adminAddDTO) {
// 校验账号唯一 // 校验账号唯一
if (adminMapper.selectByUsername(adminAddDTO.getUsername()) != null) { if (adminMapper.selectByUsername(adminAddDTO.getUsername()) != null) {
return ServiceExceptionUtil.error(AdminErrorCodeEnum.ADMIN_USERNAME_EXISTS.getCode()); throw ServiceExceptionUtil.exception(AdminErrorCodeEnum.ADMIN_USERNAME_EXISTS.getCode());
} }
// 保存到数据库 // 保存到数据库
AdminDO admin = AdminConvert.INSTANCE.convert(adminAddDTO) AdminDO admin = AdminConvert.INSTANCE.convert(adminAddDTO)
@ -93,7 +93,7 @@ public class AdminServiceImpl implements AdminService {
adminMapper.insert(admin); adminMapper.insert(admin);
// TODO 插入操作日志 // TODO 插入操作日志
// 返回成功 // 返回成功
return CommonResult.success(AdminConvert.INSTANCE.convert(admin)); return AdminConvert.INSTANCE.convert(admin);
} }
@Override @Override

View File

@ -19,6 +19,8 @@ mybatis-plus:
global-config: global-config:
db-config: db-config:
id-type: auto id-type: auto
logic-delete-value: 1 # 逻辑已删除值(默认为 1)
logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
mapper-locations: classpath*:mapper/*.xml mapper-locations: classpath*:mapper/*.xml
type-aliases-package: cn.iocoder.mall.admin.dataobject type-aliases-package: cn.iocoder.mall.admin.dataobject

View File

@ -7,14 +7,6 @@
create_time create_time
</sql> </sql>
<select id="selectByUsername" parameterType="String" resultType="AdminDO">
SELECT
<include refid="FIELDS" />
FROM admin
WHERE username = #{username}
AND deleted = 0
</select>
<select id="selectListByNicknameLike" resultType="AdminDO"> <select id="selectListByNicknameLike" resultType="AdminDO">
SELECT SELECT
<include refid="FIELDS" /> <include refid="FIELDS" />
@ -40,16 +32,6 @@
</where> </where>
</select> </select>
<insert id="insert" parameterType="AdminDO" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
INSERT INTO admin (
username, nickname, password, status,
create_time, deleted
) VALUES (
#{username}, #{nickname}, #{password}, #{status},
#{createTime}, #{deleted}
)
</insert>
<select id="selectById" parameterType="Integer" resultType="AdminDO"> <select id="selectById" parameterType="Integer" resultType="AdminDO">
SELECT SELECT
<include refid="FIELDS" /> <include refid="FIELDS" />

View File

@ -7,19 +7,18 @@ spring:
password: ${MALL_MYSQL_PASSWORD} password: ${MALL_MYSQL_PASSWORD}
# mybatis # mybatis
mybatis: #mybatis:
config-location: classpath:mybatis-config.xml # config-location: classpath:mybatis-config.xml
mapper-locations: classpath:mapper/*.xml # mapper-locations: classpath:mapper/*.xml
type-aliases-package: cn.iocoder.mall.user.biz.dataobject # type-aliases-package: cn.iocoder.mall.user.biz.dataobject
# mybatis-plus # mybatis-plus
#mybatis-plus: mybatis-plus:
# configuration: configuration:
# mapUnderscoreToCamelCase: true # 虽然默认为 true ,但是还是显示去指定下。 mapUnderscoreToCamelCase: true # 虽然默认为 true ,但是还是显示去指定下。
# mapperLocations: classpath*:mapper/*.xml mapperLocations: classpath*:mapper/*.xml
# typeAliasesPackage: cn.iocoder.mall.user.biz.dataobject typeAliasesPackage: cn.iocoder.mall.user.biz.dataobject
# mapper-locations: classpath*:mapper/*.xml config-location: classpath:mybatis-config.xml
# type-aliases-package: cn.iocoder.mall.user.biz.dataobject
# dubbo # dubbo
dubbo: dubbo:

View File

@ -17,7 +17,7 @@
AND valid = 1 AND valid = 1
</update> </update>
<select id="selectById" parameterType="String" resultType="OAuth2RefreshTokenDO"> <select id="selectById" parameterType="string" resultType="cn.iocoder.mall.user.biz.dataobject.OAuth2RefreshTokenDO">
SELECT SELECT
id, user_id, valid, expires_time, create_time id, user_id, valid, expires_time, create_time
FROM oauth2_refresh_token FROM oauth2_refresh_token