Initial commit

This commit is contained in:
snailRun
2025-02-13 15:00:17 +08:00
commit 4944cdbc7c
64 changed files with 32348 additions and 0 deletions
+125
View File
@@ -0,0 +1,125 @@
### Node template
.idea
.DS_Store
dist
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
lerna-debug.log*
.temp
yarn.lock
# Diagnostic reports (https://nodejs.org/api/report.html)
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
# Runtime data
pids
*.pid
*.seed
*.pid.lock
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
*.lcov
# nyc test coverage
.nyc_output
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# Bower dependency directory (https://bower.io/)
bower_components
# node-waf configuration
.lock-wscript
# Compiled binary addons (https://nodejs.org/api/addons.html)
build/Release
# Dependency directories
node_modules/
jspm_packages/
# Snowpack dependency directory (https://snowpack.dev/)
web_modules/
# TypeScript cache
*.tsbuildinfo
# Optional npm cache directory
.npm
# Optional eslint cache
.eslintcache
# Microbundle cache
.rpt2_cache/
.rts2_cache_cjs/
.rts2_cache_es/
.rts2_cache_umd/
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
*.tgz
# Yarn Integrity file
.yarn-integrity
# dotenv environment variables file
.env
.env.test
# parcel-bundler cache (https://parceljs.org/)
.cache
.parcel-cache
# Next.js build output
.next
out
# Nuxt.js build / generate output
.nuxt
dist
# Gatsby files
.cache/
# Comment in the assets line in if your project uses Gatsby and not Next.js
# https://nextjs.org/blog/next-9-1#public-directory-support
# assets
# vuepress build output
.vuepress/dist
# Serverless directories
.serverless/
# FuseBox cache
.fusebox/
# DynamoDB Local files
.dynamodb/
# TernJS port file
.tern-port
# Stores VSCode versions used for testing VSCode extensions
.vscode-test
# yarn v2
.yarn/cache
.yarn/unplugged
.yarn/build-state.yml
.yarn/install-state.gz
.pnp.*
/.vuepress/dist/
+146
View File
@@ -0,0 +1,146 @@
import { defineConfig } from "vuepress/config";
import navbar from "./navbar";
import sidebar from "./sidebar";
import footer from "./footer";
import extraSideBar from "./extraSideBar";
const author = "程序员鱼皮";
const domain = "https://ai.codefather.cn";
const tags = [
"ai",
"deepseek",
"AI资讯",
"人工智能",
"AI行业趋势",
"AI技术",
"AI新闻",
"AI动态",
"AI市场分析",
"AI模型",
"AI独家分析",
"AI深度解读",
];
export default defineConfig({
title: "鱼皮的 AI 知识库",
description:
"鱼皮的 AI 知识库是一个专注于人工智能的知识分享平台,汇集Deepseek、机器学习、深度学习、NLP等AI领域优质教程与资源。提供系统化的AI教程、精选AI资源,助你快速掌握AI技术,成为AI专家!",
head: [
// 站点图标
["link", { rel: "icon", href: "/favicon.ico" }],
// SEO
[
"meta",
{
name: "keywords",
content:
"ai, deepseek, AI资讯, 人工智能, AI行业趋势, AI技术, AI新闻, AI动态, AI市场分析, AI模型, AI独家分析, AI深度解读",
},
],
// 百度统计
[
"script",
{},
`
var _hmt = _hmt || [];
(function() {
var hm = document.createElement("script");
hm.src = "https://hm.baidu.com/hm.js?2675818a983a3131404cee835018f016";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
`,
],
],
permalink: "/:slug",
// 监听文件变化,热更新
extraWatchFiles: [".vuepress/*.ts", ".vuepress/sidebars/*.ts"],
markdown: {
// 开启代码块的行号
lineNumbers: true,
// 支持 4 级以上的标题渲染
extractHeaders: ["h2", "h3", "h4", "h5", "h6"],
},
// @ts-ignore
plugins: [
["@vuepress/back-to-top"],
// Google 分析
[
"@vuepress/google-analytics",
{
ga: "GTM-WVS9HM6W", // 补充自己的谷歌分析 ID,比如 UA-00000000-0
},
],
["@vuepress/medium-zoom"],
// https://github.com/lorisleiva/vuepress-plugin-seo
[
"seo",
{
siteTitle: (_, $site) => $site.title,
title: ($page) => $page.title,
description: ($page) => $page.frontmatter.description || $page.description,
author: (_, $site) => $site.themeConfig.author || author,
tags: ($page) => $page.frontmatter.tags || tags,
type: ($page) => "article",
url: (_, $site, path) => ($site.themeConfig.domain || domain || "") + path,
image: ($page, $site) =>
$page.frontmatter.image &&
(($site.themeConfig.domain && !$page.frontmatter.image.startsWith("http")) || "") + $page.frontmatter.image,
publishedAt: ($page) => $page.frontmatter.date && new Date($page.frontmatter.date),
modifiedAt: ($page) => $page.lastUpdated && new Date($page.lastUpdated),
},
],
// https://github.com/ekoeryanto/vuepress-plugin-sitemap
[
"sitemap",
{
hostname: domain,
},
],
// https://github.com/IOriens/vuepress-plugin-baidu-autopush
["vuepress-plugin-baidu-autopush"],
// https://github.com/zq99299/vuepress-plugin/tree/master/vuepress-plugin-tags
["vuepress-plugin-tags"],
// https://github.com/znicholasbrown/vuepress-plugin-code-copy
[
"vuepress-plugin-code-copy",
{
successText: "代码已复制",
},
],
// https://github.com/webmasterish/vuepress-plugin-feed
[
"feed",
{
canonical_base: domain,
count: 10000,
// 需要自动推送的文档目录
posts_directories: [],
},
],
// https://github.com/tolking/vuepress-plugin-img-lazy
["img-lazy"],
],
// 主题配置
themeConfig: {
logo: "/logo.png",
nav: navbar,
sidebar,
lastUpdated: "最近更新",
// GitHub 仓库位置
repo: "liyupi/codefather",
docsBranch: "master",
// 编辑链接
editLinks: true,
editLinkText: "完善页面",
// @ts-ignore
// 底部版权信息
footer,
// 额外右侧边栏
extraSideBar,
},
});
+49
View File
@@ -0,0 +1,49 @@
/**
* 额外右侧边栏
*/
export default [
{
title: "手机看",
icon: "/icon/mobile.png",
popoverTitle: "微信扫一扫",
popoverUrl:
"/qrcode-codefather.png",
popoverDesc: "可以手机看或分享至朋友圈",
},
{
title: "编程导航",
icon: "/icon/xingqiu.png",
popoverTitle:
'<span style="font-size:0.8rem;font-weight:bold;"><span style="color:red;">保姆级实战项目教程</span>、编程学习指南、学习资源、求职指南、技术分享、编程交流</span>',
popoverUrl:
"/qrcode-codenav.png",
popoverDesc: "编程导航:编程导航",
},
{
title: "交流群",
icon: "/icon/weixin.png",
popoverTitle:
'<span style="font-size:0.8rem;font-weight:bold;">扫码添加 <span style="color:red;">编程导航小助手微信</span>,拉你进专属编程学习交流群</span>',
popoverUrl:
"/qrcode-codenavhelper.png",
},
{
title: "下资料",
icon: "/icon/xiazai.png",
popoverTitle:
'<span style="font-size:0.8rem;font-weight:bold;">扫码关注站长公众号,回复 <span style="color:red;">学习</span> 获取海量编程学习资源「无任何套路」</span>',
popoverUrl:
"/qrcode-mpcoder_yupi.jpg",
popoverDesc: "公众号: 程序员鱼皮",
},
{
title: "支持我",
icon: "/icon/dianzan.png",
popoverTitle:
' <span style="font-size:0.8rem;font-weight:bold;">鼓励和赞赏我</span>',
popoverUrl:
"/qrcode-thumb.jpg",
popoverDesc:
"感谢您的支持,作者头发++",
},
];
+32
View File
@@ -0,0 +1,32 @@
/**
* 底部版权信息
*/
export default {
friendLinks: [
{
label: "站长 - 程序员鱼皮",
// icon: "/icon/user.svg",
href: "https://yuyuanweb.feishu.cn/wiki/Abldw5WkjidySxkKxU2cQdAtnah",
},
{
label: "鱼鸢网络",
href: "https://yuyuanweb.com/",
},
{
label: "老鱼简历",
href: "https://www.laoyujianli.com/",
},
{
label: "鱼聪明 AI",
href: "https://www.yucongming.com/",
},
{
label: "编程学习圈",
href: "https://yuyuanweb.feishu.cn/wiki/VC1qwmX9diCBK3kidyec74vFnde",
},
],
copyright: {
href: "https://beian.miit.gov.cn/",
name: "沪ICP备19026706号-6",
},
};
+28
View File
@@ -0,0 +1,28 @@
import { NavItem } from "vuepress/config";
export default [
{
text: "DeepSeek 基础",
link: "/Deepseek基础",
},
{
text: "DeepSeek 使用指南",
link: "/Deepseek使用指南",
},
{
text: "DeepSeek 使用场景",
link: "/Deepseek使用场景",
},
{
text: "DeepSeek 资源汇总",
link: "/Deepseek资源汇总",
},
{
text: "DeepSeek 技术深度",
link: "/Deepseek技术深度",
},
{
text: "作者",
link: "/作者/",
},
] as NavItem[];
@@ -0,0 +1 @@
a4b32671d3703c3969a3d20817fda860
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

+1
View File
@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1698125628445" class="icon" viewBox="0 0 1117 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="12356" xmlns:xlink="http://www.w3.org/1999/xlink" width="218.1640625" height="200"><path d="M875.706182 1013.341091H241.384727a110.685091 110.685091 0 0 1-109.707636-109.707636v-474.763637a110.685091 110.685091 0 0 1 109.707636-109.707636h634.321455a110.685091 110.685091 0 0 1 109.707636 109.707636v474.763637a110.685091 110.685091 0 0 1-109.707636 109.707636zM241.384727 379.019636c-27.927273 0-49.896727 21.922909-49.896727 49.850182v474.763637c0 27.927273 21.969455 49.896727 49.896727 49.896727h634.321455c27.927273 0 49.896727-21.969455 49.896727-49.896727v-474.763637c0-27.927273-21.969455-49.850182-49.896727-49.850182H241.384727z" p-id="12357" fill="#85858a"></path><path d="M319.162182 560.546909a53.853091 53.853091 0 1 0 107.706182 0 53.853091 53.853091 0 0 0-107.706182 0zM690.222545 560.546909a53.853091 53.853091 0 1 0 107.706182 0 53.853091 53.853091 0 0 0-107.706182 0zM452.840727 718.149818c-29.928727 0-53.899636 23.924364-53.899636 53.853091s23.970909 53.853091 53.899636 53.853091v-107.706182zM664.203636 823.854545c29.928727 0 53.899636-23.924364 53.899637-53.85309s-23.970909-53.853091-53.899637-53.853091V823.854545z m-211.409454 0h211.409454v-105.704727H452.887273V823.854545zM558.545455 379.019636a30.72 30.72 0 0 1-29.928728-29.928727V135.633455c0-15.965091 13.963636-29.928727 29.928728-29.928728s29.928727 13.963636 29.928727 29.928728v211.456c0 17.966545-13.963636 31.930182-29.928727 31.930181zM29.928727 799.930182A30.72 30.72 0 0 1 0 770.001455v-209.454546c0-15.965091 13.963636-29.928727 29.928727-29.928727s29.928727 11.962182 29.928728 29.928727v211.456c0 15.965091-13.963636 27.927273-29.928728 27.927273z m1057.233455 0a30.72 30.72 0 0 1-29.928727-29.928727v-209.454546c0-15.965091 13.963636-29.928727 29.928727-29.928727s29.928727 13.963636 29.928727 29.928727v211.456c0 15.965091-13.963636 27.927273-29.928727 27.927273z" p-id="12358" fill="#85858a"></path><path d="M558.545455 165.562182A82.152727 82.152727 0 0 1 476.765091 83.781818c0-43.892364 37.888-83.781818 81.780364-83.781818s81.780364 37.888 81.780363 83.781818c0 45.893818-35.886545 81.780364-81.780363 81.780364z m0-103.703273c-11.962182 0-21.922909 9.960727-21.92291 23.924364 0 11.962182 9.960727 21.922909 21.92291 21.922909a22.155636 22.155636 0 0 0 21.922909-21.922909c0-13.963636-9.960727-23.924364-21.922909-23.924364z" p-id="12359" fill="#85858a"></path></svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

+1
View File
@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1698124167975" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="8677" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64z m0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z" p-id="8678" fill="#85858a"></path><path d="M517.6 351.3c53 0 89 33.8 93 83.4 0.3 4.2 3.8 7.4 8 7.4h56.7c2.6 0 4.7-2.1 4.7-4.7 0-86.7-68.4-147.4-162.7-147.4C407.4 290 344 364.2 344 486.8v52.3C344 660.8 407.4 734 517.3 734c94 0 162.7-58.8 162.7-141.4 0-2.6-2.1-4.7-4.7-4.7h-56.8c-4.2 0-7.6 3.2-8 7.3-4.2 46.1-40.1 77.8-93 77.8-65.3 0-102.1-47.9-102.1-133.6v-52.6c0.1-87 37-135.5 102.2-135.5z" p-id="8679" fill="#85858a"></path></svg>

After

Width:  |  Height:  |  Size: 940 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 944 B

+1
View File
@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1698124180660" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="8880" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M512 512m-48 0a48 48 0 1 0 96 0 48 48 0 1 0-96 0Z" p-id="8881" fill="#85858a"></path><path d="M712 512m-48 0a48 48 0 1 0 96 0 48 48 0 1 0-96 0Z" p-id="8882" fill="#85858a"></path><path d="M312 512m-48 0a48 48 0 1 0 96 0 48 48 0 1 0-96 0Z" p-id="8883" fill="#85858a"></path><path d="M925.2 338.4c-22.6-53.7-55-101.9-96.3-143.3-41.3-41.3-89.5-73.8-143.3-96.3C630.6 75.7 572.2 64 512 64h-2c-60.6 0.3-119.3 12.3-174.5 35.9-53.3 22.8-101.1 55.2-142 96.5-40.9 41.3-73 89.3-95.2 142.8-23 55.4-34.6 114.3-34.3 174.9 0.3 69.4 16.9 138.3 48 199.9v152c0 25.4 20.6 46 46 46h152.1c61.6 31.1 130.5 47.7 199.9 48h2.1c59.9 0 118-11.6 172.7-34.3 53.5-22.3 101.6-54.3 142.8-95.2 41.3-40.9 73.8-88.7 96.5-142 23.6-55.2 35.6-113.9 35.9-174.5 0.3-60.9-11.5-120-34.8-175.6z m-151.1 438C704 845.8 611 884 512 884h-1.7c-60.3-0.3-120.2-15.3-173.1-43.5l-8.4-4.5H188V695.2l-4.5-8.4C155.3 633.9 140.3 574 140 513.7c-0.4-99.7 37.7-193.3 107.6-263.8 69.8-70.5 163.1-109.5 262.8-109.9h1.7c50 0 98.5 9.7 144.2 28.9 44.6 18.7 84.6 45.6 119 80 34.3 34.3 61.3 74.4 80 119 19.4 46.2 29.1 95.2 28.9 145.8-0.6 99.6-39.7 192.9-110.1 262.7z" p-id="8884" fill="#85858a"></path></svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 388 B

+1
View File
@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1698124265099" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="9085" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M644.7 669.2c-1.5-2.1-3.9-3.3-6.5-3.3H594c-6.5 0-10.3 7.4-6.5 12.7l73.8 102.1c3.2 4.4 9.7 4.4 12.9 0l114.2-158c3.8-5.3 0-12.7-6.5-12.7h-44.3c-2.6 0-5 1.2-6.5 3.3l-63.5 87.8-22.9-31.9zM688 306v-48c0-4.4-3.6-8-8-8H296c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h384c4.4 0 8-3.6 8-8zM296 394c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h184c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8H296z" p-id="9086" fill="#85858a"></path><path d="M480 852H208V148h560v296c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8V108c0-17.7-14.3-32-32-32H168c-17.7 0-32 14.3-32 32v784c0 17.7 14.3 32 32 32h312c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8z" p-id="9087" fill="#85858a"></path><path d="M882.6 531.2l-192-66.7c-0.9-0.3-1.7-0.4-2.6-0.4s-1.8 0.1-2.6 0.4l-192 66.7c-3.2 1.1-5.4 4.1-5.4 7.5v251.1c0 2.5 1.1 4.8 3.1 6.3l192 150.2c1.4 1.1 3.2 1.7 4.9 1.7s3.5-0.6 4.9-1.7l192-150.2c1.9-1.5 3.1-3.8 3.1-6.3V538.7c0-3.4-2.2-6.4-5.4-7.5zM826 763.7L688 871.6 550 763.7V577l138-48 138 48v186.7z" p-id="9088" fill="#85858a"></path></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

+1
View File
@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1698124333844" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="9445" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M925.6 405.1l-203-253.7c-1.2-1.5-3.1-2.4-5-2.4H306.4c-1.9 0-3.8 0.9-5 2.4l-203 253.7c-1.9 2.4-1.9 5.9 0.2 8.3l408.6 459.5c1.2 1.4 3 2.1 4.8 2.1 1.8 0 3.5-0.8 4.8-2.1l408.6-459.5c2.1-2.4 2.1-5.9 0.2-8.3zM645.2 206.4l34.4 133.9-132.5-133.9h98.1z m8.2 178.5H370.6L512 242l141.4 142.9zM378.8 206.4h98.1L344.3 340.3l34.5-133.9z m-53.4 7l-44.1 171.5h-93.1l137.2-171.5zM194.6 434.9H289l125.8 247.7-220.2-247.7zM512 763.4L345.1 434.9h333.7L512 763.4z m97.1-80.8L735 434.9h94.4L609.1 682.6z m133.6-297.7l-44.1-171.5 137.2 171.5h-93.1z" p-id="9446" fill="#85858a"></path></svg>

After

Width:  |  Height:  |  Size: 900 B

+1
View File
@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1698123889530" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="8379" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M858.5 763.6c-18.9-44.8-46.1-85-80.6-119.5-34.5-34.5-74.7-61.6-119.5-80.6-0.4-0.2-0.8-0.3-1.2-0.5C719.5 518 760 444.7 760 362c0-137-111-248-248-248S264 225 264 362c0 82.7 40.5 156 102.8 201.1-0.4 0.2-0.8 0.3-1.2 0.5-44.8 18.9-85 46-119.5 80.6-34.5 34.5-61.6 74.7-80.6 119.5C146.9 807.5 137 854 136 901.8c-0.1 4.5 3.5 8.2 8 8.2h60c4.4 0 7.9-3.5 8-7.8 2-77.2 33-149.5 87.8-204.3 56.7-56.7 132-87.9 212.2-87.9s155.5 31.2 212.2 87.9C779 752.7 810 825 812 902.2c0.1 4.4 3.6 7.8 8 7.8h60c4.5 0 8.1-3.7 8-8.2-1-47.8-10.9-94.3-29.5-138.2zM512 534c-45.9 0-89.1-17.9-121.6-50.4S340 407.9 340 362c0-45.9 17.9-89.1 50.4-121.6S466.1 190 512 190s89.1 17.9 121.6 50.4S684 316.1 684 362c0 45.9-17.9 89.1-50.4 121.6S557.9 534 512 534z" p-id="8380" fill="#85858a"></path></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 721 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 739 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 139 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

+88
View File
@@ -0,0 +1,88 @@
// @ts-ignore
const fs = require("fs");
// @ts-ignore
const path = require("path");
// 定义生成 README.md 文件的函数
function genReadme(directory) {
if (!fs.existsSync(directory)) {
console.error(`错误:目录 "${directory}" 不存在`);
process.exit(1);
}
const dirName = path.basename(directory);
const readmeContent = generateContent(directory, dirName);
const readmePath = path.join(directory, "README.md");
// 写入 README.md 文件
fs.writeFileSync(readmePath, readmeContent);
console.log(`README.md 文件已生成在 ${readmePath},⚠️注意检查是否有问题!`);
}
// 递归生成 Markdown 内容
function generateContent(directory, dirName) {
let content = `# ${dirName}\n\n`;
content += `> 八股文一网打尽,更多面试题请看[程序员面试刷题神器 - 面试鸭](https://www.mianshiya.com/)\n\n`;
// 处理当前目录下的 Markdown 文件
const files = getFilesInDirectory(directory);
if (files.length > 0) {
for (let i = 0; i < Math.min(files.length, 10); i++) {
const file = files[i];
// 跳过 README.md 文件
if (path.basename(file).toLowerCase() === "readme.md") {
continue;
}
const relativePath = path.relative(directory, file)?.replaceAll(" ", "%20");
content += `[${path.basename(file, ".md")}](${relativePath})\n\n`;
}
}
// 处理子目录
const subDirs = getSubDirectories(directory);
for (const subDir of subDirs) {
const subDirName = path.basename(subDir);
// content += `## [${subDirName}](/${dirName}/${subDirName.replaceAll(" ", "%20")}/)\n`;
content += `## ${subDirName} \n`;
const subDirFiles = getFilesInDirectory(subDir);
for (let i = 0; i < Math.min(subDirFiles.length, 10); i++) {
const file = subDirFiles[i];
// 跳过 README.md 文件
if (path.basename(file).toLowerCase() === "readme.md") {
continue;
}
const relativePath = path.relative(directory, file)?.replaceAll(" ", "%20");
content += `[${path.basename(file, ".md")}](${relativePath})\n\n`;
}
}
// 添加底部内容
content += `> 八股文一网打尽,更多面试题请看[程序员面试刷题神器 - 面试鸭](https://www.mianshiya.com/)\n\n`;
return content;
}
// 获取目录下的所有子目录
function getSubDirectories(directory) {
const items = fs.readdirSync(directory, { withFileTypes: true });
return items.filter((item) => item.isDirectory()).map((dir) => path.join(directory, dir.name));
}
// 获取目录下的所有 Markdown 文件
function getFilesInDirectory(directory) {
const items = fs.readdirSync(directory, { withFileTypes: true });
return items
.filter((item) => item.isFile() && path.extname(item.name) === ".md")
.map((file) => path.join(directory, file.name));
}
// 从命令行参数获取目标目录
const targetDirectory = process.argv[2];
if (!targetDirectory) {
console.error("错误:请提供目标目录路径作为参数");
process.exit(1);
}
// 调用生成 README.md 文件的函数
genReadme(targetDirectory);
+136
View File
@@ -0,0 +1,136 @@
const fs = require("fs");
const path = require("path");
function generateSidebarConfig(dirPath) {
const absolutePath = path.resolve(process.cwd(), dirPath);
const sidebarItems = [];
// 如果根目录有 README.md,添加空字符串
if (fs.existsSync(path.join(absolutePath, "README.md"))) {
sidebarItems.push("");
}
// 读取目录内容
function scanDirectory(currentPath, relativeDirPath = "") {
const items = [];
const files = fs.readdirSync(currentPath);
files.forEach((file) => {
const fullPath = path.join(currentPath, file);
const stat = fs.statSync(fullPath);
if (stat.isFile() && file.endsWith(".md") && file !== "README.md") {
// 如果有相对路径,添加相对路径
const relativePath = relativeDirPath
? `${relativeDirPath}/${file.replace(".md", "")}`
: file.replace(".md", "");
items.push(relativePath);
}
});
return items.sort();
}
// 检查目录是否包含子目录
function hasSubDirectories(dirPath) {
const items = fs.readdirSync(dirPath);
return items.some((item) => {
const fullPath = path.join(dirPath, item);
return fs.statSync(fullPath).isDirectory();
});
}
// 处理目录
function processDirectory(currentPath, isRoot = true) {
const dirs = fs.readdirSync(currentPath, { withFileTypes: true });
// 如果当前目录只包含文件(没有子目录)
if (!hasSubDirectories(currentPath)) {
const files = scanDirectory(currentPath);
if (files.length > 0) {
sidebarItems.push({
title: path.basename(currentPath),
collapsable: false,
children: files,
});
}
return;
}
// 处理包含子目录的情况
dirs.forEach((dir) => {
if (dir.isDirectory() && !dir.name.startsWith(".")) {
const fullPath = path.join(currentPath, dir.name);
const children = [];
// 扫描子目录中的文件
function scanSubDirectory(subPath, relPath) {
const subItems = fs.readdirSync(subPath);
subItems.forEach((item) => {
const itemPath = path.join(subPath, item);
const itemStat = fs.statSync(itemPath);
if (itemStat.isFile() && item.endsWith(".md")) {
if (item === "README.md") {
// children.push(`${relPath}/`);
} else {
// 如果包含特殊字符
if (item.includes("!")) {
children.push(`${relPath}/${encodeURI(item.replace(".md", ""))}`);
} else {
children.push(`${relPath}/${item.replace(".md", "")}`);
}
}
} else if (itemStat.isDirectory()) {
scanSubDirectory(itemPath, `${relPath}/${item}`);
}
});
}
scanSubDirectory(fullPath, `${dir.name}`);
if (children.length > 0) {
sidebarItems.push({
title: dir.name,
collapsable: true,
children: children.sort(),
});
}
}
});
}
processDirectory(absolutePath);
return sidebarItems;
}
// 接收命令行参数
const targetDir = process.argv[2] || ".";
try {
// 检查目录是否存在
if (!fs.existsSync(targetDir)) {
throw new Error(`目录 "${targetDir}" 不存在`);
}
// 生成配置
const sidebarConfig = generateSidebarConfig(targetDir);
// 生成 TypeScript 代码
const tsContent = `// 自动生成的侧边栏配置
export default ${JSON.stringify(sidebarConfig, null, 2)};
`;
// 写入文件
fs.writeFileSync("temp.ts", tsContent, "utf-8");
console.log("侧边栏配置已生成到 temp.ts 文件中");
// 输出生成的配置预览
console.log("\n生成的配置预览:");
console.log(JSON.stringify(sidebarConfig, null, 2));
} catch (error) {
console.error("错误:", error instanceof Error ? error.message : "未知错误");
process.exit(1);
}
+42
View File
@@ -0,0 +1,42 @@
const fs = require("fs");
const path = require("path");
/**
* 递归计算目录下的 .md 文件数量
* @param {string} dirPath 目录路径
* @returns {number} .md 文件数量
*/
function countMarkdownFiles(dirPath) {
let count = 0;
try {
const files = fs.readdirSync(dirPath);
for (const file of files) {
const filePath = path.join(dirPath, file);
const stat = fs.statSync(filePath);
if (stat.isDirectory()) {
count += countMarkdownFiles(filePath); // 递归子目录
} else if (path.extname(file) === ".md") {
count++;
}
}
} catch (error) {
console.error(`读取目录出错: ${error.message}`);
}
return count;
}
// 获取用户输入的路径
const inputPath = process.argv[2];
if (!inputPath) {
console.error("请提供目录路径作为参数");
process.exit(1);
}
// 计算并输出结果
const absolutePath = path.resolve(inputPath);
const markdownCount = countMarkdownFiles(absolutePath);
console.log(`目录 '${absolutePath}' 下共有 ${markdownCount} 个 .md 文件。`);
+6
View File
@@ -0,0 +1,6 @@
import { SidebarConfig4Multiple } from "vuepress/config";
// @ts-ignore
export default {
// 降级,默认根据文章标题渲染侧边栏
"/": "auto",
} as SidebarConfig4Multiple;
@@ -0,0 +1,172 @@
<template>
<form
id="search-form"
class="algolia-search-wrapper search-box"
role="search"
>
<input
id="algolia-search-input"
class="search-query"
:placeholder="placeholder"
>
</form>
</template>
<script>
export default {
name: 'AlgoliaSearchBox',
props: ['options'],
data () {
return {
placeholder: undefined
}
},
watch: {
$lang (newValue) {
this.update(this.options, newValue)
},
options (newValue) {
this.update(newValue, this.$lang)
}
},
mounted () {
this.initialize(this.options, this.$lang)
this.placeholder = this.$site.themeConfig.searchPlaceholder || ''
},
methods: {
initialize (userOptions, lang) {
Promise.all([
import(/* webpackChunkName: "docsearch" */ 'docsearch.js/dist/cdn/docsearch.min.js'),
import(/* webpackChunkName: "docsearch" */ 'docsearch.js/dist/cdn/docsearch.min.css')
]).then(([docsearch]) => {
docsearch = docsearch.default
const { algoliaOptions = {}} = userOptions
docsearch(Object.assign(
{},
userOptions,
{
inputSelector: '#algolia-search-input',
// #697 Make docsearch work well at i18n mode.
algoliaOptions: {
...algoliaOptions,
facetFilters: [`lang:${lang}`].concat(algoliaOptions.facetFilters || [])
},
handleSelected: (input, event, suggestion) => {
const { pathname, hash } = new URL(suggestion.url)
const routepath = pathname.replace(this.$site.base, '/')
const _hash = decodeURIComponent(hash)
this.$router.push(`${routepath}${_hash}`)
}
}
))
})
},
update (options, lang) {
this.$el.innerHTML = '<input id="algolia-search-input" class="search-query">'
this.initialize(options, lang)
}
}
}
</script>
<style lang="stylus">
.algolia-search-wrapper
& > span
vertical-align middle
.algolia-autocomplete
line-height normal
.ds-dropdown-menu
background-color #fff
border 1px solid #999
border-radius 4px
font-size 16px
margin 6px 0 0
padding 4px
text-align left
&:before
border-color #999
[class*=ds-dataset-]
border none
padding 0
.ds-suggestions
margin-top 0
.ds-suggestion
border-bottom 1px solid $borderColor
.algolia-docsearch-suggestion--highlight
color #2c815b
.algolia-docsearch-suggestion
border-color $borderColor
padding 0
.algolia-docsearch-suggestion--category-header
padding 5px 10px
margin-top 0
background $accentColor
color #fff
font-weight 600
.algolia-docsearch-suggestion--highlight
background rgba(255, 255, 255, 0.6)
.algolia-docsearch-suggestion--wrapper
padding 0
.algolia-docsearch-suggestion--title
font-weight 600
margin-bottom 0
color $textColor
.algolia-docsearch-suggestion--subcategory-column
vertical-align top
padding 5px 7px 5px 5px
border-color $borderColor
background #f1f3f5
&:after
display none
.algolia-docsearch-suggestion--subcategory-column-text
color #555
.algolia-docsearch-footer
border-color $borderColor
.ds-cursor .algolia-docsearch-suggestion--content
background-color #e7edf3 !important
color $textColor
@media (min-width: $MQMobile)
.algolia-search-wrapper
.algolia-autocomplete
.algolia-docsearch-suggestion
.algolia-docsearch-suggestion--subcategory-column
float none
width 150px
min-width 150px
display table-cell
.algolia-docsearch-suggestion--content
float none
display table-cell
width 100%
vertical-align top
.ds-dropdown-menu
min-width 515px !important
@media (max-width: $MQMobile)
.algolia-search-wrapper
.ds-dropdown-menu
min-width calc(100vw - 4rem) !important
max-width calc(100vw - 4rem) !important
.algolia-docsearch-suggestion--wrapper
padding 5px 7px 5px 5px !important
.algolia-docsearch-suggestion--subcategory-column
padding 0 !important
background white !important
.algolia-docsearch-suggestion--subcategory-column-text:after
content " > "
font-size 10px
line-height 14.4px
display inline-block
width 5px
margin -3px 3px 0
vertical-align middle
</style>
+250
View File
@@ -0,0 +1,250 @@
<template>
<div
class="dropdown-wrapper"
:class="{ open }"
>
<button
class="dropdown-title"
type="button"
:aria-label="dropdownAriaLabel"
@click="handleDropdown"
>
<span class="title">{{ item.text }}</span>
<span
class="arrow down"
/>
</button>
<button
class="mobile-dropdown-title"
type="button"
:aria-label="dropdownAriaLabel"
@click="setOpen(!open)"
>
<span class="title">{{ item.text }}</span>
<span
class="arrow"
:class="open ? 'down' : 'right'"
/>
</button>
<DropdownTransition>
<ul
v-show="open"
class="nav-dropdown"
>
<li
v-for="(subItem, index) in item.items"
:key="subItem.link || index"
class="dropdown-item"
>
<h4 v-if="subItem.type === 'links'">
{{ subItem.text }}
</h4>
<ul
v-if="subItem.type === 'links'"
class="dropdown-subitem-wrapper"
>
<li
v-for="childSubItem in subItem.items"
:key="childSubItem.link"
class="dropdown-subitem"
>
<NavLink
:item="childSubItem"
@focusout="
isLastItemOfArray(childSubItem, subItem.items) &&
isLastItemOfArray(subItem, item.items) &&
setOpen(false)
"
/>
</li>
</ul>
<NavLink
v-else
:item="subItem"
@focusout="isLastItemOfArray(subItem, item.items) && setOpen(false)"
/>
</li>
</ul>
</DropdownTransition>
</div>
</template>
<script>
import NavLink from '@theme/components/NavLink.vue'
import DropdownTransition from '@theme/components/DropdownTransition.vue'
import last from 'lodash/last'
export default {
name: 'DropdownLink',
components: {
NavLink,
DropdownTransition
},
props: {
item: {
required: true
}
},
data () {
return {
open: false
}
},
computed: {
dropdownAriaLabel () {
return this.item.ariaLabel || this.item.text
}
},
watch: {
$route () {
this.open = false
}
},
methods: {
setOpen (value) {
this.open = value
},
isLastItemOfArray (item, array) {
return last(array) === item
},
/**
* Open the dropdown when user tab and click from keyboard.
*
* Use event.detail to detect tab and click from keyboard. Ref: https://developer.mozilla.org/en-US/docs/Web/API/UIEvent/detail
* The Tab + Click is UIEvent > KeyboardEvent, so the detail is 0.
*/
handleDropdown () {
const isTriggerByTab = event.detail === 0
if (isTriggerByTab) this.setOpen(!this.open)
}
}
}
</script>
<style lang="stylus">
.dropdown-wrapper
cursor pointer
.dropdown-title
display block
font-size 0.9rem
font-family inherit
cursor inherit
padding inherit
line-height 1.4rem
background transparent
border none
font-weight 500
color $textColor
&:hover
border-color transparent
.arrow
vertical-align middle
margin-top -1px
margin-left 0.4rem
.mobile-dropdown-title
@extends .dropdown-title
display none
font-weight 600
font-size inherit
&:hover
color $accentColor
.nav-dropdown
.dropdown-item
color inherit
line-height 1.7rem
h4
margin 0.45rem 0 0
border-top 1px solid #eee
padding 1rem 1.5rem 0.45rem 1.25rem
.dropdown-subitem-wrapper
padding 0
list-style none
.dropdown-subitem
font-size 0.9em
a
display block
line-height 1.7rem
position relative
border-bottom none
font-weight 400
margin-bottom 0
padding 0 1.5rem 0 1.25rem
&:hover
color $accentColor
&.router-link-active
color $accentColor
&::after
content ""
width 0
height 0
border-left 5px solid $accentColor
border-top 3px solid transparent
border-bottom 3px solid transparent
position absolute
top calc(50% - 2px)
left 9px
&:first-child h4
margin-top 0
padding-top 0
border-top 0
@media (max-width: $MQMobile)
.dropdown-wrapper
&.open .dropdown-title
margin-bottom 0.5rem
.dropdown-title
display: none
.mobile-dropdown-title
display: block
.nav-dropdown
transition height .1s ease-out
overflow hidden
.dropdown-item
h4
border-top 0
margin-top 0
padding-top 0
h4, & > a
font-size 15px
line-height 2rem
.dropdown-subitem
font-size 14px
padding-left 1rem
@media (min-width: $MQMobile)
.dropdown-wrapper
height 1.8rem
&:hover .nav-dropdown,
&.open .nav-dropdown
// override the inline style.
display block !important
.nav-dropdown
display none
// Avoid height shaked by clicking
height auto !important
box-sizing border-box;
max-height calc(100vh - 2.7rem)
overflow-y auto
position absolute
top 100%
right 0
background-color #fff
padding 0.6rem 0
border 1px solid #ddd
border-bottom-color #ccc
text-align left
border-radius 0.25rem
white-space nowrap
margin 0
</style>
@@ -0,0 +1,33 @@
<template>
<transition
name="dropdown"
@enter="setHeight"
@after-enter="unsetHeight"
@before-leave="setHeight"
>
<slot />
</transition>
</template>
<script>
export default {
name: 'DropdownTransition',
methods: {
setHeight (items) {
// explicitly set height so that it can be transitioned
items.style.height = items.scrollHeight + 'px'
},
unsetHeight (items) {
items.style.height = ''
}
}
}
</script>
<style lang="stylus">
.dropdown-enter, .dropdown-leave-to
height 0 !important
</style>
+385
View File
@@ -0,0 +1,385 @@
<script src="../util/index.js"></script>
<template xmlns="http://www.w3.org/1999/html">
<aside class="page-sidebar">
<slot name="top"/>
<div class="page-side-toolbar">
<div v-for="(item, index) in list" :key="index" class="option-box" @mouseover="showToc($event)" @mouseout="hideToc($event)">
<img class="nozoom" :src="item.icon" width="24px" />
<span class="show-txt" v-html="item.title" />
<div class="toc-container">
<div class="pos-box">
<div class="icon-arrow"></div>
<div class="scroll-box" style="text-align:center">
<span v-html="item.popoverTitle"></span>
<img :src="item.popoverUrl" height="180px" style="margin:10px;" />
<span v-html="item.popoverDesc"></span>
</div>
</div>
</div>
</div>
</div>
<slot name="middle"/>
<slot name="bottom"/>
</aside>
</template>
<script>
import NavLinks from '@theme/components/NavLinks.vue'
export default {
name: 'PageSidebar',
data(){
return {
list: []
}
},
components: { NavLinks },
props: ['pageSidebarItems', 'sidebarItems'],
computed: {
},
mounted() {
this.list = this.$site.themeConfig.extraSideBar
},
methods: {
showToc($event){
$event.currentTarget.className="option-box on";
},
hideToc($event){
$event.currentTarget.className="option-box";
},
showTocOver($event){
$event.currentTarget.className="option-box-toc-over on";
},
hideTocOver($event){
$event.currentTarget.className="option-box-toc-over";
},
}
}
function resolvePrev (page, items) {
return find(page, items, -1)
}
function resolveNext (page, items) {
return find(page, items, 1)
}
function find (page, items, offset) {
const res = []
flatten(items, res)
for (let i = 0; i < res.length; i++) {
const cur = res[i]
if (cur.type === 'page' && cur.path === decodeURIComponent(page.path)) {
return res[i + offset]
}
}
}
function flatten (items, res) {
for (let i = 0, l = items.length; i < l; i++) {
if (items[i].type === 'group') {
flatten(items[i].children || [], res)
} else {
res.push(items[i])
}
}
}
</script>
<style lang="stylus">
.page-sidebar
font-size 12px
width 3.8rem
position fixed
z-index 11
margin 0
top 3.6rem
right 0
bottom 0
box-sizing border-box
border-left 0px solid #eaecef
ul
margin 0
a
display inline-block
.nav-links
display none
border-bottom 1px solid $borderColor
padding 0.5rem 0 0.75rem 0
a
font-weight 600
.nav-item, .repo-link
display block
line-height 1.25rem
font-size 1.1em
padding 0.5rem 0 0.5rem 1.5rem
& > .sidebar-links
padding 1.5rem 0
& > li > a.sidebar-link
font-size 1.1em
line-height 1.4
font-weight bold
& > li:not(:first-child)
margin-top .75rem
.toc-container
display: none;
position: absolute;
color $textColor
left: 100%;
top: -1px;
margin-left: 16px;
width: 240px;
background: #fff;
border: 1px solid #eee;
// -webkit-box-shadow: 0 1px 1px 0 rgba(0,0,0,0.1);
// box-shadow: 0 1px 1px 0 rgba(0,0,0,0.1);
// border-radius: 4px;
left: unset;
right: 100%;
margin-right: 10px;
margin-left: 0;
.on
display: block;
.pos-box
position: relative;
padding: 16px;
.icon-arrow
position: relative;
margin-left: -20px;
.scroll-box
overflow-x: hidden;
overflow-y: hidden;
hr
margin-top: 0.5rem
.toc-box
max-height: 500px;
overflow-y: auto;
overflow-x: hidden;
width: 238px;
padding-right: 16px;
-webkit-box-sizing: border-box;
box-sizing: border-box;
& > ol
margin-top: -8px;
li
margin-top: 8px;
line-height: 17px;
text-align: left;
overflow: auto;
text-overflow: ellipsis;
font-size: 12px;
white-space: nowrap;
.sub-box
margin-top: 0;
& > ol > li
padding-left: 15px;
.page-side-toolbar
position fixed
right 10px
top 70px !important
width 44px
div.option-box:last-child
border-top 0px solid #eee
div.option-box.on
.toc-container
display block
div.option-box
font-size 12px
position relative
display -webkit-box
display -ms-flexbox
display flex
-webkit-box-orient vertical
-webkit-box-direction normal
-ms-flex-direction column
flex-direction column
-webkit-box-align center
-ms-flex-align center
align-items center
-webkit-box-pack center
-ms-flex-pack center
justify-content center
border-bottom 1px solid #eee
background-color #fff
height 60px
cursor pointer
.img
margin-top 2px
.show-txt
color gray
margin-top 3px
font-size 11px
div.option-box-toc-over
font-size 12px
position relative
display none
-webkit-box-orient vertical
-webkit-box-direction normal
-ms-flex-direction column
flex-direction column
-webkit-box-align center
-ms-flex-align center
align-items center
-webkit-box-pack center
-ms-flex-pack center
justify-content center
border-bottom 1px solid #eee
background-color #fff
height 60px
cursor pointer
.img
margin-top 2px
.show-txt
color gray
margin-top 3px
font-size 11px
.toc-container
margin-right 0
div.option-box-toc
font-size 12px
position relative
display -webkit-box
display -ms-flexbox
display flex
-webkit-box-orient vertical
-webkit-box-direction normal
-ms-flex-direction column
flex-direction column
-webkit-box-align center
-ms-flex-align center
align-items center
-webkit-box-pack center
-ms-flex-pack center
justify-content center
border-bottom 1px solid #eee
background-color #fff
height 60px
cursor pointer
.img
margin-top 2px
.show-txt
color gray
margin-top 3px
font-size 11px
div.option-box:hover
color white
background #eee
div.option-box-toc-over:hover
color white
background #eee
div.option-box-toc-over.on
.toc-container
display block
div.option-box-toc
display none
.page-side-sitemap
position fixed
right 10px
bottom 50px !important
width 44px
div.option-box:last-child
border-bottom 0px solid #eee
div.option-box.on
.sitemap-container
display block
div.option-box
font-size 12px
position relative
display -webkit-box
display -ms-flexbox
display flex
-webkit-box-orient vertical
-webkit-box-direction normal
-ms-flex-direction column
flex-direction column
-webkit-box-align center
-ms-flex-align center
align-items center
-webkit-box-pack center
-ms-flex-pack center
justify-content center
border-bottom 1px solid #eee
background-color #fff
//height 60px
cursor pointer
.show-txt
color gray
margin-top 2px
font-size 11px
padding 4px 0
div.option-box:hover
//color white
//background #eee
.sitemap-container
display: none;
cursor auto
position: absolute;
color $textColor
left: 100%;
bottom: -30px;
height: 500px;
margin-left: 16px;
padding: 0 10px;
width: 850px;
background: #fff;
-webkit-box-shadow: 1px -2px 10px 7px rgba(0,0,0,0.08);
box-shadow: 1px -2px 10px 7px rgba(0,0,0,0.08);
border-radius: 4px;
left: unset;
right: 100%;
margin-right: 2px;
margin-left: 0;
h4
margin: 5px 0;
font-size: 13px;
text-align: center;
padding: 3px 2px;
border-bottom: 1px solid #eaecef;
background: #42b983;
color: white;
.sitemap-top-link
color: white;
font-size: 10px;
float:right;
padding:2px 5px;
text-decoration:underline;
.on
display: block;
.pos-box
position: relative;
padding: 10px;
@media (max-width: $MQNarrow)
.option-box-toc
display none
.page-side-toolbar
right 6px
top 65px !important
div.option-box-toc-over
display flex
.page-side-sitemap
right 6px
@media (max-width: $MQMobile)
.page-sidebar
display none
.sidebar
.nav-links
display block
.dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active::after
top calc(1rem - 2px)
& > .sidebar-links
padding 1rem 0
</style>
+69
View File
@@ -0,0 +1,69 @@
<template>
<main class="footer">
<div v-for="(item, index) in footerList" :key="index" class="footer-item">
<a :href="item.href" target="_blank" rel="noopener noreferrer">
<img v-if="item.icon" :src="item.icon" alt="icon" class="item-icon" />
<span class="item-text">{{ item.label }}</span>
</a>
</div>
<div class="copy-right">
<span class="name">{{`${currentYear} 编程导航 &nbsp; | &nbsp; `}} </span>
<a :href="government.href" target="_blank" rel="noreferrer" >
{{government.name}}
</a>
</div>
</main>
</template>
<script>
export default {
name: 'Footer',
data () {
return {
footerList: [],
government: {},
currentYear : ''
}
},
props: ['sidebarItems'],
mounted() {
this.footerList = this.$site.themeConfig.footer.friendLinks
this.government = this.$site.themeConfig.footer.copyright
this.currentYear = new Date().getFullYear()
}
}
</script>
<style lang="stylus">
@require '../styles/wrapper.styl'
//@media (max-width: $MQMobile)
// .footer-item a
// margin-right 0 !important
.footer
padding 2rem 0
display flex
justify-content center
background-color #f0f2f5
flex-wrap wrap
.footer-item
padding 0 1rem
.footer-item a
display inline-flex
justify-content center
align-items center
color #85858a
.item-icon
width 1.4rem
height 1.4rem
margin-right 0.4rem
.copy-right
width 100vw
display flex
justify-content center
margin-top 1rem
color #85858a
.copy-right .name
margin-right 0.4rem
</style>
+156
View File
@@ -0,0 +1,156 @@
<template>
<nav
v-if="userLinks.length || repoLink"
class="nav-links"
>
<!-- user links -->
<div
v-for="item in userLinks"
:key="item.link"
class="nav-item"
>
<DropdownLink
v-if="item.type === 'links'"
:item="item"
/>
<NavLink
v-else
:item="item"
/>
</div>
<!-- repo link -->
<a
v-if="repoLink"
:href="repoLink"
class="repo-link"
target="_blank"
rel="noopener noreferrer"
>
{{ repoLabel }}
<OutboundLink />
</a>
</nav>
</template>
<script>
import DropdownLink from '@theme/components/DropdownLink.vue'
import { resolveNavLinkItem } from '../util'
import NavLink from '@theme/components/NavLink.vue'
export default {
name: 'NavLinks',
components: {
NavLink,
DropdownLink
},
computed: {
userNav () {
return this.$themeLocaleConfig.nav || this.$site.themeConfig.nav || []
},
nav () {
const { locales } = this.$site
if (locales && Object.keys(locales).length > 1) {
const currentLink = this.$page.path
const routes = this.$router.options.routes
const themeLocales = this.$site.themeConfig.locales || {}
const languageDropdown = {
text: this.$themeLocaleConfig.selectText || 'Languages',
ariaLabel: this.$themeLocaleConfig.ariaLabel || 'Select language',
items: Object.keys(locales).map(path => {
const locale = locales[path]
const text = themeLocales[path] && themeLocales[path].label || locale.lang
let link
// Stay on the current page
if (locale.lang === this.$lang) {
link = currentLink
} else {
// Try to stay on the same page
link = currentLink.replace(this.$localeConfig.path, path)
// fallback to homepage
if (!routes.some(route => route.path === link)) {
link = path
}
}
return { text, link }
})
}
return [...this.userNav, languageDropdown]
}
return this.userNav
},
userLinks () {
return (this.nav || []).map(link => {
return Object.assign(resolveNavLinkItem(link), {
items: (link.items || []).map(resolveNavLinkItem)
})
})
},
repoLink () {
const { repo } = this.$site.themeConfig
if (repo) {
return /^https?:/.test(repo)
? repo
: `https://github.com/${repo}`
}
return null
},
repoLabel () {
if (!this.repoLink) return
if (this.$site.themeConfig.repoLabel) {
return this.$site.themeConfig.repoLabel
}
const repoHost = this.repoLink.match(/^https?:\/\/[^/]+/)[0]
const platforms = ['GitHub', 'GitLab', 'Bitbucket']
for (let i = 0; i < platforms.length; i++) {
const platform = platforms[i]
if (new RegExp(platform, 'i').test(repoHost)) {
return platform
}
}
return 'Source'
}
}
}
</script>
<style lang="stylus">
.nav-links
display inline-block
a
line-height 1.4rem
color inherit
&:hover, &.router-link-active
color $accentColor
.nav-item
position relative
display inline-block
margin-left 1.5rem
line-height 2rem
&:first-child
margin-left 0
.repo-link
margin-left 1.5rem
@media (max-width: $MQMobile)
.nav-links
.nav-item, .repo-link
margin-left 0
@media (min-width: $MQMobile)
.nav-links a
&:hover, &.router-link-active
color $textColor
.nav-item > a:not(.external)
&:hover, &.router-link-active
margin-bottom -2px
border-bottom 2px solid lighten($accentColor, 8%)
</style>
+141
View File
@@ -0,0 +1,141 @@
<template>
<header class="navbar">
<SidebarButton @toggle-sidebar="$emit('toggle-sidebar')" />
<RouterLink
:to="$localePath"
class="home-link"
>
<img
v-if="$site.themeConfig.logo"
class="logo"
:src="$withBase($site.themeConfig.logo)"
:alt="$siteTitle"
>
<span
v-if="$siteTitle"
ref="siteName"
class="site-name"
:class="{ 'can-hide': $site.themeConfig.logo }"
>{{ $siteTitle }}</span>
</RouterLink>
<div
class="links"
:style="linksWrapMaxWidth ? {
'max-width': linksWrapMaxWidth + 'px'
} : {}"
>
<AlgoliaSearchBox
v-if="isAlgoliaSearch"
:options="algolia"
/>
<SearchBox v-else-if="$site.themeConfig.search !== false && $page.frontmatter.search !== false" />
<NavLinks class="can-hide" />
</div>
</header>
</template>
<script>
import AlgoliaSearchBox from '@AlgoliaSearchBox'
import SearchBox from '@SearchBox'
import SidebarButton from '@theme/components/SidebarButton.vue'
import NavLinks from '@theme/components/NavLinks.vue'
export default {
name: 'Navbar',
components: {
SidebarButton,
NavLinks,
SearchBox,
AlgoliaSearchBox
},
data () {
return {
linksWrapMaxWidth: null
}
},
computed: {
algolia () {
return this.$themeLocaleConfig.algolia || this.$site.themeConfig.algolia || {}
},
isAlgoliaSearch () {
return this.algolia && this.algolia.apiKey && this.algolia.indexName
}
},
mounted () {
const MOBILE_DESKTOP_BREAKPOINT = 719 // refer to config.styl
const NAVBAR_VERTICAL_PADDING = parseInt(css(this.$el, 'paddingLeft')) + parseInt(css(this.$el, 'paddingRight'))
const handleLinksWrapWidth = () => {
if (document.documentElement.clientWidth < MOBILE_DESKTOP_BREAKPOINT) {
this.linksWrapMaxWidth = null
} else {
this.linksWrapMaxWidth = this.$el.offsetWidth - NAVBAR_VERTICAL_PADDING
- (this.$refs.siteName && this.$refs.siteName.offsetWidth || 0)
}
}
handleLinksWrapWidth()
window.addEventListener('resize', handleLinksWrapWidth, false)
}
}
function css (el, property) {
// NOTE: Known bug, will return 'auto' if style value is 'auto'
const win = el.ownerDocument.defaultView
// null means not to return pseudo styles
return win.getComputedStyle(el, null)[property]
}
</script>
<style lang="stylus">
$navbar-vertical-padding = 0.7rem
$navbar-horizontal-padding = 1.5rem
.navbar
width 100vw
padding $navbar-vertical-padding $navbar-horizontal-padding
line-height $navbarHeight - 1.4rem
a, span, img
display inline-block
.logo
height $navbarHeight - 1.4rem
min-width $navbarHeight - 1.4rem
margin-right 0.8rem
vertical-align top
.site-name
font-size 1.3rem
font-weight 600
color $textColor
position relative
.links
padding-left 1.5rem
box-sizing border-box
background-color white
white-space nowrap
font-size 0.9rem
position absolute
right $navbar-horizontal-padding
top $navbar-vertical-padding
display flex
.search-box
flex: 0 0 auto
vertical-align top
@media (max-width: $MQMobile)
.navbar
padding-left 4rem
.can-hide
display none
.links
padding-left 1.5rem
.site-name
width calc(100vw - 9.4rem)
overflow hidden
white-space nowrap
text-overflow ellipsis
</style>
+137
View File
@@ -0,0 +1,137 @@
<template>
<main class="page">
<slot name="top" />
<div class="content">
<div style="width:100%">
<Content class="theme-default-content custom-content" />
<PageEdit style="margin: 0"/>
<!-- <div class="option-box-toc-fixed">-->
<!-- -->
<!-- </div>-->
<PageNav v-bind="{ sidebarItems }" />
</div>
<div class="toc-container-sidebar" ref="tocc">
<div class="pos-box">
<div class="icon-arrow"></div>
<div class="scroll-box" style="max-height:86vh">
<div style="font-weight:bold;">{{pageSidebarItems[0].title}}</div>
<hr/>
<div class="toc-box">
<PageSidebarToc :depth="0" :items="pageSidebarItems" :sidebarDepth="6"/>
</div>
</div>
</div>
</div>
</div>
<slot name="bottom" />
</main>
</template>
<script>
import PageEdit from '@theme/components/PageEdit.vue'
import PageNav from '@theme/components/PageNav.vue'
import PageSidebarToc from '@theme/components/PageSidebarToc.vue'
export default {
components: { PageEdit, PageNav, PageSidebarToc },
props: ['sidebarItems', 'pageSidebarItems'],
mounted() {
console.log(this.$site,this, 'this.$site')
}
}
</script>
<style lang="stylus">
@require '../styles/wrapper.styl'
@media (max-width: 1435px)
.toc-container-sidebar
display none !important
@media (max-width: $MQMobile)
.toc-container-sidebar
display none
.content-page
position relative
.custom-content
padding-right 16px !important
.content
display flex
justify-content space-around
margin 0 auto
li, a , p, span
word-wrap break-word
.theme-default-content
margin 0 !important
.page
display block
position relative
//height 100vw
//width 100vw
//overflow scroll
.toc-container-sidebar
order 2
width 100%
flex-grow 1
//padding-left 32px
display: block;
position: relative;
color $textColor
//: calc(100vw - 460px);
top: 80px;
max-width: 240px;
background transparent
margin-right: 10px;
margin-left: 0;
.on
display: block;
.pos-box
position: fixed;
padding: 16px;
top 80px;
height 100vh
overflow-x hidden
overflow-y auto
.icon-arrow
position: relative;
margin-left: -20px;
.scroll-box
overflow-x: hidden;
overflow-y: hidden;
& > div:first-child
overflow-x scroll
white-space: nowrap;
text-overflow ellipsis
hr
margin-top: 0.5rem
.toc-box
max-height:81vh;
overflow-y: auto;
overflow-x: hidden;
width: 238px;
padding-right: 16px;
-webkit-box-sizing: border-box;
box-sizing: border-box;
& > ol
margin-top: -8px;
li
margin-top: 8px;
line-height: 17px;
text-align: left;
overflow: auto;
text-overflow: ellipsis;
font-size: 12px;
white-space: nowrap;
.sub-box
margin-top: 0;
& > ol > li
padding-left: 15px;
</style>
+87
View File
@@ -0,0 +1,87 @@
<template>
<DropdownTransition>
<ul class="toc-sidebar-links" v-if="items[0].children.length">
<li v-for="(item, i) in items[0].children" :key="i">
<PageSidebarTocLink :sidebarDepth="sidebarDepth" :item="item"/>
</li>
</ul>
</DropdownTransition>
</template>
<script>
import PageSidebarTocLink from '@theme/components/PageSidebarTocLink.vue'
import DropdownTransition from '@theme/components/DropdownTransition.vue'
import { isActive } from '../util'
export default {
name: 'PageSidebarToc',
components: { PageSidebarTocLink, DropdownTransition },
props: [
'items',
'depth', // depth of current sidebar links
'sidebarDepth' // depth of headers to be extracted
],
data () {
return {
openGroupIndex: 0
}
},
created () {
this.refreshIndex()
},
watch: {
'$route' () {
this.refreshIndex()
}
},
methods: {
refreshIndex () {
const index = resolveOpenGroupIndex(
this.$route,
this.items[0].children
)
if (index > -1) {
this.openGroupIndex = index
}
},
toggleGroup (index) {
this.openGroupIndex = index === this.openGroupIndex ? -1 : index
},
isActive (page) {
return isActive(this.$route, page.regularPath)
}
}
}
function resolveOpenGroupIndex (route, items) {
for (let i = 0; i < items.length; i++) {
const item = items[i]
if (descendantIsActive(route, item)) {
return i
}
}
return -1
}
function descendantIsActive (route, item) {
if (item.type === 'group') {
return item.children.some(child => {
if (child.type === 'group') {
return descendantIsActive(route, child)
} else {
return child.type === 'page' && isActive(route, child.path)
}
})
}
return false
}
</script>
+140
View File
@@ -0,0 +1,140 @@
<script>
import { isActive, hashRE, groupHeaders } from '../util'
export default {
functional: true,
props: ['item', 'sidebarDepth'],
render (h,
{
parent: {
$page,
$site,
$route,
$themeConfig,
$themeLocaleConfig
},
props: {
item,
sidebarDepth
}
}) {
// use custom active class matching logic
// due to edge case of paths ending with / + hash
const selfActive = isActive($route, item.path)
// for sidebar: auto pages, a hash link should be active if one of its child
// matches
const active = item.type === 'auto'
? selfActive || item.children.some(c => isActive($route, item.basePath + '#' + c.slug))
: selfActive
const link = item.type === 'external'
? renderExternal(h, item.path, item.title || item.path)
: renderLink(h, item.path, item.title || item.path, active)
const maxDepth = [
$page.frontmatter.sidebarDepth,
sidebarDepth,
$themeLocaleConfig.sidebarDepth,
$themeConfig.sidebarDepth,
1
].find(depth => depth !== undefined)
const displayAllHeaders = $themeLocaleConfig.displayAllHeaders
|| $themeConfig.displayAllHeaders
if (item.type === 'auto') {
return [link, renderChildren(h, item.children, item.basePath, $route, maxDepth)]
} else if ((active || displayAllHeaders) && item.headers && !hashRE.test(item.path)) {
const children = groupHeaders(item.headers)
return [link, renderChildren(h, children, item.path, $route, maxDepth)]
} else {
return link
}
}
}
function renderLink (h, to, text, active) {
return h('router-link', {
props: {
to,
activeClass: '',
exactActiveClass: ''
},
class: {
active,
'toc-sidebar-link': true
}
}, text)
}
function renderChildren (h, children, path, route, maxDepth, depth = 1) {
if (!children || depth > maxDepth) return null
return h('ul', { class: 'toc-sidebar-sub-headers' }, children.map(c => {
const active = isActive(route, path + '#' + c.slug)
let itemClass = 'toc-sidebar-sub-header'
if (c.level <= 3) {
itemClass += active ? ' active' : ''
} else if (c.level > 3 && c.level <= 6) {
itemClass += ` toc-sidebar-depth-${c.level}`
}
return h('li', { class: itemClass }, [
renderLink(h, path + '#' + c.slug, c.title, active),
renderChildren(h, c.children, path, route, maxDepth, depth + 1)
])
}))
}
function renderExternal (h, to, text) {
return h('a', {
attrs: {
href: to,
target: '_blank',
rel: 'noopener noreferrer'
},
class: {
'toc-sidebar-link': true
}
}, [text, h('OutboundLink')])
}
</script>
<style lang="stylus">
.toc-sidebar .toc-sidebar-sub-headers
padding-left 1rem
font-size 0.95em
a.toc-sidebar-link
font-size 0.9rem
font-weight 400
display inline-block
color $textColor
//border-left 0.25rem solid transparent
//padding 0.35rem 1rem 0.35rem 1.25rem
line-height 1
width: 100%
box-sizing: border-box
&:hover
color $accentColor
&.active
font-weight 600
color $accentColor
border-left-color $accentColor
.toc-sidebar-sub-headers &
padding-top 0.25rem
padding-bottom 0.25rem
border-left none
font-weight 300
&.active
font-weight 500
.toc-sidebar-depth-4
list-style-type: none;
margin-left 0.8rem
.toc-sidebar-depth-5
list-style-type: none;
margin-left 1.6rem
.toc-sidebar-depth-6
list-style-type: none;
margin-left 2.4rem
</style>
+4
View File
@@ -0,0 +1,4 @@
// .vuepress/theme/index.js
module.exports = {
extend: '@vuepress/theme-default'
}
+180
View File
@@ -0,0 +1,180 @@
<template>
<div
class="theme-container"
:class="pageClasses"
@touchstart="onTouchStart"
@touchend="onTouchEnd"
>
<Navbar
v-if="shouldShowNavbar"
@toggle-sidebar="toggleSidebar"
/>
<div
class="sidebar-mask"
@click="toggleSidebar(false)"
/>
<Sidebar
:items="sidebarItems"
@toggle-sidebar="toggleSidebar"
>
<template #top>
<slot name="sidebar-top" />
</template>
<template #bottom>
<slot name="sidebar-bottom" />
</template>
</Sidebar>
<Home v-if="$page.frontmatter.home" />
<Page
v-else
:sidebar-items="sidebarItems"
:page-sidebar-items="pageSidebarItems"
>
<template #top>
<slot name="page-top" />
</template>
<template #bottom>
<slot name="page-bottom" />
<Footer />
</template>
</Page>
<PageSidebar
v-if="shouldShowPageSidebar"
:page-sidebar-items="pageSidebarItems"
:sidebar-items="sidebarItems"
>
<slot
name="page-sidebar-top"
#top
/>
<slot
name="page-sidebar-bottom"
#bottom
/>
</PageSidebar>
</div>
</template>
<script>
import Home from '@theme/components/Home.vue'
import Navbar from '@theme/components/Navbar.vue'
import Page from '@theme/components/Page.vue'
import Sidebar from '@theme/components/Sidebar.vue'
import PageSidebar from '@theme/components/ExtraSidebar.vue'
import Footer from "@theme/components/Footer.vue";
import { resolveSidebarItems, resolveHeaders } from '../util'
export default {
components: { Home, Page, Sidebar, Navbar, PageSidebar, Footer },
data () {
return {
isSidebarOpen: false
}
},
computed: {
shouldShowNavbar () {
const { themeConfig } = this.$site
const { frontmatter } = this.$page
if (
frontmatter.navbar === false
|| themeConfig.navbar === false) {
return false
}
return (
this.$title
|| themeConfig.logo
|| themeConfig.repo
|| themeConfig.nav
|| this.$themeLocaleConfig.nav
)
},
shouldShowSidebar () {
const { frontmatter } = this.$page
return (
!frontmatter.home
&& frontmatter.sidebar !== false
&& this.sidebarItems.length
)
},
shouldShowPageSidebar (){
const { frontmatter } = this.$page
return (//false&&
!frontmatter.home
&& frontmatter.sidebar !== false
&& this.pageSidebarItems.length
)
},
sidebarItems () {
return resolveSidebarItems(
this.$page,
this.$page.regularPath,
this.$site,
this.$localePath
)
},
pageSidebarItems () {
return resolveHeaders(this.$page)
},
pageClasses () {
const userPageClass = this.$page.frontmatter.pageClass
return [
{
'no-navbar': !this.shouldShowNavbar,
'sidebar-open': this.isSidebarOpen,
'no-sidebar': !this.shouldShowSidebar
},
userPageClass
]
}
},
mounted () {
// console.log(config,this.pageSidebarItems, 'config')
this.$router.afterEach(() => {
this.isSidebarOpen = false
})
},
methods: {
toggleSidebar (to) {
this.isSidebarOpen = typeof to === 'boolean' ? to : !this.isSidebarOpen
this.$emit('toggle-sidebar', this.isSidebarOpen)
},
// side swipe
onTouchStart (e) {
this.touchStart = {
x: e.changedTouches[0].clientX,
y: e.changedTouches[0].clientY
}
},
onTouchEnd (e) {
const dx = e.changedTouches[0].clientX - this.touchStart.x
const dy = e.changedTouches[0].clientY - this.touchStart.y
if (Math.abs(dx) > Math.abs(dy) && Math.abs(dx) > 40) {
if (dx > 0 && this.touchStart.x <= 80) {
this.toggleSidebar(true)
} else {
this.toggleSidebar(false)
}
}
}
}
}
</script>
+9
View File
@@ -0,0 +1,9 @@
$wrapper
max-width $contentWidth
margin 0 auto
padding 2rem 2.5rem
@media (max-width: $MQNarrow)
padding 2rem
@media (max-width: $MQMobileNarrow)
padding 1.5rem
+245
View File
@@ -0,0 +1,245 @@
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 }
*/
export 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
}
}
}
+29
View File
@@ -0,0 +1,29 @@
---
permalink: /
---
# 鱼皮的 AI 知识库
> 你全面的 AI 知识库,一网打尽最新 AI 资讯
>
> 作者:[程序员鱼皮](https://yuyuanweb.feishu.cn/wiki/Abldw5WkjidySxkKxU2cQdAtnah)
>
> 本站地址:[https://ai.codefather.cn](https://ai.codefather.cn)
## 本站内容
- [DeepSeek 基础](/DeepSeek基础)
- [DeepSeek 使用指南](/DeepSeek使用指南)
- [DeepSeek 使用场景](/DeepSeek使用场景)
- [DeepSeek 资源汇总](/DeepSeek资源汇总)
- [Deepseek 技术深度](/Deepseek技术深度)
## [编程产品服务](/产品服务)
鱼皮公司旗下的产品和服务,如算法学习、后端求职突击、前端面试突击、考研陪跑、求职简历工具等。
## [作者介绍](/作者)
没啥好说的,感谢您的阅读!
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 294 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 183 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 206 KiB

+27214
View File
File diff suppressed because it is too large Load Diff
+24
View File
@@ -0,0 +1,24 @@
{
"name": "codefather",
"version": "1.0.0",
"scripts": {
"docs:dev": "vuepress dev .",
"docs:build": "vuepress build ."
},
"license": "MIT",
"devDependencies": {
"@vuepress/plugin-back-to-top": "^1.9.10",
"@vuepress/plugin-google-analytics": "^1.9.10",
"@vuepress/plugin-medium-zoom": "^1.9.10",
"vuepress": "^1.9.10",
"vuepress-plugin-baidu-autopush": "^1.0.1",
"vuepress-plugin-feed": "^0.1.9",
"vuepress-plugin-seo": "^0.1.4",
"vuepress-plugin-sitemap": "^2.3.1",
"vuepress-plugin-tags": "^1.0.2"
},
"dependencies": {
"vuepress-plugin-code-copy": "^1.0.6",
"vuepress-plugin-img-lazy": "^1.0.4"
}
}
+118
View File
@@ -0,0 +1,118 @@
# 产品服务
鱼皮创立的公司 —— 鱼鸢网络,我们的官网:[https://www.yuyuanweb.com](https://www.yuyuanweb.com)
## 关于我们
鱼鸢网络是一家新兴的互联网科技公司,我们的使命愿景是 “用科技节约您的每一分钟”。
我们希望通过科技创新,为您提升学习、工作、生活、以及获取信息的效率,拥抱更美好的未来。
## 业务领域
自研创新产品 + 编程教育 + 科技自媒体
## 产品服务
### 自研产品
#### 老鱼简历
老鱼简历:[https://laoyujianli.com](https://laoyujianli.com)(快速制作精美专业的个人简历)
[我做了个网站,帮你写出满分简历!](产品/老鱼简历/我做了个网站,帮你写出满分简历!.md)
[我在简历上写了这个,超级加分!](产品/老鱼简历/我在简历上写了这个,超级加分!.md)
[要来了我们实习生的简历,仅供参考。。](产品/老鱼简历/要来了我们实习生的简历,仅供参考。。.md)
#### 鱼聪明
鱼聪明 AI[https://yucongming.com](https://yucongming.com)(智能 AI 助手,写书问答绘画)
[工具 - 无门槛 AI 对话 绘画神器](产品/鱼聪明/工具%20-%20无门槛%20AI%20对话%20%20绘画神器.md)
#### 代码小抄
[工具 - 简单易用的代码分享神器](产品/代码小抄/工具%20-%20简单易用的代码分享神器.md)
#### 剪切板助手
[我们做的小工具上线啦!(剪切助手上线)](产品/剪切板助手/工具 - 高颜值的剪切板助手)
#### 公益项目
框框大学:[https://kkdaxue.com](https://kkdaxue.com)(公益项目,大学各专业学习建议汇总)
#### 其他
知识助手:[https://zhishizhushou.com](https://zhishizhushou.com)(强大的知识管理辅助工具)
### 编程学习
#### 后端求职突击 - 狂飙后端训练营
[150位,我们出成果了!](编程学习/后端求职突击-狂飙训练营/150位,我们出成果了!.md)
#### 编程宝典
[我的编程宝典网站上线啦!](编程学习/编程宝典/我的编程宝典网站上线啦!.md)
### 编程教育
[💎 学好编程 - 编程导航](https://yuyuanweb.feishu.cn/wiki/VC1qwmX9diCBK3kidyec74vFnde)
编程导航网站:[https://www.codefather.cn](https://www.codefather.cn)(编程交流、面试题、简历修改平台)
[后端突击 - 狂飙后端训练营](https://yuyuanweb.feishu.cn/wiki/EShmwklfJifDv4k4fCEcdp0Qnrd)
[前端突击 - 前端面试训练营](https://yuyuanweb.feishu.cn/wiki/UIoAwQAZLiDecgkVw65cQFoenKf)
[考研陪跑 - 编程导航计狗上岸](https://yuyuanweb.feishu.cn/wiki/Qr35wx2dgif2wNkIwikc0jjRnyw)
### 科技自媒体
[程序员鱼皮](https://space.bilibili.com/12890453/):编程知识、学习经验、科技科普、原创项目分享,全网粉丝量超 150 万
编程导航:编程知识、编程学习经历分享
面试鸭:专注分享优质编程面试题的公众号
无敌信息差:科技类前沿资讯热点分享
鱼聪明 AIAI 相关内容资讯分享
## 合作伙伴
我们的合作伙伴包括:
1)50 多名编程、科技、知识领域的自媒体博主 / 技术专家
2)微软官方认证的商业合作伙伴
3)科大讯飞、Api Fox 等知名公司和产品合作
## 团队信息
[年轻快乐的团队](https://yuyuanweb.feishu.cn/wiki/DmB9wCm52iVVQLk98E2clx26nFg)
## 加入我们
[招聘岗位](https://yuyuanweb.feishu.cn/wiki/GlMiw80xIiOC3PkQb59c5ecKnoH)
## 商务合作
点击联系我们:[商务合作](https://yuyuanweb.feishu.cn/wiki/AOzgw1mOliX6SskAVEicK6u7nDA)
@@ -0,0 +1,127 @@
# 工具 - 简单易用的代码分享神器
大家好,我是程序员鱼皮。分享下我们团队新开发的小项目 `代码小抄`,简单易用的代码分享工具。
网址:[https://codecopy.cn](https://codecopy.cn/) (寓意:代码复制)
微信小程序:代码小抄
视频演示:[https://www.bilibili.com/video/BV1wr421s7N2](https://www.bilibili.com/video/BV1wr421s7N2/?spm_id_from=333.999.0.0)
![](https://pic.yupi.icu/5563/202404191332836.png)
## **为什么做这个项目?**
鱼皮做编程分享答疑多年来,无数次看到有的同学遇到 Bug 时,直接通过拍照、或者发没有格式的代码文本的方式来求助他人。
如果你希望问题得到更快地回答,那么一定要让别人 **用最直接的方式** 获取到信息。比如代码有问题,那么最好将相关代码和报错完整地分享给对方,而不是用几张模糊不清的照片或者 “缺斤少两” 的截图。
随便举个例子:
![](https://pic.yupi.icu/5563/202404191332072.png)
**代码小抄,就是为了解决这个问题而诞生的!**
![](https://pic.yupi.icu/5563/202404191332818.png)
## **什么是代码小抄?**
### **1、快速创建代码**
首先,大家可以快速创建和分享自己的多个代码片段。
整个界面很像程序员常用的编辑器,可以新增、删除代码片段,主打一个简洁快速:
![](https://pic.yupi.icu/5563/202404191332888.png)
你还可以自由切换主题、给小抄设置过期时间、或者用 Markdown 来补充代码的描述(报错信息也可以贴到描述中):
![](https://pic.yupi.icu/5563/202404191332782.png)
### **2、自由分享**
代码小抄支持多种分享范围,比如公开、加密、仅个人可见等,不用担心自己的代码被泄露。
还支持多种分享方式,比如复制链接、QQ 分享、手机扫码、微信小程序、嵌入代码等方式快速分享。
无论是电脑或手机,都能获得不错的阅读体验~
比如我用代码小抄分享 `雷军 28 年前的代码` https://www.codecopy.cn/post/5265qv
PC 端查看代码,如图:
![](https://pic.yupi.icu/5563/202404191332850.png)
移动端查看代码:
![](https://pic.yupi.icu/5563/202404191332389.png)
我们还开发了小程序端,阅读和分享体验更佳!
![](https://pic.yupi.icu/5563/202404191332397.jpeg)![](https://pic.yupi.icu/5563/202404191332798.jpeg)
在 PC 端写的代码,可以通过扫码快速在手机上查看:
![](https://pic.yupi.icu/5563/202404191332158.png)
求求了!找别人改 Bug 时,不要再拍模糊不清的照片、或者直接在聊天里发代码了,那样真的会让对方很困惑。
### **3、代码库**
在代码库中,可以查看并学习其他同学分享的优质代码片段。支持按照标签、编程语言、关键词搜索,还支持多种排序方式,帮你快速发现优质代码:
![](https://pic.yupi.icu/5563/202404191332438.png)
也欢迎大家公开分享自己的优质代码,传递价值。
### **4、我的代码管理**
可以集中管理自己的代码,打造属于自己的代码帝国~
![](https://pic.yupi.icu/5563/202404191332544.png)
### **5、收藏代码**
可以收藏代码,便于学习:
![](https://pic.yupi.icu/5563/202404191332570.png)
进入收藏夹,查看代码:
![](https://pic.yupi.icu/5563/202404191332942.png)
### **6、在线运行代码**
支持多种主流编程语言代码的在线运行:
![](https://pic.yupi.icu/5563/202404191332202.png)
查看运行结果:
![](https://pic.yupi.icu/5563/202404191332543.png)
### **7、AI 智能代码分析 / 纠错**
AI 智能代码分析功能,可以帮助你解释代码、学习代码:
![](https://pic.yupi.icu/5563/202404191332890.png)
查看分析结果:
![](https://pic.yupi.icu/5563/202404191332143.png)
AI 智能代码纠错功能,可以帮你快速发现代码中的小 Bug:
![](https://pic.yupi.icu/5563/202404191332613.png)
## **欢迎使用**
欢迎大家体验:[https://codecopy.cn](https://codecopy.cn/),微信小程序:代码小抄。
多分享代码,不仅可以帮自己积累优秀代码,还便于他人阅读和学习你的代码,一举两得,何乐而不为呢?
欢迎使用、加入我们的用户交流群,有 Bug 和改进建议请咔咔往我们头上砸!
![](https://pic.yupi.icu/5563/202404191332547.png)
目前项目刚刚上线,还有很多功能正在陆续开发中,敬请期待~
@@ -0,0 +1,211 @@
# 工具 - 高颜值的剪切板助手
大家好,我是程序员鱼皮。
好消息,好消息,我们的新产品又又又又上线啦!
这次,我们做的是一款桌面端软件,号称 “颜值天花板” 的超级剪切板工具 `《剪切助手》`
> 官网下载:[https://jianqiezhushou.com](https://jianqiezhushou.com/)
![](https://pic.yupi.icu/1/1713409268242-4c2f1edd-7d80-4d04-8f05-0a553f3ee12a.png)
这也是我第一次正式发布桌面端软件。老实说,我们从去年就开始规划这个产品了,过程中踩了很多坑,快把我们团队开发折磨秃了。。。
## 为什么做这个项目?
首先肯定是从我自己的需求出发了,作为一名程序员和知识创作者,在我写文章和代码时,需要频繁地复制和粘贴多段内容,比如把不同文件的部分代码统一粘贴到文章内。
但无奈的是,系统默认只支持粘贴最近一次复制的内容,如果想找到之前已经复制的内容并再次粘贴,就很麻烦,只能再去复制一次。
![](https://pic.yupi.icu/1/1713416385991-eb2223b9-88cc-4342-b871-0f957c2ad8d0.gif)
我们团队的运营同学也有类似的烦恼:在回复用户时,往往要频繁回复同样的话术;每次回复时,都需要从备忘录里找到对应的内容,再来回地复制粘贴。
![](https://pic.yupi.icu/1/1713417097466-d12e4309-1f96-4915-8f92-92fdb682d464.gif)
有没有办法提高我们的工作效率呢?
答案:选用一个能力更强的剪切板工具。
其实很早之前我就有用过一些剪切板工具,也调研了近十个剪切板工具,无奈它们都无法满足我的需求。
比如有的剪切板工具不支持搜索:
![](https://pic.yupi.icu/1/1712630529534-e9b3ae7f-fdc2-4a96-9e3a-35bbe3bf4705.png)
有的剪切板工具只能复制纯文本,甚至不支持保存文件的复制记录:
![](https://pic.yupi.icu/1/1712632112480-4ef3d96a-30ad-4451-b458-d065b4a8d099.png)
而且他们的界面大多都不够优雅,比如这样:
![](https://pic.yupi.icu/1/1713410231149-602d7673-1971-4a42-8ecc-9c85893b6073.png)
我相信尤其是对于程序员朋友们,应该非常追求软件的美观炫酷吧。
此外,我发现大多数剪切板工具都是 **本地的**。自己在某台电脑上复制的内容无法同步到其他的设备。一旦更换了设备,之前已复制的内容便全部丢失了!
当然,也有一些相对好用的剪切板工具,但几乎都是收费的。。。
于是,我们决定自己出手了! **剪切助手,启动!**
## 什么是剪切助手?
剪切助手是一款界面精美、简单易用、跨设备同步、功能丰富的超级剪切板工具,目标是帮助大家大幅提高工作效率。
> 官网下载:[https://jianqiezhushou.com](https://jianqiezhushou.com/)
![](https://pic.yupi.icu/1/1713411132983-066edaac-17e1-4aeb-902f-a0d0bc2e2a75.png)
产品支持 Windows 和 Mac 双系统,且核心功能 **完全免费**!不就是白票嘛,拿去拿去~
![](https://pic.yupi.icu/1/1713410772603-7e592934-bc29-49ac-a91f-7c7520d58584.png)
下面只用一分钟,带大家快速掌握这款提高效率神器的用法(文末还有福利哦 🎁)!
### 一、颜值天花板
我们精心设计了剪切助手的 UI 界面,可以说是同类软件中的颜值天花板,就是这么自信~
咱就是说,光是看这个 Logo,就让我想起了一位故人。。
![](https://pic.yupi.icu/1/1712573250998-5f2b3ede-30dc-4baa-b1cd-62ef2ddc7cd7.png)
剪切助手支持横向布局和纵向布局,可以自由切换,灵活地展示已复制的内容:
![](https://pic.yupi.icu/1/1712632997742-76c75db3-5636-4709-88fd-47f0fb688034-20240418132647846.png)
![](https://pic.yupi.icu/1/1712575500228-ef068c26-a873-4957-b734-fafb36a580e9.png)
同时剪切助手提供了深色模式和浅色模式,可以根据自己的需要切换主题:
![](https://pic.yupi.icu/1/1712575739455-862a167e-4280-4d9d-a396-364ff0cb66fd.png)
### 二、高效搜索粘贴
剪切助手非常简单易用,只需要正常地按 `Ctrl + C` 进行复制,然后按快捷键(默认是 `Ctrl + O`)就可以唤起已复制内容面板。
无需使用鼠标,通过按键就可以自由搜索和选择内容进行粘贴:
![](https://pic.yupi.icu/1/1712643297334-792ddd3d-cabe-4e30-8f89-0cfd67c7f248.png)
还可以对内容进行分组,便于快速筛选,比如鱼皮将常用的代码片段分到了一组:
![](https://pic.yupi.icu/1/1713415283996-519e13e9-b867-4f9a-b74f-7e7f8937c348.png)
利用分组功能,你完全可以把剪切助手当做一个备忘录来使用,将自己要做的事情拖入指定分组,一目了然:
![](https://pic.yupi.icu/1/1713417204516-b434ed8f-ccce-4c4f-94a2-97419ab8b691.png)
还有更高效的用法!只需按 `Ctrl + 数字键`,就可以按顺序粘贴最新复制的几个内容,图片和文件等内容也可以快速粘贴到文件夹中~
![](https://pic.yupi.icu/1/1712814806558-0d9c7546-bcc6-4897-a072-35275bb69a15.gif)
### 三、自定义快捷键
剪切助手还支持自定义快捷键,实现快速切换分组、粘贴最近复制的内容。
甚至还支持给指定内容设置快捷键,可以一键粘贴自己最常用的内容:
![](https://pic.yupi.icu/1/1712576413168-7e2614bb-e180-4cec-b442-46dbfff5f31a.png)
运营同学可以利用这个功能,给一些高频回复的话术设置快捷键。在需要回复时,按下对应的快捷键即可,不用再去翻备忘录了!
### 四、极速分享内容
这是其他市面上的剪切板工具没有的创新功能,可以一键分享自己复制的内容。
例如我要分享一个有趣的字符画,只需要右键单击内容,就会得到一个分享链接:
> 比如:http://web.jianqiezhushou.com/post/348983238094074
![](https://pic.yupi.icu/1/1712576116576-c34dfd98-19ce-40b7-b25b-4c2f13fd41c6.png)
然后自己和其他小伙伴就可以在任意设备上查看分享的内容,如下图:
![](https://pic.yupi.icu/1/1713416065657-0adddd2c-242c-47ad-8929-83c7f65ce45a.png)
所以完全可以把剪切助手当做一个信息同步的小工具,比如把自己电脑上复制的代码分享到手机上查看等~
### 五、跨设备云同步
剪切助手提供了云同步功能,支持多台设备共享复制内容。
比如你在 Windows 电脑上复制的内容,想换到一台 Mac 新电脑,只需要点击同步按钮,就能无缝切换、快速完成同步备份,数据不会丢失!
![](https://pic.yupi.icu/1/1712576546395-c47fb4ee-98fd-45ff-b0bd-3fa42dc3a1d9.png)
云同步默认不会开启,所以大家完全不用担心隐私问题。
### 其它功能
除了上述核心功能,我们还提供了很多比较细节的功能。
比如:**自动识别复制的内容类别**
如果复制的内容是链接,会展示网页标题和 logo,并且右键单击就能直接在浏览器中打开:
![](https://pic.yupi.icu/1/1713416598726-d857bbd7-84b4-4148-9ad3-225412926af6.png)
如果复制的是图片和文件,会展示占用的空间大小;复制的是文本,将展示字数等。
![](https://pic.yupi.icu/1/1713416668587-36a5c786-870c-4525-9640-cd5c42088887.png)
### 欢迎免费使用
OK 就介绍到这里,欢迎大家使用剪切助手:[https://jianqiezhushou.com](https://jianqiezhushou.com/)
产品刚上线,肯定还有很多不足之处,大家可以加入我们的用户交流群,把自己的想法、建议、使用体验等反馈给我们。我们也准备了很多 🧧 红包和 🎁 周边,奖励给我们的第一波原始用户和 “找 Bug 小能手” 们哦~ 感谢大家支持。
![](https://pic.yupi.icu/1/1713417965952-01999197-2196-442d-966e-1f01c45d7530.png)
@@ -0,0 +1,237 @@
# 我做了个网站,帮你写出满分简历!
> 本文作者:[程序员鱼皮](https://yuyuanweb.feishu.cn/wiki/Abldw5WkjidySxkKxU2cQdAtnah)
>
> 本站地址:[https://codefather.cn](https://codefather.cn)
大家好,我是鱼皮。做知识分享 4 年来,我已经帮朋友们看了上千份简历了,毫不夸张地说,绝大多数同学的简历只能用 “惨不忍睹” 来形容。
有几个最最最典型的写简历问题,比如:
- 简历篇幅少,不知道写什么
- 简历的排版不够整齐,花里胡哨
- 简历的专业技能不够专业
- 简历中的语句不通顺
- 简历内容存在错别字
还不急着找工作的同学们,也别觉得写简历和你们没关系,如果能早点意识到这些问题、掌握写简历的方法,就不至于在找工作的时候闹笑话了。
作为一名程序员,每当看到这些问题,我都会陷入沉思:有什么办法能自动帮助大家发现简历上的问题?帮大家更快地写出更好的简历?
为了解决这些问题,在调研了十几个写简历平台后,我决定带团队开发一个全新的在线简历制作网站 —— 老鱼简历!
> 网址:https://laoyujianli.com ,就是老鱼简历的拼音,很好记吧~
![](https://pic.yupi.icu/1/image-20231122134747416.png)
经过了一段时间的开发、内测、迭代、公测,现在平台已经稳定运行,我也录制了第一个宣传视频,分享给大家。
通过这个视频,就能快速了解我们平台是怎么帮你提高写简历效率的啦~
> 视频地址:https://www.bilibili.com/video/BV1Vw411p7ei/
自己开发的网站,自己肯定要先用,所以鱼皮也是掏出了自己大学时期自己拿 Word 排版的酱香简历,用老鱼简历来重新写一遍。文章最后也会给大家分享鱼皮大学时期的在线简历链接,给大家作为参考。
下面是关于老鱼简历的文字介绍:
## 一、快速生成简历
老鱼的第一大能力是快速生成简历,不到一分钟,就能帮你生成一份基础简历。
我们提供了 3 种创建简历的方式。
### 简历模板
首先是简历模板。
一份优秀的简历更重要的是内容,排版只要简洁整齐即可,拒绝花里胡哨。
老鱼提供了多种简洁专业的简历模板,点一下就能创建出整齐美观的简历,不用再把时间浪费在排版上了!
![](https://pic.yupi.icu/1/%E6%9C%8B%E5%8F%8B%E5%9C%881-20231122134518132.png)
老鱼还提供了热门岗位的简历模板,有很多现成的简历内容参考,给大家提供写简历的思路和灵感。
比如前端实习简历模板,一键即可使用:
![](https://pic.yupi.icu/1/image-20230927132442244-20231122134518284.png)
### AI 快速生成简历
很多第一次写简历的同学,可能完全不清楚简历的写法,一头雾水。
为此,我们开发了 AI 生成简历的功能,只需填写目标职位并简单介绍你的基本情况,即可快速生成一份求职简历!
![](https://pic.yupi.icu/1/image-20230927133412261-20231122134518373.png)
生成效果如下,学校、专业技能、工作经历都有填充:
![](https://pic.yupi.icu/1/image-20230927133641303.png)
不过要注意的是,AI 生成的内容并不固定,你填写的信息越详细,效果才会越好~
### 多种格式简历导入
我相信很多同学的简历可能还是拿 Word 写的,但其实强烈不建议投递 Word 格式的简历,可能会出现排版错乱,也不利于维护更新。
老鱼简历支持快速导入 Word、PDF、JPG、PNG、Markdown、Doc、Html 等多种格式的简历文件,可以轻松地帮你实现 “简历上云”,之后投递和分享简历都会更方便~
![](https://pic.yupi.icu/1/0a3a72d0-0c93-45a5-87c3-281e16b72bc6-20231122134518766.png)
## 二、快速优化简历
创建一份基础简历后,接下来就要根据自己的实际情况去编写和优化简历了。
老鱼简历提供了多种实用功能,来帮大家解决写简历常犯的问题:
### 1、简历实时编辑浏览
首先是一个简单易用的简历编辑器,左侧编辑、右侧实时浏览,还支持灵活调整样式、一键切换主题模板,写简历的体验拉满~
![](https://pic.yupi.icu/1/image-20230927135123890-20231122134518974.png)
### 2、自定义简历模块
支持自由添加模块、富文本自定义内容和格式等,几乎满足你对简历的所有修改需求!
> 当然,如果有无法满足的需求,欢迎随时反馈给我们,非常感谢 🌹
![](https://pic.yupi.icu/1/image%20(3)-20231122134519163.png)
### 3、智能纠错
开头提到了,很多同学的简历是存在错别字的。尤其是技术类岗位,一个错别字就会大大影响面试官对你的看法,可能导致简历直接挂掉!
为解决这个问题,老鱼简历提供了一键 `智能纠错` 功能,不仅能够帮你快速修正错别字,还能优化专业名词、大小写、错误的标点、语句的连贯性等:
![](https://pic.yupi.icu/1/image%20(4)-20231122134519304.png)
### 4、智能一页
虽然说简历的长度并没有强制要求一页纸,但一般建议以一页纸为佳,或者保证简历的第一页是最能体现你个人能力和价值的内容。
但有些同学可能正好写了一页纸多一丢丢,怎么办呢?
老鱼简历提供 `智能一页` 功能,可以一键调整简历排版、自动优化到一页纸:
![](https://pic.yupi.icu/1/cef2eaf8-39de-47bb-84a8-a69d8879a5a2-20231122134519390.png)
### 5、简历助手
这是我们认为最实用的功能。很多同学由于没有写简历、或者实践的经验,可能完全不知道怎么写简历的内容。比如专业技能、项目经历、校园经历等模块。
为了解决这个问题,老鱼简历提供了丰富的、各职位、各模块的 `简历例句``简历建议` ,帮助大家快速完善简历、学习写简历的经验方法。
比如快速引用专业技能例句:
![](https://pic.yupi.icu/1/image%20(5)-20231122134519520.png)
学习如何写好专业技能、以及常见的问题:
![](https://pic.yupi.icu/1/image%20(6)-20231122134519691.png)
可千万别小瞧了写简历的技巧,有的时候,一个细节就能给你的简历超级加分!
比如鱼皮的简历中,提到了自己在校期间作为网站建设工作室的负责人、给学校建了多个网站,通过放了一个真实的网站链接来大幅增加经历的可信度。同样,大家自己做过的项目最好也都能提供项目或者文档地址。
![](https://pic.yupi.icu/1/image-20230927141549926-20231122134519763.png)
后面这部分内容还会持续完善,我们希望能够打造一份专业全面的简历素材仓库。
### 6、AI 优化简历内容
每一个模块都支持 AI 优化功能。只需一键,AI 帮你快速优化简历的内容,让语句更通顺、内容更连贯、表达更专业!
![](https://pic.yupi.icu/1/image%20(7)-20231122134519865.png)
优化效果如下:
![](https://pic.yupi.icu/1/325fa676-27f0-4176-8814-98c1512fc119-20231122134519983.png)
## 三、分享简历
编写完简历后,我们可以通过把简历导出为 PDF 和图片、或者在线链接等多种途径分享简历。
### 导出简历为 PDF 和图片
示例导出效果如下图,看起来还不错吧~
![](https://pic.yupi.icu/1/%E9%B1%BC%E7%9A%AE%E7%9A%84%E7%AE%80%E5%8E%86%EF%BC%88%E5%A4%A7%E5%AD%A6%E8%84%B1%E6%95%8F%E7%89%88%EF%BC%89.png)
### 在线分享简历链接
可以给自己写好的简历生成一个极简干净的在线简历页面链接,便于给面试官或 HR 分享。
支持自定义链接地址,比如鱼皮的大学简历:https://laoyujianli.com/share/yupi ,大家可以点进去看看效果。
> 如果你是一位开发者,还可以使用 “嵌入代码” 的方式,把个人简历嵌入到自己的网站中~
![](https://pic.yupi.icu/1/image-20230927142119454-20231122134520312.png)
### 简历一键脱敏分享
分享简历时,还支持一键隐藏个人敏感信息,只保留核心内容,让简历更安全:
![](https://pic.yupi.icu/1/4ebdf063-def1-4f13-8328-512cca63f46b-20231122134520412.png)
## 四、其他功能
### 1、求职经验分享百科
我们精选了一些大厂同学的求职经验分享文章,帮助你提高求职竞争力!
> 后面也会持续增加更多新的文章~
![](https://pic.yupi.icu/1/(null)-20230927125709592-20231122134520103-20231122135515424.png)
### 2、简历中英文翻译
如果想同时投递国内外的公司,这个功能就很实用了。只需要点击 `翻译` 按钮,就能自动将简历转换为英文版本啦!
![](https://pic.yupi.icu/1/1700586172961-f3bce3a7-df22-4b8a-b4ae-f9457e401197.png)
## 欢迎免费使用
OK,就介绍到这里,欢迎大家使用老鱼简历:[https://laoyujianli.com](https://laoyujianli.com) ,有任何建议请随时反馈给我们,感谢您的支持。
最后,再重点感谢一下开通会员支持的同学,请勿必访问这个页面加入会员群:https://www.laoyujianli.com/user/settings,大家的反馈和建议(Bug)我们会尽快修复,希望给大家更好的体验。
@@ -0,0 +1,204 @@
# 我在简历上写了这个,超级加分!
> 本文作者:[程序员鱼皮](https://yuyuanweb.feishu.cn/wiki/Abldw5WkjidySxkKxU2cQdAtnah)
>
> 本站地址:[https://codefather.cn](https://codefather.cn)
大家好,我是鱼皮。做知识分享以来,我已经帮小伙伴们看了上千份简历了,也给大家分享过常见的简历问题,比如:
- 简历的排版不够整齐
- 简历的专业技能不够专业
- 简历语句不通顺
- 简历内容存在错别字
每当看到这些问题,我都会思考:有什么办法自动帮助大家发现简历上的问题?帮大家更快地写出更好的简历?
为了解决这些问题,我决定带团队开发一个全新的写简历产品 —— 老鱼简历!经过了一段时间的开发和内测,今天算是它第一次和大家正式见面的日子。
网址:https://laoyujianli.com ,就是老鱼简历的拼音,很好记吧~
![](https://yupi-picture-1256524210.cos.ap-shanghai.myqcloud.com/1/4a9bf650-5da5-4988-a605-af809e6262ef.png)
我们的 Slogan 是 `写简历从未如此简单` ,目标也很明确,就是希望帮大家轻松写好简历。
自己开发的网站,自己肯定要先用,所以鱼皮也是掏出了自己大学时期自己拿 Word 排版的简历,用老鱼简历来重新写一遍。等会儿会给大家分享鱼皮的在线简历链接,给大家作为参考。
## 一、快速生成简历
使用老鱼简历,不到一分钟,就能帮你生成一份基础简历。
### 简历模板
一份优秀的简历更重要的是内容,排版只要简洁整齐即可,拒绝花里胡哨。
老鱼简历提供了多种简洁专业的简历模板,点一下就能创建出整齐美观的简历,不用自己再操心排版了!
![图片](https://yupi-picture-1256524210.cos.ap-shanghai.myqcloud.com/640-20231007213503893.png)
老鱼简历还提供了热门岗位的简历模板,有很多现成的简历内容参考,给大家提供写简历的思路和灵感。
比如前端实习简历模板,一键即可使用:
![](https://yupi-picture-1256524210.cos.ap-shanghai.myqcloud.com/1/image-20230927132442244.png)
### AI 快速生成简历
很多第一次写简历的同学,可能完全不清楚简历的写法,一头雾水。
为此,我们开发了 AI 生成简历的功能,只需简单介绍你个人的基本情况,即可快速生成一份求职简历!
![图片](https://yupi-picture-1256524210.cos.ap-shanghai.myqcloud.com/640-20231007213540601.png)
生成效果如下,学校、专业技能、工作经历都有填充:
![图片](https://yupi-picture-1256524210.cos.ap-shanghai.myqcloud.com/640-20231007213605368.png)当然你填写的信息越多,效果才会越好~
### 多种格式简历导入
我相信很多同学的简历可能还是拿 Word 写的,但其实强烈不建议投递 Word 格式的简历,可能会出现排版错乱,也不利于维护更新。
老鱼简历支持快速导入 Word、PDF、JPG、PNG、Markdown、Doc、Html 等多种格式的简历文件,可以轻松地帮你实现 “简历上云”,之后投递和分享简历都会更方便~
![](https://yupi-picture-1256524210.cos.ap-shanghai.myqcloud.com/1/0a3a72d0-0c93-45a5-87c3-281e16b72bc6.png)
## 二、快速优化简历
创建一份基础简历后,接下来就要根据自己的实际情况去编写和优化简历了。
老鱼简历提供了多种实用功能,来帮大家解决写简历常犯的问题:
### 简历实时编辑浏览
首先是一个简单易用的简历编辑器,左侧编辑、右侧实时浏览,还支持灵活调整样式、一键切换主题模板,写简历的体验拉满~
![](https://yupi-picture-1256524210.cos.ap-shanghai.myqcloud.com/1/image-20230927135123890.png)
### 自定义简历模块
支持自由添加模块、富文本自定义内容和格式等,几乎满足你对简历的所有修改需求!
> 当然,如果有无法满足的需求,欢迎随时反馈给我们,非常感谢 🌹
![](https://yupi-picture-1256524210.cos.ap-shanghai.myqcloud.com/1/image%20(3).png)
### 智能纠错
开头提到了,很多同学的简历是存在错别字的。尤其是技术类岗位,一个错别字就会大大影响面试官对你的看法,可能导致简历直接挂掉!
为解决这个问题,老鱼简历提供了一键 `智能纠错` 功能,不仅能够帮你快速修正错别字,还能优化专业名词、大小写、错误的标点、语句的连贯性等:
![](https://yupi-picture-1256524210.cos.ap-shanghai.myqcloud.com/1/image%20(4).png)
### 智能一页
虽然说简历的长度并没有强制要求一页纸,但一般建议以一页纸为佳,或者保证简历的第一页是最能体现你个人能力和价值的内容。
但有些同学可能正好写了一页纸多一丢丢,怎么办呢?
老鱼简历提供 `智能一页` 功能,可以一键调整简历排版、自动优化到一页纸:
![](https://yupi-picture-1256524210.cos.ap-shanghai.myqcloud.com/1/cef2eaf8-39de-47bb-84a8-a69d8879a5a2.png)
### 现成的简历例句和建议
很多同学没有写简历、或者实践的经验,可能完全不知道怎么写好简历的内容,比如专业技能、项目经历、校园经历等模块。
为了解决这个问题,老鱼简历提供了丰富的、各职位、各模块的 `简历例句``简历建议` ,帮助大家快速完善简历、学习写简历的经验方法。
比如快速引用专业技能例句:
![](https://yupi-picture-1256524210.cos.ap-shanghai.myqcloud.com/1/image%20(5).png)
学习如何写好专业技能、以及常见的问题:
![](https://yupi-picture-1256524210.cos.ap-shanghai.myqcloud.com/1/image%20(6).png)
可千万别小瞧了写简历的技巧,有的时候,一个细节就能给你的简历超级加分!
比如鱼皮的简历中,提到了自己在校期间作为网站建设工作室的负责人、给学校建了多个网站,通过放了一个真实的网站链接来大幅增加经历的可信度。同样,大家自己做过的项目最好也都能提供项目或者文档地址。
![](https://yupi-picture-1256524210.cos.ap-shanghai.myqcloud.com/1/image-20230927141549926.png)
后面这部分内容还会持续完善,我们希望能够打造一份专业全面的简历素材仓库。
### AI 优化简历内容
每一个模块都支持 AI 优化功能。只需一键,AI 帮你快速优化简历的内容,让语句更通顺、内容更连贯、表达更专业!
![](https://yupi-picture-1256524210.cos.ap-shanghai.myqcloud.com/1/image%20(7).png)
优化效果如下:
![](https://yupi-picture-1256524210.cos.ap-shanghai.myqcloud.com/1/325fa676-27f0-4176-8814-98c1512fc119.png)
### 求职经验分享百科
我们精选了一些大厂同学的求职经验分享文章,帮助你提高求职竞争力!
> 后面也会持续增加更多新的文章~
![](https://yupi-picture-1256524210.cos.ap-shanghai.myqcloud.com/1/(null)-20230927125709592.png)
## 三、分享简历
编写完简历后,我们可以通过把简历导出为 PDF 和图片、或者在线链接等多种途径分享简历。
### 导出简历为 PDF 和图片
示例导出效果如下图,看起来还不错吧~
![](https://yupi-picture-1256524210.cos.ap-shanghai.myqcloud.com/1/%E9%B1%BC%E7%9A%AE%E7%9A%84%E7%AE%80%E5%8E%86%EF%BC%88%E5%A4%A7%E5%AD%A6%E8%84%B1%E6%95%8F%E7%89%88%EF%BC%89.png)
### 在线分享简历链接
可以给自己写好的简历生成一个极简干净的在线简历页面链接,便于给面试官或 HR 分享。
支持自定义链接地址,比如鱼皮的大学简历:https://laoyujianli.com/share/yupi ,大家可以点进去看看效果。
> 如果你是一位开发者,还可以使用 “嵌入代码” 的方式,把个人简历嵌入到自己的网站中~
![](https://yupi-picture-1256524210.cos.ap-shanghai.myqcloud.com/1/image-20230927142119454.png)
### 简历一键脱敏分享
分享简历时,还支持一键隐藏个人敏感信息,只保留核心内容,让简历更安全:
![](https://yupi-picture-1256524210.cos.ap-shanghai.myqcloud.com/1/4ebdf063-def1-4f13-8328-512cca63f46b.png)
## 欢迎免费使用
OK,就介绍到这里,欢迎大家使用老鱼简历:https://laoyujianli.com ,有任何建议请随时反馈给我们,感谢支持。
@@ -0,0 +1,113 @@
# 要来了我们实习生的简历,仅供参考。。
> 本文作者:[程序员鱼皮](https://yuyuanweb.feishu.cn/wiki/Abldw5WkjidySxkKxU2cQdAtnah)
>
> 本站地址:[https://codefather.cn](https://codefather.cn)
大家好,我是程序员鱼皮。3 月了,春招正在进行中,我特地要来了我们公司日常实习生的简历,给大家作为参考。
事先说明:
1. 为保护当事人隐私,简历进行了脱敏,并且对部分内容进行了修改和优化。
2. 这位同学的学历一般,但在编程的学习上,是比较努力且优秀的。
下面我先按照模块一个个给大家分享,并且适当说一些简历中好的、或者还可以进一步优化的地方。
整个简历是使用我们公司自研的写简历神器 —— 老鱼简历制作的,如果你不太会写简历,这个工具能帮你节省时间、学到很多参考写法。
> 老鱼简历:https://laoyujianli.com
### 1、个人信息和教育经历
如图:
![](https://pic.yupi.icu/1/image-20240301185922178.png)
这部分内容不要占用过多的空间,几行就可以了。
个人照片必须是标准证件照,不能是生活照!这里鱼皮为保护当事人隐私,随便找了张图片而已~
主修课程那里其实是鱼皮优化过的,本来还写了更多课、而且也没有相应的分数。
鱼皮的建议是:本身就是计算机相关专业(或者专业和求职岗位相匹配)的同学不用再占用空间去写自己的主修课程了,因为学校教的内容往往比较基础、而且面试官默认这个专业或者投递这个岗位的同学都应该会这些课,写上去也没有什么优势。
但是建议非计算机相关专业(或者专业和求职岗位不匹配)的同学适当列举关键主修课程,优先列举和求职岗位相关的、取得分数较高的课。
如果有得分较高的课程(比如 90 分以上),可以在课程名后用括号补充分数。
### 2、荣誉奖项
如图:
![](https://pic.yupi.icu/1/image-20240301190255511.png)
这位同学的经历还是比较丰富的,而且对奖项进行了排序,以及对关键词进行了加粗,这点非常好。
建议大家也像他一样,优先把认可度高的、参赛范围广的、获奖级别高的、和求职岗位更相关的奖项放上面,一些不知名的竞赛放到下面或者合并去写。
他的荣誉奖项模块占用的篇幅比例其实有点过多了,可以再节约一些空间,2 ~ 3 行就够了。
### 3、实习经历
如图:
![](https://pic.yupi.icu/1/image-20240301190438787.png)
那必然是我们公司的实习哈哈!实习经历的核心是突出自己的职责和工作重点,比如负责 xx 功能。如果要写一些通用的职责,比如 “写文档” 之类的,最好有量化的成果,比如完成了什么文档、写了多少篇文档等。写得越具体,越真实。
### 4、项目经历
如图:
![](https://pic.yupi.icu/1/image-20240301190620914.png)
这是我之前全程直播带大家开发的智能数据分析平台项目,没啥好说的,项目经历的关键就是写清楚:自己用什么技术、解决了什么问题、取得了怎样的效果,而不能只写完成了某某功能。
> 其实这位同学原本写了 2 个项目,考虑到隐私性,被我删了一个。
### 5、专业技能
如图:
![](https://pic.yupi.icu/1/image-20240301191058962.png)
这块也没什么好说的,都是标准写法,重点注意几个细节:
1. 技术名词不能有错别字、大小写要标准
2. 技术写得较多时,适当加粗部分内容,突出重点
3. 尽量不要写 “了解”,比较空,约等于你没实践过。其实在项目中实践过的技术都可以写 “熟悉”。
4. 注意好技术优先级的排序,比如这位同学以后端为主,那前端就写到最后。
### 6、个人简介
如图:
![](https://pic.yupi.icu/1/image-20240301191306411.png)
个人简介一般是放到简历的最后,可有可无。如果要写的话,避免 “自吹自擂” 的话,而是要通过事例来证明自己拥有某个能力,最好还是企业招聘信息中明确要求的能力。比如这位同学说自己写文章的能力强,并且通过自己得过 CSDN 博客之星称号来证明,就是不错的。
---
OK,整份简历的内容就介绍到这里。
> 查看完整简历:[https://laoyujianli.com/share/yupi3](https://laoyujianli.com/share/yupi3)
求职是个持续成长的过程,大家要多看、多学、多对比别人的简历,才知道自己所处的位置,找到下一步的提升方向。
大家加油吧~
@@ -0,0 +1,167 @@
# 工具 - 无门槛 AI 对话 绘画神器
鱼皮团队研发的《鱼聪明 AI》网站:https://yucongming.com (做您强大的 AI 助手)
![](https://pic.yupi.icu/5563/202404191333530.jpeg)
微信扫码,可以直接在手机上使用~
![](https://pic.yupi.icu/5563/202404191333558.png)
## 优势
- 数百个实用 AI 对话助手
- 轻松创建个人 AI 助手
- 实用对话插件
- AI 写书(一键生成数万字书籍)
- AI 绘画(一键生成精美图片和海报)
- AI 导航(几百个 AI 工具站集合)
- API 开放平台
肯定有同学要问啦,现在网上的 AI 工具那么多,为什么选择用鱼聪明 AI 呢?
如果你是一个有点儿技术、能摸索的同学,你当然可以自己搞 AI 账号、自己用开源项目搭建;当然,这也意味着你要自己维护和承担账号、服务器费用,注意开源项目中的一些漏洞。
但是,使用鱼聪明 AI **不需要任何的门槛!也不需要自己搞账号!**
现在所有用户每天都可以免费领取鱼毛(用于对话)。
当然,我们的系统背后,也承担了巨量的费用,人力 + 服务器 + AI 服务 + 网安费等等;我们做这款产品,肯定也是 **希望能有收益的** ,总不能让公司破产吧。
所以我们也提供了 **会员服务** ,大家可以按需开通,价格已经非常良心了~ 毕竟我们现在 **每天有上万名用户** ,算算成本就知道了。
## 功能介绍
### 数百个实用 AI 对话助手
进入主页,能看到非常多现成的、实用的 AI 助手,支持从几百个 AI 助手中搜索,总有一个你想要的:
![](https://pic.yupi.icu/5563/202404191333553.jpeg)
点击 开始聊天 ,就能立即和我们的鱼聪明聊天啦,你可以让她帮助你解决学习、工作上的问题,提高效率:
![](https://pic.yupi.icu/5563/202404191333598.jpeg)
你可以和【小红书种草文案】大师交流,5 秒钟,就帮你写出一篇小红书风格的文案 🧑🏻🦲📚!
![](https://pic.yupi.icu/5563/202404191333648.png)
### 轻松创建个人 AI 助手
除了使用现成的助手外,你也可以轻松创建属于自己的 AI 助手,打造属于自己的超级辅助!
![](https://pic.yupi.icu/5563/202404191333605.png)
比如某位用户创建的【冒险游戏】助手,就很不错,可以轻松生成 “一盘大局”,想象力可能比人类还要丰富哦~
![](https://pic.yupi.icu/5563/202404191333170.png)
如果你不太熟悉 AI,填个名称、头像就能创建 AI 助手了;但如果你想做一个精品的超级助手,我们还支持非常多的配置,让你自由定制~
比如添加对话示例(引导用户使用)、还可以把助手公开让别人一起使用:
![](https://pic.yupi.icu/5563/202404191333247.png)
还有更多的高级配置,比如示例问答、AI 的想象力等等,能够让你的 AI 更听话、更强大!
![](https://pic.yupi.icu/5563/202404191333243.png)
你还可以把自己用心制作的 AI 助手分享给别人,我们设计了精美的分享海报,独乐乐不如众乐乐,帮助更多人使用 AI,多是一件美事啊~
![](https://pic.yupi.icu/5563/202404191333474.png)
### 实用对话插件
除了向 AI 发消息、它会回复你文字之外,我们还提供了一些实用的小插件。
![](https://pic.yupi.icu/5563/202404191333455.png)
比如分享消息,可以把有意思的对话记录 **生成为海报** 分享给别人,传递快乐:
![](https://pic.yupi.icu/5563/202404191333505.png)
还可以语音朗读消息,这个功能可以用来 “学单词”、“学语言”,毕竟谁不想听一听小鸡说英文、唱 RAP 呢?
![](https://pic.yupi.icu/5563/202404191333834.png)
还可以一键下载对话为文档,如果你要用 AI 生成论文或高考作文,这个功能会非常实用~
### AI 写书
这是鱼聪明 AI 的重磅功能!除了对话之外,我们还提供了功能更强大的 AI 应用。
![](https://pic.yupi.icu/5563/202404191333990.png)
进入 AI 写书,只需要输入你想写的书的名称、书的内容介绍,就可以让 AI 自动帮你生成一本书!
比如下面这个,还可以指定书的风格:
![](https://pic.yupi.icu/5563/202404191333916.png)
点击【生成书籍】后,还能够实时浏览书籍的生成进度。建议大家快去试一试,这个应用已经成为我每日的快乐源泉了:
![](https://pic.yupi.icu/5563/202404191333401.png)
生成结束后,当然还可以下载书籍文档:
![](https://pic.yupi.icu/5563/202404191333309.png)
### AI 绘画
只需要输入你想画画的内容,比如 “鸡打篮球”,就能轻松生成 4 张富有创造力的图片:
![](https://pic.yupi.icu/5563/202404191333374.png)
由于我们接入的是国外最主流的 AI 绘画平台,对中文的支持度不是很友好,所以我们还提供了 **一键优化描述** 的功能:
当然,优化描述也是让 AI 做的,不是直接翻译哈哈
![](https://pic.yupi.icu/5563/202404191333454.png)
点击生成图片后,就可以实时浏览绘画生成的进度:
就像在孵小鸡一样,能看到最开始的样子,还是很有趣的~
![](https://pic.yupi.icu/5563/202404191333579.png)
很快图片就生成啦,来看看效果吧~
![](https://pic.yupi.icu/5563/202404191333040.png)
### AI 导航
如果你需要更多我们没有的 AI 功能,可以让鱼聪明帮你快速搜索,绝大多数的 AI 工具站都有收录~
![](https://pic.yupi.icu/5563/202404191333955.png)
### 开放平台
除了可以在网页上使用鱼聪明外,鱼皮本身作为程序员,当然也考虑到了程序员朋友们的需求啦。
所以我们提供了开放平台,让你在程序中使用 AI 助手!
![](https://pic.yupi.icu/5563/202404191333108.png)
只需要使用我们开源的 SDK(工具代码),就能轻轻松松,只用几行代码使用 AI 助手能力!
示例代码如下,可以选择要使用的助手:
```Plain
// 构造请求
DevChatRequest devChatRequest = new DevChatRequest();
devChatRequest.setModelId(1651468516836098050L);
devChatRequest.setMessage("鱼皮");
// 获取 AI 助手的回复
BaseResponse<DevChatResponse> response = client.doChat(devChatRequest);
System.out.println(response.getData());
```
由于我们目前人力有限,所以只能先提供 Java SDK,大家如果感兴趣的话,欢迎贡献其他语言的 SDK 哦~
## 欢迎免费试用
鱼聪明 AI 网站:[https://yucongming.com](https://yucongming.com) (做您强大的 AI 助手)
会员可以在个人主页加入专属群聊哦:
![](https://pic.yupi.icu/5563/202404191333178.png)
@@ -0,0 +1,188 @@
# 前端突击 - 前端面试训练营
> 本文作者:[程序员鱼皮](https://yuyuanweb.feishu.cn/wiki/Abldw5WkjidySxkKxU2cQdAtnah)
>
> 本站地址:[https://codefather.cn](https://codefather.cn)
这是由鱼皮和月哥等多名大厂技术专家合伙打造的编程训练营,主打 **前端求职面试突击** ,帮助学员 **用最短的时间** 从 0 到 1 拿到满意的前端开发 offer!
下面依次介绍下我们训练营提供的服务。
> ⭐️ [文末有报名方式](https://yuyuanweb.feishu.cn/docx/KeqUdEAcFobEUFxr5gvcc03tn3e#PAdgdg7ffoLm3kxhZ44cTV9lnQb)
## 专业面试辅导
保姆级别的服务,多位前端技术专家的导师阵容,和传统培训机构不一样的是,我们主打一对一辅导,让大家感受到 vip 服务的体验,在这里全程都会有督学监督,直到流程结束。
## 学员拿过哪些offer
面试训练营开办 3 年以来学员基本拿完所有大厂 offer,我们沉淀下来的技术经验,面试经验是巨量且丰富的。**学员拿过offer有:华为,京东,阿里,腾讯,字节,快手,网易,美团,百度,携程,B站,小红书,小米,得物,喜马拉雅,滴滴,有赞,拼多多,米哈游,蚂蚁,招商银行,平安,叮咚买菜,国企,奇安信,顺丰,哈啰,中通,申通,货拉拉,明源云,途虎,茄子快传,海康,蔚来,虾皮,shein,花旗银行,zoom,亚马逊,微软,sap 还有各种独角兽及其他中小公司的的 offer,一大推,基本上能叫的上名字的公司都被我们的学员收割了一遍**
### 就业率
面试训练营升级之后,目前二期近 180+ 人,我们就业数据完全群里的小伙伴都可以看到,因为实名制,通过我们的综合面试的就业率高达 **95%+** ,每一位同学我们都每周跟踪状态。做好前端面试培训我们是专业的!
![](https://pic.yupi.icu/5563/asynccode)
- [4月面试训练营offer复盘,10几位同学拿到offer,最高40k,两位同学超过35k](http://mp.weixin.qq.com/s?__biz=Mzg3ODUyODIyNA==&mid=2247488065&idx=1&sn=03e8925d18573ad6ae87605807924ff3&chksm=cf1301cef86488d8c3dccefcb5f972021c29b9c1fa287b2b503026e85a2d64172e157406f49a&scene=21#wechat_redirect)
- [5月中旬战绩!近10位同学拿到offer,最高27k](http://mp.weixin.qq.com/s?__biz=Mzg3ODUyODIyNA==&mid=2247488120&idx=1&sn=c2e78ed13b020c2b27abd63aa2a384e2&chksm=cf1301f7f86488e1b1e7107fca959eaff823fe464efbf0938a75ac1003b7bef44aece9d84d85&scene=21#wechat_redirect)
- [6月份11位同学拿到offer,最高28k,最高涨幅1w](http://mp.weixin.qq.com/s?__biz=Mzg3ODUyODIyNA==&mid=2247488405&idx=1&sn=e0a56b73bfbe1c55981b2c2ee79fffe1&chksm=cf13001af864890cb278ac66c467345edb97fdbf5b0b2d365a76cfd9a4762f19452fdf494e8f&scene=21#wechat_redirect)
- [7月面试训练营喜报,10几位同学拿到offer,最高涨幅1w+,最高薪资30k+](http://mp.weixin.qq.com/s?__biz=Mzg3ODUyODIyNA==&mid=2247488496&idx=1&sn=6c39125ca8261fddb6237671f060db65&chksm=cf13007ff864896952a412e6828565c2ab99071458026b8c12e58221e9b1630ee8985ef4dfd0&scene=21#wechat_redirect)
- [8月,开门红,两位同学拿到offer,15k+](http://mp.weixin.qq.com/s?__biz=Mzg3ODUyODIyNA==&mid=2247488511&idx=1&sn=6e8cf8fb79ef8d0a273714eb3bc8859c&chksm=cf130070f8648966bfcc12188af436561d770c95f4ad2a7b6dceabe78f6f4ca27c647a5cdd97&scene=21#wechat_redirect)
## 前端导师团队
导师的水平可能就是学员的天花板,所以我们不断的为训练营注入新鲜的血液,邀请很多前端技术大佬,多位技术专家,高级技术专家加入我们的团队,帮助到学员更好的成长!目前导师团队如下:
**凡哥**:前腾讯高级工程师,现一线大厂前端高级技术专家,职级p8+,teamleader,掘金小册作者
**红老师**: 阿里前端高级技术专家,P8 级,知名前端博主,拥有 10 余年前端开发经验,Github 多个过千 Stars 的开源项目作者,负责部门的前端技术架构选型及演化、研发效率的提升和用户体验的深挖。负责团队招聘面试,累计面试上千余人。
**samson**: 阿里云前端技术专家,职级p7,十余年从业经验,曾负责 toB 低代码开发平台,服务超 10万+ 企业客户。在职期间主导并获得了多个国家级技术专利,参与过行业级别低代码标准申请。据有丰富的前端架构和全栈研发经验,对低代码、移动多端适配、数据可视化、前端性能优化等多个领域都有深入的研究。多年带团队经验,熟悉大厂人才选育标准。
**旋哥**:某厂前端架构师,职级p7,7年+开发经验,拥有众多开源明星项目,在公司主导组件库、低代码平台、基础设施等,有非常强的工程化经验落地,
**龙哥**:某一线前端开发专家,职级p7,8年从业经验。据有丰富的前端架构和全栈研发经验,对低代码、数据可视化、前端工程化等领域都有深入的研究。在公司负责前端架构研发,针对前端工程化、微前端架构、数据可视化渲染等技术进行落地实施。
**月哥**:前端面试训练营创始人,卷王一枚,主攻前端面试进阶 3 年以来学员超千人,分布在国内外。学员拿遍了一线大厂offer,有丰富的前端面试进阶的经验,以身作则,善于激发学员突破自己,努力学习达到自己的目标
**鱼皮**:前腾讯全栈工程师,现科技公司创始人,全网150w+粉丝的编程博主,爱做项目爱分享,github 中国区前20,有30+独立项目经验,善于把java后端、前端项目讲的通俗易懂
**CUGGZ**:目前在一线教育公司担任前端开发。掘金 LV8 作者,公众号“前端充电宝”号主,一年多时间输出 200 多篇原创文章,累计阅读 300w+。专注前端进阶知识,面试题分享,努力写出小白都能看懂的教程文章。
**小鑫**:双非校招拿到多个大厂的校招 offer,包括阿里和字节,最后去了字节,会帮助我们训练营的校招同学辅助学习各方面关于校招注意事项,以及基础算法相关。
**杨杰**:6 年前端开发及 4 年 IT 教育经验,千锋教育担任高级前端讲师。有丰富的实战教学经验,我们 0 基础班的负责人。
### 后端导师
**雷老师**:宋雷:曾就职于京东和去哪儿网,前美团高级技术经理,前vipkid后端技术委员会主席,前新东方在线技术总监,对大型分布式、高并发、高可用、高性能的复杂系统设计具备丰富经验
## 辅导流程
区别于市面上原有的录播课或直播大班课教学模式,我们会根据根据学员的真实技术等级(初级、中级、高级、专家)和技术特点(长短板),进行有针对性的、千人千面的培训辅导。**我们侧重 1v1 的重服务辅导,所以效果比较明显**
### 1、1v1模拟面试摸底
所以第一步,报名的1-2日之内,助教联系大家安排技术摸底,通过模拟真实面试场景,根据学员在面试中的真实表现,进行学员的能力和特点评估。全方位的了解学员的前端各方面的水平,从而制定相应的学习计划!这个其他机构你是看不到的。我们主打一对一的摸底!
![](https://pic.yupi.icu/5563/asynccode)
### 2、制定学习计划
该学习计划会在充分考虑学员诉求和职业发展的基础上,根据学员的客观工作情况进行合理安排,(这里主要有两条线,一条是需要快速跳槽,第二条是需要长期准备面试的)帮助学员补齐现有技术体系中的短板,及合理地对学员的强项进行针对性地深耕,让学员在广度和深度上均有所建树。同时,也在帮助学员做减法,摒弃一些前景不明、面试阶段涉及可能性不大的技术体系,让学员的时间和精力投入可以精准命中,取得结果。
### 3、阶段性成果验收
此阶段会对学员一段时间内的学习成果进行检验,包括**八股文**、**算法**和**项目中的实际解决方案**。同时,我们也关注学员是否与预期学习成果存在差距,学习过程中是否存在疑惑和困难,并及时进行答疑和纠偏。我们始终会贴着学员的目标走,一点一点的攻克!
### 4、全周期成果验收(综合面试)
此阶段主要针对于辅导学员**简历优化**,面试技巧、心得、节奏把控等,以及针对于不同面试官的不同面试策略。同时,仍然会对学员的八股文、算法和项目中的实际解决方案进行考察和优化。
![](https://pic.yupi.icu/5563/asynccode)
### 5、项目重难点优化
我们梳理了一系列的项目重难点,亮点,以及告诉大家怎么样去提炼,如果去回答,比方微前端、组件库、脚手架、大文件上传、性能优化等等;一直在做后台管理项目,怎么提炼......,在我们这里都能够找到答案!
很多时候,难点、亮点本身就是悖论问题,你觉得难,你觉得亮,但是面试官不觉得,那就很尴尬,我们在这个过程中如何的表述好,让面试官能够感受到我们在其中的思考,很成长,这也是非常玄学的东西,千人千面,我们该如何表述项目经历,体现自己价值,也是难点之一,在这里我们都会case by case的帮助到大家如果去表达!
![](https://pic.yupi.icu/5563/asynccode)
### 6、专项的面试复盘
通过综合面试之后,学员们出去面试,我们还会对学员进行实战的面试复盘,分析总结同学在面试中发挥的情况,针对性的复盘总结,帮助到同学们更好更加明确的准备接下来的面试!
## 优秀的导师带来的经验价值
我们的前端导师团队的水平是非常强的,面试能力或者的技术能力,每个人都在自己擅长的领域为我们的团队做贡献,我们每周都会开例会,总结这周我们更新了哪些资料,下周的目标有哪些,这是我们的事业,会努力做的更好。
![](https://pic.yupi.icu/5563/asynccode)
### 完善的内部库资料
区分每个 topic 的重难点,让学员更加清晰的学习,同时每个topic有对应的群聊讨论,每个topic都有专门擅长这个领域的导师负责维护,同时会不断的更新优化,对应topic的内容
![](https://pic.yupi.icu/5563/asynccode)
专项的topic群聊:
![](https://pic.yupi.icu/5563/asynccode)
3 年以来我们沉淀了大量的学习资料,这次学员进了我们 **新版内部库** 的感受,我们非常用心的整理沉淀体系化了,包含基础,项目重难点,各个框架的侧重点,以及如果回答,如何表述!
![](https://pic.yupi.icu/5563/asynccode)
### 每周技术分享
- 每周都会有技术分享,导师的主题直播分享,学员学习经验、拿到offer的情况的分享。
![](https://pic.yupi.icu/5563/asynccode)
![](https://pic.yupi.icu/5563/asynccode)
### 学员学习记录
**时间证明价值**:我们学员的内部库目前已经沉淀的160w字,这是我们已经在做的事,全部的都是学员自己写的,所以在面试训练营里面你会看到一个积极向上的学习氛围,大家都在默默的努力着,追寻自己的目标!
![](https://pic.yupi.icu/5563/asynccode)
面试辅导拒绝躺平,你既然花了钱,就必须学习,**环境****寒心,但是心不能寒,依旧要努力把这件事做好,才能更有机会,今年大家出去面试应该能够深刻的感受到**,虽然你花了钱不找我们,对我们来说是件好事,但是,对你自己来说你这个钱花的就毫无意义,我们也不希望看到这样的现象,所以我们为大家准备了内部学习库,监督你刷题学习。
### 导师给学员建立学习档案
我们给每一位同学,都建立了学习档案,记录你每一次检测的情况,如有问题及时同步,**要求每一位导师必须详细记录,我们实时监督!**,我们是做服务的,从进入到面试训练营,到拿到offer结束,每一次一对一都是会责任到人,都要落实到文档中记录!
![](https://pic.yupi.icu/5563/asynccode)
### 每周监督
![](https://pic.yupi.icu/5563/asynccode)
- 我们这边目前是人力监督,没有做一些自动的化操作,让学员自己写,因为之前也试过,效果不是很好,所有我们这边每周都有专门的助教人工统计大家的学习进度,有问题方便对齐,目的就是监督大家持续学习
- 懒惰、三天打鱼两天晒网是我们很多同学常见的现象,但是在这里不行,我们要求每周同学都必须学习总结,不然的话,老师会单独找到你们,说明理由,不能花钱进来躺平,这个是不允许的!
- 所以你们能够看到,我们确实在用心的为大家考虑,我们重服务,成本高,我们希望你们学有所成,这种重服务,你应该在其他培训里面是看不到的。
- 有问题的同学,都会被约谈话,目的就是为了鼓励和督促大家学习,我们是在用心做辅导!
![](https://pic.yupi.icu/5563/asynccode)
## 适合人群
校招:时间紧迫,想在短时间内提升各方面的前端面试能力,我们导师都有丰富的大厂校招招聘经验,帮助大家针对性的快速提升能力,冲刺大厂
社招:已经离职,或者在职进阶,我们面试训练营目前有70%的同学在职提升,30%的同学离职准备面试。离职的同学还可以来到线下面试训练营学习!
通过我们面试训练营的标准,进大厂的很多,但是我们依旧不能保证你肯定能够进大厂,保证你的基本都是在割你,现在这个行情什么样,不用我说大家都知道,我们尽力的帮助到大家进阶提升,通过我们的面试标准,直到拿到offer为止!
### 学习周期
- 这个每个人都不一样,这边最快的同学一周就可以拿到offer了,但是实话实说案例不具有代表性,因为我们每个人目前的技术水平不同,所以我们有摸底的一个流程,摸底之后,知道你目前的水平,然后结合我们的经验,大概的能够给出你需要多久
- 中位数,全职准备的周期大概是一个月左右,准备进大厂的时间在3个月+;
- 最终目的:我们的要求是通过我们的综合面试
## **服务多久**
加入前端训练营后,我们服务分为两个阶段,不同阶段的服务强度会有所区分:
**密集训练阶段**:校招拿到offer为止,社招以找到新offer为止(社招最长限制2年,校招最长限制到毕业)。密集指导涵盖**一对一摸底定制化学习路线**、专项前端训练指导、一对一综合模拟面试、面试复盘、项目指导、每周督学等等。
**养老阶段**:是指已经通过我们的培训拿到offer的同学,我们后续新沉淀的知识库都是一直对学员开放的,并且需要帮忙的时候,我们还是会给你提供人脉和方向性建议。但为了规避法律风险,本阶段我们声明不再承担任何责任,并有权利终止任何服务。
### **怎么收费?**
我们是多位导师强服务的模式,目前定价 **5000** **元**
比起其他培训机构动辄一两万的收费标准,这个价格说是白菜价格也不太过分吧。
随着报名的人越来越多,训练营沉淀的内容越来越多,我们付出的精力更多的时候,后面肯定会涨价的,而且涨价的幅度不是几十块的涨,而是几百块,甚至上千块的涨,所以**早加入训练营,是有价格优势** 的。
## 怎么报名?
如果想报名、或者还有什么想要咨询的。
请直接 **扫码添加鱼皮** 的微信,记得要加备注【**前端训练营**】,发送您的个人情况,我们会帮你进行评估,看看是否适合加入~
> 添加好友后,免费送整理好的面试题资料哦!
![](https://pic.yupi.icu/5563/202312151402515.png)
@@ -0,0 +1,318 @@
# 后端突击 - 狂飙后端训练营
> 本文作者:[程序员鱼皮](https://yuyuanweb.feishu.cn/wiki/Abldw5WkjidySxkKxU2cQdAtnah)
>
> 本站地址:[https://codefather.cn](https://codefather.cn)
这是由鱼皮和几位腾讯高级工程师朋友们合伙打造的编程训练营,主打 **后端求职面试突击** ,帮助学员 **用最短的时间** 从 0 到 1 拿到满意的后端开发 offer!
下面依次介绍下我们训练营已经积累的优势、提供的服务等。
> ⭐️ [文末有报名方式](https://yuyuanweb.feishu.cn/docx/ZvoZdFiUUoRNAdxGlSUcnbslnnb#EvBGdMn7eonLQpxXSXJcD4ednLc)
## 训练营优势
### **1、成果太好看!**
短短几个月,狂飙训练营的很多学员得到了飞速成长,接近 **60 位** 同学拿到了 **中大厂 offer**
如下图,覆盖了字节、阿里、美团、腾讯、百度、京东、快手、滴滴、华为、网易、微博、搜狐、拼多多、七牛云、B站、华为、小米、米哈游、理想、58 同城、携程、猿辅导、OPPO 等各大互联网公司。
![](https://pic.yupi.icu/5563/asynccode)
这个成绩,放到任何一家培训机构来看,都是无敌的存在。
![](https://pic.yupi.icu/5563/asynccode)
![](https://pic.yupi.icu/5563/asynccode)
### **2、导师团队太强大!**
狂飙训练营的导师团队不仅有多名 BAT 国内大厂的后端高级工程师,还有爆款编程图解书籍的作者 - 小林 coding,知名技术 Redis 的核心贡献者等等。
![](https://pic.yupi.icu/5563/asynccode)
狂飙训练营的导师团队中,有 6 名以上都是 **全职** 来做训练营的!他们很多人放弃了自己的大厂工作,全身心投入到辅导学员这件事,也难怪出了这么多成果。
### **3、沉淀太丰富!**
大家都知道,现在网上的学习资料非常多,找到资源并不难,难的是找到 **体系化的、高质量的** 学习资源,能够一条高速路学到底。
虽然我自己运营付费编程学习社群有一定年头了,也持续原创和整理了自己的编程学习体系资料。但是看到狂飙训练营的内容,还是深感佩服。
比如下面这张图,是最外层的知识体系,各个板块的建设都很全面:
![](https://pic.yupi.icu/5563/asynccode)
最关键的是,狂飙训练营的很多资料都是 **多名导师共同原创** 的,汇集了多名大厂面试官的知识和经验,这不是任何一位个人 UP 主、或者网上那些资料能够比拟的。
比如下图的专项面试题库:
![](https://pic.yupi.icu/5563/asynccode)
### **4、方法太专业!**
只凭好的导师和丰富的资料,也是很难带这么多学员拿到 offer 的,更关键的是狂飙训练营独特的 **教学方法**
大部分刚加入同学都是学习很迷茫的同学,但通过给他们 **私人定制** 学习路线,很多同学就坚持跟着学了,大部分校招生由于时间比较充裕,能保持每日高强度的学习,再加上训练营 **多对 1** 的答疑指导服务,基本 3 个月就卷出了可以去实习面试的水平。
有一个学员是很典型的案例,刚进来时候,很多技术栈都是不清楚不了解的状态,卷了几个月后,达到可面试的水平,不过刚去找实习的时候,也是屡屡碰壁,周报的内容也充斥很多 emo 信息,还好顶住了情绪和压力,持续 1 个多月面试,最终还是拿下了美团offer。
![](https://pic.yupi.icu/5563/asynccode)
也有黑马级别的同学,进来才 2 个星期,他们给辅导了项目,就拿到了美团实习 offer,甚至还自愿帮忙打广告。
![](https://pic.yupi.icu/5563/asynccode)
下面是我拉到狂飙训练营中参与学习的小伙伴的真实反馈:
![](https://pic.yupi.icu/5563/asynccode)
导师们强强联合,共同做好一件事,给学员带来更大的价值。
一句话,做好后端训练营这件事,我们是认真的!
接下来,详细说说我们的 狂飙训练营,能为大家提供什么?怎么带大家 **求职突击**
## **我们能帮你什么?**
### **1、1 对 1 定制学习计划**
网上有很多大而全的学习路线,如果你的时间足够,跟着学倒也没什么问题。但是如果你想要 **弯道超车** ,就必须在有限的时间,学到最重要的知识,才能把我们的时间价值放大化。
训练营导师里有多名资深的大厂面试官,所以 **我们会根据大厂后端面试重点,1 对 1 定制化你的学习计划**,让你所学知识在大厂面试中都能 **命中** ,而不会让你无厘头的乱学、低效努力。
我们首先会根据你目前的情况,判断处于哪一个阶段,为你量身定做一份学习计划。你要做的很简单,只要坚持学就行,学习上的问题我们都会帮你解决。
每个学员都自己的专属学员空间,你的学习计划、专项学习笔记、综合模拟面试的记录都会记录在这里,便于复盘。
![](https://pic.yupi.icu/5563/asynccode)
### **2、保姆级专项训练**
我们把后端必学的知识,划分成一个一个 **专项训练** ,比如 **Java 语言专项训练、Go 语言专项训练、****MySQL** **专项训练、Redis 专项训练、项目专项训练、网络专项训练、操作系统专项训练、系统设计专项** 等等。
每一个专项训练,我们都会提供严格甄选的资料,让你快速进入专项学习,根据你当前的技术情况,告诉你看什么资料,哪些知识点重要,带着什么问题去看。
![](https://pic.yupi.icu/5563/asynccode)
每个专项周期通常是 2-3 周,具体根据你当前的基础、以及能投入的时间决定,导师们在中间会关注你的进度,并解答问题。
比如,下面是 MySQL 专项训练的指引,每一个知识都给出需不需要重点掌握,以及要学到什么程度,**带着什么问题学**。
![](https://pic.yupi.icu/5563/asynccode)
除了之外,我们还会对每一个专项训练,**原创「学习与面试」的资料**,是完全体系化的学习资料,我们相比传统的理论书籍,会更注重面试方面的问答。
![](https://pic.yupi.icu/5563/asynccode)
![](https://pic.yupi.icu/5563/asynccode)
专项学习过程中,遇到任何不会的问题,都可以在专项群进行提问。
![](https://pic.yupi.icu/5563/asynccode)
每个专项群的氛围还是很不错的,有问题在专项群提问,同学之间共同讨论,各个导师也会负责解答。
![](https://pic.yupi.icu/5563/asynccode)
![](https://pic.yupi.icu/5563/asynccode)
而且好的问题,我们会统一收录起来,会定期分享一些好的问题给大家一起学习。
![](https://pic.yupi.icu/5563/asynccode)
只要学习专项过程中遇到问题,把问题抛给我们就行,我们会讲解到你明白为止。
我们不希望同学们浪费了大量时间去搜寻答案,还没有结果的话,就糟糕了,这样学习积极性就会有所下滑。
### **3、专项练习题**
很多同学其实学习能力没问题,看过很多书,也能理解知识,但是面试的时候,总是答不到重点,不知道面试官想要的回答是什么,这是很吃亏的。
甚至有的同学,在面试的时候,背题的痕迹太过于明显,这样很容易被面试官感觉你是背的,没有自己理解,也是有可能被挂掉的。
![](https://pic.yupi.icu/5563/asynccode)
这里贴几个学员在大厂面试中,由于背的太好,被面试官提一嘴。
![](https://pic.yupi.icu/5563/asynccode)
![](https://pic.yupi.icu/5563/asynccode)
所以,为了培养学员回答面试问题的能力。当学员学完某一个专项知识后,我们会要求你 **用自己语言在专项题库答题** ,题库都是 **高频的面试题** ,回答完题库后,**发给导师点评,导师会给予补充和提意见**。
通过这种专项练习题库,学员可以了解知识掌握情况,找出自己的问题查漏补缺,同时也更能理解面试官到底在问什么,增强学员的面试能力。
当然,**我们导师团队自己也写了专项练习题库的答案**,会从「分析->回答->推荐资料」三个环节,帮助大家掌握这道面试题的知识,同时会说怎么样的回答才是重点。贴几个给大家看看。
mysql题库-导师版:
![](https://pic.yupi.icu/5563/asynccode)
redis题库-导师版:
![](https://pic.yupi.icu/5563/asynccode)
golang题库-导师版:
![](https://pic.yupi.icu/5563/asynccode)
等学员完成了全部专项训练后,我们最后会进行 **模拟面试** ,面试流程都会让学员经历一遍,我们所问的问题,都是 **对标大厂面试标准** 的,所以相当于你可以获得很多次的大厂面试机会。
![](https://pic.yupi.icu/5563/asynccode)
下面是某位学员模拟面试后的感受:
![](https://pic.yupi.icu/5563/asynccode)
这样可以让学员适应面试节奏,根治学员面试的紧张感。更重要的是梳理面试回答的层次和逻辑,清楚知道面试官想要的答案,等到真实自己去面试的时候,就能从容应对面试了。
### **4、对标大厂的项目**
最让校招的同学头疼的事情就是项目了,很多同学的项目都是网上烂大街的,比如 webserver、动态线程池、XX 外卖、各类电商项目,面试官一看,就知道是玩具项目来的,很难让面试官眼前一亮。
面试官对你的项目不感兴趣的话,项目问题就不会怎么问了,但是这样整个面试都会深挖你八股文,面试难度就会上来了。
我们训练营的项目是 **大厂的真实项目** ,是某位大厂程序员晋升答辩用的项目,我们经过改造后,作为训练营的项目,所以项目的立意是站的住的,**拿晋升的项目,给大家用来面试,妥妥地****降维****打击**。
![](https://pic.yupi.icu/5563/asynccode)
我们会从方案设计、方案评审、代码开发一一给大家讲解,这样的项目有数据支撑并经过生产验证,知道哪里有问题,哪里可优化,在面试时也会比较有优势。同时 **针对项目的简历描述和面试问题**,我们都帮你整理好的了。
![](https://pic.yupi.icu/5563/asynccode)
根据学员的反馈,训练营的项目是能让面试官感兴趣的。**一个能引起面试官感兴趣的项目,在面试是很加分的。**你想想,面试的时长一般都是固定的**,如果有 60-70% 时间都在问项目,那么是不是八股文就问的少了?**这样面试的难度相比全程都在挖八股文就降低了很多。
我们项目的问题也都帮大家准备好了,完全不用担心面试时不知道怎么回答项目相关的问题!
![](https://pic.yupi.icu/5563/asynccode)
怎么样?够保姆级吧,我们导师把最脏活累的事情都给干了,学员们坐享其成就好。当然项目肯定是要学员自己去实现的哦。
除了大厂项目外,我们也提供了很多 **适合练手学习、提升项目经验** 的原创项目。
鱼皮本人的原创项目,也会对训练营的同学们提供:
![](https://pic.yupi.icu/5563/asynccode)
如果你又有对标大厂的深度项目、又有足够的做项目能力,那么无论是简历还是面试,通过率都会大大增加!
### **5、简历指导 & 项目挖掘**
在学员准备找工作前,我们还会对学员的简历进行优化。
比如这位同学,之前自己写的简历,投了很多岗位,都没有面试机会,被我们修改之后,获得了很多机会,并且还进了大厂。
![](https://pic.yupi.icu/5563/asynccode)
![](https://pic.yupi.icu/5563/asynccode)
对于社招同学来说,**项目挖掘** 这一块是收益最大的,提前挖掘你的项目面试的重难点,然后针对性的复习和巩固,到真实面试的时候,就能从容应对的了,项目挖掘会议平均持续 1 小时。
![](https://pic.yupi.icu/5563/asynccode)
### **6、面试复盘**
模拟面试后,我们都会给学员复盘,给学员反馈哪些知识学员还需要加强学习的、哪些知识是没有回答到重点的,然后要求学员将模拟面试的会议总结成文档。
然后导师们会针对面试总结的内容进行评论,学员再进行回复,通过这种方式,**可以将一次面试的知识,吃干抹净**。经过这样的 **专项题库练习 + 综合模拟面试 + 面试复盘** ,学员的成长是很快的,多次查漏补缺,快速达到求职的面试标准。
另外,我们也会**对学员真实的面试记录进行复盘**,目前训练营沉淀了很多同学新鲜出炉的大厂面经。
![](https://pic.yupi.icu/5563/asynccode)
这里的每一份面经都是可以学习的资料,因为每一份面经,导师们都针对同学面试回答做了评论和解析,会补充怎样答会更好,又或者需要去看哪些资料进一步学习。
![](https://pic.yupi.icu/5563/asynccode)
根据学员的反馈,这样他们边面试、导师边点评面经的效果还是不错,能够快速发现他们哪些知识点是缺失的,然后提供解答,快速补齐上来,下次在遇到相同的题目,就能回答更好。
### **7、每周分享会**
每周六晚上,我们都会组织全员的分享会(平均每次 1 小时),主题涉猎技术讨论、技术开阔、求职心得、学习方法等等。
这些是我们历史沉淀的视频分享会,每周都会有新的视频分享会,一周周的积累,以后这里也是一个庞大的学习资料。
![](https://pic.yupi.icu/5563/asynccode)
### **8、周报监督学员**
来了训练营的学员,就 **不准躺平** !每周我们会要求学员写周报,把自己这一周所学的知识记录下来。
同学们在学习上(或者生活上)有困难,都可以在周报提出,我们会针对你的困难做出答复,除了技术问题解答之外,情绪上开始焦虑、emo 了、工作上被 pua 了,都可以找我们沟通,我们也会做给你做 **心理按摩** 哈哈。
![](https://pic.yupi.icu/5563/asynccode)
针对不活跃的同学,我们导师也会私下去沟通学员,看看是不是遇到什么困难,或者也可能是出现了迷茫,其实这些情况有很多办法可以调整、解决,但是当事人往往会陷入巨大的内耗,此时就需要沟通来找到问题所在、走出困境。
OK,我们的服务就介绍到这里,在你下决心报名前,请先再耐心阅读下面的内容哦!**文末有报名方式。**
## **其他问题**
### **适合什么群体?**
- 校招冲刺:玩了几年,时间紧迫,想在短时间内提升最多战力的;基础还可以,想冲刺中大厂后端 Offer 的;
- 在校生:计算机萌新,感到迷茫,不知道怎么学习的;想好好规划四年又无从下手的;想拼搏几年,找个好出路的;非科班专业想转行后端程序员的;
- 社招:想转行后端开发;需要体系化指导或者挖掘项目问题的;
还是多啰嗦一句,我们是**后端训练营**,如果你是想从事嵌入式、机器学习、前端开发、大数据开发等等,就不符合我们训练营的方向了。
### **导师团队什么配置?**
目前我们导师团队:
- **小林哥**,小林coding 公众号作者, 图解网站站长,全网粉丝超 40W+,著有《图解网络》、《图解系统》、《图解MySQL》、《图解 Redis》开源书籍,Gihutb 开源不到 1 年,斩获 6k+ star,文章阅读量累计超上千万,帮助数万程序员击破八股文的恐惧。
- **牛哥**:大厂资深面试官,腾讯 T10 工程师。末流二本,校招逆袭进腾讯,多年来混迹各个大厂:腾讯->外企->字节->腾讯,融多家所长于一身,深谙面试方法论,极具答辩和指导才能。
- **鱼皮**:前腾讯全栈工程师,现科技公司创始人,全网 150 万+ 粉丝编程博主。爱做项目爱分享,GitHub 中国区前 20,有 30+ 独立项目经验,善于把 Java 后端项目讲得通俗易懂。
- **川哥**:阿里高级工程师。面试经验丰富,实习腾讯,校招字节,社招阿里。有过C++,Go语言开发经历,资深Java工程师,有多年大厂核心项目经验。
- **鹏哥**:腾讯高级工程师,职场经历丰富,从华为到外企、从外企到腾讯,有过 Java,C++ 语言的开发经历,资深 Gopher ,有多年后台微服务架构经验和实操经验,对后台知识的学习颇有心得。
- **涛哥**:某赛道国内头部公司,资深Java工程师、同时还具备Go 多年项目研发经验,有丰富的项目管理经验。
- **七哥**:某一线大厂高级工程师,曾就职字节中台部门,有 Java、Go 大型项目工作经验,擅长微服务和分布式领域,熟悉面试官心理和把控面试节奏。
- **飞哥**:百度高级工程师,熟悉Java,做过多个Java大型项目,同时也是资深Golang玩家,有多年相关实操经验。
- **彬彬**:开源爱好者,Redis 7.0 和 7.2 活跃贡献者,Redis 社区 Member,积极参与社区贡献,200+ 的 PR 和 commit数,目前社区 commit 数量是排第四,专业解答 Redis 各种问题。
### **支持什么语言?**
我们目前训练营主要是 Java 后端 和 Go 后端。
### **会亲自录制视频授课吗?**
**我们卖的是服务,卖的不是课**,所以我们训练营的主线是服务,而不是传统培训的上课模式。
简单的知识,可以通过一份资料快速Get,这些资料互联网都很多,我们可以给你选择效率最高、坑最少的。
复杂的内容,通常需要很多操作才能理解,比如,先看B站初步认识,然后看几篇资料加深理解,然后可能是看某本经典的丛书,甚至可能是看源码去理解,有些东西,他一定不是一个课程就能讲清楚的。
### **一定能进大厂吗?**
说保证进大厂的训练营,大概率是想割你的,我们不承诺这件事情。
我们能保证的是什么?只要你按我们的安排走,你一定可以通过专项训练得到巨大的提升,至于提升多少,其实是边际递减的。
你离大厂越远,提升得就越多,假设现在你只有 10 分,那在我们的科学指导下,提升到 70 分,那进度肯定是突飞猛进;而你本身就离大厂很近,已经 80 分了,我们有信心给你提升到 90 分,但也就增加了 10分,当然**这 10 分的含金量非常的大**,也许你差大厂就一步之遥,这一步,我们来给你补上。
### **怎么收费?**
我们是多位导师强服务的模式,目前定价 **5000 元**(校招可分期)。
比起其他培训机构动辄一两万的收费标准,这个价格说是白菜价格也不太过分吧。
随着报名的人越来越多,训练营沉淀的内容越来越多,我们付出的精力更多的时候,后面肯定会涨价的,而且涨价的幅度不是几十块的涨,而是几百块,甚至上千块的涨,所以**早加入训练营,是有价格优势** 的。
### **服务多久?**
加入后端训练营后,我们服务分为两个阶段,不同阶段的服务强度会有所区分:
- **密集指导阶段**:校招拿到offer为止,社招以找到新offer为止(社招最长限制2年,校招最长限制到毕业)。密集指导涵盖定制化学习路线、专项训练指导、模拟面试、面试复盘、项目指导、监督周报等等。
- **社群会员阶段**:在密集指导阶段结束之后,你就成为了我们的长期会员,我们后续新沉淀的知识库都是一直对学员开放的,并且需要帮忙的时候,我们还是会给你提供人脉和方向性建议。但为了规避法律风险,本阶段我们声明不再承担任何责任,并有权利终止任何服务。
## **怎么报名?**
如果想报名、或者还有什么想要咨询的。
请直接 **扫码添加鱼皮** 的微信,记得要加备注【**后端训练营**】,发送您的个人情况,我们会帮你进行评估,看看是否适合加入~
> 添加好友后,免费送整理好的面试题资料哦!
![](https://pic.yupi.icu/5563/202312151402515.png)
@@ -0,0 +1,148 @@
# 嵌入式 - 零基础到就业课程
大家好,我是鱼皮,给大家分享一套目前国内质量最高、口碑最好的《嵌入式 0 基础到就业》课程,周期为 4 个月的精英教学。
下面分别介绍:
- [课程优势](#课程优势)
- [我们能帮到你什么?](#我们能帮到你什么)
- [其他问题](#其他问题)
- [免费咨询](#免费报名咨询)
## **课程优势**
### **1、 亮眼的成果**
3 年期间,我们已培养超过 1000 名 VIP 学员顺利拿到 offer ,几乎以每天都有成功就业案例,实现了自己的高薪梦想!
学员入职的企业包括了:小米、美团、比亚迪、理想、长安汽车、五菱、吉利、华为、中兴、海康威视、大疆、汇川、大华、OPPO、VIVO、荣耀、经纬恒润、星网锐捷、公牛、TP-Link、瑞芯微、海思、英伟达、美的、CVTE、兆易创新、龙芯、腾达等大厂。
![](https://pic.yupi.icu/5563/202311111938252.png)
当然,你可能觉得进大厂对你很难,但只要按照我们的课程体系进行学习,拿一份远超身边人薪资的 offer 基本不成问题!
如果你运气更好,本科学历也可以拿到年薪 30W,延毕也能拿到年薪 38W 。当然,这是个例,是能力加运气的结果。
![](https://pic.yupi.icu/5563/202311111938459.jpeg)
### **2、强大的师资力量**
我们的导师团队基本出自大厂,具有多年嵌入式开发经验,并且具有丰富的一线教学经验:
- 老陈:多年嵌入式培训经验,培养多人成功进入大厂,《名师计划》高级讲师;
- 鱼皮:前腾讯全栈开发,全网百万粉编程知识博主,擅长项目讲解、学习和求职规划、简历辅导等;
- 良许:211硕士,世界500强外企高级嵌入式工程师,《速学Linux》作者;
- 四哥:12年嵌入式经验,原大厂嵌入式高级工程师,指导千人获得高薪 offer。
![](https://pic.yupi.icu/5563/202311111938338.png)
![](https://pic.yupi.icu/5563/202311111938436.png)
![](https://pic.yupi.icu/5563/202311111938584.png)
![](https://pic.yupi.icu/5563/202311111938419.png)
### **3、完善的课程体系**
你是否也是,想学嵌入式但不知道怎么学,网络上太多资料不知道学哪些,遇到问题没人指导学习太痛苦?
没关系,这些都不用担心,你需要一份**体系化、高质量**课程体系!
我们的课程经过 3 年打磨,体系非常完善,包含 9 大版块,从 C 语言开始,到单片机(51、STM32),再到 Linux (基础、应用编程、底层开发),以及 UI 界面开发,再到大厂高级工程师为你量身定制的就业指导,总共包含 700+ 集视频,包括智能小车、语音小夜灯、温度采集箱、WiFi 垃圾桶等 **20 多个项目**,帮助你快速从零基础跨入嵌入式大门!
3 年来,我们培养的学生正是按照本套课程体系学习,效果相当显著!体系覆盖了嵌入式入行所需要掌握的所有知识,非常系统、全面,学习起来更加高效!
![](https://pic.yupi.icu/5563/202311111938181.jpeg)
我们的优势:
- 科学的课程安排,帮助大家快速、高效入行。
- 新颖的教学方式,让学习不再枯燥,快乐学习。
- 不限编程语言,每天只要4个小时,学习4个月左右。
- 个性化学习,课程不止一套,选择最适合你的学习路线。
- 就业有保障,专业的简历指导、模拟面试,行业内信息共享,了解时事资讯。
### **4、高效的学习方式**
相较于一个老师对一个班学生吃大锅饭这种落后的教学形式,我们创新提出了一个学生一个进度的教学模式,采用「录播+答疑」的教学方式,学习效率大幅提升!
课程教学轻松好玩,绝不是如大学讲师一板一眼。搭配全套课程硬件,以项目的方式驱动学习,让学员们边学边做,学成后既掌握了知识点,又完成了项目,成就感倍增。
录播的形式,学员们可以自由安排学习时间,听不懂的部分可暂停、重复观看学习,已掌握的知识可以快进、倍速,而直播和线下都如果有几节课没跟上,则容易放弃学习。
我们目前已经有 20 个 VIP 答疑群,8 个助教 + 1 个班主任。答疑群里学习氛围浓厚,学员们互帮互助,更有小伙伴卷到凌晨一两点!
![](https://pic.yupi.icu/5563/202311111938661.jpeg)
![](https://pic.yupi.icu/5563/202311111938017.jpeg)
学习的过程中遇到任何问题,我们的答疑老师都会及时解决,如有特殊情况,可以提供远程指导服务,就怕你学不会!
![](https://pic.yupi.icu/5563/202311111938669.jpeg)
## **我们能帮到你什么?**
### **1、一对一制定学习计划**
课程课时这么多,该如何规划学习进度?一天 4 小时,学习 4 个月,即可学完本套课程。
具体每天如何学习,可结合自身情况,根据我们制定的**学习规划表**,高效学习!
切记每天学习要规律,脚踏实地,学好每个阶段的课程,打下坚实的基础。
![](https://pic.yupi.icu/5563/202311111938743.jpeg)
### **2、专人追踪学习进度**
人不是机器,学习过程中难免会有所松懈,或者拖延症、自制力不够等情况,影响学习进度及效果。这都是人性使然,因此我们采取了一系列措施来帮助学员克服这些困难。
我们会有专人不定时追踪学员的课程学习进展,了解学员的学习活动和完成情况,及时发现潜在的拖延问题,并与学员进行沟通。通过电话、短信或在线聊天等方式进行沟通,鼓励学员保持学习动力和积极性。
![](https://pic.yupi.icu/5563/202311111938783.jpeg)
### **3、课程配套硬件**
学习嵌入式,肯定离不开硬件,而硬件的投入也是一笔不小的支出。为了让学员们能顺利进行课程学习,我们赠送了 **全套课程配套硬件** ,无需学员再额外有成本支出。
通过课程配套硬件和项目驱动教学的组合,学员的学习不再枯燥,边学边练,从而更快地理解和掌握技术栈。这种实践性的学习方法能够激发学员的兴趣,并且使学习过程更加生动有趣,锻炼解决问题的能力,培养自信心和成就感。
![](https://pic.yupi.icu/5563/202311111938115.png)
![](https://pic.yupi.icu/5563/202311111938060.jpeg)
### **4、贴心就业服务**
课程学完之后,学员将进入专属就业交流群,共享行业资讯及就业机会,交流就业经验。
我们的就业服务团队针对每位学员的个人情况和求职目标,提供个性化的就业指导,包括简历撰写、面试技巧、职业规划等方面的建议。通过模拟面试,学员可以在真实场景中练习面试技巧,提高应对面试的自信心和准备度。
![](https://pic.yupi.icu/5563/202311111938147.jpeg)
![](https://pic.yupi.icu/5563/202311111938260.png)
## **其他问题**
### **1、什么人适合学**
我们的课程适合大专以上,最好本科(包括专升本)的朋友来学。
- 0基础:计算机小白,想要找个好工作但又迷茫,不知道从哪开始的;
- 理工科大学生:大学玩太嗨没学到东西,想在短时间内提升竞争力的;有基础,想冲刺中大厂 offer 的;
- 已入行人员:工作 1 - 5 年想提升自己技术,想要涨薪、跳槽的;
- 非理工科大学生、行外人员:非科班出身;对自己现状不满意,想转行嵌入式的;
- 对嵌入式有兴趣人员:不以就业为目的,提升职场竞争力的人员。
### **2、什么人不适合学**
- 32 岁以上的朋友我们就不建议学了,转行成功率相对较低;
- 专科以下的朋友也不建议学习,基本没就业机会。
## **免费报名咨询**
种一棵树最好的时间是十年前,其次是现在。
🧧 双十一期间更有限时优惠,欢迎大家扫码咨询!可免费领取一份编程学习大礼包~
<img src ="https://pic.yupi.icu/5563/202311111938364.gif" style="height:300px;width: 300px">
@@ -0,0 +1,129 @@
# 求职 - 帮你写好简历的神器
> 本文作者:[程序员鱼皮](https://yuyuanweb.feishu.cn/wiki/Abldw5WkjidySxkKxU2cQdAtnah)
>
> 本站地址:[https://codefather.cn](https://codefather.cn)
鱼皮团队研发的《老鱼简历》网站:https://www.laoyujianli.com/ 1 分钟帮你生成精美的个人简历)
鱼皮的大学简历在线版:https://laoyujianli.com/share/yupi ,欢迎体验~
![](https://pic.yupi.icu/5563/asynccode)
## 优势
- 多种简洁专业的简历模板
- 支持 AI 快速生成简历
- 支持多种格式的简历导入
- 简历实时编辑浏览
- 简历内容智能纠错
- 智能一页美化简历
- 现成的简历例句和建议参考
- AI 优化简历内容
- 自定义简历模块和内容
- 支持导出简历为 PDF 和图片
- 在线分享简历链接
- 简历一键脱敏分享
- 求职经验分享百科
## 功能介绍
### 多种简洁专业的简历模板
![](https://pic.yupi.icu/5563/asynccode)
### 支持 AI 快速生成简历
只需填写个人简介,即可快速生成一份求职简历
![](https://pic.yupi.icu/5563/asynccode)
### 支持多种格式的简历导入
支持快速导入 Word、PDF、JPG、PNG、Markdown、Doc、Html 等多种格式的简历文件
![](https://pic.yupi.icu/5563/asynccode)
### 简历实时编辑浏览
简单易用的简历编辑器,左侧编辑,右侧实时浏览。还支持自由调整样式、一键切换主题、自由添加模块、自由调整内容,帮你快速制作精美简历!
![](https://pic.yupi.icu/5563/asynccode)
### 自定义简历模块和内容
支持自由添加模块、自由调整内容和格式
![](https://pic.yupi.icu/5563/asynccode)
### 简历内容智能纠错
不仅能够帮你快速修正错别字,还能优化专业名词、大小写、语句的连贯性等
![](https://pic.yupi.icu/5563/asynccode)
### 智能一页美化简历
一键调整简历排版,自动优化到一页纸
![](https://pic.yupi.icu/5563/asynccode)
### 现成的简历例句和建议参考
提供了丰富的、各职位、各模块的简历例句和简历建议,帮助你快速写好简历!
![](https://pic.yupi.icu/5563/asynccode)
![](https://pic.yupi.icu/5563/asynccode)
### AI 优化简历内容
只需一键,AI 帮你优化简历的内容,修复错别字、内容更连贯、表达更专业!
![](https://pic.yupi.icu/5563/asynccode)
效果如下:
![](https://pic.yupi.icu/5563/asynccode)
### 支持导出简历为 PDF 和图片
示例导出效果如下图:
![](https://pic.yupi.icu/5563/asynccode)
### 在线分享简历链接
支持分享极简、干净的在线简历链接,以及自定义链接地址。
比如鱼皮的简历:https://laoyujianli.com/share/yupi
![](https://pic.yupi.icu/5563/asynccode)
### 简历一键脱敏分享
简历支持一键隐藏个人敏感信息:
![](https://pic.yupi.icu/5563/asynccode)
效果如下:
![](https://pic.yupi.icu/5563/asynccode)
### 求职经验分享百科
精选大厂同学的求职经验分享文章,帮助你提高求职竞争力!
![](https://pic.yupi.icu/5563/asynccode)
## 欢迎免费使用
老鱼简历网站:[https://www.laoyujianli.com/](https://www.laoyujianli.com/) (1 分钟帮你生成精美的个人简历)
会员可以在个人主页加入专属群聊哦:
![](https://pic.yupi.icu/5563/asynccode)
## 老鱼简历团队招人啦!
[🔥 招聘中 - 产品运营岗位(实习)](https://yuyuanweb.feishu.cn/wiki/EpYUwByuHi3GSWkTNcpcULX6nPd)
@@ -0,0 +1,126 @@
# 我们出成果了!
> 本文作者:[程序员鱼皮](https://yuyuanweb.feishu.cn/wiki/Abldw5WkjidySxkKxU2cQdAtnah)
>
> 本站地址:[https://codefather.cn](https://codefather.cn)
大家好,我是程序员鱼皮。一转眼,我跟知名编程博主 小林 coding 合伙后端训练营已经快一年了,这是一个帮助后端同学 **求职突击** 的训练营,给大家分享下我们最近的成果。
先给结论,24 届秋招已经完美结束,共有 400 多位学员参加 24 届秋招,统计主动跟我们报喜的同学,总共有 **150 个** 拿到中大厂 offer!还有很多同学拿到 Offer 后,还未主动和我们报喜,这个比率对于这几年的秋招环境来说,已经是非常好的成绩了。
![](https://pic.yupi.icu/1/1710148860720-0497b0a3-a0ce-42ff-a23d-9d7e9dd5d1ef.png)
基本上每天都有学员主动跟我们报喜,这都是我们继续做好服务的动力~
![](https://pic.yupi.icu/1/1710148916944-d824a0aa-10c9-449e-a5e7-0a2ae70d01e9.png)
还在训练营里遇到和自己拿到同部门 Offer 的同学,以后就是同事了~
![](https://pic.yupi.icu/1/1710148891239-f4327b4c-7784-4999-a03e-2d9d612393d4.png)
好了,成果展示完毕,那为什么我们的后端训练营能产出这么多成果呢?
给大家介绍一下训练营提供的服务吧~
### 1、求职服务一条龙
大家可以先思考下自己找工作遇到的最大困难是什么?
比如:
- 没有系统的计划和复习路线,效率很低
- 感觉学知识很难,坚持不下去,时常感到焦虑
- 缺少专业的知识讲解,很多技术只是一知半解,八股背了就忘
- 缺少有竞争力的项目
- 没有面试机会,也不知道自己水平如何
我们也是针对这些大家最常遇到的困难,设定了一条龙的求职服务。
![](https://pic.yupi.icu/1/1710148860753-f21843e7-3042-4c79-92bf-c05a0f69d0d8.png)
如果你感觉学习效率低,入营后我们就给你 1 V 1 定制学习计划,我们有原创的技术学习和面试题库,按照顺序学就行了~
如果你感觉学不下去,我们会拉 1 对 1 学习群,一堆导师监督你一个!再加上周报、技术讨论会等指导,会大大增加你的学习动力。
如果你无法检验自己的水平,我们有 1 对 1 的简历修改和 1 对 1 的模拟面试,快速发现你的问题,提高求职能力的同时也会对未来的规划更清晰。
![](https://pic.yupi.icu/1/1710235753531-a4077f63-53aa-4236-b411-a3c714b581b5.jpeg)
![](https://pic.yupi.icu/1/1710148860792-dac78b84-ef1f-47f5-bb72-8033ff58e05d.jpeg)
### 2、有竞争力的大厂项目
鱼皮主打的项目教程是实践能力的提升、帮大家真正掌握做项目的能力,而训练营的项目更侧重于 **短期内帮你快速提高求职竞争力**
如下图,不同于传统的增删改查,是某大厂朋友晋升答辩时用的 **技术类** 项目,改造成了适合大家学习的版本给大家求职用。
项目已有 Java / Go 双语言版本,技术栈以 MySQL + Redis 为主,聚焦于后端核心技术。
只要跟着我们的资料理解了项目的架构设计、难点、优化点、简历描述和面试问题,就能快速学到很多大厂真实的技术知识、直接写到简历上去面试,拿来校招面试可以说是 “降维打击”。
![](https://pic.yupi.icu/1/1710148860722-7cf629da-4689-473a-98ce-6677cc54f876.png)
除了主打项目外,训练营还有一些实战类项目,比如鱼皮之前的 6 个原创项目教程、抖音微服务项目等等。
![](https://pic.yupi.icu/1/1710148861266-f3ff04dc-0b50-444b-a511-ae40fffb5b43.png)
**以及本次新增 4 个新项目** ,项目用到微服务,并且每个项目都实现了**Java 和 Go 双版本**,适合社招或者基础比较好的校招同学。
目前训练营的原创项目 + 我的项目已经有 **12 个**,并且每个项目都有**专属的交流群** 。
![](https://pic.yupi.icu/1/1710148962159-c381ad70-b2bb-4339-b886-270242d02c3f.png)
### 3、体系化的技术学习资料
训练营的学习资料大多数都是文档,因为经过我们的调研,发现文档的学习效率才是比较高的,更容易带大家掌握深入的知识。
技术资料主要包括以下内容,也是后端面试的核心技能:
- 语言:Java 或者 Go
- 组件:MySQL、Redis、消息队列
- 项目:2-3 个后端项目
- 基础:网络协议、操作系统、算法
- 场景:海量数据、系统设计
- 面试:简历修改、模拟面试、面经复盘
训练营除了有原创的项目外,还有我们导师原创的后端技术专项学习与面试题库、系统设计专栏等。只要坚持学完并掌握,足够大家修炼到通关中大厂面试水平。
![](https://pic.yupi.icu/1/1710148861362-ecb4c996-74c8-4287-9a2d-68362e3ab206.png)
每块技术知识都有对应的专项讨论群,群里的问题如果你都能理解了,那想必已经成长为大佬了(
![](https://pic.yupi.icu/1/1710148861424-b15be376-ca6e-4071-bf00-a887270b1935.png)
还有每周直播专项会,导师给大家讲解攻克面试难题(往期分享均有回放):
![](https://pic.yupi.icu/1/1710235594753-366a2bc3-0cff-4e91-9c16-ba6aa8140708.png)
### 4、导师阵容
我们有多名全职的大厂导师。不是 1 个人 1 个导师,而是每个人都有 1v1 群,除了你自己,其他都是导师~
每个导师负责的模块不同,有问题都可以在 1v1 群提问交流,会有对应的导师来解决。
就放一张图吧,好像只有我的照片有点出戏 orz。。
![](https://pic.yupi.icu/1/1710148861597-cd4963ba-0966-40aa-b4eb-e9f5c668ff88.png)
### 其他问题
篇幅有限,就仅介绍我们提供的核心价值和服务。由于我们是多名导师强服务的模式,目前训练营的价格是 5000 元,不仅服务到拿到 offer 为止,拿到 offer 后也能一直学习我们持续更新的知识库~
大家如果对训练营感兴趣,想要报名、或者想进一步咨询。请直接 **扫码添加鱼皮(导师版)** 微信,记得要加备注 **【后端训练营】** ,然后发送您的个人情况,我们会帮你进行评估,看看是否适合加入~
添加好友后,免费送整理好的面试题资料哦!
![](https://pic.yupi.icu/1/1710148862046-9b25f02b-3183-4a4a-9be2-faf69d9fd902.png)
@@ -0,0 +1,67 @@
# 我的编程宝典网站上线啦!
> 本文作者:[程序员鱼皮](https://yuyuanweb.feishu.cn/wiki/Abldw5WkjidySxkKxU2cQdAtnah)
>
> 本站地址:[https://codefather.cn](https://codefather.cn)
好消息,好消息,江南皮革。。
![](https://pic.yupi.icu/1/image-20231205154008251.png)
大家好,我是鱼皮,我最新的编程学习小破站终于上线了!
> 本文视频版,更推荐大家观看:https://www.bilibili.com/video/BV1XM411d7xX/
我做编程知识分享已经快满 4 年了,在这期间,我分享过完整的编程学习路线、自学编程的经验和方法、各种技术和项目教程、自己的求职和职场经验、自己开发的完整项目、程序员的生活日常等。
作为个人博主,可以说对朋友们是知无不言、什么都分享一点。
但由于工作繁忙,我写了那么多文章,却一直没有系统地做过总结。
结果就导致很多同学看不到我之前的分享、走了一些弯路,或者不知道应该按照什么顺序阅读我的分享。
为了解决这个问题,我决定,做一个干净的、免费的、开源的编程学习网站,用心整理和沉淀自己的分享,帮助大家高效自学。
所以,《鱼皮的编程宝典》上线了,它汇总了我的 **几百篇** 文章分享、内容多达 **上百万字** ,不仅是贴心的编程学习路线、更是一份全面的编程知识百科。
![](https://pic.yupi.icu/1/image-20231205154342663.png)
网址是 `codefather.cn` ,先别管别的,大家就说好不好记吧?
用这个域名是因为,我希望通过这个网站,能帮大家轻松驾驭代码、快乐编程,而不是被低效、迷茫和 Bug 折磨。
简单介绍下这个网站,基于 VuePress 二次开发实现,非常地精简, **精简到连主页都没有** ,像前面的图片一样,上来就是目录。
对编程初学者来说,我建议先阅读学习路线板块,每个路线都是我用心编写的,有知识、有建议、有资源,能帮大家快速入门。
![](https://pic.yupi.icu/1/image-20231205154532417.png)
然后是我个人的编程自学之路,这个板块涵盖了我从入门编程、再到求职上岸、再到职场工作、再到自媒体创作、离职创业的经历分享,都是真实的,能让大家看到一个程序员的成长历练过程。在学编程的路上,我们都需要找到属于自己的领路人,才不容易迷失方向。
![](https://pic.yupi.icu/1/image-20231205154702785.png)
然后就是各种编程相关的分享了,包括学习经验、开发经验、求职经验、职场经验、各种技术分享和实战教程、编程资源等,大家可以利用好侧边栏,以及网站的 `Ctrl + F` 快捷搜索功能,按需阅读。
![](https://pic.yupi.icu/1/image-20231205154805394.png)
在知识碎片板块,大家可以看到很多简单易学、实用的、重要的、可灵活复用的编程小知识,能帮大家利用碎片化的时间快速学习新技术。知识碎片里的文章,有很多是我写的,也有很多是我们编程导航社区的同学贡献的,真的非常感谢大家。
![](https://pic.yupi.icu/1/image-20231205154901679.png)
此外,大家如果感兴趣的话,也可以在网站中了解到我手把手、从 0 到 1 带大家开发的实战项目教程、我自己的编程导航学习圈、我自己公司的产品服务等。
![](https://pic.yupi.icu/1/image-20231205155245483.png)
最后,这个网站是完全开源的!文档和网站源码都在 GitHub:
> 开源地址:https://github.com/liyupi/codefather
![](https://pic.yupi.icu/1/image-20231205155323816.png)
如果对大家有帮助,欢迎点赞收藏支持,后面我会把网站模板和制作教程分享给大家,让大家都能轻松做出属于自己的、精简的文档网站~
![](https://pic.yupi.icu/1/1625910891281-dianzanaa.png)
@@ -0,0 +1,116 @@
# 考研陪跑 - 编程导航计狗上岸
> 本文作者:[程序员鱼皮](https://yuyuanweb.feishu.cn/wiki/Abldw5WkjidySxkKxU2cQdAtnah)
>
> 本站地址:[https://codefather.cn](https://codefather.cn)
大家好,我是鱼皮。
考研,近几年成为越来越多同学的选择,如果你此时也在备战考研,首先希望你要明白:考研是一个人的长跑
大家从近几年的数据统计也能看出,考研每年一战报名的人数还没有二战三战多,计算机考研作为考研中最激烈的赛道之一,尤其是随着各大高校改考408,竞争强度更加激烈。
近两年,和很多正在备战考研的同学都有过不同形式的接触,发现大家多数有如下两个问题的困惑,越是到考研后期,伴随着焦虑、恐惧的蔓延,越是无法直面回答这两个问题:
- 互联网如此发达的今天,现在大家轻而易举的都能在交流群、网盘拿到各种复习资料,视频课程,择校信息,而且随着统考的规范,信息差也在快速减小。相同条件下,造成考研失败的原因有哪些?
- 基础、强化、冲刺复习阶段,为什么有的人节奏越来越乱,效率越来越低?越是复习到后期,发现会的越少,心态逐渐发生变化,该怎么及时调整节奏和效率?
## 什么是计狗上岸?
### 问题分析
上面的问题,本质还是因为缺乏复习规划和进度把控,这也是大多数考研同学的核心痛点
1. 没有领路人,考研就像自己关着灯洗衣服,你永远不知道衣服有没有洗干净。
2. 进度把控不精准,不知道该怎么分配各阶段的学习时间,不知道自己的目标分数应分配多少的学习时长。
3. 对于无基础跨考考生,408学的比较吃力,找不到重点,白白浪费时间。
4. 缺少学习氛围,容易松懈,难以调整学习状态
5. 自己搜集资料费时费力,机构的网课价格过高,质量堪忧。
6. 录取信息不透明,考了高分却没有学上。
这些核心问题,网上充斥着大量的标题党,导致大家都熟悉这些话题,但是一直无法重视起来,**当在复习中后期因为时间的力量把这些问题从量变引起质变的时候,发现节奏会深受影响,进而加深焦虑进入负循环。**
对于短平快的当下,社交媒体的信息大多是无效的垃圾信息、碎片化信息,但窥其究竟还是无法学以致用。
### 编程导航介绍
为了解决上面这些问题,鱼皮联手多名考研上岸的大佬共同开创了【计狗上岸】编程导航。
用一句话来描述我们做的事情:帮助大家进行计算机考研基础、强化、冲刺全阶段的复习规划,根据时间轴将复习规划拆分到各个阶段,关键位置的卡点监督,辅助大家进行合理进度把控。
以此为核心,扩展的服务参考下面服务详情
### 成员介绍
**1、**星主寅贝勒毕业于 **华中科技大学** 计算机专业,得益于考研的学历提升,毕业后有幸进入国内某头部互联网大厂,从事Go语言后端开发岗位。读研期间一直在帮助考研同学做复习规划、进度把控相关的事情,也**收获了一批上岸同学的感谢以及反馈**,我们非常想把这个模式推广给更多的同学。
- 华中科技大学硕士
- 现字节跳动后端工程师
- 帮助学弟学妹考研规划多年,上岸共计 53 位 985、211 的同学
**2、**个人的力量是有限的,同时还邀请了12位(目前)985、211的高分研0学长学姐们,其中也有之前帮助规划过的,今年一举上岸**北大、浙大、华科**的同学,以及经过多次会议沟通、学习方法突出、进度规划高效的高分学长学姐,来共建我们的计算机考研圈子!
**3、**更加重要的是学习氛围,目前已经有**上百名**同学加入到我们的考研圈子,按照学长学姐的规划投入到紧张有序的复习中。
我们学计算机的同学,真的是累并快乐着,学习累的像狗一样,工作了连狗都不如,所以不要辜负我们的努力,一举上岸,上岸不止眼前的考研更是以后的编程打怪成长之路。
故取名:**计狗上岸**,自嘲的同时,又表达了我们的美好愿景!
![](https://pic.yupi.icu/5563/asynccode)
### 提供的服务
**主要服务方向**
1. 复习规划: 根据每个人的复习情况,采用波浪复习计划,制定真正**适合自己的**复习规划。我们的目标就是“量体裁衣”!
2. 进度把控: 学长学姐对你的专业进度把控。你只需要安心学习,其他的全部交给我们。
3. 监督打卡: 编程导航内发起的打卡挑战,通过打卡把进度展现给我们,我们会起到监督作用,同时根据情况调整学习规划。
4. 资料分享:我们的初衷是让信息公平化。编程导航内包含11408、22408考生需要的全部资料,以及院校信息、扩招/改考信息、近年录取名单等。
5. 心态调整:考研是一场持久战,不仅考验学习能力,还考验心理素质。有一位过来人帮你作心态调整,相信你可以比别人跑得更快、更远!
**具体内容**
- 综合大量985,211学长学姐的上岸经验和学习方法论,总结出全网超高效基础、强化、冲刺三阶段复习规划
- 根据时间轴将复习规划拆分到各个阶段,关键位置的卡点监督,辅助大家进行合理进度把控
- 一对一向985、211的直系学长学姐提问,向有结果的人学习
- 复习氛围浓厚,通过各阶段打卡切身感受到大家的真实进度,破除碎片化自媒体带来的焦虑
- 针对25考研采取波浪复习计划,为不同复习进度的同学提供差异化复习方案
- 原创408每日一题、408带背计划,巧妙帮你解决复习难点问题
- 独家408刷题小程序
- 专业的考研院校分析员,为大家提供“抄底信息”供大家参考
- 一站式获得齐全的复习资料,省时省力备考
- 知识点框架梳理,高密度知识总结
| ![](https://pic.yupi.icu/5563/asynccode) | ![](https://pic.yupi.icu/5563/asynccode) | ![](https://pic.yupi.icu/5563/asynccode) | ![](https://pic.yupi.icu/5563/asynccode) | ![](https://pic.yupi.icu/5563/asynccode) | ![](https://pic.yupi.icu/5563/asynccode) | ![](https://pic.yupi.icu/5563/asynccode) | ![](https://pic.yupi.icu/5563/asynccode) | ![](https://pic.yupi.icu/5563/asynccode) | ![](https://pic.yupi.icu/5563/asynccode) | ![](https://pic.yupi.icu/5563/asynccode) |
| ---------------------------------------- | ---------------------------------------- | ---------------------------------------- | ---------------------------------------- | ---------------------------------------- | ---------------------------------------- | ---------------------------------------- | ---------------------------------------- | ---------------------------------------- | ---------------------------------------- | ---------------------------------------- |
| | | | | | | | | | | |
## 适合同学
24 考研冲刺阶段、25 考研早鸟(其实也不算早了,越早准备越好)
## 真实评价
| ![](https://pic.yupi.icu/5563/asynccode) | ![](https://pic.yupi.icu/5563/asynccode) | ![](https://pic.yupi.icu/5563/asynccode) |
| ---------------------------------------- | ---------------------------------------- | ---------------------------------------- |
| | | |
## 加入方式
用微信扫描下方二维码,可直接领取限时优惠并加入体验,3 天内不满意全额退款!
![](https://pic.yupi.icu/5563/asynccode)
如果你是 [编程导航](https://yuyuanweb.feishu.cn/wiki/VC1qwmX9diCBK3kidyec74vFnde) 的成员,可以再多优惠 10 元,微信扫描下方二维码加入:
![](https://pic.yupi.icu/5563/asynccode)
如果还在犹豫,可以微信搜索《计狗上岸》公众号并关注,领取免费的资料。
## 常见问题
### 我现在是 25 届,现在加入编程导航对我有帮助么?
25 届正常进度来看过完年就要开始基础阶段的复习,在当前的考研竞争环境中,非常建议早开始,早规划,早点清楚自己该做什么,编程导航里的专栏已经有基础阶段的全年规划贴以及25打卡活动,其中也有不少25的同学今年暑假就投入复习。现在加入在费用上也是比之后要便宜,而且可以早些享用服务,快人一步,提前感受一下 24 考研的冲刺氛围。
而且加入编程导航一年后续费是 5 折半价优惠哦~
+145
View File
@@ -0,0 +1,145 @@
# 本站作者 - 程序员鱼皮
## 个人介绍
98 年,前腾讯全栈工程师,担任腾讯云开发高级布道师、新人导师、曾获腾讯内云开发竞赛冠军。
现科技公司 [鱼鸢网络](https://yuyuanweb.feishu.cn/wiki/A9rGw0oLCilbqSk2XMPcTOv2nSs) CEO,全网 150 万+ 粉丝编程知识博主,2 万人付费编程学习社群 [【编程导航】](https://yuyuanweb.feishu.cn/wiki/VC1qwmX9diCBK3kidyec74vFnde) 的创始人,用户 10 万+ 编程学习网站创始人。
热爱分享编程知识,善于把 Java 后端、前端、项目讲得通俗易懂。
爱做项目,编程 7 年间,有 30+ 丰富的网站和独立项目开发经验,GitHub 中国区前 20。
热爱写作,累积创作近千万字,大学曾出版区块链书籍。
会持续分享编程干货和好玩的知识~
## 个人经历
大学期间,我自学了多种编程语言和技术栈,如 Java 后端、前端、小程序开发等,在校作为工作室负责人带队建设了 **几十个** 网站,以 **专业第一** 的成绩拿过国家奖学金、挑战杯学术竞赛 **国奖** & 上海市 **特等奖**、上海市优秀毕业生、大学年度人物。大三曾出版过《区块链智能合约技术与应用》教材,也曾有过金融科技公司、**字节跳动**、**腾讯** 等三家公司的实习经历。
秋招时拿到多家大厂 offer,最终以 **组内第一** 的成绩转正腾讯,斩获 **SSP 最高级别** offer。
在职腾讯近 4 年,独立负责 BI 项目研发、大数据研发等,曾获腾讯内部应用开发竞赛 **冠军**、**5 星优秀员工**,担任过新人导师。
平时绝大多数的时间都花在了工作 + 创作上,知识分享是我的爱好,想给大家留下一些有用的东西。
## 知识分享
### 公众号程序员鱼皮
关注者 40 万+,鱼皮原创博客,编程学习经验、技术干货、项目设计思路、大厂求职面经、个人成长经历、免费编程学习资料分享,帮你少走弯路进大厂:
![](https://pic.yupi.icu/1/20231026104004688.png)
### 公众号编程导航
关注者 15 万+,分享编程学习指南、编程学习者们的亲身经验和干货。
![](https://pic.yupi.icu/1/20231026104005005.png)
### B 站
主页:[https://space.bilibili.com/12890453](https://space.bilibili.com/12890453)
关注者 60 万+,分享编程干货、个人学习方法、自制的、好玩的编程项目,希望做一些不一样的内容,带大家一起感受编程的乐趣!
### GitHub
中国区排名前 20,有很多本人原创的项目代码~
地址:[https://github.com/liyupi](https://github.com/liyupi)
国内:[https://gitee.com/liyupi](https://gitee.com/liyupi)
欢迎 follow ⭐️
### 其他平台
抖音:50 万粉,分享有意思的编程小知识
知乎:10 万粉,[https://www.zhihu.com/people/coder_yupi](https://www.zhihu.com/people/coder_yupi)
CSDN[https://liyupi.blog.csdn.net/](https://liyupi.blog.csdn.net/)
掘金:[https://juejin.cn/user/2444938365386621](https://juejin.cn/user/2444938365386621)
网易云音乐等平台均叫【程序员鱼皮】。
欢迎大家关注俺,一起学习进步~
### 创业记录
我的创业记录分享《屑老板不破产》:[https://space.bilibili.com/1754801268](https://space.bilibili.com/1754801268)
## 作品
### 主导项目
老鱼简历,1 分钟生成精美的个人简历:[https://www.laoyujianli.com](https://www.laoyujianli.com)
鱼聪明 AI,做您强大的 AI 助手:[https://www.yucongming.com/](https://www.yucongming.com/)
编程导航,做您编程路上的导航员:[https://www.codefather.cn/](https://www.codefather.cn/)
框框大学:[https://kkdaxue.com/](https://kkdaxue.com/) ,曾被澎湃新闻等媒体报道的免费大学各专业建议网站
### 纯个人作品
SQL 闯关式自学网(纯前端项目):[https://github.com/liyupi/sql-mother](https://github.com/liyupi/sql-mother)
极客范儿浏览器主页(重前端项目):[https://github.com/liyupi/yuindex](https://github.com/liyupi/yuindex)
SQL 数据生成器(React + Java):[https://github.com/liyupi/sql-father-frontend-public](https://github.com/liyupi/sql-father-frontend-public)
免费网络安全自学网(纯前端项目):[https://github.com/liyupi/ceshiya](https://github.com/liyupi/ceshiya)
结构化 SQL 语句生成器:[https://github.com/liyupi/sql-generator](https://github.com/liyupi/sql-generator)
面试刷题网(React + Node):[https://github.com/liyupi/mianshiya-public](https://github.com/liyupi/mianshiya-public)
编程资源网(React + 云开发):[https://github.com/liyupi/code-nav](https://github.com/liyupi/code-nav)
AI 自动回复工具(Java 项目):[https://github.com/liyupi/yu-auto-reply](https://github.com/liyupi/yu-auto-reply)
鱼了个鱼(纯前端项目):[https://github.com/liyupi/yulegeyu](https://github.com/liyupi/yulegeyu)
表情包网站(Vue + Java):[https://github.com/liyupi/father](https://github.com/liyupi/father)
静态文档网站:[https://github.com/liyupi/code-xingqiu](https://github.com/liyupi/code-xingqiu)
Ikun 测试器(Vue):[https://github.com/liyupi/ikun-test](https://github.com/liyupi/ikun-test)
名称生成器(Vue):[https://github.com/liyupi/good-name](https://github.com/liyupi/good-name)
## 万人编程学习圈
2 万多人的编程学习圈子,欢迎加入,开启你的编程起飞之旅:[💎 编程学习 - 编程导航](https://yuyuanweb.feishu.cn/wiki/VC1qwmX9diCBK3kidyec74vFnde)
![](./image/join_us.png)
## 商务合作
欢迎阅读:[商务合作](https://yuyuanweb.feishu.cn/wiki/AOzgw1mOliX6SskAVEicK6u7nDA)