【SpringBoot3+Vue3】六【完】【番外篇】- (0-1临摹)

2023-11-29 23:12

本文主要是介绍【SpringBoot3+Vue3】六【完】【番外篇】- (0-1临摹),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一、后端

1、服务器管理

1.1 ProjectController

1.2 ProjectService

1.3 ProjectServiceImpl

1.4 ProjectMapper

1.5 实体类

2、项目管理

2.1 ServerManageController

2.2 ServerManageService

2.3 ServerManageServiceImpl

2.4 ServerManageMapper

2.5 ServerManage实体类

二、前端

1、菜单优化

2、将菜单页面与路径建立关联

3、建立2个页面

3.1 服务器管理project.vue

3.2 项目管理serverManage.vue

4、api下新增project.js 编写服务器列表查询方法

5、实现serverManage.vue

5.1 初始化serverManage.vue

5.2 列表查询

5.2.1 列表查询

5.2.2 当分页条的当前页和每页条数发生变化,重新发送请求获取数据  

5.2.3 搜索按钮绑定点击事件

5.3 添加实现

5.3.1 页面添加抽屉的组件

5.3.2 为添加新增绑定事件

5.3.3 project.js添加函数实现

5.3.4 ServerManage.vue中提供addServerManage函数完成添加接口的调用

5.3.5 添加页面保存按钮绑定事件

5.4 编辑实现

5.4.1 抽屉标题显示 定义标题

5.4.2 在抽屉上绑定标题

5.4.3 为添加文章按钮绑定事件

5.4.4 为编辑按钮绑定事件

5.4.5 数据回显(点击编辑显示数据)

5.4.5.1 回显函数showDrawer

5.4.5.2 编辑按钮绑定事件

5.4.5 project.js实现编辑接口

 5.4.6 调用修改接口实现函数

5.4.7 为保存按钮添加判断是添加保存还是修改保存

 5.4.8 优化修改之后,再添加数据未清空的问题

5.5 删除实现

5.5.1 project.js实现删除接口

5.5.2 添加删除确认弹窗以及删除接口函数deleteserverManage

5.5.3 删除按钮绑定事件

5.6 ServerManage.vue 完整代码

6、实现Project.vue

6.1 初始化Project.vue

6.2 列表查询

6.2.1 project.js添加查询条件服务器IP的查询接口

6.2.2 服务器IP查询条件函数

6.2.3 项目列表查询project.js接口实现

6.2.4 Project.vue中,调用接口获取数据

6.2.5 当分页条的当前页和每页条数发生变化,重新发送请求获取数据

6.2.6 搜索和重置 

 6.3 添加

6.3.1 引入添加组件以及添加表单数据模型

6.3.2 为添加按钮绑定事件

6.3.3 project.js提供添加项目接口

6.3.4 Project.vue中提供addProject函数完成添加项目接口的调用

6.3.5 为保存按钮绑定事件

6.4 编辑

6.4.1 为编辑按钮绑定事件(后面会使用函数替换)

6.4.2 数据回显

 6.4.3 通过插槽的方式得到被点击按钮所在行的数据

6.4.4 project.js中提供修改项目的函数

 6.4.5 调用接口完成修改的函数

6.4.6 保存按钮判断是添加还是修改

6.4.7 解决编辑再添加数据显示问题

6.5 删除

6.5.1 project.js添加删除接口调用

6.5.2 Project.vue添加删除弹窗,当用户点击确认后,调用接口删除

6.5.3 为删除按钮绑定事件

6.5.4 Project.vue全部代码


前言:前面一到五已经完整的实现了一个前后端的开发。本文从0-1的临摹,过程当中前端感觉费劲一点

一、后端

1、服务器管理

1.1 ProjectController

package com.bocai.controller;import com.bocai.common.Result;
import com.bocai.pojo.PageBean;
import com.bocai.pojo.Project;
import com.bocai.service.ProjectService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;@RestController
@RequestMapping("/project")
@Slf4j
public class ProjectController {@Autowiredprivate ProjectService projectService;@PostMappingpublic Result add(@RequestBody  @Validated(Project.Add.class) Project project){log.info("添加监控项目:{}",project);// 判断添加的项目英文名字是否重复Project queryProject = projectService.queryProjectByEnglishName(project);if (queryProject == null){// 不重复projectService.add(project);return Result.success();}else {return  Result.error("添加项目英文名重复!");}}/*** 条件查询* @param pageNum* @param pageSize* @param englishName* @param chineseName* @param serverManageId* @return*/@GetMappingpublic Result page(@RequestParam(defaultValue = "1") Integer pageNum,@RequestParam(defaultValue = "10") Integer pageSize,String englishName, String chineseName, Integer serverManageId){log.info("分页查询参数:当前页:{} 每页条数: {} 英文名:{} 中文名:{} 服务器:{} ",pageNum,pageSize,englishName,chineseName,serverManageId);PageBean pageBean = projectService.pageList(pageNum,pageSize,englishName,chineseName,serverManageId);return Result.success(pageBean);}/*** 根据id修改* @param project* @return*/@PutMappingpublic Result update(@RequestBody @Validated(Project.Update.class) Project project){log.info("修改的项目为:{}",project);// 判断添加的项目英文名字是否重复Project queryProject = projectService.queryProjectByEnglishName(project);if (queryProject == null){// 可以修改projectService.updateProjectById(project);return Result.success();}else {return  Result.error("修改的项目英文名称重复!");}}/*** 根据id删除* @param id* @return*/@DeleteMappingpublic Result delete(Integer id){log.info("根据id删除:{}",id);projectService.deleteById(id);return Result.success();}}

1.2 ProjectService

package com.bocai.service;import com.bocai.pojo.PageBean;
import com.bocai.pojo.Project;
import com.baomidou.mybatisplus.extension.service.IService;/**
* @author cheng
* @description 针对表【project】的数据库操作Service
* @createDate 2023-11-28 11:52:33
*/
public interface ProjectService extends IService<Project> {/*** 根据英文名判断是否重复* @param project* @return*/Project queryProjectByEnglishName(Project project);/*** 添加项目* @param project*/void add(Project project);/*** 条件查询* @param pageNum* @param pageSize* @param englishName* @param chineseName* @param serverManageId* @return*/PageBean pageList(Integer pageNum, Integer pageSize, String englishName, String chineseName, Integer serverManageId);/*** 根据id修改* @param project*/void updateProjectById(Project project);/*** 根据id删除* @param id ID*/void deleteById(Integer id);}

1.3 ProjectServiceImpl

求赞助,私聊

1.4 ProjectMapper

package com.bocai.mapper;import com.bocai.pojo.Project;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;/**
* @author cheng
* @description 针对表【project】的数据库操作Mapper
* @createDate 2023-11-28 11:52:33
* @Entity com.bocai.pojo.Project
*/
@Mapper
public interface ProjectMapper extends BaseMapper<Project> {}

1.5 实体类

求赞助,私聊 

2、项目管理

2.1 ServerManageController

package com.bocai.controller;import com.bocai.common.Result;
import com.bocai.pojo.PageBean;
import com.bocai.pojo.ServerManage;
import com.bocai.service.ServerManageService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;import java.util.List;@RestController
@RequestMapping("/serverManage")
@Slf4j
public class ServerManageController {@Autowiredprivate ServerManageService serverManageService;/*** 添加服务器* @param serverManage* @return*/@PostMappingpublic Result add(@RequestBody @Validated(ServerManage.Add.class) ServerManage serverManage){log.info("新增服务器{}",serverManage);// 查询服务IP地址是否重复ServerManage queryServerManage = serverManageService.queryServerManageByIpAddress(serverManage);if (queryServerManage == null){//没有重复的服务器ip,可以新增serverManageService.add(serverManage);return Result.success();}else{// 存在重复文章标题return Result.error("IP地址重复!");}}/*** 条件查询* @param pageNum* @param pageSize* @param serverName* @param ipAddress* @return*/@GetMappingpublic Result page(@RequestParam(defaultValue = "1") Integer pageNum,@RequestParam(defaultValue = "10") Integer pageSize,String serverName, String ipAddress){log.info("分页查询参数:当前页:{} 每页条数: {} 名称:{}  IP:{} ",pageNum,pageSize,serverName,ipAddress);PageBean pageBean = serverManageService.pageList(pageNum,pageSize,serverName,ipAddress);return Result.success(pageBean);}/*** 列表全部服务器。不翻页,主要用于其他页面作为查询条件* @return*/@GetMapping("/all")public Result list(){log.info("列表全部服务器。不翻页,主要用于其他页面作为查询条件");List list = serverManageService.serverManagelist();return Result.success(list);}/*** 修改更新服务* @param serverManage* @return*/@PutMappingpublic Result update(@RequestBody @Validated(ServerManage.Update.class) ServerManage serverManage){log.info("根据id更新服务器属性{}",serverManage);// 查询服务IP地址是否重复ServerManage queryServerManage = serverManageService.queryServerManageByIpAddress(serverManage);if(queryServerManage == null){serverManageService.updateServerManageById(serverManage);return Result.success();}else {return Result.error("不能修改为IP重复名称");}}/*** 根据id删除* @param id* @return*/@DeleteMappingpublic Result delete(Integer id){log.info("要删除的服务器是:{}",id);serverManageService.deleteById(id);return Result.success();}}

2.2 ServerManageService

package com.bocai.service;import com.bocai.pojo.PageBean;
import com.bocai.pojo.ServerManage;
import com.baomidou.mybatisplus.extension.service.IService;import java.util.List;/**
* @author cheng
* @description 针对表【server_manage】的数据库操作Service
* @createDate 2023-11-28 10:23:52
*/
public interface ServerManageService extends IService<ServerManage> {/*** 查询ip地址是否重复* @param serverManage* @return*/ServerManage queryServerManageByIpAddress(ServerManage serverManage);/*** 添加服务器* @param serverManage*/void add(ServerManage serverManage);/*** 条件查询* @param pageNum* @param pageSize* @param serverName* @param ipAddress* @return*/PageBean pageList(Integer pageNum, Integer pageSize, String serverName, String ipAddress);/*** 更新服务* @param serverManage*/void updateServerManageById(ServerManage serverManage);/*** 根据id删除* @param id*/void deleteById(Integer id);/*** 列表全部服务器。不翻页,主要用于其他页面作为查询条件* @return*/List serverManagelist();
}

2.3 ServerManageServiceImpl

求赞助,私聊

2.4 ServerManageMapper

package com.bocai.mapper;import com.bocai.pojo.ServerManage;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;/**
* @author cheng
* @description 针对表【server_manage】的数据库操作Mapper
* @createDate 2023-11-28 10:23:52
* @Entity com.bocai.pojo.ServerManage
*/
@Mapper
public interface ServerManageMapper extends BaseMapper<ServerManage> {}

 

2.5 ServerManage实体类

求赞助,私聊

二、前端

1、菜单优化

修改Layout.vue 新增下拉菜单

  <el-sub-menu ><template #title><el-icon><Management /></el-icon><span>基础信息</span></template><el-menu-item index="/project/serverManage">  <el-icon><EditPen /></el-icon><span>服务器管理</span></el-menu-item><el-menu-item index="/project/project">  <el-icon><EditPen /></el-icon><span>项目管理</span></el-menu-item></el-sub-menu>

2、将菜单页面与路径建立关联

修改index.js

import ArticleCategoryVue from '@/views/article/ArticleCategory.vue'
import ArticleManageVue from '@/views/article/ArticleManage.vue'
import UserAvatarVue from '@/views/user/UserAvatar.vue'
import UserInfoVue from '@/views/user/UserInfo.vue'
import UserResetPasswordVue from '@/views/user/UserResetPassword.vue'
import ServerManageVue from '@/views/project/ServerManage.vue'  // 新增菜单1
import ProjectVue from '@/views/project/Project.vue'  // 新增菜单2//定义路由关系
const routes = [{ path: '/login', component: LoginVue },{path: '/', component: LayoutVue,redirect:'/article/manage', children: [{ path: '/article/category', component: ArticleCategoryVue },{ path: '/article/manage', component: ArticleManageVue },{ path: '/user/info', component: UserInfoVue },{ path: '/user/avatar', component: UserAvatarVue },{ path: '/user/resetPassword', component: UserResetPasswordVue },{ path: '/project/serverManage', component: ServerManageVue }, // 新增菜单1{ path: '/project/project', component: ProjectVue }, // 新增菜单2]}
]

3、建立2个页面

在views下新建文件夹project,然后新增两个页面

3.1 服务器管理project.vue

<script setup></script>
<template><h1>服务器管理页面</h1>
</template>

3.2 项目管理serverManage.vue

<script setup></script>
<template><h1>项目管理页面</h1>
</template>

4、api下新增project.js 编写服务器列表查询方法

//导入request.js请求工具
import request from '@/utils/request.js'// 1  服务器列表查询
export const ServerManageListService = (params) => {return request.get('/serverManage', { params: params })}

5、实现serverManage.vue

5.1 初始化serverManage.vue

<script setup>
import {Edit,Delete
} from '@element-plus/icons-vue'import { ref } from 'vue'//搜索输入的服务器名称
const serverName = ref('')// 搜索输入的服务器IP
const ipAddress = ref('')//服务列表数据模型
const servers = ref([{"id": 1,"serverName": "服务器11","serverDescribe": "主服务11","ipAddress": "192.168.1.11",        "createTime": "2023-09-03 11:55:30","updateTime": "2023-09-03 11:55:30"},{"id": 5,"serverName": "服务器12","serverDescribe": "主服务12","ipAddress": "192.168.1.12", "createTime": "2023-09-03 11:55:30","updateTime": "2023-09-03 11:55:30"},{"id": 5,"serverName": "服务器13","serverDescribe": "主服务13","ipAddress": "192.168.1.13", "createTime": "2023-09-03 11:55:30","updateTime": "2023-09-03 11:55:30"},
])//分页条数据模型
const pageNum = ref(1)//当前页
const total = ref(20)//总条数
const pageSize = ref(10)//每页条数//当每页条数发生了变化,调用此函数
const onSizeChange = (size) => {pageSize.value = size}
//当前页码发生变化,调用此函数
const onCurrentChange = (num) => {pageNum.value = num}</script>
<template><el-card class="page-container"><template #header><div class="header"><span>服务器管理</span><div class="extra"><el-button type="primary">添加</el-button></div></div></template><!-- 搜索表单 --><el-form inline><el-form-item label="服务名称:"><el-input v-model="serverName" placeholder="请输入服务器名称" /></el-form-item><el-form-item label="服务IP:"><el-input v-model="ipAddress" placeholder="请输入服务器IP" /></el-form-item><el-form-item><el-button type="primary" >搜索</el-button>                </el-form-item></el-form><!-- 文章列表 --><el-table :data="servers" style="width: 100%"><el-table-column label="服务器名" width="400" prop="serverName"></el-table-column>           <el-table-column label="IP地址" prop="ipAddress"> </el-table-column><el-table-column label="描述" prop="serverDescribe"></el-table-column><el-table-column label="创建时间" prop="createTime"></el-table-column><el-table-column label="更新时间" prop="updateTime"></el-table-column><el-table-column label="操作" width="100"><template #default="{ row }"><el-button :icon="Edit" circle plain type="primary"></el-button><el-button :icon="Delete" circle plain type="danger"></el-button></template></el-table-column><template #empty><el-empty description="没有数据" /></template></el-table><!-- 分页条 --><el-pagination v-model:current-page="pageNum" v-model:page-size="pageSize" :page-sizes="[3, 5 ,10, 15]"layout="jumper, total, sizes, prev, pager, next" background :total="total" @size-change="onSizeChange"@current-change="onCurrentChange" style="margin-top: 20px; justify-content: flex-end" /></el-card>
</template>
<style lang="scss" scoped>
.page-container {min-height: 100%;box-sizing: border-box;.header {display: flex;align-items: center;justify-content: space-between;}
}
</style>

5.2 列表查询

5.2.1 列表查询
//1、服务器列表查询
import { ServerManageListService } from '@/api/project.js'// 1、 定义服务器列表查询函数
const getServerManageList = async () => {let params = {pageNum: pageNum.value,pageSize: pageSize.value,serverName: serverName.value ? serverName.value : null,ipAddress: ipAddress.value ? ipAddress.value : null}let result = await ServerManageListService(params);//渲染列表数据servers.value = result.data.items//渲染总条数total.value=result.data.total
}getServerManageList();
5.2.2 当分页条的当前页和每页条数发生变化,重新发送请求获取数据  
//当每页条数发生了变化,调用此函数
const onSizeChange = (size) => {pageSize.value = sizegetServerManageList()  // 1
}
//当前页码发生变化,调用此函数
const onCurrentChange = (num) => {pageNum.value = numgetServerManageList()  //1 
}
5.2.3 搜索按钮绑定点击事件
  <el-form-item><el-button type="primary" @click="getServerManageList">搜索</el-button>                </el-form-item>

5.3 添加实现

5.3.1 页面添加抽屉的组件
import {Plus} from '@element-plus/icons-vue'
// 2 控制抽屉是否显示
const visibleDrawer = ref(false)
// 2 添加表单数据模型
const serverManageModel = ref({serverName: '',serverDescribe: '',ipAddress: ''
})

添加页面组件抽屉

 <el-drawer v-model="visibleDrawer" title="添加" direction="rtl" size="50%"><!-- 添加服务器表单 --><el-form :model="serverManageModel" label-width="100px" ><el-form-item label="服务器名称" ><el-input v-model="serverManageModel.serverName" placeholder="请输入服务器名称"></el-input></el-form-item><el-form-item label="服务器IP" ><el-input v-model="serverManageModel.ipAddress" placeholder="请输入服务器IP"></el-input></el-form-item><el-form-item label="描述" ><!-- <el-input v-model="serverManageModel.serverDescribe" placeholder="请输入描述"></el-input> --><el-input v-model="serverManageModel.serverDescribe" :rows="2" type="textarea" placeholder="请输入描述" /></el-form-item><el-form-item><el-button type="primary">保存</el-button>                    </el-form-item></el-form></el-drawer>
5.3.2 为添加新增绑定事件
<el-button type="primary" @click="visibleDrawer = true">添加</el-button>
5.3.3 project.js添加函数实现
//导入request.js请求工具
import request from '@/utils/request.js'// 1  服务器列表查询
export const ServerManageListService = (params) => {return request.get('/serverManage', { params: params })}// 2 添加服务器
export const serverManageAddService = (serverManageModel)=>{ return request.post('/serverManage',serverManageModel)}
5.3.4 ServerManage.vue中提供addServerManage函数完成添加接口的调用

//1、服务器列表查询 2、添加
import { ServerManageListService,serverManageAddService } from '@/api/project.js'
import { ElMessage,ElMessageBox } from 'element-plus'//2 添加服务器接口调用
const addServerManage=async ()=>{    let result = await serverManageAddService(serverManageModel.value);ElMessage.success(result.message? result.message:'添加成功')//getServerManageList,获取服务列表getServerManageList()//隐藏抽屉visibleDrawer.value=false
}
5.3.5 添加页面保存按钮绑定事件
<el-button type="primary" @click="addServerManage()">保存</el-button>   

5.4 编辑实现

编辑与添加共用页面

5.4.1 抽屉标题显示 定义标题
// 3 标题//抽屉标题
const title=ref('')
5.4.2 在抽屉上绑定标题
<el-drawer v-model="visibleDrawer"  :title="title" direction="rtl" size="50%">
5.4.3 为添加文章按钮绑定事件
<el-button type="primary" @click="title='添加服务器';visibleDrawer = true">添加</el-button>
5.4.4 为编辑按钮绑定事件
<el-button :icon="Edit" circle plain type="primary" @click="title='修改服务器';visibleDrawer = true"></el-button>
5.4.5 数据回显(点击编辑显示数据)
5.4.5.1 回显函数showDrawer
// 3  点击编辑的回显函数
const showDrawer = (row)=>{title.value = '修改服务器';visibleDrawer.value = true//数据拷贝serverManageModel.value.serverName = row.serverName;serverManageModel.value.ipAddress = row.ipAddress;serverManageModel.value.serverDescribe = row.serverDescribe;    //扩展id属性,将来需要传参给后台完成数据的修改serverManageModel.value.id = row.id
}
5.4.5.2 编辑按钮绑定事件
<el-button :icon="Edit" circle plain type="primary" @click="showDrawer(row)"></el-button>
5.4.5 project.js实现编辑接口
//导入request.js请求工具
import request from '@/utils/request.js'// 1  服务器列表查询
export const ServerManageListService = (params) => {return request.get('/serverManage', { params: params })}// 2 添加服务器
export const serverManageAddService = (serverManageModel)=>{ return request.post('/serverManage',serverManageModel)
}//3 修改服务器
export const serverManageUpdateService = (serverManageModel)=>{return request.put('/serverManage',serverManageModel)
}
 5.4.6 调用修改接口实现函数
//1、服务器列表查询 2、添加 3修改
import { ServerManageListService,serverManageAddService,serverManageUpdateService } from '@/api/project.js'//3 修改保存
const updateServerManage=async ()=>{let result = await serverManageUpdateService(serverManageModel.value)ElMessage.success(result.message? result.message:'修改成功')//隐藏抽屉visibleDrawer.value=false//再次访问后台接口,查询所有列表数据getServerManageList()
}
5.4.7 为保存按钮添加判断是添加保存还是修改保存
<el-button type="primary" @click="title==='添加服务器'? addServerManage():updateServerManage()">保存</el-button>
 5.4.8 优化修改之后,再添加数据未清空的问题
//3  修改再添加之后进行 清空模型数据
const clearServerManageModel = ()=>{serverManageModel.value.serverName='',serverManageModel.value.ipAddress='',serverManageModel.value.serverDescribe=''    
}

为添加按钮绑定事件

 <el-button type="primary" @click="title='添加服务器';visibleDrawer = true;clearServerManageModel()">添加</el-button>

5.5 删除实现

5.5.1 project.js实现删除接口
//导入request.js请求工具
import request from '@/utils/request.js'// 1  服务器列表查询
export const ServerManageListService = (params) => {return request.get('/serverManage', { params: params })}// 2 添加服务器
export const serverManageAddService = (serverManageModel)=>{ return request.post('/serverManage',serverManageModel)
}//3 修改服务器
export const serverManageUpdateService = (serverManageModel)=>{return request.put('/serverManage',serverManageModel)
}//4 删除服务器
export const serverManageDeleteService = (id) => {return request.delete('/serverManage?id='+id)}
5.5.2 添加删除确认弹窗以及删除接口函数deleteserverManage
//1、服务器列表查询 2、添加 3修改 4删除
import { ServerManageListService,serverManageAddService,serverManageUpdateService,serverManageDeleteService } from '@/api/project.js'
//2  添加 4删除弹窗
import { ElMessage,ElMessageBox } from 'element-plus'// 4 删除(记得引用ElMessageBox)  给删除按钮绑定事件
const deleteserverManage = (row) => {// 提示用户 确认框ElMessageBox.confirm('你确认删除该服务器吗?','温馨提示',{confirmButtonText: '确认',cancelButtonText: '取消',type: 'warning',}).then(async() => {//用户点击了确认let result = await serverManageDeleteService(row.id)// 给出提示ElMessage({type: 'success',message: '删除成功',})//刷新列表//再次访问后台接口,查询所有数据getServerManageList()}).catch(() => {//用户点击了取消ElMessage({type: 'info',message: '取消删除',})})}
5.5.3 删除按钮绑定事件
  <el-button :icon="Delete" circle plain type="danger" @click="deleteserverManage(row)"></el-button>

5.6 ServerManage.vue 完整代码

<script setup>
import {Edit,Delete
} from '@element-plus/icons-vue'import { ref } from 'vue'//1、服务器列表查询 2、添加 3修改 4删除
import { ServerManageListService,serverManageAddService,serverManageUpdateService,serverManageDeleteService } from '@/api/project.js'//2  添加 4删除弹窗
import { ElMessage,ElMessageBox } from 'element-plus'
import {Plus} from '@element-plus/icons-vue'//搜索输入的服务器名称
const serverName = ref('')// 搜索输入的服务器IP
const ipAddress = ref('')//服务列表数据模型
const servers = ref([{"id": 1,"serverName": "服务器11","serverDescribe": "主服务11","ipAddress": "192.168.1.11",        "createTime": "2023-09-03 11:55:30","updateTime": "2023-09-03 11:55:30"},{"id": 5,"serverName": "服务器12","serverDescribe": "主服务12","ipAddress": "192.168.1.12", "createTime": "2023-09-03 11:55:30","updateTime": "2023-09-03 11:55:30"},{"id": 5,"serverName": "服务器13","serverDescribe": "主服务13","ipAddress": "192.168.1.13", "createTime": "2023-09-03 11:55:30","updateTime": "2023-09-03 11:55:30"},
])//分页条数据模型
const pageNum = ref(1)//当前页
const total = ref(20)//总条数
const pageSize = ref(10)//每页条数//当每页条数发生了变化,调用此函数
const onSizeChange = (size) => {pageSize.value = sizegetServerManageList()  // 1
}
//当前页码发生变化,调用此函数
const onCurrentChange = (num) => {pageNum.value = numgetServerManageList()  //1 
}// 1、 定义服务器列表查询函数
const getServerManageList = async () => {let params = {pageNum: pageNum.value,pageSize: pageSize.value,serverName: serverName.value ? serverName.value : null,ipAddress: ipAddress.value ? ipAddress.value : null}let result = await ServerManageListService(params);//渲染列表数据servers.value = result.data.items//渲染总条数total.value=result.data.total
}getServerManageList();// 2 控制抽屉是否显示
const visibleDrawer = ref(false)
// 2 添加表单数据模型
const serverManageModel = ref({serverName: '',serverDescribe: '',ipAddress: ''
})//2 添加服务器接口调用
const addServerManage=async ()=>{    let result = await serverManageAddService(serverManageModel.value);ElMessage.success(result.message? result.message:'添加成功')//getServerManageList,获取服务列表getServerManageList()//隐藏抽屉visibleDrawer.value=false
}// 3 // 3 标题//抽屉标题
const title=ref('')// 3  点击编辑的回显函数
const showDrawer = (row)=>{title.value = '修改服务器';visibleDrawer.value = true//数据拷贝serverManageModel.value.serverName = row.serverName;serverManageModel.value.ipAddress = row.ipAddress;serverManageModel.value.serverDescribe = row.serverDescribe;    //扩展id属性,将来需要传参给后台完成数据的修改serverManageModel.value.id = row.id
}//3 修改保存
const updateServerManage=async ()=>{let result = await serverManageUpdateService(serverManageModel.value)ElMessage.success(result.message? result.message:'修改成功')//隐藏抽屉visibleDrawer.value=false//再次访问后台接口,查询所有列表数据getServerManageList()
}//3  修改再添加之后进行 清空模型数据
const clearServerManageModel = ()=>{serverManageModel.value.serverName='',serverManageModel.value.ipAddress='',serverManageModel.value.serverDescribe=''    
}// 4 删除(记得引用ElMessageBox)  给删除按钮绑定事件
const deleteserverManage = (row) => {// 提示用户 确认框ElMessageBox.confirm('你确认删除该服务器吗?','温馨提示',{confirmButtonText: '确认',cancelButtonText: '取消',type: 'warning',}).then(async() => {//用户点击了确认let result = await serverManageDeleteService(row.id)// 给出提示ElMessage({type: 'success',message: '删除成功',})//刷新列表//再次访问后台接口,查询所有数据getServerManageList()}).catch(() => {//用户点击了取消ElMessage({type: 'info',message: '取消删除',})})}</script>
<template><el-card class="page-container"><template #header><div class="header"><span>服务器管理</span><div class="extra"><el-button type="primary" @click="title='添加服务器';visibleDrawer = true;clearServerManageModel()">添加</el-button></div></div></template><!-- 搜索表单 --><el-form inline><el-form-item label="服务名称:"><el-input v-model="serverName" placeholder="请输入服务器名称" /></el-form-item><el-form-item label="服务IP:"><el-input v-model="ipAddress" placeholder="请输入服务器IP" /></el-form-item><el-form-item><el-button type="primary" @click="getServerManageList">搜索</el-button>                </el-form-item></el-form><!-- 文章列表 --><el-table :data="servers" style="width: 100%"><el-table-column label="服务器名" width="400" prop="serverName"></el-table-column>           <el-table-column label="IP地址" prop="ipAddress"> </el-table-column><el-table-column label="描述" prop="serverDescribe"></el-table-column><el-table-column label="创建时间" prop="createTime"></el-table-column><el-table-column label="更新时间" prop="updateTime"></el-table-column><el-table-column label="操作" width="100"><template #default="{ row }"><el-button :icon="Edit" circle plain type="primary" @click="showDrawer(row)"></el-button><el-button :icon="Delete" circle plain type="danger" @click="deleteserverManage(row)"></el-button></template></el-table-column><template #empty><el-empty description="没有数据" /></template></el-table><!-- 分页条 --><el-pagination v-model:current-page="pageNum" v-model:page-size="pageSize" :page-sizes="[3, 5 ,10, 15]"layout="jumper, total, sizes, prev, pager, next" background :total="total" @size-change="onSizeChange"@current-change="onCurrentChange" style="margin-top: 20px; justify-content: flex-end" /></el-card><!-- 2 抽屉 --><el-drawer v-model="visibleDrawer" :title="title" direction="rtl" size="50%"><!-- 添加服务器表单 --><el-form :model="serverManageModel" label-width="100px" ><el-form-item label="服务器名称" ><el-input v-model="serverManageModel.serverName" placeholder="请输入服务器名称"></el-input></el-form-item><el-form-item label="服务器IP" ><el-input v-model="serverManageModel.ipAddress" placeholder="请输入服务器IP"></el-input></el-form-item><el-form-item label="描述" ><!-- <el-input v-model="serverManageModel.serverDescribe" placeholder="请输入描述"></el-input> --><el-input v-model="serverManageModel.serverDescribe" :rows="2" type="textarea" placeholder="请输入描述" /></el-form-item><el-form-item><el-button type="primary" @click="title==='添加服务器'? addServerManage():updateServerManage()">保存</el-button>                    </el-form-item></el-form></el-drawer></template>
<style lang="scss" scoped>
.page-container {min-height: 100%;box-sizing: border-box;.header {display: flex;align-items: center;justify-content: space-between;}
}.editor {width: 100%;:deep(.ql-editor) {min-height: 200px;}
}
</style>

6、实现Project.vue

6.1 初始化Project.vue

<script setup>
import {Edit,Delete
} from '@element-plus/icons-vue'import { ref } from 'vue'//服务器数据模型
const serverManages = ref([{"id": 3,"ServerName": "11","ipAddress": "192.168.1.11","createTime": "2023-09-02 12:06:59","updateTime": "2023-09-02 12:06:59"},{"id": 4,"ServerName": "12","ipAddress": "192.168.1.12","createTime": "2023-09-02 12:08:16","updateTime": "2023-09-02 12:08:16"},{"id": 5,"ServerName": "13","ipAddress": "192.168.1.13","createTime": "2023-09-02 12:08:33","updateTime": "2023-09-02 12:08:33"}
])//用户搜索时选中服务器id
const serverManageId=ref('')//用户搜索时输入的英文名称
const englishName=ref('')//用户搜索时输入的中文名称
const chineseName=ref('')//列表数据模型
const projects= ref([{"id": 5,"englishName": "analysis","chineseName": "能耗服务","ipAddress": "192.168.1.11","instances": 1,"projectDescribe": "333","createTime": "2023-09-03 11:55:30","updateTime": "2023-09-03 11:55:30","isEnable":1},{"id": 5,"englishName": "dispatch-platform","chineseName": "通讯平台","ipAddress": "192.168.1.12","instances": 1,"projectDescribe": "4545","createTime": "2023-09-03 11:55:30","updateTime": "2023-09-03 11:55:30","isEnable":1},{"id": 5,"englishName": "app","chineseName": "app服务","ipAddress": "192.168.1.13","instances": 1,"projectDescribe": "443","createTime": "2023-09-03 11:55:30","updateTime": "2023-09-03 11:55:30","isEnable":1},
])//分页条数据模型
const pageNum = ref(1)//当前页
const total = ref(20)//总条数
const pageSize = ref(3)//每页条数//当每页条数发生了变化,调用此函数
const onSizeChange = (size) => {pageSize.value = size
}
//当前页码发生变化,调用此函数
const onCurrentChange = (num) => {pageNum.value = num
}
</script>
<template><el-card class="page-container"><template #header><div class="header"><span>项目管理</span><div class="extra"><el-button type="primary">添加</el-button></div></div></template><!-- 搜索表单 --><el-form inline><el-form-item label="服务器IP:"><el-select placeholder="请选择" v-model="serverManageId"><el-option v-for="c in serverManages" :key="c.id" :label="c.ipAddress":value="c.id"></el-option></el-select></el-form-item><el-form-item label="英文名称:"><el-input v-model="englishName" placeholder="请输入英文名称" /></el-form-item><el-form-item label="中文名称:"><el-input v-model="chineseName" placeholder="请输入中文名称" /></el-form-item><el-form-item><el-button type="primary">搜索</el-button><el-button>重置</el-button></el-form-item></el-form><!-- 文章列表 --><el-table :data="projects" style="width: 100%"><el-table-column label="英文名称"  prop="englishName"></el-table-column><el-table-column label="中文名称"  prop="chineseName"></el-table-column><el-table-column label="服务器IP" prop="ipAddress"></el-table-column><el-table-column label="实例数" prop="instances"></el-table-column><el-table-column label="描述" prop="projectDescribe"></el-table-column>           <el-table-column label="创建时间" prop="createTime"> </el-table-column><el-table-column label="更新时间" prop="updateTime"></el-table-column><el-table-column label="启用/禁用" prop="isEnable"></el-table-column><el-table-column label="操作" width="100"><template #default="{ row }"><el-button :icon="Edit" circle plain type="primary"></el-button><el-button :icon="Delete" circle plain type="danger"></el-button></template></el-table-column><template #empty><el-empty description="没有数据" /></template></el-table><!-- 分页条 --><el-pagination v-model:current-page="pageNum" v-model:page-size="pageSize" :page-sizes="[3, 5 ,10, 15]"layout="jumper, total, sizes, prev, pager, next" background :total="total" @size-change="onSizeChange"@current-change="onCurrentChange" style="margin-top: 20px; justify-content: flex-end" /></el-card>
</template>
<style lang="scss" scoped>
.page-container {min-height: 100%;box-sizing: border-box;.header {display: flex;align-items: center;justify-content: space-between;}
}
</style>

6.2 列表查询

6.2.1 project.js添加查询条件服务器IP的查询接口
//导入request.js请求工具
import request from '@/utils/request.js'// 1  服务器列表查询
export const ServerManageListService = (params) => {return request.get('/serverManage', { params: params })}// 2 添加服务器
export const serverManageAddService = (serverManageModel)=>{ return request.post('/serverManage',serverManageModel)
}//3 修改服务器
export const serverManageUpdateService = (serverManageModel)=>{return request.put('/serverManage',serverManageModel)
}//4 删除服务器
export const serverManageDeleteService = (id) => {return request.delete('/serverManage?id='+id)}// 1  服务器列表查询(项目管理页面调用 搜索框  添加页面的下拉选择)
export const ServerManageAllListService = () => {return request.get('/serverManage/all')}
6.2.2 服务器IP查询条件函数
//1、服务器IP动态查询 
import { ServerManageAllListService } from '@/api/project.js'
// 1  搜索查询条件服务器IP 查询
const getServerManageAllList = async () => {//获取所有服务器IPlet result = await ServerManageAllListService();serverManages.value = result.data
}
getServerManageAllList();
6.2.3 项目列表查询project.js接口实现
//导入request.js请求工具
import request from '@/utils/request.js'// 1  服务器列表查询
export const ServerManageListService = (params) => {return request.get('/serverManage', { params: params })}// 2 添加服务器
export const serverManageAddService = (serverManageModel)=>{ return request.post('/serverManage',serverManageModel)
}//3 修改服务器
export const serverManageUpdateService = (serverManageModel)=>{return request.put('/serverManage',serverManageModel)
}//4 删除服务器
export const serverManageDeleteService = (id) => {return request.delete('/serverManage?id='+id)}// 1  服务器列表查询(项目管理页面调用 搜索框  添加页面的下拉选择)
export const ServerManageAllListService = () => {return request.get('/serverManage/all')}// 1 项目列表查询
export const projectListService = (params) => {return request.get('/project', { params: params })
}
6.2.4 Project.vue中,调用接口获取数据
//1、服务器IP动态查询  \项目列表查询projectListService
import { ServerManageAllListService,projectListService} from '@/api/project.js'// 1 项目列表查询
const getProjects = async () => {let params = {pageNum: pageNum.value,pageSize: pageSize.value,serverManageId: serverManageId.value ? serverManageId.value : null,englishName: englishName.value ? englishName.value : null,chineseName: chineseName.value ? chineseName.value : null}let result = await projectListService(params);//渲染列表数据projects.value = result.data.items//为列表中添加iPAddress属性for(let i=0;i<projects.value.length;i++){let project = projects.value[i];for(let j=0;j<serverManages.value.length;j++){if(project.serverManageId===serverManages.value[j].id){project.ipAddress=serverManages.value[j].ipAddress}}}//渲染总条数total.value=result.data.total
}
getProjects()
6.2.5 当分页条的当前页和每页条数发生变化,重新发送请求获取数据
//当每页条数发生了变化,调用此函数
const onSizeChange = (size) => {pageSize.value = sizegetProjects()  // 1
}
//当前页码发生变化,调用此函数
const onCurrentChange = (num) => {pageNum.value = numgetProjects() //1
}
6.2.6 搜索和重置 

为搜索按钮绑定单击事件,调用getArticles函数即可,为重置按钮绑定单击事件,清除serverManageId、chineseName和englishName的值即可

<el-button type="primary" @click="getProjects">搜索</el-button><el-button @click="serverManageId='';englishName='';chineseName=''">重置</el-button>

 6.3 添加

6.3.1 引入添加组件以及添加表单数据模型
// 2  引入添加、修改的抽屉组件
import {Plus} from '@element-plus/icons-vue'
//  2 控制抽屉是否显示
const visibleDrawer = ref(false)// 2添加表单数据模型
const projectModel = ref({englishName: '',chineseName: '',instances: '',serverManageId:'',projectDescribe:''
})

抽屉组件

<!-- 抽屉 --><el-drawer v-model="visibleDrawer" :title="title" direction="rtl" size="50%"><!-- 添加/修改表单 --><el-form :model="projectModel" label-width="100px" ><el-form-item label="英文名称" ><el-input v-model="projectModel.englishName" placeholder="请输入英文名称"></el-input></el-form-item><el-form-item label="中文名称" ><el-input v-model="projectModel.chineseName" placeholder="请输入中文名称"></el-input></el-form-item><el-form-item label="实例数" ><el-input v-model="projectModel.instances" placeholder="请输入实例数"></el-input></el-form-item><el-form-item label="服务器IP"><el-select placeholder="请选择" v-model="projectModel.serverManageId"><el-option v-for="c in serverManages" :key="c.id" :label="c.ipAddress" :value="c.id"></el-option></el-select></el-form-item><el-form-item label="描述" ><!-- <el-input v-model="projectModel.projectDescribe" placeholder="请输入描述数"></el-input> --><el-input v-model="projectModel.projectDescribe" :rows="2" type="textarea" placeholder="请输入描述" /></el-form-item><el-form-item><el-button type="primary">保存</el-button></el-form-item></el-form></el-drawer>
6.3.2 为添加按钮绑定事件
<el-button type="primary" @click="visibleDrawer = true;title='添加项目'">添加</el-button>
6.3.3 project.js提供添加项目接口
//导入request.js请求工具
import request from '@/utils/request.js'// 1  服务器列表查询
export const ServerManageListService = (params) => {return request.get('/serverManage', { params: params })}// 2 添加服务器
export const serverManageAddService = (serverManageModel)=>{ return request.post('/serverManage',serverManageModel)
}//3 修改服务器
export const serverManageUpdateService = (serverManageModel)=>{return request.put('/serverManage',serverManageModel)
}//4 删除服务器
export const serverManageDeleteService = (id) => {return request.delete('/serverManage?id='+id)}// 1  服务器列表查询(项目管理页面调用 搜索框  添加页面的下拉选择)
export const ServerManageAllListService = () => {return request.get('/serverManage/all')}// 1 项目列表查询
export const projectListService = (params) => {return request.get('/project', { params: params })
}// 2添加项目
export const projectAddService = (projectModel)=>{return request.post('/project',projectModel)
}
6.3.4 Project.vue中提供addProject函数完成添加项目接口的调用
//1、服务器IP动态查询  \项目列表查询projectListService 2 添加projectAddService
import { ServerManageAllListService,projectListService,projectAddService} from '@/api/project.js'
//2  添加成功提示框  4 \删除弹窗
import { ElMessage,ElMessageBox } from 'element-plus'// 2 添加项目
const addProject=async ()=>{    let result = await projectAddService(projectModel.value);ElMessage.success(result.message? result.message:'添加成功')//再次调用getProjects(),获取列表数据getProjects()//隐藏抽屉visibleDrawer.value=false
}
6.3.5 为保存按钮绑定事件
<el-button type="primary" @click="addProject()">保存</el-button>

6.4 编辑

6.4.1 为编辑按钮绑定事件(后面会使用函数替换)
<el-button :icon="Edit" circle plain type="primary" @click="title='修改项目';visibleDrawer='true'"></el-button>
6.4.2 数据回显

当点击修改文章按钮时,需要把当前这一条数据的详细信息显示到修改文章的抽屉上,这个叫回显

const showDrawer = (row)=>{title.value = '修改项目';visibleDrawer.value = true//数据拷贝projectModel.value.englishName = row.englishName;projectModel.value.chineseName = row.chineseName;projectModel.value.instances = row.instances;projectModel.value.serverManageId = row.serverManageId;projectModel.value.projectDescribe = row.projectDescribe;//扩展id属性,将来需要传参给后台完成文章的修改projectModel.value.id = row.id
}
 6.4.3 通过插槽的方式得到被点击按钮所在行的数据
<el-button :icon="Edit" circle plain type="primary" @click="showDrawer(row)"></el-button>
6.4.4 project.js中提供修改项目的函数
//导入request.js请求工具
import request from '@/utils/request.js'// 1  服务器列表查询
export const ServerManageListService = (params) => {return request.get('/serverManage', { params: params })}// 2 添加服务器
export const serverManageAddService = (serverManageModel)=>{ return request.post('/serverManage',serverManageModel)
}//3 修改服务器
export const serverManageUpdateService = (serverManageModel)=>{return request.put('/serverManage',serverManageModel)
}//4 删除服务器
export const serverManageDeleteService = (id) => {return request.delete('/serverManage?id='+id)}// 1  服务器列表查询(项目管理页面调用 搜索框  添加页面的下拉选择)
export const ServerManageAllListService = () => {return request.get('/serverManage/all')}// 1 项目列表查询
export const projectListService = (params) => {return request.get('/project', { params: params })
}// 2添加项目
export const projectAddService = (projectModel)=>{return request.post('/project',projectModel)
}//3 修改项目
export const projectUpdateService = (projectModel)=>{return request.put('/project',projectModel)
}
 6.4.5 调用接口完成修改的函数

//1、服务器IP动态查询  \项目列表查询projectListService 2 添加projectAddService 3\projectUpdateService
import { ServerManageAllListService,projectListService,projectAddService,projectUpdateService} from '@/api/project.js'//3 保存调用修改接口
const updateProject=async ()=>{let result = await projectUpdateService(projectModel.value)ElMessage.success(result.message? result.message:'修改成功')//隐藏抽屉visibleDrawer.value=false//再次访问后台接口,查询所有列表数据getProjects()
}
6.4.6 保存按钮判断是添加还是修改
<el-button type="primary" @click="title==='添加项目'? addProject():updateProject()">保存</el-button>
6.4.7 解决编辑再添加数据显示问题

由于现在修改和新增共用了一个数据模型,所以在点击添加文章后,有时候会显示数据,此时可以将articleModel中的数据清空

const clearProjectModel = ()=>{projectModel.value.englishName='',projectModel.value.chineseName='',projectModel.value.instances='',projectModel.value.projectDescribe='',projectModel.value.serverManageId=''
}

添加绑定事件

<el-button type="primary" @click="visibleDrawer = true;title='添加项目';clearProjectModel()">添加</el-button>

6.5 删除

6.5.1 project.js添加删除接口调用
//导入request.js请求工具
import request from '@/utils/request.js'// 1  服务器列表查询
export const ServerManageListService = (params) => {return request.get('/serverManage', { params: params })}// 2 添加服务器
export const serverManageAddService = (serverManageModel)=>{ return request.post('/serverManage',serverManageModel)
}//3 修改服务器
export const serverManageUpdateService = (serverManageModel)=>{return request.put('/serverManage',serverManageModel)
}//4 删除服务器
export const serverManageDeleteService = (id) => {return request.delete('/serverManage?id='+id)}// 1  服务器列表查询(项目管理页面调用 搜索框  添加页面的下拉选择)
export const ServerManageAllListService = () => {return request.get('/serverManage/all')}// 1 项目列表查询
export const projectListService = (params) => {return request.get('/project', { params: params })
}// 2添加项目
export const projectAddService = (projectModel)=>{return request.post('/project',projectModel)
}//3 修改项目
export const projectUpdateService = (projectModel)=>{return request.put('/project',projectModel)
}//4 删除项目
export const projectDeleteService = (id) => {return request.delete('/project?id='+id)
}
6.5.2 Project.vue添加删除弹窗,当用户点击确认后,调用接口删除
//1、服务器IP动态查询  \项目列表查询projectListService 2 添加projectAddService 3\projectUpdateService 4\projectDeleteService
import { ServerManageAllListService,projectListService,projectAddService,projectUpdateService,projectDeleteService} from '@/api/project.js'//2  添加成功提示框  4 \删除弹窗
import { ElMessage,ElMessageBox } from 'element-plus'// 4 删除项目(记得引用ElMessageBox)  给删除按钮绑定事件
const deleteProject= (row) => {// 提示用户 确认框ElMessageBox.confirm('你确认删除该项目吗?','温馨提示',{confirmButtonText: '确认',cancelButtonText: '取消',type: 'warning',}).then(async() => {//用户点击了确认let result = await projectDeleteService(row.id)// 给出提示ElMessage({type: 'success',message: '删除成功',})//刷新列表//再次访问后台接口,查询所有列表数据getProjects()}).catch(() => {//用户点击了取消ElMessage({type: 'info',message: '取消删除',})})
}
6.5.3 为删除按钮绑定事件
<el-button :icon="Delete" circle plain type="danger" @click="deleteProject(row)"></el-button>
6.5.4 Project.vue全部代码
<script setup>
import {Edit,Delete
} from '@element-plus/icons-vue'import { ref } from 'vue'//1、服务器IP动态查询  \项目列表查询projectListService 2 添加projectAddService 3\projectUpdateService 4\projectDeleteService
import { ServerManageAllListService,projectListService,projectAddService,projectUpdateService,projectDeleteService} from '@/api/project.js'
// 2  引入添加、修改的抽屉组件
import {Plus} from '@element-plus/icons-vue'
//2  添加成功提示框  4 \删除弹窗
import { ElMessage,ElMessageBox } from 'element-plus'
//服务器数据模型
const serverManages = ref([{"id": 3,"ServerName": "11","ipAddress": "192.168.1.11","createTime": "2023-09-02 12:06:59","updateTime": "2023-09-02 12:06:59"},{"id": 4,"ServerName": "12","ipAddress": "192.168.1.12","createTime": "2023-09-02 12:08:16","updateTime": "2023-09-02 12:08:16"},{"id": 5,"ServerName": "13","ipAddress": "192.168.1.13","createTime": "2023-09-02 12:08:33","updateTime": "2023-09-02 12:08:33"}
])//用户搜索时选中服务器id
const serverManageId=ref('')//用户搜索时输入的英文名称
const englishName=ref('')//用户搜索时输入的中文名称
const chineseName=ref('')//列表数据模型
const projects = ref([{"id": 5,"englishName": "analysis","chineseName": "能耗服务","ipAddress": "192.168.1.11","instances": 1,"projectDescribe": "333","createTime": "2023-09-03 11:55:30","updateTime": "2023-09-03 11:55:30","isEnable":1},{"id": 5,"englishName": "dispatch-platform","chineseName": "通讯平台","ipAddress": "192.168.1.12","instances": 1,"projectDescribe": "4545","createTime": "2023-09-03 11:55:30","updateTime": "2023-09-03 11:55:30","isEnable":1},{"id": 5,"englishName": "app","chineseName": "app服务","ipAddress": "192.168.1.13","instances": 1,"projectDescribe": "443","createTime": "2023-09-03 11:55:30","updateTime": "2023-09-03 11:55:30","isEnable":1},
])//分页条数据模型
const pageNum = ref(1)//当前页
const total = ref(20)//总条数
const pageSize = ref(10)//每页条数//当每页条数发生了变化,调用此函数
const onSizeChange = (size) => {pageSize.value = sizegetProjects()  // 1
}
//当前页码发生变化,调用此函数
const onCurrentChange = (num) => {pageNum.value = numgetProjects() //1
}// 1  搜索查询条件服务器IP 查询
const getServerManageAllList = async () => {//获取所有服务器IPlet result = await ServerManageAllListService();serverManages.value = result.data
}
getServerManageAllList();// 1 项目列表查询
const getProjects = async () => {let params = {pageNum: pageNum.value,pageSize: pageSize.value,serverManageId: serverManageId.value ? serverManageId.value : null,englishName: englishName.value ? englishName.value : null,chineseName: chineseName.value ? chineseName.value : null}let result = await projectListService(params);//渲染列表数据projects.value = result.data.items    //为列表中添加iPAddress属性for(let i=0;i<projects.value.length;i++){let project = projects.value[i];        for(let j=0;j<serverManages.value.length;j++){if(project.serverManageId===serverManages.value[j].id){project.ipAddress=serverManages.value[j].ipAddress}}}//渲染总条数total.value=result.data.total
}
getProjects()//  2 控制抽屉是否显示
const visibleDrawer = ref(false)// 2添加表单数据模型
const projectModel = ref({englishName: '',chineseName: '',instances: '',serverManageId:'',projectDescribe:''
})// 2 标题//抽屉标题
const title=ref('')// 2 添加项目
const addProject=async ()=>{    let result = await projectAddService(projectModel.value);ElMessage.success(result.message? result.message:'添加成功')//再次调用getProjects(),获取列表数据getProjects()//隐藏抽屉visibleDrawer.value=false
}// 3 点击修改数据回显const showDrawer = (row)=>{title.value = '修改项目';visibleDrawer.value = true//数据拷贝projectModel.value.englishName = row.englishName;projectModel.value.chineseName = row.chineseName;projectModel.value.instances = row.instances;projectModel.value.serverManageId = row.serverManageId;projectModel.value.projectDescribe = row.projectDescribe;//扩展id属性,将来需要传参给后台完成文章的修改projectModel.value.id = row.id
}//3 保存调用修改接口
const updateProject=async ()=>{let result = await projectUpdateService(projectModel.value)ElMessage.success(result.message? result.message:'修改成功')//隐藏抽屉visibleDrawer.value=false//再次访问后台接口,查询所有列表数据getProjects()
}//3 清空模型数据
const clearProjectModel = ()=>{projectModel.value.englishName='',projectModel.value.chineseName='',projectModel.value.instances='',projectModel.value.projectDescribe='',projectModel.value.serverManageId=''
}// 4 删除项目(记得引用ElMessageBox)  给删除按钮绑定事件
const deleteProject = (row) => {// 提示用户 确认框ElMessageBox.confirm('你确认删除该项目吗?','温馨提示',{confirmButtonText: '确认',cancelButtonText: '取消',type: 'warning',}).then(async() => {//用户点击了确认let result = await projectDeleteService(row.id)// 给出提示ElMessage({type: 'success',message: '删除成功',})//刷新列表//再次访问后台接口,查询所有列表数据getProjects()}).catch(() => {//用户点击了取消ElMessage({type: 'info',message: '取消删除',})})
}</script>
<template><el-card class="page-container"><template #header><div class="header"><span>项目管理</span><div class="extra"><el-button type="primary" @click="visibleDrawer = true;title='添加项目';clearProjectModel()">添加</el-button></div></div></template><!-- 搜索表单 --><el-form inline><el-form-item label="服务器IP:"><el-select placeholder="请选择" v-model="serverManageId"><el-option v-for="c in serverManages" :key="c.id" :label="c.ipAddress":value="c.id"></el-option></el-select></el-form-item><el-form-item label="英文名称:"><el-input v-model="englishName" placeholder="请输入英文名称" /></el-form-item><el-form-item label="中文名称:"><el-input v-model="chineseName" placeholder="请输入中文名称" /></el-form-item><el-form-item><el-button type="primary" @click="getProjects">搜索</el-button><el-button @click="serverManageId='';englishName='';chineseName=''">重置</el-button></el-form-item></el-form><!-- 文章列表 --><el-table :data="projects" style="width: 100%"><el-table-column label="英文名称"  prop="englishName"></el-table-column><el-table-column label="中文名称"  prop="chineseName"></el-table-column><el-table-column label="服务器IP" prop="ipAddress"></el-table-column><el-table-column label="实例数" prop="instances"></el-table-column><el-table-column label="描述" prop="projectDescribe"></el-table-column>           <el-table-column label="创建时间" prop="createTime"> </el-table-column><el-table-column label="更新时间" prop="updateTime"></el-table-column><el-table-column label="启用/禁用" prop="isEnable"></el-table-column><el-table-column label="操作" width="100"><template #default="{ row }"><el-button :icon="Edit" circle plain type="primary" @click="showDrawer(row)"></el-button><el-button :icon="Delete" circle plain type="danger" @click="deleteProject(row)"></el-button></template></el-table-column><template #empty><el-empty description="没有数据" /></template></el-table><!-- 分页条 --><el-pagination v-model:current-page="pageNum" v-model:page-size="pageSize" :page-sizes="[3, 5 ,10, 15]"layout="jumper, total, sizes, prev, pager, next" background :total="total" @size-change="onSizeChange"@current-change="onCurrentChange" style="margin-top: 20px; justify-content: flex-end" /></el-card><!-- 抽屉 --><el-drawer v-model="visibleDrawer" :title="title" direction="rtl" size="50%"><!-- 添加/修改表单 --><el-form :model="projectModel" label-width="100px" ><el-form-item label="英文名称" ><el-input v-model="projectModel.englishName" placeholder="请输入英文名称"></el-input></el-form-item><el-form-item label="中文名称" ><el-input v-model="projectModel.chineseName" placeholder="请输入中文名称"></el-input></el-form-item><el-form-item label="实例数" ><el-input v-model="projectModel.instances" placeholder="请输入实例数"></el-input></el-form-item><el-form-item label="服务器IP"><el-select placeholder="请选择" v-model="projectModel.serverManageId"><el-option v-for="c in serverManages" :key="c.id" :label="c.ipAddress" :value="c.id"></el-option></el-select></el-form-item><el-form-item label="描述" ><!-- <el-input v-model="projectModel.projectDescribe" placeholder="请输入描述数"></el-input> --><el-input v-model="projectModel.projectDescribe" :rows="2" type="textarea" placeholder="请输入描述" /></el-form-item><el-form-item><el-button type="primary" @click="title==='添加项目'? addProject():updateProject()">保存</el-button>                                       </el-form-item></el-form></el-drawer></template>
<style lang="scss" scoped>
.page-container {min-height: 100%;box-sizing: border-box;.header {display: flex;align-items: center;justify-content: space-between;}
}
</style>

这篇关于【SpringBoot3+Vue3】六【完】【番外篇】- (0-1临摹)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/434699

相关文章

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

【 html+css 绚丽Loading 】000046 三才归元阵

前言:哈喽,大家好,今天给大家分享html+css 绚丽Loading!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 📚一、效果📚二、信息💡1.简介:💡2.外观描述:💡3.使用方式:💡4.战斗方式:💡5.提升:💡6.传说: 📚三、源代码,上代码,可以直接复制使用🎥效果🗂️目录✍️

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

springboot3打包成war包,用tomcat8启动

1、在pom中,将打包类型改为war <packaging>war</packaging> 2、pom中排除SpringBoot内置的Tomcat容器并添加Tomcat依赖,用于编译和测试,         *依赖时一定设置 scope 为 provided (相当于 tomcat 依赖只在本地运行和测试的时候有效,         打包的时候会排除这个依赖)<scope>provided

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

Vue3项目开发——新闻发布管理系统(六)

文章目录 八、首页设计开发1、页面设计2、登录访问拦截实现3、用户基本信息显示①封装用户基本信息获取接口②用户基本信息存储③用户基本信息调用④用户基本信息动态渲染 4、退出功能实现①注册点击事件②添加退出功能③数据清理 5、代码下载 八、首页设计开发 登录成功后,系统就进入了首页。接下来,也就进行首页的开发了。 1、页面设计 系统页面主要分为三部分,左侧为系统的菜单栏,右侧

【VUE】跨域问题的概念,以及解决方法。

目录 1.跨域概念 2.解决方法 2.1 配置网络请求代理 2.2 使用@CrossOrigin 注解 2.3 通过配置文件实现跨域 2.4 添加 CorsWebFilter 来解决跨域问题 1.跨域概念 跨域问题是由于浏览器实施了同源策略,该策略要求请求的域名、协议和端口必须与提供资源的服务相同。如果不相同,则需要服务器显式地允许这种跨域请求。一般在springbo

HTML提交表单给python

python 代码 from flask import Flask, request, render_template, redirect, url_forapp = Flask(__name__)@app.route('/')def form():# 渲染表单页面return render_template('./index.html')@app.route('/submit_form',

Java 后端接口入参 - 联合前端VUE 使用AES完成入参出参加密解密

加密效果: 解密后的数据就是正常数据: 后端:使用的是spring-cloud框架,在gateway模块进行操作 <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>30.0-jre</version></dependency> 编写一个AES加密