From 95f44bd509e286290a18639531de3e05768c3a90 Mon Sep 17 00:00:00 2001 From: gaoluyang <2820782392@qq.com> Date: 星期二, 24 六月 2025 16:46:07 +0800 Subject: [PATCH] 1.巡检管理-二维码管理联调 2.巡检管理-现场巡检记录开发联调 3.巡检上传-现场巡检开发联调 --- src/views/index.vue | 1085 ------------------------------ src/components/Echarts/echarts.vue | 152 ++++ src/api/inspectionUpload/index.js | 43 + src/views/inspectionUpload/index.vue | 290 +++++++ package.json | 1 src/views/inspectionUpload/components/qrCodeFormDia.vue | 175 +++++ src/views/inspectionManagement/index.vue | 79 + src/views/inspectionManagement/components/qrCodeDia.vue | 67 + src/views/inspectionManagement/components/viewQrCodeFiles.vue | 169 ++++ 9 files changed, 932 insertions(+), 1,129 deletions(-) diff --git a/package.json b/package.json index d69c048..1e90630 100644 --- a/package.json +++ b/package.json @@ -34,6 +34,7 @@ "nprogress": "0.2.0", "pinia": "2.1.7", "print-js": "^1.6.0", + "qr-scanner": "^1.4.2", "qrcode": "^1.5.4", "splitpanes": "3.1.5", "vue": "3.4.31", diff --git a/src/api/inspectionUpload/index.js b/src/api/inspectionUpload/index.js new file mode 100644 index 0000000..0d954e2 --- /dev/null +++ b/src/api/inspectionUpload/index.js @@ -0,0 +1,43 @@ +// 宸℃涓婁紶 +import request from '@/utils/request' + +// 浜岀淮鐮佺鐞嗚〃鏌ヨ +export function qrCodeList(query) { + return request({ + url: '/qrCode/list', + method: 'get', + params: query + }) +} +// 浜岀淮鐮佹壂鐮佽褰曡〃鏌ヨ +export function qrCodeScanRecordList(query) { + return request({ + url: '/qrCodeScanRecord/list', + method: 'get', + params: query + }) +} +// 浜岀淮鐮佺鐞嗚〃鏂板淇敼 +export function addOrEditQrCode(query) { + return request({ + url: '/qrCode/addOrEditQrCode', + method: 'post', + data: query + }) +} +// 浜岀淮鐮佹壂鐮佽褰曡〃鏂板淇敼 +export function addOrEditQrCodeRecord(query) { + return request({ + url: '/qrCodeScanRecord/addOrEditQrCodeRecord', + method: 'post', + data: query + }) +} +// 浜岀淮鐮佹壂鐮佽褰曡〃鏂板淇敼 +export function delQrCode(query) { + return request({ + url: '/qrCode/delQrCode', + method: 'delete', + data: query + }) +} \ No newline at end of file diff --git a/src/components/Echarts/echarts.vue b/src/components/Echarts/echarts.vue new file mode 100644 index 0000000..4601e41 --- /dev/null +++ b/src/components/Echarts/echarts.vue @@ -0,0 +1,152 @@ +<template> + <div> + <div ref="chartRef" :style="chartStyle"></div> + </div> +</template> + +<script setup> +import { ref, onMounted, onBeforeUnmount, watchEffect } from 'vue' +import * as echarts from 'echarts' + +// Props +const props = defineProps({ + options: { + type: Object, + default: () => ({}) + }, + chartStyle: { + type: Object, + default: () => ({ + height: '80%', + width: '100%' + }) + }, + dataset: { + type: Object, + default: () => {} + }, + xAxis: { + type: Array, + default: () => [] + }, + yAxis: { + type: Array, + default: () => [] + }, + series: { + type: Array, + default: () => [] + }, + grid: { + type: Object, + default: () => ({}) + }, + legend: { + type: Object, + default: () => ({}) + }, + tooltip: { + type: Object, + default: () => ({}) + }, + lineColors: { + type: Array, + default: () => [] + }, + barColors: { + type: Array, + default: () => [] + }, + pieColors: { + type: Array, + default: () => [] + }, + loadingOption: { + type: Object, + default: () => ({ + text: '鏁版嵁鍔犺浇涓�...', + color: '#00BAFF', + textColor: '#000', + maskColor: 'rgba(255, 255, 255, 0.8)', + zlevel: 0 + }) + } +}) + +import { watch } from 'vue' + +// Refs +const chartRef = ref(null) +let chartInstance = null + +// Methods +function generateChart(option) { + const copiedOption = JSON.parse(JSON.stringify(option)) // 鉁� 娣辨嫹璐� + + // if (copiedOption.series && copiedOption.series.length > 0) { + // copiedOption.series.forEach((s, index) => { + // if (s.type === 'line') { + // s.itemStyle = { + // color: props.lineColors[index] || props.lineColors[0] + // } + // s.lineStyle = { + // color: props.lineColors[index] || props.lineColors[0] + // } + // } else if (s.type === 'bar') { + // s.itemStyle = { + // color: props.barColors[index] || props.barColors[0] + // } + // } + // }) + // } + + chartInstance.setOption(copiedOption) +} + +function renderChart() { + const option = { + backgroundColor: props.options.backgroundColor || '#fff', + xAxis: props.xAxis, + yAxis: props.yAxis, + dataset: props.dataset, + series: props.series, + grid: props.grid, + legend: props.legend, + tooltip: props.tooltip + } + + chartInstance.clear() + generateChart(option) +} + +function windowResizeListener() { + if (!chartInstance) return + chartInstance.resize() +} + +// Lifecycle hooks +onMounted(() => { + chartInstance = echarts.init(chartRef.value) + renderChart() + window.addEventListener('resize', windowResizeListener) +}) + +onBeforeUnmount(() => { + if (chartInstance) { + window.removeEventListener('resize', windowResizeListener) + chartInstance.dispose() + chartInstance = null + } +}) + +// Watch all reactive props that affect the chart +watch( + () => [props.xAxis, props.series], + () => { + if (chartInstance) { + renderChart() + } + }, + { deep: true, immediate: true } +) +</script> \ No newline at end of file diff --git a/src/views/index.vue b/src/views/index.vue index 76688c0..c57322c 100644 --- a/src/views/index.vue +++ b/src/views/index.vue @@ -1,1095 +1,14 @@ <template> - <div class="app-container home"> - <el-row :gutter="20"> - <el-col :sm="24" :lg="12" style="padding-left: 20px"> - <h2>鑻ヤ緷鍚庡彴绠$悊妗嗘灦</h2> - <p> - 涓�鐩存兂鍋氫竴娆惧悗鍙扮鐞嗙郴缁燂紝鐪嬩簡寰堝浼樼鐨勫紑婧愰」鐩絾鏄彂鐜版病鏈夊悎閫傝嚜宸辩殑銆備簬鏄埄鐢ㄧ┖闂蹭紤鎭椂闂村紑濮嬭嚜宸卞啓涓�濂楀悗鍙扮郴缁熴�傚姝ゆ湁浜嗚嫢渚濈鐞嗙郴缁燂紝濂瑰彲浠ョ敤浜庢墍鏈夌殑Web搴旂敤绋嬪簭锛屽缃戠珯绠$悊鍚庡彴锛岀綉绔欎細鍛樹腑蹇冿紝CMS锛孋RM锛孫A绛夌瓑锛屽綋鐒讹紝鎮ㄤ篃鍙互瀵瑰ス杩涜娣卞害瀹氬埗锛屼互鍋氬嚭鏇村己绯荤粺銆傛墍鏈夊墠绔悗鍙颁唬鐮佸皝瑁呰繃鍚庡崄鍒嗙簿绠�鏄撲笂鎵嬶紝鍑洪敊姒傜巼浣庛�傚悓鏃舵敮鎸佺Щ鍔ㄥ鎴风璁块棶銆傜郴缁熶細闄嗙画鏇存柊涓�浜涘疄鐢ㄥ姛鑳姐�� - </p> - <p> - <b>褰撳墠鐗堟湰:</b> <span>v{{ version }}</span> - </p> - <p> - <el-tag type="danger">¥鍏嶈垂寮�婧�</el-tag> - </p> - <p> - <el-button - type="primary" - icon="Cloudy" - plain - @click="goTarget('https://gitee.com/y_project/RuoYi-Vue')" - >璁块棶鐮佷簯</el-button - > - <el-button - icon="HomeFilled" - plain - @click="goTarget('http://ruoyi.vip')" - >璁块棶涓婚〉</el-button - > - </p> - </el-col> - - <el-col :sm="24" :lg="12" style="padding-left: 50px"> - <el-row> - <el-col :span="12"> - <h2>鎶�鏈�夊瀷</h2> - </el-col> - </el-row> - <el-row> - <el-col :span="6"> - <h4>鍚庣鎶�鏈�</h4> - <ul> - <li>SpringBoot</li> - <li>Spring Security</li> - <li>JWT</li> - <li>MyBatis</li> - <li>Druid</li> - <li>Fastjson</li> - <li>...</li> - </ul> - </el-col> - <el-col :span="6"> - <h4>鍓嶇鎶�鏈�</h4> - <ul> - <li>Vue</li> - <li>Vuex</li> - <li>Element-ui</li> - <li>Axios</li> - <li>Sass</li> - <li>Quill</li> - <li>...</li> - </ul> - </el-col> - </el-row> - </el-col> - </el-row> - <el-divider /> - <el-row :gutter="20"> - <el-col :xs="24" :sm="24" :md="12" :lg="8"> - <el-card class="update-log"> - <template v-slot:header> - <div class="clearfix"> - <span>鑱旂郴淇℃伅</span> - </div> - </template> - <div class="body"> - <p> - <i class="el-icon-s-promotion"></i> 瀹樼綉锛�<el-link - href="http://www.ruoyi.vip" - target="_blank" - >http://www.ruoyi.vip</el-link - > - </p> - <p> - <i class="el-icon-user-solid"></i> QQ缇わ細<s> 婊�937441 </s> <s> 婊�887144332 </s> - <s> 婊�180251782 </s> <s> 婊�104180207 </s> <s> 婊�186866453 </s> <s> 婊�201396349 </s> - <s> 婊�101456076 </s> <s> 婊�101539465 </s> <s> 婊�264312783 </s> <s> 婊�167385320 </s> - <s> 婊�104748341 </s> <s> 婊�160110482 </s> <s> 婊�170801498 </s> <s> 婊�108482800 </s> - <s> 婊�101046199 </s> <s> 婊�136919097 </s> <s> 婊�143961921 </s> <s> 婊�174951577 </s> - <s> 婊�161281055 </s> <s> 婊�138988063 </s> <s> 婊�151450850 </s> <s> 婊�224622315 </s> - <s> 婊�287842588 </s> <s> 婊�187944233 </s> <a href="http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=G6r5KGCaa3pqdbUSXNIgYloyb8e0_L0D&authKey=4w8tF1eGW7%2FedWn%2FHAypQksdrML%2BDHolQSx7094Agm7Luakj9EbfPnSTxSi2T1LQ&noverify=0&group_code=228578329" target="_blank">228578329</a> - </p> - <p> - <i class="el-icon-chat-dot-round"></i> 寰俊锛�<a - href="javascript:;" - >/ *鑻ヤ緷</a - > - </p> - <p> - <i class="el-icon-money"></i> 鏀粯瀹濓細<a - href="javascript:;" - class="鏀粯瀹濅俊鎭�" - >/ *鑻ヤ緷</a - > - </p> - </div> - </el-card> - </el-col> - <el-col :xs="24" :sm="24" :md="12" :lg="8"> - <el-card class="update-log"> - <template v-slot:header> - <div class="clearfix"> - <span>鏇存柊鏃ュ織</span> - </div> - </template> - <el-collapse accordion> - <el-collapse-item title="v3.8.9 - 2024-12-30"> - <ol> - <li>鐢ㄦ埛绠$悊鏀寔鍒嗘爮鎷栧姩</li> - <li>淇敼涓婚鏍峰紡鏈湴璇诲彇</li> - <li>鐢ㄦ埛澶村儚http(s)閾炬帴鏀寔</li> - <li>鐢ㄦ埛绠$悊杩囨护鎺夊凡绂佺敤閮ㄩ棬</li> - <li>鏀寔鑷畾涔夋樉绀篍xcel灞炴�у垪</li> - <li>鎿嶄綔鏃ュ織璁板綍DELETE璇锋眰鍙傛暟</li> - <li>鐧藉悕鍗曟敮鎸佸閫氶厤绗﹁矾寰勫尮閰�</li> - <li>鏍℃鏂囦欢鍚嶆槸鍚﹀寘鍚壒娈婂瓧绗�</li> - <li>浠g爜鐢熸垚鍒涘缓琛ㄥ睆钄借繚瑙勭殑瀛楃</li> - <li>鑿滃崟闈㈠寘灞戝鑸敮鎸佸灞傜骇鏄剧ず</li> - <li>Excel娉ㄨВ鏀寔wrapText鏄惁鍏佽鍐呭鎹㈣</li> - <li>浠g爜鐢熸垚鏂板閰嶇疆鏄惁鍏佽鏂囦欢瑕嗙洊鍒版湰鍦�</li> - <li>淇瑙掕壊绂佺敤鏉冮檺涓嶅け鏁堥棶棰�</li> - <li>淇浠g爜鐢熸垚涓婄骇鑿滃崟鏄剧ず闂</li> - <li>淇瀵煎嚭瀛愬垪琛ㄥ璞″彧鑳藉湪鏈�鍚庣殑闂</li> - <li>淇TopNav鏃犳硶姝g‘鑾峰彇active鐨勯棶棰�</li> - <li>淇榛樿鍏抽棴Tags-Views鍐呴摼椤甸潰鎵撲笉寮�</li> - <li>鍗囩骇oshi鍒版渶鏂扮増鏈�6.6.5</li> - <li>鍗囩骇tomcat鍒版渶鏂扮増鏈�9.0.96</li> - <li>鍗囩骇fastjson鍒版渶鏂扮増2.0.53</li> - <li>鍗囩骇logback鍒版渶鏂扮増鏈�1.2.13</li> - <li>鍗囩骇spring-framework鍒版渶鏂扮増鏈�5.3.39</li> - <li>鍗囩骇quill鍒版渶鏂扮増鏈�2.0.2</li> - <li>鍗囩骇axios鍒版渶鏂扮増鏈�0.28.1</li> - <li>浼樺寲韬唤璇佽劚鏁忔鍒�</li> - <li>浼樺寲鏉冮檺鏇存柊鍚庡悓姝ョ紦瀛�</li> - <li>浼樺寲鏌ヨ鏃堕棿鑼冨洿鏃ユ湡鏍煎紡</li> - <li>浼樺寲鍙傛暟閿�兼洿鎹负澶氳鏂囨湰</li> - <li>浼樺寲瀵煎叆甯︽爣棰樻枃浠跺叧闂竻鐞�</li> - <li>浼樺寲涓婁紶鍥剧墖甯﹀煙鍚嶄笉澧炲姞鍓嶇紑</li> - <li>浼樺寲鐗规畩瀛楃瀵嗙爜淇敼澶辫触闂</li> - <li>浼樺寲鏃犵敤鎴风紪鍙蜂笉鏍¢獙鏁版嵁鏉冮檺</li> - <li>浼樺寲TopNav鍐呴摼鑿滃崟鐐瑰嚮娌℃湁楂樹寒</li> - <li>浼樺寲鑿滃崟绠$悊鍒囨崲Mini甯冨眬閿欎贡闂</li> - <li>鍏朵粬缁嗚妭浼樺寲</li> - </ol> - </el-collapse-item> - <el-collapse-item title="v3.8.8 - 2024-06-30"> - <ol> - <li>鑿滃崟绠$悊鏂板璺敱鍚嶇О</li> - <li>鏂板鏁版嵁鑴辨晱杩囨护娉ㄨВ</li> - <li>鐢ㄦ埛瀵嗙爜鏂板闈炴硶瀛楃楠岃瘉</li> - <li>闄愬埗鐢ㄦ埛鎿嶄綔鏁版嵁鏉冮檺鑼冨洿</li> - <li>浠g爜鐢熸垚鏂板鍒涘缓琛ㄧ粨鏋勫姛鑳�</li> - <li>瀹氭椂浠诲姟鐧藉悕鍗曢厤缃寖鍥寸缉灏�</li> - <li>浼樺寲浠g爜鐢熸垚涓诲瓙琛ㄥ叧鑱旀煡璇㈡柟寮�</li> - <li>Excel娉ㄨВ鏂板灞炴�omboReadDict</li> - <li>Excel娉ㄨВColumnType绫诲瀷鏂板鏂囨湰</li> - <li>鏂板鍥介檯鍖栬祫婧愭枃浠堕厤缃�</li> - <li>鍗囩骇oshi鍒版渶鏂扮増鏈�6.6.1</li> - <li>鍗囩骇druid鍒版渶鏂扮増鏈�1.2.23</li> - <li>鍗囩骇core-js鍒版渶鏂扮増鏈�3.37.1</li> - <li>鏇存柊HttpUtils涓殑User-Agent</li> - <li>鏇存柊compressionPlugin鍒�6.1.2浠ュ吋瀹筺ode18+</li> - <li>鍗囩骇spring-security鍒板畨鍏ㄧ増鏈紝闃叉婕忔礊椋庨櫓</li> - <li>鍗囩骇spring-framework鍒板畨鍏ㄧ増鏈紝闃叉婕忔礊椋庨櫓</li> - <li>浼樺寲鑷畾涔塜SS娉ㄨВ鍖归厤鏂瑰紡</li> - <li>浼樺寲缂撳瓨鐩戞帶閿悕鍒楄〃鎺掑簭鏄剧ず</li> - <li>浼樺寲瀹氭椂浠诲姟鏃ュ織榛樿鎸夋椂闂存帓搴�</li> - <li>浼樺寲榛樿鏂囦欢澶у皬瓒呰繃2G鏃犳晥鐨勯棶棰�</li> - <li>浼樺寲鏌ヨ〃鐗规畩瀛楃浣跨敤鍙嶆枩鏉犺繘琛岃浆涔�</li> - <li>浼樺寲瀹氭椂浠诲姟cron琛ㄨ揪寮忓皬鏃堕厤缃樉绀洪敊璇棶棰�</li> - <li>浼樺寲澶氫釜鑷畾鏁版嵁鏉冮檺浣跨敤in鏌ヨ,閬垮厤澶氭鎷兼帴</li> - <li>浼樺寲瀵煎叆Excel鏃惰缃甦ictType灞炴�ч噸澶嶆煡缂撳瓨闂</li> - <li>鍏朵粬缁嗚妭浼樺寲</li> - </ol> - </el-collapse-item> - <el-collapse-item title="v3.8.7 - 2023-12-08"> - <ol> - <li>鎿嶄綔鏃ュ織璁板綍閮ㄩ棬鍚嶇О</li> - <li>鍏ㄥ眬鏁版嵁瀛樺偍鐢ㄦ埛缂栧彿</li> - <li>鏂板缂栫▼寮忓垽鏂祫婧愯闂潈闄�</li> - <li>鎿嶄綔鏃ュ織鍒楄〃鏂板IP鍦板潃鏌ヨ</li> - <li>瀹氭椂浠诲姟鏂板椤靛幓闄ょ姸鎬侀�夐」</li> - <li>浠g爜鐢熸垚鏀寔閫夋嫨鍓嶇妯℃澘绫诲瀷</li> - <li>鏄鹃殣鍒楃粍浠舵敮鎸佸閫夋寮瑰嚭绫诲瀷</li> - <li>閫氱敤鎺掑簭灞炴�rderBy鍙傛暟闄愬埗闀垮害</li> - <li>Excel鑷畾涔夋暟鎹鐞嗗櫒澧炲姞鍗曞厓鏍�/宸ヤ綔绨垮璞�</li> - <li>鍗囩骇oshi鍒版渶鏂扮増鏈�6.4.8</li> - <li>鍗囩骇druid鍒版渶鏂扮増鏈�1.2.20</li> - <li>鍗囩骇fastjson鍒版渶鏂扮増2.0.43</li> - <li>鍗囩骇pagehelper鍒版渶鏂扮増1.4.7</li> - <li>鍗囩骇commons.io鍒版渶鏂扮増鏈�2.13.0</li> - <li>鍗囩骇element-ui鍒版渶鏂扮増鏈�2.15.14</li> - <li>淇浜旂骇璺敱缂撳瓨鏃犳晥闂</li> - <li>淇澶栭摼甯︾鍙e嚭鐜扮殑寮傚父</li> - <li>淇鏍戞ā鏉跨埗绾х紪鐮佸彉閲忛敊璇�</li> - <li>淇瀛楀吀琛ㄨ鎯呴〉闈㈡悳绱㈤棶棰�</li> - <li>淇鍐呴摼iframe娌℃湁浼犻�掑弬鏁伴棶棰�</li> - <li>淇鑷畾涔夊瓧鍏告牱寮忎笉鐢熸晥鐨勯棶棰�</li> - <li>淇瀛楀吀缂撳瓨鍒犻櫎鏂规硶鍙傛暟閿欒闂</li> - <li>淇Excel瀵煎叆鏁版嵁涓存椂鏂囦欢鏃犳硶鍒犻櫎闂</li> - <li>淇鏈櫥褰曞甫鍙傛暟璁块棶鎴愬姛鍚庡弬鏁颁涪澶遍棶棰�</li> - <li>淇HeaderSearch缁勪欢璺宠浆query鍙傛暟涓㈠け闂</li> - <li>淇浠g爜鐢熸垚瀵煎叆鍚庡繀濉」涓庢暟鎹簱涓嶅尮閰嶉棶棰�</li> - <li>淇Excels瀵煎叆鏃舵棤娉曡幏鍙栧埌dictType瀛楀吀鍊奸棶棰�</li> - <li>浼樺寲涓嬭浇zip鏂规硶鏂板閬僵灞�</li> - <li>浼樺寲澶村儚涓婁紶鍙傛暟鏂板鏂囦欢鍚嶇О</li> - <li>浼樺寲瀛楀吀鏍囩鏀寔鑷畾涔夊垎闅旂</li> - <li>浼樺寲鑿滃崟绠$悊绫诲瀷涓烘寜閽姸鎬佸彲閫�</li> - <li>浼樺寲鍓嶇闃查噸澶嶆彁浜ゆ暟鎹ぇ灏忛檺鍒�</li> - <li>浼樺寲TopNav鑿滃崟娌℃湁鍥炬爣svg涓嶆樉绀�</li> - <li>浼樺寲鏁板瓧閲戦澶у啓杞崲绮惧害涓㈠け闂</li> - <li>浼樺寲瀵屾枃鏈珽ditor缁勪欢妫�楠屽浘鐗囨牸寮�</li> - <li>浼樺寲椤电鍦‵irefox娴忚鍣ㄨ閬尅鐨勯棶棰�</li> - <li>浼樺寲涓汉涓績/鍩烘湰璧勬枡淇敼鏃舵暟鎹樉绀洪棶棰�</li> - <li>浼樺寲缂撳瓨鐩戞帶鍥捐〃鏀寔璺熼殢灞忓箷澶у皬鑷�傚簲璋冩暣</li> - <li>鍏朵粬缁嗚妭浼樺寲</li> - </ol> - </el-collapse-item> - <el-collapse-item title="v3.8.6 - 2023-06-30"> - <ol> - <li>鏀寔鐧诲綍IP榛戝悕鍗曢檺鍒�</li> - <li>鏂板鐩戞帶椤甸潰鍥炬爣鏄剧ず</li> - <li>鎿嶄綔鏃ュ織鏂板娑堣�楁椂闂村睘鎬�</li> - <li>灞忚斀瀹氭椂浠诲姟bean杩濊鐨勫瓧绗�</li> - <li>鏃ュ織绠$悊浣跨敤绱㈠紩鎻愬崌鏌ヨ鎬ц兘</li> - <li>鏃ュ織娉ㄨВ鏀寔鎺掗櫎鎸囧畾鐨勮姹傚弬鏁�</li> - <li>鏀寔鑷畾涔夐殣钘忓睘鎬у垪杩囨护瀛愬璞�</li> - <li>鍗囩骇oshi鍒版渶鏂扮増鏈�6.4.3</li> - <li>鍗囩骇druid鍒版渶鏂扮増鏈�1.2.16</li> - <li>鍗囩骇fastjson鍒版渶鏂扮増2.0.34</li> - <li>鍗囩骇spring-boot鍒版渶鏂扮増鏈�2.5.15</li> - <li>鍗囩骇element-ui鍒版渶鏂扮増鏈�2.15.13</li> - <li>绉婚櫎apache/commons-fileupload渚濊禆</li> - <li>淇椤甸潰鍒囨崲鏃跺竷灞�閿欎贡鐨勯棶棰�</li> - <li>淇鍖垮悕娉ㄨВAnonymous绌烘寚閽堥棶棰�</li> - <li>淇璺敱璺宠浆琚樆姝㈡椂鍐呴儴浜х敓鎶ラ敊淇℃伅闂</li> - <li>淇isMatchedIp鐨勫弬鏁板垽鏂骇鐢熺┖鎸囬拡鐨勯棶棰�</li> - <li>淇鐢ㄦ埛澶氳鑹叉暟鎹潈闄愬彲鑳藉嚭鐜版潈闄愭姮鍗囩殑鎯呭喌</li> - <li>淇寮�鍚疶opNav鍚庝竴绾ц彍鍗曡矾鐢卞弬鏁拌缃棤鏁堥棶棰�</li> - <li>淇DictTag缁勪欢value娌℃湁鍖归厤鐨勫�兼椂鍒欏睍绀簐alue</li> - <li>浼樺寲鏂囦欢涓嬭浇鍑虹幇鐨勫紓甯�</li> - <li>浼樺寲閫夋嫨鍥炬爣缁勪欢楂樹寒鍥炴樉</li> - <li>浼樺寲寮圭獥鍚庡鑸爮鍋忕Щ鐨勯棶棰�</li> - <li>浼樺寲淇敼瀵嗙爜鏃ュ織瀛樺偍鏄庢枃闂</li> - <li>浼樺寲椤电鏍忓叧闂叾浠栧嚭鐜扮殑寮傚父闂</li> - <li>浼樺寲椤电鍏抽棴宸︿晶閫夐」鎺掗櫎棣栭〉閫夐」</li> - <li>浼樺寲鍏抽棴褰撳墠tab椤佃烦杞渶鍙充晶tab椤�</li> - <li>浼樺寲缂撳瓨鍒楄〃娓呴櫎鎿嶄綔鎻愮ず涓嶅彉鐨勯棶棰�</li> - <li>浼樺寲瀛楃鏈娇鐢ㄤ笅鍒掔嚎涓嶈繘琛岄┘宄板紡澶勭悊</li> - <li>浼樺寲鐢ㄦ埛瀵煎叆鏇存柊鏃堕渶鑾峰彇鐢ㄦ埛缂栧彿闂</li> - <li>浼樺寲渚ц竟鏍忕殑骞冲彴鏍囬涓嶸UE_APP_TITLE淇濇寔鍚屾</li> - <li>浼樺寲瀵煎嚭Excel鏃惰缃甦ictType灞炴�ч噸澶嶆煡缂撳瓨闂</li> - <li>杩炴帴姹燚ruid鏀寔鏂扮殑閰嶇疆connectTimeout鍜宻ocketTimeout</li> - <li>鍏朵粬缁嗚妭浼樺寲</li> - </ol> - </el-collapse-item> - <el-collapse-item title="v3.8.5 - 2023-01-01"> - <ol> - <li>瀹氭椂浠诲姟杩濊鐨勫瓧绗�</li> - <li>閲嶇疆鏃跺彇娑堥儴闂ㄩ�変腑</li> - <li>鏂板杩斿洖璀﹀憡娑堟伅鎻愮ず</li> - <li>蹇界暐涓嶅繀瑕佺殑灞炴�ф暟鎹繑鍥�</li> - <li>淇敼鍙傛暟閿悕鏃剁Щ闄ゅ墠缂撳瓨閰嶇疆</li> - <li>瀵煎叆鏇存柊鐢ㄦ埛鏁版嵁鍓嶆牎楠屾暟鎹潈闄�</li> - <li>鍏煎Excel涓嬫媺妗嗗唴瀹硅繃澶氭棤娉曟樉绀虹殑闂</li> - <li>鍗囩骇echarts鍒版渶鏂扮増鏈�5.4.0</li> - <li>鍗囩骇core-js鍒版渶鏂扮増鏈�3.25.3</li> - <li>鍗囩骇oshi鍒版渶鏂扮増鏈�6.4.0</li> - <li>鍗囩骇kaptcha鍒版渶鏂扮増2.3.3</li> - <li>鍗囩骇druid鍒版渶鏂扮増鏈�1.2.15</li> - <li>鍗囩骇fastjson鍒版渶鏂扮増2.0.20</li> - <li>鍗囩骇pagehelper鍒版渶鏂扮増1.4.6</li> - <li>浼樺寲寮圭獥鍐呭杩囧灞曠ず涓嶅叏闂</li> - <li>浼樺寲swagger-ui闈欐�佽祫婧愪娇鐢ㄧ紦瀛�</li> - <li>寮�鍚疶opNav娌℃湁瀛愯彍鍗曢殣钘忎晶杈规爮</li> - <li>鍒犻櫎fuse鏃犳晥閫夐」maxPatternLength</li> - <li>浼樺寲瀵煎嚭瀵硅薄鐨勫瓙鍒楄〃涓虹┖浼氬嚭鐜癧]闂</li> - <li>浼樺寲缂栬緫澶村儚鏃堕�忔槑閮ㄥ垎浼氬彉鎴愰粦鑹查棶棰�</li> - <li>浼樺寲灏忓睆骞曚笂淇敼澶村儚鐣岄潰甯冨眬閿欎綅鐨勯棶棰�</li> - <li>淇浠g爜鐢熸垚鍕鹃�夊睘鎬ф棤鏁堥棶棰�</li> - <li>淇鏂囦欢涓婁紶缁勪欢鏍煎紡楠岃瘉闂</li> - <li>淇鍥炴樉鏁版嵁瀛楀吀鏁扮粍寮傚父闂</li> - <li>淇sheet瓒呭嚭鏈�澶ц鏁板紓甯搁棶棰�</li> - <li>淇Log娉ㄨВGET璇锋眰璁板綍涓嶅埌鍙傛暟闂</li> - <li>淇璋冨害鏃ュ織鐐瑰嚮澶氭鏁版嵁涓嶅彉鍖栫殑闂</li> - <li>淇涓婚棰滆壊鍦―rawer缁勪欢涓嶄細鍔犺浇闂</li> - <li>淇鏂囦欢鍚嶅寘鍚壒娈婂瓧绗︾殑鏂囦欢鏃犳硶涓嬭浇闂</li> - <li>淇table涓洿澶氭寜閽垏鎹富棰樿壊鏈敓鏁堜慨澶嶉棶棰�</li> - <li>淇鏌愪簺鐗规�х殑鐜鐢熸垚浠g爜鍙樹贡鐮乀XT鏂囦欢闂</li> - <li>淇浠g爜鐢熸垚鍥剧墖/鏂囦欢/鍗曢�夋椂閫夋嫨蹇呭~鏃犳硶鏍¢獙闂</li> - <li>淇鏌愪簺鐗规�х殑鎯呭喌鐢ㄦ埛缂栬緫瀵硅瘽妗嗕腑瑙掕壊鍜岄儴闂ㄦ棤娉曚慨鏀归棶棰�</li> - <li>鍏朵粬缁嗚妭浼樺寲</li> - </ol> - </el-collapse-item> - <el-collapse-item title="v3.8.4 - 2022-09-26"> - <ol> - <li>鏁版嵁閫昏緫鍒犻櫎涓嶈繘琛屽敮涓�楠岃瘉</li> - <li>Excel娉ㄨВ鏀寔瀵煎嚭瀵硅薄鐨勫瓙鍒楄〃鏂规硶</li> - <li>Excel娉ㄨВ鏀寔鑷畾涔夐殣钘忓睘鎬у垪</li> - <li>Excel娉ㄨВ鏀寔backgroundColor灞炴�ц缃儗鏅壊</li> - <li>鏀寔閰嶇疆瀵嗙爜鏈�澶ч敊璇鏁�/閿佸畾鏃堕棿</li> - <li>鐧诲綍鏃ュ織鏂板瑙i攣璐︽埛鍔熻兘</li> - <li>閫氱敤涓嬭浇鏂规硶鏂板config閰嶇疆閫夐」</li> - <li>鏀寔澶氭潈闄愬瓧绗﹀尮閰嶈鑹叉暟鎹潈闄�</li> - <li>椤甸潰鍐呭祵iframe鍒囨崲tab涓嶅埛鏂版暟鎹�</li> - <li>鎿嶄綔鏃ュ織璁板綍鏀寔鎺掗櫎鏁忔劅灞炴�у瓧娈�</li> - <li>淇澶氭枃浠朵笂浼犳姤閿欏嚭鐜扮殑寮傚父闂</li> - <li>淇鍥剧墖棰勮缁勪欢src灞炴�т负null鍊兼帶鍒跺彴鎶ラ敊闂</li> - <li>鍗囩骇oshi鍒版渶鏂扮増鏈�6.2.2</li> - <li>鍗囩骇fastjson鍒版渶鏂扮増2.0.14</li> - <li>鍗囩骇pagehelper鍒版渶鏂扮増1.4.3</li> - <li>鍗囩骇core-js鍒版渶鏂扮増鏈�3.25.2</li> - <li>鍗囩骇element-ui鍒版渶鏂扮増鏈�2.15.10</li> - <li>浼樺寲浠诲姟杩囨湡涓嶆墽琛岃皟搴�</li> - <li>浼樺寲瀛楀吀鏁版嵁浣跨敤store瀛樺彇</li> - <li>浼樺寲淇敼璧勬枡澶村儚琚鐩栫殑闂</li> - <li>浼樺寲淇敼鐢ㄦ埛鐧诲綍璐﹀彿閲嶅楠岃瘉</li> - <li>浼樺寲浠g爜鐢熸垚鍚屾鍚庡�糔ULL闂</li> - <li>浼樺寲瀹氭椂浠诲姟鏀寔鎵ц鐖剁被鏂规硶</li> - <li>浼樺寲鐢ㄦ埛涓汉淇℃伅鎺ュ彛闃叉淇敼閮ㄩ棬</li> - <li>浼樺寲甯冨眬璁剧疆浣跨敤el-drawer鎶藉眽鏄剧ず</li> - <li>浼樺寲娌℃湁鏉冮檺鐨勭敤鎴风紪杈戦儴闂ㄧ己灏戞暟鎹�</li> - <li>浼樺寲鏃ュ織娉ㄨВ璁板綍闄愬埗璇锋眰鍦板潃鐨勯暱搴�</li> - <li>浼樺寲excel/scale灞炴�у鍑哄崟鍏冩牸鏁板�肩被鍨�</li> - <li>浼樺寲鏃ュ織鎿嶄綔涓噸缃寜閽椂閲嶅鏌ヨ鐨勯棶棰�</li> - <li>浼樺寲澶氫釜鐩稿悓瑙掕壊鏁版嵁瀵艰嚧鏉冮檺SQL閲嶅闂</li> - <li>浼樺寲琛ㄦ牸涓婂彸渚у伐鍏锋潯锛堟悳绱㈡寜閽樉闅�&鍙充晶鏍峰紡鍑稿嚭锛�</li> - <li>鍏朵粬缁嗚妭浼樺寲</li> - </ol> - </el-collapse-item> - <el-collapse-item title="v3.8.3 - 2022-06-27"> - <ol> - <li>鏂板缂撳瓨鍒楄〃鑿滃崟鍔熻兘</li> - <li>浠g爜鐢熸垚鏍戣〃鏂板(灞曞紑/鎶樺彔)</li> - <li>Excel娉ㄨВ鏀寔color瀛椾綋棰滆壊</li> - <li>鏂板Anonymous鍖垮悕璁块棶涓嶉壌鏉冩敞瑙�</li> - <li>鐢ㄦ埛澶村儚涓婁紶闄愬埗鍙兘涓哄浘鐗囨牸寮�</li> - <li>鎺ュ彛浣跨敤娉涘瀷浣垮叾鐪嬪埌鍝嶅簲灞炴�у瓧娈�</li> - <li>妫�鏌ュ畾鏃朵换鍔ean鎵�鍦ㄥ寘鍚嶆槸鍚︿负鐧藉悕鍗曢厤缃�</li> - <li>娣诲姞椤电openPage鏀寔浼犻�掑弬鏁�</li> - <li>鐢ㄦ埛缂撳瓨淇℃伅娣诲姞閮ㄩ棬ancestors绁栫骇鍒楄〃</li> - <li>鍗囩骇element-ui鍒版渶鏂扮増鏈�2.15.8</li> - <li>鍗囩骇oshi鍒版渶鏂扮増鏈�6.1.6</li> - <li>鍗囩骇druid鍒版渶鏂扮増鏈�1.2.11</li> - <li>鍗囩骇fastjson鍒版渶鏂扮増2.0.8</li> - <li>鍗囩骇spring-boot鍒版渶鏂扮増鏈�2.5.14</li> - <li>闄嶇骇jsencrypt鐗堟湰鍏煎IE娴忚鍣�</li> - <li>鍒犻櫎澶氫綑鐨剆alt瀛楁</li> - <li>鏂板鑾峰彇涓嶅甫鍚庣紑鏂囦欢鍚嶇О鏂规硶</li> - <li>鏂板鑾峰彇閰嶇疆鏂囦欢涓殑灞炴�у�兼柟娉�</li> - <li>鏂板鍐呭缂栫爜/瑙g爜鏂逛究鎻掍欢闆嗘垚浣跨敤</li> - <li>瀛楀吀绫诲瀷蹇呴』浠ュ瓧姣嶅紑澶达紝涓斿彧鑳戒负锛堝皬鍐欏瓧姣嶏紝鏁板瓧锛屼笅婊戠嚎锛�</li> - <li>浼樺寲璁剧疆鍒嗛〉鍙傛暟榛樿鍊�</li> - <li>浼樺寲瀵圭┖瀛楃涓插弬鏁板鐞嗙殑杩囨护</li> - <li>浼樺寲鏄剧ず椤哄簭orderNum绫诲瀷涓烘暣鍨�</li> - <li>浼樺寲琛ㄥ崟鏋勫缓鎸夐挳涓嶆樉绀烘鍒欐牎楠�</li> - <li>浼樺寲瀛楀吀鏁版嵁鍥炴樉鏍峰紡涓嬫媺妗嗘樉绀哄��</li> - <li>浼樺寲R鍝嶅簲鎴愬姛鐘舵�佺爜涓庡叏灞�淇濇寔涓�鑷�</li> - <li>浼樺寲druid寮�鍚痺all杩囨护鍣ㄥ嚭鐜扮殑寮傚父闂</li> - <li>浼樺寲鐢ㄦ埛绠$悊宸︿晶鏍戝瀷缁勪欢澧炲姞閫変腑楂樹寒淇濇寔</li> - <li>浼樺寲鏂板鐢ㄦ埛涓庤鑹蹭俊鎭�&鐢ㄦ埛涓庡矖浣嶄俊鎭�昏緫</li> - <li>浼樺寲榛樿涓嶅惎鐢ㄥ帇缂╂枃浠剁紦瀛橀槻姝ode_modules杩囧ぇ</li> - <li>淇瀛楀吀鏁版嵁鏄剧ず涓嶅叏闂</li> - <li>淇鎿嶄綔鏃ュ織鏌ヨ绫诲瀷鏉′欢涓�0鏃朵細鏌ュ埌鎵�鏈夋暟鎹�</li> - <li>淇Excel娉ㄨВprompt/combo鍚屾椂浣跨敤涓嶇敓鏁堥棶棰�</li> - <li>鍏朵粬缁嗚妭浼樺寲</li> - </ol> - </el-collapse-item> - <el-collapse-item title="v3.8.2 - 2022-04-01"> - <ol> - <li>鍓嶇鏀寔璁剧疆鏄惁闇�瑕侀槻姝㈡暟鎹噸澶嶆彁浜�</li> - <li>寮�鍚疶opNav娌℃湁瀛愯彍鍗曟儏鍐甸殣钘忎晶杈规爮</li> - <li>渚ц竟鏍忚彍鍗曞悕绉拌繃闀挎偓鍋滄樉绀烘爣棰�</li> - <li>鐢ㄦ埛璁块棶鎺у埗鏃舵牎楠屾暟鎹潈闄愶紝闃叉瓒婃潈</li> - <li>瀵煎嚭Excel鏃跺睆钄藉叕寮忥紝闃叉CSV娉ㄥ叆椋庨櫓</li> - <li>缁勪欢ImagePreview鏀寔澶氬浘棰勮鏄剧ず</li> - <li>缁勪欢ImageUpload鏀寔澶氬浘鍚屾椂閫夋嫨涓婁紶</li> - <li>缁勪欢FileUpload鏀寔澶氭枃浠跺悓鏃堕�夋嫨涓婁紶</li> - <li>鏈嶅姟鐩戞帶鏂板杩愯鍙傛暟淇℃伅鏄剧ず</li> - <li>瀹氭椂浠诲姟鐩爣瀛楃涓茶繃婊ょ壒娈婂瓧绗�</li> - <li>瀹氭椂浠诲姟鐩爣瀛楃涓查獙璇佸寘鍚嶇櫧鍚嶅崟</li> - <li>浠g爜鐢熸垚鍒楄〃鍥剧墖鏀寔棰勮</li> - <li>浠g爜鐢熸垚缂栬緫淇敼鎵撳紑鏂伴〉绛�</li> - <li>浠g爜鐢熸垚鏂板Java绫诲瀷Boolean</li> - <li>浠g爜鐢熸垚瀛愯〃鏀寔鏃ユ湡/瀛楀吀閰嶇疆</li> - <li>浠g爜鐢熸垚鍚屾淇濈暀蹇呭~/绫诲瀷閫夐」</li> - <li>鍗囩骇oshi鍒版渶鏂扮増鏈�6.1.2</li> - <li>鍗囩骇fastjson鍒版渶鏂扮増1.2.80</li> - <li>鍗囩骇pagehelper鍒版渶鏂扮増1.4.1</li> - <li>鍗囩骇spring-boot鍒版渶鏂扮増鏈�2.5.11</li> - <li>鍗囩骇spring-boot-mybatis鍒版渶鏂扮増2.2.2</li> - <li>娣诲姞閬楁紡鐨勫垎椤靛弬鏁板悎鐞嗗寲灞炴��</li> - <li>淇敼npm鍗冲皢杩囨湡鐨勬敞鍐屾簮鍦板潃</li> - <li>淇鍒嗛〉缁勪欢璇锋眰涓ゆ闂</li> - <li>淇閫氱敤鏂囦欢涓嬭浇鎺ュ彛璺ㄥ煙闂</li> - <li>淇Xss娉ㄨВ瀛楁鍊间负绌烘椂鐨勫紓甯搁棶棰�</li> - <li>淇閫夐」鍗$偣鍑诲彸閿埛鏂颁涪澶卞弬鏁伴棶棰�</li> - <li>淇琛ㄥ崟娓呴櫎鍏冪礌浣嶇疆鏈瀭鐩村眳涓棶棰�</li> - <li>淇鏈嶅姟鐩戞帶涓繍琛屽弬鏁版樉绀烘潯浠堕敊璇�</li> - <li>淇瀵煎叆Excel鏃跺瓧鍏稿瓧娈电被鍨嬩负Long杞箟涓虹┖闂</li> - <li>淇鐧诲綍瓒呮椂鍒锋柊椤甸潰璺宠浆鐧诲綍椤甸潰杩樻彁绀洪噸鏂扮櫥褰曢棶棰�</li> - <li>浼樺寲鍔犺浇瀛楀吀缂撳瓨鏁版嵁</li> - <li>浼樺寲IP鍦板潃鑾峰彇鍒板涓殑闂</li> - <li>浼樺寲浠诲姟闃熷垪婊℃椂浠诲姟鎷掔粷绛栫暐</li> - <li>浼樺寲鏂囦欢涓婁紶鍏煎Weblogic鐜</li> - <li>浼樺寲瀹氭椂浠诲姟榛樿淇濆瓨鍒板唴瀛樹腑鎵ц</li> - <li>浼樺寲閮ㄩ棬淇敼缂╂斁鍚庡嚭鐜扮殑閿欎綅闂</li> - <li>浼樺寲Excel鏍煎紡鍖栦笉鍚岀被鍨嬬殑鏃ユ湡瀵硅薄</li> - <li>浼樺寲鑿滃崟琛ㄥ叧閿瓧瀵艰嚧鐨勬彃浠舵姤閿欓棶棰�</li> - <li>浼樺寲Oracle鐢ㄦ埛澶村儚鍒椾负绌烘椂涓嶆樉绀洪棶棰�</li> - <li>浼樺寲椤甸潰鑻ユ湭鍖归厤鍒板瓧鍏告爣绛惧垯杩斿洖鍘熷瓧鍏稿��</li> - <li>浼樺寲淇鐧诲綍澶辨晥鍚庡娆¤姹傛彁绀哄娆″脊绐楅棶棰�</li> - <li>鍏朵粬缁嗚妭浼樺寲</li> - </ol> - </el-collapse-item> - <el-collapse-item title="v3.8.1 - 2022-01-01"> - <ol> - <li>鏂板Vue3鍓嶇浠g爜鐢熸垚妯℃澘</li> - <li>鏂板鍥剧墖棰勮缁勪欢</li> - <li>鏂板鍘嬬缉鎻掍欢瀹炵幇鎵撳寘Gzip</li> - <li>鑷畾涔墄ss鏍¢獙娉ㄨВ瀹炵幇</li> - <li>鑷畾涔夋枃瀛楀鍒跺壀璐存寚浠�</li> - <li>浠g爜鐢熸垚棰勮鏀寔澶嶅埗鍐呭</li> - <li>璺敱鏀寔鍗曠嫭閰嶇疆鑿滃崟鎴栬鑹叉潈闄�</li> - <li>鐢ㄦ埛绠$悊閮ㄩ棬鏌ヨ閫夋嫨鑺傜偣鍚庡垎椤靛弬鏁板垵濮�</li> - <li>淇鐢ㄦ埛鍒嗛厤瑙掕壊灞炴�ч敊璇�</li> - <li>淇鎵撳寘鍚庡瓧浣撳浘鏍囧伓鐜扮殑涔辩爜闂</li> - <li>淇鑿滃崟绠$悊閲嶇疆琛ㄥ崟鍑虹幇鐨勯敊璇�</li> - <li>淇鐗堟湰宸紓瀵艰嚧鐨勬噿鍔犺浇鎶ラ敊闂</li> - <li>淇Cron缁勪欢涓懆鍥炴樉闂</li> - <li>淇瀹氭椂浠诲姟澶氬弬鏁伴�楀彿鍒嗛殧鐨勯棶棰�</li> - <li>淇鏍规嵁ID鏌ヨ鍒楄〃鍙兘鍑虹幇鐨勪富閿孩鍑洪棶棰�</li> - <li>淇tomcat閰嶇疆鍙傛暟宸茶繃鏈熼棶棰�</li> - <li>鍗囩骇clipboard鍒版渶鏂扮増鏈�2.0.8</li> - <li>鍗囩骇oshi鍒版渶鏂扮増鏈瑅5.8.6</li> - <li>鍗囩骇fastjson鍒版渶鏂扮増1.2.79</li> - <li>鍗囩骇spring-boot鍒版渶鏂扮増鏈�2.5.8</li> - <li>鍗囩骇log4j2鍒�2.17.1锛岄槻姝㈡紡娲為闄�</li> - <li>浼樺寲涓嬭浇瑙f瀽blob寮傚父鎻愮ず</li> - <li>浼樺寲浠g爜鐢熸垚瀛楀吀缁勯噸澶嶉棶棰�</li> - <li>浼樺寲鏌ヨ鐢ㄦ埛鐨勮鑹茬粍&宀椾綅缁勪唬鐮�</li> - <li>浼樺寲瀹氭椂浠诲姟cron琛ㄨ揪寮忓皬鏃惰缃�24</li> - <li>浼樺寲鐢ㄦ埛瀵煎叆鎻愮ず婧㈠嚭鍒欐樉绀烘粴鍔ㄦ潯</li> - <li>浼樺寲闃查噸澶嶆彁浜ゆ爣璇嗙粍鍚堜负(key+url+header)</li> - <li>浼樺寲鍒嗛〉鏂规硶璁剧疆鎴愰�氱敤鏂逛究鐏垫椿璋冪敤</li> - <li>鍏朵粬缁嗚妭浼樺寲</li> - </ol> - </el-collapse-item> - <el-collapse-item title="v3.8.0 - 2021-12-01"> - <ol> - <li>鏂板閰嶅骞跺悓姝ョ殑Vue3鍓嶇鐗堟湰</li> - <li>鏂板閫氱敤鏂规硶绠�鍖栨ā鎬�/缂撳瓨/涓嬭浇/鏉冮檺/椤电浣跨敤</li> - <li>浼樺寲瀵煎嚭鏁版嵁/浣跨敤閫氱敤涓嬭浇鏂规硶</li> - <li>Excel娉ㄨВ鏀寔鑷畾涔夋暟鎹鐞嗗櫒</li> - <li>Excel娉ㄨВ鏀寔瀵煎叆瀵煎嚭鏍囬淇℃伅</li> - <li>Excel瀵煎叆鏀寔@Excels娉ㄨВ</li> - <li>鏂板缁勪欢data-dict锛岀畝鍖栨暟鎹瓧鍏镐娇鐢�</li> - <li>鏂板Jaxb渚濊禆锛岄槻姝dk8浠ヤ笂鍑虹幇鐨勫吋瀹归敊璇�</li> - <li>鐢熶骇鐜浣跨敤璺敱鎳掑姞杞芥彁鍗囬〉闈㈠搷搴旈�熷害</li> - <li>淇浜旂骇浠ヤ笂鑿滃崟鍑虹幇鐨�404闂</li> - <li>闃查噸鎻愪氦娉ㄨВ鏀寔閰嶇疆闂撮殧鏃堕棿/鎻愮ず娑堟伅</li> - <li>鏃ュ織娉ㄨВ鏂板鏄惁淇濆瓨鍝嶅簲鍙傛暟</li> - <li>浠诲姟灞忚斀杩濊瀛楃&鍙傛暟蹇界暐鍙屽紩鍙蜂腑鐨勯�楀彿</li> - <li>鍗囩骇SpringBoot鍒版渶鏂扮増鏈�2.5.6</li> - <li>鍗囩骇pagehelper鍒版渶鏂扮増1.4.0</li> - <li>鍗囩骇spring-boot-mybatis鍒版渶鏂扮増2.2.0</li> - <li>鍗囩骇oshi鍒版渶鏂扮増鏈瑅5.8.2</li> - <li>鍗囩骇druid鍒版渶鏂扮増1.2.8</li> - <li>鍗囩骇velocity鍒版渶鏂扮増鏈�2.3</li> - <li>鍗囩骇fastjson鍒版渶鏂扮増1.2.78</li> - <li>鍗囩骇axios鍒版渶鏂扮増鏈�0.24.0</li> - <li>鍗囩骇dart-sass鍒扮増鏈�1.32.13</li> - <li>鍗囩骇core-js鍒版渶鏂扮増鏈�3.19.1</li> - <li>鍗囩骇jsencrypt鍒版渶鏂扮増鏈�3.2.1</li> - <li>鍗囩骇js-cookie鍒版渶鏂扮増鏈�3.0.1</li> - <li>鍗囩骇file-saver鍒版渶鏂扮増鏈�2.0.5</li> - <li>鍗囩骇sass-loader鍒版渶鏂扮増鏈�10.1.1</li> - <li>鍗囩骇element-ui鍒版渶鏂扮増鏈�2.15.6</li> - <li>鏂板sendGet鏃犲弬璇锋眰鏂规硶</li> - <li>绂佺敤el-tag缁勪欢鐨勬笎鍙樺姩鐢�</li> - <li>浠g爜鐢熸垚鐐瑰嚮棰勮閲嶇疆婵�娲籺ab</li> - <li>AjaxResult閲嶅啓put鏂规硶锛屼互鏂逛究閾惧紡璋冪敤</li> - <li>浼樺寲鐧诲綍/楠岃瘉鐮佽姹俬eaders涓嶈缃畉oken</li> - <li>浼樺寲鐢ㄦ埛涓汉淇℃伅鎺ュ彛闃叉淇敼鐢ㄦ埛鍚�</li> - <li>浼樺寲Cron琛ㄨ揪寮忕敓鎴愬櫒鍏抽棴鏃堕攢姣侀伩鍏嶇紦瀛�</li> - <li>浼樺寲娉ㄥ唽鎴愬姛鎻愮ず娑堟伅绫诲瀷success</li> - <li>浼樺寲aop璇硶锛屼娇鐢╯pring鑷姩娉ㄥ叆娉ㄨВ</li> - <li>浼樺寲璁板綍鐧诲綍淇℃伅锛岀Щ闄や笉蹇呰鐨勪慨鏀�</li> - <li>浼樺寲mybatis鍏ㄥ眬榛樿鐨勬墽琛屽櫒</li> - <li>浼樺寲Excel瀵煎叆鍥剧墖鍙兘鍑虹幇鐨勫紓甯�</li> - <li>淇浠g爜鐢熸垚妯℃澘涓诲瓙琛ㄥ垹闄ょ己灏戜簨鍔�</li> - <li>淇鏃ュ織璁板綍鍙兘鍑虹幇鐨勮浆鎹㈠紓甯�</li> - <li>淇浠g爜鐢熸垚澶嶉�夋瀛楀吀閬楁紡闂</li> - <li>淇鍏抽棴xss鍔熻兘瀵艰嚧鍙噸澶嶈RepeatableFilter澶辨晥</li> - <li>淇瀛楃涓叉棤娉曡鍙嶈浆涔夐棶棰�</li> - <li>淇鍚庣涓诲瓙琛ㄤ唬鐮佹ā鏉挎柟娉曞悕鐢熸垚閿欒闂</li> - <li>淇xss杩囨护鍚庢牸寮忓嚭鐜扮殑寮傚父</li> - <li>淇swagger娌℃湁鎸囧畾dataTypeClass瀵艰嚧鍚姩鍑虹幇warn鏃ュ織</li> - <li>鍏朵粬缁嗚妭浼樺寲</li> - </ol> - </el-collapse-item> - <el-collapse-item title="v3.7.0 - 2021-09-13"> - <ol> - <li>鍙傛暟绠$悊鏀寔閰嶇疆楠岃瘉鐮佸紑鍏�</li> - <li>鏂板鏄惁寮�鍚敤鎴锋敞鍐屽姛鑳�</li> - <li>瀹氭椂浠诲姟鏀寔鍦ㄧ嚎鐢熸垚cron琛ㄨ揪寮�</li> - <li>鑿滃崟绠$悊鏀寔閰嶇疆璺敱鍙傛暟</li> - <li>鏀寔鑷畾涔夋敞瑙e疄鐜版帴鍙i檺娴�</li> - <li>Excel娉ㄨВ鏀寔Image鍥剧墖瀵煎叆</li> - <li>鑷畾涔夊脊灞傛孩鍑烘粴鍔ㄦ牱寮�</li> - <li>鑷畾涔夊彲鎷栧姩寮圭獥瀹藉害鎸囦护</li> - <li>鑷畾涔夊彲鎷栧姩寮圭獥楂樺害鎸囦护</li> - <li>淇浠绘剰璐︽埛瓒婃潈闂</li> - <li>淇敼鏃舵鏌ョ敤鎴锋暟鎹潈闄愯寖鍥�</li> - <li>淇淇濆瓨閰嶇疆涓婚棰滆壊澶辨晥闂</li> - <li>鏂板鏆楄壊鑿滃崟椋庢牸涓婚</li> - <li>鑿滃崟&閮ㄩ棬鏂板灞曞紑/鎶樺彔鍔熻兘</li> - <li>椤电鏂板鍏抽棴宸︿晶&娣诲姞鍥炬爣</li> - <li>椤堕儴鑿滃崟鎺掗櫎闅愯棌鐨勯粯璁よ矾鐢�</li> - <li>椤堕儴鑿滃崟鍚屾绯荤粺涓婚鏍峰紡</li> - <li>璺宠浆璺敱楂樹寒鐩稿搴旂殑鑿滃崟鏍�</li> - <li>浠g爜鐢熸垚涓诲瓙琛ㄥ閫夎鏁版嵁</li> - <li>鏃ユ湡鑼冨洿鏀寔娣诲姞澶氱粍</li> - <li>鍗囩骇element-ui鍒版渶鏂扮増鏈�2.15.5</li> - <li>鍗囩骇oshi鍒版渶鏂扮増鏈瑅5.8.0</li> - <li>鍗囩骇commons.io鍒版渶鏂扮増鏈瑅2.11.0</li> - <li>瀹氭椂浠诲姟灞忚斀ldap杩滅▼璋冪敤</li> - <li>瀹氭椂浠诲姟灞忚斀http(s)杩滅▼璋冪敤</li> - <li>琛ュ厖瀹氭椂浠诲姟琛ㄥ瓧娈垫敞閲�</li> - <li>瀹氭椂浠诲姟瀵规鏌ュ紓甯歌繘琛屼簨鍔″洖婊�</li> - <li>鍚敤鐖堕儴闂ㄧ姸鎬佹帓闄ら《绾ц妭鐐�</li> - <li>瀵屾枃鏈柊澧炰笂浼犳枃浠跺ぇ灏忛檺鍒�</li> - <li>榛樿棣栭〉浣跨敤keep-alive缂撳瓨</li> - <li>淇敼浠g爜鐢熸垚瀛楀吀鍥炴樉鏍峰紡</li> - <li>鑷畾涔夊垎椤靛悎鐞嗗寲浼犲叆鍙傛暟</li> - <li>淇瀛楀吀缁勪欢鍊间负鏁村舰涓嶆樉绀洪棶棰�</li> - <li>淇瀹氭椂浠诲姟鏃ュ織鎵ц鐘舵�佹樉绀�</li> - <li>瑙掕壊&鑿滃崟鏂板瀛楁灞炴�ф彁绀轰俊鎭�</li> - <li>淇瑙掕壊鍒嗛厤鐢ㄦ埛椤甸潰鍙傛暟绫诲瀷閿欒鎻愰啋</li> - <li>浼樺寲甯冨眬璁剧疆鍔ㄧ敾鐗规晥</li> - <li>浼樺寲寮傚父澶勭悊淇℃伅</li> - <li>浼樺寲閿欒token瀵艰嚧鐨勮В鏋愬紓甯�</li> - <li>瀵嗙爜妗嗘柊澧炴樉绀哄垏鎹㈠瘑鐮佸浘鏍�</li> - <li>瀹氭椂浠诲姟鏂板鏇村鎿嶄綔</li> - <li>鏇村鎿嶄綔鎸夐挳娣诲姞鏉冮檺鎺у埗</li> - <li>瀵煎叆鐢ㄦ埛鏍峰紡浼樺寲</li> - <li>鎻愬彇閫氱敤鏂规硶鍒板熀绫绘帶鍒跺櫒</li> - <li>浼樺寲浣跨敤鏉冮檺宸ュ叿鑾峰彇鐢ㄦ埛淇℃伅</li> - <li>浼樺寲鐢ㄦ埛涓嶈兘鍒犻櫎鑷繁</li> - <li>浼樺寲XSS璺ㄧ珯鑴氭湰杩囨护</li> - <li>浼樺寲浠g爜鐢熸垚妯℃澘</li> - <li>楠岃瘉鐮侀粯璁�20s瓒呮椂</li> - <li>BLOB涓嬭浇鏃舵竻闄RL瀵硅薄寮曠敤</li> - <li>浠g爜鐢熸垚瀵煎叆琛ㄦ寜鍒涘缓鏃堕棿鎺掑簭</li> - <li>淇浠g爜鐢熸垚椤甸潰鏁版嵁缂栬緫淇濆瓨涔嬪悗鎬绘槸璺宠浆绗竴椤电殑闂</li> - <li>淇甯afari娴忚鍣ㄦ棤娉曟牸寮忓寲utc鏃ユ湡鏍煎紡yyyy-MM-dd'T'HH:mm:ss.SSS闂</li> - <li>澶氬浘涓婁紶缁勪欢绉婚櫎澶氫綑鐨刟pi鍦板潃&楠岃瘉澶辫触瀵艰嚧鍥剧墖鍒犻櫎闂&鏃犳硶鍒犻櫎鐩稿簲鍥剧墖淇</li> - <li>鍏朵粬缁嗚妭浼樺寲</li> - </ol> - </el-collapse-item> - <el-collapse-item title="v3.6.0 - 2021-07-12"> - <ol> - <li>瑙掕壊绠$悊鏂板鍒嗛厤鐢ㄦ埛鍔熻兘</li> - <li>鐢ㄦ埛绠$悊鏂板鍒嗛厤瑙掕壊鍔熻兘</li> - <li>鏃ュ織鍒楄〃鏀寔鎺掑簭鎿嶄綔</li> - <li>浼樺寲鍙傛暟&瀛楀吀缂撳瓨鎿嶄綔</li> - <li>绯荤粺甯冨眬閰嶇疆鏀寔鍔ㄦ�佹爣棰樺紑鍏�</li> - <li>鑿滃崟璺敱閰嶇疆鏀寔鍐呴摼璁块棶</li> - <li>榛樿璁块棶鍚庣棣栭〉鏂板鎻愮ず璇�</li> - <li>瀵屾枃鏈粯璁や笂浼犺繑鍥瀠rl绫诲瀷</li> - <li>鏂板鑷畾涔夊脊绐楁嫋鎷芥寚浠�</li> - <li>鍏ㄥ眬娉ㄥ唽甯哥敤閫氱敤缁勪欢</li> - <li>鍏ㄥ眬鎸傝浇瀛楀吀鏍囩缁勪欢</li> - <li>ImageUpload缁勪欢鏀寔澶氬浘鐗囦笂浼�</li> - <li>FileUpload缁勪欢鏀寔澶氭枃浠朵笂浼�</li> - <li>鏂囦欢涓婁紶缁勪欢娣诲姞鏁伴噺闄愬埗灞炴��</li> - <li>瀵屾枃鏈紪杈戠粍浠舵坊鍔犵被鍨嬪睘鎬�</li> - <li>瀵屾枃鏈粍浠跺伐鍏锋爮閰嶇疆瑙嗛</li> - <li>灏佽閫氱敤iframe缁勪欢</li> - <li>闄愬埗瓒呯骇绠$悊鍛樹笉鍏佽鎿嶄綔</li> - <li>鐢ㄦ埛淇℃伅闀垮害鏍¢獙闄愬埗</li> - <li>鍒嗛〉缁勪欢鏂板pagerCount灞炴��</li> - <li>娣诲姞bat鑴氭湰鎵ц搴旂敤</li> - <li>鍗囩骇oshi鍒版渶鏂扮増鏈瑅5.7.4</li> - <li>鍗囩骇element-ui鍒版渶鏂扮増鏈�2.15.2</li> - <li>鍗囩骇pagehelper鍒版渶鏂扮増1.3.1</li> - <li>鍗囩骇commons.io鍒版渶鏂扮増鏈瑅2.10.0</li> - <li>鍗囩骇commons.fileupload鍒版渶鏂扮増鏈瑅1.4</li> - <li>鍗囩骇swagger鍒版渶鏂扮増鏈瑅3.0.0</li> - <li>淇鍏抽棴confirm鎻愮ず妗嗘帶鍒跺彴鎶ラ敊闂</li> - <li>淇瀛樺湪鐨凷QL娉ㄥ叆婕忔礊闂</li> - <li>瀹氭椂浠诲姟灞忚斀rmi杩滅▼璋冪敤</li> - <li>淇鐢ㄦ埛鎼滅储鍒嗛〉鍙橀噺閿欒</li> - <li>淇瀵煎嚭瑙掕壊鏁版嵁鑼冨洿缈昏瘧缂哄皯浠呮湰浜�</li> - <li>淇琛ㄥ崟鏋勫缓閫夋嫨涓嬫媺閫夋嫨鎺у埗鍙版姤閿欓棶棰�</li> - <li>浼樺寲鍥剧墖宸ュ叿绫昏鍙栨枃浠�</li> - <li>鍏朵粬缁嗚妭浼樺寲</li> - </ol> - </el-collapse-item> - <el-collapse-item title="v3.5.0 - 2021-05-25"> - <ol> - <li>鏂板鑿滃崟瀵艰埅鏄剧ず椋庢牸TopNav锛坒alse涓哄乏渚у鑸彍鍗曪紝true涓洪《閮ㄥ鑸彍鍗曪級</li> - <li>甯冨眬璁剧疆鏀寔淇濆瓨&閲嶇疆閰嶇疆</li> - <li>淇鏍戣〃鏁版嵁鏄剧ず涓嶅叏&鍔犺浇鎱㈤棶棰�</li> - <li>鏂板IE娴忚鍣ㄧ増鏈繃浣庢彁绀洪〉闈�</li> - <li>鐢ㄦ埛鐧诲綍鍚庤褰曟渶鍚庣櫥褰旾P&鏃堕棿</li> - <li>椤甸潰瀵煎嚭鎸夐挳鐐瑰嚮涔嬪悗娣诲姞閬僵</li> - <li>瀵屾枃鏈紪杈戝櫒鏀寔鑷畾涔変笂浼犲湴鍧�</li> - <li>瀵屾枃鏈紪杈戠粍浠舵柊澧瀝eadOnly灞炴��</li> - <li>椤电TagsView鏂板鍏抽棴鍙充晶鍔熻兘</li> - <li>鏄鹃殣鍒楃粍浠跺姞杞藉垵濮嬮粯璁ら殣钘忓垪</li> - <li>鍏抽棴澶村儚涓婁紶绐楀彛杩樺師榛樿鍥剧墖</li> - <li>涓汉淇℃伅娣诲姞鎵嬫満&閭閲嶅楠岃瘉</li> - <li>浠g爜鐢熸垚妯℃澘瀵煎嚭鎸夐挳鐐瑰嚮鍚庢坊鍔犻伄缃�</li> - <li>浠g爜鐢熸垚妯℃澘鏍戣〃鎿嶄綔鍒楁坊鍔犳柊澧炴寜閽�</li> - <li>浠g爜鐢熸垚妯℃澘淇涓诲瓙琛ㄥ瓧娈甸噸鍚嶉棶棰�</li> - <li>鍗囩骇fastjson鍒版渶鏂扮増1.2.76</li> - <li>鍗囩骇druid鍒版渶鏂扮増鏈瑅1.2.6</li> - <li>鍗囩骇mybatis鍒版渶鏂扮増3.5.6 闃绘杩滅▼浠g爜鎵ц婕忔礊</li> - <li>鍗囩骇oshi鍒版渶鏂扮増鏈瑅5.6.0</li> - <li>velocity鍓旈櫎commons-collections鐗堟湰锛岄槻姝�3.2.1鐗堟湰鐨勫弽搴忓垪鍖栨紡娲�</li> - <li>鏁版嵁鐩戞帶椤甸粯璁よ处鎴峰瘑鐮侀槻姝㈣秺鏉冭闂�</li> - <li>淇firefox涓嬭〃鍗曟瀯寤烘嫋鎷戒細鏂版墦鍗′竴涓�夐」鍗�</li> - <li>淇鍚庣瀵煎叆琛ㄦ潈闄愭爣璇�</li> - <li>淇鍓嶇鎿嶄綔鏃ュ織&鐧诲綍鏃ュ織鏉冮檺鏍囪瘑</li> - <li>璁剧疆Redis閰嶇疆HashKey搴忓垪鍖�</li> - <li>鍒犻櫎鎿嶄綔鏃ュ織璁板綍淇℃伅</li> - <li>涓婁紶濯掍綋绫诲瀷娣诲姞瑙嗛鏍煎紡</li> - <li>淇璇锋眰褰㈠弬鏈紶鍊艰褰曟棩蹇楀紓甯搁棶棰�</li> - <li>浼樺寲xss鏍¢獙json璇锋眰鏉′欢</li> - <li>鏍戠骇缁撴瀯鏇存柊瀛愯妭鐐逛娇鐢╮eplaceFirst</li> - <li>浼樺寲ExcelUtil绌哄�煎鐞�</li> - <li>鏃ュ織璁板綍杩囨护BindingResult瀵硅薄锛岄槻姝㈠紓甯�</li> - <li>淇敼涓婚鍚巑ini绫诲瀷鎸夐挳鏃犳晥闂</li> - <li>浼樺寲閫氱敤涓嬭浇瀹屾垚鍚庡垹闄よ妭鐐�</li> - <li>閫氱敤Controller娣诲姞鍝嶅簲杩斿洖娑堟伅</li> - <li>鍏朵粬缁嗚妭浼樺寲</li> - </ol> - </el-collapse-item> - <el-collapse-item title="v3.4.0 - 2021-02-22"> - <ol> - <li>浠g爜鐢熸垚妯℃澘鏀寔涓诲瓙琛�</li> - <li>琛ㄦ牸鍙充晶宸ュ叿鏍忕粍浠舵敮鎸佹樉闅愬垪</li> - <li>鍥剧墖缁勪欢娣诲姞棰勮&绉婚櫎鍔熻兘</li> - <li>Excel娉ㄨВ鏀寔Image鍥剧墖瀵煎嚭</li> - <li>鎿嶄綔鎸夐挳缁勮皟鏁翠负鏈寸礌鎸夐挳鏍峰紡</li> - <li>浠g爜鐢熸垚鏀寔鏂囦欢涓婁紶缁勪欢</li> - <li>浠g爜鐢熸垚鏃ユ湡鎺т欢鍖哄垎鑼冨洿</li> - <li>浠g爜鐢熸垚鏁版嵁搴撴枃鏈被鍨嬬敓鎴愯〃鍗曟枃鏈煙</li> - <li>鐢ㄦ埛鎵嬫満閭&鑿滃崟缁勪欢淇敼鍏佽绌哄瓧绗︿覆</li> - <li>鍗囩骇SpringBoot鍒版渶鏂扮増鏈�2.2.13 鎻愬崌鍚姩閫熷害</li> - <li>鍗囩骇druid鍒版渶鏂扮増鏈瑅1.2.4</li> - <li>鍗囩骇fastjson鍒版渶鏂扮増1.2.75</li> - <li>鍗囩骇element-ui鍒版渶鏂扮増鏈�2.15.0</li> - <li>淇IE11娴忚鍣ㄦ姤閿欓棶棰�</li> - <li>浼樺寲澶氱骇鑿滃崟涔嬮棿鍒囨崲鏃犳硶缂撳瓨鐨勯棶棰�</li> - <li>淇鍥涚骇鑿滃崟鏃犳硶鏄剧ず闂</li> - <li>淇渚ц竟鏍忛潤鎬佽矾鐢变涪澶遍棶棰�</li> - <li>淇瑙掕壊绠$悊-缂栬緫瑙掕壊-鍔熻兘鏉冮檺鏄剧ず寮傚父</li> - <li>閰嶇疆鏂囦欢鏂板redis鏁版嵁搴撶储寮曞睘鎬�</li> - <li>鏉冮檺宸ュ叿绫诲鍔燼dmin鍒ゆ柇</li> - <li>瑙掕壊闈炶嚜瀹氫箟鏉冮檺鑼冨洿娓呯┖閫夋嫨鍊�</li> - <li>淇瀵煎叆鏁版嵁涓鸿礋娴偣鏁版椂涓㈠け绮惧害闂</li> - <li>绉婚櫎path-to-regexp姝e垯鍖归厤鎻掍欢</li> - <li>淇鐢熸垚鏍戣〃浠g爜寮傚父</li> - <li>淇敼ip瀛楁闀垮害闃叉ipv6鍦板潃闀垮害涓嶅</li> - <li>闃叉get璇锋眰鍙傛暟鍊间负false鎴�0绛夌壒娈婂�间細瀵艰嚧鏃犳硶姝g‘鐨勪紶鍙�</li> - <li>鐧诲綍鍚巔ush娣诲姞catch闃叉鍑虹幇妫�鏌ラ敊璇�</li> - <li>鍏朵粬缁嗚妭浼樺寲</li> - </ol> - </el-collapse-item> - <el-collapse-item title="v3.3.0 - 2020-12-14"> - <ol> - <li>鏂板缂撳瓨鐩戞帶鍔熻兘</li> - <li>鏀寔涓婚椋庢牸閰嶇疆</li> - <li>淇澶氱骇鑿滃崟涔嬮棿鍒囨崲鏃犳硶缂撳瓨鐨勯棶棰�</li> - <li>澶氱骇鑿滃崟鑷姩閰嶇疆缁勪欢</li> - <li>浠g爜鐢熸垚棰勮鏀寔楂樹寒鏄剧ず</li> - <li>鏀寔Get璇锋眰鏄犲皠Params鍙傛暟</li> - <li>鍒犻櫎鐢ㄦ埛鍜岃鑹茶В缁戝叧鑱�</li> - <li>鍘婚櫎鐢ㄦ埛鎵嬫満閭閮ㄩ棬蹇呭~楠岃瘉</li> - <li>Excel鏀寔娉ㄨВalign瀵归綈鏂瑰紡</li> - <li>Excel鏀寔瀵煎叆Boolean鍨嬫暟鎹�</li> - <li>浼樺寲澶村儚鏍峰紡锛岄紶鏍囩Щ鍏ユ偓鍋滈伄缃�</li> - <li>浠g爜鐢熸垚棰勮鎻愪緵婊氬姩鏈哄埗</li> - <li>浠g爜鐢熸垚鍒犻櫎澶氫綑鐨勬暟瀛梖loat绫诲瀷</li> - <li>淇杞崲瀛楃涓茬殑鐩爣瀛楃闆嗗睘鎬�</li> - <li>鍥炴樉鏁版嵁瀛楀吀闃叉绌哄�兼姤閿�</li> - <li>鏃ュ織璁板綍澧炲姞杩囨护澶氭枃浠跺満鏅�</li> - <li>淇敼缂撳瓨Set鏂规硶鍙兘瀵艰嚧宓屽鐨勯棶棰�</li> - <li>绉婚櫎鍓嶇涓�浜涘浣欑殑渚濊禆</li> - <li>闃叉瀹夊叏鎵弿YUI鍑虹幇鐨勯闄╂彁绀�</li> - <li>淇敼node-sass涓篸art-sass</li> - <li>鍗囩骇SpringBoot鍒版渶鏂扮増鏈�2.1.18</li> - <li>鍗囩骇poi鍒版渶鏂扮増鏈�4.1.2</li> - <li>鍗囩骇oshi鍒版渶鏂扮増鏈瑅5.3.6</li> - <li>鍗囩骇bitwalker鍒版渶鏂扮増鏈�1.21</li> - <li>鍗囩骇axios鍒版渶鏂扮増鏈�0.21.0</li> - <li>鍗囩骇element-ui鍒版渶鏂扮増鏈�2.14.1</li> - <li>鍗囩骇vue鍒版渶鏂扮増鏈�2.6.12</li> - <li>鍗囩骇vuex鍒版渶鏂扮増鏈�3.6.0</li> - <li>鍗囩骇vue-cli鍒扮増鏈�4.5.9</li> - <li>鍗囩骇vue-router鍒版渶鏂扮増鏈�3.4.9</li> - <li>鍗囩骇vue-cli鍒版渶鏂扮増鏈�4.4.6</li> - <li>鍗囩骇vue-cropper鍒版渶鏂扮増鏈�0.5.5</li> - <li>鍗囩骇clipboard鍒版渶鏂扮増鏈�2.0.6</li> - <li>鍗囩骇core-js鍒版渶鏂扮増鏈�3.8.1</li> - <li>鍗囩骇echarts鍒版渶鏂扮増鏈�4.9.0</li> - <li>鍗囩骇file-saver鍒版渶鏂扮増鏈�2.0.4</li> - <li>鍗囩骇fuse.js鍒版渶鏂扮増鏈�6.4.3</li> - <li>鍗囩骇js-beautify鍒版渶鏂扮増鏈�1.13.0</li> - <li>鍗囩骇js-cookie鍒版渶鏂扮増鏈�2.2.1</li> - <li>鍗囩骇path-to-regexp鍒版渶鏂扮増鏈�6.2.0</li> - <li>鍗囩骇quill鍒版渶鏂扮増鏈�1.3.7</li> - <li>鍗囩骇screenfull鍒版渶鏂扮増鏈�5.0.2</li> - <li>鍗囩骇sortablejs鍒版渶鏂扮増鏈�1.10.2</li> - <li>鍗囩骇vuedraggable鍒版渶鏂扮増鏈�2.24.3</li> - <li>鍗囩骇chalk鍒版渶鏂扮増鏈�4.1.0</li> - <li>鍗囩骇eslint鍒版渶鏂扮増鏈�7.15.0</li> - <li>鍗囩骇eslint-plugin-vue鍒版渶鏂扮増鏈�7.2.0</li> - <li>鍗囩骇lint-staged鍒版渶鏂扮増鏈�10.5.3</li> - <li>鍗囩骇runjs鍒版渶鏂扮増鏈�4.4.2</li> - <li>鍗囩骇sass-loader鍒版渶鏂扮増鏈�10.1.0</li> - <li>鍗囩骇script-ext-html-webpack-plugin鍒版渶鏂扮増鏈�2.1.5</li> - <li>鍗囩骇svg-sprite-loader鍒版渶鏂扮増鏈�5.1.1</li> - <li>鍗囩骇vue-template-compiler鍒版渶鏂扮増鏈�2.6.12</li> - <li>鍏朵粬缁嗚妭浼樺寲</li> - </ol> - </el-collapse-item> - <el-collapse-item title="v3.2.1 - 2020-11-18"> - <ol> - <li>闃绘浠绘剰鏂囦欢涓嬭浇婕忔礊</li> - <li>浠g爜鐢熸垚鏀寔涓婁紶鎺т欢</li> - <li>鏂板鍥剧墖涓婁紶缁勪欢</li> - <li>璋冩暣榛樿棣栭〉</li> - <li>鍗囩骇druid鍒版渶鏂扮増鏈瑅1.2.2</li> - <li>mapperLocations閰嶇疆鏀寔鍒嗛殧绗�</li> - <li>鏉冮檺淇℃伅璋冩暣</li> - <li>璋冩暣sql榛樿鏃堕棿</li> - <li>瑙e喅浠g爜鐢熸垚娌℃湁bit绫诲瀷鐨勯棶棰�</li> - <li>鍗囩骇pagehelper鍒版渶鏂扮増1.3.0</li> - </ol> - </el-collapse-item> - <el-collapse-item title="v3.2.0 - 2020-10-10"> - <ol> - <li>鍗囩骇springboot鐗堟湰鍒�2.1.17 鎻愬崌瀹夊叏鎬�</li> - <li>鍗囩骇oshi鍒版渶鏂扮増鏈瑅5.2.5</li> - <li>鍗囩骇druid鍒版渶鏂扮増鏈瑅1.2.1</li> - <li>鍗囩骇jjwt鍒扮増鏈�0.9.1</li> - <li>鍗囩骇fastjson鍒版渶鏂扮増1.2.74</li> - <li>淇敼sass涓簄ode-sass锛岄伩鍏峞l-icon鍥炬爣涔辩爜</li> - <li>浠g爜鐢熸垚鏀寔鍚屾鏁版嵁搴�</li> - <li>浠g爜鐢熸垚鏀寔瀵屾枃鏈帶浠�</li> - <li>浠g爜鐢熸垚椤甸潰鏃朵笉蹇界暐remark灞炴��</li> - <li>浠g爜鐢熸垚娣诲姞select蹇呭~閫夐」</li> - <li>Excel瀵煎嚭绫诲瀷NUMERIC鏀寔绮惧害娴偣绫诲瀷</li> - <li>Excel瀵煎嚭targetAttr浼樺寲鑾峰彇鍊硷紝闃叉get鏂规硶涓嶈鑼�</li> - <li>Excel娉ㄨВ鏀寔鑷姩缁熻鏁版嵁鎬诲拰</li> - <li>Excel娉ㄨВ鏀寔璁剧疆BigDecimal绮惧害&鑸嶅叆瑙勫垯</li> - <li>鑿滃崟&鏁版嵁鏉冮檺鏂板锛堝睍寮�/鎶樺彔 鍏ㄩ��/鍏ㄤ笉閫� 鐖跺瓙鑱斿姩锛�</li> - <li>鍏佽鐢ㄦ埛鍒嗛厤鍒伴儴闂ㄧ埗鑺傜偣</li> - <li>鑿滃崟鏂板鏄惁缂撳瓨keep-alive</li> - <li>琛ㄦ牸鎿嶄綔鍒楅棿璺濊皟鏁�</li> - <li>闄愬埗绯荤粺鍐呯疆鍙傛暟涓嶅厑璁稿垹闄�</li> - <li>瀵屾枃鏈粍浠朵紭鍖栵紝鏀寔鑷畾涔夐珮搴�&鍥剧墖鍐茬獊闂</li> - <li>瀵屾枃鏈伐鍏锋爮鏍峰紡瀵归綈</li> - <li>瀵煎叆excel鏁村舰鍊兼牎楠屼紭鍖�</li> - <li>淇椤电鍏抽棴鎵�鏈夋椂鍥哄畾鏍囩璺敱涓嶅埛鏂伴棶棰�</li> - <li>琛ㄥ崟鏋勫缓甯冨眬鍨嬬粍浠舵柊澧炴寜閽�</li> - <li>宸︿晶鑿滃崟鏂囧瓧杩囬暱鏄剧ず鐪佺暐鍙�</li> - <li>淇鏍硅妭鐐逛负瀛愰儴闂ㄦ椂锛屾爲鐘剁粨鏋勬樉绀洪棶棰�</li> - <li>淇璋冪敤鐩爣瀛楃涓叉渶澶ч暱搴�</li> - <li>淇鑿滃崟鎻愮ず淇℃伅閿欒</li> - <li>淇瀹氭椂浠诲姟鎵ц涓�娆℃潈闄愭爣璇�</li> - <li>淇鏁版嵁搴撳瓧绗︿覆绫诲瀷nvarchar</li> - <li>浼樺寲閫掑綊瀛愯妭鐐�</li> - <li>浼樺寲鏁版嵁鏉冮檺鍒ゆ柇</li> - <li>鍏朵粬缁嗚妭浼樺寲</li> - </ol> - </el-collapse-item> - - <el-collapse-item title="v3.1.0 - 2020-08-13"> - <ol> - <li>琛ㄦ牸宸ュ叿鏍忓彸渚ф坊鍔犲埛鏂�&鏄鹃殣鏌ヨ缁勪欢</li> - <li>鍚庣鏀寔CORS璺ㄥ煙璇锋眰</li> - <li>浠g爜鐢熸垚鏀寔閫夋嫨涓婄骇鑿滃崟</li> - <li>浠g爜鐢熸垚鏀寔鑷畾涔夎矾寰�</li> - <li>浠g爜鐢熸垚鏀寔澶嶉�夋</li> - <li>Excel瀵煎嚭瀵煎叆鏀寔dictType瀛楀吀绫诲瀷</li> - <li>Excel鏀寔鍒嗗壊瀛楃涓茬粍鍐呭</li> - <li>楠岃瘉鐮佺被鍨嬫敮鎸侊紙鏁扮粍璁$畻銆佸瓧绗﹂獙璇侊級</li> - <li>鍗囩骇vue-cli鐗堟湰鍒�4.4.4</li> - <li>淇敼 node-sass 涓� dart-sass</li> - <li>琛ㄥ崟绫诲瀷涓篒nteger/Long璁剧疆鏁村舰榛樿鍊�</li> - <li>浠g爜鐢熸垚鍣ㄩ粯璁apper璺緞涓庨粯璁apperScan璺緞涓嶄竴鑷�</li> - <li>浼樺寲闃查噸澶嶆彁浜ゆ嫤鎴櫒</li> - <li>浼樺寲涓婄骇鑿滃崟涓嶈兘閫夋嫨鑷繁</li> - <li>淇瑙掕壊鐨勬潈闄愬垎閰嶅悗锛屾湭瀹炴椂鐢熸晥闂</li> - <li>淇鍦ㄧ嚎鐢ㄦ埛鏃ュ織璁板綍绫诲瀷</li> - <li>淇瀵屾枃鏈┖鏍煎拰缂╄繘淇濆瓨鍚庝笉鐢熸晥闂</li> - <li>淇鍦ㄧ嚎鐢ㄦ埛鍒ゆ柇閫昏緫</li> - <li>鍞竴闄愬埗鏉′欢鍙繑鍥炲崟鏉℃暟鎹�</li> - <li>娣诲姞鑾峰彇褰撳墠鐨勭幆澧冮厤缃柟娉�</li> - <li>瓒呮椂鐧诲綍鍚庨〉闈㈣烦杞埌棣栭〉</li> - <li>鍏ㄥ眬寮傚父鐘舵�佹眽鍖栨嫤鎴鐞�</li> - <li>HTML杩囨护鍣ㄦ敼涓哄皢html杞箟</li> - <li>妫�鏌ュ瓧绗︽敮鎸佸皬鏁扮偣&闄嶇骇鏀规垚寮傚父鎻愰啋</li> - <li>鍏朵粬缁嗚妭浼樺寲</li> - </ol> - </el-collapse-item> - - <el-collapse-item title="v3.0.0 - 2020-07-20"> - <ol> - <li>鍗曞簲鐢ㄨ皟鏁翠负澶氭ā鍧楅」鐩�</li> - <li>鍗囩骇element-ui鐗堟湰鍒�2.13.2</li> - <li>鍒犻櫎babel锛屾彁楂樼紪璇戦�熷害銆�</li> - <li>鏂板鑿滃崟榛樿涓荤被鐩�</li> - <li>缂栫爜鏂囦欢鍚嶄慨鏀逛负uuid鏂瑰紡</li> - <li>瀹氭椂浠诲姟cron琛ㄨ揪寮忛獙璇�</li> - <li>瑙掕壊鏉冮檺淇敼鏃跺凡鏈夋潈闄愭湭鑷姩鍕鹃�夊紓甯镐慨澶�</li> - <li>闃叉鍒囨崲鏉冮檺鐢ㄦ埛鍚庣櫥褰曞嚭鐜�404</li> - <li>Excel鏀寔sort瀵煎嚭鎺掑簭</li> - <li>鍒涘缓鐢ㄦ埛涓嶅厑璁搁�夋嫨瓒呯骇绠$悊鍛樿鑹�</li> - <li>淇浠g爜鐢熸垚瀵煎叆琛ㄧ粨鏋勫嚭鐜板紓甯搁〉闈笉鎻愰啋闂</li> - <li>淇浠g爜鐢熸垚鐐瑰嚮澶氭琛ㄤ慨鏀规暟鎹笉鍙樺寲鐨勯棶棰�</li> - <li>淇澶村儚涓婁紶鎴愬姛浜屾鎵撳紑鏃犳硶鏀瑰彉瑁佸壀妗嗗ぇ灏忓拰浣嶇疆闂</li> - <li>淇甯冨眬涓簊mall鑰卪ini鐢ㄦ埛琛ㄥ崟鏄剧ず閿欎綅闂</li> - <li>淇鐑儴缃插鑷寸殑寮烘崲寮傚父闂</li> - <li>淇敼鐢ㄦ埛绠$悊澶嶉�夋瀹藉害锛岄槻姝㈤儴鍒嗘祻瑙堝櫒鍑虹幇鐪佺暐鍙�</li> - <li>IpUtils宸ュ叿锛屾竻闄ss鐗规畩瀛楃锛岄槻姝ff娉ㄥ叆鏀诲嚮</li> - <li>鐢熸垚domain 濡傛灉鏄诞鐐瑰瀷 缁熶竴鐢˙igDecimal</li> - <li>瀹氭椂浠诲姟璋冩暣label-width锛岄槻姝㈤儴缃插嚭鐜伴敊浣�</li> - <li>璋冩暣琛ㄥご鍥哄畾鍒楅粯璁ゆ牱寮�</li> - <li>浠g爜鐢熸垚妯℃澘璋冩暣锛屽瓧娈典负String骞朵笖蹇呭~鍒欏姞绌轰覆鏉′欢</li> - <li>浠g爜鐢熸垚瀛楀吀Integer/Long浣跨敤parseInt</li> - <li> - 淇dict_sort涓嶅彲update涓�0鐨勯棶棰�&鏌ヨ杩斿洖澧炲姞dict_sort鍗囧簭鎺掑簭 - </li> - <li>淇宀椾綅瀵煎嚭鏉冮檺娉ㄨВ</li> - <li>绂佹鍔犲瘑瀵嗘枃杩斿洖鍓嶇</li> - <li>淇浠g爜鐢熸垚椤甸潰涓殑鏌ヨ鏉′欢鍒涘缓鏃堕棿鏈敓鏁堢殑闂</li> - <li>淇棣栭〉鎼滅储鑿滃崟澶栭摼鏃犳硶鐐瑰嚮璺宠浆闂</li> - <li>淇鑿滃崟绠$悊閫夋嫨鍥炬爣锛宐ackspace鍒犻櫎鏃朵笉杩囨护鏁版嵁</li> - <li>鐢ㄦ埛绠$悊閮ㄩ棬鍒嗘敮鑺傜偣涓嶅彲妫�鏌�&鏄剧ず璁℃暟</li> - <li>鏁版嵁鑼冨洿杩囨护灞炴�ц皟鏁�</li> - <li>鍏朵粬缁嗚妭浼樺寲</li> - </ol> - </el-collapse-item> - - <el-collapse-item title="v2.3.0 - 2020-06-01"> - <ol> - <li>鍗囩骇fastjson鍒版渶鏂扮増1.2.70 淇楂樺嵄瀹夊叏婕忔礊</li> - <li>dev鍚姩榛樿鎵撳紑娴忚鍣�</li> - <li>vue-cli浣跨敤榛樿source-map</li> - <li>slidebar eslint鎶ラ敊浼樺寲</li> - <li>褰搕ags-view婊氬姩鍏抽棴鍙抽敭鑿滃崟</li> - <li>瀛楀吀绠$悊娣诲姞缂撳瓨璇诲彇</li> - <li>鍙傛暟绠$悊鏀寔缂撳瓨鎿嶄綔</li> - <li>鏀寔涓�绾ц彍鍗曪紙鍜屼富椤靛悓绾э級鍦╩ain鍖哄煙鏄剧ず</li> - <li>闄愬埗澶栭摼鍦板潃蹇呴』浠ttp(s)寮�澶�</li> - <li>tagview & sidebar 涓婚棰滆壊涓巈lement ui(鍏ㄥ眬)鍚屾</li> - <li>淇敼鏁版嵁婧愮被鍨嬩紭鍏堢骇锛屽厛鏍规嵁鏂规硶锛屽啀鏍规嵁绫�</li> - <li>鏀寔鏄惁闇�瑕佽缃畉oken灞炴�э紝鑷畾涔夎繑鍥炵爜娑堟伅銆�</li> - <li>swagger璇锋眰鍓嶇紑鍔犲叆閰嶇疆銆�</li> - <li>鐧诲綍鍦扮偣璁剧疆鍐呭杩囬暱鍒欓殣钘忔樉绀�</li> - <li>淇瀹氭椂浠诲姟鎵ц涓�娆℃寜閽悗涓嶆彁绀烘秷鎭棶棰�</li> - <li>淇敼涓婄骇閮ㄩ棬锛堥�夋嫨椤规帓闄ゆ湰韬拰涓嬬骇锛�</li> - <li>閫氱敤http鍙戦�佹柟娉曞鍔犲弬鏁� contentType 缂栫爜绫诲瀷</li> - <li>鏇存崲IP鍦板潃鏌ヨ鎺ュ彛</li> - <li>淇椤电鍙橀噺undefined</li> - <li>娣诲姞鏍¢獙閮ㄩ棬鍖呭惈鏈仠鐢ㄧ殑瀛愰儴闂�</li> - <li>淇敼瀹氭椂浠诲姟璇︽儏涓嬫鎵ц鏃堕棿鏃ユ湡鏄剧ず閿欒</li> - <li>瑙掕壊绠$悊鏌ヨ璁剧疆榛樿鎺掑簭瀛楁</li> - <li>swagger娣诲姞enable鍙傛暟鎺у埗鏄惁鍚敤</li> - <li>鍙json绫诲瀷璇锋眰鏋勫缓鍙噸澶嶈鍙杋nputStream鐨剅equest</li> - <li>淇敼浠g爜鐢熸垚瀛楀吀瀛楁int绫诲瀷娌℃湁鑷姩閫変腑闂</li> - <li>vuex鐢ㄦ埛鍚嶅彇鍊间慨姝�</li> - <li>琛ㄦ牸鏍戞ā鏉垮幓鎺夊浣欑殑)</li> - <li>浠g爜鐢熸垚搴忓彿淇</li> - <li>鍏ㄥ睆鎯呭喌涓嬩笉璋冩暣涓婂杈硅窛</li> - <li>浠g爜鐢熸垚Date瀛楁娣诲姞榛樿鏍煎紡</li> - <li>鐢ㄦ埛绠$悊瑙掕壊閫夋嫨鏉冮檺鎺у埗</li> - <li>淇璺敱鎳掑姞杞芥姤閿欓棶棰�</li> - <li>妯℃澘sql.vm娣诲姞鑿滃崟鐘舵��</li> - <li>璁剧疆鐢ㄦ埛鍚嶇О涓嶈兘淇敼</li> - <li>dialog娣诲姞append-to-body灞炴�э紝闃叉ie閬僵</li> - <li>鑿滃崟鍖哄垎鐘舵�佸拰鏄剧ず闅愯棌鍔熻兘</li> - <li>鍗囩骇fastjson鍒版渶鏂扮増1.2.68 淇瀹夊叏鍔犲浐</li> - <li>淇浠g爜鐢熸垚濡傛灉閫夋嫨瀛楀吀绫诲瀷缂哄け閫楀彿闂</li> - <li>鐧诲綍璇锋眰params鏇存崲涓篸ata锛岄槻姝㈡毚闇瞮rl</li> - <li>鏃ュ織杩斿洖鏃堕棿鏍煎紡澶勭悊</li> - <li>娣诲姞handle鎺у埗鍏佽鎷栧姩鐨勫厓绱�</li> - <li>甯冨眬璁剧疆鐐瑰嚮鎵╁ぇ鑼冨洿</li> - <li>浠g爜鐢熸垚鍒楀睘鎬ф帓搴忔煡璇�</li> - <li>浠g爜鐢熸垚鍒楁敮鎸佹嫋鍔ㄦ帓搴�</li> - <li>淇鏃堕棿鏍煎紡涓嶆敮鎸乮os闂</li> - <li>琛ㄥ崟鏋勫缓娣诲姞鐖剁骇class锛岄槻姝㈠啿绐�</li> - <li>瀹氭椂浠诲姟骞跺彂灞炴�т慨姝�</li> - <li>瑙掕壊绂佺敤&鑿滃崟闅愯棌涓嶆煡璇㈡潈闄�</li> - <li>鍏朵粬缁嗚妭浼樺寲</li> - </ol> - </el-collapse-item> - - <el-collapse-item title="v2.2.0 - 2020-03-18"> - <ol> - <li>绯荤粺鐩戞帶鏂板瀹氭椂浠诲姟鍔熻兘</li> - <li>娣诲姞涓�涓墦鍖匴eb宸ョ▼bat</li> - <li>淇椤电榧犳爣婊氳疆鎸変笅鐨勬椂鍊欙紝鍙互鍏抽棴涓嶅彲鍏抽棴鐨則ag</li> - <li>淇鐐瑰嚮閫�鍑虹櫥褰曟湁鏃朵細鏃犳彁绀洪棶棰�</li> - <li>淇闃查噸澶嶆彁浜ゆ敞瑙f棤鏁堥棶棰�</li> - <li>淇閫氱煡鍏憡鎵归噺鍒犻櫎寮傚父闂</li> - <li>娣诲姞鑿滃崟鏃惰矾鐢卞湴鍧�蹇呭~闄愬埗</li> - <li>浠g爜鐢熸垚瀛楁鎻忚堪鍙紪杈�</li> - <li>淇鐢ㄦ埛淇敼涓汉淇℃伅瀵艰嚧缂撳瓨涓嶈繃鏈熼棶棰�</li> - <li>涓汉淇℃伅鍒涘缓鏃堕棿鑾峰彇姝g‘灞炴�у��</li> - <li>鎿嶄綔鏃ュ織璇︾粏鏄剧ず姝g‘绫诲瀷</li> - <li>瀵煎叆琛ㄥ崟鍑昏鏁版嵁鏃堕�変腑瀵瑰簲鐨勫閫夋</li> - <li>鎵归噺鏇挎崲琛ㄥ墠缂�閫昏緫璋冩暣</li> - <li>鍥哄畾閲嶅畾鍚戣矾寰勮〃杈惧紡</li> - <li>鍗囩骇element-ui鐗堟湰鍒�2.13.0</li> - <li>鎿嶄綔鏃ュ織鎺掑簭璋冩暣</li> - <li>淇charts鍒囨崲渚ц竟鏍忔垨鑰呯缉鏀剧獥鍙f樉绀篵ug</li> - <li>鍏朵粬缁嗚妭浼樺寲</li> - </ol> - </el-collapse-item> - - <el-collapse-item title="v2.1.0 - 2020-02-24"> - <ol> - <li>鏂板琛ㄥ崟鏋勫缓</li> - <li>浠g爜鐢熸垚鏀寔鏍戣〃缁撴瀯</li> - <li>鏂板鐢ㄦ埛瀵煎叆</li> - <li>淇鍔ㄦ�佸姞杞借矾鐢遍〉闈㈠埛鏂伴棶棰�</li> - <li>淇鍦板潃寮�鍏虫棤鏁堥棶棰�</li> - <li>姹夊寲閿欒鎻愮ず椤甸潰</li> - <li>浠g爜鐢熸垚宸茬煡闂淇敼</li> - <li>淇澶氭暟鎹簮涓嬮厤缃叧闂嚭鐜板紓甯稿鐞�</li> - <li>娣诲姞HTML杩囨护鍣紝鐢ㄤ簬鍘婚櫎XSS婕忔礊闅愭偅</li> - <li>淇涓婁紶澶村儚鎺у埗鍙板嚭鐜板紓甯�</li> - <li>淇敼鐢ㄦ埛绠$悊鍒嗛〉涓嶆纭殑闂</li> - <li>淇楠岃瘉鐮佽褰曟彁绀洪敊璇�</li> - <li>淇request.js缂哄皯Message寮曠敤</li> - <li>淇琛ㄦ牸鏃堕棿涓虹┖鍑虹幇鐨勫紓甯�</li> - <li>娣诲姞Jackson鏃ユ湡鍙嶅簭鍒楀寲鏃跺尯閰嶇疆</li> - <li>璋冩暣鏍规嵁鐢ㄦ埛鏉冮檺鍔犺浇鑿滃崟鏁版嵁鏍戝舰缁撴瀯</li> - <li>璋冩暣鎴愬姛鐧诲綍涓嶆仮澶嶆寜閽紝闃叉澶氭鐐瑰嚮</li> - <li>淇敼鐢ㄦ埛涓汉璧勬枡鍚屾缂撳瓨淇℃伅</li> - <li>淇椤甸潰鍚屾椂鍑虹幇el-upload鍜孍ditor涓嶆樉绀哄鐞�</li> - <li>淇鍦ㄨ鑹茬鐞嗛〉淇敼鑿滃崟鏉冮檺鍋跺皵鏈�変腑闂</li> - <li>閰嶇疆鏂囦欢鏂板redis瀵嗙爜灞炴��</li> - <li>璁剧疆mybatis鍏ㄥ眬鐨勯厤缃枃浠�</li> - <li>鍏朵粬缁嗚妭浼樺寲</li> - </ol> - </el-collapse-item> - - <el-collapse-item title="v2.0.0 - 2019-12-02"> - <ol> - <li>鏂板浠g爜鐢熸垚</li> - <li>鏂板@RepeatSubmit娉ㄨВ锛岄槻姝㈤噸澶嶆彁浜�</li> - <li>鏂板鑿滃崟涓荤洰褰曟坊鍔�/鍒犻櫎鎿嶄綔</li> - <li>鏃ュ織璁板綍杩囨护鐗规畩瀵硅薄锛岄槻姝㈣浆鎹㈠紓甯�</li> - <li>淇敼浠g爜鐢熸垚璺敱鑴氭湰閿欒</li> - <li>鐢ㄦ埛涓婁紶澶村儚瀹炴椂鍚屾缂撳瓨锛屾棤闇�閲嶆柊鐧诲綍</li> - <li>璋冩暣鍒囨崲椤电鍚庝笉閲嶆柊鍔犺浇鏁版嵁</li> - <li>娣诲姞jsencrypt瀹炵幇鍙傛暟鐨勫墠绔姞瀵�</li> - <li>绯荤粺閫�鍑哄垹闄ょ敤鎴风紦瀛樿褰�</li> - <li>鍏朵粬缁嗚妭浼樺寲</li> - </ol> - </el-collapse-item> - <el-collapse-item title="v1.1.0 - 2019-11-11"> - <ol> - <li>鏂板鍦ㄧ嚎鐢ㄦ埛绠$悊</li> - <li>鏂板鎸夐挳缁勫姛鑳藉疄鐜帮紙鎵归噺鍒犻櫎銆佸鍑恒�佹竻绌猴級</li> - <li>鏂板鏌ヨ鏉′欢閲嶇疆鎸夐挳</li> - <li>鏂板Swagger鍏ㄥ眬Token閰嶇疆</li> - <li>鏂板鍚庣鍙傛暟鏍¢獙</li> - <li>淇瀛楀吀绠$悊椤甸潰鐨勬棩鏈熸煡璇㈠紓甯�</li> - <li>淇敼鏃堕棿鍑芥暟鍛藉悕闃叉鍐茬獊</li> - <li>鍘婚櫎鑿滃崟涓婄骇鏍¢獙锛岄粯璁や负椤剁骇</li> - <li>淇鐢ㄦ埛瀵嗙爜鏃犳硶淇敼闂</li> - <li>淇鑿滃崟绫诲瀷涓烘寜閽椂涓嶆樉绀烘潈闄愭爣璇�</li> - <li>鍏朵粬缁嗚妭浼樺寲</li> - </ol> - </el-collapse-item> - <el-collapse-item title="v1.0.0 - 2019-10-08"> - <ol> - <li>鑻ヤ緷鍓嶅悗绔垎绂荤郴缁熸寮忓彂甯�</li> - </ol> - </el-collapse-item> - </el-collapse> - </el-card> - </el-col> - <el-col :xs="24" :sm="24" :md="12" :lg="8"> - <el-card class="update-log"> - <template v-slot:header> - <div class="clearfix"> - <span>鎹愯禒鏀寔</span> - </div> - </template> - <div class="body"> - <img - src="@/assets/images/pay.png" - alt="donate" - style="width:100%" - /> - <span style="display: inline-block; height: 30px; line-height: 30px" - >浣犲彲浠ヨ浣滆�呭枬鏉挅鍟¤〃绀洪紦鍔�</span - > - </div> - </el-card> - </el-col> - </el-row> + <div class="app-container"> + </div> </template> <script setup name="Index"> -const version = ref('3.8.9') -function goTarget(url) { - window.open(url, '__blank') -} </script> <style scoped lang="scss"> -.home { - blockquote { - padding: 10px 20px; - margin: 0 0 20px; - font-size: 17.5px; - border-left: 5px solid #eee; - } - hr { - margin-top: 20px; - margin-bottom: 20px; - border: 0; - border-top: 1px solid #eee; - } - .col-item { - margin-bottom: 20px; - } - ul { - padding: 0; - margin: 0; - } - - font-family: "open sans", "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 13px; - color: #676a6c; - overflow-x: hidden; - - ul { - list-style-type: none; - } - - h4 { - margin-top: 0px; - } - - h2 { - margin-top: 10px; - font-size: 26px; - font-weight: 100; - } - - p { - margin-top: 10px; - - b { - font-weight: 700; - } - } - - .update-log { - ol { - display: block; - list-style-type: decimal; - margin-block-start: 1em; - margin-block-end: 1em; - margin-inline-start: 0; - margin-inline-end: 0; - padding-inline-start: 40px; - } - } -} </style> diff --git a/src/views/inspectionManagement/components/qrCodeDia.vue b/src/views/inspectionManagement/components/qrCodeDia.vue index 119d9c5..136c18c 100644 --- a/src/views/inspectionManagement/components/qrCodeDia.vue +++ b/src/views/inspectionManagement/components/qrCodeDia.vue @@ -5,15 +5,15 @@ <el-form :model="form" :rules="rules" ref="formRef" label-width="120px"> <el-row> <el-col :span="24"> - <el-form-item label="璁惧鍚嶇О" prop="name"> - <el-input v-model="form.name" placeholder="璇疯緭鍏ヨ澶囧悕绉�" maxlength="30" /> + <el-form-item label="璁惧鍚嶇О" prop="deviceName"> + <el-input v-model="form.deviceName" placeholder="璇疯緭鍏ヨ澶囧悕绉�" maxlength="30" /> </el-form-item> </el-col> </el-row> <el-row> <el-col :span="24"> - <el-form-item label="鍦扮偣" prop="taxTrans"> - <el-input v-model="form.taxTrans" placeholder="璇疯緭鍏ュ湴鐐�" maxlength="30"/> + <el-form-item label="鎵�鍦ㄤ綅缃弿杩�" prop="location"> + <el-input v-model="form.location" placeholder="璇疯緭鍏ユ墍鍦ㄤ綅缃弿杩�" maxlength="30"/> </el-form-item> </el-col> </el-row> @@ -31,7 +31,8 @@ <script setup> import useUserStore from "@/store/modules/user.js"; import {reactive, ref} from "vue"; -import printJS from 'print-js'; // 寮曞叆 print.js +import printJS from 'print-js'; +import {addOrEditQrCode} from "@/api/inspectionUpload/index.js"; const { proxy } = getCurrentInstance() const emit = defineEmits() @@ -40,16 +41,18 @@ const isShowQrCode = ref(false); const operationType = ref('add'); -const qrCodeValue = ref('https://example.com'); +const qrCodeValue = ref(''); const qrCodeSize = ref(100); const data = reactive({ form: { - name: '', - taxTrans: '', + deviceName: '', + location: '', + qrCodeId: '', + id: '' }, rules: { - name: [{ required: true, message: '璇疯緭鍏ヨ澶囧悕绉�', trigger: 'blur' }], - taxTrans: [{ required: true, message: '璇疯緭鍏ュ湴鐐�', trigger: 'blur' }] + deviceName: [{ required: true, message: '璇疯緭鍏ヨ澶囧悕绉�', trigger: 'blur' }], + location: [{ required: true, message: '璇疯緭鍏ュ湴鐐�', trigger: 'blur' }] } }) const { form, rules } = toRefs(data) @@ -58,22 +61,40 @@ // 鎵撳紑寮规 const openDialog = async (type, row) => { dialogVisitable.value = true + qrCodeValue.value = '' + isShowQrCode.value = false; + if (type === 'edit') { + form.value.id = row.id + form.value.qrCodeId = row.id + form.value.deviceName = row.deviceName + form.value.location = row.location + // 灏嗚〃鍗曟暟鎹浆涓� JSON 瀛楃涓蹭綔涓轰簩缁寸爜鍐呭 + qrCodeValue.value = JSON.stringify(form.value); + isShowQrCode.value = true; + } } // 鎻愪氦鍚堝苟琛ㄥ崟 const submitForm = () => { proxy.$refs["formRef"].validate(valid => { if (valid) { + addOrEditQrCode(form.value).then((res) => { + form.value.qrCodeId = res.data + }) // 灏嗚〃鍗曟暟鎹浆涓� JSON 瀛楃涓蹭綔涓轰簩缁寸爜鍐呭 qrCodeValue.value = JSON.stringify(form.value); isShowQrCode.value = true; - - // 寤惰繜鎵ц鎵撳嵃锛岄伩鍏� DOM 鏇存柊鍓嶅氨璋冪敤鎵撳嵃 - setTimeout(() => { - printJS({ - printable: 'qrCodeContainer',//椤甸潰 - type: "html",//鏂囨。绫诲瀷 - maxWidth: 360, - style: `@page { + showQrCode() + } + }) +} +const showQrCode = () => { + // 寤惰繜鎵ц鎵撳嵃锛岄伩鍏� DOM 鏇存柊鍓嶅氨璋冪敤鎵撳嵃 + setTimeout(() => { + printJS({ + printable: 'qrCodeContainer',//椤甸潰 + type: "html",//鏂囨。绫诲瀷 + maxWidth: 360, + style: `@page { margin:0; size: 400px 75px collapse; margin-top:3px; @@ -89,12 +110,10 @@ height: 75px; margin:0; }`, - targetStyles: ["*"], // 浣跨敤dom鐨勬墍鏈夋牱寮忥紝寰堥噸瑕� - font_size: '0.20cm', - }); - }, 300); - } - }) + targetStyles: ["*"], // 浣跨敤dom鐨勬墍鏈夋牱寮忥紝寰堥噸瑕� + font_size: '0.20cm', + }); + }, 300); } // 鍏抽棴鍚堝苟琛ㄥ崟 const cancel = () => { diff --git a/src/views/inspectionManagement/components/viewQrCodeFiles.vue b/src/views/inspectionManagement/components/viewQrCodeFiles.vue new file mode 100644 index 0000000..f8e923a --- /dev/null +++ b/src/views/inspectionManagement/components/viewQrCodeFiles.vue @@ -0,0 +1,169 @@ +<template> + <div> + <el-dialog title="鏌ョ湅闄勪欢" + v-model="dialogVisitable" width="800px" @close="cancel"> + <div class="upload-container"> + <div class="form-container"> + <div class="title">宸℃闄勪欢</div> + <!-- 鍥剧墖鍒楄〃 --> + <div style="display: flex; flex-wrap: wrap;"> + <img v-for="(item, index) in beforeProductionImgs" :key="index" + @click="showMedia(beforeProductionImgs, index, 'image')" + :src="item" style="max-width: 100px; height: 100px; margin: 5px;" alt=""> + </div> + + <!-- 瑙嗛鍒楄〃 --> + <div style="display: flex; flex-wrap: wrap;"> + <div + v-for="(videoUrl, index) in beforeProductionVideos" + :key="index" + @click="showMedia(beforeProductionVideos, index, 'video')" + style="position: relative; margin: 10px; cursor: pointer;" + > + <div style="width: 160px; height: 90px; background-color: #333; display: flex; align-items: center; justify-content: center;"> + <img src="@/assets/images/video.png" alt="鎾斁" style="width: 30px; height: 30px; opacity: 0.8;" /> + </div> + <div style="text-align: center; font-size: 12px; color: #666;">鐐瑰嚮鎾斁</div> + </div> + </div> + </div> + </div> + </el-dialog> + <!-- 缁熶竴濯掍綋鏌ョ湅鍣� --> + <div v-if="isMediaViewerVisible" class="media-viewer-overlay" @click.self="closeMediaViewer"> + <div class="media-viewer-content" @click.stop> + <!-- 鍥剧墖 --> + <vue-easy-lightbox + v-if="mediaType === 'image'" + :visible="isMediaViewerVisible" + :imgs="mediaList" + :index="currentMediaIndex" + @hide="closeMediaViewer" + ></vue-easy-lightbox> + + <!-- 瑙嗛 --> + <div v-else-if="mediaType === 'video'" style="position: relative;"> + <Video + :src="mediaList[currentMediaIndex]" + autoplay + controls + style="max-width: 90vw; max-height: 80vh;" + /> + </div> + </div> + </div> + </div> +</template> + +<script setup> +// 鎺у埗寮圭獥鏄剧ず +import VueEasyLightbox from "vue-easy-lightbox"; + +const dialogVisitable = ref(false); +// 鍥剧墖鏁扮粍 +const beforeProductionImgs = ref([]); +// 瑙嗛鏁扮粍 +const beforeProductionVideos = ref([]); +// 濯掍綋鏌ョ湅鍣ㄧ姸鎬� +const isMediaViewerVisible = ref(false); +const currentMediaIndex = ref(0); +const mediaList = ref([]); // 瀛樺偍褰撳墠瑕佹煡鐪嬬殑濯掍綋鍒楄〃锛堝惈鍥剧墖鍜岃棰戝璞★級 +const mediaType = ref('image'); // image | video + +// 鎵撳紑寮圭獥骞跺姞杞芥暟鎹� +const openDialog = async (row) => { + const { images: beforeImgs, videos: beforeVids } = processItems(row.storageBlobDTO); + + beforeProductionImgs.value = beforeImgs; + beforeProductionVideos.value = beforeVids; + dialogVisitable.value = true; +}; +// 鏄剧ず濯掍綋锛堝浘鐗� or 瑙嗛锛� +function showMedia(mediaArray, index, type) { + mediaList.value = mediaArray; + currentMediaIndex.value = index; + mediaType.value = type; + isMediaViewerVisible.value = true; +} +// 鍏抽棴濯掍綋鏌ョ湅鍣� +function closeMediaViewer() { + isMediaViewerVisible.value = false; + mediaList.value = []; + mediaType.value = 'image'; +} +// 琛ㄥ崟鍏抽棴鏂规硶 +const cancel = () => { + dialogVisitable.value = false; +}; +// 澶勭悊姣忎竴绫绘暟鎹細鍒嗙鍥剧墖鍜岃棰� +function processItems(items) { + const images = []; + const videos = []; + items.forEach(item => { + if (item.contentType?.startsWith('image/')) { + images.push(item.url); + } else if (item.contentType?.startsWith('video/')) { + videos.push(item.url); + } + }); + return { images, videos }; +} +defineExpose({ openDialog }); +</script> + +<style scoped lang="scss"> +.upload-container { + display: flex; + flex-direction: column; + align-items: center; + padding: 20px; + border: 1px solid #dcdfe6; + box-sizing: border-box; + + .form-container { + flex: 1; + width: 100%; + margin-bottom: 20px; + } +} + +.title { + font-size: 14px; + color: #165dff; + line-height: 20px; + font-weight: 600; + padding-left: 10px; + position: relative; + margin: 6px 0; + + &::before { + content: ""; + position: absolute; + left: 0; + top: 3px; + width: 4px; + height: 14px; + background-color: #165dff; + } +} + +.media-viewer-overlay { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.8); + z-index: 9999; + display: flex; + align-items: center; + justify-content: center; +} + +.media-viewer-content { + position: relative; + max-width: 90vw; + max-height: 90vh; + overflow: hidden; +} +</style> \ No newline at end of file diff --git a/src/views/inspectionManagement/index.vue b/src/views/inspectionManagement/index.vue index 64bc036..54be49f 100644 --- a/src/views/inspectionManagement/index.vue +++ b/src/views/inspectionManagement/index.vue @@ -37,7 +37,7 @@ /> </el-tabs> <!-- 鎿嶄綔鎸夐挳鍖� --> - <el-space> + <el-space v-if="tabName !== 'qrCodeScanRecord'"> <el-button type="primary" :icon="Plus" @click="handleAdd">鏂板缓</el-button> <el-button type="danger" :icon="Delete" @click="handleDelete">鍒犻櫎</el-button> <el-button type="info" plain :icon="Download">瀵煎嚭</el-button> @@ -46,16 +46,37 @@ <div> <ETable :loading="tableLoading" :table-data="tableData" - :columns="columns" + :columns="tableColumns" @selection-change="handleSelectionChange" :show-selection="true" :border="true" :maxHeight="480" operationsWidth="130" - :operations="['edit', 'viewFile']" + :operations="operationsArr" @edit="handleAdd" @viewFile="viewFile" + v-if="tabName !== 'qrCodeScanRecord'" ></ETable> + <el-table ref="table" :data="tableData" height="480" v-loading="tableLoading" v-else> + <el-table-column label="搴忓彿" type="index" width="60" align="center" /> + <el-table-column prop="deviceName" label="璁惧鍚嶇О" :show-overflow-tooltip="true"> + <template #default="scope"> + {{scope.row.qrCode.deviceName}} + </template> + </el-table-column> + <el-table-column prop="location" label="鎵�鍦ㄤ綅缃弿杩�" :show-overflow-tooltip="true"> + <template #default="scope"> + {{scope.row.qrCode.location}} + </template> + </el-table-column> + <el-table-column prop="scanner" label="宸℃浜�"></el-table-column> + <el-table-column prop="scanTime" label="宸℃鏃堕棿"></el-table-column> + <el-table-column fixed="right" label="鎿嶄綔"> + <template #default="scope"> + <el-button link type="primary" @click="handleAdd(scope.row)">鏌ョ湅闄勪欢</el-button> + </template> + </el-table-column> + </el-table> </div> <pagination v-if="total>0" @@ -70,6 +91,7 @@ <form-dia ref="formDia" @closeDia="handleQuery"></form-dia> <qr-code-dia ref="qrCodeDia" @closeDia="handleQuery"></qr-code-dia> <view-files ref="viewFiles"></view-files> + <view-qr-code-files ref="viewQrCodeFiles"></view-qr-code-files> </div> </template> @@ -83,10 +105,13 @@ import QrCodeDia from "@/views/inspectionManagement/components/qrCodeDia.vue"; import {delInspectionTask, inspectionTaskList} from "@/api/inspectionManagement/index.js"; import ViewFiles from "@/views/inspectionManagement/components/viewFiles.vue"; +import {delQrCode, qrCodeList, qrCodeScanRecordList} from "@/api/inspectionUpload/index.js"; +import ViewQrCodeFiles from "@/views/inspectionManagement/components/viewQrCodeFiles.vue"; const formDia = ref() const qrCodeDia = ref() const viewFiles = ref() +const viewQrCodeFiles = ref() // 鏌ヨ鍙傛暟 const queryParams = reactive({ supplierName: "", @@ -99,10 +124,13 @@ const tabs = reactive([ { name: "task", label: "浠诲姟涓嬪彂" }, { name: "qrCode", label: "浜岀淮鐮佺鐞�" }, + { name: "qrCodeScanRecord", label: "鐜板満宸℃璁板綍" }, ]); // 琛ㄦ牸 const selectedRows = ref([]); const tableData = ref([]); +const operationsArr = ref([]); +const tableColumns = ref([]); const tableLoading = ref(false); const total = ref(0); const pageNum = ref(1); @@ -115,6 +143,12 @@ { prop: "registrant", label: "鐧昏浜�", minWidth: 100 }, { prop: "createTime", label: "鐧昏鏃ユ湡", minWidth: 100 }, ]); +const columns1 = ref([ + { prop: "deviceName", label: "璁惧鍚嶇О", minWidth: 160 }, + { prop: "location", label: "鎵�鍦ㄤ綅缃弿杩�", minWidth: 120 }, + { prop: "createBy", label: "鍒涘缓鑰�", minWidth: 100 }, + { prop: "createTime", label: "鍒涘缓鏃堕棿", minWidth: 100 }, +]); onMounted(() => { handleTabClick({ props: { name: "task" } }); @@ -123,6 +157,13 @@ const handleTabClick = (tab) => { tabName.value = tab.props.name; tableData.value = []; + if (tabName.value === "task") { + tableColumns.value = columns.value; + operationsArr.value = ['edit', 'viewFile'] + } else { + tableColumns.value = columns1.value; + operationsArr.value = ['edit'] + } getList(); }; // 鐐瑰嚮鏌ヨ @@ -133,12 +174,26 @@ } const getList = () => { tableLoading.value = true; - inspectionTaskList({...queryParams, size: pageSize.value, current: pageNum.value}).then(res => { - console.log(res) - tableLoading.value = false; - tableData.value = res.data.records; - total.value = res.data.total; - }) + if (tabName.value === "task") { + inspectionTaskList({...queryParams, size: pageSize.value, current: pageNum.value}).then(res => { + tableLoading.value = false; + tableData.value = res.data.records; + total.value = res.data.total; + }) + } else if (tabName.value === "qrCode") { + qrCodeList({...queryParams, size: pageSize.value, current: pageNum.value}).then(res => { + tableLoading.value = false; + tableData.value = res.data.records; + total.value = res.data.total; + }) + } else { + qrCodeScanRecordList({size: pageSize.value, current: pageNum.value}).then(res => { + tableLoading.value = false; + tableData.value = res.data.records; + total.value = res.data.total; + }) + } + }; // 閲嶇疆鏌ヨ const resetQuery = () => { @@ -156,8 +211,10 @@ nextTick(() => { if (tabName.value === "task") { formDia.value?.openDialog(type, row) - } else { + } else if (tabName.value === "qrCode") { qrCodeDia.value?.openDialog(type, row) + } else { + viewQrCodeFiles.value?.openDialog(row) } }) }; @@ -175,7 +232,7 @@ } const deleteIds = selectedRows.value.map(item => item.id); proxy.$modal.confirm('鏄惁纭鍒犻櫎鎵�閫夋暟鎹」锛�').then(function() { - return delInspectionTask(deleteIds) + return delQrCode(deleteIds) }).then(() => { handleQuery() proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛") diff --git a/src/views/inspectionUpload/components/qrCodeFormDia.vue b/src/views/inspectionUpload/components/qrCodeFormDia.vue new file mode 100644 index 0000000..207294d --- /dev/null +++ b/src/views/inspectionUpload/components/qrCodeFormDia.vue @@ -0,0 +1,175 @@ +<template> + <div> + <el-dialog + title="宸℃" + v-model="dialogVisitable" + width="400px" + @close="cancel" + > + <el-form :model="form" :rules="rules" ref="formRef" label-width="120px"> + <el-row> + <el-col :span="24"> + <el-form-item label="璁惧鍚嶇О" prop="deviceName"> + <el-input v-model="form.deviceName" placeholder="璇疯緭鍏ヨ澶囧悕绉�" maxlength="30" disabled/> + </el-form-item> + </el-col> + </el-row> + <el-row> + <el-col :span="24"> + <el-form-item label="鍦扮偣" prop="location"> + <el-input v-model="form.location" placeholder="璇疯緭鍏ュ湴鐐�" maxlength="30" disabled/> + </el-form-item> + </el-col> + </el-row> + <el-row> + <el-col :span="24"> + <el-form-item label="闄勪欢" prop="taxTrans"> + <fileUpload + :statusType="0" + ref="beforeProductionRef" + :fileSize="1024" + :fileType="['mp3', 'mp4', 'avi', 'mov', 'mkv']" + :limit="10" + :drag="false" + v-model:modelValue="form.storageBlobDTO" + > + </fileUpload> + </el-form-item> + </el-col> + </el-row> + <el-row> + <el-col :span="24"> + <el-form-item label="宸℃浜�" prop="scannerName"> + <el-input v-model="form.scannerName" disabled placeholder="璇疯緭鍏�" /> + </el-form-item> + </el-col> + </el-row> + <el-row> + <el-col :span="24"> + <el-form-item label="宸℃鏃堕棿" prop="scanTime"> + <el-input v-model="form.scanTime" disabled placeholder="璇疯緭鍏�" /> + </el-form-item> + </el-col> + </el-row> + </el-form> + <template #footer> + <div class="dialog-footer"> + <el-button @click="cancel">鍙栨秷</el-button> + <el-button type="primary" @click="submitForm">淇濆瓨</el-button> + </div> + </template> + </el-dialog> + </div> +</template> + +<script setup> +import { reactive, ref } from "vue"; +import {ElMessage} from "element-plus"; +import fileUpload from "@/components/FileUpload/index.vue"; +import {uploadInspectionTask} from "@/api/inspectionManagement/index.js"; +import useUserStore from "@/store/modules/user.js"; +import {addOrEditQrCodeRecord} from "@/api/inspectionUpload/index.js"; + +const emit = defineEmits(['closeDia']); +const dialogVisitable = ref(false); +const { proxy } = getCurrentInstance() +const storageBlobDTO = ref([]); +const beforeProductionRef = ref(null); +const userStore = useUserStore(); +const userInfo = ref({}); + +function getCurrentDateTime() { + const now = new Date(); + const year = now.getFullYear(); + const month = String(now.getMonth() + 1).padStart(2, '0'); + const day = String(now.getDate()).padStart(2, '0'); + const hours = String(now.getHours()).padStart(2, '0'); + const minutes = String(now.getMinutes()).padStart(2, '0'); + const seconds = String(now.getSeconds()).padStart(2, '0'); + return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`; +} +const data = reactive({ + form: { + deviceName: '', + location: '', + scannerName: '', + scannerId: '', + scanTime: '', + qrCode: { + id: '' + } + }, + rules: { + deviceName: [{ required: true, message: '璇疯緭鍏ヨ澶囧悕绉�', trigger: 'blur' }], + location: [{ required: true, message: '璇疯緭鍏ュ湴鐐�', trigger: 'blur' }] + } +}) +const { form, rules } = toRefs(data) + +// 璋冪敤鍑芥暟 +const currentDateTime = getCurrentDateTime(); + +// 鑾峰彇鐢ㄦ埛淇℃伅 +onMounted(async () => { + let res = await userStore.getInfo(); + userInfo.value = res.user; + form.value.scannerName = userInfo.value.nickName + form.value.scannerId = userInfo.value.userId + form.value.scanTime = currentDateTime +}); + +// 鎵撳紑寮规 +const openDialog = async (row) => { + dialogVisitable.value = true; + form.value.deviceName = row.deviceName + form.value.location = row.location + form.value.qrCodeId = row.qrCodeId +}; +const submitForm = async () => { + form.value.qrCode.id = form.value.qrCodeId + await addOrEditQrCodeRecord({...form.value}); + cancel() + ElMessage.success("鎻愪氦鎴愬姛"); +}; +// 鍏抽棴鍚堝苟琛ㄥ崟 +const cancel = () => { + proxy.resetForm("formRef"); + dialogVisitable.value = false; + emit("closeDia"); +}; +defineExpose({ openDialog }); +</script> + +<style scoped lang="scss"> +.upload-container { + display: flex; + flex-direction: column; + align-items: center; + padding: 20px; + border: 1px solid #dcdfe6; + box-sizing: border-box; + .form-container { + flex: 1; + width: 100%; + margin-bottom: 20px; + } +} +.title { + font-size: 14px; + color: #165dff; + line-height: 20px; + font-weight: 600; + padding-left: 10px; + position: relative; + margin: 6px 0; +} +.title::before { + content: ""; + position: absolute; + left: 0; + top: 3px; /* 璋冩暣鍨傜洿浣嶇疆 */ + width: 4px; /* 灏忔暟鏉″搴� */ + height: 14px; /* 灏忔暟鏉¢珮搴� */ + background-color: #165dff; /* 钃濊壊 */ +} +</style> diff --git a/src/views/inspectionUpload/index.vue b/src/views/inspectionUpload/index.vue index 559c05e..560fc01 100644 --- a/src/views/inspectionUpload/index.vue +++ b/src/views/inspectionUpload/index.vue @@ -15,8 +15,46 @@ /> </el-tabs> <div> + <!-- 鎵爜妯″潡 --> + <div v-if="activeTab === 'qrCode'" class="scan-section"> + <div class="scan-controls"> + <el-button + type="primary" + :loading="scanLoading" + @click="toggleScan" + > + {{ scanButtonText }} + </el-button> + </div> + + <!-- 鎵爜瑙嗛瀹瑰櫒 --> + <div v-show="isScanning" class="qr-video-container"> + <video + ref="qrVideo" + class="qr-video" + playsinline + webkit-playsinline + ></video> + <div class="scan-overlay"></div> + </div> + + <!-- 鐘舵�佹彁绀� --> + <div class="status-info"> + <el-alert + v-if="cameraError" + :title="cameraError" + type="error" + show-icon + closable + /> + <div v-if="isScanning" class="scanning-text"> + <el-icon :color="statusColor"><Loading /></el-icon> + 姝e湪鎵弿浜岀淮鐮�... + </div> + </div> + </div> <div> - <el-table ref="table" :data="tableData" height="480" v-loading="tableLoading"> + <el-table ref="table" :data="tableData" height="480" v-loading="tableLoading" v-if="activeTab !== 'qrCode'"> <el-table-column label="搴忓彿" type="index" width="60" align="center" /> <el-table-column prop="taskName" label="宸℃浠诲姟鍚嶇О" :show-overflow-tooltip="true"></el-table-column> <el-table-column prop="port" label="鍦扮偣" :show-overflow-tooltip="true"></el-table-column> @@ -25,6 +63,26 @@ <el-table-column fixed="right" label="鎿嶄綔"> <template #default="scope"> <el-button link type="primary" @click="handleAdd(scope.row)">涓婁紶</el-button> + </template> + </el-table-column> + </el-table> + <el-table ref="table" :data="tableData" height="480" v-loading="tableLoading" v-if="activeTab === 'qrCode'"> + <el-table-column label="搴忓彿" type="index" width="60" align="center" /> + <el-table-column prop="deviceName" label="璁惧鍚嶇О" :show-overflow-tooltip="true"> + <template #default="scope"> + {{scope.row.qrCode.deviceName}} + </template> + </el-table-column> + <el-table-column prop="location" label="鎵�鍦ㄤ綅缃弿杩�" :show-overflow-tooltip="true"> + <template #default="scope"> + {{scope.row.qrCode.location}} + </template> + </el-table-column> + <el-table-column prop="scanner" label="宸℃浜�"></el-table-column> + <el-table-column prop="scanTime" label="宸℃鏃堕棿"></el-table-column> + <el-table-column fixed="right" label="鎿嶄綔"> + <template #default="scope"> + <el-button link type="primary" @click="viewFile(scope.row)">鏌ョ湅闄勪欢</el-button> </template> </el-table-column> </el-table> @@ -40,22 +98,31 @@ </div> </el-card> <form-dia ref="formDia" @closeDia="handleQuery"></form-dia> + <qr-code-form-dia ref="qrCodeFormDia" @closeDia="handleQuery"></qr-code-form-dia> + <view-qr-code-files ref="viewQrCodeFiles"></view-qr-code-files> </div> </template> <script setup> import Pagination from "@/components/Pagination/index.vue"; -import {inspectionTaskList} from "@/api/inspectionManagement/index.js"; import {onMounted, ref} from "vue"; import FormDia from "@/views/inspectionUpload/components/formDia.vue"; +import {ElMessage} from "element-plus"; +import QrScanner from 'qr-scanner' +import QrCodeFormDia from "@/views/inspectionUpload/components/qrCodeFormDia.vue"; +import {qrCodeList, qrCodeScanRecordList} from "@/api/inspectionUpload/index.js"; +import {inspectionTaskList} from "@/api/inspectionManagement/index.js"; +import ViewQrCodeFiles from "@/views/inspectionManagement/components/viewQrCodeFiles.vue"; const formDia = ref() +const qrCodeFormDia = ref() +const viewQrCodeFiles = ref() // 褰撳墠鏍囩 const activeTab = ref("task"); const tabName = ref("task"); // 鏍囩椤垫暟鎹� const tabs = reactive([ - { name: "task", label: "浠诲姟涓嬪彂" }, - { name: "qrCode", label: "浜岀淮鐮佺鐞�" }, + { name: "task", label: "鐢熶骇宸℃" }, + { name: "qrCode", label: "鐜板満宸℃" }, ]); // 琛ㄦ牸 const tableData = ref([]); @@ -63,10 +130,32 @@ const total = ref(0); const pageNum = ref(1); const pageSize = ref(10); +// 鎵爜鐩稿叧鐘舵�� +const qrVideo = ref(null) +const isScanning = ref(false) +const scanLoading = ref(false) +const cameraError = ref(null) +const scanner = ref(null) +const hasInit = ref(false) -onMounted(() => { +const statusColor = computed(() => { + return isScanning.value ? '#67C23A' : '#F56C6C' +}) +// 鐢熷懡鍛ㄦ湡绠$悊浼樺寲 +onMounted(async () => { handleTabClick({ props: { name: "task" } }); -}); + if (!import.meta.env.SSR && QrScanner) { // [!code focus] + await initScanner() + } +}) + +onBeforeUnmount(async () => { + if (scanner.value) { + await scanner.value.destroy() + scanner.value = null + } + hasInit.value = false +}) // 鏍囩椤电偣鍑� const handleTabClick = (tab) => { tabName.value = tab.props.name; @@ -81,11 +170,19 @@ } const getList = () => { tableLoading.value = true; - inspectionTaskList({size: pageSize.value, current: pageNum.value}).then(res => { - tableLoading.value = false; - tableData.value = res.data.records; - total.value = res.data.total; - }) + if (tabName.value === "task") { + inspectionTaskList({size: pageSize.value, current: pageNum.value}).then(res => { + tableLoading.value = false; + tableData.value = res.data.records; + total.value = res.data.total; + }) + } else { + qrCodeScanRecordList({size: pageSize.value, current: pageNum.value}).then(res => { + tableLoading.value = false; + tableData.value = res.data.records; + total.value = res.data.total; + }) + } }; // 涓婁紶 const handleAdd = (row) => { @@ -93,10 +190,181 @@ formDia.value?.openDialog(row) }) } +// 鏌ョ湅闄勪欢 +const viewFile = (row) => { + nextTick(() => { + viewQrCodeFiles.value?.openDialog(row) + }) +} +// 鎵爜鎸夐挳鏂囨湰 +const scanButtonText = computed(() => { + if (scanLoading.value) return '姝e湪鍒濆鍖�...' + return isScanning.value ? '鍋滄鎵爜' : '寮�濮嬫壂鐮�' +}) +// 澧炲己鍨嬪垵濮嬪寲 +const initScanner = async () => { + try { + await nextTick() // 纭繚DOM鏇存柊 + // 鏂板澶氶噸绌哄�兼牎楠� + if (!qrVideo.value || !QrScanner) { + throw new Error('渚濊禆鏈纭垵濮嬪寲') + } + // 澧炲姞鎽勫儚澶存潈闄愰妫�鏌� + const hasCamera = await QrScanner.hasCamera() + if (!hasCamera) { + throw new Error('鏈娴嬪埌鍙敤鎽勫儚澶�') + } + // 鏄惧紡閿�姣佹棫瀹炰緥 + if (scanner.value) { + await scanner.value.destroy() + } + // 鍒涘缓鏂板疄渚� + scanner.value = new QrScanner( + qrVideo.value, + result => { + handleScanSuccess(result) + // stopScan() + }, + { + preferredCamera: 'environment', + maxScansPerSecond: 5, + returnDetailedScanResult: true + } + ) + // 鏂板纭欢鍔犻�熸娴� + if (!scanner.value._qrWorker) { + throw new Error('纭欢鍔犻�熶笉鍙敤') + } + hasInit.value = true + } catch (e) { + // handleInitError(e) + } +} +// 鎵弿鎴愬姛澶勭悊 +const handleScanSuccess = async (result) => { + try { + // 娣诲姞鏁版嵁鏍¢獙 + ElMessage.success('璇嗗埆鎴愬姛') + callBackendAPI(JSON.parse(result.data)) + await stopScan() + } catch (error) { + ElMessage.warning(error.message) + await startScan() // 鏁版嵁鏃犳晥鏃剁户缁壂鎻� + } +} +const callBackendAPI = (result) => { + nextTick(() => { + qrCodeFormDia.value?.openDialog(result) + }) +} +// 鍒囨崲鎵爜鐘舵�� +const toggleScan = async () => { + if (isScanning.value) { + await stopScan() + } else { + await startScan() + } +} + +// 澧炲己鍚姩鏂规硶 +const startScan = async () => { + if (!scanner.value || !hasInit.value) { // 鏂板鐘舵�佹鏌� + await initScanner() + } + + try { + await scanner.value.start() + isScanning.value = true + } catch (e) { + ElMessage.error(`鍚姩澶辫触: ${e.message}`) + hasInit.value = false + } +} + +// 鍋滄鎵爜 +const stopScan = async () => { + try { + await scanner.value.stop() + isScanning.value = false + } catch (err) { + console.error('鍋滄鎽勫儚澶村け璐�:', err) + } +} + + +// 閿欒澶勭悊澧炲己 +const handleInitError = (error) => { + console.error('鍒濆鍖栧け璐�:', error) + const msg = { + 'NotAllowedError': '璇峰厑璁告憚鍍忓ご鏉冮檺', + 'NotFoundError': '鏈壘鍒版憚鍍忓ご璁惧', + 'NotSupportedError': '娴忚鍣ㄤ笉鏀寔鎵爜鍔熻兘' + }[error.name] || error.message + + ElMessage.error(`鍒濆鍖栧け璐�: ${msg}`) +} </script> <style scoped> +.qr-video-container { + position: relative; + width: 100%; + max-width: 500px; + margin: 0 auto; + background: #000; + border-radius: 8px; + overflow: hidden; +} +.qr-video { + width: 100%; + height: auto; + object-fit: cover; +} + +.scan-overlay { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 70%; + height: 70%; + border: 3px solid #409eff; + border-radius: 8px; + box-shadow: 0 0 20px rgba(64, 158, 255, 0.3); + animation: pulse 2s infinite; +} + +@keyframes pulse { + 0% { opacity: 0.8; } + 50% { opacity: 0.4; } + 100% { opacity: 0.8; } +} + +.status-info { + margin-top: 16px; + text-align: center; +} + +.scanning-text { + color: #409eff; + margin-top: 8px; +} + +.table-section { + margin-top: 24px; +} + +/* 绉诲姩绔紭鍖� */ +@media (max-width: 768px) { + .qr-video-container { + height: 60vh; + } + + .el-table { + font-size: 12px; + } +} </style> \ No newline at end of file -- Gitblit v1.9.3