Compare commits

..

1 Commits

Author SHA1 Message Date
Tim
35c6d29b8f feat: allow redis db override 2025-09-05 11:31:44 +08:00
12 changed files with 58 additions and 155 deletions

View File

@@ -12,7 +12,7 @@ spring.jpa.hibernate.ddl-auto=update
# for redis # for redis
spring.data.redis.host=${REDIS_HOST:localhost} spring.data.redis.host=${REDIS_HOST:localhost}
spring.data.redis.port=${REDIS_PORT:6379} spring.data.redis.port=${REDIS_PORT:6379}
spring.data.redis.database=0 spring.data.redis.database=${REDIS_DATABASE:0}
# for jwt # for jwt
app.jwt.secret=${JWT_SECRET:jwt_sec} app.jwt.secret=${JWT_SECRET:jwt_sec}

View File

@@ -25,7 +25,7 @@
class="app-new-post-icon" class="app-new-post-icon"
@click="goToNewPost" @click="goToNewPost"
> >
<edit /> <i class="fas fa-edit"></i>
</div> </div>
</div> </div>
<GlobalPopups /> <GlobalPopups />

View File

@@ -15,23 +15,19 @@
<div class="common-info-content-header"> <div class="common-info-content-header">
<div class="info-content-header-left"> <div class="info-content-header-left">
<span class="user-name">{{ comment.userName }}</span> <span class="user-name">{{ comment.userName }}</span>
<medal-one class="medal-icon" /> <i class="fas fa-medal medal-icon"></i>
<NuxtLink <NuxtLink
v-if="comment.medal" v-if="comment.medal"
class="medal-name" class="medal-name"
:to="`/users/${comment.userId}?tab=achievements`" :to="`/users/${comment.userId}?tab=achievements`"
>{{ getMedalTitle(comment.medal) }}</NuxtLink >{{ getMedalTitle(comment.medal) }}</NuxtLink
> >
<pin v-if="comment.pinned" class="pin-icon" /> <i v-if="comment.pinned" class="fas fa-thumbtack pin-icon"></i>
<span v-if="level >= 2" class="reply-item"> <span v-if="level >= 2" class="reply-item">
<next class="reply-icon" /> <i class="fas fa-reply reply-icon"></i>
<span class="reply-info"> <span class="reply-info">
<BaseImage <BaseImage class="reply-avatar" :src="comment.parentUserAvatar || '/default-avatar.svg'" alt="avatar"
class="reply-avatar" @click="comment.parentUserClick && comment.parentUserClick()" />
:src="comment.parentUserAvatar || '/default-avatar.svg'"
alt="avatar"
@click="comment.parentUserClick && comment.parentUserClick()"
/>
<span class="reply-user-name">{{ comment.parentUserName }}</span> <span class="reply-user-name">{{ comment.parentUserName }}</span>
</span> </span>
</span> </span>
@@ -40,7 +36,7 @@
<div class="info-content-header-right"> <div class="info-content-header-right">
<DropdownMenu v-if="commentMenuItems.length > 0" :items="commentMenuItems"> <DropdownMenu v-if="commentMenuItems.length > 0" :items="commentMenuItems">
<template #trigger> <template #trigger>
<more-one class="action-menu-icon" /> <i class="fas fa-ellipsis-vertical action-menu-icon"></i>
</template> </template>
</DropdownMenu> </DropdownMenu>
</div> </div>
@@ -53,10 +49,10 @@
<div class="article-footer-container"> <div class="article-footer-container">
<ReactionsGroup v-model="comment.reactions" content-type="comment" :content-id="comment.id"> <ReactionsGroup v-model="comment.reactions" content-type="comment" :content-id="comment.id">
<div class="make-reaction-item comment-reaction" @click="toggleEditor"> <div class="make-reaction-item comment-reaction" @click="toggleEditor">
<comment-icon /> <i class="far fa-comment"></i>
</div> </div>
<div class="make-reaction-item copy-link" @click="copyCommentLink"> <div class="make-reaction-item copy-link" @click="copyCommentLink">
<link-icon /> <i class="fas fa-link"></i>
</div> </div>
</ReactionsGroup> </ReactionsGroup>
</div> </div>
@@ -385,8 +381,7 @@ const handleContentClick = (e) => {
justify-content: space-between; justify-content: space-between;
} }
.reply-item, .reply-item, .reply-info {
.reply-info {
display: inline-flex; display: inline-flex;
flex-direction: row; flex-direction: row;
align-items: center; align-items: center;
@@ -402,16 +397,13 @@ const handleContentClick = (e) => {
.reply-icon { .reply-icon {
color: var(--primary-color); color: var(--primary-color);
margin-left: 10px;
margin-right: 10px; margin-right: 10px;
margin-left: 10px;
opacity: 0.5; opacity: 0.5;
transform: scaleX(-1);
} }
.reply-user-name { .reply-user-name {
opacity: 0.3; opacity: 0.3;
display: none;
font-weight: bold;
} }
.medal-name { .medal-name {

View File

@@ -4,7 +4,7 @@
<div class="header-content-left"> <div class="header-content-left">
<div v-if="showMenuBtn" class="menu-btn-wrapper"> <div v-if="showMenuBtn" class="menu-btn-wrapper">
<button class="menu-btn" ref="menuBtn" @click="$emit('toggle-menu')"> <button class="menu-btn" ref="menuBtn" @click="$emit('toggle-menu')">
<application-menu class="micon"></application-menu> <i class="fas fa-bars micon"></i>
</button> </button>
<span <span
v-if="isMobile && (unreadMessageCount > 0 || hasChannelUnread)" v-if="isMobile && (unreadMessageCount > 0 || hasChannelUnread)"
@@ -25,34 +25,34 @@
<ClientOnly> <ClientOnly>
<div class="header-content-right"> <div class="header-content-right">
<div v-if="isMobile" class="search-icon" @click="search"> <div v-if="isMobile" class="search-icon" @click="search">
<search-icon /> <i class="fas fa-search"></i>
</div> </div>
<div v-if="isMobile" class="theme-icon" @click="cycleTheme"> <div v-if="isMobile" class="theme-icon" @click="cycleTheme">
<component :is="iconClass" /> <i :class="iconClass"></i>
</div> </div>
<div v-if="!isMobile" class="invite_text" @click="copyInviteLink"> <div v-if="!isMobile" class="invite_text" @click="copyInviteLink">
<copy /> <i class="fas fa-copy"></i>
邀请 邀请
<loading v-if="isCopying" /> <i v-if="isCopying" class="fas fa-spinner fa-spin"></i>
</div> </div>
<ToolTip content="复制RSS链接" placement="bottom"> <ToolTip content="复制RSS链接" placement="bottom">
<div class="rss-icon" @click="copyRssLink"> <div class="rss-icon" @click="copyRssLink">
<rss /> <i class="fas fa-rss"></i>
</div> </div>
</ToolTip> </ToolTip>
<ToolTip v-if="!isMobile && isLogin" content="发帖" placement="bottom"> <ToolTip v-if="!isMobile && isLogin" content="发帖" placement="bottom">
<div class="new-post-icon" @click="goToNewPost"> <div class="new-post-icon" @click="goToNewPost">
<edit /> <i class="fas fa-edit"></i>
</div> </div>
</ToolTip> </ToolTip>
<ToolTip v-if="isLogin" content="站内信和频道" placement="bottom"> <ToolTip v-if="isLogin" content="站内信和频道" placement="bottom">
<div class="messages-icon" @click="goToMessages"> <div class="messages-icon" @click="goToMessages">
<message-emoji /> <i class="fas fa-comments"></i>
<span v-if="unreadMessageCount > 0" class="unread-badge">{{ <span v-if="unreadMessageCount > 0" class="unread-badge">{{
unreadMessageCount unreadMessageCount
}}</span> }}</span>
@@ -64,7 +64,7 @@
<template #trigger> <template #trigger>
<div class="avatar-container"> <div class="avatar-container">
<img class="avatar-img" :src="avatar" alt="avatar" /> <img class="avatar-img" :src="avatar" alt="avatar" />
<down /> <i class="fas fa-caret-down dropdown-icon"></i>
</div> </div>
</template> </template>
</DropdownMenu> </DropdownMenu>
@@ -226,11 +226,11 @@ const headerMenuItems = computed(() => [
const iconClass = computed(() => { const iconClass = computed(() => {
switch (themeState.mode) { switch (themeState.mode) {
case ThemeMode.DARK: case ThemeMode.DARK:
return 'Moon' return 'fas fa-moon'
case ThemeMode.LIGHT: case ThemeMode.LIGHT:
return 'SunOne' return 'fas fa-sun'
default: default:
return 'ComputerOne' return 'fas fa-desktop'
} }
}) })

View File

@@ -4,7 +4,7 @@
<div class="menu-content"> <div class="menu-content">
<div class="menu-item-container"> <div class="menu-item-container">
<NuxtLink class="menu-item" exact-active-class="selected" to="/" @click="handleItemClick"> <NuxtLink class="menu-item" exact-active-class="selected" to="/" @click="handleItemClick">
<hashtag-key class="menu-item-icon" /> <i class="menu-item-icon fas fa-hashtag"></i>
<span class="menu-item-text">话题</span> <span class="menu-item-text">话题</span>
</NuxtLink> </NuxtLink>
<NuxtLink <NuxtLink
@@ -13,7 +13,7 @@
to="/new-post" to="/new-post"
@click="handleItemClick" @click="handleItemClick"
> >
<edit class="menu-item-icon" /> <i class="menu-item-icon fas fa-edit"></i>
<span class="menu-item-text">发帖</span> <span class="menu-item-text">发帖</span>
</NuxtLink> </NuxtLink>
<NuxtLink <NuxtLink
@@ -22,7 +22,7 @@
to="/message" to="/message"
@click="handleItemClick" @click="handleItemClick"
> >
<remind class="menu-item-icon" /> <i class="menu-item-icon fas fa-envelope"></i>
<span class="menu-item-text">我的消息</span> <span class="menu-item-text">我的消息</span>
<span v-if="unreadCount > 0" class="unread-container"> <span v-if="unreadCount > 0" class="unread-container">
<span class="unread"> {{ showUnreadCount }} </span> <span class="unread"> {{ showUnreadCount }} </span>
@@ -34,7 +34,7 @@
to="/about" to="/about"
@click="handleItemClick" @click="handleItemClick"
> >
<info class="menu-item-icon" /> <i class="menu-item-icon fas fa-info-circle"></i>
<span class="menu-item-text">关于</span> <span class="menu-item-text">关于</span>
</NuxtLink> </NuxtLink>
<NuxtLink <NuxtLink
@@ -43,7 +43,7 @@
to="/activities" to="/activities"
@click="handleItemClick" @click="handleItemClick"
> >
<gift class="menu-item-icon" /> <i class="menu-item-icon fas fa-gift"></i>
<span class="menu-item-text">🔥 活动</span> <span class="menu-item-text">🔥 活动</span>
</NuxtLink> </NuxtLink>
<NuxtLink <NuxtLink
@@ -53,7 +53,7 @@
to="/about/stats" to="/about/stats"
@click="handleItemClick" @click="handleItemClick"
> >
<chart-line class="menu-item-icon" /> <i class="menu-item-icon fas fa-chart-line"></i>
<span class="menu-item-text">站点统计</span> <span class="menu-item-text">站点统计</span>
</NuxtLink> </NuxtLink>
<NuxtLink <NuxtLink
@@ -63,7 +63,7 @@
to="/points" to="/points"
@click="handleItemClick" @click="handleItemClick"
> >
<finance class="menu-item-icon" /> <i class="menu-item-icon fas fa-coins"></i>
<span class="menu-item-text"> <span class="menu-item-text">
积分商城 积分商城
<span v-if="myPoint !== null" class="point-count">{{ myPoint }}</span> <span v-if="myPoint !== null" class="point-count">{{ myPoint }}</span>
@@ -74,8 +74,7 @@
<div class="menu-section"> <div class="menu-section">
<div class="section-header" @click="categoryOpen = !categoryOpen"> <div class="section-header" @click="categoryOpen = !categoryOpen">
<span>类别</span> <span>类别</span>
<up v-if="categoryOpen" class="menu-item-icon" /> <i :class="categoryOpen ? 'fas fa-chevron-up' : 'fas fa-chevron-down'"></i>
<down v-else class="menu-item-icon" />
</div> </div>
<div v-if="categoryOpen" class="section-items"> <div v-if="categoryOpen" class="section-items">
<div v-if="isLoadingCategory" class="menu-loading-container"> <div v-if="isLoadingCategory" class="menu-loading-container">
@@ -95,7 +94,7 @@
class="section-item-icon" class="section-item-icon"
:alt="c.name" :alt="c.name"
/> />
<component v-else :is="c.smallIcon || c.icon" class="section-item-icon" /> <i v-else :class="['section-item-icon', c.smallIcon || c.icon]"></i>
</template> </template>
<span class="section-item-text"> <span class="section-item-text">
{{ c.name }} {{ c.name }}
@@ -108,8 +107,7 @@
<div class="menu-section"> <div class="menu-section">
<div class="section-header" @click="tagOpen = !tagOpen"> <div class="section-header" @click="tagOpen = !tagOpen">
<span>标签</span> <span>标签</span>
<up v-if="tagOpen" class="menu-item-icon" /> <i :class="tagOpen ? 'fas fa-chevron-up' : 'fas fa-chevron-down'"></i>
<down v-else class="menu-item-icon" />
</div> </div>
<div v-if="tagOpen" class="section-items"> <div v-if="tagOpen" class="section-items">
<div v-if="isLoadingTag" class="menu-loading-container"> <div v-if="isLoadingTag" class="menu-loading-container">
@@ -122,7 +120,7 @@
class="section-item-icon" class="section-item-icon"
:alt="t.name" :alt="t.name"
/> />
<tag-one v-else class="section-item-icon" /> <i v-else class="section-item-icon fas fa-hashtag"></i>
<span class="section-item-text" <span class="section-item-text"
>{{ t.name }} <span class="section-item-text-count">x {{ t.count }}</span></span >{{ t.name }} <span class="section-item-text-count">x {{ t.count }}</span></span
> >
@@ -135,7 +133,7 @@
<ClientOnly v-if="!isMobile"> <ClientOnly v-if="!isMobile">
<div class="menu-footer"> <div class="menu-footer">
<div class="menu-footer-btn" @click="cycleTheme"> <div class="menu-footer-btn" @click="cycleTheme">
<component :is="iconClass" class="menu-item-icon" /> <i :class="iconClass"></i>
</div> </div>
</div> </div>
</ClientOnly> </ClientOnly>
@@ -195,11 +193,11 @@ const {
const iconClass = computed(() => { const iconClass = computed(() => {
switch (themeState.mode) { switch (themeState.mode) {
case ThemeMode.DARK: case ThemeMode.DARK:
return 'Moon' return 'fas fa-moon'
case ThemeMode.LIGHT: case ThemeMode.LIGHT:
return 'SunOne' return 'fas fa-sun'
default: default:
return 'ComputerOne' return 'fas fa-desktop'
} }
}) })

View File

@@ -16,8 +16,8 @@
<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> <i class="fas fa-stopwatch prize-end-time-icon"></i>
<div v-if="!isMobile && !lotteryEnded" class="prize-end-time-title">离结束</div> <div v-if="!isMobile" 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">
<div <div
@@ -193,7 +193,6 @@ const joinLottery = async () => {
.prize-end-time-icon { .prize-end-time-icon {
font-size: 13px; font-size: 13px;
margin-right: 5px;
} }
.prize-end-time-title { .prize-end-time-title {

View File

@@ -19,7 +19,8 @@
</div> </div>
<div class="reactions-viewer-item placeholder" @click="openPanel"> <div class="reactions-viewer-item placeholder" @click="openPanel">
<sly-face-whit-smile class="reactions-viewer-item-placeholder-icon" /> <i class="far fa-smile reactions-viewer-item-placeholder-icon"></i>
<!-- <span class="reactions-viewer-item-placeholder-text">点击以表态</span> -->
</div> </div>
</template> </template>
<template v-else-if="displayedReactions.length"> <template v-else-if="displayedReactions.length">
@@ -41,7 +42,7 @@
class="make-reaction-item like-reaction" class="make-reaction-item like-reaction"
@click="toggleReaction('LIKE')" @click="toggleReaction('LIKE')"
> >
<like v-if="!userReacted('LIKE')" /> <i v-if="!userReacted('LIKE')" class="far fa-heart"></i>
<i v-else class="fas fa-heart"></i> <i v-else class="fas fa-heart"></i>
<span class="reactions-count" v-if="likeCount">{{ likeCount }}</span> <span class="reactions-count" v-if="likeCount">{{ likeCount }}</span>
</div> </div>

View File

@@ -15,12 +15,7 @@ export default defineNuxtConfig({
telegramBotId: process.env.NUXT_PUBLIC_TELEGRAM_BOT_ID || '', telegramBotId: process.env.NUXT_PUBLIC_TELEGRAM_BOT_ID || '',
}, },
}, },
css: [ css: ['vditor/dist/index.css', '~/assets/fonts.css', '~/assets/global.css'],
'vditor/dist/index.css',
'~/assets/fonts.css',
'~/assets/global.css',
'@icon-park/vue-next/styles/index.css',
],
app: { app: {
pageTransition: { name: 'page', mode: 'out-in' }, pageTransition: { name: 'page', mode: 'out-in' },
head: { head: {
@@ -77,11 +72,11 @@ export default defineNuxtConfig({
rel: 'manifest', rel: 'manifest',
href: '/manifest.webmanifest', href: '/manifest.webmanifest',
}, },
// { {
// rel: 'stylesheet', rel: 'stylesheet',
// href: 'https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.2/css/all.min.css', href: 'https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.2/css/all.min.css',
// referrerpolicy: 'no-referrer', referrerpolicy: 'no-referrer',
// }, },
], ],
}, },
baseURL: '/', baseURL: '/',

View File

@@ -6,7 +6,6 @@
"": { "": {
"name": "frontend_nuxt", "name": "frontend_nuxt",
"dependencies": { "dependencies": {
"@icon-park/vue-next": "^1.4.2",
"@nuxt/image": "^1.11.0", "@nuxt/image": "^1.11.0",
"@stomp/stompjs": "^7.0.0", "@stomp/stompjs": "^7.0.0",
"cropperjs": "^1.6.2", "cropperjs": "^1.6.2",
@@ -26,9 +25,6 @@
"vue-echarts": "^7.0.3", "vue-echarts": "^7.0.3",
"vue-flatpickr-component": "^12.0.0", "vue-flatpickr-component": "^12.0.0",
"vue-toastification": "^2.0.0-rc.5" "vue-toastification": "^2.0.0-rc.5"
},
"engines": {
"node": ">=20.0.0"
} }
}, },
"node_modules/@ampproject/remapping": { "node_modules/@ampproject/remapping": {
@@ -994,19 +990,6 @@
"integrity": "sha512-m9FVDXU3GT2ITSe0UaMA5rU3QkfC/UXtCU8y0gSN/GugTqtVldOBWIB5V6V3sbmenVZUIpU6f+mPEO2+m5iTaA==", "integrity": "sha512-m9FVDXU3GT2ITSe0UaMA5rU3QkfC/UXtCU8y0gSN/GugTqtVldOBWIB5V6V3sbmenVZUIpU6f+mPEO2+m5iTaA==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/@icon-park/vue-next": {
"version": "1.4.2",
"resolved": "https://registry.npmjs.org/@icon-park/vue-next/-/vue-next-1.4.2.tgz",
"integrity": "sha512-+QklF255wkfBOabY+xw6FAI0Bwln/RhdwCunNy/9sKdKuChtaU67QZqU67KGAvZUTeeBgsL+yaHHxqfQeGZXEQ==",
"license": "Apache-2.0",
"engines": {
"node": ">= 8.0.0",
"npm": ">= 5.0.0"
},
"peerDependencies": {
"vue": "3.x"
}
},
"node_modules/@img/sharp-darwin-arm64": { "node_modules/@img/sharp-darwin-arm64": {
"version": "0.34.3", "version": "0.34.3",
"resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.3.tgz", "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.3.tgz",

View File

@@ -12,7 +12,6 @@
"generate": "nuxt generate" "generate": "nuxt generate"
}, },
"dependencies": { "dependencies": {
"@icon-park/vue-next": "^1.4.2",
"@nuxt/image": "^1.11.0", "@nuxt/image": "^1.11.0",
"@stomp/stompjs": "^7.0.0", "@stomp/stompjs": "^7.0.0",
"cropperjs": "^1.6.2", "cropperjs": "^1.6.2",

View File

@@ -68,10 +68,13 @@
> >
<div class="article-main-container"> <div class="article-main-container">
<NuxtLink class="article-item-title main-item" :to="`/posts/${article.id}`"> <NuxtLink class="article-item-title main-item" :to="`/posts/${article.id}`">
<pin v-if="article.pinned" theme="outline" class="pinned-icon" /> <i v-if="article.pinned" class="fas fa-thumbtack pinned-icon"></i>
<gift v-if="article.type === 'LOTTERY'" class="lottery-icon" /> <i v-if="article.type === 'LOTTERY'" class="fa-solid fa-gift lottery-icon"></i>
<ranking-list v-else-if="article.type === 'POLL'" class="poll-icon" /> <i
<star v-if="!article.rssExcluded" class="featured-icon" /> v-else-if="article.type === 'POLL'"
class="fa-solid fa-square-poll-vertical poll-icon"
></i>
<i v-if="!article.rssExcluded" class="fa-solid fa-star featured-icon"></i>
{{ article.title }} {{ article.title }}
</NuxtLink> </NuxtLink>
<NuxtLink class="article-item-description main-item" :to="`/posts/${article.id}`"> <NuxtLink class="article-item-description main-item" :to="`/posts/${article.id}`">
@@ -138,6 +141,7 @@ import { getToken } from '~/utils/auth'
import { stripMarkdown } from '~/utils/markdown' import { stripMarkdown } from '~/utils/markdown'
import { useIsMobile } from '~/utils/screen' import { useIsMobile } from '~/utils/screen'
import TimeManager from '~/utils/time' import TimeManager from '~/utils/time'
useHead({ useHead({
title: 'OpenIsle - 全面开源的自由社区', title: 'OpenIsle - 全面开源的自由社区',
meta: [ meta: [

View File

@@ -1,68 +0,0 @@
import { defineNuxtPlugin } from 'nuxt/app'
import {
Pin,
Fireworks,
Gift,
RankingList,
Star,
Edit,
HashtagKey,
Remind,
Info,
ChartLine,
Finance,
Up,
Down,
TagOne,
MedalOne,
Next,
DropDownList,
MoreOne,
SunOne,
Moon,
ComputerOne,
Comment,
Link,
SlyFaceWhitSmile,
Like,
ApplicationMenu,
Search,
Copy,
Loading,
Rss,
MessageEmoji,
} from '@icon-park/vue-next'
export default defineNuxtPlugin((nuxtApp) => {
nuxtApp.vueApp.component('Pin', Pin)
nuxtApp.vueApp.component('Fireworks', Fireworks)
nuxtApp.vueApp.component('Gift', Gift)
nuxtApp.vueApp.component('RankingList', RankingList)
nuxtApp.vueApp.component('Star', Star)
nuxtApp.vueApp.component('Edit', Edit)
nuxtApp.vueApp.component('HashtagKey', HashtagKey)
nuxtApp.vueApp.component('Remind', Remind)
nuxtApp.vueApp.component('Info', Info)
nuxtApp.vueApp.component('ChartLine', ChartLine)
nuxtApp.vueApp.component('Finance', Finance)
nuxtApp.vueApp.component('Up', Up)
nuxtApp.vueApp.component('Down', Down)
nuxtApp.vueApp.component('TagOne', TagOne)
nuxtApp.vueApp.component('MedalOne', MedalOne)
nuxtApp.vueApp.component('Next', Next)
nuxtApp.vueApp.component('DropDownList', DropDownList)
nuxtApp.vueApp.component('MoreOne', MoreOne)
nuxtApp.vueApp.component('SunOne', SunOne)
nuxtApp.vueApp.component('Moon', Moon)
nuxtApp.vueApp.component('ComputerOne', ComputerOne)
nuxtApp.vueApp.component('CommentIcon', Comment)
nuxtApp.vueApp.component('LinkIcon', Link)
nuxtApp.vueApp.component('SlyFaceWhitSmile', SlyFaceWhitSmile)
nuxtApp.vueApp.component('Like', Like)
nuxtApp.vueApp.component('ApplicationMenu', ApplicationMenu)
nuxtApp.vueApp.component('SearchIcon', Search)
nuxtApp.vueApp.component('Copy', Copy)
nuxtApp.vueApp.component('Loading', Loading)
nuxtApp.vueApp.component('Rss', Rss)
nuxtApp.vueApp.component('MessageEmoji', MessageEmoji)
})