springboot+vue开发后台增删改查

news2025/1/11 15:05:24

效果图

80901afefd1e4a47aad146de186ff807.png

3c4004dde4d34fc1a38a4b4263796ad8.png

前端代码【User.vue】

<template>
  <div class="data-container">
    <!--添加 start-->
    <div class="data-header">
      <el-button round @click="addHander" size="large" type="primary">
        <el-icon>
          <DocumentAdd/>
        </el-icon>
        <span>新增</span>
      </el-button>
    </div>
    <!--添加 end-->
    <!--表格数据展示 start-->
    <div class="data-table">
      <el-table :data="dataList.list" style="width: 1200px;">
        <el-table-column label="头像" prop="userImg" align="center">
          <template #default="scope">
            <img :src="scope.row.userImg" style="height:60px"/>
          </template>
        </el-table-column>
        <el-table-column show-overflow-tooltip label="昵称" prop="nickname" align="center"
                         width="120"></el-table-column>
        <el-table-column label="账号" prop="username" align="center" width="140"></el-table-column>
        <el-table-column label="手机号" prop="phone" align="center" width="140"></el-table-column>
        <el-table-column show-overflow-tooltip label="邮箱" prop="email" align="center" width="160"></el-table-column>
        <el-table-column label="性别" prop="userSex" align="center" width="60"></el-table-column>
        <el-table-column label="状态" prop="userStatus" align="center">
          <template #default="scope">
            <el-tag round :type="scope.row.userStatus == '1' ? 'success' : 'info'">
              {{ scope.row.userStatus == '1' ? '激活' : '未激活' }}
            </el-tag>
          </template>
        </el-table-column>
        <el-table-column show-overflow-tooltip label="个性签名" prop="signature" align="center"></el-table-column>
        <el-table-column show-overflow-tooltip label="自我介绍" prop="userIntroduce" align="center"></el-table-column>
        <el-table-column label="操作" align="center" width="220">
          <template #default="scope">
            <el-button size="small" type="primary" @click="handleEdit(scope.$index, scope.row)">编辑</el-button>
            <el-button size="small" type="primary" @click="handleStatus(scope.$index, scope.row)">修改状态</el-button>
            <el-button size="small" type="danger" @click="handleDelete(scope.$index, scope.row)">删除</el-button>
          </template>
        </el-table-column>
      </el-table>
      <!--分页 start-->
      <div class="page">
        <el-pagination background
                       layout="prev,pager,next,jumper"
                       :default-page-size="defaultPageSize"
                       :total="totalData"
                       @current-change="currentChangeHaddler"></el-pagination>
      </div>
      <!--分页 end-->
    </div>
    <!--表格数据展示 end-->
    <!--添加对话框 start-->
    <el-dialog draggable destroy-on-close v-model="dialogAddVisible" title="添加" width="70%" center>
      <el-form inline :model="addFormInfo" label-width="150px">
        <el-form-item label="头像">
          <el-input v-model="addFormInfo.userImg"></el-input>
        </el-form-item>
        <el-form-item label="昵称">
          <el-input v-model="addFormInfo.nickname"></el-input>
        </el-form-item>
        <el-form-item label="账号">
          <el-input v-model="addFormInfo.username"></el-input>
        </el-form-item>
        <el-form-item label="密码">
          <el-input v-model="addFormInfo.password"></el-input>
        </el-form-item>
        <el-form-item label="手机号">
          <el-input v-model="addFormInfo.phone"></el-input>
        </el-form-item>
        <el-form-item label="邮箱">
          <el-input v-model="addFormInfo.email"></el-input>
        </el-form-item>
        <el-form-item label="性别">
          <el-input v-model="addFormInfo.userSex"></el-input>
        </el-form-item>
        <el-form-item label="个性签名">
          <el-input type="textarea" rows="3" style="width: 800px" v-model="addFormInfo.signature"></el-input>
        </el-form-item>
        <el-form-item label="自我介绍">
          <el-input type="textarea" rows="6" style="width: 800px" v-model="addFormInfo.userIntroduce"></el-input>
        </el-form-item>
      </el-form>
      <template #footer>
            <span class="dialog-footer">
                <el-button @click="dialogAddVisible = false">取消</el-button>
                <el-button type="primary" @click="sureHandler">确定</el-button>
            </span>
      </template>
    </el-dialog>
    <!--添加对话框 end-->
    <!--编辑对话框 start-->
    <!--destroy-on-close:每次关闭对话框时直接销毁对话框,没有缓存-->
    <el-dialog
        draggable
        destroy-on-close
        v-model="dialogEditorVisible"
        title="编辑"
        width="70%"
        center>
      <el-form inline :model="editorFormInfo" label-width="150px">
        <el-form-item label="头像">
          <el-input v-model="editorFormInfo.userImg"></el-input>
        </el-form-item>
        <el-form-item label="昵称">
          <el-input v-model="editorFormInfo.nickname"></el-input>
        </el-form-item>
        <el-form-item label="账号">
          <el-input v-model="editorFormInfo.username"></el-input>
        </el-form-item>
        <el-form-item label="密码">
          <el-input v-model="editorFormInfo.password"></el-input>
        </el-form-item>
        <el-form-item label="手机号">
          <el-input v-model="editorFormInfo.phone"></el-input>
        </el-form-item>
        <el-form-item label="邮箱">
          <el-input v-model="editorFormInfo.email"></el-input>
        </el-form-item>
        <el-form-item label="性别">
          <el-input v-model="editorFormInfo.userSex"></el-input>
        </el-form-item>
        <el-form-item label="个性签名">
          <el-input type="textarea" rows="3" style="width: 800px" v-model="editorFormInfo.signature"></el-input>
        </el-form-item>
        <el-form-item label="自我介绍">
          <el-input type="textarea" rows="6" style="width: 800px" v-model="editorFormInfo.userIntroduce"></el-input>
        </el-form-item>
      </el-form>
      <template #footer>
            <span class="dialog-footer">
                <el-button @click="dialogEditorVisible = false">取消</el-button>
                <el-button type="primary" @click="sureEditorHandler">确定</el-button>
            </span>
      </template>
    </el-dialog>
    <!--编辑对话框 end-->
  </div>
</template>

<script setup>
import axios from "@/utils/request.js"
import {onMounted, reactive, ref} from "vue";
import {ElMessage} from "element-plus";
//初始化分页查询数据
const dataList = reactive({
  list: []
})
//初始化总条数
const totalData = ref(0)
//当前页
const currentPage = ref(1)
//初始化分页显示条数
const defaultPageSize = ref(10)
//添加添加对话框控制器
const dialogAddVisible = ref(false)
//初始化添加对话框状态
const addFormInfo = reactive({
  userImg: '',
  nickname: '',
  username: '',
  password: '',
  phone: '',
  email: '',
  userSex: '',
  signature: '',
  userIntroduce: '',
  userStatus: '1',
})
//编辑对话框控制器
const dialogEditorVisible = ref(false)
//初始化编辑对话框状态
const editorFormInfo = reactive({
  userId: '',
  userImg: '',
  nickname: '',
  username: '',
  password: '',
  phone: '',
  email: '',
  userSex: '',
  signature: '',
  userIntroduce: '',
  userStatus: '',
})
/**
 * 网路请求:分页查询
 *  */
const http = (page, size) => {
  axios.get('user/search', {
    params: {
      page: page,
      size: size
    }
  }).then(res => {
    if (res.data.code == 200) {
      dataList.list = res.data.data.records
      totalData.value = res.data.data.total
    } else {
      ElMessage.error(res.data.message)
    }

  })
}
onMounted(() => {
  http(currentPage.value, defaultPageSize.value)
})
/**
 * 分页
 */
const currentChangeHaddler = (nowPage) => {
  http(nowPage, defaultPageSize.value)
  currentPage.value = nowPage
}
/**
 * 添加对话框弹出事件
 */
const addHander = () => {
  dialogAddVisible.value = true
}
/**
 * 添加对话框 确定事件
 */
const sureHandler = () => {
  axios.post('user/add', {
    userImg: addFormInfo.userImg,
    nickname: addFormInfo.nickname,
    username: addFormInfo.username,
    password: addFormInfo.password,
    phone: addFormInfo.phone,
    email: addFormInfo.email,
    userSex: addFormInfo.userSex,
    signature: addFormInfo.signature,
    userIntroduce: addFormInfo.userIntroduce,
    userStatus: addFormInfo.userStatus,
  }).then(res => {
    if (res.data.code == 200) {
      dialogAddVisible.value = false
      http(currentPage.value, defaultPageSize.value)
    } else {
      ElMessage.error(res.data.message)
    }
  })
}
/**
 * 编辑对话框 弹出事件
 *  */
const handleEdit = (index, row) => {

  dialogEditorVisible.value = true
  axios.get('user/findById', {
    params: {
      userId: row.userId
    }
  }).then(res => {

    if (res.data.code == 200) {
      editorFormInfo.userId = res.data.data.userId;
      editorFormInfo.userImg = res.data.data.userImg;
      editorFormInfo.nickname = res.data.data.nickname;
      editorFormInfo.username = res.data.data.username;
      editorFormInfo.password = res.data.data.password;
      editorFormInfo.phone = res.data.data.phone;
      editorFormInfo.email = res.data.data.email;
      editorFormInfo.userSex = res.data.data.userSex;
      editorFormInfo.signature = res.data.data.signature;
      editorFormInfo.userIntroduce = res.data.data.userIntroduce;
      editorFormInfo.userStatus = res.data.data.userStatus;
    } else {
      ElMessage.error(res.data.data.message)
    }
  })

}
/**
 * 编辑对话框 确定事件
 */
const sureEditorHandler = () => {
  axios.post('user/update', {
    userId: editorFormInfo.userId,
    userImg: editorFormInfo.userImg,
    nickname: editorFormInfo.nickname,
    username: editorFormInfo.username,
    password: editorFormInfo.password,
    phone: editorFormInfo.phone,
    email: editorFormInfo.email,
    userSex: editorFormInfo.userSex,
    signature: editorFormInfo.signature,
    userIntroduce: editorFormInfo.userIntroduce,
    userStatus: editorFormInfo.userStatus,
  }).then(res => {
    if (res.data.code == 200) {
      dialogEditorVisible.value = false
      http(currentPage.value, defaultPageSize.value)
    } else {
      //添加失败:给出提示信息(element-plus/反馈组件/message信息提示)
      ElMessage.error(res.data.message)
    }
  })
}
/**删除 */
const handleDelete = (index, row) => {
  ElMessageBox.confirm(
      '确定删除么',
      '删除',
      {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning',
      }
  ).then(() => {
    //确认删除
    axios.delete("user/delete", {
      params: {
        userId: row.userId
      }
    }).then(res => {
      if (res.data.code == 200) {
        ElMessage({
          type: 'success',
          message: "删除成功!!!",
        })
        //刷新
        http(currentPage.value, defaultPageSize.value)
      } else {
        ElMessage({
          type: 'error',
          message: res.data.message,
        })
      }
    })
  }).catch(error => {
    ElMessage({
      type: 'info',
      message: "取消删除",
    })
  })
}
/**
 * 修改用户状态
 */
const handleStatus = (index, row) => {
  axios.post("user/updateStatus", {userId: row.userId}).
      then(res=>{
        if(res.data.code==200){
          ElMessage.success("状态已更改")
          http(currentPage.value, defaultPageSize.value)
        }
  })
}
</script>
<style scoped>
.data-container {
  background: linear-gradient(left, rgb(89, 234, 233) 27%, rgb(131, 231, 218) 44%, rgb(69, 150, 216) 88%);
  background: -o-linear-gradient(left, rgb(89, 234, 233) 27%, rgb(131, 231, 218) 44%, rgb(69, 150, 216) 88%);
  background: -ms-linear-gradient(left, rgb(89, 234, 233) 27%, rgb(131, 231, 218) 44%, rgb(69, 150, 216) 88%);
  background: -moz-linear-gradient(left, rgb(89, 234, 233) 27%, rgb(131, 231, 218) 44%, rgb(69, 150, 216) 88%);
  background: -webkit-linear-gradient(left, rgb(89, 234, 233) 27%, rgb(131, 231, 218) 44%, rgb(69, 150, 216) 88%);
  height: 800px;
}

.data-header {
  padding: 20px;
}

.data-table {
  padding: 20px;
}

.page {
  position: fixed;
  right: 10px;
  bottom: 10px;
}
</style>

后端代码【java】

实体类

package jkw.pojo;

import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;

import java.io.Serializable;

/**
 * 用户
 */
@Data
public class User implements Serializable {
    @TableId
    private Integer userId;

    private String userImg; // 头像
    private String nickname; // 昵称

    private String username; // 账号
    private String password; // 密码
    private String phone; // 手机号

    private String email;//邮箱
    private String userSex; // 性别
    private String signature;//个性签名
    private String userIntroduce;//自我介绍

    private String userStatus; // 用户状态(1激活 0未激活)

}

mapper

package jkw.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import jkw.pojo.User;

public interface UserMapper extends BaseMapper<User> {
}

service

package jkw.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import jkw.pojo.User;

public interface UserService {
    void add(User user);
    void update(User user);
    void delete(Integer id);
    User findById(Integer id);
    Page<User> search(int page,int size);
    void updateStatus(Integer id);
}

serviceImpl

package jkw.service.impl;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import jkw.mapper.UserMapper;
import jkw.pojo.User;
import jkw.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@Transactional
public class UserServiceImpl implements UserService {
    @Autowired
    private UserMapper userMapper;

    @Override
    public void add(User user) {
        userMapper.insert(user);
    }

    @Override
    public void update(User user) {
        userMapper.updateById(user);
    }

    @Override
    public void delete(Integer id) {
        userMapper.deleteById(id);
    }

    @Override
    public User findById(Integer id) {
        return userMapper.selectById(id);
    }

    @Override
    public Page<User> search(int page, int size) {
        return userMapper.selectPage(new Page<>(page, size), null);
    }

    @Override
    public void updateStatus(Integer id) {
        User user = userMapper.selectById(id);
        if(user.getUserStatus().equals("1")){
            user.setUserStatus("0");
            userMapper.updateById(user);
        }else {
            user.setUserStatus("1");
            userMapper.updateById(user);
        }
    }
}

controller

package jkw.controller;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import jkw.pojo.User;
import jkw.service.UserService;
import jkw.vo.BaseResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@CrossOrigin
@RequestMapping("/user")
@RestController
public class UserCon {
    @Autowired
    private UserService userService;

    /**
     * 新增
     *
     * @param user
     * @return
     */
    @PostMapping("/add")
    //@PreAuthorize("hasAnyAuthority('/user')")
    public BaseResult add(User user) {
        userService.add(user);
        return BaseResult.ok();
    }

    /**
     * 修改
     *
     * @param user
     * @return
     */
    @PostMapping("/update")
    public BaseResult update(User user) {
        userService.update(user);
        return BaseResult.ok();
    }

    /**
     * 删除
     *
     * @param userId
     * @return
     */
    @DeleteMapping("/delete")
    public BaseResult delete(Integer userId) {
        userService.delete(userId);
        return BaseResult.ok();
    }

    /**
     * 根据id查询
     *
     * @param userId
     * @return
     */
    @GetMapping("/findById")
    public BaseResult findById(Integer userId) {
        User user = userService.findById(userId);
        return BaseResult.ok(user);
    }

    /**
     * 分页查询
     *
     * @param page
     * @param size
     * @return
     */

    @GetMapping("/search")
    //@PreAuthorize("hasAnyAuthority('/user')")
    public BaseResult search(int page, int size) {
        Page<User> brandPage = userService.search(page, size);
        return BaseResult.ok(brandPage);
    }

    /**
     * 修改状态
     * @param userId
     * @return
     */
    @PostMapping("/updateStatus")
    public BaseResult updateStatus(Integer userId) {
        userService.updateStatus(userId);
        return BaseResult.ok();
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/778529.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Cesium态势标绘专题-普通点(标绘+编辑)

标绘专题介绍:态势标绘专题介绍_总要学点什么的博客-CSDN博客 入口文件:Cesium态势标绘专题-入口_总要学点什么的博客-CSDN博客 辅助文件:Cesium态势标绘专题-辅助文件_总要学点什么的博客-CSDN博客 本专题没有废话,只有代码,代码中涉及到的引入文件方法,从上面三个链…

ORB-SLAM2学习笔记5之EuRoc、TUM和KITTI开源数据运行ROS版ORB-SLAM2生成轨迹

文章目录 0 引言1 数据预处理1.1 EuRoc数据1.2 TUM数据1.3 KITTI数据 2 代码修改2.1 单目2.2 双目2.3 RGB-D 3 运行ROS版ORB-SLAM23.1 单目3.2 双目3.3 RGB-D ORB-SLAM2学习笔记系列&#xff1a; 0 引言 ORB-SLAM2学习笔记1已成功编译安装ROS版本ORB-SLAM2到本地&#xff0c;本…

3、基于Zookeeper实现分布式锁

目录 3.1、Zookeeper安装和相关概念3.1.1 安装启动3.1.2 相关概念3.1.3 Java客户端 3.2 Zookeeper实现分布式锁的思路分析3.3 ZooKeeper分布式锁的基本实现 3.1、Zookeeper安装和相关概念 3.1.1 安装启动 # 解压到/mysoft文件夹下 tar -zxvf zookeeper-3.7.0-bin.tar.gz # 重…

SAP从放弃到入门系列之批次派生-Batch Derivation-Part1

文章目录 一、概述二、系统配置三、主数据3.1 分类主数据3.2 派生规则设置3.2.1发送物料3.2.2 接收物料 四、 测试数据&#xff08;生产订单&#xff09;五、 最后 Batch Derivation翻译成批次派生&#xff08;衍生&#xff09;或批次继承都是问题不大&#xff0c;继承和派生个…

day31贪心算法 用最少数量的箭引爆气球 和无重叠区间

题目描述 题目分析&#xff1a; x轴向上射箭&#xff0c;12一支&#xff0c;重叠的需要一支&#xff0c;3-8一支&#xff0c;7-16一支 返回2&#xff1b; 就是让重叠的气球尽量在一起&#xff0c;局部最优&#xff1b;用一支弓箭&#xff0c;全局最优就是最少弓箭&#xff1b…

ShardingSphere分库分表实战之MySQL主从集群搭建

&#x1f680; ShardingSphere &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&…

uniapp 微信小程序 uni.modal弹框+content内容自定义(内容换行)

效果图&#xff1a; 1、template <view click"showPriceDialog"></view>2、data data() {return {contentText:"",} },3、methods // 价格公示 showPriceDialog: function() {// 吨let minPriceTon 1900let maxPriceTon 3895// 袋let …

23.多项式与非多项式曲线拟合对比(matlab程序)

1.简述 拟合标准&#xff1a; (1)原始数据向量与拟合向量之间的距离最小&#xff0c;该距离的度量一般使用误差平方和表示&#xff0c;即均方误差&#xff1a;R||Q-Y||22 (2)当均方误差最小时&#xff0c;说明构造的拟合向量与原始向量最为接近&#xff0c;这种曲线拟合的方法…

sql中group by 的使用

1、概述 Group By 从字面意义上理解就是根据By指定的规则对数据进行分组&#xff0c;所谓的分组就是将一个数据集划分为若干个小区域&#xff0c;然后针对若干个小区域进行数据处理 2、原始表 3、简单的Group By 示例1 select 类别&#xff0c;数量 as 数量之和 from A gro…

easyui Uncaught TypeError: Cannot read properties of null (reading ‘width‘)

问题描述 在将easyui1.3.6版本替换为1.7版本的时候。只有表头显示出来了&#xff0c;内容并没有显示出来&#xff0c;且报异常。表头也没有按照期望的宽度正常显示。错误提示如下 问题原因及解决办法 该问题出现的原因是因为该表格的表头涉及到跨行跨列问题&#xff0c;原因…

2023年国际高校数学建模竞赛A题:购物网站的数据分析

数据处理&#xff1a; Appendix II的词频统计和数据可视化&#xff1a; 代码: 代码注释完美&#xff0c;可直接运行&#xff0c;简单易用&#xff0c;不懂可以直接问我&#xff0c;在线答疑。 四个题目的代码获取&#xff1a; 可直接运行代码 可直接运行代码 可直接运行…

小程序自定义步骤条实现

效果展示&#xff1a; 支持背景颜色自定义 <view class"hl_steps"><view class"hl_steps_item" wx:for"{{steps}}" wx:key"id"><view class"hl_steps_item_circle_out" style"background-color: {{col…

数据可视化——如何绘制地图

文章目录 前言如何绘制地图添加配置项 根据已有数据绘制地图整体代码展示 前言 前面我们学习了如何利用提供的数据来对数据进行处理&#xff0c;然后以折线图的形式展现出来&#xff0c;那么今天我将为大家分享如何将提数据以地图的形式展现。 如何绘制地图 前面我们绘制折线…

Flutter动画库:animations(路由过渡动画或者页面切换动画)

animations animations 是一个 Flutter 库&#xff0c;它提供了一组用于创建动画效果的工具和组件。这个库的核心重点是路由过渡动画或者页面切换动画 地址 https://pub-web.flutter-io.cn/packages/animations 安装 flutter pub add animations看了下官方文档和官方例子&a…

编程规范—代码风格

先看以下两段代码。 对于计算机来说&#xff0c;这两段代码并没有什么区别&#xff0c;都可以执行&#xff0c;执行结果也一样。但是对于我们人类来说&#xff0c;第二段代码显然看起来更舒适&#xff0c;程序的可读性也更强&#xff0c;跟写作文类似&#xff0c;把所有内容挤在…

RocksDB架构

1、rocksdb是什么? RocksDB中文网 | 一个持久型的key-value存储 rocksdb是一种KV存储引擎&#xff0c;常用于数据库存储数据&#xff0c;无法直接使用&#xff0c;没有提供sql命令&#xff0c;通过调用rocksdb提供的api进行数据库的读写等操作。 rocksdb是以leveldb为基础开…

WinCE OSDesign项目创建模拟器

vs2005创建OSDesign项目&#xff0c;WinCE6 1.解决方案管理器&#xff0c;项目鼠标右键属性 默认语言设置 编译选项 2.主菜单&#xff1a;Target->Connectivity Options Add Device/Remove Device不用管 Kernel Service Map Core Service Settings默认 Service Status默…

网络安全(黑客)自学路线笔记

一、什么是黑客&#xff1f; 黑客泛指IT技术主攻渗透窃取攻击技术的电脑高手&#xff0c;现阶段黑客所需要掌握的远远不止这些。 二、为什么要学习黑客技术&#xff1f; 其实&#xff0c;网络信息空间安全已经成为海陆空之外的第四大战场&#xff0c;除了国与国之间的博弈&am…

企业微信在ios机型无法吊起打开个人信息页接口(openUserProfile)

wx.qy.openUserProfile({type: 1,//1表示该userid是企业成员&#xff0c;2表示该userid是外部联系人userid: "wmEQlEGwAAHxbWYDOK5u3Af13xlYAAAA", //可以是企业成员&#xff0c;也可以是外部联系人success: function(res) {// 回调} });遇到的问题&#xff1a;调用打…

flutter开发实战-实现推送功能Push Notification

flutter开发实战-实现推送功能Push Notification 推送服务现在可以说是所有 App 的标配了&#xff0c;最近在Flutter工程项目上实现推送功能。flutter上实现推送功能需要依赖原生的功能&#xff0c;需要插件实现&#xff0c;这里使用的是极光推送的服务。 一、效果图 效果图…