├── example.png ├── .eslintrc.json ├── src ├── public │ └── cv-photo.png ├── app │ ├── fonts │ │ ├── GeistVF.woff │ │ └── GeistMonoVF.woff │ ├── page.tsx │ ├── layout.tsx │ └── globals.css ├── components │ ├── skill-introduction.tsx │ ├── education-experience.tsx │ ├── work-experience.tsx │ ├── project-experience.tsx │ ├── personal-info.tsx │ └── skills-and-certificates.tsx └── config │ └── config.tsx ├── postcss.config.mjs ├── next.config.mjs ├── tailwind.config.ts ├── components.json ├── tsconfig.json ├── tailwind.config.js ├── package.json ├── README.md ├── .gitignore └── LICENSE /example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/snjyor/my-cv/HEAD/example.png -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["next/core-web-vitals", "next/typescript"] 3 | } 4 | -------------------------------------------------------------------------------- /src/public/cv-photo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/snjyor/my-cv/HEAD/src/public/cv-photo.png -------------------------------------------------------------------------------- /src/app/fonts/GeistVF.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/snjyor/my-cv/HEAD/src/app/fonts/GeistVF.woff -------------------------------------------------------------------------------- /src/app/fonts/GeistMonoVF.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/snjyor/my-cv/HEAD/src/app/fonts/GeistMonoVF.woff -------------------------------------------------------------------------------- /postcss.config.mjs: -------------------------------------------------------------------------------- 1 | /** @type {import('postcss-load-config').Config} */ 2 | const config = { 3 | plugins: { 4 | tailwindcss: {}, 5 | }, 6 | }; 7 | 8 | export default config; 9 | -------------------------------------------------------------------------------- /next.config.mjs: -------------------------------------------------------------------------------- 1 | /** @type {import('next').NextConfig} */ 2 | const nextConfig = { 3 | reactStrictMode: true, 4 | images: { 5 | domains: [ 6 | 'lh3.googleusercontent.com', 7 | 'avatars.githubusercontent.com' 8 | ], 9 | }, 10 | }; 11 | 12 | export default nextConfig; 13 | -------------------------------------------------------------------------------- /tailwind.config.ts: -------------------------------------------------------------------------------- 1 | import type { Config } from "tailwindcss"; 2 | 3 | const config: Config = { 4 | content: [ 5 | "./src/pages/**/*.{js,ts,jsx,tsx,mdx}", 6 | "./src/components/**/*.{js,ts,jsx,tsx,mdx}", 7 | "./src/app/**/*.{js,ts,jsx,tsx,mdx}", 8 | ], 9 | theme: { 10 | extend: { 11 | colors: { 12 | background: "var(--background)", 13 | foreground: "var(--foreground)", 14 | }, 15 | }, 16 | }, 17 | plugins: [], 18 | }; 19 | export default config; 20 | -------------------------------------------------------------------------------- /components.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://ui.shadcn.com/schema.json", 3 | "style": "new-york", 4 | "rsc": true, 5 | "tsx": true, 6 | "tailwind": { 7 | "config": "tailwind.config.ts", 8 | "css": "app/globals.css", 9 | "baseColor": "neutral", 10 | "cssVariables": true, 11 | "prefix": "" 12 | }, 13 | "aliases": { 14 | "components": "@/components", 15 | "utils": "@/lib/utils", 16 | "ui": "@/components/ui", 17 | "lib": "@/lib", 18 | "hooks": "@/hooks" 19 | } 20 | } -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "lib": ["dom", "dom.iterable", "esnext"], 4 | "allowJs": true, 5 | "skipLibCheck": true, 6 | "strict": true, 7 | "noEmit": true, 8 | "esModuleInterop": true, 9 | "module": "esnext", 10 | "moduleResolution": "bundler", 11 | "resolveJsonModule": true, 12 | "isolatedModules": true, 13 | "jsx": "preserve", 14 | "incremental": true, 15 | "plugins": [ 16 | { 17 | "name": "next" 18 | } 19 | ], 20 | "paths": { 21 | "@/*": ["./src/*"] 22 | } 23 | }, 24 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], 25 | "exclude": ["node_modules"] 26 | } 27 | -------------------------------------------------------------------------------- /src/app/page.tsx: -------------------------------------------------------------------------------- 1 | import PersonalInfo from "@/components/personal-info"; 2 | import SkillIntroduction from "@/components/skill-introduction"; 3 | import WorkExperience from "@/components/work-experience"; 4 | import ProjectExperience from "@/components/project-experience"; 5 | import EducationExperience from "@/components/education-experience"; 6 | import SkillsAndCertificates from "@/components/skills-and-certificates"; 7 | 8 | export default function Home() { 9 | return ( 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 | 20 |
21 | ); 22 | } 23 | -------------------------------------------------------------------------------- /tailwind.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | theme: { 3 | extend: { 4 | animation: { 5 | pulse: "pulse var(--duration) ease-out infinite", 6 | }, 7 | keyframes: { 8 | pulse: { 9 | "0%, 100%": { boxShadow: "0 0 0 0 var(--pulse-color)" }, 10 | "50%": { boxShadow: "0 0 0 8px var(--pulse-color)" }, 11 | }, 12 | }, 13 | }, 14 | }, 15 | plugins: [ 16 | require('@tailwindcss/forms'), 17 | require('@tailwindcss/typography'), 18 | require('@tailwindcss/aspect-ratio'), 19 | ], 20 | variants: { 21 | extend: { 22 | backgroundColor: ['active'], 23 | textColor: ['active'], 24 | } 25 | }, 26 | future: { 27 | removeDeprecatedGapUtilities: true, 28 | purgeLayersByDefault: true, 29 | }, 30 | purge: { 31 | content: ['./src/**/*.{js,ts,jsx,tsx}'], 32 | options: { 33 | safelist: ['backdrop-filter', 'backdrop-blur-lg'], 34 | }, 35 | }, 36 | } -------------------------------------------------------------------------------- /src/components/skill-introduction.tsx: -------------------------------------------------------------------------------- 1 | 'use client' 2 | import React, { useState, useEffect } from 'react'; 3 | import { Config } from '@/config/config' 4 | 5 | const SkillItem = ({ children }: { children: React.ReactNode }) => ( 6 |
  • 7 | 8 |

    {children}

    9 |
  • 10 | ); 11 | 12 | export default function SkillIntroduction() { 13 | const [skillList, setSkillList] = useState([]) 14 | 15 | useEffect(() => { 16 | setSkillList(Config.skillIntroduction) 17 | }, []) 18 | 19 | return ( 20 |
    21 |

    专业技能

    22 | 27 |
    28 | ) 29 | } 30 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "my-cv", 3 | "version": "1.0.0", 4 | "description": "A personal resume project showcasing skills in data analysis, Python, JavaScript, machine learning, and more. Includes work history, project experience, and educational background.", 5 | "main": "tailwind.config.js", 6 | "scripts": { 7 | "dev": "next dev", 8 | "build": "next build", 9 | "start": "next start", 10 | "lint": "next lint" 11 | }, 12 | "keywords": [], 13 | "author": "snjyor@gmail.com", 14 | "license": "ISC", 15 | "dependencies": { 16 | "lucide-react": "^0.453.0", 17 | "next": "^14.2.15", 18 | "react": "^18.3.1", 19 | "react-dom": "^18.3.1", 20 | "tailwindcss": "^3.4.14", 21 | "tailwindcss-animate": "^1.0.7" 22 | }, 23 | "devDependencies": { 24 | "@tailwindcss/aspect-ratio": "^0.4.2", 25 | "@tailwindcss/forms": "^0.5.9", 26 | "@tailwindcss/typography": "^0.5.15", 27 | "@types/node": "^20.16.12", 28 | "@types/react": "^18.3.11", 29 | "@types/react-dom": "^18.3.1", 30 | "eslint": "^8.57.1", 31 | "eslint-config-next": "^14.2.15", 32 | "postcss": "^8.4.47", 33 | "typescript": "^5.6.3" 34 | }, 35 | "private": "true" 36 | } 37 | -------------------------------------------------------------------------------- /src/app/layout.tsx: -------------------------------------------------------------------------------- 1 | import type { Metadata } from "next"; 2 | import localFont from "next/font/local"; 3 | import "./globals.css"; 4 | 5 | const geistSans = localFont({ 6 | src: "./fonts/GeistVF.woff", 7 | variable: "--font-geist-sans", 8 | weight: "100 900", 9 | }); 10 | const geistMono = localFont({ 11 | src: "./fonts/GeistMonoVF.woff", 12 | variable: "--font-geist-mono", 13 | weight: "100 900", 14 | }); 15 | 16 | export const metadata: Metadata = { 17 | title: "Easy Resume", 18 | description: "", 19 | keywords: "resume, data analysis, full stack development, Python, JavaScript, machine learning, project experience", 20 | openGraph: { 21 | title: "Easy Resume", 22 | description: "Explore a resume highlighting skills in data analysis, full stack development, and machine learning.", 23 | type: "website", 24 | }, 25 | twitter: { 26 | card: "summary_large_image", 27 | title: "Easy Resume", 28 | description: "", 29 | }, 30 | }; 31 | 32 | export default function RootLayout({ 33 | children, 34 | }: Readonly<{ 35 | children: React.ReactNode; 36 | }>) { 37 | return ( 38 | 39 | 42 | {children} 43 | 44 | 45 | ); 46 | } 47 | -------------------------------------------------------------------------------- /src/components/education-experience.tsx: -------------------------------------------------------------------------------- 1 | 'use client' 2 | import React, { useState, useEffect } from 'react'; 3 | import { Config } from '@/config/config'; 4 | 5 | export default function EducationExperience() { 6 | const [educationList, setEducationList] = useState<{ school: string; degree: string; startDate: string; endDate: string }[]>([]) 7 | 8 | useEffect(() => { 9 | setEducationList(Config.educationExperience) 10 | }, []) 11 | 12 | return ( 13 |
    14 |

    教育经历

    15 |
    16 | {educationList.map((education, index) => ( 17 |
    18 |
    19 |
    20 |

    {education.school}

    21 |

    {education.degree}

    22 |
    23 |

    {education.startDate} - {education.endDate}

    24 |
    25 |
    26 | ))} 27 |
    28 |
    29 | ) 30 | } 31 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 个人简历 2 | 3 | 这是一个使用 Next.js 和 Tailwind CSS 构建的个人简历项目。 4 | 5 | # example 6 | 7 | ![example](./example.png) 8 | 9 | 10 | ## 项目概述 11 | 12 | 本项目旨在创建一个现代化、响应式的在线简历,展示个人信息、技能、工作经历、项目经验和教育背景。 13 | 14 | ## 主要特性 15 | 16 | - 响应式设计,适配各种设备 17 | - 清晰的布局结构,包括个人信息、技能介绍、工作经历、项目经验和教育背景 18 | - 使用 Tailwind CSS 实现的现代化 UI 设计 19 | - 支持打印优化,便于生成 PDF 版本 20 | 21 | ## 技术栈 22 | 23 | - Next.js 24 | - React 25 | - TypeScript 26 | - Tailwind CSS 27 | 28 | ## 开始使用 29 | 30 | 1. 克隆仓库: 31 | 32 | ```bash 33 | git clone https://github.com/snjyor/my-cv.git 34 | cd my-cv 35 | ``` 36 | 37 | 2. 安装依赖: 38 | 39 | ```bash 40 | npm install 41 | ``` 42 | 43 | 3. 运行开发服务器: 44 | 45 | ```bash 46 | npm run dev 47 | ``` 48 | 49 | 4. 在浏览器中打开 [http://localhost:3000](http://localhost:3000) 查看结果。 50 | 51 | ## 项目结构 52 | 53 | - `src/components/`: 包含所有的 React 组件 54 | - `src/app/`: 包含主页面组件 55 | - `public/`: 存放静态资源,如图片 56 | 57 | ## 自定义简历内容 58 | 只需要修改 config/config.tsx 中的配置内容即可 59 | 60 | ## 简历模块 61 | - `src/components/personal-info.tsx`: 个人信息 62 | - `src/components/skills-and-certificates.tsx`: 技术栈和证书 63 | - `src/components/skill-introduction.tsx`: 技能介绍 64 | - `src/components/work-experience.tsx`: 工作经历 65 | - `src/components/project-experience.tsx`: 项目经验 66 | - `src/components/education-experience.tsx`: 教育背景 67 | 68 | ## 构建和部署 69 | 70 | 要构建生产版本,运行: 71 | 72 | ```bash 73 | npm run build 74 | ``` 75 | 76 | 构建完成后,你可以使用: 77 | 78 | ```bash 79 | npm start 80 | ``` 81 | 82 | 来启动生产服务器。 83 | 84 | ## 贡献 85 | 86 | 欢迎提出问题和贡献代码。请确保遵循项目的代码风格和贡献指南。 87 | 88 | ## 许可证 89 | 90 | 本项目采用 Apache License 2.0 许可证。详情请参阅 [LICENSE](LICENSE) 文件。 91 | -------------------------------------------------------------------------------- /src/app/globals.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | body { 6 | font-family: Arial, Helvetica, sans-serif; 7 | } 8 | 9 | @layer utilities { 10 | .text-balance { 11 | text-wrap: balance; 12 | } 13 | } 14 | 15 | @layer base { 16 | :root { 17 | --background: 0 0% 100%; 18 | --foreground: 0 0% 3.9%; 19 | --card: 0 0% 100%; 20 | --card-foreground: 0 0% 3.9%; 21 | --popover: 0 0% 100%; 22 | --popover-foreground: 0 0% 3.9%; 23 | --primary: 0 0% 9%; 24 | --primary-foreground: 0 0% 98%; 25 | --secondary: 0 0% 96.1%; 26 | --secondary-foreground: 0 0% 9%; 27 | --muted: 0 0% 96.1%; 28 | --muted-foreground: 0 0% 45.1%; 29 | --accent: 0 0% 96.1%; 30 | --accent-foreground: 0 0% 9%; 31 | --destructive: 0 84.2% 60.2%; 32 | --destructive-foreground: 0 0% 98%; 33 | --border: 0 0% 89.8%; 34 | --input: 0 0% 89.8%; 35 | --ring: 0 0% 3.9%; 36 | --chart-1: 12 76% 61%; 37 | --chart-2: 173 58% 39%; 38 | --chart-3: 197 37% 24%; 39 | --chart-4: 43 74% 66%; 40 | --chart-5: 27 87% 67%; 41 | --radius: 0.5rem; 42 | } 43 | .dark { 44 | --background: 0 0% 3.9%; 45 | --foreground: 0 0% 98%; 46 | --card: 0 0% 3.9%; 47 | --card-foreground: 0 0% 98%; 48 | --popover: 0 0% 3.9%; 49 | --popover-foreground: 0 0% 98%; 50 | --primary: 0 0% 98%; 51 | --primary-foreground: 0 0% 9%; 52 | --secondary: 0 0% 14.9%; 53 | --secondary-foreground: 0 0% 98%; 54 | --muted: 0 0% 14.9%; 55 | --muted-foreground: 0 0% 63.9%; 56 | --accent: 0 0% 14.9%; 57 | --accent-foreground: 0 0% 98%; 58 | --destructive: 0 62.8% 30.6%; 59 | --destructive-foreground: 0 0% 98%; 60 | --border: 0 0% 14.9%; 61 | --input: 0 0% 14.9%; 62 | --ring: 0 0% 83.1%; 63 | --chart-1: 220 70% 50%; 64 | --chart-2: 160 60% 45%; 65 | --chart-3: 30 80% 55%; 66 | --chart-4: 280 65% 60%; 67 | --chart-5: 340 75% 55%; 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /src/components/work-experience.tsx: -------------------------------------------------------------------------------- 1 | 'use client' 2 | import React, { useState, useEffect } from 'react'; 3 | import { Config } from '@/config/config' 4 | 5 | const ExperienceItem = ({ children }: { children: React.ReactNode }) => ( 6 |
  • 7 | 8 |

    {children}

    9 |
  • 10 | ); 11 | 12 | export default function WorkExperience() { 13 | const [experienceList, setExperienceList] = useState<{ company: string; position: string; startDate: string; endDate: string; description: string[] }[]>([]) 14 | 15 | useEffect(() => { 16 | setExperienceList(Config.workExperience) 17 | }, []) 18 | 19 | return ( 20 |
    21 |

    工作经历

    22 |
    23 | { 24 | experienceList.map((experience, index) => ( 25 |
    26 |
    27 |

    {experience.company} - {experience.position}

    28 |

    {experience.startDate} - {experience.endDate}

    29 |
    30 |
      31 | {experience.description.map((desc, index) => ( 32 | {desc} 33 | ))} 34 |
    35 |
    36 | ))} 37 |
    38 |
    39 | ) 40 | } 41 | -------------------------------------------------------------------------------- /src/components/project-experience.tsx: -------------------------------------------------------------------------------- 1 | 'use client' 2 | import React, { useState, useEffect } from 'react'; 3 | import { Config } from '@/config/config' 4 | 5 | const ProjectItem = ({ children }: { children: React.ReactNode }) => ( 6 |
  • 7 | 8 |

    {children}

    9 |
  • 10 | ); 11 | 12 | export default function ProjectExperience() { 13 | const [projectList, setProjectList] = useState<{ projectName: string; projectStartTime: string; projectEndTime: string; projectDescription: string; projectResponsibility: string[] }[]>([]) 14 | 15 | useEffect(() => { 16 | setProjectList(Config.projectExperience) 17 | }, []) 18 | 19 | return ( 20 |
    21 |

    项目经历

    22 |
    23 | { 24 | projectList.map((project, index) => ( 25 |
    26 |
    27 |

    {project.projectName}

    28 |

    {project.projectStartTime} - {project.projectEndTime}

    29 |
    30 |

    {project.projectDescription}

    31 |

    职责描述:

    32 |
      33 | {project.projectResponsibility.map((responsibility, index) => ( 34 | {responsibility} 35 | ))} 36 |
    37 |
    38 | )) 39 | } 40 |
    41 |
    42 | ); 43 | }; 44 | -------------------------------------------------------------------------------- /src/components/personal-info.tsx: -------------------------------------------------------------------------------- 1 | 'use client' 2 | import { Phone, Mail, MapPin, User } from 'lucide-react' 3 | import Image from 'next/image' 4 | import cvPhoto from '@/public/cv-photo.png' 5 | import { useState, useEffect } from 'react' 6 | import { Config } from '@/config/config' 7 | 8 | export default function PersonalInfo() { 9 | const [personalInfo, setPersonalInfo] = useState<{ name: string; phone: string; email: string; address: string; age: string; job: string; status: string }>({ 10 | name: "", 11 | phone: "", 12 | email: "", 13 | address: "", 14 | age: "", 15 | job: "", 16 | status: "" 17 | }) 18 | 19 | useEffect(() => { 20 | setPersonalInfo(Config.personalInfo) 21 | }, []) 22 | 23 | return ( 24 |
    25 |
    26 |
    27 |

    {personalInfo.name}

    28 |
    29 |
    30 |
    31 | 32 | {personalInfo.phone} 33 |
    34 |
    35 | 36 | {personalInfo.email} 37 |
    38 |
    39 |
    40 |
    41 | 42 | {personalInfo.address} 43 |
    44 |
    45 | 46 | {personalInfo.age} 47 |
    48 |
    49 |
    {personalInfo.job} | {personalInfo.status}
    50 |
    51 |
    52 |
    53 | Profile 54 |
    55 | ) 56 | } 57 | -------------------------------------------------------------------------------- /src/components/skills-and-certificates.tsx: -------------------------------------------------------------------------------- 1 | 'use client' 2 | import React, { useState, useEffect } from 'react'; 3 | import { Config } from '@/config/config' 4 | 5 | function Badge({ children, className }: { children: React.ReactNode; className?: string }) { 6 | return ( 7 | 8 | {children} 9 | 10 | ); 11 | } 12 | 13 | export default function SkillsAndCertificates() { 14 | const [skills, setSkills] = useState<{ name: string; color: string }[]>([]) 15 | const [certificates, setCertificates] = useState<{ name: string }[]>([]) 16 | 17 | const colorList = [ 18 | "bg-blue-500 print:bg-white", 19 | "bg-gray-700 print:bg-white", 20 | "bg-purple-500 print:bg-white", 21 | "bg-orange-500 print:bg-white", 22 | "bg-yellow-500 print:bg-white", 23 | "bg-blue-600 print:bg-white", 24 | "bg-cyan-500 print:bg-white", 25 | "bg-teal-500 print:bg-white", 26 | "bg-black print:bg-white", 27 | "bg-green-600 print:bg-white", 28 | "bg-indigo-500 print:bg-white", 29 | "bg-blue-400 print:bg-white", 30 | "bg-blue-700 print:bg-white", 31 | "bg-red-500 print:bg-white", 32 | ] 33 | useEffect(() => { 34 | const skillsWithColor = Config.skills.map((skill) => ({ 35 | ...skill, 36 | color: colorList[Math.floor(Math.random() * colorList.length)] 37 | })) 38 | setCertificates(Config.certificates) 39 | setSkills(skillsWithColor) 40 | }, []) 41 | 42 | return ( 43 |
    44 |
    45 |

    技术栈

    46 |
    47 | {skills.map((skill) => ( 48 | 49 | {skill.name} 50 | 51 | ))} 52 |
    53 | {certificates.map((certificate, index) => ( 54 |
    55 | 56 | 57 | 58 | {certificate.name} 59 |
    60 | ))} 61 |
    62 |
    63 | ) 64 | } 65 | -------------------------------------------------------------------------------- /src/config/config.tsx: -------------------------------------------------------------------------------- 1 | export const Config = { 2 | personalInfo: { 3 | name: "景晖", 4 | phone: "153xxxxxxxx", 5 | email: "xxxxxx@gmail.com", 6 | address: "广东广州", 7 | age: "18岁", 8 | job: "后端/数据挖掘/JS全栈", 9 | status: "待业" 10 | }, 11 | skills: [ 12 | { name: "Python" }, 13 | { name: "Flask" }, 14 | { name: "Pandas" }, 15 | { name: "PyTorch" }, 16 | { name: "JavaScript" }, 17 | { name: "TypeScript" }, 18 | { name: "React" }, 19 | { name: "Tailwind CSS" }, 20 | { name: "Next.js" }, 21 | { name: "Node.js" }, 22 | { name: "Traefik" }, 23 | { name: "Portainer" }, 24 | { name: "Docker" }, 25 | { name: "Google Services" }, 26 | ], 27 | certificates: [ 28 | { name: "英语六级证书 - 能够熟练阅读专业文档" }, 29 | ], 30 | skillIntroduction: [ 31 | '掌握Python编程语言,具备面向对象和函数式编程思维', 32 | '熟练使用requests/selenium/undetected_chromedriver等库进行数据爬取与解析', 33 | '熟悉数据分析库、机器学习库以及深度学习框架,如Pandas/Numpy/sklearn/Pytorch的使用', 34 | '熟练使用各种 AI 大语言模型,熟悉开源大模型的微调方法与流程,AIGC和 prompt 提示工程', 35 | '熟悉机器学习流程及常见算法模型,如KNN/Kmeans/DBSCAN/Apriori/FP-growth/LOF/孤立森林等算法', 36 | '熟悉深度学习,自然语言处理常见算法模型,如RNN/GPT/BART/同向量/Transformer/Ner等,了解轻量化模型、预训练模型和论文模型微调复现等', 37 | '熟悉Elasticsearch/Mysql等常用数据库,熟悉SQL和ES查询语法', 38 | '熟悉多种向量数据库的使用,如Qdrant, Pinecone, Milvus等' 39 | ], 40 | educationExperience: [ 41 | { 42 | school: "野鸡大学", 43 | degree: "本科", 44 | startDate: "20xx.09", 45 | endDate: "20xx.06" 46 | } 47 | ], 48 | workExperience: [ 49 | { 50 | company: 'xxxxx(广州)有限公司', 51 | position: '数据分析师 IT部', 52 | startDate: '2021.10', 53 | endDate: '2024-05-10', 54 | description: [ 55 | '拥有多次从 0 到 1 的项目经验,领导团队成功完成项目全周期,涵盖规划、需求分析、技术选型、开发、测试和交付。通过协调沟通,确保团队高效运作,最终实现高质量项目交付。', 56 | '根据数据项目或客户需求,调研数据源并爬取采集相应数据,清洗、整理、标准化为可用数据并入库;深挖数据特点,关联关系与原因分析,为客户完成合格的数据报告。', 57 | '承担负责产品项目的后期维护工作,确保产品持续正常运行,为客户提供高价值数据服务。', 58 | '广泛运用多种AI工具,包括AIGC内容生成、实体提取、优化项目任务处理流程,全面提升项目执行效率。' 59 | ] 60 | }, 61 | { 62 | company: 'xxxx有限公司', 63 | position: '数据挖掘工程师 IT部', 64 | startDate: '2020.08', 65 | endDate: '2021.10', 66 | description: [ 67 | '深入调研算法,根据业务需求评估其适用性,精选最合适的算法进行数据挖掘。', 68 | '结合具体业务,对获得的数据进行细致清洗、挖掘与分析,建立模型基线。', 69 | '构建算法模型处理系统业务数据,及时发现关联或异常行为并输出相关提示信息。', 70 | '输出详实数据分析报告,剖析数据的业务解释性,通过可视化展示正负样本数据差异,为业务优化提供有力的数据支持。' 71 | ] 72 | }, 73 | { 74 | company: '广州xxxx有限公司', 75 | position: '数据分析师 产品部', 76 | startDate: '2018.08', 77 | endDate: '2020.07', 78 | description: [ 79 | '运用专业工具对数据进行采集、清洗和过滤处理。', 80 | '结合业务特点,构建分析主题,进行深度数据分析和挖掘。', 81 | '搭建数据产品,完善产品的数据体系,实现可视化展示。', 82 | '制定用户分类和产品评估模型,为公司决策提供可靠的数据支持。' 83 | ] 84 | } 85 | ], 86 | projectExperience: [ 87 | { 88 | projectName: 'Saas平台功能开发-后端开发', 89 | projectStartTime: '2023.10', 90 | projectEndTime: '2024.05', 91 | projectDescription: '项目背景:面向内部员工的STEAM平台和面向用户的GRIP平台的功能开发,帮助员工更方便地为客户提供咨询服务。', 92 | projectResponsibility: [ 93 | 'STEAM 可视化配置模块功能,证书申请文件管理模块等开发', 94 | 'GRIP 产品简报功能模块,产品魔方中国NMPA数据展示模块,不良事件数据展示模块开发' 95 | ] 96 | }, 97 | { 98 | projectName: 'AIGC 自动生成说明书 - 项目负责人', 99 | projectStartTime: '2023.03', 100 | projectEndTime: '2023.10', 101 | projectDescription: '项目背景:传统产品说明书定稿一般需要 2-3 个月,本项目为制造商提供符合标准的产品说明书,大大缩短说明书的撰写周期,加快产品注册流程。', 102 | projectResponsibility: [ 103 | '国家标准内容要点拆解,制定拆解规范的标准流程', 104 | '医疗器械产品分类管理,不同章节的提示词管理与配置', 105 | '生成产品说明书章节的质量控制、评估与优化调整', 106 | '自动化配置提示词,与说明书质量检测报告输出' 107 | ] 108 | }, 109 | { 110 | projectName: 'AIGC 完全自动数据分析可视化 - 个人项目', 111 | projectStartTime: '2023.05', 112 | projectEndTime: '2023.07', 113 | projectDescription: '项目背景:通过 GPT 实现自动数据分析,数据挖掘与数据可视化全流程,完全解放数据分析可视化的工作流程,加快数据的分析速度以及挖掘更多的数据价值维度。', 114 | projectResponsibility: [ 115 | '项目架构方案设计,全自动数据分析流程方案设计', 116 | '数据可视化方案调研与定稿,并最终选用streamlit和pyecharts的可视化方案', 117 | '完整自动化数据分析可视化流程的代码实现,通过 GPT 完全自动化生成图表数据以及图表描述信息' 118 | ] 119 | }, 120 | { 121 | projectName: 'AI 翻译软件 - 项目负责人', 122 | projectStartTime: '2023.02', 123 | projectEndTime: '2023.04', 124 | projectDescription: '项目背景:基于 GPT 大语言模型强大的翻译能力和学习能力,为GPT提供最新、最准确、和最专业的术语和记忆库参考资料,通过 RAG 检索增强生成,弥补GPT训练数据的缺失,提高模型翻译的精准度。', 125 | projectResponsibility: [ 126 | '翻译软件技术方案设计,翻译文本的实体提取与知识库向量检索', 127 | '术语库和记忆库的数据收集、数据处理与数据入库,作为翻译参考的重要知识库数据', 128 | '完整翻译流程代码的编写,包括文本切分,实体提取,向量检索与GPT 返回结果的标准化处理', 129 | '规范化 GPT 返回的结果处理流程,合理管理提示词上下文,实现GPT 能够翻译超长文本' 130 | ] 131 | }, 132 | { 133 | projectName: '全球法规雷达 - 项目负责人', 134 | projectStartTime: '2022.03', 135 | projectEndTime: '2023.02', 136 | projectDescription: '项目背景:本项目在医疗器械生命周期中属于第一个时期,它为制造商的产品出海提供最新法规指南与政策,一站式获取医疗注册的准入流程和对应的最新最权威的全球法规信息,让制造商有的放矢,精准注册。', 137 | projectResponsibility: [ 138 | '成立法规资讯项目,进行整个项目的产品方案与技术方案的设计与评审', 139 | '全球法规官方资讯信息收集汇总,数据采集与评估分类,目前上线 35+国家地区法规资讯,100+国家地区相关法规完整文件', 140 | '不同网页的样式归一化数据结构设计,后端接口编写并与前端进行联调上线', 141 | '编写数据采集模板代码,规范标准化数据采集工作,极大加速数据采集进程', 142 | '设计法规资讯标签提取,主题分类与相关文章搜索推荐方案', 143 | '使用GPT大语言模型对法规资讯进行实体提取,概要信息总结' 144 | ] 145 | }, 146 | { 147 | projectName: '全球经销商医械市场监控 - 数据负责人', 148 | projectStartTime: '2021.10', 149 | projectEndTime: '2022.03', 150 | projectDescription: '项目背景:本项目为医械制造企业产品上市的重要工具,帮助制造商企业发现全球各大相关产品经销商信息,助力制造商企业完成出海的「最后一公里」,让中国产品快速走向世界。', 151 | projectResponsibility: [ 152 | '信源调研与数据评估,覆盖 40+国家总数,数据量超 60W', 153 | '数据采集,清洗处理与数据校验', 154 | '数据补充,增加各国黄页信息或官方登记信息,收集bing搜索引擎信息', 155 | '数据相似度匹配以对齐基础数据与补充数据,增加数据维度,为客户提供更有价值的数据产品' 156 | ] 157 | }, 158 | { 159 | projectName: '网络通信内容智能异常检测', 160 | projectStartTime: '2021.02', 161 | projectEndTime: '2021.09', 162 | projectDescription: '项目背景:传统通信内容的异常检测和分析通常基于固定规则或特征值匹配,无法检测出精心伪造的高级攻击行为。对于流量巨大的业务而言,伪造的攻击流量通常被大量正常业务流量淹没,导致攻击行为不被传统检测方法发现。', 163 | projectResponsibility: [ 164 | '了解数据的业务说明,异常检测算法调研,根据数据的特点评估算法适用性', 165 | '数据清洗处理、特征工程、定义畸形数据与构建AutoEncoder深度学习异常检测算法模型基线', 166 | '根据基线模型的表现,尝试构建更优的算法模型如离群因子检测算法LOF,提高检测效率与检测结果的可解释性', 167 | '测试环境算法模型部署与联调,模型优化,输出算法检测结果,汇报工作进展与解释检测结果含义' 168 | ] 169 | }, 170 | { 171 | projectName: '告警信息关联规则挖掘', 172 | projectStartTime: '2020.11', 173 | projectEndTime: '2021.02', 174 | projectDescription: '项目背景:为解决数据孤岛问题充分挖掘数据价值,本项目在数据挖掘过程中将系统告警信息通过攻击链路验证、行为模式等关联规则分析方法进行关联性数据挖掘。目的是要从大量告警序列中,挖掘告警事件前后关联性,用于预测告警事件的发展趋势。', 175 | projectResponsibility: [ 176 | '业务数据探索性分析,算法方案预研,基于不同角度对告警数据进行关联分析', 177 | '数据清洗处理、特征工程与FP-growth/Prefixspan关联规则算法模型搭建', 178 | '数据库储存表结构设计,对接ES与MongoDB数据库进行数据的抽取与储存', 179 | '测试环境算法模型部署与联调,协调各组对接前端进行调试结果展示', 180 | '输出数据挖掘成果,定期汇报工作进展' 181 | ] 182 | }, 183 | { 184 | projectName: '网络通信内容智能异常检测', 185 | projectStartTime: '2021.02', 186 | projectEndTime: '2021.09', 187 | projectDescription: '项目背景:传统通信内容的异常检测和分析通常基于固定规则或特征值匹配,无法检测出精心伪造的高级攻击行为。对于流量巨大的业务而言,伪造的攻击流量通常被大量正常业务流量淹没,导致攻击行为不被传统检测方法发现。', 188 | projectResponsibility: [ 189 | '了解数据的业务说明,异常检测算法调研,根据数据的特点评估算法适用性', 190 | '数据清洗处理、特征工程、定义畸形数据与构建AutoEncoder深度学习异常检测算法模型基线', 191 | '根据基线模型的表现,尝试构建更优的算法模型如离群因子检测算法LOF,提高检测效率与检测结果的可解释性', 192 | '测试环境算法模型部署与联调,模型优化,输出算法检测结果,汇报工作进展与解释检测结果含义' 193 | ] 194 | } 195 | ] 196 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | .yarn/install-state.gz 8 | .vscode 9 | .VSCodeCounter 10 | demo.* 11 | # testing 12 | /coverage 13 | 14 | # next.js 15 | /.next/ 16 | /out/ 17 | .next/ 18 | node_modules 19 | 20 | # production 21 | /build 22 | 23 | # misc 24 | .DS_Store 25 | *.pem 26 | 27 | # debug 28 | npm-debug.log* 29 | yarn-debug.log* 30 | yarn-error.log* 31 | 32 | # local env files 33 | .env*.local 34 | 35 | # vercel 36 | .vercel 37 | 38 | # typescript 39 | *.tsbuildinfo 40 | next-env.d.ts 41 | # Logs 42 | logs 43 | *.log 44 | npm-debug.log* 45 | yarn-debug.log* 46 | yarn-error.log* 47 | lerna-debug.log* 48 | .pnpm-debug.log* 49 | 50 | # Diagnostic reports (https://nodejs.org/api/report.html) 51 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 52 | 53 | # Runtime data 54 | pids 55 | *.pid 56 | *.seed 57 | *.pid.lock 58 | 59 | # Directory for instrumented libs generated by jscoverage/JSCover 60 | lib-cov 61 | 62 | # Coverage directory used by tools like istanbul 63 | coverage 64 | *.lcov 65 | 66 | # nyc test coverage 67 | .nyc_output 68 | 69 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 70 | .grunt 71 | 72 | # Bower dependency directory (https://bower.io/) 73 | bower_components 74 | 75 | # node-waf configuration 76 | .lock-wscript 77 | 78 | # Compiled binary addons (https://nodejs.org/api/addons.html) 79 | build/Release 80 | 81 | # Dependency directories 82 | node_modules/ 83 | jspm_packages/ 84 | 85 | # Snowpack dependency directory (https://snowpack.dev/) 86 | web_modules/ 87 | 88 | # TypeScript cache 89 | *.tsbuildinfo 90 | 91 | # Optional npm cache directory 92 | .npm 93 | 94 | # Optional eslint cache 95 | .eslintcache 96 | 97 | # Optional stylelint cache 98 | .stylelintcache 99 | 100 | # Microbundle cache 101 | .rpt2_cache/ 102 | .rts2_cache_cjs/ 103 | .rts2_cache_es/ 104 | .rts2_cache_umd/ 105 | 106 | # Optional REPL history 107 | .node_repl_history 108 | 109 | # Output of 'npm pack' 110 | *.tgz 111 | 112 | # Yarn Integrity file 113 | .yarn-integrity 114 | 115 | # dotenv environment variable files 116 | .env 117 | .env.development.local 118 | .env.test.local 119 | .env.production.local 120 | .env.local 121 | 122 | # parcel-bundler cache (https://parceljs.org/) 123 | .cache 124 | .parcel-cache 125 | 126 | # Next.js build output 127 | .next 128 | out 129 | 130 | # Nuxt.js build / generate output 131 | .nuxt 132 | dist 133 | 134 | # Gatsby files 135 | .cache/ 136 | # Comment in the public line in if your project uses Gatsby and not Next.js 137 | # https://nextjs.org/blog/next-9-1#public-directory-support 138 | # public 139 | 140 | # vuepress build output 141 | .vuepress/dist 142 | 143 | # vuepress v2.x temp and cache directory 144 | .temp 145 | .cache 146 | 147 | # Docusaurus cache and generated files 148 | .docusaurus 149 | 150 | # Serverless directories 151 | .serverless/ 152 | 153 | # FuseBox cache 154 | .fusebox/ 155 | 156 | # DynamoDB Local files 157 | .dynamodb/ 158 | 159 | # TernJS port file 160 | .tern-port 161 | 162 | # Stores VSCode versions used for testing VSCode extensions 163 | .vscode-test 164 | 165 | # yarn v2 166 | .yarn/cache 167 | .yarn/unplugged 168 | .yarn/build-state.yml 169 | .yarn/install-state.gz 170 | .pnp.* 171 | # Logs 172 | logs 173 | *.log 174 | npm-debug.log* 175 | yarn-debug.log* 176 | yarn-error.log* 177 | lerna-debug.log* 178 | .pnpm-debug.log* 179 | 180 | # Diagnostic reports (https://nodejs.org/api/report.html) 181 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 182 | 183 | # Runtime data 184 | pids 185 | *.pid 186 | *.seed 187 | *.pid.lock 188 | 189 | # Directory for instrumented libs generated by jscoverage/JSCover 190 | lib-cov 191 | 192 | # Coverage directory used by tools like istanbul 193 | coverage 194 | *.lcov 195 | 196 | # nyc test coverage 197 | .nyc_output 198 | 199 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 200 | .grunt 201 | 202 | # Bower dependency directory (https://bower.io/) 203 | bower_components 204 | 205 | # node-waf configuration 206 | .lock-wscript 207 | 208 | # Compiled binary addons (https://nodejs.org/api/addons.html) 209 | build/Release 210 | 211 | # Dependency directories 212 | node_modules/ 213 | jspm_packages/ 214 | 215 | # Snowpack dependency directory (https://snowpack.dev/) 216 | web_modules/ 217 | 218 | # TypeScript cache 219 | *.tsbuildinfo 220 | 221 | # Optional npm cache directory 222 | .npm 223 | 224 | # Optional eslint cache 225 | .eslintcache 226 | 227 | # Optional stylelint cache 228 | .stylelintcache 229 | 230 | # Microbundle cache 231 | .rpt2_cache/ 232 | .rts2_cache_cjs/ 233 | .rts2_cache_es/ 234 | .rts2_cache_umd/ 235 | 236 | # Optional REPL history 237 | .node_repl_history 238 | 239 | # Output of 'npm pack' 240 | *.tgz 241 | 242 | # Yarn Integrity file 243 | .yarn-integrity 244 | 245 | # dotenv environment variable files 246 | .env 247 | .env.development.local 248 | .env.test.local 249 | .env.production.local 250 | .env.local 251 | 252 | # parcel-bundler cache (https://parceljs.org/) 253 | .cache 254 | .parcel-cache 255 | 256 | # Next.js build output 257 | .next 258 | out 259 | 260 | # Nuxt.js build / generate output 261 | .nuxt 262 | dist 263 | 264 | # Gatsby files 265 | .cache/ 266 | # Comment in the public line in if your project uses Gatsby and not Next.js 267 | # https://nextjs.org/blog/next-9-1#public-directory-support 268 | # public 269 | 270 | # vuepress build output 271 | .vuepress/dist 272 | 273 | # vuepress v2.x temp and cache directory 274 | .temp 275 | .cache 276 | 277 | # Docusaurus cache and generated files 278 | .docusaurus 279 | 280 | # Serverless directories 281 | .serverless/ 282 | 283 | # FuseBox cache 284 | .fusebox/ 285 | 286 | # DynamoDB Local files 287 | .dynamodb/ 288 | 289 | # TernJS port file 290 | .tern-port 291 | 292 | # Stores VSCode versions used for testing VSCode extensions 293 | .vscode-test 294 | 295 | # yarn v2 296 | .yarn/cache 297 | .yarn/unplugged 298 | .yarn/build-state.yml 299 | .yarn/install-state.gz 300 | .pnp.* 301 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 302 | 303 | # dependencies 304 | /node_modules 305 | /.pnp 306 | .pnp.js 307 | .yarn/install-state.gz 308 | .vscode 309 | .VSCodeCounter 310 | demo.* 311 | # testing 312 | /coverage 313 | 314 | # next.js 315 | /.next/ 316 | /out/ 317 | .next/ 318 | node_modules 319 | 320 | # production 321 | /build 322 | 323 | # misc 324 | .DS_Store 325 | *.pem 326 | 327 | # debug 328 | npm-debug.log* 329 | yarn-debug.log* 330 | yarn-error.log* 331 | 332 | # local env files 333 | .env*.local 334 | 335 | # vercel 336 | .vercel 337 | 338 | # typescript 339 | *.tsbuildinfo 340 | next-env.d.ts 341 | # Logs 342 | logs 343 | *.log 344 | npm-debug.log* 345 | yarn-debug.log* 346 | yarn-error.log* 347 | lerna-debug.log* 348 | .pnpm-debug.log* 349 | 350 | # Diagnostic reports (https://nodejs.org/api/report.html) 351 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 352 | 353 | # Runtime data 354 | pids 355 | *.pid 356 | *.seed 357 | *.pid.lock 358 | 359 | # Directory for instrumented libs generated by jscoverage/JSCover 360 | lib-cov 361 | 362 | # Coverage directory used by tools like istanbul 363 | coverage 364 | *.lcov 365 | 366 | # nyc test coverage 367 | .nyc_output 368 | 369 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 370 | .grunt 371 | 372 | # Bower dependency directory (https://bower.io/) 373 | bower_components 374 | 375 | # node-waf configuration 376 | .lock-wscript 377 | 378 | # Compiled binary addons (https://nodejs.org/api/addons.html) 379 | build/Release 380 | 381 | # Dependency directories 382 | node_modules/ 383 | jspm_packages/ 384 | 385 | # Snowpack dependency directory (https://snowpack.dev/) 386 | web_modules/ 387 | 388 | # TypeScript cache 389 | *.tsbuildinfo 390 | 391 | # Optional npm cache directory 392 | .npm 393 | 394 | # Optional eslint cache 395 | .eslintcache 396 | 397 | # Optional stylelint cache 398 | .stylelintcache 399 | 400 | # Microbundle cache 401 | .rpt2_cache/ 402 | .rts2_cache_cjs/ 403 | .rts2_cache_es/ 404 | .rts2_cache_umd/ 405 | 406 | # Optional REPL history 407 | .node_repl_history 408 | 409 | # Output of 'npm pack' 410 | *.tgz 411 | 412 | # Yarn Integrity file 413 | .yarn-integrity 414 | 415 | # dotenv environment variable files 416 | .env 417 | .env.development.local 418 | .env.test.local 419 | .env.production.local 420 | .env.local 421 | 422 | # parcel-bundler cache (https://parceljs.org/) 423 | .cache 424 | .parcel-cache 425 | 426 | # Next.js build output 427 | .next 428 | out 429 | 430 | # Nuxt.js build / generate output 431 | .nuxt 432 | dist 433 | 434 | # Gatsby files 435 | .cache/ 436 | # Comment in the public line in if your project uses Gatsby and not Next.js 437 | # https://nextjs.org/blog/next-9-1#public-directory-support 438 | # public 439 | 440 | # vuepress build output 441 | .vuepress/dist 442 | 443 | # vuepress v2.x temp and cache directory 444 | .temp 445 | .cache 446 | 447 | # Docusaurus cache and generated files 448 | .docusaurus 449 | 450 | # Serverless directories 451 | .serverless/ 452 | 453 | # FuseBox cache 454 | .fusebox/ 455 | 456 | # DynamoDB Local files 457 | .dynamodb/ 458 | 459 | # TernJS port file 460 | .tern-port 461 | 462 | # Stores VSCode versions used for testing VSCode extensions 463 | .vscode-test 464 | 465 | # yarn v2 466 | .yarn/cache 467 | .yarn/unplugged 468 | .yarn/build-state.yml 469 | .yarn/install-state.gz 470 | .pnp.* 471 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | --------------------------------------------------------------------------------