前端vue+后端springboot+mybatisplus+MySql(仓库管理系统)示例一

新建项目

idea工具,新建springboot项目,然后再项目中新建vue模块,具体如图

 

Mysql数据库

drop table if exists d_user;
create table d_user(
	id int auto_increment primary key comment '主键',
	user_no varchar(20) not null comment '账号',
	user_name varchar(100) not null comment '名字',
	password varchar(30) not null comment '密码',
	age int null comment '年龄',
	sex int null comment '性别,1男,2女',
	phone varchar(30) null comment '电话',
	role_id int not null comment '角色id,0超级管理员,1管理员,2用户',
	is_valid varchar(4) default 'Y' null comment '是否有效,Y有效,N无效' 
) comment '用户表';

insert into d_user(user_no,user_name,password,age,sex,phone,role_id) 
values ('sa','超级管理员','1234',99,1,'13312345678',0); 
insert into d_user(user_no,user_name,password,age,sex,phone,role_id) 
values ('admin','管理员','1234',88,1,'13412345678',1); 
insert into d_user(user_no,user_name,password,age,sex,phone,role_id) 
values ('user1','用户1','1234',18,2,'13512345678',2); 

springboot后端

配置文件

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.14</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.shrimpking</groupId>
    <artifactId>msy-storage-app02</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>msy-storage-app02</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.1</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.4.1</version>
        </dependency>
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.30</version>
        </dependency>
        <dependency>
            <groupId>com.spring4all</groupId>
            <artifactId>spring-boot-starter-swagger</artifactId>
            <version>1.5.1.RELEASE</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

 application.properties

server.port=8089
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimeZone=UTC
spring.datasource.username=root
spring.datasource.password=mysql123
#默认日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
mybatis-plus.type-aliases-package=com.shrimpking.pojo

实体类

user.java

package com.shrimpking.pojo;

import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.io.Serializable;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;

/**
 * <p>
 * 用户表
 * </p>
 *
 * @author shrimpking
 * @since 2023-08-10
 */
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("d_user")
@ApiModel(value="User对象", description="用户表")
public class User implements Serializable {

    private static final long serialVersionUID = 1L;

    @ApiModelProperty(value = "主键")
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;

    @ApiModelProperty(value = "账号")
    private String userNo;

    @ApiModelProperty(value = "名字")
    private String userName;

    @ApiModelProperty(value = "密码")
    private String password;

    @ApiModelProperty(value = "年龄")
    private Integer age;

    @ApiModelProperty(value = "性别,1男,2女")
    private Integer sex;

    @ApiModelProperty(value = "电话")
    private String phone;

    @ApiModelProperty(value = "角色id,0超级管理员,1管理员,2用户")
    private Integer roleId;

    @ApiModelProperty(value = "是否有效,Y有效,N无效")
    private String isValid;


}

Mapper层

UserMapper.java

package com.shrimpking.mapper;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.shrimpking.pojo.User;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

/**
 * <p>
 * 用户表 Mapper 接口
 * </p>
 *
 * @author shrimpking
 * @since 2023-08-10
 */
@Mapper
public interface UserMapper extends BaseMapper<User> {

    IPage pageC(IPage<User> page);

    IPage pageC2(IPage<User> page, @Param(Constants.WRAPPER) Wrapper wrapper);

}

UserMapper.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.shrimpking.mapper.UserMapper">

    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.shrimpking.pojo.User">
        <id column="id" property="id" />
        <result column="user_no" property="userNo" />
        <result column="user_name" property="userName" />
        <result column="password" property="password" />
        <result column="age" property="age" />
        <result column="sex" property="sex" />
        <result column="phone" property="phone" />
        <result column="role_id" property="roleId" />
        <result column="is_valid" property="isValid" />
    </resultMap>

    <!-- 通用查询结果列 -->
    <sql id="Base_Column_List">
        id, user_no, user_name, password, age, sex, phone, role_id, is_valid
    </sql>

    <select id="pageC" resultType="user">
        select * from d_user
    </select>

    <select id="pageC2" resultType="user">
        select * from d_user ${ew.customSqlSegment}
    </select>
</mapper>

Service层

UserService.java

package com.shrimpking.service;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.shrimpking.pojo.User;
import com.baomidou.mybatisplus.extension.service.IService;

/**
 * <p>
 * 用户表 服务类
 * </p>
 *
 * @author shrimpking
 * @since 2023-08-10
 */
public interface UserService extends IService<User> {

    IPage pageC(IPage<User> page);

    IPage pageC2(IPage<User> page, Wrapper wrapper);
}

UserServiceImpl.java

package com.shrimpking.service.impl;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.shrimpking.pojo.User;
import com.shrimpking.mapper.UserMapper;
import com.shrimpking.service.UserService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * <p>
 * 用户表 服务实现类
 * </p>
 *
 * @author shrimpking
 * @since 2023-08-10
 */
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {

    @Autowired
    private UserMapper userMapper;

    @Override
    public IPage pageC(IPage<User> page)
    {
        return userMapper.pageC(page);
    }

    @Override
    public IPage pageC2(IPage<User> page, Wrapper wrapper)
    {
        return userMapper.pageC2(page,wrapper);

    }
}

Controller层

UserController.java

package com.shrimpking.controller;


import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.shrimpking.common.QueryPageParam;
import com.shrimpking.common.Result;
import com.shrimpking.pojo.User;
import com.shrimpking.service.UserService;
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.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.List;

/**
 * <p>
 * 用户表 前端控制器
 * </p>
 *
 * @author shrimpking
 * @since 2023-08-10
 */
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    //新增
    @PostMapping("/save")
    public Result save(@RequestBody User user)
    {
        return userService.save(user) ? Result.success(): Result.fail();
    }

    //修改
    @PostMapping("/update")
    public Result update(@RequestBody User user)
    {
        return userService.updateById(user) ? Result.success() : Result.fail();
    }

    //新增或修改
    @PostMapping("/saveOrUpdate")
    public boolean saveOrUpdate(@RequestBody User user){
        return userService.saveOrUpdate(user);
    }

    //删除
    @GetMapping("/delete")
    public Result delete(@RequestParam String id)
    {
        return userService.removeById(id) ? Result.success(): Result.fail();
    }


    //根据账号,查询唯一
    @GetMapping("/findByUserNo")
    public Result findByUserNo(@RequestParam String userNo)
    {
        System.out.println(userNo);
        List<User> list = userService.lambdaQuery().eq(User::getUserNo, userNo).list();
        return list.size() > 0 ? Result.success(list) : Result.fail();
    }

    //
    @GetMapping("/list")
    public List<User> list()
    {
        return userService.list();
    }

    //查询,模糊查询
    @PostMapping("/listP")
    public Result listP(@RequestBody  User user)
    {
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        if(StringUtils.isNotBlank(user.getUserName()))
        {
            lambdaQueryWrapper.like(User::getUserName,user.getUserName());
            //lambdaQueryWrapper.eq(User::getUserName,user.getUserName());
        }
        return Result.success(userService.list(lambdaQueryWrapper));
    }

    //入参封装
    @PostMapping("/listP2")
    public List<User> listP2(@RequestBody QueryPageParam query)
    {
        System.out.println(query);
        System.out.println("pageSize=" + query.getPageSize());
        System.out.println("pageNum = " + query.getPageNum());
        HashMap param = query.getParam();
        System.out.println(param.get("name"));

        return  null;
    }

    //使用mybatis默认分页类
    @PostMapping("/listPage")
    public Result listPage(@RequestBody QueryPageParam query)
    {
        //分页类
        Page<User> page = new Page<>();
        page.setCurrent(query.getPageNum());
        page.setSize(query.getPageSize());
        //查询条件
        LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
        //System.out.println(query);
        String name = (String) query.getParam().get("name");
        String sex = (String) query.getParam().get("sex");
        if(StringUtils.isNotBlank(name) && !"null".equals(name))
        {
            wrapper.like(User::getUserName,name);
        }
        if(StringUtils.isNotBlank(sex))
        {
            wrapper.eq(User::getSex,sex);
        }
        //获取分页结果
        IPage result = userService.page(page,wrapper);
        //System.out.println(result.getTotal());
        return Result.success(result.getRecords(),result.getTotal());
    }

    //自定义sql的分页实现
    @PostMapping("/listPage2")
    public List listPage2(@RequestBody QueryPageParam query)
    {
        Page<User> page = new Page<>();
        page.setCurrent(query.getPageNum());
        page.setSize(query.getPageSize());

        IPage result = userService.pageC(page);
        return result.getRecords();
    }

    //自定义sql的分页实现,可以有sql条件
    @PostMapping("/listPage3")
    public List listPage3(@RequestBody QueryPageParam query)
    {
        Page<User> page = new Page<>();
        page.setCurrent(query.getPageNum());
        page.setSize(query.getPageSize());

        LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
        wrapper.like(User::getUserName,query.getParam().get("name"));

        IPage result = userService.pageC2(page,wrapper);

        return result.getRecords();
    }


    @PostMapping("/listPage4")
    public Result listPage4(@RequestBody QueryPageParam query)
    {
        Page<User> page = new Page<>();
        page.setCurrent(query.getPageNum());
        page.setSize(query.getPageSize());

        LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
        wrapper.like(User::getUserName,query.getParam().get("name"));

        IPage res = userService.page(page,wrapper);
        return Result.success(res.getRecords(),res.getTotal());

    }

}

配置类

MybatisPlusConfig.java

配置分页拦截器

package com.shrimpking.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author user1
 */
@Configuration
public class MybatisPlusConfig {

    /**
     * 新的分页插件,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题(该属性会在旧插件移除后一同移除)
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}

CorsConfig.java

配置跨域问题

package com.shrimpking.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

// 案例 一
@Configuration
public class CorsConfig implements WebMvcConfigurer
{
 
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                //是否发送Cookie
                .allowCredentials(true)
                //放行哪些原始域
                .allowedOriginPatterns("*")
                .allowedMethods(new String[]{"GET", "POST", "PUT", "DELETE"})
                .allowedHeaders("*")
                .exposedHeaders("*");
    }
}

公共类

QueryPageParam.java

分页,入参,封装一下

package com.shrimpking.common;

import lombok.Data;

import java.util.HashMap;

/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Shrimpking
 * @create 2023/8/10 16:28
 * 入参封装
 */
@Data
public class QueryPageParam
{
    //常量
    private static int PAGE_SIZE = 20;
    private static int PAGE_NUM = 1;

    private Integer pageSize = PAGE_SIZE;
    private Integer pageNum = PAGE_NUM;
    private HashMap param = new HashMap();

}

Result.java

返回给前端数据时,包装一下,携带必要的信息

package com.shrimpking.common;

import lombok.Data;

/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Shrimpking
 * @create 2023/8/10 18:31
 * 封装返回结果类
 */
@Data
public class Result
{
    //编码 200 400
    private Integer code;
    //成功 失败
    private String msg;
    //总记录数
    private Long total;
    //数据
    private Object data;


    /**
     * 成功时返回
     * @param data
     * @param total
     * @return
     */
    public static Result success(Object data,Long total)
    {
        return result(200,"成功",total,data);
    }


    /**
     * 成功时返回
     * @return
     */
    public static Result success()
    {
        return result(200,"成功",-1L,null);
    }

    /**
     * 成功时返回
     * @param data
     * @return
     */
    public static Result success(Object data)
    {
        return result(200,"成功",-1L,data);
    }

    /**
     * 失败时返回
     * @return
     */
    public static Result fail()
    {
        return result(400,"失败",0L,null);
    }

    /**
     *
     * @param code
     * @param msg
     * @param total
     * @param data
     * @return
     */
    private static Result result(Integer code,String msg,long total,Object data)
    {
        Result res = new Result();
        res.setData(data);
        res.setMsg(msg);
        res.setCode(code);
        res.setTotal(total);
        return res;
    }


}

Vue前端

main.js

import Vue from 'vue'
import App from './App.vue'
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
import '@/styles/common.css'
import axios from "axios";

Vue.prototype.$axios = axios;
Vue.prototype.$httpUrl = 'http://localhost:8089';

Vue.use(ElementUI, { size: 'small'});
Vue.config.productionTip = false;

new Vue({
  render: h => h(App),
}).$mount('#app');

app.vue

<template>
  <div id="app">
    <index></index>
  </div>
</template>

<script>

import Index from "@/components/Index";

export default {
  name: 'App',
  components: {
    Index
  }
}
</script>

<style>

</style>

common.css

*{
    padding: 0;
    margin: 0;
}

组件

index.vue

<template>
    <div style="width:100%;height: 100vh;">
        <el-container style="height: 100%; border: 1px solid #eee">
            <el-aside :width="asideWidth" style="background-color: rgb(238, 241, 246);height: 100%;margin-left: -1px;">
                <Aside :isCollapse="isCollapse"></Aside>
            </el-aside>

            <el-container style="width:100%;height:100%;">
                <el-header style="text-align: right; font-size: 12px;width: 100%;border-bottom: 1px solid #cccccc;">
                    <Header @doCollapse="handleCollapse" :icon="icon"></Header>
                </el-header>
                <el-main>
                    <Main></Main>
                </el-main>
            </el-container>
        </el-container>
    </div>
</template>

<script>
    import Aside from "@/components/Aside";
    import Header from "@/components/Header";
    import Main from "@/components/Main";
    export default {
        name: "IndexPage",
        data(){
          return {
              isCollapse: false,
              asideWidth: '200px',
              icon:'el-icon-s-fold'
          }
        },
        components:{
            Aside,
            Header,
            Main
        },
        methods:{
            //折叠左侧菜单栏
            handleCollapse(){
                this.isCollapse = !this.isCollapse;
                //折叠菜单栏时,也缩放宽度
                this.asideWidth = this.isCollapse ? '64px' : '200px';
                this.icon = this.isCollapse ? 'el-icon-s-unfold':'el-icon-s-fold';
            }
        }
    }
</script>

<style scoped>
    .el-header {
        #background-color: #B3C0D1;
        color: #333;
        line-height: 60px;
    }

    .el-aside {
        color: #333;
    }
</style>

header.vue

<template>
    <div style="display: flex;line-height: 60px;">
        <div @click="collapse" style="cursor: pointer;">
            <i :class="icon" style="font-size:20px;"></i>
        </div>
        <div style="flex: 1;text-align: center;font-size: 34px;">
            <span>欢迎来到仓库管理系统</span>
        </div>
        <el-dropdown>
            <span>王小虎</span>
            <i class="el-icon-arrow-down" style="margin-right: 15px;margin-left:5px;"></i>
            <el-dropdown-menu slot="dropdown">
                <el-dropdown-item @click.native="toUser">个人中心</el-dropdown-item>
                <el-dropdown-item @click.native="logout">退出</el-dropdown-item>
            </el-dropdown-menu>
        </el-dropdown>
    </div>
</template>

<script>
    export default {
        name: "HeaderPart",
        props:{
          icon: String
        },
        methods:{
            toUser(){
                console.log('to_user');
            },
            logout(){
                console.log("logout");
            },
            //折叠左侧菜单栏
            collapse(){
                this.$emit('doCollapse');
            }
        }
    }
</script>

<style scoped>

</style>

aside.vue

<template>
    <el-menu
            background-color="#545c64"
            text-color="#fff"
            active-text-color="#ffd04b"
            style="height: 100%;"
            default-active="/home"
            :collapse="isCollapse"
            :collapse-transition="false">
        <el-menu-item index="/home">
            <i class="el-icon-s-home"></i>
            <span slot="title">首页</span>
        </el-menu-item>
        <el-menu-item index="/One">
            <i class="el-icon-s-flag"></i>
            <span slot="title">导航一</span>
        </el-menu-item>
        <el-menu-item index="/Two">
            <i class="el-icon-s-opportunity"></i>
            <span slot="title">导航二</span>
        </el-menu-item>
    </el-menu>
</template>

<script>
    export default {
        name: "AsidePart",
        data(){
            return {

            }
        },
        //折叠左侧菜单栏
        props:{
            isCollapse: Boolean
        }
    }
</script>

<style scoped>

</style>

main.vue

<template>
    <div>
        <div style="margin-bottom: 10px;">
            <el-input v-model="userName"
                      placeholder="请输入名字"
                      style="width:300px;"
                      suffix-icon="el-icon-search"
                      @keyup.enter.native="loadPost"></el-input>
            <el-select v-model="sex" placeholder="请选择性别" style="margin-left:10px;width:300px;">
                <el-option
                        v-for="item in sexList"
                        :key="item.value"
                        :label="item.label"
                        :value="item.value">
                </el-option>
            </el-select>
            <el-button type="primary" style="margin-left: 5px;" @click="loadPost">查询</el-button>
            <el-button type="success" style="margin-left: 5px;" @click="resetParam">重置</el-button>
            <el-button type="success" @click="add">新增</el-button>
        </div>
        <el-table :data="tableData" style="height: 100%;"
                  :header-cell-style="{background:'#92b5b6', color:'#221e1d'}"
                  border>
            <el-table-column prop="id" label="ID" >
            </el-table-column>
            <el-table-column prop="userNo" label="账号">
            </el-table-column>
            <el-table-column prop="userName" label="名字">
            </el-table-column>
            <el-table-column prop="age" label="年龄">
            </el-table-column>
            <el-table-column prop="sex" label="性别">
                <template slot-scope="scope">
                    <el-tag
                            :type="scope.row.sex === 1 ? 'primary' : 'success'"
                            disable-transitions>{{scope.row.sex === 1 ? '男' : '女'}}</el-tag>
                </template>
            </el-table-column>
            <el-table-column prop="roleId" label="角色">
                <template slot-scope="scope">
                    <el-tag
                            :type="scope.row.roleId === 0 ? 'danger' : (scope.row.roleId === 1 ? 'primary' : 'success')"
                            disable-transitions>{{scope.row.roleId === 0 ? '超级管理员' : (scope.row.roleId === 1 ? '管理员' : '用户')}}</el-tag>
                </template>
            </el-table-column>
            <el-table-column prop="phone" label="电话">
            </el-table-column>
            <el-table-column prop="operate" label="操作">
                <template slot-scope="scope">
                    <el-button type="success" @click="update(scope.row)" style="margin-right:10px;">编辑</el-button>
                    <el-popconfirm title="确定删除吗?" @confirm="handleDelete(scope.row.id)">
                        <el-button type="danger" slot="reference">删除</el-button>
                    </el-popconfirm>
                </template>
            </el-table-column>
        </el-table>
        <el-pagination
                @size-change="handleSizeChange"
                @current-change="handleCurrentChange"
                :current-page="pageNum"
                :page-sizes="[1, 2, 10, 20]"
                :page-size="pageSize"
                layout="total, sizes, prev, pager, next, jumper"
                :total="total">
        </el-pagination>
        <el-dialog
                title="新增用户"
                :visible.sync="dialogVisible"
                width="30%"
                :before-close="handleClose"
                center>
            <el-form ref="form" :rules="rules"  :model="form" label-width="80px">
                <el-form-item label="账号" prop="userNo">
                    <el-col :span="20">
                        <el-input v-model="form.userNo"></el-input>
                    </el-col>
                </el-form-item>
                <el-form-item label="名字" prop="userName">
                    <el-col :span="20">
                        <el-input v-model="form.userName"></el-input>
                    </el-col>
                </el-form-item>
                <el-form-item label="密码" prop="password">
                    <el-col :span="20">
                        <el-input v-model="form.password"></el-input>
                    </el-col>
                </el-form-item>
                <el-form-item label="年龄" prop="age">
                    <el-col :span="20">
                        <el-input v-model="form.age"></el-input>
                    </el-col>
                </el-form-item>
                <el-form-item label="性别">
                    <el-radio-group v-model="form.sex">
                        <el-radio label="1">男</el-radio>
                        <el-radio label="2">女</el-radio>
                    </el-radio-group>
                </el-form-item>
                <el-form-item label="电话" prop="phone">
                    <el-col :span="20">
                        <el-input v-model="form.phone"></el-input>
                    </el-col>
                </el-form-item>
            </el-form>
            <span slot="footer" class="dialog-footer">
                <el-button @click="dialogVisible = false">取 消</el-button>
                <el-button type="primary" @click="save">保 存</el-button>
            </span>
        </el-dialog>
    </div>
</template>

<script>

    export default {
        name: "MainPart",
        data() {
            //判断年龄
            let checkAge = (rule, value, callback) => {
                if(value > 150){
                    callback(new Error('年龄输入过大'));
                }else{
                    callback();
                }
            };

            //验证账号唯一性
            let checkDuplicate = (rule, value, callback) => {
                //修改时,不验证账号
                if(this.form.id){
                    return callback();
                }
                this.$axios.get(this.$httpUrl + '/user/findByUserNo?userNo=' + this.form.userNo).then( res=> {
                    //console.log(res);
                    if(res.data.code !==200){
                        callback();
                    }else{
                        callback(new Error('账号已经存在'));
                    }
                })
            };
            return {
                tableData: [], //列表数据
                pageNum:1, //当前页码
                pageSize:10, //每页数量
                total:0, //总记录数
                userName:'', //查询名字输入框
                sex:'', //查询选择性别
                sexList:[
                    { value:'1',label:'男'},
                    { value:'2',label:'女'}
                ],  //性别下拉框绑定
                dialogVisible: false, //模态输入框是否显示
                form:{
                    id:'',
                    userNo:'',
                    userName:'',
                    password:'',
                    age:'',
                    phone:'',
                    sex:'1',
                    roleId:'2'
                }, //表单中的输入项
                //验证规则
                rules: {
                    userNo: [
                        { required: true, message: '请输入账号', trigger: 'blur' },
                        { min: 1, max: 15, message: '长度在 1 到 15 个字符', trigger: 'blur' },
                        { validator: checkDuplicate ,trigger:'blur'}
                    ],
                    userName: [
                        { required: true, message: '请输入名字', trigger: 'blur' },
                        { min: 1, max: 20, message: '长度在 1 到20 个字符', trigger: 'blur' }
                    ],
                    password: [
                        { required: true, message: '请输入密码', trigger: 'blur' }
                    ],
                    age: [
                        { required: true, message: '请输入年龄', trigger: 'blur' },
                        { min:1, max:3, message: '年龄在1到3位数之间',trigger: 'blur'},
                        { validator: checkAge ,trigger:'blur'}
                    ],
                    phone: [
                        { required: true, message: '请输入电话', trigger: 'blur' },
                        { pattern:/^1[3|4|5|6|7|8|9][0-9]\d{8}/, message: '手机号码格式不正确', trigger: 'blur'}
                    ]
                }
            }
        },
        methods:{
            //删除按钮
            handleDelete(id){
                this.$axios.get( this.$httpUrl + '/user/delete?id=' + id).then(res => {
                    //console.log(res);
                    if(res.data.code ===200)
                    {
                        this.$message({
                            message: '删除成功',
                            type: 'success'
                        });
                        this.loadPost();
                    }else {
                        this.$message.error('删除失败');
                    }
                });
            },
            //修改按钮
            update(row){
                //console.log(row);
                //赋值到表单
                //显示对话框
                this.dialogVisible = true;
                //异步赋值
                this.$nextTick( ()=> {
                    this.form.id = row.id;
                    this.form.userNo = row.userNo;
                    this.form.userName = row.userName;
                    this.form.password = row.password;
                    this.form.age = row.age +''; //数字转字符,才显示
                    this.form.phone = row.phone;
                    this.form.sex = row.sex + '';
                    this.form.roleId = row.roleId;
                });
            },
            //重置新增表单
            resetForm() {
                this.$refs.form.resetFields();
            },
            doUpdate(){
                this.$axios.post( this.$httpUrl + '/user/update',this.form).then(res => {
                    //console.log(res);
                    if(res.data.code ===200)
                    {
                        this.$message({
                            message: '更新成功',
                            type: 'success'
                        });
                        //关闭对话框
                        this.dialogVisible = false;
                        this.loadPost();
                    }else {
                        this.$message.error('更新失败');
                    }
                });
            },
            doSave(){
                this.$axios.post( this.$httpUrl + '/user/save',this.form).then(res => {
                    //console.log(res);
                    if(res.data.code ===200)
                    {
                        this.$message({
                            message: '新增成功',
                            type: 'success'
                        });
                        //关闭对话框
                        this.dialogVisible = false;
                        this.loadPost();
                    }else {
                        this.$message.error('新增失败');
                    }
                });
            },
            //保存数据
            save(){
                //保存之前,先验证
                this.$refs.form.validate((valid) => {
                    //通过验证
                    if (valid) {
                        if(this.form.id){
                            //修改,保存
                            this.doUpdate();
                        }else{
                            //新增,保存
                            this.doSave();
                        }
                    } else {
                        //验证未通过
                        return false;
                    }
                });
            },
            //新增对话框关闭按钮
            handleClose() {
                this.dialogVisible = false;
            },
            //新增按钮
            add(){
                this.dialogVisible = true;
                //打开新增窗口时,将之前的内容清除
                this.$nextTick(() =>{
                    this.resetForm();
                });
            },
            //重置按钮
            resetParam(){
                this.userName = '';
                this.sex = '';
                this.loadPost();
            },
            //每页数量发生变化
            handleSizeChange(val) {
                //console.log(`每页 ${val} 条`);
                this.pageNum = 1;
                this.pageSize = val;
                this.loadPost();
            },
            //当前页码发生变化
            handleCurrentChange(val) {
                //console.log(`当前页: ${val}`);
                this.pageNum = val;
                this.loadPost();
            },
            //get方式加载数据
            loadGet(){
                this.$axios.get( this.$httpUrl +'/user/listPage').then (res => {
                    //console.log(res);
                    if(res.data.code ===200)
                    {
                        this.tableData = res.data.data;
                    }else {
                        alert('获取数据失败');
                    }
                })
            },
            //post方式加载数据
            loadPost(){
                this.$axios.post( this.$httpUrl + '/user/listPage',{
                    pageSize: this.pageSize,
                    pageNum : this.pageNum,
                    param:{
                        name: this.userName, //查询的名字
                        sex: this.sex  //查询性别
                    }
                }).then(res => {
                    //console.log(res);
                    if(res.data.code ===200)
                    {
                        //列表数据
                        this.tableData = res.data.data;
                        //总记录数
                        this.total = res.data.total;
                    }else {
                        alert('获取数据失败');
                    }
                })
            }
        },
        created(){
            //this.loadGet();
            this.loadPost();
        }
    }
</script>

<style scoped>

</style>

测试截图

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

虾米大王

有你的支持,我会更有动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值