基于springboot+vue2+mysql,不能添加重复数据的实现

1.后端代码的实现:

1.1controller层

@PostMapping("/save")public ResultData saveNotice(@RequestAttribute Long _userId,@RequestBody OperationMaintenance operationMaintenance ) throws IOException {try {operationMaintenanceService.saveData(_userId, operationMaintenance);return ResultData.success();} catch (CustomTitleExistsException e) {// 捕获自定义异常,并返回错误响应return ResultData.fail(e.getMessage());} catch (Exception e) {// 捕获其他异常,并返回错误响应return ResultData.fail("运维标题已存在");}}

1.2serviceimpl层

@Overridepublic void saveData(Long _userId, OperationMaintenance operationMaintenance) throws IOException {if (isTitleExists(operationMaintenance.getTitle())) {throw new CustomTitleExistsException("运维标题已存在,请重新输入");}else {operationMaintenance.setId(_userId);operationMaintenance.setCreateUserId(_userId);operationMaintenance.setCreateTime(LocalDateTime.now());operationMaintenanceMapper.insert(operationMaintenance);}}
@Overridepublic Boolean isTitleExists(String title) throws IOException {OperationMaintenance existing = operationMaintenanceMapper.findByTitle(title);return existing != null;}

1.3xml中的sql实现

 <select id="findByTitle" resultType="com.todod.model.OperationMaintenance">SELECT * FROM operation_maintenance om WHERE  om.om_title = #{title}</select>

1.4自定义异常类:

public class CustomTitleExistsException extends RuntimeException{public CustomTitleExistsException(String message) {super(message);}
}

1.5返回结果类:

	private static final String OK = "ok";private static final String ERROR = "error";private  static  final String fail = "运维标题存在,请重新输入";public static final int OK_CODE = 20000; // 成功public static final int ERROR_CODE = 50000; // 系统异常public static final int PARAM_ERROR_CODE = 50002; // 参数错误public static final int METHOD_NOT_SUPPORTED = 50003; // 请求方式不正确public static final int REQUEST_INTERFACE_ERROE_CODE = 50004; // 接口请求异常public static final int ESTIMATE_ERROR_CODE = 50100; // 自定义异常public static final int USER_NOT_LOGIN = 50101; // 用户未登录public static final int USER_LOGIN_EXPIRED = 50102; // 用户登陆超时public static final int USER_LOGIN_AcountError = 50103; // 用户名或密码错误public static final int USER_LOGIN_StateError = 50104; // 用户状态禁用public static final int INTERFACE_ERROR = 50105; // 接口请求异常public static final int SINGLE_LOGIN_ERROR = 50106; // 单用户登陆异常public static final int USER_UPLOAD_PASSWORD = 50107; // 强制用户修改密码/*** 响应结果*/private int code;/*** 响应消息*/private String msg;/*** 响应消息*/private Object data;public ResultData() {}public ResultData(int code, String msg) {super();this.code = code;this.msg = msg;}public ResultData(int code, String msg, Object data) {super();this.code = code;this.msg = msg;this.data = data;}public static ResultData fail(String message) {return new ResultData(PARAM_ERROR_CODE, fail);}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}public static ResultData success() {return new ResultData(OK_CODE, OK);}public static ResultData success(String msg) {return new ResultData(OK_CODE, msg);}public static ResultData success(String msg, Object data) {return new ResultData(OK_CODE, msg, data);}public static ResultData error() {return new ResultData(ERROR_CODE, ERROR);}public static ResultData error(String msg) {return new ResultData(ERROR_CODE, msg);}public static ResultData error(String msg, Object data) {return new ResultData(ERROR_CODE, msg, data);}public static ResultData error(int code, String msg) {return new ResultData(code, msg);}public static ResultData error(int code, String msg, Object data) {return new ResultData(code, msg, data);}public int getCode() {return code;}public void setCode(int code) {this.code = code;}public Object getData() {return data;}public void setData(Object data) {this.data = data;}

2.前端代码的实现:

2.1添加数据页面:

<template><div style="width:100%;height:auto; margin:0 auto;"><el-form :model="form" label-width="100px" label-position="left"><el-row :gutter="20"><el-col :span="24"><el-form-item><div slot="label">项目名称<font color="red">*</font></div>           <el-select v-model="form.dirId" clearable style="width:100%;" @change="selectGoodsByGroupId($event)"><el-option v-for="item in symbols" :key="item.id" :label="item.name" :value="item.id" /></el-select></el-form-item></el-col><el-col :span="24"><el-form-item><div slot="label">运维标题<font color="red">*</font></div><el-input v-model="form.title" placeholder="运维标题" /></el-form-item></el-col></el-row><el-row :gutter="20"><el-col :span="12"><el-form-item><div slot="label" >运维人员<font color="red">*</font></div><el-select v-model="form.staffId" clearable style="width:100%;" @change="selectGoodsByGroupId($event)"><el-option v-for="item in symbols2" :key="item.id" :label="item.nickName" :value="item.id" /></el-select></el-form-item></el-col>  <el-col :span="12"><el-form-item><div slot="label">运维日期<font color="red">*</font></div><el-date-pickerv-model="form.itemTime"value-format="yyyy-MM-dd"class="filter-item"type="daterange"range-separator="至"start-placeholder="运维开始日期"end-placeholder="运维结束日期"style="width: 100%;":clearable="false"/></el-form-item></el-col></el-row><el-form-item label="内容"><el-input v-model="form.content" type="textarea" :autosize="{ minRows: 3, maxRows: 6}" /></el-form-item><el-form-item label="备注"><el-input v-model="form.message" type="textarea" :autosize="{ minRows: 3, maxRows: 6}" /></el-form-item><el-form-item label="检测报告" prop="gysId"><el-uploadclass="upload-demo"accept=".jpg,.png,.jpeg,.bmp,.gif,.svg,.mp4,.avi,.wmv,.mpg,.rmvb,.flv,.doc,.docx,.xlsx":on-change="handleChange":action="uploadpath":headers="uoloadheaders":on-success="handleAvatarSuccess":on-remove="handleRemove":on-exceed="handleExceed":file-list="fileList":before-upload="beforeAvatarUpload"name="uploadfile_ant"><el-button size="small" icon="el-icon-upload" type="primary">选择文件</el-button><span style="color:red;">  上传文件不超过100MB</span></el-upload></el-form-item><el-form-item label="回复文档" prop="gysId"><el-uploadclass="upload-demo"accept=".jpg,.png,.jpeg,.bmp,.gif,.svg,.mp4,.avi,.wmv,.mpg,.rmvb,.flv,.doc,.docx,.xlsx":on-change="handleChange2":action="uploadpath2":headers="uoloadheaders":on-success="handleAvatarSuccess2":on-remove="handleRemove2":on-exceed="handleExceed2":file-list="fileList2":before-upload="beforeAvatarUpload2"name="uploadfile_ant"><el-button size="small" icon="el-icon-upload" type="primary">选择文件</el-button><span style="color:red;">  上传文件不超过100MB</span></el-upload></el-form-item></el-form><div style="text-align:center;"><el-button type="primary" @click="save()">保存</el-button><el-button type="danger" @click="closePage">取消</el-button></div></div>
</template>
<script>import { saveData } from '@/api/operationMaintenance'import { getAllList ,} from '@/api/maApplicationInfo'
import { Message } from 'element-ui'
import {getUserList,getId} from '@/api/user'
import { getDictListByCode } from '@/api/dict'
import tool from '@/utils/tool'
export default {inject: ['getList'],data() {return {form: {},uploadpath: '',uploadpath2: '',types: [],batchCode:'',symbols: [],symbols2:[],symbols3:[],uoloadheaders: {},fileData: '', // 文件上传数据(多文件合一)fileList: [],fileList2: [] // upload多文件数组}},created() {     this.getproject()this.getStateList('YW_OPEX_STATUS')},methods: {getStateList(code){getDictListByCode(code).then(response => {if(code === 'YW_OPEX_STATUS'){this.symbols3 = response.data} })},getproject(){getAllList().then(response=> {this.symbols = response.data})getUserList().then(response=>{this.symbols2 = response.data})    this.batchCode = ''getId().then(res => {this.batchCode = res.datalet address = process.env.NODE_ENV == 'development' ? process.env.VUE_APP_URL_RECON : process.env.VUE_APP_BASE_API;var path = '/inspectionReport/uploadFile'var path2 = '/replayDocument/uploadFile' this.uploadpath = address + paththis.uploadpath2 = address + path2this.uoloadheaders = {'X-TOKEN' : tool.getCookie('X-Token'),'client-url':location.href,'applicationId':this.applicationId}})},selectGoodsByGroupId(val) { // 根据设备组id获取相应的商品if (val != null && val !== '' && val !== undefined) {for (var i = 0; i < this.symbols.length; i++) {if (this.symbols[i].id === val) {this.form.userId = this.symbols[i].customerMid}}}},save(){if (!this.form.dirId) {this.$message.error('项目名称称不能为空')return} else if (!this.form.title) {this.$message.error('运维标题不能为空')return} else if (!this.form.staffId) {this.$message.error('运维人员不能为空')return} else if (!this.form.itemTime) {this.$message.error('运维日期不能为空')return} else {this.form.startTime = this.form.itemTime[0]this.form.endTime = this.form.itemTime[1]const loading = this.$loading({lock: true,text: 'Loading',spinner: 'el-icon-loading',background: 'rgba(0, 0, 0, 0.7)'})saveData(this.form).then(response => {console.log(response.code)Message({message: '新增成功',type: 'success',duration: 5 * 1000,})this.$emit('update:visible', false)loading.close()this.getList()}).catch(response => {loading.close()this.getList()})}},handleChange(file, fileList) {let fileName = file.name;let uid = file.uidlet pos = fileName.lastIndexOf(".");let lastName = fileName.substring(pos, fileName.length);var suffix = '.jpg,.png,.jpeg,.bmp,.gif,.svg,.mp4,.avi,.wmv,.mpg,.rmvb,.flv,.doc,.docx,.xlsx'if (suffix.indexOf(lastName.toLowerCase()) === -1) {this.$message.error("文件必须为.jpg,.png,.jpeg,.bmp,.gif,.svg,.mp4,.avi,.wmv,.mpg,.rmvb,.flv,.doc,.docx,.xlsx类型");for(var i = 0;i<fileList.length;i++) {if(fileList[i].uid == uid) {fileList.splice(i,1)}}return;}const existFile = fileList.slice(0, fileList.length - 1).find(f => f.name === file.name)if (existFile) {this.$message.error('当前文件已经存在!')fileList.pop()}this.fileList = fileList},handleChange2(file, fileList2) {let fileName = file.name;let uid = file.uidlet pos = fileName.lastIndexOf(".");let lastName = fileName.substring(pos, fileName.length);var suffix = '.jpg,.png,.jpeg,.bmp,.gif,.svg,.mp4,.avi,.wmv,.mpg,.rmvb,.flv,.doc,.docx,.xlsx'if (suffix.indexOf(lastName.toLowerCase()) === -1) {this.$message.error("文件必须为.jpg,.png,.jpeg,.bmp,.gif,.svg,.mp4,.avi,.wmv,.mpg,.rmvb,.flv,.doc,.docx,.xlsx类型");for(var i = 0;i<fileList2.length;i++) {if(fileList2[i].uid == uid) {fileList2.splice(i,1)}}return;}const existFile = fileList2.slice(0, fileList2.length - 1).find(f => f.name === file.name)if (existFile) {this.$message.error('当前文件已经存在!')fileList2.pop()}this.fileList2 = fileList2},handleAvatarSuccess(res, file) {this.uploadLoading = falseif (res.code === 20000) {this.form.reportId= res.data.idthis.upVisible = falseMessage({message: '上传成功',type: 'success',duration: 5 * 1000})} else {this.upVisible = trueMessage({message: res.msg,type: 'error',duration: 5 * 1000})}},handleAvatarSuccess2(res, file) {this.uploadLoading = falseif (res.code === 20000) {this.form.fileId= res.data.idthis.upVisible = falseMessage({message: '上传成功',type: 'success',duration: 5 * 1000})} else {this.upVisible = trueMessage({message: res.msg,type: 'error',duration: 5 * 1000})}},handleRemove(file, fileList) {this.fileList = fileList},handleExceed(files, fileList) {this.$message.warning(`当前限制选择 1 个文件,本次选择了 ${files.length} 个文件,共选择了 ${files.length + fileList.length} 个文件`)},beforeAvatarUpload(file) {const isLt2M = file.size / 1024 / 1024 < 100if (!isLt2M) {this.$message.error('上传文件大小不能超过100MB!')}return isLt2M},handleRemove2(file, fileList2) {this.fileList2 = fileList2},handleExceed2(files, fileList2) {this.$message.warning(`当前限制选择 1 个文件,本次选择了 ${files.length} 个文件,共选择了 ${files.length + fileList2.length} 个文件`)},beforeAvatarUpload2(file) {const isLt2M = file.size / 1024 / 1024 < 100if (!isLt2M) {this.$message.error('上传文件大小不能超过100MB!')}return isLt2M},closePage() {this.$emit('update:visible', false)},}
}
</script>

2.2相关js

import request from '@/utils/request'export function getInitialLoading() {return request({url: '/operationMaintenance/getInitialLoading',method: 'post'})
}export function getAgainLoading(data) {return request({url: '/operationMaintenance/getAgainLoading',method: 'post',params: data})
}export function getPage(data) {return request({url: '/operationMaintenance/getPage',method: 'post',data})
}export function saveData(data) {return request({url: '/operationMaintenance/save',method: 'post',data})
}export function edit(data) {return request({url: '/operationMaintenance/edit',method: 'post',data})
}export function remove(data) {return request({url: '/operationMaintenance/delete',method: 'post',params: data})
}export function getInfo(data) {return request({url: '/operationMaintenance/getInfo',method: 'get',params: data})
}export function getXiangMuList(data) {return request({url: '/operationMaintenance/getXiangMuList',method: 'post',data})
}export function getSelectedPage(data) {return request({url: '/operationMaintenance/getSelectedPage',method: 'post',data})
}export function getSelected2Page(data) {return request({url: '/operationMaintenance/getSelected2Page',method: 'post',data})
}export function getAllList() {return request({url: '/operationMaintenance/getAllList',method: 'post'})
}export function downloadFile(paran) {return request({url: '/inspectionReport/downLoad',method: 'post',params: paran,responseType: 'blob'})
}
export function downloadFile2(paran) {return request({url: '/replayDocument/downLoad',method: 'post',params: paran,responseType: 'blob'})
}// 下载文件
export function downloadById(data) {return request({url: '/inspectionReport/downLoad',method: 'post',params: data,responseType: 'blob'})}export function getTreeData() {return request({url: '/operationMaintenance/getTreePartData',method: 'post'})}

3.request.js

import axios from 'axios'
import { Message } from 'element-ui'
import router from '.././router'
import tool from './tool'const otherReq = ['downLoad', 'downloadTemplate','problemTemplate']
let address = process.env.NODE_ENV == 'development' ? process.env.VUE_APP_URL_RECON : process.env.VUE_APP_BASE_API;// create an axios instance
const service = axios.create({baseURL: address, // url = base url + request url// withCredentials: true, // send cookies when cross-domain requeststimeout: -1 // request timeout
})// request interceptor
service.interceptors.request.use(config => {// do something before request is sentlet token = tool.getCookie('X-Token');config.headers['X-TOKEN'] = tokenconfig.headers['client-url'] = location.hrefreturn config},error => {// do something with request errorconsole.log(error) // for debugreturn Promise.reject(error)}
)// response interceptor
service.interceptors.response.use(/*** If you want to get http information such as headers or status* Please return  response => response*//*** Determine the request status by custom code* Here is just an example* You can also judge the status by HTTP Status Code*/response => {const res = response.datavar url = response.request.responseURLvar split = url.split('/')var laststr = split[split.length - 1]var lastUrl = laststr.split('?')[0]if (lastUrl === 'flow') {return response}if (otherReq.indexOf(lastUrl) !== -1) {return response}if (url.indexOf('/data-source/data/') !== -1) {return response.data}// if the custom code is not 20000, it is judged as an error.if (res.code !== 20000) {if (res.code === 50101 || res.code === 50102) {if (url.indexOf('/getFillByTask') !== -1) {let data = JSON.parse(response.config.data)let taskId = data.taskId;router.push({ path: '/loginShare', query: { id: taskId } })} else {// 获取登录页访问地址let ypt = process.env.NODE_ENV == 'development' ? process.env.VUE_APP_HOME_URL : process.env.VUE_APP_HOME_URL_PROD;// 如果当前路由不是登录页,跳转到登录页if (window.location.href.indexOf(ypt) === -1) {window.localStorage.clear();tool.clearAllCookie()localStorage.stop = true;let ypt = process.env.NODE_ENV == 'development' ? process.env.VUE_APP_HOME_URL : process.env.VUE_APP_HOME_URL_PROD;window.location.href = ypt}}}else if (res.code === 50002) { //Message({message: res.msg || 'Error',type: 'error',duration: 5 * 1000})}else if (res.code === 50107) { // 修改密码router.push({name: 'uploadPassword', params: { token: res.data.token }})} else if (res.code === 99999) { // 未授权router.push({ path: '/empower/empower' })} else if (res.code === 50000) { // 未授权Message({message: res.msg || 'Error',type: 'error',duration: 5 * 1000})}// Message({//   message: res.msg || 'Error',//   type: 'error',//   duration: 5 * 1000// })return Promise.reject(new Error(res.msg || 'Error'))} else {return res}},error => {console.log('err' + error) // for debugMessage({message: error.msg || 'Error',type: 'error',duration: 5 * 1000})return Promise.reject(error)}
)export default service

3.课外知识:

后端打包命令:mvn clean package;

前段打包命令:npm run build;

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

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

相关文章

aosp14的分屏接口ISplitScreen接口获取方式更新-学员疑问答疑

背景&#xff1a; 有学员朋友在学习马哥的分屏pip自由窗口专题时候&#xff0c;做相关分屏做小桌面项目时候&#xff0c;因为原来课程版本是基于android 13进行的讲解的&#xff0c;但是现在公司已经开始逐渐进行相关的android 14的适配了&#xff0c;但是android 14这块相比a…

探索微软的edge

微软的Edge浏览器是一款由微软开发的网络浏览器&#xff0c;最初基于EdgeHTML布局引擎&#xff0c;后来转向了Chromium开源项目&#xff0c;成为基于Chromium的浏览器。以下是一些探索微软Edge浏览器的关键点&#xff1a; 1. 下载和安装 访问微软官方网站下载最新版本的Edge浏…

进口铝合金隔膜泵的性能

进口铝合金隔膜泵的性能特点主要体现在以下几个方面&#xff1a; 材质与结构&#xff1a; 材质&#xff1a;采用铝合金材料制造&#xff0c;具有良好的耐腐蚀性和轻量化特点&#xff0c;使得泵体结构紧凑、轻便&#xff0c;便于移动和安装。结构&#xff1a;泵体设计紧凑&…

Redis对象存储的类型

基本概念 Redis是一个基于内存中的数据结构存储系统&#xff0c;可以用作数据库、缓存和消息中间件。Redis支持五种常见的对象类型&#xff1a; 字符串&#xff08;String&#xff09;哈希&#xff08;Hash&#xff09;列表&#xff08;List&#xff09;集合&#xff08;Set&…

2024年上半年系统架构设计师——案例第二题——UML相关

这个只记到一个大概了 主题干&#xff0c;说明人员访客系统 题目1 9分 问序列图信息类型和特点 题目2 序列图填空 好像是10分吧 访客系统的序列图 题目3 6分 说明软件分析和设计时的和UML图有关原则&#xff1f;

Cocos Creator 2D物理引擎的使用详解

前言 Cocos Creator是一款优秀的游戏开发工具&#xff0c;它提供了强大的2D物理引擎&#xff0c;帮助开发者轻松实现游戏中的物理效果。在本文中&#xff0c;我们将详细介绍Cocos Creator中2D物理引擎的使用方法&#xff0c;并通过代码实现来演示其具体应用。 对惹&#xff0…

展厅设计要做好需要考虑哪些要素

1、展示主题 企业展厅要有一个明朗的展示主题&#xff0c;不止是为了为展厅设计提供方向&#xff0c;也是为了让参观者更好地了解和认识企业。通过精心策划的展示主题&#xff0c;打造一个富有情感和故事性的展示空间&#xff0c;可以快速感染到参观者&#xff0c;使其能够在参…

Go使用结构体实现类(面向对象)

前置 package main ​ import ("fmt" ) ​ // 矩形结构体 type Rectangle struct {Length intWidth int } ​ // 计算矩形面积 func (r *Rectangle) Area() int {return r.Length * r.Width } ​ func main() {r : Rectangle{4, 2}// 调用 Area() 方法&#xff0c;计…

代码随想录-算法训练营day52【动态规划13:最长递增子序列、最长连续递增序列、最长重复子数组】

代码随想录-035期-算法训练营【博客笔记汇总表】-CSDN博客 第九章 动态规划part13● 300.最长递增子序列 ● 674. 最长连续递增序列 ● 718. 最长重复子数组 详细布置 300.最长递增子序列 今天开始正式子序列系列,本题是比较简单的,感受感受一下子序列题目的思路。 视频…

Git与Maven的使用

1. Git git是版本控制工具&#xff0c;gitee和github是基于git的代码托管仓库。 1.1 常用命令 类型描述命令全局配置设置用户名git config --user.name 用户名设置用户邮箱git config --user.email 邮箱地址基本命令[本地命令]初始化本地仓库git init查看仓库状态git status添…

幼儿园管理系统-收退费管理原型模版

幼儿园管理系统是专为幼儿园打造&#xff0c;涵盖学校儿童、职工人事、收费财务、后勤管理、办公教务、膳食分析、体检保健、文档管理等各方面内部管理的幼儿园专家系统。 本次分享给大家的是雅居乐教育集团幼儿园园务管理系统中“收退费管理”模块的设计文档。收退费管理是幼儿…

CSP化学方程式配平(简单易懂)

100分代码&#xff1a; check()&#xff1a;检查每个字符串中元素及其数量 did(int i , int x , int y)&#xff1a;将第 i 行的第 y 个数前都是0&#xff0c;第 y 个数开始不是0&#xff0c;根据第 x 行将第 i 行第 y 个数开始的数变成0 map<string , int>mp &#xff…

leetcode打卡#day30 93. 复原 IP 地址、78. 子集、 90. 子集 II

93. 复原 IP 地址 class Solution { private:vector<string> result;//判断Ip字段是否合法bool isValid(string& s, int startIndex, int endIndex) {if (startIndex > endIndex) return false;//以0开头 -- 无效数字if (s[startIndex] 0 && startIndex…

代码+视频,总结R语言常用的几种按条件转换数据的方法

在科学研究中免不了和数据打交道&#xff0c;收集到原始数据后我们经常需要对其进行清洗、转换才能得到我们需要的数据。 今天我总结了一下自己常用的一些多条件的数据转换方法&#xff0c;在临床中遇到问题能多一种选择&#xff0c;下面视频操作演示一下 总结R语言常用的几种按…

深度学习 --- stanford cs231 编程作业(如何在chrome中安装Google colab)

stanford cs231 编程作业(如何开始你的colab编程&#xff09; 斯坦福231n的所有作业都要求在colab里面做&#xff0c;colab可以为你提供免费的云计算。实际上在他的官网中也有关于如何安装colab的详细说明视频。 https://youtu.be/DsGd2e9JNH4https://youtu.be/DsGd2e9JNH4 我这…

springboot集成mybatis 单元测试

1、依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0…

MATLAB 相移法计算绝对相位

文章目录 一、简介二、实现代码三、实现效果参考文献一、简介 继续之前博客的内容(Matlab 结构光相移法(单频多相)),通过相移算法计算出的相位主值必 ϕ ( x , y ) \phi(x,y)

Unity入门理论+实践篇之Luna

创建世界的主角 父子物体 首先创建一个cube物体 可以观察到其在2D视角下的坐标为&#xff08;0&#xff0c;0&#xff09; 此时将cube物体拖拽到ldle_0下&#xff0c;如图所示&#xff0c;并将其坐标值改为&#xff08;2&#xff0c;2&#xff09; 此时再将ldle_0物体的坐标…

95.网络游戏逆向分析与漏洞攻防-ui界面的设计-ui的设计与架构

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果&#xff0c;代码看不懂是正常的&#xff0c;只要会抄就行&#xff0c;抄着抄着就能懂了 内容…

基于jeecgboot-vue3的Flowable新建流程定义(二)

因为这个项目license问题无法开源&#xff0c;更多技术支持与服务请加入我的知识星球。 接上一节 4、编辑好后进行保存&#xff0c;保存代码如下&#xff1a; /*保存流程定义*/const save (data: any) > {//console.log("save data", data); // { process: {..…