From ba5acc3cdefd33a4845b578015e2aae8b43f80d3 Mon Sep 17 00:00:00 2001 From: zxl <763096477@qq.com> Date: 星期三, 04 六月 2025 11:40:29 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/dev' into dev --- config/api.js | 9 api/common.js | 11 pages.json | 24 uni_modules/uni-icons/package.json | 89 + uni_modules/uni-icons/changelog.md | 42 App.vue | 6 static/tabbar/video1-selected.png | 0 pages/tabbar/index/home.vue | 92 + uni_modules/uni-icons/components/uni-icons/uni-icons.uvue | 91 + uni_modules/uni-icons/components/uni-icons/uni-icons.vue | 110 + uni_modules/uni-icons/components/uni-icons/uniicons_file.ts | 664 ++++++++ pages/video/home-page-edit.vue | 278 +++ pages/tabbar/video/video.vue | 37 uni_modules/uni-icons/readme.md | 8 uni_modules/uni-icons/components/uni-icons/uniicons.css | 664 ++++++++ uni_modules/uni-icons/components/uni-icons/uniicons_file_vue.js | 649 ++++++++ api/user.js | 65 api/video.js | 48 uni_modules/uni-icons/components/uni-icons/uniicons.ttf | 0 pages/video/video-play.vue | 1028 +++++++++++++ components/custom-tabbar.vue | 4 static/tabbar/video1.png | 0 pages/video/home-page.vue | 549 +++++++ 23 files changed, 4,433 insertions(+), 35 deletions(-) diff --git a/App.vue b/App.vue index 98414e3..a2d5c1e 100644 --- a/App.vue +++ b/App.vue @@ -255,9 +255,9 @@ @font-face { font-family: 'iconfont'; /* Project id 4921691 */ src: - url('//at.alicdn.com/t/c/font_4921691_s75bca4srg.woff2?t=1748511781888') format('woff2'), - url('//at.alicdn.com/t/c/font_4921691_s75bca4srg.woff?t=1748511781888') format('woff'), - url('//at.alicdn.com/t/c/font_4921691_s75bca4srg.ttf?t=1748511781888') format('truetype'); + url('//at.alicdn.com/t/c/font_4921691_nm6or3sic2.woff2?t=1748867592712') format('woff2'), + url('//at.alicdn.com/t/c/font_4921691_nm6or3sic2.woff?t=1748867592712') format('woff'), + url('//at.alicdn.com/t/c/font_4921691_nm6or3sic2.ttf?t=1748867592712') format('truetype'); } .iconfont { /* font-family闇�瑕佸拰鑷畾涔夌殑鐩稿悓 */ diff --git a/api/common.js b/api/common.js index 0117fad..bbedae0 100644 --- a/api/common.js +++ b/api/common.js @@ -45,6 +45,17 @@ /** + * 鑾峰彇鏂囦欢璁块棶鍦板潃 + */ + export function getFilePreviewUrl(fileKey) { + return http.request({ + url: `${api.common}/lmk/file/preview`, + method: Method.POST, + data: {fileKey: fileKey} + }); +} + +/** * 鏂囦欢涓婁紶鍦板潃 * @type {string} */ diff --git a/api/user.js b/api/user.js new file mode 100644 index 0000000..627e334 --- /dev/null +++ b/api/user.js @@ -0,0 +1,65 @@ +/** + * 鐢ㄦ埛鐩稿叧API + */ + +import { http, Method } from "@/utils/request.js"; + + + + +/** + * 鑾峰彇瑙嗛涓婚〉浣滆�呬俊鎭� + * + * @param params + */ + export function getAuthorInfo(authorId) { + return http.request({ + url: "/lmk/video/author-info/" + authorId, + method: Method.GET, + needToken: true + }); +} + +/** + * 鑾峰彇瑙嗛涓婚〉-浣滆�呯殑瑙嗛鍒嗛〉 + * + * @param params + */ + export function getAuthorVideoPage(params) { + return http.request({ + url: "/lmk/video/author-video-page", + method: Method.GET, + needToken: true, + params: params + }); +} + + +/** + * 鑾峰彇瑙嗛涓婚〉-浣滆�呮敹钘忕殑瑙嗛鍒嗛〉 + * + * @param params + */ + export function getAuthorCollectVideoPage(params) { + return http.request({ + url: "/lmk/video/author-collect-video-page", + method: Method.GET, + needToken: true, + params: params + }); +} + +/** + * 淇濆瓨瑙嗛涓婚〉淇℃伅缂栬緫 + * + * @param params + */ + export function saveVideoHomeInfo(data) { + return http.request({ + url: "/lmk/video/home-page-info-edit", + method: Method.POST, + needToken: true, + data: data + }); +} + diff --git a/api/video.js b/api/video.js index 843d069..65b48e8 100644 --- a/api/video.js +++ b/api/video.js @@ -22,15 +22,16 @@ } /** - * 鑾峰彇浜斾釜鎺ㄨ崘瑙嗛 + * 鑾峰彇鎺ㄨ崘瑙嗛 * * @param params */ - export function getRecommendVideos() { + export function getRecommendVideos(params) { return http.request({ url: "/lmk/video/recommend", method: Method.GET, - needToken: true + needToken: true, + params: params }); } @@ -62,6 +63,19 @@ } /** + * 鍙栨秷鍏虫敞浣滆�� + * + * @param params + */ + export function unSubscribe(authorId) { + return http.request({ + url: "/lmk/my-subscribe/unSubscribe/" + authorId, + method: Method.POST, + needToken: true + }); +} + +/** * 鑾峰彇瑙嗛璇勮 * * @param params @@ -88,3 +102,31 @@ data: data }); } + +/** + * 璇勮鐐硅禐 + * + * @param params + */ + export function thubmsUpComment(data) { + return http.request({ + url: "/lmk/video-comment/thumbs_up", + method: Method.POST, + needToken: true, + data: data + }); +} + +/** + * 鍙栨秷璇勮鐐硅禐 + * + * @param params + */ + export function cancelThubmsUpComment(data) { + return http.request({ + url: "/lmk/video-comment/cancel/thumbs_up", + method: Method.POST, + needToken: true, + data: data + }); +} diff --git a/components/custom-tabbar.vue b/components/custom-tabbar.vue index a483f52..5d2cf8b 100644 --- a/components/custom-tabbar.vue +++ b/components/custom-tabbar.vue @@ -55,8 +55,8 @@ }, { "pagePath": "/pages/tabbar/video/video", - "iconPath": "/static/tabbar/video.png", - "selectedIconPath": "/static/tabbar/video-selected.png", + "iconPath": "/static/tabbar/video1.png", + "selectedIconPath": "/static/tabbar/video1-selected.png", "key": 'video' }, { diff --git a/config/api.js b/config/api.js index de87b6c..769e179 100644 --- a/config/api.js +++ b/config/api.js @@ -4,9 +4,12 @@ */ // 寮�鍙戠幆澧� const dev = { - im: "http://192.168.0.4:8885", - common: "http://192.168.0.4:8890", - buyer: "http://192.168.0.4:8888", + // im: "http://192.168.0.4:8885", + // common: "http://192.168.0.4:8890", + // buyer: "http://192.168.0.4:8888", + im: "http://127.0.0.1:8885", + common: "http://127.0.0.1:8890", + buyer: "http://127.0.0.1:8888", // common: "http://192.168.0.113:8890", // buyer: "http://192.168.0.113:8888", // im: "http://192.168.0.113:8885", diff --git a/pages.json b/pages.json index eb9d53e..95a8839 100644 --- a/pages.json +++ b/pages.json @@ -902,6 +902,30 @@ }, { + "root": "pages/video", + "pages": [{ + "path": "home-page", + "style": { + "navigationBarTitleText": "TA鐨勪富椤�" + } + }, + { + "path" : "video-play", + "style" : + { + "navigationBarTitleText" : "" + } + }, + { + "path" : "home-page-edit", + "style" : + { + "navigationBarTitleText" : "涓婚〉淇℃伅淇敼" + } + } + ] + }, + { "root": "pages/passport", "pages": [{ "path": "login", diff --git a/pages/tabbar/index/home.vue b/pages/tabbar/index/home.vue index 2a9bde6..e65155f 100644 --- a/pages/tabbar/index/home.vue +++ b/pages/tabbar/index/home.vue @@ -66,14 +66,14 @@ </view> <view style="width: 100%;word-wrap: break-word;white-space: normal;overflow-wrap: break-word;"> <text class="video-title">{{item.title}}</text> - <text class="video-tag" v-for="(tag, index) in item.tagList" :key="tag">#{{tag.tagName}}</text> + <text class="video-tag" v-for="(tag, index) in item.tagList" :key="tag.id">#{{tag.tagName}}</text> </view> </view> <!-- 鍙充晶浜掑姩鎸夐挳 --> <view class="action-buttons"> <view class="avatar-container"> - <image class="avatar" :src="item.authorAvatar" mode="aspectFill"></image> + <image class="avatar" @click="jumpToHomePage(item.authorId)" :src="item.authorAvatar" mode="aspectFill"></image> <!-- 鍏虫敞鍥炬爣 - 浣跨敤缁濆瀹氫綅 --> <view v-if="!item.subscribeThisAuthor" class="follow-icon" @click="subscribeAuth(index, item.authorId)"> <text class="iconfont"></text> @@ -123,13 +123,14 @@ <view style="position: relative;"> <text class="time">{{formatTime(comment.createTime)}}</text> <text @click="openReply(comment)" class="reply-btu time">鍥炲</text> - <text class="thumbs-up time iconfont"></text> + <text v-if="!comment.hasThumbsUp" class="thumbs-up time iconfont" @click="thubmsUp(comment.id, index, null)"><text v-show="comment.thumbsUpNum > 0" class="thumbs-num">{{comment.thumbsUpNum}}</text></text> + <text v-else class="thumbs-up time iconfont" @click="cancelThumbsUp(comment.id, index, null)"><text v-show="comment.thumbsUpNum > 0" class="thumbs-num">{{comment.thumbsUpNum}}</text></text> </view> </view> </view> <!-- 鍥炲鍒楄〃 --> <view class="reply-list" v-if="comment.replies && comment.replies.length > 0"> - <view class="reply-item" v-for="reply in comment.replies" :key="reply.id"> + <view class="reply-item" v-for="(reply, replyIndex) in comment.replies" :key="reply.id"> <view class="reply-content"> <view style="display: flex;"> <image class="comment-reply-avatar" :src="reply.replyUserAvatar || '/static/default-avatar.png'"></image> @@ -140,7 +141,8 @@ <view class="reply-footer"> <text class="time">{{formatTime(reply.createTime)}}</text> <text @click="openReply(comment, reply)" class="reply-btu time">鍥炲</text> - <text class="thumbs-up time iconfont"> </text> + <text v-if="!reply.hasThumbsUp" class="thumbs-up time iconfont" @click="thubmsUp(reply.id, index, replyIndex)"><text v-show="reply.thumbsUpNum > 0" class="thumbs-num">{{reply.thumbsUpNum}}</text></text> + <text v-else class="thumbs-up time iconfont" @click="cancelThumbsUp(reply.id, index, replyIndex)"><text v-show="reply.thumbsUpNum > 0" class="thumbs-num">{{reply.thumbsUpNum}}</text></text> </view> </view> </view> @@ -176,11 +178,12 @@ </template> <script> -import { getRecommendVideos, savePlayRecord, subscribe, getVideoComments, addVideoComment } from "@/api/video.js"; +import { getRecommendVideos, savePlayRecord, subscribe, getVideoComments, addVideoComment, thubmsUpComment, cancelThubmsUpComment } from "@/api/video.js"; import { changeCollect } from "@/api/collect.js"; export default { data() { return { + videoNoMore: false, // 鏄惁杩樻湁鏇村瑙嗛 commentNoMore: false, // 鏄惁杩樻湁鏇村璇勮 commentQuery: { pageNumber: 1, @@ -202,7 +205,7 @@ replyUserId: '', replyUserNickname: '', replyUserAvatar: '', - masterCommentId: '' + masterCommentId: null }, comments: [], // 璇勮鍒楄〃 commentsTotal: 0, // 璇勮鎬绘潯鏁� @@ -226,8 +229,11 @@ ], // 瑙嗛鍒楄〃鏁版嵁 videoContexts: [], // 瑙嗛涓婁笅鏂囧璞¢泦鍚� loading: false, // 鏄惁姝e湪鍔犺浇 - page: 1, // 褰撳墠椤电爜 - pageSize: 10 // 姣忛〉鏁伴噺 + videoQuery: { + pageNumber: 1, + pageSize: 6, + videoFrom: 'recommend' + } } }, onShow() { @@ -249,6 +255,44 @@ this.initVideoContexts(); }, methods: { + // 璺宠浆涓汉涓婚〉 + jumpToHomePage(authorId) { + uni.navigateTo({ + url: "/pages/video/home-page?authorId=" + authorId + }) + }, + // 鍙栨秷鐐硅禐 + async cancelThumbsUp(id, commentIndex, replyIndex) { + const data = { + refId: id, + thumbsUpType: 'video_comment' + } + cancelThubmsUpComment(data).then(res => { + if(replyIndex != null) { + this.comments[commentIndex].replies[replyIndex].hasThumbsUp = false; + this.comments[commentIndex].replies[replyIndex].thumbsUpNum -= 1; + } else { + this.comments[commentIndex].hasThumbsUp = false; + this.comments[commentIndex].thumbsUpNum -= 1; + } + }) + }, + // 璇勮鐐硅禐 + async thubmsUp(id, commentIndex, replyIndex) { + const data = { + refId: id, + thumbsUpType: 'video_comment' + } + thubmsUpComment(data).then(res => { + if(replyIndex != null) { + this.comments[commentIndex].replies[replyIndex].hasThumbsUp = true; + this.comments[commentIndex].replies[replyIndex].thumbsUpNum += 1; + } else { + this.comments[commentIndex].hasThumbsUp = true; + this.comments[commentIndex].thumbsUpNum += 1; + } + }) + }, // 鍔犺浇涓嬩竴椤靛洖澶� loadNextPageReply(index) { this.replyCommentQuery.pageNumber++; @@ -285,7 +329,7 @@ replyUserId: '', replyUserNickname: '', replyUserAvatar: '', - masterCommentId: '' + masterCommentId: null } }, // 鍙栨秷鍥炲 @@ -453,22 +497,31 @@ // 鍔犺浇瑙嗛鏁版嵁 async loadVideos() { - if (this.loading) return; + if (this.loading || this.videoNoMore) return; this.loading = true; - getRecommendVideos({pageNumber: this.page, pageSize: this.pageSize}).then(res => { + getRecommendVideos(this.videoQuery).then(res => { console.log(res, "瑙嗛鏁版嵁"); - if (this.page === 1) { + if (this.videoQuery.pageNumber === 1) { this.videoList = res.data.data; } else { - this.videoList = [...this.videoList, ...res.data.data]; + this.videoList = [ + ...this.videoList, + ...res.data.data.filter( + (newItem) => !this.videoList.some((oldItem) => oldItem.id === newItem.id) + ), + ]; } - - this.page++; this.$nextTick(() => { this.initVideoContexts(); }); this.loading = false; + if(res.data.data.length < this.videoQuery.pageSize) { + this.videoNoMore = true; + return; + } + this.videoQuery.pageNumber++; + }) }, @@ -522,6 +575,7 @@ }, // 鍗曞嚮灞忓箷锛氭殏鍋滄垨缁х画鎾斁 togglePlay(index) { + console.log("鍗曞嚮瑙嗛", index, this.videoContexts); if(this.currentVideoIsPlaying) { this.videoContexts[index].pause(); } else { @@ -946,8 +1000,9 @@ } .thumbs-up { position: absolute; - right: 80rpx; + right: 20rpx; font-size: 32rpx; + width: 120rpx; } .textSideIcon { font-size: 36rpx; @@ -957,4 +1012,7 @@ margin-right: 10rpx; color: #cccccc; } + .thumbs-num { + margin-left: 4rpx; + } </style> \ No newline at end of file diff --git a/pages/tabbar/video/video.vue b/pages/tabbar/video/video.vue index edab4fc..cc04f4e 100644 --- a/pages/tabbar/video/video.vue +++ b/pages/tabbar/video/video.vue @@ -20,7 +20,7 @@ </view> <view class="video-actions"> <u-button type="error" size="mini" @click="reUpload">閲嶆柊涓婁紶</u-button> - <u-button type="primary" size="mini" @click="chooseCover" v-if="videoInfo.url">閫夋嫨灏侀潰</u-button> + <u-button type="primary" size="mini" @click="chooseCover" v-if="videoInfo.url">{{formData.cover ? '鏇存崲灏侀潰' : '璇烽�夋嫨灏侀潰'}}</u-button> </view> </view> </view> @@ -57,7 +57,7 @@ :key="index" :text="tag.tagName" :index="index" - type="error" + type="success" @close="removeTag(index)" /> </view> @@ -74,7 +74,7 @@ :key="index" :text="tag.tagName" :index="index" - type="primary" + type="success" :closeable="false" @click="selectTopic(index)" /> @@ -178,8 +178,9 @@ import UInput from '@/uview-components/uview-ui/components/u-input/u-input.vue'; import USearch from '@/uview-components/uview-ui/components/u-search/u-search.vue'; import UPopup from '@/uview-components/uview-ui/components/u-popup/u-popup.vue'; -import MyTag from "@/components/my-tag.vue" -import { getSTSToken } from "@/api/common.js"; +import MyTag from '@/components/my-tag.vue' + +import { getSTSToken, getFilePreviewUrl } from "@/api/common.js"; import { publish } from "@/api/video.js"; import { getRecommendTag3 } from "@/api/video-tag.js"; import { getFileKey } from "@/utils/file.js"; @@ -239,7 +240,7 @@ }, computed: { canPublish() { - return this.formData.videoFileKey && this.formData.title; + return this.formData.videoFileKey && this.formData.title && this.formData.cover; }, filteredGoods() { if (!this.goodsSearch) return this.goodsList; @@ -272,7 +273,6 @@ }, // 鍒濆鍖栬吘璁簯cos瀹㈡埛绔� initCOS() { - console.log("鎵ц浜�"); // 璋冪敤鍚庣鑾峰彇sts涓存椂璁块棶鍑瘉 getSTSToken().then(res => { const COS = require('@/lib/cos-wx-sdk-v5.js'); // 寮�鍙戞椂浣跨敤 @@ -389,7 +389,30 @@ sizeType: ['compressed'], sourceType: ['album'], success: (res) => { + let fileName = res.tempFilePaths[0].substring(res.tempFilePaths[0].lastIndexOf('/') + 1); + // 澶勭悊瀹夊崜鍙兘鐨刄RI缂栫爜 + if(fileName.indexOf('%') > -1) { + fileName = decodeURIComponent(fileName); + } + const fileKey = getFileKey(fileName); this.videoInfo.cover = res.tempFilePaths[0]; + this.cosClient.uploadFile({ + Bucket: this.bucket, + Region: this.region, + Key: fileKey, + FilePath: res.tempFilePaths[0], + SliceSize: 1024 * 1024 * 5 /* 瑙﹀彂鍒嗗潡涓婁紶鐨勯槇鍊�,5M */ + }, (err, data) => { + if (err) { + console.log('涓婁紶澶辫触', err); + } else { + // 鑾峰彇灏侀潰鐨勮闂湴鍧� + getFilePreviewUrl(fileKey).then(res => { + this.videoInfo.cover = res.data.data + this.formData.cover = fileKey + }) + } + }); } }); }, diff --git a/pages/video/home-page-edit.vue b/pages/video/home-page-edit.vue new file mode 100644 index 0000000..97deb45 --- /dev/null +++ b/pages/video/home-page-edit.vue @@ -0,0 +1,278 @@ +<template> + <view class="edit-profile-container"> + <!-- 澶撮儴鏍囬 --> + <view class="header"> + <text class="title">缂栬緫璧勬枡</text> + </view> + + <!-- 琛ㄥ崟鍖哄煙 --> + <view class="form-container"> + <!-- 澶村儚涓婁紶 --> + <view class="form-item"> + <text class="label">澶村儚</text> + <view class="avatar-upload" @click="chooseAvatar"> + <image class="avatar" :src="formData.avatar" mode="aspectFill"></image> + <view class="upload-tip">鐐瑰嚮淇敼</view> + </view> + </view> + + <!-- 鏄电О --> + <view class="form-item"> + <text class="label">鏄电О</text> + <input + class="input" + type="nickname" + v-model="formData.nickName" + placeholder="璇疯緭鍏ユ樀绉�" + @blur="validateNickname" + /> + </view> + + <!-- 绛惧悕 --> + <view class="form-item"> + <text class="label">绛惧悕</text> + <textarea + class="textarea" + v-model="formData.motto" + placeholder="浠嬬粛涓�涓嬭嚜宸卞惂~" + maxlength="50" + auto-height + /> + <text class="word-count">{{ formData.motto.length }}/50</text> + </view> + </view> + + <!-- 淇濆瓨鎸夐挳 --> + <view class="btn-container"> + <button + class="save-btn" + :disabled="isSaving" + @click="saveInfo" + > + {{ isSaving ? '淇濆瓨涓�...' : '淇濆瓨淇敼' }} + </button> + </view> + </view> +</template> + +<script> +import { getSTSToken, getFilePreviewUrl } from "@/api/common.js"; +import { saveVideoHomeInfo } from "@/api/user.js"; +import { getFileKey } from "@/utils/file.js"; +export default { + data() { + return { + formData: { + avatar: '', + nickName: '', + motto: '', + authorId: '' + }, + isSaving: false, + bucket: '', + region: '', + cosClient: null + } + }, + onShow() { + this.initCOS(); + }, + onLoad(option) { + this.formData.authorId = option.authorId; + this.formData.avatar = option.avatar; + this.formData.nickName = option.nickName; + this.formData.motto = option.motto ? option.motto : ''; + }, + methods: { + initCOS() { + // 璋冪敤鍚庣鑾峰彇sts涓存椂璁块棶鍑瘉 + getSTSToken().then(res => { + const COS = require('@/lib/cos-wx-sdk-v5.js'); // 寮�鍙戞椂浣跨敤 + // const COS = require('./lib/cos-wx-sdk-v5.min.js'); // 涓婄嚎鏃朵娇鐢ㄥ帇缂╁寘 + + // console.log(COS.version); sdk 鐗堟湰闇�瑕佷笉浣庝簬 1.7.2 + this.cosClient = new COS({ + SecretId: res.data.data.tmpSecretId, // sts 鏈嶅姟涓嬪彂鐨勪复鏃� secretId + SecretKey: res.data.data.tmpSecretKey, // sts 鏈嶅姟涓嬪彂鐨勪复鏃� secretKey + SecurityToken: res.data.data.sessionToken, // sts 鏈嶅姟涓嬪彂鐨勪复鏃� SessionToken + StartTime: res.data.data.stsStartTime, // 寤鸿浼犲叆鏈嶅姟绔椂闂达紝鍙伩鍏嶅鎴风鏃堕棿涓嶅噯瀵艰嚧鐨勭鍚嶉敊璇� + ExpiredTime: res.data.data.stsEndTime, // 涓存椂瀵嗛挜杩囨湡鏃堕棿 + SimpleUploadMethod: 'putObject', // 寮虹儓寤鸿锛岄珮绾т笂浼犮�佹壒閲忎笂浼犲唴閮ㄥ灏忔枃浠跺仛绠�鍗曚笂浼犳椂浣跨敤 putObject,sdk 鐗堟湰鑷冲皯闇�瑕乿1.3.0 + }); + this.bucket = res.data.data.bucket + this.region = res.data.data.region + }) + }, + // 閫夋嫨澶村儚 + chooseAvatar() { + uni.chooseImage({ + count: 1, + sizeType: ['compressed'], + sourceType: ['album', 'camera'], + success: (res) => { + const tempPath = res.tempFilePaths[0]; + // 鑾峰彇鏂囦欢鍚� + let fileName = tempPath.substring(tempPath.lastIndexOf('/') + 1); + // 澶勭悊瀹夊崜鍙兘鐨刄RI缂栫爜 + if(fileName.indexOf('%') > -1) { + fileName = decodeURIComponent(fileName); + } + const fileKey = getFileKey(fileName); + this.cosClient.uploadFile({ + Bucket: this.bucket, + Region: this.region, + Key: fileKey, + FilePath: tempPath, + SliceSize: 1024 * 1024 * 5, /* 瑙﹀彂鍒嗗潡涓婁紶鐨勯槇鍊�,5M */ + }, (err, data) => { + if (err) { + console.log('涓婁紶澶辫触', err); + this.formData.avatar = '' + uni.showToast({ + title: '鍥剧墖涓婁紶澶辫触', + icon: 'none' + }); + } else { + getFilePreviewUrl(fileKey).then(res => { + this.formData.avatar = res.data.data + }) + } + }); + }, + fail: (err) => { + console.error('閫夋嫨鍥剧墖澶辫触:', err); + uni.showToast({ + title: '閫夋嫨鍥剧墖澶辫触', + icon: 'none' + }); + } + }); + }, + // 楠岃瘉鏄电О + validateNickname() { + if (!this.formData.nickName.trim()) { + uni.showToast({ title: '鏄电О涓嶈兘涓虹┖', icon: 'none' }); + return false; + } + if (this.formData.nickName.length > 12) { + uni.showToast({ title: '鏄电О涓嶈兘瓒呰繃12涓瓧绗�', icon: 'none' }); + return false; + } + return true; + }, + + // 淇濆瓨涓汉淇℃伅 + async saveInfo() { + this.isSaving = true; + if(this.validateNickname()) { + saveVideoHomeInfo(this.formData).then(res => { + uni.showToast({ + title: '淇濆瓨鎴愬姛', + icon: 'success' + }); + // 杩斿洖涓婄骇椤甸潰 + uni.navigateBack({ + delta: 1 + }); + }) + } + } + } +} +</script> + +<style lang="scss" scoped> +.edit-profile-container { + padding: 20rpx 30rpx; + min-height: 100vh; + background-color: #f7f7f7; +} + +.header { + padding: 30rpx 0; + .title { + font-size: 36rpx; + font-weight: bold; + color: #333; + } +} + +.form-container { + background-color: #fff; + border-radius: 16rpx; + padding: 0 30rpx; + margin-bottom: 40rpx; +} + +.form-item { + padding: 30rpx 0; + border-bottom: 1rpx solid #f2f2f2; + display: flex; + flex-direction: column; + + &:last-child { + border-bottom: none; + } + + .label { + font-size: 30rpx; + color: #333; + margin-bottom: 20rpx; + } +} + +.avatar-upload { + display: flex; + align-items: center; + + .avatar { + width: 120rpx; + height: 120rpx; + border-radius: 50%; + margin-right: 30rpx; + } + + .upload-tip { + color: #999; + font-size: 26rpx; + } +} + +.input { + height: 80rpx; + font-size: 28rpx; + color: #333; +} + +.textarea { + width: 100%; + min-height: 120rpx; + font-size: 28rpx; + color: #333; + padding: 10rpx 0; +} + +.word-count { + align-self: flex-end; + font-size: 24rpx; + color: #999; + margin-top: 10rpx; +} + +.btn-container { + padding: 0 30rpx; + + .save-btn { + background-color: #07c160; + color: #fff; + border-radius: 50rpx; + font-size: 32rpx; + + &[disabled] { + background-color: #cccccc; + color: #fff; + opacity: 0.7; + } + } +} +</style> diff --git a/pages/video/home-page.vue b/pages/video/home-page.vue new file mode 100644 index 0000000..10be23c --- /dev/null +++ b/pages/video/home-page.vue @@ -0,0 +1,549 @@ +<template> + <view class="container"> + <!-- 鐢ㄦ埛淇℃伅澶撮儴 --> + <view class="user-header"> + <view class="user-avatar-container"> + <image class="user-avatar" :src="userInfo.avatar" mode="aspectFill"></image> + </view> + <view class="user-info"> + <view class="user-name">{{userInfo.nickName}}</view> + <view class="user-id">ID: {{userInfo.userId}}</view> + <view class="user-desc">{{userInfo.motto || '娌℃湁绛惧悕锛屼篃寰堜釜鎬'}}</view> + </view> + <view class="stats-container"> + <view class="stat-item" @click="navigateToFollow('fans')"> + <text class="stat-number">{{userInfo.fansNum}}</text> + <text class="stat-label">绮変笣</text> + </view> + <view class="stat-item" @click="navigateToFollow('follow')"> + <text class="stat-number">{{userInfo.subNum}}</text> + <text class="stat-label">鍏虫敞</text> + </view> + <view class="stat-item" @click="navigateToLike"> + <text class="stat-number">{{userInfo.likeNum}}</text> + <text class="stat-label">鑾疯禐</text> + </view> + </view> + + <!-- 鍏虫敞鎸夐挳 --> + <view class="follow-btn-container" v-if="!userInfo.self"> + <button + class="follow-btn" + :class="{followed: userInfo.hasSub}" + @click="toggleFollow" + > + {{userInfo.hasSub ? '鍙栨秷鍏虫敞' : '鍏虫敞'}} + </button> + </view> + + <view class="edit-icon" @click="editInfo" v-if="userInfo.self"> + <uni-icons type="compose" size="20" color="#666"></uni-icons>缂栬緫涓婚〉淇℃伅 + </view> + </view> + + <!-- 浣滃搧/鍠滄鍒囨崲 --> + <view class="tab-bar"> + <view + class="tab-item" + :class="{active: currentTab === 'works'}" + @click="switchTab('works')" + > + 浣滃搧{{`(${videoTotal})`}} + </view> + <view + class="tab-item" + :class="{active: currentTab === 'likes'}" + @click="switchTab('likes')" + > + 鍠滄 + </view> + </view> + + <!-- 瑙嗛鍒楄〃 --> + <scroll-view class="video-list" scroll-y :show-scrollbar="false" @scrolltolower="getPage" v-show="currentTab === 'works' && videoList.length > 0"> + <view class="video-container"> + <view + class="video-item" + v-for="(item, index) in videoList" + :key="item.id" + @click="playAuthorVideo(index)" + > + <image class="video-cover" :src="item.coverUrl" mode="aspectFill"></image> + <view class="video-info"> + <view class="video-stats"> + <view class="stat"> + <uni-icons type="heart" size="16" color="#fff"></uni-icons> + <text>{{item.collectNum}}</text> + </view> + </view> + </view> + </view> + </view> + </scroll-view> + <scroll-view class="video-list" scroll-y :show-scrollbar="false" @scrolltolower="getPage" v-show="currentTab === 'likes' && collectVideoList.length > 0"> + <view class="video-container"> + <view + class="video-item" + v-for="(item, index) in collectVideoList" + :key="item.id" + @click="playCollectVideo(index)" + > + <image class="video-cover" :src="item.coverUrl" mode="aspectFill"></image> + <view class="video-info"> + <view class="video-stats"> + <view class="stat"> + <uni-icons type="heart" size="16" color="#fff"></uni-icons> + <text>{{item.collectNum}}</text> + </view> + </view> + </view> + </view> + </view> + </scroll-view> + + <!-- 绌虹姸鎬� --> + <view class="empty-state" v-if="videoList.length === 0 && currentTab === 'works'"> + <!-- <image src="/static/images/empty.png" mode="aspectFit" class="empty-image"></image> --> + <text class="empty-text">杩樻湭鍙戝竷浣滃搧鍝</text> + </view> + <!-- 绌虹姸鎬� --> + <view class="empty-state" v-if="collectVideoList.length === 0 && currentTab === 'likes'"> + <!-- <image src="/static/images/empty.png" mode="aspectFit" class="empty-image"></image> --> + <text class="empty-text">杩樻病鏈夌偣璧炰綔鍝佸摝~</text> + </view> + </view> +</template> + +<script> +import {getAuthorInfo, getAuthorVideoPage, getAuthorCollectVideoPage} from '@/api/user.js' +import {subscribe, unSubscribe} from '@/api/video.js' +export default { + data() { + return { + currentTab: 'works', // works: 浣滃搧, likes: 鍠滄 + authorId: '', + userInfo: { + avatar: '', + nickName: '', + userId: '', + motto: '', + fansNum: 0, + subNum: 0, + likeNum: 0, + self: false, + hasSub: false + }, + videoQuery: { + authorId: '', + pageNumber: 1, + pageSize: 10 + }, + collectVideoQuery: { + authorId: '', + pageNumber: 1, + pageSize: 10 + }, + videoTotal: 0, + videoList: [], // 浣滃搧 + collectVideoList: [], // 鏀惰棌 + nomoreVideo: false, + nomoreCollectVideo: false + } + }, + onShow() { + this.getAuthorInfo(); + }, + onLoad(option) { + this.authorId = option.authorId; + this.getAuthorInfo(); + this.getAuthorVideoPage(); + }, + methods: { + getPage() { + if(this.currentTab === 'works') { + if(this.nomoreVideo) { + return; + } + getAuthorVideoPage(this.videoQuery).then(res => { + if(this.videoQuery.pageNumber === 1) { + this.videoList = res.data.data + } else { + this.videoList = [ + ...this.videoList, + ...res.data.data.filter( + (newItem) => !this.videoList.some((oldItem) => oldItem.id === newItem.id) + ), + ]; + } + if(res.data.data.length < this.videoQuery.pageSize) { + this.nomoreVideo = true; + } else { + this.videoQuery.pageNumber += 1; + } + }) + } else if(this.currentTab === 'likes') { + if(this.nomoreCollectVideo) { + return; + } + getAuthorCollectVideoPage(this.collectVideoQuery).then(res => { + if(this.collectVideoQuery.pageNumber === 1) { + this.collectVideoList = res.data.data + } else { + this.collectVideoList = [ + ...this.collectVideoList, + ...res.data.data.filter( + (newItem) => !this.collectVideoList.some((oldItem) => oldItem.id === newItem.id) + ), + ]; + } + if(res.data.data.length < this.collectVideoQuery.pageSize) { + this.nomoreCollectVideo = true; + } else { + this.collectVideoQuery.pageNumber += 1; + } + }) + } + }, + // 鑾峰彇涓汉淇℃伅 + async getAuthorInfo() { + getAuthorInfo(this.authorId).then(res => { + this.userInfo = res.data.data + }) + }, + // 鑾峰彇浣滆�呬綔鍝� + async getAuthorVideoPage() { + this.videoQuery.authorId = this.authorId; + getAuthorVideoPage(this.videoQuery).then(res => { + this.videoList = res.data.data + this.videoTotal = res.data.total + if(res.data.data.length < this.videoQuery.pageSize) { + this.nomoreVideo = true; + } + }) + }, + // 鍒囨崲鍏虫敞鐘舵�� + toggleFollow() { + if(this.userInfo.hasSub) { + // 鍙栨秷鍏虫敞 + unSubscribe(this.authorId).then(res => { + uni.showToast({ + title: '宸插彇娑堝叧娉�', + icon: 'none' + }); + this.userInfo.hasSub = false + this.userInfo.fansNum -= 1; + }) + } else { + // 鍏虫敞 + subscribe(this.authorId).then(res => { + uni.showToast({ + title: '鍏虫敞鎴愬姛', + icon: 'success' + }); + this.userInfo.hasSub = true + this.userInfo.fansNum += 1; + }) + } + }, + // 鍒囨崲浣滃搧/鍠滄tab + switchTab(tab) { + if(this.currentTab === tab) { + return + } + this.currentTab = tab; + if(tab === 'works') { + this.collectVideoList = [] + this.videoQuery.pageNumber = 1 + this.getAuthorVideoPage() + } else if(tab === 'likes') { + this.videoList = [] + this.collectVideoQuery.pageNumber = 1 + this.getAuthorCollectVideoPage() + } + }, + // 鑾峰彇浣滆�呯殑鏀惰棌瑙嗛 + async getAuthorCollectVideoPage() { + this.collectVideoQuery.authorId = this.authorId + getAuthorCollectVideoPage(this.collectVideoQuery).then(res => { + this.collectVideoList = res.data.data + if(res.data.data.length < this.collectVideoQuery.pageSize) { + this.nomoreCollectVideo = true; + } + }) + }, + // 鎾斁浣滆�呰棰� + playAuthorVideo(index) { + const playInfo = { + videoList: this.videoList, + nomore: this.nomoreVideo, + pageNumber: this.videoQuery.pageNumber, + playIndex: index + } + uni.setStorageSync("playInfo", playInfo) + uni.navigateTo({ + url: `/pages/video/video-play?authorId=${this.authorId}&videoFrom=author` + }); + }, + // 鎾斁鏀惰棌瑙嗛 + playAuthorVideo(index) { + const playInfo = { + videoList: this.collectVideoList, + nomore: this.nomoreCollectVideo, + pageNumber: this.collectVideoQuery.pageNumber, + playIndex: index + } + uni.setStorageSync("playInfo", playInfo) + uni.navigateTo({ + url: `/pages/video/video-play?authorId=${this.authorId}&videoFrom=collect` + }); + }, + // 缂栬緫涓汉璧勬枡 + editInfo() { + uni.navigateTo({ + url: `/pages/video/home-page-edit?authorId=${this.authorId}&avatar=${this.userInfo.avatar}&motto=${this.userInfo.motto || ''}&nickName=${this.userInfo.nickName}` + }); + }, + + // 璺宠浆鍒扮矇涓�/鍏虫敞鍒楄〃 + navigateToFollow(type) { + uni.navigateTo({ + url: `/pages/user/follow?type=${type}` + }); + }, + + // 璺宠浆鍒扮偣璧炲垪琛� + navigateToLike() { + uni.navigateTo({ + url: '/pages/user/like' + }); + } + } +} +</script> + +<style lang="scss" scoped> +body { + background-color: #fff !important; +} +.container { + padding-bottom: 20rpx; + background-color: white; + min-height: 100vh; +} + +.user-header { + background-color: #fff; + padding: 30rpx; + display: flex; + flex-direction: column; + position: relative; +} + +.user-avatar-container { + position: relative; + width: 120rpx; + height: 120rpx; + margin-right: 30rpx; +} + +.user-avatar { + width: 100%; + height: 100%; + border-radius: 50%; + border: 2rpx solid #f1f1f1; +} + +.edit-icon { + position: absolute; + right: 30rpx; + top: 30rpx; + background-color: #fff; + height: 40rpx; + display: flex; + justify-content: center; + align-items: center; +} + +.user-info { + margin-top: 20rpx; + flex: 1; +} + +.user-name { + font-size: 36rpx; + font-weight: bold; + margin-bottom: 10rpx; +} + +.user-id { + font-size: 24rpx; + color: #999; + margin-bottom: 15rpx; +} + +.user-desc { + font-size: 28rpx; + color: #666; + line-height: 1.4; +} + +.stats-container { + display: flex; + margin-top: 30rpx; + justify-content: space-around; +} + +.stat-item { + display: flex; + flex-direction: column; + align-items: center; + padding: 0 20rpx; +} + +.stat-number { + font-size: 32rpx; + font-weight: bold; + margin-bottom: 5rpx; +} + +.stat-label { + font-size: 24rpx; + color: #999; +} + +.tab-bar { + display: flex; + background-color: #fff; + padding-bottom: 20rpx; +} + +.tab-item { + flex: 1; + text-align: center; + padding: 20rpx 0; + font-size: 30rpx; + color: #666; + position: relative; +} + +.tab-item.active { + color: #ff2442; + font-weight: bold; +} + +.tab-item.active::after { + content: ''; + position: absolute; + bottom: 0; + left: 50%; + transform: translateX(-50%); + width: 80rpx; + height: 4rpx; + background-color: #ff2442; + border-radius: 2rpx; +} + +.video-list { + width: calc(100% - 20rpx); + padding: 0 10rpx; + height: calc(100vh - 554rpx); + background-color: #fff; +} + +.video-item { + width: 50%; + padding: 10rpx; + box-sizing: border-box; + position: relative; +} + +.video-cover { + width: 100%; + height: 500rpx; + border-radius: 10rpx; + display: block; +} + +.video-info { + position: absolute; + bottom: 20rpx; + left: 20rpx; + right: 20rpx; + color: #fff; + font-size: 24rpx; +} + +.video-title { + display: block; + margin-bottom: 10rpx; + text-shadow: 0 0 5rpx rgba(0, 0, 0, 0.5); + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.video-stats { + display: flex; +} + +.stat { + display: flex; + align-items: center; + margin-right: 20rpx; + text-shadow: 0 0 5rpx rgba(0, 0, 0, 0.5); +} + +.stat text { + margin-left: 5rpx; +} + +.empty-state { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 100rpx 0; +} + +.empty-image { + width: 300rpx; + height: 300rpx; + opacity: 0.6; + margin-bottom: 30rpx; +} + +.empty-text { + font-size: 28rpx; + color: #999; +} + +.follow-btn-container { + margin-top: 30rpx; + padding: 0 20rpx; +} + +.follow-btn { + background-color: #ff2442; + color: #fff; + border: none; + border-radius: 40rpx; + font-size: 28rpx; + height: 70rpx; + line-height: 70rpx; + padding: 0 40rpx; + + &::after { + border: none; + } + + &.followed { + background-color: #f5f5f5; + color: #666; + } +} + +.video-container { + display: flex; + flex-wrap: wrap +} +</style> \ No newline at end of file diff --git a/pages/video/video-play.vue b/pages/video/video-play.vue new file mode 100644 index 0000000..d98f74e --- /dev/null +++ b/pages/video/video-play.vue @@ -0,0 +1,1028 @@ +<template> + <view class="video-container"> + <!-- 瑙嗛鍒楄〃 --> + <swiper + class="video-swiper" + vertical + circular + :current="currentIndex" + @change="onSwiperChange" + > + <swiper-item v-for="(item, index) in videoList" :key="item.id"> + <!-- 鎾斁鎸夐挳锛堜粎褰撹棰戞殏鍋滄椂鏄剧ず锛� --> + <view + class="play-icon" + @click="togglePlay(index)" + v-if="!currentVideoIsPlaying" + > + <image src="/static/video/play.png" style="width: 45px;height: 45px" mode="aspectFit"></image> + </view> + <video + :id="'video'+index" + :ref="'video'+index" + :src="item.videoUrl" + :autoplay="currentIndex === index" + :controls="false" + :loop="true" + :object-fit="item.objectFit" + class="video-item" + @play="onPlay(item.id, index)" + @pause="onPause(index)" + @ended="onEnded(index)" + @click="togglePlay(index)" + @timeupdate="onTimeUpdate($event)" + ></video> + + <!-- 鎮寕鍟嗗搧閾炬帴灞� --> + <view class="goods-link-warp"> + <view class="goods-link"> + <view class="goods-container"> + <!-- 鍟嗗搧鍥剧墖 --> + <image class="goods-image" :src="item.goods.imageUrl" mode="aspectFill"></image> + + <!-- 鍟嗗搧淇℃伅 --> + <view class="goods-info"> + <text class="goods-name">{{item.goods.name}}</text> + <view class="price-section"> + <text class="current-price">楼{{item.goods.price}}</text> + <text class="original-price" v-if="item.goods.originalPrice">楼{{item.goods.originalPrice}}</text> + </view> + <text class="sales-count">{{item.goods.saleNum}}浜哄凡璐�</text> + </view> + + <!-- 璐拱鎸夐挳 --> + <view class="buy-button"> + <text>璐拱</text> + </view> + </view> + </view> + </view> + + + <!-- 瑙嗛淇℃伅灞� --> + <view class="video-info"> + <view> + <text class="video-author">@{{item.authorName}}</text> + </view> + <view style="width: 100%;word-wrap: break-word;white-space: normal;overflow-wrap: break-word;"> + <text class="video-title">{{item.title}}</text> + <text class="video-tag" v-for="(tag, index) in item.tagList" :key="tag.id">#{{tag.tagName}}</text> + </view> + </view> + + <!-- 鍙充晶浜掑姩鎸夐挳 --> + <view class="action-buttons"> + <view class="avatar-container"> + <image class="avatar" @click="jumpToHomePage(item.authorId)" :src="item.authorAvatar" mode="aspectFill"></image> + <!-- 鍏虫敞鍥炬爣 - 浣跨敤缁濆瀹氫綅 --> + <view v-if="!item.subscribeThisAuthor" class="follow-icon" @click="subscribeAuth(index, item.authorId)"> + <text class="iconfont"></text> + </view> + </view> + <view class="action-item" @click="toggleCollect(item, index)"> + <text class="iconfont" v-if="item.collected"></text> + <text class="iconfont" v-else></text> + <text style="font-size: 10px;font-weight: lighter;">{{item.collectNum}}</text> + </view> + <view class="action-item" @click="showComments(item)"> + <text class="iconfont"></text> + <text style="font-size: 10px;font-weight: lighter;">{{item.commentNum}}</text> + </view> + </view> + + </swiper-item> + </swiper> + + <!-- 璇勮寮圭獥 --> + <uni-popup ref="commentPopup" type="bottom" :is-mask-click="true" @maskClick="closeCommentPopup"> + <view class="comment-popup"> + <view class="popup-header"> + <text class="popup-title" v-if="!commentForm.replyId">璇勮({{commentsTotal}})</text> + <view class="reply-title" v-else> + <text>鍥炲 @{{commentForm.replyUserNickname}}</text> + <text class="cancel-reply" @click="cancelReply">鍙栨秷</text> + </view> + <text class="iconfont close-icon" @click="closeCommentPopup"></text> + </view> + + <scroll-view class="comment-list" scroll-y :show-scrollbar="false" @scrolltolower="getCommentPage"> + <view v-if="commentLoading" class="loading"> + <uni-load-more status="loading"></uni-load-more> + </view> + + <view v-else-if="comments.length === 0" class="empty"> + 鏆傛棤璇勮锛屽揩鏉ュ彂琛ㄧ涓�鏉¤瘎璁哄惂~ + </view> + + <view v-else class="comment-item" v-for="(comment, index) in comments" :key="comment.id"> + <view style="display: flex;"> + <image class="comment-avatar" :src="comment.userAvatar || '/static/default-avatar.png'"></image> + <view class="comment-content"> + <text class="nickname">{{comment.userNickname}}</text> + <text class="content">{{comment.commentContent}}</text> + <view style="position: relative;"> + <text class="time">{{formatTime(comment.createTime)}}</text> + <text @click="openReply(comment)" class="reply-btu time">鍥炲</text> + <text v-if="!comment.hasThumbsUp" class="thumbs-up time iconfont" @click="thubmsUp(comment.id, index, null)"><text v-show="comment.thumbsUpNum > 0" class="thumbs-num">{{comment.thumbsUpNum}}</text></text> + <text v-else class="thumbs-up time iconfont" @click="cancelThumbsUp(comment.id, index, null)"><text v-show="comment.thumbsUpNum > 0" class="thumbs-num">{{comment.thumbsUpNum}}</text></text> + </view> + </view> + </view> + <!-- 鍥炲鍒楄〃 --> + <view class="reply-list" v-if="comment.replies && comment.replies.length > 0"> + <view class="reply-item" v-for="(reply, replyIndex) in comment.replies" :key="reply.id"> + <view class="reply-content"> + <view style="display: flex;"> + <image class="comment-reply-avatar" :src="reply.replyUserAvatar || '/static/default-avatar.png'"></image> + <text class="nickname">{{reply.userNickname}}</text> + <text v-if="reply.replyUserId && reply.masterCommentId !== reply.replyId" class="reply-to"><text style="margin-right: 10rpx;font-size: 28rpx;" class="iconfont"></text>{{reply.replyUserNickname}}</text> + </view> + <text class="content">{{reply.commentContent}}</text> + <view class="reply-footer"> + <text class="time">{{formatTime(reply.createTime)}}</text> + <text @click="openReply(comment, reply)" class="reply-btu time">鍥炲</text> + <text v-if="!reply.hasThumbsUp" class="thumbs-up time iconfont" @click="thubmsUp(reply.id, index, replyIndex)"><text v-show="reply.thumbsUpNum > 0" class="thumbs-num">{{reply.thumbsUpNum}}</text></text> + <text v-else class="thumbs-up time iconfont" @click="cancelThumbsUp(reply.id, index, replyIndex)"><text v-show="reply.thumbsUpNum > 0" class="thumbs-num">{{reply.thumbsUpNum}}</text></text> + </view> + </view> + </view> + </view> + <view class="view-more-replies" v-if="comment.replyTotalCount > 0 && !comment.expandReply" @click="loadRepliesPage(comment, index)"> + <text class="line">鈥斺��</text>灞曞紑{{comment.replyTotalCount}}鏉″洖澶� 鈫� + </view> + <view class="reply-op" v-if="comment.replyTotalCount > replyCommentQuery.pageNumber * replyCommentQuery.pageSize && comment.expandReply"> + <view @click="loadNextPageReply(index)" class="reply-op-item"><text class="line">鈥斺��</text>灞曞紑鏇村<text class="iconfont textSideIcon"></text></view> + <view @click="retractReplyComment(index)" class="reply-op-item" style="margin-left: 50rpx;">鏀惰捣<text class="iconfont textSideIcon"></text></view> + </view> + <view class="reply-op" v-else-if="comment.replyTotalCount <= replyCommentQuery.pageNumber * replyCommentQuery.pageSize && comment.expandReply"> + <view @click="retractReplyComment(index)" class="reply-op-item"><text class="line">鈥斺��</text>鏀惰捣<text class="iconfont textSideIcon"></text></view> + </view> + </view> + </scroll-view> + <view class="comment-input-area"> + <input + ref="commentInput" + class="comment-input" + v-model="commentForm.commentContent" + :placeholder="commentForm.replyId ? `鍥炲 @${commentForm.replyUserNickname}` : '鍐欎笅浣犵殑璇勮...'" + placeholder-class="placeholder" + /> + <button class="submit-btn" @click="submitComment" :disabled="!commentForm.commentContent.trim()">鍙戦��</button> + </view> + </view> + </uni-popup> + + </view> +</template> + +<script> +import { getRecommendVideos, savePlayRecord, subscribe, getVideoComments, addVideoComment, thubmsUpComment, cancelThubmsUpComment } from "@/api/video.js"; +import { changeCollect } from "@/api/collect.js"; +export default { + data() { + return { + videoNoMore: false, // 鏄惁杩樻湁鏇村瑙嗛 + commentNoMore: false, // 鏄惁杩樻湁鏇村璇勮 + commentQuery: { + pageNumber: 1, + pageSize: 5, + videoId: '', + masterCommentId: '' + }, + replyCommentQuery: { + pageNumber: 1, + pageSize: 5, + videoId: '', + masterCommentId: '' + }, + commentForm: { // 璇勮琛ㄥ崟鏁版嵁 + id: '', + videoId: '', + commentContent: '', + replyId: '', + replyUserId: '', + replyUserNickname: '', + replyUserAvatar: '', + masterCommentId: null + }, + comments: [], // 璇勮鍒楄〃 + commentsTotal: 0, // 璇勮鎬绘潯鏁� + commentLoading: false, // 璇勮鍔犺浇鐘舵�� + startHidenTime: 0, // 璁板綍鍒囨崲鑷冲叾瀹冮〉闈㈢殑鏃堕棿锛岀敤浜庤绠楄棰戣鐪嬫椂闂村噺鍘荤殑閮ㄥ垎 + totalHidenTime: 0, // 鎬诲叡闅愯棌椤甸潰鐨勬椂闂� + startPauseTime: 0, // 寮�濮嬫殏鍋滅殑鏃堕棿 + totalPauseTime: 0, // 鎬诲叡鏆傚仠鐨勬椂闂� + playRecord: { + videoId: null, + viewDuration: 0, // 杩欎釜瑙嗛鎬诲叡瑙傜湅浜嗗涔� + playAt: 0 ,// 杩欎釜瑙嗛鎾斁鍒板摢浜� + startPlayTime: 0 // 杩欎釜瑙嗛浠庝粈涔堟椂鍊欏紑濮嬫挱鏀剧殑 + }, + currentVideoIsPlaying: true, // 褰撳墠瑙嗛鏄惁姝e湪鎾斁 + isFullScreen: false, + windowHeight: 0, + currentIndex: 0, // 褰撳墠鎾斁鐨勮棰戠储寮� + videoList: [ + + ], // 瑙嗛鍒楄〃鏁版嵁 + videoContexts: [], // 瑙嗛涓婁笅鏂囧璞¢泦鍚� + loading: false, // 鏄惁姝e湪鍔犺浇 + videoQuery: { + pageNumber: 1, + pageSize: 6, + authorId: '', + videoFrom: '' + } + } + }, + onShow() { + this.loadVideos() + // 濡傛灉瑙嗛鎸変笅鏆傚仠鍚庡垏鎹㈤〉闈㈠啀鍥炲埌椤甸潰鏃讹紝鍙畻鏆傚仠鏃堕棿锛堝洜涓烘殏鍋滄椂闂村拰绂诲紑椤甸潰鏃堕棿鏄噸澶嶇殑锛屽彧绠椾竴涓級 + if(this.startHidenTime !== 0 && this.currentVideoIsPlaying) { + const duration = Date.now() - this.startHidenTime + this.totalHidenTime += duration + } + }, + onHide() { + this.startHidenTime = Date.now() + }, + onUnload() { + uni.removeStorageSync("playInfo"); + }, + onLoad(option) { + const playInfo = uni.getStorageSync("playInfo", playInfo); + if(playInfo) { + this.videoList = playInfo.videoList; + this.videoQuery.pageNumber = playInfo.pageNumber; + this.videoNoMore = playInfo.nomore; + this.videoQuery.authorId = option.authorId; + this.videoQuery.videoFrom = option.videoFrom; + this.currentIndex = playInfo.playIndex; + } else { + this.videoQuery.videoFrom = 'recommend'; + this.loadVideos(); + } + }, + onReady() { + // 鍒濆鍖栬棰戜笂涓嬫枃 + this.initVideoContexts(); + }, + methods: { + // 璺宠浆涓汉涓婚〉 + jumpToHomePage(authorId) { + uni.navigateTo({ + url: "/pages/video/home-page?authorId=" + authorId + }) + }, + // 鍙栨秷鐐硅禐 + async cancelThumbsUp(id, commentIndex, replyIndex) { + const data = { + refId: id, + thumbsUpType: 'video_comment' + } + cancelThubmsUpComment(data).then(res => { + if(replyIndex != null) { + this.comments[commentIndex].replies[replyIndex].hasThumbsUp = false; + this.comments[commentIndex].replies[replyIndex].thumbsUpNum -= 1; + } else { + this.comments[commentIndex].hasThumbsUp = false; + this.comments[commentIndex].thumbsUpNum -= 1; + } + }) + }, + // 璇勮鐐硅禐 + async thubmsUp(id, commentIndex, replyIndex) { + const data = { + refId: id, + thumbsUpType: 'video_comment' + } + thubmsUpComment(data).then(res => { + if(replyIndex != null) { + this.comments[commentIndex].replies[replyIndex].hasThumbsUp = true; + this.comments[commentIndex].replies[replyIndex].thumbsUpNum += 1; + } else { + this.comments[commentIndex].hasThumbsUp = true; + this.comments[commentIndex].thumbsUpNum += 1; + } + }) + }, + // 鍔犺浇涓嬩竴椤靛洖澶� + loadNextPageReply(index) { + this.replyCommentQuery.pageNumber++; + getVideoComments(this.replyCommentQuery).then(res => { + this.comments[index].replies = [ + ...this.comments[index].replies, + ...res.data.data.filter( + (newItem) => !this.comments[index].replies.some((oldItem) => oldItem.id === newItem.id) + ), + ]; + }) + }, + // 鏀惰捣鍥炲 + retractReplyComment(index) { + this.comments[index].expandReply = false; + this.comments[index].replies = []; + }, + // 鍔犺浇鍥炲 + loadRepliesPage(comment, index) { + this.replyCommentQuery.pageNumber = 1; + this.replyCommentQuery.masterCommentId = comment.id + getVideoComments(this.replyCommentQuery).then(res => { + this.comments[index].replies = res.data.data; + this.comments[index].expandReply = true; + }) + }, + resetCommentForm() { + const videoId = this.commentForm.videoId; + this.commentForm = { // 璇勮琛ㄥ崟鏁版嵁 + id: '', + videoId: '', + commentContent: '', + replyId: '', + replyUserId: '', + replyUserNickname: '', + replyUserAvatar: '', + masterCommentId: null + } + }, + // 鍙栨秷鍥炲 + cancelReply() { + this.resetCommentForm() + }, + // 鎵撳紑鍥炲妗� + openReply(comment, reply = null) { + if(reply) { + comment = reply + } + this.commentForm.masterCommentId = comment.masterCommentId ? comment.masterCommentId : comment.id; + this.commentForm.replyId = comment.id; + this.commentForm.replyUserId = comment.userId; + this.commentForm.replyUserNickname = comment.userNickname; + this.commentForm.replyUserAvatar = comment.userAvatar; + // 鑷姩鑱氱劍杈撳叆妗� + this.$nextTick(() => { + const input = this.$refs.commentInput; + if (input) input.focus(); + }); + }, + // 鏍煎紡鍖栨椂闂� + formatTime(time) { + const date = new Date(time); + const now = new Date(); + const diff = Math.floor((now - date) / 1000); // 绉� + + if (diff < 60) return '鍒氬垰'; + if (diff < 3600) return `${Math.floor(diff / 60)}鍒嗛挓鍓峘; + if (diff < 86400) return `${Math.floor(diff / 3600)}灏忔椂鍓峘; + + return `${date.getMonth() + 1}鏈�${date.getDate()}鏃; + }, + // 鎻愪氦璇勮 + async submitComment() { + if (!this.commentForm.commentContent.trim()) { + uni.showToast({ + title: '璇勮鍐呭涓嶈兘涓虹┖', + icon: 'none' + }); + return; + } + // 鍙戣〃璇勮 + addVideoComment(this.commentForm).then(res => { + if(res.data.code === 200) { + this.resetCommentForm() + + // 濡傛灉鏄瘎璁哄埆浜虹殑鍥炲锛岄偅涔堝氨灏嗚繖涓彂甯冨埌replies閲岄潰 + if(res.data.data.replyId) { + for (const [index, item] of this.comments.entries()) { + if (item.id === res.data.data.replyId) { + item.replies.unshift(res.data.data); + // this.loadRepliesPage(item, index) + break; // 璺冲嚭寰幆 + } + } + } else { + this.comments.unshift(res.data.data); + } + console.log("鏂板鍚�",this.comments); + uni.showToast({ + title: '璇勮鎴愬姛' + }); + // 褰撳墠瑙嗛璇勮鏁板姞涓� + this.commentsTotal += 1; + this.videoList[this.currentIndex].commentNum += 1; + } else { + uni.showToast({ + title: res.data.msg, + icon: 'none' + }); + } + }).catch(() => { + uni.showToast({ + title: '璇勮澶辫触', + icon: 'none' + }); + }) + }, + // 鍏抽棴璇勮寮圭獥 + closeCommentPopup() { + this.$refs.commentPopup.close() + this.showCommentPopup = false; + this.comments = []; + this.resetCommentForm() + this.commentQuery.pageNumber = 1; + this.commentNoMore = false; + }, + // 涓嬫粦璇勮鍖哄姞杞借瘎璁� + async getCommentPage() { + if(this.commentNoMore) { + return; + } + getVideoComments(this.commentQuery).then(res => { + if(this.commentQuery.pageNumber === 1) { + this.comments = res.data.data + } else { + this.comments = [ + ...this.comments, + ...res.data.data.filter( + (newItem) => !this.comments.some((oldItem) => oldItem.id === newItem.id) + ), + ]; + } + if (res.data.data.length < this.commentQuery.pageSize) { + this.commentNoMore = true; + return; + } + this.commentQuery.pageNumber++; + }) + }, + // 鏄剧ず璇勮寮圭獥 + async showComments(item) { + this.commentForm.videoId = item.id; + this.$refs.commentPopup.open(); + this.commentLoading = true; + this.commentQuery.videoId = item.id + this.replyCommentQuery.videoId = item.id + // 棣栨鍔犺浇璇勮鍒嗛〉澶у皬澧炲姞涓�鍊嶏紝浠ヤ骇鐢熸粴鍔ㄦ潯锛屽悗缁彲瑙﹀彂 + this.commentQuery.pageSize *= 2; + getVideoComments(this.commentQuery).then(res => { + this.commentsTotal = res.data.total; + this.comments = res.data.data; + this.commentQuery.pageNumber += 2; + this.commentQuery.pageSize /= 2; + }).catch(() => { + uni.showToast({ + title: '鑾峰彇璇勮澶辫触', + icon: 'none' + }); + }).finally(() => { + this.commentLoading = false; + }) + }, + // 鍏虫敞浣滆�� + subscribeAuth(index, authorId) { + this.videoList.forEach(video => { + if(video.authorId === authorId) { + video.subscribeThisAuthor = true + } + }) + subscribe(authorId).then(res => { + if(res.data.code === 200) { + uni.showToast({ + title: '鍏虫敞鎴愬姛~', + icon: 'none' + }); + } else { + this.videoList.forEach(video => { + if(video.authorId === authorId) { + video.subscribeThisAuthor = false + } + }) + } + }) + }, + // 鍒濆鍖栬棰戜笂涓嬫枃 + initVideoContexts() { + this.videoContexts = this.videoList.map((_, index) => { + let videoContent = uni.createVideoContext(`video${index}`, this); + return videoContent; + }); + }, + + // 鍔犺浇瑙嗛鏁版嵁 + async loadVideos() { + if (this.loading || this.videoNoMore) return; + this.loading = true; + + getRecommendVideos(this.videoQuery).then(res => { + if (this.videoQuery.pageNumber === 1) { + this.videoList = res.data.data; + } else { + this.videoList = [ + ...this.videoList, + ...res.data.data.filter( + (newItem) => !this.videoList.some((oldItem) => oldItem.id === newItem.id) + ), + ]; + } + this.$nextTick(() => { + this.initVideoContexts(); + }); + this.loading = false; + if(res.data.data.length < this.videoQuery.pageSize) { + this.videoNoMore = true; + return; + } + this.videoQuery.pageNumber++; + }) + }, + + // 婊戝姩鍒囨崲瑙嗛 + onSwiperChange(e) { + // 濡傛灉瑙嗛澶勪簬鏆傚仠鐘舵�佸線涓嬪埛瑙嗛锛岄偅涔堥渶瑕佸啀璁$畻涓�娆℃殏鍋滄椂闂� + if(!this.currentVideoIsPlaying) { + if(this.startPauseTime !== 0) { + const duration = Date.now() - this.startPauseTime + this.totalPauseTime += duration + } + } + // 淇濆瓨涓婁竴涓棰戠殑鎾斁璁板綍 + this.savePlayRecord() + const oldIndex = this.currentIndex; + this.currentIndex = e.detail.current; + + // 鏆傚仠涓婁竴涓棰� + if (this.videoContexts[oldIndex]) { + this.videoContexts[oldIndex].pause(); + } + + this.startPauseTime = 0; + // 鎾斁褰撳墠瑙嗛 + if (this.videoContexts[this.currentIndex]) { + this.videoContexts[this.currentIndex].play(); + } + }, + + // 鏀惰棌/鍙栨秷鏀惰棌 + toggleCollect(item, index) { + let data = { + refId: item.id, + collectType: 'video' + } + const beforeCollected = item.collected + const beforeCollectNum = item.collectNum + if(item.collected) { + this.videoList[index].collected = false + this.videoList[index].collectNum -= 1 + } else { + this.videoList[index].collected = true + this.videoList[index].collectNum += 1 + } + changeCollect(data).then(res => { + if(res.data.code !== 200) { + this.videoList[index].collected = beforeCollected + this.videoList[index].collectNum = beforeCollectNum + } + }) + }, + // 鍗曞嚮灞忓箷锛氭殏鍋滄垨缁х画鎾斁 + togglePlay(index) { + if(this.currentVideoIsPlaying) { + this.videoContexts[index].pause(); + } else { + this.videoContexts[index].play(); + } + }, + // 瑙嗛鎾斁浜嬩欢 + onPlay(id, index) { + console.log(id, index, "瑙﹀彂鎾斁"); + if(index === this.currentIndex) { + this.currentVideoIsPlaying = true; + } else { + this.currentVideoIsPlaying = false; + return + } + this.playRecord.videoId = id; + // 娌″垵濮嬪寲鎵嶈祴鍊硷紝鍥犱负涓�涓棰戦噸澶嶆挱鏀緊nPlay浼氶噸澶嶈Е鍙� + if(this.playRecord.startPlayTime === 0) { + this.playRecord.startPlayTime = Date.now(); + } + if(this.startPauseTime !== 0) { + const duration = Date.now() - this.startPauseTime + this.totalPauseTime += duration + } + }, + + // 瑙嗛鏆傚仠浜嬩欢 + onPause(index) { + console.log(index, "瑙﹀彂鏆傚仠"); + if(index === this.currentIndex) { + this.currentVideoIsPlaying = false; + } else { + this.currentVideoIsPlaying = true; + return + } + this.startPauseTime = Date.now() + }, + + // 瑙嗛缁撴潫浜嬩欢 + onEnded(index) { + // this.currentVideoIsPlaying = false; + }, + + // 璁板綍鎾斁鏃堕暱 + onTimeUpdate(e) { + this.playRecord.playAt = e.detail.currentTime + }, + + // 淇濆瓨鎾斁璁板綍 + async savePlayRecord() { + console.log(Date.now(), this.playRecord.startPlayTime, this.totalHidenTime); + + const data = { + videoId: this.playRecord.videoId, + viewDuration: Date.now() - this.playRecord.startPlayTime - this.totalHidenTime - this.totalPauseTime, + playAt: this.playRecord.playAt + } + this.playRecord = { + videoId: null, + viewDuration: 0, // 杩欎釜瑙嗛鎬诲叡瑙傜湅浜嗗涔� + playAt: 0 ,// 杩欎釜瑙嗛鎾斁鍒板摢浜� + startPlayTime: 0 // 杩欎釜瑙嗛浠庝粈涔堟椂鍊欏紑濮嬫挱鏀剧殑 + } + this.totalHidenTime = 0 + this.totalPauseTime = 0 + savePlayRecord(data) + } + } +} +</script> + +<style scoped> + ::v-deep .custom-tabbar { + border-top: none !important; + } + .video-container { + width: 100%; + height: 100vh; + background-color: #000; + } + + .video-swiper { + width: 100%; + height: 100%; + } + + .video-item { + width: 100%; + height: 100%; + object-fit: cover; + } + .play-icon { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 45px; + height: 45px; + z-index: 10; + opacity: 0.6; + } + + .video-info { + width: 70%; + position: absolute; + bottom: 70px; + left: 20px; + color: #f8f8f8; + z-index: 10; + letter-spacing: 1px; + } + + .action-buttons { + position: absolute; + right: 20px; + bottom: 150px; + display: flex; + flex-direction: column; + align-items: center; + z-index: 10; + } + + .action-item { + margin-bottom: 18px; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + color: #fff; + } + .avatar-container { + margin-bottom: 27px; + position: relative; /* 涓虹粷瀵瑰畾浣嶇殑瀛愬厓绱犳彁渚涘畾浣嶄笂涓嬫枃 */ + width: 40px; + height: 40px; + display: inline-block; /* 浣垮鍣ㄦ牴鎹唴瀹硅皟鏁村ぇ灏� */ + } + .avatar { + border: 2px solid #FFFFFF; + box-sizing: border-box; + width: 100%; + height: 100%; + border-radius: 50%; /* 鍏抽敭灞炴�э紝璁剧疆涓�50%鍗冲彲瀹炵幇鍦嗗舰 */ + overflow: hidden; /* 纭繚鍥剧墖涓嶄細瓒呭嚭鍦嗗舰杈圭晫 */ + display: block; + } + .follow-icon { + position: absolute; + bottom: 0; /* 瀹氫綅鍒板簳閮� */ + left: 50%; /* 姘村钩灞呬腑寮�濮嬩綅缃� */ + transform: translate(-50%, 50%); /* 姘村钩灞呬腑骞跺悜涓嬬Щ鍔�50% */ + + width: 18px; /* 鍥炬爣澶у皬 */ + height: 18px; + background-color: #FF5A5F; /* 鍥炬爣鑳屾櫙鑹� */ + border-radius: 50%; + display: flex; + justify-content: center; + align-items: center; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); /* 杞诲井闃村奖 */ + } + .video-tag { + margin-left: 5px; + font-weight: bold; + color: #eeeeee; + } + .video-author { + font-size: 1.2em; + } + /* 鍟嗗搧閾炬帴鎮寕灞傛牱寮� */ + .goods-link-warp { + position: absolute; + bottom: 160px; + left: 20px; + color: #f8f8f8; + z-index: 10; + } + .goods-link { + position: relative; + margin: 20rpx 0; + padding: 12rpx; + background-color: rgba(255, 255, 255, 0.9); + border-radius: 12rpx; + box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.08); + } + + .goods-container { + display: flex; + align-items: center; + } + + .goods-image { + width: 120rpx; + height: 120rpx; + border-radius: 8rpx; + margin-right: 20rpx; + } + + .goods-info { + flex: 1; + display: flex; + flex-direction: column; + justify-content: center; + } + + .goods-name { + font-size: 28rpx; + color: #333; + font-weight: bold; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; + margin-bottom: 8rpx; + } + + .price-section { + display: flex; + align-items: center; + margin-bottom: 6rpx; + } + + .current-price { + font-size: 32rpx; + color: #ff2e4d; + font-weight: bold; + margin-right: 12rpx; + } + + .original-price { + font-size: 28rpx; + color: #999; + text-decoration: line-through; + } + + .sales-count { + font-size: 22rpx; + color: #999; + } + + .buy-button { + background: linear-gradient(to right, #ff5a5f, #ff2e4d); + color: white; + padding: 10rpx 28rpx; + border-radius: 20rpx; + font-size: 26rpx; + font-weight: bold; + } + /* 璇勮寮圭獥鏍峰紡 */ + .comment-popup { + background-color: #fff; + border-radius: 20rpx 20rpx 0 0; + padding-bottom: env(safe-area-inset-bottom); + height: 60vh; + display: flex; + flex-direction: column; + } + + .popup-header { + padding: 30rpx; + display: flex; + justify-content: space-between; + align-items: center; + border-bottom: 1rpx solid #f5f5f5; + } + + .popup-title { + font-size: 32rpx; + font-weight: bold; + } + + .close-icon { + /* font-size: 36rpx; */ + color: #999; + } + + .comment-list { + flex: 1; + padding: 0rpx 20rpx 20rpx 20rpx; + box-sizing: border-box; + height: calc(60vh - 260rpx); + } + + .comment-item { + display: flex; + flex-direction: column; + padding: 10rpx 0 20rpx 0; + } + + .comment-avatar { + width: 70rpx; + height: 70rpx; + border-radius: 50%; + margin-right: 10rpx; + } + .comment-reply-avatar { + width: 40rpx; + height: 40rpx; + border-radius: 50%; + margin-right: 10rpx; + } + + .comment-content { + flex: 1; + } + + .nickname { + font-size: 28rpx; + color: #666; + display: block; + margin-bottom: 10rpx; + } + + .content { + font-size: 28rpx; + color: #333; + display: block; + margin-bottom: 10rpx; + } + + .time { + font-size: 28rpx; + color: #999; + } + + .comment-input-area { + display: flex; + padding: 20rpx 30rpx; + align-items: center; + } + + .comment-input { + flex: 1; + background-color: #fff; + height: 80rpx; + border: 1px solid #dcdcdc; + border-radius: 40rpx; + padding: 0 30rpx; + font-size: 28rpx; + } + + .placeholder { + color: #ccc; + } + + .submit-btn { + margin-left: 20rpx; + background-color: #07c160; + color: #fff; + border-radius: 40rpx; + padding: 0 30rpx; + height: 80rpx; + line-height: 80rpx; + font-size: 28rpx; + } + + .loading, .empty { + padding: 40rpx 0; + text-align: center; + color: #999; + } + .reply-list { + margin-top: 20rpx; + padding-left: 80rpx; + } + .reply-op { + margin-top: 10rpx; + padding-left: 80rpx; + display: flex; + font-size: 28rpx; + color: #333; + } + .reply-op-item { + display: flex; + align-items: center; + height: 40rpx; + } + + .reply-item { + display: flex; + margin-bottom: 20rpx; + } + + .reply-content { + flex: 1; + } + + .reply-to { + color: #576b95; + margin: 0 10rpx; + font-size: 28rpx; + } + .reply-title { + display: flex; + align-items: center; + font-size: 28rpx; + color: #333; + } + + .cancel-reply { + margin-left: 20rpx; + color: #576b95; + font-size: 28rpx; + padding: 6rpx 12rpx; + background: #f5f5f5; + border-radius: 20rpx; + } + .view-more-replies { + color: #576b95; + font-size: 28rpx; + padding: 10rpx 0; + padding-left: 80rpx; + } + .comment-footer, .reply-footer { + display: flex; + align-items: center; + font-size: 28rpx; + color: #999; + } + .reply-btu { + margin-left: 30rpx; + } + .thumbs-up { + position: absolute; + right: 20rpx; + font-size: 32rpx; + width: 120rpx; + } + .textSideIcon { + font-size: 36rpx; + margin-left: 5rpx; + } + .line { + margin-right: 10rpx; + color: #cccccc; + } + .thumbs-num { + margin-left: 4rpx; + } +</style> \ No newline at end of file diff --git a/static/tabbar/video1-selected.png b/static/tabbar/video1-selected.png new file mode 100644 index 0000000..b913f35 --- /dev/null +++ b/static/tabbar/video1-selected.png Binary files differ diff --git a/static/tabbar/video1.png b/static/tabbar/video1.png new file mode 100644 index 0000000..ad236ef --- /dev/null +++ b/static/tabbar/video1.png Binary files differ diff --git a/uni_modules/uni-icons/changelog.md b/uni_modules/uni-icons/changelog.md new file mode 100644 index 0000000..0261131 --- /dev/null +++ b/uni_modules/uni-icons/changelog.md @@ -0,0 +1,42 @@ +## 2.0.10锛�2024-06-07锛� +- 浼樺寲 uni-app x 涓紝size 灞炴�х殑绫诲瀷 +## 2.0.9锛�2024-01-12锛� +fix: 淇鍥炬爣澶у皬榛樿鍊奸敊璇殑闂 +## 2.0.8锛�2023-12-14锛� +- 淇 椤圭洰鏈娇鐢� ts 鎯呭喌涓嬶紝鎵撳寘鎶ラ敊鐨刡ug +## 2.0.7锛�2023-12-14锛� +- 淇 size 灞炴�т负 string 鏃讹紝涓嶅姞鍗曚綅瀵艰嚧灏哄寮傚父鐨刡ug +## 2.0.6锛�2023-12-11锛� +- 浼樺寲 鍏煎鑰佺増鏈琲con绫诲瀷锛屽 top 锛宐ottom 绛� +## 2.0.5锛�2023-12-11锛� +- 浼樺寲 鍏煎鑰佺増鏈琲con绫诲瀷锛屽 top 锛宐ottom 绛� +## 2.0.4锛�2023-12-06锛� +- 浼樺寲 uni-app x 涓嬬ず渚嬮」鐩浘鏍囨帓搴� +## 2.0.3锛�2023-12-06锛� +- 淇 nvue涓嬪紩鍏ョ粍浠舵姤閿欑殑bug +## 2.0.2锛�2023-12-05锛� +-浼樺寲 size 灞炴�ф敮鎸佸崟浣� +## 2.0.1锛�2023-12-05锛� +- 鏂板 uni-app x 鏀寔瀹氫箟鍥炬爣 +## 1.3.5锛�2022-01-24锛� +- 浼樺寲 size 灞炴�у彲浠ヤ紶鍏ヤ笉甯﹀崟浣嶇殑瀛楃涓叉暟鍊� +## 1.3.4锛�2022-01-24锛� +- 浼樺寲 size 鏀寔鍏朵粬鍗曚綅 +## 1.3.3锛�2022-01-17锛� +- 淇 nvue 鏈変簺鍥炬爣涓嶆樉绀虹殑bug锛屽吋瀹硅�佺増鏈浘鏍� +## 1.3.2锛�2021-12-01锛� +- 浼樺寲 绀轰緥鍙鍒跺浘鏍囧悕绉� +## 1.3.1锛�2021-11-23锛� +- 浼樺寲 鍏煎鏃х粍浠� type 鍊� +## 1.3.0锛�2021-11-19锛� +- 鏂板 鏇村鍥炬爣 +- 浼樺寲 鑷畾涔夊浘鏍囦娇鐢ㄦ柟寮� +- 浼樺寲 缁勪欢UI锛屽苟鎻愪緵璁捐璧勬簮锛岃瑙�:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 鏂囨。杩佺Щ锛岃瑙�:[https://uniapp.dcloud.io/component/uniui/uni-icons](https://uniapp.dcloud.io/component/uniui/uni-icons) +## 1.1.7锛�2021-11-08锛� +## 1.2.0锛�2021-07-30锛� +- 缁勪欢鍏煎 vue3锛屽浣曞垱寤簐ue3椤圭洰锛岃瑙� [uni-app 椤圭洰鏀寔 vue3 浠嬬粛](https://ask.dcloud.net.cn/article/37834) +## 1.1.5锛�2021-05-12锛� +- 鏂板 缁勪欢绀轰緥鍦板潃 +## 1.1.4锛�2021-02-05锛� +- 璋冩暣涓簎ni_modules鐩綍瑙勮寖 diff --git a/uni_modules/uni-icons/components/uni-icons/uni-icons.uvue b/uni_modules/uni-icons/components/uni-icons/uni-icons.uvue new file mode 100644 index 0000000..8740559 --- /dev/null +++ b/uni_modules/uni-icons/components/uni-icons/uni-icons.uvue @@ -0,0 +1,91 @@ +<template> + <text class="uni-icons" :style="styleObj"> + <slot>{{unicode}}</slot> + </text> +</template> + +<script> + import { fontData, IconsDataItem } from './uniicons_file' + + /** + * Icons 鍥炬爣 + * @description 鐢ㄤ簬灞曠ず icon 鍥炬爣 + * @tutorial https://ext.dcloud.net.cn/plugin?id=28 + * @property {Number,String} size 鍥炬爣澶у皬 + * @property {String} type 鍥炬爣鍥炬锛屽弬鑰冪ず渚� + * @property {String} color 鍥炬爣棰滆壊 + * @property {String} customPrefix 鑷畾涔夊浘鏍� + * @event {Function} click 鐐瑰嚮 Icon 瑙﹀彂浜嬩欢 + */ + export default { + name: "uni-icons", + props: { + type: { + type: String, + default: '' + }, + color: { + type: String, + default: '#333333' + }, + size: { + type: [Number, String], + default: 16 + }, + fontFamily: { + type: String, + default: '' + } + }, + data() { + return {}; + }, + computed: { + unicode() : string { + let codes = fontData.find((item : IconsDataItem) : boolean => { return item.font_class == this.type }) + if (codes !== null) { + return codes.unicode + } + return '' + }, + iconSize() : string { + const size = this.size + if (typeof size == 'string') { + const reg = /^[0-9]*$/g + return reg.test(size as string) ? '' + size + 'px' : '' + size; + // return '' + this.size + } + return this.getFontSize(size as number) + }, + styleObj() : UTSJSONObject { + if (this.fontFamily !== '') { + return { color: this.color, fontSize: this.iconSize, fontFamily: this.fontFamily } + } + return { color: this.color, fontSize: this.iconSize } + } + }, + created() { }, + methods: { + /** + * 瀛椾綋澶у皬 + */ + getFontSize(size : number) : string { + return size + 'px'; + }, + }, + } +</script> + +<style scoped> + @font-face { + font-family: UniIconsFontFamily; + src: url('./uniicons.ttf'); + } + + .uni-icons { + font-family: UniIconsFontFamily; + font-size: 18px; + font-style: normal; + color: #333; + } +</style> diff --git a/uni_modules/uni-icons/components/uni-icons/uni-icons.vue b/uni_modules/uni-icons/components/uni-icons/uni-icons.vue new file mode 100644 index 0000000..7da5356 --- /dev/null +++ b/uni_modules/uni-icons/components/uni-icons/uni-icons.vue @@ -0,0 +1,110 @@ +<template> + <!-- #ifdef APP-NVUE --> + <text :style="styleObj" class="uni-icons" @click="_onClick">{{unicode}}</text> + <!-- #endif --> + <!-- #ifndef APP-NVUE --> + <text :style="styleObj" class="uni-icons" :class="['uniui-'+type,customPrefix,customPrefix?type:'']" @click="_onClick"> + <slot></slot> + </text> + <!-- #endif --> +</template> + +<script> + import { fontData } from './uniicons_file_vue.js'; + + const getVal = (val) => { + const reg = /^[0-9]*$/g + return (typeof val === 'number' || reg.test(val)) ? val + 'px' : val; + } + + // #ifdef APP-NVUE + var domModule = weex.requireModule('dom'); + import iconUrl from './uniicons.ttf' + domModule.addRule('fontFace', { + 'fontFamily': "uniicons", + 'src': "url('" + iconUrl + "')" + }); + // #endif + + /** + * Icons 鍥炬爣 + * @description 鐢ㄤ簬灞曠ず icons 鍥炬爣 + * @tutorial https://ext.dcloud.net.cn/plugin?id=28 + * @property {Number} size 鍥炬爣澶у皬 + * @property {String} type 鍥炬爣鍥炬锛屽弬鑰冪ず渚� + * @property {String} color 鍥炬爣棰滆壊 + * @property {String} customPrefix 鑷畾涔夊浘鏍� + * @event {Function} click 鐐瑰嚮 Icon 瑙﹀彂浜嬩欢 + */ + export default { + name: 'UniIcons', + emits: ['click'], + props: { + type: { + type: String, + default: '' + }, + color: { + type: String, + default: '#333333' + }, + size: { + type: [Number, String], + default: 16 + }, + customPrefix: { + type: String, + default: '' + }, + fontFamily: { + type: String, + default: '' + } + }, + data() { + return { + icons: fontData + } + }, + computed: { + unicode() { + let code = this.icons.find(v => v.font_class === this.type) + if (code) { + return code.unicode + } + return '' + }, + iconSize() { + return getVal(this.size) + }, + styleObj() { + if (this.fontFamily !== '') { + return `color: ${this.color}; font-size: ${this.iconSize}; font-family: ${this.fontFamily};` + } + return `color: ${this.color}; font-size: ${this.iconSize};` + } + }, + methods: { + _onClick() { + this.$emit('click') + } + } + } +</script> + +<style lang="scss"> + /* #ifndef APP-NVUE */ + @import './uniicons.css'; + + @font-face { + font-family: uniicons; + src: url('./uniicons.ttf'); + } + + /* #endif */ + .uni-icons { + font-family: uniicons; + text-decoration: none; + text-align: center; + } +</style> diff --git a/uni_modules/uni-icons/components/uni-icons/uniicons.css b/uni_modules/uni-icons/components/uni-icons/uniicons.css new file mode 100644 index 0000000..0a6b6fe --- /dev/null +++ b/uni_modules/uni-icons/components/uni-icons/uniicons.css @@ -0,0 +1,664 @@ + +.uniui-cart-filled:before { + content: "\e6d0"; +} + +.uniui-gift-filled:before { + content: "\e6c4"; +} + +.uniui-color:before { + content: "\e6cf"; +} + +.uniui-wallet:before { + content: "\e6b1"; +} + +.uniui-settings-filled:before { + content: "\e6ce"; +} + +.uniui-auth-filled:before { + content: "\e6cc"; +} + +.uniui-shop-filled:before { + content: "\e6cd"; +} + +.uniui-staff-filled:before { + content: "\e6cb"; +} + +.uniui-vip-filled:before { + content: "\e6c6"; +} + +.uniui-plus-filled:before { + content: "\e6c7"; +} + +.uniui-folder-add-filled:before { + content: "\e6c8"; +} + +.uniui-color-filled:before { + content: "\e6c9"; +} + +.uniui-tune-filled:before { + content: "\e6ca"; +} + +.uniui-calendar-filled:before { + content: "\e6c0"; +} + +.uniui-notification-filled:before { + content: "\e6c1"; +} + +.uniui-wallet-filled:before { + content: "\e6c2"; +} + +.uniui-medal-filled:before { + content: "\e6c3"; +} + +.uniui-fire-filled:before { + content: "\e6c5"; +} + +.uniui-refreshempty:before { + content: "\e6bf"; +} + +.uniui-location-filled:before { + content: "\e6af"; +} + +.uniui-person-filled:before { + content: "\e69d"; +} + +.uniui-personadd-filled:before { + content: "\e698"; +} + +.uniui-arrowthinleft:before { + content: "\e6d2"; +} + +.uniui-arrowthinup:before { + content: "\e6d3"; +} + +.uniui-arrowthindown:before { + content: "\e6d4"; +} + +.uniui-back:before { + content: "\e6b9"; +} + +.uniui-forward:before { + content: "\e6ba"; +} + +.uniui-arrow-right:before { + content: "\e6bb"; +} + +.uniui-arrow-left:before { + content: "\e6bc"; +} + +.uniui-arrow-up:before { + content: "\e6bd"; +} + +.uniui-arrow-down:before { + content: "\e6be"; +} + +.uniui-arrowthinright:before { + content: "\e6d1"; +} + +.uniui-down:before { + content: "\e6b8"; +} + +.uniui-bottom:before { + content: "\e6b8"; +} + +.uniui-arrowright:before { + content: "\e6d5"; +} + +.uniui-right:before { + content: "\e6b5"; +} + +.uniui-up:before { + content: "\e6b6"; +} + +.uniui-top:before { + content: "\e6b6"; +} + +.uniui-left:before { + content: "\e6b7"; +} + +.uniui-arrowup:before { + content: "\e6d6"; +} + +.uniui-eye:before { + content: "\e651"; +} + +.uniui-eye-filled:before { + content: "\e66a"; +} + +.uniui-eye-slash:before { + content: "\e6b3"; +} + +.uniui-eye-slash-filled:before { + content: "\e6b4"; +} + +.uniui-info-filled:before { + content: "\e649"; +} + +.uniui-reload:before { + content: "\e6b2"; +} + +.uniui-micoff-filled:before { + content: "\e6b0"; +} + +.uniui-map-pin-ellipse:before { + content: "\e6ac"; +} + +.uniui-map-pin:before { + content: "\e6ad"; +} + +.uniui-location:before { + content: "\e6ae"; +} + +.uniui-starhalf:before { + content: "\e683"; +} + +.uniui-star:before { + content: "\e688"; +} + +.uniui-star-filled:before { + content: "\e68f"; +} + +.uniui-calendar:before { + content: "\e6a0"; +} + +.uniui-fire:before { + content: "\e6a1"; +} + +.uniui-medal:before { + content: "\e6a2"; +} + +.uniui-font:before { + content: "\e6a3"; +} + +.uniui-gift:before { + content: "\e6a4"; +} + +.uniui-link:before { + content: "\e6a5"; +} + +.uniui-notification:before { + content: "\e6a6"; +} + +.uniui-staff:before { + content: "\e6a7"; +} + +.uniui-vip:before { + content: "\e6a8"; +} + +.uniui-folder-add:before { + content: "\e6a9"; +} + +.uniui-tune:before { + content: "\e6aa"; +} + +.uniui-auth:before { + content: "\e6ab"; +} + +.uniui-person:before { + content: "\e699"; +} + +.uniui-email-filled:before { + content: "\e69a"; +} + +.uniui-phone-filled:before { + content: "\e69b"; +} + +.uniui-phone:before { + content: "\e69c"; +} + +.uniui-email:before { + content: "\e69e"; +} + +.uniui-personadd:before { + content: "\e69f"; +} + +.uniui-chatboxes-filled:before { + content: "\e692"; +} + +.uniui-contact:before { + content: "\e693"; +} + +.uniui-chatbubble-filled:before { + content: "\e694"; +} + +.uniui-contact-filled:before { + content: "\e695"; +} + +.uniui-chatboxes:before { + content: "\e696"; +} + +.uniui-chatbubble:before { + content: "\e697"; +} + +.uniui-upload-filled:before { + content: "\e68e"; +} + +.uniui-upload:before { + content: "\e690"; +} + +.uniui-weixin:before { + content: "\e691"; +} + +.uniui-compose:before { + content: "\e67f"; +} + +.uniui-qq:before { + content: "\e680"; +} + +.uniui-download-filled:before { + content: "\e681"; +} + +.uniui-pyq:before { + content: "\e682"; +} + +.uniui-sound:before { + content: "\e684"; +} + +.uniui-trash-filled:before { + content: "\e685"; +} + +.uniui-sound-filled:before { + content: "\e686"; +} + +.uniui-trash:before { + content: "\e687"; +} + +.uniui-videocam-filled:before { + content: "\e689"; +} + +.uniui-spinner-cycle:before { + content: "\e68a"; +} + +.uniui-weibo:before { + content: "\e68b"; +} + +.uniui-videocam:before { + content: "\e68c"; +} + +.uniui-download:before { + content: "\e68d"; +} + +.uniui-help:before { + content: "\e679"; +} + +.uniui-navigate-filled:before { + content: "\e67a"; +} + +.uniui-plusempty:before { + content: "\e67b"; +} + +.uniui-smallcircle:before { + content: "\e67c"; +} + +.uniui-minus-filled:before { + content: "\e67d"; +} + +.uniui-micoff:before { + content: "\e67e"; +} + +.uniui-closeempty:before { + content: "\e66c"; +} + +.uniui-clear:before { + content: "\e66d"; +} + +.uniui-navigate:before { + content: "\e66e"; +} + +.uniui-minus:before { + content: "\e66f"; +} + +.uniui-image:before { + content: "\e670"; +} + +.uniui-mic:before { + content: "\e671"; +} + +.uniui-paperplane:before { + content: "\e672"; +} + +.uniui-close:before { + content: "\e673"; +} + +.uniui-help-filled:before { + content: "\e674"; +} + +.uniui-paperplane-filled:before { + content: "\e675"; +} + +.uniui-plus:before { + content: "\e676"; +} + +.uniui-mic-filled:before { + content: "\e677"; +} + +.uniui-image-filled:before { + content: "\e678"; +} + +.uniui-locked-filled:before { + content: "\e668"; +} + +.uniui-info:before { + content: "\e669"; +} + +.uniui-locked:before { + content: "\e66b"; +} + +.uniui-camera-filled:before { + content: "\e658"; +} + +.uniui-chat-filled:before { + content: "\e659"; +} + +.uniui-camera:before { + content: "\e65a"; +} + +.uniui-circle:before { + content: "\e65b"; +} + +.uniui-checkmarkempty:before { + content: "\e65c"; +} + +.uniui-chat:before { + content: "\e65d"; +} + +.uniui-circle-filled:before { + content: "\e65e"; +} + +.uniui-flag:before { + content: "\e65f"; +} + +.uniui-flag-filled:before { + content: "\e660"; +} + +.uniui-gear-filled:before { + content: "\e661"; +} + +.uniui-home:before { + content: "\e662"; +} + +.uniui-home-filled:before { + content: "\e663"; +} + +.uniui-gear:before { + content: "\e664"; +} + +.uniui-smallcircle-filled:before { + content: "\e665"; +} + +.uniui-map-filled:before { + content: "\e666"; +} + +.uniui-map:before { + content: "\e667"; +} + +.uniui-refresh-filled:before { + content: "\e656"; +} + +.uniui-refresh:before { + content: "\e657"; +} + +.uniui-cloud-upload:before { + content: "\e645"; +} + +.uniui-cloud-download-filled:before { + content: "\e646"; +} + +.uniui-cloud-download:before { + content: "\e647"; +} + +.uniui-cloud-upload-filled:before { + content: "\e648"; +} + +.uniui-redo:before { + content: "\e64a"; +} + +.uniui-images-filled:before { + content: "\e64b"; +} + +.uniui-undo-filled:before { + content: "\e64c"; +} + +.uniui-more:before { + content: "\e64d"; +} + +.uniui-more-filled:before { + content: "\e64e"; +} + +.uniui-undo:before { + content: "\e64f"; +} + +.uniui-images:before { + content: "\e650"; +} + +.uniui-paperclip:before { + content: "\e652"; +} + +.uniui-settings:before { + content: "\e653"; +} + +.uniui-search:before { + content: "\e654"; +} + +.uniui-redo-filled:before { + content: "\e655"; +} + +.uniui-list:before { + content: "\e644"; +} + +.uniui-mail-open-filled:before { + content: "\e63a"; +} + +.uniui-hand-down-filled:before { + content: "\e63c"; +} + +.uniui-hand-down:before { + content: "\e63d"; +} + +.uniui-hand-up-filled:before { + content: "\e63e"; +} + +.uniui-hand-up:before { + content: "\e63f"; +} + +.uniui-heart-filled:before { + content: "\e641"; +} + +.uniui-mail-open:before { + content: "\e643"; +} + +.uniui-heart:before { + content: "\e639"; +} + +.uniui-loop:before { + content: "\e633"; +} + +.uniui-pulldown:before { + content: "\e632"; +} + +.uniui-scan:before { + content: "\e62a"; +} + +.uniui-bars:before { + content: "\e627"; +} + +.uniui-checkbox:before { + content: "\e62b"; +} + +.uniui-checkbox-filled:before { + content: "\e62c"; +} + +.uniui-shop:before { + content: "\e62f"; +} + +.uniui-headphones:before { + content: "\e630"; +} + +.uniui-cart:before { + content: "\e631"; +} diff --git a/uni_modules/uni-icons/components/uni-icons/uniicons.ttf b/uni_modules/uni-icons/components/uni-icons/uniicons.ttf new file mode 100644 index 0000000..14696d0 --- /dev/null +++ b/uni_modules/uni-icons/components/uni-icons/uniicons.ttf Binary files differ diff --git a/uni_modules/uni-icons/components/uni-icons/uniicons_file.ts b/uni_modules/uni-icons/components/uni-icons/uniicons_file.ts new file mode 100644 index 0000000..98e93aa --- /dev/null +++ b/uni_modules/uni-icons/components/uni-icons/uniicons_file.ts @@ -0,0 +1,664 @@ + +export type IconsData = { + id : string + name : string + font_family : string + css_prefix_text : string + description : string + glyphs : Array<IconsDataItem> +} + +export type IconsDataItem = { + font_class : string + unicode : string +} + + +export const fontData = [ + { + "font_class": "arrow-down", + "unicode": "\ue6be" + }, + { + "font_class": "arrow-left", + "unicode": "\ue6bc" + }, + { + "font_class": "arrow-right", + "unicode": "\ue6bb" + }, + { + "font_class": "arrow-up", + "unicode": "\ue6bd" + }, + { + "font_class": "auth", + "unicode": "\ue6ab" + }, + { + "font_class": "auth-filled", + "unicode": "\ue6cc" + }, + { + "font_class": "back", + "unicode": "\ue6b9" + }, + { + "font_class": "bars", + "unicode": "\ue627" + }, + { + "font_class": "calendar", + "unicode": "\ue6a0" + }, + { + "font_class": "calendar-filled", + "unicode": "\ue6c0" + }, + { + "font_class": "camera", + "unicode": "\ue65a" + }, + { + "font_class": "camera-filled", + "unicode": "\ue658" + }, + { + "font_class": "cart", + "unicode": "\ue631" + }, + { + "font_class": "cart-filled", + "unicode": "\ue6d0" + }, + { + "font_class": "chat", + "unicode": "\ue65d" + }, + { + "font_class": "chat-filled", + "unicode": "\ue659" + }, + { + "font_class": "chatboxes", + "unicode": "\ue696" + }, + { + "font_class": "chatboxes-filled", + "unicode": "\ue692" + }, + { + "font_class": "chatbubble", + "unicode": "\ue697" + }, + { + "font_class": "chatbubble-filled", + "unicode": "\ue694" + }, + { + "font_class": "checkbox", + "unicode": "\ue62b" + }, + { + "font_class": "checkbox-filled", + "unicode": "\ue62c" + }, + { + "font_class": "checkmarkempty", + "unicode": "\ue65c" + }, + { + "font_class": "circle", + "unicode": "\ue65b" + }, + { + "font_class": "circle-filled", + "unicode": "\ue65e" + }, + { + "font_class": "clear", + "unicode": "\ue66d" + }, + { + "font_class": "close", + "unicode": "\ue673" + }, + { + "font_class": "closeempty", + "unicode": "\ue66c" + }, + { + "font_class": "cloud-download", + "unicode": "\ue647" + }, + { + "font_class": "cloud-download-filled", + "unicode": "\ue646" + }, + { + "font_class": "cloud-upload", + "unicode": "\ue645" + }, + { + "font_class": "cloud-upload-filled", + "unicode": "\ue648" + }, + { + "font_class": "color", + "unicode": "\ue6cf" + }, + { + "font_class": "color-filled", + "unicode": "\ue6c9" + }, + { + "font_class": "compose", + "unicode": "\ue67f" + }, + { + "font_class": "contact", + "unicode": "\ue693" + }, + { + "font_class": "contact-filled", + "unicode": "\ue695" + }, + { + "font_class": "down", + "unicode": "\ue6b8" + }, + { + "font_class": "bottom", + "unicode": "\ue6b8" + }, + { + "font_class": "download", + "unicode": "\ue68d" + }, + { + "font_class": "download-filled", + "unicode": "\ue681" + }, + { + "font_class": "email", + "unicode": "\ue69e" + }, + { + "font_class": "email-filled", + "unicode": "\ue69a" + }, + { + "font_class": "eye", + "unicode": "\ue651" + }, + { + "font_class": "eye-filled", + "unicode": "\ue66a" + }, + { + "font_class": "eye-slash", + "unicode": "\ue6b3" + }, + { + "font_class": "eye-slash-filled", + "unicode": "\ue6b4" + }, + { + "font_class": "fire", + "unicode": "\ue6a1" + }, + { + "font_class": "fire-filled", + "unicode": "\ue6c5" + }, + { + "font_class": "flag", + "unicode": "\ue65f" + }, + { + "font_class": "flag-filled", + "unicode": "\ue660" + }, + { + "font_class": "folder-add", + "unicode": "\ue6a9" + }, + { + "font_class": "folder-add-filled", + "unicode": "\ue6c8" + }, + { + "font_class": "font", + "unicode": "\ue6a3" + }, + { + "font_class": "forward", + "unicode": "\ue6ba" + }, + { + "font_class": "gear", + "unicode": "\ue664" + }, + { + "font_class": "gear-filled", + "unicode": "\ue661" + }, + { + "font_class": "gift", + "unicode": "\ue6a4" + }, + { + "font_class": "gift-filled", + "unicode": "\ue6c4" + }, + { + "font_class": "hand-down", + "unicode": "\ue63d" + }, + { + "font_class": "hand-down-filled", + "unicode": "\ue63c" + }, + { + "font_class": "hand-up", + "unicode": "\ue63f" + }, + { + "font_class": "hand-up-filled", + "unicode": "\ue63e" + }, + { + "font_class": "headphones", + "unicode": "\ue630" + }, + { + "font_class": "heart", + "unicode": "\ue639" + }, + { + "font_class": "heart-filled", + "unicode": "\ue641" + }, + { + "font_class": "help", + "unicode": "\ue679" + }, + { + "font_class": "help-filled", + "unicode": "\ue674" + }, + { + "font_class": "home", + "unicode": "\ue662" + }, + { + "font_class": "home-filled", + "unicode": "\ue663" + }, + { + "font_class": "image", + "unicode": "\ue670" + }, + { + "font_class": "image-filled", + "unicode": "\ue678" + }, + { + "font_class": "images", + "unicode": "\ue650" + }, + { + "font_class": "images-filled", + "unicode": "\ue64b" + }, + { + "font_class": "info", + "unicode": "\ue669" + }, + { + "font_class": "info-filled", + "unicode": "\ue649" + }, + { + "font_class": "left", + "unicode": "\ue6b7" + }, + { + "font_class": "link", + "unicode": "\ue6a5" + }, + { + "font_class": "list", + "unicode": "\ue644" + }, + { + "font_class": "location", + "unicode": "\ue6ae" + }, + { + "font_class": "location-filled", + "unicode": "\ue6af" + }, + { + "font_class": "locked", + "unicode": "\ue66b" + }, + { + "font_class": "locked-filled", + "unicode": "\ue668" + }, + { + "font_class": "loop", + "unicode": "\ue633" + }, + { + "font_class": "mail-open", + "unicode": "\ue643" + }, + { + "font_class": "mail-open-filled", + "unicode": "\ue63a" + }, + { + "font_class": "map", + "unicode": "\ue667" + }, + { + "font_class": "map-filled", + "unicode": "\ue666" + }, + { + "font_class": "map-pin", + "unicode": "\ue6ad" + }, + { + "font_class": "map-pin-ellipse", + "unicode": "\ue6ac" + }, + { + "font_class": "medal", + "unicode": "\ue6a2" + }, + { + "font_class": "medal-filled", + "unicode": "\ue6c3" + }, + { + "font_class": "mic", + "unicode": "\ue671" + }, + { + "font_class": "mic-filled", + "unicode": "\ue677" + }, + { + "font_class": "micoff", + "unicode": "\ue67e" + }, + { + "font_class": "micoff-filled", + "unicode": "\ue6b0" + }, + { + "font_class": "minus", + "unicode": "\ue66f" + }, + { + "font_class": "minus-filled", + "unicode": "\ue67d" + }, + { + "font_class": "more", + "unicode": "\ue64d" + }, + { + "font_class": "more-filled", + "unicode": "\ue64e" + }, + { + "font_class": "navigate", + "unicode": "\ue66e" + }, + { + "font_class": "navigate-filled", + "unicode": "\ue67a" + }, + { + "font_class": "notification", + "unicode": "\ue6a6" + }, + { + "font_class": "notification-filled", + "unicode": "\ue6c1" + }, + { + "font_class": "paperclip", + "unicode": "\ue652" + }, + { + "font_class": "paperplane", + "unicode": "\ue672" + }, + { + "font_class": "paperplane-filled", + "unicode": "\ue675" + }, + { + "font_class": "person", + "unicode": "\ue699" + }, + { + "font_class": "person-filled", + "unicode": "\ue69d" + }, + { + "font_class": "personadd", + "unicode": "\ue69f" + }, + { + "font_class": "personadd-filled", + "unicode": "\ue698" + }, + { + "font_class": "personadd-filled-copy", + "unicode": "\ue6d1" + }, + { + "font_class": "phone", + "unicode": "\ue69c" + }, + { + "font_class": "phone-filled", + "unicode": "\ue69b" + }, + { + "font_class": "plus", + "unicode": "\ue676" + }, + { + "font_class": "plus-filled", + "unicode": "\ue6c7" + }, + { + "font_class": "plusempty", + "unicode": "\ue67b" + }, + { + "font_class": "pulldown", + "unicode": "\ue632" + }, + { + "font_class": "pyq", + "unicode": "\ue682" + }, + { + "font_class": "qq", + "unicode": "\ue680" + }, + { + "font_class": "redo", + "unicode": "\ue64a" + }, + { + "font_class": "redo-filled", + "unicode": "\ue655" + }, + { + "font_class": "refresh", + "unicode": "\ue657" + }, + { + "font_class": "refresh-filled", + "unicode": "\ue656" + }, + { + "font_class": "refreshempty", + "unicode": "\ue6bf" + }, + { + "font_class": "reload", + "unicode": "\ue6b2" + }, + { + "font_class": "right", + "unicode": "\ue6b5" + }, + { + "font_class": "scan", + "unicode": "\ue62a" + }, + { + "font_class": "search", + "unicode": "\ue654" + }, + { + "font_class": "settings", + "unicode": "\ue653" + }, + { + "font_class": "settings-filled", + "unicode": "\ue6ce" + }, + { + "font_class": "shop", + "unicode": "\ue62f" + }, + { + "font_class": "shop-filled", + "unicode": "\ue6cd" + }, + { + "font_class": "smallcircle", + "unicode": "\ue67c" + }, + { + "font_class": "smallcircle-filled", + "unicode": "\ue665" + }, + { + "font_class": "sound", + "unicode": "\ue684" + }, + { + "font_class": "sound-filled", + "unicode": "\ue686" + }, + { + "font_class": "spinner-cycle", + "unicode": "\ue68a" + }, + { + "font_class": "staff", + "unicode": "\ue6a7" + }, + { + "font_class": "staff-filled", + "unicode": "\ue6cb" + }, + { + "font_class": "star", + "unicode": "\ue688" + }, + { + "font_class": "star-filled", + "unicode": "\ue68f" + }, + { + "font_class": "starhalf", + "unicode": "\ue683" + }, + { + "font_class": "trash", + "unicode": "\ue687" + }, + { + "font_class": "trash-filled", + "unicode": "\ue685" + }, + { + "font_class": "tune", + "unicode": "\ue6aa" + }, + { + "font_class": "tune-filled", + "unicode": "\ue6ca" + }, + { + "font_class": "undo", + "unicode": "\ue64f" + }, + { + "font_class": "undo-filled", + "unicode": "\ue64c" + }, + { + "font_class": "up", + "unicode": "\ue6b6" + }, + { + "font_class": "top", + "unicode": "\ue6b6" + }, + { + "font_class": "upload", + "unicode": "\ue690" + }, + { + "font_class": "upload-filled", + "unicode": "\ue68e" + }, + { + "font_class": "videocam", + "unicode": "\ue68c" + }, + { + "font_class": "videocam-filled", + "unicode": "\ue689" + }, + { + "font_class": "vip", + "unicode": "\ue6a8" + }, + { + "font_class": "vip-filled", + "unicode": "\ue6c6" + }, + { + "font_class": "wallet", + "unicode": "\ue6b1" + }, + { + "font_class": "wallet-filled", + "unicode": "\ue6c2" + }, + { + "font_class": "weibo", + "unicode": "\ue68b" + }, + { + "font_class": "weixin", + "unicode": "\ue691" + } +] as IconsDataItem[] + +// export const fontData = JSON.parse<IconsDataItem>(fontDataJson) diff --git a/uni_modules/uni-icons/components/uni-icons/uniicons_file_vue.js b/uni_modules/uni-icons/components/uni-icons/uniicons_file_vue.js new file mode 100644 index 0000000..1cd11e1 --- /dev/null +++ b/uni_modules/uni-icons/components/uni-icons/uniicons_file_vue.js @@ -0,0 +1,649 @@ + +export const fontData = [ + { + "font_class": "arrow-down", + "unicode": "\ue6be" + }, + { + "font_class": "arrow-left", + "unicode": "\ue6bc" + }, + { + "font_class": "arrow-right", + "unicode": "\ue6bb" + }, + { + "font_class": "arrow-up", + "unicode": "\ue6bd" + }, + { + "font_class": "auth", + "unicode": "\ue6ab" + }, + { + "font_class": "auth-filled", + "unicode": "\ue6cc" + }, + { + "font_class": "back", + "unicode": "\ue6b9" + }, + { + "font_class": "bars", + "unicode": "\ue627" + }, + { + "font_class": "calendar", + "unicode": "\ue6a0" + }, + { + "font_class": "calendar-filled", + "unicode": "\ue6c0" + }, + { + "font_class": "camera", + "unicode": "\ue65a" + }, + { + "font_class": "camera-filled", + "unicode": "\ue658" + }, + { + "font_class": "cart", + "unicode": "\ue631" + }, + { + "font_class": "cart-filled", + "unicode": "\ue6d0" + }, + { + "font_class": "chat", + "unicode": "\ue65d" + }, + { + "font_class": "chat-filled", + "unicode": "\ue659" + }, + { + "font_class": "chatboxes", + "unicode": "\ue696" + }, + { + "font_class": "chatboxes-filled", + "unicode": "\ue692" + }, + { + "font_class": "chatbubble", + "unicode": "\ue697" + }, + { + "font_class": "chatbubble-filled", + "unicode": "\ue694" + }, + { + "font_class": "checkbox", + "unicode": "\ue62b" + }, + { + "font_class": "checkbox-filled", + "unicode": "\ue62c" + }, + { + "font_class": "checkmarkempty", + "unicode": "\ue65c" + }, + { + "font_class": "circle", + "unicode": "\ue65b" + }, + { + "font_class": "circle-filled", + "unicode": "\ue65e" + }, + { + "font_class": "clear", + "unicode": "\ue66d" + }, + { + "font_class": "close", + "unicode": "\ue673" + }, + { + "font_class": "closeempty", + "unicode": "\ue66c" + }, + { + "font_class": "cloud-download", + "unicode": "\ue647" + }, + { + "font_class": "cloud-download-filled", + "unicode": "\ue646" + }, + { + "font_class": "cloud-upload", + "unicode": "\ue645" + }, + { + "font_class": "cloud-upload-filled", + "unicode": "\ue648" + }, + { + "font_class": "color", + "unicode": "\ue6cf" + }, + { + "font_class": "color-filled", + "unicode": "\ue6c9" + }, + { + "font_class": "compose", + "unicode": "\ue67f" + }, + { + "font_class": "contact", + "unicode": "\ue693" + }, + { + "font_class": "contact-filled", + "unicode": "\ue695" + }, + { + "font_class": "down", + "unicode": "\ue6b8" + }, + { + "font_class": "bottom", + "unicode": "\ue6b8" + }, + { + "font_class": "download", + "unicode": "\ue68d" + }, + { + "font_class": "download-filled", + "unicode": "\ue681" + }, + { + "font_class": "email", + "unicode": "\ue69e" + }, + { + "font_class": "email-filled", + "unicode": "\ue69a" + }, + { + "font_class": "eye", + "unicode": "\ue651" + }, + { + "font_class": "eye-filled", + "unicode": "\ue66a" + }, + { + "font_class": "eye-slash", + "unicode": "\ue6b3" + }, + { + "font_class": "eye-slash-filled", + "unicode": "\ue6b4" + }, + { + "font_class": "fire", + "unicode": "\ue6a1" + }, + { + "font_class": "fire-filled", + "unicode": "\ue6c5" + }, + { + "font_class": "flag", + "unicode": "\ue65f" + }, + { + "font_class": "flag-filled", + "unicode": "\ue660" + }, + { + "font_class": "folder-add", + "unicode": "\ue6a9" + }, + { + "font_class": "folder-add-filled", + "unicode": "\ue6c8" + }, + { + "font_class": "font", + "unicode": "\ue6a3" + }, + { + "font_class": "forward", + "unicode": "\ue6ba" + }, + { + "font_class": "gear", + "unicode": "\ue664" + }, + { + "font_class": "gear-filled", + "unicode": "\ue661" + }, + { + "font_class": "gift", + "unicode": "\ue6a4" + }, + { + "font_class": "gift-filled", + "unicode": "\ue6c4" + }, + { + "font_class": "hand-down", + "unicode": "\ue63d" + }, + { + "font_class": "hand-down-filled", + "unicode": "\ue63c" + }, + { + "font_class": "hand-up", + "unicode": "\ue63f" + }, + { + "font_class": "hand-up-filled", + "unicode": "\ue63e" + }, + { + "font_class": "headphones", + "unicode": "\ue630" + }, + { + "font_class": "heart", + "unicode": "\ue639" + }, + { + "font_class": "heart-filled", + "unicode": "\ue641" + }, + { + "font_class": "help", + "unicode": "\ue679" + }, + { + "font_class": "help-filled", + "unicode": "\ue674" + }, + { + "font_class": "home", + "unicode": "\ue662" + }, + { + "font_class": "home-filled", + "unicode": "\ue663" + }, + { + "font_class": "image", + "unicode": "\ue670" + }, + { + "font_class": "image-filled", + "unicode": "\ue678" + }, + { + "font_class": "images", + "unicode": "\ue650" + }, + { + "font_class": "images-filled", + "unicode": "\ue64b" + }, + { + "font_class": "info", + "unicode": "\ue669" + }, + { + "font_class": "info-filled", + "unicode": "\ue649" + }, + { + "font_class": "left", + "unicode": "\ue6b7" + }, + { + "font_class": "link", + "unicode": "\ue6a5" + }, + { + "font_class": "list", + "unicode": "\ue644" + }, + { + "font_class": "location", + "unicode": "\ue6ae" + }, + { + "font_class": "location-filled", + "unicode": "\ue6af" + }, + { + "font_class": "locked", + "unicode": "\ue66b" + }, + { + "font_class": "locked-filled", + "unicode": "\ue668" + }, + { + "font_class": "loop", + "unicode": "\ue633" + }, + { + "font_class": "mail-open", + "unicode": "\ue643" + }, + { + "font_class": "mail-open-filled", + "unicode": "\ue63a" + }, + { + "font_class": "map", + "unicode": "\ue667" + }, + { + "font_class": "map-filled", + "unicode": "\ue666" + }, + { + "font_class": "map-pin", + "unicode": "\ue6ad" + }, + { + "font_class": "map-pin-ellipse", + "unicode": "\ue6ac" + }, + { + "font_class": "medal", + "unicode": "\ue6a2" + }, + { + "font_class": "medal-filled", + "unicode": "\ue6c3" + }, + { + "font_class": "mic", + "unicode": "\ue671" + }, + { + "font_class": "mic-filled", + "unicode": "\ue677" + }, + { + "font_class": "micoff", + "unicode": "\ue67e" + }, + { + "font_class": "micoff-filled", + "unicode": "\ue6b0" + }, + { + "font_class": "minus", + "unicode": "\ue66f" + }, + { + "font_class": "minus-filled", + "unicode": "\ue67d" + }, + { + "font_class": "more", + "unicode": "\ue64d" + }, + { + "font_class": "more-filled", + "unicode": "\ue64e" + }, + { + "font_class": "navigate", + "unicode": "\ue66e" + }, + { + "font_class": "navigate-filled", + "unicode": "\ue67a" + }, + { + "font_class": "notification", + "unicode": "\ue6a6" + }, + { + "font_class": "notification-filled", + "unicode": "\ue6c1" + }, + { + "font_class": "paperclip", + "unicode": "\ue652" + }, + { + "font_class": "paperplane", + "unicode": "\ue672" + }, + { + "font_class": "paperplane-filled", + "unicode": "\ue675" + }, + { + "font_class": "person", + "unicode": "\ue699" + }, + { + "font_class": "person-filled", + "unicode": "\ue69d" + }, + { + "font_class": "personadd", + "unicode": "\ue69f" + }, + { + "font_class": "personadd-filled", + "unicode": "\ue698" + }, + { + "font_class": "personadd-filled-copy", + "unicode": "\ue6d1" + }, + { + "font_class": "phone", + "unicode": "\ue69c" + }, + { + "font_class": "phone-filled", + "unicode": "\ue69b" + }, + { + "font_class": "plus", + "unicode": "\ue676" + }, + { + "font_class": "plus-filled", + "unicode": "\ue6c7" + }, + { + "font_class": "plusempty", + "unicode": "\ue67b" + }, + { + "font_class": "pulldown", + "unicode": "\ue632" + }, + { + "font_class": "pyq", + "unicode": "\ue682" + }, + { + "font_class": "qq", + "unicode": "\ue680" + }, + { + "font_class": "redo", + "unicode": "\ue64a" + }, + { + "font_class": "redo-filled", + "unicode": "\ue655" + }, + { + "font_class": "refresh", + "unicode": "\ue657" + }, + { + "font_class": "refresh-filled", + "unicode": "\ue656" + }, + { + "font_class": "refreshempty", + "unicode": "\ue6bf" + }, + { + "font_class": "reload", + "unicode": "\ue6b2" + }, + { + "font_class": "right", + "unicode": "\ue6b5" + }, + { + "font_class": "scan", + "unicode": "\ue62a" + }, + { + "font_class": "search", + "unicode": "\ue654" + }, + { + "font_class": "settings", + "unicode": "\ue653" + }, + { + "font_class": "settings-filled", + "unicode": "\ue6ce" + }, + { + "font_class": "shop", + "unicode": "\ue62f" + }, + { + "font_class": "shop-filled", + "unicode": "\ue6cd" + }, + { + "font_class": "smallcircle", + "unicode": "\ue67c" + }, + { + "font_class": "smallcircle-filled", + "unicode": "\ue665" + }, + { + "font_class": "sound", + "unicode": "\ue684" + }, + { + "font_class": "sound-filled", + "unicode": "\ue686" + }, + { + "font_class": "spinner-cycle", + "unicode": "\ue68a" + }, + { + "font_class": "staff", + "unicode": "\ue6a7" + }, + { + "font_class": "staff-filled", + "unicode": "\ue6cb" + }, + { + "font_class": "star", + "unicode": "\ue688" + }, + { + "font_class": "star-filled", + "unicode": "\ue68f" + }, + { + "font_class": "starhalf", + "unicode": "\ue683" + }, + { + "font_class": "trash", + "unicode": "\ue687" + }, + { + "font_class": "trash-filled", + "unicode": "\ue685" + }, + { + "font_class": "tune", + "unicode": "\ue6aa" + }, + { + "font_class": "tune-filled", + "unicode": "\ue6ca" + }, + { + "font_class": "undo", + "unicode": "\ue64f" + }, + { + "font_class": "undo-filled", + "unicode": "\ue64c" + }, + { + "font_class": "up", + "unicode": "\ue6b6" + }, + { + "font_class": "top", + "unicode": "\ue6b6" + }, + { + "font_class": "upload", + "unicode": "\ue690" + }, + { + "font_class": "upload-filled", + "unicode": "\ue68e" + }, + { + "font_class": "videocam", + "unicode": "\ue68c" + }, + { + "font_class": "videocam-filled", + "unicode": "\ue689" + }, + { + "font_class": "vip", + "unicode": "\ue6a8" + }, + { + "font_class": "vip-filled", + "unicode": "\ue6c6" + }, + { + "font_class": "wallet", + "unicode": "\ue6b1" + }, + { + "font_class": "wallet-filled", + "unicode": "\ue6c2" + }, + { + "font_class": "weibo", + "unicode": "\ue68b" + }, + { + "font_class": "weixin", + "unicode": "\ue691" + } +] + +// export const fontData = JSON.parse<IconsDataItem>(fontDataJson) diff --git a/uni_modules/uni-icons/package.json b/uni_modules/uni-icons/package.json new file mode 100644 index 0000000..6b681b4 --- /dev/null +++ b/uni_modules/uni-icons/package.json @@ -0,0 +1,89 @@ +{ + "id": "uni-icons", + "displayName": "uni-icons 鍥炬爣", + "version": "2.0.10", + "description": "鍥炬爣缁勪欢锛岀敤浜庡睍绀虹Щ鍔ㄧ甯歌鐨勫浘鏍囷紝鍙嚜瀹氫箟棰滆壊銆佸ぇ灏忋��", + "keywords": [ + "uni-ui", + "uniui", + "icon", + "鍥炬爣" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "^3.2.14" + }, + "directories": { + "example": "../../temps/example_temps" + }, +"dcloudext": { + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "鏃�", + "data": "鏃�", + "permissions": "鏃�" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui", + "type": "component-vue" + }, + "uni_modules": { + "dependencies": ["uni-scss"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y", + "alipay": "n" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y", + "app-uvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "寰俊娴忚鍣�(Android)": "y", + "QQ娴忚鍣�(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "灏忕▼搴�": { + "寰俊": "y", + "闃块噷": "y", + "鐧惧害": "y", + "瀛楄妭璺冲姩": "y", + "QQ": "y", + "閽夐拤": "y", + "蹇墜": "y", + "椋炰功": "y", + "浜笢": "y" + }, + "蹇簲鐢�": { + "鍗庝负": "y", + "鑱旂洘": "y" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-icons/readme.md b/uni_modules/uni-icons/readme.md new file mode 100644 index 0000000..86234ba --- /dev/null +++ b/uni_modules/uni-icons/readme.md @@ -0,0 +1,8 @@ +## Icons 鍥炬爣 +> **缁勪欢鍚嶏細uni-icons** +> 浠g爜鍧楋細 `uIcons` + +鐢ㄤ簬灞曠ず icons 鍥炬爣 銆� + +### [鏌ョ湅鏂囨。](https://uniapp.dcloud.io/component/uniui/uni-icons) +#### 濡備娇鐢ㄨ繃绋嬩腑鏈変换浣曢棶棰橈紝鎴栬�呮偍瀵箄ni-ui鏈変竴浜涘ソ鐨勫缓璁紝娆㈣繋鍔犲叆 uni-ui 浜ゆ祦缇わ細871950839 -- Gitblit v1.8.0