024-从零搭建微服务-系统服务(六)

这篇具有很好参考价值的文章主要介绍了024-从零搭建微服务-系统服务(六)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

写在最前

如果这个项目让你有所收获,记得 Star 关注哦,这对我是非常不错的鼓励与支持。

源码地址(后端):https://gitee.com/csps/mingyue-springcloud-learning

源码地址(前端):https://gitee.com/csps/mingyue-springcloud-ui

文档地址:https://gitee.com/csps/mingyue-springcloud-learning/wikis

本节概要

mingyue-ui 目前与后端交互只有登录登出接口,本节从用户入手,完成用户前后端交互增删改查

分页查询用户

分页查询通用类

@Data
@Schema(description = "分页查询通用类")
public class PageCommon implements Serializable {

	private static final long serialVersionUID = 1L;

	@Schema(description = "分页大小")
	private Integer pageSize;

	@Schema(description = "当前页数")
	private Integer pageNum;

	@Schema(description = "排序列")
	private String orderByColumn;

	@Schema(description = "排序的方向 desc 或者 asc")
	private String isAsc;

	/**
	 * 当前记录起始索引 默认值
	 */
	public static final int DEFAULT_PAGE_NUM = 1;

	/**
	 * 每页显示记录数 默认值 默认查全部
	 */
	public static final int DEFAULT_PAGE_SIZE = Integer.MAX_VALUE;

	public <T> Page<T> build() {
		Integer pageNum = ObjectUtil.defaultIfNull(getPageNum(), DEFAULT_PAGE_NUM);
		Integer pageSize = ObjectUtil.defaultIfNull(getPageSize(), DEFAULT_PAGE_SIZE);
		if (pageNum <= 0) {
			pageNum = DEFAULT_PAGE_NUM;
		}
		Page<T> page = new Page<>(pageNum, pageSize);
		List<OrderItem> orderItems = buildOrderItem();
		if (CollUtil.isNotEmpty(orderItems)) {
			page.addOrder(orderItems);
		}
		return page;
	}

	/**
	 * 构建排序
	 *
	 * 支持的用法如下: {isAsc:"asc",orderByColumn:"id"} order by id asc
	 * {isAsc:"asc",orderByColumn:"id,createTime"} order by id asc,create_time asc
	 * {isAsc:"desc",orderByColumn:"id,createTime"} order by id desc,create_time desc
	 * {isAsc:"asc,desc",orderByColumn:"id,createTime"} order by id asc,create_time desc
	 */
	private List<OrderItem> buildOrderItem() {
		if (StrUtil.isBlank(orderByColumn) || StrUtil.isBlank(isAsc)) {
			return null;
		}
		String orderBy = SqlUtil.escapeOrderBySql(orderByColumn);
		orderBy = StrUtil.toUnderlineCase(orderBy);

		String[] orderByArr = orderBy.split(StrUtil.COMMA);
		String[] isAscArr = isAsc.split(StrUtil.COMMA);
		if (isAscArr.length != 1 && isAscArr.length != orderByArr.length) {
			throw new ServiceException("排序参数有误");
		}

		List<OrderItem> list = new ArrayList<>();
		// 每个字段各自排序
		for (int i = 0; i < orderByArr.length; i++) {
			String orderByStr = orderByArr[i];
			String isAscStr = isAscArr.length == 1 ? isAscArr[0] : isAscArr[i];
			if ("asc".equals(isAscStr)) {
				list.add(OrderItem.asc(orderByStr));
			}
			else if ("desc".equals(isAscStr)) {
				list.add(OrderItem.desc(orderByStr));
			}
			else {
				throw new ServiceException("排序参数有误");
			}
		}

		return list;
	}

}

接口层

@GetMapping("list")
@SaCheckPermission("system:user:list")
@Operation(summary = "获取所有用户信息")
public R<IPage<SysUserVo>> getSysUsers(PageCommon page, UserQueryDto dto) {
  return R.ok(sysUserService.getSysUsers(page, dto));
}

逻辑层

@Override
public IPage<SysUserVo> getSysUsers(PageCommon page, UserQueryDto dto) {
  return sysUserMapper.getUserVosPage(page.build(), dto);
}

数据层

<select id="getUserVosPage" resultType="com.csp.mingyue.system.api.vo.SysUserVo">
      SELECT su.*,sr.role_name, sr.role_code
      FROM sys_user su
      LEFT JOIN sys_user_role sur ON sur.user_id = su.user_id
      LEFT JOIN sys_role sr ON sur.role_id = sr.role_id
      <where>
          su.is_deleted = '0'
          <if test="query.username != null and query.username != ''">
              <bind name="usernameLike" value="'%' + query.username + '%'" />
              and su.username LIKE #{usernameLike}
          </if>
      </where>
      ORDER BY su.create_time DESC
  </select>

接口测试

非排序入参

curl -X 'GET' \
  'http://mingyue-gateway:9100/system/sysUser/list?pageSize=10&pageNum=1&username=' \
  -H 'accept: */*' \
  -H 'Authorization: vhiqUYS3NtT5zpvyzwudffAhyu3vswAV'

排序入参

curl -X 'GET' \
  'http://mingyue-gateway:9100/system/sysUser/list?pageSize=10&pageNum=2&orderByColumn=userId&isAsc=desc&username=' \
  -H 'accept: */*' \
  -H 'Authorization: vhiqUYS3NtT5zpvyzwudffAhyu3vswAV'

添加或编辑用户

接口层

@PostMapping("addOrEdit")
@Operation(summary = "添加或编辑用户")
public R<Boolean> addOrEdit(@Valid @RequestBody UserAddOrEditDto dto) {
  return R.ok(sysUserService.addOrEdit(dto));
}

逻辑层

@Override
@Transactional(rollbackFor = Exception.class)
public boolean addOrEdit(UserAddOrEditDto dto) {
  SysUser sysUser = BeanUtil.copyProperties(dto, SysUser.class);

  // 添加用户
  if (Objects.isNull(sysUser.getUserId())) {
    // 密码加密
    sysUser.setPassword(BCrypt.hashpw(sysUser.getPassword(), userPasswordProperties.getSalt()));
  }

  boolean flag = this.saveOrUpdate(sysUser);
  if (!flag) {
    throw new UserException("用户信息保存异常");
  }

  // 保存角色关系
  flag = sysRoleService.addUserRole(sysUser.getUserId(), dto.getRoleCode());
  if (!flag) {
    throw new UserException("用户角色信息保存异常");
  }

  return true;
}

删除用户

接口层

@DeleteMapping("{userId}")
@Operation(summary = "删除用户", parameters = { @Parameter(name = "userId", description = "用户ID", required = true) })
public R<Boolean> delUser(@PathVariable Long userId) {
  return R.ok(sysUserService.delUser(userId));
}

逻辑层

@Override
public boolean delUser(Long userId) {
  return sysUserMapper.deleteByIdLogic(userId) > 0;
}

数据层

<delete id="deleteByIdLogic">
    UPDATE sys_user su SET su.is_deleted = '1' WHERE su.user_id = #{userId}
</delete>

mingyue-ui 接口交互

接口定义

list: (page: object) => {
    return request({
        url: '/api/system/sysUser/list',
        method: 'get',
        params: page
    });
},
addOrEdit: (data: object) => {
    return request({
        url: '/api/system/sysUser/addOrEdit',
        method: 'post',
        data: data
    });
},
del: (userId: number) => {
    return request({
        url: '/api/system/sysUser/' + userId,
        method: 'delete'
    });
}

分页查询

src/views/system/user/index.vue

const getTableData = async () => {
  state.tableData.loading = true;

  const res = await getUserList();
  state.tableData.data = res.data.records;
  state.tableData.total = res.data.total;

  state.tableData.loading = false;
};

添加或编辑用户

src/views/system/user/dialog.vue

const onSubmit = () => {
  userApi().addOrEdit(state.ruleForm).then(res => {
    if (res.data) {
      closeDialog();
      emit('refresh');
      state.dialog.type === 'add' ? ElMessage.success('添加成功') : ElMessage.success('修改成功');
    } else {
      state.dialog.type === 'add' ? ElMessage.error('添加失败') : ElMessage.error('修改失败');
    }
  })
};

删除用户

src/views/system/user/index.vue

const onRowDel = (row: RowUserType) => {
	ElMessageBox.confirm(`此操作将永久删除账户名称:“${row.username}”,是否继续?`, '提示', {
		confirmButtonText: '确认',
		cancelButtonText: '取消',
		type: 'warning',
	})
		.then(() => {
      userApi().del(row.userId).then(() => {
        getTableData();
        ElMessage.success('删除成功');
      });
		})
		.catch(() => {});
};

小结

用户管理已经可以交互接口完成真实的增删改查了。

目前 mingyue 已经包含了 统一网关服务统一认证服务统一系统服务统一推送服务,距离目标还差

统一文件服务统一定时服务统一搜索服务 等等。接下来搞一搞 统一文件服务 吧!

本人后端一枚,前端粗通,等后续后端服务基本完成后,再去抽时间完善前端代码哈~~ 见谅《 - 。- 》文章来源地址https://www.toymoban.com/news/detail-698961.html

到了这里,关于024-从零搭建微服务-系统服务(六)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 从零开始:如何使用Docker构建微服务架构

    使用 Docker 构建微服务架构是一种流行的方法,因为 Docker 提供了轻量级的容器化技术,使得每个微服务可以在隔离的环境中独立运行。从零开始构建这样的架构涉及到多个步骤,包括理解微服务架构的基本概念、安装 Docker、创建 Docker 容器和镜像、配置网络,以及部署和管理

    2024年04月14日
    浏览(58)
  • 023-从零搭建微服务-推送服务(三)

    原【短信服务】更名【推送服务】 如果这个项目让你有所收获,记得 Star 关注哦,这对我是非常不错的鼓励与支持。 源码地址(后端):https://gitee.com/csps/mingyue-springcloud-learning 源码地址(前端):https://gitee.com/csps/mingyue-springcloud-ui 文档地址:https://gitee.com/csps/mingyue-springc

    2024年02月10日
    浏览(32)
  • 027-从零搭建微服务-搜索服务(一)

    如果这个项目让你有所收获,记得 Star 关注哦,这对我是非常不错的鼓励与支持。 源码地址(后端):https://gitee.com/csps/mingyue-springcloud-learning 源码地址(前端):https://gitee.com/csps/mingyue-springcloud-ui 文档地址:https://gitee.com/csps/mingyue-springcloud-learning/wikis Docker 安装 ELK 7.17.2 h

    2024年02月07日
    浏览(35)
  • 028-从零搭建微服务-搜索服务(二)

    如果这个项目让你有所收获,记得 Star 关注哦,这对我是非常不错的鼓励与支持。 源码地址(后端):https://gitee.com/csps/mingyue-springcloud-learning 源码地址(前端):https://gitee.com/csps/mingyue-springcloud-ui 文档地址:https://gitee.com/csps/mingyue-springcloud-learning/wikis 更多用法可以参考 E

    2024年02月07日
    浏览(31)
  • 021-从零搭建微服务-短信服务(一)

    如果这个项目让你有所收获,记得 Star 关注哦,这对我是非常不错的鼓励与支持。 源码地址(后端):https://gitee.com/csps/mingyue-springcloud-learning 源码地址(前端):https://gitee.com/csps/mingyue-springcloud-ui 文档地址:https://gitee.com/csps/mingyue-springcloud-learning/wikis 短信服务(Short Messa

    2024年02月11日
    浏览(36)
  • 022-从零搭建微服务-短信服务(二)

    如果这个项目让你有所收获,记得 Star 关注哦,这对我是非常不错的鼓励与支持。 源码地址(后端):https://gitee.com/csps/mingyue-springcloud-learning 源码地址(前端):https://gitee.com/csps/mingyue-springcloud-ui 文档地址:https://gitee.com/csps/mingyue-springcloud-learning/wikis 需要注册一个阿里云账

    2024年02月11日
    浏览(34)
  • 从零搭建微服务-认证中心(二)

    如果这个项目让你有所收获,记得 Star 关注哦,这对我是非常不错的鼓励与支持。 源码地址(后端):https://gitee.com/csps/mingyue-springcloud-learning 源码地址(前端):https://gitee.com/csps/mingyue-springcloud-ui 文档地址:https://gitee.com/csps/mingyue-springcloud-learning/wikis Idea 创建 maven 项目这儿

    2024年02月06日
    浏览(33)
  • 从零开始的Spring Cloud Gateway指南:构建强大微服务架构

    微服务架构的兴起已经改变了软件开发的面貌,使得开发者能够更灵活地构建、部署和维护应用程序。而在这个微服务的时代,强大而灵活的网关是确保微服务之间通信顺畅的关键之一。在本文中,我们将深入研究Spring Cloud Gateway,一款开源的、基于Spring Framework的微服务网关

    2024年02月02日
    浏览(63)
  • 020-从零搭建微服务-认证中心(九)

    如果这个项目让你有所收获,记得 Star 关注哦,这对我是非常不错的鼓励与支持。 源码地址(后端):https://gitee.com/csps/mingyue-springcloud-learning 源码地址(前端):https://gitee.com/csps/mingyue-springcloud-ui 文档地址:https://gitee.com/csps/mingyue-springcloud-learning/wikis 密码加密是安全认证不

    2024年02月12日
    浏览(32)
  • 019-从零搭建微服务-认证中心(八)

    如果这个项目让你有所收获,记得 Star 关注哦,这对我是非常不错的鼓励与支持。 源码地址(后端):https://gitee.com/csps/mingyue-springcloud-learning 源码地址(前端):https://gitee.com/csps/mingyue-springcloud-ui 文档地址:https://gitee.com/csps/mingyue-springcloud-learning/wikis 我们现在已经可以通过

    2024年02月13日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包