鴻蒙OSUniApp 實現的表單驗證與提交功能#三方框架 #Uniapp

UniApp 實現的表單驗證與提交功能

前言

在移動端應用開發中,表單是用戶與應用交互的重要媒介。一個好的表單不僅布局合理、使用方便,還應該具備完善的驗證與提交功能,以確保用戶輸入的數據準確無誤。本文將分享如何在 UniApp 中實現表單驗證與提交功能,幫助你構建更加健壯的表單系統。

作為一個經常與表單打交道的開發者,我發現很多初學者往往忽視了表單驗證的重要性,或者實現方式不夠優雅。通過本文,希望能為你提供一些關于 UniApp 表單處理的實用技巧和最佳實踐。

為什么需要表單驗證?

想象一下,如果沒有表單驗證,用戶可能會提交不完整或格式錯誤的數據:

  • 手機號碼少輸一位或輸入了字母
  • 密碼太簡單,不符合安全要求
  • 重要字段被遺漏
  • 日期格式錯誤
  • 上傳的圖片尺寸過大或格式不支持

這些問題不僅會導致后端數據處理錯誤,還會影響用戶體驗。因此,前端表單驗證顯得尤為重要。

UniApp 表單驗證的實現方式

在 UniApp 中,有多種方式可以實現表單驗證:

  1. 使用原生方法自行實現
  2. 使用第三方驗證庫(如 async-validator)
  3. 結合 uView 等 UI 框架使用內置驗證功能

下面我們主要討論前兩種方式的實現。

方式一:自行實現表單驗證

自行實現的優點是靈活、無需引入額外依賴,但需要自己編寫各種驗證規則和處理邏輯。

基本思路:
  1. 定義表單數據模型
  2. 編寫驗證規則函數
  3. 在提交前調用驗證函數
  4. 根據驗證結果決定是否提交

讓我們看一個簡單的注冊表單驗證示例:

export default {data() {return {// 表單數據form: {username: '',password: '',confirmPassword: '',mobile: '',email: '',agree: false},// 錯誤信息errors: {username: '',password: '',confirmPassword: '',mobile: '',email: '',agree: ''}}},methods: {// 驗證用戶名validateUsername() {if (!this.form.username) {this.errors.username = '用戶名不能為空';return false;}if (this.form.username.length < 3 || this.form.username.length > 20) {this.errors.username = '用戶名長度應為3-20個字符';return false;}this.errors.username = '';return true;},// 驗證密碼validatePassword() {if (!this.form.password) {this.errors.password = '密碼不能為空';return false;}if (this.form.password.length < 6) {this.errors.password = '密碼長度不能少于6個字符';return false;}// 包含數字和字母的正則表達式const passwordPattern = /^(?=.*[0-9])(?=.*[a-zA-Z]).{6,}$/;if (!passwordPattern.test(this.form.password)) {this.errors.password = '密碼必須包含數字和字母';return false;}this.errors.password = '';return true;},// 驗證確認密碼validateConfirmPassword() {if (!this.form.confirmPassword) {this.errors.confirmPassword = '請確認密碼';return false;}if (this.form.confirmPassword !== this.form.password) {this.errors.confirmPassword = '兩次輸入的密碼不一致';return false;}this.errors.confirmPassword = '';return true;},// 驗證手機號validateMobile() {if (!this.form.mobile) {this.errors.mobile = '手機號不能為空';return false;}// 中國大陸手機號正則表達式const mobilePattern = /^1[3-9]\d{9}$/;if (!mobilePattern.test(this.form.mobile)) {this.errors.mobile = '請輸入有效的手機號碼';return false;}this.errors.mobile = '';return true;},// 驗證郵箱validateEmail() {if (!this.form.email) {this.errors.email = '郵箱不能為空';return false;}// 郵箱正則表達式const emailPattern = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}$/;if (!emailPattern.test(this.form.email)) {this.errors.email = '請輸入有效的郵箱地址';return false;}this.errors.email = '';return true;},// 驗證用戶協議validateAgree() {if (!this.form.agree) {this.errors.agree = '請同意用戶協議';return false;}this.errors.agree = '';return true;},// 驗證所有字段validateForm() {const usernameValid = this.validateUsername();const passwordValid = this.validatePassword();const confirmPasswordValid = this.validateConfirmPassword();const mobileValid = this.validateMobile();const emailValid = this.validateEmail();const agreeValid = this.validateAgree();return usernameValid && passwordValid && confirmPasswordValid && mobileValid && emailValid && agreeValid;},// 提交表單submitForm() {// 先清空所有錯誤信息for (let key in this.errors) {this.errors[key] = '';}// 驗證表單if (!this.validateForm()) {uni.showToast({title: '請正確填寫表單信息',icon: 'none'});return;}// 驗證通過,可以進行提交操作uni.showLoading({title: '提交中...'});// 模擬提交請求setTimeout(() => {uni.hideLoading();uni.showToast({title: '注冊成功',icon: 'success'});// 重置表單或跳轉頁面// this.resetForm();// uni.navigateTo({ url: '/pages/login/login' });}, 1500);},// 重置表單resetForm() {this.form = {username: '',password: '',confirmPassword: '',mobile: '',email: '',agree: false};for (let key in this.errors) {this.errors[key] = '';}}}
}

對應的模板部分可以這樣編寫:

<template><view class="register-form"><view class="form-item"><text class="label">用戶名</text><input class="input" v-model="form.username" placeholder="請輸入用戶名" @blur="validateUsername" /><text v-if="errors.username" class="error-tip">{{ errors.username }}</text></view><view class="form-item"><text class="label">密碼</text><input class="input" v-model="form.password" type="password" placeholder="請輸入密碼" @blur="validatePassword" /><text v-if="errors.password" class="error-tip">{{ errors.password }}</text></view><view class="form-item"><text class="label">確認密碼</text><input class="input" v-model="form.confirmPassword" type="password" placeholder="請再次輸入密碼" @blur="validateConfirmPassword" /><text v-if="errors.confirmPassword" class="error-tip">{{ errors.confirmPassword }}</text></view><view class="form-item"><text class="label">手機號</text><input class="input" v-model="form.mobile" type="number" placeholder="請輸入手機號" @blur="validateMobile" /><text v-if="errors.mobile" class="error-tip">{{ errors.mobile }}</text></view><view class="form-item"><text class="label">郵箱</text><input class="input" v-model="form.email" placeholder="請輸入郵箱" @blur="validateEmail" /><text v-if="errors.email" class="error-tip">{{ errors.email }}</text></view><view class="form-item checkbox-item"><checkbox v-model="form.agree" /><text class="agreement-text" @click="form.agree = !form.agree">我已閱讀并同意《用戶協議》</text><text v-if="errors.agree" class="error-tip">{{ errors.agree }}</text></view><button class="submit-btn" type="primary" @click="submitForm">立即注冊</button></view>
</template>

并添加一些基本樣式:

<style scoped>
.register-form {padding: 30rpx;
}.form-item {margin-bottom: 40rpx;position: relative;
}.label {display: block;margin-bottom: 10rpx;font-size: 28rpx;color: #333;
}.input {width: 100%;height: 80rpx;border: 1rpx solid #dcdfe6;border-radius: 8rpx;padding: 0 20rpx;box-sizing: border-box;font-size: 28rpx;
}.error-tip {position: absolute;left: 0;bottom: -36rpx;font-size: 24rpx;color: #f56c6c;
}.checkbox-item {display: flex;align-items: center;
}.agreement-text {font-size: 26rpx;margin-left: 10rpx;
}.submit-btn {margin-top: 60rpx;
}
</style>

方式二:使用 async-validator 庫

對于復雜的驗證需求,使用成熟的驗證庫會更加便捷。async-validator 是一個流行的表單驗證庫,支持豐富的驗證規則和自定義驗證功能。

首先,安裝依賴:

npm install async-validator --save

然后,在組件中使用:

import Schema from 'async-validator';export default {data() {return {// 表單數據form: {username: '',password: '',confirmPassword: '',mobile: '',email: '',agree: false},// 錯誤信息errors: {}}},computed: {// 定義驗證規則rules() {return {username: [{ required: true, message: '用戶名不能為空' },{ min: 3, max: 20, message: '用戶名長度應為3-20個字符' }],password: [{ required: true, message: '密碼不能為空' },{ min: 6, message: '密碼長度不能少于6個字符' },{ pattern: /^(?=.*[0-9])(?=.*[a-zA-Z]).{6,}$/, message: '密碼必須包含數字和字母' }],confirmPassword: [{ required: true, message: '請確認密碼' },{ validator: (rule, value, callback) => {if (value !== this.form.password) {callback(new Error('兩次輸入的密碼不一致'));} else {callback();}} }],mobile: [{ required: true, message: '手機號不能為空' },{ pattern: /^1[3-9]\d{9}$/, message: '請輸入有效的手機號碼' }],email: [{ required: true, message: '郵箱不能為空' },{ type: 'email', message: '請輸入有效的郵箱地址' }],agree: [{ validator: (rule, value, callback) => {if (!value) {callback(new Error('請同意用戶協議'));} else {callback();}} }]};}},methods: {// 驗證單個字段validateField(field) {const descriptor = {};descriptor[field] = this.rules[field];const validator = new Schema(descriptor);const source = {};source[field] = this.form[field];validator.validate(source, (errors) => {if (errors) {// 有錯誤this.$set(this.errors, field, errors[0].message);} else {// 沒有錯誤this.$set(this.errors, field, '');}});},// 驗證所有字段validateForm() {return new Promise((resolve, reject) => {const validator = new Schema(this.rules);validator.validate(this.form, (errors) => {if (errors) {// 有錯誤const errorObj = {};errors.forEach(error => {errorObj[error.field] = error.message;});this.errors = errorObj;resolve(false);} else {// 驗證通過this.errors = {};resolve(true);}});});},// 提交表單async submitForm() {const valid = await this.validateForm();if (!valid) {uni.showToast({title: '請正確填寫表單信息',icon: 'none'});return;}// 驗證通過,可以進行提交操作uni.showLoading({title: '提交中...'});// 模擬提交請求setTimeout(() => {uni.hideLoading();uni.showToast({title: '注冊成功',icon: 'success'});// 重置表單或跳轉頁面// this.resetForm();// uni.navigateTo({ url: '/pages/login/login' });}, 1500);},// 重置表單resetForm() {this.form = {username: '',password: '',confirmPassword: '',mobile: '',email: '',agree: false};this.errors = {};}}
}

模板部分可以與前面的例子類似,只需要修改驗證方法的調用:

<input class="input" v-model="form.username" placeholder="請輸入用戶名" @blur="validateField('username')" />

表單提交功能的實現

表單驗證通過后,我們需要將數據提交到服務器。在 UniApp 中,可以使用 uni.request() 方法發送網絡請求。

下面是一個完整的表單提交示例:

// 提交表單
async submitForm() {const valid = await this.validateForm();if (!valid) {uni.showToast({title: '請正確填寫表單信息',icon: 'none'});return;}// 顯示加載提示uni.showLoading({title: '提交中...'});try {// 發送請求const res = await uni.request({url: 'https://api.example.com/register',method: 'POST',data: this.form,header: {'content-type': 'application/json'}});// 請求成功if (res.statusCode === 200 && res.data.code === 0) {uni.hideLoading();uni.showToast({title: '注冊成功',icon: 'success'});// 存儲登錄信息uni.setStorageSync('token', res.data.data.token);uni.setStorageSync('userInfo', res.data.data.userInfo);// 跳轉到首頁setTimeout(() => {uni.switchTab({url: '/pages/index/index'});}, 1500);} else {throw new Error(res.data.message || '注冊失敗');}} catch (error) {uni.hideLoading();uni.showToast({title: error.message || '網絡錯誤,請稍后重試',icon: 'none'});}
}

實戰案例:會員信息編輯表單

下面是一個完整的會員信息編輯表單案例,綜合了表單驗證和提交功能:

<template><view class="profile-form"><view class="form-header"><view class="avatar-wrapper"><image class="avatar" :src="form.avatar || '/static/default-avatar.png'" @click="chooseAvatar"></image><text class="edit-hint">點擊修改頭像</text></view></view><view class="form-content"><view class="form-item"><text class="label">姓名</text><input class="input" v-model="form.name" placeholder="請輸入您的姓名" @blur="validateField('name')" /><text v-if="errors.name" class="error-tip">{{ errors.name }}</text></view><view class="form-item"><text class="label">性別</text><view class="radio-group"><view class="radio-item" @click="form.gender = 1"><view class="radio-box" :class="{ 'checked': form.gender === 1 }"></view><text class="radio-label">男</text></view><view class="radio-item" @click="form.gender = 2"><view class="radio-box" :class="{ 'checked': form.gender === 2 }"></view><text class="radio-label">女</text></view></view></view><view class="form-item"><text class="label">手機號</text><input class="input" v-model="form.mobile" type="number" placeholder="請輸入手機號" @blur="validateField('mobile')" /><text v-if="errors.mobile" class="error-tip">{{ errors.mobile }}</text></view><view class="form-item"><text class="label">郵箱</text><input class="input" v-model="form.email" placeholder="請輸入郵箱" @blur="validateField('email')" /><text v-if="errors.email" class="error-tip">{{ errors.email }}</text></view><view class="form-item"><text class="label">生日</text><picker mode="date" :value="form.birthday" @change="onBirthdayChange"><view class="picker-box"><text class="picker-text">{{ form.birthday || '請選擇出生日期' }}</text><text class="picker-arrow">></text></view></picker></view><view class="form-item"><text class="label">地址</text><textarea class="textarea" v-model="form.address" placeholder="請輸入您的詳細地址" @blur="validateField('address')" /><text v-if="errors.address" class="error-tip">{{ errors.address }}</text></view><view class="form-item"><text class="label">個人簡介</text><textarea class="textarea" v-model="form.bio" placeholder="介紹一下自己吧(選填)" /></view></view><button class="submit-btn" type="primary" @click="submitForm">保存修改</button></view>
</template><script>
import Schema from 'async-validator';export default {data() {return {// 表單數據form: {avatar: '',name: '',gender: 1, // 1-男,2-女mobile: '',email: '',birthday: '',address: '',bio: ''},// 錯誤信息errors: {}}},computed: {// 定義驗證規則rules() {return {name: [{ required: true, message: '姓名不能為空' },{ max: 20, message: '姓名長度不能超過20個字符' }],mobile: [{ required: true, message: '手機號不能為空' },{ pattern: /^1[3-9]\d{9}$/, message: '請輸入有效的手機號碼' }],email: [{ required: true, message: '郵箱不能為空' },{ type: 'email', message: '請輸入有效的郵箱地址' }],address: [{ required: true, message: '地址不能為空' },{ max: 100, message: '地址長度不能超過100個字符' }]};}},onLoad() {// 獲取用戶信息(示例數據)const userInfo = {avatar: '/static/avatar.png',name: '張三',gender: 1,mobile: '13800138000',email: 'zhangsan@example.com',birthday: '1990-01-01',address: '北京市朝陽區某某街道某某小區',bio: '熱愛生活,熱愛編程。'};// 填充表單this.form = { ...userInfo };},methods: {// 選擇頭像chooseAvatar() {uni.chooseImage({count: 1,sizeType: ['compressed'],sourceType: ['album', 'camera'],success: (res) => {const tempFilePaths = res.tempFilePaths;this.form.avatar = tempFilePaths[0];// 實際場景中應該先上傳圖片,再獲取圖片的URLthis.uploadAvatar(tempFilePaths[0]);}});},// 上傳頭像uploadAvatar(filePath) {uni.showLoading({title: '上傳中...'});// 模擬上傳setTimeout(() => {uni.hideLoading();uni.showToast({title: '頭像上傳成功',icon: 'success'});// 實際場景中,這里應該返回服務器的圖片URL// this.form.avatar = res.data.url;}, 1500);},// 生日改變onBirthdayChange(e) {this.form.birthday = e.detail.value;},// 驗證單個字段validateField(field) {if (!this.rules[field]) return;const descriptor = {};descriptor[field] = this.rules[field];const validator = new Schema(descriptor);const source = {};source[field] = this.form[field];validator.validate(source, (errors) => {if (errors) {// 有錯誤this.$set(this.errors, field, errors[0].message);} else {// 沒有錯誤this.$set(this.errors, field, '');}});},// 驗證所有字段validateForm() {return new Promise((resolve, reject) => {const validator = new Schema(this.rules);validator.validate(this.form, (errors) => {if (errors) {// 有錯誤const errorObj = {};errors.forEach(error => {errorObj[error.field] = error.message;});this.errors = errorObj;resolve(false);} else {// 驗證通過this.errors = {};resolve(true);}});});},// 提交表單async submitForm() {const valid = await this.validateForm();if (!valid) {uni.showToast({title: '請正確填寫表單信息',icon: 'none'});return;}// 顯示加載提示uni.showLoading({title: '保存中...'});// 模擬提交請求setTimeout(() => {uni.hideLoading();uni.showToast({title: '保存成功',icon: 'success'});// 返回上一頁setTimeout(() => {uni.navigateBack();}, 1500);}, 1500);/* 實際場景中的提交代碼try {const res = await uni.request({url: 'https://api.example.com/update-profile',method: 'POST',data: this.form,header: {'content-type': 'application/json','Authorization': `Bearer ${uni.getStorageSync('token')}`}});if (res.statusCode === 200 && res.data.code === 0) {uni.hideLoading();uni.showToast({title: '保存成功',icon: 'success'});// 更新本地存儲的用戶信息uni.setStorageSync('userInfo', res.data.data.userInfo);// 返回上一頁setTimeout(() => {uni.navigateBack();}, 1500);} else {throw new Error(res.data.message || '保存失敗');}} catch (error) {uni.hideLoading();uni.showToast({title: error.message || '網絡錯誤,請稍后重試',icon: 'none'});}*/}}
}
</script><style scoped>
.profile-form {padding: 30rpx;
}.form-header {display: flex;justify-content: center;margin-bottom: 50rpx;
}.avatar-wrapper {display: flex;flex-direction: column;align-items: center;
}.avatar {width: 150rpx;height: 150rpx;border-radius: 50%;margin-bottom: 10rpx;
}.edit-hint {font-size: 24rpx;color: #666;
}.form-content {margin-bottom: 40rpx;
}.form-item {margin-bottom: 40rpx;position: relative;
}.label {display: block;margin-bottom: 10rpx;font-size: 28rpx;color: #333;
}.input, .textarea, .picker-box {width: 100%;border: 1rpx solid #dcdfe6;border-radius: 8rpx;padding: 0 20rpx;box-sizing: border-box;font-size: 28rpx;
}.input, .picker-box {height: 80rpx;line-height: 80rpx;
}.textarea {height: 160rpx;padding: 20rpx;line-height: 1.5;
}.picker-box {display: flex;justify-content: space-between;align-items: center;
}.picker-text {color: #333;
}.picker-arrow {color: #999;transform: rotate(90deg);
}.radio-group {display: flex;margin-top: 10rpx;
}.radio-item {display: flex;align-items: center;margin-right: 50rpx;
}.radio-box {width: 40rpx;height: 40rpx;border: 2rpx solid #dcdfe6;border-radius: 50%;display: flex;justify-content: center;align-items: center;box-sizing: border-box;position: relative;
}.radio-box.checked {border-color: #2979ff;
}.radio-box.checked:after {content: '';width: 20rpx;height: 20rpx;border-radius: 50%;background-color: #2979ff;position: absolute;
}.radio-label {margin-left: 10rpx;font-size: 28rpx;
}.error-tip {position: absolute;left: 0;bottom: -36rpx;font-size: 24rpx;color: #f56c6c;
}.submit-btn {margin-top: 60rpx;
}
</style>

表單驗證的最佳實踐

  1. 實時驗證與提交驗證結合:在輸入框失去焦點時進行單個字段驗證,在表單提交時進行全表單驗證
  2. 友好的錯誤提示:錯誤信息應該清晰明了,位置合適
  3. 良好的用戶體驗:添加適當的過渡效果,不要讓錯誤提示突兀出現
  4. 避免重復驗證:已驗證過且符合要求的字段無需重復驗證
  5. 表單防抖:防止用戶頻繁點擊提交按鈕
  6. 狀態保持:表單提交失敗后不要清空用戶輸入
  7. 進度提示:使用加載提示,讓用戶知道表單正在提交

總結

本文介紹了在 UniApp 中實現表單驗證與提交功能的多種方式,包括自定義驗證和使用第三方庫驗證。我們通過實例詳細講解了各種驗證規則的編寫,以及表單提交的完整流程。

表單驗證看似簡單,但實際上涉及眾多細節,一個設計良好的表單驗證系統能極大提升用戶體驗。希望本文對你在 UniApp 中開發表單功能有所幫助。

在實際項目中,你可能需要根據業務需求進行更多定制化的開發,例如添加更復雜的驗證規則、優化表單的交互效果、處理更多的表單場景等。不論如何變化,本文提供的基本思路和方法都是適用的。

進一步思考

  • 如何處理更復雜的表單依賴驗證?(例如,當選擇A選項時,B字段必填)
  • 如何處理文件上傳類型的表單字段?
  • 如何優化大型復雜表單的性能?
  • 如何實現多步驟表單?

這些都是表單開發中的進階話題,歡迎在實踐中探索更多解決方案。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/81695.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/81695.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/81695.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

前端的面試筆記——HTMLJavaScript篇(二)前端頁面性能檢測

前端頁面性能檢測和判定是優化用戶體驗的核心環節&#xff0c;需要結合實驗室數據&#xff08;Lab Data&#xff09;、現場數據&#xff08;Field Data&#xff09;和行業標準綜合評估。以下是主流方法、工具及判定標準的詳細解析&#xff1a; 一、性能檢測的核心維度與指標 …

再來1章linux系列-19 防火墻 iptables 雙網卡主機的內核 firewall-cmd firewalld的高級規則

學習目標&#xff1a; 實驗實驗需求實驗配置內容和分析 &#xff08;每一個設備的每一步操作&#xff09;實驗結果驗證其他 學習內容&#xff1a; 實驗實驗需求實驗配置內容和分析 &#xff08;每一個設備的每一步操作&#xff09;實驗結果驗證其他 1.實驗 2.實驗需求 圖…

LLM-Based Agent綜述及其框架學習(五)

文章目錄 摘要Abstract1. 引言2. 文本輸出3. 工具的使用3.1 理解工具3.2 學會使用工具3.3 制作自給自足的工具3.4 工具可以擴展LLM-Based Agent的行動空間3.5 總結 4. 具身動作5. 學習智能體框架5.1 CrewAI學習進度5.2 LangGraph學習進度5.3 MCP學習進度 參考總結 摘要 本文圍繞…

游戲引擎學習第298天:改進排序鍵 - 第1部分

關于向玩家展示多個房間層所需的兩種 Z 值 我們在前一天基本完成了為渲染系統引入分層 Z 值的工作&#xff0c;但還沒有完全完成所有細節。我們開始引入圖形渲染中的分層概念&#xff0c;即在 Z 軸方向上擁有多個獨立圖層&#xff0c;每個圖層內部再使用一個單獨的 Z 值來實現…

一些C++入門基礎

關鍵字 圖引自 C 關鍵詞 - cppreference.com 命名空間 命名空間解決了C沒辦法解決的各類命名沖突問題 C的標準命名空間&#xff1a;std 命名空間中可以定義變量、函數、類型&#xff1a; namespace CS {//變量char cs408[] "DS,OS,JW,JZ";int cs 408;//函數vo…

學習筆記:黑馬程序員JavaWeb開發教程(2025.4.6)

12.4 登錄校驗-JWT令牌-介紹 JWT&#xff08;JSON Web Token&#xff09; 簡潔是指JWT是一個簡單字符串&#xff0c;自包含指的是JWT令牌&#xff0c;看似是一個隨機字符串&#xff0c;但是可以根據需要&#xff0c;自定義存儲內容 Header是JSON數據格式&#xff0c;原始JSO…

香港科技大學物理學理學(科學計算與先進材料物理與技術)碩士招生宣講會——深圳大學

香港科技大學物理學理學&#xff08;科學計算與先進材料物理與技術&#xff09;碩士招生宣講會——深圳大學專場 &#x1f559;時間&#xff1a;2025年5月23日&#xff08;星期五&#xff09;14:30 &#x1f3eb;地點&#xff1a;深圳大學滄海校區致原樓1101 &#x1f9d1…

數據庫優化技巧:MySQL 重復數據查詢與刪除(僅保留一條)的性能優化策略

目錄 一、查詢重復數據 二、刪除重復數據 方法 1&#xff1a;創建臨時表&#xff0c;操作完成后再刪除臨時表&#xff08;安全可靠&#xff0c;適合大表&#xff09; 步驟 1&#xff1a;創建臨時表存儲需刪除的 ID 步驟 2&#xff1a;根據臨時表刪除數據 方法 2&#xff1a…

分布式ID生成器:原理、對比與WorkerID實戰

一、為什么需要分布式ID&#xff1f; 在微服務架構下&#xff0c;單機自增ID無法滿足跨服務唯一性需求&#xff0c;且存在&#xff1a; ? 單點瓶頸&#xff1a;數據庫自增ID依賴單表寫入 ? 全局唯一性&#xff1a;跨服務生成可能重復 ? 擴展性差&#xff1a;分庫分表后ID規…

Golang的代碼注釋規范與實踐

# Golang的代碼注釋規范與實踐 一、注釋的重要性 代碼注釋是程序員交流的橋梁 代碼注釋是程序員之間溝通交流的重要形式&#xff0c;良好的注釋能夠幫助其他開發者更快地理解代碼的意圖和實現方式。 代碼維護離不開注釋 在項目維護過程中&#xff0c;良好的注釋能夠幫助開發者回…

Qt讀取Excel文件的技術實現與最佳實踐

目錄 一、成果展示二、核心方法及原理1. QAxObject(基于COM接口)2. 第三方庫QXlsx3. ODBC數據庫驅動三、實現步驟詳解1. QAxObject讀取Excel(需安裝Excel/WPS)2. QXlsx讀取Excel(跨平臺方案)四、技術選型與對比五、應用場景與優化建議1. 高頻數據處理2. 跨平臺工具開發3.…

機器學習第十五講:決策樹全面講解:像玩“20個問題“游戲猜身份[特殊字符]

機器學習第十五講&#xff1a;決策樹全面講解&#xff1a;像玩"20個問題"游戲猜身份&#x1f3ae; 資料取自《零基礎學機器學習》。 查看總目錄&#xff1a;學習大綱 關于DeepSeek本地部署指南可以看下我之前寫的文章&#xff1a;DeepSeek R1本地與線上滿血版部署&…

CCpro工程編程軟件

CXpro?? 是一個軟件應用套件&#xff0c;用以完成 ABB Cylon CB 系列 BACnet 控制器的設計、工程、編程、配置、測試、調試和維護。 主要優勢 CXpro?? 提供改進的導航和頁面命名&#xff0c;使開發人員能夠輕松地圍繞大型策略進行操作。它也允許立即訪問可快速更新的點和…

數據庫(二):ORM技術

什么是 ORM&#xff1f; ORM&#xff08;Object-Relational Mapping&#xff09; 是一種用于實現 對象模型&#xff08;面向對象&#xff09;與關系模型&#xff08;數據庫&#xff09;之間映射的技術&#xff0c;使程序員可以通過操作對象的方式訪問數據庫數據&#xff0c;而無…

系統設計——項目設計經驗總結1

摘要 在系統設計的時候&#xff0c;注意域的區分&#xff0c;功能區分、類的區分、方法區分范圍和定義。在系統設計的時候的&#xff0c;需要思考類、方法在什么情況下會涉及到修改&#xff0c;遵循記住&#xff1a;一個類應該只有一個原因被修改&#xff01; 當不滿足&#x…

【Java高階面經:微服務篇】3.熔斷機制深度優化:從抖動治理到微服務高可用架構實戰

一、熔斷抖動的本質剖析與核心成因 1.1 熔斷機制的核心價值與抖動危害 熔斷機制作為微服務彈性架構的核心組件,通過模擬電路斷路器邏輯,在服務出現異常時自動阻斷請求鏈,防止故障擴散引發雪崩。但頻繁的“熔斷-恢復-熔斷”抖動會導致: 用戶體驗惡化:請求成功率波動大,響…

深入淺出人工智能:機器學習、深度學習、強化學習原理詳解與對比!

各位朋友&#xff0c;大家好&#xff01;今天咱們聊聊人工智能領域里最火的“三劍客”&#xff1a;機器學習 (Machine Learning)、深度學習 (Deep Learning) 和 強化學習 (Reinforcement Learning)。 聽起來是不是有點高大上&#xff1f; 別怕&#xff0c;我保證把它們講得明明…

【動手學深度學習】1.1~1.2 機器學習及其關鍵組件

目錄 一、引言1.1. 日常生活中的機器學習1.2. 機器學習中的關鍵組件1&#xff09;數據2&#xff09;模型3&#xff09;目標函數4&#xff09;優化算法 一、引言 1.1. 日常生活中的機器學習 應用場景&#xff1a; 以智能語音助手&#xff08;如Siri、Alexa&#xff09;的喚醒…

Pytorch針對不同電腦配置詳細講解+安裝(CPU)

一、前言 安裝pytorch前&#xff0c;應按照我前邊的博文中&#xff0c;安裝完anaconda和pycharm&#xff0c;并且配置完環境變量以后哈。 Pytorch是什么&#xff1f; 它是一個庫,是一個開源的機器學習框架&#xff0c;專注于深度學習任務&#xff0c;由Facebook的人工智能研…

[python] 輕量級定時任務調度庫schedule使用指北

schedule是一款專為簡化定時任務調度而設計的Python庫&#xff0c;它通過直觀的語法降低了周期性任務的實現門檻。作為進程內調度器&#xff0c;它無需額外守護進程&#xff0c;輕量且無外部依賴&#xff0c;適合快速搭建自動化任務。不過&#xff0c;該庫在功能完整性上有所取…