当前位置: 首页 > news >正文

【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临摹)

目录 一、后端 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 Serv…...

生成式AI与大语言模型,东软已经准备就绪

伴随着ChatGPT的火爆全球&#xff0c;数以百计的大语言模型也争先恐后地加入了这一战局&#xff0c;掀起了一场轰轰烈烈的“百模大战”。毋庸置疑的是&#xff0c;继方兴未艾的人工智能普及大潮之后&#xff0c;生成式AI与大语言模型正在全球开启新一轮生产力革新的科技浪潮。 …...

Python爬虫遇到重定向URL问题时如何解决?

什么是重定向 重定向是指当用户请求一个URL时&#xff0c;服务器返回一个中断请求的URL的响应。这种情况通常发生在网站对URL进行了修改或者重定向到其他页面的情况下。其中&#xff0c;如果处理不当开发&#xff0c;可能会导致爬虫无法获取所需的数据&#xff0c;从而影响爬虫…...

【点云surface】无序点云快速三角化

1 介绍 GreedyProjectionTriangulation 是一种基于局部二维投影的三维点贪婪三角剖分算法的实现。它假定局部表面光滑&#xff0c;不同点密度区域之间的过渡相对平滑。 GreedyProjectionTriangulation算法的基本思想是通过逐步投影点云数据到一个三角化网格上来进行重建。它首…...

el-select多选下拉框实现全选功能

<el-selectv-model"query.web_ids"multiplecollapse-tagscollapse-tags-tooltip:max-collapse-tags"2"filterableplaceholder"网站"><li class"checkAllBox" style"padding: 0 32px 0 20px; border-bottom: 1px solid #…...

Elasticsearch 聚合查询(Aggregation)详解

Elasticsearch中的聚合查询&#xff0c;类似SQL的SUM/AVG/COUNT/GROUP BY分组查询&#xff0c;主要用于统计分析场景。 实例&#xff1a; import org.apache.http.HttpHost; import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.action.search.…...

数据库其它调优策略

文章目录 1. 优化MySQL服务器2. 优化数据库结构2.1 差分表&#xff1a;冷热数据分离 3. 大表优化3.1 读/写分离3.2 垂直拆分3.3 水平拆分 1. 优化MySQL服务器 电商平台&#xff0c;双十一&#xff0c;CPU使用率达到99%&#xff0c;系统的计算资源已经耗尽&#xff0c;再也无法…...

【AI认证笔记】NO.2人工智能的发展

目录 一、人工智能的发展里程碑 二、当前人工智能的发展特点 1.人工智能进入高速发展阶段 2.人工智能元年 三、人工智能高速发展的三大引擎 1.算法突破 2.算力飞跃 3.数据井喷 四、AI的机遇 五、AI人才的缺口 六、行业AI 人工智能算法&#xff0c;万物互联&#xff…...

Python与设计模式--观察者模式

23种计模式之 前言 &#xff08;5&#xff09;单例模式、工厂模式、简单工厂模式、抽象工厂模式、建造者模式、原型模式、(7)代理模式、装饰器模式、适配器模式、门面模式、组合模式、享元模式、桥梁模式、&#xff08;11&#xff09;策略模式、责任链模式、命令模式、中介者模…...

Elasticsearch底层原理分析——新建、索引文档

es版本 8.1.0 重要概念回顾 Elasticsearch Node的角色 与下文流程相关的角色介绍&#xff1a; Node Roles配置主要功能说明masternode.roles: [ master ]有资格参与选举成为master节点&#xff0c;从而进行集群范围的管理工作&#xff0c;如创建或删除索引、跟踪哪些节点是…...

ts实现合并数组对象中key相同的数据

背景 在平常的业务中&#xff0c;后端同学会返回以下类似的结构数据 // 后端返回的数据结构 [{ id: 1, product_id: 1, pid_name: "Asia", name: "HKG01" },{ id: 2, product_id: 1, pid_name: "Asia", name: "SH01" },{ id: 3, pro…...

C语言--根据成绩判断等级

一.题目描述 如果学生的成绩小于60分&#xff0c;那么输出不及格 如果学生的成绩大于60分小于85分&#xff0c;那么输出良好 如果学生的成绩大于85分&#xff0c;那么输出优秀 二.代码实现 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> //根据成绩打印等级 //scor…...

Rust多线程任务,发现有些线程一直获取不到锁【已解决】

问题描述 项目中用到rust&#xff0c;其中在多线程中用到了同一个对象的锁&#xff0c;然而发现其中一个线程一直拿不到这个锁。 解决过程 我先是在线程A中加入了sleep方法&#xff0c;这样做的效果就是&#xff0c;比最初好一些&#xff0c;但是拿到锁还是要较长时间&#xf…...

【区块链】产品经理的NFT初探

常见的FT如比特币&#xff08;BTC&#xff09;&#xff0c;以太币&#xff08;ETH&#xff09;等&#xff0c;两个代币之间是完全可替换的。而NFT具有唯一性&#xff0c;不可以互相替换。本文作者对NET的发展现状、相关协议、应用场景等方面进行了分析&#xff0c;一起来看一下…...

香港服务器减少延迟的几种方法

我们在租用香港服务器时&#xff0c;总觉得网站程序反应太慢。选择了香港服务器的开发商和企业对香港服务器目前的访问速度不满意 怎么办&#xff1f;第一点是换服务器。更换配置更大、带宽更高的服务器&#xff0c;可以更好的解决网站访问速度。如何减少香港服务器的延时 速度…...

PowerShell命令小记

1. 使用命令删除指定文件或文件夹 在 PowerShell 中&#xff0c;你可以使用 Remove-Item 命令递归删除文件夹下的指定文件。以下是一条命令的示例&#xff0c;该命令删除指定文件夹及其子文件夹中的所有 .txt 文件&#xff1a; Remove-Item -Path "D:\test" -Recur…...

C语言小练

目录 打印斐波那契数列指定位置的值 给定两个数&#xff0c;求这两个数的最大公约数 三个数从大到小输出 模拟用户登陆情况&#xff0c;且只能输如三次 采用二分法查找数组中的指定元素 打印输出九九乘法表 数一下1-100中所有整数出现多少个数字9 打印1-200之间的素数&…...

Webhook端口中的自签名身份验证

概述 有时&#xff0c;可能需要通过 Webhook 端口从交易伙伴处接收数据&#xff0c;但该交易伙伴可能需要更多的安全性&#xff0c;而不仅仅是用于验证入站 Webhook 请求的基本身份验证用户名/密码 – 或者您可能只想在入站 Webhook 消息上添加额外的安全层。 使用 Webhook 端…...

CSS预处理器(如Sass或Less):变量、嵌套规则和混合器等高级功能

在Vue项目中&#xff0c;可以使用CSS预处理器&#xff08;如Sass或Less&#xff09;来编写样式。 这些预处理器提供了一些高级功能&#xff0c;如变量、嵌套规则和混合器等。 1. 变量 在Sass中&#xff0c;我们可以使用$符号定义变量。这些变量方便我们在多个地方重复使用&a…...

【Linux】Linux第一个小程序 --- 进度条

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在学习c和Linux还有算法 ✈️专栏&#xff1a;Linux &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章有啥瑕疵&#xff0c;希望大佬指点一二 …...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

【生成模型】视频生成论文调研

工作清单 上游应用方向&#xff1a;控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称&#xff1a;Apache Flink REST API 任意文件读取漏洞CVE编号&#xff1a;CVE-2020-17519CVSS评分&#xff1a;7.5影响版本&#xff1a;Apache Flink 1.11.0、1.11.1、1.11.2修复版本&#xff1a;≥ 1.11.3 或 ≥ 1.12.0漏洞类型&#xff1a;路径遍历&#x…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...

C++:多态机制详解

目录 一. 多态的概念 1.静态多态&#xff08;编译时多态&#xff09; 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1&#xff09;.协变 2&#xff09;.析构函数的重写 5.override 和 final关键字 1&#…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

vulnyx Blogger writeup

信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面&#xff0c;gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress&#xff0c;说明目标所使用的cms是wordpress&#xff0c;访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...