微服务项目->在线oj系统(Java-Spring)--C端用户管理
·
表结构设计
create table tb_user(
user_id bigint unsigned NOT NULL COMMENT '用户id(主键)',
nick_name varchar(20) comment '用户昵称',
head_image varchar(100) comment '用户头像',
sex tinyint comment '用户状态1:男 2:女',
phone char(11) not null comment '手机号',
code char(6) comment '验证码',
email varchar(20) comment '邮箱',
wechat varchar(20) comment '微信号',
school_name varchar(20) comment '学校',
major_name varchar(20) comment '专业',
introduce varchar(100) comment '个人介绍',
status tinyint not null comment '用户状态0:拉黑 1:正常',
create_by bigint unsigned not null comment '创建人',
create_time datetime not null comment '创建时间',
update_by bigint unsigned comment '更新人',
update_time datetime comment '更新时间',
primary key(`user_id`)
)
用户列表功能

后端代码
Controller
package com.bite.system.controller;
import com.bite.common.core.controller.BaseController;
import com.bite.common.core.vo.TableDataInfo;
import com.bite.system.model.user.DTO.UserQueryDTO;
import com.bite.system.service.impl.user.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/user")
public class UserController extends BaseController {
@Autowired
private IUserService userService;
@GetMapping("/list")
public TableDataInfo list(UserQueryDTO userQueryDTO) {
return getDataTable(userService.list(userQueryDTO));
}
}
DTO

Vo
package com.bite.system.model.user.vo;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class UserVO {
@JsonSerialize(using = ToStringSerializer.class)
private Long userId;
private String nickName;
private Integer sex;
private String phone;
private String email;
private String wechat;
private String schoolName;
private String majorName;
private String introduce;
private Integer status;
}
Entity
package com.bite.system.model.user;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.bite.common.core.domain.BaseEntity;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@TableName("tb_user")
public class User extends BaseEntity {
@JsonSerialize(using = ToStringSerializer.class)
@TableId(value = "USER_ID", type = IdType.ASSIGN_ID)
private Long userId;
private String nickName;
private String headImage;
private Integer sex;
private String phone;
private String code;
private String email;
private String wechat;
private String schoolName;
private String majorName;
private String introduce;
private Integer status;
}
Service
package com.bite.system.service.impl.user.imp;
import com.bite.system.mapper.user.UserMapper;
import com.bite.system.model.user.DTO.UserQueryDTO;
import com.bite.system.model.user.vo.UserVO;
import com.bite.system.service.impl.user.IUserService;
import com.github.pagehelper.PageHelper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
@Slf4j
public class UserServiceImpl implements IUserService {
@Autowired
private UserMapper userMapper;
@Override
public List<UserVO> list(UserQueryDTO userQueryDTO) {
PageHelper.startPage(userQueryDTO.getPageNum(), userQueryDTO.getPageSize());
return userMapper.selectUserList(userQueryDTO);
}
}
Mapper
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.bite.system.model.user.DTO.UserQueryDTO;
import com.bite.system.model.user.User;
import com.bite.system.model.user.vo.UserVO;
import java.util.List;
public interface UserMapper extends BaseMapper<User> {
List<UserVO> selectUserList(UserQueryDTO userQueryDTO);
}
Mapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.bite.system.mapper.user.UserMapper">
<select id="selectUserList" resultType="com.bite.system.model.user.vo.UserVO">
SELECT
user_id,
nick_name,
sex,
phone,
email,
wechat,
school_name,
major_name,
introduce,
status
FROM
tb_user
<where>
<if test="userId !=null ">
user_id = #{userId}
</if>
<if test="nickName !=null and nickName != ''">
AND nick_name like concat('%', #{nickName}, '%')
</if>
</where>
ORDER BY
create_time DESC
</select>
</mapper>

修改用户状态功能
后端代码

Controller
@PutMapping("/updateStatus")
//todo 拉黑:限制用户操作 解禁:放开对于用户限制
//更新数据库中用户的状态信息。
public R<Void> updateStatus(@RequestBody UserDTO userDTO) {
return toR(userService.updateStatus(userDTO));
}
DTO
@Getter
@Setter
public class UserDTO {
private Long userId;
private Integer status;
}
Service
这里逻辑和代码都很简单,就是去数据库里面查找到用户,然后修改用户的状态,然后再存入数据库里面
@Override
public int updateStatus(UserDTO userDTO) {
User user = userMapper.selectById(userDTO.getUserId());
if (user == null) {
throw new ServiceException(ResultCode.FAILED_USER_NOT_EXISTS);
}
user.setStatus(userDTO.getStatus());
return userMapper.updateById(user);
}

前端代码
cuser.js
import service from '@/utils/request'
export function getUserListService(params) {
return service({
url: "/user/list",
method: "get",
params,
});
}
export function updateStatusService(params = {}) {
return service({
url: "/user/updateStatus",
method: "put",
data: params,
});
}
cuser.vue
<template>
<!-- 表单 -->
<el-form inline="true">
<el-form-item label="用户id">
<el-input v-model="params.userId" placeholder="请您输入要搜索的用户id" />
</el-form-item>
<el-form-item label="用户昵称">
<el-input v-model="params.nickName" placeholder="请您输入要搜索的用户昵称" />
</el-form-item>
<el-form-item>
<el-button @click="onSearch" plain>搜索</el-button>
<el-button @click="onReset" plain type="info">重置</el-button>
</el-form-item>
</el-form>
<!-- 表格 -->
<el-table height="526px" :data="userList">
<el-table-column prop="userId" label="用户id" width="180px" />
<el-table-column prop="nickName" label="用户昵称" />
<el-table-column prop="sex" label="用户性别">
<template #default="{ row }">
<div v-if="row.sex === 1" style="color:#3EC8FF;">男</div>
<div v-if="row.sex === 2" style="color:#FD4C40;">女</div>
</template>
</el-table-column>
<el-table-column prop="phone" width="120px" label="手机号" />
<el-table-column prop="email" width="120px" label="邮箱" />
<el-table-column prop="wechat" width="120px" label="微信号" />
<el-table-column label="学校/专业" width="150px">
<template #default="{ row }">
<span class="block-span"> 学校: {{ row.schoolName }}</span>
<span class="block-span"> 专业: {{ row.majorName }}</span>
</template>
</el-table-column>
<el-table-column prop="introduce" label="个人介绍" />
<el-table-column prop="status" width="90px" label="用户状态">
<template #default="{ row }">
<el-tag type="success" v-if="row.status">正常</el-tag>
<el-tag type="error" v-else>拉黑</el-tag>
</template>
</el-table-column>
<el-table-column label="操作" width="80px" fixed="right">
<template #default="{ row }">
<el-button class="red" v-if="row.status === 1" type="text" plain
@click="onUpdateUserStatus(row.userId, 0)">拉黑</el-button>
<el-button v-if="row.status === 0" type="text" plain @click="onUpdateUserStatus(row.userId, 1)">解禁</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页区域 -->
<el-pagination background size="small" layout="total, sizes, prev, pager, next, jumper" :total="total"
v-model:current-page="params.pageNum" v-model:page-size="params.pageSize" :page-sizes="[5, 10, 15, 20]"
@size-change="handleSizeChange" @current-change="handleCurrentChange" />
</template>
<script setup>
import { reactive, ref } from 'vue';
import { getUserListService,updateStatusService } from '@/apis/cuser'
const params = reactive({
pageNum: 1,
pageSize: 10,
userId: '',
nickName: '',
})
const userList = ref([])
const total = ref(0)
async function getUserList() {
const ref = await getUserListService(params)
userList.value = ref.rows
total.value = ref.total
}
getUserList()
function onSearch() {
params.pageNum = 1
getUserList()
}
function onReset() {
params.pageNum = 1
params.pageSize = 10
params.userId = ''
params.nickName = ''
getUserList()
}
function handleSizeChange(newSize) {
params.pageNum = 1
getUserList()
}
function handleCurrentChange(newPage) {
getUserList()
}
const updateStatusParams = reactive({
userId: '',
status: '',
})
async function onUpdateUserStatus(userId, status) {
updateStatusParams.userId = userId
updateStatusParams.status = status
await updateStatusService(updateStatusParams)
getUserList()
}
</script>
更多推荐




所有评论(0)