diff --git a/README.md b/README.md index 1cb1062379ea9b31ee5631b0cd4ab9aff9579715..8396c8b22354866343131510242b0b1dca674b74 100644 --- a/README.md +++ b/README.md @@ -197,6 +197,6 @@ Thank you for your [contribution](https://github.com/xjh22222228/nav/issues), me 感谢您的认可: | 姓名 | 支持金额 | | --------------------------------------- |----------- | -| [aiyou9](https://github.com/aiyou9) | ¥40.00 | +| [aiyou9](https://github.com/aiyou9) | ¥50.00 | | 路人甲 | ¥50.00 | diff --git a/src/components/create-web/index.component.html b/src/components/create-web/index.component.html index 961a2633a0b3e332c74aa30cc1a556f1db04205c..8bc03f2cc51199c5663361b88de33d8b3234ed5a 100644 --- a/src/components/create-web/index.component.html +++ b/src/components/create-web/index.component.html @@ -1,4 +1,5 @@
- 快捷方式 - + 快捷方式 +
- +
- - 推荐指数 - - - - - 图标地址 diff --git a/src/components/create-web/index.component.scss b/src/components/create-web/index.component.scss index e4dda1496011127a4b76fc6b61c4b477c62b4c1b..4d019366a88561f1811ed816aa4c26d756903d3d 100644 --- a/src/components/create-web/index.component.scss +++ b/src/components/create-web/index.component.scss @@ -4,8 +4,5 @@ .row { display: flex; - - .col { - flex: 1; - } + justify-content: space-around; } diff --git a/src/components/create-web/index.component.ts b/src/components/create-web/index.component.ts index 46ec8615b1dd297cc296b9174bf49bd17b8e4037..02c32c5aa695388a62a69dbccdc7c0d2010b7f81 100644 --- a/src/components/create-web/index.component.ts +++ b/src/components/create-web/index.component.ts @@ -42,6 +42,7 @@ export class CreateWebComponent implements OnInit { title: ['', [Validators.required]], url: ['', [Validators.required]], top: [false], + ownVisible: [false], rate: [5], url0: [''], url1: [''], @@ -68,6 +69,7 @@ export class CreateWebComponent implements OnInit { this.validateForm.get('icon')!.setValue(detail.icon || '') this.validateForm.get('url')!.setValue(detail.url || '') this.validateForm.get('top')!.setValue(detail.top ?? false) + this.validateForm.get('ownVisible')!.setValue(detail.ownVisible ?? false) this.validateForm.get('rate')!.setValue(detail.rate ?? 5) if (typeof detail.urls === 'object') { @@ -184,6 +186,7 @@ export class CreateWebComponent implements OnInit { icon, url, top, + ownVisible, rate, desc, url0, @@ -214,6 +217,7 @@ export class CreateWebComponent implements OnInit { rate: rate ?? 0, desc: desc || '', top: top ?? false, + ownVisible: ownVisible ?? false, icon, url, urls diff --git a/src/components/fixbar/index.component.ts b/src/components/fixbar/index.component.ts index fcd4fbace7601196052f7f2335debd8b9e72bdf6..5dd84704e27b985c4479f7b2bcb8a5bd9440d618 100644 --- a/src/components/fixbar/index.component.ts +++ b/src/components/fixbar/index.component.ts @@ -173,7 +173,7 @@ export class FixbarComponent { this.modal.info({ nzTitle: '同步数据到远端', nzOkText: '确定同步', - nzContent: '确定将所有数据同步到远端吗?这可能需要消耗一定的时间。', + nzContent: '确定将所有数据同步到远端吗?', nzOnOk: () => { this.syncLoading = true; diff --git a/src/styles.scss b/src/styles.scss index 89965ab547a48cd0e44b8ad3ba5539b490c43820..a74560126ca6c8a3a6ff878689926088c6b06b30 100644 --- a/src/styles.scss +++ b/src/styles.scss @@ -112,6 +112,12 @@ em { -webkit-box-orient: vertical; } +.remove { + position: fixed !important; + top: -10000px !important; + left: -10000px !important; +} + /* 搜索高亮关键字 */ b { color: #f50 !important; diff --git a/src/types/index.d.ts b/src/types/index.d.ts index 73fb0699403b18d2e486e1ecd868c768a290027c..3eab2f39d00749b7a97cb91f46e60e054f9324b3 100644 --- a/src/types/index.d.ts +++ b/src/types/index.d.ts @@ -25,6 +25,7 @@ export interface INavFourProp { rate?: number // 0-5 top?: boolean index?: number // sort + ownVisible?: boolean urls?: { [tagName: string]: string } @@ -35,6 +36,7 @@ export interface INavThreeProp { icon?: string | null createdAt?: string collapsed?: boolean + ownVisible?: boolean nav: INavFourProp[] } @@ -43,6 +45,7 @@ export interface INavTwoProp { icon?: string | null createdAt?: string collapsed?: boolean + ownVisible?: boolean nav: INavThreeProp[] } @@ -51,6 +54,7 @@ export interface INavProps extends Object { id?: number icon?: string | null createdAt?: string + ownVisible?: boolean nav: INavTwoProp[] } diff --git a/src/utils/index.ts b/src/utils/index.ts index e5c51652a4a5c6fe4a32647f336bfb107956d2e5..03595ba3cc349d3362117308e19e24579a52ea91 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -4,12 +4,13 @@ import qs from 'qs' import config from '../../nav.config' import Clipboard from 'clipboard' -import { INavFourProp, INavProps, ISearchEngineProps } from '../types' +import { INavFourProp, INavThreeProp, INavProps, ISearchEngineProps } from '../types' import * as db from '../../data/db.json' import * as s from '../../data/search.json' import { STORAGE_KEY_MAP } from '../constants' +import { isLogin } from './user' -export const websiteList = getWebsiteList() +export const websiteList: INavProps[] = getWebsiteList() let total = 0 const { lightThemeConfig } = config @@ -188,7 +189,7 @@ export function adapterWebsiteList(websiteList: any[], parentItem?: any) { return websiteList; } -export function getWebsiteList() { +export function getWebsiteList(): INavProps[] { let webSiteList = adapterWebsiteList((db as any).default) const scriptElAll = document.querySelectorAll('script') const scriptUrl = scriptElAll[scriptElAll.length - 1].src @@ -247,10 +248,13 @@ export function toggleCollapseAll(wsList?: INavProps[]): boolean { export function setLocation() { const { page, id } = queryString() - window.localStorage.setItem(STORAGE_KEY_MAP.location, JSON.stringify({ - page, - id - })) + window.localStorage.setItem( + STORAGE_KEY_MAP.location, + JSON.stringify({ + page, + id + } + )) } export function getDefaultSearchEngine(): ISearchEngineProps { @@ -265,7 +269,10 @@ export function getDefaultSearchEngine(): ISearchEngineProps { } export function setDefaultSearchEngine(engine: ISearchEngineProps) { - window.localStorage.setItem(STORAGE_KEY_MAP.engine, JSON.stringify(engine)) + window.localStorage.setItem( + STORAGE_KEY_MAP.engine, + JSON.stringify(engine) + ) } export function isDark(): boolean { @@ -429,3 +436,24 @@ export function getTextContent(value: string): string { div.innerHTML = value return div.textContent } + +export function matchCurrentList(): INavThreeProp[] { + const { id, page } = queryString() + let data = [] + + try { + if ( + websiteList[page] && + websiteList[page]?.nav?.length > 0 && + (isLogin || !websiteList[page].nav[id].ownVisible) + ) { + data = websiteList[page].nav[id].nav + } else { + data = [] + } + } catch { + data = [] + } + + return data +} diff --git a/src/utils/user.ts b/src/utils/user.ts index 823d6ebff49f7ed8aa5459612a862b216fecaaf4..aa6bdc39cec349f90826cf4c45c430ab3dee65b3 100644 --- a/src/utils/user.ts +++ b/src/utils/user.ts @@ -8,3 +8,5 @@ export function getToken() { export function setToken(token: string) { return window.localStorage.setItem('token', token) } + +export const isLogin: boolean = !!getToken() diff --git a/src/view/admin/index.component.html b/src/view/admin/index.component.html index e714eb0f2eebfb6e079ff3a8dced764135884d1b..5bd3464cd302431c3dbd6ce9d8f61035581d1968 100644 --- a/src/view/admin/index.component.html +++ b/src/view/admin/index.component.html @@ -1,7 +1,26 @@
- - - + + +

1、所有数据设置完毕后点击 “同步到远端”,拖拽表格进行排序

@@ -44,6 +63,7 @@ 图标 分类名称 + 仅自己可见 创建时间 操作 @@ -58,6 +78,9 @@ {{ data.title }} + + + {{ data.createdAt }} 编辑 @@ -105,6 +128,7 @@ 图标 分类名称 + 仅自己可见 创建时间 操作 @@ -119,6 +143,9 @@ {{ data.title }} + + + {{ data.createdAt }} 编辑 @@ -181,6 +208,7 @@ 图标 分类名称 + 仅自己可见 创建时间 操作 @@ -195,6 +223,9 @@ {{ data.title }} + + + {{ data.createdAt }} 编辑 @@ -273,6 +304,7 @@ 图标 网站名称 网站分类 + 仅自己可见 网站描述 创建时间 操作 @@ -295,6 +327,9 @@ {{ key }} + + +
{{ data.desc }}
@@ -334,15 +369,22 @@
- 分类名称 - + 分类名称 + - 图标地址 - + 仅自己可见 + + + + + + + 图标地址 + diff --git a/src/view/admin/index.component.ts b/src/view/admin/index.component.ts index fe7757bc3dde25bacb19ca86b755aa5f5a76c88d..ab0f5f1a7d894e9b34a73a667bc95b6994047adf 100644 --- a/src/view/admin/index.component.ts +++ b/src/view/admin/index.component.ts @@ -59,6 +59,7 @@ export default class WebpComponent { this.validateForm = this.fb.group({ title: ['', [Validators.required]], icon: [''], + ownVisible: [false], }) } @@ -295,7 +296,7 @@ export default class WebpComponent { this.modal.info({ nzTitle: '同步数据到远端', nzOkText: '确定同步', - nzContent: '确定将所有数据同步到远端吗?这可能需要消耗一定的时间。', + nzContent: '确定将所有数据同步到远端吗?', nzOnOk: () => { this.syncLoading = true @@ -328,7 +329,7 @@ export default class WebpComponent { this.validateForm.controls[i].updateValueAndValidity() } - let { title, icon } = this.validateForm.value + let { title, icon, ownVisible } = this.validateForm.value if (!title) return @@ -338,6 +339,7 @@ export default class WebpComponent { case 0: { this.websiteList[this.editIdx].title = title this.websiteList[this.editIdx].icon = icon + this.websiteList[this.editIdx].ownVisible = ownVisible } break @@ -345,6 +347,7 @@ export default class WebpComponent { case 1: { this.twoTableData[this.editIdx].title = title this.twoTableData[this.editIdx].icon = icon + this.twoTableData[this.editIdx].ownVisible = ownVisible } break @@ -352,6 +355,7 @@ export default class WebpComponent { case 2: { this.threeTableData[this.editIdx].title = title this.threeTableData[this.editIdx].icon = icon + this.threeTableData[this.editIdx].ownVisible = ownVisible } break } @@ -370,6 +374,7 @@ export default class WebpComponent { createdAt, title, icon, + ownVisible, nav: [] }) } @@ -386,6 +391,7 @@ export default class WebpComponent { createdAt, title, icon, + ownVisible, nav: [] }) } @@ -402,6 +408,7 @@ export default class WebpComponent { createdAt, title, icon, + ownVisible, nav: [] }) } diff --git a/src/view/index/light/index.component.html b/src/view/index/light/index.component.html index 51f93f5c736356c75a14f6ba5435f78be4feb685..b1aaf0736a7837f0394745fe3951092b6a06af63 100644 --- a/src/view/index/light/index.component.html +++ b/src/view/index/light/index.component.html @@ -13,6 +13,7 @@ (click)="handleCilckTopNav(i)" [class.active]="page === i" [class.dark-text-active]="page === i" + [class.remove]="!isLogin && item.ownVisible" class="ripple-btn dark-text" > {{ item.title }} @@ -28,6 +29,7 @@ [class.dark-item-active]="id === i" (click)="handleSidebarNav(i)" *ngFor="let item of websiteList[page].nav; index as i" + [class.remove]="!isLogin && item.ownVisible" >
{{ item.title }}
@@ -38,7 +40,7 @@
-
+
-
+
diff --git a/src/view/index/light/index.component.ts b/src/view/index/light/index.component.ts index 1a2847a37ca1769ef3217e121e8ca718c3d038fd..f037a5d032300a62cd89232a93275166033e6614 100644 --- a/src/view/index/light/index.component.ts +++ b/src/view/index/light/index.component.ts @@ -10,7 +10,9 @@ import { queryString, setWebsiteList, toggleCollapseAll, + matchCurrentList } from '../../../utils' +import { isLogin } from '../../../utils/user' import { initRipple, setAnnotate } from '../../../utils/ripple' import { websiteList } from '../../../store' @@ -27,22 +29,11 @@ export default class LightComponent { currentList: INavThreeProp[] = [] id: number = 0 page: number = 0 + isLogin = isLogin ngOnInit() { randomBgImg() - const initList = () => { - try { - if (this.websiteList[this.page] && this.websiteList[this.page]?.nav?.length > 0) { - this.currentList = this.websiteList[this.page].nav[this.id].nav - } else { - this.currentList = [] - } - } catch (error) { - this.currentList = [] - } - } - this.activatedRoute.queryParams.subscribe(() => { const tempPage = this.page const { id, page, q } = queryString() @@ -52,7 +43,7 @@ export default class LightComponent { if (q) { this.currentList = fuzzySearch(this.websiteList, q) } else { - initList() + this.currentList = matchCurrentList() } if (tempPage !== page) { diff --git a/src/view/index/side/index.component.html b/src/view/index/side/index.component.html index 39c2c2d960eda2261038f37bb11726da4f00b1f5..4790dabc11eb043590d95166d71dca237b1b7f72 100644 --- a/src/view/index/side/index.component.html +++ b/src/view/index/side/index.component.html @@ -11,11 +11,14 @@ [(nzOpen)]="pageIdx === openIndex" [nzTitle]="item.title" *ngFor="let item of websiteList; index as pageIdx;" + [class.remove]="!isLogin && item.ownVisible" (nzOpenChange)="openIndex = pageIdx" >
  • @@ -60,6 +63,7 @@
    0 ? 157 : 50 isFirst = false + isLogin = isLogin constructor (private router: Router, private activatedRoute: ActivatedRoute) {} ngOnInit() { - const initList = () => { - try { - if (this.websiteList[this.page] && this.websiteList[this.page]?.nav?.length > 0) { - this.currentList = this.websiteList[this.page].nav[this.id].nav - } else { - this.currentList = [] - } - } catch (error) { - this.currentList = [] - } - } - this.activatedRoute.queryParams.subscribe(() => { const { id, page, q } = queryString() this.page = page @@ -58,7 +49,7 @@ export default class SideComponent { if (q) { this.currentList = fuzzySearch(this.websiteList, q) } else { - initList() + this.currentList = matchCurrentList() } setWebsiteList(this.websiteList) diff --git a/src/view/index/sim/index.component.html b/src/view/index/sim/index.component.html index a3124bff05d93edb03a1d2b2872d30b8c090e56e..d3d0cb3a862b28cb478efdc633f28d81236fdcaf 100644 --- a/src/view/index/sim/index.component.html +++ b/src/view/index/sim/index.component.html @@ -10,6 +10,7 @@ *ngFor="let item of websiteList; let i = index;" [class.active]="page === i" [class.dark-text-active]="page === i" + [class.remove]="!isLogin && item.ownVisible" class="ripple-btn dark-text" (click)="handleCilckTopNav(i)" > @@ -25,6 +26,7 @@ (click)="handleSidebarNav(i)" [class.active]="id === i" [class.dark-item-active]="id === i" + [class.remove]="!isLogin && item.ownVisible" class="ripple-btn dark-text" > {{ item.title }} @@ -39,7 +41,13 @@
    -
    +
    diff --git a/src/view/index/sim/index.component.ts b/src/view/index/sim/index.component.ts index 1c1ce14bc122f6e5da346161b527620ffb50dce7..6177a983615210476e00c261afc2f3c005e92686 100644 --- a/src/view/index/sim/index.component.ts +++ b/src/view/index/sim/index.component.ts @@ -10,7 +10,9 @@ import { setWebsiteList, toggleCollapseAll, totalWeb, + matchCurrentList } from '../../../utils' +import { isLogin } from '../../../utils/user' import { initRipple, setAnnotate } from '../../../utils/ripple' import { websiteList } from '../../../store' @@ -34,20 +36,9 @@ export default class SimComponent { title: string = title posterImageUrls?: string = simThemeConfig.posterImageUrls[0] description: string = simThemeConfig.description.replace('${total}', String(totalWeb())) + isLogin = isLogin ngOnInit() { - const initList = () => { - try { - if (this.websiteList[this.page] && this.websiteList[this.page]?.nav?.length > 0) { - this.currentList = this.websiteList[this.page].nav[this.id].nav - } else { - this.currentList = [] - } - } catch (error) { - this.currentList = [] - } - } - this.activatedRoute.queryParams.subscribe(() => { const tempPage = this.page const { id, page, q } = queryString() @@ -57,7 +48,7 @@ export default class SimComponent { if (q) { this.currentList = fuzzySearch(this.websiteList, q) } else { - initList() + this.currentList = matchCurrentList() } if (tempPage !== page) {