mirror of https://github.com/dunwu/db-tutorial.git
feat: 更新配置
parent
c82e9d737a
commit
4c3ab73e81
|
@ -15,7 +15,7 @@ jobs:
|
|||
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: [14.x]
|
||||
node-version: [16.x]
|
||||
|
||||
steps:
|
||||
# 使用的动作。格式:userName/repoName。作用:检出仓库,获取源码。 官方actions库:https://github.com/actions
|
||||
|
|
|
@ -12,7 +12,10 @@ module.exports = {
|
|||
// 注入到页面<head> 中的标签,格式[tagName, { attrName: attrValue }, innerHTML?]
|
||||
['link', { rel: 'icon', href: '/img/favicon.ico' }], //favicons,资源放在public文件夹
|
||||
['meta', { name: 'keywords', content: 'vuepress,theme,blog,vdoing' }],
|
||||
['meta', { name: 'theme-color', content: '#11a8cd' }] // 移动浏览器主题颜色
|
||||
['meta', { name: 'theme-color', content: '#11a8cd' }], // 移动浏览器主题颜色
|
||||
|
||||
['meta', { name: 'wwads-cn-verify', content: 'mxqWx62nfQQ9ocT4e5DzISHzOWyF4s' }], // 广告相关,你可以去掉
|
||||
['script', { src: 'https://cdn.wwads.cn/js/makemoney.js', type: 'text/javascript' }], // 广告相关,你可以去掉
|
||||
],
|
||||
markdown: {
|
||||
// lineNumbers: true,
|
||||
|
@ -63,9 +66,10 @@ module.exports = {
|
|||
editLinkText: '📝 帮助改善此页面!',
|
||||
|
||||
// 以下配置是Vdoing主题改动的和新增的配置
|
||||
sidebar: { mode: 'structuring', collapsable: false }, // 侧边栏 'structuring' | { mode: 'structuring', collapsable: Boolean} | 'auto' | 自定义 温馨提示:目录页数据依赖于结构化的侧边栏数据,如果你不设置为'structuring',将无法使用目录页
|
||||
sidebar: { mode: 'structuring', collapsable: true }, // 侧边栏 'structuring' | { mode: 'structuring', collapsable:
|
||||
// Boolean} | 'auto' | 自定义 温馨提示:目录页数据依赖于结构化的侧边栏数据,如果你不设置为'structuring',将无法使用目录页
|
||||
|
||||
// sidebarOpen: false, // 初始状态是否打开侧边栏,默认true
|
||||
sidebarOpen: true, // 初始状态是否打开侧边栏,默认true
|
||||
updateBar: {
|
||||
// 最近更新栏
|
||||
showToArticle: true // 显示到文章页底部,默认true
|
||||
|
|
|
@ -20,25 +20,42 @@
|
|||
|
||||
module.exports = {
|
||||
// 万维广告
|
||||
pageB: `
|
||||
<div class="wwads-cn wwads-horizontal pageB" data-id="136" style="width:100%;max-height:80px;min-height:auto;"></div>
|
||||
<style>
|
||||
.pageB img{width:80px!important;}
|
||||
.wwads-horizontal .wwads-text, .wwads-content .wwads-text{line-height:1;}
|
||||
</style>
|
||||
`,
|
||||
// pageT: `
|
||||
// <div class="wwads-cn wwads-horizontal page-wwads" data-id="261"></div>
|
||||
// <style>
|
||||
// .page-wwads{
|
||||
// width:100%!important;
|
||||
// min-height: 0;
|
||||
// margin: 0;
|
||||
// }
|
||||
// .page-wwads .wwads-img img{
|
||||
// width:80px!important;
|
||||
// }
|
||||
// .page-wwads .wwads-poweredby{
|
||||
// width: 40px;
|
||||
// position: absolute;
|
||||
// right: 25px;
|
||||
// bottom: 3px;
|
||||
// }
|
||||
// .wwads-content .wwads-text, .page-wwads .wwads-text{
|
||||
// height: 100%;
|
||||
// padding-top: 5px;
|
||||
// display: block;
|
||||
// }
|
||||
// </style>
|
||||
// `,
|
||||
windowRB: `
|
||||
<div class="wwads-cn wwads-vertical windowRB" data-id="136" style="max-width:160px;
|
||||
<div class="wwads-cn wwads-vertical windowRB" data-id="261" style="max-width:160px;
|
||||
min-width: auto;min-height:auto;"></div>
|
||||
<style>
|
||||
.windowRB{ padding: 0;}
|
||||
.windowRB .wwads-img{margin-top: 10px;}
|
||||
.windowRB .wwads-content{margin: 0 10px 10px 10px;}
|
||||
.windowRB .wwads-content{margin: 0 10px 40px 10px;}
|
||||
.custom-html-window-rb .close-but{
|
||||
display: none;
|
||||
}
|
||||
</style>
|
||||
`
|
||||
`,
|
||||
}
|
||||
|
||||
// module.exports = {
|
||||
|
|
|
@ -1,9 +1,59 @@
|
|||
// import vue from 'vue/dist/vue.esm.browser'
|
||||
/**
|
||||
* to主题使用者:你可以去掉本文件的所有代码
|
||||
*/
|
||||
export default ({
|
||||
Vue, // VuePress 正在使用的 Vue 构造函数
|
||||
options, // 附加到根实例的一些选项
|
||||
router, // 当前应用的路由实例
|
||||
siteData // 站点元数据
|
||||
siteData, // 站点元数据
|
||||
isServer // 当前应用配置是处于 服务端渲染 还是 客户端
|
||||
}) => {
|
||||
// window.Vue = vue // 使页面中可以使用Vue构造函数 (使页面中的vue demo生效)
|
||||
|
||||
// 用于监控在路由变化时检查广告拦截器 (to主题使用者:你可以去掉本文件的所有代码)
|
||||
if (!isServer) {
|
||||
router.afterEach(() => {
|
||||
//check if wwads' fire function was blocked after document is ready with 3s timeout (waiting the ad loading)
|
||||
docReady(function () {
|
||||
setTimeout(function () {
|
||||
if (window._AdBlockInit === undefined) {
|
||||
ABDetected();
|
||||
}
|
||||
}, 3000);
|
||||
});
|
||||
|
||||
// 删除事件改为隐藏事件
|
||||
setTimeout(() => {
|
||||
const pageAD = document.querySelector('.page-wwads');
|
||||
if (!pageAD) return;
|
||||
const btnEl = pageAD.querySelector('.wwads-hide');
|
||||
if (btnEl) {
|
||||
btnEl.onclick = () => {
|
||||
pageAD.style.display = 'none';
|
||||
}
|
||||
}
|
||||
// 显示广告模块
|
||||
if (pageAD.style.display === 'none') {
|
||||
pageAD.style.display = 'flex';
|
||||
}
|
||||
}, 900);
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function ABDetected() {
|
||||
const h = "<style>.wwads-horizontal,.wwads-vertical{background-color:#f4f8fa;padding:5px;min-height:120px;margin-top:20px;box-sizing:border-box;border-radius:3px;font-family:sans-serif;display:flex;min-width:150px;position:relative;overflow:hidden;}.wwads-horizontal{flex-wrap:wrap;justify-content:center}.wwads-vertical{flex-direction:column;align-items:center;padding-bottom:32px}.wwads-horizontal a,.wwads-vertical a{text-decoration:none}.wwads-horizontal .wwads-img,.wwads-vertical .wwads-img{margin:5px}.wwads-horizontal .wwads-content,.wwads-vertical .wwads-content{margin:5px}.wwads-horizontal .wwads-content{flex:130px}.wwads-vertical .wwads-content{margin-top:10px}.wwads-horizontal .wwads-text,.wwads-content .wwads-text{font-size:14px;line-height:1.4;color:#0e1011;-webkit-font-smoothing:antialiased}.wwads-horizontal .wwads-poweredby,.wwads-vertical .wwads-poweredby{display:block;font-size:11px;color:#a6b7bf;margin-top:1em}.wwads-vertical .wwads-poweredby{position:absolute;left:10px;bottom:10px}.wwads-horizontal .wwads-poweredby span,.wwads-vertical .wwads-poweredby span{transition:all 0.2s ease-in-out;margin-left:-1em}.wwads-horizontal .wwads-poweredby span:first-child,.wwads-vertical .wwads-poweredby span:first-child{opacity:0}.wwads-horizontal:hover .wwads-poweredby span,.wwads-vertical:hover .wwads-poweredby span{opacity:1;margin-left:0}.wwads-horizontal .wwads-hide,.wwads-vertical .wwads-hide{position:absolute;right:-23px;bottom:-23px;width:46px;height:46px;border-radius:23px;transition:all 0.3s ease-in-out;cursor:pointer;}.wwads-horizontal .wwads-hide:hover,.wwads-vertical .wwads-hide:hover{background:rgb(0 0 0 /0.05)}.wwads-horizontal .wwads-hide svg,.wwads-vertical .wwads-hide svg{position:absolute;left:10px;top:10px;fill:#a6b7bf}.wwads-horizontal .wwads-hide:hover svg,.wwads-vertical .wwads-hide:hover svg{fill:#3E4546}</style><a href='https://wwads.cn/page/whitelist-wwads' class='wwads-img' target='_blank' rel='nofollow'><img src='https://fastly.jsdelivr.net/gh/xugaoyi/image_store@master/blog/wwads.2a3pidhlh4ys.webp' width='130'></a><div class='wwads-content'><a href='https://wwads.cn/page/whitelist-wwads' class='wwads-text' target='_blank' rel='nofollow'>为了本站的长期运营,请将我们的网站加入广告拦截器的白名单,感谢您的支持!<span style='color: #11a8cd'>如何添加白名单?</span></a><a href='https://wwads.cn/page/end-user-privacy' class='wwads-poweredby' title='万维广告 ~ 让广告更优雅,且有用' target='_blank'><span>广告</span></a></div><a class='wwads-hide' onclick='parentNode.remove()' title='隐藏广告'><svg xmlns='http://www.w3.org/2000/svg' width='6' height='7'><path d='M.879.672L3 2.793 5.121.672a.5.5 0 11.707.707L3.708 3.5l2.12 2.121a.5.5 0 11-.707.707l-2.12-2.12-2.122 2.12a.5.5 0 11-.707-.707l2.121-2.12L.172 1.378A.5.5 0 01.879.672z'></path></svg></a>";
|
||||
const wwadsEl = document.getElementsByClassName("wwads-cn");
|
||||
const wwadsContentEl = document.querySelector('.wwads-content');
|
||||
if (wwadsEl[0] && !wwadsContentEl) {
|
||||
wwadsEl[0].innerHTML = h;
|
||||
}
|
||||
};
|
||||
|
||||
//check document ready
|
||||
function docReady(t) {
|
||||
"complete" === document.readyState ||
|
||||
"interactive" === document.readyState
|
||||
? setTimeout(t, 1)
|
||||
: document.addEventListener("DOMContentLoaded", t);
|
||||
}
|
||||
|
|
20
package.json
20
package.json
|
@ -1,11 +1,11 @@
|
|||
{
|
||||
"name": "java-tutorial",
|
||||
"name": "db-tutorial",
|
||||
"version": "1.0.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"clean": "rimraf docs/.temp",
|
||||
"start": "vuepress dev docs",
|
||||
"build": "vuepress build docs",
|
||||
"start": "node --max_old_space_size=4096 ./node_modules/vuepress/cli.js dev docs",
|
||||
"build": "node --max_old_space_size=4096 ./node_modules/vuepress/cli.js build docs",
|
||||
"deploy": "bash scripts/deploy.sh",
|
||||
"updateTheme": "yarn remove vuepress-theme-vdoing && rm -rf node_modules && yarn && yarn add vuepress-theme-vdoing -D",
|
||||
"editFm": "node utils/editFrontmatter.js",
|
||||
|
@ -15,19 +15,23 @@
|
|||
"view-info": "vuepress view-info ./ --temp docs/.temp"
|
||||
},
|
||||
"devDependencies": {
|
||||
"dayjs": "^1.9.7",
|
||||
"inquirer": "^7.1.0",
|
||||
"dayjs": "^1.11.7",
|
||||
"inquirer": "^9.1.4",
|
||||
"json2yaml": "^1.1.0",
|
||||
"vuepress": "1.9.2",
|
||||
"markdownlint-cli": "^0.33.0",
|
||||
"markdownlint-rule-emphasis-style": "^1.0.1",
|
||||
"rimraf": "^4.1.2",
|
||||
"vue-toasted": "^1.1.25",
|
||||
"vuepress": "1.9.9",
|
||||
"vuepress-plugin-baidu-tongji": "^1.0.1",
|
||||
"vuepress-plugin-comment": "^0.7.3",
|
||||
"vuepress-plugin-demo-block": "^0.7.2",
|
||||
"vuepress-plugin-flowchart": "^1.4.2",
|
||||
"vuepress-plugin-fulltext-search": "^2.2.1",
|
||||
"vuepress-plugin-one-click-copy": "^1.0.2",
|
||||
"vuepress-plugin-thirdparty-search": "^1.0.2",
|
||||
"vuepress-plugin-zooming": "^1.1.7",
|
||||
"vuepress-plugin-flowchart": "^1.4.2",
|
||||
"vuepress-theme-vdoing": "^1.10.3",
|
||||
"vuepress-theme-vdoing": "^1.12.9",
|
||||
"yamljs": "^0.3.0",
|
||||
"markdownlint-cli": "^0.25.0",
|
||||
"markdownlint-rule-emphasis-style": "^1.0.1",
|
||||
|
|
|
@ -0,0 +1,10 @@
|
|||
/**
|
||||
* @see https://prettier.io/docs/en/options.html
|
||||
* @see https://prettier.io/docs/en/configuration.html
|
||||
*/
|
||||
module.exports = {
|
||||
tabWidth: 2,
|
||||
semi: false,
|
||||
singleQuote: true,
|
||||
trailingComma: 'none'
|
||||
}
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
# ------------------------------------------------------------------------------
|
||||
# gh-pages 部署脚本
|
||||
# @author Zhang Peng
|
||||
# @author <a href="mailto:forbreak@163.com">Zhang Peng</a>
|
||||
# @since 2020/2/10
|
||||
# ------------------------------------------------------------------------------
|
||||
|
||||
|
|
|
@ -1,14 +1,15 @@
|
|||
# 批量添加和修改、删除front matter配置文件
|
||||
|
||||
# 需要批量处理的路径,docs文件夹内的文件夹 (数组。映射路径:docs/arr[0]/arr[1] ... )
|
||||
# 需要批量处理的路径,docs文件夹内的文件夹 (数组,映射路径:path[0]/path[1]/path[2] ... )
|
||||
path:
|
||||
- docs # 第一个成员必须是docs
|
||||
|
||||
# 要删除的字段 (数组)
|
||||
delete:
|
||||
# - test
|
||||
# - tags
|
||||
|
||||
# 要添加、修改front matter的数据 (front matter中没有的数据则添加,已有的数据则覆盖)
|
||||
data:
|
||||
article: false
|
||||
# author:
|
||||
# name: xugaoyi
|
||||
# link: https://github.com/xugaoyi
|
||||
|
|
|
@ -1,38 +1,40 @@
|
|||
/**
|
||||
* 批量添加和修改front matter ,需要配置 ./config.yml 文件。
|
||||
*/
|
||||
const fs = require('fs'); // 文件模块
|
||||
const path = require('path'); // 路径模块
|
||||
const matter = require('gray-matter'); // front matter解析器 https://github.com/jonschlinkert/gray-matter
|
||||
const fs = require('fs') // 文件模块
|
||||
const path = require('path') // 路径模块
|
||||
const matter = require('gray-matter') // front matter解析器 https://github.com/jonschlinkert/gray-matter
|
||||
const jsonToYaml = require('json2yaml')
|
||||
const yamlToJs = require('yamljs')
|
||||
const inquirer = require('inquirer') // 命令行操作
|
||||
const chalk = require('chalk') // 命令行打印美化
|
||||
const readFileList = require('./modules/readFileList');
|
||||
const { type, repairDate} = require('./modules/fn');
|
||||
const readFileList = require('./modules/readFileList')
|
||||
const { type, repairDate } = require('./modules/fn')
|
||||
const log = console.log
|
||||
|
||||
const configPath = path.join(__dirname, 'config.yml') // 配置文件的路径
|
||||
|
||||
main();
|
||||
main()
|
||||
|
||||
/**
|
||||
* 主体函数
|
||||
*/
|
||||
async function main() {
|
||||
|
||||
const promptList = [{
|
||||
type: "confirm",
|
||||
const promptList = [
|
||||
{
|
||||
type: 'confirm',
|
||||
message: chalk.yellow('批量操作frontmatter有修改数据的风险,确定要继续吗?'),
|
||||
name: "edit",
|
||||
}];
|
||||
let edit = true;
|
||||
name: 'edit'
|
||||
}
|
||||
]
|
||||
let edit = true
|
||||
|
||||
await inquirer.prompt(promptList).then(answers => {
|
||||
await inquirer.prompt(promptList).then((answers) => {
|
||||
edit = answers.edit
|
||||
})
|
||||
|
||||
if(!edit) { // 退出操作
|
||||
if (!edit) {
|
||||
// 退出操作
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -48,13 +50,13 @@ async function main() {
|
|||
return
|
||||
}
|
||||
|
||||
const filePath = path.join(__dirname, '..', ...config.path); // 要批量修改的文件路径
|
||||
const files = readFileList(filePath); // 读取所有md文件数据
|
||||
const filePath = path.join(__dirname, '..', ...config.path) // 要批量修改的文件路径
|
||||
const files = readFileList(filePath) // 读取所有md文件数据
|
||||
|
||||
files.forEach(file => {
|
||||
let dataStr = fs.readFileSync(file.filePath, 'utf8');// 读取每个md文件的内容
|
||||
files.forEach((file) => {
|
||||
let dataStr = fs.readFileSync(file.filePath, 'utf8') // 读取每个md文件的内容
|
||||
const fileMatterObj = matter(dataStr) // 解析md文件的front Matter。 fileMatterObj => {content:'剔除frontmatter后的文件内容字符串', data:{<frontmatter对象>}, ...}
|
||||
let matterData = fileMatterObj.data; // 得到md文件的front Matter
|
||||
let matterData = fileMatterObj.data // 得到md文件的front Matter
|
||||
|
||||
let mark = false
|
||||
// 删除操作
|
||||
|
@ -62,13 +64,12 @@ async function main() {
|
|||
if (type(config.delete) !== 'array') {
|
||||
log(chalk.yellow('未能完成删除操作,delete字段的值应该是一个数组!'))
|
||||
} else {
|
||||
config.delete.forEach(item => {
|
||||
config.delete.forEach((item) => {
|
||||
if (matterData[item]) {
|
||||
delete matterData[item]
|
||||
mark = true
|
||||
}
|
||||
})
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -83,10 +84,15 @@ async function main() {
|
|||
if (matterData.date && type(matterData.date) === 'date') {
|
||||
matterData.date = repairDate(matterData.date) // 修复时间格式
|
||||
}
|
||||
const newData = jsonToYaml.stringify(matterData).replace(/\n\s{2}/g,"\n").replace(/"/g,"") + '---\r\n' + fileMatterObj.content;
|
||||
fs.writeFileSync(file.filePath, newData); // 写入
|
||||
const newData =
|
||||
jsonToYaml
|
||||
.stringify(matterData)
|
||||
.replace(/\n\s{2}/g, '\n')
|
||||
.replace(/"/g, '') +
|
||||
'---\r\n' +
|
||||
fileMatterObj.content
|
||||
fs.writeFileSync(file.filePath, newData) // 写入
|
||||
log(chalk.green(`update frontmatter:${file.filePath} `))
|
||||
}
|
||||
|
||||
})
|
||||
}
|
||||
|
|
|
@ -6,13 +6,17 @@ exports.type = function (o){
|
|||
|
||||
// 修复date时区格式的问题
|
||||
exports.repairDate = function (date) {
|
||||
date = new Date(date);
|
||||
return `${date.getUTCFullYear()}-${zero(date.getUTCMonth()+1)}-${zero(date.getUTCDate())} ${zero(date.getUTCHours())}:${zero(date.getUTCMinutes())}:${zero(date.getUTCSeconds())}`;
|
||||
date = new Date(date)
|
||||
return `${date.getUTCFullYear()}-${zero(date.getUTCMonth() + 1)}-${zero(date.getUTCDate())} ${zero(
|
||||
date.getUTCHours()
|
||||
)}:${zero(date.getUTCMinutes())}:${zero(date.getUTCSeconds())}`
|
||||
}
|
||||
|
||||
// 日期的格式
|
||||
exports.dateFormat = function (date) {
|
||||
return `${date.getFullYear()}-${zero(date.getMonth()+1)}-${zero(date.getDate())} ${zero(date.getHours())}:${zero(date.getMinutes())}:${zero(date.getSeconds())}`
|
||||
return `${date.getFullYear()}-${zero(date.getMonth() + 1)}-${zero(date.getDate())} ${zero(date.getHours())}:${zero(
|
||||
date.getMinutes()
|
||||
)}:${zero(date.getSeconds())}`
|
||||
}
|
||||
|
||||
// 小于10补0
|
||||
|
|
|
@ -1,43 +1,49 @@
|
|||
/**
|
||||
* 读取所有md文件数据
|
||||
*/
|
||||
const fs = require('fs'); // 文件模块
|
||||
const path = require('path'); // 路径模块
|
||||
const docsRoot = path.join(__dirname, '..', '..', 'docs'); // docs文件路径
|
||||
const fs = require('fs') // 文件模块
|
||||
const path = require('path') // 路径模块
|
||||
const docsRoot = path.join(__dirname, '..', '..', 'docs') // docs文件路径
|
||||
|
||||
function readFileList(dir = docsRoot, filesList = []) {
|
||||
const files = fs.readdirSync(dir);
|
||||
const files = fs.readdirSync(dir)
|
||||
files.forEach((item, index) => {
|
||||
let filePath = path.join(dir, item);
|
||||
const stat = fs.statSync(filePath);
|
||||
let filePath = path.join(dir, item)
|
||||
const stat = fs.statSync(filePath)
|
||||
if (stat.isDirectory() && item !== '.vuepress') {
|
||||
readFileList(path.join(dir, item), filesList); //递归读取文件
|
||||
readFileList(path.join(dir, item), filesList) //递归读取文件
|
||||
} else {
|
||||
if(path.basename(dir) !== 'docs'){ // 过滤docs目录级下的文件
|
||||
if (path.basename(dir) !== 'docs') {
|
||||
// 过滤docs目录级下的文件
|
||||
|
||||
const fileNameArr = path.basename(filePath).split('.')
|
||||
let name = null, type = null;
|
||||
if (fileNameArr.length === 2) { // 没有序号的文件
|
||||
const filename = path.basename(filePath)
|
||||
const fileNameArr = filename.split('.')
|
||||
const firstDotIndex = filename.indexOf('.')
|
||||
const lastDotIndex = filename.lastIndexOf('.')
|
||||
|
||||
let name = null,
|
||||
type = null
|
||||
if (fileNameArr.length === 2) {
|
||||
// 没有序号的文件
|
||||
name = fileNameArr[0]
|
||||
type = fileNameArr[1]
|
||||
} else if (fileNameArr.length === 3) { // 有序号的文件
|
||||
name = fileNameArr[1]
|
||||
type = fileNameArr[2]
|
||||
} else { // 超过两个‘.’的
|
||||
log(chalk.yellow(`warning: 该文件 "${filePath}" 没有按照约定命名,将忽略生成相应数据。`))
|
||||
return
|
||||
} else if (fileNameArr.length >= 3) {
|
||||
// 有序号的文件(或文件名中间有'.')
|
||||
name = filename.substring(firstDotIndex + 1, lastDotIndex)
|
||||
type = filename.substring(lastDotIndex + 1)
|
||||
}
|
||||
if(type === 'md'){ // 过滤非md文件
|
||||
|
||||
if (type === 'md') {
|
||||
// 过滤非md文件
|
||||
filesList.push({
|
||||
name,
|
||||
filePath
|
||||
});
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
return filesList
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
});
|
||||
return filesList;
|
||||
}
|
||||
|
||||
module.exports = readFileList;
|
||||
module.exports = readFileList
|
||||
|
|
Loading…
Reference in New Issue