feat: add few icons

This commit is contained in:
tim
2025-09-06 11:25:44 +08:00
parent da47d37dc5
commit 6ad7e951fe
27 changed files with 117 additions and 123 deletions

View File

@@ -19,13 +19,7 @@
class="option-icon" class="option-icon"
:alt="label.name" :alt="label.name"
/> />
<component <component v-else :is="label.icon" class="option-icon" :size="16" />
v-else-if="isIconComponent(label.icon)"
:is="label.icon"
class="option-icon"
:size="16"
/>
<i v-else :class="['option-icon', label.icon]"></i>
</template> </template>
<span>{{ label.name }}</span> <span>{{ label.name }}</span>
</div> </div>
@@ -44,13 +38,7 @@
class="option-icon" class="option-icon"
:alt="selectedLabels[0].name" :alt="selectedLabels[0].name"
/> />
<component <component v-else :is="selectedLabels[0].icon" class="option-icon" :size="16" />
v-else-if="isIconComponent(selectedLabels[0].icon)"
:is="selectedLabels[0].icon"
class="option-icon"
:size="16"
/>
<i v-else :class="['option-icon', selectedLabels[0].icon]"></i>
</template> </template>
<span>{{ selectedLabels[0].name }}</span> <span>{{ selectedLabels[0].name }}</span>
</div> </div>
@@ -87,13 +75,7 @@
class="option-icon" class="option-icon"
:alt="o.name" :alt="o.name"
/> />
<component <component v-else :is="o.icon" class="option-icon" :size="16" />
v-else-if="isIconComponent(o.icon)"
:is="o.icon"
class="option-icon"
:size="16"
/>
<i v-else :class="['option-icon', o.icon]"></i>
</template> </template>
<span>{{ o.name }}</span> <span>{{ o.name }}</span>
</slot> </slot>
@@ -129,13 +111,7 @@
class="option-icon" class="option-icon"
:alt="o.name" :alt="o.name"
/> />
<component <component v-else :is="o.icon" class="option-icon" :size="16" />
v-else-if="isIconComponent(o.icon)"
:is="o.icon"
class="option-icon"
:size="16"
/>
<i v-else :class="['option-icon', o.icon]"></i>
</template> </template>
<span>{{ o.name }}</span> <span>{{ o.name }}</span>
</slot> </slot>
@@ -273,10 +249,6 @@ export default {
return /^https?:\/\//.test(icon) || icon.startsWith('/') return /^https?:\/\//.test(icon) || icon.startsWith('/')
} }
const isIconComponent = (icon) => {
return typeof icon === 'string' && !icon.includes(' ')
}
expose({ toggle, close }) expose({ toggle, close })
return { return {
@@ -291,7 +263,6 @@ export default {
isSelected, isSelected,
loading, loading,
isImageIcon, isImageIcon,
isIconComponent,
setSearch, setSearch,
isMobile, isMobile,
} }

View File

@@ -2,7 +2,7 @@
<div class="invite-code-activity"> <div class="invite-code-activity">
<div class="invite-code-description"> <div class="invite-code-description">
<div class="invite-code-description-title"> <div class="invite-code-description-title">
<info /> <info-icon />
<span class="invite-code-description-title-text">邀请规则说明</span> <span class="invite-code-description-title-text">邀请规则说明</span>
</div> </div>
<div class="invite-code-description-content"> <div class="invite-code-description-content">

View File

@@ -10,7 +10,7 @@
<span class="prize-row-title">奖品图片</span> <span class="prize-row-title">奖品图片</span>
<label class="prize-container"> <label class="prize-container">
<BaseImage v-if="data.prizeIcon" :src="data.prizeIcon" class="prize-preview" alt="prize" /> <BaseImage v-if="data.prizeIcon" :src="data.prizeIcon" class="prize-preview" alt="prize" />
<i v-else class="fa-solid fa-image default-prize-icon"></i> <image-files v-else class="default-prize-icon" />
<div class="prize-overlay">上传奖品图片</div> <div class="prize-overlay">上传奖品图片</div>
<input type="file" class="prize-input" accept="image/*" @change="onPrizeIconChange" /> <input type="file" class="prize-input" accept="image/*" @change="onPrizeIconChange" />
</label> </label>

View File

@@ -34,7 +34,7 @@
to="/about" to="/about"
@click="handleItemClick" @click="handleItemClick"
> >
<info class="menu-item-icon" /> <info-icon class="menu-item-icon" />
<span class="menu-item-text">关于</span> <span class="menu-item-text">关于</span>
</NuxtLink> </NuxtLink>
<NuxtLink <NuxtLink

View File

@@ -6,7 +6,7 @@
<div class="message-bottom-container"> <div class="message-bottom-container">
<div class="message-submit" :class="{ disabled: isDisabled }" @click="submit"> <div class="message-submit" :class="{ disabled: isDisabled }" @click="submit">
<template v-if="!loading"> 发送 </template> <template v-if="!loading"> 发送 </template>
<template v-else> <i class="fa-solid fa-spinner fa-spin"></i> 发送中... </template> <template v-else> <loading-four /> 发送中... </template>
</div> </div>
</div> </div>
</div> </div>

View File

@@ -3,20 +3,10 @@
<iframe :src="iframeSrc" frameborder="0" ref="iframeRef" @load="injectBaseTag"></iframe> <iframe :src="iframeSrc" frameborder="0" ref="iframeRef" @load="injectBaseTag"></iframe>
<div class="float-actions"> <div class="float-actions">
<i <down v-if="floatHeight !== MINI_HEIGHT" title="收起至 100px" @click="collapseToMini" />
class="fas fa-chevron-down" <up v-if="floatHeight !== DEFAULT_HEIGHT" title="回弹至 60vh" @click="reboundToDefault" />
v-if="floatHeight !== MINI_HEIGHT" <expand-up title="在页面中打开" @click="expand" />
title="收起至 100px" <close-icon title="关闭" @click="close" />
@click="collapseToMini"
></i>
<i
class="fas fa-chevron-up"
v-if="floatHeight !== DEFAULT_HEIGHT"
title="回弹至 60vh"
@click="reboundToDefault"
></i>
<i class="fas fa-expand" title="在页面中打开" @click="expand"></i>
<i class="fas fa-times" title="关闭" @click="close"></i>
</div> </div>
</div> </div>
</template> </template>

View File

@@ -2,7 +2,7 @@
<div class="milk-tea-activity"> <div class="milk-tea-activity">
<div class="milk-tea-description"> <div class="milk-tea-description">
<div class="milk-tea-description-title"> <div class="milk-tea-description-title">
<i class="fas fa-info-circle"></i> <info-icon />
<span class="milk-tea-description-title-text">升级规则说明</span> <span class="milk-tea-description-title-text">升级规则说明</span>
</div> </div>
<div class="milk-tea-description-content"> <div class="milk-tea-description-content">
@@ -29,7 +29,7 @@
/> />
</div> </div>
<div v-else class="user-level"> <div v-else class="user-level">
<div class="user-level-text"><i class="fas fa-user-circle"></i> 请登录查看自身等级</div> <div class="user-level-text"><user-icon /> 请登录查看自身等级</div>
</div> </div>
</div> </div>
<div <div

View File

@@ -10,13 +10,13 @@
:src="lottery.prizeIcon" :src="lottery.prizeIcon"
alt="prize" alt="prize"
/> />
<i v-else class="fa-solid fa-gift default-prize-icon"></i> <gift v-else class="default-prize-icon" />
</div> </div>
<div class="prize-name">{{ lottery.prizeDescription }}</div> <div class="prize-name">{{ lottery.prizeDescription }}</div>
<div class="prize-count">x {{ lottery.prizeCount }}</div> <div class="prize-count">x {{ lottery.prizeCount }}</div>
</div> </div>
<div class="prize-end-time prize-info-right"> <div class="prize-end-time prize-info-right">
<i v-if="!lotteryEnded" class="fas fa-stopwatch prize-end-time-icon"></i> <stopwatch v-if="!lotteryEnded" class="prize-end-time-icon" />
<div v-if="!isMobile && !lotteryEnded" class="prize-end-time-title">离结束</div> <div v-if="!isMobile && !lotteryEnded" class="prize-end-time-title">离结束</div>
<div class="prize-end-time-value">{{ countdown }}</div> <div class="prize-end-time-value">{{ countdown }}</div>
<div v-if="!isMobile" class="join-prize-button-container-desktop"> <div v-if="!isMobile" class="join-prize-button-container-desktop">
@@ -26,7 +26,8 @@
@click="joinLottery" @click="joinLottery"
> >
<div class="join-prize-button-text"> <div class="join-prize-button-text">
参与抽奖 <i class="fas fa-coins"></i> {{ lottery.pointCost }} 参与抽奖 <paper-money-two class="join-prize-button-text-icon" />
{{ lottery.pointCost }}
</div> </div>
</div> </div>
<div v-else-if="hasJoined" class="join-prize-button-disabled"> <div v-else-if="hasJoined" class="join-prize-button-disabled">
@@ -43,7 +44,7 @@
@click="joinLottery" @click="joinLottery"
> >
<div class="join-prize-button-text"> <div class="join-prize-button-text">
参与抽奖 <i class="fas fa-coins"></i> {{ lottery.pointCost }} 参与抽奖 <paper-money-two class="join-prize-button-text-icon" /> {{ lottery.pointCost }}
</div> </div>
</div> </div>
<div v-else-if="hasJoined" class="join-prize-button-disabled"> <div v-else-if="hasJoined" class="join-prize-button-disabled">
@@ -61,7 +62,7 @@
@click="gotoUser(p.id)" @click="gotoUser(p.id)"
/> />
<div v-if="lotteryEnded && lotteryWinners.length" class="prize-member-winner"> <div v-if="lotteryEnded && lotteryWinners.length" class="prize-member-winner">
<i class="fas fa-medal medal-icon"></i> <medal-one class="medal-icon"></medal-one>
<span class="prize-member-winner-name">获奖者: </span> <span class="prize-member-winner-name">获奖者: </span>
<BaseImage <BaseImage
v-for="w in lotteryWinners" v-for="w in lotteryWinners"

View File

@@ -34,7 +34,7 @@
<div class="poll-option-title" v-else>单选</div> <div class="poll-option-title" v-else>单选</div>
<div class="poll-left-time"> <div class="poll-left-time">
<i class="fas fa-stopwatch poll-left-time-icon"></i> <stopwatch class="poll-left-time-icon" />
<div class="poll-left-time-title">离结束</div> <div class="poll-left-time-title">离结束</div>
<div class="poll-left-time-value">{{ countdown }}</div> <div class="poll-left-time-value">{{ countdown }}</div>
</div> </div>
@@ -55,9 +55,7 @@
</div> </div>
<div class="multi-selection-container"> <div class="multi-selection-container">
<div class="join-poll-button" @click="submitMultiPoll"> <div class="join-poll-button" @click="submitMultiPoll"><check /> 确认投票</div>
<i class="fas fa-check"></i> 确认投票
</div>
</div> </div>
</template> </template>
<template v-else> <template v-else>
@@ -77,9 +75,7 @@
</div> </div>
<div class="single-selection-container"> <div class="single-selection-container">
<div class="join-poll-button" @click="submitSinglePoll"> <div class="join-poll-button" @click="submitSinglePoll"><check /> 确认投票</div>
<i class="fas fa-check"></i> 确认投票
</div>
</div> </div>
</template> </template>
</div> </div>
@@ -95,22 +91,20 @@
class="poll-option-button" class="poll-option-button"
@click="showPollResult = false" @click="showPollResult = false"
> >
<i class="fas fa-chevron-left"></i> 投票 <arrow-left /> 投票
</div> </div>
<div <div
v-else-if="!pollEnded && !hasVoted" v-else-if="!pollEnded && !hasVoted"
class="poll-option-button" class="poll-option-button"
@click="showPollResult = true" @click="showPollResult = true"
> >
<i class="fas fa-chart-bar"></i> 结果 <chart-histogram /> 结果
</div>
<div v-else-if="pollEnded" class="poll-option-hint">
<i class="fas fa-stopwatch"></i> 投票已结束
</div> </div>
<div v-else-if="pollEnded" class="poll-option-hint"><stopwatch /> 投票已结束</div>
<div v-else class="poll-option-hint"> <div v-else class="poll-option-hint">
<div>您已投票等待结束查看结果</div> <div>您已投票等待结束查看结果</div>
<div class="poll-left-time"> <div class="poll-left-time">
<i class="fas fa-stopwatch poll-left-time-icon"></i> <stopwatch class="poll-left-time-icon" />
<div class="poll-left-time-title">离结束</div> <div class="poll-left-time-title">离结束</div>
<div class="poll-left-time-value">{{ countdown }}</div> <div class="poll-left-time-value">{{ countdown }}</div>
</div> </div>

View File

@@ -31,9 +31,9 @@ export default {
const fetchTypes = async () => { const fetchTypes = async () => {
return [ return [
{ id: 'NORMAL', name: '普通帖子', icon: 'fa-regular fa-file' }, { id: 'NORMAL', name: '普通帖子', icon: 'file-text' },
{ id: 'LOTTERY', name: '抽奖帖子', icon: 'fa-solid fa-gift' }, { id: 'LOTTERY', name: '抽奖帖子', icon: 'gift' },
{ id: 'POLL', name: '投票帖子', icon: 'fa-solid fa-square-poll-vertical' }, { id: 'POLL', name: '投票帖子', icon: 'ranking-list' },
] ]
} }

View File

@@ -42,7 +42,7 @@
@click="toggleReaction('LIKE')" @click="toggleReaction('LIKE')"
> >
<like v-if="!userReacted('LIKE')" /> <like v-if="!userReacted('LIKE')" />
<i v-else class="fas fa-heart"></i> <like v-else theme="filled" />
<span class="reactions-count" v-if="likeCount">{{ likeCount }}</span> <span class="reactions-count" v-if="likeCount">{{ likeCount }}</span>
</div> </div>
<slot></slot> <slot></slot>

View File

@@ -13,7 +13,7 @@
> >
<template #display="{ setSearch }"> <template #display="{ setSearch }">
<div class="search-input"> <div class="search-input">
<i class="search-input-icon fas fa-search"></i> <search-icon class="search-input-icon" />
<input <input
class="text-input" class="text-input"
v-model="keyword" v-model="keyword"
@@ -24,7 +24,7 @@
</template> </template>
<template #option="{ option }"> <template #option="{ option }">
<div class="search-option-item"> <div class="search-option-item">
<i :class="['result-icon', iconMap[option.type] || 'fas fa-question']"></i> <i :class="['result-icon', iconMap[option.type]]"></i>
<div class="result-body"> <div class="result-body">
<div class="result-main" v-html="highlight(option.text)"></div> <div class="result-main" v-html="highlight(option.text)"></div>
<div v-if="option.subText" class="result-sub" v-html="highlight(option.subText)"></div> <div v-if="option.subText" class="result-sub" v-html="highlight(option.subText)"></div>

View File

@@ -13,7 +13,7 @@
> >
<template #display="{ setSearch }"> <template #display="{ setSearch }">
<div class="search-input"> <div class="search-input">
<i class="search-input-icon fas fa-search"></i> <search-icon class="search-input-icon" />
<input <input
class="text-input" class="text-input"
v-model="keyword" v-model="keyword"

View File

@@ -18,7 +18,7 @@
<div class="activity-list-page-card-content">{{ a.content }}</div> <div class="activity-list-page-card-content">{{ a.content }}</div>
<div class="activity-list-page-card-footer"> <div class="activity-list-page-card-footer">
<div class="activity-list-page-card-footer-start-time"> <div class="activity-list-page-card-footer-start-time">
<i class="fas fa-clock"></i> <stopwatch />
<span>开始于 {{ TimeManager.format(a.startTime) }}</span> <span>开始于 {{ TimeManager.format(a.startTime) }}</span>
</div> </div>
</div> </div>

View File

@@ -21,7 +21,7 @@
<div class="primary-button disabled" v-else>提交中...</div> <div class="primary-button disabled" v-else>提交中...</div>
</div> </div>
<div class="hint-message"> <div class="hint-message">
<i class="fas fa-info-circle"></i> <info-icon />
使用 Google 注册的用户可使用对应的邮箱进行找回密码 使用 Google 注册的用户可使用对应的邮箱进行找回密码
</div> </div>
</div> </div>

View File

@@ -16,7 +16,7 @@
<div v-else class="login-page-button-primary disabled"> <div v-else class="login-page-button-primary disabled">
<div class="login-page-button-text"> <div class="login-page-button-text">
<i class="fas fa-spinner fa-spin"></i> <loading-four />
登录中... 登录中...
</div> </div>
</div> </div>
@@ -28,7 +28,7 @@
> >
</div> </div>
<div class="hint-message"> <div class="hint-message">
<i class="fas fa-info-circle"></i> <info-icon />
使用右侧第三方OAuth注册/登录的用户可使用对应的邮箱进行重设密码 使用右侧第三方OAuth注册/登录的用户可使用对应的邮箱进行重设密码
</div> </div>
</div> </div>

View File

@@ -3,14 +3,14 @@
<div v-if="!loading" class="chat-header"> <div v-if="!loading" class="chat-header">
<div class="header-main"> <div class="header-main">
<div class="back-button" @click="goBack"> <div class="back-button" @click="goBack">
<i class="fas fa-arrow-left"></i> <arrow-left />
</div> </div>
<h2 class="participant-name"> <h2 class="participant-name">
{{ isChannel ? conversationName : otherParticipant?.username }} {{ isChannel ? conversationName : otherParticipant?.username }}
</h2> </h2>
</div> </div>
<div v-if="!isFloatMode" class="float-control"> <div v-if="!isFloatMode" class="float-control">
<i class="fas fa-compress" @click="minimize" title="最小化"></i> <collapse-text-input class="float-control-icon" @click="minimize" title="最小化" />
</div> </div>
</div> </div>
@@ -48,7 +48,7 @@
:content-id="item.id" :content-id="item.id"
@update:modelValue="(v) => (item.reactions = v)" @update:modelValue="(v) => (item.reactions = v)"
> >
<i class="fas fa-reply reply-btn" @click="setReply(item)"> 写个回复...</i> <div class="reply-btn"><next @click="setReply(item)" /> 写个回复...</div>
</ReactionsGroup> </ReactionsGroup>
</template> </template>
</BaseTimeline> </BaseTimeline>
@@ -66,7 +66,7 @@
<div v-if="replyTo" class="active-reply"> <div v-if="replyTo" class="active-reply">
正在回复 {{ replyTo.sender.username }}: 正在回复 {{ replyTo.sender.username }}:
{{ stripMarkdownLength(replyTo.content, 50) }} {{ stripMarkdownLength(replyTo.content, 50) }}
<i class="fas fa-times close-reply" @click="replyTo = null"></i> <close-icon class="close-reply" @click="replyTo = null" />
</div> </div>
<MessageEditor :loading="sending" @submit="sendMessage" /> <MessageEditor :loading="sending" @submit="sendMessage" />
</div> </div>

View File

@@ -1,11 +1,11 @@
<template> <template>
<div class="messages-container"> <div class="messages-container">
<div class="page-title"> <div class="page-title">
<i class="fas fa-comments"></i> <message-emoji />
<span class="page-title-text">选择聊天</span> <span class="page-title-text">选择聊天</span>
</div> </div>
<div v-if="!isFloatMode" class="float-control"> <div v-if="!isFloatMode" class="float-control">
<i class="fas fa-compress" @click="minimize" title="最小化"></i> <collapse-text-input class="float-control-icon" @click="minimize" title="最小化" />
</div> </div>
<BaseTabs v-model="activeTab" :tabs="tabs"> <BaseTabs v-model="activeTab" :tabs="tabs">
<div v-if="activeTab === 'messages'"> <div v-if="activeTab === 'messages'">

View File

@@ -4,7 +4,7 @@
<template #right> <template #right>
<div class="message-page-header-right"> <div class="message-page-header-right">
<div class="message-page-header-right-item" @click="markAllRead"> <div class="message-page-header-right-item" @click="markAllRead">
<i class="fas fa-bolt message-page-header-right-item-button-icon"></i> <check-correct class="message-page-header-right-item-button-icon" />
<span class="message-page-header-right-item-button-text"> 已读所有消息 </span> <span class="message-page-header-right-item-button-text"> 已读所有消息 </span>
</div> </div>
</div> </div>

View File

@@ -13,13 +13,13 @@
<PostTypeSelect v-model="postType" /> <PostTypeSelect v-model="postType" />
</div> </div>
<div class="post-options-right"> <div class="post-options-right">
<div class="post-clear" @click="clearPost"><i class="fa-solid fa-eraser"></i> 清空</div> <div class="post-clear" @click="clearPost"><clear-icon /> 清空</div>
<div class="ai-generate" @click="aiGenerate"> <div class="ai-generate" @click="aiGenerate">
<i class="fa-solid fa-robot"></i> <smart-optimization />
MD 格式优化 MD 格式优化
</div> </div>
<div class="post-draft" @click="saveDraft"> <div class="post-draft" @click="saveDraft">
<i class="fa-solid fa-floppy-disk"></i> <save-icon />
存草稿 存草稿
</div> </div>
<div <div
@@ -30,9 +30,7 @@
> >
发布 发布
</div> </div>
<div v-else class="post-submit-loading"> <div v-else class="post-submit-loading"><loading-four /> 发布中...</div>
<i class="fa-solid fa-spinner fa-spin"></i> 发布中...
</div>
</div> </div>
</div> </div>
<LotteryForm v-if="postType === 'LOTTERY'" :data="lottery" /> <LotteryForm v-if="postType === 'LOTTERY'" :data="lottery" />

View File

@@ -25,7 +25,7 @@
<div class="point-info"> <div class="point-info">
<p v-if="authState.loggedIn && point !== null"> <p v-if="authState.loggedIn && point !== null">
<span><i class="fas fa-coins coin-icon"></i></span>我的积分<span <span><paper-money-two class="coin-icon" /></span>我的积分<span
class="point-value" class="point-value"
>{{ point }}</span >{{ point }}</span
> >
@@ -37,7 +37,7 @@
<BaseImage class="goods-item-image" :src="good.image" alt="good.name" /> <BaseImage class="goods-item-image" :src="good.image" alt="good.name" />
<div class="goods-item-name">{{ good.name }}</div> <div class="goods-item-name">{{ good.name }}</div>
<div class="goods-item-cost"> <div class="goods-item-cost">
<i class="fas fa-coins"></i> <paper-money-two />
{{ good.cost }} 积分 {{ good.cost }} 积分
</div> </div>
<div <div
@@ -185,7 +185,7 @@
参与获得 {{ item.amount }} 积分 参与获得 {{ item.amount }} 积分
</template> </template>
<template v-else-if="item.type === 'SYSTEM_ONLINE'"> 积分历史系统上线 </template> <template v-else-if="item.type === 'SYSTEM_ONLINE'"> 积分历史系统上线 </template>
<i class="fas fa-coins"></i> 你目前的积分是 {{ item.balance }} <paper-money-two /> 你目前的积分是 {{ item.balance }}
</div> </div>
<div class="history-time">{{ TimeManager.format(item.createdAt) }}</div> <div class="history-time">{{ TimeManager.format(item.createdAt) }}</div>
</template> </template>

View File

@@ -12,9 +12,9 @@
<TagSelect v-model="selectedTags" creatable /> <TagSelect v-model="selectedTags" creatable />
</div> </div>
<div class="post-options-right"> <div class="post-options-right">
<div class="post-clear" @click="clearPost"><i class="fa-solid fa-eraser"></i> 清空</div> <div class="post-clear" @click="clearPost"><clear-icon /> 清空</div>
<div class="ai-generate" @click="aiGenerate"> <div class="ai-generate" @click="aiGenerate">
<i class="fa-solid fa-robot"></i> <smart-optimization />
MD 格式优化 MD 格式优化
</div> </div>
<div class="post-cancel" @click="cancelEdit">取消</div> <div class="post-cancel" @click="cancelEdit">取消</div>
@@ -26,9 +26,7 @@
> >
更新 更新
</div> </div>
<div v-else class="post-submit-loading"> <div v-else class="post-submit-loading"><loading-four /> 更新中...</div>
<i class="fa-solid fa-spinner fa-spin"></i> 更新中...
</div>
</div> </div>
</div> </div>
</div> </div>

View File

@@ -22,7 +22,7 @@
class="article-subscribe-button" class="article-subscribe-button"
@click="subscribePost" @click="subscribePost"
> >
<i class="fas fa-user-plus"></i> <people-plus />
<div class="article-subscribe-button-text"> <div class="article-subscribe-button-text">
{{ isMobile ? '订阅' : '订阅文章' }} {{ isMobile ? '订阅' : '订阅文章' }}
</div> </div>
@@ -32,14 +32,14 @@
class="article-unsubscribe-button" class="article-unsubscribe-button"
@click="unsubscribePost" @click="unsubscribePost"
> >
<i class="fas fa-user-minus"></i> <people-minus-one />
<div class="article-unsubscribe-button-text"> <div class="article-unsubscribe-button-text">
{{ isMobile ? '退订' : '取消订阅' }} {{ isMobile ? '退订' : '取消订阅' }}
</div> </div>
</div> </div>
<DropdownMenu v-if="articleMenuItems.length > 0" :items="articleMenuItems"> <DropdownMenu v-if="articleMenuItems.length > 0" :items="articleMenuItems">
<template #trigger> <template #trigger>
<i class="fas fa-ellipsis-vertical action-menu-icon"></i> <more-one class="action-menu-icon" />
</template> </template>
</DropdownMenu> </DropdownMenu>
</div> </div>
@@ -53,7 +53,7 @@
<div v-if="isMobile" class="info-content-header"> <div v-if="isMobile" class="info-content-header">
<div class="user-name"> <div class="user-name">
{{ author.username }} {{ author.username }}
<i class="fas fa-medal medal-icon"></i> <medal-one class="medal-icon" />
<NuxtLink <NuxtLink
v-if="author.displayMedal" v-if="author.displayMedal"
class="user-medal" class="user-medal"
@@ -69,7 +69,7 @@
<div v-if="!isMobile" class="info-content-header"> <div v-if="!isMobile" class="info-content-header">
<div class="user-name"> <div class="user-name">
{{ author.username }} {{ author.username }}
<i class="fas fa-medal medal-icon"></i> <medal-one class="medal-icon" />
<NuxtLink <NuxtLink
v-if="author.displayMedal" v-if="author.displayMedal"
class="user-medal" class="user-medal"
@@ -88,7 +88,7 @@
<div class="article-footer-container"> <div class="article-footer-container">
<ReactionsGroup v-model="postReactions" content-type="post" :content-id="postId"> <ReactionsGroup v-model="postReactions" content-type="post" :content-id="postId">
<div class="make-reaction-item copy-link" @click="copyPostLink"> <div class="make-reaction-item copy-link" @click="copyPostLink">
<i class="fas fa-link"></i> <link-icon />
</div> </div>
</ReactionsGroup> </ReactionsGroup>
</div> </div>
@@ -707,8 +707,8 @@ const unsubscribePost = async () => {
const fetchCommentSorts = () => { const fetchCommentSorts = () => {
return Promise.resolve([ return Promise.resolve([
{ id: 'NEWEST', name: '最新', icon: 'fas fa-clock' }, { id: 'NEWEST', name: '最新', icon: 'lightning' },
{ id: 'OLDEST', name: '最旧', icon: 'fas fa-hourglass-start' }, { id: 'OLDEST', name: '最旧', icon: 'history-icon' },
// { id: 'MOST_INTERACTIONS', name: '最多互动', icon: 'fas fa-fire' } // { id: 'MOST_INTERACTIONS', name: '最多互动', icon: 'fas fa-fire' }
]) ])
} }

View File

@@ -7,7 +7,7 @@
@crop="onCropped" @crop="onCropped"
/> />
<div v-if="isLoadingPage" class="loading-page"> <div v-if="isLoadingPage" class="loading-page">
<l-hatch size="20" stroke="4" speed="3.5" color="var(--primary-color)"></l-hatch> <l-hatch size="28" stroke="4" speed="3.5" color="var(--primary-color)"></l-hatch>
</div> </div>
<div v-else> <div v-else>
<div class="settings-title">个人资料设置</div> <div class="settings-title">个人资料设置</div>
@@ -133,15 +133,15 @@ const onCropped = ({ file, url }) => {
} }
const fetchPublishModes = () => { const fetchPublishModes = () => {
return Promise.resolve([ return Promise.resolve([
{ id: 'DIRECT', name: '直接发布', icon: 'fas fa-bolt' }, { id: 'DIRECT', name: '直接发布', icon: 'send-icon' },
{ id: 'REVIEW', name: '审核后发布', icon: 'fas fa-search' }, { id: 'REVIEW', name: '审核后发布', icon: 'search-icon' },
]) ])
} }
const fetchPasswordStrengths = () => { const fetchPasswordStrengths = () => {
return Promise.resolve([ return Promise.resolve([
{ id: 'LOW', name: '低', icon: 'fas fa-lock-open' }, { id: 'LOW', name: '低', icon: 'unlock' },
{ id: 'MEDIUM', name: '中', icon: 'fas fa-lock' }, { id: 'MEDIUM', name: '中', icon: 'lock-one' },
{ id: 'HIGH', name: '高', icon: 'fas fa-user-shield' }, { id: 'HIGH', name: '高', icon: 'lock' },
]) ])
} }
const fetchAiLimits = () => { const fetchAiLimits = () => {
@@ -154,8 +154,8 @@ const fetchAiLimits = () => {
} }
const fetchRegisterModes = () => { const fetchRegisterModes = () => {
return Promise.resolve([ return Promise.resolve([
{ id: 'DIRECT', name: '直接注册', icon: 'fas fa-user-check' }, { id: 'DIRECT', name: '直接注册', icon: 'send-icon' },
{ id: 'WHITELIST', name: '白名单邀请制', icon: 'fas fa-envelope' }, { id: 'WHITELIST', name: '白名单邀请制', icon: 'search-icon' },
]) ])
} }
const loadAdminConfig = async () => { const loadAdminConfig = async () => {

View File

@@ -35,7 +35,7 @@
</div> </div>
<div v-else class="signup-page-button-primary disabled"> <div v-else class="signup-page-button-primary disabled">
<div class="signup-page-button-text"> <div class="signup-page-button-text">
<i class="fas fa-spinner fa-spin"></i> <loading-four />
发送中... 发送中...
</div> </div>
</div> </div>
@@ -56,7 +56,7 @@
</div> </div>
<div v-else class="signup-page-button-primary disabled"> <div v-else class="signup-page-button-primary disabled">
<div class="signup-page-button-text"> <div class="signup-page-button-text">
<i class="fas fa-spinner fa-spin"></i> <loading-four />
验证中... 验证中...
</div> </div>
</div> </div>

View File

@@ -45,7 +45,7 @@
content="经验值可通过发帖、评论等操作获得,达到目标后即可提升等级,解锁更多功能。" content="经验值可通过发帖、评论等操作获得,达到目标后即可提升等级,解锁更多功能。"
placement="bottom" placement="bottom"
> >
<info class="profile-exp-info" /> <info-icon class="profile-exp-info" />
</ToolTip> </ToolTip>
</div> </div>
</div> </div>

View File

@@ -41,6 +41,27 @@ import {
Mail, Mail,
Lock, Lock,
User, User,
Send,
Unlock,
LockOne,
ImageFiles,
ExpandUp,
Close,
ArrowLeft,
CollapseTextInput,
Stopwatch,
PaperMoneyTwo,
Check,
ChartHistogram,
CheckCorrect,
PeoplePlus,
PeopleMinusOne,
SmartOptimization,
Save,
Clear,
FileText,
History,
Lightning,
} from '@icon-park/vue-next' } from '@icon-park/vue-next'
export default defineNuxtPlugin((nuxtApp) => { export default defineNuxtPlugin((nuxtApp) => {
@@ -52,7 +73,7 @@ export default defineNuxtPlugin((nuxtApp) => {
nuxtApp.vueApp.component('Edit', Edit) nuxtApp.vueApp.component('Edit', Edit)
nuxtApp.vueApp.component('HashtagKey', HashtagKey) nuxtApp.vueApp.component('HashtagKey', HashtagKey)
nuxtApp.vueApp.component('Remind', Remind) nuxtApp.vueApp.component('Remind', Remind)
nuxtApp.vueApp.component('Info', Info) nuxtApp.vueApp.component('InfoIcon', Info)
nuxtApp.vueApp.component('ChartLine', ChartLine) nuxtApp.vueApp.component('ChartLine', ChartLine)
nuxtApp.vueApp.component('Finance', Finance) nuxtApp.vueApp.component('Finance', Finance)
nuxtApp.vueApp.component('Up', Up) nuxtApp.vueApp.component('Up', Up)
@@ -85,4 +106,25 @@ export default defineNuxtPlugin((nuxtApp) => {
nuxtApp.vueApp.component('UserIcon', User) nuxtApp.vueApp.component('UserIcon', User)
nuxtApp.vueApp.component('Mail', Mail) nuxtApp.vueApp.component('Mail', Mail)
nuxtApp.vueApp.component('Lock', Lock) nuxtApp.vueApp.component('Lock', Lock)
nuxtApp.vueApp.component('SendIcon', Send)
nuxtApp.vueApp.component('Unlock', Unlock)
nuxtApp.vueApp.component('LockOne', LockOne)
nuxtApp.vueApp.component('ImageFiles', ImageFiles)
nuxtApp.vueApp.component('ExpandUp', ExpandUp)
nuxtApp.vueApp.component('CloseIcon', Close)
nuxtApp.vueApp.component('ArrowLeft', ArrowLeft)
nuxtApp.vueApp.component('CollapseTextInput', CollapseTextInput)
nuxtApp.vueApp.component('Stopwatch', Stopwatch)
nuxtApp.vueApp.component('PaperMoneyTwo', PaperMoneyTwo)
nuxtApp.vueApp.component('Check', Check)
nuxtApp.vueApp.component('ChartHistogram', ChartHistogram)
nuxtApp.vueApp.component('CheckCorrect', CheckCorrect)
nuxtApp.vueApp.component('PeoplePlus', PeoplePlus)
nuxtApp.vueApp.component('PeopleMinusOne', PeopleMinusOne)
nuxtApp.vueApp.component('SmartOptimization', SmartOptimization)
nuxtApp.vueApp.component('SaveIcon', Save)
nuxtApp.vueApp.component('ClearIcon', Clear)
nuxtApp.vueApp.component('FileText', FileText)
nuxtApp.vueApp.component('HistoryIcon', History)
nuxtApp.vueApp.component('Lightning', Lightning)
}) })