基于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.pswp.cn/bicheng/16699.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/16699.shtml
英文地址,請注明出處:http://en.pswp.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: {..…