├── .vscode ├── settings.json ├── extensions.json ├── launch.json └── tailwind.json ├── README.md ├── public └── DingTalkJBT.ttf ├── tsconfig.json ├── src ├── content │ ├── config.ts │ └── cv │ │ ├── general.yml │ │ └── english.yml ├── styles │ └── global.scss ├── components │ ├── Header.astro │ ├── Items.astro │ ├── Techs.astro │ ├── Metas.astro │ ├── Icon.astro │ ├── Section.astro │ ├── Table.astro │ └── Project.astro ├── layouts │ └── Layout.astro ├── env.d.ts └── pages │ ├── [slug].astro │ └── index.astro ├── .prettierrc.mjs ├── .gitignore ├── astro.config.mjs ├── tailwind.config.js └── package.json /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "css.customData": [".vscode/tailwind.json"] 3 | } 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # WebCV 2 | 3 | 基于 Astro.js 的 Web 简历。 4 | 5 | [cv.skywt.cn](https://cv.skywt.cn/) 6 | -------------------------------------------------------------------------------- /public/DingTalkJBT.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Skywt2003/WebCV/HEAD/public/DingTalkJBT.ttf -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["astro-build.astro-vscode"], 3 | "unwantedRecommendations": [] 4 | } 5 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "astro/tsconfigs/strict", 3 | "compilerOptions": { 4 | "jsx": "react-jsx", 5 | "jsxImportSource": "react" 6 | } 7 | } -------------------------------------------------------------------------------- /src/content/config.ts: -------------------------------------------------------------------------------- 1 | import { z, defineCollection } from "astro:content"; 2 | const cvCollection = defineCollection({ 3 | type: "data", 4 | schema: z.any(), 5 | }); 6 | export const collections = { 7 | cv: cvCollection, 8 | }; 9 | -------------------------------------------------------------------------------- /.prettierrc.mjs: -------------------------------------------------------------------------------- 1 | /** @type {import("prettier").Config} */ 2 | export default { 3 | plugins: ["prettier-plugin-astro"], 4 | overrides: [ 5 | { 6 | files: "*.astro", 7 | options: { 8 | parser: "astro", 9 | }, 10 | }, 11 | ], 12 | }; 13 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.2.0", 3 | "configurations": [ 4 | { 5 | "command": "./node_modules/.bin/astro dev", 6 | "name": "Development server", 7 | "request": "launch", 8 | "type": "node-terminal" 9 | } 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /src/styles/global.scss: -------------------------------------------------------------------------------- 1 | :root { 2 | font-size: 18px; 3 | @apply bg-gray-100; 4 | @apply dark:bg-neutral-900 dark:text-gray-200; 5 | } 6 | 7 | @font-face { 8 | font-family: "DingTalkJBT"; 9 | src: url("/DingTalkJBT.ttf") format("truetype"); 10 | } 11 | 12 | .link { 13 | @apply underline; 14 | } 15 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # build output 2 | dist/ 3 | 4 | # generated types 5 | .astro/ 6 | 7 | # dependencies 8 | node_modules/ 9 | 10 | # logs 11 | npm-debug.log* 12 | yarn-debug.log* 13 | yarn-error.log* 14 | pnpm-debug.log* 15 | 16 | # environment variables 17 | .env 18 | .env.production 19 | 20 | # macOS-specific files 21 | .DS_Store 22 | -------------------------------------------------------------------------------- /astro.config.mjs: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "astro/config"; 2 | import tailwind from "@astrojs/tailwind"; 3 | import yaml from "@rollup/plugin-yaml"; 4 | import react from "@astrojs/react"; 5 | 6 | // https://astro.build/config 7 | export default defineConfig({ 8 | integrations: [tailwind(), react()], 9 | vite: { 10 | plugins: [yaml()] 11 | } 12 | }); -------------------------------------------------------------------------------- /src/components/Header.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Metas from "./Metas.astro"; 3 | 4 | interface Props { 5 | header: Header; 6 | } 7 | 8 | const { header } = Astro.props; 9 | --- 10 | 11 |
12 |

13 | {header.name} 14 |

15 |
16 | 17 |
18 |
19 | -------------------------------------------------------------------------------- /tailwind.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('tailwindcss').Config} */ 2 | export default { 3 | content: ["./src/**/*.{astro,html,js,jsx,md,mdx,svelte,ts,tsx,vue}"], 4 | theme: { 5 | extend: {}, 6 | }, 7 | plugins: [ 8 | require("tailwindcss-animated"), 9 | ({ addComponents, theme }) => { 10 | addComponents({ 11 | ".font-ding": { 12 | fontFamily: "DingTalkJBT", 13 | }, 14 | }); 15 | }, 16 | ], 17 | }; 18 | -------------------------------------------------------------------------------- /src/components/Items.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import ItemsCopy from "./Items.astro"; 3 | 4 | interface Props { 5 | items: (string | string[])[]; 6 | } 7 | 8 | const { items } = Astro.props; 9 | --- 10 | 11 | 22 | -------------------------------------------------------------------------------- /src/components/Techs.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Icon from "./Icon.astro"; 3 | 4 | interface Props { 5 | techs: Tech[]; 6 | class?: string; 7 | } 8 | 9 | const { techs, class: className = "" } = Astro.props; 10 | --- 11 | 12 |
13 | { 14 | techs.map((tech) => ( 15 |
16 | {tech.icon && ( 17 |
18 | 19 |
20 | )} 21 | {tech.name} 22 |
23 | )) 24 | } 25 |
26 | -------------------------------------------------------------------------------- /src/layouts/Layout.astro: -------------------------------------------------------------------------------- 1 | --- 2 | interface Props { 3 | title: string; 4 | } 5 | 6 | const { title } = Astro.props; 7 | 8 | import "@tabler/icons-webfont/dist/tabler-icons.min.css"; 9 | import "../styles/global.scss"; 10 | --- 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | {title} 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /src/components/Metas.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Icon from "./Icon.astro"; 3 | 4 | interface Props { 5 | metas: Meta[]; 6 | } 7 | 8 | const { metas } = Astro.props; 9 | --- 10 | 11 |
12 | { 13 | metas.map((meta) => ( 14 |
15 | 16 | 17 | {meta.name} 18 | {meta.link ? ( 19 | 20 | {meta.content} 21 | 22 | ) : ( 23 | meta.content 24 | )} 25 | 26 |
27 | )) 28 | } 29 |
30 | -------------------------------------------------------------------------------- /src/components/Icon.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import * as TablerIcons from "@tabler/icons-react"; 3 | import type { FC } from "react"; 4 | 5 | interface Props { 6 | name: string; 7 | class?: string; 8 | size?: string; 9 | } 10 | 11 | interface IconProps { 12 | className: string; 13 | stroke: number; 14 | size: string; 15 | } 16 | 17 | const { name, class: className = "", size = "1rem" } = Astro.props; 18 | 19 | const IconComponent = TablerIcons[ 20 | `Icon${name}` as keyof typeof TablerIcons 21 | ] as FC; 22 | --- 23 | 24 | 31 | -------------------------------------------------------------------------------- /src/components/Section.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Project from "./Project.astro"; 3 | import Table from "./Table.astro"; 4 | 5 | interface Props { 6 | section: Section; 7 | } 8 | 9 | const { section } = Astro.props; 10 | --- 11 | 12 |
13 |

14 | {section.title} 15 |

16 |
17 | { 18 | section.projects && ( 19 |
20 | {section.projects.map((project) => ( 21 | 22 | ))} 23 |
24 | ) 25 | } 26 | {section.table && } 27 | 28 | -------------------------------------------------------------------------------- /src/env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | 4 | declare module "*.yml" { 5 | const value: any; 6 | export default value; 7 | } 8 | 9 | interface Header { 10 | name: string; 11 | metas: Meta[]; 12 | } 13 | 14 | interface Meta { 15 | icon: string; 16 | name: string; 17 | content: string; 18 | link?: string; 19 | } 20 | 21 | interface Section { 22 | title: string; 23 | projects: Project[]; 24 | table: Table; 25 | } 26 | 27 | interface Project { 28 | title: string; 29 | subtitle?: string; 30 | desc?: string; 31 | date?: string; 32 | icon?: string; 33 | caption?: string; 34 | techs?: Tech[]; 35 | items?: (string | string[])[]; 36 | } 37 | 38 | interface Tech { 39 | icon?: string; 40 | name: string; 41 | } 42 | 43 | interface Table { 44 | rows: string[]; 45 | cols: string[]; 46 | cells: TableLines[][]; 47 | } 48 | 49 | interface TableLines { 50 | lines: Tech[][]; 51 | } -------------------------------------------------------------------------------- /src/pages/[slug].astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { getEntry, getCollection } from "astro:content"; 3 | 4 | export async function getStaticPaths() { 5 | const blogEntries = await getCollection("cv"); 6 | return blogEntries.map((entry) => ({ 7 | params: { slug: entry.id }, 8 | props: { entry }, 9 | })); 10 | } 11 | 12 | import Layout from "../layouts/Layout.astro"; 13 | import Header from "../components/Header.astro"; 14 | import Section from "../components/Section.astro"; 15 | 16 | const { entry } = Astro.props; 17 | 18 | const data = await getEntry(entry); 19 | --- 20 | 21 | 22 |
23 |
24 |
25 |
26 | { 27 | data.data.sections.map((section: Section) => ( 28 |
29 | )) 30 | } 31 |
32 |
33 |
34 |
35 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "webcv", 3 | "type": "module", 4 | "version": "0.0.1", 5 | "scripts": { 6 | "dev": "astro dev", 7 | "start": "astro dev", 8 | "build": "astro check && astro build", 9 | "preview": "astro preview", 10 | "astro": "astro" 11 | }, 12 | "dependencies": { 13 | "@astrojs/check": "^0.9.3", 14 | "@astrojs/react": "^3.6.2", 15 | "@astrojs/tailwind": "^5.1.0", 16 | "@fontsource/noto-serif-sc": "^5.0.11", 17 | "@tabler/icons-react": "^3.11.0", 18 | "@tabler/icons-webfont": "^3.1.0", 19 | "@types/react": "^18.3.3", 20 | "@types/react-dom": "^18.3.0", 21 | "astro": "^4.13.4", 22 | "react": "^18.3.1", 23 | "react-dom": "^18.3.1", 24 | "sass": "^1.77.8", 25 | "tailwindcss-animated": "^1.0.1", 26 | "typescript": "^5.3.3" 27 | }, 28 | "devDependencies": { 29 | "@rollup/plugin-yaml": "^4.1.2", 30 | "prettier": "^3.3.3", 31 | "prettier-plugin-astro": "^0.14.1", 32 | "tailwindcss": "^3.2.0" 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/components/Table.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Techs from "./Techs.astro"; 3 | 4 | interface Props { 5 | table: Table; 6 | } 7 | 8 | const { table } = Astro.props; 9 | --- 10 | 11 |
12 |
13 | 14 | 15 | {table.cols.map((col) => )} 16 | 17 | { 18 | table.rows.map((row, rowIndex) => ( 19 | 20 | 21 | {table.cols.map((col, colIndex) => ( 22 | 27 | ))} 28 | 29 | )) 30 | } 31 |
{col}
{row} 23 | {table.cells[rowIndex][colIndex].lines.map((line) => ( 24 | 25 | ))} 26 |
32 |
33 | 34 | 58 | -------------------------------------------------------------------------------- /src/components/Project.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Icon from "./Icon.astro"; 3 | import Items from "./Items.astro"; 4 | import Techs from "./Techs.astro"; 5 | 6 | interface Props { 7 | project: Project; 8 | } 9 | 10 | const { project } = Astro.props; 11 | --- 12 | 13 |
14 |
15 | {project.title} 16 | {project.subtitle && {project.subtitle}} 17 | { 18 | project.desc && ( 19 | {project.desc} 20 | ) 21 | } 22 | 23 | { 24 | project.date && ( 25 | {project.date} 26 | ) 27 | } 28 |
29 | { 30 | (project.caption || project.techs) && ( 31 |
32 | {(project.icon || project.caption) && ( 33 |
34 | {project.icon && ( 35 |
36 | 37 |
38 | )} 39 | {project.caption &&
{project.caption}
} 40 |
41 | )} 42 | {project.techs && } 43 |
44 | ) 45 | } 46 | { 47 | project.items && ( 48 |
49 | 50 |
51 | ) 52 | } 53 |
54 | -------------------------------------------------------------------------------- /src/pages/index.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Layout from "../layouts/Layout.astro"; 3 | --- 4 | 5 | 6 |
7 |

@SkyWT

8 |

9 | 持续进步
创造价值 12 |

13 |
14 | 中文 15 | English 16 |
17 |
18 |
19 |

20 | © 2017-2024 21 | SkyWT / 22 | WebCV 23 |

24 |
25 |
26 | 27 | 70 | -------------------------------------------------------------------------------- /.vscode/tailwind.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 1.1, 3 | "atDirectives": [ 4 | { 5 | "name": "@tailwind", 6 | "description": "Use the `@tailwind` directive to insert Tailwind's `base`, `components`, `utilities` and `screens` styles into your CSS.", 7 | "references": [ 8 | { 9 | "name": "Tailwind Documentation", 10 | "url": "https://tailwindcss.com/docs/functions-and-directives#tailwind" 11 | } 12 | ] 13 | }, 14 | { 15 | "name": "@apply", 16 | "description": "Use the `@apply` directive to inline any existing utility classes into your own custom CSS. This is useful when you find a common utility pattern in your HTML that you’d like to extract to a new component.", 17 | "references": [ 18 | { 19 | "name": "Tailwind Documentation", 20 | "url": "https://tailwindcss.com/docs/functions-and-directives#apply" 21 | } 22 | ] 23 | }, 24 | { 25 | "name": "@responsive", 26 | "description": "You can generate responsive variants of your own classes by wrapping their definitions in the `@responsive` directive:\n```css\n@responsive {\n .alert {\n background-color: #E53E3E;\n }\n}\n```\n", 27 | "references": [ 28 | { 29 | "name": "Tailwind Documentation", 30 | "url": "https://tailwindcss.com/docs/functions-and-directives#responsive" 31 | } 32 | ] 33 | }, 34 | { 35 | "name": "@screen", 36 | "description": "The `@screen` directive allows you to create media queries that reference your breakpoints by **name** instead of duplicating their values in your own CSS:\n```css\n@screen sm {\n /* ... */\n}\n```\n…gets transformed into this:\n```css\n@media (min-width: 640px) {\n /* ... */\n}\n```\n", 37 | "references": [ 38 | { 39 | "name": "Tailwind Documentation", 40 | "url": "https://tailwindcss.com/docs/functions-and-directives#screen" 41 | } 42 | ] 43 | }, 44 | { 45 | "name": "@variants", 46 | "description": "Generate `hover`, `focus`, `active` and other **variants** of your own utilities by wrapping their definitions in the `@variants` directive:\n```css\n@variants hover, focus {\n .btn-brand {\n background-color: #3182CE;\n }\n}\n```\n", 47 | "references": [ 48 | { 49 | "name": "Tailwind Documentation", 50 | "url": "https://tailwindcss.com/docs/functions-and-directives#variants" 51 | } 52 | ] 53 | } 54 | ] 55 | } 56 | -------------------------------------------------------------------------------- /src/content/cv/general.yml: -------------------------------------------------------------------------------- 1 | header: 2 | name: 吴天 3 | metas: 4 | - icon: Mail 5 | name: 邮箱: 6 | content: me@skywt.cn 7 | link: mailto:me@skywt.cn 8 | - icon: Phone 9 | name: 电话: 10 | content: 133-****-**** 11 | - icon: BrandWechat 12 | name: 微信: 13 | content: Skywt2003 14 | - icon: BrandGithub 15 | name: GitHub: 16 | content: Skywt2003 17 | link: https://github.com/Skywt2003 18 | sections: 19 | - title: 教育背景 20 | projects: 21 | - title: 湖南大学 22 | subtitle: 信息科学与工程学院 23 | date: 2021 年 9 月 - 2025 年 6 月 24 | icon: School 25 | caption: 信息安全专业,本科(在读) 26 | items: 27 | - 主修课程:程序设计、算法与数据结构、体系结构、操作系统、数据库系统、计算机网络、网络安全等 28 | - 学业成绩:GPA 3.61/4.00,专业排名 21% 29 | - title: 实习经历 30 | projects: 31 | - title: 阿里巴巴集团 32 | subtitle: 钉钉(中国)信息技术有限公司 33 | date: 2024 年 7 月 - 2024 年 9 月 34 | icon: Code 35 | caption: 前端开发实习生 36 | techs: 37 | - icon: BrandReact 38 | name: React.js 39 | - icon: Package 40 | name: Webpack 41 | - icon: BrandTypescript 42 | name: TypeScript 43 | items: 44 | - 参与钉钉智能财务应用 PC 端、移动端、OA 审批套件的前端开发。 45 | - 智能财务 i18n 自动化工具:一套自动使项目前端支持国际化的 JavaScript 脚本。 46 | - - 基于 Babel 等工具,将源码解析为 AST 进行自动化修改,使用 i18next 为前端添加国际化支持。 47 | - 将脚本集成在构建流程中,调用 AI 模型生成各语言的翻译文案。 48 | - 集成 husky 进行前端国际化代码规约与检查,沉淀相关文档形成标准。 49 | - 里程补贴(私车公用)功能:基于钉钉端能力实现记录行驶途径点、拍照记录等;实现导入 OA 审批单逻辑。 50 | - title: 项目经历 51 | projects: 52 | - title: 湖大微生活 53 | desc: 为湖南大学同学提供课表查看、成绩查询等功能的小程序。 54 | date: 2022 年 3 月 - 2023 年 10 月 55 | icon: Code 56 | caption: 前端开发成员之一 57 | techs: 58 | - icon: BrandReact 59 | name: React.js 60 | - icon: LayersIntersect 61 | name: Taro.js 62 | - icon: BrandMiniprogram 63 | name: 小程序 64 | - icon: BrandTypescript 65 | name: TypeScript 66 | items: 67 | - 项目背景:学校教务处网站未适配移动端,且只可内网访问,使用不便。因此,学生社团基于教务处网站接口开发小程序。 68 | - 我的职责: 69 | - - 在合法合规前提下,通过抓包等手段解析教务系统网站接口,通过爬虫爬取部分数据。 70 | - 参与项目前端开发。基于 Taro.js 和 React.js 框架构建跨端小程序。共负责开发 5 个页面,实现成绩查询、图书借阅查询等多个功能, 71 | - title: 博客系统 Daydreamer 72 | desc: 功能完备的博客系统,作为体验各种新技术的 playground。 73 | date: 2023 年 10 月 - 2024 年 3 月 74 | icon: Stack2 75 | caption: 全栈开发、UI/UX 设计 76 | techs: 77 | - icon: BrandAstro 78 | name: Astro.js 79 | - icon: BrandReact 80 | name: React.js 81 | - icon: BrandNodejs 82 | name: Node.js 83 | - icon: Ikosaedr 84 | name: Koa.js 85 | - icon: BrandDocker 86 | name: Docker 87 | - icon: Database 88 | name: Postgres 89 | items: 90 | - 工作内容: 91 | - - 基于 Astro.js 构建前端,博客部分在服务器端静态生成;使用 React.js 构建评论区等部分。 92 | - 基于 Koa.js 框架构建后端,使用 TypeORM 框架操作 Postgres 数据库。使用 Docker 进行容器化。使用 GitHub Actions 进行自动化部署。 93 | - 成果展示:个人网站 skywt.cn 前端源码仓库后端源码仓库。 94 | - title: 技术栈 95 | table: 96 | rows: 97 | - 前端技术 98 | - 后端技术 99 | - 运维技术 100 | cols: 101 | - 较熟练掌握 102 | - 有所接触 103 | cells: 104 | - - lines: 105 | - - icon: BrandHtml5 106 | name: HTML5 107 | - icon: BrandCss3 108 | name: CSS3 109 | - icon: BrandJavascript 110 | name: JavaScript 111 | - icon: BrandTypescript 112 | name: TypeScript 113 | - - icon: BrandReact 114 | name: React.js 115 | - icon: BrandNextjs 116 | name: Next.js 117 | - icon: BrandAstro 118 | name: Astro.js 119 | - - icon: Package 120 | name: Webpack 121 | - icon: LetterB 122 | name: Babel 123 | - icon: BrandSass 124 | name: Sass 125 | - icon: BrandTailwind 126 | name: Tailwind.css 127 | - lines: 128 | - - icon: BrandVue 129 | name: Vue.js 130 | - icon: BrandVite 131 | name: Vite.js 132 | - - icon: BrandMiniprogram 133 | name: 小程序 134 | - icon: LayersIntersect 135 | name: Taro.js 136 | - icon: BrandReactNative 137 | name: React Native 138 | - - icon: BrandSwift 139 | name: Swift 140 | - icon: BrandSwift 141 | name: SwiftUI 142 | - - lines: 143 | - - icon: BrandNodejs 144 | name: Node.js 145 | - icon: Ikosaedr 146 | name: Koa.js 147 | - icon: CodeMinus 148 | name: TypeORM 149 | - lines: 150 | - - icon: BrandPython 151 | name: Python 152 | - icon: Copyright 153 | name: C / C++ 154 | - icon: BrandPhp 155 | name: PHP 156 | - - icon: DatabaseSearch 157 | name: SQL 158 | - icon: BrandMysql 159 | name: MySQL 160 | - icon: FileTypeSql 161 | name: SQLite 162 | - icon: Database 163 | name: Postgres 164 | - - lines: 165 | - - icon: Terminal2 166 | name: Linux 167 | - icon: BrandDocker 168 | name: Docker 169 | - icon: Server 170 | name: Caddy 171 | - icon: BrandGithub 172 | name: GitHub Actions 173 | - lines: 174 | - - icon: Server 175 | name: Nginx 176 | - icon: Cube 177 | name: Kubernetes 178 | - icon: Terminal2 179 | name: PVE 180 | - title: 证书与获奖经历 181 | projects: 182 | - title: 中国大学生程序设计竞赛(CCPC)广州站 183 | subtitle: 银奖 184 | date: 2021 年 11 月 185 | - title: CCF 计算机软件能力认证(CSP) 186 | date: 2022 年 9 月 187 | subtitle: 290 分,全国排名 4.6% 188 | - title: 大学英语六级考试(CET6) 189 | date: 2023 年 3 月 190 | subtitle: 566 分 191 | - title: 全国信息安全铁人三项赛 192 | date: 2023 年 5 月 193 | subtitle: 二等奖 194 | - title: 全国大学生网络安全攻防竞赛 195 | date: 2023 年 12 月 196 | subtitle: 优胜奖 197 | - title: 全国大学生数学建模竞赛 198 | date: 2023 年 9 月 199 | subtitle: 湖南省二等奖 200 | - title: 国家信息安全水平考试(NISP) 201 | date: 2023 年 12 月 202 | subtitle: 一级 203 | - title: 湖南大学校级三好学生、二等综合奖学金、单项奖学金 204 | date: 2022 年、2023 年 205 | - title: 校园经历 206 | projects: 207 | - title: 湖南大学信息安全协会(HNUSec) 208 | subtitle: 会长 209 | date: 2023 年 9 月 - 2024 年 9 月 210 | - title: 湖南大学信息科学与工程学院辩论队 211 | subtitle: 队长 212 | date: 2022 年 7 月 - 2023 年 7 月 213 | -------------------------------------------------------------------------------- /src/content/cv/english.yml: -------------------------------------------------------------------------------- 1 | header: 2 | name: Tian Wu 3 | metas: 4 | - icon: Mail 5 | name: "Email: " 6 | content: me@skywt.cn 7 | link: mailto:me@skywt.cn 8 | - icon: Phone 9 | name: "Phone: " 10 | content: 133-****-**** 11 | - icon: BrandWechat 12 | name: "WeChat: " 13 | content: Skywt2003 14 | - icon: BrandGithub 15 | name: "GitHub: " 16 | content: Skywt2003 17 | link: https://github.com/Skywt2003 18 | sections: 19 | - title: Education Experience 20 | projects: 21 | - title: Hunan University 22 | subtitle: College of Computer Science and Electronic Engineering 23 | date: September 2021 - June 2025 24 | icon: School 25 | caption: Bachelor's Degree in Information Security (Expected June 2025) 26 | items: 27 | - "Major courses: Programming, Algorithms & Data Structures, Computer Architecture, Operating Systems, Database Systems, Computer Networks, Cyber Security" 28 | - "Academic performance: GPA 3.61/4.00, Top 21%" 29 | - title: Internship Experience 30 | projects: 31 | - title: Alibaba Group - DingTalk (China) Information Technology Co., LTD 32 | subtitle: Suite Technology / Smart Finance 33 | date: July 2024 - September 2024 34 | icon: Code 35 | caption: Front-end Engineer Intern 36 | techs: 37 | - icon: BrandReact 38 | name: React.js 39 | - icon: Package 40 | name: Webpack 41 | - icon: BrandTypescript 42 | name: TypeScript 43 | items: 44 | - Contributed to front-end development for the Smart Finance module within the DingTalk app on both PC and mobile platforms. 45 | - "Developed a Smart Finance i18n Automation Tool using JS scripts to automate internationalization (i18n) for the front-end." 46 | - - Used Babel to parse code into AST for automated i18n integration with i18next. 47 | - Incorporated AI-generated translations (Alibaba Qwen) into the build process. 48 | - Implemented Husky for code checks and established i18n standards and documentation. 49 | - title: Project Experience 50 | projects: 51 | - title: HNU Wei Life 52 | desc: Mini Program for HNU students. 53 | date: March 2022 - October 2023 54 | icon: Code 55 | caption: Front-end Engineer Member 56 | techs: 57 | - icon: BrandReact 58 | name: React.js 59 | - icon: LayersIntersect 60 | name: Taro.js 61 | - icon: BrandMiniprogram 62 | name: Mini Program 63 | - icon: BrandTypescript 64 | name: TypeScript 65 | items: 66 | - "Project Background: Developed a mini-program for HNU students to address the limitations of the school's academic administration website, which was not mobile-friendly and accessible only via the internal network." 67 | - "My Responsibilities: " 68 | - - Analyzed the academic system's API using methods like packet capturing while ensuring compliance. 69 | - Contributed to front-end development by creating a cross-platform mini-program using Taro.js and React.js. Developed 5 pages with features like grade inquiries and library book loan queries. 70 | - title: "Blog System: Daydreamer" 71 | desc: A fully functional blogging system. 72 | date: October 2023 - March 2024 73 | icon: Stack2 74 | caption: Full-stack Engineer, UI/UX Design 75 | techs: 76 | - icon: BrandAstro 77 | name: Astro.js 78 | - icon: BrandReact 79 | name: React.js 80 | - icon: BrandNodejs 81 | name: Node.js 82 | - icon: Ikosaedr 83 | name: Koa.js 84 | - icon: BrandDocker 85 | name: Docker 86 | - icon: Database 87 | name: Postgres 88 | items: 89 | - "My Work: " 90 | - - Developed the front-end using Astro.js and integrated components like the comment section with React.js. 91 | - Created the back-end with Koa.js, utilizing TypeORM for Postgres database interactions. Implemented Docker for containerization and GitHub Actions for automated deployment. 92 | - "Showcase: Personal website: skywt.cn, Front-end Source Code Repository, Back-end Source Code Repository." 93 | - title: Skills & Technology Stack 94 | table: 95 | rows: 96 | - Front-end 97 | - Back-end 98 | - Ops 99 | cols: 100 | - Proficient 101 | - Familiar 102 | cells: 103 | - - lines: 104 | - - icon: BrandHtml5 105 | name: HTML5 106 | - icon: BrandCss3 107 | name: CSS3 108 | - icon: BrandJavascript 109 | name: JavaScript 110 | - icon: BrandTypescript 111 | name: TypeScript 112 | - - icon: BrandReact 113 | name: React.js 114 | - icon: BrandNextjs 115 | name: Next.js 116 | - icon: BrandAstro 117 | name: Astro.js 118 | - - icon: Package 119 | name: Webpack 120 | - icon: LetterB 121 | name: Babel 122 | - icon: BrandSass 123 | name: Sass 124 | - icon: BrandTailwind 125 | name: Tailwind.css 126 | - lines: 127 | - - icon: BrandVue 128 | name: Vue.js 129 | - icon: BrandVite 130 | name: Vite.js 131 | - - icon: BrandMiniprogram 132 | name: Mini Program 133 | - icon: LayersIntersect 134 | name: Taro.js 135 | - icon: BrandReactNative 136 | name: React Native 137 | - - icon: BrandSwift 138 | name: Swift 139 | - icon: BrandSwift 140 | name: SwiftUI 141 | - - lines: 142 | - - icon: BrandNodejs 143 | name: Node.js 144 | - icon: Ikosaedr 145 | name: Koa.js 146 | - icon: CodeMinus 147 | name: TypeORM 148 | - lines: 149 | - - icon: BrandPython 150 | name: Python 151 | - icon: Copyright 152 | name: C / C++ 153 | - icon: BrandPhp 154 | name: PHP 155 | - - icon: DatabaseSearch 156 | name: SQL 157 | - icon: BrandMysql 158 | name: MySQL 159 | - icon: FileTypeSql 160 | name: SQLite 161 | - icon: Database 162 | name: Postgres 163 | - - lines: 164 | - - icon: Terminal2 165 | name: Linux 166 | - icon: BrandDocker 167 | name: Docker 168 | - icon: Server 169 | name: Caddy 170 | - icon: BrandGithub 171 | name: GitHub Actions 172 | - lines: 173 | - - icon: Server 174 | name: Nginx 175 | - icon: Cube 176 | name: Kubernetes 177 | - icon: Terminal2 178 | name: PVE 179 | - title: Certificates & awards 180 | projects: 181 | - title: China Collegiate Programming Contest (CCPC) Guangzhou 182 | subtitle: Silver Award 183 | date: "November 2021" 184 | - title: CCF Certified Software Professional (CSP) 185 | date: "September 2022" 186 | subtitle: 290 pts, national ranking 4.6% 187 | - title: College English Test Level 6 (CET6) 188 | date: "March 2023" 189 | subtitle: 566 pts 190 | - title: Second Class Scholarship & Individual Scholarship of HNU 191 | date: "2022, 2023" 192 | - title: Campus experience 193 | projects: 194 | - title: HNU Information Security Association (HNUSec) 195 | subtitle: President 196 | date: September 2023 - now 197 | - title: Debate Team of HNU CSEE 198 | subtitle: Captain 199 | date: July 2022 - July 2023 200 | --------------------------------------------------------------------------------