parent
							
								
									8cdb1fd031
								
							
						
					
					
						commit
						9188916926
					
				| @ -0,0 +1,17 @@ | ||||
| yarn.lock | ||||
| .DS_Store | ||||
| node_modules/ | ||||
| dist/ | ||||
| npm-debug.log* | ||||
| yarn-debug.log* | ||||
| yarn-error.log* | ||||
| package-lock.json | ||||
| tests/**/coverage/ | ||||
| 
 | ||||
| # Editor directories and files | ||||
| .idea | ||||
| .vscode | ||||
| *.suo | ||||
| *.ntvs* | ||||
| *.njsproj | ||||
| *.sln | ||||
| @ -0,0 +1,17 @@ | ||||
| # 门户网站方案2 | ||||
| 
 | ||||
| 基于文档:https://www.vuepress.cn/ | ||||
| 
 | ||||
| - 初始化 | ||||
| 
 | ||||
| npm install | ||||
| 
 | ||||
| - 启动 | ||||
| 
 | ||||
| npm run docs:dev | ||||
| 
 | ||||
| - 构建 | ||||
| 
 | ||||
| npm run docs:build | ||||
| 
 | ||||
| 结果在:`docs/.vuepress/dist` | ||||
| @ -0,0 +1,31 @@ | ||||
| module.exports = { | ||||
|     locales: { | ||||
|         // 键名是该语言所属的子路径
 | ||||
|         // 作为特例,默认语言可以使用 '/' 作为其路径。
 | ||||
|         '/': { | ||||
|             lang: 'zh-CN', // 将会被设置为 <html> 的 lang 属性
 | ||||
|             title: '开放平台', | ||||
|             description: 'XX开放平台' | ||||
|         }, | ||||
|         // '/zh/': {
 | ||||
|         //     lang: 'zh-CN',
 | ||||
|         //     title: 'VuePress',
 | ||||
|         //     description: 'Vue 驱动的静态网站生成器'
 | ||||
|         // }
 | ||||
|     }, | ||||
|     // 主题配置
 | ||||
|     themeConfig: { | ||||
|         logo: '/assets/images/logo.png', | ||||
|         search: false, | ||||
|         searchMaxSuggestions: 10, | ||||
|         // 导航按钮配置
 | ||||
|         nav: [ | ||||
|             { text: '登录', link: 'http://baidu.com' }, | ||||
|             { text: '免费注册', link: 'http://baidu.com' }, | ||||
|         ], | ||||
|     }, | ||||
|     // 派生主题,https://www.vuepress.cn/theme/inheritance.html#%E6%A6%82%E5%BF%B5
 | ||||
|     extend: '@vuepress/theme-default', | ||||
|     // 插件
 | ||||
|     plugins: ['@vuepress/back-to-top'] | ||||
| } | ||||
| After Width: | Height: | Size: 54 KiB | 
| After Width: | Height: | Size: 13 KiB | 
| After Width: | Height: | Size: 66 KiB | 
| @ -0,0 +1,21 @@ | ||||
| // 这里修改主题颜色,详见:https://www.vuepress.cn/config/#palette-styl | ||||
| // 颜色 | ||||
| $accentColor = #409EFF | ||||
| $textColor = #2c3e50 | ||||
| $borderColor = #eaecef | ||||
| $codeBgColor = #282c34 | ||||
| $arrowBgColor = #ccc | ||||
| $badgeTipColor = #42b983 | ||||
| $badgeWarningColor = darken(#ffe564, 35%) | ||||
| $badgeErrorColor = #DA5961 | ||||
| 
 | ||||
| // 布局 | ||||
| $navbarHeight = 3.6rem | ||||
| $sidebarWidth = 20rem | ||||
| $contentWidth = 740px | ||||
| $homePageWidth = 960px | ||||
| 
 | ||||
| // 响应式变化点 | ||||
| $MQNarrow = 959px | ||||
| $MQMobile = 719px | ||||
| $MQMobileNarrow = 419px | ||||
| @ -0,0 +1,5 @@ | ||||
| <template> | ||||
|   <div class="footer"> | ||||
|     Copyright © 2020-present SOP</a> | ||||
|   </div> | ||||
| </template> | ||||
| @ -0,0 +1,171 @@ | ||||
| <template> | ||||
|   <main | ||||
|       class="home" | ||||
|       :aria-labelledby="data.heroText !== null ? 'main-title' : null" | ||||
|   > | ||||
|     <header class="hero"> | ||||
|       <img | ||||
|           v-if="data.heroImage" | ||||
|           :src="$withBase(data.heroImage)" | ||||
|           :alt="data.heroAlt || 'hero'" | ||||
|       > | ||||
| 
 | ||||
|       <h1 | ||||
|           v-if="data.heroText !== null" | ||||
|           id="main-title" | ||||
|       > | ||||
|         {{ data.heroText || $title || 'Hello' }} | ||||
|       </h1> | ||||
| 
 | ||||
|       <p | ||||
|           v-if="data.tagline !== null" | ||||
|           class="description" | ||||
|       > | ||||
|         {{ data.tagline || $description || 'Welcome to your VuePress site' }} | ||||
|       </p> | ||||
| 
 | ||||
|       <p | ||||
|           v-if="data.actionText && data.actionLink" | ||||
|           class="action" | ||||
|       > | ||||
|         <NavLink | ||||
|             class="action-button" | ||||
|             :item="actionLink" | ||||
|         /> | ||||
|       </p> | ||||
|     </header> | ||||
| 
 | ||||
|     <div | ||||
|         v-if="data.features && data.features.length" | ||||
|         class="features" | ||||
|     > | ||||
|       <div | ||||
|           v-for="(feature, index) in data.features" | ||||
|           :key="index" | ||||
|           class="feature" | ||||
|       > | ||||
|         <h2>{{ feature.title }}</h2> | ||||
|         <p>{{ feature.details }}</p> | ||||
|       </div> | ||||
|     </div> | ||||
| 
 | ||||
|     <Content class="theme-default-content custom" /> | ||||
| 
 | ||||
|     <Footer /> | ||||
|   </main> | ||||
| </template> | ||||
| 
 | ||||
| <script> | ||||
| import NavLink from '@parent-theme/components/NavLink.vue' | ||||
| import Footer from '@theme/components/Footer.vue' | ||||
| 
 | ||||
| export default { | ||||
|   name: 'Home', | ||||
| 
 | ||||
|   components: { NavLink, Footer }, | ||||
| 
 | ||||
|   computed: { | ||||
|     data () { | ||||
|       return this.$page.frontmatter | ||||
|     }, | ||||
| 
 | ||||
|     actionLink () { | ||||
|       return { | ||||
|         link: this.data.actionLink, | ||||
|         text: this.data.actionText | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </script> | ||||
| 
 | ||||
| <style lang="stylus"> | ||||
| .home | ||||
|   padding $navbarHeight 2rem 0 | ||||
|   max-width $homePageWidth | ||||
|   margin 0px auto | ||||
|   display block | ||||
|   .hero | ||||
|     text-align center | ||||
|     img | ||||
|       max-width: 100% | ||||
|       max-height 280px | ||||
|       display block | ||||
|       margin 3rem auto 1.5rem | ||||
|     h1 | ||||
|       font-size 3rem | ||||
|     h1, .description, .action | ||||
|       margin 1.8rem auto | ||||
|     .description | ||||
|       max-width 35rem | ||||
|       font-size 1.6rem | ||||
|       line-height 1.3 | ||||
|       color lighten($textColor, 40%) | ||||
|     .action-button | ||||
|       display inline-block | ||||
|       font-size 1.2rem | ||||
|       color #fff | ||||
|       background-color $accentColor | ||||
|       padding 0.8rem 1.6rem | ||||
|       border-radius 4px | ||||
|       transition background-color .1s ease | ||||
|       box-sizing border-box | ||||
|       border-bottom 1px solid darken($accentColor, 10%) | ||||
|       &:hover | ||||
|         background-color lighten($accentColor, 10%) | ||||
|   .features | ||||
|     border-top 1px solid $borderColor | ||||
|     padding 1.2rem 0 | ||||
|     margin-top 2.5rem | ||||
|     display flex | ||||
|     flex-wrap wrap | ||||
|     align-items flex-start | ||||
|     align-content stretch | ||||
|     justify-content space-between | ||||
|   .feature | ||||
|     flex-grow 1 | ||||
|     flex-basis 30% | ||||
|     max-width 30% | ||||
|     h2 | ||||
|       font-size 1.4rem | ||||
|       font-weight 500 | ||||
|       border-bottom none | ||||
|       padding-bottom 0 | ||||
|       color lighten($textColor, 10%) | ||||
|     p | ||||
|       color lighten($textColor, 25%) | ||||
|   .footer | ||||
|     padding 2.5rem | ||||
|     border-top 1px solid $borderColor | ||||
|     text-align center | ||||
|     color lighten($textColor, 25%) | ||||
| 
 | ||||
| @media (max-width: $MQMobile) | ||||
|   .home | ||||
|     .features | ||||
|       flex-direction column | ||||
|     .feature | ||||
|       max-width 100% | ||||
|       padding 0 2.5rem | ||||
| 
 | ||||
| @media (max-width: $MQMobileNarrow) | ||||
|   .home | ||||
|     padding-left 1.5rem | ||||
|     padding-right 1.5rem | ||||
|     .hero | ||||
|       img | ||||
|         max-height 210px | ||||
|         margin 2rem auto 1.2rem | ||||
|       h1 | ||||
|         font-size 2rem | ||||
|       h1, .description, .action | ||||
|         margin 1.2rem auto | ||||
|       .description | ||||
|         font-size 1.2rem | ||||
|       .action-button | ||||
|         font-size 1rem | ||||
|         padding 0.6rem 1.2rem | ||||
|     .feature | ||||
|       h2 | ||||
|         font-size 1.25rem | ||||
| </style> | ||||
| @ -0,0 +1,4 @@ | ||||
| module.exports = { | ||||
|     // 继承默认主题,https://www.vuepress.cn/theme/inheritance.html#%E5%8A%A8%E6%9C%BA
 | ||||
|     extend: '@vuepress/theme-default' | ||||
| } | ||||
| @ -0,0 +1,244 @@ | ||||
| export const hashRE = /#.*$/ | ||||
| export const extRE = /\.(md|html)$/ | ||||
| export const endingSlashRE = /\/$/ | ||||
| export const outboundRE = /^[a-z]+:/i | ||||
| 
 | ||||
| export function normalize (path) { | ||||
|   return decodeURI(path) | ||||
|     .replace(hashRE, '') | ||||
|     .replace(extRE, '') | ||||
| } | ||||
| 
 | ||||
| export function getHash (path) { | ||||
|   const match = path.match(hashRE) | ||||
|   if (match) { | ||||
|     return match[0] | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| export function isExternal (path) { | ||||
|   return outboundRE.test(path) | ||||
| } | ||||
| 
 | ||||
| export function isMailto (path) { | ||||
|   return /^mailto:/.test(path) | ||||
| } | ||||
| 
 | ||||
| export function isTel (path) { | ||||
|   return /^tel:/.test(path) | ||||
| } | ||||
| 
 | ||||
| export function ensureExt (path) { | ||||
|   if (isExternal(path)) { | ||||
|     return path | ||||
|   } | ||||
|   const hashMatch = path.match(hashRE) | ||||
|   const hash = hashMatch ? hashMatch[0] : '' | ||||
|   const normalized = normalize(path) | ||||
| 
 | ||||
|   if (endingSlashRE.test(normalized)) { | ||||
|     return path | ||||
|   } | ||||
|   return normalized + '.html' + hash | ||||
| } | ||||
| 
 | ||||
| export function isActive (route, path) { | ||||
|   const routeHash = decodeURIComponent(route.hash) | ||||
|   const linkHash = getHash(path) | ||||
|   if (linkHash && routeHash !== linkHash) { | ||||
|     return false | ||||
|   } | ||||
|   const routePath = normalize(route.path) | ||||
|   const pagePath = normalize(path) | ||||
|   return routePath === pagePath | ||||
| } | ||||
| 
 | ||||
| export function resolvePage (pages, rawPath, base) { | ||||
|   if (isExternal(rawPath)) { | ||||
|     return { | ||||
|       type: 'external', | ||||
|       path: rawPath | ||||
|     } | ||||
|   } | ||||
|   if (base) { | ||||
|     rawPath = resolvePath(rawPath, base) | ||||
|   } | ||||
|   const path = normalize(rawPath) | ||||
|   for (let i = 0; i < pages.length; i++) { | ||||
|     if (normalize(pages[i].regularPath) === path) { | ||||
|       return Object.assign({}, pages[i], { | ||||
|         type: 'page', | ||||
|         path: ensureExt(pages[i].path) | ||||
|       }) | ||||
|     } | ||||
|   } | ||||
|   console.error(`[vuepress] No matching page found for sidebar item "${rawPath}"`) | ||||
|   return {} | ||||
| } | ||||
| 
 | ||||
| function resolvePath (relative, base, append) { | ||||
|   const firstChar = relative.charAt(0) | ||||
|   if (firstChar === '/') { | ||||
|     return relative | ||||
|   } | ||||
| 
 | ||||
|   if (firstChar === '?' || firstChar === '#') { | ||||
|     return base + relative | ||||
|   } | ||||
| 
 | ||||
|   const stack = base.split('/') | ||||
| 
 | ||||
|   // remove trailing segment if:
 | ||||
|   // - not appending
 | ||||
|   // - appending to trailing slash (last segment is empty)
 | ||||
|   if (!append || !stack[stack.length - 1]) { | ||||
|     stack.pop() | ||||
|   } | ||||
| 
 | ||||
|   // resolve relative path
 | ||||
|   const segments = relative.replace(/^\//, '').split('/') | ||||
|   for (let i = 0; i < segments.length; i++) { | ||||
|     const segment = segments[i] | ||||
|     if (segment === '..') { | ||||
|       stack.pop() | ||||
|     } else if (segment !== '.') { | ||||
|       stack.push(segment) | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   // ensure leading slash
 | ||||
|   if (stack[0] !== '') { | ||||
|     stack.unshift('') | ||||
|   } | ||||
| 
 | ||||
|   return stack.join('/') | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * @param { Page } page | ||||
|  * @param { string } regularPath | ||||
|  * @param { SiteData } site | ||||
|  * @param { string } localePath | ||||
|  * @returns { SidebarGroup } | ||||
|  */ | ||||
| export function resolveSidebarItems (page, regularPath, site, localePath) { | ||||
|   const { pages, themeConfig } = site | ||||
| 
 | ||||
|   const localeConfig = localePath && themeConfig.locales | ||||
|     ? themeConfig.locales[localePath] || themeConfig | ||||
|     : themeConfig | ||||
| 
 | ||||
|   const pageSidebarConfig = page.frontmatter.sidebar || localeConfig.sidebar || themeConfig.sidebar | ||||
|   if (pageSidebarConfig === 'auto') { | ||||
|     return resolveHeaders(page) | ||||
|   } | ||||
| 
 | ||||
|   const sidebarConfig = localeConfig.sidebar || themeConfig.sidebar | ||||
|   if (!sidebarConfig) { | ||||
|     return [] | ||||
|   } else { | ||||
|     const { base, config } = resolveMatchingConfig(regularPath, sidebarConfig) | ||||
|     if (config === 'auto') { | ||||
|       return resolveHeaders(page) | ||||
|     } | ||||
|     return config | ||||
|       ? config.map(item => resolveItem(item, pages, base)) | ||||
|       : [] | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * @param { Page } page | ||||
|  * @returns { SidebarGroup } | ||||
|  */ | ||||
| function resolveHeaders (page) { | ||||
|   const headers = groupHeaders(page.headers || []) | ||||
|   return [{ | ||||
|     type: 'group', | ||||
|     collapsable: false, | ||||
|     title: page.title, | ||||
|     path: null, | ||||
|     children: headers.map(h => ({ | ||||
|       type: 'auto', | ||||
|       title: h.title, | ||||
|       basePath: page.path, | ||||
|       path: page.path + '#' + h.slug, | ||||
|       children: h.children || [] | ||||
|     })) | ||||
|   }] | ||||
| } | ||||
| 
 | ||||
| export function groupHeaders (headers) { | ||||
|   // group h3s under h2
 | ||||
|   headers = headers.map(h => Object.assign({}, h)) | ||||
|   let lastH2 | ||||
|   headers.forEach(h => { | ||||
|     if (h.level === 2) { | ||||
|       lastH2 = h | ||||
|     } else if (lastH2) { | ||||
|       (lastH2.children || (lastH2.children = [])).push(h) | ||||
|     } | ||||
|   }) | ||||
|   return headers.filter(h => h.level === 2) | ||||
| } | ||||
| 
 | ||||
| export function resolveNavLinkItem (linkItem) { | ||||
|   return Object.assign(linkItem, { | ||||
|     type: linkItem.items && linkItem.items.length ? 'links' : 'link' | ||||
|   }) | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * @param { Route } route | ||||
|  * @param { Array<string|string[]> | Array<SidebarGroup> | [link: string]: SidebarConfig } config | ||||
|  * @returns { base: string, config: SidebarConfig } | ||||
|  */ | ||||
| export function resolveMatchingConfig (regularPath, config) { | ||||
|   if (Array.isArray(config)) { | ||||
|     return { | ||||
|       base: '/', | ||||
|       config: config | ||||
|     } | ||||
|   } | ||||
|   for (const base in config) { | ||||
|     if (ensureEndingSlash(regularPath).indexOf(encodeURI(base)) === 0) { | ||||
|       return { | ||||
|         base, | ||||
|         config: config[base] | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   return {} | ||||
| } | ||||
| 
 | ||||
| function ensureEndingSlash (path) { | ||||
|   return /(\.html|\/)$/.test(path) | ||||
|     ? path | ||||
|     : path + '/' | ||||
| } | ||||
| 
 | ||||
| function resolveItem (item, pages, base, groupDepth = 1) { | ||||
|   if (typeof item === 'string') { | ||||
|     return resolvePage(pages, item, base) | ||||
|   } else if (Array.isArray(item)) { | ||||
|     return Object.assign(resolvePage(pages, item[0], base), { | ||||
|       title: item[1] | ||||
|     }) | ||||
|   } else { | ||||
|     const children = item.children || [] | ||||
|     if (children.length === 0 && item.path) { | ||||
|       return Object.assign(resolvePage(pages, item.path, base), { | ||||
|         title: item.title | ||||
|       }) | ||||
|     } | ||||
|     return { | ||||
|       type: 'group', | ||||
|       path: item.path, | ||||
|       title: item.title, | ||||
|       sidebarDepth: item.sidebarDepth, | ||||
|       initialOpenGroupIndex: item.initialOpenGroupIndex, | ||||
|       children: children.map(child => resolveItem(child, pages, base, groupDepth + 1)), | ||||
|       collapsable: item.collapsable !== false | ||||
|     } | ||||
|   } | ||||
| } | ||||
| @ -0,0 +1,17 @@ | ||||
| --- | ||||
| home: true | ||||
| heroImage: /assets/images/hero.jpeg | ||||
| heroText: 开放平台 | ||||
| tagline: 一句话描述你的平台。。 | ||||
| actionText: null | ||||
| actionLink: null | ||||
| features: | ||||
| - title: 更快 | ||||
|   details: 开放接口更快。。 | ||||
| - title: 更高 | ||||
|   details: 开放接口更高。。 | ||||
| - title: 更强 | ||||
|   details: 开放接口更强。。 | ||||
| footer: null | ||||
| search: false | ||||
| --- | ||||
| @ -0,0 +1,15 @@ | ||||
| { | ||||
|   "name": "open-portal", | ||||
|   "version": "1.0.0", | ||||
|   "main": "index.js", | ||||
|   "author": "tanghc", | ||||
|   "license": "MIT", | ||||
|   "devDependencies": { | ||||
|     "@vuepress/plugin-back-to-top": "^1.8.0", | ||||
|     "vuepress": "^1.8.0" | ||||
|   }, | ||||
|   "scripts": { | ||||
|     "docs:dev": "vuepress dev docs", | ||||
|     "docs:build": "vuepress build docs" | ||||
|   } | ||||
| } | ||||
					Loading…
					
					
				
		Reference in new issue