JavaScript學習教程,從入門到精通,JavaScript 運算符及語法知識點詳解(8)

JavaScript 運算符及語法知識點詳解

一、JavaScript 運算符

1. 算術運算符

用于執行數學運算:

  • + 加法
  • - 減法
  • * 乘法
  • / 除法
  • % 取模(余數)
  • ++ 遞增
  • -- 遞減
  • ** 冪運算(ES6)
let a = 10, b = 3;
console.log(a + b);  // 13
console.log(a - b);  // 7
console.log(a * b);  // 30
console.log(a / b);  // 3.333...
console.log(a % b);  // 1
console.log(a++);    // 10 (先返回后加)
console.log(++a);    // 12 (先加后返回)
console.log(a ** b); // 1728 (12的3次方)

2. 賦值運算符

用于給變量賦值:

  • = 簡單賦值
  • += 加后賦值
  • -= 減后賦值
  • *= 乘后賦值
  • /= 除后賦值
  • %= 取模后賦值
  • **= 冪運算后賦值
let x = 5;
x += 3;  // 等同于 x = x + 3 → 8
x -= 2;  // 等同于 x = x - 2 → 6
x *= 4;  // 等同于 x = x * 4 → 24
x /= 3;  // 等同于 x = x / 3 → 8
x %= 5;  // 等同于 x = x % 5 → 3
x **= 2; // 等同于 x = x ** 2 → 9

3. 比較運算符

用于比較值:

  • == 等于(值相等)
  • === 嚴格等于(值和類型都相等)
  • != 不等于
  • !== 嚴格不等于
  • > 大于
  • < 小于
  • >= 大于等于
  • <= 小于等于
console.log(5 == '5');   // true (類型轉換)
console.log(5 === '5');  // false
console.log(5 != '5');   // false
console.log(5 !== '5');  // true
console.log(5 > 3);      // true
console.log(5 < 3);      // false

4. 條件(三元)運算符

condition ? expr1 : expr2 - 如果條件為真則執行expr1,否則執行expr2

let age = 20;
let status = (age >= 18) ? '成人' : '未成年';
console.log(status);  // 成人

5. 布爾(邏輯)運算符

  • && 邏輯與
  • || 邏輯或
  • ! 邏輯非
let hasLicense = true, hasCar = false;
console.log(hasLicense && hasCar);  // false
console.log(hasLicense || hasCar);  // true
console.log(!hasLicense);           // false

6. 位運算符

對二進制位進行操作:

  • &
  • |
  • ~
  • ^ 異或
  • << 左移
  • >> 右移
  • >>> 無符號右移
let num1 = 5;    // 0101
let num2 = 3;    // 0011
console.log(num1 & num2);  // 0001 → 1
console.log(num1 | num2);  // 0111 → 7
console.log(~num1);        // 1010 → -6
console.log(num1 ^ num2);  // 0110 → 6
console.log(num1 << 1);    // 1010 → 10
console.log(num1 >> 1);    // 0010 → 2

7. 運算符優先級

運算符按優先級從高到低執行,同級別從左到右:

優先級運算符
() 括號
++ -- 后置遞增/減
! ~ 邏輯非/位非
+ - 一元加減
++ -- 前置遞增/減
** 冪運算
* / % 乘除模
+ - 加減
<< >> >>> 位移
< <= > >= 比較
== != === !== 等值
& 位與
^ 位異或
`
&& 邏輯與
`
?: 條件運算符
= 賦值
let result = 5 + 3 * 2 ** 2;  // 3*4=12 → 5+12=17
console.log(result);  // 17

二、案例代碼:計算立方體的體積

/*** 計算立方體體積的函數* @param {number} length - 立方體的長度* @param {number} width - 立方體的寬度* @param {number} height - 立方體的高度* @returns {number} 立方體的體積*/
function calculateCubeVolume(length, width, height) {// 使用算術運算符*計算體積let volume = length * width * height;// 返回計算結果return volume;
}// 使用賦值運算符定義立方體尺寸
let cubeLength = 5;
let cubeWidth = 4;
let cubeHeight = 3;// 調用函數計算體積
let cubeVolume = calculateCubeVolume(cubeLength, cubeWidth, cubeHeight);// 使用比較運算符驗證輸入是否有效
if (cubeLength > 0 && cubeWidth > 0 && cubeHeight > 0) {// 使用字符串連接運算符+輸出結果console.log("立方體的尺寸: 長" + cubeLength + ", 寬" + cubeWidth + ", 高" + cubeHeight);console.log("立方體的體積是: " + cubeVolume);// 使用條件運算符判斷立方體大小let sizeCategory = cubeVolume > 50 ? "大" : "小";console.log("這是一個" + sizeCategory + "型立方體");// 使用位運算符示例(雖然不太適用于此場景)let roundedVolume = cubeVolume & ~1; // 向下舍入到最近的偶數console.log("向下舍入到最近的偶數: " + roundedVolume);
} else {console.log("錯誤: 所有尺寸必須大于0");
}// 運算符優先級示例
let complexCalculation = (cubeLength + cubeWidth) * cubeHeight ** 2 / 4;
console.log("復雜計算結果: " + complexCalculation);
// 解釋: 先計算指數(cubeHeight ** 2 = 9), 然后加法(5+4=9), 
// 然后乘法(9*9=81), 最后除法(81/4=20.25)

代碼說明:

  1. 函數定義:使用function關鍵字定義計算立方體體積的函數
  2. 算術運算符:使用*計算三個維度的乘積
  3. 賦值運算符:使用=為變量賦值
  4. 比較運算符:使用>檢查輸入是否有效
  5. 邏輯運算符:使用&&確保所有尺寸都大于0
  6. 條件運算符:使用?:根據體積大小分類
  7. 位運算符:使用&~進行位運算示例
  8. 運算符優先級:演示了復雜表達式中的運算順序

三、案例代碼

下面我將提供5個實際開發中常見的案例,每個案例都會充分利用不同的JavaScript運算符。

案例1:電商網站購物車計算

/*** 計算購物車總價和折扣* @param {Array} cartItems - 購物車商品數組* @param {string} promoCode - 優惠碼* @returns {Object} 包含總價、折扣和應付金額的對象*/
function calculateCartTotal(cartItems, promoCode) {// 使用算術運算符計算商品小計let subtotal = cartItems.reduce((sum, item) => sum + (item.price * item.quantity), 0);// 使用比較運算符驗證優惠碼let discount = 0;if (promoCode === 'SAVE20' && subtotal >= 100) {// 使用賦值運算符應用折扣discount = subtotal * 0.2;} else if (promoCode === 'SAVE10') {discount = subtotal * 0.1;}// 使用條件運算符確定是否免運費const shippingFee = subtotal > 50 ? 0 : 5.99;// 計算總價(使用算術運算符)const total = subtotal - discount + shippingFee;return {subtotal: +subtotal.toFixed(2),  // 使用一元+運算符轉換為數字discount: +discount.toFixed(2),shippingFee,total: +total.toFixed(2)};
}// 測試數據
const cart = [{ name: '無線耳機', price: 99.99, quantity: 1 },{ name: '手機殼', price: 15.50, quantity: 2 },{ name: '充電器', price: 29.99, quantity: 1 }
];// 計算不同優惠碼情況
console.log('使用SAVE20優惠碼:', calculateCartTotal(cart, 'SAVE20'));
console.log('使用SAVE10優惠碼:', calculateCartTotal(cart, 'SAVE10'));
console.log('無優惠碼:', calculateCartTotal(cart, ''));

案例2:游戲角色狀態管理

class GameCharacter {constructor(name, health, strength, agility) {this.name = name;this.maxHealth = health;this.health = health;  // 當前生命值this.strength = strength;this.agility = agility;this.isAlive = true;this.skills = [];}// 使用算術運算符計算傷害attack(target) {if (!this.isAlive || !target.isAlive) return false;// 使用位運算符生成隨機因子const critChance = this.agility & 0xF; // 取低4位作為暴擊率const isCritical = Math.random() * 100 < critChance;// 使用條件運算符確定傷害值let damage = this.strength + (isCritical ? this.strength >> 1 : 0);// 使用比較運算符驗證目標是否存活target.takeDamage(damage);return { damage, isCritical };}// 使用賦值運算符減少生命值takeDamage(amount) {this.health -= amount;// 使用邏輯運算符檢查角色狀態this.isAlive = this.health > 0;if (!this.isAlive) {console.log(`${this.name}已被擊敗!`);}}// 使用算術運算符恢復生命值heal(amount) {// 使用比較運算符確保不超過最大生命值this.health = Math.min(this.health + amount, this.maxHealth);console.log(`${this.name}恢復了${amount}點生命值`);}// 使用條件運算符添加技能learnSkill(skill) {this.skills.includes(skill) ? console.log(`${this.name}已經學會了${skill}`): (this.skills.push(skill), console.log(`${this.name}學會了新技能: ${skill}`));}
}// 創建角色
const hero = new GameCharacter('英雄', 100, 15, 12);
const monster = new GameCharacter('怪物', 80, 12, 8);// 戰斗模擬
while (hero.isAlive && monster.isAlive) {const attackResult = hero.attack(monster);if (attackResult) {console.log(`${hero.name}${monster.name}造成了${attackResult.damage}點傷害${attackResult.isCritical ? '(暴擊!)' : ''}`);}if (monster.isAlive) {monster.attack(hero);}
}

案例3:表單驗證工具

/*** 表單驗證工具類*/
class FormValidator {constructor(formId) {this.form = document.getElementById(formId);this.errors = [];}// 使用比較運算符驗證必填字段validateRequired(fieldName, message) {const field = this.form[fieldName];if (!field || !field.value.trim()) {this.errors.push(message || `${fieldName}是必填字段`);return false;}return true;}// 使用算術運算符驗證數字范圍validateNumberRange(fieldName, min, max, message) {const field = this.form[fieldName];if (!field) return false;const value = +field.value;  // 使用一元+運算符轉換為數字if (isNaN(value) || value < min || value > max) {this.errors.push(message || `${fieldName}必須在${min}${max}之間`);return false;}return true;}// 使用比較運算符驗證郵箱格式validateEmail(fieldName, message) {const field = this.form[fieldName];if (!field) return false;const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;if (!emailRegex.test(field.value)) {this.errors.push(message || '請輸入有效的郵箱地址');return false;}return true;}// 使用比較運算符驗證密碼匹配validatePasswordMatch(passwordField, confirmField, message) {const password = this.form[passwordField];const confirm = this.form[confirmField];if (!password || !confirm || password.value !== confirm.value) {this.errors.push(message || '兩次輸入的密碼不匹配');return false;}return true;}// 使用邏輯運算符組合驗證結果validate() {this.errors = [];// 驗證用戶名this.validateRequired('username', '請輸入用戶名');// 驗證郵箱this.validateRequired('email');this.validateEmail('email');// 驗證年齡this.validateRequired('age');this.validateNumberRange('age', 18, 100, '年齡必須在18到100歲之間');// 驗證密碼this.validateRequired('password', '請輸入密碼');this.validateRequired('confirmPassword', '請確認密碼');this.validatePasswordMatch('password', 'confirmPassword');// 使用位運算符檢查錯誤數量return this.errors.length === 0;}getErrors() {return this.errors;}
}// 使用示例
document.getElementById('myForm').addEventListener('submit', function(e) {e.preventDefault();const validator = new FormValidator('myForm');if (validator.validate()) {alert('表單驗證通過,即將提交!');// 提交表單...} else {alert('請修正以下錯誤:\n' + validator.getErrors().join('\n'));}
});

案例4:溫度轉換工具

/*** 溫度轉換工具*/
class TemperatureConverter {// 使用算術運算符進行溫度轉換static celsiusToFahrenheit(celsius) {return (celsius * 9/5) + 32;}static fahrenheitToCelsius(fahrenheit) {return (fahrenheit - 32) * 5/9;}// 使用比較運算符驗證輸入static isValidTemperature(temp, scale) {switch(scale.toUpperCase()) {case 'C':return temp >= -273.15;  // 絕對零度case 'F':return temp >= -459.67;  // 絕對零度(華氏)default:return false;}}// 使用條件運算符選擇轉換方法static convert(temp, fromScale, toScale) {if (!this.isValidTemperature(temp, fromScale)) {throw new Error('無效的溫度值');}fromScale = fromScale.toUpperCase();toScale = toScale.toUpperCase();if (fromScale === toScale) {return temp;}return fromScale === 'C' ? this.celsiusToFahrenheit(temp): this.fahrenheitToCelsius(temp);}// 使用位運算符生成隨機溫度(演示用途)static getRandomTemp(scale) {const random = Math.random() * 100 | 0;  // 使用位或取整return scale.toUpperCase() === 'C' ? random : this.celsiusToFahrenheit(random);}
}// 使用示例
const currentTempC = 25;
const currentTempF = TemperatureConverter.celsiusToFahrenheit(currentTempC);
console.log(`${currentTempC}°C = ${currentTempF.toFixed(1)}°F`);const testTemp = 98.6;
console.log(`${testTemp}°F = ${TemperatureConverter.fahrenheitToCelsius(testTemp).toFixed(1)}°C`);// 隨機溫度生成
const randomCTemp = TemperatureConverter.getRandomTemp('C');
const randomFTemp = TemperatureConverter.getRandomTemp('F');
console.log(`隨機溫度: ${randomCTemp}°C / ${randomFTemp}°F`);// 邊界測試
try {console.log(TemperatureConverter.convert(-300, 'C', 'F'));
} catch (e) {console.error(e.message);  // 無效的溫度值
}

案例5:DOM元素動畫控制器

class ElementAnimator {constructor(elementId) {this.element = document.getElementById(elementId);this.animationId = null;this.isAnimating = false;this.position = 0;this.speed = 5;this.direction = 1;  // 1 for right, -1 for left}// 使用算術運算符更新位置updatePosition() {// 使用賦值運算符更新位置this.position += this.speed * this.direction;// 使用比較運算符檢查邊界const maxPosition = window.innerWidth - this.element.offsetWidth;if (this.position >= maxPosition || this.position <= 0) {// 使用位運算符取反方向(演示用途)this.direction = ~this.direction + 1;  // 等同于 this.direction *= -1}// 使用條件運算符設置樣式this.element.style.transform = `translateX(${this.position}px)`;}// 使用邏輯運算符控制動畫狀態start() {if (this.isAnimating) return;this.isAnimating = true;const animate = () => {this.updatePosition();this.animationId = requestAnimationFrame(animate);};animate();}stop() {if (!this.isAnimating) return;cancelAnimationFrame(this.animationId);this.isAnimating = false;}// 使用算術運算符調整速度increaseSpeed() {this.speed = Math.min(this.speed + 1, 20);  // 最大速度20}decreaseSpeed() {this.speed = Math.max(this.speed - 1, 1);  // 最小速度1}// 使用條件運算符切換方向toggleDirection() {this.direction *= -1;}
}// 使用示例
const animator = new ElementAnimator('animatedElement');document.getElementById('startBtn').addEventListener('click', () => {animator.start();
});document.getElementById('stopBtn').addEventListener('click', () => {animator.stop();
});document.getElementById('speedUpBtn').addEventListener('click', () => {animator.increaseSpeed();
});document.getElementById('slowDownBtn').addEventListener('click', () => {animator.decreaseSpeed();
});document.getElementById('toggleDirBtn').addEventListener('click', () => {animator.toggleDirection();
});// 鍵盤控制(使用位運算符檢測按鍵組合)
document.addEventListener('keydown', (e) => {// 使用位掩碼檢查Ctrl鍵(演示用途)const ctrlPressed = e.ctrlKey;switch(e.key) {case 'ArrowRight':if (ctrlPressed) animator.increaseSpeed();else if (animator.direction !== 1) animator.toggleDirection();break;case 'ArrowLeft':if (ctrlPressed) animator.decreaseSpeed();else if (animator.direction !== -1) animator.toggleDirection();break;case ' ':animator.isAnimating ? animator.stop() : animator.start();break;}
});

這些案例涵蓋了JavaScript運算符在實際開發中的多種應用場景,包括:

  1. 電商計算(算術、比較、條件運算符)
  2. 游戲開發(位、邏輯、賦值運算符)
  3. 表單驗證(比較、邏輯運算符)
  4. 工具類開發(算術、比較、條件運算符)
  5. DOM操作和動畫(賦值、算術、位運算符)

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

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

相關文章

Shell腳本的學習

編寫腳本文件 定義以開頭&#xff1a;#!/bin/bash #!用來聲明腳本由什么shell解釋&#xff0c;否則使用默認shel 第一步&#xff1a;編寫腳本文件 #!/bin/bash #注釋 echo "這是輸出" 第二步&#xff1a;加上執行權限&#xff1a;chmod x 腳本文件名.sh 第三步&…

在線PDF文件拆分工具,小白工具功能實用操作簡單,無需安裝的文檔處理工具

小白工具中的在線 PDF 文件拆分工具是一款功能實用、操作便捷的文檔處理工具&#xff0c;以下是其具體介紹&#xff1a; 操作流程 上傳 PDF 文檔&#xff1a;打開小白工具在線PDF文件拆分工具 - 快速、免費拆分PDF文檔 - 小白工具的在線 PDF 文件拆分頁面&#xff0c;通過點擊 …

數字的乘階運算

求數字的乘階&#xff1a; 例如&#xff1a;6的乘階運算&#xff1a;6*5*4*3*2*1 例如&#xff1a;3的乘階運算&#xff1a;3*2*1 class Program{static void Main(string[] args){Console.WriteLine("請輸入數字&#xff1a;");int num_01 Convert.ToInt32 (Con…

tcp/ip攻擊及防范

作為高防工程師&#xff0c;我每天攔截數以萬計的惡意流量&#xff0c;其中TCP/IP協議層攻擊是最隱蔽、最具破壞性的威脅之一。常見的攻擊手法包括&#xff1a; 1. SYN Flood攻擊&#xff1a;攻擊者發送大量偽造的SYN包&#xff0c;耗盡服務器連接資源&#xff0c;導致正常用…

C++類成員內存分布詳解

本文將探討C類中成員變量的內存分布情況&#xff0c;包括普通成員、靜態成員、虛函數等不同情況下的內存布局。 一、基本成員內存布局 1. 普通成員變量 普通成員變量按照聲明順序在內存中連續排列&#xff08;受訪問修飾符和內存對齊影響&#xff09;&#xff1a; class Nor…

計算機視覺——為什么 mAP 是目標檢測的黃金標準

概述 在目標檢測領域&#xff0c;有一個指標被廣泛認為是衡量模型性能的“黃金標準”&#xff0c;它就是 mAP&#xff08;Mean Average Precision&#xff0c;平均精確率均值&#xff09;。如果你曾經接觸過目標檢測模型&#xff08;如 YOLO、Faster R-CNN 或 SSD&#xff09;…

C語言單鏈表的增刪改補

目錄 &#xff08;一&#xff09;單鏈表的結構定義及初始化 (二)單鏈表的尾插&#xff0c;頭插 (三)單鏈表的尾刪&#xff0c;頭刪 (四)單鏈表的查找&#xff0c;刪除&#xff0c;銷毀 單鏈表是數據結構課程里的第二個數據結構。單鏈表在邏輯結構是連續的&#xff0c;在物理…

Android10.0 framework第三方無源碼APP讀寫斷電后數據丟失問題解決

1.前言 在10.0中rom定制化開發中,在某些產品開發中,在某些情況下在App用FileOutputStream讀寫完畢后,突然斷電 會出現寫完的數據丟失的問題,接下來就需要分析下關于使用FileOutputStream讀寫數據的相關流程,來實現相關 功能 2.framework第三方無源碼APP讀寫斷電后數據丟…

殺戮尖塔(Slay The Spire) 的全新角色模組 - 女巫

女巫&#xff08;The Witch&#xff09; 殺戮尖塔&#xff08;Slay The Spire&#xff09; 的全新角色模組 女巫模組為游戲增添了超過 75 張新卡牌和 4 個全新遺物&#xff0c;圍繞 詛咒&#xff08;Curses&#xff09; 展開獨特的玩法體驗。她的起始遺物 黑貓&#xff08;Bl…

AI開發學習路線(闖關升級版)

以下是一份輕松版AI開發學習路線&#xff0c;用「闖關升級」的方式幫你從零開始變身AI開發者&#xff0c;每個階段都配有有趣的任務和實用資源&#xff0c;保證不枯燥、可落地&#xff01;&#x1f447; 目錄 &#x1f530; 新手村&#xff1a;打基礎&#xff08;1-2個月&…

迭代器模式深度解析與實戰案例

一、模式定義 迭代器模式&#xff08;Iterator Pattern&#xff09; 是一種行為設計模式&#xff0c;提供一種方法順序訪問聚合對象的元素&#xff0c;無需暴露其底層表示。核心思想是將遍歷邏輯從聚合對象中分離&#xff0c;實現 遍歷與存儲的解耦。 二、核心組件 組件作用…

SSH遠程工具

一、常見SSH遠程工具 工具開源跨平臺多標簽文件傳輸高級功能價格Xshell?Win????腳本、會話管理免費/商業版Tabby??全平臺????插件擴展免費MobaXterm?Win????集成工具集免費/付費SecureCRT?Win/macOS/Linux????企業級加密$129+PuTTY??全平臺??基礎連接…

VUE中的路由處理

1.引入,預處理main.ts import {} from vue-router import { createRouter, createWebHistory } from vue-router import HomePages from @/pages/HomePages.vue import AboutPage from @/pages/AboutPage.vue import NewsPage from @/pages/NewsPage.vue //1. 配置路由規…

編程助手fitten code使用說明(超詳細)(vscode)

這兩年 AI 發展迅猛&#xff0c;作為開發人員&#xff0c;我們總是追求更快、更高效的工作方式&#xff0c;AI 的出現可以說改變了很多人的編程方式。 AI 對我們來說就是一個可靠的編程助手&#xff0c;給我們提供了實時的建議和解決方&#xff0c;無論是快速修復錯誤、提升代…

Opencv計算機視覺編程攻略-第九節 描述和匹配興趣點

一般而言&#xff0c;如果一個物體在一幅圖像中被檢測到關鍵點&#xff0c;那么同一個物體在其他圖像中也會檢測到同一個關鍵點。圖像匹配是關鍵點的常用功能之一&#xff0c;它的作用包括關聯同一場景的兩幅圖像、檢測圖像中事物的發生地點等等。 1.局部模板匹配 憑單個像素就…

C++內存管理優化實戰:提升應用性能與效率

&#x1f9d1; 博主簡介&#xff1a;CSDN博客專家、CSDN平臺優質創作者&#xff0c;高級開發工程師&#xff0c;數學專業&#xff0c;擁有高級工程師證書&#xff1b;擅長C/C、C#等開發語言&#xff0c;熟悉Java常用開發技術&#xff0c;能熟練應用常用數據庫SQL server,Oracle…

17-產品經理-創建發布

點擊“發布”-“創建發布”。 填寫發布名稱&#xff0c;選擇測試的版本。還可以設置此次發布是否為“里程碑”。 點擊“保存”后&#xff0c;進入該發布詳情頁面。需要為此次發布關聯需求、已解決BUG、以及遺留BUG。可以通過設置條件&#xff0c;進行“搜索”&#xff0c;然后批…

Axure RP9.0教程 | 內聯框架 對應html 元素中的iframe標簽 (打開內部頁面和外部網址)

文章目錄 引言I 打開內部頁面II 打開外部網址操作效果引言 應用場景: 選擇右側不同欄目,左側內容發生變化 I 打開內部頁面 在公用元件庫中找到內聯框架圖標,將其拖到畫布中,設置其寬、高;在右側添加三個按鈕,分別用來跳轉三個不同的頁面;在內部框架中,添加三個子頁面,…

在1panel中安裝WebUI

如果需要建站&#xff0c;那得選安裝Openresty。點擊應用商店&#xff0c;安裝 Openresty 接下來安裝Ollama&#xff0c;可以部署本地模型提供給WebUi平臺使用 最后是安裝 WebUi&#xff0c;安裝時需要填寫Ollama的地址: 容器地址&#xff1a;30000 這些安裝都很方便&#xf…

項目難點亮點

Vue項目 RBAC設計 用戶權限設置 WebSocket 消息處理 BPMN擴展 跨語言模型的調用 大片文件(影像,模型等,數據-模型集成) 組件&指令封裝 低代碼表單構建、BPMN編輯器集成與實現 通用參考點 若依(RuoYi)是一個基于 Vue.js 和 Spring Boot 的前后端分離權限管理系…