diff --git a/sop-website/sop-portal-vue/.gitignore b/sop-website/sop-portal-vue/.gitignore new file mode 100644 index 00000000..ae3d36d3 --- /dev/null +++ b/sop-website/sop-portal-vue/.gitignore @@ -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 diff --git a/sop-website/sop-portal-vue/README.md b/sop-website/sop-portal-vue/README.md new file mode 100644 index 00000000..9f360b94 --- /dev/null +++ b/sop-website/sop-portal-vue/README.md @@ -0,0 +1,17 @@ +# 门户网站方案2 + +基于文档:https://www.vuepress.cn/ + +- 初始化 + +npm install + +- 启动 + +npm run docs:dev + +- 构建 + +npm run docs:build + +结果在:`docs/.vuepress/dist` diff --git a/sop-website/sop-portal-vue/docs/.vuepress/config.js b/sop-website/sop-portal-vue/docs/.vuepress/config.js new file mode 100644 index 00000000..b0975359 --- /dev/null +++ b/sop-website/sop-portal-vue/docs/.vuepress/config.js @@ -0,0 +1,31 @@ +module.exports = { + locales: { + // 键名是该语言所属的子路径 + // 作为特例,默认语言可以使用 '/' 作为其路径。 + '/': { + lang: 'zh-CN', // 将会被设置为 的 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'] +} diff --git a/sop-website/sop-portal-vue/docs/.vuepress/public/assets/images/hero.jpeg b/sop-website/sop-portal-vue/docs/.vuepress/public/assets/images/hero.jpeg new file mode 100644 index 00000000..99334048 Binary files /dev/null and b/sop-website/sop-portal-vue/docs/.vuepress/public/assets/images/hero.jpeg differ diff --git a/sop-website/sop-portal-vue/docs/.vuepress/public/assets/images/logo.png b/sop-website/sop-portal-vue/docs/.vuepress/public/assets/images/logo.png new file mode 100644 index 00000000..b201d8c0 Binary files /dev/null and b/sop-website/sop-portal-vue/docs/.vuepress/public/assets/images/logo.png differ diff --git a/sop-website/sop-portal-vue/docs/.vuepress/public/favicon.ico b/sop-website/sop-portal-vue/docs/.vuepress/public/favicon.ico new file mode 100644 index 00000000..ccb973ce Binary files /dev/null and b/sop-website/sop-portal-vue/docs/.vuepress/public/favicon.ico differ diff --git a/sop-website/sop-portal-vue/docs/.vuepress/styles/palette.styl b/sop-website/sop-portal-vue/docs/.vuepress/styles/palette.styl new file mode 100644 index 00000000..f4615ea8 --- /dev/null +++ b/sop-website/sop-portal-vue/docs/.vuepress/styles/palette.styl @@ -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 diff --git a/sop-website/sop-portal-vue/docs/.vuepress/theme/components/Footer.vue b/sop-website/sop-portal-vue/docs/.vuepress/theme/components/Footer.vue new file mode 100644 index 00000000..a1aa9840 --- /dev/null +++ b/sop-website/sop-portal-vue/docs/.vuepress/theme/components/Footer.vue @@ -0,0 +1,5 @@ + diff --git a/sop-website/sop-portal-vue/docs/.vuepress/theme/components/Home.vue b/sop-website/sop-portal-vue/docs/.vuepress/theme/components/Home.vue new file mode 100644 index 00000000..4cc8fd19 --- /dev/null +++ b/sop-website/sop-portal-vue/docs/.vuepress/theme/components/Home.vue @@ -0,0 +1,171 @@ + + + + + diff --git a/sop-website/sop-portal-vue/docs/.vuepress/theme/index.js b/sop-website/sop-portal-vue/docs/.vuepress/theme/index.js new file mode 100644 index 00000000..bd8dd662 --- /dev/null +++ b/sop-website/sop-portal-vue/docs/.vuepress/theme/index.js @@ -0,0 +1,4 @@ +module.exports = { + // 继承默认主题,https://www.vuepress.cn/theme/inheritance.html#%E5%8A%A8%E6%9C%BA + extend: '@vuepress/theme-default' +} diff --git a/sop-website/sop-portal-vue/docs/.vuepress/theme/util/index.js b/sop-website/sop-portal-vue/docs/.vuepress/theme/util/index.js new file mode 100644 index 00000000..92fcd3b3 --- /dev/null +++ b/sop-website/sop-portal-vue/docs/.vuepress/theme/util/index.js @@ -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 | Array | [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 + } + } +} diff --git a/sop-website/sop-portal-vue/docs/README.md b/sop-website/sop-portal-vue/docs/README.md new file mode 100644 index 00000000..adc86f32 --- /dev/null +++ b/sop-website/sop-portal-vue/docs/README.md @@ -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 +--- diff --git a/sop-website/sop-portal-vue/package.json b/sop-website/sop-portal-vue/package.json new file mode 100644 index 00000000..5e855633 --- /dev/null +++ b/sop-website/sop-portal-vue/package.json @@ -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" + } +}