鴻蒙OSUniApp 制作簡潔高效的標簽云組件#三方框架 #Uniapp

UniApp 制作簡潔高效的標簽云組件

在移動端應用中,標簽云(Tag Cloud)是一種常見的UI組件,它以視覺化的方式展示關鍵詞或分類,幫助用戶快速瀏覽和選擇感興趣的內容。本文將詳細講解如何在UniApp框架中實現一個簡潔高效的標簽云組件,并探討其實際應用場景。

前言

最近在做一個社區類App時,產品經理提出了一個需求:需要在首頁展示熱門話題標簽,并且要求這些標簽能夠根據熱度有不同的展示樣式。起初我想到的是直接用現成的組件庫,但翻遍了各大組件市場,卻沒找到一個既美觀又符合我們需求的標簽云組件。

無奈之下,只能自己動手來實現這個功能。經過幾天的摸索和優化,終于做出了一個既簡潔又實用的標簽云組件。今天就把這個過程分享給大家,希望能對你有所幫助。

需求分析

在開始編碼前,我們先來明確一下標簽云組件應具備的核心功能:

  1. 靈活的布局:標簽能夠自動換行,適應不同尺寸的屏幕
  2. 可定制的樣式:支持自定義顏色、大小、邊框等樣式
  3. 支持點擊事件:點擊標簽能觸發相應的操作
  4. 熱度展示:能夠根據標簽的權重/熱度展示不同的樣式
  5. 性能優化:即使有大量標簽,也不會影響應用性能

有了這些需求后,我們就可以開始設計并實現這個組件了。

基礎組件實現

首先,我們創建一個標簽云組件文件 tag-cloud.vue

<template><view class="tag-cloud-container"><view v-for="(item, index) in tags" :key="index"class="tag-item":class="[`tag-level-${item.level || 0}`, item.active ? 'active' : '']":style="getTagStyle(item)"@tap="handleTagClick(item, index)"><text>{{ item.name }}</text><text v-if="showCount && item.count" class="tag-count">({{ item.count }})</text></view></view>
</template><script>
export default {name: 'TagCloud',props: {// 標簽數據tags: {type: Array,default: () => []},// 是否顯示標簽數量showCount: {type: Boolean,default: false},// 自定義顏色配置colorMap: {type: Array,default: () => ['#8a9aa9', '#61bfad', '#f8b551', '#ef6b73', '#e25c3d']},// 最大字體大小 (rpx)maxFontSize: {type: Number,default: 32},// 最小字體大小 (rpx)minFontSize: {type: Number,default: 24}},methods: {// 處理標簽點擊事件handleTagClick(item, index) {this.$emit('click', { item, index });},// 獲取標簽樣式getTagStyle(item) {const level = item.level || 0;const style = {};// 根據level確定字體大小if (this.maxFontSize !== this.minFontSize) {const fontStep = (this.maxFontSize - this.minFontSize) / 4;style.fontSize = `${this.minFontSize + level * fontStep}rpx`;}// 設置標簽顏色if (this.colorMap.length > 0) {const colorIndex = Math.min(level, this.colorMap.length - 1);style.color = this.colorMap[colorIndex];style.borderColor = this.colorMap[colorIndex];}return style;}}
}
</script><style lang="scss">
.tag-cloud-container {display: flex;flex-wrap: wrap;padding: 20rpx 10rpx;.tag-item {display: inline-flex;align-items: center;padding: 10rpx 20rpx;margin: 10rpx;border-radius: 30rpx;background-color: #f8f8f8;border: 1px solid #e0e0e0;font-size: 28rpx;color: #333333;transition: all 0.2s ease;&.active {color: #ffffff;background-color: #007aff;border-color: #007aff;}.tag-count {margin-left: 6rpx;font-size: 0.9em;opacity: 0.8;}}// 為不同級別的標簽設置默認樣式.tag-level-0 {opacity: 0.8;}.tag-level-1 {opacity: 0.85;}.tag-level-2 {opacity: 0.9;font-weight: 500;}.tag-level-3 {opacity: 0.95;font-weight: 500;}.tag-level-4 {opacity: 1;font-weight: 600;}
}
</style>

這個基礎組件實現了我們需要的核心功能:

  • 標簽以流式布局展示,自動換行
  • 根據傳入的level屬性設置不同級別的樣式
  • 支持自定義顏色和字體大小
  • 點擊事件封裝,可傳遞給父組件處理

標簽數據處理

標簽云組件的核心在于如何根據標簽的權重/熱度來設置不同的視覺效果。一般來說,我們會根據標簽出現的頻率或者其他自定義規則來計算權重。下面是一個簡單的處理函數:

/*** 處理標簽數據,計算每個標簽的級別* @param {Array} tags 原始標簽數據* @param {Number} levelCount 級別數量,默認為5* @return {Array} 處理后的標簽數據*/
function processTagData(tags, levelCount = 5) {if (!tags || tags.length === 0) return [];// 找出最大和最小count值let maxCount = 0;let minCount = Infinity;tags.forEach(tag => {if (tag.count > maxCount) maxCount = tag.count;if (tag.count < minCount) minCount = tag.count;});// 如果最大最小值相同,說明所有標簽權重一樣if (maxCount === minCount) {return tags.map(tag => ({...tag,level: 0}));}// 計算每個標簽的級別const countRange = maxCount - minCount;const levelStep = countRange / (levelCount - 1);return tags.map(tag => ({...tag,level: Math.min(Math.floor((tag.count - minCount) / levelStep),levelCount - 1)}));
}

這個函數會根據標簽的count屬性,將所有標簽分為0-4共5個級別,我們可以在使用組件前先對數據進行處理。

使用標簽云組件

接下來,讓我們看看如何在頁面中使用這個組件:

<template><view class="page-container"><view class="section-title">熱門話題</view><tag-cloud :tags="processedTags" :color-map="colorMap":show-count="true"@click="onTagClick"></tag-cloud></view>
</template><script>
import TagCloud from '@/components/tag-cloud.vue';export default {components: {TagCloud},data() {return {tags: [{ name: '前端開發', count: 120 },{ name: 'Vue', count: 232 },{ name: 'UniApp', count: 180 },{ name: '小程序', count: 156 },{ name: 'React', count: 98 },{ name: 'Flutter', count: 76 },{ name: 'JavaScript', count: 210 },{ name: 'CSS', count: 89 },{ name: 'TypeScript', count: 168 },{ name: '移動開發', count: 143 },{ name: '云開發', count: 58 },{ name: '性能優化', count: 112 }],colorMap: ['#8a9aa9', '#61bfad', '#f8b551', '#ef6b73', '#e25c3d']}},computed: {processedTags() {// 調用上面定義的處理函數return this.processTagData(this.tags);}},methods: {processTagData(tags, levelCount = 5) {// 這里是上面定義的標簽處理函數// ...函數內容同上...},onTagClick({ item, index }) {console.log(`點擊了標簽: ${item.name}, 索引: ${index}`);uni.showToast({title: `你選擇了: ${item.name}`,icon: 'none'});// 這里可以進行頁面跳轉或其他操作// uni.navigateTo({//   url: `/pages/topic/topic?name=${encodeURIComponent(item.name)}`// });}}
}
</script><style lang="scss">
.page-container {padding: 30rpx;.section-title {font-size: 34rpx;font-weight: bold;margin-bottom: 20rpx;color: #333;}
}
</style>

進階:隨機顏色與布局

標簽云還有一種常見的效果是隨機顏色和隨機大小。下面我們來實現這個功能:

// 在組件的methods中添加如下方法// 獲取隨機顏色
getRandomColor() {const colors = ['#61bfad', '#f8b551', '#ef6b73', '#8a9aa9', '#e25c3d', '#6cc0e5', '#fb6e50', '#f9cb8b'];return colors[Math.floor(Math.random() * colors.length)];
},// 修改getTagStyle方法
getTagStyle(item) {const style = {};if (this.random) {// 隨機模式style.fontSize = `${Math.floor(Math.random() * (this.maxFontSize - this.minFontSize) + this.minFontSize)}rpx`;style.color = this.getRandomColor();style.borderColor = style.color;} else {// 原有的level模式const level = item.level || 0;if (this.maxFontSize !== this.minFontSize) {const fontStep = (this.maxFontSize - this.minFontSize) / 4;style.fontSize = `${this.minFontSize + level * fontStep}rpx`;}if (this.colorMap.length > 0) {const colorIndex = Math.min(level, this.colorMap.length - 1);style.color = this.colorMap[colorIndex];style.borderColor = this.colorMap[colorIndex];}}return style;
}

然后在props中添加random屬性:

// 添加到props中
random: {type: Boolean,default: false
}

這樣,當設置 randomtrue 時,標簽就會以隨機顏色和大小展示,增加視覺的多樣性。

實現可選中的標簽云

在某些場景下,我們需要標簽支持選中功能,比如在篩選器中。我們可以對組件進行擴展:

<template><!-- 添加多選模式 --><view class="tag-cloud-container"><view v-for="(item, index) in internalTags" :key="index"class="tag-item":class="[`tag-level-${item.level || 0}`, item.selected ? 'selected' : '',selectable ? 'selectable' : '']":style="getTagStyle(item)"@tap="handleTagClick(item, index)"><text>{{ item.name }}</text><text v-if="showCount && item.count" class="tag-count">({{ item.count }})</text></view></view>
</template><script>
export default {// ... 現有代碼 ...props: {// ... 現有props ...// 是否支持選中selectable: {type: Boolean,default: false},// 最大可選數量,0表示不限制maxSelectCount: {type: Number,default: 0},// 選中的標簽值數組value: {type: Array,default: () => []}},data() {return {// 內部維護的標簽數據,添加selected狀態internalTags: []};},watch: {tags: {immediate: true,handler(newVal) {this.initInternalTags();}},value: {handler(newVal) {this.syncSelectedStatus();}}},methods: {// 初始化內部標簽數據initInternalTags() {this.internalTags = this.tags.map(tag => ({...tag,selected: this.value.includes(tag.name)}));},// 同步選中狀態syncSelectedStatus() {if (!this.selectable) return;this.internalTags.forEach(tag => {tag.selected = this.value.includes(tag.name);});},// 修改標簽點擊處理邏輯handleTagClick(item, index) {if (this.selectable) {// 處理選中邏輯const newSelected = !item.selected;// 檢查是否超出最大選擇數量if (newSelected && this.maxSelectCount > 0) {const currentSelectedCount = this.internalTags.filter(t => t.selected).length;if (currentSelectedCount >= this.maxSelectCount) {uni.showToast({title: `最多只能選擇${this.maxSelectCount}個標簽`,icon: 'none'});return;}}// 更新選中狀態this.$set(this.internalTags[index], 'selected', newSelected);// 構建新的選中值數組const selectedValues = this.internalTags.filter(tag => tag.selected).map(tag => tag.name);// 觸發input事件,支持v-modelthis.$emit('input', selectedValues);}// 觸發點擊事件this.$emit('click', { item: this.internalTags[index], index,selected: this.internalTags[index].selected});}}
}
</script><style lang="scss">
.tag-cloud-container {// ... 現有樣式 ....tag-item {// ... 現有樣式 ...&.selectable {cursor: pointer;user-select: none;&:hover {opacity: 0.8;}}&.selected {color: #ffffff;background-color: #007aff;border-color: #007aff;}}
}
</style>

這樣,我們的標簽云就支持了多選模式,并且可以通過v-model進行雙向綁定。

實戰案例:興趣標簽選擇器

最后,我們來看一個實際應用案例 - 用戶注冊時的興趣標簽選擇:

<template><view class="interest-selector"><view class="title">選擇你感興趣的話題</view><view class="subtitle">選擇3-5個你感興趣的話題,我們將為你推薦相關內容</view><tag-cloud:tags="interestTags":selectable="true":max-select-count="5"v-model="selectedInterests"@click="onInterestTagClick"></tag-cloud><view class="selected-count">已選擇 {{ selectedInterests.length }}/5 個話題</view><button class="confirm-btn" :disabled="selectedInterests.length < 3"@tap="confirmSelection">確認選擇</button></view>
</template><script>
import TagCloud from '@/components/tag-cloud.vue';export default {components: {TagCloud},data() {return {interestTags: [{ name: '科技', count: 1250 },{ name: '體育', count: 980 },{ name: '電影', count: 1560 },{ name: '音樂', count: 1320 },{ name: '美食', count: 1480 },{ name: '旅行', count: 1280 },{ name: '攝影', count: 860 },{ name: '游戲', count: 1420 },{ name: '時尚', count: 760 },{ name: '健身', count: 890 },{ name: '閱讀', count: 720 },{ name: '動漫', count: 830 },{ name: '寵物', count: 710 },{ name: '財經', count: 680 },{ name: '汽車', count: 590 },{ name: '育兒', count: 520 },{ name: '教育', count: 780 },{ name: '歷史', count: 650 }],selectedInterests: []}},created() {// 處理標簽數據,設置levelthis.interestTags = this.processTagData(this.interestTags);},methods: {processTagData(tags, levelCount = 5) {// ... 標簽處理函數,同上 ...},onInterestTagClick({ item, selected }) {console.log(`${selected ? '選中' : '取消選中'}標簽: ${item.name}`);},confirmSelection() {if (this.selectedInterests.length < 3) {uni.showToast({title: '請至少選擇3個感興趣的話題',icon: 'none'});return;}// 保存用戶選擇的興趣標簽uni.showLoading({title: '保存中...'});// 模擬API請求setTimeout(() => {uni.hideLoading();uni.showToast({title: '保存成功',icon: 'success'});// 跳轉到首頁setTimeout(() => {uni.reLaunch({url: '/pages/index/index'});}, 1500);}, 1000);}}
}
</script><style lang="scss">
.interest-selector {padding: 40rpx;.title {font-size: 40rpx;font-weight: bold;margin-bottom: 20rpx;}.subtitle {font-size: 28rpx;color: #666;margin-bottom: 50rpx;}.selected-count {text-align: center;margin: 30rpx 0;font-size: 28rpx;color: #666;}.confirm-btn {margin-top: 60rpx;background-color: #007aff;color: #fff;&[disabled] {background-color: #cccccc;color: #ffffff;}}
}
</style>

性能優化

當標簽數量很多時,可能會遇到性能問題。以下是幾個優化建議:

  1. 虛擬列表:對于特別多的標簽(如上百個),可以考慮使用虛擬列表,只渲染可視區域內的標簽。
  2. 懶加載:分批次加載標簽,初始只加載一部分,用戶滑動時再加載更多。
  3. 避免頻繁重新渲染:減少不必要的標簽狀態更新,特別是在選中標簽時。

下面是一個簡單的虛擬列表實現思路:

// 在標簽云組件中添加懶加載支持
props: {// ... 現有props ...lazyLoad: {type: Boolean,default: false},loadBatchSize: {type: Number,default: 20}
},
data() {return {// ... 現有data ...visibleTags: [],loadedCount: 0}
},
watch: {internalTags: {handler(newVal) {if (this.lazyLoad) {// 初始加載第一批this.loadMoreTags();} else {this.visibleTags = newVal;}},immediate: true}
},
methods: {// ... 現有methods ...loadMoreTags() {if (this.loadedCount >= this.internalTags.length) return;const nextBatch = this.internalTags.slice(this.loadedCount,this.loadedCount + this.loadBatchSize);this.visibleTags = [...this.visibleTags, ...nextBatch];this.loadedCount += nextBatch.length;},// 監聽滾動到底部onScrollToBottom() {if (this.lazyLoad) {this.loadMoreTags();}}
}

然后在模板中使用 visibleTags 替代 internalTags,并監聽滾動事件。

總結與優化建議

通過本文,我們實現了一個功能完善的標簽云組件,它具有以下特點:

  1. 靈活的布局:自動換行,適應不同尺寸的屏幕
  2. 多樣化的樣式:支持根據標簽熱度/權重展示不同樣式
  3. 交互功能:支持點擊、選中等交互
  4. 性能優化:考慮了大數據量下的性能問題

實際應用中,還可以根據具體需求進行以下優化:

  1. 動畫效果:添加標簽hover/點擊動畫,提升用戶體驗
  2. 拖拽排序:支持拖拽調整標簽順序
  3. 搜索過濾:添加搜索框,快速篩選標簽
  4. 分類展示:按類別分組展示標簽
  5. 數據持久化:將用戶選擇的標簽保存到本地或服務器

標簽云組件看似簡單,但能夠在很多場景中發揮重要作用,比如:

  • 用戶興趣標簽選擇
  • 文章標簽展示
  • 商品分類快速入口
  • 數據可視化展示
  • 關鍵詞篩選器

希望這篇文章能夠幫助你在UniApp中實現自己的標簽云組件。如果有任何問題或改進建議,歡迎在評論區交流討論!

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

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

相關文章

ubuntu14.04/16.06 安裝vscode(實測可以用)

地址&#xff1a;https://code.visualstudio.com/updates/v1_38 選擇deb 這個版本還支持ubuntu14.04和16.06 sudo dpkg -i code_1.38.1-1568209190_amd64.deb sudo apt-get install -f安裝成功&#xff0c;正常使用

WebRTC技術EasyRTC音視頻實時通話驅動智能攝像頭邁向多場景應用

一、方案背景? 在物聯網蓬勃發展的當下&#xff0c;智能攝像頭廣泛應用于安防、家居、工業等領域。但傳統智能攝像頭存在視頻傳輸延遲高、設備兼容性差、網絡波動時傳輸不穩定等問題&#xff0c;難以滿足用戶對實時流暢交互視頻的需求。EasyRTC憑借低延遲、高可靠、跨平臺特性…

Java EE進階1:導讀

1.發展歷程 2.學習內容 前?的課程中,學習的是Java基礎,JavaEE主要學習Java的應用,也就是學習Java在企業中是如何應用的 Java更多場景是業務開發,更狹義點可以理解為web開發.所以咱們的學習也是圍繞著如何使用Java來做web開發 2.1 什么是Web開發&#xff1f; web&#xff08…

APPtrace 智能參數系統:重構 App 用戶增長與運營邏輯

一、免填時代&#xff1a;APPtrace 顛覆傳統參數傳遞模式 傳統 App 依賴「邀請碼 / 手動綁定」實現用戶關聯&#xff0c;流程繁瑣導致 20%-30% 的用戶流失。APPtrace 通過 **「鏈接參數自動傳遞 安裝后智能識別」** 技術&#xff0c;讓用戶在無感知狀態下完成關系綁定、場景還…

bisheng系列(一)- 本地部署(Docker)

目錄 一、導讀 二、說明 1、鏡像說明 2、本節內容 三、docker部署 1、克隆代碼 2、運行鏡像 3、可能的錯誤信息 四、頁面測試 1、注冊用戶 2、登陸成功 3、添加模型 一、導讀 環境&#xff1a;Ubuntu 24.04、Windows 11、WSL 2、Python 3.10 、bisheng 1.1.1 背景…

docker介紹與常用命令匯總

docker簡介 docker是什么&#xff1f; Docker 是一個開源的應用容器引擎&#xff0c;它可以讓開發者將應用與運行環境打包成一個標準的、可移植的容器&#xff08;Container&#xff09;&#xff0c;在任何地方都可以快速部署和運行&#xff0c;無需關心底層環境是否一致。 …

Android 中拖拽從一個組件到另外一個組件的寫法(跨容器拖拽)

在 Android 中&#xff0c;拖拽一個圖片&#xff08;例如 ImageView&#xff09;到另一個組件&#xff08;如 LinearLayout、FrameLayout 等容器&#xff09;涉及以下步驟&#xff1a; 準備工作 源組件&#xff1a;你從哪里開始拖動&#xff08;如 ImageView&#xff09;。 目…

火絨互聯網安全軟件:自主引擎,精準防御

在數字時代&#xff0c;網絡安全是每一個用戶都必須重視的問題。無論是個人用戶還是企業用戶&#xff0c;都需要一款高效、可靠的反病毒軟件來保護設備免受惡意軟件的侵害。今天&#xff0c;我們要介紹的 火絨互聯網安全軟件&#xff0c;就是這樣一款由資深工程師主導研發并擁有…

使用亮數據代理IP+Python爬蟲批量爬取招聘信息訓練面試類AI智能體(手把手教學版)

文章目錄 一、為什么要用代理IP&#xff1f;(重要&#xff01;&#xff01;&#xff01;)二、環境準備&#xff08;三件套走起&#xff09;2.1 安裝必備庫&#xff08;pip大法好&#xff09;2.2 獲取亮數據代理&#xff08;官網注冊送試用&#xff09; 三、編寫爬蟲代碼&#x…

Android屏幕采集編碼打包推送RTMP技術詳解:從開發到優化與應用

在現代移動應用中&#xff0c;屏幕采集已成為一個廣泛使用的功能&#xff0c;尤其是在實時直播、視頻會議、遠程教育、游戲錄制等場景中&#xff0c;屏幕采集技術的需求不斷增長。Android 平臺為開發者提供了 MediaProjection API&#xff0c;這使得屏幕錄制和采集變得更加簡單…

互聯網大廠Java求職面試:Spring AI與大模型交互的高級模式與自定義開發

互聯網大廠Java求職面試&#xff1a;Spring AI與大模型交互的高級模式與自定義開發 在當今技術領域&#xff0c;隨著AI和大模型技術的廣泛應用&#xff0c;如何在復雜的系統架構中高效地集成這些技術成為了各大互聯網公司關注的重點。本文將通過一場模擬的面試對話&#xff0c…

MySQL 8.0 OCP 1Z0-908 161-170題

Q161.Examine this command, which executes successfully: cluster.addInstance ( ‘:’,{recoveryMethod: ‘clone’ 1}) Which three statements are true? (Choose three.) A)The account used to perform this recovery needs the BACKUP_ ADMIN privilege. B)A target i…

藍橋杯1447 砝碼稱重

問題描述 你有一架天平和 N 個砝碼&#xff0c;這 N 個砝碼重量依次是 W1,W2,???,WN?。 請你計算一共可以稱出多少種不同的重量&#xff1f; 注意砝碼可以放在天平兩邊。 輸入格式 輸入的第一行包含一個整數 N。 第二行包含 N 個整數&#xff1a;W1,W2,W3,???,WN?…

金融量化智能體,如何開發一個有效的策略?

原創內容第887篇&#xff0c;專注智能量化投資、個人成長與財富自由。 本周重構了網站&#xff0c;升級了最新的回測引擎&#xff0c;以及升級了論壇。 策略年化210%&#xff0c;夏普比3.47&#xff0c;系統源代碼及策略均可下載 年化37.5%&#xff0c;回撤控制在16.8%&…

JavaScript 性能優化:調優策略與工具使用

引言 在當今的 Web 開發領域&#xff0c;性能優化已不再是錦上添花&#xff0c;而是產品成功的關鍵因素。據 Google 研究表明&#xff0c;頁面加載時間每增加 3 秒&#xff0c;跳出率將提高 32%。而移動端用戶如果頁面加載超過 3 秒&#xff0c;有 53% 的用戶會放棄訪問。性能…

為 Jenkins添加 Windows Slave遠程執行 python項目腳本

測試環境 JAVA JDK 1.7.0_13 (jdk-7u13-windows-i586.exe) Jenkins Win11 64 python項目環境 實踐操作 1、新建與配置結點 【系統管理】-> 【管理結點】-> 【新建結點】, 如上&#xff0c;輸入結點名稱&#xff0c;勾選 【Dumb Slave】&#xff0c;點擊【OK】 說明&am…

基于springboot3 VUE3 火車訂票系統前后端分離項目適合新手學習的項目包含 智能客服 換乘算法

? 博主介紹&#xff1a;專注于Java&#xff08;springboot ssm 等開發框架&#xff09; vue .net php phython node.js uniapp 微信小程序 等諸多技術領域和畢業項目實戰、企業信息化系統建設&#xff0c;從業十五余年開發設計教學工作 ☆☆☆ 精彩專欄推薦訂閱☆☆☆☆☆…

btc交易所關鍵需求區 XBIT反彈與上漲潛力分析??

在加密貨幣市場的浪潮中&#xff0c;狗狗幣&#xff08;DOGE&#xff09;近期的走勢吸引了眾多投資者的目光。根據XBIT分析&#xff0c;狗狗幣剛剛踏入關鍵需求區&#xff0c;此前雖從高點大幅下跌了10%&#xff0c;但XBIT去中心化交易所平臺分析師認為&#xff0c;短期內它有望…

寶塔+fastadmin:給項目添加定時任務

一、定時任務腳本編寫 1. 使用 shebang 聲明執行器 #!/usr/bin/env php 這是 Unix/Linux 系統中腳本文件的標準開頭。表示這個腳本使用系統環境變量中的 php 來執行。2. 定義 ThinkPHP 入口路徑并加載框架 define(APP_PATH, __DIR__ . /../../application/); require __DIR__…

每日Prompt:自拍生成搖頭娃娃

提示詞 將這張照片變成一個搖頭娃娃&#xff1a;頭部稍微放大&#xff0c;保持面部準確&#xff0c;身體卡通化。[把它放在書架上]。