| @@ -8,8 +8,10 @@ | |||||
| <div class="content"> | <div class="content"> | ||||
| <div class="item" v-for="(item, index) in list" :key="index"> | <div class="item" v-for="(item, index) in list" :key="index"> | ||||
| <div class="item-l"> | <div class="item-l"> | ||||
| <img class="avatar" :src="item.RelAvatarLink"> | |||||
| <div class="name-c"><a class="name" :href="`/${item.Name}`" :title="item.Name">{{ item.Name }}</a></div> | |||||
| <a class="name" :href="`/${item.Name}`" :title="item.Name"> | |||||
| <img class="avatar" :src="item.RelAvatarLink"> | |||||
| <div class="name-c"><span>{{ item.Name }}</span></div> | |||||
| </a> | |||||
| </div> | </div> | ||||
| <div class="item-r"> | <div class="item-r"> | ||||
| <i class="ri-user-2-line" style="color:rgb(250, 140, 22);margin-right:4px;"></i> | <i class="ri-user-2-line" style="color:rgb(250, 140, 22);margin-right:4px;"></i> | ||||
| @@ -84,6 +86,11 @@ export default { | |||||
| .item-l { | .item-l { | ||||
| flex: 1; | flex: 1; | ||||
| overflow: hidden; | overflow: hidden; | ||||
| a { | |||||
| display: flex; | |||||
| align-items: center; | |||||
| overflow: hidden; | |||||
| } | |||||
| } | } | ||||
| .item-r { | .item-r { | ||||
| @@ -8,12 +8,12 @@ | |||||
| <div class="content"> | <div class="content"> | ||||
| <div class="item" v-for="(item, index) in list" :key="index"> | <div class="item" v-for="(item, index) in list" :key="index"> | ||||
| <div class="item-l"> | <div class="item-l"> | ||||
| <img class="avatar" :src="item.User.RelAvatarLink"> | |||||
| <div class="name-c"> | |||||
| <a class="name" :href="`/${item.User.Name}`" :title="(item.User.FullName || item.User.Name)"> | |||||
| <a class="name" :href="`/${item.User.Name}`" :title="(item.User.FullName || item.User.Name)"> | |||||
| <img class="avatar" :src="item.User.RelAvatarLink"> | |||||
| <div class="name-c"> | |||||
| {{ item.User.FullName || item.User.Name }} | {{ item.User.FullName || item.User.Name }} | ||||
| </a> | |||||
| </div> | |||||
| </div> | |||||
| </a> | |||||
| </div> | </div> | ||||
| <div class="item-r"> | <div class="item-r"> | ||||
| <template v-if="item.ShowButton"> | <template v-if="item.ShowButton"> | ||||
| @@ -108,6 +108,12 @@ export default { | |||||
| .item-l { | .item-l { | ||||
| flex: 1; | flex: 1; | ||||
| overflow: hidden; | overflow: hidden; | ||||
| a { | |||||
| display: flex; | |||||
| align-items: center; | |||||
| overflow: hidden; | |||||
| } | |||||
| } | } | ||||
| .item-r { | .item-r { | ||||
| @@ -12,6 +12,7 @@ | |||||
| <script> | <script> | ||||
| import { getHomePageData } from '~/apis/modules/repos'; | import { getHomePageData } from '~/apis/modules/repos'; | ||||
| import LetterAvatar from '~/utils/letteravatar'; | |||||
| export default { | export default { | ||||
| name: "RecommendRepos", | name: "RecommendRepos", | ||||
| @@ -87,11 +88,7 @@ export default { | |||||
| selectedRepoEl.innerHTML = html; | selectedRepoEl.innerHTML = html; | ||||
| this.swiperHandler.updateSlides(); | this.swiperHandler.updateSlides(); | ||||
| this.swiperHandler.updateProgress(); | this.swiperHandler.updateProgress(); | ||||
| this.$nextTick(() => { | |||||
| if (typeof LetterAvatar != 'undefined') { | |||||
| LetterAvatar && LetterAvatar.transform(); | |||||
| } | |||||
| }); | |||||
| LetterAvatar.transform(); | |||||
| } | } | ||||
| } | } | ||||
| }, | }, | ||||
| @@ -22,12 +22,12 @@ export default { | |||||
| }, { | }, { | ||||
| key: 'mostactive', | key: 'mostactive', | ||||
| label: this.$t('repos.mostActive'), | label: this.$t('repos.mostActive'), | ||||
| }, { | |||||
| key: 'newest', | |||||
| label: this.$t('repos.newest'), | |||||
| }, { | }, { | ||||
| key: 'recentupdate', | key: 'recentupdate', | ||||
| label: this.$t('repos.recentlyUpdated'), | label: this.$t('repos.recentlyUpdated'), | ||||
| }, { | |||||
| key: 'newest', | |||||
| label: this.$t('repos.newest'), | |||||
| }, { | }, { | ||||
| key: 'moststars', | key: 'moststars', | ||||
| label: this.$t('repos.mostStars'), | label: this.$t('repos.mostStars'), | ||||
| @@ -40,7 +40,7 @@ | |||||
| </span> | </span> | ||||
| </div> | </div> | ||||
| <div class="descr" v-show="data.DescriptionShow" v-html="data.DescriptionShow"></div> | <div class="descr" v-show="data.DescriptionShow" v-html="data.DescriptionShow"></div> | ||||
| <div class="tags" v-show="data.Topics"> | |||||
| <div class="tags" v-show="data.Topics && data.Topics.length"> | |||||
| <a v-for="(item, index) in data.TopicsShow" :key="index" class="tag" | <a v-for="(item, index) in data.TopicsShow" :key="index" class="tag" | ||||
| :class="(item.topic.toLocaleLowerCase() == topic.toLocaleLowerCase() ? 'tag-focus' : '')" | :class="(item.topic.toLocaleLowerCase() == topic.toLocaleLowerCase() ? 'tag-focus' : '')" | ||||
| :href="`/explore/repos?q=&topic=${item.topic}&sort=hot`" v-html="item.topicShow"></a> | :href="`/explore/repos?q=&topic=${item.topic}&sort=hot`" v-html="item.topicShow"></a> | ||||
| @@ -187,9 +187,9 @@ export default { | |||||
| .content .title-r { | .content .title-r { | ||||
| display: flex; | display: flex; | ||||
| align-items: center; | align-items: center; | ||||
| font-size: 13px; | |||||
| font-weight: bold; | |||||
| color: rgb(26, 40, 51, 0.9); | |||||
| font-weight: 400; | |||||
| font-size: 12px; | |||||
| color: rgba(26, 40, 51, 1); | |||||
| justify-content: flex-end; | justify-content: flex-end; | ||||
| } | } | ||||
| @@ -17,6 +17,7 @@ | |||||
| <script> | <script> | ||||
| import ReposItem from '../components/ReposItem.vue'; | import ReposItem from '../components/ReposItem.vue'; | ||||
| import { getReposListData } from '~/apis/modules/repos'; | import { getReposListData } from '~/apis/modules/repos'; | ||||
| import LetterAvatar from '~/utils/letteravatar'; | |||||
| export default { | export default { | ||||
| name: "ReposList", | name: "ReposList", | ||||
| @@ -71,11 +72,7 @@ export default { | |||||
| } | } | ||||
| }); | }); | ||||
| this.total = res.Data.Total; | this.total = res.Data.Total; | ||||
| this.$nextTick(() => { | |||||
| if (typeof LetterAvatar != 'undefined') { | |||||
| LetterAvatar && LetterAvatar.transform(); | |||||
| } | |||||
| }); | |||||
| LetterAvatar.transform(); | |||||
| } else { | } else { | ||||
| this.list = []; | this.list = []; | ||||
| this.total = 0; | this.total = 0; | ||||
| @@ -142,6 +142,7 @@ export default { | |||||
| } | } | ||||
| }, | }, | ||||
| search() { | search() { | ||||
| this.searchInputValue = this.searchInputValue.trim(); | |||||
| if (this.type == 'square') { | if (this.type == 'square') { | ||||
| window.location.href = `/explore/repos?q=${this.searchInputValue}&sort=${this.sort}&topic=${this.selectTopic}`; | window.location.href = `/explore/repos?q=${this.searchInputValue}&sort=${this.sort}&topic=${this.selectTopic}`; | ||||
| } else { | } else { | ||||
| @@ -37,6 +37,7 @@ | |||||
| <script> | <script> | ||||
| import { getPromoteData } from '~/apis/modules/common'; | import { getPromoteData } from '~/apis/modules/common'; | ||||
| import { getReposSquareTabData } from '~/apis/modules/repos'; | import { getReposSquareTabData } from '~/apis/modules/repos'; | ||||
| import LetterAvatar from '~/utils/letteravatar'; | |||||
| export default { | export default { | ||||
| name: "SquareTop", | name: "SquareTop", | ||||
| @@ -95,21 +96,18 @@ export default { | |||||
| renderSwiper(data) { | renderSwiper(data) { | ||||
| const swiperEl = document.getElementById("_repo_top_mid_repo"); | const swiperEl = document.getElementById("_repo_top_mid_repo"); | ||||
| let html = ''; | let html = ''; | ||||
| const width = swiperEl.parentNode.clientWidth; | |||||
| for (let i = 0, iLen = data.length; i < iLen; i++) { | for (let i = 0, iLen = data.length; i < iLen; i++) { | ||||
| html += `<div class="swiper-slide">`; | html += `<div class="swiper-slide">`; | ||||
| for (let j = i; j < i + 2; j++) { | for (let j = i; j < i + 2; j++) { | ||||
| let dataJ = data[j]; | let dataJ = data[j]; | ||||
| if (dataJ === undefined) break; | if (dataJ === undefined) break; | ||||
| html += `<div class="_repo_sw_card"> | |||||
| <div class="_repo_sw_card_title _repo_nowrap"><a href="/${dataJ.OwnerName}/${dataJ.Name}" title="${dataJ.Alias}">${dataJ.Alias}</a></div> | |||||
| <div class="_repo_sw_card_descr _repo_nowrap_line_2" title="${dataJ.Description}">${dataJ.Description}</div> | |||||
| <div class="_repo_sw_card_label _repo_nowrap">` | |||||
| const topics = dataJ.Topics || []; | |||||
| for (let k = 0, kLen = topics.length; k < kLen; k++) { | |||||
| html += `<span><a href="/explore/repos?q=&topic=${topics[k]}&sort=hot">${topics[k]}</a></span>` | |||||
| } | |||||
| html += `</div> | |||||
| <a href="/${dataJ.OwnerName}/${dataJ.Name}" style="position:absolute;width:100%;height:100%;top:0;left:0;"></a> | |||||
| html += `<div class="_repo_sw_card"><div style="display:flex;"> | |||||
| ${dataJ["Avatar"] ? `<img style="border-radius:100%;width:35px;height:35px;margin-bottom:0.6em;" class="left floated mini ui image" src="${dataJ["Avatar"]}">` | |||||
| : `<img style="border-radius:100%;width:35px;height:35px;margin-bottom:0.6em;" class="left floated mini ui image" avatar="${dataJ["OwnerName"]}">`} | |||||
| <span class="header nowrap" style="color:rgb(50, 145, 248);font-size:14px;height:35px;line-height:35px;" href="javascript:;" title="${dataJ["Alias"]}">${dataJ["Alias"]}</span> | |||||
| </div><div class="_repo_sw_card_descr _repo_nowrap_line_3" title="${dataJ.Description}">${dataJ.Description}</div> | |||||
| <a href="/${dataJ.OwnerName}/${dataJ.Name}" style="position:absolute;width:100%;height:100%;top:0;left:0;"></a> | |||||
| </div>`; | </div>`; | ||||
| } | } | ||||
| html += `</div>`; | html += `</div>`; | ||||
| @@ -119,6 +117,7 @@ export default { | |||||
| swiperEl.innerHTML = html; | swiperEl.innerHTML = html; | ||||
| this.swiperHandler.updateSlides(); | this.swiperHandler.updateSlides(); | ||||
| this.swiperHandler.updateProgress(); | this.swiperHandler.updateProgress(); | ||||
| LetterAvatar.transform(); | |||||
| }, | }, | ||||
| getBannerData() { | getBannerData() { | ||||
| getPromoteData('/repos/square_banner').then(res => { | getPromoteData('/repos/square_banner').then(res => { | ||||
| @@ -290,7 +289,7 @@ img:not([src]) { | |||||
| border-width: 1px; | border-width: 1px; | ||||
| border-style: solid; | border-style: solid; | ||||
| font-size: 14px; | font-size: 14px; | ||||
| padding: 10px; | |||||
| padding: 12px; | |||||
| background: rgba(255, 255, 255, 0.6); | background: rgba(255, 255, 255, 0.6); | ||||
| margin-bottom: 20px; | margin-bottom: 20px; | ||||
| box-sizing: border-box; | box-sizing: border-box; | ||||
| @@ -303,7 +302,7 @@ img:not([src]) { | |||||
| white-space: nowrap; | white-space: nowrap; | ||||
| } | } | ||||
| /deep/._repo_nowrap_line_2 { | |||||
| /deep/._repo_nowrap_line_3 { | |||||
| overflow: hidden; | overflow: hidden; | ||||
| text-overflow: ellipsis; | text-overflow: ellipsis; | ||||
| word-break: break-all; | word-break: break-all; | ||||
| @@ -311,8 +310,8 @@ img:not([src]) { | |||||
| color: rgb(136, 136, 136); | color: rgb(136, 136, 136); | ||||
| display: -webkit-box; | display: -webkit-box; | ||||
| -webkit-box-orient: vertical; | -webkit-box-orient: vertical; | ||||
| -webkit-line-clamp: 2; | |||||
| max-height: 45px; | |||||
| -webkit-line-clamp: 3; | |||||
| max-height: 65px; | |||||
| white-space: break-spaces; | white-space: break-spaces; | ||||
| } | } | ||||
| @@ -337,6 +336,9 @@ img:not([src]) { | |||||
| /deep/._repo_sw_card_label { | /deep/._repo_sw_card_label { | ||||
| color: rgb(26, 40, 51); | color: rgb(26, 40, 51); | ||||
| font-size: 14px; | font-size: 14px; | ||||
| display: flex; | |||||
| width: 100%; | |||||
| position: relative; | |||||
| } | } | ||||
| /deep/._repo_sw_card_label span { | /deep/._repo_sw_card_label span { | ||||
| @@ -344,6 +346,7 @@ img:not([src]) { | |||||
| background: rgba(232, 232, 232, 0.6); | background: rgba(232, 232, 232, 0.6); | ||||
| padding: 0px 6px 2px; | padding: 0px 6px 2px; | ||||
| margin-right: 10px; | margin-right: 10px; | ||||
| max-width: 50%; | |||||
| } | } | ||||
| /deep/._repo_top_mid_repo_list .swiper-pagination-bullet { | /deep/._repo_top_mid_repo_list .swiper-pagination-bullet { | ||||
| @@ -0,0 +1,75 @@ | |||||
| function LetterAvatar(name, size, color) { | |||||
| name = name || ""; | |||||
| size = size || 60; | |||||
| var colours = [ | |||||
| "#1abc9c", | |||||
| "#2ecc71", | |||||
| "#3498db", | |||||
| "#9b59b6", | |||||
| "#34495e", | |||||
| "#16a085", | |||||
| "#27ae60", | |||||
| "#2980b9", | |||||
| "#8e44ad", | |||||
| "#2c3e50", | |||||
| "#f1c40f", | |||||
| "#e67e22", | |||||
| "#e74c3c", | |||||
| "#00bcd4", | |||||
| "#95a5a6", | |||||
| "#f39c12", | |||||
| "#d35400", | |||||
| "#c0392b", | |||||
| "#bdc3c7", | |||||
| "#7f8c8d", | |||||
| ], | |||||
| nameSplit = String(name).split(" "), | |||||
| initials, | |||||
| charIndex, | |||||
| colourIndex, | |||||
| canvas, | |||||
| context, | |||||
| dataURI; | |||||
| if (nameSplit.length == 1) { | |||||
| initials = nameSplit[0] ? nameSplit[0].charAt(0) : "?"; | |||||
| } else { | |||||
| initials = nameSplit[0].charAt(0) + nameSplit[1].charAt(0); | |||||
| } | |||||
| let initials1 = initials.toUpperCase(); | |||||
| if (window.devicePixelRatio) { | |||||
| size = size * window.devicePixelRatio; | |||||
| } | |||||
| charIndex = (initials == "?" ? 72 : initials.charCodeAt(0)) - 64; | |||||
| colourIndex = charIndex % 20; | |||||
| canvas = document.createElement("canvas"); | |||||
| canvas.width = size; | |||||
| canvas.height = size; | |||||
| context = canvas.getContext("2d"); | |||||
| context.fillStyle = color ? color : colours[colourIndex - 1]; | |||||
| context.fillRect(0, 0, canvas.width, canvas.height); | |||||
| context.font = Math.round(canvas.width / 2) + "px 'Microsoft Yahei'"; | |||||
| context.textAlign = "center"; | |||||
| context.fillStyle = "#FFF"; | |||||
| context.fillText(initials1, size / 2, size / 1.5); | |||||
| dataURI = canvas.toDataURL(); | |||||
| canvas = null; | |||||
| return dataURI; | |||||
| } | |||||
| LetterAvatar.transform = function () { | |||||
| Array.prototype.forEach.call( | |||||
| document.querySelectorAll("img[avatar]"), | |||||
| function (img, name, color) { | |||||
| name = img.getAttribute("avatar"); | |||||
| color = img.getAttribute("color"); | |||||
| img.src = LetterAvatar(name, img.getAttribute("width"), color); | |||||
| img.removeAttribute("avatar"); | |||||
| img.setAttribute("alt", name); | |||||
| } | |||||
| ); | |||||
| }; | |||||
| export default LetterAvatar; | |||||