活动介绍
file-type

JavaScript中if/else的替代方案:三元运算符与逻辑判断

PDF文件

86KB | 更新于2024-09-01 | 187 浏览量 | 0 下载量 举报 收藏
download 立即下载
"本文主要探讨了JavaScript中如何替换传统的if / if...else...结构,包括使用switch语句、三元运算符以及逻辑判断and(&&)和or(||)的方法。" 在JavaScript编程中,if / if...else...结构是最常见的条件判断语句,用于根据不同的条件执行不同的代码块。然而,当条件分支变得复杂时,代码可能会变得难以阅读和维护。因此,开发者经常寻找替代方案来简化和优化这部分代码。 1. **switch改写if** 在某些情况下,可以使用switch...case语句替换if...else...结构。例如,当有多个连续的条件判断且返回值固定时,switch...case可能更为合适。虽然上述示例中的switch用法较为特殊(基于布尔表达式),但通常我们更常见的是用常量作为case的值。switch...case的优势在于其效率,特别是在处理大量分支时。不过,它无法处理复杂的表达式,仅限于比较变量与常量。 2. **三元运算符改写if** 三元运算符(?:)是一种简洁的条件表达式,它可以将if...else...语句精简为一行。例如,`value = bool ? 1 : 2;` 相当于 `if (bool) { value = 1; } else { value = 2; }`。三元运算符使代码更紧凑,但当涉及多个条件或复杂的逻辑时,可读性会降低。请注意,三元运算符不能直接与return语句结合使用,需要额外的括号包裹。 3. **逻辑判断and(&&)和or(||)改写if** 逻辑运算符and(&&)和or(||)的短路特性也可以用于条件判断。如果第一个表达式足以确定整个条件的结果,那么第二个表达式将不会被计算。例如,`b && functionIfTrue()` 只会在b为真时执行函数,而 `!b || functionIfFalse()` 则在b为假时执行。这种方式适用于简单的条件判断,并可以避免不必要的计算,提高代码效率。 总结来说,JavaScript提供了多种方式来替换if / if...else...结构,每种方法都有其适用场景和优缺点。选择哪种方式取决于具体的需求,如代码简洁性、可读性、执行效率等。在编写代码时,应根据实际情况灵活运用这些技巧,以实现"Write Less, Do More"的目标,同时保持代码的清晰易读。

相关推荐

filetype

list页面: <template>
<el-select v-model="datas.reportType" placeholder="请选择..." @change="initData" style="min-width: 120px;"> <el-option label="所有类型" :value="-1"></el-option> <el-option label="精选-A" :value="1"></el-option> <el-option label="精选-C" :value="7"></el-option> <el-option label="精选-D" :value="10"></el-option> <el-option label="优选-A" :value="2"></el-option> <el-option label="优选-B" :value="3"></el-option> <el-option label="优选-C" :value="5"></el-option> <el-option label="优选-D" :value="4"></el-option> <el-option label="优选-E" :value="6"></el-option> <el-option label="优选-F" :value="8"></el-option> <el-option label="优选-G" :value="9"></el-option> <el-option label="优选-H" :value="11"></el-option> <el-option label="优选-I" :value="12"></el-option> </el-select>
<el-select v-model="datas.reportStatus" placeholder="请选择..." @change="initData" style="min-width: 120px;"> <el-option label="所有状态" :value="-1"></el-option> <el-option label="待确认" :value="100"></el-option> <el-option label="待付款" :value="110"></el-option> <el-option label="生成中" :value="120"></el-option> <el-option label="已生效" :value="130"></el-option> <el-option label="已退单" :value="190"></el-option> <el-option label="查询失败" :value="199"></el-option> </el-select>
<el-input v-model="datas.keyword" placeholder="请输入关健字" @clear="initData" @keyup.enter.native="initData" clearable> <template #append> <el-button :icon="ElIconSearch" @click="initData" /> </template> </el-input>
<el-skeleton :loading="datas.loading" animated> <template #template> </template>
暂无记录
<el-table ref="tableRef" v-loading="datas.loading" :data="datas.listData" stripe class="table-list"> <el-table-column prop="reportNo" label="订单号" min-width="120"></el-table-column> <el-table-column prop="id" label="Id" min-width="120"></el-table-column> <el-table-column label="报告类型" width="120"> <template #default="scope"> <el-tag v-if="scope.row.reportType===1">精选-A</el-tag> <el-tag v-else-if="scope.row.reportType===7">精选-C</el-tag> <el-tag v-else-if="scope.row.reportType===10">精选-D</el-tag> <el-tag v-else-if="scope.row.reportType===2">优选-A</el-tag> <el-tag v-else-if="scope.row.reportType===3">优选-B</el-tag> <el-tag v-else-if="scope.row.reportType===5">优选-C</el-tag> <el-tag v-else-if="scope.row.reportType===4">优选-D</el-tag> <el-tag v-else-if="scope.row.reportType===6">优选-E</el-tag> <el-tag v-else-if="scope.row.reportType===8">优选-F</el-tag> <el-tag v-else-if="scope.row.reportType===9">优选-G</el-tag> <el-tag v-else-if="scope.row.reportType===11">优选-H</el-tag> <el-tag v-else-if="scope.row.reportType===12">优选-I</el-tag> <el-tag v-else type="warning">未知</el-tag> </template> </el-table-column> <el-table-column prop="vin" label="车架号" width="200"></el-table-column> <el-table-column prop="addTime" label="下单时间" width="200"></el-table-column> <el-table-column label="状态" width="120"> <template #default="scope"> <el-tag v-if="scope.row.reportStatus===130" type="success">已生效</el-tag> <el-tag v-else-if="scope.row.reportStatus===100" type="info">待确认</el-tag> <el-tag v-else-if="scope.row.reportStatus===190" type="info">已退单</el-tag> <el-tag v-else-if="scope.row.reportStatus===199" type="info">查询失败</el-tag> <el-tag v-else-if="scope.row.reportStatus===110" type="warning">待付款</el-tag> <el-tag v-else-if="scope.row.reportStatus===120" type="warning">生成中</el-tag> <el-tag v-else type="warning">未知</el-tag> </template> </el-table-column> <el-table-column type="primary" label="查看详情"> <template #default="scope">
<el-button type="primary" @click="viewDetail(scope.row.id)"> 查看详情 </el-button>
</template> </el-table-column> </el-table> </el-skeleton>
<el-pagination background :page-size="datas.pageSize" :current-page="datas.pageIndex" :total="datas.totalCount" layout="prev,pager,next" @current-change="handleCurrentChange" />
</template> <script setup> //获取当前站点信息 const siteConfig = await useSite('site') //页面SEO设置 useSeoMeta({ title: `订单管理 - ${siteConfig.seoKeyword}`, ogTitle: siteConfig.seoKeyword, description: siteConfig.seoDescription, ogDescription: siteConfig.seoDescription, }) //获取路由信息 const route = useRoute() //定义属性 const datas = reactive({ loading: false, keyword: '', totalCount: 0, pageSize: 10, pageIndex: 1, listData: [], reportType: -1, reportStatus: -1, dateRange: [], }) //初始化数据 const initData = async () => { let sendUrl = `/account/vinReport?pageSize=${datas.pageSize}&pageIndex=${datas.pageIndex}` if (datas.reportType >= 0) { sendUrl += `&reportType=${datas.reportType}` } if (datas.reportStatus >= 0) { sendUrl += `&reportStatus=${datas.reportStatus}` } if (datas.keyword.length > 0) { sendUrl += `&keyword=${encodeURI(datas.keyword)}` } if (datas.dateRange.length > 0) { sendUrl += `&startTime=${datas.dateRange[0]}` sendUrl += `&endTime=${datas.dateRange[1]}` } //获取分页列表 useHttp({ url: sendUrl, beforeSend() { datas.loading = true }, success(res) { datas.listData = res.data datas.totalCount = res.pagination.totalCount datas.pageIndex = res.pagination.pageIndex datas.pageSize = res.pagination.pageSize }, error(err) { datas.listData = [] }, complete() { datas.loading = false } }) } //跳转到第几页 const handleCurrentChange = (val) => { if (datas.pageIndex != val) { datas.pageIndex = val initData() } } // //数据导出功能 ------------ // const exportExcel = async () => { // let sendUrl = `/vehicleReport/reports/ExportExcel?reportType=${datas.reportType}` + // `&reportStatus=${datas.reportStatus}` // if (datas.dateRange.length > 0) { // sendUrl += `&startTime=${datas.dateRange[0]}` // sendUrl += `&endTime=${datas.dateRange[1]}` // } // if (datas.keyword.length > 0) { // sendUrl += `&keyword=${encodeURI(datas.keyword)}` // } // //获取分页列表 // await proxy.$api.request({ // url: sendUrl, // responseType: 'blob', // beforeSend() { // datas.loading = true // }, // success(res) { // let exportData = res.data; // // console.log('导出数据', res); // // 获取当前日期时间 // const now = new Date(); // // 获得年月日时分秒 // const datetimeStr = // now.getFullYear() + // (now.getMonth() + 1).toString().padStart(2, '0') + // now.getDate().toString().padStart(2, '0') + // now.getHours().toString().padStart(2, '0') + // now.getMinutes().toString().padStart(2, '0') + // now.getSeconds().toString().padStart(2, '0'); // // 从响应头获取文件名 // let filename = "车辆报告_" + datetimeStr +".xlsx"; // // 创建下载链接 // const url = window.URL.createObjectURL(new Blob([exportData])); // const link = document.createElement('a'); // link.href = url; // link.setAttribute('download', filename); // document.body.appendChild(link); // link.click(); // // 清理 // document.body.removeChild(link); // window.URL.revokeObjectURL(url); // }, // error(err) { // proxy.$message.error('导出失败,请重试!') // }, // complete() { // datas.loading = false // } // }) // } // //数据导出功能 ------------ //页面完成后执行 onMounted(() => { if (route.params.type) { datas.reportType = parseInt(route.params.type) } initData() }) </script> show页面: <template> <el-skeleton :loading="datas.loading" style="height:100%;" animated> <template #template>
<el-skeleton-item variant="h3" style="margin-top:1rem;width:60%;" /> <el-skeleton-item variant="h3" style="margin:1rem 0;width:100%;" /> <el-skeleton-item variant="p" style="margin-bottom:1rem;width:80%;" />
<el-skeleton-item variant="h3" style="margin-top:1rem;width:60%;" /> <el-skeleton-item variant="p" style="margin-bottom:1rem;width:80%;" />
<el-skeleton-item variant="h3" style="margin-top:1rem;width:60%;" /> <el-skeleton-item variant="p" style="margin-bottom:1rem;width:80%;" />
</template>
报告进度
处理状态
待买家寄回 待商家发货 已完成 拒绝 处理中
买家发货
<el-button type="warning" @click="datas.deliveryDialog = true">已寄出,填写物流信息</el-button>
报告编号
{{datas.model.ReportNo}}
处理说明
{{datas.model.handleRemark}}
退款金额
{{datas.model.refundAmount}} 元
{{item.orderGoods.goodsTitle}}
<el-tag v-for="text in item.orderGoods.skuText.split(',')">{{text}}</el-tag> ×{{item.orderGoods.quantity}}
{{item.orderGoods.realPrice}}
售后信息
订单编号
{{datas.model.orderNo}}
售后类型
申请退款 申请换货
申请时间
{{datas.model.applyTime}}
申请理由
{{datas.model.applyReason}}
申请凭证
<el-image fit="cover" :src="common.loadFile(item.thumbPath)" :preview-src-list="[common.loadFile(item.originalPath)]"></el-image>
商家发货
买家发货
快递公司
{{searchExpress(item.expressId)}}
快递单号
{{item.expressCode}}
发货时间
{{item.addTime}}
</el-skeleton> </template> <script setup> //获取当前站点信息 const siteConfig = await useSite('site') //页面SEO设置 useSeoMeta({ title: `报告详情 - ${siteConfig.seoKeyword}`, ogTitle: siteConfig.seoKeyword, description: siteConfig.seoDescription, ogDescription: siteConfig.seoDescription, }) //获取路由信息 const route = useRoute() const deliveryFormRef = ref(null) //声明变量 const datas = reactive({ loading: true, btnLoading: false, deliveryDialog: false, //报告信息 vinReportModel: { }, }) //初始化数据 const initData = async () => { const vinReportId = route.params.id console.log(获取id,route.params.id) if (!vinReportId) { ElMessage.warning('报告参数有误,请检查重试') common.back(-1) return false } //加载快递列表 await useHttp({ url: `/account/vinReport/${vinReportId}`, success(res) { datas.vinReportModel = res.data }, error(err) { console.log(err) } }) } //页面完成后执行 onMounted(() => { initData() }) </script> <style lang="scss"> .refund-albums { display: flex; justify-content: flex-start; flex-flow: row wrap; margin: -1.25rem 0 0 -1.25rem; .img-box { margin: 1.25rem 0 0 1.25rem; width: 7rem; height: 7rem; border-radius: 3px; box-shadow: 0px 6px 35px rgba(0, 0, 0, 0.02); >img, .el-image { width: 100%; height: 100%; border-radius: 3px; } } } </style> 从list页面,点击查看详情,show页面可以获取到传递的id,并通过id查询详情,现状:id传递为空,无法获取

filetype

import requests import time import hashlib import json import pandas as pd from urllib.parse import quote from typing import List, Union, Dict, Any class BilibiliCrawler: def __init__(self, keywords: Union[str, List[str]] = None, max_results: int = 30): """ 初始化爬虫 参数: keywords: 关键词或关键词列表,默认为["高等数学", "概率论", "Python"] max_results: 每个关键词最大爬取结果数 """ # 处理关键词类型,支持字符串和列表 if keywords is None: self.keywords = ["高等数学", "概率论", "Python"] elif isinstance(keywords, str): self.keywords = [keywords] else: self.keywords = keywords self.max_results = max_results self.session = requests.Session() self.headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36', 'Referer': 'https://www.bilibili.com/', 'Origin': 'https://www.bilibili.com', 'Cookie': 'your_cookie_here' # 替换为实际Cookie } self.video_data = [] self.mixin_key = None # 缓存混合密钥 self.request_count = 0 # 请求计数器 def get_mixin_key(self) -> str: """获取并缓存混合密钥""" if self.mixin_key: return self.mixin_key nav_url = "https://api.bilibili.com/x/web-interface/nav" try: nav_res = self.session.get(nav_url, headers=self.headers, timeout=10) nav_res.raise_for_status() wbi_img = nav_res.json().get('data', {}).get('wbi_img', {}) img_key = wbi_img.get('img_url', '').split('/')[-1].split('.')[0] sub_key = wbi_img.get('sub_url', '').split('/')[-1].split('.')[0] self.mixin_key = (img_key + sub_key)[:32] return self.mixin_key except Exception as e: print(f"获取混合密钥失败: {str(e)}") # 使用备用密钥 return "ea1db124af3c7062474693fa704f4ff8" def get_wbi_sign(self, params: Dict[str, Any]) -> str: """生成WBI签名""" # 获取混合密钥 mixin_key = self.get_mixin_key() # 对参数排序并生成查询字符串 sorted_params = dict(sorted(params.items())) query = '&'.join([f'{k}={quote(str(v))}' for k, v in sorted_params.items()]) # 计算MD5签名 wbi_sign = hashlib.md5((query + mixin_key).encode()).hexdigest() return wbi_sign def search_videos(self): """搜索多个关键词的视频""" total_videos = 0 for keyword in self.keywords: print(f"\n开始爬取关键词: {keyword}") keyword_count = 0 page = 1 while keyword_count < self.max_results and total_videos < self.max_results * len(self.keywords): # 计算本页需要获取的视频数量 page_size = min( 20, self.max_results - keyword_count, self.max_results * len(self.keywords) - total_videos ) # 基础参数 params = { 'search_type': 'video', 'keyword': keyword, 'page': page, 'page_size': page_size } # 添加WBI签名 params['w_rid'] = self.get_wbi_sign(params) try: # 发送搜索请求 response = self.session.get( "https://api.bilibili.com/x/web-interface/wbi/search/type", params=params, headers=self.headers, timeout=15 ) self.request_count += 1 # 处理412错误 if response.status_code == 412: print(f"第{page}页遇到412错误,正在重试...") time.sleep(3) response = self.session.get( "https://api.bilibili.com/x/web-interface/wbi/search/type", params=params, headers=self.headers, timeout=15 ) self.request_count += 1 response.raise_for_status() data = response.json() # 检查API响应状态 if data.get('code') != 0: error_msg = data.get('message', '未知错误') print(f"API返回错误: {error_msg} (代码: {data.get('code')})") break # 检查是否有有效数据 results = data.get('data', {}).get('result') if not results: print(f"关键词 '{keyword}' 第{page}页无结果") break # 提取视频基本信息 for video in results: if keyword_count >= self.max_results or total_videos >= self.max_results * len(self.keywords): break bvid = video.get('bvid') if bvid: video_info = self.get_video_details(bvid, keyword) if video_info: self.video_data.append(video_info) keyword_count += 1 total_videos += 1 print( f"已获取 {keyword_count}/{self.max_results} 条数据 | 关键词: {keyword} | 总进度: {total_videos}/{self.max_results * len(self.keywords)}") # 控制请求频率 (每5次请求休息2秒) if self.request_count % 5 == 0: time.sleep(2) else: time.sleep(0.5) page += 1 time.sleep(1.5) # 页间延迟 except requests.exceptions.RequestException as e: print(f"请求失败({keyword}): {str(e)}") time.sleep(5) # 请求失败后延长等待 except json.JSONDecodeError as e: print(f"JSON解析失败({keyword}): {str(e)}") print(f"响应内容: {response.text[:200]}...") except Exception as e: print(f"未知错误({keyword}): {str(e)}") break print(f"关键词 '{keyword}' 爬取完成, 共获取 {keyword_count} 条数据") def get_video_details(self, bvid: str, keyword: str) -> Dict[str, Any]: """获取视频详细信息""" detail_url = f"https://api.bilibili.com/x/web-interface/view?bvid={bvid}" try: response = self.session.get(detail_url, headers=self.headers, timeout=10) self.request_count += 1 # 处理详情页412错误 if response.status_code == 412: print(f"视频{bvid}详情页412错误,重试中...") time.sleep(2) response = self.session.get(detail_url, headers=self.headers, timeout=10) self.request_count += 1 response.raise_for_status() data = response.json() if data.get('code') != 0: error_msg = data.get('message', '未知错误') print(f"视频详情API错误({bvid}): {error_msg}") return None video_data = data.get('data', {}) if not video_data: print(f"视频{bvid}详情数据为空") return None stat = video_data.get('stat', {}) return { 'bvid': bvid, '关键词': keyword, '标题': video_data.get('title', ''), '博主': video_data.get('owner', {}).get('name', ''), '播放量': stat.get('view', 0), '点赞量': stat.get('like', 0), '收藏量': stat.get('favorite', 0), '弹幕量': stat.get('danmaku', 0), '分享量': stat.get('share', 0), '硬币数': stat.get('coin', 0), '视频时长': video_data.get('duration', 0), '发布时间': time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(video_data.get('pubdate', 0))) } except requests.exceptions.RequestException as e: print(f"获取视频详情失败({bvid}): 请求错误 - {str(e)}") return None except json.JSONDecodeError as e: print(f"获取视频详情失败({bvid}): JSON解析错误 - {str(e)}") return None except Exception as e: print(f"获取视频详情失败({bvid}): 未知错误 - {str(e)}") return None def save_to_csv(self, filename='bilibili_videos.csv'): """保存数据到CSV""" if not self.video_data: print("没有数据可保存") return df = pd.DataFrame(self.video_data) # 优化列顺序 columns_order = [ 'bvid', '关键词', '标题', '博主', '播放量', '点赞量', '收藏量', '弹幕量', '分享量', '硬币数', '视频时长', '发布时间' ] df = df.reindex(columns=[col for col in columns_order if col in df.columns]) df.to_csv(filename, index=False, encoding='utf_8_sig') print(f"已保存 {len(self.video_data)} 条数据到 {filename}") # 使用示例 if __name__ == "__main__": # 自定义关键词列表和最大结果数 keywords = [ "概率论", "Python数据分析", "随机过程", "高等数学", "Scipy概率分布" ] crawler = BilibiliCrawler(keywords=keywords, max_results=20) crawler.search_videos() crawler.save_to_csv('bilibili_math_programming_videos.csv') 简化一下代码,并且标注讲解注释

filetype
filetype

<template> <view class="main"> <button class="selectBtn" size="default" type="primary" @click="renderJS.createFileInputDom"> {{title}} </button> </view> </template> <script> export default { name: "heyuan-chooseFilePro", props: { title:{ type: [String], default: "选择文件" } }, data() { return { pathList:[], fileNumber:0, } }, onLoad(res) {}, methods: { // plus.io选择文件 // 选择完文件后,拿到的是base64字符串,转成对应的数据 parseJSONData(base64Str) { console.log('选择的文件base64Str', base64Str) let jsonStr = this.convertBase64ToUTF8(base64Str) if (base64Str.includes('application/json')) { let jsonData = JSON.parse(jsonStr) this.$emit('readJSONFinish', { jsonData }) } else { this.$emit('readJSONFinish', { jsonStr }) } }, convertBase64ToUTF8(base64Str) { let base64Content = atob(base64Str.split(',')[1]) base64Content = base64Content .split('') .map(function (c) { return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2) }) .join('') try { let jsonStr = decodeURIComponent(base64Content) return jsonStr } catch (error) { console.error('读取失败', error) uni.showToast({ title: '读取失败,不支持此格式文件', icon: 'none' }) } }, async receiveRenderFile(result) { console.log("=========",result); // #ifdef APP-PLUS const fileUrl = await this.base64toPath(result.filePath, result.name) this.fileName = fileUrl.relativePath this.filePath = fileUrl.localAbsolutePath // #endif // #ifdef H5 this.fileName = result.name this.filePath = result.filePath // #endif console.log('选择文件的路径:' + this.filePath); this.pathList.push(this.filePath); if(this.pathList.length == this.fileNumber){ this.$emit('selectFilePath', this.pathList); } }, initPathList(result){ this.fileNumber = result.fileNumber; this.pathList = []; }, //将base64转成路径 base64toPath(base64, attachName) { console.log('base64开始转化成文件') let _that = this return new Promise(function (resolve, reject) { const filePath = `_doc/yourFilePath/${attachName}` plus.io.resolveLocalFileSystemURL( '_doc', function (entry) { entry.getDirectory( 'yourFilePath', { create: true, exclusive: false }, function (entry) { entry.getFile( attachName, { create: true, exclusive: false }, function (entry) { entry.createWriter(function (writer) { writer.onwrite = function (res) { console.log('base64转化文件完成') const obj = { relativePath: filePath, localAbsolutePath: plus.io.convertLocalFileSystemURL(filePath) } resolve(obj) } writer.onerror = reject writer.seek(0) writer.writeAsBinary( _that.getSymbolAfterString(base64, ',') ) }, reject) }, reject ) }, reject ) }, reject ) }) }, // 取某个符号后面的字符 getSymbolAfterString(val, symbolStr) { if (val == undefined || val == null || val == '') { return '' } val = val.toString() const index = val.indexOf(symbolStr) if (index != -1) { val = val.substring(index + 1, val.length) return val } else { return val } } } } </script> <script module="renderJS" lang="renderjs"> export default { data() { return {} }, mounted() { }, methods: { createFileInputDom(e, ownerVm) { let fileInput = document.createElement('input') fileInput.setAttribute('type', 'file') fileInput.setAttribute('accept', '*/*') fileInput.setAttribute('multiple', 'multiple') fileInput.click() fileInput.addEventListener('change', e => { // let file = e.target.files[0]; // #ifdef APP-PLUS // 使用 Promise.all 来等待所有文件处理完成 const promises = []; //初始化路径选择数据 ownerVm.callMethod('initPathList',{fileNumber:e.target.files.length}); for (let i = 0; i < e.target.files.length; i++) { let file1 = e.target.files[i]; // 处理每个文件 let reader = new FileReader(); reader.readAsDataURL(file1); reader.onload = async function(event) { const base64Str = event.target.result; // 若需要文件的base64文本,可打开该注释 // ownerVm.callMethod('parseJSONData', base64Str) // 如果需要得到文件的本地路径,可以通过下面方法 let rest = await ownerVm.callMethod('receiveRenderFile', { name: file1.name, filePath: base64Str }); } } // #endif // #ifdef H5 // 如果需要得到文件的本地路径,可以通过下面方法 const filePath = URL.createObjectURL(file) ownerVm.callMethod('receiveRenderFile', { name: file.name, filePath: filePath }) // #endif }) } } } </script> <style> .main { display: flex; flex-direction: column; height: 100vh; overflow-y: scroll; } .selectBtn { border-radius: 10rpx; font-size: 32rpx; } </style> 1、帮我优化代码, 2、第一个<script> 修改为组合式setup 3、修改后第二个<script>可以与第一个<script>进行通讯

filetype

Component({ properties: { show: { type: Boolean, value: false }, title: { type: String, value: '表单标题' }, config: { type: Array, value: [] }, formData: { type: Object, value: {} }, modalName: { type: String, value: '' }, initData: { type: null, value: null, observer: function (newVal) { newVal && this.processInitData(newVal) } } }, data: { parentParams: {}, tempData: {}, errors: {}, processedConfig: [], loading: false }, observers: { 'show, modalName'(show, modalName) { show && modalName && this.loadModalConfig(modalName) } }, methods: { // 加载弹窗配置 async loadModalConfig(modalName) { this.setData({ loading: true }) try { let config = getModalConfig(modalName) if (!config) throw new Error(`未找到弹窗配置: ${modalName}`) // 处理前置逻辑 config = await this.processBeforeShow(config) this.setData({ processedConfig: config, loading: false }) } catch (error) { console.error('加载失败:', error) this.setData({ loading: false }) this.triggerEvent('error', { error }) } }, // 处理前置逻辑 async processBeforeShow(config) { const initData=this.properties.initData let processedConfig = []; // 改为 let 声明 if (initData) { if (Array.isArray(initData)) { // 处理数组类型 processedConfig = config.config.map((item, index) => index < initData.length ? { ...item, ...initData[index] } // 正确合并属性 : { ...item } // 超出部分保留原配置 ); return processedConfig; } else if (typeof initData === "object") { // 处理对象类型 processedConfig = config.config.map(configItem => { const key = configItem.title; return initData.hasOwnProperty(key) ? { ...configItem, ...initData[key] } // 直接属性访问 : { ...configItem }; }); return processedConfig; } } if (typeof config.beforeShow === 'function') { beforeData= config.beforeShow() processedConfig = config.config.map(configItem => { const key = configItem.title; return beforeData.hasOwnProperty(key) ? { ...configItem, ...beforeData[key] } // 直接属性访问 : { ...configItem }; }); return processedConfig; } return config }, // 表单验证 validateForm() { const errors = {} this.data.processedConfig.forEach(section => { section.items.forEach(item => { if (item.required && !this.data.formData[item.field]) { errors[item.field] = item.errorMessage || `${item.title}必填` } }) }) return errors }, // 提交处理 async submitForm() { if (this.data.loading) return // 验证表单 const errors = this.validateForm() if (Object.keys(errors).length) { return this.setData({ errors }) } try { this.setData({ loading: true }) // 触发提交事件 this.triggerEvent('submit', this.data.formData) this.closeModal() } finally { this.setData({ loading: false }) } }, // 关闭弹窗 closeModal() { this.setData({ show: false, processedConfig: [] }) this.triggerEvent('close') }, // 输入处理 handleInput(e) { const field = e.currentTarget.dataset.field const value = e.detail.value || e.detail this.setData({ [`formData.${field}`]: value, [`errors.${field}`]: '' }) this.triggerEvent('change', { field, value }) } } }) 配置中有提交函数,点击按钮函数,获取数据函数

filetype

<template>
<el-form :model="settings" :rules="rules" ref="settingsForm" label-width="120px"> <el-card class="box-card">
系统配置
<el-row :gutter="20"> <template v-for="(item, index) in configList"> <el-col :span="12" :key="index"> <el-form-item v-if="item.name != 'connect_platform_flag'" :label="item.description" :prop="'configs.' + index + '.value'"> <el-input v-if="item.name != 'connect_platform_flag'" v-model="item.value"></el-input> </el-form-item> </el-col> </template> </el-row> </el-card>
<el-button type="primary" @click="handleSave">保存设置</el-button>
</el-form> <easy-player style="width: 100%; height: 600px;" :videoUrl="videoUrl" autoplay :live="true" :showFullscreenButton="true" :showPlaybackRateButton="true" />
</template> <script> import { getConfig, updateConfig } from "@/api/cabinet/config"; import EasyPlayer from '@easydarwin/easyplayer'; export default { components: { EasyPlayer }, name: 'SystemSettings', data() { return { videoUrl: 'http://41.200.93.231:8099/RecorderData/20250701/450307/20250701195225NOR06019426TD030000.mp4', // 替换为实际的视频流地址 configList: [], settings: {}, rules: { 'configs.*.value': [ { required: true, message: '请输入配置值', trigger: 'blur' } ] }, } }, props: { userData: { type: Object, required: true } }, created() { this.fetchSettings() }, methods: { async fetchSettings() { try { const response = await getConfig(); if (response.code === 200) { console.log('获取配置成功', response.data); this.configList = response.data; // ✅ 新增:同步到 settings.configs this.$set(this.settings, 'configs', this.configList); } else { this.$message.error('获取配置失败:' + response.msg); } } catch (error) { this.$message.error('获取配置失败:' + error.message); } }, handleSave() { this.$refs.settingsForm.validate(async (valid) => { if (valid) { if (this.userData.isAdmin === '0') { this.$message.error('非管理员用户无权修改系统配置'); return; } // 新增的校验逻辑 const devConfig = this.configList.find(item => item.name === 'devNum'); if (devConfig) { const value = (devConfig.value || '').toString().trim(); const numValue = Number(value); // 判断是否为合法数字 if (isNaN(numValue)) { this.$message.error('请输入正确的设备总数'); return; } // 判断是否超过上限 if (numValue > 60) { this.$message.error('设备总数不能大于60'); return; } if (numValue < 1) { this.$message.error('设备总数不能小于1'); return; } } try { const response = await updateConfig(this.configList); if (response.code === 200) { console.log('保存成功', this.configList); this.$message.success('保存成功'); this.fetchSettings(); // 重新加载配置 } else { this.$message.error('保存失败:' + response.msg); } } catch (error) { this.$message.error('保存失败:' + error.message); } } }) }, handleReset() { this.$refs.settingsForm.resetFields() this.fetchSettings() }, }, } </script> <style scoped> .box-card { margin-bottom: 20px; } .el-form-item { margin-bottom: 18px; } </style> 帮我改一下上述所说的问题

filetype
filetype

要在 JavaScript 中获取飞书多维表格数据,可以通过以下步骤实现: 1. 获取多维表格的 app_token 和 table_id app_token:多维表格的唯一标识,可通过以下方式获取: 如果多维表格 URL 以 feishu.cn/base 开头,app_token 是 URL 中 base/ 后面的部分(如 https://feishu.cn/base/{app_token}) 如果多维表格嵌入在知识库中,需调用 获取知识空间节点信息 接口获取 app_token table_id:数据表的唯一标识,可通过以下方式获取: 多维表格 URL 中 table/ 后面的部分(如 https://feishu.cn/base/{app_token}?table={table_id}) 调用 列出数据表 接口获取 2. 获取访问凭证 (access_token) 调用飞书开放平台接口需要有效的 tenant_access_token 或 user_access_token。获取方式: 使用 获取 tenant_access_token 接口(推荐服务端使用) 使用 获取 user_access_token 接口(需用户授权) 3. 调用查询记录接口 使用 查询记录 接口获取数据表中的记录。示例请求: const fetchBitableData = async () => { const appToken = "你的app_token"; const tableId = "你的table_id"; const url = `https://open.feishu.cn/open-apis/bitable/v1/apps/${appToken}/tables/${tableId}/records/search`; const response = await fetch(url, { method: "POST", headers: { "Content-Type": "application/json", "Authorization": "Bearer 你的access_token" }, body: JSON.stringify({ "view_id": "可选视图ID", "field_names": ["字段1", "字段2"] // 指定返回的字段 }) }); const data = await response.json(); console.log(data); }; 4. 处理响应数据 成功响应示例: { "code": 0, "data": { "items": [ { "record_id": "rec123", "fields": { "字段1": "值1", "附件字段": [{"file_token": "boxabc123"}] } } ] } } 根据以上内容,给出一个用js获取飞书多维表格数据的代码