添加简历生成项目文件
- 添加 .gitignore 配置 - 添加 HTML 简历模板 (resume.html) - 添加转换脚本 (convert.js, convert.py) - 添加字体下载脚本 (download_font.js) - 添加项目配置 (package.json)
This commit is contained in:
+26
@@ -0,0 +1,26 @@
|
||||
# Dependencies
|
||||
node_modules/
|
||||
package-lock.json
|
||||
|
||||
# Playwright
|
||||
test-results/
|
||||
playwright-report/
|
||||
blob-report/
|
||||
.playwright/
|
||||
|
||||
# Generated output
|
||||
resume_output.jpg
|
||||
|
||||
# Fonts (downloaded/generated)
|
||||
fonts/
|
||||
|
||||
# OS files
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
|
||||
# IDE
|
||||
.vscode/
|
||||
.idea/
|
||||
*.swp
|
||||
*.swo
|
||||
*~
|
||||
+42
@@ -0,0 +1,42 @@
|
||||
const { chromium } = require('playwright');
|
||||
const path = require('path');
|
||||
|
||||
async function htmlToJpg() {
|
||||
// Launch browser with custom library path
|
||||
const browser = await chromium.launch({
|
||||
env: {
|
||||
...process.env,
|
||||
LD_LIBRARY_PATH: '/tmp/libs/usr/lib/x86_64-linux-gnu:' + (process.env.LD_LIBRARY_PATH || '')
|
||||
}
|
||||
});
|
||||
const page = await browser.newPage();
|
||||
|
||||
// Set viewport to A4 size (210mm x 297mm at 96dpi)
|
||||
await page.setViewportSize({ width: 794, height: 1123 });
|
||||
|
||||
// Load the HTML file
|
||||
const htmlPath = path.join(__dirname, 'resume.html');
|
||||
await page.goto(`file://${htmlPath}`, { waitUntil: 'networkidle' });
|
||||
|
||||
// Get the actual page height
|
||||
const bodyHeight = await page.evaluate(() => document.body.scrollHeight);
|
||||
|
||||
// Set viewport to full page height
|
||||
await page.setViewportSize({ width: 794, height: bodyHeight });
|
||||
|
||||
// Take a full-page screenshot
|
||||
const outputPath = path.join(__dirname, 'resume_output.jpg');
|
||||
await page.screenshot({
|
||||
path: outputPath,
|
||||
fullPage: true,
|
||||
type: 'jpeg',
|
||||
quality: 95,
|
||||
});
|
||||
|
||||
console.log(`Screenshot saved to: ${outputPath}`);
|
||||
console.log(`Page dimensions: 794 x ${bodyHeight}`);
|
||||
|
||||
await browser.close();
|
||||
}
|
||||
|
||||
htmlToJpg().catch(console.error);
|
||||
+63
@@ -0,0 +1,63 @@
|
||||
import subprocess
|
||||
import sys
|
||||
|
||||
# Install required packages
|
||||
def install_packages():
|
||||
packages = ['imgkit', 'Pillow']
|
||||
for package in packages:
|
||||
try:
|
||||
__import__(package.lower().replace('-', '_'))
|
||||
except ImportError:
|
||||
print(f"Installing {package}...")
|
||||
subprocess.check_call([sys.executable, "-m", "pip", "install", package])
|
||||
|
||||
install_packages()
|
||||
|
||||
import imgkit
|
||||
from PIL import Image
|
||||
import os
|
||||
|
||||
def html_to_jpg(html_file, output_file, width=2478):
|
||||
"""Convert HTML file to high-quality JPG"""
|
||||
|
||||
# First, check if wkhtmltopdf/wkhtmltoimage is installed
|
||||
try:
|
||||
subprocess.run(['wkhtmltoimage', '--version'], capture_output=True, check=True)
|
||||
except FileNotFoundError:
|
||||
print("wkhtmltoimage not found. Please install it:")
|
||||
print("sudo apt-get install wkhtmltopdf")
|
||||
print("Or download from: https://wkhtmltopdf.org/downloads.html")
|
||||
return False
|
||||
|
||||
# Convert HTML to JPG using imgkit
|
||||
options = {
|
||||
'format': 'jpg',
|
||||
'quality': 100,
|
||||
'width': width,
|
||||
'enable-local-file-access': '',
|
||||
'encoding': 'UTF-8',
|
||||
'no-stop-slow-scripts': '',
|
||||
}
|
||||
|
||||
try:
|
||||
imgkit.from_file(html_file, output_file, options=options)
|
||||
print(f"Successfully converted {html_file} to {output_file}")
|
||||
|
||||
# Verify the output
|
||||
with Image.open(output_file) as img:
|
||||
print(f"Output image size: {img.size}")
|
||||
print(f"Output image mode: {img.mode}")
|
||||
|
||||
return True
|
||||
except Exception as e:
|
||||
print(f"Error converting HTML to JPG: {e}")
|
||||
return False
|
||||
|
||||
if __name__ == "__main__":
|
||||
html_file = "/home/wonder/code/resume/resume.html"
|
||||
output_file = "/home/wonder/code/resume/resume_output.jpg"
|
||||
|
||||
if html_to_jpg(html_file, output_file):
|
||||
print(f"\nOutput saved to: {output_file}")
|
||||
else:
|
||||
print("Conversion failed!")
|
||||
@@ -0,0 +1,38 @@
|
||||
const https = require('https');
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
|
||||
function downloadFile(url, dest) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const file = fs.createWriteStream(dest);
|
||||
https.get(url, (response) => {
|
||||
response.pipe(file);
|
||||
file.on('finish', () => {
|
||||
file.close();
|
||||
resolve();
|
||||
});
|
||||
}).on('error', (err) => {
|
||||
fs.unlink(dest, () => {});
|
||||
reject(err);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
async function downloadFonts() {
|
||||
const fontsDir = path.join(__dirname, 'fonts');
|
||||
|
||||
// Download Noto Sans SC Regular
|
||||
const regularUrl = 'https://fonts.gstatic.com/s/notosanssc/v37/k3kCo84MPvpLmixcA63oeAL7Iqp5IZJF9bmaG9_FnYxNbPzS5HE.ttf';
|
||||
const boldUrl = 'https://fonts.gstatic.com/s/notosanssc/v37/k3kCo84MPvpLmixcA63oeAL7Iqp5IZJF9bmaG9_EnYxNbPzS5HE.ttf';
|
||||
|
||||
try {
|
||||
await downloadFile(regularUrl, path.join(fontsDir, 'NotoSansSC-Regular.ttf'));
|
||||
console.log('Downloaded NotoSansSC-Regular.ttf');
|
||||
await downloadFile(boldUrl, path.join(fontsDir, 'NotoSansSC-Bold.ttf'));
|
||||
console.log('Downloaded NotoSansSC-Bold.ttf');
|
||||
} catch (err) {
|
||||
console.error('Error downloading fonts:', err);
|
||||
}
|
||||
}
|
||||
|
||||
downloadFonts();
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"playwright": "^1.61.1",
|
||||
"playwright-core": "^1.61.1"
|
||||
}
|
||||
}
|
||||
+433
@@ -0,0 +1,433 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>何朝晖 - 简历</title>
|
||||
<style>
|
||||
* {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
body {
|
||||
font-family: "Microsoft YaHei", Arial, sans-serif;
|
||||
background: #ffffff;
|
||||
color: #222222;
|
||||
line-height: 1.4;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.page {
|
||||
width: 794px;
|
||||
min-height: 1123px;
|
||||
margin: 0 auto;
|
||||
padding: 20px 36px;
|
||||
background: #ffffff;
|
||||
}
|
||||
|
||||
/* Header */
|
||||
.header {
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
.name {
|
||||
font-size: 28px;
|
||||
font-weight: 800;
|
||||
color: #222222;
|
||||
margin-bottom: 3px;
|
||||
letter-spacing: 1px;
|
||||
}
|
||||
|
||||
.contact-info {
|
||||
font-size: 12px;
|
||||
color: #222;
|
||||
line-height: 1.45;
|
||||
}
|
||||
|
||||
.contact-line {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 18px;
|
||||
margin-bottom: 1px;
|
||||
}
|
||||
|
||||
.contact-item {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.position-line {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-top: 1px;
|
||||
}
|
||||
|
||||
.website-line {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-top: 1px;
|
||||
}
|
||||
|
||||
/* Section */
|
||||
.section {
|
||||
margin-bottom: 6px;
|
||||
}
|
||||
|
||||
.section-title {
|
||||
font-size: 14px;
|
||||
font-weight: 700;
|
||||
color: #4478DF;
|
||||
padding: 3px 10px;
|
||||
border-left: 3px solid #4478DF;
|
||||
background-color: #EEF3FF;
|
||||
margin-bottom: 4px;
|
||||
line-height: 1.3;
|
||||
}
|
||||
|
||||
/* Education */
|
||||
.edu-header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: baseline;
|
||||
margin-bottom: 3px;
|
||||
}
|
||||
|
||||
.edu-school {
|
||||
font-size: 14px;
|
||||
font-weight: 700;
|
||||
color: #222;
|
||||
}
|
||||
|
||||
.edu-major {
|
||||
font-size: 13px;
|
||||
color: #888;
|
||||
margin-left: 10px;
|
||||
}
|
||||
|
||||
.edu-degree {
|
||||
font-size: 13px;
|
||||
color: #888;
|
||||
margin-left: 10px;
|
||||
}
|
||||
|
||||
.edu-date {
|
||||
font-size: 13px;
|
||||
color: #888;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.edu-items {
|
||||
margin-left: 12px;
|
||||
font-size: 13px;
|
||||
color: #252525;
|
||||
line-height: 1.45;
|
||||
}
|
||||
|
||||
.edu-items li {
|
||||
list-style-type: disc;
|
||||
margin-left: 6px;
|
||||
}
|
||||
|
||||
/* Honors */
|
||||
.honor-item {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: baseline;
|
||||
margin-bottom: 2px;
|
||||
font-size: 13px;
|
||||
line-height: 1.45;
|
||||
}
|
||||
|
||||
.honor-content {
|
||||
color: #222;
|
||||
}
|
||||
|
||||
.honor-date {
|
||||
color: #888;
|
||||
white-space: nowrap;
|
||||
margin-left: 10px;
|
||||
}
|
||||
|
||||
.cert-link {
|
||||
color: #4478DF;
|
||||
text-decoration: none;
|
||||
margin-left: 6px;
|
||||
font-size: 13px;
|
||||
}
|
||||
|
||||
/* Experience */
|
||||
.exp-header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: baseline;
|
||||
margin-bottom: 1px;
|
||||
}
|
||||
|
||||
.exp-company {
|
||||
font-size: 14px;
|
||||
font-weight: 700;
|
||||
color: #222;
|
||||
}
|
||||
|
||||
.exp-date {
|
||||
font-size: 13px;
|
||||
color: #888;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.exp-sub {
|
||||
font-size: 12px;
|
||||
color: #888;
|
||||
margin-bottom: 3px;
|
||||
}
|
||||
|
||||
.exp-items {
|
||||
margin-left: 12px;
|
||||
font-size: 13px;
|
||||
color: #252525;
|
||||
line-height: 1.45;
|
||||
}
|
||||
|
||||
.exp-items li {
|
||||
list-style-type: disc;
|
||||
margin-left: 6px;
|
||||
margin-bottom: 0px;
|
||||
}
|
||||
|
||||
/* Project */
|
||||
.proj-header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: baseline;
|
||||
margin-bottom: 1px;
|
||||
}
|
||||
|
||||
.proj-name {
|
||||
font-size: 14px;
|
||||
font-weight: 700;
|
||||
color: #222;
|
||||
}
|
||||
|
||||
.proj-date {
|
||||
font-size: 13px;
|
||||
color: #888;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.proj-sub {
|
||||
font-size: 12px;
|
||||
color: #888;
|
||||
margin-bottom: 2px;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
.proj-link {
|
||||
color: #4478DF;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.proj-intro {
|
||||
font-size: 13px;
|
||||
color: #252525;
|
||||
margin-left: 12px;
|
||||
line-height: 1.45;
|
||||
margin-bottom: 3px;
|
||||
}
|
||||
|
||||
.proj-work-title {
|
||||
font-size: 13px;
|
||||
font-weight: 700;
|
||||
color: #222;
|
||||
margin-bottom: 2px;
|
||||
}
|
||||
|
||||
.proj-work-items {
|
||||
margin-left: 12px;
|
||||
font-size: 13px;
|
||||
color: #252525;
|
||||
line-height: 1.45;
|
||||
}
|
||||
|
||||
.proj-work-items li {
|
||||
list-style-type: decimal;
|
||||
margin-left: 12px;
|
||||
margin-bottom: 0px;
|
||||
}
|
||||
|
||||
/* Skills */
|
||||
.skill-items {
|
||||
margin-left: 12px;
|
||||
font-size: 13px;
|
||||
color: #252525;
|
||||
line-height: 1.45;
|
||||
}
|
||||
|
||||
.skill-items li {
|
||||
list-style-type: disc;
|
||||
margin-left: 6px;
|
||||
margin-bottom: 0px;
|
||||
}
|
||||
|
||||
/* SVG Icons */
|
||||
.svg-icon {
|
||||
width: 14px;
|
||||
height: 14px;
|
||||
fill: #4478DF;
|
||||
vertical-align: middle;
|
||||
margin-right: 5px;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="page">
|
||||
<!-- Header -->
|
||||
<div class="header">
|
||||
<div class="name">何朝晖</div>
|
||||
<div class="contact-info">
|
||||
<div class="contact-line">
|
||||
<div class="contact-item">
|
||||
<svg class="svg-icon" viewBox="0 0 24 24"><path d="M6.62 10.79c1.44 2.83 3.76 5.14 6.59 6.59l2.2-2.2c.27-.27.67-.36 1.02-.24 1.12.37 2.33.57 3.57.57.55 0 1 .45 1 1V20c0 .55-.45 1-1 1-9.39 0-17-7.61-17-17 0-.55.45-1 1-1h3.5c.55 0 1 .45 1 1 0 1.25.2 2.45.57 3.57.11.35.03.74-.25 1.02l-2.2 2.2z"/></svg>
|
||||
15671623703
|
||||
</div>
|
||||
<div class="contact-item">
|
||||
<svg class="svg-icon" viewBox="0 0 24 24"><path d="M20 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 4l-8 5-8-5V6l8 5 8-5v2z"/></svg>
|
||||
hezhaohui0807@163.com
|
||||
</div>
|
||||
</div>
|
||||
<div class="position-line">
|
||||
<svg class="svg-icon" viewBox="0 0 24 24"><path d="M20 6h-4V4c0-1.11-.89-2-2-2h-4c-1.11 0-2 .89-2 2v2H4c-1.11 0-1.99.89-1.99 2L2 19c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2V8c0-1.11-.89-2-2-2zm-6 0h-4V4h4v2z"/></svg>
|
||||
全栈开发(Go/Java后端)
|
||||
</div>
|
||||
<div class="website-line">
|
||||
<svg class="svg-icon" viewBox="0 0 24 24"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-1 17.93c-3.95-.49-7-3.85-7-7.93 0-.62.08-1.21.21-1.79L9 15v1c0 1.1.9 2 2 2v1.93zm6.9-2.54c-.26-.81-1-1.39-1.9-1.39h-1v-3c0-.55-.45-1-1-1H8v-2h2c.55 0 1-.45 1-1V7h2c1.1 0 2-.9 2-2v-.41c2.93 1.19 5 4.06 5 7.41 0 2.08-.8 3.97-2.1 5.39z"/></svg>
|
||||
http://47.121.181.112:8080/resume/
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 教育经历 -->
|
||||
<div class="section">
|
||||
<div class="section-title">教育经历</div>
|
||||
<div class="edu-header">
|
||||
<div>
|
||||
<span class="edu-school">武汉科技大学</span>
|
||||
<span class="edu-major">计算机科学与技术(国家级一流专业)</span>
|
||||
<span class="edu-degree">本科</span>
|
||||
</div>
|
||||
<div class="edu-date">2023-09 ~ 2027-06</div>
|
||||
</div>
|
||||
<ul class="edu-items">
|
||||
<li>2026-03 ~ 2026-05 金山办公 WPS 菁英工程师训练营 全栈方向 Go/React</li>
|
||||
<li>2025-01 ~ 2025-03 字节跳动 MarsCode 青训营 后端方向 Go</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<!-- 荣誉奖项 -->
|
||||
<div class="section">
|
||||
<div class="section-title">荣誉奖项</div>
|
||||
<div class="honor-item">
|
||||
<div class="honor-content">
|
||||
"金山杯"华中地区高校第十八届程序设计邀请赛 三等奖
|
||||
<a href="#" class="cert-link">证书</a>
|
||||
</div>
|
||||
<div class="honor-date">2024-04</div>
|
||||
</div>
|
||||
<div class="honor-item">
|
||||
<div class="honor-content">
|
||||
国际大学生程序设计竞赛(ICPC)湖北省赛 优秀奖
|
||||
<a href="#" class="cert-link">证书</a>
|
||||
</div>
|
||||
<div class="honor-date">2024-06</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 实习经历 -->
|
||||
<div class="section">
|
||||
<div class="section-title">实习经历</div>
|
||||
<div class="exp-header">
|
||||
<div class="exp-company">国家网络安全人才与创新基地 | 武汉金银湖实验室</div>
|
||||
<div class="exp-date">2025-11 ~ 2026-03</div>
|
||||
</div>
|
||||
<div class="exp-sub">平台技术部 后端开发 | 华中科技大学-网络空间安全学院</div>
|
||||
<ul class="exp-items">
|
||||
<li>参与设计 SaaS 多租户架构 的 Tcode 平台,设计租户隔离策略、用户绑定解绑、RBAC 权限模型和树状组织架构。</li>
|
||||
<li>参与数据中台开发,基于 Go 并发模型重构面向多源异构数据的采集服务,引入流量控制机制提升数据处理效率。</li>
|
||||
<li>完善安全检测模块的 RAG 模块,基于金银湖安全大模型,实现结构化输出生成元数据,构建组件漏洞知识图谱。</li>
|
||||
</ul>
|
||||
|
||||
<div class="exp-header" style="margin-top: 10px;">
|
||||
<div class="exp-company">武汉市知无涯教育科技有限公司</div>
|
||||
<div class="exp-date">2025-06 ~ 2025-08</div>
|
||||
</div>
|
||||
<ul class="exp-items">
|
||||
<li>基于 Gitea Actions 搭建 CI/CD 流水线,实现代码提交后触发 Lint 检查、单元测试与镜像构建,全流程自动化部署。</li>
|
||||
<li>采用 Docker 多阶段构建 Dockerfile 压缩镜像体积,集成 Lark SDK 实现流水线状态飞书推送,提升研发交付效率。</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<!-- 项目经历 -->
|
||||
<div class="section">
|
||||
<div class="section-title">项目经历</div>
|
||||
<div class="proj-header">
|
||||
<div class="proj-name">Gen2D 游戏素材生成工具</div>
|
||||
<div class="proj-date">2026-05 ~ 至今</div>
|
||||
</div>
|
||||
<div class="proj-sub">
|
||||
<span>全栈开发 【七牛云 XEngineer 开源项目】</span>
|
||||
<a href="https://gitee.com/hezhaohui123/gen2d" class="proj-link">https://gitee.com/hezhaohui123/gen2d</a>
|
||||
</div>
|
||||
<div class="proj-intro">
|
||||
<strong>项目介绍:</strong><br>
|
||||
基于 Go(Gin) + Eino Agent Graph + GORM + 七牛云 Kodo + React + Zustand 的 AI 2D 游戏素材生成平台。<br>
|
||||
用户输入文本提示词,自动生成风格一致的 Sprite、背景、UI 元素与动画帧,可直接导入 Unity 等主流 2D 游戏引擎。
|
||||
</div>
|
||||
<div class="proj-work-title">主要工作:</div>
|
||||
<ol class="proj-work-items">
|
||||
<li>基于 Eino Graph 构建四阶段 DAG 管线,编排 Prompt 优化、素材生成、质量校验、格式适配四节点有序执行。</li>
|
||||
<li>为提升生成质量稳定性,引入 Reflect 自省机制,自动质检不通过时将拒绝理由回注提示词,同时支持注入用户反馈。</li>
|
||||
<li>在限流方案的选择上,对比计数器、漏桶、窗口等多种限流机制,选用 go-redis 实现分布式的令牌桶算法限流。</li>
|
||||
<li>针对 LLM 请求耗时长特性,设计自定义 IO 密集型协程池和 RabbitMQ 消息队列,实现模型调用并发化和异步化。</li>
|
||||
</ol>
|
||||
|
||||
<div class="proj-header" style="margin-top: 12px;">
|
||||
<div class="proj-name">ThumbUP 高并发点赞系统</div>
|
||||
<div class="proj-date">2025-10 ~ 2025-11</div>
|
||||
</div>
|
||||
<div class="proj-sub">
|
||||
<span>后端开发 【哔哩哔哩技术团队文章复现】</span>
|
||||
<a href="http://47.121.181.112:3000/wonder/thumb-up" class="proj-link">http://47.121.181.112:3000/wonder/thumb-up</a>
|
||||
</div>
|
||||
<div class="proj-intro">
|
||||
<strong>项目介绍:</strong><br>
|
||||
基于 Spring Boot 3 + Redis + Caffeine + HeavyKeeper + MyBatis-Plus 的高并发点赞系统。<br>
|
||||
采用 Write-Behind 异步写回架构,写入由 Redis 承接后定时批量落库;读取走 Caffeine、Redis 二级缓存加速。
|
||||
</div>
|
||||
<div class="proj-work-title">主要工作:</div>
|
||||
<ol class="proj-work-items">
|
||||
<li>基于 Caffeine + Redis 构建二级缓存,热点 Key 提升至本地缓存,避免冷数据污染,降低 Redis 访问压力。</li>
|
||||
<li>Lua 脚本保证点赞原子性,10 秒时间片分桶暂存增量,定时任务批量落库,补偿任务每日兜底,保障最终一致性。</li>
|
||||
<li>复现HeavyKeeper算法实现 Top-K 热点探测,最小堆维护热点集,概率衰减淘汰冷 Key,周期 fading 适配流量变化。</li>
|
||||
<li>利用字符串常量池特性,以业务前缀+用户ID为锁对象,实现同用户串行,不同用户并行,减少锁竞争,提升吞吐量。</li>
|
||||
</ol>
|
||||
</div>
|
||||
|
||||
<!-- 专业技能 -->
|
||||
<div class="section">
|
||||
<div class="section-title">专业技能</div>
|
||||
<ul class="skill-items">
|
||||
<li>熟练掌握 Java 与 Go 语言核心,熟悉常用集合与数据结构、面向对象设计、并发模型及内存管理机制。</li>
|
||||
<li>熟悉 Java (Spring/MyBatis/Cloud) 与 Go (Gin/GORM/gRPC) 技术栈,能熟练运用框架进行模块化开发与接口设计。</li>
|
||||
<li>了解 React Hooks 与组件生命周期,熟悉前端状态管理方案,熟练使用 Vite 构建工具及 Tailwind CSS。</li>
|
||||
<li>熟练掌握 MySQL 数据库,深刻理解事务隔离、存储引擎原理、B+树索引优化及 MVCC 并发控制机制。</li>
|
||||
<li>熟练掌握 Redis 缓存技术,理解 RDB/AOF 持久化策略、网络 IO 模型、哨兵集群机制及高性能架构原理。</li>
|
||||
<li>熟悉 Context Engineer,理解主流 Agent 架构,包括 ReAct、reflect、Plan-Exec 等,高效使用 Coding Agent 编码。</li>
|
||||
<li>熟悉 Docker、Git、web-hook,能够搭建 CI/CD 工作流,具备良好的编码习惯,以及良好的 commit 和 PR 风格。</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
BIN
Binary file not shown.
|
After Width: | Height: | Size: 1.4 MiB |
Reference in New Issue
Block a user