├── .vscode └── extensions.json ├── public ├── favicon.ico ├── default_avatar.png ├── default_banner.png ├── hdr │ └── je_gray_park_1k.hdr └── tinymce │ ├── langs │ └── README.md │ ├── skins │ ├── ui │ │ ├── oxide │ │ │ └── skin.shadowdom.min.css │ │ ├── tinymce-5 │ │ │ └── skin.shadowdom.min.css │ │ ├── oxide-dark │ │ │ └── skin.shadowdom.min.css │ │ └── tinymce-5-dark │ │ │ └── skin.shadowdom.min.css │ └── content │ │ ├── default │ │ └── content.min.css │ │ ├── tinymce-5 │ │ └── content.min.css │ │ ├── writer │ │ └── content.min.css │ │ ├── dark │ │ └── content.min.css │ │ ├── tinymce-5-dark │ │ └── content.min.css │ │ └── document │ │ └── content.min.css │ ├── plugins │ ├── code │ │ └── plugin.min.js │ ├── visualblocks │ │ └── plugin.min.js │ ├── nonbreaking │ │ └── plugin.min.js │ ├── pagebreak │ │ └── plugin.min.js │ ├── save │ │ └── plugin.min.js │ ├── preview │ │ └── plugin.min.js │ └── autoresize │ │ └── plugin.min.js │ └── license.txt ├── src ├── assets │ ├── img │ │ ├── 书.png │ │ ├── NO2.cur │ │ ├── 喵星球.png │ │ ├── 标签.png │ │ ├── 猫爪.png │ │ ├── 404img.jpg │ │ ├── Arrow.cur │ │ ├── Empty.png │ │ ├── Hand2.cur │ │ ├── IBeam.cur │ │ ├── logo.png │ │ ├── lunbo.png │ │ ├── more.png │ │ ├── page.png │ │ ├── search.png │ │ ├── 基因喵-猫爪.png │ │ ├── SizeAll.cur │ │ ├── WebBlog.png │ │ ├── about-me.png │ │ ├── all-tag.png │ │ ├── divirer.png │ │ ├── loading.gif │ │ ├── logo (1).png │ │ ├── new-logo.png │ │ ├── new-msg.png │ │ ├── 404bangumi.png │ │ ├── 404img1200.jpg │ │ ├── 404img600.jpg │ │ ├── border-line.png │ │ ├── border-my.png │ │ ├── leftarrow.png │ │ ├── liuyan-logo.png │ │ ├── logo-icon.png │ │ ├── more-hover.png │ │ ├── page-active.png │ │ ├── rightarrow.png │ │ ├── 每日番剧-logo.png │ │ ├── lunbo-active.png │ │ ├── search-hover.png │ │ ├── article-achive.png │ │ ├── 404 page notfound.png │ │ └── border-line-active.png │ ├── logo.png │ ├── styles │ │ ├── tailwind │ │ │ └── index.css │ │ ├── iconfont │ │ │ ├── iconfont.ttf │ │ │ ├── iconfont.woff │ │ │ └── iconfont.woff2 │ │ ├── anime │ │ │ └── anime.less │ │ ├── global │ │ │ ├── font.less │ │ │ ├── color.less │ │ │ ├── reset.less │ │ │ ├── public-class.less │ │ │ ├── variable.less │ │ │ └── func.less │ │ ├── mixins.less │ │ ├── Layout │ │ │ └── Layout.less │ │ └── myNprogress.css │ ├── fonts │ │ ├── maoken.ttf │ │ ├── uzura.ttf │ │ ├── CaviarDreams.ttf │ │ └── KGInimitableOriginal.ttf │ └── icons │ │ ├── link.svg │ │ ├── wenzi.svg │ │ └── bofang.svg ├── views │ ├── login │ │ └── imgs │ │ │ ├── 介绍.png │ │ │ ├── 直接看看.png │ │ │ ├── login-bg.png │ │ │ ├── login-btn.png │ │ │ ├── login-logo.png │ │ │ ├── nickname.png │ │ │ ├── password.png │ │ │ ├── repassword.png │ │ │ ├── username.png │ │ │ ├── 直接看看-hover.png │ │ │ ├── register-btn.png │ │ │ ├── login-btn-hover.png │ │ │ ├── register-logo.png │ │ │ └── register-btn-hover.png │ ├── aboutme │ │ └── img │ │ │ ├── wechat.png │ │ │ ├── touxiang.jpg │ │ │ └── zhifubao.jpg │ ├── animedetail │ │ ├── components │ │ │ ├── Body │ │ │ │ ├── styles │ │ │ │ │ ├── HumanBoxCard.less │ │ │ │ │ ├── AnimeDetailInfo.less │ │ │ │ │ ├── AnimeEp.less │ │ │ │ │ └── PopOver.less │ │ │ │ ├── AnimeDetailInfoBox.vue │ │ │ │ ├── HumanBoxCard.vue │ │ │ │ └── PopOverAnimeHuman.vue │ │ │ └── Card │ │ │ │ ├── styles │ │ │ │ ├── AnimeCollections.less │ │ │ │ ├── AnimeTags.less │ │ │ │ ├── AnimeRecommend.less │ │ │ │ ├── RataingBox.less │ │ │ │ └── AnimeFollowDeatil.less │ │ │ │ └── AnimeTags.vue │ │ └── styles │ │ │ └── Animedetail.less │ ├── anime │ │ ├── styles │ │ │ ├── AnimeMina.less │ │ │ ├── AnimeOrderMenu.less │ │ │ ├── AnimeCarousel.less │ │ │ ├── AnimeBrowser.less │ │ │ ├── AnimePage.less │ │ │ └── AnimeHeader.less │ │ ├── index.vue │ │ └── components │ │ │ ├── AnimeHeader.vue │ │ │ ├── AnimeBroswerCard.vue │ │ │ ├── AnimeCarousel.vue │ │ │ ├── AnimeMina.vue │ │ │ └── CarouselItem.vue │ ├── index │ │ ├── styles │ │ │ ├── TimeLine.less │ │ │ ├── TagsAll.less │ │ │ └── ArticleTimeLine.less │ │ └── components │ │ │ ├── TagsAll.vue │ │ │ ├── TimeLine.vue │ │ │ ├── ArticleTimeLine.vue │ │ │ ├── SubTitle.vue │ │ │ └── MyInfo.vue │ ├── create │ │ ├── create.less │ │ └── Create.vue │ ├── home │ │ ├── styles │ │ │ ├── MyTab.less │ │ │ ├── Home.less │ │ │ └── UserInfo.less │ │ ├── components │ │ │ ├── MyLiked.vue │ │ │ ├── MyCollect.vue │ │ │ ├── MyTab.vue │ │ │ ├── BannerItem.vue │ │ │ └── UserInfo.vue │ │ └── HomeIndex.vue │ ├── animebgminfo │ │ ├── components │ │ │ ├── Other │ │ │ │ ├── BgmHeader.vue │ │ │ │ └── NoLogin.vue │ │ │ └── Card │ │ │ │ ├── ListCollections.vue │ │ │ │ └── MyBangumiInfo.vue │ │ └── AnimeBgmInfo.vue │ ├── 404.vue │ ├── articlelist │ │ ├── styles │ │ │ └── Search.less │ │ └── components │ │ │ └── SearchItem.vue │ ├── Layout.vue │ ├── article │ │ ├── components │ │ │ ├── ToolBars.vue │ │ │ ├── BottomItem.vue │ │ │ └── ArticleBody.vue │ │ └── styles │ │ │ ├── ToolBars.less │ │ │ └── Bottom.less │ └── animeplay │ │ └── components │ │ └── PlayerItem.vue ├── components │ ├── AdkButton │ │ ├── img │ │ │ ├── button.png │ │ │ ├── button-info-hover.png │ │ │ ├── button-danger-hover.png │ │ │ ├── button-primary-hover.png │ │ │ └── button-success-hover.png │ │ ├── AdkButton.less │ │ └── AdkButton.vue │ ├── AdkDivider │ │ └── AdkDivider.vue │ ├── AdkEmpty │ │ └── AdkEmpty.vue │ ├── SvgIcon │ │ └── SvgIcon.vue │ ├── TopNavBar │ │ ├── components │ │ │ └── Logo.vue │ │ └── styles │ │ │ ├── Index.less │ │ │ ├── Logo.less │ │ │ └── PcMenu.less │ ├── CommentItem │ │ └── styles │ │ │ ├── Index.less │ │ │ └── CommentPublic.less │ ├── MyEditor │ │ └── MyEditor.less │ ├── TagsGroup │ │ ├── TagsGroup.vue │ │ └── styles │ │ │ └── TagsGroup-pc.less │ ├── LoadingAnime │ │ └── LoadingAnime.vue │ ├── MyPagination │ │ └── index.vue │ ├── TagItem │ │ └── TagItem.vue │ ├── MyPageHeader │ │ └── MyPageHeader.vue │ ├── Carousel │ │ ├── Carousel.vue │ │ └── styles │ │ │ └── Carousel.less │ ├── SmallAnimeItem │ │ ├── styles │ │ │ └── SmallAnimeItem.less │ │ └── SmallAnimeItem.vue │ └── Footer │ │ └── FooterItem.vue ├── interface │ ├── Message.type.d.ts │ ├── yhdm.type.d.ts │ ├── Comment.type.d.ts │ ├── User.type.d.ts │ ├── theme.type.d.ts │ ├── AnimeFollow.type.d.ts │ ├── BangumiEnum.type.d.ts │ ├── Params.type.d.ts │ ├── EnumExport.ts │ └── Article.type.d.ts ├── utils │ ├── textFilter.ts │ ├── mobile.ts │ ├── iFrameHeight.ts │ ├── dayjs.ts │ ├── resize.ts │ ├── emoji.ts │ ├── storage.ts │ ├── bangumiApi.ts │ ├── m3u8Change.ts │ ├── tools.ts │ ├── request.ts │ └── validate.ts ├── typings.d.ts ├── hooks │ ├── BangumiDetail.ts │ ├── useSourcepage.ts │ ├── useMouseAdk.ts │ ├── useTag.ts │ └── useEmoji.ts ├── api │ ├── bangumiMy.ts │ ├── message.ts │ ├── YhdmApi.ts │ ├── comment.ts │ ├── login.ts │ └── pic.ts ├── store │ ├── theme.ts │ ├── globalConfig.ts │ ├── user.ts │ ├── cache.ts │ ├── main.ts │ └── bangumiUser.ts ├── App.vue ├── env.d.ts ├── main.ts └── theme │ └── themeData.json ├── postcss.config.js ├── tsconfig.node.json ├── .eslintignore ├── .env.development ├── .env.production ├── .gitignore ├── tailwind.config.js ├── index.html ├── tsconfig.json ├── LICENSE ├── .eslintrc ├── .github └── workflows │ └── push.yml └── changelog.config.js /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": [] 3 | } -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/public/favicon.ico -------------------------------------------------------------------------------- /src/assets/img/书.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/assets/img/书.png -------------------------------------------------------------------------------- /src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/assets/logo.png -------------------------------------------------------------------------------- /src/assets/img/NO2.cur: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/assets/img/NO2.cur -------------------------------------------------------------------------------- /src/assets/img/喵星球.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/assets/img/喵星球.png -------------------------------------------------------------------------------- /src/assets/img/标签.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/assets/img/标签.png -------------------------------------------------------------------------------- /src/assets/img/猫爪.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/assets/img/猫爪.png -------------------------------------------------------------------------------- /src/assets/styles/tailwind/index.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; -------------------------------------------------------------------------------- /public/default_avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/public/default_avatar.png -------------------------------------------------------------------------------- /public/default_banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/public/default_banner.png -------------------------------------------------------------------------------- /src/assets/img/404img.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/assets/img/404img.jpg -------------------------------------------------------------------------------- /src/assets/img/Arrow.cur: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/assets/img/Arrow.cur -------------------------------------------------------------------------------- /src/assets/img/Empty.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/assets/img/Empty.png -------------------------------------------------------------------------------- /src/assets/img/Hand2.cur: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/assets/img/Hand2.cur -------------------------------------------------------------------------------- /src/assets/img/IBeam.cur: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/assets/img/IBeam.cur -------------------------------------------------------------------------------- /src/assets/img/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/assets/img/logo.png -------------------------------------------------------------------------------- /src/assets/img/lunbo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/assets/img/lunbo.png -------------------------------------------------------------------------------- /src/assets/img/more.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/assets/img/more.png -------------------------------------------------------------------------------- /src/assets/img/page.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/assets/img/page.png -------------------------------------------------------------------------------- /src/assets/img/search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/assets/img/search.png -------------------------------------------------------------------------------- /src/assets/img/基因喵-猫爪.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/assets/img/基因喵-猫爪.png -------------------------------------------------------------------------------- /src/assets/fonts/maoken.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/assets/fonts/maoken.ttf -------------------------------------------------------------------------------- /src/assets/fonts/uzura.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/assets/fonts/uzura.ttf -------------------------------------------------------------------------------- /src/assets/img/SizeAll.cur: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/assets/img/SizeAll.cur -------------------------------------------------------------------------------- /src/assets/img/WebBlog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/assets/img/WebBlog.png -------------------------------------------------------------------------------- /src/assets/img/about-me.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/assets/img/about-me.png -------------------------------------------------------------------------------- /src/assets/img/all-tag.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/assets/img/all-tag.png -------------------------------------------------------------------------------- /src/assets/img/divirer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/assets/img/divirer.png -------------------------------------------------------------------------------- /src/assets/img/loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/assets/img/loading.gif -------------------------------------------------------------------------------- /src/assets/img/logo (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/assets/img/logo (1).png -------------------------------------------------------------------------------- /src/assets/img/new-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/assets/img/new-logo.png -------------------------------------------------------------------------------- /src/assets/img/new-msg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/assets/img/new-msg.png -------------------------------------------------------------------------------- /src/views/login/imgs/介绍.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/views/login/imgs/介绍.png -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {} 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /public/hdr/je_gray_park_1k.hdr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/public/hdr/je_gray_park_1k.hdr -------------------------------------------------------------------------------- /src/assets/img/404bangumi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/assets/img/404bangumi.png -------------------------------------------------------------------------------- /src/assets/img/404img1200.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/assets/img/404img1200.jpg -------------------------------------------------------------------------------- /src/assets/img/404img600.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/assets/img/404img600.jpg -------------------------------------------------------------------------------- /src/assets/img/border-line.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/assets/img/border-line.png -------------------------------------------------------------------------------- /src/assets/img/border-my.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/assets/img/border-my.png -------------------------------------------------------------------------------- /src/assets/img/leftarrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/assets/img/leftarrow.png -------------------------------------------------------------------------------- /src/assets/img/liuyan-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/assets/img/liuyan-logo.png -------------------------------------------------------------------------------- /src/assets/img/logo-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/assets/img/logo-icon.png -------------------------------------------------------------------------------- /src/assets/img/more-hover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/assets/img/more-hover.png -------------------------------------------------------------------------------- /src/assets/img/page-active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/assets/img/page-active.png -------------------------------------------------------------------------------- /src/assets/img/rightarrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/assets/img/rightarrow.png -------------------------------------------------------------------------------- /src/assets/img/每日番剧-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/assets/img/每日番剧-logo.png -------------------------------------------------------------------------------- /src/views/login/imgs/直接看看.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/views/login/imgs/直接看看.png -------------------------------------------------------------------------------- /src/assets/img/lunbo-active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/assets/img/lunbo-active.png -------------------------------------------------------------------------------- /src/assets/img/search-hover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/assets/img/search-hover.png -------------------------------------------------------------------------------- /src/views/aboutme/img/wechat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/views/aboutme/img/wechat.png -------------------------------------------------------------------------------- /src/assets/fonts/CaviarDreams.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/assets/fonts/CaviarDreams.ttf -------------------------------------------------------------------------------- /src/assets/img/article-achive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/assets/img/article-achive.png -------------------------------------------------------------------------------- /src/views/aboutme/img/touxiang.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/views/aboutme/img/touxiang.jpg -------------------------------------------------------------------------------- /src/views/aboutme/img/zhifubao.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/views/aboutme/img/zhifubao.jpg -------------------------------------------------------------------------------- /src/views/login/imgs/login-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/views/login/imgs/login-bg.png -------------------------------------------------------------------------------- /src/views/login/imgs/login-btn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/views/login/imgs/login-btn.png -------------------------------------------------------------------------------- /src/views/login/imgs/login-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/views/login/imgs/login-logo.png -------------------------------------------------------------------------------- /src/views/login/imgs/nickname.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/views/login/imgs/nickname.png -------------------------------------------------------------------------------- /src/views/login/imgs/password.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/views/login/imgs/password.png -------------------------------------------------------------------------------- /src/views/login/imgs/repassword.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/views/login/imgs/repassword.png -------------------------------------------------------------------------------- /src/views/login/imgs/username.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/views/login/imgs/username.png -------------------------------------------------------------------------------- /src/views/login/imgs/直接看看-hover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/views/login/imgs/直接看看-hover.png -------------------------------------------------------------------------------- /src/assets/img/404 page notfound.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/assets/img/404 page notfound.png -------------------------------------------------------------------------------- /src/assets/img/border-line-active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/assets/img/border-line-active.png -------------------------------------------------------------------------------- /src/views/login/imgs/register-btn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/views/login/imgs/register-btn.png -------------------------------------------------------------------------------- /src/assets/styles/iconfont/iconfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/assets/styles/iconfont/iconfont.ttf -------------------------------------------------------------------------------- /src/assets/styles/iconfont/iconfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/assets/styles/iconfont/iconfont.woff -------------------------------------------------------------------------------- /src/components/AdkButton/img/button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/components/AdkButton/img/button.png -------------------------------------------------------------------------------- /src/views/login/imgs/login-btn-hover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/views/login/imgs/login-btn-hover.png -------------------------------------------------------------------------------- /src/views/login/imgs/register-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/views/login/imgs/register-logo.png -------------------------------------------------------------------------------- /src/assets/fonts/KGInimitableOriginal.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/assets/fonts/KGInimitableOriginal.ttf -------------------------------------------------------------------------------- /src/assets/styles/iconfont/iconfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/assets/styles/iconfont/iconfont.woff2 -------------------------------------------------------------------------------- /src/views/login/imgs/register-btn-hover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/views/login/imgs/register-btn-hover.png -------------------------------------------------------------------------------- /src/components/AdkButton/img/button-info-hover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/components/AdkButton/img/button-info-hover.png -------------------------------------------------------------------------------- /src/components/AdkButton/img/button-danger-hover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/components/AdkButton/img/button-danger-hover.png -------------------------------------------------------------------------------- /src/components/AdkButton/img/button-primary-hover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/components/AdkButton/img/button-primary-hover.png -------------------------------------------------------------------------------- /src/components/AdkButton/img/button-success-hover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ADKcodeXD/Myblog-Vue3viteTs/HEAD/src/components/AdkButton/img/button-success-hover.png -------------------------------------------------------------------------------- /public/tinymce/langs/README.md: -------------------------------------------------------------------------------- 1 | This is where language files should be placed. 2 | 3 | Please DO NOT translate these directly use this service: https://www.transifex.com/projects/p/tinymce/ 4 | -------------------------------------------------------------------------------- /tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "composite": true, 4 | "module": "esnext", 5 | "moduleResolution": "node" 6 | }, 7 | "include": ["vite.config.ts"] 8 | } 9 | -------------------------------------------------------------------------------- /src/interface/Message.type.d.ts: -------------------------------------------------------------------------------- 1 | declare interface MessageVo { 2 | id: string 3 | avatar: string 4 | authorName: string 5 | contact: string 6 | createDate: string 7 | content: string 8 | } 9 | -------------------------------------------------------------------------------- /src/assets/styles/anime/anime.less: -------------------------------------------------------------------------------- 1 | // 旋转动画 无限循环 2 | @keyframes rotation-loop { 3 | 0%{ 4 | transform: rotateZ(0); 5 | } 6 | 100%{ 7 | transform: rotateZ(360deg); 8 | } 9 | } -------------------------------------------------------------------------------- /src/utils/textFilter.ts: -------------------------------------------------------------------------------- 1 | export const TextFilter = function (str: string) { 2 | const pattern = new RegExp(/[`~%!@#^=''?~!@#¥……&——‘”“'?*()(),,。.、]/g) //[]内输入你要过滤的字符 3 | return str.replaceAll(pattern, '') 4 | } 5 | -------------------------------------------------------------------------------- /src/typings.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.css' 2 | declare module '*.less' 3 | declare module '*.scss' 4 | declare module '*.sass' 5 | declare module '*.svg' 6 | declare module '*.png' 7 | declare module '*.jpg' 8 | declare module '*.jpeg' 9 | declare module '*.gif' 10 | -------------------------------------------------------------------------------- /src/hooks/BangumiDetail.ts: -------------------------------------------------------------------------------- 1 | import { getSubjectInfoAllApi } from '@/api/bangumi' 2 | 3 | export const useAnimeDeatil = async (subjectId: number): Promise => { 4 | const { data } = await getSubjectInfoAllApi(subjectId) 5 | return data.data 6 | } 7 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | /logs 2 | /node_modules 3 | /dist 4 | /onlinedist 5 | /src/assets/js 6 | /src/assets 7 | /public 8 | /package-lock.json 9 | .DS_Store 10 | fis-conf.js 11 | components.d.ts 12 | changelog.config.js 13 | *.less 14 | *.css 15 | *.png 16 | *.jpg 17 | *.jpeg 18 | *.gif -------------------------------------------------------------------------------- /src/api/bangumiMy.ts: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | // 我自己使用爬虫爬取的数据 4 | export const getBroswerDataApi = (bgmRankParams: Bangumi.BroswerParams) => { 5 | return request({ 6 | method: 'post', 7 | url: '/api/bgmrank/getindex', 8 | data: bgmRankParams 9 | }) 10 | } 11 | -------------------------------------------------------------------------------- /.env.development: -------------------------------------------------------------------------------- 1 | # just a flag 2 | ENV = 'development' 3 | 4 | # base api 5 | VITE_BASE_API = '/' 6 | 7 | # ws api 8 | VITE_APP_WEB_SOCKET_API='ws://localhost:8888/wschat/' 9 | 10 | #bgm api 11 | VITE_APP_BGM_BASE_API='/' 12 | 13 | #bgm api 14 | VITE_APP_WEB_URL='https://adkdream.top' 15 | 16 | VITE_PUBLIC_PATH='/' -------------------------------------------------------------------------------- /src/interface/yhdm.type.d.ts: -------------------------------------------------------------------------------- 1 | declare interface Epinfo { 2 | epTitle: string 3 | epUrl: string 4 | } 5 | 6 | declare interface YhdmSearchInfo { 7 | title: string 8 | epInfo: Epinfo[] 9 | } 10 | 11 | declare interface YhdmVideoInfo { 12 | title: string 13 | epInfo: Epinfo[] 14 | videoUrl: string 15 | } 16 | -------------------------------------------------------------------------------- /src/views/animedetail/components/Body/styles/HumanBoxCard.less: -------------------------------------------------------------------------------- 1 | .desc { 2 | display: flex; 3 | flex-direction: column; 4 | margin: @margin-general 0; 5 | 6 | &-title { 7 | font-size: @very-big-text; 8 | } 9 | 10 | &-boxinner { 11 | display: flex; 12 | flex-wrap: wrap; 13 | } 14 | } -------------------------------------------------------------------------------- /src/interface/Comment.type.d.ts: -------------------------------------------------------------------------------- 1 | declare interface CommentItemInfo { 2 | childrens?: Array 3 | content: string 4 | createDate: string 5 | id?: string 6 | toUser?: UserEasy 7 | user?: UserEasy 8 | // 这几个都是为了适配 留言区的评论 9 | contact?: string 10 | nickname?: string 11 | avatar?: string 12 | level?: number 13 | } 14 | -------------------------------------------------------------------------------- /src/utils/mobile.ts: -------------------------------------------------------------------------------- 1 | export const isMobile = () => { 2 | if ( 3 | navigator.userAgent.match( 4 | /(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i 5 | ) 6 | ) { 7 | return true 8 | } else { 9 | return false 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /.env.production: -------------------------------------------------------------------------------- 1 | # just a flag 2 | ENV = 'production' 3 | 4 | # base api 5 | VITE_BASE_API = 'https://adkdream.top' 6 | 7 | # ws api 8 | VITE_APP_WEB_SOCKET_API='ws://adkdream.top/ws/wschat/' 9 | 10 | #bgm api 11 | VITE_APP_BGM_BASE_API='https://api.bgm.tv' 12 | 13 | #bgm api 14 | VITE_APP_WEB_URL='https://adkdream.top' 15 | 16 | VITE_PUBLIC_PATH='/' -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | 26 | .font-spider -------------------------------------------------------------------------------- /src/hooks/useSourcepage.ts: -------------------------------------------------------------------------------- 1 | import { useStore } from '@/store/main' 2 | 3 | export const useBackToSource = router => { 4 | const back = () => { 5 | const page = useStore() 6 | if (page.sourcePage.length !== 0) { 7 | const url = page.sourcePage.pop() 8 | router.push({ path: url, query: { isCache: 'no' } }) 9 | } else { 10 | router.back() 11 | } 12 | } 13 | return { back } 14 | } 15 | -------------------------------------------------------------------------------- /src/utils/iFrameHeight.ts: -------------------------------------------------------------------------------- 1 | export const setIframeHeight = (iframe: HTMLIFrameElement) => { 2 | let height = '100' 3 | if (iframe) { 4 | const iframeWin = iframe.contentWindow 5 | if (iframeWin && iframeWin.document.body) { 6 | height = 7 | iframeWin.document.documentElement.scrollHeight.toString() || 8 | iframeWin.document.body.scrollHeight.toString() 9 | } 10 | } 11 | return height 12 | } 13 | -------------------------------------------------------------------------------- /src/components/AdkDivider/AdkDivider.vue: -------------------------------------------------------------------------------- 1 | 4 | 12 | 21 | -------------------------------------------------------------------------------- /tailwind.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | content: [ 3 | // Example content paths... 4 | './public/**/*.html', 5 | './src/**/*.{js,jsx,ts,tsx,vue}' 6 | ], 7 | whitelistPatterns: [/el-.+$/], 8 | whitelistPatternsChildren: [/el-.+$/], 9 | theme: { 10 | extend: {} 11 | }, 12 | variants: { 13 | extend: {} 14 | }, 15 | plugins: [], 16 | prefix: 'tw-', 17 | corePlugins: { 18 | preflight: false 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/api/message.ts: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | // 添加留言 4 | export const addMessageApi = (messageParams: MessageParamsForADK) => { 5 | return request({ 6 | method: 'post', 7 | url: '/api/message/addmsg', 8 | data: messageParams 9 | }) 10 | } 11 | // 获取所有留言 12 | export const getMessageApi = (pageParams: PageParams) => { 13 | return request({ 14 | method: 'post', 15 | url: '/api/message/findmsg', 16 | data: pageParams 17 | }) 18 | } 19 | -------------------------------------------------------------------------------- /src/utils/dayjs.ts: -------------------------------------------------------------------------------- 1 | import dayjs from 'dayjs' 2 | import 'dayjs/locale/zh-cn' 3 | 4 | import relativeTime from 'dayjs/plugin/relativeTime' 5 | dayjs.extend(relativeTime) 6 | 7 | // 使用中文语言包 8 | dayjs.locale('zh-cn') 9 | 10 | export const getRealativeTime = (value: string | number) => { 11 | return dayjs(value).from(dayjs()) 12 | } 13 | 14 | export const getFormatTime = (value: string | number, format = 'YYYY-MM-DD HH:mm:ss') => { 15 | return dayjs(value).format(format) 16 | } 17 | -------------------------------------------------------------------------------- /src/assets/styles/global/font.less: -------------------------------------------------------------------------------- 1 | // 自定义字体 2 | @font-face { 3 | font-family: 'Cartoonfont'; 4 | src: url(../../fonts/KGInimitableOriginal.ttf); 5 | } 6 | 7 | @font-face { 8 | font-family: 'Thinfont'; 9 | src: url(../../fonts/CaviarDreams.ttf); 10 | } 11 | 12 | @font-face { 13 | font-family: 'urafont'; 14 | src: url(../../fonts/uzura.ttf); 15 | } 16 | 17 | @font-face { 18 | font-family: 'maoken'; 19 | src: url(../../fonts/maoken.ttf); 20 | } -------------------------------------------------------------------------------- /src/api/YhdmApi.ts: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | // 获取搜索结果 4 | export const getYhdmAnimeSearchInfo = (keywords: string) => { 5 | return request({ 6 | method: 'get', 7 | url: '/api/yhdm/getsearchinfo', 8 | params: { keywords: keywords } 9 | }) 10 | } 11 | // 获取yhdm 播放页信息 12 | export const getYhdmAnimeVideoInfo = (url: string) => { 13 | return request({ 14 | method: 'get', 15 | url: '/api/yhdm/getvideourl', 16 | params: { url: url } 17 | }) 18 | } 19 | -------------------------------------------------------------------------------- /src/api/comment.ts: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | // 添加评论操作 4 | export const addComment = (commentParams: CommentParams) => { 5 | return request({ 6 | method: 'post', 7 | url: '/api/comment/addcomment', 8 | data: commentParams 9 | }) 10 | } 11 | // 获取所有评论信息 12 | export const getComments = (id: string, pageParams: PageParams) => { 13 | return request({ 14 | method: 'post', 15 | url: `/api/comment/article/${id}`, 16 | data: pageParams 17 | }) 18 | } 19 | -------------------------------------------------------------------------------- /src/components/AdkEmpty/AdkEmpty.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 16 | 22 | -------------------------------------------------------------------------------- /src/interface/User.type.d.ts: -------------------------------------------------------------------------------- 1 | declare interface UserEasy { 2 | avatar: string 3 | id: string 4 | role: string 5 | username: string 6 | nickname: string 7 | introduce: string 8 | banner: string 9 | } 10 | declare interface UserAll { 11 | avatar: string 12 | id: string 13 | role: string 14 | username: string 15 | nickname: string 16 | introduce: string 17 | banner: string 18 | gender: string 19 | email: string 20 | date: string 21 | allArticleCounts: int 22 | } 23 | -------------------------------------------------------------------------------- /src/utils/resize.ts: -------------------------------------------------------------------------------- 1 | import { debounce } from './tools' 2 | 3 | export default function () { 4 | // 利用防抖优化性能 5 | const newfun = () => { 6 | const docElement = document.documentElement || document.body 7 | const clientWidth = docElement.clientWidth, 8 | designWidth = 1920 9 | docElement.style.fontSize = 10 | (clientWidth / designWidth) * 14 < 10 ? 10 + 'px' : (clientWidth / designWidth) * 14 + 'px' 11 | } 12 | window.addEventListener('resize', debounce(500, newfun)) 13 | newfun() 14 | } 15 | -------------------------------------------------------------------------------- /src/store/theme.ts: -------------------------------------------------------------------------------- 1 | import { getItem } from '@/utils/storage' 2 | import { defineStore } from 'pinia' 3 | 4 | export const useThemeStore = defineStore('theme', { 5 | state: () => { 6 | return { 7 | // 这里写变量 8 | theme: getItem('themeName') 9 | } 10 | }, 11 | // could also be defined as 12 | // state: () => ({ count: 0 }) 13 | actions: { 14 | // 这里写方法action 15 | setTheme(theme: string) { 16 | this.theme = theme 17 | } 18 | }, 19 | getters: { 20 | // getters 21 | } 22 | }) 23 | -------------------------------------------------------------------------------- /src/views/anime/styles/AnimeMina.less: -------------------------------------------------------------------------------- 1 | @media screen and(min-width:@mobile-device) { 2 | .mina{ 3 | display: flex; 4 | flex-direction: column; 5 | background-color: @bgColor; 6 | padding: @padding-general; 7 | &-top{ 8 | .font-normal(); 9 | color:@textColor; 10 | &--big{ 11 | font-size:@big-text; 12 | } 13 | &--small{ 14 | font-size:@small-text; 15 | } 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 18 | -------------------------------------------------------------------------------- /src/components/SvgIcon/SvgIcon.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 25 | -------------------------------------------------------------------------------- /public/tinymce/skins/ui/oxide/skin.shadowdom.min.css: -------------------------------------------------------------------------------- 1 | body.tox-dialog__disable-scroll{overflow:hidden}.tox-fullscreen{border:0;height:100%;margin:0;overflow:hidden;overscroll-behavior:none;padding:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox-shadowhost.tox-fullscreen,.tox.tox-tinymce.tox-fullscreen{left:0;position:fixed;top:0;z-index:1200}.tox.tox-tinymce.tox-fullscreen{background-color:transparent}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201} 2 | -------------------------------------------------------------------------------- /public/tinymce/skins/ui/tinymce-5/skin.shadowdom.min.css: -------------------------------------------------------------------------------- 1 | body.tox-dialog__disable-scroll{overflow:hidden}.tox-fullscreen{border:0;height:100%;margin:0;overflow:hidden;overscroll-behavior:none;padding:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox-shadowhost.tox-fullscreen,.tox.tox-tinymce.tox-fullscreen{left:0;position:fixed;top:0;z-index:1200}.tox.tox-tinymce.tox-fullscreen{background-color:transparent}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201} 2 | -------------------------------------------------------------------------------- /public/tinymce/skins/ui/oxide-dark/skin.shadowdom.min.css: -------------------------------------------------------------------------------- 1 | body.tox-dialog__disable-scroll{overflow:hidden}.tox-fullscreen{border:0;height:100%;margin:0;overflow:hidden;overscroll-behavior:none;padding:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox-shadowhost.tox-fullscreen,.tox.tox-tinymce.tox-fullscreen{left:0;position:fixed;top:0;z-index:1200}.tox.tox-tinymce.tox-fullscreen{background-color:transparent}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201} 2 | -------------------------------------------------------------------------------- /public/tinymce/skins/ui/tinymce-5-dark/skin.shadowdom.min.css: -------------------------------------------------------------------------------- 1 | body.tox-dialog__disable-scroll{overflow:hidden}.tox-fullscreen{border:0;height:100%;margin:0;overflow:hidden;overscroll-behavior:none;padding:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox-shadowhost.tox-fullscreen,.tox.tox-tinymce.tox-fullscreen{left:0;position:fixed;top:0;z-index:1200}.tox.tox-tinymce.tox-fullscreen{background-color:transparent}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201} 2 | -------------------------------------------------------------------------------- /src/components/TopNavBar/components/Logo.vue: -------------------------------------------------------------------------------- 1 | 9 | 15 | 16 | 19 | -------------------------------------------------------------------------------- /src/env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | declare module '*.vue' { 4 | import type { DefineComponent } from 'vue' 5 | // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/ban-types 6 | const component: DefineComponent<{}, {}, any> 7 | export default component 8 | } 9 | declare interface ApiResult { 10 | data: T 11 | msg: string 12 | success: string 13 | code: number 14 | } 15 | 16 | declare interface ListInfoResult { 17 | results: Array 18 | length: number 19 | pages: number 20 | } 21 | -------------------------------------------------------------------------------- /src/store/globalConfig.ts: -------------------------------------------------------------------------------- 1 | import { getItem } from '@/utils/storage' 2 | import { defineStore } from 'pinia' 3 | 4 | export const useGlobalConfigStore = defineStore('globalConfig', { 5 | state: () => { 6 | return { 7 | // 这里写变量 8 | config: getItem('globalConfig') 9 | } 10 | }, 11 | // could also be defined as 12 | // state: () => ({ count: 0 }) 13 | actions: { 14 | // 这里写方法action 15 | setGlabalConfig(config: GlobalConfig) { 16 | this.config = config 17 | } 18 | }, 19 | getters: { 20 | // getters 21 | } 22 | }) 23 | -------------------------------------------------------------------------------- /src/views/animedetail/components/Card/styles/AnimeCollections.less: -------------------------------------------------------------------------------- 1 | 2 | @media screen and(min-width:@mobile-device) { 3 | .boxcard{ 4 | margin: @margin-general 0; 5 | padding: @padding-general; 6 | background-color: @bgColor; 7 | .border-normal(); 8 | .shadow(); 9 | #collectionCharts{ 10 | height: 22rem; 11 | } 12 | &-title{ 13 | font-size: @very-big-text; 14 | } 15 | } 16 | } 17 | @media screen and(min-width:@smallpc-device) { 18 | .boxcard { 19 | margin: @margin-general; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/views/index/styles/TimeLine.less: -------------------------------------------------------------------------------- 1 | .timeline { 2 | transition: background-color 1s ease; 3 | background-color: @bgColor; 4 | padding: @padding-general; 5 | overflow: hidden; 6 | border: @textColor solid @border-line; 7 | border-radius: @border-radius; 8 | .shadow(); 9 | 10 | .content { 11 | .text-line-show(2); 12 | } 13 | 14 | .title { 15 | display: flex; 16 | flex-direction: column; 17 | .font-normal(); 18 | font-size: @big-text; 19 | 20 | span { 21 | font-size: @mid-text; 22 | } 23 | } 24 | } -------------------------------------------------------------------------------- /src/components/CommentItem/styles/Index.less: -------------------------------------------------------------------------------- 1 | 2 | .comment-item { 3 | margin-top: 30px; 4 | width: 100%; 5 | display: flex; 6 | flex-direction: column; 7 | padding: @padding-general; 8 | .font-normal(); 9 | border: @border-line @textColor solid; 10 | border-radius: 20px; 11 | .shadow(); 12 | .content { 13 | width: 100%; 14 | word-break: break-all; 15 | .comment-content { 16 | min-height: 150px; 17 | font-size: 20px; 18 | } 19 | .secondcomment { 20 | display: flex; 21 | flex-direction: column; 22 | } 23 | } 24 | } -------------------------------------------------------------------------------- /src/store/user.ts: -------------------------------------------------------------------------------- 1 | import { defineStore } from 'pinia' 2 | 3 | export const useUserStore = defineStore('user', { 4 | state: () => { 5 | return { 6 | // 这里写变量 7 | userinfo: { 8 | id: '', 9 | username: '', 10 | avatar: '', 11 | role: '', 12 | nickname: '', 13 | banner: '', 14 | introduce: '' 15 | } 16 | } 17 | }, 18 | // could also be defined as 19 | // state: () => ({ count: 0 }) 20 | actions: { 21 | // 这里写方法action 22 | setUser(user: UserEasy) { 23 | this.userinfo = user 24 | } 25 | }, 26 | getters: { 27 | // getters 28 | } 29 | }) 30 | -------------------------------------------------------------------------------- /src/components/MyEditor/MyEditor.less: -------------------------------------------------------------------------------- 1 | .container { 2 | display: flex; 3 | flex-direction: column; 4 | 5 | } 6 | .switch-btn { 7 | display: flex; 8 | margin-left: 5px; 9 | .font-normal(); 10 | .text{ 11 | display: flexbox; 12 | padding: 10px 15px 5px 15px; 13 | color: @textColor; 14 | cursor: pointer; 15 | .flexbox(); 16 | background-color: @tipTextColor; 17 | color: @textColor; 18 | border-radius:20px 20px 0 0; 19 | transition: all 0.3s ease; 20 | &:hover{ 21 | background-color: @hoverColor; 22 | color: @hoverTextColor; 23 | } 24 | } 25 | } -------------------------------------------------------------------------------- /src/views/animedetail/components/Card/styles/AnimeTags.less: -------------------------------------------------------------------------------- 1 | @media screen and(min-width:@mobile-device) { 2 | .tags{ 3 | margin: @margin-general 0; 4 | padding: @padding-general; 5 | background-color: @bgColor; 6 | .border-normal(); 7 | .shadow(); 8 | &-tag{ 9 | display: flex; 10 | flex-wrap: wrap; 11 | cursor: pointer; 12 | margin: 0.2rem; 13 | } 14 | &-title{ 15 | font-size: @very-big-text; 16 | } 17 | } 18 | } 19 | @media screen and(min-width:@smallpc-device) { 20 | .tags { 21 | margin: @margin-general; 22 | } 23 | } -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | import { createApp } from 'vue' 2 | import App from './App.vue' 3 | import router from './router' 4 | import { createPinia } from 'pinia' 5 | // import ElementPlus from 'element-plus'; 6 | import 'element-plus/dist/index.css' 7 | import '@/assets/styles/iconfont/iconfont.less' 8 | import '@/assets/styles/tailwind/index.css' 9 | import '@/assets/styles/tailwind/preflight.css' 10 | import 'virtual:svg-icons-register' 11 | import { createHead } from '@vueuse/head' 12 | const head = createHead() 13 | const pinia = createPinia() 14 | const app = createApp(App).use(router).use(pinia).use(head) 15 | // app.config.globalProperties.$echarts = echarts; 16 | app.mount('#app') 17 | -------------------------------------------------------------------------------- /src/views/animedetail/components/Card/styles/AnimeRecommend.less: -------------------------------------------------------------------------------- 1 | @media screen and(min-width:@mobile-device) { 2 | .recommend{ 3 | margin: @margin-general 0; 4 | padding: @padding-general; 5 | background-color: @bgColor; 6 | .border-normal(); 7 | .shadow(); 8 | &-tag{ 9 | display: flex; 10 | flex-wrap: wrap; 11 | cursor: pointer; 12 | margin: 0.2rem; 13 | } 14 | &-title{ 15 | font-size: @very-big-text; 16 | } 17 | } 18 | } 19 | @media screen and(min-width:@smallpc-device) { 20 | .recommend { 21 | margin: @margin-general; 22 | } 23 | } -------------------------------------------------------------------------------- /src/views/index/styles/TagsAll.less: -------------------------------------------------------------------------------- 1 | .tasall { 2 | transition: background-color 1s ease; 3 | background-color: @bgColor; 4 | padding: @padding-general; 5 | overflow: hidden; 6 | border-radius: @border-radius; 7 | border: @textColor solid @border-line; 8 | .shadow(); 9 | 10 | .tag { 11 | margin-right: @margin-general; 12 | margin-top: 5px; 13 | cursor: pointer; 14 | } 15 | 16 | .title { 17 | display: flex; 18 | flex-direction: column; 19 | .font-normal(); 20 | font-size: @big-text; 21 | 22 | span { 23 | font-size: @mid-text; 24 | } 25 | } 26 | } -------------------------------------------------------------------------------- /src/components/TopNavBar/styles/Index.less: -------------------------------------------------------------------------------- 1 | @import url(@/assets/styles/MyAnimate.less); 2 | @media screen and (min-width: @mobile-device) { 3 | .el-header { 4 | padding: 0; 5 | height: @top-nav-bar-height; 6 | position: fixed; 7 | z-index: 9999; 8 | box-shadow:0px 2px 10px @shadowColor; 9 | background-color: @themeColor; 10 | left: 0; 11 | right: 0; 12 | .el-row { 13 | height: 100%; 14 | padding: @padding-general; 15 | align-items: center; 16 | } 17 | } 18 | 19 | } 20 | @media screen and (min-width: @smallpc-device) { 21 | .el-header { 22 | position: relative; 23 | background-color: @bgColor; 24 | } 25 | } -------------------------------------------------------------------------------- /src/components/TagsGroup/TagsGroup.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 25 | 26 | 29 | -------------------------------------------------------------------------------- /src/utils/emoji.ts: -------------------------------------------------------------------------------- 1 | import emojiRegex from 'emoji-regex' 2 | 3 | export const encodeEmoji = (content: string): string => { 4 | // 使用emojiRegex将所有emoji 转换为数据库能够存储的格式 5 | const emojiR = emojiRegex() 6 | const fmt_str = content.replace(emojiR, p => `e(${p.codePointAt(0)})`) 7 | return fmt_str 8 | } 9 | 10 | export const decodeEmoji = (content: string): string => { 11 | const emojiDecodeRegex = /e\([0-9]+\)/g 12 | const ori_str = content.replace(emojiDecodeRegex, p => { 13 | const filterP = p.match(/[0-9]+/g) 14 | if (filterP && filterP.length > 0) { 15 | return String.fromCodePoint(parseInt(filterP[0])) || '' 16 | } else { 17 | return '' 18 | } 19 | }) 20 | return ori_str 21 | } 22 | -------------------------------------------------------------------------------- /src/views/create/create.less: -------------------------------------------------------------------------------- 1 | @media screen and(min-width:@mobile-device) { 2 | .create-center{ 3 | padding: @padding-general; 4 | background-color: @bgColor; 5 | min-height: 75vh; 6 | margin: @margin-general 0; 7 | margin-top: @top-nav-bar-height; 8 | border-radius: @border-radius; 9 | .shadow(); 10 | .border-normal(); 11 | .font-normal(); 12 | display: flex; 13 | flex-direction: column; 14 | .upinfo{ 15 | .title{ 16 | font-size: @big-text; 17 | } 18 | } 19 | } 20 | } 21 | @media screen and (min-width:@smallpc-device) { 22 | .create-center{ 23 | margin: @margin-general 0; 24 | } 25 | } -------------------------------------------------------------------------------- /src/store/cache.ts: -------------------------------------------------------------------------------- 1 | import { defineStore } from 'pinia' 2 | 3 | export const useCacheStore = defineStore('cache', { 4 | state: () => { 5 | return { 6 | // 这里写变量 7 | cachePages: [] as Array 8 | } 9 | }, 10 | // could also be defined as 11 | // state: () => ({ count: 0 }) 12 | actions: { 13 | // 这里写方法action 14 | setCachePage(page: string) { 15 | if (!this.cachePages.includes(page)) { 16 | this.cachePages.push(page) 17 | } 18 | }, 19 | removeCachePages(page: string) { 20 | if (this.cachePages.indexOf(page) !== -1) { 21 | this.cachePages.splice(this.cachePages.indexOf(page), 1) 22 | } 23 | } 24 | }, 25 | getters: { 26 | // getters 27 | } 28 | }) 29 | -------------------------------------------------------------------------------- /src/api/login.ts: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | /** 4 | * 用户登录api 5 | * @param loginParams 用户登录参数 6 | * @returns 7 | */ 8 | export const userLogin = (loginParams: unknown) => { 9 | return request({ 10 | method: 'post', 11 | url: '/api/login', 12 | data: loginParams 13 | }) 14 | } 15 | /** 16 | * 用户注册 17 | * @param registerParams 用户注册参数 18 | * @returns 19 | */ 20 | export const userRegister = (registerParams: unknown) => { 21 | return request({ 22 | method: 'post', 23 | url: '/api/register', 24 | data: registerParams 25 | }) 26 | } 27 | /** 28 | * 用户登出 用于删除redis中的缓存信息 29 | * @returns 30 | */ 31 | export const userLogout = () => { 32 | return request({ 33 | method: 'post', 34 | url: '/api/login/logout' 35 | }) 36 | } 37 | -------------------------------------------------------------------------------- /src/components/LoadingAnime/LoadingAnime.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 35 | -------------------------------------------------------------------------------- /src/views/index/components/TagsAll.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 25 | 26 | 29 | -------------------------------------------------------------------------------- /src/utils/storage.ts: -------------------------------------------------------------------------------- 1 | export const setItem = (key: string, item: any): void => { 2 | if (typeof item === 'object') { 3 | localStorage.setItem(key, JSON.stringify(item)) 4 | } else if (typeof item === 'string') { 5 | try { 6 | localStorage.setItem(key, item) 7 | } catch (error) { 8 | throw new Error('item is not a object') 9 | } 10 | } 11 | } 12 | 13 | export const getItem = (key: string): any => { 14 | try { 15 | const item = localStorage.getItem(key) 16 | if (item === null) { 17 | return null 18 | } else { 19 | return JSON.parse(item) 20 | } 21 | } catch (error) { 22 | return localStorage.getItem(key) 23 | } 24 | } 25 | 26 | export const removeItem = (key: string): void => { 27 | localStorage.removeItem(key) 28 | } 29 | -------------------------------------------------------------------------------- /src/components/MyPagination/index.vue: -------------------------------------------------------------------------------- 1 | 14 | 25 | 26 | 31 | -------------------------------------------------------------------------------- /src/hooks/useMouseAdk.ts: -------------------------------------------------------------------------------- 1 | import { Ref } from 'vue' 2 | 3 | /** 4 | * 基于屏幕的中间点 计算鼠标的位置 5 | * 可以用于基本的跟随鼠标移动的情况 6 | * @param x Ref 鼠标的x位置 7 | * @param y Ref 鼠标的y位置 8 | * @offset offset 如果偏移度越小 则元素移动的幅度越大 反之同理 9 | * @returns {xPos,yPos} 返回一个对象包含x的位置和y的位置 类型为vue的ComputedRef 10 | */ 11 | export const useMousePointer = (x: Ref, y: Ref, offset: number) => { 12 | const xPos = computed(() => { 13 | let res = 0 14 | const halfVal = window.innerWidth / 2 15 | res = x.value - halfVal 16 | return res / offset 17 | }) 18 | const yPos = computed(() => { 19 | let res = 0 20 | const halfVal = window.innerHeight / 2 21 | res = y.value - halfVal 22 | return res / offset 23 | }) 24 | return { 25 | xPos, 26 | yPos 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/views/home/styles/MyTab.less: -------------------------------------------------------------------------------- 1 | @media screen and(min-width:@mobile-device) { 2 | .tab{ 3 | padding: @padding-general; 4 | background-color: @bgColor; 5 | .operate{ 6 | .font-normal(); 7 | width: 1rem; 8 | padding: 2rem; 9 | .flexbox(); 10 | .border-normal(); 11 | background-color: @linkColor; 12 | color: @hoverTextColor; 13 | margin: @margin-general; 14 | border-radius: @border-radius; 15 | transition: all ease 0.3s; 16 | .cusor-pointer(); 17 | .shadow(); 18 | &:hover{ 19 | transform: translateY(-20px); 20 | background-color: @themeColor; 21 | } 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/views/animedetail/components/Body/AnimeDetailInfoBox.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 22 | 23 | 26 | -------------------------------------------------------------------------------- /src/store/main.ts: -------------------------------------------------------------------------------- 1 | import { getItem, setItem, removeItem } from '@/utils/storage' 2 | import { defineStore } from 'pinia' 3 | 4 | export const useStore = defineStore('main', { 5 | state: () => { 6 | return { 7 | // 这里写变量 8 | user: { 9 | token: getItem('user') || '' 10 | }, 11 | cancel: {}, 12 | sourcePage: [], 13 | followBangumiCard: getItem('followBangumiCard') || true 14 | } 15 | }, 16 | actions: { 17 | // 这里写方法action 18 | setCancel(cancelObj) { 19 | this.cancel = cancelObj 20 | }, 21 | setUserToken(token: string) { 22 | this.user.token = token 23 | token ? setItem('user', token) : removeItem('user') 24 | }, 25 | setFollowBangumiCard(val: boolean) { 26 | this.followBangumiCard = val 27 | setItem('followBangumiCard', val) 28 | } 29 | } 30 | }) 31 | -------------------------------------------------------------------------------- /src/interface/theme.type.d.ts: -------------------------------------------------------------------------------- 1 | declare interface GlobalConfig { 2 | marginGeneral: number 3 | veryBigText: number 4 | bigText: number 5 | midText: number 6 | smallText: number 7 | verySamllText: number 8 | paddingGeneral: number 9 | borderRadius: number 10 | borderLine: number 11 | bgColor: string 12 | textColor: string 13 | globlBgColor: string 14 | tipTextColor: string 15 | warnningTextColor: string 16 | errorTextColor: string 17 | bgTextColor: string 18 | hoverColor: string 19 | hoverTextColor: string 20 | linkColor: string 21 | activeColor: string 22 | shadowColor: string 23 | themeColor: string 24 | backGroundImg: string 25 | backGroundImgBlur: number 26 | backGroundImgLight: number 27 | backGroundImgRepeat: string 28 | backGroundImgSize: string 29 | backgroundImgAttachment: string 30 | } 31 | -------------------------------------------------------------------------------- /src/utils/bangumiApi.ts: -------------------------------------------------------------------------------- 1 | import { useBangumiUser } from './../store/bangumiUser' 2 | import axios from 'axios' 3 | 4 | const baseUrl = process.env.VITE_APP_BGM_BASE_API 5 | 6 | // bangumi api 7 | const bangumiRequest: any = axios.create({ 8 | baseURL: baseUrl, //bam api 参考github上的 9 | timeout: 8000 10 | }) 11 | //请求拦截器 发请求之前,拦截器可以监测到 12 | bangumiRequest.interceptors.request.use((config: any) => { 13 | // config 配置对象 14 | // 先暂时不用这个 等我搞明白了登录和回调再来 15 | const bangumiStore = useBangumiUser() 16 | if (bangumiStore.access_token) { 17 | config.headers.Authorization = `Bearer ${bangumiStore.access_token}` 18 | } 19 | return config 20 | }) 21 | 22 | bangumiRequest.interceptors.response.use( 23 | (response: any) => { 24 | return response 25 | }, 26 | (err: any) => { 27 | return Promise.reject(err) 28 | } 29 | ) 30 | 31 | export default bangumiRequest 32 | -------------------------------------------------------------------------------- /src/views/animebgminfo/components/Other/BgmHeader.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 20 | 21 | 26 | -------------------------------------------------------------------------------- /src/views/home/styles/Home.less: -------------------------------------------------------------------------------- 1 | @media screen and(min-width:@mobile-device) { 2 | .my-info { 3 | width: 100%; 4 | .font-normal(); 5 | .border-normal(); 6 | overflow: hidden; 7 | min-height: 600px; 8 | transition: all 0.8s ease; 9 | background-color: @bgColor; 10 | margin: @margin-general 0; 11 | margin-top: @top-nav-bar-height; 12 | .info-deatil { 13 | display: flex; 14 | flex-direction: column; 15 | .all-info { 16 | padding: @padding-general; 17 | width: 100%; 18 | display: flex; 19 | flex-direction: column; 20 | color: @textColor; 21 | } 22 | } 23 | } 24 | } 25 | 26 | @media screen and (min-width:@smallpc-device) { 27 | .my-info { 28 | margin: @margin-general 0; 29 | .info-deatil { 30 | flex-direction: row; 31 | } 32 | } 33 | } -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | ADK-Blog 我的个人小站 6 | 7 | 8 | 9 | 13 | 14 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /public/tinymce/plugins/code/plugin.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * TinyMCE version 6.0.3 (2022-05-25) 3 | */ 4 | !function(){"use strict";tinymce.util.Tools.resolve("tinymce.PluginManager").add("code",(e=>((e=>{e.addCommand("mceCodeEditor",(()=>{(e=>{const o=(e=>e.getContent({source_view:!0}))(e);e.windowManager.open({title:"Source Code",size:"large",body:{type:"panel",items:[{type:"textarea",name:"code"}]},buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:{code:o},onSubmit:o=>{((e,o)=>{e.focus(),e.undoManager.transact((()=>{e.setContent(o)})),e.selection.setCursorLocation(),e.nodeChanged()})(e,o.getData().code),o.close()}})})(e)}))})(e),(e=>{const o=()=>e.execCommand("mceCodeEditor");e.ui.registry.addButton("code",{icon:"sourcecode",tooltip:"Source code",onAction:o}),e.ui.registry.addMenuItem("code",{icon:"sourcecode",text:"Source code",onAction:o})})(e),{})))}(); -------------------------------------------------------------------------------- /src/views/anime/index.vue: -------------------------------------------------------------------------------- 1 | 17 | 22 | 28 | 31 | -------------------------------------------------------------------------------- /src/components/TopNavBar/styles/Logo.less: -------------------------------------------------------------------------------- 1 | @media screen and (min-width:@mobile-device) { 2 | 3 | // logo样式 4 | .icon { 5 | cursor: pointer; 6 | width: 17rem; 7 | i { 8 | transition: all 1s ease; 9 | color: rgb(255, 255, 255); 10 | display: block; 11 | font-size: @big-text; 12 | padding: 0 @padding-general; 13 | } 14 | 15 | img { 16 | display: none; 17 | transition: 1s all ease; 18 | width: 100%; 19 | height: auto; 20 | } 21 | } 22 | } 23 | @media screen and (min-width:@smallpc-device) { 24 | .icon { 25 | img { 26 | display: block; 27 | transition: all 1s ease; 28 | } 29 | i{ 30 | transition: all 1s ease; 31 | display: none; 32 | } 33 | } 34 | } -------------------------------------------------------------------------------- /src/assets/styles/mixins.less: -------------------------------------------------------------------------------- 1 | @import url(@/assets/styles/global/color.less); 2 | @import url(@/assets/styles/global/variable.less); 3 | @import url(@/assets/styles/global/font.less); 4 | @import url(@/assets/styles/global/reset.less); 5 | @import url(@/assets/styles/global/public-class.less); 6 | @import url(@/assets/styles/global/eldeep.less); 7 | @import url(@/assets/styles/global/func.less); 8 | @import url(@/assets/styles/global/element-plus.less); 9 | 10 | // 动画 11 | @keyframes leftmove-loop { 12 | 13 | 0%, 14 | 100% { 15 | transform: translateX(0px) translateY(-50%); 16 | } 17 | 18 | 50% { 19 | transform: translateX(-15px) translateY(-50%); 20 | } 21 | } 22 | 23 | @keyframes rightmove-loop { 24 | 25 | 0%, 26 | 100% { 27 | transform: translateX(0px) translateY(-50%); 28 | } 29 | 30 | 50% { 31 | transform: translateX(15px) translateY(-50%); 32 | } 33 | } -------------------------------------------------------------------------------- /src/components/TagItem/TagItem.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 36 | 37 | 44 | -------------------------------------------------------------------------------- /src/views/animedetail/components/Body/styles/AnimeDetailInfo.less: -------------------------------------------------------------------------------- 1 | :deep(.el-descriptions__title) { 2 | font-size: @very-big-text; 3 | color: @textColor; 4 | } 5 | 6 | :deep(.el-descriptions__table) { 7 | tbody { 8 | 9 | tr { 10 | display: flex; 11 | justify-content: space-between; 12 | width: 100%; 13 | background-color: @bgColor; 14 | 15 | td { 16 | flex: 1; 17 | word-break: break-all; 18 | text-overflow: ellipsis; 19 | font-weight: 600 !important; 20 | } 21 | 22 | th { 23 | flex: 1; 24 | font-weight: 600 !important; 25 | } 26 | } 27 | } 28 | } 29 | 30 | :deep(.el-descriptions__body) { 31 | flex: 1; 32 | 33 | .el-descriptions__cell { 34 | background-color: @bgColor; 35 | color: @textColor; 36 | } 37 | } -------------------------------------------------------------------------------- /src/views/animedetail/components/Card/AnimeTags.vue: -------------------------------------------------------------------------------- 1 | 18 | 36 | 37 | 40 | -------------------------------------------------------------------------------- /src/components/TagsGroup/styles/TagsGroup-pc.less: -------------------------------------------------------------------------------- 1 | @media screen and (min-width:320px) and (max-width:768px){ 2 | .tags { 3 | display: flex; 4 | margin-top: .7143rem; 5 | height: 100%; 6 | width: 100%; 7 | flex-wrap: wrap; 8 | .tag { 9 | display: flex; 10 | cursor: pointer; 11 | align-items: center; 12 | text-align: center; 13 | color: rgb(@primaryTagTextColor); 14 | border-radius: 10px; 15 | font-size: .8571rem; 16 | margin-right: .7143rem; 17 | } 18 | } 19 | } 20 | @media screen and (min-width:768px){ 21 | .tags { 22 | display: flex; 23 | .tag { 24 | display: flex; 25 | cursor: pointer; 26 | align-items: center; 27 | text-align: center; 28 | color: rgb(@primaryTagTextColor); 29 | font-size: .8571rem; 30 | margin-right: .7143rem; 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/interface/AnimeFollow.type.d.ts: -------------------------------------------------------------------------------- 1 | declare interface FollowBangumiParams { 2 | userId?: string 3 | animeId: number 4 | totalEps?: number 5 | lastViewEpUrl?: string 6 | lastViewEpTime?: string 7 | animeName: string 8 | animeNameCn?: string 9 | animeDesc?: string 10 | animeRating?: string 11 | animeRank?: number 12 | animePic: string 13 | airDay: number 14 | } 15 | declare interface FollowProgressParams { 16 | id: string 17 | progress: number 18 | lastViewEpUrl?: string 19 | lastViewEpTime?: string 20 | } 21 | 22 | declare interface FollowBangumiVo { 23 | id: string 24 | userId: string 25 | animeId: string 26 | status: number 27 | progress: number 28 | totalEps: number 29 | lastOperate: string 30 | createDate: string 31 | lastViewEpUrl: string 32 | lastViewEpTime: string 33 | animeName: string 34 | animeNameCn: string 35 | animeDesc: string 36 | animeRating: string 37 | animeRank: string 38 | airDay: number 39 | animePic: string 40 | } 41 | -------------------------------------------------------------------------------- /src/views/create/Create.vue: -------------------------------------------------------------------------------- 1 | 20 | 21 | 26 | 32 | 35 | -------------------------------------------------------------------------------- /src/views/animebgminfo/components/Card/ListCollections.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 29 | -------------------------------------------------------------------------------- /src/views/index/styles/ArticleTimeLine.less: -------------------------------------------------------------------------------- 1 | .box { 2 | transition: background-color 1s ease; 3 | background-color: @bgColor; 4 | padding: @padding-general; 5 | overflow: hidden; 6 | border-radius: @border-radius; 7 | border: @textColor solid @border-line; 8 | .shadow(); 9 | .item { 10 | display: flex; 11 | color: @textColor; 12 | justify-content: space-between; 13 | background-color: @bgColor; 14 | padding: @padding-general; 15 | margin-top: @margin-general; 16 | border-radius: @border-radius; 17 | .shadow(); 18 | cursor: pointer; 19 | &:hover { 20 | color: @hoverTextColor; 21 | background-color: @hoverColor; 22 | } 23 | } 24 | .title { 25 | display: flex; 26 | flex-direction: column; 27 | .font-normal(); 28 | font-size: @big-text; 29 | 30 | span { 31 | font-size: @mid-text; 32 | } 33 | } 34 | } -------------------------------------------------------------------------------- /src/assets/styles/Layout/Layout.less: -------------------------------------------------------------------------------- 1 | #app { 2 | height: 100%; 3 | } 4 | 5 | .cotainer { 6 | width: 100%; 7 | position: relative; 8 | overflow: hidden; 9 | height: 100%; 10 | z-index: 1; 11 | transition: 0.5s ease all; 12 | background-color: @globlBgColor; 13 | background-size: @backGroundImgSize; 14 | background-repeat: @backGroundImgRepeat; 15 | background-attachment: @backgroundImgAttachment; 16 | .filter { 17 | width: 100%; 18 | height: 100%; 19 | position: absolute; 20 | overflow: hidden; 21 | z-index: -1000; 22 | backdrop-filter: blur(@backGroundImgBlur) brightness(@backGroundImgLight); 23 | } 24 | } 25 | 26 | .main { 27 | margin: 0 auto; 28 | width: 80%; 29 | color: @textColor; 30 | min-height: 600px; 31 | } 32 | 33 | @media screen and (min-width:320px) { 34 | .main { 35 | margin: 0 auto; 36 | width: 100%; 37 | color: @textColor; 38 | } 39 | } 40 | 41 | @media screen and (min-width:1440px) { 42 | .main { 43 | width: 80%; 44 | } 45 | } -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "esnext", 4 | "useDefineForClassFields": true, 5 | "module": "esnext", 6 | "moduleResolution": "node", 7 | "strict": false, 8 | "jsx": "preserve", 9 | "sourceMap": true, 10 | "resolveJsonModule": true, 11 | "skipLibCheck": true, 12 | "esModuleInterop": true, 13 | "suppressImplicitAnyIndexErrors": true, 14 | "lib": [ 15 | "esnext", 16 | "dom" 17 | ], 18 | "allowSyntheticDefaultImports": true, 19 | "baseUrl": ".", 20 | "outDir": "./dist", 21 | "paths": { 22 | "@/*": [ 23 | "./src/*" 24 | ] 25 | }, 26 | "types": [ 27 | "element-plus/global", 28 | "node" 29 | ] 30 | }, 31 | "exclude": [ 32 | "node_modules", 33 | "dist" 34 | ], 35 | "include": [ 36 | "src/**/*.ts", 37 | "src/**/*.d.ts", 38 | "src/**/*.tsx", 39 | "src/**/*.vue", 40 | "./**/*.d.ts" 41 | ], 42 | "references": [ 43 | { 44 | "path": "./tsconfig.node.json" 45 | } 46 | ], 47 | } -------------------------------------------------------------------------------- /src/hooks/useTag.ts: -------------------------------------------------------------------------------- 1 | import { getTagList, addTag } from '@/api/article' 2 | import { ElMessage } from 'element-plus' 3 | 4 | export const useTag = () => { 5 | // 选择tag 6 | const tags = ref([]) 7 | const options = ref([]) 8 | const getTag = async () => { 9 | const { data } = await getTagList() 10 | if (data.code === 200) { 11 | options.value = data.data 12 | } else { 13 | console.log('error') 14 | } 15 | } 16 | const addTagFn = async (val: string) => { 17 | // 接口 调用 添加tag 18 | await addTag(val) 19 | ElMessage.success('成功') 20 | getTag() 21 | } 22 | // 计算属性 移除已选择标签 23 | const canChooseTags = computed(() => { 24 | return options.value.filter(item => { 25 | let flag = true 26 | tags.value.forEach(tag => { 27 | if (tag.id === item.id) flag = false 28 | }) 29 | return flag 30 | }) 31 | }) 32 | onMounted(() => { 33 | getTag() 34 | }) 35 | return { 36 | tags, 37 | options, 38 | getTag, 39 | addTagFn, 40 | canChooseTags 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/views/animedetail/components/Body/styles/AnimeEp.less: -------------------------------------------------------------------------------- 1 | .eps { 2 | margin: @margin-general 0; 3 | color: @textColor; 4 | .font-normal(); 5 | 6 | &-title { 7 | font-size: @very-big-text; 8 | margin: @margin-general 0; 9 | } 10 | 11 | &-container { 12 | display: flex; 13 | flex-wrap: wrap; 14 | } 15 | 16 | &-container-ep { 17 | display: flex; 18 | } 19 | 20 | .noactive { 21 | background-color: rgb(136, 136, 136); 22 | } 23 | 24 | &-container-split { 25 | background-color: @hoverColor !important; 26 | color: @hoverTextColor !important; 27 | } 28 | } 29 | 30 | 31 | .ep { 32 | padding: 0.8rem; 33 | height: 1.5rem; 34 | line-height: 1.5rem; 35 | text-align: center; 36 | color: @textColor; 37 | background-color: @bgColor; 38 | cursor: pointer; 39 | margin: 0.2rem; 40 | .border-normal(); 41 | .flexbox(); 42 | 43 | &:hover { 44 | background-color: @hoverColor; 45 | color: @hoverTextColor; 46 | } 47 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | Copyright © 2022 3 | 4 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 5 | 6 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 7 | 8 | THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /src/views/home/components/MyLiked.vue: -------------------------------------------------------------------------------- 1 | 11 | 34 | -------------------------------------------------------------------------------- /src/views/home/components/MyCollect.vue: -------------------------------------------------------------------------------- 1 | 9 | 35 | -------------------------------------------------------------------------------- /src/components/MyPageHeader/MyPageHeader.vue: -------------------------------------------------------------------------------- 1 | 12 | 24 | 49 | -------------------------------------------------------------------------------- /src/views/anime/styles/AnimeOrderMenu.less: -------------------------------------------------------------------------------- 1 | .menu{ 2 | display: flex; 3 | flex-direction: column; 4 | &-item{ 5 | display: flex; 6 | text-align: center; 7 | align-items: center; 8 | margin-top: @margin-general; 9 | flex-wrap: wrap; 10 | &-title{ 11 | font-size: @big-text; 12 | text-align: left; 13 | width:8rem; 14 | } 15 | &-type{ 16 | padding:0 0.5rem; 17 | border-radius: @border-radius; 18 | cursor: pointer; 19 | 20 | color: @linkColor; 21 | &.active{ 22 | color: @hoverTextColor; 23 | background-color: @activeColor; 24 | } 25 | } 26 | } 27 | } 28 | 29 | // .title { 30 | // margin-right: 0.5rem; 31 | // } 32 | 33 | // .type { 34 | // margin-right: 5px; 35 | // color: rgb(6, 67, 158); 36 | // cursor: pointer; 37 | 38 | // &:hover { 39 | // text-decoration-line: underline; 40 | // } 41 | // } 42 | 43 | // .active { 44 | // font-weight: 600; 45 | // color: orange; 46 | // } -------------------------------------------------------------------------------- /src/views/index/components/TimeLine.vue: -------------------------------------------------------------------------------- 1 | 25 | 26 | 37 | 38 | 41 | -------------------------------------------------------------------------------- /public/tinymce/skins/content/default/content.min.css: -------------------------------------------------------------------------------- 1 | body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Open Sans','Helvetica Neue',sans-serif;line-height:1.4;margin:1rem}table{border-collapse:collapse}table:not([cellpadding]) td,table:not([cellpadding]) th{padding:.4rem}table[border]:not([border="0"]):not([style*=border-width]) td,table[border]:not([border="0"]):not([style*=border-width]) th{border-width:1px}table[border]:not([border="0"]):not([style*=border-style]) td,table[border]:not([border="0"]):not([style*=border-style]) th{border-style:solid}table[border]:not([border="0"]):not([style*=border-color]) td,table[border]:not([border="0"]):not([style*=border-color]) th{border-color:#ccc}figure{display:table;margin:1rem auto}figure figcaption{color:#999;display:block;margin-top:.25rem;text-align:center}hr{border-color:#ccc;border-style:solid;border-width:1px 0 0 0}code{background-color:#e8e8e8;border-radius:3px;padding:.1rem .2rem}.mce-content-body:not([dir=rtl]) blockquote{border-left:2px solid #ccc;margin-left:1.5rem;padding-left:1rem}.mce-content-body[dir=rtl] blockquote{border-right:2px solid #ccc;margin-right:1.5rem;padding-right:1rem} 2 | -------------------------------------------------------------------------------- /public/tinymce/skins/content/tinymce-5/content.min.css: -------------------------------------------------------------------------------- 1 | body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Open Sans','Helvetica Neue',sans-serif;line-height:1.4;margin:1rem}table{border-collapse:collapse}table:not([cellpadding]) td,table:not([cellpadding]) th{padding:.4rem}table[border]:not([border="0"]):not([style*=border-width]) td,table[border]:not([border="0"]):not([style*=border-width]) th{border-width:1px}table[border]:not([border="0"]):not([style*=border-style]) td,table[border]:not([border="0"]):not([style*=border-style]) th{border-style:solid}table[border]:not([border="0"]):not([style*=border-color]) td,table[border]:not([border="0"]):not([style*=border-color]) th{border-color:#ccc}figure{display:table;margin:1rem auto}figure figcaption{color:#999;display:block;margin-top:.25rem;text-align:center}hr{border-color:#ccc;border-style:solid;border-width:1px 0 0 0}code{background-color:#e8e8e8;border-radius:3px;padding:.1rem .2rem}.mce-content-body:not([dir=rtl]) blockquote{border-left:2px solid #ccc;margin-left:1.5rem;padding-left:1rem}.mce-content-body[dir=rtl] blockquote{border-right:2px solid #ccc;margin-right:1.5rem;padding-right:1rem} 2 | -------------------------------------------------------------------------------- /src/views/404.vue: -------------------------------------------------------------------------------- 1 | 17 | 20 | 23 | 48 | -------------------------------------------------------------------------------- /public/tinymce/skins/content/writer/content.min.css: -------------------------------------------------------------------------------- 1 | body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Open Sans','Helvetica Neue',sans-serif;line-height:1.4;margin:1rem auto;max-width:900px}table{border-collapse:collapse}table:not([cellpadding]) td,table:not([cellpadding]) th{padding:.4rem}table[border]:not([border="0"]):not([style*=border-width]) td,table[border]:not([border="0"]):not([style*=border-width]) th{border-width:1px}table[border]:not([border="0"]):not([style*=border-style]) td,table[border]:not([border="0"]):not([style*=border-style]) th{border-style:solid}table[border]:not([border="0"]):not([style*=border-color]) td,table[border]:not([border="0"]):not([style*=border-color]) th{border-color:#ccc}figure{display:table;margin:1rem auto}figure figcaption{color:#999;display:block;margin-top:.25rem;text-align:center}hr{border-color:#ccc;border-style:solid;border-width:1px 0 0 0}code{background-color:#e8e8e8;border-radius:3px;padding:.1rem .2rem}.mce-content-body:not([dir=rtl]) blockquote{border-left:2px solid #ccc;margin-left:1.5rem;padding-left:1rem}.mce-content-body[dir=rtl] blockquote{border-right:2px solid #ccc;margin-right:1.5rem;padding-right:1rem} 2 | -------------------------------------------------------------------------------- /public/tinymce/license.txt: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Ephox Corporation DBA Tiny Technologies, Inc. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/views/animebgminfo/components/Card/MyBangumiInfo.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 33 | -------------------------------------------------------------------------------- /src/components/CommentItem/styles/CommentPublic.less: -------------------------------------------------------------------------------- 1 | .user-avatar { 2 | width: 60px; 3 | height: 60px; 4 | border-radius: 50%; 5 | flex-shrink: 0; 6 | background-color: @bgColor; 7 | overflow: hidden; 8 | margin-right: 10px; 9 | } 10 | 11 | .username { 12 | display: flex; 13 | justify-content: space-between; 14 | align-items: flex-start; 15 | width: 100%; 16 | height: 100%; 17 | .username-time { 18 | h3 { 19 | font-size: @big-text; 20 | position: relative; 21 | display: flex; 22 | align-items: center; 23 | .tag { 24 | height: 100%; 25 | font-size: @small-text; 26 | color: white; 27 | padding: 0 @padding-general; 28 | .flexbox(); 29 | margin: 2px; 30 | border-radius: 20px; 31 | background-color: @themeColor; 32 | 33 | &2 { 34 | background-color: @linkColor; 35 | } 36 | } 37 | } 38 | p { 39 | margin-top: 5px; 40 | } 41 | } 42 | } -------------------------------------------------------------------------------- /src/interface/BangumiEnum.type.d.ts: -------------------------------------------------------------------------------- 1 | declare namespace BgmEnum { 2 | enum SortRole { 3 | rank = 'rank', 4 | date = 'date', 5 | title = 'title' 6 | } 7 | enum Type { 8 | Book = 1, 9 | Anime = 2, 10 | Music = 3, 11 | Game = 4, 12 | Real = 5 13 | } 14 | enum BroswerType { 15 | TV = 'tv', 16 | WEB = 'web', 17 | OVA = 'ova', 18 | MOVIE = 'movie', 19 | MISC = 'misc' 20 | } 21 | enum Status { 22 | Ok = 'Air', 23 | No = 'NA' 24 | } 25 | enum CollectionType { 26 | doing = '在看', 27 | on_hold = '搁置', 28 | wish = '想看', 29 | collect = '看过', 30 | dropped = '抛弃' 31 | } 32 | enum BangumiType { 33 | 小说Book = 1, 34 | 动漫Anime = 2, 35 | 音乐Musci = 3, 36 | 游戏Game = 4, 37 | 三次元Real = 6 38 | } 39 | enum WeekDayType { 40 | 星期天 = 7, 41 | 星期一 = 1, 42 | 星期二 = 2, 43 | 星期三 = 3, 44 | 星期四 = 4, 45 | 星期五 = 5, 46 | 星期六 = 6 47 | } 48 | enum ResponseGroup { 49 | Large = 'large', 50 | Medium = 'medium', 51 | Small = 'small' 52 | } 53 | enum CollectionTypeTwo { 54 | do = '在看', 55 | on_hold = '搁置', 56 | wish = '想看', 57 | collect = '看过', 58 | dropped = '抛弃' 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /src/assets/styles/global/color.less: -------------------------------------------------------------------------------- 1 | @bgColor: var(--bgColor, rgb(255, 255, 255)); 2 | @globlBgColor: var(--globlBgColor, rgb(236, 236, 236)); 3 | @textColor: var(--textColor, rgb(0, 0, 0)); 4 | @tipTextColor: var(--tipTextCol, rgb(160, 160, 160)); 5 | @warnningTextColor: var(--warnningTextColor, rgb(247, 44, 8)); 6 | @errorTextColor: var(--errorTextColor, rgb(255, 0, 0)); 7 | @bgTextColor: var(--bgTextColor, rgb(255, 255, 255)); 8 | @hoverColor: var(--hoverColor, rgb(250, 14, 73)); 9 | @hoverTextColor: var(--hoverTextColor, rgb(255, 255, 255)); 10 | @linkColor: var(--linkColor, rgb(14, 136, 250)); 11 | @activeColor: var(--activeColor, rgb(250, 14, 73)); 12 | @themeColor: var(--themeColor, rgb(250, 14, 73)); 13 | @shadowColor: var(--shadowColor, rgba(0, 0, 0, 0.3)); 14 | 15 | :root { 16 | --bgColor:@bgColor; 17 | --textColor:@textColor; 18 | --globlBgColor:@globlBgColor; 19 | --tipTextColor:@tipTextColor; 20 | --bgTextColor:@bgTextColor; 21 | --hoverColor:@hoverColor; 22 | --hoverTextColor:@hoverTextColor; 23 | --linkColor:@linkColor; 24 | --activeColor:@activeColor; 25 | --shadowColor:@shadowColor; 26 | --warnningTextColor:@warnningTextColor; 27 | --errorTextColor:@errorTextColor; 28 | } -------------------------------------------------------------------------------- /public/tinymce/skins/content/dark/content.min.css: -------------------------------------------------------------------------------- 1 | body{background-color:#222f3e;color:#fff;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Open Sans','Helvetica Neue',sans-serif;line-height:1.4;margin:1rem}a{color:#4099ff}table{border-collapse:collapse}table:not([cellpadding]) td,table:not([cellpadding]) th{padding:.4rem}table[border]:not([border="0"]):not([style*=border-width]) td,table[border]:not([border="0"]):not([style*=border-width]) th{border-width:1px}table[border]:not([border="0"]):not([style*=border-style]) td,table[border]:not([border="0"]):not([style*=border-style]) th{border-style:solid}table[border]:not([border="0"]):not([style*=border-color]) td,table[border]:not([border="0"]):not([style*=border-color]) th{border-color:#6d737b}figure{display:table;margin:1rem auto}figure figcaption{color:#8a8f97;display:block;margin-top:.25rem;text-align:center}hr{border-color:#6d737b;border-style:solid;border-width:1px 0 0 0}code{background-color:#6d737b;border-radius:3px;padding:.1rem .2rem}.mce-content-body:not([dir=rtl]) blockquote{border-left:2px solid #6d737b;margin-left:1.5rem;padding-left:1rem}.mce-content-body[dir=rtl] blockquote{border-right:2px solid #6d737b;margin-right:1.5rem;padding-right:1rem} 2 | -------------------------------------------------------------------------------- /src/utils/m3u8Change.ts: -------------------------------------------------------------------------------- 1 | import axios from 'axios' 2 | 3 | export const transformM3u8Utils = (videoUrl: string): Promise => { 4 | return new Promise((resolve, reject) => { 5 | try { 6 | axios.get(videoUrl).then(res => { 7 | const blob = new Blob([res.data]) 8 | const filereader = new FileReader() 9 | filereader.readAsText(blob, 'utf-8') 10 | filereader.onload = () => { 11 | const result = filereader.result as string 12 | const arr = result.split('\n') 13 | let count = 0 14 | const newarr = arr.map(item => { 15 | if (item.startsWith('http')) { 16 | item = `https://adkdream.top/otherSource/${item}` 17 | count++ 18 | return item 19 | } 20 | return item 21 | }) 22 | const newblob = new Blob([newarr.join('\n')], { type: 'text/plain' }) 23 | const newurl = URL.createObjectURL(newblob as Blob) 24 | if (count === 0) { 25 | resolve(videoUrl) 26 | } else { 27 | resolve(newurl) 28 | } 29 | } 30 | }) 31 | } catch (error) { 32 | reject(error) 33 | } 34 | }) 35 | } 36 | -------------------------------------------------------------------------------- /public/tinymce/skins/content/tinymce-5-dark/content.min.css: -------------------------------------------------------------------------------- 1 | body{background-color:#2f3742;color:#dfe0e4;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Open Sans','Helvetica Neue',sans-serif;line-height:1.4;margin:1rem}a{color:#4099ff}table{border-collapse:collapse}table:not([cellpadding]) td,table:not([cellpadding]) th{padding:.4rem}table[border]:not([border="0"]):not([style*=border-width]) td,table[border]:not([border="0"]):not([style*=border-width]) th{border-width:1px}table[border]:not([border="0"]):not([style*=border-style]) td,table[border]:not([border="0"]):not([style*=border-style]) th{border-style:solid}table[border]:not([border="0"]):not([style*=border-color]) td,table[border]:not([border="0"]):not([style*=border-color]) th{border-color:#6d737b}figure{display:table;margin:1rem auto}figure figcaption{color:#8a8f97;display:block;margin-top:.25rem;text-align:center}hr{border-color:#6d737b;border-style:solid;border-width:1px 0 0 0}code{background-color:#6d737b;border-radius:3px;padding:.1rem .2rem}.mce-content-body:not([dir=rtl]) blockquote{border-left:2px solid #6d737b;margin-left:1.5rem;padding-left:1rem}.mce-content-body[dir=rtl] blockquote{border-right:2px solid #6d737b;margin-right:1.5rem;padding-right:1rem} 2 | -------------------------------------------------------------------------------- /public/tinymce/plugins/visualblocks/plugin.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * TinyMCE version 6.0.3 (2022-05-25) 3 | */ 4 | !function(){"use strict";var t=tinymce.util.Tools.resolve("tinymce.PluginManager");const s=(t,s,o)=>{t.dom.toggleClass(t.getBody(),"mce-visualblocks"),o.set(!o.get()),((t,s)=>{t.dispatch("VisualBlocks",{state:s})})(t,o.get())},o=("visualblocks_default_state",t=>t.options.get("visualblocks_default_state"));const e=(t,s)=>o=>{o.setActive(s.get());const e=t=>o.setActive(t.state);return t.on("VisualBlocks",e),()=>t.off("VisualBlocks",e)};t.add("visualblocks",((t,l)=>{(t=>{(0,t.options.register)("visualblocks_default_state",{processor:"boolean",default:!1})})(t);const a=(t=>{let s=!1;return{get:()=>s,set:t=>{s=t}}})();((t,o,e)=>{t.addCommand("mceVisualBlocks",(()=>{s(t,0,e)}))})(t,0,a),((t,s)=>{const o=()=>t.execCommand("mceVisualBlocks");t.ui.registry.addToggleButton("visualblocks",{icon:"visualblocks",tooltip:"Show blocks",onAction:o,onSetup:e(t,s)}),t.ui.registry.addToggleMenuItem("visualblocks",{text:"Show blocks",icon:"visualblocks",onAction:o,onSetup:e(t,s)})})(t,a),((t,e,l)=>{t.on("PreviewFormats AfterPreviewFormats",(s=>{l.get()&&t.dom.toggleClass(t.getBody(),"mce-visualblocks","afterpreviewformats"===s.type)})),t.on("init",(()=>{o(t)&&s(t,0,l)}))})(t,0,a)}))}(); -------------------------------------------------------------------------------- /src/views/anime/styles/AnimeCarousel.less: -------------------------------------------------------------------------------- 1 | @media screen and (min-width: @mobile-device) { 2 | .carousel { 3 | .border-normal(); 4 | overflow: hidden; 5 | width: 100%; 6 | height: 100%; 7 | } 8 | 9 | :deep(.el-carousel__indicators) { 10 | display: none; 11 | } 12 | 13 | :deep(.el-carousel) { 14 | width: 100%; 15 | height: 30rem; 16 | } 17 | 18 | :deep(.el-carousel__container) { 19 | width: 100%; 20 | height: 100%; 21 | } 22 | } 23 | 24 | @media screen and (min-width: @smallpc-device) { 25 | 26 | // 重置轮播图的下面的水平线样式 27 | :deep(.el-carousel__indicators) { 28 | display: block; 29 | 30 | .el-carousel__button { 31 | width: 18px !important; 32 | height: 18px !important; 33 | background: url(../../img/lunbo.png) no-repeat; 34 | background-size: cover; 35 | } 36 | 37 | .is-active { 38 | .el-carousel__button { 39 | background: url(../../img/lunbo-active.png) no-repeat; 40 | background-size: cover; 41 | } 42 | } 43 | } 44 | } 45 | 46 | :deep(.el-carousel) { 47 | width: 100%; 48 | height: 40rem; 49 | } 50 | 51 | :deep(.el-carousel__item) { 52 | display: flex !important; 53 | justify-content: center; 54 | align-items: center; 55 | } -------------------------------------------------------------------------------- /public/tinymce/skins/content/document/content.min.css: -------------------------------------------------------------------------------- 1 | @media screen{html{background:#f4f4f4;min-height:100%}}body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Open Sans','Helvetica Neue',sans-serif}@media screen{body{background-color:#fff;box-shadow:0 0 4px rgba(0,0,0,.15);box-sizing:border-box;margin:1rem auto 0;max-width:820px;min-height:calc(100vh - 1rem);padding:4rem 6rem 6rem 6rem}}table{border-collapse:collapse}table:not([cellpadding]) td,table:not([cellpadding]) th{padding:.4rem}table[border]:not([border="0"]):not([style*=border-width]) td,table[border]:not([border="0"]):not([style*=border-width]) th{border-width:1px}table[border]:not([border="0"]):not([style*=border-style]) td,table[border]:not([border="0"]):not([style*=border-style]) th{border-style:solid}table[border]:not([border="0"]):not([style*=border-color]) td,table[border]:not([border="0"]):not([style*=border-color]) th{border-color:#ccc}figure figcaption{color:#999;margin-top:.25rem;text-align:center}hr{border-color:#ccc;border-style:solid;border-width:1px 0 0 0}.mce-content-body:not([dir=rtl]) blockquote{border-left:2px solid #ccc;margin-left:1.5rem;padding-left:1rem}.mce-content-body[dir=rtl] blockquote{border-right:2px solid #ccc;margin-right:1.5rem;padding-right:1rem} 2 | -------------------------------------------------------------------------------- /src/views/index/components/ArticleTimeLine.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 36 | 37 | 40 | -------------------------------------------------------------------------------- /src/hooks/useEmoji.ts: -------------------------------------------------------------------------------- 1 | import { useGlobalConfigStore } from '@/store/globalConfig' 2 | import { isMobile } from '@/utils/mobile' 3 | 4 | export const useEmoji = () => { 5 | const config = useGlobalConfigStore() 6 | const optionsName = { 7 | 'Smileys & Emotion': '笑脸&表情', 8 | 'Food & Drink': '食物&饮料', 9 | 'People & Body': '人物&身体', 10 | 'Animals & Nature': '动物&自然', 11 | 'Travel & Places': '旅行&地点', 12 | Objects: '物品', 13 | Symbols: '符号', 14 | Flags: '旗帜', 15 | Activities: '活动' 16 | } 17 | const disableGroup = ['活动', '旗帜', '符号', '物品'] 18 | const customSize = { 19 | 'V3Emoji-width': isMobile() ? '60vw' : '25rem', 20 | 'V3Emoji-height': isMobile() ? '20rem' : '25rem', 21 | 'V3Emoji-fontSize': isMobile() ? '16px' : '18px', 22 | 'V3Emoji-itemSize': isMobile() ? '24px' : '40px' 23 | } 24 | const customTheme = { 25 | 'V3Emoji-hoverColor': config.config.hoverColor, 26 | 'V3Emoji-activeColor': config.config.activeColor, 27 | 'V3Emoji-shadowColor': config.config.shadowColor, 28 | 'V3Emoji-backgroundColor': config.config.backgroundColor, 29 | 'V3Emoji-fontColor': config.config.textColor 30 | } 31 | return { 32 | optionsName, 33 | disableGroup, 34 | customSize, 35 | customTheme 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/views/animedetail/components/Body/HumanBoxCard.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 38 | 39 | 42 | -------------------------------------------------------------------------------- /src/store/bangumiUser.ts: -------------------------------------------------------------------------------- 1 | import { getItem, setItem, removeItem } from '@/utils/storage' 2 | import { defineStore } from 'pinia' 3 | 4 | export const useBangumiUser = defineStore('bangumi', { 5 | state: () => { 6 | return { 7 | // 这里写变量 8 | access_token: getItem('bangumi_access_token') || '', 9 | refresh_token: getItem('bangumi_refresh_token') || '', 10 | bgm_user_info: getItem('bangumi_user_info') || null 11 | } 12 | }, 13 | actions: { 14 | // 这里写方法action 15 | setBangumiToken(accesstoken: string, refreshtoken: string) { 16 | this.access_token = accesstoken 17 | this.refresh_token = refreshtoken 18 | setItem('bangumi_access_token', accesstoken) 19 | setItem('bangumi_refresh_token', refreshtoken) 20 | }, 21 | removeBangumiToken() { 22 | removeItem('bangumi_access_token') 23 | removeItem('bangumi_refresh_token') 24 | this.access_token = '' 25 | this.refresh_token = '' 26 | }, 27 | setBangumiUserInfo(bgmUserInfo: Bangumi.BangumiMyInfo) { 28 | this.bgm_user_info = bgmUserInfo 29 | setItem('bangumi_user_info', bgmUserInfo) 30 | }, 31 | removeBangumiUserInfo() { 32 | this.bgm_user_info = {} 33 | removeItem('bangumi_user_info') 34 | } 35 | } 36 | }) 37 | -------------------------------------------------------------------------------- /src/views/articlelist/styles/Search.less: -------------------------------------------------------------------------------- 1 | @keyframes jello { 2 | 0% { 3 | transform: skew(0deg 0deg); 4 | } 5 | 6 | 30% { 7 | transform: skew(-25deg -25deg); 8 | } 9 | 10 | 40% { 11 | transform: skew(15deg, 15deg); 12 | } 13 | 14 | 50% { 15 | transform: skew(-15deg, -15deg); 16 | } 17 | 18 | 65% { 19 | transform: skew(5deg, 5deg); 20 | } 21 | 22 | 75% { 23 | transform: skew(-5deg, -5deg); 24 | } 25 | 26 | 100% { 27 | transform: skew(0deg 0deg); 28 | } 29 | } 30 | 31 | .search { 32 | display: flex; 33 | padding: @padding-general; 34 | align-items: center; 35 | width: 60%; 36 | .search-btn { 37 | width: 68px; 38 | height: 55px; 39 | background: url(@/assets/img/search.png) no-repeat; 40 | background-size: contain; 41 | transition: all 0.3s ease-in-out; 42 | cursor: pointer; 43 | &:hover { 44 | background: url(@/assets/img/search-hover.png) no-repeat; 45 | background-size: contain; 46 | animation: jello 0.5s both; 47 | } 48 | } 49 | 50 | .input-search { 51 | margin-right: @margin-general; 52 | } 53 | } -------------------------------------------------------------------------------- /src/views/Layout.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | 23 | 44 | 45 | 48 | -------------------------------------------------------------------------------- /src/views/article/components/ToolBars.vue: -------------------------------------------------------------------------------- 1 | 15 | 40 | 43 | -------------------------------------------------------------------------------- /src/views/articlelist/components/SearchItem.vue: -------------------------------------------------------------------------------- 1 | 20 | 42 | 43 | 46 | -------------------------------------------------------------------------------- /src/views/animedetail/styles/Animedetail.less: -------------------------------------------------------------------------------- 1 | @media screen and(min-width:@mobile-device) { 2 | .big-container { 3 | padding: 0.3rem; 4 | margin-top: @top-nav-bar-height; 5 | color: @textColor; 6 | .font-normal(); 7 | 8 | .content{ 9 | .flex(column); 10 | margin-top: @margin-general; 11 | .left-content{ 12 | width: 100%; 13 | background-color: @bgColor; 14 | .border-normal(); 15 | } 16 | .right-content{ 17 | flex: 1; 18 | width: 100%; 19 | } 20 | .empty{ 21 | background-color: @bgColor; 22 | .border-normal(); 23 | width: 100%; 24 | height: 100%; 25 | } 26 | } 27 | } 28 | 29 | } 30 | 31 | @media screen and(min-width:@smallpc-device) { 32 | .big-container { 33 | margin-top: @margin-general; 34 | .content{ 35 | flex-direction: row; 36 | justify-content: space-between; 37 | .left-content{ 38 | width: 75%; 39 | } 40 | .right-content{ 41 | max-width: 40rem; 42 | flex: 1; 43 | width: unset; 44 | } 45 | } 46 | } 47 | 48 | } -------------------------------------------------------------------------------- /src/views/home/HomeIndex.vue: -------------------------------------------------------------------------------- 1 | 23 | 26 | 35 | 36 | 39 | -------------------------------------------------------------------------------- /src/interface/Params.type.d.ts: -------------------------------------------------------------------------------- 1 | declare global { 2 | interface PageParams { 3 | page: number 4 | pagesize: number 5 | authorId?: string 6 | tagIds?: Array 7 | year?: string 8 | month?: string 9 | orderRole?: string 10 | keyword?: string 11 | //该选项是用于筛选文章板块的 可选1是 水文日常 2是 技术文章 3是 个人 笔记 4是 素材或者分享 5是 其他 6是 设计排版 参考 7是 素材资源 文章分享 12 | pannel?: number 13 | //pic画廊的筛选项 14 | tag?: number 15 | isOrigin?: number 16 | } 17 | interface CommentParams { 18 | articleId: string 19 | toUid?: string 20 | parentId?: string 21 | content: string 22 | authorId: string 23 | } 24 | interface MessageParamsForADK { 25 | authorName: string 26 | contact: string 27 | content: string 28 | avatar: string 29 | } 30 | interface RegisterParams { 31 | username: string 32 | nickname: string 33 | password: string 34 | } 35 | interface UpdateUserInfoParams { 36 | avatar: string 37 | nickname: string 38 | introduce: string 39 | banner: string 40 | gender: string 41 | email: string 42 | } 43 | interface LikeOrCollectParams { 44 | articleId: string 45 | flag: boolean 46 | } 47 | interface PicParams { 48 | id?: string 49 | title: string 50 | summary: string 51 | url: string 52 | isOrigin: number 53 | tag?: number 54 | } 55 | } 56 | export {} 57 | -------------------------------------------------------------------------------- /src/assets/styles/global/reset.less: -------------------------------------------------------------------------------- 1 | * { 2 | box-sizing: border-box; 3 | } 4 | 5 | html { 6 | height: 100%; 7 | font-size: 14px; 8 | } 9 | 10 | body { 11 | cursor: url(../../img/Arrow.cur), auto; 12 | margin: 0; 13 | font: 1em/1.4 'maoken', 'urafont', 'Microsoft Yahei', 'PingFang SC', 'Avenir', 'Segoe UI', 'Hiragino Sans GB', 'STHeiti', 'Microsoft Sans Serif', 'WenQuanYi Micro Hei', sans-serif 14 | } 15 | 16 | ul, 17 | h1, 18 | h3, 19 | h4, 20 | p, 21 | dl, 22 | dd { 23 | padding: 0; 24 | margin: 0; 25 | } 26 | 27 | a { 28 | text-decoration: none; 29 | outline: none; 30 | 31 | &:link { 32 | color: @themeColor; 33 | } 34 | 35 | &:visited { 36 | color: @themeColor; 37 | } 38 | } 39 | 40 | i { 41 | font-style: normal; 42 | } 43 | 44 | //防止tainwind 重置El-button样式 45 | input[type="text"], 46 | input[type="search"], 47 | input[type="password"], 48 | input[type="checkbox"] { 49 | padding: 0; 50 | -webkit-appearance: none; 51 | 52 | &::placeholder { 53 | color: @textColor; 54 | } 55 | } 56 | 57 | img { 58 | max-width: 100%; 59 | max-height: 100%; 60 | vertical-align: middle; 61 | } 62 | 63 | ul { 64 | list-style: none; 65 | } 66 | 67 | li { 68 | list-style: none; 69 | } 70 | 71 | img { 72 | // width: 100%; 73 | // height: 100%; 74 | object-fit: cover; 75 | } -------------------------------------------------------------------------------- /src/views/animedetail/components/Card/styles/RataingBox.less: -------------------------------------------------------------------------------- 1 | @media screen and(min-width:@mobile-device) { 2 | .rating { 3 | margin: @margin-general 0; 4 | background-color: @bgColor; 5 | padding: @padding-general; 6 | display: flex; 7 | flex-direction: column; 8 | position: relative; 9 | .border-normal(); 10 | .shadow(); 11 | #raitingChart { 12 | height: 22rem; 13 | } 14 | &-title{ 15 | font-size: @very-big-text; 16 | } 17 | &-score{ 18 | position: absolute; 19 | top: 60px; 20 | &-title{ 21 | display: flex; 22 | font-size: @big-text; 23 | .tag{ 24 | font-size: @small-text; 25 | background-color: @themeColor; 26 | .flexbox(); 27 | padding:0 0.6rem; 28 | margin-left: 0.4rem; 29 | border-radius: @border-radius; 30 | color: @hoverTextColor; 31 | } 32 | .total{ 33 | font-size: @very-samll-text; 34 | } 35 | } 36 | } 37 | } 38 | } 39 | @media screen and(min-width:@smallpc-device) { 40 | .rating { 41 | margin: @margin-general; 42 | margin-top: 0; 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/assets/styles/global/public-class.less: -------------------------------------------------------------------------------- 1 | .text-line-show(@line) { 2 | word-break: break-all; 3 | text-overflow: ellipsis; 4 | display: -webkit-box; 5 | -webkit-box-orient: vertical; 6 | -webkit-line-clamp: @line; 7 | overflow: hidden; 8 | } 9 | 10 | .text-line-show-1 { 11 | .text-line-show(1) 12 | } 13 | 14 | .text-line-show-2 { 15 | .text-line-show(2) 16 | } 17 | 18 | .text-line-show-3 { 19 | .text-line-show(3) 20 | } 21 | 22 | .text-line-show-6 { 23 | .text-line-show(6) 24 | } 25 | 26 | // 自定义滚动条 27 | .myscrollbar::-webkit-scrollbar-track { 28 | -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3); 29 | background-color: #F5F5F5; 30 | } 31 | 32 | .myscrollbar::-webkit-scrollbar { 33 | width: 10px; 34 | height: 10px; 35 | background-color: #F5F5F5; 36 | } 37 | 38 | .myscrollbar::-webkit-scrollbar-thumb { 39 | background-color: orangered; 40 | background-image: -webkit-linear-gradient(45deg, 41 | rgba(255, 255, 255, .2) 25%, 42 | transparent 25%, 43 | transparent 50%, 44 | rgba(255, 255, 255, .2) 50%, 45 | rgba(255, 255, 255, .2) 75%, 46 | transparent 75%, 47 | transparent) 48 | } 49 | 50 | // 路由激活类 51 | .router-active { 52 | border-left: 3px solid pink; 53 | background-color: rgba(255, 233, 237, 0.521); 54 | } -------------------------------------------------------------------------------- /src/views/article/components/BottomItem.vue: -------------------------------------------------------------------------------- 1 | 25 | 43 | 44 | 47 | -------------------------------------------------------------------------------- /src/interface/EnumExport.ts: -------------------------------------------------------------------------------- 1 | export enum SortRole { 2 | rank = 'rank', 3 | date = 'date', 4 | title = 'title' 5 | } 6 | export enum Type { 7 | Book = 1, 8 | Anime = 2, 9 | Music = 3, 10 | Game = 4, 11 | Real = 5 12 | } 13 | export enum BroswerType { 14 | TV = 'tv', 15 | WEB = 'web', 16 | OVA = 'ova', 17 | MOVIE = 'movie', 18 | MISC = 'misc' 19 | } 20 | export enum Status { 21 | Ok = 'Air', 22 | No = 'NA' 23 | } 24 | export enum CollectionType { 25 | doing = '在看', 26 | on_hold = '搁置', 27 | wish = '想看', 28 | collect = '看过', 29 | dropped = '抛弃' 30 | } 31 | export enum BangumiType { 32 | 小说Book = 1, 33 | 动漫Anime = 2, 34 | 音乐Musci = 3, 35 | 游戏Game = 4, 36 | 三次元Real = 6 37 | } 38 | export enum WeekDayType { 39 | 星期天 = 7, 40 | 星期一 = 1, 41 | 星期二 = 2, 42 | 星期三 = 3, 43 | 星期四 = 4, 44 | 星期五 = 5, 45 | 星期六 = 6 46 | } 47 | export enum ResponseGroup { 48 | Large = 'large', 49 | Medium = 'medium', 50 | Small = 'small' 51 | } 52 | export enum CollectionTypeTwo { 53 | do = '在看', 54 | on_hold = '搁置', 55 | wish = '想看', 56 | collect = '看过', 57 | dropped = '抛弃' 58 | } 59 | 60 | export enum PicTag { 61 | 默认板块 = 0, 62 | 动漫二次元 = 1, 63 | 风景 = 2, 64 | 三次元 = 3, 65 | 排版设计 = 4, 66 | 素材 = 5 67 | } 68 | 69 | export enum ArticlePannel { 70 | 默认板块 = 0, 71 | 水文日常 = 1, 72 | 技术文章 = 2, 73 | 个人笔记 = 3, 74 | 素材分享 = 4, 75 | 其他 = 5, 76 | 设计参考 = 6, 77 | 素材资源 = 7 78 | } 79 | -------------------------------------------------------------------------------- /src/views/anime/styles/AnimeBrowser.less: -------------------------------------------------------------------------------- 1 | @media screen and (min-width:@mobile-device) { 2 | .broswer{ 3 | display: flex; 4 | flex-direction: column; 5 | .border-normal(); 6 | background-color: @bgColor; 7 | .shadow(); 8 | padding: @padding-general; 9 | .font-normal(); 10 | &-title{ 11 | display: flex; 12 | flex-direction: column; 13 | font-size: @very-big-text; 14 | align-items: flex-start; 15 | &__tip{ 16 | font-size: @small-text; 17 | color: @tipTextColor; 18 | } 19 | } 20 | &-inner{ 21 | transition: all 0.4s ease; 22 | padding: @padding-general 0; 23 | display: grid; 24 | grid-template-columns: repeat(2,auto); 25 | justify-items: stretch; 26 | align-items: stretch; 27 | gap: @margin-general @margin-general; 28 | } 29 | &-loading{ 30 | align-self: center; 31 | } 32 | } 33 | } 34 | @media screen and (min-width:@smallpc-device){ 35 | .broswer{ 36 | &-inner{ 37 | grid-template-columns: repeat(3,auto); 38 | } 39 | } 40 | } 41 | @media screen and (min-width:@normal-device){ 42 | .broswer{ 43 | &-inner{ 44 | grid-template-columns: repeat(4,auto); 45 | } 46 | } 47 | } -------------------------------------------------------------------------------- /src/views/home/components/MyTab.vue: -------------------------------------------------------------------------------- 1 | 27 | 49 | 52 | -------------------------------------------------------------------------------- /public/tinymce/plugins/nonbreaking/plugin.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * TinyMCE version 6.0.3 (2022-05-25) 3 | */ 4 | !function(){"use strict";var n=tinymce.util.Tools.resolve("tinymce.PluginManager");const e=n=>e=>typeof e===n,a=e("boolean"),o=e("number"),t=n=>e=>e.options.get(n),i=t("nonbreaking_force_tab"),r=t("nonbreaking_wrap"),s=(n,e)=>{let a="";for(let o=0;o{const a=r(n)||n.plugins.visualchars?`${s(" ",e)}`:s(" ",e);n.undoManager.transact((()=>n.insertContent(a)))};var l=tinymce.util.Tools.resolve("tinymce.util.VK");n.add("nonbreaking",(n=>{(n=>{const e=n.options.register;e("nonbreaking_force_tab",{processor:n=>a(n)?{value:n?3:0,valid:!0}:o(n)?{value:n,valid:!0}:{valid:!1,message:"Must be a boolean or number."},default:!1}),e("nonbreaking_wrap",{processor:"boolean",default:!0})})(n),(n=>{n.addCommand("mceNonBreaking",(()=>{c(n,1)}))})(n),(n=>{const e=()=>n.execCommand("mceNonBreaking");n.ui.registry.addButton("nonbreaking",{icon:"non-breaking",tooltip:"Nonbreaking space",onAction:e}),n.ui.registry.addMenuItem("nonbreaking",{icon:"non-breaking",text:"Nonbreaking space",onAction:e})})(n),(n=>{const e=i(n);e>0&&n.on("keydown",(a=>{if(a.keyCode===l.TAB&&!a.isDefaultPrevented()){if(a.shiftKey)return;a.preventDefault(),a.stopImmediatePropagation(),c(n,e)}}))})(n)}))}(); -------------------------------------------------------------------------------- /src/utils/tools.ts: -------------------------------------------------------------------------------- 1 | export function isValidKey( 2 | key: string | number | symbol, 3 | object: object 4 | ): key is keyof typeof object { 5 | return key in object 6 | } 7 | /** 8 | * 用于将驼峰命名法的变量转换为横杠线连接的命名 9 | * @param val 一个驼峰的string属性 10 | */ 11 | export const humpToLine = (val: string) => { 12 | if (val === val.toLowerCase()) { 13 | // 全是小写 不需要转换 14 | return val 15 | } else { 16 | let res = '' 17 | for (let i = 0; i < val.length; i++) { 18 | if (val.charCodeAt(i) > 65 && val.charCodeAt(i) < 90) { 19 | res += `-${val[i].toLowerCase()}` 20 | } else { 21 | res += val[i] 22 | } 23 | } 24 | return res 25 | } 26 | } 27 | /** 28 | * 自行封装一个节流函数 29 | * @param time 节流时间 30 | * @param fn 节流函数 31 | */ 32 | export const throttle = (time: number, fn: () => any) => { 33 | let flag = true 34 | return function (...args: any) { 35 | if (!flag) return 36 | flag = false 37 | setTimeout(() => { 38 | fn.apply(this, args) 39 | flag = true 40 | }, time) 41 | } 42 | } 43 | /** 44 | * 自行封装一个防抖 45 | * @param time 防抖时间 46 | * @param fn 防抖函数 47 | */ 48 | export const debounce = (time: number, fn: () => any) => { 49 | const timmer = null 50 | return function (...args: any) { 51 | clearTimeout(timmer) 52 | setTimeout(() => { 53 | fn.apply(this, args) 54 | }, time) 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /src/views/index/components/SubTitle.vue: -------------------------------------------------------------------------------- 1 | 19 | 56 | -------------------------------------------------------------------------------- /src/views/anime/components/AnimeHeader.vue: -------------------------------------------------------------------------------- 1 | 38 | 39 | 43 | 44 | 47 | -------------------------------------------------------------------------------- /src/api/pic.ts: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | /** 4 | * @Param pageParams 分页参数 用于获取图片 5 | */ 6 | export const getPics = (pageParams: PageParams) => { 7 | return request({ method: 'post', url: '/api/pic/getPics', data: pageParams }) 8 | } 9 | /** 10 | * 添加画廊图片 11 | * @param picParams 画廊图片所需的参数 12 | * @returns 13 | */ 14 | export const addPic = (picParams: PicParams) => { 15 | return request({ method: 'post', url: '/api/pic/addPic', data: picParams }) 16 | } 17 | /** 18 | * 点赞图片 无需登录 一分钟最多20次 19 | * @param picId 图片id 20 | * @returns 21 | */ 22 | export const likePic = (picId: string) => { 23 | return request({ 24 | method: 'get', 25 | url: '/api/pic/likePic', 26 | params: { 27 | id: picId 28 | } 29 | }) 30 | } 31 | 32 | /** 33 | * 修改图片信息接口 34 | * @param picParams 修改图片的参数 35 | * @returns 36 | */ 37 | export const updateMyPic = (picParams: PicParams) => { 38 | return request({ method: 'post', url: '/api/pic/updateMyPic', data: picParams }) 39 | } 40 | 41 | /** 42 | * 删除自己发布的图片 43 | * @param id 图片的id 44 | * @returns 45 | */ 46 | export const deleteMyPic = (id: string | number) => { 47 | return request({ method: 'post', url: `/api/pic/deleteMyPic/${id}` }) 48 | } 49 | /** 50 | * 获取发布的图片 51 | * @param pageParams 分页参数 获取自己发布的图片 52 | * @returns 53 | */ 54 | export const getMyPic = (pageParams: PageParams) => { 55 | return request({ method: 'post', url: `/api/pic/getMyPics`, data: pageParams }) 56 | } 57 | -------------------------------------------------------------------------------- /public/tinymce/plugins/pagebreak/plugin.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * TinyMCE version 6.0.3 (2022-05-25) 3 | */ 4 | !function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),a=tinymce.util.Tools.resolve("tinymce.Env");const t=e=>a=>a.options.get(e),r=t("pagebreak_separator"),n=t("pagebreak_split_block"),o="mce-pagebreak",s=e=>{const t=``;return e?`

${t}

`:t};e.add("pagebreak",(e=>{(e=>{const a=e.options.register;a("pagebreak_separator",{processor:"string",default:"\x3c!-- pagebreak --\x3e"}),a("pagebreak_split_block",{processor:"boolean",default:!1})})(e),(e=>{e.addCommand("mcePageBreak",(()=>{e.insertContent(s(n(e)))}))})(e),(e=>{const a=()=>e.execCommand("mcePageBreak");e.ui.registry.addButton("pagebreak",{icon:"page-break",tooltip:"Page break",onAction:a}),e.ui.registry.addMenuItem("pagebreak",{text:"Page break",icon:"page-break",onAction:a})})(e),(e=>{const a=r(e),t=()=>n(e),c=new RegExp(a.replace(/[\?\.\*\[\]\(\)\{\}\+\^\$\:]/g,(e=>"\\"+e)),"gi");e.on("BeforeSetContent",(e=>{e.content=e.content.replace(c,s(t()))})),e.on("PreInit",(()=>{e.serializer.addNodeFilter("img",(r=>{let n,s,c=r.length;for(;c--;)if(n=r[c],s=n.attr("class"),s&&-1!==s.indexOf(o)){const r=n.parent;if(e.schema.getBlockElements()[r.name]&&t()){r.type=3,r.value=a,r.raw=!0,n.remove();continue}n.type=3,n.value=a,n.raw=!0}}))}))})(e),(e=>{e.on("ResolveName",(a=>{"IMG"===a.target.nodeName&&e.dom.hasClass(a.target,o)&&(a.name="pagebreak")}))})(e)}))}(); -------------------------------------------------------------------------------- /src/interface/Article.type.d.ts: -------------------------------------------------------------------------------- 1 | declare global { 2 | interface ArticleBody { 3 | contentHtml?: string | void 4 | html?: string 5 | content: string | void 6 | } 7 | interface ArticleReqParams { 8 | id?: string 9 | body: ArticleBody 10 | summary: string 11 | articleName: string 12 | tags: Array 13 | banner: string 14 | pannel: number 15 | } 16 | interface Content { 17 | html: string | undefined 18 | text: string | undefined 19 | } 20 | interface ArticleItemInfo { 21 | articleName: string 22 | author: string 23 | authorVo: UserEasy 24 | banner: string 25 | body?: ArticleBody 26 | commentCounts: number 27 | createDate: string 28 | id: string 29 | summary: string 30 | tags: Array 31 | viewCounts: number 32 | isLiked: boolean 33 | isCollected: boolean 34 | likeCounts: number 35 | collectCounts: number 36 | isPrivate: number 37 | pannel: number 38 | } 39 | 40 | interface Banner { 41 | banner: string 42 | id: string 43 | articleName: string 44 | } 45 | interface ArticleTime { 46 | date: string 47 | num: number 48 | } 49 | interface Tag { 50 | id: number 51 | tagName: string 52 | } 53 | interface PicVo { 54 | title: string 55 | summary: string 56 | url: string 57 | author: UserEasy 58 | createTime: stirng 59 | id: string 60 | origin: number 61 | likes: number 62 | tag: number 63 | } 64 | } 65 | 66 | export {} 67 | -------------------------------------------------------------------------------- /src/views/home/components/BannerItem.vue: -------------------------------------------------------------------------------- 1 | 19 | 43 | 44 | 59 | -------------------------------------------------------------------------------- /src/views/anime/styles/AnimePage.less: -------------------------------------------------------------------------------- 1 | @media screen and (min-width:@mobile-device) { 2 | .container{ 3 | width: 100%; 4 | display: flex; 5 | flex-direction: column; 6 | margin: @margin-general auto; 7 | margin-top: @top-nav-bar-height; 8 | background-color: @bgColor; 9 | padding: @padding-general; 10 | .border-normal(); 11 | &-second{ 12 | display: flex; 13 | flex-direction: column; 14 | margin: @margin-general 0; 15 | height: 80rem; 16 | &-carousel{ 17 | width: 100%; 18 | height: 40rem; 19 | margin-right: @margin-general; 20 | } 21 | &-myanime{ 22 | width: 30%; 23 | height: 100%; 24 | } 25 | &-tab{ 26 | margin-top: @padding-general; 27 | flex: 1; 28 | .border-normal(); 29 | overflow: hidden; 30 | } 31 | } 32 | } 33 | } 34 | @media screen and (min-width:@smallpc-device) { 35 | .container{ 36 | margin-top: @margin-general; 37 | &-second{ 38 | flex-direction: row; 39 | height: 40rem; 40 | &-carousel{ 41 | width: 70%; 42 | flex-shrink: 0; 43 | margin-right: @margin-general; 44 | } 45 | &-tab{ 46 | margin-top: 0; 47 | } 48 | } 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "browser": true, 4 | "es2021": true 5 | }, 6 | "extends": [ 7 | "eslint:recommended", 8 | "plugin:vue/essential", 9 | "plugin:@typescript-eslint/recommended", 10 | "plugin:prettier/recommended" 11 | ], 12 | "parser": "vue-eslint-parser", 13 | "parserOptions": { 14 | "ecmaVersion": "latest", 15 | "parser": "@typescript-eslint/parser", 16 | "sourceType": "module" 17 | }, 18 | "plugins": [ 19 | "vue", 20 | "@typescript-eslint" 21 | ], 22 | "rules": { 23 | "no-undef": "off", 24 | "vue/no-mutating-props": "off", 25 | "@typescript-eslint/no-explicit-any": [ 26 | "off" 27 | ], 28 | "no-console": "warn", 29 | "no-debugger": "warn", 30 | "vue/no-multiple-template-root": "off", 31 | "vue/multi-word-component-names": "off", 32 | "no-mutating-props": "off", 33 | "vue/no-v-html": "off", 34 | "vue/no-setup-props-destructure": "off", 35 | "prettier/prettier": [ 36 | "error", 37 | { 38 | "semi": false, 39 | "eslintIntegration": true, 40 | "singleQuote": true, 41 | "tabWidth": 2, 42 | "useTabs": false, 43 | "trailingComma": "none", 44 | "bracketSpacing": true, 45 | "arrowParens": "avoid", 46 | "endOfLine": "auto", 47 | "printWidth": 100 48 | } 49 | ] 50 | } 51 | } -------------------------------------------------------------------------------- /public/tinymce/plugins/save/plugin.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * TinyMCE version 6.0.3 (2022-05-25) 3 | */ 4 | !function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager");const n=("function",e=>"function"==typeof e);var o=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),t=tinymce.util.Tools.resolve("tinymce.util.Tools");const a=e=>n=>n.options.get(e),c=a("save_enablewhendirty"),i=a("save_onsavecallback"),s=a("save_oncancelcallback"),r=(e,n)=>{e.notificationManager.open({text:n,type:"error"})},l=e=>n=>{const o=()=>{n.setEnabled(!c(e)||e.isDirty())};return o(),e.on("NodeChange dirty",o),()=>e.off("NodeChange dirty",o)};e.add("save",(e=>{(e=>{const n=e.options.register;n("save_enablewhendirty",{processor:"boolean",default:!0}),n("save_onsavecallback",{processor:"function"}),n("save_oncancelcallback",{processor:"function"})})(e),(e=>{e.ui.registry.addButton("save",{icon:"save",tooltip:"Save",enabled:!1,onAction:()=>e.execCommand("mceSave"),onSetup:l(e)}),e.ui.registry.addButton("cancel",{icon:"cancel",tooltip:"Cancel",enabled:!1,onAction:()=>e.execCommand("mceCancel"),onSetup:l(e)}),e.addShortcut("Meta+S","","mceSave")})(e),(e=>{e.addCommand("mceSave",(()=>{(e=>{const t=o.DOM.getParent(e.id,"form");if(c(e)&&!e.isDirty())return;e.save();const a=i(e);if(n(a))return a.call(e,e),void e.nodeChanged();t?(e.setDirty(!1),t.onsubmit&&!t.onsubmit()||("function"==typeof t.submit?t.submit():r(e,"Error: Form submit field collision.")),e.nodeChanged()):r(e,"Error: No form element found.")})(e)})),e.addCommand("mceCancel",(()=>{(e=>{const o=t.trim(e.startContent),a=s(e);n(a)?a.call(e,e):e.resetContent(o)})(e)}))})(e)}))}(); -------------------------------------------------------------------------------- /src/views/animebgminfo/AnimeBgmInfo.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /src/components/Carousel/Carousel.vue: -------------------------------------------------------------------------------- 1 | 25 | 46 | 47 | 50 | -------------------------------------------------------------------------------- /src/views/animebgminfo/components/Other/NoLogin.vue: -------------------------------------------------------------------------------- 1 | 44 | 45 | 52 | -------------------------------------------------------------------------------- /src/views/home/styles/UserInfo.less: -------------------------------------------------------------------------------- 1 | @media screen and(min-width:@mobile-device) { 2 | .my-info-easy { 3 | padding: @padding-general; 4 | display: flex; 5 | width: 100%; 6 | flex-shrink: 0; 7 | align-items: center; 8 | flex-direction: row; 9 | .avatar { 10 | width: 150px; 11 | height: 150px; 12 | } 13 | .infobox { 14 | width: 100%; 15 | text-align: left; 16 | padding-left: 20px; 17 | margin-top: @margin-general; 18 | flex: 1; 19 | .username { 20 | font-size: 30px; 21 | .text-line-show(1); 22 | .iconfont { 23 | font-size: @big-text; 24 | transform: translateY(-10px); 25 | margin-left: @margin-general; 26 | } 27 | } 28 | .introuce { 29 | margin-top: @margin-general; 30 | font-size:@small-text; 31 | } 32 | .more-info { 33 | i { 34 | margin-right: 2px; 35 | } 36 | 37 | margin-top: @margin-general; 38 | font-size: @small-text; 39 | line-height: 30px; 40 | } 41 | } 42 | } 43 | } 44 | 45 | @media screen and(min-width:@smallpc-device) { 46 | .my-info-easy { 47 | flex-direction: column; 48 | width: 26%; 49 | .avatar { 50 | width: 200px; 51 | height: 200px; 52 | } 53 | } 54 | } -------------------------------------------------------------------------------- /src/assets/styles/global/variable.less: -------------------------------------------------------------------------------- 1 | @mobile-device: 320px; 2 | @pad-device: 768px; 3 | @smallpc-device: 992px; 4 | @normal-device: 1440px; 5 | @margin-general: var(--margin-general, 1rem); 6 | @very-big-text: var(--very-big-text, 2rem); 7 | @big-text: var(--big-text, 1.5rem); 8 | @mid-text: var(--mid-text, 1.3rem); 9 | @small-text: var(--small-text, 1rem); 10 | @very-samll-text: var(--very-samll-text, 0.8rem); 11 | @padding-general: var(--padding-general, 1rem); 12 | @border-radius: var(--border-radius, 1rem); 13 | @border-line: var(--border-line, 0.2rem); 14 | @top-nav-bar-height: var(--top-nav-bar-height, 6.6rem); 15 | @font-family: var(--font-family, 'chinesefont'); 16 | @backGroundImgBlur: var(--backGroundImgBlur, 0rem); 17 | @backGroundImgLight: var(--backGroundImgLight, 100%); 18 | @backGroundImgSize: var(--backGroundImgSize, contain); 19 | @backGroundImgRepeat: var(--backGroundImgRepeat, repeat); 20 | @backgroundImgAttachment: var(--backgroundImgAttachment, scroll); 21 | 22 | :root { 23 | --margin-general: @margin-general; 24 | --very-big-text: @very-big-text; 25 | --big-text: @big-text; 26 | --mid-text: @mid-text; 27 | --small-text: @small-text; 28 | --very-samll-text: @very-samll-text; 29 | --padding-general: @padding-general; 30 | --border-radius: @border-radius; 31 | --border-line: @border-line; 32 | --backGroundImgLight: @backGroundImgLight; 33 | --backGroundImgBlur: @backGroundImgBlur; 34 | --backGroundImgSize: @backGroundImgSize; 35 | --backGroundImgRepeat: @backGroundImgRepeat; 36 | --backgroundImgAttachment: @backgroundImgAttachment; 37 | --font-family: @font-family; 38 | } -------------------------------------------------------------------------------- /src/components/Carousel/styles/Carousel.less: -------------------------------------------------------------------------------- 1 | @media screen and(min-width:320px) { 2 | .carousel-container { 3 | margin: 0.5rem 0; 4 | background-color: @bgColor; 5 | .border-pinkline(1rem, 0px); 6 | } 7 | .content { 8 | height: 100%; 9 | display: flex; 10 | align-items: center; 11 | cursor: pointer; 12 | 13 | .el-image { 14 | width: 100%; 15 | height: 100%; 16 | filter: brightness(0.7); 17 | } 18 | 19 | .desc { 20 | position: absolute; 21 | top: 45%; 22 | left: 2rem; 23 | width: 100%; 24 | .font-normal(); 25 | .textShadow(); 26 | color: @bgTextColor; 27 | z-index: 1; 28 | transform: translateY(-50%); 29 | .title { 30 | max-width: 90%; 31 | .text-line-show(1); 32 | font-size: @very-big-text; 33 | } 34 | .summary{ 35 | .text-line-show(2); 36 | font-size: @mid-text; 37 | max-width: 70%; 38 | } 39 | .tag{ 40 | margin-top: 0.5rem; 41 | margin-right: 0.5rem; 42 | } 43 | } 44 | } 45 | :deep(.el-carousel__container) { 46 | height: 200px; 47 | } 48 | } 49 | 50 | @media screen and(min-width:992px) { 51 | 52 | :deep(.el-carousel__container) { 53 | margin-top: 0; 54 | height: 340px; 55 | } 56 | .content{ 57 | .desc{ 58 | 59 | top: 80%; 60 | } 61 | } 62 | } 63 | 64 | -------------------------------------------------------------------------------- /src/utils/request.ts: -------------------------------------------------------------------------------- 1 | import { ElMessage } from 'element-plus' 2 | import { useStore } from './../store/main' 3 | import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios' 4 | const baseUrl = process.env.VITE_BASE_API 5 | const CancelToken = axios.CancelToken // 用于axios取消请求 6 | const request: AxiosInstance = axios.create({ 7 | baseURL: baseUrl, //生产环境 8 | timeout: 7000 9 | }) 10 | //请求拦截器 发请求之前,拦截器可以监测到 11 | request.interceptors.request.use((config: AxiosRequestConfig) => { 12 | //config 配置对象 13 | const store = useStore() 14 | const source = CancelToken.source() 15 | const { cancel } = useStore() 16 | const url = config.url 17 | config.cancelToken = source.token 18 | if (store.user) { 19 | config.headers.Authorization = `${store.user.token}` 20 | } 21 | // 当有重复请求的时候 则利用这个方式来取消重复的请求 22 | if (cancel[url]) { 23 | delete cancel[url] 24 | } 25 | cancel[url] = source.cancel 26 | store.setCancel(cancel) 27 | return config 28 | }) 29 | 30 | request.interceptors.response.use( 31 | (response: AxiosResponse) => { 32 | if (response.status > 400) { 33 | ElMessage.error(response.statusText) 34 | throw new Error(`请求失败`) 35 | } else if (response.data.code === 10003) { 36 | const store = useStore() 37 | if (store.user.token) { 38 | store.setUserToken('') 39 | } 40 | } else if (response.data.code !== 200) { 41 | if (response.data.msg) { 42 | ElMessage.error(response.data.msg) 43 | } 44 | throw new Error(response.data.msg) 45 | } 46 | return response 47 | }, 48 | (err: any) => { 49 | Promise.reject(err) 50 | } 51 | ) 52 | 53 | export default request 54 | -------------------------------------------------------------------------------- /src/components/AdkButton/AdkButton.less: -------------------------------------------------------------------------------- 1 | @x:var(--x); 2 | @y:var(--y); 3 | @spacing:var(--spcing); 4 | @mainTextsize:var(--mainTextsize); 5 | @subTextsize:var(--subTextsize); 6 | .button() { 7 | background: url('./img/button.png') no-repeat; 8 | width: @x; 9 | height: @y; 10 | background-size: 100% 100%; 11 | display: flex; 12 | align-items: center; 13 | justify-content: center; 14 | flex-direction: column; 15 | padding-top: 2px; 16 | font-weight: 600; 17 | overflow: hidden; 18 | color: black; 19 | transition: all 0.2s ease; 20 | cursor: pointer; 21 | font-family: 'urafont', '幼圆', 'Cartoonfont'; 22 | p { 23 | align-items: center; 24 | text-indent: @spacing; 25 | letter-spacing: @spacing; 26 | line-height: 1; 27 | font-size: @mainTextsize; 28 | } 29 | span { 30 | font-size: @subTextsize; 31 | line-height: 1; 32 | } 33 | } 34 | .hover() { 35 | color: #fff; 36 | } 37 | .adk-button-primary { 38 | .button(); 39 | &:hover { 40 | .hover(); 41 | background: url(./img/button-primary-hover.png) no-repeat; 42 | background-size: 100% 100%; 43 | } 44 | } 45 | .adk-button-danger { 46 | .button(); 47 | &:hover { 48 | .hover(); 49 | background: url(./img/button-danger-hover.png) no-repeat; 50 | background-size: 100% 100%; 51 | } 52 | } 53 | .adk-button-success { 54 | .button(); 55 | &:hover { 56 | .hover(); 57 | background: url(./img/button-success-hover.png) no-repeat; 58 | background-size: 100% 100%; 59 | } 60 | } 61 | .adk-button-info { 62 | .button(); 63 | &:hover { 64 | .hover(); 65 | background: url(./img/button-info-hover.png) no-repeat; 66 | background-size: 100% 100%; 67 | } 68 | } -------------------------------------------------------------------------------- /src/components/AdkButton/AdkButton.vue: -------------------------------------------------------------------------------- 1 | 11 | 63 | 64 | 67 | -------------------------------------------------------------------------------- /src/components/SmallAnimeItem/styles/SmallAnimeItem.less: -------------------------------------------------------------------------------- 1 | @media screen and(min-width:@mobile-device){ 2 | .card-little{ 3 | cursor: pointer; 4 | display: flex; 5 | .border-normal(); 6 | .font-normal(); 7 | overflow: hidden; 8 | transition: 0.5s ease all; 9 | background-color: @bgColor; 10 | .shadow(); 11 | margin: @margin-general 0; 12 | &-img{ 13 | max-height:15rem; 14 | flex-shrink: 0; 15 | } 16 | &-info{ 17 | display:flex; 18 | flex-direction: column; 19 | justify-content: space-between; 20 | padding: 0.5rem 0; 21 | margin-left: 0.5rem; 22 | flex:1; 23 | color: @textColor; 24 | 25 | &__title{ 26 | font-size: @big-text; 27 | } 28 | &__tip{ 29 | font-size: @small-text; 30 | color: @tipTextColor; 31 | } 32 | &__rank{ 33 | font-size: @mid-text; 34 | color: @warnningTextColor; 35 | } 36 | &__miru{ 37 | color:@small-text; 38 | color: @linkColor; 39 | } 40 | } 41 | &:hover{ 42 | transform: translateY(-10px); 43 | background-color: @hoverColor; 44 | color: @hoverTextColor; 45 | .card-little-info{ 46 | &__title,&__rank, 47 | &__tip,&__miru{ 48 | color: @hoverTextColor; 49 | transition: inherit; 50 | } 51 | } 52 | } 53 | } 54 | } -------------------------------------------------------------------------------- /src/views/article/styles/ToolBars.less: -------------------------------------------------------------------------------- 1 | @media screen and(min-width:@mobile-device) { 2 | .toolbars { 3 | position: fixed; 4 | bottom: 20px; 5 | left: 3%; 6 | z-index: 10; 7 | color: @textColor; 8 | ul { 9 | display: flex; 10 | flex-direction: row; 11 | li { 12 | opacity: 0.5; 13 | .border-normal(); 14 | .ball(4.5rem, @bgColor); 15 | .flexbox(row); 16 | .shadow(3px,5px); 17 | cursor: pointer; 18 | margin: 5px; 19 | transition: all 0.6s ease; 20 | &:active { 21 | background-color: @activeColor; 22 | color: @hoverTextColor; 23 | opacity: 1; 24 | } 25 | &:hover { 26 | background-color: @activeColor; 27 | color: @hoverTextColor; 28 | opacity: 1; 29 | } 30 | } 31 | .active { 32 | background-color: @activeColor; 33 | color: @hoverTextColor; 34 | .shadow(3px,5px); 35 | } 36 | } 37 | } 38 | } 39 | @media screen and (min-width:992px) { 40 | .toolbars{ 41 | top: 20px; 42 | left: 7%; 43 | ul{ 44 | flex-direction: column; 45 | li{ 46 | opacity: 1; 47 | } 48 | } 49 | } 50 | } 51 | @media screen and (min-width:1440px) { 52 | .toolbars{ 53 | top: 20px; 54 | left: 16%; 55 | } 56 | } -------------------------------------------------------------------------------- /public/tinymce/plugins/preview/plugin.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * TinyMCE version 6.0.3 (2022-05-25) 3 | */ 4 | !function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),t=tinymce.util.Tools.resolve("tinymce.Env"),o=tinymce.util.Tools.resolve("tinymce.util.Tools");const n=e=>t=>t.options.get(e),i=n("content_style"),s=n("content_css_cors"),c=n("body_class"),r=n("body_id");e.add("preview",(e=>{(e=>{e.addCommand("mcePreview",(()=>{(e=>{const n=(e=>{var n;let l="";const a=e.dom.encode,d=null!==(n=i(e))&&void 0!==n?n:"";l+='';const m=s(e)?' crossorigin="anonymous"':"";o.each(e.contentCSS,(t=>{l+='"})),d&&(l+='");const y=r(e),u=c(e),v=' 54 | 55 | 58 | -------------------------------------------------------------------------------- /src/views/animedetail/components/Body/styles/PopOver.less: -------------------------------------------------------------------------------- 1 | .chra-avatar { 2 | display: flex; 3 | flex-direction: column; 4 | justify-content: flex-start; 5 | margin: @margin-general ; 6 | margin-left: 0; 7 | overflow: hidden; 8 | max-width: 10rem; 9 | 10 | .role-name { 11 | display: inline-flex; 12 | width: 6rem; 13 | border-radius: @border-radius; 14 | padding-left: 0.5rem; 15 | color: @hoverTextColor; 16 | margin-bottom: 0.4rem; 17 | background-color: @themeColor; 18 | overflow: hidden; 19 | } 20 | 21 | .chra-name { 22 | text-align: center; 23 | width: 6rem; 24 | .text-line-show(2); 25 | } 26 | 27 | .imgcontainer { 28 | width: 6rem; 29 | height: 6rem; 30 | .border-normal(); 31 | overflow: hidden; 32 | flex-shrink: 0; 33 | } 34 | } 35 | 36 | .popinfo { 37 | display: flex; 38 | .font-normal(); 39 | background-color: @bgColor; 40 | color: @textColor; 41 | 42 | &-img { 43 | max-width: 46%; 44 | max-height: 40rem; 45 | flex-shrink: 0; 46 | } 47 | 48 | &-text { 49 | display: flex; 50 | flex: 1; 51 | flex-direction: column; 52 | margin-left: 0.5rem; 53 | 54 | p { 55 | margin: 0.2rem 0; 56 | } 57 | 58 | &-title { 59 | justify-content: space-between; 60 | display: flex; 61 | 62 | .bigtitle { 63 | font-size: @very-big-text; 64 | } 65 | 66 | .more { 67 | font-size: @mid-text; 68 | color: @linkColor; 69 | cursor: pointer; 70 | } 71 | } 72 | } 73 | } -------------------------------------------------------------------------------- /src/views/home/components/UserInfo.vue: -------------------------------------------------------------------------------- 1 | 37 | 54 | 55 | 58 | -------------------------------------------------------------------------------- /src/components/TopNavBar/styles/PcMenu.less: -------------------------------------------------------------------------------- 1 | @media screen and(min-width: @mobile-device) { 2 | 3 | // 导航栏样式 4 | .menu { 5 | display: none; 6 | justify-content: start; 7 | font-size: @big-text; 8 | .font-normal(); 9 | flex: 1; 10 | .menu-list { 11 | display: flex; 12 | color: @textColor; 13 | li { 14 | .drop-item{ 15 | display: flex; 16 | } 17 | :deep(.el-dropdown){ 18 | font-size: @big-text; 19 | text-align: center; 20 | color: @textColor; 21 | span { 22 | display: block; 23 | margin-top: 4px; 24 | } 25 | 26 | } 27 | transition: all ease 0.4s; 28 | cursor: pointer; 29 | display: flex; 30 | flex-direction: column; 31 | padding: @padding-general; 32 | align-items: center; 33 | justify-content: center; 34 | a { 35 | font-weight: 600; 36 | } 37 | span { 38 | font-family: 'Cartoonfont', 'Microsoft'; 39 | font-size: @small-text; 40 | } 41 | &:hover { 42 | text-shadow: 1px 1px 10px @hoverColor; 43 | } 44 | } 45 | } 46 | } 47 | } 48 | @media screen and(min-width:992px) { 49 | .menu { 50 | display: flex; 51 | .menu-list { 52 | display: flex; 53 | color: @textColor; 54 | } 55 | } 56 | } -------------------------------------------------------------------------------- /src/views/index/components/MyInfo.vue: -------------------------------------------------------------------------------- 1 | 40 | 41 | 47 | 48 | 51 | -------------------------------------------------------------------------------- /src/views/animeplay/components/PlayerItem.vue: -------------------------------------------------------------------------------- 1 | 4 | 47 | 48 | 65 | -------------------------------------------------------------------------------- /src/views/anime/styles/AnimeHeader.less: -------------------------------------------------------------------------------- 1 | @media screen and (min-width: @mobile-device) { 2 | .anime-header { 3 | width: 100%; 4 | display: flex; 5 | justify-content: space-between; 6 | flex-direction: column; 7 | align-items: center; 8 | &-logo { 9 | display: flex; 10 | font-family: 'Cartoonfont'; 11 | margin: 0.5rem 0; 12 | justify-content: space-between; 13 | width: 100%; 14 | &__uptext { 15 | font-size: 2.5rem; 16 | color: @linkColor; 17 | 18 | &--big { 19 | font-size: 3.2rem; 20 | color: @themeColor; 21 | } 22 | } 23 | 24 | &__undertext { 25 | font-size: 1.5rem; 26 | color: @linkColor; 27 | } 28 | .anime-header-newanime{ 29 | display: block; 30 | } 31 | } 32 | 33 | &-search { 34 | flex: 1; 35 | max-width: 100%; 36 | width: 100% 37 | } 38 | 39 | &-newanime { 40 | .font-normal(); 41 | transition: color ease 0.4s; 42 | cursor: pointer; 43 | font-size: @very-big-text; 44 | display: none; 45 | &::after { 46 | content: ""; 47 | display: block; 48 | width: 0px; 49 | height: 3px; 50 | transition: width ease 0.4s; 51 | margin-top: 5px; 52 | background-color: @themeColor; 53 | } 54 | 55 | &:hover { 56 | color: @themeColor; 57 | 58 | &::after { 59 | width: 100%; 60 | } 61 | } 62 | } 63 | } 64 | } 65 | 66 | @media screen and (min-width: @smallpc-device){ 67 | .anime-header{ 68 | flex-direction: row; 69 | &-search{ 70 | max-width: 70%; 71 | } 72 | &-logo{ 73 | width: unset; 74 | .anime-header-newanime{ 75 | display: none; 76 | } 77 | } 78 | &-newanime{ 79 | display: block; 80 | } 81 | } 82 | } -------------------------------------------------------------------------------- /src/views/animedetail/components/Card/styles/AnimeFollowDeatil.less: -------------------------------------------------------------------------------- 1 | @media screen and(min-width:@mobile-device) { 2 | .follow-card { 3 | .font-normal(); 4 | .border-normal(); 5 | background-color: @bgColor; 6 | padding: @padding-general; 7 | margin-top: @margin-general; 8 | 9 | .title { 10 | font-size: @big-text; 11 | } 12 | 13 | .follow-head { 14 | display: flex; 15 | justify-content: space-between; 16 | } 17 | 18 | .info-detail { 19 | display: flex; 20 | flex-direction: column; 21 | 22 | .process { 23 | display: flex; 24 | flex-direction: column; 25 | 26 | .text-display { 27 | display: flex; 28 | justify-content: space-between; 29 | margin: 10px 0; 30 | 31 | .input-num { 32 | width: 50px; 33 | text-align: center; 34 | } 35 | } 36 | 37 | .progress-bar { 38 | height: 20px; 39 | background-color: gray; 40 | overflow: hidden; 41 | border-radius: @border-radius; 42 | 43 | .progress-bar-inner { 44 | background-color: @themeColor; 45 | height: 20px; 46 | } 47 | } 48 | } 49 | 50 | .detail-item { 51 | display: flex; 52 | flex-direction: column; 53 | margin: 10px 0; 54 | } 55 | } 56 | } 57 | } 58 | 59 | @media screen and(min-width:@smallpc-device) { 60 | .follow-card { 61 | margin: @margin-general; 62 | margin-top: 0; 63 | } 64 | } -------------------------------------------------------------------------------- /src/assets/icons/link.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.github/workflows/push.yml: -------------------------------------------------------------------------------- 1 | name: CD Autobuild 2 | on: 3 | push: 4 | branches: 5 | - main 6 | 7 | jobs: 8 | pushserver: 9 | # runs-on 指定job任务运行所需要的虚拟机环境(必填字段) 10 | runs-on: ubuntu-latest 11 | steps: 12 | # 获取源码 13 | - name: 迁出代码 14 | # 使用action库 actions/checkout获取源码 15 | uses: actions/checkout@main 16 | # 安装Node10 17 | - name: 安装node.js 18 | # 使用action库 actions/setup-node安装node 19 | uses: actions/setup-node@v1 20 | with: 21 | node-version: 16.13.1 22 | # 检查缓存 23 | - name: 缓存依赖 24 | # 缓存命中结果会存储在steps.[id].outputs.cache-hit里,该变量在继后的step中可读 25 | id: cache-dependencies 26 | uses: actions/cache@v3 27 | with: 28 | # 缓存文件目录的路径 29 | path: | 30 | **/node_modules 31 | # key中定义缓存标志位的生成方式。runner.OS指当前环境的系统。外加对yarn.lock内容生成哈希码作为key值,如果yarn.lock改变则代表依赖有变化。 32 | # 这里用yarn.lock而不是package.json是因为package.json中还有version和description之类的描述项目但和依赖无关的属性 33 | key: ${{runner.OS}}-${{hashFiles('**/yarn.lock')}} 34 | # 如果存在缓存 不安装依赖 35 | - name: 安装依赖 36 | if: steps.cache-dependencies.outputs.cache-hit != 'true' 37 | run: npm cache clean -f && npm install -f 38 | - name: eslint检测代码 39 | run: npm run lintfix 40 | # 打包 41 | - name: 打包 42 | run: npm run build:prod 43 | # 上传阿里云 44 | - name: 上传至腾讯服务器 45 | uses: easingthemes/ssh-deploy@v2.1.1 46 | env: 47 | # 私钥 48 | SSH_PRIVATE_KEY: ${{ secrets.TENCENT_PRIVATE_KEY }} 49 | # scp参数 50 | ARGS: '-avzr --delete' 51 | # 源目录 52 | SOURCE: 'dist' 53 | # 服务器ip:换成你的服务器IP 54 | REMOTE_HOST: ${{ secrets.TENCENT_HOST }} 55 | # 用户 56 | REMOTE_USER: 'root' 57 | # 目标地址 58 | TARGET: '/www/wwwroot/adkdream/frontend/toConsumer' 59 | -------------------------------------------------------------------------------- /src/assets/styles/myNprogress.css: -------------------------------------------------------------------------------- 1 | /* Make clicks pass-through */ 2 | #nprogress { 3 | pointer-events: none; 4 | } 5 | 6 | #nprogress .bar { 7 | background: rgb(247, 18, 106); 8 | position: fixed; 9 | z-index: 1031; 10 | top: 0; 11 | left: 0; 12 | width: 100%; 13 | height: 3px; 14 | } 15 | 16 | /* Fancy blur effect */ 17 | #nprogress .peg { 18 | display: block; 19 | position: absolute; 20 | right: 0px; 21 | width: 100px; 22 | height: 100%; 23 | box-shadow: 0 0 10px #29d, 0 0 5px #29d; 24 | opacity: 1.0; 25 | 26 | -webkit-transform: rotate(3deg) translate(0px, -4px); 27 | -ms-transform: rotate(3deg) translate(0px, -4px); 28 | transform: rotate(3deg) translate(0px, -4px); 29 | } 30 | 31 | /* Remove these to get rid of the spinner */ 32 | #nprogress .spinner { 33 | display: block; 34 | position: fixed; 35 | z-index: 1031; 36 | top: 15px; 37 | right: 15px; 38 | } 39 | 40 | #nprogress .spinner-icon { 41 | width: 18px; 42 | height: 18px; 43 | box-sizing: border-box; 44 | 45 | border: solid 2px transparent; 46 | border-top-color: #29d; 47 | border-left-color: #29d; 48 | border-radius: 50%; 49 | 50 | -webkit-animation: nprogress-spinner 400ms linear infinite; 51 | animation: nprogress-spinner 400ms linear infinite; 52 | } 53 | 54 | .nprogress-custom-parent { 55 | overflow: hidden; 56 | position: relative; 57 | } 58 | 59 | .nprogress-custom-parent #nprogress .spinner, 60 | .nprogress-custom-parent #nprogress .bar { 61 | position: absolute; 62 | } 63 | 64 | @-webkit-keyframes nprogress-spinner { 65 | 0% { -webkit-transform: rotate(0deg); } 66 | 100% { -webkit-transform: rotate(360deg); } 67 | } 68 | @keyframes nprogress-spinner { 69 | 0% { transform: rotate(0deg); } 70 | 100% { transform: rotate(360deg); } 71 | } 72 | -------------------------------------------------------------------------------- /src/utils/validate.ts: -------------------------------------------------------------------------------- 1 | export const validateUsername = (rule: any, value: any, callback: any) => { 2 | value as string 3 | const reg = new RegExp(/^[A-Za-z0-9]+/) 4 | if (value === '') { 5 | callback(new Error('请输入用户名')) 6 | } else if (value.length < 6 || value.length > 16) { 7 | callback(new Error('用户名长度需要在6-16位之间')) 8 | } else if (!reg.test(value)) { 9 | callback(new Error('请输入无特殊符号的用户名')) 10 | } else { 11 | callback() 12 | } 13 | } 14 | export const validatePassword = (rule: any, value: any, callback: any) => { 15 | const reg = new RegExp(/[a-zA-Z0-9!?.]+/) 16 | if (value === '') { 17 | callback(new Error('请输入密码')) 18 | } else if (value.length < 6 || value.length > 16) { 19 | callback(new Error('密码长度需要在6-16位之间')) 20 | } else if (!reg.test(value)) { 21 | callback(new Error('密码中不能包含除了!?.之外的特殊符号')) 22 | } else { 23 | callback() 24 | } 25 | } 26 | export const validateNickname = (rule: any, value: any, callback: any) => { 27 | if (value.length === 0) { 28 | callback(new Error('请取一个名字吧~')) 29 | } else if (value.length < 2 || value.length > 16) { 30 | callback(new Error('昵称不要太长也别短哦~')) 31 | } else { 32 | callback() 33 | } 34 | } 35 | 36 | export const validateJianjie = (rule: any, value: any, callback: any) => { 37 | if (value.length === 0) { 38 | callback(new Error('请用一句话描述一下自己哦~')) 39 | } else if (value.length < 2 || value.length > 32) { 40 | callback(new Error('一句话就好 不要多也不要少 ~')) 41 | } else { 42 | callback() 43 | } 44 | } 45 | 46 | export const validateEmail = (rule: any, value: any, callback: any) => { 47 | const reg = new RegExp(/[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+/) 48 | if (value.length === 0) { 49 | callback(new Error('可以告诉我你的邮箱吗~')) 50 | } else if (value.length < 5 || value.length > 64) { 51 | callback(new Error('你的邮箱长度有点问题~')) 52 | } else if (!reg.test(value)) { 53 | callback(new Error('可以输入正确的邮箱格式吗~')) 54 | } else { 55 | callback() 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /src/assets/icons/wenzi.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/views/anime/components/AnimeCarousel.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 64 | 65 | 68 | -------------------------------------------------------------------------------- /src/components/Footer/FooterItem.vue: -------------------------------------------------------------------------------- 1 | 21 | 22 | 77 | -------------------------------------------------------------------------------- /src/views/article/components/ArticleBody.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 35 | 62 | 63 | 73 | -------------------------------------------------------------------------------- /public/tinymce/plugins/autoresize/plugin.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * TinyMCE version 6.0.3 (2022-05-25) 3 | */ 4 | !function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),t=tinymce.util.Tools.resolve("tinymce.Env");const o=e=>t=>t.options.get(e),n=o("min_height"),s=o("max_height"),i=o("autoresize_overflow_padding"),r=o("autoresize_bottom_margin"),l=(e,t)=>{const o=e.getBody();o&&(o.style.overflowY=t?"":"hidden",t||(o.scrollTop=0))},a=(e,t,o,n)=>{const s=parseInt(e.getStyle(t,o,n),10);return isNaN(s)?0:s},g=(e,o,i)=>{var c;const u=e.dom,d=e.getDoc();if(!d)return;if((e=>e.plugins.fullscreen&&e.plugins.fullscreen.isFullscreen())(e))return void l(e,!0);const f=d.documentElement,m=r(e),p=null!==(c=n(e))&&void 0!==c?c:e.getElement().offsetHeight;let h=p;const y=a(u,f,"margin-top",!0),v=a(u,f,"margin-bottom",!0);let C=f.offsetHeight+y+v+m;C<0&&(C=0);const S=e.getContainer().offsetHeight-e.getContentAreaContainer().offsetHeight;C+S>p&&(h=C+S);const z=s(e);if(z&&h>z?(h=z,l(e,!0)):l(e,!1),h!==o.get()){const n=h-o.get();if(u.setStyle(e.getContainer(),"height",h+"px"),o.set(h),(e=>{e.dispatch("ResizeEditor")})(e),t.browser.isSafari()&&(t.os.isMacOS()||t.os.isiOS())){const t=e.getWin();t.scrollTo(t.pageXOffset,t.pageYOffset)}e.hasFocus()&&(e=>{if("setcontent"===(null==e?void 0:e.type.toLowerCase())){const t=e;return!0===t.selection||!0===t.paste}return!1})(i)&&e.selection.scrollIntoView(),(t.browser.isSafari()||t.browser.isChromium())&&n<0&&g(e,o,i)}};e.add("autoresize",(e=>{if((e=>{const t=e.options.register;t("autoresize_overflow_padding",{processor:"number",default:1}),t("autoresize_bottom_margin",{processor:"number",default:50})})(e),e.options.isSet("resize")||e.options.set("resize",!1),!e.inline){const t=(e=>{let t=0;return{get:()=>t,set:e=>{t=e}}})();((e,t)=>{e.addCommand("mceAutoResize",(()=>{g(e,t)}))})(e,t),((e,t)=>{e.on("init",(()=>{const t=i(e),o=e.dom;o.setStyles(e.getDoc().documentElement,{height:"auto"}),o.setStyles(e.getBody(),{paddingLeft:t,paddingRight:t,"min-height":0})})),e.on("NodeChange SetContent keyup FullscreenStateChanged ResizeContent",(o=>{g(e,t,o)}))})(e,t)}}))}(); -------------------------------------------------------------------------------- /src/components/SmallAnimeItem/SmallAnimeItem.vue: -------------------------------------------------------------------------------- 1 | 24 | 25 | 61 | 62 | 65 | -------------------------------------------------------------------------------- /src/views/anime/components/AnimeMina.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 68 | 71 | -------------------------------------------------------------------------------- /changelog.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | disableEmoji: false, 3 | format: '{type}{scope}: {emoji}{subject}', 4 | list: ['test', 'feat', 'fix', 'chore', 'docs', 'refactor', 'style', 'ci', 'perf'], 5 | maxMessageLength: 64, 6 | minMessageLength: 3, 7 | questions: ['type', 'scope', 'subject', 'body', 'breaking', 'issues', 'lerna'], 8 | scopes: [], 9 | types: { 10 | chore: { 11 | description: 'Build process or auxiliary tool changes', 12 | emoji: '🎯', 13 | value: 'chore' 14 | }, 15 | ci: { 16 | description: 'CI related changes', 17 | emoji: '🎡', 18 | value: 'ci' 19 | }, 20 | docs: { 21 | description: '文档更新', 22 | emoji: '✏️', 23 | value: 'docs' 24 | }, 25 | feat: { 26 | description: '新功能', 27 | emoji: '🎉', 28 | value: 'feat' 29 | }, 30 | fix: { 31 | description: '修复bug', 32 | emoji: '🐛', 33 | value: 'fix' 34 | }, 35 | perf: { 36 | description: 'A code change that improves performance', 37 | emoji: '⚡️', 38 | value: 'perf' 39 | }, 40 | refactor: { 41 | description: '重构代码或者改变代码结构', 42 | emoji: '💡', 43 | value: 'refactor' 44 | }, 45 | release: { 46 | description: '发布版', 47 | emoji: '🏹', 48 | value: 'release' 49 | }, 50 | style: { 51 | description: 'Markup, white-space, formatting, missing semi-colons...', 52 | emoji: '💄', 53 | value: 'style' 54 | }, 55 | test: { 56 | description: 'Adding missing tests', 57 | emoji: '💍', 58 | value: 'test' 59 | }, 60 | messages: { 61 | type: "Select the type of change that you're committing:", 62 | customScope: 'Select the scope this component affects:', 63 | subject: 'Write a short, imperative mood description of the change:\n', 64 | body: 'Provide a longer description of the change:\n ', 65 | breaking: 'List any breaking changes:\n', 66 | footer: 'Issues this commit closes, e.g #123:', 67 | confirmCommit: 'The packages that this commit has affected\n' 68 | } 69 | } 70 | }; 71 | -------------------------------------------------------------------------------- /src/views/anime/components/CarouselItem.vue: -------------------------------------------------------------------------------- 1 | 42 | 43 | 67 | 68 | 71 | -------------------------------------------------------------------------------- /src/assets/icons/bofang.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/styles/global/func.less: -------------------------------------------------------------------------------- 1 | // 优先使用urafont 其次幼圆 2 | .font-ura() { 3 | font-family: 'maoken', 'urafont', '微软雅黑'; 4 | font-weight: 500; 5 | } 6 | 7 | .font-normal() { 8 | font-family: 'maoken', 'urafont', '微软雅黑'; 9 | font-weight: 500; 10 | } 11 | 12 | // 1、article-item 的图片边框 13 | .border-article-item(@width, @outset, @borderwidth) { 14 | border-radius: @borderwidth; 15 | border: @borderwidth solid transparent; 16 | border-image: url(@/assets/img/border-my.png) 99 100 95 96; 17 | border-image-width: @width; 18 | border-image-outset: @outset; 19 | } 20 | 21 | // 2、部分标签的图片边框 22 | .border-tag(@outset, @borderwidth) { 23 | border: @borderwidth solid transparent; 24 | border-radius: @borderwidth; 25 | border-image: url(@/assets/img/border-line.png) 20 24 17 25; 26 | border-image-outset: @outset; 27 | } 28 | 29 | // 3、街角魔族类型的图片边框 30 | .border-pinkline(@width, @outset) { 31 | border: @width solid transparent; 32 | border-radius: @width; 33 | border-image: url(@/assets/img/page.png) 25 repeat; 34 | border-image-outset: @outset; 35 | } 36 | 37 | // 4、统一边框类型 38 | .border-normal() { 39 | border: @border-line solid @textColor; 40 | border-radius: @border-radius; 41 | } 42 | 43 | // 定义一个球 44 | .ball(@size, @color) { 45 | width: @size; 46 | height: @size; 47 | border-radius: 50%; 48 | background-color: @color; 49 | } 50 | 51 | //flexbox 居中盒子 52 | .flexbox(@dir: row, @jus: center, @align: center) { 53 | display: flex; 54 | justify-content: @jus; 55 | align-items: @align; 56 | flex-direction: @dir; 57 | } 58 | 59 | .flex(@dir: row, @jus: flex-start, @align: flex-start) { 60 | display: flex; 61 | justify-content: @jus; 62 | align-items: @align; 63 | flex-direction: @dir; 64 | } 65 | 66 | .shadow(@drop: 3px, @big: 5px, @color: @shadowColor) { 67 | box-shadow: @drop @drop @big @color; 68 | } 69 | 70 | .textShadow(@drop: 3px, @big: 5px, @color: @shadowColor) { 71 | text-shadow: @drop @drop @big @color; 72 | } 73 | 74 | .cusor-pointer() { 75 | cursor: url(@/assets/img/Hand2.cur), pointer; 76 | } -------------------------------------------------------------------------------- /src/views/animedetail/components/Body/PopOverAnimeHuman.vue: -------------------------------------------------------------------------------- 1 | 41 | 42 | 63 | 64 | 67 | -------------------------------------------------------------------------------- /src/theme/themeData.json: -------------------------------------------------------------------------------- 1 | { 2 | "darkConfig": { 3 | "marginGeneral": 1, 4 | "veryBigText": 2, 5 | "bigText": 1.5, 6 | "smallText": 1, 7 | "midText": 1.3, 8 | "verySamllText": 0.8, 9 | "paddingGeneral": 1, 10 | "borderRadius": 1, 11 | "borderLine": 0.28, 12 | "bgColor": "rgb(28, 28, 28)", 13 | "textColor": "rgb(255, 255, 255)", 14 | "globlBgColor": "rgb(0, 0, 0)", 15 | "tipTextColor": "rgb(160, 160, 160)", 16 | "bgTextColor": "rgb(255, 255, 255)", 17 | "hoverColor": "rgb(3, 108, 183)", 18 | "hoverTextColor": "rgb(255, 255, 255)", 19 | "linkColor": "rgb(14, 136, 250)", 20 | "activeColor": "rgb(250, 14, 73)", 21 | "shadowColor": "rgba(255, 255, 255, 0.5)", 22 | "themeColor": "rgb(250, 14, 73)", 23 | "warnningTextColor": "rgb(247, 44, 8)", 24 | "errorTextColor": "rgb(255, 0, 0)", 25 | "backGroundImg": "", 26 | "backGroundImgBlur": 0, 27 | "backGroundImgLight": 100, 28 | "backGroundImgRepeat": "repeat", 29 | "backGroundImgSize": "cover", 30 | "backgroundImgAttachment": "scroll", 31 | "topNavBarHeight": 6.6 32 | }, 33 | "defaultConfig": { 34 | "marginGeneral": 1, 35 | "veryBigText": 2, 36 | "bigText": 1.5, 37 | "smallText": 1, 38 | "midText": 1.3, 39 | "verySamllText": 0.8, 40 | "paddingGeneral": 1, 41 | "borderRadius": 1, 42 | "borderLine": 0.28, 43 | "bgColor": "rgb(255, 255, 255)", 44 | "textColor": "rgb(0, 0, 0)", 45 | "globlBgColor": "rgb(236, 236, 236)", 46 | "tipTextColor": "rgb(160, 160, 160)", 47 | "bgTextColor": "rgb(255, 255, 255)", 48 | "hoverColor": "rgb(250, 14, 73)", 49 | "hoverTextColor": "rgb(255, 255, 255)", 50 | "linkColor": "rgb(14, 136, 250)", 51 | "activeColor": "rgb(250, 14, 73)", 52 | "shadowColor": "rgba(0, 0, 0, 0.3)", 53 | "themeColor": "rgb(250, 14, 73)", 54 | "warnningTextColor": "rgb(247, 44, 8)", 55 | "errorTextColor": "rgb(255, 0, 0)", 56 | "backGroundImg": "", 57 | "backGroundImgBlur": 0, 58 | "backGroundImgLight": 100, 59 | "backGroundImgRepeat": "repeat", 60 | "backGroundImgSize": "cover", 61 | "backgroundImgAttachment": "scroll", 62 | "topNavBarHeight": 6.6 63 | } 64 | } 65 | --------------------------------------------------------------------------------