提交 e13821e7 编写于 作者: 小傅哥's avatar 小傅哥

feat: 简历博客

上级
# 命令执行 docker-compose up -d
# docker-compose -f docker-compose.yml up -d
version: '3.9'
services:
# yum install -y httpd-tools
nginx:
image: nginx:latest
container_name: nginx
restart: always
ports:
- '443:443'
- '80:80'
volumes:
- ./nginx/logs:/var/log/nginx
- ./nginx/html:/usr/share/nginx/html
- ./nginx/conf/nginx.conf:/etc/nginx/nginx.conf
- ./nginx/conf/conf.d:/etc/nginx/conf.d
- ./nginx/ssl:/etc/nginx/ssl/
privileged: true
\ No newline at end of file
server {
listen 80;
listen [::]:80;
server_name blog.gaga.plus;
location / {
root /usr/share/nginx/html;
index index.html;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
\ No newline at end of file
server {
listen 80;
listen [::]:80;
server_name blogs.gaga.plus;
rewrite ^(.*) https://$server_name$1 permanent;
}
server {
listen 443 ssl;
server_name api.gaga.plus;
ssl_certificate /etc/nginx/ssl/blogs.gaga.plus.pem;
ssl_certificate_key /etc/nginx/ssl/blogs.gaga.plus.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root /usr/share/nginx/html;
index index.html;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
\ No newline at end of file
server {
listen 80;
listen [::]:80;
location / {
root /usr/share/nginx/html;
index index.html;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
\ No newline at end of file
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
\ No newline at end of file
<!doctype html>
<html lang="zh-CN" data-theme="light">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<meta name="generator" content="VuePress 2.0.0-beta.67" />
<meta name="theme" content="VuePress Theme Hope" />
<meta property="og:url" content="https://vuepress-theme-hope-docs-demo.netlify.app/404.html"><meta property="og:site_name" content="我的简历"><meta property="og:type" content="website"><meta property="og:locale" content="zh-CN"><meta property="article:author" content="Mr.Hope"><script type="application/ld+json">{"@context":"https://schema.org","@type":"WebPage","name":""}</script><title>我的简历</title><meta name="description" content="">
<style>
:root {
--bg-color: #fff;
}
html[data-theme="dark"] {
--bg-color: #1d1e1f;
}
html,
body {
background: var(--bg-color);
}
</style>
<script>
const userMode = localStorage.getItem("vuepress-theme-hope-scheme");
const systemDarkMode =
window.matchMedia &&
window.matchMedia("(prefers-color-scheme: dark)").matches;
if (userMode === "dark" || (userMode !== "light" && systemDarkMode)) {
document.documentElement.setAttribute("data-theme", "dark");
}
</script>
<link rel="preload" href="/assets/style-e1af0ae0.css" as="style"><link rel="stylesheet" href="/assets/style-e1af0ae0.css">
<link rel="modulepreload" href="/assets/app-89848b6d.js"><link rel="modulepreload" href="/assets/404.html-4d74dcf3.js"><link rel="modulepreload" href="/assets/plugin-vue_export-helper-c27b6911.js"><link rel="modulepreload" href="/assets/404.html-a12454c5.js"><link rel="prefetch" href="/assets/index.html-3ddb8fc8.js" as="script"><link rel="prefetch" href="/assets/slides.html-e24915cf.js" as="script"><link rel="prefetch" href="/assets/resume.html-63219902.js" as="script"><link rel="prefetch" href="/assets/index.html-ee414c74.js" as="script"><link rel="prefetch" href="/assets/day01.html-96303a92.js" as="script"><link rel="prefetch" href="/assets/day02.html-bc6452cb.js" as="script"><link rel="prefetch" href="/assets/day03.html-faf19961.js" as="script"><link rel="prefetch" href="/assets/day04.html-f1431c14.js" as="script"><link rel="prefetch" href="/assets/day05.html-e1b66f43.js" as="script"><link rel="prefetch" href="/assets/day06.html-694a0d7d.js" as="script"><link rel="prefetch" href="/assets/day07~day08.html-623b7865.js" as="script"><link rel="prefetch" href="/assets/day09~day10.html-f64b96c2.js" as="script"><link rel="prefetch" href="/assets/day11.html-a02521a7.js" as="script"><link rel="prefetch" href="/assets/day12.html-59d9b776.js" as="script"><link rel="prefetch" href="/assets/index.html-38735195.js" as="script"><link rel="prefetch" href="/assets/index.html-72fa7116.js" as="script"><link rel="prefetch" href="/assets/slides.html-73aa899b.js" as="script"><link rel="prefetch" href="/assets/resume.html-0d5e8b6f.js" as="script"><link rel="prefetch" href="/assets/index.html-604f9d5c.js" as="script"><link rel="prefetch" href="/assets/day01.html-f34d072c.js" as="script"><link rel="prefetch" href="/assets/day02.html-faf555eb.js" as="script"><link rel="prefetch" href="/assets/day03.html-f3141bb2.js" as="script"><link rel="prefetch" href="/assets/day04.html-61a7012e.js" as="script"><link rel="prefetch" href="/assets/day05.html-4698622b.js" as="script"><link rel="prefetch" href="/assets/day06.html-a4c2781d.js" as="script"><link rel="prefetch" href="/assets/day07~day08.html-4e5d7c48.js" as="script"><link rel="prefetch" href="/assets/day09~day10.html-ee1cb17c.js" as="script"><link rel="prefetch" href="/assets/day11.html-13381d55.js" as="script"><link rel="prefetch" href="/assets/day12.html-4bed2fb6.js" as="script"><link rel="prefetch" href="/assets/index.html-f3051275.js" as="script"><link rel="prefetch" href="/assets/photoswipe.esm-060dc2da.js" as="script">
</head>
<body>
<div id="app"><!--[--><!--[--><!--[--><span tabindex="-1"></span><a href="#main-content" class="vp-skip-link sr-only">跳至主要內容</a><!--]--><div class="theme-container no-sidebar has-toc"><!--[--><header id="navbar" class="vp-navbar"><div class="vp-navbar-start"><button type="button" class="vp-toggle-sidebar-button" title="Toggle Sidebar"><span class="icon"></span></button><!--[--><!----><!--]--><!--[--><a class="vp-link vp-brand vp-brand" href="/"><img class="vp-nav-logo" src="/logo.svg" alt="我的简历"><!----><span class="vp-site-name hide-in-pad">我的简历</span></a><!--]--><!--[--><!----><!--]--></div><div class="vp-navbar-center"><!--[--><!----><!--]--><!--[--><nav class="vp-nav-links"><div class="nav-item hide-in-mobile"><a aria-label="主页" class="vp-link nav-link nav-link" href="/"><span class="font-icon icon fa-fw fa-sm fas fa-home" style=""></span>主页<!----></a></div><div class="nav-item hide-in-mobile"><a aria-label="个人简历" class="vp-link nav-link nav-link" href="/md/resume.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>个人简历<!----></a></div><div class="nav-item hide-in-mobile"><a aria-label="开发日志" class="vp-link nav-link nav-link" href="/md/dev-log/day01.html"><span class="font-icon icon fa-fw fa-sm fas fa-book" style=""></span>开发日志<!----></a></div></nav><!--]--><!--[--><!----><!--]--></div><div class="vp-navbar-end"><!--[--><!----><!--]--><!--[--><!----><div class="nav-item vp-repo"><a class="vp-repo-link" href="https://github.com/fuzhengwei/xfg-resume-blog" target="_blank" rel="noopener noreferrer" aria-label="GitHub"><svg xmlns="http://www.w3.org/2000/svg" class="icon github-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="github icon" style="width:1.25rem;height:1.25rem;vertical-align:middle;"><path d="M511.957 21.333C241.024 21.333 21.333 240.981 21.333 512c0 216.832 140.544 400.725 335.574 465.664 24.49 4.395 32.256-10.07 32.256-23.083 0-11.69.256-44.245 0-85.205-136.448 29.61-164.736-64.64-164.736-64.64-22.315-56.704-54.4-71.765-54.4-71.765-44.587-30.464 3.285-29.824 3.285-29.824 49.195 3.413 75.179 50.517 75.179 50.517 43.776 75.008 114.816 53.333 142.762 40.79 4.523-31.66 17.152-53.377 31.19-65.537-108.971-12.458-223.488-54.485-223.488-242.602 0-53.547 19.114-97.323 50.517-131.67-5.035-12.33-21.93-62.293 4.779-129.834 0 0 41.258-13.184 134.912 50.346a469.803 469.803 0 0 1 122.88-16.554c41.642.213 83.626 5.632 122.88 16.554 93.653-63.488 134.784-50.346 134.784-50.346 26.752 67.541 9.898 117.504 4.864 129.834 31.402 34.347 50.474 78.123 50.474 131.67 0 188.586-114.73 230.016-224.042 242.09 17.578 15.232 33.578 44.672 33.578 90.454v135.85c0 13.142 7.936 27.606 32.854 22.87C862.25 912.597 1002.667 728.747 1002.667 512c0-271.019-219.648-490.667-490.71-490.667z"></path></svg></a></div><div class="nav-item hide-in-mobile"><button type="button" id="appearance-switch"><svg xmlns="http://www.w3.org/2000/svg" class="icon auto-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="auto icon" style="display:block;"><path d="M512 992C246.92 992 32 777.08 32 512S246.92 32 512 32s480 214.92 480 480-214.92 480-480 480zm0-840c-198.78 0-360 161.22-360 360 0 198.84 161.22 360 360 360s360-161.16 360-360c0-198.78-161.22-360-360-360zm0 660V212c165.72 0 300 134.34 300 300 0 165.72-134.28 300-300 300z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" class="icon dark-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="dark icon" style="display:none;"><path d="M524.8 938.667h-4.267a439.893 439.893 0 0 1-313.173-134.4 446.293 446.293 0 0 1-11.093-597.334A432.213 432.213 0 0 1 366.933 90.027a42.667 42.667 0 0 1 45.227 9.386 42.667 42.667 0 0 1 10.24 42.667 358.4 358.4 0 0 0 82.773 375.893 361.387 361.387 0 0 0 376.747 82.774 42.667 42.667 0 0 1 54.187 55.04 433.493 433.493 0 0 1-99.84 154.88 438.613 438.613 0 0 1-311.467 128z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" class="icon light-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="light icon" style="display:none;"><path d="M952 552h-80a40 40 0 0 1 0-80h80a40 40 0 0 1 0 80zM801.88 280.08a41 41 0 0 1-57.96-57.96l57.96-58a41.04 41.04 0 0 1 58 58l-58 57.96zM512 752a240 240 0 1 1 0-480 240 240 0 0 1 0 480zm0-560a40 40 0 0 1-40-40V72a40 40 0 0 1 80 0v80a40 40 0 0 1-40 40zm-289.88 88.08-58-57.96a41.04 41.04 0 0 1 58-58l57.96 58a41 41 0 0 1-57.96 57.96zM192 512a40 40 0 0 1-40 40H72a40 40 0 0 1 0-80h80a40 40 0 0 1 40 40zm30.12 231.92a41 41 0 0 1 57.96 57.96l-57.96 58a41.04 41.04 0 0 1-58-58l58-57.96zM512 832a40 40 0 0 1 40 40v80a40 40 0 0 1-80 0v-80a40 40 0 0 1 40-40zm289.88-88.08 58 57.96a41.04 41.04 0 0 1-58 58l-57.96-58a41 41 0 0 1 57.96-57.96z"></path></svg></button></div><!----><!--]--><!--[--><!----><!--]--><button type="button" class="vp-toggle-navbar-button" aria-label="Toggle Navbar" aria-expanded="false" aria-controls="nav-screen"><span><span class="vp-top"></span><span class="vp-middle"></span><span class="vp-bottom"></span></span></button></div></header><!----><!--]--><!----><div class="toggle-sidebar-wrapper"><span class="arrow start"></span></div><aside id="sidebar" class="vp-sidebar"><!--[--><!----><!--]--><ul class="vp-sidebar-links"><li><!--[--><a aria-label="主页" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/"><span class="font-icon icon fa-fw fa-sm fas fa-home" style=""></span>主页<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><section class="vp-sidebar-group"><p class="vp-sidebar-heading"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span><span class="vp-sidebar-title">Lottery 项目开发日志</span><!----></p><ul class="vp-sidebar-links"><li><!--[--><a aria-label="Day01" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day01.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day01<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day02" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day02.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day02<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day03" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day03.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day03<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day04" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day04.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day04<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day05" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day05.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day05<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day06" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day06.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day06<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day07 ~ Day08" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day07~day08.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day07 ~ Day08<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day09 ~ Day10" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day09~day10.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day09 ~ Day10<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day011" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day11.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day011<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day012" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day12.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day012<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li></ul></section></li></ul><!--[--><!----><!--]--></aside><!--[--><main id="main-content" class="vp-page not-found"><div class="not-found-hint"><p class="error-code">404</p><h1 class="error-title">页面不存在</h1><p class="error-hint">这 是 四 零 四 !</p></div><div class="actions"><button type="button" class="action-button">返回上一页</button><button type="button" class="action-button">带我回家</button></div></main><!--]--><footer class="vp-footer-wrapper"><div class="vp-footer">我的微信:fustack</div><div class="vp-copyright">Copyright © 2024 Mr.Hope</div></footer></div><!--]--><!----><!--]--></div>
<script type="module" src="/assets/app-89848b6d.js" defer></script>
</body>
</html>
import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-89848b6d.js";const o={};function r(_,n){return t(),c("div")}const f=e(o,[["render",r],["__file","404.html.vue"]]);export{f as default};
const t=JSON.parse('{"key":"v-3706649a","path":"/404.html","title":"","lang":"zh-CN","frontmatter":{"layout":"NotFound","description":"","head":[["meta",{"property":"og:url","content":"https://vuepress-theme-hope-docs-demo.netlify.app/404.html"}],["meta",{"property":"og:site_name","content":"我的简历"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"Mr.Hope"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"autoDesc":true}');export{t as data};
因为 它太大了无法显示 source diff 。你可以改为 查看blob
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 2000 1500"><path fill="#133727" d="M0 0h2000v1500H0z"/><defs><radialGradient id="c" gradientUnits="objectBoundingBox"><stop offset="0" stop-color="#2C7051"/><stop offset="1" stop-color="#133727"/></radialGradient><linearGradient id="a" x1="0" x2="1550" y1="750" y2="750" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#20543c"/><stop offset="1" stop-color="#133727"/></linearGradient><path id="b" fill="url(#a)" d="M1549.2 51.6c-5.4 99.1-20.2 197.6-44.2 293.6-24.1 96-57.4 189.4-99.3 278.6-41.9 89.2-92.4 174.1-150.3 253.3-58 79.2-123.4 152.6-195.1 219-71.7 66.4-149.6 125.8-232.2 177.2-82.7 51.4-170.1 94.7-260.7 129.1-90.6 34.4-184.4 60-279.5 76.3C192.6 1495 96.1 1502 0 1500c96.1-2.1 191.8-13.3 285.4-33.6 93.6-20.2 185-49.5 272.5-87.2 87.6-37.7 171.3-83.8 249.6-137.3 78.4-53.5 151.5-114.5 217.9-181.7 66.5-67.2 126.4-140.7 178.6-218.9 52.3-78.3 96.9-161.4 133-247.9 36.1-86.5 63.8-176.2 82.6-267.6 18.8-91.4 28.6-184.4 29.6-277.4.3-27.6 23.2-48.7 50.8-48.4s49.5 21.8 49.2 49.5c0 .7 0 1.3-.1 2l.1.1z"/><g id="d"><use href="#b" transform="rotate(60) scale(.12)"/><use href="#b" transform="rotate(10) scale(.2)"/><use href="#b" transform="rotate(40) scale(.25)"/><use href="#b" transform="rotate(-20) scale(.3)"/><use href="#b" transform="rotate(-30) scale(.4)"/><use href="#b" transform="rotate(20) scale(.5)"/><use href="#b" transform="rotate(60) scale(.6)"/><use href="#b" transform="rotate(10) scale(.7)"/><use href="#b" transform="rotate(-40) scale(.835)"/><use href="#b" transform="rotate(40) scale(.9)"/><use href="#b" transform="rotate(25) scale(1.05)"/><use href="#b" transform="rotate(8) scale(1.2)"/><use href="#b" transform="rotate(-60) scale(1.333)"/><use href="#b" transform="rotate(-30) scale(1.45)"/><use href="#b" transform="rotate(10) scale(1.6)"/></g></defs><circle r="3000" fill="url(#c)"/><g fill="url(#c)" opacity=".5"><circle r="2000"/><circle r="1800"/><circle r="1700"/><circle r="1651"/><circle r="1450"/><circle r="1250"/><circle r="1175"/><circle r="900"/><circle r="750"/><circle r="500"/><circle r="380"/><circle r="250"/></g><use href="#d" transform="rotate(10)"/><use href="#d" transform="rotate(120)"/><use href="#d" transform="rotate(240)"/><circle r="3000" fill="url(#c)" fill-opacity=".1"/></svg>
\ No newline at end of file
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 2000 1500"><path fill="#9ADBBE" d="M0 0h2000v1500H0z"/><defs><radialGradient id="c" gradientUnits="objectBoundingBox"><stop offset="0" stop-color="#FFF"/><stop offset="1" stop-color="#9ADBBE"/></radialGradient><linearGradient id="a" x1="0" x2="1550" y1="750" y2="750" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#cdeddf"/><stop offset="1" stop-color="#9ADBBE"/></linearGradient><path id="b" fill="url(#a)" d="M1549.2 51.6c-5.4 99.1-20.2 197.6-44.2 293.6-24.1 96-57.4 189.4-99.3 278.6-41.9 89.2-92.4 174.1-150.3 253.3-58 79.2-123.4 152.6-195.1 219-71.7 66.4-149.6 125.8-232.2 177.2-82.7 51.4-170.1 94.7-260.7 129.1-90.6 34.4-184.4 60-279.5 76.3C192.6 1495 96.1 1502 0 1500c96.1-2.1 191.8-13.3 285.4-33.6 93.6-20.2 185-49.5 272.5-87.2 87.6-37.7 171.3-83.8 249.6-137.3 78.4-53.5 151.5-114.5 217.9-181.7 66.5-67.2 126.4-140.7 178.6-218.9 52.3-78.3 96.9-161.4 133-247.9 36.1-86.5 63.8-176.2 82.6-267.6 18.8-91.4 28.6-184.4 29.6-277.4.3-27.6 23.2-48.7 50.8-48.4s49.5 21.8 49.2 49.5c0 .7 0 1.3-.1 2l.1.1z"/><g id="d"><use href="#b" transform="rotate(60) scale(.12)"/><use href="#b" transform="rotate(10) scale(.2)"/><use href="#b" transform="rotate(40) scale(.25)"/><use href="#b" transform="rotate(-20) scale(.3)"/><use href="#b" transform="rotate(-30) scale(.4)"/><use href="#b" transform="rotate(20) scale(.5)"/><use href="#b" transform="rotate(60) scale(.6)"/><use href="#b" transform="rotate(10) scale(.7)"/><use href="#b" transform="rotate(-40) scale(.835)"/><use href="#b" transform="rotate(40) scale(.9)"/><use href="#b" transform="rotate(25) scale(1.05)"/><use href="#b" transform="rotate(8) scale(1.2)"/><use href="#b" transform="rotate(-60) scale(1.333)"/><use href="#b" transform="rotate(-30) scale(1.45)"/><use href="#b" transform="rotate(10) scale(1.6)"/></g></defs><circle r="3000" fill="url(#c)"/><g fill="url(#c)" opacity=".5"><circle r="2000"/><circle r="1800"/><circle r="1700"/><circle r="1651"/><circle r="1450"/><circle r="1250"/><circle r="1175"/><circle r="900"/><circle r="750"/><circle r="500"/><circle r="380"/><circle r="250"/></g><use href="#d" transform="rotate(10)"/><use href="#d" transform="rotate(120)"/><use href="#d" transform="rotate(240)"/><circle r="3000" fill="none"/></svg>
\ No newline at end of file
const e=JSON.parse('{"key":"v-49312a44","path":"/md/dev-log/day01.html","title":"Day01","lang":"zh-CN","frontmatter":{"title":"Day01","index":false,"icon":"laptop-code","category":["开发笔记","学习记录"],"description":"任务\\r[x] 环境配置; \\r[x] 搭建项目结构; \\r[x] 跑通广播模式 RPC 过程调用; 学习过程 1. 项目整体了解 通过对第一节文档的阅读,了解整个项目的生命周期、所需要的技术以及代码提交规范 2. 搭建项目结构,理解每个模块应该干什么 模块 作用 | ---------------------- ----------------------...","head":[["meta",{"property":"og:url","content":"https://vuepress-theme-hope-docs-demo.netlify.app/md/dev-log/day01.html"}],["meta",{"property":"og:site_name","content":"我的简历"}],["meta",{"property":"og:title","content":"Day01"}],["meta",{"property":"og:description","content":"任务\\r[x] 环境配置; \\r[x] 搭建项目结构; \\r[x] 跑通广播模式 RPC 过程调用; 学习过程 1. 项目整体了解 通过对第一节文档的阅读,了解整个项目的生命周期、所需要的技术以及代码提交规范 2. 搭建项目结构,理解每个模块应该干什么 模块 作用 | ---------------------- ----------------------..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"Mr.Hope"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"Day01\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"Mr.Hope\\",\\"url\\":\\"https://mister-hope.com\\"}]}"]]},"headers":[{"level":2,"title":"任务","slug":"任务","link":"#任务","children":[]},{"level":2,"title":"学习过程","slug":"学习过程","link":"#学习过程","children":[]},{"level":2,"title":"遇到的问题","slug":"遇到的问题","link":"#遇到的问题","children":[]},{"level":2,"title":"总结","slug":"总结","link":"#总结","children":[]}],"git":{},"readingTime":{"minutes":4.48,"words":1343},"filePathRelative":"md/dev-log/day01.md","autoDesc":true}');export{e as data};
import{_ as o}from"./plugin-vue_export-helper-c27b6911.js";import{r as p,o as e,c as l,a as t,d as n,e as r,f as s}from"./app-89848b6d.js";const c={},i=t("h2",{id:"任务",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#任务","aria-hidden":"true"},"#"),n(" 任务")],-1),u=t("ul",null,[t("li",null,"[x] 环境配置"),t("li",null,"[x] 搭建项目结构"),t("li",null,"[x] 跑通广播模式 RPC 过程调用")],-1),d=t("h2",{id:"学习过程",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#学习过程","aria-hidden":"true"},"#"),n(" 学习过程")],-1),k=s("<li><p>项目整体了解</p><p>通过对第一节文档的阅读,了解整个项目的生命周期、所需要的技术以及代码提交规范</p></li><li><p>搭建项目结构,理解每个模块应该干什么</p><table><thead><tr><th>模块</th><th>作用</th></tr></thead><tbody><tr><td>Lottery</td><td>总项目,用来管理整个项目的依赖</td></tr><tr><td>lottery-application</td><td>应用层,为用户接口层提供各种应用数据展现支持服务</td></tr><tr><td>lottery-common</td><td>定义通用数据,比如统一响应数据、常量、异常、枚举等</td></tr><tr><td>lottery-domain</td><td>领域层,核心业务逻辑</td></tr><tr><td>lottery-infrastructure</td><td>基础层,为其他各层提供通用技术能力,包括数据库、Redis、ES 等</td></tr><tr><td>lottery-interfaces</td><td>用户接口层,存放与前端交互、展现数据相关的代码</td></tr><tr><td>lottery-rpc</td><td>RPC 接口文件</td></tr></tbody></table><blockquote><p>注:因为并不了解 DDD 架构,所以每个模块目前只有模糊的概念,具体的东西在后续代码编写中进行体会</p></blockquote></li>",2),q={href:"https://gitcode.net/KnowledgePlanet/Lottery/-/tree/210801_xfg_initProject",target:"_blank",rel:"noopener noreferrer"},y=t("p",null,[n("通过对 POM 文件的阅读,更加清楚的了解这个项目所使用的技术,并且通过阅读发现项目没有添加 Lombok 来简化开发,具体项目开发是否使用这个插件我不知道,但是我想用,因为我"),t("strong",null,""),n(",所以就给加上了😄")],-1),h=s("<li><p>跑通 RPC</p><ol><li>定义 response 状态码枚举供通用返回对象 Result 进行使用</li><li>定义通用返回对象 Result 类</li><li>定义 activity 表的持久化对象</li><li>定义 activity 表的 Mapper 接口</li><li>定义 mybatis 配置文件</li><li>定义 activity 表的 mapper.xml 文件</li><li>定义 rpc 的数据传输对象(DTO) ActivityDto</li><li>定义 rpc 的 请求对象 ActivityReq</li><li>定义 rpc 的响应对象 ActivityRes</li><li>定义 rpc 接口 IActivityBooth</li><li>实现 IActivityBooth 接口</li><li>编写启动类</li><li>编写配置文件 application.yml</li><li>编写测试模块 <strong>这个我是直接加在工程里面的,教程是单独开了一个项目</strong></li></ol></li>",1),m=s(`<h2 id="遇到的问题" tabindex="-1"><a class="header-anchor" href="#遇到的问题" aria-hidden="true">#</a> 遇到的问题</h2><ol><li><p>代码分层不清晰,不知道每个模块应该干什么事</p><p>这个问题该怎么解决呢?我觉得最好的解决办法就是不解决,哈哈哈,因为当初学 MVC 的时候最开始也不清楚为什么要这样分层,为什么就要分 Controller、Service 和 DAO,但是后来经过大量代码的编写,也逐渐熟悉了这样的分层架构,所以现在并不想解决这个问题,具体还是靠后面的代码进行了解和熟悉吧</p></li><li><p>JSON.toJSonString() 方法返回了空 <code>{}</code></p><p>问题出现原因,忘了加 <code>@Data</code> 注解,导致没有 <code>getter/setter</code> 就导致了这个问题,加上注解即可</p><p>解决!</p></li><li><p>数据库乱码问题</p><p>测试模块 RPC 远程调用返回的结果为:</p><div class="language-json line-numbers-mode" data-ext="json"><pre class="language-json"><code>测试结果:<span class="token punctuation">{</span><span class="token property">&quot;activity&quot;</span><span class="token operator">:</span><span class="token punctuation">{</span><span class="token property">&quot;activityDesc&quot;</span><span class="token operator">:</span><span class="token string">&quot;?????????&quot;</span><span class="token punctuation">,</span><span class="token property">&quot;activityId&quot;</span><span class="token operator">:</span><span class="token number">100002</span><span class="token punctuation">,</span><span class="token property">&quot;activityName&quot;</span><span class="token operator">:</span><span class="token string">&quot;????&quot;</span><span class="token punctuation">,</span><span class="token property">&quot;beginDateTime&quot;</span><span class="token operator">:</span><span class="token number">1705215282000</span><span class="token punctuation">,</span><span class="token property">&quot;endDateTime&quot;</span><span class="token operator">:</span><span class="token number">1705215282000</span><span class="token punctuation">,</span><span class="token property">&quot;stockCount&quot;</span><span class="token operator">:</span><span class="token number">100</span><span class="token punctuation">,</span><span class="token property">&quot;takeCount&quot;</span><span class="token operator">:</span><span class="token number">10</span><span class="token punctuation">}</span><span class="token punctuation">,</span><span class="token property">&quot;result&quot;</span><span class="token operator">:</span><span class="token punctuation">{</span><span class="token property">&quot;code&quot;</span><span class="token operator">:</span><span class="token string">&quot;0000&quot;</span><span class="token punctuation">,</span><span class="token property">&quot;info&quot;</span><span class="token operator">:</span><span class="token string">&quot;成功&quot;</span><span class="token punctuation">}</span><span class="token punctuation">}</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>明显的乱码问题,查看数据库,发现插入的时候就以及乱码了,看了一下配置文件中的数据库连接 url,发现使用了 useUnicode=true,并没有指定字符集,所以添加一下 utf-8 字符集即可,完整 url: <code>jdbc:mysql://127.0.0.1:3306/lottery?useUnicode=true&amp;characterEncoding=UTF-8</code></p><p>再进行一轮测试,测试结果:</p><div class="language-json line-numbers-mode" data-ext="json"><pre class="language-json"><code>测试结果:<span class="token punctuation">{</span><span class="token property">&quot;activity&quot;</span><span class="token operator">:</span><span class="token punctuation">{</span><span class="token property">&quot;activityDesc&quot;</span><span class="token operator">:</span><span class="token string">&quot;仅用于插入数据测试&quot;</span><span class="token punctuation">,</span><span class="token property">&quot;activityId&quot;</span><span class="token operator">:</span><span class="token number">100003</span><span class="token punctuation">,</span><span class="token property">&quot;activityName&quot;</span><span class="token operator">:</span><span class="token string">&quot;测试活动&quot;</span><span class="token punctuation">,</span><span class="token property">&quot;beginDateTime&quot;</span><span class="token operator">:</span><span class="token number">1705218054000</span><span class="token punctuation">,</span><span class="token property">&quot;endDateTime&quot;</span><span class="token operator">:</span><span class="token number">1705218054000</span><span class="token punctuation">,</span><span class="token property">&quot;stockCount&quot;</span><span class="token operator">:</span><span class="token number">100</span><span class="token punctuation">,</span><span class="token property">&quot;takeCount&quot;</span><span class="token operator">:</span><span class="token number">10</span><span class="token punctuation">}</span><span class="token punctuation">,</span><span class="token property">&quot;result&quot;</span><span class="token operator">:</span><span class="token punctuation">{</span><span class="token property">&quot;code&quot;</span><span class="token operator">:</span><span class="token string">&quot;0000&quot;</span><span class="token punctuation">,</span><span class="token property">&quot;info&quot;</span><span class="token operator">:</span><span class="token string">&quot;成功&quot;</span><span class="token punctuation">}</span><span class="token punctuation">}</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>解决!</p></li></ol><h2 id="总结" tabindex="-1"><a class="header-anchor" href="#总结" aria-hidden="true">#</a> 总结</h2><p>今天干了说明呢?</p><ol><li>配置环境</li><li>跑通 RPC</li></ol><p>具体怎么跑通 RPC 的呢?</p><ol><li>在 common 模块创建通用类</li><li>在 infrastructure 模块创建 dao 接口以及和数据库相对应的 po 类</li><li>在 rpc 模块下创建 RPC 通信接口以及对应的请求和响应的封装类</li><li>然后在 interfaces 模块下实现 rpc 模块的接口,在这里调用 Mapper 进行增删改查</li><li>然后就写配置呗,SpringBoot 配置、Dubbo 配置、MyBatis 配置</li></ol><p>学到了什么呢?</p><ol><li>由于之前学习一直使用的是 MVC 架构,并且命名不太规范,所以对于包的命名现在很不适应,比如什么dto、vo啥的各种 o 不太熟悉,这个就不准备纠结了,准备靠代码量进行熟悉</li><li>对每个模块有了大概的了解,至少知道了接口写在哪个模块,接口实现类在哪个模块以及 Mapper 写在哪</li><li>现在在我眼中,这个 interfaces 模块,就跟以前学的 Dubbo 的服务提供者一样吧?因为这个模块用来实现接口的,所以就会引用其他模块,要调用其他模块的东西就要添加依赖,所以这个模块起起来之后,就带动了所有模块,整个项目也就 run 起来了</li></ol><p>第一天,脑子还有点迷糊,因为基础不太牢固,所以有些小 bug 花费了挺长时间的,但是至少是跑起来了吧?也还行,路虽远,行则将至嘛,虽然年后要找实习,但是还是慌不得,慢慢来,一口吃不成个大胖子,准备晚上再补一补 Dubbo 基础</p>`,10);function b(_,v){const a=p("ExternalLinkIcon");return e(),l("div",null,[i,u,d,t("ol",null,[k,t("li",null,[t("p",null,[n("阅读 "),t("a",q,[n("210801_xfg_initProject"),r(a)]),n(" 分支上的 POM 文件")]),y]),h]),m])}const x=o(c,[["render",b],["__file","day01.html.vue"]]);export{x as default};
const e=JSON.parse('{"key":"v-45c77906","path":"/md/dev-log/day02.html","title":"Day02","lang":"zh-CN","frontmatter":{"title":"Day02","index":false,"icon":"laptop-code","category":["开发笔记","学习记录"],"description":"任务\\r[x] 表设计; \\r[x] 抽奖领域模块开发; 学习过程 1. 查询分库分表相关知识点,了解到垂直和水平分库分表,主要是为了解决数据量过大导致 MySQL 查询慢、单体容量过大问题 2. 开始写代码 1. 编写基础的持久化对象 (PO) 2. 编写 Mapper 接口 3. 编写对应的 Mapper.xml 4. 设计抽奖策略顶级接口,主要是入参...","head":[["meta",{"property":"og:url","content":"https://vuepress-theme-hope-docs-demo.netlify.app/md/dev-log/day02.html"}],["meta",{"property":"og:site_name","content":"我的简历"}],["meta",{"property":"og:title","content":"Day02"}],["meta",{"property":"og:description","content":"任务\\r[x] 表设计; \\r[x] 抽奖领域模块开发; 学习过程 1. 查询分库分表相关知识点,了解到垂直和水平分库分表,主要是为了解决数据量过大导致 MySQL 查询慢、单体容量过大问题 2. 开始写代码 1. 编写基础的持久化对象 (PO) 2. 编写 Mapper 接口 3. 编写对应的 Mapper.xml 4. 设计抽奖策略顶级接口,主要是入参..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"Mr.Hope"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"Day02\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"Mr.Hope\\",\\"url\\":\\"https://mister-hope.com\\"}]}"]]},"headers":[{"level":2,"title":"任务","slug":"任务","link":"#任务","children":[]},{"level":2,"title":"学习过程","slug":"学习过程","link":"#学习过程","children":[]},{"level":2,"title":"遇到的问题","slug":"遇到的问题","link":"#遇到的问题","children":[]},{"level":2,"title":"总结","slug":"总结","link":"#总结","children":[]}],"git":{},"readingTime":{"minutes":3.53,"words":1059},"filePathRelative":"md/dev-log/day02.md","autoDesc":true}');export{e as data};
import{_ as l}from"./plugin-vue_export-helper-c27b6911.js";import{o as i,c as a,f as e}from"./app-89848b6d.js";const r={},o=e('<h2 id="任务" tabindex="-1"><a class="header-anchor" href="#任务" aria-hidden="true">#</a> 任务</h2><ul><li>[x] 表设计</li><li>[x] 抽奖领域模块开发</li></ul><h2 id="学习过程" tabindex="-1"><a class="header-anchor" href="#学习过程" aria-hidden="true">#</a> 学习过程</h2><ol><li>查询分库分表相关知识点,了解到垂直和水平分库分表,主要是为了解决数据量过大导致 MySQL 查询慢、单体容量过大问题</li><li>开始写代码 <ol><li>编写基础的持久化对象 (PO)</li><li>编写 Mapper 接口</li><li>编写对应的 Mapper.xml</li><li>设计抽奖策略顶级接口,主要是入参出参,如何封装,要封装哪些数据</li><li>编写顶级接口的基础实现,实现里面公用的方法,比如把初始化方法、哈希计算的方法以及判断是否初始化完成</li><li>编写两种算法的实现</li><li>算法单元测试</li></ol></li></ol><h2 id="遇到的问题" tabindex="-1"><a class="header-anchor" href="#遇到的问题" aria-hidden="true">#</a> 遇到的问题</h2><ol><li><p>为什么在设计阶段就考虑分库分表等问题</p><p>在之前的学习过程中,并没有项目环境的支撑,导致了这个问题,一个大的项目,如果要兼顾性能以及代码的可扩展性,那么在数据库设计阶段就应该想到这些,那些是热点数据,那些数据会进行大量的插入,没有全局把控的观念,只有了解这些,才能设计出一个性能良好且代码可维护性高的项目,这个需要项目积累,这是一个很重要的东西,以后在学习的时候一定要多注意这方面,多看看别人的数据库是怎么设计的,以及为什么要这么设计,要有全局把控的观念</p></li><li><p>抽奖算法是怎么实现的呢</p><p>首先这个初始化的时候,传入奖品和对应的概率,然后概率乘以 100,就是对应的下标范围,一个奖品一个范围,是不会重复的,然后经过斐波那契哈希散列算法,将这个对应的下标进行加工,使其均匀的分布在数组中,在对下标进行加工的过程中,确保了无论传入什么数字,都会在 0 ~ 128 的范围内</p><ol><li><p>SingleRateRandomDrawAlgorithm</p><p>这种策略是生成一个 1 ~ 100 的随机数,然后经过 hashIdx 计算对应的下标,然后去上面初始化好的数组中去取奖品</p></li><li><p>DefaultRateRandomDrawAlgorithm</p><p>这是一种必中奖策略,先排除掉不在抽奖范围内的奖品ID,然后生成随机数,然后判断这个随机数是否在指定的范围内,如果不在,那么这个奖品就没中,然后看下一个奖品,重新生成随机数,然后看是否在指定的中奖概率内加上上次生成的随机数范围内</p></li></ol></li></ol><h2 id="总结" tabindex="-1"><a class="header-anchor" href="#总结" aria-hidden="true">#</a> 总结</h2><p>今天主要把抽奖算法给搞定了,虽然代码不多,但是很难理解,最开始都搞不清楚为什么这样子就实现了抽奖算法,不懂这个概率是如何保证的,然后 debug 了好久,发现其实就是一个 128 长度的数组,然后经过哈希散列排列,保证随机的均匀性,其实这 128 长度的数组就已经保证了抽奖的概率,假设不经过哈希算法,直接放进去,假设两个的抽奖概率是 0.1 和 0.2,那么放进去的时候就是下标 1~10 全是第一个奖品,下标 11 ~ 30 全是第二个奖品,随机数生成的是 1 ~ 100,那么第一个奖品也就是有 10 个数字能中奖,那不就是 10% 的中奖概率了么,加哈希散列只是为了均匀分布,增加随机性和公平性</p><p>收获:</p><ol><li>对 DDD 有更深的了解,知道什么类该写在什么包下,比昨天更清楚代码该如何组织了</li><li>了解了分库分表,虽然是第一次接触,但是至少知道了为什么要分库分表,随着项目的进行,就会学会如何分库分表了吧</li><li>了解了 Hash 散列算法,后续看看源码,要搞清楚底层是如何运作的</li></ol>',10),h=[o];function t(d,p){return i(),a("div",null,h)}const s=l(r,[["render",t],["__file","day02.html.vue"]]);export{s as default};
因为 它太大了无法显示 source diff 。你可以改为 查看blob
const e=JSON.parse('{"key":"v-425dc7c8","path":"/md/dev-log/day03.html","title":"Day03","lang":"zh-CN","frontmatter":{"title":"Day03","index":false,"icon":"laptop-code","category":["开发笔记","学习记录"],"description":"day03 任务\\r[x] 模板模式处理抽奖流程; 学习过程 1. 因为之前没学过设计模式,先学一学模板模式,用到一种学一种,哈哈哈 2. 先看一下整个抽奖流程 ![抽奖过程][step] 3. 了解了抽奖流程之后就开始写代码 1. 先写对应的 dao 层 1. 要查策略吧?写个策略的 Mapper 2. 要查策略详情吧?写个策略详情的 Mapper 3...","head":[["meta",{"property":"og:url","content":"https://vuepress-theme-hope-docs-demo.netlify.app/md/dev-log/day03.html"}],["meta",{"property":"og:site_name","content":"我的简历"}],["meta",{"property":"og:title","content":"Day03"}],["meta",{"property":"og:description","content":"day03 任务\\r[x] 模板模式处理抽奖流程; 学习过程 1. 因为之前没学过设计模式,先学一学模板模式,用到一种学一种,哈哈哈 2. 先看一下整个抽奖流程 ![抽奖过程][step] 3. 了解了抽奖流程之后就开始写代码 1. 先写对应的 dao 层 1. 要查策略吧?写个策略的 Mapper 2. 要查策略详情吧?写个策略详情的 Mapper 3..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"Mr.Hope"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"Day03\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"Mr.Hope\\",\\"url\\":\\"https://mister-hope.com\\"}]}"]]},"headers":[{"level":2,"title":"day03","slug":"day03","link":"#day03","children":[{"level":3,"title":"任务","slug":"任务","link":"#任务","children":[]},{"level":3,"title":"学习过程","slug":"学习过程","link":"#学习过程","children":[]},{"level":3,"title":"遇到的问题","slug":"遇到的问题","link":"#遇到的问题","children":[]},{"level":3,"title":"总结","slug":"总结","link":"#总结","children":[]}]}],"git":{},"readingTime":{"minutes":39.64,"words":11893},"filePathRelative":"md/dev-log/day03.md","autoDesc":true}');export{e as data};
import{_ as i}from"./plugin-vue_export-helper-c27b6911.js";import{o as l,c as e,f as a}from"./app-89848b6d.js";const r={},o=a('<h3 id="任务" tabindex="-1"><a class="header-anchor" href="#任务" aria-hidden="true">#</a> 任务</h3><ul><li>[x] 简单工厂搭建发奖领域</li></ul><h3 id="学习过程" tabindex="-1"><a class="header-anchor" href="#学习过程" aria-hidden="true">#</a> 学习过程</h3><ol><li><p>表结构变了,先导入 SQL,然后该对应的 PO 类,然后改一下 Mapper 文件</p></li><li><p>先把包结构建好</p><ol><li>新建一个领域包,负责发奖</li><li>领域包内建三个子包,model 实体封装包、repository 提供仓储服务、service 提供具体的服务(重点内容)</li></ol></li><li><p>看一下代码的继承关系</p></li><li><p>debug 看一下代码执行流程,了解其中的调用关系</p><ol><li>先执行抽奖,返回抽奖结果</li><li>对抽奖结果进行判断,如果是未中奖,直接返回</li><li>中奖了就保存用户信息以及订单信息</li><li>根据中奖结果中的奖品类型获取对应的服务</li><li>然后把第三步保存的用户信息以及订单信息传进去,做一个发奖的操作</li><li>然后返回发奖结果</li></ol></li></ol><h2 id="遇到的问题" tabindex="-1"><a class="header-anchor" href="#遇到的问题" aria-hidden="true">#</a> 遇到的问题</h2><p>今天还没遇到啥问题,代码比较简单,主要是数据库字段规范之后,好多 Mapper 要改 T.T,最开始我还在纠结要不要当初建表的时候就改了</p><p><strong>就很气,本来能学两小节的,md,电脑被亲戚孩子给整挂了,直接开不了机了,麻了,修电脑都修了两小时,系统还重装了,又重装环境</strong></p><h2 id="总结" tabindex="-1"><a class="header-anchor" href="#总结" aria-hidden="true">#</a> 总结</h2><ol><li>越来越喜欢 DDD 架构这种包的组织方式了,虽然包很多,看着有点复杂,但是真的理解了之后,就感觉很干净,扩展性也很好,虽然目前还没完全搞清楚 DDD</li><li>学会了工厂模式,根据奖品类型,从工厂里面拿对应的实现类进行发奖操作</li></ol>',9),d=[o];function t(h,n){return l(),e("div",null,d)}const p=i(r,[["render",t],["__file","day04.html.vue"]]);export{p as default};
const e=JSON.parse('{"key":"v-3ef4168a","path":"/md/dev-log/day04.html","title":"Day04","lang":"zh-CN","frontmatter":{"title":"Day04","index":false,"icon":"laptop-code","category":["开发笔记","学习记录"],"description":"任务 [x] 简单工厂搭建发奖领域; 学习过程 1. 表结构变了,先导入 SQL,然后该对应的 PO 类,然后改一下 Mapper 文件 2. 先把包结构建好 1. 新建一个领域包,负责发奖 2. 领域包内建三个子包,model 实体封装包、repository 提供仓储服务、service 提供具体的服务(重点内容) 3. 看一下代码的继承关系 4....","head":[["meta",{"property":"og:url","content":"https://vuepress-theme-hope-docs-demo.netlify.app/md/dev-log/day04.html"}],["meta",{"property":"og:site_name","content":"我的简历"}],["meta",{"property":"og:title","content":"Day04"}],["meta",{"property":"og:description","content":"任务 [x] 简单工厂搭建发奖领域; 学习过程 1. 表结构变了,先导入 SQL,然后该对应的 PO 类,然后改一下 Mapper 文件 2. 先把包结构建好 1. 新建一个领域包,负责发奖 2. 领域包内建三个子包,model 实体封装包、repository 提供仓储服务、service 提供具体的服务(重点内容) 3. 看一下代码的继承关系 4...."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"Mr.Hope"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"Day04\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"Mr.Hope\\",\\"url\\":\\"https://mister-hope.com\\"}]}"]]},"headers":[{"level":3,"title":"任务","slug":"任务","link":"#任务","children":[]},{"level":3,"title":"学习过程","slug":"学习过程","link":"#学习过程","children":[]},{"level":2,"title":"遇到的问题","slug":"遇到的问题","link":"#遇到的问题","children":[]},{"level":2,"title":"总结","slug":"总结","link":"#总结","children":[]}],"git":{},"readingTime":{"minutes":1.54,"words":461},"filePathRelative":"md/dev-log/day04.md","autoDesc":true}');export{e as data};
import{_ as n}from"./plugin-vue_export-helper-c27b6911.js";import{o as a,c as s,f as t}from"./app-89848b6d.js";const e={},o=t(`<h2 id="任务" tabindex="-1"><a class="header-anchor" href="#任务" aria-hidden="true">#</a> 任务</h2><ul><li>[x] 活动领域的配置与状态</li></ul><h2 id="学习过程" tabindex="-1"><a class="header-anchor" href="#学习过程" aria-hidden="true">#</a> 学习过程</h2><ol><li>包结构变化,调整对应的包</li><li>了解活动创建的整个流程,然后将流程进行编排(其实就是落库的步骤呗),写对应的 repository 层代码 <ol><li>首先明确要做哪些操作 <ol><li>添加活动</li><li>添加奖品</li><li>添加活动配置</li><li>添加策略</li><li>添加策略明细</li></ol></li><li>编写对应的 repository 接口和实现类</li><li></li></ol></li><li>debug 了解状态模式如何进行的状态判断(感觉不用刻意去学这个设计模式,通过对项目的学习,从而达到状态模式的学习,<strong>后期进行设计模式的统一学习</strong>) <ol><li>首先定义一个状态处理的接口,入参统一是活动ID和当前状态</li><li>定义一个活动状态抽象类,这个抽象类的子类用来判断某种状态是否可以流转</li><li>编写抽象类的实现,里面定义是否可以流转</li><li>编写状态配置类,把每一种活动状态抽象类的实现注入进去并放入 Map 中,供状态处理服务使用</li><li>编写状态处理接口的实现类 <ol><li>先从状态配置中获取当前状态所对应的活动状态流转实现类</li><li>然后实现类调用方法,通过方法的返回值来确定是否能进行操作 <ol><li>如果能进行变更的,先进行落库操作,然后根据 MyBatis 返回值返回对应信息</li><li>如果不能进行变更的,直接返回对应的错误信息</li></ol></li></ol></li></ol></li></ol><h2 id="遇到的问题" tabindex="-1"><a class="header-anchor" href="#遇到的问题" aria-hidden="true">#</a> 遇到的问题</h2><ol><li><p>为什么要使用 <code>BeanUtils.copyProperties()</code></p><p>因为原来很少使用这种方法,以前都是 new 对象,然后把传进来的对象手动一个一个赋值,对这个方法不太了解,简单来说就是实现对象的拷贝,属性名相同的就进行拷贝,属性名不相同的就不进行操作,底层使用反射,首先把读写权限都设置为 true,然后再进行获取和赋值操作,这种操作是 <strong>浅拷贝</strong></p><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code><span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token class-name">Modifier</span><span class="token punctuation">.</span><span class="token function">isPublic</span><span class="token punctuation">(</span>readMethod<span class="token punctuation">.</span><span class="token function">getDeclaringClass</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getModifiers</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
readMethod<span class="token punctuation">.</span><span class="token function">setAccessible</span><span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token class-name">Object</span> value <span class="token operator">=</span> readMethod<span class="token punctuation">.</span><span class="token function">invoke</span><span class="token punctuation">(</span>source<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token class-name">Modifier</span><span class="token punctuation">.</span><span class="token function">isPublic</span><span class="token punctuation">(</span>writeMethod<span class="token punctuation">.</span><span class="token function">getDeclaringClass</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getModifiers</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
writeMethod<span class="token punctuation">.</span><span class="token function">setAccessible</span><span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
writeMethod<span class="token punctuation">.</span><span class="token function">invoke</span><span class="token punctuation">(</span>target<span class="token punctuation">,</span> value<span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></li><li><p>数据库 bug <code>### Error updating database. Cause: java.sql.SQLException: Incorrect string value: &#39;\\xE4\\xB8\\x80\\xE7\\xAD\\x89...&#39; for column &#39;award_name&#39; at row 1</code></p><p>中文插入乱码问题,我建数据库的时候设置了 utf8,但是建表的时候默认没有设置成 <code>utf8</code>,使用的编码是 <code>latin1</code>,所以需要修改字段的编码为 <code>utf8</code></p></li></ol><h2 id="总结" tabindex="-1"><a class="header-anchor" href="#总结" aria-hidden="true">#</a> 总结</h2><ol><li><p>包结果的变化</p><ol><li>首先呢这个解决了我之前的一个疑问:为啥要把数据库的真实操作写到领域层呢?这不应该写到基础服务层更符合逻辑吗?</li><li>更改详情:基础服务模块引入领域模块,在领域层写 repository 接口,在基础服务层写实现</li></ol></li><li><p>状态流程处理</p><p>相对于普通的 if-else 处理流程,状态模式设计模式把状态的流转转化为方法,从而简化了 if-else 一坨接着一坨的形式,如果有新的状态,只需要添加对应的抽象实现以及在其他实现中添加对应的流转方法</p><p><em>后期对设计模式进行统一的学习,目前只了解了基础的程序运行流程,根据流程来了解对应的设计模式,目前对于状态模式的了解仅限于以下两点</em></p><ol><li>将一种状态的流转包装成一个类,然后在类里面定义是否可以流转</li><li>状态的流转通过调用方法的形式进行,而不是通过 if-else 去判断,比如要把状态修改为审核通过,那么直接调用 <code>checkPass()</code> 然后找到当前状态处理类,调用处理类的 <code>checkPass()</code> 方法,然后返回结果就可以了</li></ol></li><li><p>对于学习的思考</p><p>最近陷入了日夜颠倒的死循环,主要就是晚上窝在床上玩手机呢,然后看了会儿星球就想起床学习,一学又搞到两三点三四点,搞不好 bug 多还通了个宵,导致第二天甚至第三天状态低迷,后面要压制学习欲望了,每天该做的做完了就休息,以后每周日休息一天,晚上一点前就睡觉,避免陷入死循环,再多的任务,人的精力也是有限的,只要按部就班稳扎稳打,相信最后也会有收获,不必急于求成</p></li></ol>`,8),i=[o];function p(l,c){return a(),s("div",null,i)}const d=n(e,[["render",p],["__file","day05.html.vue"]]);export{d as default};
const e=JSON.parse('{"key":"v-3b8a654c","path":"/md/dev-log/day05.html","title":"Day05","lang":"zh-CN","frontmatter":{"title":"Day05","index":false,"icon":"laptop-code","category":["开发笔记","学习记录"],"description":"任务\\r[x] 活动领域的配置与状态; 学习过程 1. 包结构变化,调整对应的包 2. 了解活动创建的整个流程,然后将流程进行编排(其实就是落库的步骤呗),写对应的 repository 层代码 1. 首先明确要做哪些操作 1. 添加活动 2. 添加奖品 3. 添加活动配置 4. 添加策略 5. 添加策略明细 2. 编写对应的 repository 接口...","head":[["meta",{"property":"og:url","content":"https://vuepress-theme-hope-docs-demo.netlify.app/md/dev-log/day05.html"}],["meta",{"property":"og:site_name","content":"我的简历"}],["meta",{"property":"og:title","content":"Day05"}],["meta",{"property":"og:description","content":"任务\\r[x] 活动领域的配置与状态; 学习过程 1. 包结构变化,调整对应的包 2. 了解活动创建的整个流程,然后将流程进行编排(其实就是落库的步骤呗),写对应的 repository 层代码 1. 首先明确要做哪些操作 1. 添加活动 2. 添加奖品 3. 添加活动配置 4. 添加策略 5. 添加策略明细 2. 编写对应的 repository 接口..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"Mr.Hope"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"Day05\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"Mr.Hope\\",\\"url\\":\\"https://mister-hope.com\\"}]}"]]},"headers":[{"level":2,"title":"任务","slug":"任务","link":"#任务","children":[]},{"level":2,"title":"学习过程","slug":"学习过程","link":"#学习过程","children":[]},{"level":2,"title":"遇到的问题","slug":"遇到的问题","link":"#遇到的问题","children":[]},{"level":2,"title":"总结","slug":"总结","link":"#总结","children":[]}],"git":{},"readingTime":{"minutes":3.98,"words":1193},"filePathRelative":"md/dev-log/day05.md","autoDesc":true}');export{e as data};
const e=JSON.parse('{"key":"v-3820b40e","path":"/md/dev-log/day06.html","title":"Day06","lang":"zh-CN","frontmatter":{"title":"Day06","index":false,"icon":"laptop-code","category":["开发笔记","学习记录"],"description":"任务 [x] ID 生成策略开发; 学习过程 1. 先看视频了解用到了啥 2. 看小傅哥策略模式的文章 (https://mp.weixin.qq.com/s/zOFLtSFVrYEyTuihzwgKYw) 3. 看代码结构 1. 定义一个接口,用来生成 id 2. 实现接口,实现不同的 id 生成算法 3. 定义一个上下文对象,包装各种 id 生成算...","head":[["meta",{"property":"og:url","content":"https://vuepress-theme-hope-docs-demo.netlify.app/md/dev-log/day06.html"}],["meta",{"property":"og:site_name","content":"我的简历"}],["meta",{"property":"og:title","content":"Day06"}],["meta",{"property":"og:description","content":"任务 [x] ID 生成策略开发; 学习过程 1. 先看视频了解用到了啥 2. 看小傅哥策略模式的文章 (https://mp.weixin.qq.com/s/zOFLtSFVrYEyTuihzwgKYw) 3. 看代码结构 1. 定义一个接口,用来生成 id 2. 实现接口,实现不同的 id 生成算法 3. 定义一个上下文对象,包装各种 id 生成算..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"Mr.Hope"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"Day06\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"Mr.Hope\\",\\"url\\":\\"https://mister-hope.com\\"}]}"]]},"headers":[{"level":3,"title":"任务","slug":"任务","link":"#任务","children":[]},{"level":3,"title":"学习过程","slug":"学习过程","link":"#学习过程","children":[]},{"level":3,"title":"遇到的问题","slug":"遇到的问题","link":"#遇到的问题","children":[]},{"level":3,"title":"总结","slug":"总结","link":"#总结","children":[]}],"git":{},"readingTime":{"minutes":3.6,"words":1081},"filePathRelative":"md/dev-log/day06.md","autoDesc":true}');export{e as data};
import{_ as n}from"./plugin-vue_export-helper-c27b6911.js";import{r as o,o as a,c as t,a as l,d as e,e as r,f as s}from"./app-89848b6d.js";const d={},c=l("h3",{id:"任务",tabindex:"-1"},[l("a",{class:"header-anchor",href:"#任务","aria-hidden":"true"},"#"),e(" 任务")],-1),p=l("ul",null,[l("li",null,"[x] ID 生成策略开发")],-1),h=l("h3",{id:"学习过程",tabindex:"-1"},[l("a",{class:"header-anchor",href:"#学习过程","aria-hidden":"true"},"#"),e(" 学习过程")],-1),_=l("li",null,[l("p",null,"先看视频了解用到了啥")],-1),u={href:"https://mp.weixin.qq.com/s/zOFLtSFVrYEyTuihzwgKYw",target:"_blank",rel:"noopener noreferrer"},f=l("li",null,[l("p",null,"看代码结构"),l("ol",null,[l("li",null,"定义一个接口,用来生成 id"),l("li",null,"实现接口,实现不同的 id 生成算法"),l("li",null,"定义一个上下文对象,包装各种 id 生成算法,然后放到 Spring 容器中供其他类注入使用")]),l("p",null,"今天的代码比较简单,主要就是涉及策略模式的使用,这里的上下文对象和之前的 config 类似,都是把写好的实现类进行包装,统一放到一个容器内,然后其他类通过这个容器,配合枚举拿到对应的实现类进行调用")],-1),D=l("li",null,[l("p",null,"实操")],-1),I=s('<h3 id="遇到的问题" tabindex="-1"><a class="header-anchor" href="#遇到的问题" aria-hidden="true">#</a> 遇到的问题</h3><ol><li>什么是雪花算法</li><li>项目代码中的雪花算法为什么要这么写</li></ol><h3 id="总结" tabindex="-1"><a class="header-anchor" href="#总结" aria-hidden="true">#</a> 总结</h3><ol><li><p>对策略模式的新看法</p><p>现在对策略模式的看法如下:</p><ol><li>将每一种策略想象成一个又一个的工具类</li><li>这些工具类都来自同一个接口,也就是实现的功能是类似的,比如都是生成 ID,都是用来发奖的</li><li>把这些工具类进行 “打包” 处理,封装在一个 Map 中,键使用枚举进行处理</li><li>后续使用通过注入封装好的 Map 和枚举直接进行 get 操作然后使用就可以了</li></ol><p>好处:</p><p>减少 if else 的次数,如果以后要进行扩展,只需要添加一个接口实现,然后在 &quot;打包&quot; 里添加一种策略就可以了,易于扩展,避免代码过度耦合,把一坨代码进行分片,功能职责划分更清楚,并且可以动态切换算法:将实现类进行更改就可以实现动态切换</p></li><li><p>什么是雪花算法</p><p>雪花算法用于生成分布式唯一 ID,核心思想如下:</p><ol><li>将一个64位的整数划分为不同的部分,每一部分代表不同的含义</li><li>符号位(1位):始终为 0,表示生成的 ID 为正整数</li><li>时间戳(41位):记录生成 ID 的时间戳,精确到毫秒级,41位可以表示约 69 年的时间</li><li>工作机器 ID(10位):标识机器的唯一ID,用于解决分布式系统中的多节点生成 ID 的冲突问题,最多有 2^10 台机器 ,即 1024 个</li><li>序列号(12位):表示同一毫秒内的序列号,用于解决同一节点在同一毫秒内生成 ID 的冲突问题,最多可以用 2 的 12 次方个 ID,也就是同一毫秒内同一机器最多生成 4096 个</li></ol><p>通俗化:确保在分布式系统中,通过对时间戳、机器和序列号进行加工,生成一个唯一 ID</p><p>了解了这个东西就能理解项目中为啥要这么写了,后面看看雪花算法的具体源码,看看每个部分如何进行加工的</p></li><li><p>短码生成的时候进行打乱和再加工</p><p>因为没有实际项目经验之前就是直接拿当前时间戳进行获取的,没有进行打乱操作,以后要记住这个操作,避免项目数据被别人抓个包一下子就猜出来了 -.- 好歹穿件衣服,不能裸奔</p></li><li><p>预习预习明天的内容,哈哈哈,好像要开始上强度了,昨天亲戚结婚忙了一天,半夜才回来,今天就到这把,查点资料预习预习明天的,感觉 DDD 这种包组织方式特别适合每种设计模式和算法的落地,MVC 如果想要算法和设计模式落地的话,感觉要考虑的东西很多很多,要么就是牵一发而动全身,要么就是落地之后包里面有很多的多余的东西,这种方式则不会出现这种情况,一个领域里面,使用一种设计模式,并不会影响其他的包,其他的包只管调用所提供的接口就好了</p></li></ol>',4);function m(x,V){const i=o("ExternalLinkIcon");return a(),t("div",null,[c,p,h,l("ol",null,[_,l("li",null,[l("p",null,[e("看小傅哥策略模式的"),l("a",u,[e("文章"),r(i)])])]),f,D]),I])}const k=n(d,[["render",m],["__file","day06.html.vue"]]);export{k as default};
import{_ as i}from"./plugin-vue_export-helper-c27b6911.js";import{o as l,c as a,f as e}from"./app-89848b6d.js";const o={},r=e('<h3 id="任务" tabindex="-1"><a class="header-anchor" href="#任务" aria-hidden="true">#</a> 任务</h3><ul><li>[x] 分库分表组件</li></ul><h3 id="遇到的问题" tabindex="-1"><a class="header-anchor" href="#遇到的问题" aria-hidden="true">#</a> 遇到的问题</h3><p>问题就不说了,这一章节全是问题 T.T,基础不牢,地动山摇啊!!!</p><h3 id="总结" tabindex="-1"><a class="header-anchor" href="#总结" aria-hidden="true">#</a> 总结</h3><p>首先建立一个大局观,要实现一个分库分表组件,那么先要学会如何编写 SpringBoot Starter,然后这个 Starter 需要实现的功能是分库分表,那么一定是有多个数据源,这个数据源从项目的 yml 配置文件传进来,然后就要实现多数据源的切换,然后分表操作就是要修改 SQL 的表名,所以需要做的事情大概是如下:</p><ol><li>读取数据源信息</li><li>动态修改数据源</li><li>动态修改 SQL</li></ol><p>那么细节该如何实现呢?需要想几个问题,某条数据应该分到哪个库的哪个表呢?这个库表信息该存到哪里进行共享呢?如何动态修改数据源呢?如何动态修改 SQL 呢?那么就需要对应的技术进行支持:</p><ol><li>Spring &amp; SpringBoot 基础框架,提供依赖注入、配置管理功能</li><li><code>AbstractRoutingDataSource </code> 实现动态数据源的路由逻辑</li><li><code>AspectJ</code> 切面编程,运行时动态拦截方法调用</li><li>反射 API,从方法参数中提取路由键的值</li><li>正则表达式,解析和修改 SQL</li><li>ThreadLocal,存储路由信息,以支持动态数据源路由</li></ol><p>总体执行流程:</p><ol><li>调用被 <code>@DBRouter</code> 注解的方法</li><li>然后被切面进行拦截,拦截之后先进行路由计算,然后把计算结果保存到 ThreadLocal 中</li><li>然后 DynamicDataSource 通过保存到 ThreadLocal 中的数据确定使用哪一个数据源</li><li>然后 MyBatis 插件修改 SQL 中的表字段</li><li>然后数据库操作执行完成</li><li>切面清理 ThreadLocal 里面的数据</li><li>方法执行完成,返回结果</li></ol><p>虽然步骤不多,但是稍不注意就会出现小 bug,抑或扰动函数算法出错,抑或解析 yml 配置出错等等诸多问题,也是花了两三天才大致搞明白这个路由组件,因为这里面的东西大部分之前都没接触过,查阅了许多文档,毕竟之前连切面都不怎么用,最多也就是拿来做全局日志处理</p><p>总之,要先在大脑里面理清总体的一个执行流程,然后根据这个流程再去看代码要清晰很多,最开始的时候没理清步骤,直接看的代码,那种感觉就像第一天学 DDD 一样,直接一脸懵逼,怎么这么多包,卧槽,第一遍下来大概只学到了百分之五十吧,这一遍大概只学到了整体架构,具体的细节还没掌握,下一次努力啃啃细节,如果要我写整个这一套代码,我肯定写出来会报很多错,但是第一次就想学透整个路程怎么可能呢?好在这一次理清了整体架构,至少有了头绪,不至于开不了头,有了头绪,到处搜一搜,拼拼凑凑也能写,哈哈哈</p>',13),t=[r];function c(d,h){return l(),a("div",null,t)}const p=i(o,[["render",c],["__file","day07~day08.html.vue"]]);export{p as default};
const e=JSON.parse('{"key":"v-649fe232","path":"/md/dev-log/day07~day08.html","title":"Day07 ~ Day08","lang":"zh-CN","frontmatter":{"title":"Day07 ~ Day08","index":false,"icon":"laptop-code","category":["开发笔记","学习记录"],"description":"任务\\r[x] 分库分表组件; 遇到的问题 问题就不说了,这一章节全是问题 T.T,基础不牢,地动山摇啊!!! 总结 首先建立一个大局观,要实现一个分库分表组件,那么先要学会如何编写 SpringBoot Starter,然后这个 Starter 需要实现的功能是分库分表,那么一定是有多个数据源,这个数据源从项目的 yml 配置文件传进来,然后就要实现多...","head":[["meta",{"property":"og:url","content":"https://vuepress-theme-hope-docs-demo.netlify.app/md/dev-log/day07~day08.html"}],["meta",{"property":"og:site_name","content":"我的简历"}],["meta",{"property":"og:title","content":"Day07 ~ Day08"}],["meta",{"property":"og:description","content":"任务\\r[x] 分库分表组件; 遇到的问题 问题就不说了,这一章节全是问题 T.T,基础不牢,地动山摇啊!!! 总结 首先建立一个大局观,要实现一个分库分表组件,那么先要学会如何编写 SpringBoot Starter,然后这个 Starter 需要实现的功能是分库分表,那么一定是有多个数据源,这个数据源从项目的 yml 配置文件传进来,然后就要实现多..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"Mr.Hope"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"Day07 ~ Day08\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"Mr.Hope\\",\\"url\\":\\"https://mister-hope.com\\"}]}"]]},"headers":[{"level":3,"title":"任务","slug":"任务","link":"#任务","children":[]},{"level":3,"title":"遇到的问题","slug":"遇到的问题","link":"#遇到的问题","children":[]},{"level":3,"title":"总结","slug":"总结","link":"#总结","children":[]}],"git":{},"readingTime":{"minutes":2.75,"words":824},"filePathRelative":"md/dev-log/day07~day08.md","autoDesc":true}');export{e as data};
import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as i,c as o,f as t}from"./app-89848b6d.js";const r={},a=t('<h3 id="任务" tabindex="-1"><a class="header-anchor" href="#任务" aria-hidden="true">#</a> 任务</h3><ul><li>[x] 在应用层编排抽奖过程</li></ul><h3 id="总结" tabindex="-1"><a class="header-anchor" href="#总结" aria-hidden="true">#</a> 总结</h3><p>有了前面的模板模式的基础,这一章节相对来说比较容易,自己实现的时候也没有什么大问题,大体流程就是写接口,编排流程,然后写实现类,然后写 Mapper,至于为什么花了两三天,这就不得不说上一章的分库分表了,没写过 SpringBoot Starter,没写过 MyBatis 插件,对 AOP 没有深刻的理解,纯硬啃下来的,但是记不太劳,所以晚上睡不着觉,总感觉缺点什么东西,就花了两天干了如下几件事:</p><ol><li><p>新建一个空的 SpringBoot 项目,从 <code>SpringApplication.run()</code> 方法开始 debug,一步一步看,在这一个过程中主要学到了如下几点:</p><ul><li>一个 SpringBoot 项目是如何初始化的,在哪里创建的容器等等</li><li>如何加载第三方 Starter 的</li><li><s>在哪里打印的Banner 以及如何设置</s> 这个不是重点,哈哈哈,但是挺好玩的</li><li>还有 <code>ApplicationRunner</code> 和 <code>CommandLineRunner</code></li><li>还有异常报告器 <code>exceptionReporters</code></li><li>还有几个关于上下文环境的重要方法 <code>prepareContext()</code> 、<code>refreshContext()</code>、<code>afterRefresh()</code></li></ul><p>明白了 SpringBoot 应用初始化流程就知道所写的分录分表路由 starter 是在哪个阶段进行数据源设置以及为什么要在 <code>AutoConfig</code> 类下进行 Bean 的注入了</p></li><li><p>看了看 MyBatis 插件相关的文档,大致了解了一个 MyBatis 插件如何编写,看了这个以后看 MyBatis-Plus 源码的时候可能会轻松一点</p></li><li><p>复习了一下 AOP,注解的属性有哪些以及该怎么写都有点忘了</p></li><li><p>在这个 debug 的过程中其实画了一些图,但是因为没有 OSS,所以图片不太好展示,所以使用 vuepress + github pages + github actions 搭建了一个博客,后面有空了会把看源码的过程发上去</p></li></ol><p>虽然很想继续往下学,但是感觉这个项目里面,分库分表这一章节应该是灵魂所在了,虽然还没学后面,但是感觉其他章节更多的是关注业务层面,主要是来解决业务问题的,但是分库分表这一章节感觉能彻彻底底搞明白的话收获应该是很大的,虽然进度慢了,但是通过对源码的阅读也学到了很多东西,比如代码规范,在阅读 SpringBoot 源码的时候,给我最大的感觉就是,其实好的东西是不需要太多注释的,因为他每一步所调用的方法都给你写的很明白,比如 SpringBoot 程序初始化过程,只要英文够好,就跟看<s>小学阅读一样</s>,不知道花的这两天值不值,毕竟还有一个月就找工作了,是不是应该快点把项目做完</p>',6),n=[a];function l(c,d){return i(),o("div",null,n)}const h=e(r,[["render",l],["__file","day09~day10.html.vue"]]);export{h as default};
const e=JSON.parse('{"key":"v-c97ab98e","path":"/md/dev-log/day09~day10.html","title":"Day09 ~ Day10","lang":"zh-CN","frontmatter":{"title":"Day09 ~ Day10","index":false,"icon":"laptop-code","category":["开发笔记","学习记录"],"description":"任务 [x] 在应用层编排抽奖过程; 总结 有了前面的模板模式的基础,这一章节相对来说比较容易,自己实现的时候也没有什么大问题,大体流程就是写接口,编排流程,然后写实现类,然后写 Mapper,至于为什么花了两三天,这就不得不说上一章的分库分表了,没写过 SpringBoot Starter,没写过 MyBatis 插件,对 AOP 没有深刻的理解,纯...","head":[["meta",{"property":"og:url","content":"https://vuepress-theme-hope-docs-demo.netlify.app/md/dev-log/day09~day10.html"}],["meta",{"property":"og:site_name","content":"我的简历"}],["meta",{"property":"og:title","content":"Day09 ~ Day10"}],["meta",{"property":"og:description","content":"任务 [x] 在应用层编排抽奖过程; 总结 有了前面的模板模式的基础,这一章节相对来说比较容易,自己实现的时候也没有什么大问题,大体流程就是写接口,编排流程,然后写实现类,然后写 Mapper,至于为什么花了两三天,这就不得不说上一章的分库分表了,没写过 SpringBoot Starter,没写过 MyBatis 插件,对 AOP 没有深刻的理解,纯..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"Mr.Hope"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"Day09 ~ Day10\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"Mr.Hope\\",\\"url\\":\\"https://mister-hope.com\\"}]}"]]},"headers":[{"level":3,"title":"任务","slug":"任务","link":"#任务","children":[]},{"level":3,"title":"总结","slug":"总结","link":"#总结","children":[]}],"git":{},"readingTime":{"minutes":2.48,"words":744},"filePathRelative":"md/dev-log/day09~day10.md","autoDesc":true}');export{e as data};
import{_ as t}from"./plugin-vue_export-helper-c27b6911.js";import{o,c as n,a as e,d as a}from"./app-89848b6d.js";const c={},i=e("h3",{id:"任务",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#任务","aria-hidden":"true"},"#"),a(" 任务")],-1),s=e("ul",null,[e("li",null,"[x] 在应用层编排抽奖过程")],-1),r=e("h3",{id:"总结",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#总结","aria-hidden":"true"},"#"),a(" 总结")],-1),d=e("p",null,"今天的内容比较简单,最主要的问题就是表改了,然后花了很多时间去改对应的 PO 以及 SQL,然后今天第一次开发 application 层,感觉就是把 domain 层各个领域进行组装,然后形成一个又一个的流程,在这里面会使用 MQ 把流程进行切片,之后写门面接口应该就是调 application 层里面各个流程了,这样对于 Controller 层感觉挺好的,只需要简单的封装一下前端传进来的参数,然后调用 application 层执行各个流程就可以了",-1),l=e("p",null,"感觉今天最大的收获就在于学到了在开发的过程中要把整个流程切分一下,分成一块一块的,然后用 MQ 进行后续的操作,用户不需要感知到这一切,他只需要点进去,然后执行一个小的片段,然后剩下的操作可以使用 MQ 来慢慢操作,而不是之前那样直接单线程一个流程写完,又臭又长,返回得还慢,用户体验很不好,学到了流程切片,今天不亏,哈哈哈哈,这个东西还是很有用的",-1),_=[i,s,r,d,l];function h(p,u){return o(),n("div",null,_)}const x=t(c,[["render",h],["__file","day11.html.vue"]]);export{x as default};
const e=JSON.parse('{"key":"v-104da61f","path":"/md/dev-log/day11.html","title":"Day011","lang":"zh-CN","frontmatter":{"title":"Day011","index":false,"icon":"laptop-code","category":["开发笔记","学习记录"],"description":"任务 [x] 在应用层编排抽奖过程; 总结 今天的内容比较简单,最主要的问题就是表改了,然后花了很多时间去改对应的 PO 以及 SQL,然后今天第一次开发 application 层,感觉就是把 domain 层各个领域进行组装,然后形成一个又一个的流程,在这里面会使用 MQ 把流程进行切片,之后写门面接口应该就是调 application 层里面各个...","head":[["meta",{"property":"og:url","content":"https://vuepress-theme-hope-docs-demo.netlify.app/md/dev-log/day11.html"}],["meta",{"property":"og:site_name","content":"我的简历"}],["meta",{"property":"og:title","content":"Day011"}],["meta",{"property":"og:description","content":"任务 [x] 在应用层编排抽奖过程; 总结 今天的内容比较简单,最主要的问题就是表改了,然后花了很多时间去改对应的 PO 以及 SQL,然后今天第一次开发 application 层,感觉就是把 domain 层各个领域进行组装,然后形成一个又一个的流程,在这里面会使用 MQ 把流程进行切片,之后写门面接口应该就是调 application 层里面各个..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"Mr.Hope"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"Day011\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"Mr.Hope\\",\\"url\\":\\"https://mister-hope.com\\"}]}"]]},"headers":[{"level":3,"title":"任务","slug":"任务","link":"#任务","children":[]},{"level":3,"title":"总结","slug":"总结","link":"#总结","children":[]}],"git":{},"readingTime":{"minutes":1.14,"words":341},"filePathRelative":"md/dev-log/day11.md","autoDesc":true}');export{e as data};
import{_ as n}from"./plugin-vue_export-helper-c27b6911.js";import{o as s,c as a,f as t}from"./app-89848b6d.js";const e={},p=t(`<h3 id="任务" tabindex="-1"><a class="header-anchor" href="#任务" aria-hidden="true">#</a> 任务</h3><ul><li>[x] 规则引擎量化人群参与活动</li></ul><h2 id="总结" tabindex="-1"><a class="header-anchor" href="#总结" aria-hidden="true">#</a> 总结</h2><p>首先先去了解了一下组合模式和决策树,然后看了看数据库,其实就是把一个类似于二叉树的结构存到了数据库里,分别对应了三个东西,一个表用来保存决策树的树根信息,然后一个表用来保存树上的所有节点的信息,然后一个表用来存决策树的连接信息,我们可以通过树根的 ID 拿到所有相关的连线信息以及所有相关的节点信息,明白了数据库相关的东西之后屡屡代码结构</p><p>什么是组合模式呢?先看看维基百科对组合模式的定义,然后直接看代码,给我的第一感觉就是把每一个 if-else 的条件抽取出来,然后变成一个又一个的 filter,然后在规则引擎中进行使用,首先把一个个 filter 包装到 map 中,供子类使用</p><p>其中最重要的代码我觉得是这个:</p><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code> <span class="token keyword">protected</span> <span class="token class-name">TreeNodeVO</span> <span class="token function">engineDecisionMaker</span><span class="token punctuation">(</span><span class="token class-name">TreeRuleRich</span> treeRuleRich<span class="token punctuation">,</span> <span class="token class-name">DecisionMatterReq</span> matterReq<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token class-name">TreeRootVO</span> treeRoot <span class="token operator">=</span> treeRuleRich<span class="token punctuation">.</span><span class="token function">getTreeRoot</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">Map</span><span class="token generics"><span class="token punctuation">&lt;</span><span class="token class-name">Long</span><span class="token punctuation">,</span> <span class="token class-name">TreeNodeVO</span><span class="token punctuation">&gt;</span></span> treeNodeMap <span class="token operator">=</span> treeRuleRich<span class="token punctuation">.</span><span class="token function">getTreeNodeMap</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">Long</span> rootNodeId <span class="token operator">=</span> treeRoot<span class="token punctuation">.</span><span class="token function">getTreeRootNodeId</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">TreeNodeVO</span> treeNodeInfo <span class="token operator">=</span> treeNodeMap<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>rootNodeId<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token class-name">Constants<span class="token punctuation">.</span>NodeType</span><span class="token punctuation">.</span><span class="token constant">STEM</span><span class="token punctuation">.</span><span class="token function">equals</span><span class="token punctuation">(</span>treeNodeInfo<span class="token punctuation">.</span><span class="token function">getNodeType</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token class-name">String</span> ruleKey <span class="token operator">=</span> treeNodeInfo<span class="token punctuation">.</span><span class="token function">getRuleKey</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">LogicFilter</span> logicFilter <span class="token operator">=</span> logicFilterMap<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>ruleKey<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">String</span> matterValue <span class="token operator">=</span> logicFilter<span class="token punctuation">.</span><span class="token function">matterValue</span><span class="token punctuation">(</span>matterReq<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">Long</span> nextNode <span class="token operator">=</span> logicFilter<span class="token punctuation">.</span><span class="token function">filter</span><span class="token punctuation">(</span>matterValue<span class="token punctuation">,</span> treeNodeInfo<span class="token punctuation">.</span><span class="token function">getTreeNodeLineInfoList</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
treeNodeInfo <span class="token operator">=</span> treeNodeMap<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>nextNode<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">return</span> treeNodeInfo<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><ol><li>获取树根节点信息</li><li>获取树根所对应的所有节点信息</li><li>判断每个节点是不是叶子节点 <ol><li>如果不是,就执行决策,如果通过就返回下一个节点</li><li>如果是叶子节点,也就是找到了对应的活动号,表示可以参与</li></ol></li></ol><p>那么就可以将代码结构分为两个部分,一个是决策者,提供决策相关逻辑,一个是执行者,对决策链条进行链路执行,然后返回最终结果,那么到这里应该代码逻辑就清晰了,决策者根据一定的比较规则,返回 ture 或者 false,执行者根据这个结果来判断是否要继续进行下一个判断,直到判断到叶子节点</p><p>了解了这个之后代码就好写了</p><p>感觉这个章节最大的难点就在于如果之前没有设计模式基础的话,会很难受,代码跳过去跳过来有时候找不到方向,一般我遇到这种情况的时候我就会梳理一下业务逻辑,代码结构无论怎么变,也一定是根据业务逻辑来的,之前做的事情一样不少,所以就按照自己想的逻辑去代码中找对应,去看看哪里做的比较,哪里拿到的链路结构,这样就将大问题化成了小问题,然后去对应代码中的每一个部分,这里也就是将逻辑执行步骤进行“打散”的过程,找到了每段代码对应那一段逻辑之后,看一看代码的继承体系,大概也就了解个七七八八了</p>`,11),o=[p];function c(l,i){return s(),a("div",null,o)}const k=n(e,[["render",c],["__file","day12.html.vue"]]);export{k as default};
const e=JSON.parse('{"key":"v-12027ebe","path":"/md/dev-log/day12.html","title":"Day012","lang":"zh-CN","frontmatter":{"title":"Day012","index":false,"icon":"laptop-code","category":["开发笔记","学习记录"],"description":"任务 [x] 规则引擎量化人群参与活动; 总结 首先先去了解了一下组合模式和决策树,然后看了看数据库,其实就是把一个类似于二叉树的结构存到了数据库里,分别对应了三个东西,一个表用来保存决策树的树根信息,然后一个表用来保存树上的所有节点的信息,然后一个表用来存决策树的连接信息,我们可以通过树根的 ID 拿到所有相关的连线信息以及所有相关的节点信息,明白了...","head":[["meta",{"property":"og:url","content":"https://vuepress-theme-hope-docs-demo.netlify.app/md/dev-log/day12.html"}],["meta",{"property":"og:site_name","content":"我的简历"}],["meta",{"property":"og:title","content":"Day012"}],["meta",{"property":"og:description","content":"任务 [x] 规则引擎量化人群参与活动; 总结 首先先去了解了一下组合模式和决策树,然后看了看数据库,其实就是把一个类似于二叉树的结构存到了数据库里,分别对应了三个东西,一个表用来保存决策树的树根信息,然后一个表用来保存树上的所有节点的信息,然后一个表用来存决策树的连接信息,我们可以通过树根的 ID 拿到所有相关的连线信息以及所有相关的节点信息,明白了..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"Mr.Hope"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"Day012\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"Mr.Hope\\",\\"url\\":\\"https://mister-hope.com\\"}]}"]]},"headers":[{"level":3,"title":"任务","slug":"任务","link":"#任务","children":[]},{"level":2,"title":"总结","slug":"总结","link":"#总结","children":[]}],"git":{},"readingTime":{"minutes":2.62,"words":786},"filePathRelative":"md/dev-log/day12.md","autoDesc":true}');export{e as data};
<svg xmlns="http://www.w3.org/2000/svg" width="1024" height="1024"><defs><linearGradient id="a" x1="311.63" x2="682.213" y1="892.395" y2="892.395" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#d7d8d5"/><stop offset="1" stop-color="#ededee"/></linearGradient><linearGradient id="b" x1="311.765" x2="682.212" y1="823.503" y2="823.503" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#f1edec"/><stop offset="1" stop-color="#ececea"/></linearGradient><linearGradient id="c" x1="392.855" x2="586.024" y1="720.444" y2="720.444" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#d7d8d5"/><stop offset="1" stop-color="#f6f6f9"/></linearGradient><linearGradient id="d" x1="433.894" x2="590.577" y1="732.829" y2="732.829" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#fbfbfb"/><stop offset="1" stop-color="#fbfbfb"/></linearGradient><linearGradient id="e" x1="144.813" x2="749.738" y1="458.081" y2="458.081" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#d7d8d5"/><stop offset="1" stop-color="#f6f6f9"/></linearGradient><linearGradient id="f" x1="224.595" x2="739.673" y1="472.49" y2="472.49" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#8474f9"/><stop offset="1" stop-color="#a298fe"/></linearGradient><linearGradient id="g" x1="570.823" x2="605.748" y1="672.063" y2="672.063" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#7365e0"/><stop offset="1" stop-color="#9180f2"/></linearGradient><linearGradient id="i" x1="570.823" x2="605.748" y1="672.063" y2="672.063" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#7365e0"/><stop offset="1" stop-color="#9180f2"/></linearGradient><linearGradient id="j" x1="567.956" x2="604.653" y1="670.76" y2="670.76" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#7365e0"/><stop offset="1" stop-color="#9180f2"/></linearGradient><linearGradient id="l" x1="567.956" x2="604.653" y1="670.76" y2="670.76" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#7365e0"/><stop offset="1" stop-color="#9180f2"/></linearGradient><linearGradient id="m" x1="649.832" x2="723.193" y1="387.174" y2="387.174" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#7365e0"/><stop offset="1" stop-color="#9180f2"/></linearGradient><linearGradient id="n" x1="497.37" x2="627.068" y1="523.93" y2="523.93" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#7365e0"/><stop offset="1" stop-color="#9180f2"/></linearGradient><linearGradient id="o" x1="634.158" x2="671.665" y1="317.878" y2="317.878" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#7365e0"/><stop offset="1" stop-color="#9180f2"/></linearGradient><linearGradient id="q" x1="634.158" x2="668.136" y1="317.354" y2="317.354" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#7365e0"/><stop offset="1" stop-color="#9180f2"/></linearGradient><linearGradient id="r" x1="634.306" x2="669.068" y1="317.413" y2="317.413" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#7365e0"/><stop offset="1" stop-color="#9180f2"/></linearGradient><linearGradient id="s" x1="635.238" x2="669.942" y1="317.568" y2="317.568" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#7365e0"/><stop offset="1" stop-color="#9180f2"/></linearGradient><linearGradient id="t" x1="636.112" x2="670.777" y1="317.817" y2="317.817" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#7365e0"/><stop offset="1" stop-color="#9180f2"/></linearGradient><linearGradient id="u" x1="636.947" x2="671.582" y1="318.161" y2="318.161" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#7365e0"/><stop offset="1" stop-color="#9180f2"/></linearGradient><linearGradient id="v" x1="637.752" x2="671.665" y1="318.382" y2="318.382" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#7365e0"/><stop offset="1" stop-color="#9180f2"/></linearGradient><linearGradient id="w" x1="424.437" x2="470.852" y1="691.21" y2="691.21" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#7365e0"/><stop offset="1" stop-color="#9180f2"/></linearGradient><linearGradient id="x" x1="409.294" x2="733.378" y1="532.351" y2="532.351" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#8474f9"/><stop offset="1" stop-color="#a298fe"/></linearGradient><linearGradient id="y" x1="528.141" x2="613.767" y1="531.97" y2="531.97" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset=".005" stop-color="#eff0f4"/><stop offset="1" stop-color="#feffff"/></linearGradient><linearGradient id="z" x1="375.464" x2="667.988" y1="488.243" y2="488.243" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#7365e0"/><stop offset="1" stop-color="#9180f2"/></linearGradient><linearGradient id="A" x1="645.82" x2="861.671" y1="748.761" y2="748.761" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#d7d8d5"/><stop offset="1" stop-color="#f6f6f9"/></linearGradient><clipPath id="h"><path d="m605.7 682.3-33.8-19.7c-.4-.2-.7-.5-1.1-.8l33.8 19.7c.4.3.8.5 1.1.8Z"/></clipPath><clipPath id="k"><path d="m568 660 33.8 19.7c1.1.7 2.1 1.3 2.9 1.9l-33.8-19.7c-.8-.6-1.8-1.2-2.9-1.9Z"/></clipPath><clipPath id="p"><path d="m637.8 308.6 33.8 19.7c-1.1-.6-2.3-1-3.7-1.1l-33.8-19.7c1.4.1 2.7.5 3.7 1.1Z"/></clipPath></defs><path fill="#e5ad65" d="m853.5 860.6 4.9.3"/><path fill="url(#a)" d="M682.2 806.5c0 .7-.1 1.5-.4 2.2 0 .1 0 .2-.1.2-.2.7-.6 1.3-1 2-.1.1-.2.2-.2.4-.5.6-1 1.3-1.7 1.9-.4.4-1 .8-1.5 1.1-.4.3-.8.6-1.3.9l-192.8 112c-1.3.7-2.7 1.3-4.2 1.8-.5.2-1.1.3-1.6.5-.7.2-1.4.4-2.1.5-.9.2-1.7.3-2.6.4-.2 0-.4.1-.6.1-1.2.1-2.4.2-3.6.2h-.6c-1.2 0-2.4-.1-3.5-.2-.2 0-.4 0-.5-.1-1.2-.1-2.3-.3-3.4-.6-.2 0-.4-.1-.6-.1l-3-.9c-.2-.1-.4-.1-.5-.2-1.1-.4-2.2-1-3.3-1.5l-134.9-77.9c-4.2-2.4-6.3-5.6-6.3-8.8l-.1 47.5c0 3.2 2.1 6.4 6.3 8.8L453 974.6c1 .6 2 1 3.1 1.5.1 0 .1 0 .2.1.2.1.3.1.5.2.6.2 1.2.5 1.9.6.3.1.7.2 1.1.3.2.1.4.1.6.1.2 0 .4.1.6.1.7.1 1.4.3 2.1.4.3 0 .5.1.8.1.2 0 .4 0 .5.1.3 0 .5.1.8.1.7.1 1.4.1 2.1.1h2.3c.8 0 1.6-.1 2.4-.2h.3c.2 0 .4-.1.6-.1.6-.1 1.2-.1 1.8-.3.3 0 .5-.1.8-.2.7-.1 1.4-.3 2.1-.5.4-.1.8-.2 1.1-.3.2-.1.3-.2.5-.2 1.5-.5 2.9-1.1 4.2-1.8l192.8-112.1c.1-.1.2-.1.3-.2.4-.2.7-.5 1.1-.8.5-.4 1.1-.7 1.5-1.1l.1-.1c.5-.5.9-.9 1.3-1.4.1-.1.1-.2.2-.3.1-.1.2-.2.2-.4.1-.2.3-.4.4-.6l.6-1.2c0-.1 0-.1.1-.2 0-.1 0-.2.1-.2.1-.3.2-.5.2-.8.1-.4.1-.8.1-1.2v-.2l-.2-47.4Z"/><path fill="url(#b)" d="M675.9 797.7c8.4 4.8 8.4 12.7.1 17.5l-192.8 112c-8.3 4.8-21.8 4.8-30.2 0l-134.9-77.9c-8.4-4.8-8.4-12.7-.1-17.5l192.8-112.1c8.3-4.8 21.8-4.8 30.2 0l134.9 78Z"/><path fill="url(#c)" d="M545 554.7s-.1 0 0 0c-.3-.2-.5-.3-.8-.4-.2-.1-.5-.2-.7-.3-.2 0-.3-.1-.5-.1H542.7c-.3 0-.5-.1-.8-.1h-1.4c-.2 0-.4 0-.5.1-.4.1-.8.1-1.2.3-.2 0-.3.1-.5.2-.2 0-.3.1-.5.2s-.4.1-.6.2c-.6.3-1.2.6-1.9.9L406.4 630c-.9.5-1.7 1.1-2.6 1.8-.3.2-.5.5-.8.7-.4.3-.8.7-1.2 1-.2.2-.4.4-.5.6-.2.2-.3.3-.4.5-.2.2-.3.4-.5.5-.4.4-.7.9-1.1 1.3-.1.2-.3.3-.4.5-.1.1-.1.2-.2.3-.1.2-.2.3-.3.5-.3.4-.5.8-.8 1.2-.2.4-.5.8-.7 1.2 0 0 0 .1-.1.1 0 0 0 .1-.1.1-.2.3-.4.6-.5.9l-.6 1.2c-.2.4-.3.7-.5 1.1v.2c-.2.4-.3.8-.5 1.2-.2.4-.3.9-.5 1.3-.1.2-.1.4-.2.6 0 .1-.1.2-.1.3 0 .2-.1.3-.1.5-.1.5-.3 1-.4 1.6-.1.3-.1.6-.2.9 0 .2-.1.3-.1.5s-.1.3-.1.5c-.1.9-.2 1.8-.2 2.6l.6 201c0 4.3 1.5 7.3 4 8.7l41 23.8c-2.4-1.4-4-4.4-4-8.7l-.6-201c0-1 .1-2.1.3-3.1 0-.2.1-.3.1-.5.2-1 .4-2 .7-3 0-.1.1-.2.1-.3.3-1.1.7-2.2 1.2-3.2v-.1c.5-1.1 1-2.1 1.6-3.2 0 0 0-.1.1-.1.6-1 1.2-2 1.9-2.9.1-.1.1-.2.2-.3.6-.8 1.3-1.6 2-2.4.1-.2.3-.3.4-.5.6-.6 1.1-1.1 1.7-1.6.3-.2.5-.5.8-.7.8-.7 1.7-1.3 2.6-1.8l128.9-74.4c.9-.5 1.7-.9 2.5-1.1.2-.1.3-.1.5-.2.8-.2 1.5-.4 2.2-.5h.2c.8-.1 1.5 0 2.2.1h.1c.7.2 1.4.4 2 .7l-41-23.7Z"/><path fill="url(#d)" d="M576.4 579.5c7.5-4.3 13.6-.8 13.7 7.8l.6 201c0 8.6-6.1 19.2-13.6 23.5l-128.9 74.4c-7.5 4.3-13.6.8-13.7-7.8l-.6-201c0-8.6 6.1-19.2 13.6-23.5l128.9-74.4Z"/><path fill="url(#e)" d="M729 79.3c.9-.3 1.8-.7 2.7-.9.6-.2 1.1-.3 1.7-.5l1.5-.3c.7-.1 1.4-.2 2-.3.4 0 .8-.1 1.1-.1.9-.1 1.7-.1 2.5 0h.5c1 .1 1.9.2 2.8.4.2 0 .5.1.7.2l2.1.6c.2.1.4.1.6.2.9.3 1.7.7 2.5 1.2l-41-23.8c-.1 0-.1-.1-.2-.1-.6-.3-1.3-.7-1.9-.9-.1 0-.2-.1-.4-.1-.2-.1-.4-.2-.7-.2-.3-.1-.7-.3-1-.4-.3-.1-.7-.2-1.1-.2-.2-.1-.5-.1-.7-.2-.1 0-.3-.1-.4-.1-.7-.1-1.5-.2-2.3-.3h-2.5c-.2 0-.4 0-.6.1-.4 0-.8.1-1.1.1-.4 0-.7.1-1.1.1-.3 0-.6.1-.9.2l-1.5.3c-.3.1-.6.1-.9.2-.3.1-.6.2-.8.3l-2.7.9c-.3.1-.6.2-1 .3-.2.1-.4.2-.5.3-1.5.7-3.1 1.4-4.7 2.3L182.6 346.5c-1.2.7-2.4 1.5-3.6 2.3-.4.3-.8.5-1.1.8l-2.4 1.8c-.4.3-.9.7-1.3 1.1-.7.6-1.4 1.2-2.1 1.9-.4.4-.8.8-1.3 1.2-.3.2-.5.5-.8.7-.3.3-.5.6-.8.9-.9.9-1.7 1.8-2.5 2.7l-.8.8c-.2.3-.4.5-.7.8l-1.5 1.8c-.3.4-.6.7-.9 1.1-.3.3-.5.7-.8 1.1-.4.5-.7 1-1.1 1.4-.2.3-.5.6-.7 1l-1.2 1.8c-.2.4-.5.7-.7 1.1-.1.1-.2.3-.3.4-.7 1.1-1.3 2.1-2 3.2 0 .1-.1.2-.1.2-.1.2-.3.5-.4.7-.4.8-.9 1.5-1.3 2.3-.2.4-.4.7-.6 1.1-.2.4-.4.8-.6 1.1-.2.3-.3.7-.5 1-.4.9-.8 1.7-1.2 2.6l-.3.6c0 .1 0 .1-.1.2-.5 1.1-1 2.3-1.4 3.4-.1.2-.1.4-.2.6-.2.4-.3.8-.4 1.2l-.6 1.8c-.1.4-.3.9-.4 1.3-.2.5-.3 1-.5 1.6-.1.3-.2.7-.3 1-.2.6-.3 1.1-.4 1.7-.2.6-.3 1.3-.5 1.9-.1.2-.1.5-.2.7-.1.5-.2.9-.2 1.4-.2 1-.4 2-.5 3 0 .3-.1.6-.1.9 0 .3 0 .5-.1.8-.3 2.2-.4 4.4-.4 6.6l1.1 402.8c0 11.9 4.3 20.3 11.1 24.3l41 23.8c-6.8-4-11.1-12.4-11.1-24.3l-1.1-402.8c0-2.2.2-4.4.4-6.6.1-.5.1-1.1.2-1.6.1-1 .3-2 .5-3 .1-.7.3-1.4.4-2.1.1-.6.3-1.3.5-1.9.2-.9.5-1.8.7-2.7.2-.5.3-1 .5-1.6.3-1 .7-2 1-3.1.1-.4.3-.8.4-1.2.5-1.4 1.1-2.8 1.7-4.2.1-.2.2-.4.2-.5.5-1.2 1.1-2.4 1.7-3.6l.6-1.2c.6-1.1 1.2-2.3 1.8-3.4.1-.2.3-.5.4-.7l2.4-3.9c.2-.4.5-.7.7-1.1.6-.9 1.2-1.8 1.9-2.7.4-.5.7-1 1.1-1.5.6-.7 1.1-1.5 1.7-2.2l1.5-1.8c.5-.6 1-1.1 1.5-1.7.8-.9 1.7-1.8 2.5-2.7l1.6-1.6c.4-.4.8-.8 1.3-1.2.7-.6 1.4-1.3 2.2-1.9.4-.4.8-.7 1.3-1.1l2.4-1.8c.4-.3.7-.6 1.1-.8 1.2-.8 2.4-1.6 3.6-2.3l499.3-288c1.6-.9 3.2-1.7 4.7-2.3.5-.3 1-.4 1.5-.6Z"/><path fill="#fdfdfd" d="M722.8 82.2c20.8-12 38-2.3 38 21.7l1.1 402.8c.1 24-16.9 53.5-37.8 65.5L225 860.4c-20.8 12-38 2.3-38-21.7l-1.1-402.8c-.1-24 16.9-53.5 37.8-65.5L722.8 82.2Z"/><path fill="url(#f)" d="M738.7 160.2c-.1-19.5-14-27.5-31-17.7l-45.5 26.2c-.3.1-.5.2-.8.4l-406 234.6c-17 9.8-30.8 33.8-30.8 53.3l.9 327.8c.1 19.5 14 27.5 31 17.7l45.5-26.2c.3-.1.5-.2.8-.4L709 541.4c17-9.8 30.8-33.8 30.8-53.3l-1.1-327.9Z"/><path fill="#fff" fill-opacity=".36" d="M775.1 183.7c-.1-19.5-14-27.5-31-17.7l-45.5 26.2c-.3.1-.5.2-.8.4L291.7 427.2c-17 9.8-30.8 33.8-30.8 53.3l.9 327.8c.1 19.5 14 27.5 31 17.7l45.5-26.2c.3-.1.5-.2.8-.4l406.2-234.5c17-9.8 30.8-33.8 30.8-53.3l-1-327.9Z"/><path fill="url(#g)" d="m605.7 682.3-33.8-19.7c-.4-.2-.7-.5-1.1-.8l33.8 19.7c.4.3.8.5 1.1.8Z"/><g clip-path="url(#h)"><path fill="url(#i)" d="m605.7 682.3-33.8-19.7c-.4-.2-.7-.5-1.1-.8l33.8 19.7c.4.3.8.5 1.1.8"/></g><path fill="url(#j)" d="m568 660 33.8 19.7c1.1.7 2.1 1.3 2.9 1.9l-33.8-19.7c-.8-.6-1.8-1.2-2.9-1.9Z"/><g clip-path="url(#k)"><path fill="url(#l)" d="m604.7 681.5-33.8-19.7c-.8-.6-1.7-1.2-2.9-1.9l33.8 19.7c1.1.7 2.1 1.4 2.9 1.9"/></g><path fill="url(#m)" d="M689.4 374.4c-.1 0-.1 0 0 0-.3-.2-.6-.3-.9-.4-.3-.1-.5-.2-.8-.3H687.4c-.1 0-.3-.1-.4-.1-.3 0-.5-.1-.8-.1h-.8c-.3 0-.6 0-.9.1-.3 0-.6.1-1 .2-.1 0-.2.1-.2.1-.1 0-.2.1-.3.1-.2.1-.5.1-.7.2-.5.2-.9.4-1.4.7l-1.5.8c-1.7 1-3.4 1.8-5.1 2.5-.5.2-1.1.4-1.6.6-1 .4-1.9.7-2.9 1-.6.2-1.3.4-1.9.5-.6.1-1.1.3-1.7.4-.8.1-1.5.3-2.2.3-.4 0-.8.1-1.2.1-1 .1-2 .1-2.9 0h-.3c-1.1-.1-2.1-.2-3.1-.4-.3-.1-.5-.1-.8-.2-.8-.2-1.5-.4-2.3-.7-.2-.1-.5-.2-.7-.3-1-.4-1.9-.8-2.8-1.3l33.8 19.7c.1 0 .2.1.2.1.7.4 1.4.7 2.2 1.1.1.1.3.1.4.1.2.1.5.2.7.3.4.1.8.3 1.2.4.4.1.7.2 1.1.3.3.1.5.1.8.2.2 0 .3.1.5.1.8.1 1.7.2 2.6.3h.4c.8 0 1.6.1 2.4 0 .2 0 .4 0 .6-.1.4 0 .8-.1 1.2-.1.4 0 .9-.1 1.3-.1.3 0 .6-.1.9-.2.6-.1 1.1-.2 1.7-.4.3-.1.7-.1 1-.2l.9-.3c1-.3 1.9-.6 2.9-1 .4-.1.7-.2 1.1-.4l.6-.3c1.7-.7 3.4-1.5 5.1-2.5l1.5-.8c.7-.4 1.4-.7 2.1-.9.1 0 .2-.1.3-.1.7-.2 1.4-.3 2.1-.4.7 0 1.3 0 2 .2h.1c.6.2 1.3.4 1.8.8l-34-19.6Z"/><path fill="url(#n)" d="M626.3 510.5c.1-.9.2-1.9.3-2.8.1-.7.1-1.3.2-2 .2-2.1.3-4.2.2-6.2-.1-17.7-6.3-30.2-16.4-36l-33.8-19.7c10.1 5.9 16.3 18.3 16.4 36 0 2-.1 4.1-.2 6.2 0 .7-.1 1.3-.2 2-.1 1.3-.3 2.7-.5 4-.2 1.5-.5 3-.8 4.5-.2 1-.4 2-.6 3.1-.2 1-.5 1.9-.7 2.9-.3 1.3-.7 2.7-1.1 4-.2.8-.5 1.5-.7 2.3l-1.5 4.5c-.2.6-.4 1.2-.7 1.9-.8 2.1-1.6 4.1-2.5 6.2-.1.2-.2.5-.3.7-.8 1.8-1.7 3.7-2.6 5.5-.3.6-.6 1.1-.9 1.7l-2.7 5.1c-.2.3-.4.6-.5 1-1.1 1.9-2.3 3.9-3.5 5.7-.4.5-.7 1.1-1.1 1.6-.9 1.4-1.8 2.7-2.8 4-.5.7-1 1.4-1.6 2.1-.8 1.1-1.7 2.2-2.5 3.2-.7.9-1.4 1.8-2.2 2.7l-2.1 2.4c-1.2 1.4-2.5 2.7-3.7 4l-2.4 2.4c-.6.6-1.3 1.2-1.9 1.8-1 1-2.1 1.9-3.2 2.8-.6.5-1.3 1.1-1.9 1.6-1.2.9-2.3 1.8-3.5 2.7-.6.4-1.1.8-1.7 1.2-1.8 1.2-3.5 2.4-5.4 3.4-1.7 1-3.5 1.9-5.1 2.7-.4.2-.9.4-1.3.6-.9.4-1.9.8-2.8 1.1-1.3.5-2.7 1-4 1.4-.8.3-1.7.5-2.5.7-.8.2-1.5.3-2.3.5-1 .2-2 .3-3 .5-.6.1-1.1.1-1.7.2-1.2.1-2.4.1-3.6.1h-.8c-1.4-.1-2.8-.3-4.1-.5-.3-.1-.7-.2-1-.2-1.1-.2-2.1-.5-3.1-.9l-.9-.3c-1.3-.5-2.5-1.1-3.7-1.7l33.8 19.7c.1.1.2.1.3.2.9.5 1.8 1 2.8 1.4.2.1.4.1.6.2l.9.3c.5.2 1 .4 1.5.5.5.2 1.1.3 1.6.4.3.1.7.2 1 .2.2 0 .3.1.5.1 1.1.2 2.2.3 3.4.4h1c.9 0 1.8.1 2.7 0 .3 0 .6-.1.9-.1.6 0 1.1-.1 1.7-.2.5-.1 1-.1 1.6-.2.5-.1.9-.2 1.4-.3.8-.1 1.5-.3 2.3-.5.4-.1.8-.1 1.2-.3.4-.1.8-.3 1.3-.4 1.3-.4 2.6-.8 4-1.4.5-.2.9-.3 1.4-.5.5-.2.9-.4 1.4-.6.4-.2.9-.4 1.3-.6 1.7-.8 3.4-1.7 5.1-2.7 1.8-1 3.6-2.2 5.4-3.4.6-.4 1.1-.8 1.7-1.2 1.2-.9 2.4-1.7 3.5-2.7.6-.5 1.3-1.1 1.9-1.6 1.1-.9 2.1-1.8 3.2-2.8.6-.6 1.3-1.2 1.9-1.8.4-.4.8-.7 1.2-1.1.4-.4.8-.9 1.2-1.3 1.3-1.3 2.5-2.6 3.7-4 .4-.4.8-.8 1.2-1.3.3-.4.6-.8.9-1.1.7-.9 1.5-1.8 2.2-2.7.5-.6 1-1.1 1.4-1.7.4-.5.7-1 1.1-1.5.5-.7 1-1.4 1.6-2.1.4-.5.7-1 1.1-1.5.6-.8 1.1-1.7 1.7-2.5.4-.5.7-1.1 1.1-1.6.1-.2.3-.5.5-.7 1-1.6 2-3.1 2.9-4.7.1-.1.1-.2.2-.3.2-.3.4-.6.5-1 .6-1.1 1.3-2.3 1.9-3.4.3-.5.5-1.1.8-1.6.3-.6.6-1.1.9-1.7.2-.5.5-1 .7-1.5.6-1.3 1.2-2.7 1.8-4 .1-.2.2-.5.3-.7 0-.1.1-.1.1-.2.7-1.7 1.4-3.3 2.1-5l.3-.9c.2-.6.4-1.2.7-1.9.3-.8.6-1.7.9-2.5.2-.7.4-1.3.6-2 .2-.8.5-1.5.7-2.3.1-.5.3-.9.4-1.4.2-.9.4-1.7.6-2.6.2-1 .5-1.9.7-2.9.1-.3.2-.7.2-1 .1-.7.2-1.4.4-2.1.3-1.5.6-3 .8-4.5.2-.7.3-1.1.3-1.5Z"/><path fill="url(#o)" d="m637.8 308.6 33.8 19.7c-1.1-.6-2.3-1-3.7-1.1l-33.8-19.7c1.4.1 2.7.5 3.7 1.1Z"/><g clip-path="url(#p)"><path fill="url(#q)" d="m668 327.2-33.8-19.7h.1l33.8 19.7h-.1"/><path fill="url(#r)" d="m668.1 327.2-33.8-19.7c.3 0 .6.1.9.1l33.8 19.7c-.2-.1-.5-.1-.9-.1"/><path fill="url(#s)" d="m669.1 327.3-33.8-19.7c.3.1.6.1.9.2l33.8 19.7c-.3-.1-.6-.2-.9-.2"/><path fill="url(#t)" d="m669.9 327.5-33.8-19.7c.3.1.6.2.8.3l33.8 19.7c-.2-.1-.5-.2-.8-.3"/><path fill="url(#u)" d="M670.8 327.8 637 308.1c.3.1.5.2.8.4l33.8 19.7c-.3-.2-.5-.3-.8-.4"/><path fill="url(#v)" d="m671.6 328.2-33.8-19.7h.1l33.7 19.7"/></g><path fill="url(#w)" d="M466 730.1c0-.1-.1-.2-.1-.3-.2-.6-.4-1.3-.5-2 0-.2-.1-.5-.1-.7-.1-.6-.1-1.3-.1-2v-.7c0-.9.1-1.8.2-2.8 0-.2.1-.3.1-.5.1-.9.3-1.8.6-2.7 0-.1 0-.1.1-.2.3-1.1.7-2.2 1.1-3.3 0-.1.1-.3.2-.6 0-.1.1-.2.1-.4s.1-.3.1-.5c.1-.2.1-.4.2-.6 0-.1.1-.2.1-.4.2-.6.3-1.3.5-2 0-.2.1-.3.1-.5.2-.7.3-1.4.5-2.1 0-.2.1-.4.1-.6 0-.1.1-.3.1-.4.1-.4.2-.8.2-1.2.1-.6.2-1.1.3-1.8.1-.5.2-1.1.3-1.6.1-.6.2-1.2.3-1.9 0-.1 0-.3.1-.4v-.4c.2-1.9.4-3.8.4-5.5 0-13.6-4.9-23.1-12.6-27.6l-33.8-19.7c7.7 4.5 12.5 14 12.6 27.6 0 1.7-.2 3.6-.4 5.5 0 .3-.1.6-.1.9l-.3 1.8c-.1.5-.2 1.1-.3 1.6l-.3 1.8c-.1.5-.2 1.1-.3 1.6 0 .2-.1.4-.1.6-.2.7-.3 1.4-.5 2.1 0 .2-.1.3-.1.5-.2.7-.4 1.4-.5 2 0 .1-.1.2-.1.4-.1.5-.2.9-.3 1.2 0 .1-.1.2-.1.3-.1.3-.2.5-.2.6 0 .1-.1.2-.1.4-.2.4-.3.9-.5 1.3-.2.5-.3 1-.4 1.5v.1c0 .1 0 .1-.1.2-.1.4-.2.9-.3 1.3-.1.5-.2 1-.2 1.5 0 .2-.1.3-.1.5v.2c-.1.9-.2 1.7-.2 2.5v.6c0 .7.1 1.3.1 2 0 .2.1.5.1.7.1.7.3 1.4.5 2 0 .1 0 .2.1.3.2.7.5 1.4.9 2 .1.2.2.3.3.5.3.4.6.9.9 1.2l.4.4c.5.5 1 .9 1.6 1.2l33.8 19.7c-.6-.3-1.1-.8-1.6-1.2l-.4-.4c-.3-.4-.7-.8-.9-1.2-.1-.2-.2-.3-.3-.5-.6-.5-.9-1.1-1.1-1.9Z"/><path fill="#d5e9f4" d="M528.5 550.4c.1-1 .2-2 .4-3 .2-1.1.3-2.2.6-3.2.2-.8.3-1.7.5-2.5.2-.7.3-1.4.5-2.2.3-1 .5-2.1.9-3.1.2-.6.3-1.2.5-1.8.4-1.2.8-2.5 1.3-3.7.1-.4.3-.8.4-1.2.6-1.6 1.2-3.2 1.9-4.7.2-.4.3-.7.5-1.1.6-1.3 1.2-2.5 1.8-3.7.2-.4.4-.9.7-1.3.8-1.5 1.5-2.9 2.4-4.3.1-.1.1-.2.2-.3.9-1.5 1.8-3 2.7-4.4.3-.5.6-.9.9-1.4.7-1 1.4-2 2-2.9.4-.6.8-1.1 1.3-1.7.6-.8 1.2-1.6 1.9-2.4.6-.7 1.2-1.4 1.7-2.1.5-.6 1.1-1.2 1.6-1.8 1-1.1 1.9-2.1 2.9-3.1.6-.6 1.2-1.2 1.7-1.8.5-.4.9-.9 1.4-1.3l2.4-2.1c.5-.4.9-.8 1.4-1.2.9-.7 1.8-1.4 2.6-2l1.2-.9c1.3-.9 2.6-1.8 4-2.5 1.7-1 3.4-1.8 5.1-2.6.6-.2 1.1-.4 1.7-.7 1-.4 2-.7 2.9-1 .7-.2 1.3-.4 2-.5.6-.1 1.2-.3 1.7-.4.8-.1 1.5-.3 2.3-.3.4 0 .8-.1 1.3-.1 1-.1 2.1-.1 3 0h.3c1.1.1 2.2.2 3.2.4.3.1.6.1.8.2.8.2 1.6.4 2.3.7.2.1.5.2.7.3 1 .4 1.9.8 2.9 1.4l-33.8-19.7c-.1 0-.2-.1-.2-.1-.7-.4-1.5-.8-2.2-1.1-.1-.1-.3-.1-.4-.1-.2-.1-.5-.2-.7-.3-.4-.1-.8-.3-1.2-.4l-1.2-.3c-.3-.1-.5-.1-.8-.2-.2 0-.3-.1-.5-.1-.9-.1-1.7-.3-2.6-.3h-.4c-.8 0-1.6-.1-2.5 0-.2 0-.4 0-.6.1-.4 0-.8.1-1.3.1s-.9.1-1.4.1c-.3 0-.6.1-.9.2-.6.1-1.2.2-1.7.4-.4.1-.7.1-1.1.2l-.9.3c-1 .3-2 .6-2.9 1-.4.1-.7.2-1.1.4l-.6.3c-1.7.7-3.4 1.6-5.1 2.6-1.3.8-2.6 1.6-4 2.5l-1.2.9c-.9.6-1.8 1.3-2.6 2-.5.4-1 .8-1.4 1.2l-2.4 2.1c-.5.4-.9.9-1.4 1.3-.3.3-.6.5-.8.8-.3.3-.6.7-.9 1-1 1-2 2-2.9 3.1l-.9.9c-.3.3-.5.6-.7.9-.6.7-1.2 1.4-1.7 2.1-.4.4-.7.9-1.1 1.3-.3.4-.5.7-.8 1.1-.4.6-.8 1.1-1.3 1.7l-.9 1.2-1.2 1.8c-.3.5-.6.9-.9 1.4-.1.2-.3.4-.4.6-.8 1.2-1.5 2.5-2.3 3.7v.1c0 .1-.1.2-.1.3-.6 1.1-1.3 2.2-1.9 3.4-.2.3-.3.6-.5.9-.2.4-.4.9-.7 1.3-.2.5-.5 1-.7 1.5-.4.7-.7 1.5-1 2.3-.2.4-.3.7-.5 1.1-.1.2-.1.3-.2.5-.6 1.3-1.1 2.6-1.6 3.9 0 .1-.1.3-.1.4-.1.4-.3.8-.4 1.1-.3.8-.6 1.7-.9 2.5-.1.4-.2.8-.4 1.2-.2.6-.4 1.2-.5 1.7-.1.5-.3 1-.4 1.4-.2.6-.3 1.1-.4 1.7-.2.7-.4 1.4-.5 2.2-.1.3-.2.7-.2 1l-.3 1.5c-.2 1.1-.4 2.2-.6 3.2-.1.4-.1.7-.2 1.1-.1.6-.1 1.3-.2 1.9 0 .5-.1 1-.1 1.5-.1 1.6-.2 3.1-.2 4.7 0 13.5 4.8 23 12.5 27.4l33.8 19.7c-7.7-4.5-12.5-14-12.5-27.4 0-1.5.1-3.1.2-4.7-.1-.8-.1-1.3 0-1.8Z"/><path fill="url(#x)" d="M728.8 404.2c0 .8 3.8 19.1 4.5 33.1 0 16.1-3.6 38.6-3.6 39.5-2.2 12.3-7.3 22.1-14 25.9l-1.5.9c-22.9 13.2-42 47.2-41.9 73.5 0 9.3 3.6 16.2 3.8 16.5 3 6.8.8 19.9-6.6 30.1l-41.3 50.2c-2.2 2.1-5.2 4.7-8.1 6.4-6.7 3.8-11.8 4.3-15.5 1.3-5.2-3.8-20.7-11.8-34-4.1-12.5 7.2-28.8 33.6-33.9 42.5-4.4 7.6-9.6 13.2-15.5 16.6-2.2 1.3-5.2 3-7.4 2.6l-39.9-2.4c-8.1-.4-11.1-10.6-6.7-21.6.2-.6 3.7-12.3 3.7-20.8-.1-27.2-19.3-38.1-42.2-24.9l-1.5.8c-6.7 3.8-12.6-.4-14.1-9.7 0-.8-3.7-19.1-3.8-35.2 0-15.2 3.6-37.8 3.6-38.6 2.2-11.5 7.3-22 14-25.9 23.6-13.6 42.7-47.6 42.7-73.9 0-9.3-3.6-16.2-3.8-16.5-3.7-6.4-.8-20.8 5.8-30.6l42.7-51c2.2-2.1 5.2-4.7 8.1-6.4 5.9-3.4 11.8-4.3 15.5-.5 5.2 3.8 20.7 10.1 33.3 2.9 12.6-7.3 28-31.5 33.2-40.4 3.7-7.2 8.8-12.7 14.7-16.1 2.2-1.3 5.2-2.1 7.4-2.6l41.4 1.6c8.1.4 11.1 11.4 6.7 22.4-.2.6-3.7 12.3-3.7 20.8.1 27.2 19.4 38.1 42.2 24.9l1.5-.8c6.8-4 12.7.2 14.2 9.5ZM571.1 596.4c31-17.9 56-61.2 55.9-96.9-.1-35.6-25.3-50-56.3-32.1-31 17.9-56 61.2-55.9 96.9.1 35.6 25.3 50 56.3 32.1"/><path fill="url(#y)" d="M570.8 482.7c22.9-13.2 42.9-2.7 43 24.5.1 27.2-19.8 60.7-42.7 73.9-23.6 13.6-42.9 2.7-43-24.5 0-27.2 19.8-60.7 42.7-73.9Z"/><path fill="url(#z)" d="M624.3 326.1c.1 0 .2-.1.4-.1.7-.2 1.3-.3 1.9-.4l41.4 1.6-33.8-19.7-41.4-1.6c-.6.1-1.3.3-1.9.4h-.1c-.1 0-.1.1-.2.1-.9.3-1.9.6-2.8.9-.1 0-.2.1-.3.1 0 0-.1 0-.1.1-.7.3-1.3.6-1.9.9-1.4.8-2.7 1.7-4 2.7-.4.3-.8.7-1.2 1-.6.5-1.2 1-1.8 1.6-.3.3-.6.7-1 1-.2.2-.3.4-.5.5-.2.2-.4.4-.5.6-.5.6-1 1.1-1.4 1.7-.4.5-.8 1.1-1.2 1.6 0 .1-.1.1-.1.2l-.1.1c-.3.4-.5.8-.8 1.2-.3.5-.6 1-.9 1.6-.3.5-.6 1.1-.9 1.6l-.3.6c-.2.3-.4.7-.6 1.1-.4.8-.9 1.6-1.5 2.5-.1.1-.1.2-.2.3-.6 1-1.3 2.1-2 3.2l-.6.9c-.6.9-1.2 1.9-1.9 2.9-.2.2-.3.4-.5.7-.8 1.2-1.7 2.4-2.5 3.7-.1.2-.3.4-.4.6-1.5 2.2-3.1 4.3-4.8 6.5-.2.2-.3.4-.5.6-1.4 1.8-2.8 3.5-4.3 5.2-.2.2-.4.5-.6.7-1.4 1.6-2.7 3-4.1 4.4-.3.3-.6.6-1 .9l-.9.9c-.5.4-1 .9-1.4 1.3-.3.3-.6.5-.9.8l-1.5 1.2c-.2.2-.5.4-.7.6-.8.5-1.5 1-2.2 1.5-1.2.7-2.5 1.3-3.8 1.7-.3.1-.7.2-1 .4-1.3.4-2.6.7-3.9.9h-.3c-1.2.2-2.4.2-3.6.2h-1.3c-.9 0-1.7-.1-2.6-.2-.5-.1-1.1-.1-1.6-.2-.7-.1-1.4-.3-2-.4-.8-.2-1.5-.3-2.2-.5-.5-.1-1.1-.3-1.6-.5l-2.7-.9c-.1 0-.2-.1-.3-.1l-8-4.7s-.1 0-.1-.1c-.3-.2-.5-.3-.8-.4-.1-.1-.3-.1-.4-.1-.1 0-.2-.1-.2-.1-.1 0-.2-.1-.2-.1-.3-.1-.6-.2-.9-.2h-.5c-.2 0-.4-.1-.6-.1h-1.2c-.5 0-.9.1-1.4.1-.1 0-.2.1-.4.1-.5.1-.9.2-1.4.3-.7.2-1.5.5-2.2.8-.1 0-.1 0-.2.1-.1 0-.2.1-.3.2-1 .4-1.9.9-2.9 1.4-2.9 1.7-5.9 4.2-8.1 6.4l-42.7 51c-.2.3-.4.6-.6.8-.3.5-.6.9-.8 1.4-.3.5-.6 1-.8 1.5 0 0 0 .1-.1.1 0 0 0 .1-.1.1-.2.4-.5.9-.7 1.3-.3.6-.5 1.1-.8 1.7-.1.3-.2.5-.3.8-.1.1-.1.3-.2.4l-.3.6c-.3.7-.5 1.4-.7 2-.1.4-.2.7-.3 1.1-.1.2-.1.4-.2.6-.1.2-.1.4-.2.6-.2.9-.5 1.8-.7 2.7 0 .1 0 .3-.1.4-.1.3-.1.7-.2 1-.1.6-.2 1.2-.3 1.7 0 .3 0 .6-.1.9 0 .5-.1 1-.1 1.4v2.2c0 .4 0 .9.1 1.3l.3 2.1c.1.3.1.7.2 1 .3.9.6 1.8 1 2.6.2.4 3.7 7.2 3.8 16.5 0 1.5-.1 3-.2 4.6 0 .5-.1 1-.1 1.4-.1 1-.2 2-.4 3l-.6 3.3c-.2.8-.3 1.6-.5 2.4-.2.7-.4 1.5-.5 2.2-.3 1-.5 2-.8 3l-.6 1.8c-.4 1.1-.7 2.3-1.1 3.4-.2.5-.3 1-.5 1.5-.6 1.6-1.2 3.2-1.9 4.7-.1.1-.1.3-.2.4-.6 1.4-1.3 2.9-2 4.3-.2.4-.5.9-.7 1.3-.6 1.2-1.3 2.4-1.9 3.6-.2.4-.4.7-.6 1.1l-2.7 4.5c-.2.3-.4.7-.7 1-.7 1.1-1.5 2.3-2.3 3.4-.4.5-.8 1.1-1.2 1.6-.6.9-1.3 1.7-2 2.6-.6.7-1.1 1.4-1.7 2-.6.7-1.2 1.3-1.7 2-.9 1-1.8 2-2.8 3-.6.6-1.1 1.2-1.7 1.7-.4.4-.9.8-1.3 1.3-.8.8-1.6 1.5-2.5 2.2-.5.4-.9.8-1.4 1.2-.9.7-1.8 1.4-2.7 2-.4.3-.8.6-1.3.9-1.3.9-2.7 1.8-4 2.6-.7.4-1.5 1-2.2 1.6-.2.2-.4.3-.6.5-.2.2-.4.3-.6.5-.4.4-.8.8-1.2 1.3 0 .1-.1.1-.1.2s-.1.1-.1.2c-.2.3-.4.5-.6.8-.3.4-.6.7-.8 1.1-.2.2-.3.4-.4.7 0 .1-.1.1-.1.2-.1.1-.1.2-.2.3-.3.4-.5.8-.8 1.3-.3.4-.5.9-.8 1.4 0 0 0 .1-.1.1 0 .1-.1.1-.1.2l-.6 1.2c-.3.6-.5 1.2-.8 1.8 0 .1-.1.2-.1.3-.1.1-.1.3-.2.4-.2.4-.4.8-.5 1.3-.3.7-.5 1.5-.8 2.2 0 .1 0 .1-.1.2v.1l-.9 3c-.1.2-.1.4-.1.5-.1.5-.3 1.1-.4 1.6-.1.5-.3 1.1-.4 1.6-.1.5-.2 1-.3 1.4 0 .1 0 .3-.1.7v.3c0 .2-.1.5-.1.8 0 .3-.1.6-.1.9-.1.4-.1.8-.2 1.2-.1.4-.1.8-.2 1.3 0 .3-.1.5-.1.8l-.3 2.1v.4c-.1.9-.2 1.9-.4 2.9 0 .3-.1.7-.1 1-.1.7-.2 1.5-.3 2.2 0 .4-.1.8-.1 1.2l-.3 2.4c0 .4-.1.7-.1 1.1l-.3 3.3v.4l-.3 3.6c0 .4-.1.7-.1 1.1-.1.9-.1 1.7-.2 2.6 0 .4 0 .8-.1 1.3 0 .8-.1 1.7-.1 2.5v1.1c0 1.2-.1 2.3 0 3.4 0 16.1 3.8 34.4 3.8 35.2.4 2.5 1.1 4.6 2.1 6.3 1 1.7 2.2 3 3.6 3.8l33.8 19.7c-2.8-1.6-4.9-5.1-5.7-10.1 0-.8-3.7-19.1-3.8-35.2v-4.5c0-.8.1-1.7.1-2.5 0-.4 0-.8.1-1.2.1-.9.1-1.7.2-2.6 0-.4 0-.7.1-1.1l.3-3.6v-.2c.1-1.2.2-2.3.3-3.5 0-.4.1-.8.1-1.1l.3-2.4c0-.4.1-.8.1-1.2.1-.8.2-1.6.3-2.3 0-.3.1-.6.1-.9.1-1 .3-2 .4-2.9v-.4c.1-.7.2-1.5.3-2.1 0-.2.1-.4.1-.6.1-.6.2-1.1.2-1.6 0-.2 0-.3.1-.4.1-.6.2-1.1.2-1.6 0-.3.1-.5.1-.7v-.4c0-.3.1-.6.1-.7.2-1 .4-2.1.7-3.1.1-.5.3-1.1.4-1.6.3-1.2.7-2.4 1.1-3.6 0-.1 0-.1.1-.2.4-1.2.8-2.3 1.3-3.4.1-.1.1-.3.2-.4.5-1.2 1-2.3 1.6-3.3 0-.1.1-.1.1-.2.6-1.1 1.2-2.1 1.8-3.1 0-.1.1-.1.1-.2.6-.9 1.3-1.8 1.9-2.6 0-.1.1-.1.1-.2.6-.7 1.3-1.4 1.9-2 .2-.2.4-.3.6-.5.7-.6 1.4-1.1 2.2-1.6 1.4-.8 2.7-1.7 4-2.6.4-.3.8-.6 1.3-.9.9-.7 1.8-1.3 2.7-2 .5-.4.9-.8 1.4-1.2.8-.7 1.7-1.4 2.5-2.2.5-.4.9-.8 1.3-1.3.2-.2.5-.4.7-.7.3-.3.7-.7 1-1.1.9-1 1.9-2 2.8-3 .3-.3.5-.6.8-.9.3-.4.6-.8.9-1.1.6-.7 1.1-1.4 1.7-2.1.3-.4.6-.7.9-1.1.4-.5.7-1 1.1-1.5.4-.5.8-1.1 1.2-1.6.2-.3.4-.5.6-.8.6-.8 1.1-1.7 1.7-2.5.2-.3.5-.7.7-1 .1-.1.1-.2.2-.3.8-1.2 1.5-2.5 2.3-3.7.1-.2.2-.3.3-.5.2-.4.4-.7.6-1.1.4-.7.8-1.4 1.2-2.2.2-.5.5-.9.7-1.4.2-.4.5-.9.7-1.4.2-.3.3-.7.5-1l1.5-3.3c.1-.2.1-.3.2-.4 0 0 0-.1.1-.1.6-1.3 1.1-2.6 1.6-3.9.1-.2.2-.5.2-.7.2-.5.3-1 .5-1.5.2-.7.5-1.3.7-2 .2-.5.3-.9.4-1.4l.6-1.8c.1-.4.3-.8.4-1.2.2-.6.3-1.2.4-1.8.2-.7.4-1.5.5-2.2.1-.3.2-.6.2-.9l.3-1.5.6-3.3c0-.3.1-.7.2-1 .1-.7.1-1.3.2-2 0-.5.1-1 .1-1.4.1-1.5.2-3.1.2-4.6 0-9.3-3.6-16.2-3.8-16.5-.4-.7-.8-1.6-1-2.6-.1-.3-.1-.7-.2-1-.1-.7-.3-1.4-.3-2.1 0-.4 0-.9-.1-1.3v-2.2c0-.5.1-.9.1-1.4.1-.9.2-1.8.4-2.7.1-.3.1-.7.2-1 .2-1.2.6-2.5.9-3.7.1-.2.1-.4.2-.6.4-1.3.8-2.5 1.3-3.8.1-.1.1-.3.2-.4.5-1.3 1.1-2.6 1.8-3.9 0 0 0-.1.1-.1.7-1.3 1.5-2.6 2.3-3.8l42.7-51c2.2-2.1 5.2-4.7 8.1-6.4 1-.6 1.9-1 2.9-1.4.2-.1.4-.2.5-.2.7-.3 1.5-.6 2.2-.8.5-.1 1-.2 1.4-.3.1 0 .2-.1.4-.1.5-.1 1.1-.1 1.6-.1h.4c.4 0 .8 0 1.2.1h.3c.2 0 .4.1.6.1l5.9 3.4c.1.1.2.1.3.2l.6.3c.8.4 1.6.8 2.5 1.2.2.1.3.2.5.3.2.1.5.2.8.3.8.3 1.7.6 2.7.9l.9.3c.2.1.4.1.7.2.7.2 1.5.4 2.2.5.5.1.9.2 1.3.3.2 0 .5 0 .7.1.5.1 1.1.1 1.6.2s1 .1 1.5.2H560.2c.9 0 1.8-.1 2.7-.3h.4c1-.1 1.9-.3 2.9-.6l.9-.3c.3-.1.7-.2 1-.3.4-.1.7-.2 1.1-.4.9-.4 1.9-.8 2.8-1.4.7-.4 1.5-.9 2.2-1.5.2-.2.5-.4.7-.6l1.5-1.2c.3-.2.6-.5.9-.8.5-.4 1-.8 1.4-1.3l.9-.9.6-.6c.1-.1.2-.3.4-.4 1.4-1.4 2.8-2.9 4.1-4.4l.2-.2c.1-.1.2-.3.3-.4 1.5-1.7 2.9-3.4 4.3-5.2.1-.1.1-.2.2-.3.1-.1.2-.3.3-.4 1.7-2.2 3.3-4.4 4.8-6.5.1-.1.1-.2.2-.3.1-.1.1-.2.2-.3.9-1.3 1.7-2.5 2.5-3.7.2-.2.3-.5.5-.7.7-1 1.3-2 1.9-2.9.1-.2.2-.3.3-.5.1-.1.2-.3.2-.4.7-1.1 1.4-2.2 2-3.2.1-.1.1-.2.2-.3.5-.9 1-1.7 1.5-2.5.1-.1.2-.2.2-.4.1-.3.3-.5.4-.7.9-1.8 1.9-3.4 3-5l.1-.1c1-1.5 2.1-2.8 3.3-4.1.2-.2.3-.4.5-.5.9-.9 1.8-1.8 2.8-2.6.4-.3.8-.7 1.2-1 1.3-1 2.6-1.9 4-2.7.6-.3 1.3-.7 1.9-.9.1-.1.2-.1.4-.1.3.1 1.3-.2 2.2-.5Z"/><path fill="url(#A)" d="M861.6 679.6c0 .4-.1.7-.1 1.1-.1.3-.1.6-.2.9-.1.3-.2.7-.3 1-.1.3-.2.6-.4.8-.2.4-.3.7-.5 1.1-.1.3-.3.5-.5.7-.2.4-.5.8-.8 1.2-.2.2-.4.5-.5.7-.4.5-.9 1-1.4 1.5l-.6.6c-.3.3-.7.6-1 .9-.3.3-.6.5-.9.7-.4.3-.8.5-1.2.8-.4.3-.8.6-1.3.8l-73.7 42.8c-1.5.9-3.1 1.6-4.7 2.2-.4.2-.9.3-1.3.5-1 .4-2.1.7-3.2 1-1.1.3-2.2.6-3.4.8-1.4.3-2.7.5-4.1.7-.3 0-.7.1-1 .1-1.9.2-3.8.3-5.7.3h-.9c-1.9 0-3.8-.1-5.6-.3-.3 0-.6-.1-.8-.1-1.8-.2-3.7-.5-5.4-.9-.3-.1-.6-.2-1-.2-1.6-.4-3.2-.9-4.7-1.4-.3-.1-.6-.2-.8-.3-1.8-.7-3.6-1.5-5.2-2.4l-74.1-42.8c-6.7-3.9-10-8.9-10-14l-.2 78.3c0 5.1 3.3 10.1 10 14l74.1 42.8c1.5.9 3.2 1.7 4.9 2.4.1 0 .2.1.3.1.3.1.6.2.8.3 1 .4 2 .7 3 1 .5.2 1.1.3 1.7.4.3.1.6.2 1 .2.3.1.6.2.9.2 1.1.2 2.2.4 3.4.6.4.1.8.1 1.2.1.3 0 .6.1.8.1.4 0 .8.1 1.2.1 1.1.1 2.2.2 3.3.2h3.4c1.3 0 2.5-.1 3.8-.3.1 0 .3 0 .4-.1.3 0 .7-.1 1-.1 1-.1 1.9-.2 2.9-.4l1.2-.3c1.2-.2 2.3-.5 3.4-.8.6-.2 1.2-.3 1.8-.4.5-.2.9-.4 1.4-.5.4-.2.9-.3 1.3-.5 1.7-.7 3.3-1.4 4.7-2.2l73.7-42.8c.1-.1.3-.2.4-.2l.9-.6c.4-.3.8-.5 1.2-.8.3-.2.6-.5 1-.8.4-.3.7-.6 1-.9l.2-.2c.1-.1.2-.3.4-.4.5-.5 1-1 1.4-1.5l.3-.3c.1-.1.1-.2.2-.3.3-.4.6-.8.8-1.2.1-.2.2-.3.3-.5 0-.1.1-.2.1-.3.2-.3.3-.7.5-1.1l.3-.6c0-.1 0-.1.1-.2.1-.3.2-.7.3-1 .1-.2.2-.5.2-.7v-.2c.1-.4.1-.7.1-1.1 0-.2.1-.5.1-.7v-.3l.2-78.3c0 .3-.1.6-.1 1Z"/><path fill="#fdfdfd" d="M851.6 664.6c13.3 7.7 13.4 20.1.2 27.8l-73.7 42.8c-13.2 7.7-34.7 7.7-48 0L656 692.4c-13.3-7.7-13.4-20.1-.2-27.8l73.7-42.8c13.2-7.7 34.7-7.7 48 0l74.1 42.8Z"/><path fill="#fdfdfd" d="M851.6 664.6c13.3 7.7 13.4 20.1.2 27.8l-73.7 42.8c-13.2 7.7-34.7 7.7-48 0L656 692.4c-13.3-7.7-13.4-20.1-.2-27.8l73.7-42.8c13.2-7.7 34.7-7.7 48 0l74.1 42.8Z"/></svg>
\ No newline at end of file
<svg xmlns="http://www.w3.org/2000/svg" width="1209" height="1442" fill="none"><path fill="url(#a)" fill-opacity=".6" d="M299.286 3.163c-12.689-7.334-22.952-1.486-22.952 13.115v656.574c0 5.596 3.935 12.416 8.842 15.301l890.004 513.787c4.87 2.82 8.82.54 8.82-5.06V540.311c0-14.591-10.28-32.329-23.01-39.674L299.286 3.163Z"/><path fill="url(#b)" fill-opacity=".8" d="M196.286 72.163c-12.689-7.334-22.952-1.486-22.952 13.115v656.574c0 5.596 3.935 12.416 8.842 15.301l890.004 513.787c4.87 2.82 8.82.54 8.82-5.06V609.311c0-14.591-10.28-32.329-23.01-39.674L196.286 72.163Z"/><path fill="url(#c)" d="M648.783 485.09 121.286 180.509c-12.689-7.333-49.008 2.339-49.008 16.941L70.28 856.198c0 5.596 3.946 12.416 8.853 15.302l893.97 519.41c4.886 2.82 32.898-11.01 32.898-16.6V717.69c0-14.591-10.285-32.329-22.952-39.674L648.783 485.09Z"/><path fill="#fff" d="M976.891 1005.46V727.35c0-14.602-10.285-32.34-22.952-39.685L92.231 190.158c-12.689-7.323-22.952-1.486-22.952 13.115v656.574c0 5.596 3.935 12.427 8.842 15.301L968.18 1389.03c4.875 2.81 8.82.53 8.82-5.06V1088.3" opacity=".4"/><path fill="#fff" d="M612.537 1131.85 125.373 862.58C114.127 856.084 105 838.663 105 823.657V274.85c0-15.007 9.127-21.901 20.373-15.405l487.164 269.284c11.245 6.496 20.373 23.929 20.373 38.936v548.805c0 14.98-9.128 21.88-20.373 15.38Z"/><path fill="url(#d)" fill-opacity=".5" d="M168.074 332.906v153.04c0 6.681 4.858 14.576 10.324 17.612l414.181 244.136 6.68-3.644c2.429-1.215 4.251-4.251 4.251-7.288V588.581c0-6.681-4.859-14.576-10.324-17.612l-411.752-238.67c-4.251-1.822-9.109-1.822-13.36.607Z"/><path fill="url(#e)" d="M137.324 365.12c-5.466-3.037-10.324-.608-10.324 6.073v148.789c0 6.68 4.858 14.575 10.324 17.612l414.788 239.884c5.466 3.037 10.324.608 10.324-6.073V622.616c0-6.68-4.858-14.575-10.324-17.612L137.324 365.12Z"/><path fill="#fff" d="M236.922 473.116c0-4.249 4.619-6.888 8.28-4.73l290.972 171.539a5.24 5.24 0 0 1 2.578 4.512c0 4.051-4.4 6.569-7.892 4.517L239.632 477.85a5.49 5.49 0 0 1-2.71-4.734ZM236.922 510.31c0-4.047 4.4-6.56 7.886-4.505l291.495 171.847a4.976 4.976 0 0 1 2.449 4.287c0 3.848-4.18 6.24-7.497 4.291L239.503 514.818a5.228 5.228 0 0 1-2.581-4.508ZM236.922 547.811c0-4.246 4.619-6.883 8.276-4.723l130.041 76.792a5.242 5.242 0 0 1 2.578 4.515c0 4.052-4.4 6.573-7.896 4.524l-130.287-76.375a5.486 5.486 0 0 1-2.712-4.733Z"/><path fill="url(#f)" d="M205.95 483.544c3.036-2.429 4.858-6.68 4.858-12.146 0-12.753-9.109-29.15-20.648-35.223-10.932-6.681-20.649-1.215-20.649 11.538 0 9.11 4.252 18.827 10.325 26.722-10.932 5.465-18.827 16.397-18.827 29.758v7.895l60.73 35.83v-17.004c.608-17.612-5.465-34.009-15.789-47.37Z"/><path fill="#DFE6FD" d="M241.776 666.065c0-3.85 4.185-6.241 7.501-4.285l263.616 155.411a4.745 4.745 0 0 1 2.335 4.088c0 3.67-3.986 5.951-7.15 4.092L244.23 670.354a4.976 4.976 0 0 1-2.454-4.289ZM241.776 699.763c0-3.666 3.985-5.943 7.144-4.081l264.089 155.691a4.508 4.508 0 0 1 2.219 3.884c0 3.486-3.787 5.653-6.792 3.887L244.114 703.848a4.736 4.736 0 0 1-2.338-4.085ZM241.776 733.738c0-3.848 4.184-6.236 7.497-4.28l117.815 69.572a4.751 4.751 0 0 1 2.336 4.091c0 3.672-3.987 5.956-7.154 4.099l-118.038-69.194a4.971 4.971 0 0 1-2.456-4.288Z"/><path fill="url(#g)" d="M196.715 660.513c2.751-2.201 4.402-6.053 4.402-11.004 0-11.555-8.253-26.41-18.707-31.912-9.904-6.053-18.707-1.101-18.707 10.454 0 8.253 3.851 17.056 9.353 24.209-9.903 4.951-17.056 14.855-17.056 26.96v7.152l55.021 32.462v-15.405c.55-15.956-4.952-30.812-14.306-42.916Z"/><path fill="#DFE6FD" d="M229.776 796.065c0-3.85 4.185-6.241 7.501-4.285l263.616 155.411a4.745 4.745 0 0 1 2.335 4.088c0 3.67-3.986 5.951-7.15 4.092L232.23 800.354a4.976 4.976 0 0 1-2.454-4.289ZM229.776 829.763c0-3.666 3.985-5.943 7.144-4.081l264.089 155.691a4.508 4.508 0 0 1 2.219 3.884c0 3.486-3.787 5.653-6.792 3.887L232.114 833.848a4.736 4.736 0 0 1-2.338-4.085ZM229.776 863.738c0-3.848 4.184-6.236 7.497-4.28l117.815 69.572a4.751 4.751 0 0 1 2.336 4.091c0 3.672-3.987 5.956-7.154 4.099l-118.038-69.194a4.971 4.971 0 0 1-2.456-4.288Z"/><path fill="url(#h)" d="M188.715 790.513c2.751-2.201 4.402-6.053 4.402-11.004 0-11.555-8.253-26.41-18.707-31.912-9.904-6.053-18.707-1.101-18.707 10.454 0 8.253 3.851 17.056 9.353 24.209-9.903 4.951-17.056 14.855-17.056 26.96v7.152l55.021 32.462v-15.405c.55-15.956-4.952-30.812-14.306-42.916Z"/><path fill="url(#i)" d="m916.537 1306.85-240.164-139.27c-11.246-6.5-20.373-23.92-20.373-38.92V897.85c0-15.007 9.127-21.901 20.373-15.405l240.164 139.285c11.245 6.49 20.373 23.93 20.373 38.93v230.81c0 14.98-9.128 21.88-20.373 15.38Z" opacity=".65"/><path fill="#DFE6FD" d="M837.103 1188.93c0 4.38-4.734 7.13-8.538 4.95l-108.491-61.99a6.11 6.11 0 0 1-3.074-5.3c0-4.7 5.094-7.64 9.161-5.28l108.098 62.68a5.706 5.706 0 0 1 2.844 4.94ZM804.602 1202.66c0 4.37-4.721 7.12-8.521 4.95l-54.2-30.85a5.7 5.7 0 0 1-2.881-4.95c0-4.38 4.721-7.12 8.522-4.96l54.199 30.85a5.716 5.716 0 0 1 2.881 4.96Z"/><path fill="#fff" d="m714 1061 35.452 20.23v30.44L714 1091.44V1061ZM770 1093l35.452 20.23v30.44L770 1123.44V1093ZM822.908 1123.89l35.452 20.24v30.43l-35.452-20.23v-30.44ZM806.715 1034.51c2.751-2.2 4.402-6.05 4.402-11 0-11.56-8.253-26.411-18.707-31.913-9.904-6.053-18.707-1.101-18.707 10.453 0 8.25 3.851 17.06 9.353 24.21-9.903 4.95-17.056 14.86-17.056 26.96v7.15l55.021 32.46v-15.4c.55-15.96-4.952-30.81-14.306-42.92ZM916.537 990.851 676.373 851.58C665.127 845.084 656 827.663 656 812.657V581.85c0-15.007 9.127-21.901 20.373-15.405l240.164 139.284c11.245 6.496 20.373 23.929 20.373 38.936v230.806c0 14.982-9.128 21.875-20.373 15.38Z"/><path fill="url(#j)" d="m830.215 815.783-58.374 5.936c-6.926.99-14.841-7.915-14.841-15.83V738.61c0-7.915 8.905-8.904 14.841-1.979l58.374 61.343c6.926 7.915 6.926 16.819 0 17.809l-58.374 5.936c-6.926.99-14.841-7.915-14.841-15.83V738.61c0-7.915 8.905-8.904 14.841-1.979l58.374 61.343c6.926 7.915 6.926 16.819 0 17.809Z"/><path fill="url(#k)" d="M680 621.515c0-7.741 8.417-12.547 15.083-8.612l114.12 67.363a10 10 0 0 1 4.917 8.612v13.308c0 7.695-8.327 12.507-14.994 8.664l-114.12-65.777a10.002 10.002 0 0 1-5.006-8.664v-14.894Z"/><path fill="url(#l)" d="M1001.48 648.032 90.651 119.178C80.908 113.542 73 98.458 73 85.454c0-12.991 7.908-18.96 17.651-13.338L1001.48 600.97c9.75 5.636 17.64 20.72 17.64 33.711 0 13.005-7.91 18.974-17.64 13.351Z"/><path fill="#fff" d="M100.745 108.037c-2.052-4.821-1.504-9.67 1.223-10.83 2.727-1.16 6.601 1.807 8.652 6.628 2.051 4.821 1.504 9.67-1.223 10.83-2.727 1.161-6.601-1.807-8.652-6.628ZM121.922 120.26c-2.052-4.822-1.504-9.67 1.223-10.831 2.727-1.16 6.601 1.808 8.652 6.629 2.051 4.821 1.504 9.67-1.223 10.83-2.727 1.16-6.601-1.807-8.652-6.628ZM143.104 132.494c-2.051-4.821-1.504-9.67 1.223-10.83 2.727-1.161 6.601 1.807 8.652 6.628 2.052 4.821 1.504 9.67-1.223 10.83-2.727 1.161-6.601-1.807-8.652-6.628ZM817.396 525.758 223.813 182.453c-3.414-1.964-6.174-7.253-6.174-11.797 0-4.545 2.76-6.637 6.174-4.673l593.583 343.305c3.414 1.964 6.175 7.253 6.175 11.798.051 4.544-2.709 6.636-6.175 4.672ZM916.935 581.542l-31.76-18.332c-3.402-1.977-6.175-7.253-6.175-11.798 0-4.557 2.773-6.636 6.175-4.672l31.76 18.331c3.414 1.977 6.187 7.254 6.187 11.798 0 4.557-2.773 6.65-6.187 4.673ZM974.279 614.649l-31.747-18.332c-3.402-1.976-6.175-7.253-6.175-11.797 0-4.557 2.773-6.637 6.175-4.673l31.76 18.332c3.415 1.977 6.188 7.253 6.188 11.797-.013 4.558-2.786 6.612-6.201 4.673Z"/><defs><linearGradient id="a" x1="730.174" x2="730.174" y1="336.35" y2="1197.62" gradientUnits="userSpaceOnUse"><stop offset=".02" stop-color="#BFD1FF"/><stop offset="1" stop-color="#fff"/></linearGradient><linearGradient id="b" x1="627.174" x2="627.174" y1="405.35" y2="1266.62" gradientUnits="userSpaceOnUse"><stop offset=".02" stop-color="#BFD1FF"/><stop offset="1" stop-color="#fff"/></linearGradient><linearGradient id="c" x1="539.146" x2="539.146" y1="500.505" y2="1221.33" gradientUnits="userSpaceOnUse"><stop offset=".02" stop-color="#2575F2"/><stop offset="1" stop-color="#6A11C1"/></linearGradient><linearGradient id="d" x1="168.022" x2="603.4" y1="539.289" y2="539.289" gradientUnits="userSpaceOnUse"><stop stop-color="#623FE9"/><stop offset=".168" stop-color="#6D49E8"/><stop offset=".7" stop-color="#8C65E5"/><stop offset="1" stop-color="#976FE4"/></linearGradient><linearGradient id="e" x1="169.87" x2="573.667" y1="333.915" y2="608.791" gradientUnits="userSpaceOnUse"><stop stop-color="#8B87FF"/><stop offset="1" stop-color="#F68BC6"/></linearGradient><linearGradient id="f" x1="161.425" x2="222.264" y1="490.089" y2="490.089" gradientUnits="userSpaceOnUse"><stop stop-color="#E967CD"/><stop offset=".159" stop-color="#EB6FC3"/><stop offset=".429" stop-color="#F086A9"/><stop offset=".772" stop-color="#F8AA7E"/><stop offset="1" stop-color="#FEC55E"/></linearGradient><linearGradient id="g" x1="161.421" x2="229.128" y1="606.999" y2="628.785" gradientUnits="userSpaceOnUse"><stop stop-color="#8B87FF"/><stop offset="1" stop-color="#F68BC6"/></linearGradient><linearGradient id="h" x1="153.421" x2="221.128" y1="736.999" y2="758.785" gradientUnits="userSpaceOnUse"><stop stop-color="#8B87FF"/><stop offset="1" stop-color="#F68BC6"/></linearGradient><linearGradient id="i" x1="715.61" x2="977.416" y1="1353.79" y2="1188.92" gradientUnits="userSpaceOnUse"><stop stop-color="#9CCFF7"/><stop offset="1" stop-color="#2E7FEB"/></linearGradient><linearGradient id="j" x1="757.073" x2="835.741" y1="777.045" y2="777.045" gradientUnits="userSpaceOnUse"><stop stop-color="#E967CD"/><stop offset=".159" stop-color="#EB6FC3"/><stop offset=".429" stop-color="#F086A9"/><stop offset=".772" stop-color="#F8AA7E"/><stop offset="1" stop-color="#FEC55E"/></linearGradient><linearGradient id="k" x1="760.736" x2="781.953" y1="623.159" y2="656.936" gradientUnits="userSpaceOnUse"><stop offset=".02" stop-color="#2575F2"/><stop offset="1" stop-color="#6A11C1"/></linearGradient><linearGradient id="l" x1="861.628" x2="109.549" y1="536.144" y2="111.136" gradientUnits="userSpaceOnUse"><stop offset=".02" stop-color="#2575F2"/><stop offset="1" stop-color="#6A11C1"/></linearGradient></defs></svg>
\ No newline at end of file
<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200" class="icon" viewBox="0 0 1024 1024"><path fill="#FDD7AD" d="M512 0 335.448 88.272l-70.616 35.312-70.624 35.312-176.552 88.28v529.648L512 1024l494.344-247.176V247.176z"/><path fill="#CBB292" d="m759.176 370.76-70.624 35.304-494.344-247.168 70.624-35.312zM512 494.344V1024L17.656 776.824V247.176z"/><path fill="#7F6E5D" d="M1006.344 247.168v529.656L512 1024V494.344l176.552-88.28v70.624l141.24-70.624v-70.616z"/><path fill="#7F5B53" d="M829.792 335.448v70.624L688.56 476.68v-70.624z"/><path fill="#CBB292" d="m829.792 335.448-70.624 35.312-494.344-247.176 70.624-35.312z"/><path fill="#2C3E50" d="m682.52 550.32 157.032-78.512a17.656 17.656 0 0 1 25.552 15.792v9.32a52.96 52.96 0 0 1-29.28 47.376L678.8 622.8a17.656 17.656 0 0 1-25.552-15.792v-9.312a52.96 52.96 0 0 1 29.28-47.376z"/></svg>
\ No newline at end of file
<svg xmlns="http://www.w3.org/2000/svg" width="1024" height="1024"><defs><linearGradient id="a" x1="522.593" x2="522.593" y1="-70.302" y2="-335.937" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#fe5d5a" stop-opacity=".1"/><stop offset=".908" stop-color="#ef1220" stop-opacity=".5"/></linearGradient><linearGradient id="b" x1="107.12" x2="935.038" y1="-373.67" y2="-373.67" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#ff5e59"/><stop offset="1" stop-color="#f01422"/></linearGradient><linearGradient id="c" x1="519.405" x2="519.405" y1="-195.547" y2="-726.816" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#ffe2e2"/><stop offset=".888" stop-color="#ff8e8e"/></linearGradient><linearGradient id="d" x1="191.5" x2="483.9" y1="-564.9" y2="-564.9" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#e92700" stop-opacity=".3"/><stop offset=".013" stop-color="#ef1220" stop-opacity=".2"/></linearGradient><linearGradient id="e" x1="403.502" x2="253.121" y1="-847.32" y2="-586.853" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#ff5e59"/><stop offset=".201" stop-color="#f01422"/></linearGradient><linearGradient id="f" x1="330.485" x2="330.485" y1="-801.787" y2="-625.789" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#ff5e59"/><stop offset=".201" stop-color="#f01422"/></linearGradient><linearGradient id="g" x1="397.351" x2="256.845" y1="-647.231" y2="-890.596" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#ffa6a6"/><stop offset=".908" stop-color="#ff6b5d"/></linearGradient></defs><path fill="url(#a)" d="M501.2 662.3 327.6 763.8c-13.9 8.1-14.2 28.1-.5 36.7l179.1 97.7c10.9 5.9 24.1 5.9 34.9-.1l177-97.9c13.6-8.5 13.4-28.3-.3-36.5l-168.4-101c-14.8-9-33.3-9.1-48.2-.4Z"/><path fill="#f63037" d="m110.2 525.7-3.1 77.6 57.5 18.5L184 519.4Z"/><path fill="url(#b)" d="m476.6 363.5-328 154.6c-21 42.7-55.4 65.4-35.5 103.5 4.2 8 9.4 14.4 15.4 18.1l358.2 195.5c21.8 11.9 48.1 11.8 69.8-.2l354-195.8c27.2-16.9 34.8-90.3 7.3-106.8L573 364.1c-29.7-17.8-66.6-18-96.4-.6Z"/><path fill="url(#c)" d="M476.6 298.7 129.4 501.6c-27.8 16.3-28.4 56.3-1 73.3l358.2 195.5c21.8 11.9 48.1 11.8 69.8-.2l354-195.8c27.2-16.9 26.9-56.6-.6-73.1L573 299.3c-29.7-17.8-66.6-18-96.4-.6Z"/><path fill="#ff8989" fill-opacity=".31" d="m481.2 387.8 39.4 123.4c1.1 3.4 4 6 7.6 6.6l173.4 30.4-33-118.3c-.9-3.3-3.6-5.8-7-6.5l-180.4-35.6ZM327 499.2l40.4 101.1L496.7 525c2.5-1.5 3.7-4.5 2.7-7.3l-36-106.8-127.6 65c-8.6 4.3-12.4 14.4-8.8 23.3ZM523.8 540.5l-140.3 77.2L567.2 659c3.2.7 6.6.1 9.3-1.6l134.6-85-174.7-33.8c-4.3-1-8.7-.3-12.6 1.9Z"/><path fill="url(#d)" d="M483.9 406.1c0 35.46-65.46 64.2-146.2 64.2s-146.2-28.74-146.2-64.2c0-35.46 65.46-64.2 146.2-64.2s146.2 28.74 146.2 64.2Z"/><path fill="url(#e)" d="m254.2 188.4-123 83.1c-1.8 1.3-2.6 3.6-1.8 5.7l39.1 110.6c.6 1.7 2 2.9 3.8 3.2l221.8 40.5c1.3.3 2.7-.1 3.7-.8l131.7-93.6c1.9-1.4 2.6-3.9 1.7-6.1l-49.4-107c-.6-1.5-2.1-2.6-3.7-2.8l-220.3-33.5c-1.3-.2-2.6.1-3.6.7Z"/><path fill="url(#f)" d="m528.6 274.5 3 59.1-205 65.6-177.2-72.7-20-49.2 1.9-54.1Z"/><path fill="url(#g)" d="m250.6 138-112.3 76c-6 4.1-8.5 11.7-6.1 18.5l34.2 96.6c1.9 5.4 6.6 9.3 12.1 10.4l211 38.5c4.3.7 8.6-.2 12.1-2.7l120.5-85.5c6.3-4.4 8.4-12.7 5.3-19.7l-43.1-93.5c-2.2-4.9-6.8-8.3-12.1-9.1L262 135.6c-4-.7-8 .2-11.4 2.4Z"/><path fill="#fff" d="m419.8 252.8-79-11-29-57.7c-3.8-7.6-13.2-10.7-20.8-6.9-7.6 3.8-10.7 13.2-6.9 20.8l26.6 52.9-61.8 42.2c-7.1 4.8-8.9 14.5-4.1 21.5 3 4.4 7.9 6.8 12.8 6.8 3 0 6-.9 8.7-2.7l68-46.4 81.1 11.2c.7.1 1.4.1 2.1.1 7.6 0 14.3-5.6 15.3-13.4 1.4-8.4-4.5-16.2-13-17.4Z"/></svg>
\ No newline at end of file
<svg width="98" height="96" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M48.854 0C21.839 0 0 22 0 49.217c0 21.756 13.993 40.172 33.405 46.69 2.427.49 3.316-1.059 3.316-2.362 0-1.141-.08-5.052-.08-9.127-13.59 2.934-16.42-5.867-16.42-5.867-2.184-5.704-5.42-7.17-5.42-7.17-4.448-3.015.324-3.015.324-3.015 4.934.326 7.523 5.052 7.523 5.052 4.367 7.496 11.404 5.378 14.235 4.074.404-3.178 1.699-5.378 3.074-6.6-10.839-1.141-22.243-5.378-22.243-24.283 0-5.378 1.94-9.778 5.014-13.2-.485-1.222-2.184-6.275.486-13.038 0 0 4.125-1.304 13.426 5.052a46.97 46.97 0 0 1 12.214-1.63c4.125 0 8.33.571 12.213 1.63 9.302-6.356 13.427-5.052 13.427-5.052 2.67 6.763.97 11.816.485 13.038 3.155 3.422 5.015 7.822 5.015 13.2 0 18.905-11.404 23.06-22.324 24.283 1.78 1.548 3.316 4.481 3.316 9.126 0 6.6-.08 11.897-.08 13.526 0 1.304.89 2.853 3.316 2.364 19.412-6.52 33.405-24.935 33.405-46.691C97.707 22 75.788 0 48.854 0z" fill="#24292f"/></svg>
\ No newline at end of file
<svg width="98" height="96" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M48.854 0C21.839 0 0 22 0 49.217c0 21.756 13.993 40.172 33.405 46.69 2.427.49 3.316-1.059 3.316-2.362 0-1.141-.08-5.052-.08-9.127-13.59 2.934-16.42-5.867-16.42-5.867-2.184-5.704-5.42-7.17-5.42-7.17-4.448-3.015.324-3.015.324-3.015 4.934.326 7.523 5.052 7.523 5.052 4.367 7.496 11.404 5.378 14.235 4.074.404-3.178 1.699-5.378 3.074-6.6-10.839-1.141-22.243-5.378-22.243-24.283 0-5.378 1.94-9.778 5.014-13.2-.485-1.222-2.184-6.275.486-13.038 0 0 4.125-1.304 13.426 5.052a46.97 46.97 0 0 1 12.214-1.63c4.125 0 8.33.571 12.213 1.63 9.302-6.356 13.427-5.052 13.427-5.052 2.67 6.763.97 11.816.485 13.038 3.155 3.422 5.015 7.822 5.015 13.2 0 18.905-11.404 23.06-22.324 24.283 1.78 1.548 3.316 4.481 3.316 9.126 0 6.6-.08 11.897-.08 13.526 0 1.304.89 2.853 3.316 2.364 19.412-6.52 33.405-24.935 33.405-46.691C97.707 22 75.788 0 48.854 0z" fill="#fff"/></svg>
\ No newline at end of file
<svg xmlns="http://www.w3.org/2000/svg" width="1165" height="1320"><defs><linearGradient id="b" x1="515.826" x2="515.826" y1="342.35" y2="1203.62" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset=".02" stop-color="#bfd1ff"/><stop offset="1" stop-color="#fff"/></linearGradient><linearGradient id="c" x1="631.319" x2="631.319" y1="428.328" y2="1149.16" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset=".02" stop-color="#2575f2"/><stop offset="1" stop-color="#6a11c1"/></linearGradient><linearGradient id="d" x1="229.649" x2="1083.65" y1="665.309" y2="212.481" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset=".02" stop-color="#2575f2"/><stop offset="1" stop-color="#6a11c1"/></linearGradient><linearGradient id="e" x1="804.918" x2="1066.7" y1="443.308" y2="443.308" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#6dacef"/><stop offset="1" stop-color="#97c9fe"/></linearGradient><linearGradient id="f" x1="804.919" x2="1066.7" y1="672.17" y2="672.17" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#6dacef"/><stop offset="1" stop-color="#97c9fe"/></linearGradient><linearGradient id="g" x1="903.368" x2="1195.93" y1="611.995" y2="529.939" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset=".02" stop-color="#2575f2"/><stop offset="1" stop-color="#b881ff"/></linearGradient><linearGradient id="h" x1="971.638" x2="904.165" y1="462.143" y2="484.252" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#8b87ff"/><stop offset="1" stop-color="#f68bc6"/></linearGradient><linearGradient id="i" x1="913.423" x2="1205.98" y1="842.367" y2="760.305" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset=".02" stop-color="#2575f2"/><stop offset="1" stop-color="#b881ff"/></linearGradient><linearGradient id="j" x1="983.638" x2="916.165" y1="691.143" y2="713.252" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#8b87ff"/><stop offset="1" stop-color="#f68bc6"/></linearGradient><clipPath id="a"><path d="M0 0h1164.22v1320H0Z"/></clipPath></defs><g clip-path="url(#a)"><path fill="url(#b)" d="M946.71 9.16c12.69-7.33 22.96-1.48 22.96 13.12v656.57c0 5.6-3.94 12.42-8.85 15.3l-890 513.79c-4.87 2.82-8.82.54-8.82-5.06V546.31c0-14.59 10.28-32.33 23.01-39.67L946.71 9.16Z"/><path fill="url(#c)" d="m521.68 412.91 527.5-304.58c12.69-7.33 49.01 2.34 49.01 16.94l4 664.75c0 5.6-3.95 12.42-8.86 15.3l-895.97 513.41c-4.88 2.82-32.89-11-32.89-16.6V645.51c0-14.59 10.28-32.33 22.95-39.67l334.26-192.93Z"/><path fill="#fff" fill-opacity=".4" d="M191.62 935.26V657.15c0-14.6 10.28-32.34 22.95-39.68l861.7-497.51c12.69-7.32 22.96-1.49 22.96 13.12v656.57c0 5.6-3.94 12.43-8.85 15.3l-890.06 513.88c-4.87 2.81-8.82.54-8.82-5.06v-295.66"/><path fill="url(#d)" d="M752.17 388.67 191.62 712.31v-54.45c0-14.6 10.28-32.34 22.95-39.68l861.7-497.51c12.69-7.32 22.96-1.47 22.96 13.12v54.45"/><path fill="#fff" d="M240.35 643.75c0 6.09-4.31 13.51-9.61 16.58-5.3 3.07-9.61.62-9.61-5.46s4.3-13.51 9.61-16.57c5.31-3.06 9.61-.63 9.61 5.45ZM265.36 629.32c0 6.08-4.31 13.5-9.61 16.57-5.3 3.08-9.62.62-9.62-5.46s4.31-13.52 9.62-16.58c5.31-3.06 9.61-.62 9.61 5.47ZM290.36 614.88c0 6.1-4.3 13.52-9.61 16.58-5.3 3.06-9.61.61-9.61-5.47 0-6.07 4.3-13.52 9.61-16.58 5.32-3.06 9.61-.62 9.61 5.47Z"/><path fill="url(#e)" fill-opacity=".3" d="M1055.98 282.63c5.92-3.4 10.72-.67 10.72 6.12v157.98c0 6.8-4.8 15.07-10.72 18.49l-240.3 138.76c-5.92 3.42-10.72.68-10.72-6.11V439.89c0-6.79 4.8-15.08 10.72-18.5l240.3-138.76Z"/><path fill="url(#f)" fill-opacity=".3" d="M1055.98 511.5c5.92-3.42 10.72-.68 10.72 6.11v157.98c0 6.79-4.8 15.07-10.72 18.49L815.64 832.89c-5.92 3.41-10.72.68-10.72-6.11V668.79c0-6.79 4.8-15.07 10.72-18.49l240.34-138.8Z"/><path fill="#fff" fill-opacity=".3" d="M691.48 482.85c9.6-5.54 17.37-1.09 17.37 9.9v346.01c0 11-7.77 24.41-17.37 29.95L237.03 1130.3c-9.6 5.54-17.37 1.09-17.37-9.84V774.4c0-11 7.77-24.41 17.37-29.95l454.45-261.6Z"/><path fill="#fff" fill-opacity=".3" d="M752.85 521.9c9.6-5.53 17.37-1.09 17.37 9.9v346.01c0 11-7.77 24.41-17.37 29.95l-454.46 261.6c-9.59 5.53-17.36 1.09-17.36-9.9V813.45c0-11 7.77-24.41 17.36-29.95l454.46-261.6Z"/><path fill="#fff" d="M829.72 558.24c9.59-5.54 17.36-1.09 17.36 9.9v346c0 11-7.77 24.41-17.36 29.95l-454.49 261.6c-9.6 5.54-17.37 1.09-17.37-9.9V849.78c0-11 7.77-24.41 17.37-29.94l454.49-261.6Z"/><path fill="#8b87ff" d="M664.94 786.33c0-4.6-4.98-7.49-8.98-5.21l-23.45 13.39a5.979 5.979 0 0 0-3.02 5.21v16.62c0 4.6 4.97 7.49 8.97 5.21l23.45-13.39a5.988 5.988 0 0 0 3.03-5.21v-16.62ZM611.86 817.22c0-4.61-4.98-7.5-8.98-5.22l-23.45 13.39a6.003 6.003 0 0 0-3.02 5.21v16.62c0 4.61 4.97 7.5 8.97 5.21l23.45-13.38a6.012 6.012 0 0 0 3.03-5.21v-16.62ZM556.03 849.23c0-4.61-4.98-7.5-8.98-5.22L523.6 857.4a6.003 6.003 0 0 0-3.02 5.21v16.62c0 4.61 4.97 7.5 8.97 5.21L553 871.06a6.012 6.012 0 0 0 3.03-5.21v-16.62ZM504.83 878.7c0-4.6-4.97-7.49-8.97-5.21l-23.45 13.39a5.988 5.988 0 0 0-3.03 5.21v16.62c0 4.6 4.97 7.49 8.97 5.21l23.46-13.39a5.979 5.979 0 0 0 3.02-5.21V878.7ZM445.45 913.07c0-4.6-4.96-7.49-8.96-5.22l-23.45 13.33a5.989 5.989 0 0 0-3.04 5.21v16.71c0 4.6 4.97 7.49 8.97 5.21l23.46-13.39a5.979 5.979 0 0 0 3.02-5.21v-16.64Z"/><path fill="#f68bc6" d="M597.9 757.39c0-4.62-5-7.5-9-5.19L413 853.74c-1.86 1.07-3 3.05-3 5.19v22.3c0 4.62 5 7.51 9 5.2l175.9-101.54c1.86-1.07 3-3.05 3-5.2v-22.3Z"/><path fill="#8b87ff" d="M799.9 641.39c0-4.62-5-7.5-9-5.19L615 737.74c-1.86 1.07-3 3.05-3 5.19v22.3c0 4.62 5 7.51 9 5.2l175.9-101.54c1.86-1.07 3-3.05 3-5.2v-22.3Z"/><path fill="#6491fb" d="m655.34 956.56 126.14-72.82c2.18-1.23 3.89-4.57 3.89-7.43 0-2.86-1.74-4.18-3.89-2.94L655.34 946.2c-2.19 1.24-3.88 4.56-3.88 7.42 0 2.87 1.74 4.19 3.88 2.94Z"/><path fill="#94f2b5" d="m579.61 1000.3 53.38-30.81c2.18-1.23 3.88-4.57 3.88-7.43 0-2.86-1.74-4.17-3.88-2.94l-53.38 30.82c-2.19 1.24-3.88 4.56-3.88 7.42-.03 2.88 1.69 4.19 3.88 2.94Z"/><path fill="#ffc99c" d="m541.62 1041.85 156.03-90.12c2.18-1.23 3.89.08 3.89 2.94 0 2.87-1.74 6.2-3.89 7.44l-156.06 90.1c-2.19 1.24-3.9-.08-3.9-2.94.04-2.87 1.78-6.19 3.93-7.42Z"/><path fill="#a69cfb" d="m416.89 1114.43 97.75-56.44c2.19-1.24 3.89.07 3.89 2.94 0 2.86-1.73 6.18-3.89 7.43l-97.75 56.44c-2.19 1.23-3.89-.08-3.89-2.94.02-1.46.39-2.89 1.06-4.18a9.42 9.42 0 0 1 2.83-3.25Z"/><path fill="#ffc99c" d="m614.38 950.84-197.49 113.99c-2.19 1.25-3.89-.08-3.89-2.94.02-1.46.39-2.89 1.06-4.18a9.42 9.42 0 0 1 2.83-3.25l197.45-113.99c2.19-1.24 3.89.07 3.89 2.93a9.365 9.365 0 0 1-1.04 4.18 9.382 9.382 0 0 1-2.81 3.26Z"/><path fill="#f99" d="m740.2 877.6-85.93 49.61c-2.19 1.23-3.89-.08-3.89-2.94 0-2.87 1.74-6.19 3.89-7.43l85.93-49.61c2.18-1.25 3.89.07 3.89 2.94 0 2.86-1.74 6.18-3.89 7.43Z"/><path fill="#94f2b5" d="m497.77 988.19-80.88 46.66c-2.19 1.24-3.89-.08-3.89-2.94.02-1.46.39-2.89 1.06-4.18a9.42 9.42 0 0 1 2.83-3.25l80.88-46.66c2.18-1.24 3.89.08 3.89 2.94a9.486 9.486 0 0 1-1.06 4.18 9.42 9.42 0 0 1-2.83 3.25ZM796.01 815.41l-97.76 56.44c-2.19 1.25-3.88-.08-3.88-2.94s1.74-6.19 3.88-7.43l97.76-56.44c2.19-1.24 3.89.08 3.89 2.94-.04 2.9-1.79 6.17-3.89 7.43Z"/><path fill="#a69cfb" d="m482.65 968.04-65.76 37.95c-2.19 1.24-3.89-.08-3.89-2.94s1.75-6.2 3.89-7.43l65.72-37.95c2.19-1.23 3.88.08 3.88 2.94.04 2.87-1.69 6.23-3.84 7.43Z"/><path fill="#f99" d="m636.3 877.62-128.14 73.97c-2.18 1.24-3.88-.08-3.88-2.94s1.74-6.18 3.88-7.43l128.14-73.97c2.19-1.25 3.88.08 3.88 2.94s-1.74 6.19-3.88 7.43Z"/><path fill="#ffc99c" d="M780.03 794.63 651.91 868.6c-2.19 1.24-3.89-.07-3.89-2.94 0-2.86 1.73-6.18 3.89-7.43l128.12-73.97c2.19-1.24 3.89.08 3.89 2.94a9.352 9.352 0 0 1-1.06 4.18 9.317 9.317 0 0 1-2.83 3.25Z"/><path fill="url(#g)" d="M1143.46 314.77c5.92-3.42 10.72-.68 10.72 6.11v157.98c0 6.79-4.8 15.07-10.72 18.49L903.12 636.16c-5.92 3.41-10.72.68-10.72-6.11V472.06c0-6.8 4.8-15.07 10.72-18.49l240.34-138.8Z"/><path fill="url(#h)" d="M936.34 515.51c-2.75-2.2-4.4-6.05-4.4-11 0-11.56 8.25-26.41 18.71-31.91 9.9-6.06 18.71-1.1 18.71 10.45 0 8.25-3.86 17.06-9.36 24.21 9.91 4.95 17.06 14.86 17.06 26.96v7.15l-55.02 32.46v-15.4c-.55-15.96 4.95-30.81 14.3-42.92Z"/><path fill="#fff" d="M1119.18 408.42c0-3.72-4.05-6.04-7.26-4.14l-114.55 67.5a4.814 4.814 0 0 0-2.37 4.15c0 3.72 4.05 6.03 7.26 4.14l114.55-67.5a4.814 4.814 0 0 0 2.37-4.15ZM1073.03 471.43c0-3.73-4.05-6.04-7.26-4.14l-68.41 40.41a4.81 4.81 0 0 0-2.36 4.14c0 3.73 4.05 6.04 7.26 4.14l68.41-40.41a4.822 4.822 0 0 0 2.36-4.14Z"/><path fill="url(#i)" d="M1153.51 545.17c5.91-3.42 10.72-.68 10.72 6.11v157.95c0 6.79-4.81 15.07-10.72 18.49L913.17 866.53c-5.92 3.41-10.72.68-10.72-6.12V702.42c0-6.8 4.8-15.07 10.72-18.49l240.34-138.76Z"/><path fill="url(#j)" d="M948.34 744.51c-2.75-2.2-4.4-6.05-4.4-11 0-11.56 8.25-26.41 18.71-31.91 9.9-6.06 18.71-1.1 18.71 10.45 0 8.25-3.86 17.06-9.36 24.21 9.91 4.95 17.06 14.86 17.06 26.96v7.15l-55.02 32.46v-15.4c-.55-15.96 4.95-30.81 14.3-42.92Z"/><path fill="#fff" d="M1129.18 640.42c0-3.72-4.05-6.04-7.26-4.14l-114.55 67.5a4.814 4.814 0 0 0-2.37 4.15c0 3.72 4.05 6.04 7.26 4.14l114.55-67.5a4.814 4.814 0 0 0 2.37-4.15ZM1083.03 703.43c0-3.73-4.05-6.04-7.26-4.14l-68.41 40.41a4.822 4.822 0 0 0-2.36 4.14c0 3.73 4.05 6.04 7.26 4.14l68.41-40.41a4.822 4.822 0 0 0 2.36-4.14Z"/></g></svg>
\ No newline at end of file
<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200" class="icon" viewBox="0 0 1536 1024"><path fill="#1296db" d="M1425.067.256H110.933A110.933 110.933 0 0 0 0 110.848v723.627a110.933 110.933 0 0 0 110.933 110.933h1314.39c61.269 0 110.933-49.75 110.677-110.677V110.848A110.933 110.933 0 0 0 1425.067.256z" class="selected" data-spm-anchor-id="a313x.7781069.0.i4"/><path fill="#FFF" d="M664.747 723.797V435.883L517.12 620.373l-147.456-184.49v288l-148.053-67.158V221.781h147.626l147.627 184.576 147.541-184.576h147.627v565.76z"/><path d="M1024 0h426.667A85.333 85.333 0 0 1 1536 85.333v768a85.333 85.333 0 0 1-85.333 85.334H1024V0z" opacity=".1"/><path fill="#FFF" d="m1256.96 731.307-170.667-216.491h113.75V304.64h113.749v210.176h113.835z" opacity=".5"/></svg>
\ No newline at end of file
const e=JSON.parse('{"key":"v-2d0aa3df","path":"/md/","title":"Md","lang":"zh-CN","frontmatter":{"title":"Md","article":false,"feed":false,"sitemap":false,"description":"","head":[["meta",{"property":"og:url","content":"https://vuepress-theme-hope-docs-demo.netlify.app/md/"}],["meta",{"property":"og:site_name","content":"我的简历"}],["meta",{"property":"og:title","content":"Md"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"Mr.Hope"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Md\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":1},"filePathRelative":null,"autoDesc":true}');export{e as data};
const e=JSON.parse('{"key":"v-8daa1a0e","path":"/","title":"主页","lang":"zh-CN","frontmatter":{"home":true,"icon":"home","title":"主页","heroImage":"/logo.svg","bgImage":"https://theme-hope-assets.vuejs.press/bg/6-light.svg","bgImageDark":"https://theme-hope-assets.vuejs.press/bg/6-dark.svg","bgImageStyle":{"background-attachment":"fixed"},"heroText":"我的博客简历","tagline":"您好,我叫小傅哥,毕业于🎓吉林大学。在校期间积累了不错的编程经验,可熟练运用主流分布式技术栈,独立开发项目。","actions":[{"text":"查看简历 👣","link":"./md/","type":"primary"},{"text":"我的项目 💐","link":"https://openai.gaga.plus/"}],"highlights":[{"header":null,"bgImage":"/assets/bg/6-light.svg","bgImageDark":"/assets/bg/6-dark.svg","features":[{"title":"公众号 - 抽奖系统","icon":"comment-dots","details":"23年1月,以DDD领域驱动设计架构,开发完成分布式抽奖系统。运用了全面的分布式技术栈。","link":"https://theme-hope.vuejs.press/zh/guide/markdown/others.html#link-check"},{"title":"手写 MyBatis","icon":"box-archive","details":"23年4月,深度学习《手写MyBatis:渐进式源码实践》一书,完整实现了一个 MyBatis ORM 框架。","link":"https://theme-hope.vuejs.press/zh/guide/markdown/container.html"},{"title":"OpenAI 应用服务","icon":"table-columns","details":"23年8月,学习 OpenAi 技术,学习 OpenAi SDK 开发,完成应用场景的对接使用「涵盖支付对接」。","link":"https://theme-hope.vuejs.press/zh/guide/markdown/tabs.html"},{"title":"SpringBoot Stater","icon":"table-columns","details":"23年10月,通过对业务项目开发中的学习,对同类共性功能的重复开发,凝练成通用的服务治理组件。","link":"https://theme-hope.vuejs.press/zh/guide/markdown/tabs.html"}]}],"copyright":false,"footer":"<div class=\\"content\\"><a href=\\"http://beian.miit.gov.cn\\" target=\\"_blank\\">京ICP备1903****号</a> | MIT 协议, 版权所有 © 2023 你的名字,All rights reserved.</div>","description":"个人在大学/实习期间,参与过多次的技术类赛事项目,熟练使用各类技术框架,积累了丰富的开发经验。同时兼具着对技术的喜爱,长期对技术源码进行钻研学习吸收其中的设计精髓。尤其对 MyBatis 源码学习后,开发了一款监控 SQL 慢查询以及优化建议插件。并将此插件发布到了 IDEA Plugin 插件市场,半年获得了3000次下载量,获得了非常好的认可,个人...","head":[["meta",{"property":"og:url","content":"https://vuepress-theme-hope-docs-demo.netlify.app/"}],["meta",{"property":"og:site_name","content":"我的简历"}],["meta",{"property":"og:title","content":"主页"}],["meta",{"property":"og:description","content":"个人在大学/实习期间,参与过多次的技术类赛事项目,熟练使用各类技术框架,积累了丰富的开发经验。同时兼具着对技术的喜爱,长期对技术源码进行钻研学习吸收其中的设计精髓。尤其对 MyBatis 源码学习后,开发了一款监控 SQL 慢查询以及优化建议插件。并将此插件发布到了 IDEA Plugin 插件市场,半年获得了3000次下载量,获得了非常好的认可,个人..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"Mr.Hope"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"主页\\",\\"description\\":\\"个人在大学/实习期间,参与过多次的技术类赛事项目,熟练使用各类技术框架,积累了丰富的开发经验。同时兼具着对技术的喜爱,长期对技术源码进行钻研学习吸收其中的设计精髓。尤其对 MyBatis 源码学习后,开发了一款监控 SQL 慢查询以及优化建议插件。并将此插件发布到了 IDEA Plugin 插件市场,半年获得了3000次下载量,获得了非常好的认可,个人...\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":2.12,"words":637},"filePathRelative":"README.md","autoDesc":true}');export{e as data};
import{_ as o}from"./plugin-vue_export-helper-c27b6911.js";import{r as n,o as a,c as r,a as e,e as l,w as c,d as s}from"./app-89848b6d.js";const d={};function _(m,i){const t=n("RouterLink");return a(),r("div",null,[e("ul",null,[e("li",null,[l(t,{to:"/md/dev-log/day01.html"},{default:c(()=>[s("day01.md")]),_:1})])])])}const p=o(d,[["render",_],["__file","index.html.vue"]]);export{p as default};
import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as n,c as o,a as t}from"./app-89848b6d.js";const c={},l=t("br",null,null,-1),s=t("div",{class:"hint-container tip"},[t("p",{class:"hint-container-title"},"提示"),t("p",null,"个人在大学/实习期间,参与过多次的技术类赛事项目,熟练使用各类技术框架,积累了丰富的开发经验。同时兼具着对技术的喜爱,长期对技术源码进行钻研学习吸收其中的设计精髓。尤其对 MyBatis 源码学习后,开发了一款监控 SQL 慢查询以及优化建议插件。并将此插件发布到了 IDEA Plugin 插件市场,半年获得了3000次下载量,获得了非常好的认可,个人也得到了非常多的成长。地址:http://github.com/xxxx/xxxx")],-1),i=t("blockquote",null,[t("p",null,"我是一名热爱技术的Java程序员,自从踏入这个充满挑战与机遇的专业以来,我始终保持着对技术的高度热情和追求。我深信技术的力量可以改变世界,也能够提升个人的专业素养。在日常工作中,我不仅注重个人技能的提升,更致力于跟踪和学习行业内的最新技术动态,如SpringBoot、微服务架构、容器化技术等,以确保自己的技术栈始终保持现代化和竞争力。")],-1),_=[l,s,i];function a(r,u){return n(),o("div",null,_)}const h=e(c,[["render",a],["__file","index.html.vue"]]);export{h as default};
const e=JSON.parse('{"key":"v-7c27fd02","path":"/md/dev-log/","title":"开发日志","lang":"zh-CN","frontmatter":{"title":"开发日志","index":false,"icon":"laptop-code","category":["自我介绍","专业技能","项目经验"],"description":"day01.md (day01.md);","head":[["meta",{"property":"og:url","content":"https://vuepress-theme-hope-docs-demo.netlify.app/md/dev-log/"}],["meta",{"property":"og:site_name","content":"我的简历"}],["meta",{"property":"og:title","content":"开发日志"}],["meta",{"property":"og:description","content":"day01.md (day01.md);"}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"Mr.Hope"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"开发日志\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"Mr.Hope\\",\\"url\\":\\"https://mister-hope.com\\"}]}"]]},"headers":[],"git":{},"readingTime":{"minutes":0.08,"words":25},"filePathRelative":"md/dev-log/README.md","autoDesc":true}');export{e as data};
import{_ as o}from"./plugin-vue_export-helper-c27b6911.js";import{r as t,o as n,c,e as r}from"./app-89848b6d.js";const a={};function _(s,l){const e=t("AutoCatalog");return n(),c("div",null,[r(e)])}const i=o(a,[["render",_],["__file","index.html.vue"]]);export{i as default};
/*!
* PhotoSwipe 5.4.3 - https://photoswipe.com
* (c) 2023 Dmytro Semenov
*/function f(r,t,i){const e=document.createElement(t);return r&&(e.className=r),i&&i.appendChild(e),e}function p(r,t){return r.x=t.x,r.y=t.y,t.id!==void 0&&(r.id=t.id),r}function M(r){r.x=Math.round(r.x),r.y=Math.round(r.y)}function A(r,t){const i=Math.abs(r.x-t.x),e=Math.abs(r.y-t.y);return Math.sqrt(i*i+e*e)}function x(r,t){return r.x===t.x&&r.y===t.y}function I(r,t,i){return Math.min(Math.max(r,t),i)}function b(r,t,i){let e=`translate3d(${r}px,${t||0}px,0)`;return i!==void 0&&(e+=` scale3d(${i},${i},1)`),e}function y(r,t,i,e){r.style.transform=b(t,i,e)}const $="cubic-bezier(.4,0,.22,1)";function R(r,t,i,e){r.style.transition=t?`${t} ${i}ms ${e||$}`:"none"}function L(r,t,i){r.style.width=typeof t=="number"?`${t}px`:t,r.style.height=typeof i=="number"?`${i}px`:i}function U(r){R(r)}function q(r){return"decode"in r?r.decode().catch(()=>{}):r.complete?Promise.resolve(r):new Promise((t,i)=>{r.onload=()=>t(r),r.onerror=i})}const _={IDLE:"idle",LOADING:"loading",LOADED:"loaded",ERROR:"error"};function G(r){return"button"in r&&r.button===1||r.ctrlKey||r.metaKey||r.altKey||r.shiftKey}function K(r,t,i=document){let e=[];if(r instanceof Element)e=[r];else if(r instanceof NodeList||Array.isArray(r))e=Array.from(r);else{const s=typeof r=="string"?r:t;s&&(e=Array.from(i.querySelectorAll(s)))}return e}function C(){return!!(navigator.vendor&&navigator.vendor.match(/apple/i))}let F=!1;try{window.addEventListener("test",null,Object.defineProperty({},"passive",{get:()=>{F=!0}}))}catch{}class X{constructor(){this._pool=[]}add(t,i,e,s){this._toggleListener(t,i,e,s)}remove(t,i,e,s){this._toggleListener(t,i,e,s,!0)}removeAll(){this._pool.forEach(t=>{this._toggleListener(t.target,t.type,t.listener,t.passive,!0,!0)}),this._pool=[]}_toggleListener(t,i,e,s,n,o){if(!t)return;const a=n?"removeEventListener":"addEventListener";i.split(" ").forEach(l=>{if(l){o||(n?this._pool=this._pool.filter(d=>d.type!==l||d.listener!==e||d.target!==t):this._pool.push({target:t,type:l,listener:e,passive:s}));const c=F?{passive:s||!1}:!1;t[a](l,e,c)}})}}function B(r,t){if(r.getViewportSizeFn){const i=r.getViewportSizeFn(r,t);if(i)return i}return{x:document.documentElement.clientWidth,y:window.innerHeight}}function S(r,t,i,e,s){let n=0;if(t.paddingFn)n=t.paddingFn(i,e,s)[r];else if(t.padding)n=t.padding[r];else{const o="padding"+r[0].toUpperCase()+r.slice(1);t[o]&&(n=t[o])}return Number(n)||0}function N(r,t,i,e){return{x:t.x-S("left",r,t,i,e)-S("right",r,t,i,e),y:t.y-S("top",r,t,i,e)-S("bottom",r,t,i,e)}}class Y{constructor(t){this.slide=t,this.currZoomLevel=1,this.center={x:0,y:0},this.max={x:0,y:0},this.min={x:0,y:0}}update(t){this.currZoomLevel=t,this.slide.width?(this._updateAxis("x"),this._updateAxis("y"),this.slide.pswp.dispatch("calcBounds",{slide:this.slide})):this.reset()}_updateAxis(t){const{pswp:i}=this.slide,e=this.slide[t==="x"?"width":"height"]*this.currZoomLevel,n=S(t==="x"?"left":"top",i.options,i.viewportSize,this.slide.data,this.slide.index),o=this.slide.panAreaSize[t];this.center[t]=Math.round((o-e)/2)+n,this.max[t]=e>o?Math.round(o-e)+n:this.center[t],this.min[t]=e>o?n:this.center[t]}reset(){this.center.x=0,this.center.y=0,this.max.x=0,this.max.y=0,this.min.x=0,this.min.y=0}correctPan(t,i){return I(i,this.max[t],this.min[t])}}const T=4e3;class k{constructor(t,i,e,s){this.pswp=s,this.options=t,this.itemData=i,this.index=e,this.panAreaSize=null,this.elementSize=null,this.fit=1,this.fill=1,this.vFill=1,this.initial=1,this.secondary=1,this.max=1,this.min=1}update(t,i,e){const s={x:t,y:i};this.elementSize=s,this.panAreaSize=e;const n=e.x/s.x,o=e.y/s.y;this.fit=Math.min(1,n<o?n:o),this.fill=Math.min(1,n>o?n:o),this.vFill=Math.min(1,o),this.initial=this._getInitial(),this.secondary=this._getSecondary(),this.max=Math.max(this.initial,this.secondary,this._getMax()),this.min=Math.min(this.fit,this.initial,this.secondary),this.pswp&&this.pswp.dispatch("zoomLevelsUpdate",{zoomLevels:this,slideData:this.itemData})}_parseZoomLevelOption(t){const i=t+"ZoomLevel",e=this.options[i];if(e)return typeof e=="function"?e(this):e==="fill"?this.fill:e==="fit"?this.fit:Number(e)}_getSecondary(){let t=this._parseZoomLevelOption("secondary");return t||(t=Math.min(1,this.fit*3),this.elementSize&&t*this.elementSize.x>T&&(t=T/this.elementSize.x),t)}_getInitial(){return this._parseZoomLevelOption("initial")||this.fit}_getMax(){return this._parseZoomLevelOption("max")||Math.max(1,this.fit*4)}}class j{constructor(t,i,e){this.data=t,this.index=i,this.pswp=e,this.isActive=i===e.currIndex,this.currentResolution=0,this.panAreaSize={x:0,y:0},this.pan={x:0,y:0},this.isFirstSlide=this.isActive&&!e.opener.isOpen,this.zoomLevels=new k(e.options,t,i,e),this.pswp.dispatch("gettingData",{slide:this,data:this.data,index:i}),this.content=this.pswp.contentLoader.getContentBySlide(this),this.container=f("pswp__zoom-wrap","div"),this.holderElement=null,this.currZoomLevel=1,this.width=this.content.width,this.height=this.content.height,this.heavyAppended=!1,this.bounds=new Y(this),this.prevDisplayedWidth=-1,this.prevDisplayedHeight=-1,this.pswp.dispatch("slideInit",{slide:this})}setIsActive(t){t&&!this.isActive?this.activate():!t&&this.isActive&&this.deactivate()}append(t){this.holderElement=t,this.container.style.transformOrigin="0 0",this.data&&(this.calculateSize(),this.load(),this.updateContentSize(),this.appendHeavy(),this.holderElement.appendChild(this.container),this.zoomAndPanToInitial(),this.pswp.dispatch("firstZoomPan",{slide:this}),this.applyCurrentZoomPan(),this.pswp.dispatch("afterSetContent",{slide:this}),this.isActive&&this.activate())}load(){this.content.load(!1),this.pswp.dispatch("slideLoad",{slide:this})}appendHeavy(){const{pswp:t}=this,i=!0;this.heavyAppended||!t.opener.isOpen||t.mainScroll.isShifted()||!this.isActive&&!i||this.pswp.dispatch("appendHeavy",{slide:this}).defaultPrevented||(this.heavyAppended=!0,this.content.append(),this.pswp.dispatch("appendHeavyContent",{slide:this}))}activate(){this.isActive=!0,this.appendHeavy(),this.content.activate(),this.pswp.dispatch("slideActivate",{slide:this})}deactivate(){this.isActive=!1,this.content.deactivate(),this.currZoomLevel!==this.zoomLevels.initial&&this.calculateSize(),this.currentResolution=0,this.zoomAndPanToInitial(),this.applyCurrentZoomPan(),this.updateContentSize(),this.pswp.dispatch("slideDeactivate",{slide:this})}destroy(){this.content.hasSlide=!1,this.content.remove(),this.container.remove(),this.pswp.dispatch("slideDestroy",{slide:this})}resize(){this.currZoomLevel===this.zoomLevels.initial||!this.isActive?(this.calculateSize(),this.currentResolution=0,this.zoomAndPanToInitial(),this.applyCurrentZoomPan(),this.updateContentSize()):(this.calculateSize(),this.bounds.update(this.currZoomLevel),this.panTo(this.pan.x,this.pan.y))}updateContentSize(t){const i=this.currentResolution||this.zoomLevels.initial;if(!i)return;const e=Math.round(this.width*i)||this.pswp.viewportSize.x,s=Math.round(this.height*i)||this.pswp.viewportSize.y;!this.sizeChanged(e,s)&&!t||this.content.setDisplayedSize(e,s)}sizeChanged(t,i){return t!==this.prevDisplayedWidth||i!==this.prevDisplayedHeight?(this.prevDisplayedWidth=t,this.prevDisplayedHeight=i,!0):!1}getPlaceholderElement(){var t;return(t=this.content.placeholder)===null||t===void 0?void 0:t.element}zoomTo(t,i,e,s){const{pswp:n}=this;if(!this.isZoomable()||n.mainScroll.isShifted())return;n.dispatch("beforeZoomTo",{destZoomLevel:t,centerPoint:i,transitionDuration:e}),n.animations.stopAllPan();const o=this.currZoomLevel;s||(t=I(t,this.zoomLevels.min,this.zoomLevels.max)),this.setZoomLevel(t),this.pan.x=this.calculateZoomToPanOffset("x",i,o),this.pan.y=this.calculateZoomToPanOffset("y",i,o),M(this.pan);const a=()=>{this._setResolution(t),this.applyCurrentZoomPan()};e?n.animations.startTransition({isPan:!0,name:"zoomTo",target:this.container,transform:this.getCurrentTransform(),onComplete:a,duration:e,easing:n.options.easing}):a()}toggleZoom(t){this.zoomTo(this.currZoomLevel===this.zoomLevels.initial?this.zoomLevels.secondary:this.zoomLevels.initial,t,this.pswp.options.zoomAnimationDuration)}setZoomLevel(t){this.currZoomLevel=t,this.bounds.update(this.currZoomLevel)}calculateZoomToPanOffset(t,i,e){if(this.bounds.max[t]-this.bounds.min[t]===0)return this.bounds.center[t];i||(i=this.pswp.getViewportCenterPoint()),e||(e=this.zoomLevels.initial);const n=this.currZoomLevel/e;return this.bounds.correctPan(t,(this.pan[t]-i[t])*n+i[t])}panTo(t,i){this.pan.x=this.bounds.correctPan("x",t),this.pan.y=this.bounds.correctPan("y",i),this.applyCurrentZoomPan()}isPannable(){return!!this.width&&this.currZoomLevel>this.zoomLevels.fit}isZoomable(){return!!this.width&&this.content.isZoomable()}applyCurrentZoomPan(){this._applyZoomTransform(this.pan.x,this.pan.y,this.currZoomLevel),this===this.pswp.currSlide&&this.pswp.dispatch("zoomPanUpdate",{slide:this})}zoomAndPanToInitial(){this.currZoomLevel=this.zoomLevels.initial,this.bounds.update(this.currZoomLevel),p(this.pan,this.bounds.center),this.pswp.dispatch("initialZoomPan",{slide:this})}_applyZoomTransform(t,i,e){e/=this.currentResolution||this.zoomLevels.initial,y(this.container,t,i,e)}calculateSize(){const{pswp:t}=this;p(this.panAreaSize,N(t.options,t.viewportSize,this.data,this.index)),this.zoomLevels.update(this.width,this.height,this.panAreaSize),t.dispatch("calcSlideSize",{slide:this})}getCurrentTransform(){const t=this.currZoomLevel/(this.currentResolution||this.zoomLevels.initial);return b(this.pan.x,this.pan.y,t)}_setResolution(t){t!==this.currentResolution&&(this.currentResolution=t,this.updateContentSize(),this.pswp.dispatch("resolutionChanged"))}}const Q=.35,J=.6,z=.4,E=.5;function tt(r,t){return r*t/(1-t)}class it{constructor(t){this.gestures=t,this.pswp=t.pswp,this.startPan={x:0,y:0}}start(){this.pswp.currSlide&&p(this.startPan,this.pswp.currSlide.pan),this.pswp.animations.stopAll()}change(){const{p1:t,prevP1:i,dragAxis:e}=this.gestures,{currSlide:s}=this.pswp;if(e==="y"&&this.pswp.options.closeOnVerticalDrag&&s&&s.currZoomLevel<=s.zoomLevels.fit&&!this.gestures.isMultitouch){const n=s.pan.y+(t.y-i.y);if(!this.pswp.dispatch("verticalDrag",{panY:n}).defaultPrevented){this._setPanWithFriction("y",n,J);const o=1-Math.abs(this._getVerticalDragRatio(s.pan.y));this.pswp.applyBgOpacity(o),s.applyCurrentZoomPan()}}else this._panOrMoveMainScroll("x")||(this._panOrMoveMainScroll("y"),s&&(M(s.pan),s.applyCurrentZoomPan()))}end(){const{velocity:t}=this.gestures,{mainScroll:i,currSlide:e}=this.pswp;let s=0;if(this.pswp.animations.stopAll(),i.isShifted()){const o=(i.x-i.getCurrSlideX())/this.pswp.viewportSize.x;t.x<-E&&o<0||t.x<.1&&o<-.5?(s=1,t.x=Math.min(t.x,0)):(t.x>E&&o>0||t.x>-.1&&o>.5)&&(s=-1,t.x=Math.max(t.x,0)),i.moveIndexBy(s,!0,t.x)}e&&e.currZoomLevel>e.zoomLevels.max||this.gestures.isMultitouch?this.gestures.zoomLevels.correctZoomPan(!0):(this._finishPanGestureForAxis("x"),this._finishPanGestureForAxis("y"))}_finishPanGestureForAxis(t){const{velocity:i}=this.gestures,{currSlide:e}=this.pswp;if(!e)return;const{pan:s,bounds:n}=e,o=s[t],a=this.pswp.bgOpacity<1&&t==="y",h=.995,l=o+tt(i[t],h);if(a){const v=this._getVerticalDragRatio(o),w=this._getVerticalDragRatio(l);if(v<0&&w<-z||v>0&&w>z){this.pswp.close();return}}const c=n.correctPan(t,l);if(o===c)return;const d=c===l?1:.82,u=this.pswp.bgOpacity,m=c-o;this.pswp.animations.startSpring({name:"panGesture"+t,isPan:!0,start:o,end:c,velocity:i[t],dampingRatio:d,onUpdate:v=>{if(a&&this.pswp.bgOpacity<1){const w=1-(c-v)/m;this.pswp.applyBgOpacity(I(u+(1-u)*w,0,1))}s[t]=Math.floor(v),e.applyCurrentZoomPan()}})}_panOrMoveMainScroll(t){const{p1:i,dragAxis:e,prevP1:s,isMultitouch:n}=this.gestures,{currSlide:o,mainScroll:a}=this.pswp,h=i[t]-s[t],l=a.x+h;if(!h||!o)return!1;if(t==="x"&&!o.isPannable()&&!n)return a.moveTo(l,!0),!0;const{bounds:c}=o,d=o.pan[t]+h;if(this.pswp.options.allowPanToNext&&e==="x"&&t==="x"&&!n){const u=a.getCurrSlideX(),m=a.x-u,v=h>0,w=!v;if(d>c.min[t]&&v){if(c.min[t]<=this.startPan[t])return a.moveTo(l,!0),!0;this._setPanWithFriction(t,d)}else if(d<c.max[t]&&w){if(this.startPan[t]<=c.max[t])return a.moveTo(l,!0),!0;this._setPanWithFriction(t,d)}else if(m!==0){if(m>0)return a.moveTo(Math.max(l,u),!0),!0;if(m<0)return a.moveTo(Math.min(l,u),!0),!0}else this._setPanWithFriction(t,d)}else t==="y"?!a.isShifted()&&c.min.y!==c.max.y&&this._setPanWithFriction(t,d):this._setPanWithFriction(t,d);return!1}_getVerticalDragRatio(t){var i,e;return(t-((i=(e=this.pswp.currSlide)===null||e===void 0?void 0:e.bounds.center.y)!==null&&i!==void 0?i:0))/(this.pswp.viewportSize.y/3)}_setPanWithFriction(t,i,e){const{currSlide:s}=this.pswp;if(!s)return;const{pan:n,bounds:o}=s;if(o.correctPan(t,i)!==i||e){const h=Math.round(i-n[t]);n[t]+=h*(e||Q)}else n[t]=i}}const et=.05,st=.15;function O(r,t,i){return r.x=(t.x+i.x)/2,r.y=(t.y+i.y)/2,r}class nt{constructor(t){this.gestures=t,this._startPan={x:0,y:0},this._startZoomPoint={x:0,y:0},this._zoomPoint={x:0,y:0},this._wasOverFitZoomLevel=!1,this._startZoomLevel=1}start(){const{currSlide:t}=this.gestures.pswp;t&&(this._startZoomLevel=t.currZoomLevel,p(this._startPan,t.pan)),this.gestures.pswp.animations.stopAllPan(),this._wasOverFitZoomLevel=!1}change(){const{p1:t,startP1:i,p2:e,startP2:s,pswp:n}=this.gestures,{currSlide:o}=n;if(!o)return;const a=o.zoomLevels.min,h=o.zoomLevels.max;if(!o.isZoomable()||n.mainScroll.isShifted())return;O(this._startZoomPoint,i,s),O(this._zoomPoint,t,e);let l=1/A(i,s)*A(t,e)*this._startZoomLevel;if(l>o.zoomLevels.initial+o.zoomLevels.initial/15&&(this._wasOverFitZoomLevel=!0),l<a)if(n.options.pinchToClose&&!this._wasOverFitZoomLevel&&this._startZoomLevel<=o.zoomLevels.initial){const c=1-(a-l)/(a/1.2);n.dispatch("pinchClose",{bgOpacity:c}).defaultPrevented||n.applyBgOpacity(c)}else l=a-(a-l)*st;else l>h&&(l=h+(l-h)*et);o.pan.x=this._calculatePanForZoomLevel("x",l),o.pan.y=this._calculatePanForZoomLevel("y",l),o.setZoomLevel(l),o.applyCurrentZoomPan()}end(){const{pswp:t}=this.gestures,{currSlide:i}=t;(!i||i.currZoomLevel<i.zoomLevels.initial)&&!this._wasOverFitZoomLevel&&t.options.pinchToClose?t.close():this.correctZoomPan()}_calculatePanForZoomLevel(t,i){const e=i/this._startZoomLevel;return this._zoomPoint[t]-(this._startZoomPoint[t]-this._startPan[t])*e}correctZoomPan(t){const{pswp:i}=this.gestures,{currSlide:e}=i;if(!(e!=null&&e.isZoomable()))return;this._zoomPoint.x===0&&(t=!0);const s=e.currZoomLevel;let n,o=!0;s<e.zoomLevels.initial?n=e.zoomLevels.initial:s>e.zoomLevels.max?n=e.zoomLevels.max:(o=!1,n=s);const a=i.bgOpacity,h=i.bgOpacity<1,l=p({x:0,y:0},e.pan);let c=p({x:0,y:0},l);t&&(this._zoomPoint.x=0,this._zoomPoint.y=0,this._startZoomPoint.x=0,this._startZoomPoint.y=0,this._startZoomLevel=s,p(this._startPan,l)),o&&(c={x:this._calculatePanForZoomLevel("x",n),y:this._calculatePanForZoomLevel("y",n)}),e.setZoomLevel(n),c={x:e.bounds.correctPan("x",c.x),y:e.bounds.correctPan("y",c.y)},e.setZoomLevel(s);const d=!x(c,l);if(!d&&!o&&!h){e._setResolution(n),e.applyCurrentZoomPan();return}i.animations.stopAllPan(),i.animations.startSpring({isPan:!0,start:0,end:1e3,velocity:0,dampingRatio:1,naturalFrequency:40,onUpdate:u=>{if(u/=1e3,d||o){if(d&&(e.pan.x=l.x+(c.x-l.x)*u,e.pan.y=l.y+(c.y-l.y)*u),o){const m=s+(n-s)*u;e.setZoomLevel(m)}e.applyCurrentZoomPan()}h&&i.bgOpacity<1&&i.applyBgOpacity(I(a+(1-a)*u,0,1))},onComplete:()=>{e._setResolution(n),e.applyCurrentZoomPan()}})}}function Z(r){return!!r.target.closest(".pswp__container")}class ot{constructor(t){this.gestures=t}click(t,i){const e=i.target.classList,s=e.contains("pswp__img"),n=e.contains("pswp__item")||e.contains("pswp__zoom-wrap");s?this._doClickOrTapAction("imageClick",t,i):n&&this._doClickOrTapAction("bgClick",t,i)}tap(t,i){Z(i)&&this._doClickOrTapAction("tap",t,i)}doubleTap(t,i){Z(i)&&this._doClickOrTapAction("doubleTap",t,i)}_doClickOrTapAction(t,i,e){var s;const{pswp:n}=this.gestures,{currSlide:o}=n,a=t+"Action",h=n.options[a];if(!n.dispatch(a,{point:i,originalEvent:e}).defaultPrevented){if(typeof h=="function"){h.call(n,i,e);return}switch(h){case"close":case"next":n[h]();break;case"zoom":o==null||o.toggleZoom(i);break;case"zoom-or-close":o!=null&&o.isZoomable()&&o.zoomLevels.secondary!==o.zoomLevels.initial?o.toggleZoom(i):n.options.clickToCloseNonZoomable&&n.close();break;case"toggle-controls":(s=this.gestures.pswp.element)===null||s===void 0||s.classList.toggle("pswp--ui-visible");break}}}}const rt=10,at=300,ht=25;class lt{constructor(t){this.pswp=t,this.dragAxis=null,this.p1={x:0,y:0},this.p2={x:0,y:0},this.prevP1={x:0,y:0},this.prevP2={x:0,y:0},this.startP1={x:0,y:0},this.startP2={x:0,y:0},this.velocity={x:0,y:0},this._lastStartP1={x:0,y:0},this._intervalP1={x:0,y:0},this._numActivePoints=0,this._ongoingPointers=[],this._touchEventEnabled="ontouchstart"in window,this._pointerEventEnabled=!!window.PointerEvent,this.supportsTouch=this._touchEventEnabled||this._pointerEventEnabled&&navigator.maxTouchPoints>1,this._numActivePoints=0,this._intervalTime=0,this._velocityCalculated=!1,this.isMultitouch=!1,this.isDragging=!1,this.isZooming=!1,this.raf=null,this._tapTimer=null,this.supportsTouch||(t.options.allowPanToNext=!1),this.drag=new it(this),this.zoomLevels=new nt(this),this.tapHandler=new ot(this),t.on("bindEvents",()=>{t.events.add(t.scrollWrap,"click",this._onClick.bind(this)),this._pointerEventEnabled?this._bindEvents("pointer","down","up","cancel"):this._touchEventEnabled?(this._bindEvents("touch","start","end","cancel"),t.scrollWrap&&(t.scrollWrap.ontouchmove=()=>{},t.scrollWrap.ontouchend=()=>{})):this._bindEvents("mouse","down","up")})}_bindEvents(t,i,e,s){const{pswp:n}=this,{events:o}=n,a=s?t+s:"";o.add(n.scrollWrap,t+i,this.onPointerDown.bind(this)),o.add(window,t+"move",this.onPointerMove.bind(this)),o.add(window,t+e,this.onPointerUp.bind(this)),a&&o.add(n.scrollWrap,a,this.onPointerUp.bind(this))}onPointerDown(t){const i=t.type==="mousedown"||t.pointerType==="mouse";if(i&&t.button>0)return;const{pswp:e}=this;if(!e.opener.isOpen){t.preventDefault();return}e.dispatch("pointerDown",{originalEvent:t}).defaultPrevented||(i&&(e.mouseDetected(),this._preventPointerEventBehaviour(t,"down")),e.animations.stopAll(),this._updatePoints(t,"down"),this._numActivePoints===1&&(this.dragAxis=null,p(this.startP1,this.p1)),this._numActivePoints>1?(this._clearTapTimer(),this.isMultitouch=!0):this.isMultitouch=!1)}onPointerMove(t){this._preventPointerEventBehaviour(t,"move"),this._numActivePoints&&(this._updatePoints(t,"move"),!this.pswp.dispatch("pointerMove",{originalEvent:t}).defaultPrevented&&(this._numActivePoints===1&&!this.isDragging?(this.dragAxis||this._calculateDragDirection(),this.dragAxis&&!this.isDragging&&(this.isZooming&&(this.isZooming=!1,this.zoomLevels.end()),this.isDragging=!0,this._clearTapTimer(),this._updateStartPoints(),this._intervalTime=Date.now(),this._velocityCalculated=!1,p(this._intervalP1,this.p1),this.velocity.x=0,this.velocity.y=0,this.drag.start(),this._rafStopLoop(),this._rafRenderLoop())):this._numActivePoints>1&&!this.isZooming&&(this._finishDrag(),this.isZooming=!0,this._updateStartPoints(),this.zoomLevels.start(),this._rafStopLoop(),this._rafRenderLoop())))}_finishDrag(){this.isDragging&&(this.isDragging=!1,this._velocityCalculated||this._updateVelocity(!0),this.drag.end(),this.dragAxis=null)}onPointerUp(t){this._numActivePoints&&(this._updatePoints(t,"up"),!this.pswp.dispatch("pointerUp",{originalEvent:t}).defaultPrevented&&(this._numActivePoints===0&&(this._rafStopLoop(),this.isDragging?this._finishDrag():!this.isZooming&&!this.isMultitouch&&this._finishTap(t)),this._numActivePoints<2&&this.isZooming&&(this.isZooming=!1,this.zoomLevels.end(),this._numActivePoints===1&&(this.dragAxis=null,this._updateStartPoints()))))}_rafRenderLoop(){(this.isDragging||this.isZooming)&&(this._updateVelocity(),this.isDragging?x(this.p1,this.prevP1)||this.drag.change():(!x(this.p1,this.prevP1)||!x(this.p2,this.prevP2))&&this.zoomLevels.change(),this._updatePrevPoints(),this.raf=requestAnimationFrame(this._rafRenderLoop.bind(this)))}_updateVelocity(t){const i=Date.now(),e=i-this._intervalTime;e<50&&!t||(this.velocity.x=this._getVelocity("x",e),this.velocity.y=this._getVelocity("y",e),this._intervalTime=i,p(this._intervalP1,this.p1),this._velocityCalculated=!0)}_finishTap(t){const{mainScroll:i}=this.pswp;if(i.isShifted()){i.moveIndexBy(0,!0);return}if(t.type.indexOf("cancel")>0)return;if(t.type==="mouseup"||t.pointerType==="mouse"){this.tapHandler.click(this.startP1,t);return}const e=this.pswp.options.doubleTapAction?at:0;this._tapTimer?(this._clearTapTimer(),A(this._lastStartP1,this.startP1)<ht&&this.tapHandler.doubleTap(this.startP1,t)):(p(this._lastStartP1,this.startP1),this._tapTimer=setTimeout(()=>{this.tapHandler.tap(this.startP1,t),this._clearTapTimer()},e))}_clearTapTimer(){this._tapTimer&&(clearTimeout(this._tapTimer),this._tapTimer=null)}_getVelocity(t,i){const e=this.p1[t]-this._intervalP1[t];return Math.abs(e)>1&&i>5?e/i:0}_rafStopLoop(){this.raf&&(cancelAnimationFrame(this.raf),this.raf=null)}_preventPointerEventBehaviour(t,i){this.pswp.applyFilters("preventPointerEvent",!0,t,i)&&t.preventDefault()}_updatePoints(t,i){if(this._pointerEventEnabled){const e=t,s=this._ongoingPointers.findIndex(n=>n.id===e.pointerId);i==="up"&&s>-1?this._ongoingPointers.splice(s,1):i==="down"&&s===-1?this._ongoingPointers.push(this._convertEventPosToPoint(e,{x:0,y:0})):s>-1&&this._convertEventPosToPoint(e,this._ongoingPointers[s]),this._numActivePoints=this._ongoingPointers.length,this._numActivePoints>0&&p(this.p1,this._ongoingPointers[0]),this._numActivePoints>1&&p(this.p2,this._ongoingPointers[1])}else{const e=t;this._numActivePoints=0,e.type.indexOf("touch")>-1?e.touches&&e.touches.length>0&&(this._convertEventPosToPoint(e.touches[0],this.p1),this._numActivePoints++,e.touches.length>1&&(this._convertEventPosToPoint(e.touches[1],this.p2),this._numActivePoints++)):(this._convertEventPosToPoint(t,this.p1),i==="up"?this._numActivePoints=0:this._numActivePoints++)}}_updatePrevPoints(){p(this.prevP1,this.p1),p(this.prevP2,this.p2)}_updateStartPoints(){p(this.startP1,this.p1),p(this.startP2,this.p2),this._updatePrevPoints()}_calculateDragDirection(){if(this.pswp.mainScroll.isShifted())this.dragAxis="x";else{const t=Math.abs(this.p1.x-this.startP1.x)-Math.abs(this.p1.y-this.startP1.y);if(t!==0){const i=t>0?"x":"y";Math.abs(this.p1[i]-this.startP1[i])>=rt&&(this.dragAxis=i)}}}_convertEventPosToPoint(t,i){return i.x=t.pageX-this.pswp.offset.x,i.y=t.pageY-this.pswp.offset.y,"pointerId"in t?i.id=t.pointerId:t.identifier!==void 0&&(i.id=t.identifier),i}_onClick(t){this.pswp.mainScroll.isShifted()&&(t.preventDefault(),t.stopPropagation())}}const ct=.35;class dt{constructor(t){this.pswp=t,this.x=0,this.slideWidth=0,this._currPositionIndex=0,this._prevPositionIndex=0,this._containerShiftIndex=-1,this.itemHolders=[]}resize(t){const{pswp:i}=this,e=Math.round(i.viewportSize.x+i.viewportSize.x*i.options.spacing),s=e!==this.slideWidth;s&&(this.slideWidth=e,this.moveTo(this.getCurrSlideX())),this.itemHolders.forEach((n,o)=>{s&&y(n.el,(o+this._containerShiftIndex)*this.slideWidth),t&&n.slide&&n.slide.resize()})}resetPosition(){this._currPositionIndex=0,this._prevPositionIndex=0,this.slideWidth=0,this._containerShiftIndex=-1}appendHolders(){this.itemHolders=[];for(let t=0;t<3;t++){const i=f("pswp__item","div",this.pswp.container);i.setAttribute("role","group"),i.setAttribute("aria-roledescription","slide"),i.setAttribute("aria-hidden","true"),i.style.display=t===1?"block":"none",this.itemHolders.push({el:i})}}canBeSwiped(){return this.pswp.getNumItems()>1}moveIndexBy(t,i,e){const{pswp:s}=this;let n=s.potentialIndex+t;const o=s.getNumItems();if(s.canLoop()){n=s.getLoopedIndex(n);const h=(t+o)%o;h<=o/2?t=h:t=h-o}else n<0?n=0:n>=o&&(n=o-1),t=n-s.potentialIndex;s.potentialIndex=n,this._currPositionIndex-=t,s.animations.stopMainScroll();const a=this.getCurrSlideX();if(!i)this.moveTo(a),this.updateCurrItem();else{s.animations.startSpring({isMainScroll:!0,start:this.x,end:a,velocity:e||0,naturalFrequency:30,dampingRatio:1,onUpdate:l=>{this.moveTo(l)},onComplete:()=>{this.updateCurrItem(),s.appendHeavy()}});let h=s.potentialIndex-s.currIndex;if(s.canLoop()){const l=(h+o)%o;l<=o/2?h=l:h=l-o}Math.abs(h)>1&&this.updateCurrItem()}return!!t}getCurrSlideX(){return this.slideWidth*this._currPositionIndex}isShifted(){return this.x!==this.getCurrSlideX()}updateCurrItem(){var t;const{pswp:i}=this,e=this._prevPositionIndex-this._currPositionIndex;if(!e)return;this._prevPositionIndex=this._currPositionIndex,i.currIndex=i.potentialIndex;let s=Math.abs(e),n;s>=3&&(this._containerShiftIndex+=e+(e>0?-3:3),s=3);for(let o=0;o<s;o++)e>0?(n=this.itemHolders.shift(),n&&(this.itemHolders[2]=n,this._containerShiftIndex++,y(n.el,(this._containerShiftIndex+2)*this.slideWidth),i.setContent(n,i.currIndex-s+o+2))):(n=this.itemHolders.pop(),n&&(this.itemHolders.unshift(n),this._containerShiftIndex--,y(n.el,this._containerShiftIndex*this.slideWidth),i.setContent(n,i.currIndex+s-o-2)));Math.abs(this._containerShiftIndex)>50&&!this.isShifted()&&(this.resetPosition(),this.resize()),i.animations.stopAllPan(),this.itemHolders.forEach((o,a)=>{o.slide&&o.slide.setIsActive(a===1)}),i.currSlide=(t=this.itemHolders[1])===null||t===void 0?void 0:t.slide,i.contentLoader.updateLazy(e),i.currSlide&&i.currSlide.applyCurrentZoomPan(),i.dispatch("change")}moveTo(t,i){if(!this.pswp.canLoop()&&i){let e=(this.slideWidth*this._currPositionIndex-t)/this.slideWidth;e+=this.pswp.currIndex;const s=Math.round(t-this.x);(e<0&&s>0||e>=this.pswp.getNumItems()-1&&s<0)&&(t=this.x+s*ct)}this.x=t,this.pswp.container&&y(this.pswp.container,t),this.pswp.dispatch("moveMainScroll",{x:t,dragging:i??!1})}}const pt={Escape:27,z:90,ArrowLeft:37,ArrowUp:38,ArrowRight:39,ArrowDown:40,Tab:9},g=(r,t)=>t?r:pt[r];class ut{constructor(t){this.pswp=t,this._wasFocused=!1,t.on("bindEvents",()=>{t.options.trapFocus&&(t.options.initialPointerPos||this._focusRoot(),t.events.add(document,"focusin",this._onFocusIn.bind(this))),t.events.add(document,"keydown",this._onKeyDown.bind(this))});const i=document.activeElement;t.on("destroy",()=>{t.options.returnFocus&&i&&this._wasFocused&&i.focus()})}_focusRoot(){!this._wasFocused&&this.pswp.element&&(this.pswp.element.focus(),this._wasFocused=!0)}_onKeyDown(t){const{pswp:i}=this;if(i.dispatch("keydown",{originalEvent:t}).defaultPrevented||G(t))return;let e,s,n=!1;const o="key"in t;switch(o?t.key:t.keyCode){case g("Escape",o):i.options.escKey&&(e="close");break;case g("z",o):e="toggleZoom";break;case g("ArrowLeft",o):s="x";break;case g("ArrowUp",o):s="y";break;case g("ArrowRight",o):s="x",n=!0;break;case g("ArrowDown",o):n=!0,s="y";break;case g("Tab",o):this._focusRoot();break}if(s){t.preventDefault();const{currSlide:a}=i;i.options.arrowKeys&&s==="x"&&i.getNumItems()>1?e=n?"next":"prev":a&&a.currZoomLevel>a.zoomLevels.fit&&(a.pan[s]+=n?-80:80,a.panTo(a.pan.x,a.pan.y))}e&&(t.preventDefault(),i[e]())}_onFocusIn(t){const{template:i}=this.pswp;i&&document!==t.target&&i!==t.target&&!i.contains(t.target)&&i.focus()}}const mt="cubic-bezier(.4,0,.22,1)";class ft{constructor(t){var i;this.props=t;const{target:e,onComplete:s,transform:n,onFinish:o=()=>{},duration:a=333,easing:h=mt}=t;this.onFinish=o;const l=n?"transform":"opacity",c=(i=t[l])!==null&&i!==void 0?i:"";this._target=e,this._onComplete=s,this._finished=!1,this._onTransitionEnd=this._onTransitionEnd.bind(this),this._helperTimeout=setTimeout(()=>{R(e,l,a,h),this._helperTimeout=setTimeout(()=>{e.addEventListener("transitionend",this._onTransitionEnd,!1),e.addEventListener("transitioncancel",this._onTransitionEnd,!1),this._helperTimeout=setTimeout(()=>{this._finalizeAnimation()},a+500),e.style[l]=c},30)},0)}_onTransitionEnd(t){t.target===this._target&&this._finalizeAnimation()}_finalizeAnimation(){this._finished||(this._finished=!0,this.onFinish(),this._onComplete&&this._onComplete())}destroy(){this._helperTimeout&&clearTimeout(this._helperTimeout),U(this._target),this._target.removeEventListener("transitionend",this._onTransitionEnd,!1),this._target.removeEventListener("transitioncancel",this._onTransitionEnd,!1),this._finished||this._finalizeAnimation()}}const _t=12,vt=.75;class gt{constructor(t,i,e){this.velocity=t*1e3,this._dampingRatio=i||vt,this._naturalFrequency=e||_t,this._dampedFrequency=this._naturalFrequency,this._dampingRatio<1&&(this._dampedFrequency*=Math.sqrt(1-this._dampingRatio*this._dampingRatio))}easeFrame(t,i){let e=0,s;i/=1e3;const n=Math.E**(-this._dampingRatio*this._naturalFrequency*i);if(this._dampingRatio===1)s=this.velocity+this._naturalFrequency*t,e=(t+s*i)*n,this.velocity=e*-this._naturalFrequency+s*n;else if(this._dampingRatio<1){s=1/this._dampedFrequency*(this._dampingRatio*this._naturalFrequency*t+this.velocity);const o=Math.cos(this._dampedFrequency*i),a=Math.sin(this._dampedFrequency*i);e=n*(t*o+s*a),this.velocity=e*-this._naturalFrequency*this._dampingRatio+n*(-this._dampedFrequency*t*a+this._dampedFrequency*s*o)}return e}}class yt{constructor(t){this.props=t,this._raf=0;const{start:i,end:e,velocity:s,onUpdate:n,onComplete:o,onFinish:a=()=>{},dampingRatio:h,naturalFrequency:l}=t;this.onFinish=a;const c=new gt(s,h,l);let d=Date.now(),u=i-e;const m=()=>{this._raf&&(u=c.easeFrame(u,Date.now()-d),Math.abs(u)<1&&Math.abs(c.velocity)<50?(n(e),o&&o(),this.onFinish()):(d=Date.now(),n(u+e),this._raf=requestAnimationFrame(m)))};this._raf=requestAnimationFrame(m)}destroy(){this._raf>=0&&cancelAnimationFrame(this._raf),this._raf=0}}class wt{constructor(){this.activeAnimations=[]}startSpring(t){this._start(t,!0)}startTransition(t){this._start(t)}_start(t,i){const e=i?new yt(t):new ft(t);return this.activeAnimations.push(e),e.onFinish=()=>this.stop(e),e}stop(t){t.destroy();const i=this.activeAnimations.indexOf(t);i>-1&&this.activeAnimations.splice(i,1)}stopAll(){this.activeAnimations.forEach(t=>{t.destroy()}),this.activeAnimations=[]}stopAllPan(){this.activeAnimations=this.activeAnimations.filter(t=>t.props.isPan?(t.destroy(),!1):!0)}stopMainScroll(){this.activeAnimations=this.activeAnimations.filter(t=>t.props.isMainScroll?(t.destroy(),!1):!0)}isPanRunning(){return this.activeAnimations.some(t=>t.props.isPan)}}class Pt{constructor(t){this.pswp=t,t.events.add(t.element,"wheel",this._onWheel.bind(this))}_onWheel(t){t.preventDefault();const{currSlide:i}=this.pswp;let{deltaX:e,deltaY:s}=t;if(i&&!this.pswp.dispatch("wheel",{originalEvent:t}).defaultPrevented)if(t.ctrlKey||this.pswp.options.wheelToZoom){if(i.isZoomable()){let n=-s;t.deltaMode===1?n*=.05:n*=t.deltaMode?1:.002,n=2**n;const o=i.currZoomLevel*n;i.zoomTo(o,{x:t.clientX,y:t.clientY})}}else i.isPannable()&&(t.deltaMode===1&&(e*=18,s*=18),i.panTo(i.pan.x-e,i.pan.y-s))}}function St(r){if(typeof r=="string")return r;if(!r||!r.isCustomSVG)return"";const t=r;let i='<svg aria-hidden="true" class="pswp__icn" viewBox="0 0 %d %d" width="%d" height="%d">';return i=i.split("%d").join(t.size||32),t.outlineID&&(i+='<use class="pswp__icn-shadow" xlink:href="#'+t.outlineID+'"/>'),i+=t.inner,i+="</svg>",i}class xt{constructor(t,i){var e;const s=i.name||i.className;let n=i.html;if(t.options[s]===!1)return;typeof t.options[s+"SVG"]=="string"&&(n=t.options[s+"SVG"]),t.dispatch("uiElementCreate",{data:i});let o="";i.isButton?(o+="pswp__button ",o+=i.className||`pswp__button--${i.name}`):o+=i.className||`pswp__${i.name}`;let a=i.isButton?i.tagName||"button":i.tagName||"div";a=a.toLowerCase();const h=f(o,a);if(i.isButton){a==="button"&&(h.type="button");let{title:d}=i;const{ariaLabel:u}=i;typeof t.options[s+"Title"]=="string"&&(d=t.options[s+"Title"]),d&&(h.title=d);const m=u||d;m&&h.setAttribute("aria-label",m)}h.innerHTML=St(n),i.onInit&&i.onInit(h,t),i.onClick&&(h.onclick=d=>{typeof i.onClick=="string"?t[i.onClick]():typeof i.onClick=="function"&&i.onClick(d,h,t)});const l=i.appendTo||"bar";let c=t.element;l==="bar"?(t.topBar||(t.topBar=f("pswp__top-bar pswp__hide-on-close","div",t.scrollWrap)),c=t.topBar):(h.classList.add("pswp__hide-on-close"),l==="wrapper"&&(c=t.scrollWrap)),(e=c)===null||e===void 0||e.appendChild(t.applyFilters("uiElement",h,i))}}function H(r,t,i){r.classList.add("pswp__button--arrow"),r.setAttribute("aria-controls","pswp__items"),t.on("change",()=>{t.options.loop||(i?r.disabled=!(t.currIndex<t.getNumItems()-1):r.disabled=!(t.currIndex>0))})}const bt={name:"arrowPrev",className:"pswp__button--arrow--prev",title:"Previous",order:10,isButton:!0,appendTo:"wrapper",html:{isCustomSVG:!0,size:60,inner:'<path d="M29 43l-3 3-16-16 16-16 3 3-13 13 13 13z" id="pswp__icn-arrow"/>',outlineID:"pswp__icn-arrow"},onClick:"prev",onInit:H},It={name:"arrowNext",className:"pswp__button--arrow--next",title:"Next",order:11,isButton:!0,appendTo:"wrapper",html:{isCustomSVG:!0,size:60,inner:'<use xlink:href="#pswp__icn-arrow"/>',outlineID:"pswp__icn-arrow"},onClick:"next",onInit:(r,t)=>{H(r,t,!0)}},At={name:"close",title:"Close",order:20,isButton:!0,html:{isCustomSVG:!0,inner:'<path d="M24 10l-2-2-6 6-6-6-2 2 6 6-6 6 2 2 6-6 6 6 2-2-6-6z" id="pswp__icn-close"/>',outlineID:"pswp__icn-close"},onClick:"close"},Lt={name:"zoom",title:"Zoom",order:10,isButton:!0,html:{isCustomSVG:!0,inner:'<path d="M17.426 19.926a6 6 0 1 1 1.5-1.5L23 22.5 21.5 24l-4.074-4.074z" id="pswp__icn-zoom"/><path fill="currentColor" class="pswp__zoom-icn-bar-h" d="M11 16v-2h6v2z"/><path fill="currentColor" class="pswp__zoom-icn-bar-v" d="M13 12h2v6h-2z"/>',outlineID:"pswp__icn-zoom"},onClick:"toggleZoom"},Ct={name:"preloader",appendTo:"bar",order:7,html:{isCustomSVG:!0,inner:'<path fill-rule="evenodd" clip-rule="evenodd" d="M21.2 16a5.2 5.2 0 1 1-5.2-5.2V8a8 8 0 1 0 8 8h-2.8Z" id="pswp__icn-loading"/>',outlineID:"pswp__icn-loading"},onInit:(r,t)=>{let i,e=null;const s=(a,h)=>{r.classList.toggle("pswp__preloader--"+a,h)},n=a=>{i!==a&&(i=a,s("active",a))},o=()=>{var a;if(!((a=t.currSlide)!==null&&a!==void 0&&a.content.isLoading())){n(!1),e&&(clearTimeout(e),e=null);return}e||(e=setTimeout(()=>{var h;n(!!(!((h=t.currSlide)===null||h===void 0)&&h.content.isLoading())),e=null},t.options.preloaderDelay))};t.on("change",o),t.on("loadComplete",a=>{t.currSlide===a.slide&&o()}),t.ui&&(t.ui.updatePreloaderVisibility=o)}},Tt={name:"counter",order:5,onInit:(r,t)=>{t.on("change",()=>{r.innerText=t.currIndex+1+t.options.indexIndicatorSep+t.getNumItems()})}};function D(r,t){r.classList.toggle("pswp--zoomed-in",t)}class zt{constructor(t){this.pswp=t,this.isRegistered=!1,this.uiElementsData=[],this.items=[],this.updatePreloaderVisibility=()=>{},this._lastUpdatedZoomLevel=void 0}init(){const{pswp:t}=this;this.isRegistered=!1,this.uiElementsData=[At,bt,It,Lt,Ct,Tt],t.dispatch("uiRegister"),this.uiElementsData.sort((i,e)=>(i.order||0)-(e.order||0)),this.items=[],this.isRegistered=!0,this.uiElementsData.forEach(i=>{this.registerElement(i)}),t.on("change",()=>{var i;(i=t.element)===null||i===void 0||i.classList.toggle("pswp--one-slide",t.getNumItems()===1)}),t.on("zoomPanUpdate",()=>this._onZoomPanUpdate())}registerElement(t){this.isRegistered?this.items.push(new xt(this.pswp,t)):this.uiElementsData.push(t)}_onZoomPanUpdate(){const{template:t,currSlide:i,options:e}=this.pswp;if(this.pswp.opener.isClosing||!t||!i)return;let{currZoomLevel:s}=i;if(this.pswp.opener.isOpen||(s=i.zoomLevels.initial),s===this._lastUpdatedZoomLevel)return;this._lastUpdatedZoomLevel=s;const n=i.zoomLevels.initial-i.zoomLevels.secondary;if(Math.abs(n)<.01||!i.isZoomable()){D(t,!1),t.classList.remove("pswp--zoom-allowed");return}t.classList.add("pswp--zoom-allowed");const o=s===i.zoomLevels.initial?i.zoomLevels.secondary:i.zoomLevels.initial;D(t,o<=s),(e.imageClickAction==="zoom"||e.imageClickAction==="zoom-or-close")&&t.classList.add("pswp--click-to-zoom")}}function Et(r){const t=r.getBoundingClientRect();return{x:t.left,y:t.top,w:t.width}}function Ot(r,t,i){const e=r.getBoundingClientRect(),s=e.width/t,n=e.height/i,o=s>n?s:n,a=(e.width-t*o)/2,h=(e.height-i*o)/2,l={x:e.left+a,y:e.top+h,w:t*o};return l.innerRect={w:e.width,h:e.height,x:a,y:h},l}function Zt(r,t,i){const e=i.dispatch("thumbBounds",{index:r,itemData:t,instance:i});if(e.thumbBounds)return e.thumbBounds;const{element:s}=t;let n,o;if(s&&i.options.thumbSelector!==!1){const a=i.options.thumbSelector||"img";o=s.matches(a)?s:s.querySelector(a)}return o=i.applyFilters("thumbEl",o,t,r),o&&(t.thumbCropped?n=Ot(o,t.width||t.w||0,t.height||t.h||0):n=Et(o)),i.applyFilters("thumbBounds",n,t,r)}class Dt{constructor(t,i){this.type=t,this.defaultPrevented=!1,i&&Object.assign(this,i)}preventDefault(){this.defaultPrevented=!0}}class Mt{constructor(){this._listeners={},this._filters={},this.pswp=void 0,this.options=void 0}addFilter(t,i,e=100){var s,n,o;this._filters[t]||(this._filters[t]=[]),(s=this._filters[t])===null||s===void 0||s.push({fn:i,priority:e}),(n=this._filters[t])===null||n===void 0||n.sort((a,h)=>a.priority-h.priority),(o=this.pswp)===null||o===void 0||o.addFilter(t,i,e)}removeFilter(t,i){this._filters[t]&&(this._filters[t]=this._filters[t].filter(e=>e.fn!==i)),this.pswp&&this.pswp.removeFilter(t,i)}applyFilters(t,...i){var e;return(e=this._filters[t])===null||e===void 0||e.forEach(s=>{i[0]=s.fn.apply(this,i)}),i[0]}on(t,i){var e,s;this._listeners[t]||(this._listeners[t]=[]),(e=this._listeners[t])===null||e===void 0||e.push(i),(s=this.pswp)===null||s===void 0||s.on(t,i)}off(t,i){var e;this._listeners[t]&&(this._listeners[t]=this._listeners[t].filter(s=>i!==s)),(e=this.pswp)===null||e===void 0||e.off(t,i)}dispatch(t,i){var e;if(this.pswp)return this.pswp.dispatch(t,i);const s=new Dt(t,i);return(e=this._listeners[t])===null||e===void 0||e.forEach(n=>{n.call(this,s)}),s}}class Rt{constructor(t,i){if(this.element=f("pswp__img pswp__img--placeholder",t?"img":"div",i),t){const e=this.element;e.decoding="async",e.alt="",e.src=t,e.setAttribute("role","presentation")}this.element.setAttribute("aria-hidden","true")}setDisplayedSize(t,i){this.element&&(this.element.tagName==="IMG"?(L(this.element,250,"auto"),this.element.style.transformOrigin="0 0",this.element.style.transform=b(0,0,t/250)):L(this.element,t,i))}destroy(){var t;(t=this.element)!==null&&t!==void 0&&t.parentNode&&this.element.remove(),this.element=null}}class Ft{constructor(t,i,e){this.instance=i,this.data=t,this.index=e,this.element=void 0,this.placeholder=void 0,this.slide=void 0,this.displayedImageWidth=0,this.displayedImageHeight=0,this.width=Number(this.data.w)||Number(this.data.width)||0,this.height=Number(this.data.h)||Number(this.data.height)||0,this.isAttached=!1,this.hasSlide=!1,this.isDecoding=!1,this.state=_.IDLE,this.data.type?this.type=this.data.type:this.data.src?this.type="image":this.type="html",this.instance.dispatch("contentInit",{content:this})}removePlaceholder(){this.placeholder&&!this.keepPlaceholder()&&setTimeout(()=>{this.placeholder&&(this.placeholder.destroy(),this.placeholder=void 0)},1e3)}load(t,i){if(this.slide&&this.usePlaceholder())if(this.placeholder){const e=this.placeholder.element;e&&!e.parentElement&&this.slide.container.prepend(e)}else{const e=this.instance.applyFilters("placeholderSrc",this.data.msrc&&this.slide.isFirstSlide?this.data.msrc:!1,this);this.placeholder=new Rt(e,this.slide.container)}this.element&&!i||this.instance.dispatch("contentLoad",{content:this,isLazy:t}).defaultPrevented||(this.isImageContent()?(this.element=f("pswp__img","img"),this.displayedImageWidth&&this.loadImage(t)):(this.element=f("pswp__content","div"),this.element.innerHTML=this.data.html||""),i&&this.slide&&this.slide.updateContentSize(!0))}loadImage(t){var i,e;if(!this.isImageContent()||!this.element||this.instance.dispatch("contentLoadImage",{content:this,isLazy:t}).defaultPrevented)return;const s=this.element;this.updateSrcsetSizes(),this.data.srcset&&(s.srcset=this.data.srcset),s.src=(i=this.data.src)!==null&&i!==void 0?i:"",s.alt=(e=this.data.alt)!==null&&e!==void 0?e:"",this.state=_.LOADING,s.complete?this.onLoaded():(s.onload=()=>{this.onLoaded()},s.onerror=()=>{this.onError()})}setSlide(t){this.slide=t,this.hasSlide=!0,this.instance=t.pswp}onLoaded(){this.state=_.LOADED,this.slide&&this.element&&(this.instance.dispatch("loadComplete",{slide:this.slide,content:this}),this.slide.isActive&&this.slide.heavyAppended&&!this.element.parentNode&&(this.append(),this.slide.updateContentSize(!0)),(this.state===_.LOADED||this.state===_.ERROR)&&this.removePlaceholder())}onError(){this.state=_.ERROR,this.slide&&(this.displayError(),this.instance.dispatch("loadComplete",{slide:this.slide,isError:!0,content:this}),this.instance.dispatch("loadError",{slide:this.slide,content:this}))}isLoading(){return this.instance.applyFilters("isContentLoading",this.state===_.LOADING,this)}isError(){return this.state===_.ERROR}isImageContent(){return this.type==="image"}setDisplayedSize(t,i){if(this.element&&(this.placeholder&&this.placeholder.setDisplayedSize(t,i),!this.instance.dispatch("contentResize",{content:this,width:t,height:i}).defaultPrevented&&(L(this.element,t,i),this.isImageContent()&&!this.isError()))){const e=!this.displayedImageWidth&&t;this.displayedImageWidth=t,this.displayedImageHeight=i,e?this.loadImage(!1):this.updateSrcsetSizes(),this.slide&&this.instance.dispatch("imageSizeChange",{slide:this.slide,width:t,height:i,content:this})}}isZoomable(){return this.instance.applyFilters("isContentZoomable",this.isImageContent()&&this.state!==_.ERROR,this)}updateSrcsetSizes(){if(!this.isImageContent()||!this.element||!this.data.srcset)return;const t=this.element,i=this.instance.applyFilters("srcsetSizesWidth",this.displayedImageWidth,this);(!t.dataset.largestUsedSize||i>parseInt(t.dataset.largestUsedSize,10))&&(t.sizes=i+"px",t.dataset.largestUsedSize=String(i))}usePlaceholder(){return this.instance.applyFilters("useContentPlaceholder",this.isImageContent(),this)}lazyLoad(){this.instance.dispatch("contentLazyLoad",{content:this}).defaultPrevented||this.load(!0)}keepPlaceholder(){return this.instance.applyFilters("isKeepingPlaceholder",this.isLoading(),this)}destroy(){this.hasSlide=!1,this.slide=void 0,!this.instance.dispatch("contentDestroy",{content:this}).defaultPrevented&&(this.remove(),this.placeholder&&(this.placeholder.destroy(),this.placeholder=void 0),this.isImageContent()&&this.element&&(this.element.onload=null,this.element.onerror=null,this.element=void 0))}displayError(){if(this.slide){var t,i;let e=f("pswp__error-msg","div");e.innerText=(t=(i=this.instance.options)===null||i===void 0?void 0:i.errorMsg)!==null&&t!==void 0?t:"",e=this.instance.applyFilters("contentErrorElement",e,this),this.element=f("pswp__content pswp__error-msg-container","div"),this.element.appendChild(e),this.slide.container.innerText="",this.slide.container.appendChild(this.element),this.slide.updateContentSize(!0),this.removePlaceholder()}}append(){if(this.isAttached||!this.element)return;if(this.isAttached=!0,this.state===_.ERROR){this.displayError();return}if(this.instance.dispatch("contentAppend",{content:this}).defaultPrevented)return;const t="decode"in this.element;this.isImageContent()?t&&this.slide&&(!this.slide.isActive||C())?(this.isDecoding=!0,this.element.decode().catch(()=>{}).finally(()=>{this.isDecoding=!1,this.appendImage()})):this.appendImage():this.slide&&!this.element.parentNode&&this.slide.container.appendChild(this.element)}activate(){this.instance.dispatch("contentActivate",{content:this}).defaultPrevented||!this.slide||(this.isImageContent()&&this.isDecoding&&!C()?this.appendImage():this.isError()&&this.load(!1,!0),this.slide.holderElement&&this.slide.holderElement.setAttribute("aria-hidden","false"))}deactivate(){this.instance.dispatch("contentDeactivate",{content:this}),this.slide&&this.slide.holderElement&&this.slide.holderElement.setAttribute("aria-hidden","true")}remove(){this.isAttached=!1,!this.instance.dispatch("contentRemove",{content:this}).defaultPrevented&&(this.element&&this.element.parentNode&&this.element.remove(),this.placeholder&&this.placeholder.element&&this.placeholder.element.remove())}appendImage(){this.isAttached&&(this.instance.dispatch("contentAppendImage",{content:this}).defaultPrevented||(this.slide&&this.element&&!this.element.parentNode&&this.slide.container.appendChild(this.element),(this.state===_.LOADED||this.state===_.ERROR)&&this.removePlaceholder()))}}const Bt=5;function W(r,t,i){const e=t.createContentFromData(r,i);let s;const{options:n}=t;if(n){s=new k(n,r,-1);let o;t.pswp?o=t.pswp.viewportSize:o=B(n,t);const a=N(n,o,r,i);s.update(e.width,e.height,a)}return e.lazyLoad(),s&&e.setDisplayedSize(Math.ceil(e.width*s.initial),Math.ceil(e.height*s.initial)),e}function Nt(r,t){const i=t.getItemData(r);if(!t.dispatch("lazyLoadSlide",{index:r,itemData:i}).defaultPrevented)return W(i,t,r)}class kt{constructor(t){this.pswp=t,this.limit=Math.max(t.options.preload[0]+t.options.preload[1]+1,Bt),this._cachedItems=[]}updateLazy(t){const{pswp:i}=this;if(i.dispatch("lazyLoad").defaultPrevented)return;const{preload:e}=i.options,s=t===void 0?!0:t>=0;let n;for(n=0;n<=e[1];n++)this.loadSlideByIndex(i.currIndex+(s?n:-n));for(n=1;n<=e[0];n++)this.loadSlideByIndex(i.currIndex+(s?-n:n))}loadSlideByIndex(t){const i=this.pswp.getLoopedIndex(t);let e=this.getContentByIndex(i);e||(e=Nt(i,this.pswp),e&&this.addToCache(e))}getContentBySlide(t){let i=this.getContentByIndex(t.index);return i||(i=this.pswp.createContentFromData(t.data,t.index),this.addToCache(i)),i.setSlide(t),i}addToCache(t){if(this.removeByIndex(t.index),this._cachedItems.push(t),this._cachedItems.length>this.limit){const i=this._cachedItems.findIndex(e=>!e.isAttached&&!e.hasSlide);i!==-1&&this._cachedItems.splice(i,1)[0].destroy()}}removeByIndex(t){const i=this._cachedItems.findIndex(e=>e.index===t);i!==-1&&this._cachedItems.splice(i,1)}getContentByIndex(t){return this._cachedItems.find(i=>i.index===t)}destroy(){this._cachedItems.forEach(t=>t.destroy()),this._cachedItems=[]}}class Ht extends Mt{getNumItems(){var t;let i=0;const e=(t=this.options)===null||t===void 0?void 0:t.dataSource;e&&"length"in e?i=e.length:e&&"gallery"in e&&(e.items||(e.items=this._getGalleryDOMElements(e.gallery)),e.items&&(i=e.items.length));const s=this.dispatch("numItems",{dataSource:e,numItems:i});return this.applyFilters("numItems",s.numItems,e)}createContentFromData(t,i){return new Ft(t,this,i)}getItemData(t){var i;const e=(i=this.options)===null||i===void 0?void 0:i.dataSource;let s={};Array.isArray(e)?s=e[t]:e&&"gallery"in e&&(e.items||(e.items=this._getGalleryDOMElements(e.gallery)),s=e.items[t]);let n=s;n instanceof Element&&(n=this._domElementToItemData(n));const o=this.dispatch("itemData",{itemData:n||{},index:t});return this.applyFilters("itemData",o.itemData,t)}_getGalleryDOMElements(t){var i,e;return(i=this.options)!==null&&i!==void 0&&i.children||(e=this.options)!==null&&e!==void 0&&e.childSelector?K(this.options.children,this.options.childSelector,t)||[]:[t]}_domElementToItemData(t){const i={element:t},e=t.tagName==="A"?t:t.querySelector("a");if(e){i.src=e.dataset.pswpSrc||e.href,e.dataset.pswpSrcset&&(i.srcset=e.dataset.pswpSrcset),i.width=e.dataset.pswpWidth?parseInt(e.dataset.pswpWidth,10):0,i.height=e.dataset.pswpHeight?parseInt(e.dataset.pswpHeight,10):0,i.w=i.width,i.h=i.height,e.dataset.pswpType&&(i.type=e.dataset.pswpType);const n=t.querySelector("img");if(n){var s;i.msrc=n.currentSrc||n.src,i.alt=(s=n.getAttribute("alt"))!==null&&s!==void 0?s:""}(e.dataset.pswpCropped||e.dataset.cropped)&&(i.thumbCropped=!0)}return this.applyFilters("domItemData",i,t,e)}lazyLoadData(t,i){return W(t,this,i)}}const P=.003;class Wt{constructor(t){this.pswp=t,this.isClosed=!0,this.isOpen=!1,this.isClosing=!1,this.isOpening=!1,this._duration=void 0,this._useAnimation=!1,this._croppedZoom=!1,this._animateRootOpacity=!1,this._animateBgOpacity=!1,this._placeholder=void 0,this._opacityElement=void 0,this._cropContainer1=void 0,this._cropContainer2=void 0,this._thumbBounds=void 0,this._prepareOpen=this._prepareOpen.bind(this),t.on("firstZoomPan",this._prepareOpen)}open(){this._prepareOpen(),this._start()}close(){if(this.isClosed||this.isClosing||this.isOpening)return;const t=this.pswp.currSlide;this.isOpen=!1,this.isOpening=!1,this.isClosing=!0,this._duration=this.pswp.options.hideAnimationDuration,t&&t.currZoomLevel*t.width>=this.pswp.options.maxWidthToAnimate&&(this._duration=0),this._applyStartProps(),setTimeout(()=>{this._start()},this._croppedZoom?30:0)}_prepareOpen(){if(this.pswp.off("firstZoomPan",this._prepareOpen),!this.isOpening){const t=this.pswp.currSlide;this.isOpening=!0,this.isClosing=!1,this._duration=this.pswp.options.showAnimationDuration,t&&t.zoomLevels.initial*t.width>=this.pswp.options.maxWidthToAnimate&&(this._duration=0),this._applyStartProps()}}_applyStartProps(){const{pswp:t}=this,i=this.pswp.currSlide,{options:e}=t;if(e.showHideAnimationType==="fade"?(e.showHideOpacity=!0,this._thumbBounds=void 0):e.showHideAnimationType==="none"?(e.showHideOpacity=!1,this._duration=0,this._thumbBounds=void 0):this.isOpening&&t._initialThumbBounds?this._thumbBounds=t._initialThumbBounds:this._thumbBounds=this.pswp.getThumbBounds(),this._placeholder=i==null?void 0:i.getPlaceholderElement(),t.animations.stopAll(),this._useAnimation=!!(this._duration&&this._duration>50),this._animateZoom=!!this._thumbBounds&&(i==null?void 0:i.content.usePlaceholder())&&(!this.isClosing||!t.mainScroll.isShifted()),!this._animateZoom)this._animateRootOpacity=!0,this.isOpening&&i&&(i.zoomAndPanToInitial(),i.applyCurrentZoomPan());else{var s;this._animateRootOpacity=(s=e.showHideOpacity)!==null&&s!==void 0?s:!1}if(this._animateBgOpacity=!this._animateRootOpacity&&this.pswp.options.bgOpacity>P,this._opacityElement=this._animateRootOpacity?t.element:t.bg,!this._useAnimation){this._duration=0,this._animateZoom=!1,this._animateBgOpacity=!1,this._animateRootOpacity=!0,this.isOpening&&(t.element&&(t.element.style.opacity=String(P)),t.applyBgOpacity(1));return}if(this._animateZoom&&this._thumbBounds&&this._thumbBounds.innerRect){var n;this._croppedZoom=!0,this._cropContainer1=this.pswp.container,this._cropContainer2=(n=this.pswp.currSlide)===null||n===void 0?void 0:n.holderElement,t.container&&(t.container.style.overflow="hidden",t.container.style.width=t.viewportSize.x+"px")}else this._croppedZoom=!1;this.isOpening?(this._animateRootOpacity?(t.element&&(t.element.style.opacity=String(P)),t.applyBgOpacity(1)):(this._animateBgOpacity&&t.bg&&(t.bg.style.opacity=String(P)),t.element&&(t.element.style.opacity="1")),this._animateZoom&&(this._setClosedStateZoomPan(),this._placeholder&&(this._placeholder.style.willChange="transform",this._placeholder.style.opacity=String(P)))):this.isClosing&&(t.mainScroll.itemHolders[0]&&(t.mainScroll.itemHolders[0].el.style.display="none"),t.mainScroll.itemHolders[2]&&(t.mainScroll.itemHolders[2].el.style.display="none"),this._croppedZoom&&t.mainScroll.x!==0&&(t.mainScroll.resetPosition(),t.mainScroll.resize()))}_start(){this.isOpening&&this._useAnimation&&this._placeholder&&this._placeholder.tagName==="IMG"?new Promise(t=>{let i=!1,e=!0;q(this._placeholder).finally(()=>{i=!0,e||t(!0)}),setTimeout(()=>{e=!1,i&&t(!0)},50),setTimeout(t,250)}).finally(()=>this._initiate()):this._initiate()}_initiate(){var t,i;(t=this.pswp.element)===null||t===void 0||t.style.setProperty("--pswp-transition-duration",this._duration+"ms"),this.pswp.dispatch(this.isOpening?"openingAnimationStart":"closingAnimationStart"),this.pswp.dispatch("initialZoom"+(this.isOpening?"In":"Out")),(i=this.pswp.element)===null||i===void 0||i.classList.toggle("pswp--ui-visible",this.isOpening),this.isOpening?(this._placeholder&&(this._placeholder.style.opacity="1"),this._animateToOpenState()):this.isClosing&&this._animateToClosedState(),this._useAnimation||this._onAnimationComplete()}_onAnimationComplete(){const{pswp:t}=this;if(this.isOpen=this.isOpening,this.isClosed=this.isClosing,this.isOpening=!1,this.isClosing=!1,t.dispatch(this.isOpen?"openingAnimationEnd":"closingAnimationEnd"),t.dispatch("initialZoom"+(this.isOpen?"InEnd":"OutEnd")),this.isClosed)t.destroy();else if(this.isOpen){var i;this._animateZoom&&t.container&&(t.container.style.overflow="visible",t.container.style.width="100%"),(i=t.currSlide)===null||i===void 0||i.applyCurrentZoomPan()}}_animateToOpenState(){const{pswp:t}=this;this._animateZoom&&(this._croppedZoom&&this._cropContainer1&&this._cropContainer2&&(this._animateTo(this._cropContainer1,"transform","translate3d(0,0,0)"),this._animateTo(this._cropContainer2,"transform","none")),t.currSlide&&(t.currSlide.zoomAndPanToInitial(),this._animateTo(t.currSlide.container,"transform",t.currSlide.getCurrentTransform()))),this._animateBgOpacity&&t.bg&&this._animateTo(t.bg,"opacity",String(t.options.bgOpacity)),this._animateRootOpacity&&t.element&&this._animateTo(t.element,"opacity","1")}_animateToClosedState(){const{pswp:t}=this;this._animateZoom&&this._setClosedStateZoomPan(!0),this._animateBgOpacity&&t.bgOpacity>.01&&t.bg&&this._animateTo(t.bg,"opacity","0"),this._animateRootOpacity&&t.element&&this._animateTo(t.element,"opacity","0")}_setClosedStateZoomPan(t){if(!this._thumbBounds)return;const{pswp:i}=this,{innerRect:e}=this._thumbBounds,{currSlide:s,viewportSize:n}=i;if(this._croppedZoom&&e&&this._cropContainer1&&this._cropContainer2){const o=-n.x+(this._thumbBounds.x-e.x)+e.w,a=-n.y+(this._thumbBounds.y-e.y)+e.h,h=n.x-e.w,l=n.y-e.h;t?(this._animateTo(this._cropContainer1,"transform",b(o,a)),this._animateTo(this._cropContainer2,"transform",b(h,l))):(y(this._cropContainer1,o,a),y(this._cropContainer2,h,l))}s&&(p(s.pan,e||this._thumbBounds),s.currZoomLevel=this._thumbBounds.w/s.width,t?this._animateTo(s.container,"transform",s.getCurrentTransform()):s.applyCurrentZoomPan())}_animateTo(t,i,e){if(!this._duration){t.style[i]=e;return}const{animations:s}=this.pswp,n={duration:this._duration,easing:this.pswp.options.easing,onComplete:()=>{s.activeAnimations.length||this._onAnimationComplete()},target:t};n[i]=e,s.startTransition(n)}}const Vt={allowPanToNext:!0,spacing:.1,loop:!0,pinchToClose:!0,closeOnVerticalDrag:!0,hideAnimationDuration:333,showAnimationDuration:333,zoomAnimationDuration:333,escKey:!0,arrowKeys:!0,trapFocus:!0,returnFocus:!0,maxWidthToAnimate:4e3,clickToCloseNonZoomable:!0,imageClickAction:"zoom-or-close",bgClickAction:"close",tapAction:"toggle-controls",doubleTapAction:"zoom",indexIndicatorSep:" / ",preloaderDelay:2e3,bgOpacity:.8,index:0,errorMsg:"The image cannot be loaded",preload:[1,2],easing:"cubic-bezier(.4,0,.22,1)"};class $t extends Ht{constructor(t){super(),this.options=this._prepareOptions(t||{}),this.offset={x:0,y:0},this._prevViewportSize={x:0,y:0},this.viewportSize={x:0,y:0},this.bgOpacity=1,this.currIndex=0,this.potentialIndex=0,this.isOpen=!1,this.isDestroying=!1,this.hasMouse=!1,this._initialItemData={},this._initialThumbBounds=void 0,this.topBar=void 0,this.element=void 0,this.template=void 0,this.container=void 0,this.scrollWrap=void 0,this.currSlide=void 0,this.events=new X,this.animations=new wt,this.mainScroll=new dt(this),this.gestures=new lt(this),this.opener=new Wt(this),this.keyboard=new ut(this),this.contentLoader=new kt(this)}init(){if(this.isOpen||this.isDestroying)return!1;this.isOpen=!0,this.dispatch("init"),this.dispatch("beforeOpen"),this._createMainStructure();let t="pswp--open";return this.gestures.supportsTouch&&(t+=" pswp--touch"),this.options.mainClass&&(t+=" "+this.options.mainClass),this.element&&(this.element.className+=" "+t),this.currIndex=this.options.index||0,this.potentialIndex=this.currIndex,this.dispatch("firstUpdate"),this.scrollWheel=new Pt(this),(Number.isNaN(this.currIndex)||this.currIndex<0||this.currIndex>=this.getNumItems())&&(this.currIndex=0),this.gestures.supportsTouch||this.mouseDetected(),this.updateSize(),this.offset.y=window.pageYOffset,this._initialItemData=this.getItemData(this.currIndex),this.dispatch("gettingData",{index:this.currIndex,data:this._initialItemData,slide:void 0}),this._initialThumbBounds=this.getThumbBounds(),this.dispatch("initialLayout"),this.on("openingAnimationEnd",()=>{const{itemHolders:i}=this.mainScroll;i[0]&&(i[0].el.style.display="block",this.setContent(i[0],this.currIndex-1)),i[2]&&(i[2].el.style.display="block",this.setContent(i[2],this.currIndex+1)),this.appendHeavy(),this.contentLoader.updateLazy(),this.events.add(window,"resize",this._handlePageResize.bind(this)),this.events.add(window,"scroll",this._updatePageScrollOffset.bind(this)),this.dispatch("bindEvents")}),this.mainScroll.itemHolders[1]&&this.setContent(this.mainScroll.itemHolders[1],this.currIndex),this.dispatch("change"),this.opener.open(),this.dispatch("afterInit"),!0}getLoopedIndex(t){const i=this.getNumItems();return this.options.loop&&(t>i-1&&(t-=i),t<0&&(t+=i)),I(t,0,i-1)}appendHeavy(){this.mainScroll.itemHolders.forEach(t=>{var i;(i=t.slide)===null||i===void 0||i.appendHeavy()})}goTo(t){this.mainScroll.moveIndexBy(this.getLoopedIndex(t)-this.potentialIndex)}next(){this.goTo(this.potentialIndex+1)}prev(){this.goTo(this.potentialIndex-1)}zoomTo(...t){var i;(i=this.currSlide)===null||i===void 0||i.zoomTo(...t)}toggleZoom(){var t;(t=this.currSlide)===null||t===void 0||t.toggleZoom()}close(){!this.opener.isOpen||this.isDestroying||(this.isDestroying=!0,this.dispatch("close"),this.events.removeAll(),this.opener.close())}destroy(){var t;if(!this.isDestroying){this.options.showHideAnimationType="none",this.close();return}this.dispatch("destroy"),this._listeners={},this.scrollWrap&&(this.scrollWrap.ontouchmove=null,this.scrollWrap.ontouchend=null),(t=this.element)===null||t===void 0||t.remove(),this.mainScroll.itemHolders.forEach(i=>{var e;(e=i.slide)===null||e===void 0||e.destroy()}),this.contentLoader.destroy(),this.events.removeAll()}refreshSlideContent(t){this.contentLoader.removeByIndex(t),this.mainScroll.itemHolders.forEach((i,e)=>{var s,n;let o=((s=(n=this.currSlide)===null||n===void 0?void 0:n.index)!==null&&s!==void 0?s:0)-1+e;if(this.canLoop()&&(o=this.getLoopedIndex(o)),o===t&&(this.setContent(i,t,!0),e===1)){var a;this.currSlide=i.slide,(a=i.slide)===null||a===void 0||a.setIsActive(!0)}}),this.dispatch("change")}setContent(t,i,e){if(this.canLoop()&&(i=this.getLoopedIndex(i)),t.slide){if(t.slide.index===i&&!e)return;t.slide.destroy(),t.slide=void 0}if(!this.canLoop()&&(i<0||i>=this.getNumItems()))return;const s=this.getItemData(i);t.slide=new j(s,i,this),i===this.currIndex&&(this.currSlide=t.slide),t.slide.append(t.el)}getViewportCenterPoint(){return{x:this.viewportSize.x/2,y:this.viewportSize.y/2}}updateSize(t){if(this.isDestroying)return;const i=B(this.options,this);!t&&x(i,this._prevViewportSize)||(p(this._prevViewportSize,i),this.dispatch("beforeResize"),p(this.viewportSize,this._prevViewportSize),this._updatePageScrollOffset(),this.dispatch("viewportSize"),this.mainScroll.resize(this.opener.isOpen),!this.hasMouse&&window.matchMedia("(any-hover: hover)").matches&&this.mouseDetected(),this.dispatch("resize"))}applyBgOpacity(t){this.bgOpacity=Math.max(t,0),this.bg&&(this.bg.style.opacity=String(this.bgOpacity*this.options.bgOpacity))}mouseDetected(){if(!this.hasMouse){var t;this.hasMouse=!0,(t=this.element)===null||t===void 0||t.classList.add("pswp--has_mouse")}}_handlePageResize(){this.updateSize(),/iPhone|iPad|iPod/i.test(window.navigator.userAgent)&&setTimeout(()=>{this.updateSize()},500)}_updatePageScrollOffset(){this.setScrollOffset(0,window.pageYOffset)}setScrollOffset(t,i){this.offset.x=t,this.offset.y=i,this.dispatch("updateScrollOffset")}_createMainStructure(){this.element=f("pswp","div"),this.element.setAttribute("tabindex","-1"),this.element.setAttribute("role","dialog"),this.template=this.element,this.bg=f("pswp__bg","div",this.element),this.scrollWrap=f("pswp__scroll-wrap","section",this.element),this.container=f("pswp__container","div",this.scrollWrap),this.scrollWrap.setAttribute("aria-roledescription","carousel"),this.container.setAttribute("aria-live","off"),this.container.setAttribute("id","pswp__items"),this.mainScroll.appendHolders(),this.ui=new zt(this),this.ui.init(),(this.options.appendToEl||document.body).appendChild(this.element)}getThumbBounds(){return Zt(this.currIndex,this.currSlide?this.currSlide.data:this._initialItemData,this)}canLoop(){return this.options.loop&&this.getNumItems()>2}_prepareOptions(t){return window.matchMedia("(prefers-reduced-motion), (update: slow)").matches&&(t.showHideAnimationType="none",t.zoomAnimationDuration=0),{...Vt,...t}}}export{$t as default};
const s=(t,r)=>{const o=t.__vccOpts||t;for(const[c,e]of r)o[c]=e;return o};export{s as _};
import{_ as a}from"./plugin-vue_export-helper-c27b6911.js";import{r as t,o,c as n,a as i,d as l,e as r,f as s}from"./app-89848b6d.js";const d={},h=i("h2",{id:"个人信息",tabindex:"-1"},[i("a",{class:"header-anchor",href:"#个人信息","aria-hidden":"true"},"#"),l(" 个人信息")],-1),c=i("li",null,"姓名",-1),u=i("li",null,"电话",-1),p=i("li",null,"邮箱",-1),S=i("li",null,"毕业时间",-1),_=i("li",null,"工作时间",-1),B=i("li",null,"Github:https://github.com/fuzhengwei",-1),M={href:"https://bugstack.cn/md/product/idea-plugin/vo2dto.html",target:"_blank",rel:"noopener noreferrer"},g=s('<h2 id="毕业院校" tabindex="-1"><a class="header-anchor" href="#毕业院校" aria-hidden="true">#</a> 毕业院校</h2><ul><li>时间、院校、专业、学位</li><li>荣誉、成绩</li></ul><h2 id="专业技能" tabindex="-1"><a class="header-anchor" href="#专业技能" aria-hidden="true">#</a> 专业技能</h2><ul><li>熟练掌握 Java 核心知识、JUC、HashMap、斐波那契散列等,具备良好的面向对象编程思想。</li><li>熟练掌握 Java 设计模式,如工厂、代理、组合、策略等设计模式,并善用设计原则构建可复用代码。</li><li>熟练使用 IDEA、Eclipse、Visual Studio Code、Navicat、PostMan、Git、Maven、SVN 等开发工具。</li><li>深入理解 JVM 底层原理,熟悉 JVM 各类垃圾收集器的使用及核心参数的调优,具备一定的 JVM 调优能力。</li><li><code>深入学习 Spring 核心流程模块,如IOC、AOP、依赖倒置等,掌握Spring解决复杂场景所需的分治、抽象和知识(设计模式、设计原则),能从核心原理上解决Spring场景问题。同时,具备基于 Spring 开发 SpringBoot Starter 的技能,减少研发成本,为复杂项目提供通用技术组件。</code></li><li><code>深入学习 MyBatis 核心流程模块,包括会话、反射、代理、事务和插件,熟练掌握 ORM 框架的设计思想、实现方式和应用价值。并根据需求结合 MyBatis 插件机制,开发企业所需的功能,如数据分页、数据库表路由、监控日志和数据安全等。</code></li><li>深入理解 Spring Boot,Spring Cloud 等微服务框架的设计原理及底层架构,熟悉各种微服务架构设计比如服务注册与发现,服务降级,限流,熔断,服务网关路由设计,服务安全认证架构。</li><li>熟悉 Dubbo、Zookeeper 等分布式服务协调与治理等技术。</li><li>熟练掌握 MySql,掌握 MySQL 主从同步,读写分离技术以及集群的搭建,具备一定的 SQL 调优能力。</li><li>深入理解 Redis 线程模型,熟练掌握 Redis 的核心数据结构的使用场景,熟悉各种缓存高并发的使用场景,比如缓存雪崩,缓存穿透等。</li><li>熟练掌握分布式场景中的常见的技术问题及解决,比如分布式锁,分布式事务,分布式 session,分布式任务调度。</li><li>熟悉 RabbitMQ、Kafka 等常用的消息中间件进行消息的异步数据处理。</li><li>了解分布式搜索引擎 ElasticSearch,并能基于 ELK+Kafka 搭建分布式日志收集系统,以及 x-pack-jdbc 的扩展使用。</li><li>熟悉 docker 常用命令,能够实现基于 docker+Jenkins 实现自动化部署</li><li>掌握 Linux 常用命令,了解 Nginx 服务器的反向代理、负载均衡、动静分离等。</li><li>熟练运用 DDD 四层架构领域驱动设计,构建出易于迭代和维护的工程架构,遵守整洁代码、洋葱架构设计思想。</li></ul><h2 id="工作经历【在校生无】" tabindex="-1"><a class="header-anchor" href="#工作经历【在校生无】" aria-hidden="true">#</a> 工作经历【在校生无】</h2><ul><li>公司</li><li>岗位</li><li>时间</li><li>职责【可选】</li><li>成绩【可选】</li></ul><h2 id="项目经验" tabindex="-1"><a class="header-anchor" href="#项目经验" aria-hidden="true">#</a> 项目经验</h2><h3 id="_1-营销活动平台-lottery-微服务抽奖系统" tabindex="-1"><a class="header-anchor" href="#_1-营销活动平台-lottery-微服务抽奖系统" aria-hidden="true">#</a> 1. 营销活动平台 - Lottery 微服务抽奖系统</h3><ul><li>系统架构:以 DDD 领域驱动设计开发,微服务拆分的分布式系统架构</li><li>核心技术:SpringBoot、MyBatis、Dubbo、MQ、MySQL、XDB-Router、ES、ZK</li><li>项目描述:抽奖系统是营销平台的重要微服务之一,可以满足 C 端人群的需求,例如拉新、促活、留存等。该系统运用抽象、分治和 DDD 知识,拆解服务边界,凝练领域服务功能。围绕抽奖服务建设领域服务,包括规则引擎、抽奖策略、活动玩法、奖品发放等。这可以满足业务产品快速迭代上线的需求,同时减少研发成本,提高交付效率。</li><li>核心职责: <ul><li>【高级】构建以 DDD 分层结构的处理方式,搭建整个抽奖系统架构。运用设计原则和工厂、代理、模板、组合、策略等设计模式的综合使用,搭建易于维护和迭代的系统工程。</li><li>【高级】鉴于系统内有较多的规则策略过滤,包括准入、人群、风控、A/BTest等需求,为适应系统规模可快速开发和使用的方式,搭建了去中心化的量化人群规则引擎组件。通过业务需求对逻辑的扩展和内置引擎执行器的使用,完成自由组合的人群过滤服务。这降低了共性功能重复开发所带来的成本问题,并提高了研发效率。</li><li>【高级】根据实际秒杀峰值场景 <code>TPS 5000 ~ 8000</code> 的需求,开发了统一路由组件。该组件不仅可以满足差异化不同字段的分库分表组合,还支持 Redis 库存分片和秒杀滑动库存分块。而且,开发了统一路由 XDB-Router 的 SpringBoot Starter 技术组件。该套组件已经经历了多次大促活动场景的考验,支持横向扩展,可以满足业务规模的快速增长。</li><li>【简单】运用模板、策略、工厂三个设计模式,定义抽奖过程标准和实现对应的多类型抽奖的服务模块。</li><li>【简单】因活动秒杀的并发场景,将秒杀从最开始的数据库行级锁优化为Redis Key 加锁,又从 Redis Key 的独占锁,优化为滑块锁。优化后整体秒杀有了非常可观的性能提升。</li><li>【简单】解耦抽奖流程,把抽奖和发奖用MQ消息串联起来,避免一个流程太长,导致用户一直等待。</li></ul></li></ul><h3 id="_2-手写-mybatis" tabindex="-1"><a class="header-anchor" href="#_2-手写-mybatis" aria-hidden="true">#</a> 2. 手写 MyBatis</h3><ul><li>项目架构:Object Relational Mapping</li><li>项目描述:MyBatis 是 Java 应用编程开发中,非常常用的技术框架。需要较深入的学习和使用,具备 MyBatis 插件开发能力,解决日常场景问题。才能更好更高效的工作。为此,深度学习了《手写MyBatis:渐进式源码实践》一书,完整实现了一个 MyBatis ORM 框架。技术积累颇深,提高了设计思维和编码能力。</li><li>个人收获: <ul><li>首先学习到为什么日常使用 MyBatis 时,可以仅提供 IDao 接口,就可以关联对应配置的SQL语句,完成数据库操作。这是因为做了代理与映射,封装调用逻辑到 SqlSession 会话功能实现中。</li><li>掌握了数10种设计模式的运用,其中感触最大的是 MyBatis 如何管理多边服务的设计。如创建会话模型,统一调度执行器使用和数据的封装,并把这些复杂的操作,通过 SqlSessionFactory 工厂统一对外提供 SqlSession 服务。</li><li>彻底了解并掌握了 MyBatis Plugin 设计模型,这个技术可以让我基于 MyBatis 做出日志监控、库表路由、字段加解密等操作。为以后编程工作,提供更多的解决方案。</li><li>除此之外,还有一级缓存、二级缓存的装饰器模式使用,MyBatis 开发后与 Spring、SpringBoot 整合的实现,让我对 MyBatis 的全体系开发流程和对应的技术整合,已经非常清晰,便于以后应用和从根上快速排查解决问题,并给出合理的技术方案。</li></ul></li></ul><h3 id="_3-openai-应用服务-辅助工作提效工具开发" tabindex="-1"><a class="header-anchor" href="#_3-openai-应用服务-辅助工作提效工具开发" aria-hidden="true">#</a> 3. OpenAI 应用服务 - 辅助工作提效工具开发</h3><ul><li>项目架构:微服务架构设计,OpenAI-SDK 多模型组件【ChatGLM、ChatGPT】、DDD 应用服务API封装、WEB REACT 前端界面【按需编写】</li><li>核心技术:SpringBoot、MyBatis、Redis/Guava、OKHttp3、OpenAI 大模型【可对接ChatGLM、腾讯混元等】、React、TypeScript</li><li>项目描述:此项目以应用OpenAI技术,对接多种大模型提供生成式服务,为XXX场景提效。项目的架构设计实现以微服务进行拆分,涵盖;OpenAI-SDK、OpenAI-API、公众号鉴权、企业支付【暂时申请中,如果你对接了可以写】等。并以模块化设计,积木式构建应用,让不同的场景诉求都可以配置化对接。</li><li>核心职责: <ul><li>首先这是我们xxx公司/实践/实训的第一个OpenAI项目,后续势必会有更多的场景以不同的方式接入。包括 SDK 独立接入、API 接口接入、MQ 消息接入,以及使用提供好的服务类接入。所以在这部分设计的时候,我采用了微服务的架构设计,按照职责边界进行拆分设计。</li><li>采用 DDD 架构 API,以及便于不同领域模块的独立设计,一个领域就是一个功能域。在功能域中提供模型、仓储、事件、服务。这样可以更好扩展。</li><li>鉴于生成式服务的文本生成可能会有不可靠信息,所以对这部分内容添加了敏感词的过滤。并可根据不同场景选择不同范围的敏感词处理。</li><li>OpenAI 大模型有多种,这部分在架构上设计独立的 SDK,在实现上采用了 Session 会话模型进行处理,以及通过工厂处理服务。在细节对上,采用了 OKHttp3 框架完成模型对接,这样的方式更好扩展,代码也更易于维护。</li><li>在整套工程的设计实现中,采用了较多的分治、抽象的思想和设计模式和设计原则知识的运用,来解决各类场景问题。</li><li>对接微信扫码支付,完成从商品库、下单支付、异步发货、掉单补偿等核心流程实现。让用户可以在线购买对话额度。</li><li>注意:你还可以根据项目中提到的各类技术和章节,来编写你的职责。</li></ul></li></ul><h3 id="_4-服务治理-springboot-中间件" tabindex="-1"><a class="header-anchor" href="#_4-服务治理-springboot-中间件" aria-hidden="true">#</a> 4. 服务治理 SpringBoot 中间件</h3><ul><li>系统架构:SpringBoot Starter 组件开发</li><li>核心技术:熔断、降级、限流、切量、白名单、人群控制</li><li>项目描述:该SpringBoot Starter中间件实现了熔断、降级、限流、切量、白名单等服务治理功能,减少了开发工作量和出错风险。利用SpringBoot的自动化配置机制简化了集成和使用,并提供了可扩展接口,以满足不同场景的需求。</li><li>核心职责: <ul><li>鉴于组内同类需求的重复开发,设计并实现服务治理 SpringBoot Starter 中间件,提高开发效率和降低重复开发成本。 该中间件的核心功能包括服务治理中的熔断、降级、限流、切量和白名单等。</li><li>通过利用SpringBoot的自动化配置机制,该中间件可以简化集成和使用,同时提供足够的配置选项以满足不同场景的需求。</li><li>此外,该中间件还提供了可扩展的接口,方便用户根据自身需求扩展功能,从而更好地满足不同的业务需求。</li></ul></li></ul>',15);function D(y,b){const e=t("ExternalLinkIcon");return o(),n("div",null,[h,i("ul",null,[c,u,p,S,_,B,i("li",null,[l("开源项目:"),i("a",M,[l("vo2dto"),r(e)]),l(" - IDEA Plugin 自动转换对象插件,5.4k 下载使用")])]),g])}const I=a(d,[["render",D],["__file","resume.html.vue"]]);export{I as default};
const e=JSON.parse('{"key":"v-1d59d0e6","path":"/md/resume.html","title":"个人简历","lang":"zh-CN","frontmatter":{"title":"个人简历","index":false,"icon":"laptop-code","category":["自我介绍","专业技能","项目经验"],"description":"个人信息 姓名; 电话; 邮箱; 毕业时间; 工作时间; Github:https://github.com/fuzhengwei; 开源项目:vo2dto (https://bugstack.cn/md/product/idea-plugin/vo2dto.html) - IDEA Plugin 自动转换对象插件,5.4k 下载使用; 毕业院校 时间...","head":[["meta",{"property":"og:url","content":"https://vuepress-theme-hope-docs-demo.netlify.app/md/resume.html"}],["meta",{"property":"og:site_name","content":"我的简历"}],["meta",{"property":"og:title","content":"个人简历"}],["meta",{"property":"og:description","content":"个人信息 姓名; 电话; 邮箱; 毕业时间; 工作时间; Github:https://github.com/fuzhengwei; 开源项目:vo2dto (https://bugstack.cn/md/product/idea-plugin/vo2dto.html) - IDEA Plugin 自动转换对象插件,5.4k 下载使用; 毕业院校 时间..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"Mr.Hope"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"个人简历\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"Mr.Hope\\",\\"url\\":\\"https://mister-hope.com\\"}]}"]]},"headers":[{"level":2,"title":"个人信息","slug":"个人信息","link":"#个人信息","children":[]},{"level":2,"title":"毕业院校","slug":"毕业院校","link":"#毕业院校","children":[]},{"level":2,"title":"专业技能","slug":"专业技能","link":"#专业技能","children":[]},{"level":2,"title":"工作经历【在校生无】","slug":"工作经历【在校生无】","link":"#工作经历【在校生无】","children":[]},{"level":2,"title":"项目经验","slug":"项目经验","link":"#项目经验","children":[{"level":3,"title":"1. 营销活动平台 - Lottery 微服务抽奖系统","slug":"_1-营销活动平台-lottery-微服务抽奖系统","link":"#_1-营销活动平台-lottery-微服务抽奖系统","children":[]},{"level":3,"title":"2. 手写 MyBatis","slug":"_2-手写-mybatis","link":"#_2-手写-mybatis","children":[]},{"level":3,"title":"3. OpenAI 应用服务 - 辅助工作提效工具开发","slug":"_3-openai-应用服务-辅助工作提效工具开发","link":"#_3-openai-应用服务-辅助工作提效工具开发","children":[]},{"level":3,"title":"4. 服务治理 SpringBoot 中间件","slug":"_4-服务治理-springboot-中间件","link":"#_4-服务治理-springboot-中间件","children":[]}]}],"git":{},"readingTime":{"minutes":9.19,"words":2757},"filePathRelative":"md/resume.md","autoDesc":true}');export{e as data};
import{_ as l}from"./plugin-vue_export-helper-c27b6911.js";import{r as i,o as d,c as o,b as a,a as e,d as n,e as r,f as t}from"./app-89848b6d.js";const c="/logo.svg",h={},u=e("p",null,"@slidestart",-1),_=e("h2",{id:"幻灯片演示",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#幻灯片演示","aria-hidden":"true"},"#"),n(" 幻灯片演示")],-1),p=e("p",null,"一个简单的幻灯片演示与各种小贴士。",-1),m=e("blockquote",null,[e("p",null,"作者 Mr.Hope. 请滚动鼠标滚轮进入下一页")],-1),f=e("hr",null,null,-1),g=e("h2",{id:"标注幻灯片",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#标注幻灯片","aria-hidden":"true"},"#"),n(" 标注幻灯片")],-1),k=e("p",null,[e("a",{href:"#/1/1"},"👇")],-1),x=e("p",null,"--",-1),b=e("h2",{id:"标注幻灯片-1",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#标注幻灯片-1","aria-hidden":"true"},"#"),n(" 标注幻灯片")],-1),w=e("p",null,[n("使用 "),e("code",null,"---"),n(" 标注水平幻灯片")],-1),v=e("p",null,[n("在水平幻灯片中使用 "),e("code",null,"--"),n(" 分割垂直幻灯片")],-1),M=e("p",null,[n("使用 "),e("code",null,"<!-- .slide: ... -->"),n(" 在幻灯片上添加属性")],-1),L=e("p",null,[n("使用 "),e("code",null,"<!-- .element: ... -->"),n(" 在前一个 HTML 元素上添加属性")],-1),j=e("hr",null,null,-1),T=e("h2",{id:"markdown",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#markdown","aria-hidden":"true"},"#"),n(" Markdown")],-1),y=e("p",null,"你可以在幻灯片中使用 Markdown 语法的各种标记.",-1),E=e("p",null,"--",-1),H=e("h2",{id:"markdown-1",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#markdown-1","aria-hidden":"true"},"#"),n(" Markdown")],-1),N=e("p",null,"你可以在幻灯片中使用 Markdown 语法的各种标记.",-1),V=e("h3",{id:"这是一个-h3",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#这是一个-h3","aria-hidden":"true"},"#"),n(" 这是一个 H3")],-1),$=e("p",null,"标题默认会自动转换为大写。",-1),B=e("strong",null,"粗体",-1),D=e("em",null,"斜体",-1),z=e("s",null,"删除线",-1),C={href:"https://mister-hope.com",target:"_blank",rel:"noopener noreferrer"},F=e("p",null,"--",-1),I=t('<h2 id="markdown-2" tabindex="-1"><a class="header-anchor" href="#markdown-2" aria-hidden="true">#</a> Markdown</h2><p>你可以在幻灯片中使用 Markdown 语法的各种标记.</p><p>列表默认为 <code>inline-block</code></p><ul><li>项目</li><li>项目</li><li>项目</li></ul><ol><li>项目 1</li><li>项目 2</li><li>项目 3</li></ol><p>--</p>',6),q=t(`<h2 id="markdown-3" tabindex="-1"><a class="header-anchor" href="#markdown-3" aria-hidden="true">#</a> Markdown</h2><p>你可以在幻灯片中使用 Markdown 语法的各种标记.</p><p>在你启用 <code>highlight</code> 插件后,代码块会自动高亮。</p><div class="language-javascript line-numbers-mode" data-ext="js"><pre class="language-javascript"><code><span class="token keyword">const</span> a <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>--</p>`,5),J=e("h2",{id:"markdown-4",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#markdown-4","aria-hidden":"true"},"#"),n(" Markdown")],-1),O=e("p",null,"你可以在幻灯片中使用 Markdown 语法的各种标记.",-1),S=e("p",null,[n("在你启用 "),e("code",null,"math"),n(" 插件后,你也可以使用 TEX 格式使用数学公式。")],-1),X=e("p",null,"$$ J(\\theta_0,\\theta_1) = \\sum_{i=0} $$",-1),A=e("p",null,"--",-1),G=e("h2",{id:"markdown-5",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#markdown-5","aria-hidden":"true"},"#"),n(" Markdown")],-1),K=e("p",null,"你可以在幻灯片中使用 Markdown 语法的各种标记.",-1),P=e("p",null,[n(""),e("strong",null,"请注意"),n(": 表格和分割线,以及所有不在 Markdown 标准语法中的内容均不受支持。")],-1),Q=e("hr",null,null,-1),R=e("h2",{id:"布局",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#布局","aria-hidden":"true"},"#"),n(" 布局")],-1),U=e("p",null,"--",-1),W=e("h2",{id:"布局-1",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#布局-1","aria-hidden":"true"},"#"),n(" 布局")],-1),Y=e("p",null,[n("👆 "),e("code",null,"r-fit-text"),n(" class 会让文字在不超出幻灯片范围的情况下尽可能大。")],-1),Z=e("p",null,"--",-1),ee=e("h2",{id:"布局-2",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#布局-2","aria-hidden":"true"},"#"),n(" 布局")],-1),ae=e("figure",null,[e("img",{src:c,alt:"Logo",tabindex:"0",loading:"lazy"}),e("figcaption",null,"Logo")],-1),ne=e("p",null,[n("👆 "),e("code",null,"r-stretch"),n(" class 帮助你控制注入图片或视频的大小,使它们填充满幻灯片垂直方向上的剩余空间。")],-1),te=e("p",null,"--",-1),se=e("h2",{id:"布局-3",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#布局-3","aria-hidden":"true"},"#"),n(" 布局")],-1),le=e("h3",{id:"背景",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#背景","aria-hidden":"true"},"#"),n(" 背景")],-1),ie=e("p",null,[n("你可以通过向特定幻灯片添加 "),e("code",null,"data-background"),n(" 属性自定义幻灯片背景.")],-1),de=e("hr",null,null,-1),oe=e("h2",{id:"动画片段",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#动画片段","aria-hidden":"true"},"#"),n(" 动画片段")],-1),re=e("p",null,"--",-1),ce=e("h2",{id:"动画片段-1",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#动画片段-1","aria-hidden":"true"},"#"),n(" 动画片段")],-1),he=e("p",null,"动画片段用于高亮或显隐幻灯片中的元素。",-1),ue=e("p",null,[n("你需要在元素上添加 "),e("code",null,"fragment"),n(" 和动画 class。")],-1),_e=e("p",null,"--",-1),pe=e("h2",{id:"动画片段-2",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#动画片段-2","aria-hidden":"true"},"#"),n(" 动画片段")],-1),me=e("h3",{id:"动画-class",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#动画-class","aria-hidden":"true"},"#"),n(" 动画 class")],-1),fe=e("ul",null,[e("li",null,[e("code",null,"fade-in")])],-1),ge=e("ul",null,[e("li",null,[e("code",null,"fade-out")])],-1),ke=e("ul",null,[e("li",null,[e("code",null,"fade-up")])],-1),xe=e("ul",null,[e("li",null,[e("code",null,"fade-down")])],-1),be=e("ul",null,[e("li",null,[e("code",null,"fade-left")])],-1),we=e("ul",null,[e("li",null,[e("code",null,"fade-right")])],-1),ve=e("ul",null,[e("li",null,[e("code",null,"fade-in-then-out")])],-1),Me=e("ul",null,[e("li",null,[e("code",null,"fade-in-then-semi-out")])],-1),Le=e("p",null,"--",-1),je=e("h2",{id:"动画片段-3",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#动画片段-3","aria-hidden":"true"},"#"),n(" 动画片段")],-1),Te=e("h3",{id:"动画-class-1",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#动画-class-1","aria-hidden":"true"},"#"),n(" 动画 class")],-1),ye=e("ul",null,[e("li",null,[e("code",null,"grow")])],-1),Ee=e("ul",null,[e("li",null,[e("code",null,"shrink")])],-1),He=e("ul",null,[e("li",null,[e("code",null,"strike")])],-1),Ne=e("ul",null,[e("li",null,[e("code",null,"highlight-red")])],-1),Ve=e("ul",null,[e("li",null,[e("code",null,"highlight-green")])],-1),$e=e("ul",null,[e("li",null,[e("code",null,"highlight-blue")])],-1),Be=e("ul",null,[e("li",null,[e("code",null,"highlight-current-red")])],-1),De=e("ul",null,[e("li",null,[e("code",null,"highlight-current-green")])],-1),ze=e("ul",null,[e("li",null,[e("code",null,"highlight-current-blue")])],-1),Ce=e("p",null,"--",-1),Fe=t('<h2 id="动画片段-4" tabindex="-1"><a class="header-anchor" href="#动画片段-4" aria-hidden="true">#</a> 动画片段</h2><h3 id="多个动画片段" tabindex="-1"><a class="header-anchor" href="#多个动画片段" aria-hidden="true">#</a> 多个动画片段</h3><p>你可以按照顺序包裹一个 HTML 元素使其拥有多个动画片段</p><span class="fragment fade-in"><span class="fragment highlight-red"><span class="fragment fade-out"> 渐入 &gt; 变红 &gt; 渐出 </span></span></span><p>--</p>',5),Ie=e("h2",{id:"动画片段-5",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#动画片段-5","aria-hidden":"true"},"#"),n(" 动画片段")],-1),qe=e("h3",{id:"顺序",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#顺序","aria-hidden":"true"},"#"),n(" 顺序")],-1),Je=e("p",null,[n("你可以使用 "),e("code",null,"data-fragment-index"),n(" 属性改变元素的动画顺序。")],-1),Oe=e("p",null,"不同元素可以有相同的动画顺序。",-1),Se=e("ul",null,[e("li",null,"最后显示")],-1),Xe=e("ul",null,[e("li",null,"第二个显示")],-1),Ae=e("ul",null,[e("li",null,"第一个显示")],-1),Ge=e("ul",null,[e("li",null,"第二个显示")],-1),Ke=e("hr",null,null,-1),Pe=e("h2",{id:"渐变",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#渐变","aria-hidden":"true"},"#"),n(" 渐变")],-1),Qe=e("p",null,"--",-1),Re=e("h2",{id:"渐变-1",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#渐变-1","aria-hidden":"true"},"#"),n(" 渐变")],-1),Ue=e("p",null,[n("Transition 可以通过配置中的 "),e("code",null,"transition"),n(" 选项全局设置,也可以通过在特定幻灯片添加 "),e("code",null,"data-transition"),n(" 属性局部设置.")],-1),We=e("p",null,"可能的值:",-1),Ye=e("ul",null,[e("li",null,"none"),e("li",null,"fade"),e("li",null,"slide")],-1),Ze=e("ul",null,[e("li",null,"convex"),e("li",null,"concave"),e("li",null,"zoom")],-1),ea=e("p",null,"--",-1),aa=e("h2",{id:"渐变-2",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#渐变-2","aria-hidden":"true"},"#"),n(" 渐变")],-1),na=e("h3",{id:"过渡动画",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#过渡动画","aria-hidden":"true"},"#"),n(" 过渡动画")],-1),ta=e("p",null,[n("你可以在相邻的幻灯片上添加 "),e("code",null,"data-auto-animate"),n(" 使相同的 HTML 元素产生过渡动画效果。")],-1),sa=e("hr",null,null,-1),la=e("h2",{id:"功能",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#功能","aria-hidden":"true"},"#"),n(" 功能")],-1),ia=e("p",null,"--",-1),da=e("h2",{id:"功能-1",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#功能-1","aria-hidden":"true"},"#"),n(" 功能")],-1),oa=t(`<h3 id="代码" tabindex="-1"><a class="header-anchor" href="#代码" aria-hidden="true">#</a> 代码</h3><p>通过启用 <code>highlight</code> 插件,你可以对代码块进行高亮。</p><p>你可以使用 <code>[a-b|c-d]</code> 语法来分布高亮特定行。</p><div class="language-javascript line-numbers-mode" data-ext="js"><pre class="language-javascript"><code><span class="token keyword">let</span> a <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span>
<span class="token keyword">let</span> b <span class="token operator">=</span> <span class="token number">2</span><span class="token punctuation">;</span>
<span class="token keyword">let</span> <span class="token function-variable function">c</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token parameter">x</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token number">1</span> <span class="token operator">+</span> <span class="token number">2</span> <span class="token operator">+</span> x<span class="token punctuation">;</span>
<span class="token function">c</span><span class="token punctuation">(</span><span class="token number">3</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>--</p>`,5),ra=e("h2",{id:"功能-2",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#功能-2","aria-hidden":"true"},"#"),n(" 功能")],-1),ca=e("h3",{id:"预览模式",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#预览模式","aria-hidden":"true"},"#"),n(" 预览模式")],-1),ha=e("p",null,[n("按下 "),e("code",null,"Esc"),n(""),e("code",null,"O"),n(" 即可在幻灯片获得焦点时进入预览模式。")],-1),ua=e("p",null,"--",-1),_a=e("h2",{id:"功能-3",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#功能-3","aria-hidden":"true"},"#"),n(" 功能")],-1),pa=e("h3",{id:"全屏模式",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#全屏模式","aria-hidden":"true"},"#"),n(" 全屏模式")],-1),ma=e("p",null,[n("按下 "),e("code",null,"F"),n(""),e("code",null,"F11"),n(" 即可在幻灯片获得焦点时进入全屏模式。")],-1),fa=e("p",null,"--",-1),ga=e("h2",{id:"功能-4",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#功能-4","aria-hidden":"true"},"#"),n(" 功能")],-1),ka=e("h3",{id:"缩放",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#缩放","aria-hidden":"true"},"#"),n(" 缩放")],-1),xa=e("p",null,[n("按下 "),e("code",null,"alt"),n(" (Linux 上使用 "),e("code",null,"ctrl"),n(") 的同时点击幻灯片的任何元素,即可以向此元素进行放大。")],-1),ba=e("p",null,"再次点击即可缩小。",-1),wa=e("hr",null,null,-1),va=e("h2",{id:"结束",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#结束","aria-hidden":"true"},"#"),n(" 结束")],-1),Ma=e("p",null,"@slideend",-1);function La(ja,Ta){const s=i("ExternalLinkIcon");return d(),o("div",null,[a(" markdownlint-disable MD024 MD033 MD051 "),u,a(' .slide: data-transition="slide" '),_,a(' .element: class="r-fit-text" '),p,a(' .element: class="r-fit-text" '),m,f,g,a(' .element: class="r-fit-text" '),k,x,b,a(' .element: class="r-fit-text" '),w,a(' .element: class="fragment fade-in" '),v,a(' .element: class="fragment fade-in" '),M,a(' .element: class="fragment fade-in" '),L,a(' .element: class="fragment fade-in" '),j,a(' .slide: data-transition="slide" data-auto-animate '),T,a(' .element: class="r-fit-text" '),y,a(' .element: class="r-fit-text" '),E,a(" .slide: data-auto-animate "),H,N,V,$,e("p",null,[n("这是一个有着 "),B,n(", "),D,n(", "),z,n(" 文字并包含 "),e("a",C,[n("一个链接"),r(s)]),n(" 的段落,并且它会自动换行。所以你无需担心它的长度。")]),F,a(" .slide: data-auto-animate "),I,a(" .slide: data-auto-animate "),q,a(" .slide: data-auto-animate "),J,O,S,X,A,a(" .slide: data-auto-animate "),G,K,P,Q,a(' .slide: data-transition="slide" data-auto-animate '),R,a(' .element: class="r-fit-text" '),U,a(" .slide: data-auto-animate "),W,a(' .element: class="r-fit-text" '),Y,Z,a(" .slide: data-auto-animate "),ee,ae,a(' .element: class="r-stretch" '),ne,te,a(' .slide: data-auto-animate data-background-color="rgb(70, 70, 255)" '),se,le,ie,de,a(" .slide: data-auto-animate "),oe,a(' .element: class="r-fit-text" '),re,a(" .slide: data-auto-animate "),ce,a(' .element: class="r-fit-text" '),he,ue,_e,a(" .slide: data-auto-animate "),pe,me,fe,a(' .element: class="fragment fade-in" '),ge,a(' .element: class="fragment fade-out" '),ke,a(' .element: class="fragment fade-up" '),a(" list break "),xe,a(' .element: class="fragment fade-down" '),be,a(' .element: class="fragment fade-left" '),we,a(' .element: class="fragment fade-right" '),a(" list break "),ve,a(' .element: class="fragment fade-in-then-out" '),Me,a(' .element: class="fragment fade-in-then-semi-out" '),Le,a(" .slide: data-auto-animate "),je,Te,ye,a(' .element: class="fragment grow" '),Ee,a(' .element: class="fragment shrink" '),He,a(' .element: class="fragment strike" '),a(" list break "),Ne,a(' .element: class="fragment highlight-red" '),Ve,a(' .element: class="fragment highlight-green" '),$e,a(' .element: class="fragment highlight-blue" '),a(" list break "),Be,a(' .element: class="fragment highlight-current-red" '),De,a(' .element: class="fragment highlight-current-green" '),ze,a(' .element: class="fragment highlight-current-blue" '),Ce,a(" .slide: data-auto-animate "),Fe,a(" .slide: data-auto-animate "),Ie,qe,Je,Oe,Se,a(' .element: class="fragment" data-fragment-index="3"'),Xe,a(' .element: class="fragment" data-fragment-index="2"'),a(" list break "),Ae,a(' .element: class="fragment" data-fragment-index="1"'),Ge,a(' .element: class="fragment" data-fragment-index="2"'),Ke,a(' .slide: data-transition="slide" data-auto-animate '),Pe,a(' .element: class="r-fit-text" '),Qe,a(' .slide: data-transition="slide" data-auto-animate '),Re,a(' .element: class="r-fit-text" '),Ue,We,Ye,a(" list break "),Ze,ea,a(" .slide: data-auto-animate "),aa,a(' .element: class="r-fit-text" '),na,ta,sa,a(' .slide: data-transition="slide" data-auto-animate '),la,a(' .element: class="r-fit-text" '),ia,a(' .slide: data-transition="slide" data-auto-animate '),da,a(' .element: class="r-fit-text" '),oa,a(' .slide: data-transition="slide" data-auto-animate '),ra,a(' .element: class="r-fit-text" '),ca,ha,ua,a(' .slide: data-transition="slide" data-auto-animate '),_a,a(' .element: class="r-fit-text" '),pa,ma,fa,a(' .slide: data-transition="slide" data-auto-animate '),ga,a(' .element: class="r-fit-text" '),ka,xa,ba,wa,a(' .element: class="r-fit-text" '),va,Ma])}const Ha=l(h,[["render",La],["__file","slides.html.vue"]]);export{Ha as default};
const l=JSON.parse('{"key":"v-2e3eac9e","path":"/slides.html","title":"幻灯片页","lang":"zh-CN","frontmatter":{"title":"幻灯片页","icon":"person-chalkboard","layout":"Slide","description":"slidestart 幻灯片演示 一个简单的幻灯片演示与各种小贴士。 作者 Mr.Hope. 请滚动鼠标滚轮进入下一页 标注幻灯片 👇 (#/1/1) -- 标注幻灯片 使用 --- 标注水平幻灯片 在水平幻灯片中使用 -- 分割垂直幻灯片 使用 在幻灯片上添加属性 使用 在前一个 HTML 元素上添加属性 Markdown 你可以在幻灯片中使用 M...","head":[["meta",{"property":"og:url","content":"https://vuepress-theme-hope-docs-demo.netlify.app/slides.html"}],["meta",{"property":"og:site_name","content":"我的简历"}],["meta",{"property":"og:title","content":"幻灯片页"}],["meta",{"property":"og:description","content":"slidestart 幻灯片演示 一个简单的幻灯片演示与各种小贴士。 作者 Mr.Hope. 请滚动鼠标滚轮进入下一页 标注幻灯片 👇 (#/1/1) -- 标注幻灯片 使用 --- 标注水平幻灯片 在水平幻灯片中使用 -- 分割垂直幻灯片 使用 在幻灯片上添加属性 使用 在前一个 HTML 元素上添加属性 Markdown 你可以在幻灯片中使用 M..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"Mr.Hope"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"幻灯片页\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"Mr.Hope\\",\\"url\\":\\"https://mister-hope.com\\"}]}"]]},"headers":[{"level":2,"title":"幻灯片演示","slug":"幻灯片演示","link":"#幻灯片演示","children":[]},{"level":2,"title":"标注幻灯片","slug":"标注幻灯片","link":"#标注幻灯片","children":[]},{"level":2,"title":"标注幻灯片","slug":"标注幻灯片-1","link":"#标注幻灯片-1","children":[]},{"level":2,"title":"Markdown","slug":"markdown","link":"#markdown","children":[]},{"level":2,"title":"Markdown","slug":"markdown-1","link":"#markdown-1","children":[{"level":3,"title":"这是一个 H3","slug":"这是一个-h3","link":"#这是一个-h3","children":[]}]},{"level":2,"title":"Markdown","slug":"markdown-2","link":"#markdown-2","children":[]},{"level":2,"title":"Markdown","slug":"markdown-3","link":"#markdown-3","children":[]},{"level":2,"title":"Markdown","slug":"markdown-4","link":"#markdown-4","children":[]},{"level":2,"title":"Markdown","slug":"markdown-5","link":"#markdown-5","children":[]},{"level":2,"title":"布局","slug":"布局","link":"#布局","children":[]},{"level":2,"title":"布局","slug":"布局-1","link":"#布局-1","children":[]},{"level":2,"title":"布局","slug":"布局-2","link":"#布局-2","children":[]},{"level":2,"title":"布局","slug":"布局-3","link":"#布局-3","children":[{"level":3,"title":"背景","slug":"背景","link":"#背景","children":[]}]},{"level":2,"title":"动画片段","slug":"动画片段","link":"#动画片段","children":[]},{"level":2,"title":"动画片段","slug":"动画片段-1","link":"#动画片段-1","children":[]},{"level":2,"title":"动画片段","slug":"动画片段-2","link":"#动画片段-2","children":[{"level":3,"title":"动画 class","slug":"动画-class","link":"#动画-class","children":[]}]},{"level":2,"title":"动画片段","slug":"动画片段-3","link":"#动画片段-3","children":[{"level":3,"title":"动画 class","slug":"动画-class-1","link":"#动画-class-1","children":[]}]},{"level":2,"title":"动画片段","slug":"动画片段-4","link":"#动画片段-4","children":[{"level":3,"title":"多个动画片段","slug":"多个动画片段","link":"#多个动画片段","children":[]}]},{"level":2,"title":"动画片段","slug":"动画片段-5","link":"#动画片段-5","children":[{"level":3,"title":"顺序","slug":"顺序","link":"#顺序","children":[]}]},{"level":2,"title":"渐变","slug":"渐变","link":"#渐变","children":[]},{"level":2,"title":"渐变","slug":"渐变-1","link":"#渐变-1","children":[]},{"level":2,"title":"渐变","slug":"渐变-2","link":"#渐变-2","children":[{"level":3,"title":"过渡动画","slug":"过渡动画","link":"#过渡动画","children":[]}]},{"level":2,"title":"功能","slug":"功能","link":"#功能","children":[]},{"level":2,"title":"功能","slug":"功能-1","link":"#功能-1","children":[{"level":3,"title":"代码","slug":"代码","link":"#代码","children":[]}]},{"level":2,"title":"功能","slug":"功能-2","link":"#功能-2","children":[{"level":3,"title":"预览模式","slug":"预览模式","link":"#预览模式","children":[]}]},{"level":2,"title":"功能","slug":"功能-3","link":"#功能-3","children":[{"level":3,"title":"全屏模式","slug":"全屏模式","link":"#全屏模式","children":[]}]},{"level":2,"title":"功能","slug":"功能-4","link":"#功能-4","children":[{"level":3,"title":"缩放","slug":"缩放","link":"#缩放","children":[]}]},{"level":2,"title":"结束","slug":"结束","link":"#结束","children":[]}],"git":{},"readingTime":{"minutes":4.51,"words":1352},"filePathRelative":"slides.md","autoDesc":true}');export{l as data};
html[data-theme=dark]{--text-color: #9e9e9e;--bg-color: #0d1117;--bg-color-secondary: #161b22;--bg-color-tertiary: #21262c;--border-color: #30363d;--box-shadow: #282a32;--card-shadow: rgba(0, 0, 0, .3);--black: #fff;--dark-grey: #999;--light-grey: #666;--white: #000;--grey3: #bbb;--grey12: #333;--grey14: #111;--bg-color-light: #161b22;--bg-color-back: #0d1117;--bg-color-float: #161b22;--bg-color-blur: rgba(13, 17, 23, .9);--bg-color-float-blur: rgba(22, 27, 34, .9);--text-color-light: #a8a8a8;--text-color-lighter: #b1b1b1;--text-color-bright: #c5c5c5;--border-color-light: #2e333a;--border-color-dark: #394048}:root{--theme-color: #16a085;--text-color: #2c3e50;--bg-color: #fff;--bg-color-secondary: #f8f8f8;--bg-color-tertiary: #efeef4;--border-color: #eaecef;--box-shadow: #f0f1f2;--card-shadow: rgba(0, 0, 0, .15);--black: #000;--dark-grey: #666;--light-grey: #999;--white: #fff;--grey3: #333;--grey12: #bbb;--grey14: #eee;--navbar-height: 3.75rem;--navbar-horizontal-padding: 1.5rem;--navbar-vertical-padding: .7rem;--navbar-mobile-height: 3.25rem;--navbar-mobile-horizontal-padding: 1rem;--navbar-mobile-vertical-padding: .5rem;--sidebar-width: 20rem;--sidebar-mobile-width: 16rem;--content-width: 780px;--home-page-width: 1160px;--font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", STHeiti, "Microsoft YaHei", SimSun, sans-serif;--font-family-heading: Georgia Pro, Crimson, Georgia, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", STHeiti, "Microsoft YaHei", SimSun, sans-serif;--font-family-mono: Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace;--line-numbers-width: 2.5rem;--color-transition: .3s ease;--transform-transition: .3s ease;--vp-bg: var(--bg-color);--vp-bgl: var(--bg-color-light);--vp-bglt: var(--bg-color-tertiary);--vp-c: var(--text-color);--vp-cl: var(--text-color-light);--vp-clt: var(--text-color-lighter);--vp-brc: var(--border-color);--vp-brcd: var(--border-color-dark);--vp-tc: var(--theme-color);--vp-tcl: var(--theme-color-light);--vp-ct: var(--color-transition);--vp-tt: var(--transform-transition);--bg-color-light: #fff;--bg-color-back: #f8f8f8;--bg-color-float: #fff;--bg-color-blur: rgba(255, 255, 255, .9);--bg-color-float-blur: rgba(255, 255, 255, .9);--text-color-light: #3a5169;--text-color-lighter: #476582;--text-color-bright: #6a8bad;--border-color-light: #eceef1;--border-color-dark: #cfd4db;--theme-color-dark: #149078;--theme-color-light: #1abd9d;--theme-color-mask: rgba(22, 160, 133, .15)}:root{--badge-tip-color: #42b983;--badge-warning-color: #f4cd00;--badge-danger-color: #f55;--badge-info-color: #0295ff;--badge-note-color: #666}.vp-badge{display:inline-block;vertical-align:center;height:18px;padding:0 6px;border-radius:3px;background:var(--vp-tc);color:var(--white);font-size:14px;line-height:18px;transition:background var(--vp-ct),color var(--vp-ct)}.vp-badge+.vp-badge{margin-inline-start:5px}h1 .vp-badge,h2 .vp-badge,h3 .vp-badge,h4 .vp-badge,h5 .vp-badge,h6 .vp-badge{vertical-align:top}.vp-badge.tip{background:var(--badge-tip-color)}.vp-badge.warning{background:var(--badge-warning-color)}.vp-badge.danger{background:var(--badge-danger-color)}.vp-badge.info{background:var(--badge-info-color)}.vp-badge.note{background:var(--badge-note-color)}.font-icon{display:inline-block}.theme-hope-content .font-icon{vertical-align:middle}:root{--balloon-border-radius: 2px;--balloon-color: rgba(16, 16, 16, .95);--balloon-text-color: #fff;--balloon-font-size: 12px;--balloon-move: 4px}button[aria-label][data-balloon-pos]{overflow:visible}[aria-label][data-balloon-pos]{position:relative;cursor:pointer}[aria-label][data-balloon-pos]:after{opacity:0;pointer-events:none;transition:all .18s ease-out .18s;text-indent:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Open Sans,Helvetica Neue,sans-serif;font-weight:400;font-style:normal;text-shadow:none;font-size:var(--balloon-font-size);background:var(--balloon-color);border-radius:2px;color:var(--balloon-text-color);border-radius:var(--balloon-border-radius);content:attr(aria-label);padding:.5em 1em;position:absolute;white-space:nowrap;z-index:10}[aria-label][data-balloon-pos]:before{width:0;height:0;border:5px solid transparent;border-top-color:var(--balloon-color);opacity:0;pointer-events:none;transition:all .18s ease-out .18s;content:"";position:absolute;z-index:10}[aria-label][data-balloon-pos]:hover:before,[aria-label][data-balloon-pos]:hover:after,[aria-label][data-balloon-pos][data-balloon-visible]:before,[aria-label][data-balloon-pos][data-balloon-visible]:after,[aria-label][data-balloon-pos]:not([data-balloon-nofocus]):focus:before,[aria-label][data-balloon-pos]:not([data-balloon-nofocus]):focus:after{opacity:1;pointer-events:none}[aria-label][data-balloon-pos].font-awesome:after{font-family:FontAwesome,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Open Sans,Helvetica Neue,sans-serif}[aria-label][data-balloon-pos][data-balloon-break]:after{white-space:pre}[aria-label][data-balloon-pos][data-balloon-break][data-balloon-length]:after{white-space:pre-line;word-break:break-word}[aria-label][data-balloon-pos][data-balloon-blunt]:before,[aria-label][data-balloon-pos][data-balloon-blunt]:after{transition:none}[aria-label][data-balloon-pos][data-balloon-pos=up]:hover:after,[aria-label][data-balloon-pos][data-balloon-pos=up][data-balloon-visible]:after,[aria-label][data-balloon-pos][data-balloon-pos=down]:hover:after,[aria-label][data-balloon-pos][data-balloon-pos=down][data-balloon-visible]:after{transform:translate(-50%)}[aria-label][data-balloon-pos][data-balloon-pos=up]:hover:before,[aria-label][data-balloon-pos][data-balloon-pos=up][data-balloon-visible]:before,[aria-label][data-balloon-pos][data-balloon-pos=down]:hover:before,[aria-label][data-balloon-pos][data-balloon-pos=down][data-balloon-visible]:before{transform:translate(-50%)}[aria-label][data-balloon-pos][data-balloon-pos*=-left]:after{left:0}[aria-label][data-balloon-pos][data-balloon-pos*=-left]:before{left:5px}[aria-label][data-balloon-pos][data-balloon-pos*=-right]:after{right:0}[aria-label][data-balloon-pos][data-balloon-pos*=-right]:before{right:5px}[aria-label][data-balloon-pos][data-balloon-po*=-left]:hover:after,[aria-label][data-balloon-pos][data-balloon-po*=-left][data-balloon-visible]:after,[aria-label][data-balloon-pos][data-balloon-pos*=-right]:hover:after,[aria-label][data-balloon-pos][data-balloon-pos*=-right][data-balloon-visible]:after{transform:translate(0)}[aria-label][data-balloon-pos][data-balloon-po*=-left]:hover:before,[aria-label][data-balloon-pos][data-balloon-po*=-left][data-balloon-visible]:before,[aria-label][data-balloon-pos][data-balloon-pos*=-right]:hover:before,[aria-label][data-balloon-pos][data-balloon-pos*=-right][data-balloon-visible]:before{transform:translate(0)}[aria-label][data-balloon-pos][data-balloon-pos^=up]:before,[aria-label][data-balloon-pos][data-balloon-pos^=up]:after{bottom:100%;transform-origin:top;transform:translateY(var(--balloon-move))}[aria-label][data-balloon-pos][data-balloon-pos^=up]:after{margin-bottom:10px}[aria-label][data-balloon-pos][data-balloon-pos=up]:before,[aria-label][data-balloon-pos][data-balloon-pos=up]:after{left:50%;transform:translate(-50%,var(--balloon-move))}[aria-label][data-balloon-pos][data-balloon-pos^=down]:before,[aria-label][data-balloon-pos][data-balloon-pos^=down]:after{top:100%;transform:translateY(calc(var(--balloon-move) * -1))}[aria-label][data-balloon-pos][data-balloon-pos^=down]:after{margin-top:10px}[aria-label][data-balloon-pos][data-balloon-pos^=down]:before{width:0;height:0;border:5px solid transparent;border-bottom-color:var(--balloon-color)}[aria-label][data-balloon-pos][data-balloon-pos=down]:after,[aria-label][data-balloon-pos][data-balloon-pos=down]:before{left:50%;transform:translate(-50%,calc(var(--balloon-move) * -1))}[aria-label][data-balloon-pos][data-balloon-pos=left]:hover:after,[aria-label][data-balloon-pos][data-balloon-pos=left][data-balloon-visible]:after,[aria-label][data-balloon-pos][data-balloon-pos=right]:hover:after,[aria-label][data-balloon-pos][data-balloon-pos=right][data-balloon-visible]:after{transform:translateY(-50%)}[aria-label][data-balloon-pos][data-balloon-pos=left]:hover:before,[aria-label][data-balloon-pos][data-balloon-pos=left][data-balloon-visible]:before,[aria-label][data-balloon-pos][data-balloon-pos=right]:hover:before,[aria-label][data-balloon-pos][data-balloon-pos=right][data-balloon-visible]:before{transform:translateY(-50%)}[aria-label][data-balloon-pos][data-balloon-pos=left]:after,[aria-label][data-balloon-pos][data-balloon-pos=left]:before{right:100%;top:50%;transform:translate(var(--balloon-move),-50%)}[aria-label][data-balloon-pos][data-balloon-pos=left]:after{margin-right:10px}[aria-label][data-balloon-pos][data-balloon-pos=left]:before{width:0;height:0;border:5px solid transparent;border-left-color:var(--balloon-color)}[aria-label][data-balloon-pos][data-balloon-pos=right]:after,[aria-label][data-balloon-pos][data-balloon-pos=right]:before{left:100%;top:50%;transform:translate(calc(var(--balloon-move) * -1),-50%)}[aria-label][data-balloon-pos][data-balloon-pos=right]:after{margin-left:10px}[aria-label][data-balloon-pos][data-balloon-pos=right]:before{width:0;height:0;border:5px solid transparent;border-right-color:var(--balloon-color)}[aria-label][data-balloon-pos][data-balloon-length]:after{white-space:normal}[aria-label][data-balloon-pos][data-balloon-length=small]:after{width:80px}[aria-label][data-balloon-pos][data-balloon-length=medium]:after{width:150px}[aria-label][data-balloon-pos][data-balloon-length=large]:after{width:260px}[aria-label][data-balloon-pos][data-balloon-length=xlarge]:after{width:380px}@media screen and (max-width: 768px){[aria-label][data-balloon-pos][data-balloon-length=xlarge]:after{width:90vw}}[aria-label][data-balloon-pos][data-balloon-length=fit]:after{width:100%}.vp-back-to-top-button{border-width:0;background:transparent;cursor:pointer;position:fixed!important;bottom:64px;inset-inline-end:1rem;z-index:100;width:48px;height:48px;padding:8px;border-radius:50%;background:var(--vp-bg);color:var(--vp-tc);box-shadow:2px 2px 10px 4px var(--card-shadow);transition:background var(--vp-ct),color var(--vp-ct),box-shadow var(--vp-ct)}@media (max-width: 719px){.vp-back-to-top-button{width:36px;height:36px}}@media print{.vp-back-to-top-button{display:none}}.vp-back-to-top-button:hover{color:var(--vp-tcl)}.vp-back-to-top-button .back-to-top-icon{overflow:hidden;width:100%;border-radius:50%;fill:currentcolor}.vp-scroll-progress{position:absolute;right:-2px;bottom:-2px;width:52px;height:52px}@media (max-width: 719px){.vp-scroll-progress{width:40px;height:40px}}.vp-scroll-progress circle{opacity:.9;fill:none;stroke:var(--vp-tc);transform:rotate(-90deg);transform-origin:50% 50%;r:22;stroke-dasharray:0% 314.1593%;stroke-width:3px}@media (max-width: 719px){.vp-scroll-progress circle{r:18}}.fade-enter-active,.fade-leave-active{transition:opacity var(--vp-ct)}.fade-enter-from,.fade-leave-to{opacity:0}@media screen{.sr-only{position:absolute;overflow:hidden;clip:rect 0,0,0,0;width:1px;height:1px;margin:-1px;padding:0;border:0}}@media print{.sr-only{display:none}}.vp-catalog-wrapper{margin-top:8px;margin-bottom:8px}.vp-catalog-wrapper.index ol{padding-inline-start:0}.vp-catalog-wrapper.index li{list-style-type:none}.vp-catalog-wrapper.index .vp-child-catalogs{counter-reset:child-catalog}.vp-catalog-wrapper.index .vp-child-catalog{counter-increment:child-catalog}.vp-catalog-wrapper.index .vp-child-catalog .vp-catalog-title:before{content:counter(catalog-item) "." counter(child-catalog) " "}.vp-catalog-wrapper.index .vp-sub-catalogs{padding-inline-start:.5rem}.vp-catalogs{margin:0;padding-inline-start:0;counter-reset:catalog-item}.vp-catalogs .font-icon{vertical-align:baseline;margin-inline-end:.25rem}.vp-catalog{counter-increment:catalog-item}.vp-catalog-main-title{margin-top:calc(.5rem - var(--navbar-height, 3.6rem));margin-bottom:.5rem;padding-top:var(--navbar-height, 3.6rem);font-weight:500;font-size:1.75rem}.vp-catalog-main-title:first-child{margin-bottom:.5rem!important}.vp-catalog-main-title:only-child{margin-bottom:0!important}.vp-catalog-child-title.has-children{margin-top:calc(.5rem - var(--navbar-height, 3.6rem));margin-bottom:.5rem;padding-top:var(--navbar-height, 3.6rem);border-bottom:1px solid var(--vp-brc);font-weight:500;font-size:1.3rem;transition:border-color var(--vp-ct)}.vp-catalog-child-title.has-children:first-child{margin-bottom:.5rem!important}.vp-catalog-child-title.has-children:only-child{margin-bottom:0!important}.vp-catalog-sub-title{font-weight:500;font-size:1.1rem}.vp-catalog-sub-title:only-child{margin-bottom:0!important}.vp-catalog-title{color:inherit;text-decoration:none}.vp-catalog-title:hover{color:var(--vp-tc)}.vp-catalog .vp-catalog-title:before{content:"§" counter(catalog-item,upper-roman) " "}.vp-child-catalogs{margin:0}.vp-sub-catalogs{counter-reset:sub-catalog}.vp-sub-catalog{counter-increment:sub-catalog}.vp-sub-catalog .vp-link:before{content:counter(catalog-item) "." counter(child-catalog) "." counter(sub-catalog) " "}.vp-sub-catalogs-wrapper{display:flex;flex-wrap:wrap}.vp-sub-catalog-link{display:inline-block;margin:4px 8px;padding:4px 8px;border-radius:6px;background-color:var(--vp-bgl);line-height:1.5;overflow-wrap:break-word;transition:background-color var(--vp-ct),color var(--vp-ct)}.vp-sub-catalog-link:hover{background-color:var(--vp-tcl);color:var(--vp-bg);text-decoration:none!important}.vp-empty-catalog{font-size:1.25rem;text-align:center}:root{--external-link-icon-color: #aaa}.external-link-icon{position:relative;display:inline-block;color:var(--external-link-icon-color);vertical-align:middle;top:-1px}@media print{.external-link-icon{display:none}}.external-link-icon-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0;-webkit-user-select:none;-moz-user-select:none;user-select:none}:root{--nprogress-color: #29d;--nprogress-z-index: 1031}#nprogress{pointer-events:none}#nprogress .bar{background:var(--nprogress-color);position:fixed;z-index:var(--nprogress-z-index);top:0;left:0;width:100%;height:2px}:root{--copy-icon: url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' height='20' width='20' stroke='rgba(128,128,128,1)' stroke-width='2'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2M9 5a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2M9 5a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2'/%3E%3C/svg%3E");--copied-icon: url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' height='20' width='20' stroke='rgba(128,128,128,1)' stroke-width='2'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2M9 5a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2M9 5a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2m-6 9 2 2 4-4'/%3E%3C/svg%3E")}div[class*=language-]>button.copy-code-button{border-width:0;background:transparent;position:absolute;outline:none;cursor:pointer}@media print{div[class*=language-]>button.copy-code-button{display:none}}div[class*=language-]>button.copy-code-button .copy-icon{background:currentcolor;-webkit-mask-image:var(--copy-icon);mask-image:var(--copy-icon);-webkit-mask-position:50%;mask-position:50%;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:1em;mask-size:1em}div[class*=language-]>button.copy-code-button:not(.fancy){border-width:0;background:transparent;cursor:pointer;position:absolute;top:.5em;right:.5em;z-index:5;width:2.5rem;height:2.5rem;padding:0;border-radius:.5rem;opacity:0;transition:opacity .4s}div[class*=language-]>button.copy-code-button:not(.fancy):hover,div[class*=language-]>button.copy-code-button:not(.fancy).copied{background:var(--code-hl-bg-color, rgba(0, 0, 0, .66))}div[class*=language-]>button.copy-code-button:not(.fancy):focus,div[class*=language-]>button.copy-code-button:not(.fancy).copied{opacity:1}div[class*=language-]>button.copy-code-button:not(.fancy).copied:after{content:attr(data-copied);position:absolute;top:0;right:calc(100% + .25rem);display:block;height:1.25rem;padding:.625rem;border-radius:.5rem;background:var(--code-hl-bg-color, rgba(0, 0, 0, .66));color:var(--code-ln-color, #9e9e9e);font-weight:500;line-height:1.25rem;white-space:nowrap}div[class*=language-]>button.copy-code-button:not(.fancy) .copy-icon{width:1.25rem;height:1.25rem;padding:.625rem;color:var(--code-ln-color, #9e9e9e);font-size:1.25rem}div[class*=language-]>button.copy-code-button.fancy{right:-14px;bottom:-14px;z-index:5;width:2rem;height:2rem;padding:7px 8px;border-radius:50%;background:#339af0;color:#fff}@media (max-width: 419px){div[class*=language-]>button.copy-code-button.fancy{right:0;bottom:0;width:28px;height:28px;border-radius:50% 10% 0}}div[class*=language-]>button.copy-code-button.fancy:hover{background:#228be6}div[class*=language-]>button.copy-code-button.fancy .copy-icon{width:100%;height:100%;color:#fff;font-size:1.25rem}@media (max-width: 419px){div[class*=language-]>button.copy-code-button.fancy .copy-icon{position:relative;top:2px;left:2px}}div[class*=language-]>button.copy-code-button.copied .copy-icon{-webkit-mask-image:var(--copied-icon);mask-image:var(--copied-icon)}div[class*=language-]:hover:before{display:none}div[class*=language-]:hover>button.copy-code-button:not(.fancy){opacity:1}.vp-card{display:inline-flex;align-items:center;max-width:400px;margin:1rem .5rem;padding:1rem;border-radius:.5rem;background:var(--vp-bg);color:inherit;box-shadow:2px 2px 10px 0 var(--card-shadow);transition:background var(--vp-ct),box-shadow var(--vp-ct)}.vp-card:hover{background:var(--vp-bgl);text-decoration:none!important}.vp-card hr{margin:.25em 0}.vp-card-logo{width:3em;height:3em;margin-inline-end:1em;border-radius:50%}.vp-card-content{flex:1}.vp-card-title{font-weight:500;font-size:1.1em}.vp-card-desc{color:#888;font-size:.9em;line-height:1.5;transition:color var(--vp-ct)}.vp-card-container{display:flex;flex-wrap:wrap;align-items:stretch;place-content:stretch center}.vp-card-container .vp-card{flex-basis:calc(50% - 3rem);max-width:unset;margin:.5rem}@media (max-width: 959px){.vp-card-container .vp-card{flex-basis:100%}}@media (max-width: 719px){.vp-card-container .vp-card{font-size:.95rem}}@media (max-width: 419px){.vp-card-container .vp-card{font-size:.9rem}}.vp-code-tabs-nav{overflow-x:auto;margin:.85rem 0 -.85rem;padding:0;border-radius:6px 6px 0 0;background:var(--code-tabs-nav-bg-color, #3a404c);list-style:none;white-space:nowrap;transition:background var(--vp-ct)}@media print{.vp-code-tabs-nav{display:none}}@media (max-width: 419px){.vp-code-tabs-nav{margin-inline:-1.5rem;border-radius:0}}.vp-code-tab-nav{border-width:0;position:relative;min-width:3rem;margin:0;padding:6px 12px;border-radius:6px 6px 0 0;background:transparent;color:var(--code-tabs-nav-text-color, #eee);font-weight:600;font-size:.85em;line-height:1.4;cursor:pointer;transition:background var(--vp-ct),color var(--vp-ct)}.vp-code-tab-nav:hover{background:var(--code-tabs-nav-hover-color, #434a57)}.vp-code-tab-nav:before,.vp-code-tab-nav:after{content:" ";position:absolute;bottom:0;z-index:1;width:6px;height:6px}.vp-code-tab-nav:before{right:100%}.vp-code-tab-nav:after{left:100%}.vp-code-tab-nav.active{background:var(--code-bg-color, #282c34)}.vp-code-tab-nav.active:before{background:radial-gradient(12px at left top,transparent 50%,var(--code-bg-color, #282c34) 50%)}.vp-code-tab-nav.active:after{background:radial-gradient(12px at right top,transparent 50%,var(--code-bg-color, #282c34) 50%)}.vp-code-tab-nav:first-child:before{display:none}html[dir=rtl] .vp-code-tab-nav:first-child:before{display:block}html[dir=rtl] .vp-code-tab-nav:first-child:after{display:none}.vp-code-tab{display:none}@media print{.vp-code-tab{display:block}}.vp-code-tab.active{display:block}.vp-code-tab div[class*=language-]{border-top-left-radius:0;border-top-right-radius:0}@media (max-width: 419px){.vp-code-tab div[class*=language-]{margin:.85rem -1.5rem;border-radius:0}}@media print{.vp-code-tab div[class*=language-] code{white-space:pre-wrap}}.vp-code-tab-title{display:none;font-weight:500}@media print{.vp-code-tab-title{display:block}}.code-group-nav{display:flex;margin:.85rem 0 -.85rem;padding:0;border-radius:6px 6px 0 0;background:var(--code-tabs-nav-bg-color, #3a404c);list-style:none;transition:background var(--vp-ct)}@media (max-width: 419px){.code-group-nav{margin-inline:-1.5rem;border-radius:0}}.code-group-nav-tab{border-width:0;position:relative;min-width:3rem;margin:0;padding:6px 10px;border-radius:6px 6px 0 0;background:transparent;color:var(--code-tabs-nav-text-color, #eee);font-weight:600;font-size:.85em;line-height:1.4;cursor:pointer;transition:background var(--vp-ct),color var(--vp-ct)}.code-group-nav-tab:hover{background:var(--code-tabs-nav-hover-color, #434a57)}.code-group-nav-tab:before,.code-group-nav-tab:after{content:" ";position:absolute;bottom:0;z-index:1;width:6px;height:6px}.code-group-nav-tab:before{right:100%}.code-group-nav-tab:after{left:100%}.code-group-nav-tab.active{background:var(--code-bg-color, #282c34)}.code-group-nav-tab.active:before{background:radial-gradient(12px at left top,transparent 50%,var(--code-bg-color, #282c34) 50%)}.code-group-nav-tab.active:after{background:radial-gradient(12px at right top,transparent 50%,var(--code-bg-color, #282c34) 50%)}.code-group-nav-tab:first-child:before{display:none}html[dir=rtl] .code-group-nav-tab:first-child:before{display:block}html[dir=rtl] .code-group-nav-tab:first-child:after{display:none}.code-group-item{display:none}.code-group-item.active{display:block}.code-group-item div[class*=language-]{border-top-left-radius:0;border-top-right-radius:0}:root{--info-title-color: #193c47;--info-bg-color: #eef9fd;--info-border-color: #4cb3d4;--info-code-bg-color: rgb(76 179 212 / 10%);--note-title-color: #474748;--note-bg-color: #fdfdfe;--note-border-color: #ccc;--note-code-bg-color: rgb(212 213 216 / 20%);--tip-title-color: #003100;--tip-bg-color: #e6f6e6;--tip-border-color: #009400;--tip-code-bg-color: rgb(0 148 0 / 15%);--warning-title-color: #4d3800;--warning-bg-color: #fff8e6;--warning-border-color: #e6a700;--warning-code-bg-color: rgb(230 167 0 / 15%);--danger-title-color: #4b1113;--danger-bg-color: #ffebec;--danger-border-color: #e13238;--danger-code-bg-color: rgb(225 50 56 / 15%);--detail-bg-color: #eee;--detail-text-color: inherit;--detail-code-bg-color: rgb(127 127 127 / 15%)}html[data-theme=dark]{--info-title-color: #eef9fd;--info-bg-color: #193c47;--note-title-color: #fdfdfe;--note-bg-color: #474748;--tip-title-color: #e6f6e6;--tip-bg-color: #003100;--warning-title-color: #fff8e6;--warning-bg-color: #4d3800;--danger-title-color: #ffebec;--danger-bg-color: #4b1113;--detail-bg-color: #333;--detail-text-color: #a8a8a8}.hint-container{position:relative;transition:background var(--vp-ct),border-color var(--vp-ct),color var(--vp-ct)}@media print{.hint-container{page-break-inside:avoid}}.hint-container .hint-container-title{position:relative;font-weight:600;line-height:1.25}.hint-container.info,.hint-container.note,.hint-container.tip,.hint-container.warning,.hint-container.danger{margin:1rem 0;padding:.25rem 1rem;border-inline-start-width:.3rem;border-inline-start-style:solid;border-radius:.5rem;color:inherit}@media (max-width: 419px){.hint-container.info,.hint-container.note,.hint-container.tip,.hint-container.warning,.hint-container.danger{margin-inline:-.75rem}}.hint-container.info .hint-container-title,.hint-container.note .hint-container-title,.hint-container.tip .hint-container-title,.hint-container.warning .hint-container-title,.hint-container.danger .hint-container-title{padding-inline-start:1.75rem}@media print{.hint-container.info .hint-container-title,.hint-container.note .hint-container-title,.hint-container.tip .hint-container-title,.hint-container.warning .hint-container-title,.hint-container.danger .hint-container-title{padding-inline-start:0}}.hint-container.info .hint-container-title:before,.hint-container.note .hint-container-title:before,.hint-container.tip .hint-container-title:before,.hint-container.warning .hint-container-title:before,.hint-container.danger .hint-container-title:before{content:" ";position:absolute;top:calc(50% - .6125em);inset-inline-start:0;width:1.25em;height:1.25em;background-position:left;background-repeat:no-repeat}@media print{.hint-container.info .hint-container-title:before,.hint-container.note .hint-container-title:before,.hint-container.tip .hint-container-title:before,.hint-container.warning .hint-container-title:before,.hint-container.danger .hint-container-title:before{display:none}}.hint-container.info p,.hint-container.note p,.hint-container.tip p,.hint-container.warning p,.hint-container.danger p{line-height:1.5}.hint-container.info a,.hint-container.note a,.hint-container.tip a,.hint-container.warning a,.hint-container.danger a{color:var(--vp-tc)}.hint-container.info{border-color:var(--info-border-color);background:var(--info-bg-color)}.hint-container.info>.hint-container-title{color:var(--info-title-color)}.hint-container.info>.hint-container-title:before{background-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10-4.477 10-10 10zm-1-11v6h2v-6h-2zm0-4v2h2V7h-2z' fill='%234cb3d4'/%3E%3C/svg%3E")}.hint-container.info code{background:var(--info-code-bg-color)}.hint-container.note{border-color:var(--note-border-color);background:var(--note-bg-color)}.hint-container.note>.hint-container-title{color:var(--note-title-color)}.hint-container.note>.hint-container-title:before{background-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10-4.477 10-10 10zm-1-11v6h2v-6h-2zm0-4v2h2V7h-2z' fill='%23ccc'/%3E%3C/svg%3E")}.hint-container.note code{background:var(--note-code-bg-color)}.hint-container.tip{border-color:var(--tip-border-color);background:var(--tip-bg-color)}.hint-container.tip>.hint-container-title{color:var(--tip-title-color)}.hint-container.tip>.hint-container-title:before{background-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23009400' d='M7.941 18c-.297-1.273-1.637-2.314-2.187-3a8 8 0 1 1 12.49.002c-.55.685-1.888 1.726-2.185 2.998H7.94zM16 20v1a2 2 0 0 1-2 2h-4a2 2 0 0 1-2-2v-1h8zm-3-9.995V6l-4.5 6.005H11v4l4.5-6H13z'/%3E%3C/svg%3E")}.hint-container.tip code{background:var(--tip-code-bg-color)}.hint-container.warning{border-color:var(--warning-border-color);background:var(--warning-bg-color)}.hint-container.warning>.hint-container-title{color:var(--warning-title-color)}.hint-container.warning>.hint-container-title:before{background-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1024 1024'%3E%3Cpath d='M576.286 752.57v-95.425q0-7.031-4.771-11.802t-11.3-4.772h-96.43q-6.528 0-11.3 4.772t-4.77 11.802v95.424q0 7.031 4.77 11.803t11.3 4.77h96.43q6.528 0 11.3-4.77t4.77-11.803zm-1.005-187.836 9.04-230.524q0-6.027-5.022-9.543-6.529-5.524-12.053-5.524H456.754q-5.524 0-12.053 5.524-5.022 3.516-5.022 10.547l8.538 229.52q0 5.023 5.022 8.287t12.053 3.265h92.913q7.032 0 11.803-3.265t5.273-8.287zM568.25 95.65l385.714 707.142q17.578 31.641-1.004 63.282-8.538 14.564-23.354 23.102t-31.892 8.538H126.286q-17.076 0-31.892-8.538T71.04 866.074q-18.582-31.641-1.004-63.282L455.75 95.65q8.538-15.57 23.605-24.61T512 62t32.645 9.04 23.605 24.61z' fill='%23e6a700'/%3E%3C/svg%3E")}.hint-container.warning code{background:var(--warning-code-bg-color)}.hint-container.danger{border-color:var(--danger-border-color);background:var(--danger-bg-color)}.hint-container.danger>.hint-container-title{color:var(--danger-title-color)}.hint-container.danger>.hint-container-title:before{background-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 2c5.523 0 10 4.477 10 10v3.764a2 2 0 0 1-1.106 1.789L18 19v1a3 3 0 0 1-2.824 2.995L14.95 23a2.5 2.5 0 0 0 .044-.33L15 22.5V22a2 2 0 0 0-1.85-1.995L13 20h-2a2 2 0 0 0-1.995 1.85L9 22v.5c0 .171.017.339.05.5H9a3 3 0 0 1-3-3v-1l-2.894-1.447A2 2 0 0 1 2 15.763V12C2 6.477 6.477 2 12 2zm-4 9a2 2 0 1 0 0 4 2 2 0 0 0 0-4zm8 0a2 2 0 1 0 0 4 2 2 0 0 0 0-4z' fill='%23e13238'/%3E%3C/svg%3E")}.hint-container.danger code{background:var(--danger-code-bg-color)}.hint-container.details{position:relative;display:block;margin:1rem 0;padding:1.5rem;border-radius:.5rem;background:var(--detail-bg-color);color:var(--detail-text-color);transition:background var(--vp-tt),color var(--vp-tt)}@media (max-width: 419px){.hint-container.details{margin-inline:-.75rem}}.hint-container.details h4{margin-top:0}.hint-container.details figure:last-child,.hint-container.details p:last-child{margin-bottom:0;padding-bottom:0}.hint-container.details a{color:var(--vp-tc)}.hint-container.details code{background:var(--detail-code-bg-color)}.hint-container.details summary{position:relative;margin:-1.5rem;padding-block:1.5rem;padding-inline:4rem 1.5rem;list-style:none;cursor:pointer}.hint-container.details summary::marker{color:transparent;font-size:0}.hint-container.details summary:before,.hint-container.details summary:after{content:" ";position:absolute;top:calc(50% - .75rem);inset-inline-start:1.5rem;width:1.5rem;height:1.5rem}.hint-container.details summary:before{border-radius:50%;background:#ccc;transition:background var(--vp-ct),transform var(--vp-tt)}html[data-theme=dark] .hint-container.details summary:before{background:#555}.hint-container.details summary:after{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='rgba(0,0,0,0.5)' d='M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z'/%3E%3C/svg%3E");line-height:normal;transition:transform var(--vp-tt);transform:rotate(90deg)}html[data-theme=dark] .hint-container.details summary:after{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='rgba(255,255,255,0.5)' d='M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z'/%3E%3C/svg%3E")}.hint-container.details[open]>summary{margin-bottom:.5em}.hint-container.details[open]>summary:after{transform:rotate(180deg)}:root{--code-demo-header-bg-color: #eee}html[data-theme=dark]{--code-demo-header-bg-color: #333}.vp-code-demo{margin:8px 0;border:1px solid var(--vp-brc);border-radius:8px;transition:all .2s}.vp-code-demo:hover{box-shadow:0 2px 12px var(--card-shadow)}.vp-code-demo-header{position:relative;display:flex;align-items:center;justify-content:space-between;padding:8px 12px;border-radius:8px 8px 0 0;background:var(--code-demo-header-bg-color);text-align:start}.vp-code-demo-header .codepen-button,.vp-code-demo-header .jsfiddle-button{border-width:0;background:transparent;cursor:pointer;position:relative;box-sizing:content-box;width:1.25rem;height:1.25rem;margin:0 4px;padding:4px;border-radius:50%;background:#ccc;outline:none}@media print{.vp-code-demo-header .codepen-button,.vp-code-demo-header .jsfiddle-button{display:none}}html[data-theme=dark] .vp-code-demo-header .codepen-button,html[data-theme=dark] .vp-code-demo-header .jsfiddle-button{background:#555}.vp-code-demo-header .codepen-button svg,.vp-code-demo-header .jsfiddle-button svg{width:1.25rem;height:1.25rem;fill:#777}html[data-theme=dark] .vp-code-demo-header .codepen-button svg,html[data-theme=dark] .vp-code-demo-header .jsfiddle-button svg{fill:#aaa}.vp-code-demo-header .codepen-button:hover,.vp-code-demo-header .jsfiddle-button:hover{background:#aaa}html[data-theme=dark] .vp-code-demo-header .codepen-button:hover,html[data-theme=dark] .vp-code-demo-header .jsfiddle-button:hover{background:#777}.vp-code-demo-header .codepen-button:hover svg,.vp-code-demo-header .jsfiddle-button:hover svg{fill:#333}html[data-theme=dark] .vp-code-demo-header .codepen-button:hover svg,html[data-theme=dark] .vp-code-demo-header .jsfiddle-button:hover svg{fill:#fff}.vp-code-demo-toggle-button{border-width:0;background:transparent;display:inline-block;vertical-align:middle;width:1em;height:1em;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='rgba(0,0,0,0.5)' d='M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z'/%3E%3C/svg%3E");line-height:normal;transition:all .3s;position:relative;margin:8px 12px 8px 8px;border-color:transparent;border-radius:50%;background-color:#ccc;outline:none;font-size:24px;cursor:pointer}html[data-theme=dark] .vp-code-demo-toggle-button{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='rgba(255,255,255,0.5)' d='M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z'/%3E%3C/svg%3E")}.vp-code-demo-toggle-button.down{transform:rotate(180deg)}html[dir=rtl] .vp-code-demo-toggle-button.down{transform:rotate(-180deg)}.vp-code-demo-toggle-button.end{transform:rotate(90deg)}html[dir=rtl] .vp-code-demo-toggle-button.end,.vp-code-demo-toggle-button.start{transform:rotate(-90deg)}html[dir=rtl] .vp-code-demo-toggle-button.start{transform:rotate(90deg)}@media print{.vp-code-demo-toggle-button{display:none}}html[data-theme=dark] .vp-code-demo-toggle-button{background-color:#555}.vp-code-demo-toggle-button:hover{background-color:#aaa}html[data-theme=dark] .vp-code-demo-toggle-button:hover{background-color:#777}.vp-code-demo-title{display:inline-block;vertical-align:top;flex:1;font-weight:500;font-size:1.25rem;line-height:2.5rem}.vp-code-demo-title:first-child{margin-inline-start:.5rem}.vp-code-demo-loading{color:var(--vp-tc)}.vp-code-demo-display{position:relative;overflow:auto;max-height:400px;padding:20px;border-bottom:1px solid var(--vp-brc)}@media print{.vp-code-demo-display{page-break-inside:avoid}}.vp-code-demo-code-wrapper{overflow:hidden;transition:height .5s}@media print{.vp-code-demo-code-wrapper{height:auto!important}}.vp-code-demo-codes>p{margin:.75rem}.vp-code-demo-codes>div[class*=language-]{border-radius:0}@media (max-width: 419px){.vp-code-demo-codes>div[class*=language-]{margin:.8rem 0}.vp-code-demo-codes>div[class*=language-].line-numbers-mode:after{display:none}.vp-code-demo-codes>div[class*=language-] .line-numbers-wrapper{display:none}.vp-code-demo-codes>div[class*=language-] pre[class*=language-]{padding:1.25rem 1.25rem 1rem}}.vp-code-demo-codes>div[class*=language-]:first-child pre{margin-top:0!important}.vp-code-demo-codes>div[class*=language-].language-json{display:none}.vp-code-demo-codes>div[class*=language-].line-numbers-mode:after{border-radius:0}.vp-code-demo-codes>div[class*=language-] button.copy-code-button.fancy{right:0;bottom:0;width:28px;height:28px;border-radius:50% 10% 0}.vp-code-demo-codes>div[class*=language-] button.copy-code-button.fancy svg{position:relative;top:1px;left:1px}:root{--md-demo-header-bg-color: #eee}html[data-theme=dark]{--md-demo-header-bg-color: #333}.vp-md-demo{margin:8px -8px;border:1px solid var(--vp-brc);border-radius:8px;transition:all .2s}.vp-md-demo:hover{box-shadow:0 2px 12px var(--card-shadow)}.vp-md-demo-header{position:relative;padding:8px 12px;border-radius:8px 8px 0 0;background:var(--code-demo-header-bg-color);font-weight:500;font-size:1.25rem;line-height:2.5rem;text-align:start}.vp-md-demo-toggle-button{border-width:0;background:transparent;display:inline-block;vertical-align:middle;width:1em;height:1em;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='rgba(0,0,0,0.5)' d='M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z'/%3E%3C/svg%3E");line-height:normal;transition:all .3s;position:relative;margin:8px 12px 8px 8px;border-color:transparent;border-radius:50%;background-color:#ccc;outline:none;font-size:24px;cursor:pointer}html[data-theme=dark] .vp-md-demo-toggle-button{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='rgba(255,255,255,0.5)' d='M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z'/%3E%3C/svg%3E")}.vp-md-demo-toggle-button.down{transform:rotate(180deg)}html[dir=rtl] .vp-md-demo-toggle-button.down{transform:rotate(-180deg)}.vp-md-demo-toggle-button.end{transform:rotate(90deg)}html[dir=rtl] .vp-md-demo-toggle-button.end,.vp-md-demo-toggle-button.start{transform:rotate(-90deg)}html[dir=rtl] .vp-md-demo-toggle-button.start{transform:rotate(90deg)}@media print{.vp-md-demo-toggle-button{display:none}}html[data-theme=dark] .vp-md-demo-toggle-button{background-color:#555}.vp-md-demo-toggle-button:hover{background-color:#aaa}html[data-theme=dark] .vp-md-demo-toggle-button:hover{background-color:#777}.vp-md-demo-display{position:relative;overflow:auto;padding:8px}@media print{.vp-md-demo-display{page-break-inside:avoid}}.vp-md-demo-code-wrapper{overflow:hidden;transition:height .5s}@media print{.vp-md-demo-code-wrapper{height:auto!important}}.vp-md-demo-codes>div[class*=language-]{border-radius:0}@media (max-width: 419px){.vp-md-demo-codes>div[class*=language-]{margin:.8rem 0}.vp-md-demo-codes>div[class*=language-].line-numbers-mode:after{display:none}.vp-md-demo-codes>div[class*=language-] .line-numbers-wrapper{display:none}.vp-md-demo-codes>div[class*=language-] pre[class*=language-]{padding:1.25rem 1.25rem 1rem}}.vp-md-demo-codes>div[class*=language-] pre{margin-block:0!important}.vp-md-demo-codes>div[class*=language-].line-numbers-mode:after{border-radius:0}.vp-md-demo-codes>div[class*=language-] button.copy-code-button.fancy{right:0;bottom:0;width:28px;height:28px;border-radius:50% 10% 0}.vp-md-demo-codes>div[class*=language-] button.copy-code-button.fancy svg{position:relative;top:1px;left:1px}.theme-hope-content figure{position:relative;display:flex;flex-direction:column;width:auto;margin:1rem auto;text-align:center;transition:transform var(--vp-tt)}.theme-hope-content figure img{overflow:hidden;margin:0 auto;border-radius:8px}.theme-hope-content figure img[tabindex]:hover,.theme-hope-content figure img[tabindex]:focus{box-shadow:2px 2px 10px 0 var(--card-shadow)}@media print{.theme-hope-content figure>a[href^="http://"]:after,.theme-hope-content figure>a[href^="https://"]:after{content:""}}.theme-hope-content figure>a .external-link-icon{display:none}.theme-hope-content figure figcaption{display:inline-block;margin:6px auto;font-size:.8rem}:root{--playground-header-bg-color: #eee}html[data-theme=dark]{--playground-header-bg-color: #333}.vp-playground{overflow:hidden;margin-top:1rem;margin-bottom:1rem;border:1px solid var(--vp-brc);border-radius:6px}@media print{.vp-playground{display:none!important}}.vp-playground-header{display:flex;flex-flow:row wrap;padding:8px 10px;border-bottom:1px solid var(--vp-brc);background:var(--playground-header-bg-color, #eee);font-weight:500;transition:background var(--vp-ct),border-color var(--vp-ct)}.vp-playground-title{flex:1;overflow:hidden;font-size:1.25rem;text-overflow:ellipsis;white-space:nowrap}.vp-playground-actions{display:flex;align-items:center}.vp-playground-action{display:inline-flex;margin-inline-start:10px}.vp-playground-action .icon{width:1.5rem;height:1.5rem;fill:#777}.vp-playground-action:hover .icon{fill:var(--vp-tc)}.vp-playground-container{position:relative;overflow:hidden;background:var(--vp-bg);transition:background var(--vp-ct)}@media print{.vp-playground-container{page-break-inside:avoid}}.vp-playground-container iframe{display:block;width:100%;height:100%;min-height:400px;border:none;resize:vertical}:root{--tab-bg-color: var(--vp-bg);--tab-nav-text-color: var(--vp-c);--tab-nav-bg-color: #e0e0e0;--tab-nav-hover-color: #eee}html[data-theme=dark]{--tab-nav-bg-color: #34343f;--tab-nav-hover-color: #2d2d38}.vp-tabs{margin:1.5rem 0;border:2px solid var(--vp-brc);border-radius:8px}@media (max-width: 419px){.theme-hope-content>.vp-tabs{margin-inline:-1.5rem;border-radius:0}}.vp-tabs-nav{overflow-x:auto;margin:0;padding:0;border-radius:8px 8px 0 0;background:var(--tab-nav-bg-color);list-style:none;white-space:nowrap;transition:background var(--vp-ct)}@media print{.vp-tabs-nav{display:none}}@media (max-width: 419px){.vp-tabs-nav{border-radius:0}}.vp-tab-nav{border-width:0;position:relative;min-width:4rem;margin:0;padding:.5em 1em;border-radius:8px 8px 0 0;background:transparent;color:var(--tab-nav-text-color);font-weight:600;font-size:.85em;line-height:1.75;cursor:pointer;transition:background var(--vp-ct),color var(--vp-ct)}.vp-tab-nav:hover{background:var(--tab-nav-hover-color)}.vp-tab-nav:before,.vp-tab-nav:after{content:" ";position:absolute;bottom:0;z-index:1;width:8px;height:8px}.vp-tab-nav:before{right:100%}.vp-tab-nav:after{left:100%}.vp-tab-nav.active{background:var(--tab-bg-color)}.vp-tab-nav.active:before{background:radial-gradient(16px at left top,transparent 50%,var(--tab-bg-color) 50%)}.vp-tab-nav.active:after{background:radial-gradient(16px at right top,transparent 50%,var(--tab-bg-color) 50%)}.vp-tab-nav:first-child:before{display:none}.vp-tab{display:none;padding:1rem .75rem;background:var(--tab-bg-color);transition:background var(--vp-ct)}@media print{.vp-tab{display:block;padding:.5rem}}.vp-tab.active{display:block}.vp-tab:nth-child(2) .vp-tab-title{border-top:none}.vp-tab-title{display:none;padding:.25rem 0;border-top:1px solid var(--vp-brc);font-weight:500}@media print{.vp-tab-title{display:block}}/*! PhotoSwipe main CSS by Dmytro Semenov | photoswipe.com */.pswp{--pswp-bg: #000;--pswp-placeholder-bg: #222;--pswp-root-z-index: 100000;--pswp-preloader-color: rgba(79, 79, 79, .4);--pswp-preloader-color-secondary: rgba(255, 255, 255, .9);--pswp-icon-color: #fff;--pswp-icon-color-secondary: #4f4f4f;--pswp-icon-stroke-color: #4f4f4f;--pswp-icon-stroke-width: 2px;--pswp-error-text-color: var(--pswp-icon-color)}.pswp{position:fixed;top:0;left:0;width:100%;height:100%;z-index:var(--pswp-root-z-index);display:none;touch-action:none;outline:0;opacity:.003;contain:layout style size;-webkit-tap-highlight-color:rgba(0,0,0,0)}.pswp:focus{outline:0}.pswp *{box-sizing:border-box}.pswp img{max-width:none}.pswp--open{display:block}.pswp,.pswp__bg{transform:translateZ(0);will-change:opacity}.pswp__bg{opacity:.005;background:var(--pswp-bg)}.pswp,.pswp__scroll-wrap{overflow:hidden}.pswp__scroll-wrap,.pswp__bg,.pswp__container,.pswp__item,.pswp__content,.pswp__img,.pswp__zoom-wrap{position:absolute;top:0;left:0;width:100%;height:100%}.pswp__img,.pswp__zoom-wrap{width:auto;height:auto}.pswp--click-to-zoom.pswp--zoom-allowed .pswp__img{cursor:zoom-in}.pswp--click-to-zoom.pswp--zoomed-in .pswp__img{cursor:move;cursor:grab}.pswp--click-to-zoom.pswp--zoomed-in .pswp__img:active{cursor:grabbing}.pswp--no-mouse-drag.pswp--zoomed-in .pswp__img,.pswp--no-mouse-drag.pswp--zoomed-in .pswp__img:active,.pswp__img{cursor:zoom-out}.pswp__container,.pswp__img,.pswp__button,.pswp__counter{-webkit-user-select:none;-moz-user-select:none;user-select:none}.pswp__item{z-index:1;overflow:hidden}.pswp__hidden{display:none!important}.pswp__content{pointer-events:none}.pswp__content>*{pointer-events:auto}.pswp__error-msg-container{display:grid}.pswp__error-msg{margin:auto;font-size:1em;line-height:1;color:var(--pswp-error-text-color)}.pswp .pswp__hide-on-close{opacity:.005;will-change:opacity;transition:opacity var(--pswp-transition-duration) cubic-bezier(.4,0,.22,1);z-index:10;pointer-events:none}.pswp--ui-visible .pswp__hide-on-close{opacity:1;pointer-events:auto}.pswp__button{position:relative;display:block;width:50px;height:60px;padding:0;margin:0;overflow:hidden;cursor:pointer;background:none;border:0;box-shadow:none;opacity:.85;-webkit-appearance:none;-webkit-touch-callout:none}.pswp__button:hover,.pswp__button:active,.pswp__button:focus{transition:none;padding:0;background:none;border:0;box-shadow:none;opacity:1}.pswp__button:disabled{opacity:.3;cursor:auto}.pswp__icn{fill:var(--pswp-icon-color);color:var(--pswp-icon-color-secondary)}.pswp__icn{position:absolute;top:14px;left:9px;width:32px;height:32px;overflow:hidden;pointer-events:none}.pswp__icn-shadow{stroke:var(--pswp-icon-stroke-color);stroke-width:var(--pswp-icon-stroke-width);fill:none}.pswp__icn:focus{outline:0}div.pswp__img--placeholder,.pswp__img--with-bg{background:var(--pswp-placeholder-bg)}.pswp__top-bar{position:absolute;left:0;top:0;width:100%;height:60px;display:flex;flex-direction:row;justify-content:flex-end;z-index:10;pointer-events:none!important}.pswp__top-bar>*{pointer-events:auto;will-change:opacity}.pswp__button--close{margin-right:6px}.pswp__button--arrow{position:absolute;width:75px;height:100px;top:50%;margin-top:-50px}.pswp__button--arrow:disabled{display:none;cursor:default}.pswp__button--arrow .pswp__icn{top:50%;margin-top:-30px;width:60px;height:60px;background:none;border-radius:0}.pswp--one-slide .pswp__button--arrow{display:none}.pswp--touch .pswp__button--arrow{visibility:hidden}.pswp--has_mouse .pswp__button--arrow{visibility:visible}.pswp__button--arrow--prev{right:auto;left:0}.pswp__button--arrow--next{right:0}.pswp__button--arrow--next .pswp__icn{left:auto;right:14px;transform:scaleX(-1)}.pswp__button--zoom{display:none}.pswp--zoom-allowed .pswp__button--zoom{display:block}.pswp--zoomed-in .pswp__zoom-icn-bar-v{display:none}.pswp__preloader{position:relative;overflow:hidden;width:50px;height:60px;margin-right:auto}.pswp__preloader .pswp__icn{opacity:0;transition:opacity .2s linear;animation:pswp-clockwise .6s linear infinite}.pswp__preloader--active .pswp__icn{opacity:.85}@keyframes pswp-clockwise{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.pswp__counter{height:30px;margin-top:15px;margin-inline-start:20px;font-size:14px;line-height:30px;color:var(--pswp-icon-color);text-shadow:1px 1px 3px var(--pswp-icon-color-secondary);opacity:.85}.pswp--one-slide .pswp__counter{display:none}.photo-swipe-loading{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:center}.photo-swipe-bullets-indicator{position:absolute;bottom:30px;left:50%;display:flex;flex-direction:row;align-items:center;transform:translate(-50%)}.photo-swipe-bullet{width:12px;height:6px;margin:0 5px;border-radius:3px;background:#fff;transition:width var(--vp-tt),color var(--vp-ct)}.photo-swipe-bullet.active{width:30px;background:var(--vp-tc)}@keyframes shake{0%,to{transform:translate(0)}10%{transform:translate(-9px)}20%{transform:translate(8px)}30%{transform:translate(-7px)}40%{transform:translate(6px)}50%{transform:translate(-5px)}60%{transform:translate(4px)}70%{transform:translate(-3px)}80%{transform:translate(2px)}90%{transform:translate(-1px)}}.vp-decrypt-layer{display:flex;flex-direction:column;align-items:center;justify-content:center;height:calc(80vh - var(--navbar-height));margin-top:var(--navbar-height);text-align:center}.vp-decrypt-layer.expand{margin-top:0}.vp-decrypt-modal{width:calc(100% - 8rem);max-width:420px;margin:2rem;padding:2rem;border-radius:1.5rem;box-shadow:2px 2px 10px 6px var(--card-shadow);transition:box-shadow var(--color-transition)}@media (max-width: 719px){.vp-decrypt-modal{width:calc(100% - 5rem);padding:1.5rem}}@media (max-width: 419px){.vp-decrypt-modal{width:calc(100% - 3rem);box-shadow:none}}.vp-decrypt-hint{margin-bottom:20px;font-weight:600;font-size:1.5rem;line-height:2}.vp-decrypt-hint.tried{color:red;animation-name:shake;animation-duration:.5s;animation-timing-function:ease-out;animation-fill-mode:both}.vp-decrypt-hint svg{width:1.25em;height:1.25em}.vp-decrypt-input input{width:calc(100% - 3rem);padding:0 1.5rem;border:2px solid var(--theme-color);border-radius:.5rem;background:var(--bg-color)!important;color:var(--black)!important;outline:none;font-size:1.25rem;line-height:2;transition:background var(--color-transition),color var(--color-transition)}.vp-remember-password{margin-top:.5rem;color:var(--dark-grey);font-size:14px;text-align:start}.vp-remember-password input[type=checkbox]{position:relative;vertical-align:text-bottom;width:0;margin-inline-end:18px;cursor:pointer}.vp-remember-password input[type=checkbox]:after{content:" ";position:absolute;top:0;display:inline-block;box-sizing:border-box;width:14px;height:14px;padding-inline-start:0;border:1px solid #ddd;border-radius:50%;background:#fff;text-align:center;visibility:visible;transition:background var(--color-transition),border-color var(--color-transition)}html[data-theme=dark] .vp-remember-password input[type=checkbox]:after{border-color:#666;background:#333}.vp-remember-password input[type=checkbox]:checked:after{content:"";border-color:var(--theme-color);background:var(--theme-color)}html[data-theme=dark] .vp-remember-password input[type=checkbox]:checked:after{border-color:var(--theme-color);background:var(--theme-color)}.vp-remember-password input[type=checkbox]:checked:before{content:"";position:absolute;top:2px;inset-inline-start:5px;z-index:1;width:2px;height:6px;border:solid var(--white);border-width:0 2px 2px 0;transform:rotate(45deg)}.vp-decrypt-submit{background:transparent;cursor:pointer;width:70px;margin-top:1.5rem;border-width:0;border-radius:.5rem;background:var(--theme-color);color:var(--bg-color);outline:none;font-size:1.2rem;line-height:2;transition:color var(--color-transition)}.vp-decrypt-submit:hover{background:var(--theme-color-light)}:root{--navbar-bg-color: var(--bg-color-float-blur);--sidebar-bg-color: var(--bg-color-blur)}html[data-theme=dark]{--navbar-bg-color: var(--bg-color-blur);--sidebar-bg-color: var(--bg-color-blur)}#app{--code-hl-bg-color: var(--code-highlight-line-color);--code-ln-color: var(--code-line-color);--code-ln-wrapper-width: var(--line-numbers-width);--code-tabs-nav-text-color: var(--code-color);--code-tabs-nav-bg-color: var(--code-border-color);--code-tabs-nav-hover-color: var(--code-highlight-line-color);--sidebar-space: var(--sidebar-width)}@media (max-width: 959px){#app{--navbar-height: var(--navbar-mobile-height);--navbar-vertical-padding: var(--navbar-mobile-vertical-padding);--navbar-horizontal-padding: var(--navbar-mobile-horizontal-padding);--sidebar-width: var(--sidebar-mobile-width)}}@media (min-width: 1440px){#app{--sidebar-space: clamp( var(--sidebar-width), max(0px, calc((100vw - var(--content-width)) / 2 - 2rem)), 100vw )}}.DocSearch-Button,.DocSearch{--docsearch-primary-color: var(--vp-tc);--docsearch-text-color: var(--vp-c);--docsearch-highlight-color: var(--vp-tc);--docsearch-muted-color: var(--light-grey);--docsearch-container-background: rgb(9 10 17 / 80%);--docsearch-modal-background: var(--bg-color-float);--docsearch-searchbox-background: var(--bg-color-secondary);--docsearch-searchbox-focus-background: var(--vp-bg);--docsearch-searchbox-shadow: inset 0 0 0 2px var(--vp-tc);--docsearch-hit-color: var(--vp-cl);--docsearch-hit-active-color: var(--vp-bg);--docsearch-hit-background: var(--vp-bg);--docsearch-hit-shadow: 0 1px 3px 0 var(--border-color);--docsearch-footer-background: var(--vp-bg)}html[data-theme=dark] .DocSearch-Button,html[data-theme=dark] .DocSearch{--docsearch-logo-color: var(--vp-c);--docsearch-modal-shadow: inset 1px 1px 0 0 #2c2e40, 0 3px 8px 0 #000309;--docsearch-key-shadow: inset 0 -2px 0 0 #282d55, inset 0 0 1px 1px #51577d, 0 2px 2px 0 rgb(3 4 9 / 30%);--docsearch-key-gradient: linear-gradient(-225deg, #444950, #1c1e21);--docsearch-footer-shadow: inset 0 1px 0 0 rgb(73 76 106 / 50%), 0 -4px 8px 0 rgb(0 0 0 / 20%)}#nprogress{--nprogress-color: var(--vp-tc)}.search-box{--search-bg-color: var(--vp-bg);--search-accent-color: var(--vp-tc);--search-text-color: var(--vp-c);--search-border-color: var(--border-color);--search-item-text-color: var(--vp-clt);--search-item-focus-bg-color: var(--bg-color-secondary)}.external-link-icon{--external-link-icon-color: var(--light-grey)}html,body{margin:0;padding:0;background:#fff}html{font-size:16px;font-display:optional;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-webkit-tap-highlight-color:transparent}@media print{html{font-size:12pt}}body{min-height:100vh;color:#2c3e50}a{color:#3eaf7c;font-weight:500;text-decoration:none;overflow-wrap:break-word}kbd{display:inline-block;min-width:1em;margin-inline:.125rem;padding:.25em;border:1px solid #eee;border-radius:.25em;box-shadow:1px 1px 4px #00000026;line-height:1;letter-spacing:-.1em;text-align:center}code{margin:0;padding:.2rem .4rem;border-radius:5px;background:rgba(127,127,127,.12);font-size:.85em;overflow-wrap:break-word}table code{padding:.1rem .4rem}p a code{color:#3eaf7c;font-weight:400}strong{font-weight:600}h1,h2,h3,h4,h5,h6{font-weight:500;line-height:1.25;overflow-wrap:break-word}h1:hover .header-anchor,h2:hover .header-anchor,h3:hover .header-anchor,h4:hover .header-anchor,h5:hover .header-anchor,h6:hover .header-anchor{opacity:1}h1{font-size:2rem}h2{padding-bottom:.3rem;border-bottom:1px solid #eaecef;font-size:1.65rem}h3{font-size:1.35rem}h4{font-size:1.15rem}h5{font-size:1.05rem}h6{font-size:1rem}a.header-anchor{float:left;margin-top:.125em;margin-inline-start:-.87em;padding-inline-end:.23em;font-size:.85em;opacity:0;transition:opacity .2s}@media print{a.header-anchor{display:none!important}}a.header-anchor:hover{text-decoration:none}a.header-anchor:focus-visible{opacity:1}p,ul,ol{line-height:1.6;overflow-wrap:break-word}@media print{p,ul,ol{line-height:1.5}}ul,ol{padding-inline-start:1.2em}blockquote{margin:1rem 0;padding:.25rem 0 .25rem 1rem;border-inline-start:.2rem solid #ddd;color:#666;font-size:1rem;overflow-wrap:break-word}blockquote>p{margin:0}hr{border:0;border-top:1px solid #eaecef}table{display:block;overflow-x:auto;margin:1rem 0;border-collapse:collapse}tr:nth-child(2n){background:#f6f8fa}th,td{padding:.6em 1em;border:1px solid #dfe2e5}pre{direction:ltr}@page{margin:2cm;font-size:12pt;size:a4}@media print{*,:after,:before{box-shadow:none!important;text-shadow:none!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}a{color:inherit;font-weight:inherit!important;font-size:inherit!important;text-decoration:underline}a[href^="http://"]:after,a[href^="https://"]:after{content:" (" attr(href) ") "}abbr[title]:after{content:" (" attr(title) ")"}pre{border:1px solid #eee;white-space:pre-wrap!important}pre>code{white-space:pre-wrap!important}blockquote{border-inline-start:.2rem solid #ddd;color:inherit}blockquote,pre{orphans:5;widows:5}img,tr,canvas{page-break-inside:avoid}}@font-face{font-weight:400;font-style:normal;font-family:Crimson;src:url(data:font/truetype;charset=utf-8;base64,AAEAAAANAIAAAwBQRkZUTYr5mwEAAAyMAAAAHEdERUYAKQATAAAMbAAAAB5PUy8yVsJ0MgAAAVgAAABgY21hcBiKDzgAAAHcAAABWGdhc3D//wADAAAMZAAAAAhnbHlmr+DBdQAAA1AAAAdsaGVhZBZwt+8AAADcAAAANmhoZWEFawEuAAABFAAAACRobXR4BksA9gAAAbgAAAAibG9jYQlsC24AAAM0AAAAHG1heHAAEQBZAAABOAAAACBuYW1lLaFDVAAACrwAAAFrcG9zdAC1AHoAAAwoAAAAPAABAAAAAQAAqBd2H18PPPUACwQAAAAAANqqufwAAAAA2qq5/AAb/9wB4QMeAAAACAACAAAAAAAAAAEAAAMs/ywAXAH9AAAAAAHhAAEAAAAAAAAAAAAAAAAAAAAEAAEAAAANAFkAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAH1AZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAIABgMAAAAAAAAAAAABEAAAAAAAAAAAAAAAUGZFZADAADAAOQMs/ywAXAMsANQAAAABAAAAAAMYAAAAAAAgAAEBpwAfAAAAAAFVAAAB/QAfAH0ALQA+ABsAPgAyACgAPgAxAAAAAAADAAAAAwAAABwAAQAAAAAAUgADAAEAAAAcAAQANgAAAAQABAABAAAAOf//AAAAL///AAAAAQAEAAAAAAADAAQABQAGAAcACAAJAAoACwAMAAABBgAAAQAAAAAAAAABAgAAAAIAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAwQFBgcICQoLDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYAJgAmAGIAwAEeAZIBzgJAApYC2gNiA7YAAQAf/9wBhwMeABIAAAEGBwYHATAXFjM2NzY3ASYnJjcBgxwLCgH+zgMECxIKCgIBLgEDAwMDHhQFBgP85wMEAQgJBgMOAwMDEwAAAAIAH//9Ad0CkAAQACEAABMWFxYXNjc2NzQnJicGBwYHNyY3NjcWFxYXFAcGByYnJjcfATo6amo7OQE5OmxrOjkBXQIlJEE5IyIBIyJEOSQjAgFOkV5eBAReXoqJXl4EBF5eggJ0UlEDA09Qe3xVVgMDU1OEAAAAAAEAff/9AYACkQA+AAA3FAcGBwYHBiMGFQYXNjc2MzIXFhc2JzQnIicmJyY1JjURNjc2MSYnJicjBgcGBwYVFBUUFxYXNjc2NzIXFhXkAQEEBRgYDAMBBB4ZGhweGxofBAEDDBgZBQQBAQMEAQIDBAIFNTZCAgMDBA0XFw0LBQV3GBMVDAgEBAUKCgUCAQICAQIFCgoFBAQIDBUTGAGnLxkbBAYFAQIZGh4BAgECBQUEAwUHBwEICRYAAAAAAQAtAAAB0QKRADoAADcGFxYXITY3NjcmJyYjIgcGBwYHBisBNjc2NzY3NjUmJyYnBgcGBxQXFhc2NzY3FhcWFxYHBgcGBwYHLgEEAwMBYwURERADBwYFBAMDAg8VEx/LJkBAOhsQDwIxMkxSMjIHCAYGCSYmPTIfHwEBCgoeLkJBQg8EBQQCETAwKQICAgEBBCgUEylJSUYhJicsRDIzAgY1NRoEBQYBEyEhAwEjIjYlJCQtQlBQSAAAAAABAD7/+wG+ApEASgAANwYXFhcWFxYzNjc2NyYnJic2NzY3JicmIwYHBgcUFxYXNjc2NxYXFhcGBwYHBgcUFRQXNjc2NxYXFhcGBwYnIicmJyYnJiciBwYXPwEIBwUaHB0VZU5NBAMvLi8eIB4DAywsKzwrKxgEAwUIHR4wLRscAQMvLz8BAQYKEhEQNSYmAgImJSsWExQPCw0NFREMDQE7DgsLBQwFBgE8PWpMKSoGECQkMkAiIQIdHyUHBwcBCRscAwEbGSpCIyUOAgMCAwwIAwUEAQEoKD9XJSQBBQYODg8PAQ0NFQAAAgAb//oB4QKTACIAJQAANxQXFhchFRQXFjMyNzYjNTM2NzY1NCcmJyMRNCcmIwYHBgcBExEbAgMFASEJCRIdCAkBRgIBAQUEBTwFAwgHCQkG/vjmxgUGBgOwBQIBAwKzAgQDCBAMDQEBlAYGBgEICQf+cwEs/tQAAQA+//sBvgKTAEoAADcGFxYXFhcWMzY3NjcmJyYnIgcGBzY3NjczMjc2NzY3NjU0JyYnBgcGByMGBwYHFBcWMzY3NjMWFxYHBgcGJyInJicmJyYnIgcGFz8BCAcFGhwdFWVOTQQBMjJbFx8gFwoJCQlWKB0dFQ4JCAQDBQMdHSKXCREQEgMCBA4bGhNYJyUBAiYlKxYTFA8LDQ0VEQwNATsOCwsFDAUGATw9akU2NwMFBggrMC8uAgICExcZBgQCAgMBAwQBMVNUWAUFBAYFBAMxMTNZIyQBBQYODg8PAQ0NFQAAAgAy//oBzQKXACAAMwAANxQXFhc2NzY3NicmJyIHBgc2NzY3NCcmJwYHBgcGBwYXNyY3Njc2FxYXFgcGBwYHJicmNzM1NV5aOTsCAioqahoiIRsnWFhFAwIHQ0tMOTAZGQFbBAQaGxkXRB8fAQEfIDE9Hh4E511FRwQDPT1ZPEJBBQwLF4Y9PRMGCwwBEiwsPDZFRkkTHyAbCAcBAjAwREYsLQEFREVQAAAAAAEAKP/7AdUCiwApAAATFhcWMzI3Njc2NzYzIQYHBgcWFxYzMjcBNjc2NzQnJiMiBwYjIQYHBgcoAwYHAwYDAwELEBEdAQUJYWJXAQ8PDgcDAQ4LCQgBAQEEBhUVFv7JBgsNDAH6DQMCAQEFKRITFMjHjQcFBgMCPxYSEwoEAgMBAhkrKiAAAAADAD7/9wG/ApIAKABBAFgAADcGFxYXNjc2NyYnJicmJzQ3Njc2NyYnJiMGBwYHFhcWFxYVFAcGBwYHNyY3Njc2MzIzMhcyFxYXFhcGBwYHIicmNxMmNzY3FhcWFRQHBgcGByIjIicmJyY3PwE1M1ZQODgDAykpMQIBAyYlJQMCMC9HRjExAgIiIiMCAiMvLwNTBBQTKgEBAQECAQIBEjU1CAEdHjMrISICGAMYGSYvGxoTEx8CAQIBBAMfJCQBoU8tLQECMjFPOC4uGwIBAgEWJiU7SCYoAjEwQzopKhMBAgECEykpQAQsIiEbAQEBBywsQjUeHQEiI0QBZSMhIAECJiYvKh8gFAEBAhAfIEYAAAIAMf/6AcsClwAgADMAABMGFxYXMjc2NwYHBgcUFxYXNjc2NzY3NjUmJyYnBgcGBzcmNzY3FhcWFRQHBgcGJyYnJjc0AyopahoiIRsoV1hFAwIHQ0tMODEZGQE2NF5ZOjoBWgMfHzE9Hh4EGhoaF0QeHwUBy0dBQgUMCxeFPj0SBwsLAREsLD01RkVPV0dFBQQ8PU8UPCwtAQVFRUklIRsHCAECMDBPAAAADACWAAEAAAAAAAEABwAQAAEAAAAAAAIABwAoAAEAAAAAAAMABwBAAAEAAAAAAAQABwBYAAEAAAAAAAUAHgCeAAEAAAAAAAYABwDNAAMAAQQJAAEADgAAAAMAAQQJAAIADgAYAAMAAQQJAAMADgAwAAMAAQQJAAQADgBIAAMAAQQJAAUAPABgAAMAAQQJAAYADgC9AEMAcgBpAG0AcwBvAG4AAENyaW1zb24AAEMAcgBpAG0AcwBvAG4AAENyaW1zb24AAEMAcgBpAG0AcwBvAG4AAENyaW1zb24AAEMAcgBpAG0AcwBvAG4AAENyaW1zb24AAFYAZQByAHMAaQBvAG4AIAAxAC4AMAA7ACAARgBvAG4AdABFAGQAaQB0AG8AcgAgACgAdgAxAC4AMAApAABWZXJzaW9uIDEuMDsgRm9udEVkaXRvciAodjEuMCkAAEMAcgBpAG0AcwBvAG4AAENyaW1zb24AAAACAAAAAAAAADIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0AAAABAAIAEwAUABUAFgAXABgAGQAaABsAHAAAAAH//wACAAEAAAAMAAAAFgAAAAIAAQADAAwAAQAEAAAAAgAAAAAAAAABAAAAANWkJwgAAAAA2qq5/AAAAADaqrn8) format("truetype")}html,body{background:var(--bg-color);transition:background var(--color-transition)}:root{color-scheme:light}html[data-theme=dark]{color-scheme:dark}body{color:var(--text-color);font-family:var(--font-family)}@media (min-width: 1440px){body{font-size:17px}}a{color:var(--theme-color)}kbd{border-color:var(--border-color-dark);background:var(--bg-color-secondary);font-family:var(--font-family-mono)}code{font-family:var(--font-family-mono);transition:background var(--color-transition),color var(--color-transition)}html[data-theme=dark] code{background:#333}p a code{color:var(--theme-color)}blockquote{border-color:#eee;color:#666;transition:border-color var(--color-transition),color var(--color-transition)}html[data-theme=dark] blockquote{border-color:#333}h1,h2,h3,h4,h5,h6{font-family:var(--font-family-heading)}@media (max-width: 419px){h1{font-size:1.9rem}}h2{border-color:var(--border-color);transition:border-bottom-color var(--color-transition)}hr{border-color:var(--border-color);transition:border-top-color var(--color-transition)}tr:nth-child(2n){background:var(--bg-color-secondary)}th,td{border-color:var(--border-color-dark)}@media print{@page{--text-color: #000 !important;--bg-color: #fff !important}div[class*=language-]{position:relative!important}}.theme-hope-content:not(.custom)>*:first-child{margin-top:0}.vp-breadcrumb{max-width:var(--content-width, 740px);margin-inline:auto;padding-inline:2.5rem;position:relative;z-index:2;padding-top:1rem;font-size:15px}@media (max-width: 959px){.vp-breadcrumb{padding-inline:1.5rem}}@media print{.vp-breadcrumb{max-width:unset}}@media (max-width: 959px){.vp-breadcrumb{font-size:14px}}@media (max-width: 419px){.vp-breadcrumb{padding-top:.5rem;font-size:12.8px}}@media print{.vp-breadcrumb{display:none}}.vp-breadcrumb .icon{margin-inline-end:.25em;font-size:1em}.vp-breadcrumb img.icon{vertical-align:-.125em;height:1em}.vp-breadcrumb a{display:inline-block;padding:0 .5em}.vp-breadcrumb a:before{position:relative;bottom:.125rem;margin-inline-end:.25em}.vp-breadcrumb a:hover{color:var(--theme-color)}.vp-breadcrumb ol{margin:0;padding-inline-start:0;list-style:none}.vp-breadcrumb li{display:inline-block;line-height:1.5}.vp-breadcrumb li:first-child a{padding-inline-start:0}.vp-breadcrumb li:last-child a{padding-inline-end:0}.vp-breadcrumb li.is-active a{color:var(--light-grey);cursor:default;pointer-events:none}.vp-breadcrumb li+li:before{content:"/";color:var(--light-grey)}.toggle-sidebar-wrapper{position:fixed;top:var(--navbar-height);bottom:0;inset-inline-start:var(--sidebar-space);z-index:100;display:flex;align-items:center;justify-content:center;font-size:2rem;transition:inset-inline-start var(--transform-transition)}@media (max-width: 719px){.toggle-sidebar-wrapper{display:none}}@media (min-width: 1440px){.toggle-sidebar-wrapper{display:none}}.toggle-sidebar-wrapper:hover{background:rgba(127,127,127,.05);cursor:pointer}.toggle-sidebar-wrapper .arrow{display:inline-block;vertical-align:middle;width:1em;height:1em;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='rgba(0,0,0,0.5)' d='M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z'/%3E%3C/svg%3E");line-height:normal;transition:all .3s}html[data-theme=dark] .toggle-sidebar-wrapper .arrow{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='rgba(255,255,255,0.5)' d='M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z'/%3E%3C/svg%3E")}.toggle-sidebar-wrapper .arrow.down{transform:rotate(180deg)}html[dir=rtl] .toggle-sidebar-wrapper .arrow.down{transform:rotate(-180deg)}.toggle-sidebar-wrapper .arrow.end{transform:rotate(90deg)}html[dir=rtl] .toggle-sidebar-wrapper .arrow.end,.toggle-sidebar-wrapper .arrow.start{transform:rotate(-90deg)}html[dir=rtl] .toggle-sidebar-wrapper .arrow.start{transform:rotate(90deg)}.theme-container{display:flex;flex-direction:column;justify-content:space-between;min-height:100vh}.theme-container .vp-page{padding-top:var(--navbar-height);padding-inline-start:calc(var(--sidebar-space) + 2rem)}@media (max-width: 719px){.theme-container .vp-page{padding-inline:0}}@media (min-width: 1440px){.theme-container .vp-page{padding-inline-end:calc(100vw - var(--content-width) - var(--sidebar-space) - 6rem)}}.theme-container .vp-sidebar{top:var(--navbar-height)}.theme-container.no-navbar .vp-page{padding-top:0}.theme-container.no-navbar .vp-sidebar{top:0}@media (max-width: 719px){.theme-container.no-navbar .vp-sidebar{top:0}}@media (max-width: 719px){.theme-container.hide-navbar .vp-sidebar{top:0}}.theme-container.sidebar-collapsed .vp-page{padding-inline-start:0}.theme-container.sidebar-collapsed .vp-sidebar{box-shadow:none;transform:translate(-100%)}html[dir=rtl] .theme-container.sidebar-collapsed .vp-sidebar{transform:translate(100%)}.theme-container.sidebar-collapsed .toggle-sidebar-wrapper{inset-inline-start:0}.theme-container.no-sidebar .vp-page{padding-inline:0}@media (min-width: 1440px){.theme-container.no-sidebar.has-toc .vp-page{padding-inline-end:16rem}}.theme-container.no-sidebar .vp-toggle-sidebar-button,.theme-container.no-sidebar .toggle-sidebar-wrapper,.theme-container.no-sidebar .vp-sidebar{display:none}.theme-container.sidebar-open .vp-sidebar{box-shadow:2px 0 8px var(--card-shadow);transform:translate(0)}.fade-slide-y-enter-active{transition:all .3s ease!important}.fade-slide-y-leave-active{transition:all .3s cubic-bezier(1,.5,.8,1)!important}.fade-slide-y-enter-from,.fade-slide-y-leave-to{opacity:0;transform:translateY(10px)}.vp-feature-wrapper{position:relative}.vp-feature-bg{position:absolute;top:0;right:0;bottom:0;left:0;z-index:0;background-attachment:fixed;background-position:50%;background-size:cover}.vp-feature-bg.light{display:inline-block}.vp-feature-bg.dark,html[data-theme=dark] .vp-feature-bg.light{display:none}html[data-theme=dark] .vp-feature-bg.dark{display:inline-block}.vp-feature{position:relative;z-index:1;margin:0 auto;padding:1.5rem 1rem;color:var(--text-color-lighter);text-align:center}.vp-feature-bg+.vp-feature{color:#222}html[data-theme=dark] .vp-feature-bg+.vp-feature{color:#eee}.vp-feature-bg+.vp-feature .icon{color:inherit}.vp-feature-image{height:10rem;margin:0 auto}@media (max-width: 959px){.vp-feature-image{height:8rem}}.vp-feature-image.light{display:inline-block}.vp-feature-image.dark,html[data-theme=dark] .vp-feature-image.light{display:none}html[data-theme=dark] .vp-feature-image.dark{display:inline-block}.vp-feature-header{margin-bottom:1.5rem;border-bottom:none;font-size:3rem;font-family:var(--font-family);text-align:center}@media (max-width: 959px){.vp-feature-header{font-size:2.5rem}}@media (max-width: 719px){.vp-feature-header{font-size:2.25rem}}@media (max-width: 419px){.vp-feature-header{font-size:2rem}}.vp-feature-description{font-size:1.125rem}.vp-features{z-index:1;display:flex;flex-wrap:wrap;align-items:stretch;place-content:stretch center;margin:1rem 0;text-align:start}@media print{.vp-features{display:block}}.vp-features:first-child{border-top:1px solid var(--border-color);transition:border-color var(--color-transition)}.vp-feature-item{position:relative;display:block;flex-basis:calc(33% - 3rem);margin:.5rem;padding:1rem;border-radius:.5rem;color:inherit;transition:background var(--color-transition),box-shadow var(--color-transition),transform var(--transform-transition)}@media (min-width: 1440px){.vp-feature-item{flex-basis:calc(25% - 3rem)}}@media (max-width: 959px){.vp-feature-item{flex-basis:calc(50% - 3rem)}}@media (max-width: 719px){.vp-feature-item{flex-basis:100%;font-size:.95rem}}@media (max-width: 419px){.vp-feature-item{margin:.5rem 0;font-size:.9rem}}.vp-feature-item.link{cursor:pointer}@media print{.vp-feature-item.link{text-decoration:none}}.vp-feature-item .icon{display:inline-block;height:1.1em;margin-inline-end:.5rem;color:var(--theme-color);font-weight:400;font-size:1.1em}.vp-feature-item:hover{background-color:var(--bg-color-secondary);box-shadow:0 2px 12px 0 var(--card-shadow);transform:translate(-2px,-2px);transform:scale(1.05)}.vp-feature-bg+.vp-feature .vp-feature-item:hover{background-color:transparent}.vp-feature-item:only-child{flex-basis:100%}.vp-feature-item:first-child:nth-last-child(2),.vp-feature-item:nth-child(2):last-child{flex-basis:calc(50% - 3rem)}@media (max-width: 719px){.vp-feature-item:first-child:nth-last-child(2),.vp-feature-item:nth-child(2):last-child{flex-basis:100%}}.vp-feature-title{margin:.25rem 0 .5rem;font-weight:700;font-size:1.3rem;font-family:var(--font-family)}@media (max-width: 419px){.vp-feature-title{font-size:1.2rem}}.vp-feature-details{margin:0;line-height:1.4}.vp-footer-wrapper{position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-evenly;padding-block:.75rem;padding-inline:calc(var(--sidebar-space) + 2rem) 2rem;border-top:1px solid var(--border-color);background:var(--bg-color);color:var(--dark-grey);text-align:center;transition:border-top-color var(--color-transition),background var(--color-transition),padding var(--transform-transition)}@media (max-width: 719px){.vp-footer-wrapper{padding-inline-start:2rem}}@media (min-width: 1440px){.vp-footer-wrapper{z-index:50;padding-inline-start:2rem}}@media print{.vp-footer-wrapper{margin:0!important;padding:0!important}}@media (max-width: 419px){.vp-footer-wrapper{display:block}}.no-sidebar .vp-footer-wrapper,.sidebar-collapsed .vp-footer-wrapper{padding-inline-start:2rem}.vp-footer{margin:.5rem 1rem;font-size:14px}@media print{.vp-footer{display:none}}.vp-copyright{margin:6px 0;font-size:13px}.vp-page:not(.not-found)+.vp-footer-wrapper{margin-top:-2rem}.vp-hero-info-wrapper{position:relative;display:flex;align-items:center;justify-content:center;margin-inline:auto}.vp-hero-info-wrapper.fullscreen{height:calc(100vh - var(--navbar-height))!important}.vp-hero-info{z-index:1;width:100%;padding-inline:2.5rem}@media (max-width: 959px){.vp-hero-info{padding-inline:1.5rem}}@media (min-width: 959px){.vp-hero-info{display:flex;align-items:center;justify-content:space-evenly}}.vp-hero-mask{position:absolute;top:0;right:0;bottom:0;left:0;z-index:0;background-position:50%;background-size:cover}.vp-hero-mask:after{content:" ";position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;display:block}.vp-hero-mask.light{display:block}html[data-theme=dark] .vp-hero-mask.light,.vp-hero-mask.dark{display:none}html[data-theme=dark] .vp-hero-mask.dark{display:block}.vp-hero-infos{z-index:1;margin:0 .5rem}.vp-hero-image{display:block;max-width:100%;max-height:18rem;margin:1rem}@media (max-width: 959px){.vp-hero-image{margin:2rem auto}}@media (max-width: 719px){.vp-hero-image{max-height:16rem;margin:1.5rem auto}}@media (max-width: 419px){.vp-hero-image{max-height:14rem}}.vp-hero-image.light{display:block}html[data-theme=dark] .vp-hero-image.light,.vp-hero-image.dark{display:none}html[data-theme=dark] .vp-hero-image.dark{display:block}#main-title{margin:.5rem 0;background:linear-gradient(120deg,var(--theme-color-light),var(--theme-color) 30%,#1631a0 100%);-webkit-background-clip:text;background-clip:text;font-weight:700;font-size:3.6rem;font-family:var(--font-family);line-height:1.5;-webkit-text-fill-color:transparent}@media (max-width: 719px){#main-title{margin:0}}@media (max-width: 959px){#main-title{font-size:2.5rem;text-align:center}}@media (max-width: 719px){#main-title{font-size:2.25rem;text-align:center}}@media (max-width: 419px){#main-title{margin:0 auto;font-size:2rem}}.vp-description,.vp-actions{margin:1.8rem 0}@media (max-width: 719px){.vp-description,.vp-actions{margin:1.5rem 0}}@media (max-width: 959px){.vp-description,.vp-actions{margin:1.5rem auto;text-align:center}}@media (max-width: 419px){.vp-description,.vp-actions{margin:1.2rem 0}}.vp-description{max-width:35rem;color:var(--text-color-light);font-weight:500;font-size:1.6rem;line-height:1.3}@media (max-width: 719px){.vp-description{font-size:1.4rem}}@media (max-width: 419px){.vp-description{font-size:1.2rem}}.vp-action{display:inline-block;overflow:hidden;min-width:4rem;margin:.5rem;padding:.5em 1.5rem;border-radius:2rem;background:var(--bg-color-secondary);color:var(--text-color);font-size:1.2rem;text-align:center;transition:color var(--color-transition),color var(--color-transition),transform var(--transform-transition)}@media (max-width: 719px){.vp-action{padding:.5rem 1rem;font-size:1.1rem}}@media (max-width: 419px){.vp-action{font-size:1rem}}@media print{.vp-action{text-decoration:none}}.vp-action:hover{background:var(--bg-color-tertiary)}.vp-action.primary{border-color:var(--theme-color);background:var(--theme-color);color:var(--white)}.vp-action.primary:hover{border-color:var(--theme-color-light);background:var(--theme-color-light)}.vp-project-home:not(.pure) .vp-action:active{transform:scale(.96)}.vp-highlight-wrapper{position:relative;display:flex;align-items:center;justify-content:center}.vp-highlight-wrapper:nth-child(2n) .vp-highlight{flex-direction:row-reverse}.vp-highlight{z-index:1;display:flex;flex:1;align-items:center;justify-content:flex-end;max-width:var(--home-page-width);margin:0 auto;padding:1.5rem 2.5rem;color:#222}@media (max-width: 719px){.vp-highlight{display:block;padding-inline:1.5rem;text-align:center}}html[data-theme=dark] .vp-highlight{color:#eee}.vp-highlight-bg{position:absolute;top:0;right:0;bottom:0;left:0;z-index:0;background-attachment:fixed;background-position:50%;background-size:cover}.vp-highlight-bg.light{display:inline-block}.vp-highlight-bg.dark,html[data-theme=dark] .vp-highlight-bg.light{display:none}html[data-theme=dark] .vp-highlight-bg.dark{display:inline-block}.vp-highlight-image{width:12rem;margin:2rem 4rem}@media (max-width: 959px){.vp-highlight-image{width:10rem}}@media (max-width: 719px){.vp-highlight-image{width:8rem;margin:0 auto}}.vp-highlight-image.light{display:inline-block}.vp-highlight-image.dark,html[data-theme=dark] .vp-highlight-image.light{display:none}html[data-theme=dark] .vp-highlight-image.dark{display:inline-block}.vp-highlight-info-wrapper{display:flex;flex:1;justify-content:center;padding:2rem}@media (max-width: 719px){.vp-highlight-info-wrapper{padding:1rem 0}}.vp-highlight-info-wrapper:only-child{flex:1 0 100%}.vp-highlight-info{text-align:start}.vp-highlight-header{margin-bottom:1.5rem;border-bottom:none;font-size:3rem;font-family:var(--font-family)}@media (max-width: 959px){.vp-highlight-header{font-size:2.5rem}}@media (max-width: 719px){.vp-highlight-header{font-size:2.25rem;text-align:center}}@media (max-width: 419px){.vp-highlight-header{font-size:2rem}}.vp-highlight-description{font-size:1.125rem}.vp-highlights{margin-inline-start:-1.25em;padding-inline-start:0}.vp-highlight-item-wrapper{padding:.5em .5em .5em 1.75em;border-radius:.5rem;list-style:none}.vp-highlight-item-wrapper.link{cursor:pointer}.vp-highlight-item-wrapper:hover{background-color:var(--bg-color-secondary);box-shadow:0 2px 12px 0 var(--card-shadow);transition:transform var(--transform-transition);transform:translate(-2px,-2px)}.vp-highlight-bg+.vp-highlight .vp-highlight-item-wrapper:hover{background-color:transparent}.vp-highlight-item-wrapper::marker{font-weight:700}.vp-highlight-item{display:list-item;color:inherit;list-style:initial}@media print{.vp-highlight-item{text-decoration:none}}.vp-highlight-title{margin:0;font-weight:600;font-size:1.125rem;font-family:var(--font-family)}.vp-highlight-title .icon{margin-inline-end:.25em;font-size:1em}.vp-highlight-title img.icon{vertical-align:-.125em;height:1em}.vp-highlight-details{margin:.5rem 0 0}.vp-project-home{--content-width: var(--home-page-width);display:block;flex:1;padding-top:var(--navbar-height)}@media screen{.vp-project-home .vp-hero-info-wrapper:not(.fullscreen) .vp-hero-info{max-width:var(--home-page-width)}}@media screen{.vp-project-home .vp-feature{max-width:var(--home-page-width)}}.vp-project-home .theme-hope-content{padding-bottom:1.5rem!important}.vp-project-home .theme-hope-content:empty{padding:0!important}.not-found-hint{padding:2rem}.not-found-hint .error-code{margin:0;font-weight:700;font-size:4rem;line-height:4rem}.not-found-hint .error-title{font-weight:700}.not-found-hint .error-hint{margin:0;padding:12px 0;font-weight:600;font-size:20px;line-height:20px;letter-spacing:2px}.vp-page.not-found{display:flex;flex-direction:column;align-items:center;justify-content:center;box-sizing:border-box;width:100vw;max-width:var(--home-page-width);margin:0 auto;padding:calc(var(--navbar-height) + 1rem) 1rem 1rem!important;text-align:center}.vp-page.not-found .action-button{display:inline-block;box-sizing:border-box;margin:.25rem;padding:.75rem 1rem;border-width:0;border-bottom:1px solid var(--theme-color-dark);border-radius:3rem;background:var(--theme-color);color:var(--white);outline:none;font-size:1rem;transition:background .1s ease}.vp-page.not-found .action-button:hover{background:var(--theme-color-light);cursor:pointer}.vp-page-nav{display:flex;flex-wrap:wrap;min-height:2rem;margin-top:0;padding-block:.5rem;padding-inline:2rem;border-top:1px solid var(--border-color);transition:border-top var(--color-transition)}@media (max-width: 959px){.vp-page-nav{padding-inline:1rem}}@media print{.vp-page-nav{display:none}}.vp-page-nav .nav-link{display:inline-block;flex-grow:1;margin:.25rem;padding:.25rem .5rem;border:1px solid var(--border-color);border-radius:.25rem}.vp-page-nav .nav-link:hover{background:var(--bg-color-secondary)}.vp-page-nav .nav-link .hint{color:var(--light-grey);font-size:.875rem;line-height:2}.vp-page-nav .nav-link .arrow{display:inline-block;vertical-align:middle;width:1em;height:1em;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='rgba(0,0,0,0.5)' d='M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z'/%3E%3C/svg%3E");line-height:normal;transition:all .3s;font-size:.75rem}html[data-theme=dark] .vp-page-nav .nav-link .arrow{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='rgba(255,255,255,0.5)' d='M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z'/%3E%3C/svg%3E")}.vp-page-nav .nav-link .arrow.down{transform:rotate(180deg)}html[dir=rtl] .vp-page-nav .nav-link .arrow.down{transform:rotate(-180deg)}.vp-page-nav .nav-link .arrow.end{transform:rotate(90deg)}html[dir=rtl] .vp-page-nav .nav-link .arrow.end,.vp-page-nav .nav-link .arrow.start{transform:rotate(-90deg)}html[dir=rtl] .vp-page-nav .nav-link .arrow.start{transform:rotate(90deg)}.vp-page-nav .prev{text-align:start}.vp-page-nav .prev .icon{margin-inline-end:.25em;font-size:1em}.vp-page-nav .prev img.icon{vertical-align:-.125em;height:1em}.vp-page-nav .next{text-align:end}.vp-page-nav .next .icon{margin-inline-start:.25em;font-size:1em}.vp-page-nav .next img.icon{vertical-align:-.125em;height:1em}.vp-page-title{max-width:var(--content-width, 740px);margin-inline:auto;padding-inline:2.5rem;position:relative;z-index:1;padding-top:1rem;padding-bottom:0}@media (max-width: 959px){.vp-page-title{padding-inline:1.5rem}}@media print{.vp-page-title{max-width:unset}}@media print{.vp-page-title{padding-inline:0!important}}@media (max-width: 959px){.vp-page-title{padding-top:.5rem}}.vp-page-title h1{margin-top:calc(0px - var(--navbar-height))!important;margin-bottom:1rem;padding-top:var(--navbar-height)!important;font-size:2.2rem}@media (max-width: 959px){.vp-page-title h1{margin-bottom:.5rem}}.vp-page-title h1 .icon{margin-inline-end:.25em;color:var(--theme-color);font-size:.9em}.vp-page-title h1 img.icon{vertical-align:-.125em;height:1em}.theme-hope-content:not(.custom){padding-top:0!important}.theme-hope-content:not(.custom) h1:first-child,.theme-hope-content:not(.custom) h2:first-child,.theme-hope-content:not(.custom) h3:first-child,.theme-hope-content:not(.custom) h4:first-child,.theme-hope-content:not(.custom) h5:first-child,.theme-hope-content:not(.custom) h6:first-child{margin-top:calc(.5rem - var(--navbar-height))!important;padding-top:var(--navbar-height)!important}.theme-hope-content:not(.custom)>h1:first-child{display:none}.vp-page{display:block;flex-grow:1;padding-bottom:2rem;transition:padding var(--transform-transition)}@media print{.vp-page{min-height:auto!important;margin:0!important;padding:0!important}}.page-cover{-o-object-fit:cover;object-fit:cover;width:calc(100% + 2rem);max-height:25vh;margin-inline-start:-2rem}@media (max-width: 719px){.page-cover{width:100%;margin:0;border-radius:0}}@media (min-width: 1440px){.page-cover{width:calc(100% - 2rem);margin:0 1rem;border-radius:.5rem}}.page-cover .sidebar-collapsed{width:100%;margin-inline-start:0}.vp-skip-link{top:.25rem;inset-inline-start:.25rem;z-index:999;padding:.65rem 1.5rem;border-radius:.5rem;background:var(--bg-color);color:var(--theme-color);box-shadow:var(--card-shadow);font-weight:700;font-size:.9em;text-decoration:none}@media print{.vp-skip-link{display:none}}.vp-skip-link:focus{clip:auto;width:auto;height:auto;-webkit-clip-path:none;clip-path:none}.theme-hope-content pre{overflow:auto;margin:.85rem 0;padding:1rem;border-radius:6px;line-height:1.375}.theme-hope-content pre code{padding:0;border-radius:0;background:transparent!important;color:var(--code-color);font-family:var(--font-family-mono);text-align:left;white-space:pre;word-spacing:normal;word-wrap:normal;word-break:normal;overflow-wrap:unset;-webkit-hyphens:none;hyphens:none;transition:color var(--color-transition);-webkit-font-smoothing:auto;-moz-osx-font-smoothing:auto}@media print{.theme-hope-content pre code{white-space:pre-wrap}}.theme-hope-content .line-number{font-family:var(--font-family-mono)}div[class*=language-]{position:relative;border-radius:6px;background:var(--code-bg-color);font-size:16px;transition:background var(--color-transition)}@media (max-width: 419px){.theme-hope-content>div[class*=language-]{margin:.85rem -1.5rem;border-radius:0}}div[class*=language-]:before{content:attr(data-ext);position:absolute;top:0;right:1em;z-index:3;color:var(--code-line-color);font-size:.75rem;transition:color var(--color-transition)}div[class*=language-] pre{position:relative;z-index:1;scrollbar-gutter:stable}div[class*=language-] .highlight-lines{position:absolute;top:0;bottom:0;left:0;width:100%;padding:1rem 0;line-height:1.375;-webkit-user-select:none;-moz-user-select:none;user-select:none}div[class*=language-] .highlight-line{background:var(--code-highlight-line-color);transition:background var(--color-transition)}div[class*=language-].line-numbers-mode:after{content:"";position:absolute;top:0;bottom:0;left:0;z-index:2;width:var(--line-numbers-width);border-right:1px solid var(--code-highlight-line-color);border-radius:6px 0 0 6px;transition:border-color var(--color-transition)}@media (max-width: 419px){div[class*=language-].line-numbers-mode:after{border-radius:0}}@media print{div[class*=language-].line-numbers-mode:after{display:none}}div[class*=language-].line-numbers-mode .highlight-line{position:relative}div[class*=language-].line-numbers-mode .highlight-line:before{content:" ";position:absolute;top:0;left:0;z-index:3;display:block;width:var(--line-numbers-width);height:100%}div[class*=language-].line-numbers-mode pre{vertical-align:middle;margin-left:var(--line-numbers-width);padding-left:.5rem}@media print{div[class*=language-].line-numbers-mode pre{margin-left:0;padding-left:1rem}}div[class*=language-].line-numbers-mode .line-numbers{position:absolute;top:0;bottom:0;left:0;display:flex;flex-direction:column;justify-content:space-evenly;width:var(--line-numbers-width);padding:1rem 0;color:var(--code-line-color);counter-reset:line-number;text-align:center;transition:color var(--color-transition)}@media print{div[class*=language-].line-numbers-mode .line-numbers{display:none}}div[class*=language-].line-numbers-mode .line-number{position:relative;z-index:4;-webkit-user-select:none;-moz-user-select:none;user-select:none}div[class*=language-].line-numbers-mode .line-number:before{content:counter(line-number);font-size:.8em;counter-increment:line-number}div[class*=language-]:not(.line-numbers-mode) .line-numbers{display:none}html[data-theme=light] #app{--code-color: #383a42;--code-line-color: rgba(56, 58, 66, .67);--code-bg-color: #ecf4fa;--code-border-color: #c3def3;--code-highlight-line-color: #d8e9f6}html[data-theme=light] code[class*=language-],html[data-theme=light] pre[class*=language-]{-moz-tab-size:2;-o-tab-size:2;tab-size:2}html[data-theme=light] code[class*=language-]::-moz-selection,html[data-theme=light] code[class*=language-] ::-moz-selection,html[data-theme=light] pre[class*=language-]::-moz-selection,html[data-theme=light] pre[class*=language-] ::-moz-selection{background:#e5e5e6;color:inherit}html[data-theme=light] code[class*=language-]::selection,html[data-theme=light] code[class*=language-] ::selection,html[data-theme=light] pre[class*=language-]::selection,html[data-theme=light] pre[class*=language-] ::selection{background:#e5e5e6;color:inherit}html[data-theme=light] .token.comment,html[data-theme=light] .token.prolog,html[data-theme=light] .token.cdata{color:#a0a1a7}html[data-theme=light] .token.doctype,html[data-theme=light] .token.punctuation,html[data-theme=light] .token.entity{color:#383a42}html[data-theme=light] .token.attr-name,html[data-theme=light] .token.class-name,html[data-theme=light] .token.boolean,html[data-theme=light] .token.constant,html[data-theme=light] .token.number,html[data-theme=light] .token.atrule{color:#b76b01}html[data-theme=light] .token.keyword{color:#a626a4}html[data-theme=light] .token.property,html[data-theme=light] .token.tag,html[data-theme=light] .token.symbol,html[data-theme=light] .token.deleted,html[data-theme=light] .token.important{color:#e45649}html[data-theme=light] .token.selector,html[data-theme=light] .token.string,html[data-theme=light] .token.char,html[data-theme=light] .token.builtin,html[data-theme=light] .token.inserted,html[data-theme=light] .token.regex,html[data-theme=light] .token.attr-value,html[data-theme=light] .token.attr-value>.token.punctuation{color:#50a14f}html[data-theme=light] .token.variable,html[data-theme=light] .token.operator,html[data-theme=light] .token.function{color:#4078f2}html[data-theme=light] .token.url{color:#0184bc}html[data-theme=light] .token.attr-value>.token.punctuation.attr-equals,html[data-theme=light] .token.special-attr>.token.attr-value>.token.value.css{color:#383a42}html[data-theme=light] .language-css .token.selector{color:#e45649}html[data-theme=light] .language-css .token.property{color:#383a42}html[data-theme=light] .language-css .token.function,html[data-theme=light] .language-css .token.url>.token.function{color:#0184bc}html[data-theme=light] .language-css .token.url>.token.string.url{color:#50a14f}html[data-theme=light] .language-css .token.important,html[data-theme=light] .language-css .token.atrule .token.rule,html[data-theme=light] .language-javascript .token.operator{color:#a626a4}html[data-theme=light] .language-javascript .token.template-string>.token.interpolation>.token.interpolation-punctuation.punctuation{color:#ca1243}html[data-theme=light] .language-json .token.operator{color:#383a42}html[data-theme=light] .language-json .token.null.keyword{color:#b76b01}html[data-theme=light] .language-markdown .token.url,html[data-theme=light] .language-markdown .token.url>.token.operator,html[data-theme=light] .language-markdown .token.url-reference.url>.token.string{color:#383a42}html[data-theme=light] .language-markdown .token.url>.token.content{color:#4078f2}html[data-theme=light] .language-markdown .token.url>.token.url,html[data-theme=light] .language-markdown .token.url-reference.url{color:#0184bc}html[data-theme=light] .language-markdown .token.blockquote.punctuation,html[data-theme=light] .language-markdown .token.hr.punctuation{color:#a0a1a7;font-style:italic}html[data-theme=light] .language-markdown .token.code-snippet{color:#50a14f}html[data-theme=light] .language-markdown .token.bold .token.content{color:#b76b01}html[data-theme=light] .language-markdown .token.italic .token.content{color:#a626a4}html[data-theme=light] .language-markdown .token.strike .token.content,html[data-theme=light] .language-markdown .token.strike .token.punctuation,html[data-theme=light] .language-markdown .token.list.punctuation,html[data-theme=light] .language-markdown .token.title.important>.token.punctuation{color:#e45649}html[data-theme=light] .token.bold{font-weight:700}html[data-theme=light] .token.comment,html[data-theme=light] .token.italic{font-style:italic}html[data-theme=light] .token.entity{cursor:help}html[data-theme=light] .token.namespace{opacity:.8}html[data-theme=dark] #app{--code-color: #abb2bf;--code-line-color: rgba(171, 178, 191, .67);--code-bg-color: #282c34;--code-border-color: #343e51;--code-highlight-line-color: #2f3542}html[data-theme=dark] code[class*=language-],html[data-theme=dark] pre[class*=language-]{text-shadow:0 1px rgba(0,0,0,.3);-moz-tab-size:2;-o-tab-size:2;tab-size:2}@media print{html[data-theme=dark] code[class*=language-],html[data-theme=dark] pre[class*=language-]{text-shadow:none}}html[data-theme=dark] code[class*=language-]::-moz-selection,html[data-theme=dark] code[class*=language-] ::-moz-selection,html[data-theme=dark] pre[class*=language-]::-moz-selection,html[data-theme=dark] pre[class*=language-] ::-moz-selection{background:#3e4451;color:inherit;text-shadow:none}html[data-theme=dark] code[class*=language-]::selection,html[data-theme=dark] code[class*=language-] ::selection,html[data-theme=dark] pre[class*=language-]::selection,html[data-theme=dark] pre[class*=language-] ::selection{background:#3e4451;color:inherit;text-shadow:none}html[data-theme=dark] .token.comment,html[data-theme=dark] .token.prolog,html[data-theme=dark] .token.cdata{color:#5c6370}html[data-theme=dark] .token.doctype,html[data-theme=dark] .token.punctuation,html[data-theme=dark] .token.entity{color:#abb2bf}html[data-theme=dark] .token.attr-name,html[data-theme=dark] .token.class-name,html[data-theme=dark] .token.boolean,html[data-theme=dark] .token.constant,html[data-theme=dark] .token.number,html[data-theme=dark] .token.atrule{color:#d19a66}html[data-theme=dark] .token.keyword{color:#c678dd}html[data-theme=dark] .token.property,html[data-theme=dark] .token.tag,html[data-theme=dark] .token.symbol,html[data-theme=dark] .token.deleted,html[data-theme=dark] .token.important{color:#e06c75}html[data-theme=dark] .token.selector,html[data-theme=dark] .token.string,html[data-theme=dark] .token.char,html[data-theme=dark] .token.builtin,html[data-theme=dark] .token.inserted,html[data-theme=dark] .token.regex,html[data-theme=dark] .token.attr-value,html[data-theme=dark] .token.attr-value>.token.punctuation{color:#98c379}html[data-theme=dark] .token.variable,html[data-theme=dark] .token.operator,html[data-theme=dark] .token.function{color:#61afef}html[data-theme=dark] .token.url{color:#56b6c2}html[data-theme=dark] .token.attr-value>.token.punctuation.attr-equals,html[data-theme=dark] .token.special-attr>.token.attr-value>.token.value.css{color:#abb2bf}html[data-theme=dark] .language-css .token.selector{color:#e06c75}html[data-theme=dark] .language-css .token.property{color:#abb2bf}html[data-theme=dark] .language-css .token.function,html[data-theme=dark] .language-css .token.url>.token.function{color:#56b6c2}html[data-theme=dark] .language-css .token.url>.token.string.url{color:#98c379}html[data-theme=dark] .language-css .token.important,html[data-theme=dark] .language-css .token.atrule .token.rule,html[data-theme=dark] .language-javascript .token.operator{color:#c678dd}html[data-theme=dark] .language-javascript .token.template-string>.token.interpolation>.token.interpolation-punctuation.punctuation{color:#be5046}html[data-theme=dark] .language-json .token.operator{color:#abb2bf}html[data-theme=dark] .language-json .token.null.keyword{color:#d19a66}html[data-theme=dark] .language-markdown .token.url,html[data-theme=dark] .language-markdown .token.url>.token.operator,html[data-theme=dark] .language-markdown .token.url-reference.url>.token.string{color:#abb2bf}html[data-theme=dark] .language-markdown .token.url>.token.content{color:#61afef}html[data-theme=dark] .language-markdown .token.url>.token.url,html[data-theme=dark] .language-markdown .token.url-reference.url{color:#56b6c2}html[data-theme=dark] .language-markdown .token.blockquote.punctuation,html[data-theme=dark] .language-markdown .token.hr.punctuation{color:#5c6370;font-style:italic}html[data-theme=dark] .language-markdown .token.code-snippet{color:#98c379}html[data-theme=dark] .language-markdown .token.bold .token.content{color:#d19a66}html[data-theme=dark] .language-markdown .token.italic .token.content{color:#c678dd}html[data-theme=dark] .language-markdown .token.strike .token.content,html[data-theme=dark] .language-markdown .token.strike .token.punctuation,html[data-theme=dark] .language-markdown .token.list.punctuation,html[data-theme=dark] .language-markdown .token.title.important>.token.punctuation{color:#e06c75}html[data-theme=dark] .token.bold{font-weight:700}html[data-theme=dark] .token.comment,html[data-theme=dark] .token.italic{font-style:italic}html[data-theme=dark] .token.entity{cursor:help}html[data-theme=dark] .token.namespace{opacity:.8}.sr-only{position:absolute;overflow:hidden;clip:rect(0,0,0,0);width:1px;height:1px;margin:-1px;padding:0;border-width:0;white-space:nowrap;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media print{.theme-hope-content{margin:0!important;padding-inline:0!important}}.theme-hope-content.custom{margin:0;padding:0}.theme-hope-content:not(.custom){max-width:var(--content-width, 740px);margin:0 auto;padding:2rem 2.5rem;padding-top:0}@media (max-width: 959px){.theme-hope-content:not(.custom){padding:1.5rem}}@media (max-width: 419px){.theme-hope-content:not(.custom){padding:1rem 1.5rem}}@media print{.theme-hope-content:not(.custom){max-width:unset}}.theme-hope-content:not(.custom)>h1,.theme-hope-content:not(.custom)>h2,.theme-hope-content:not(.custom)>h3,.theme-hope-content:not(.custom)>h4,.theme-hope-content:not(.custom)>h5,.theme-hope-content:not(.custom)>h6{margin-top:calc(.5rem - var(--navbar-height));margin-bottom:.5rem;padding-top:calc(1rem + var(--navbar-height));outline:none}.theme-container.no-navbar .theme-hope-content:not(.custom)>h1,.theme-container.no-navbar .theme-hope-content:not(.custom)>h2,.theme-container.no-navbar .theme-hope-content:not(.custom)>h3,.theme-container.no-navbar .theme-hope-content:not(.custom)>h4,.theme-container.no-navbar .theme-hope-content:not(.custom)>h5,.theme-container.no-navbar .theme-hope-content:not(.custom)>h6{margin-top:1.5rem;padding-top:0}.theme-hope-content:not(.custom)>p,.theme-hope-content:not(.custom)>ul p,.theme-hope-content:not(.custom)>ol p{text-align:justify;overflow-wrap:break-word;-webkit-hyphens:auto;hyphens:auto}@media (max-width: 419px){.theme-hope-content:not(.custom)>p,.theme-hope-content:not(.custom)>ul p,.theme-hope-content:not(.custom)>ol p{text-align:start}}@media print{.theme-hope-content:not(.custom)>p,.theme-hope-content:not(.custom)>ul p,.theme-hope-content:not(.custom)>ol p{text-align:start}}.theme-hope-content a:hover{text-decoration:underline}.theme-hope-content img{max-width:100%}@media (min-width: 1280px){.chart-wrapper::-webkit-scrollbar,.flowchart-wrapper::-webkit-scrollbar,.mermaid-wrapper::-webkit-scrollbar{width:8px;height:8px}.chart-wrapper::-webkit-scrollbar-track-piece,.flowchart-wrapper::-webkit-scrollbar-track-piece,.mermaid-wrapper::-webkit-scrollbar-track-piece{border-radius:8px;background:rgba(0,0,0,.1)}}html[dir=rtl] a.header-anchor{float:right}#docsearch-container{min-width:145.7px!important}@media (max-width: 959px){#docsearch-container{min-width:36px!important}}.DocSearch.DocSearch-Button{margin-left:0}@media (max-width: 959px){.DocSearch.DocSearch-Button{min-width:36px!important}}.DocSearch .DocSearch-Button-Placeholder{display:inline-block;padding:4px 12px 4px 6px;font-size:14px}@media (max-width: 719px){.DocSearch .DocSearch-Button-Placeholder{display:none}}.DocSearch .DocSearch-Search-Icon{width:1.25em;height:1.25em}@media (max-width: 959px){.DocSearch .DocSearch-Button-Keys{display:none}}.DocSearch .DocSearch-Button-Key{background:var(--bg-color);box-shadow:none}@media (prefers-reduced-motion: no-preference){:root{scroll-behavior:smooth}}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track-piece{border-radius:6px;background:rgba(0,0,0,.1)}::-webkit-scrollbar-thumb{border-radius:6px;background:var(--theme-color)}::-webkit-scrollbar-thumb:active{background:var(--theme-color-light)}@media (max-width: 719px){.hide-in-mobile{display:none!important}}@media (max-width: 959px){.hide-in-pad{display:none!important}}.page-author-item{display:inline-block;margin:0 4px;font-weight:400;overflow-wrap:break-word}.page-category-info{flex-wrap:wrap}.page-category-item{display:inline-block;margin:.125em .25em;padding:0 .25em;border-radius:.25em;background:var(--bg-color-secondary);color:var(--text-color-light);font-weight:700;font-size:.75rem;line-height:2;transition:background var(--color-transition),color var(--color-transition)}@media print{.page-category-item{padding:0;font-weight:400}.page-category-item:after{content:", "}.page-category-item:last-of-type:after{content:""}}.page-category-item.clickable>span:hover{color:var(--theme-color);cursor:pointer}.page-category-item.category0{background:#fde5e7;color:#ec2f3e}html[data-theme=dark] .page-category-item.category0{background:#340509;color:#ba111f}.page-category-item.category0:hover{background:#f9bec3}html[data-theme=dark] .page-category-item.category0:hover{background:#53080e}.page-category-item.category1{background:#ffeee8;color:#fb7649}html[data-theme=dark] .page-category-item.category1{background:#441201;color:#f54205}.page-category-item.category1:hover{background:#fed4c6}html[data-theme=dark] .page-category-item.category1:hover{background:#6d1d02}.page-category-item.category2{background:#fef5e7;color:#f5b041}html[data-theme=dark] .page-category-item.category2{background:#3e2703;color:#e08e0b}.page-category-item.category2:hover{background:#fce6c4}html[data-theme=dark] .page-category-item.category2:hover{background:#633f05}.page-category-item.category3{background:#eafaf1;color:#55d98d}html[data-theme=dark] .page-category-item.category3{background:#0c331c;color:#29b866}.page-category-item.category3:hover{background:#caf3db}html[data-theme=dark] .page-category-item.category3:hover{background:#12522d}.page-category-item.category4{background:#e6f9ee;color:#36d278}html[data-theme=dark] .page-category-item.category4{background:#092917;color:#219552}.page-category-item.category4:hover{background:#c0f1d5}html[data-theme=dark] .page-category-item.category4:hover{background:#0f4224}.page-category-item.category5{background:#e1fcfc;color:#16e1e1}html[data-theme=dark] .page-category-item.category5{background:#042929;color:#0e9595}.page-category-item.category5:hover{background:#b4f8f8}html[data-theme=dark] .page-category-item.category5:hover{background:#064242}.page-category-item.category6{background:#e4f0fe;color:#2589f6}html[data-theme=dark] .page-category-item.category6{background:#021b36;color:#0862c3}.page-category-item.category6:hover{background:#bbdafc}html[data-theme=dark] .page-category-item.category6:hover{background:#042c57}.page-category-item.category7{background:#f7f1fd;color:#bb8ced}html[data-theme=dark] .page-category-item.category7{background:#2a0b4b;color:#9851e4}.page-category-item.category7:hover{background:#eadbfa}html[data-theme=dark] .page-category-item.category7:hover{background:#431277}.page-category-item.category8{background:#fdeaf5;color:#ef59ab}html[data-theme=dark] .page-category-item.category8{background:#400626;color:#e81689}.page-category-item.category8:hover{background:#facbe5}html[data-theme=dark] .page-category-item.category8:hover{background:#670a3d}.page-original-info{position:relative;display:inline-block;vertical-align:middle;overflow:hidden;padding:0 .5em;border:.5px solid var(--dark-grey);border-radius:.75em;background:var(--bg-color);font-size:.75em;line-height:1.5!important}.page-info{display:flex;flex-wrap:wrap;align-items:center;place-content:stretch flex-start;color:var(--dark-grey);font-size:14px}@media print{.page-info{display:flex!important}}.page-info>span{display:flex;align-items:center;max-width:100%;margin-inline-end:.5em;line-height:2}@media (min-width: 1440px){.page-info>span{font-size:1.1em}}@media (max-width: 419px){.page-info>span{margin-inline-end:.3em;font-size:.875em}}@media print{.page-info>span{display:flex!important}}.page-info .icon{position:relative;display:inline-block;vertical-align:middle;width:1em;height:1em;margin-inline-end:.25em}.page-info a{color:inherit}.page-info a:hover,.page-info a:active{color:var(--theme-color)}.page-meta{max-width:var(--content-width, 740px);margin-inline:auto;padding-inline:2.5rem;display:flex;flex-wrap:wrap;justify-content:space-between;overflow:auto;padding-top:.75rem;padding-bottom:.75rem}@media (max-width: 959px){.page-meta{padding-inline:1.5rem}}@media print{.page-meta{max-width:unset}}@media print{.page-meta{margin:0!important;padding-inline:0!important}}@media (max-width: 719px){.page-meta{display:block}}.page-meta .meta-item{flex-grow:1}.page-meta .meta-item .label{font-weight:500}.page-meta .meta-item .label:not(a){color:var(--text-color-lighter)}.page-meta .meta-item .info{color:var(--dark-grey);font-weight:400}.page-meta .git-info{text-align:end}.page-meta .edit-link{margin-top:.25rem;margin-bottom:.25rem;margin-inline-end:.5rem;font-size:14px}@media print{.page-meta .edit-link{display:none}}.page-meta .edit-link .icon{position:relative;bottom:-.125em;width:1em;height:1em;margin-inline-end:.25em}.page-meta .update-time,.page-meta .contributors{margin-top:.25rem;margin-bottom:.25rem;font-size:14px}@media (max-width: 719px){.page-meta .update-time,.page-meta .contributors{font-size:13px;text-align:start}}.print-button{border-width:0;background:transparent;cursor:pointer;box-sizing:content-box;width:1rem;height:1rem;padding:.5rem;border-radius:.25em;color:inherit;font-size:1rem;transform:translateY(.25rem)}@media print{.print-button{display:none}}.page-tag-info{flex-wrap:wrap}.page-tag-item{position:relative;display:inline-block;vertical-align:middle;overflow:hidden;min-width:1.5rem;margin:.125rem;padding:.125rem .25rem .125rem .625rem;background:var(--bg-color-secondary);background:linear-gradient(135deg,transparent .75em,var(--bg-color-secondary) 0) top,linear-gradient(45deg,transparent .75em,var(--bg-color-secondary) 0) bottom;background-size:100% 52%!important;background-repeat:no-repeat!important;color:var(--text-color-light);font-weight:700;font-size:.625rem;line-height:1.5;text-align:center;transition:background var(--color-transition),color var(--color-transition)}@media print{.page-tag-item{padding:0;font-weight:400}.page-tag-item:after{content:", "}.page-tag-item:last-of-type:after{content:""}}.page-tag-item.clickable:hover{cursor:pointer}.page-tag-item.tag0{background:#fde5e7;background:linear-gradient(135deg,transparent .75em,#fde5e7 0) top,linear-gradient(45deg,transparent .75em,#fde5e7 0) bottom;color:#ec2f3e}html[data-theme=dark] .page-tag-item.tag0{background:#340509;background:linear-gradient(135deg,transparent .75em,#340509 0) top,linear-gradient(45deg,transparent .75em,#340509 0) bottom;color:#ba111f}.page-tag-item.tag0.clickable:hover{background:#f9bec3;background:linear-gradient(135deg,transparent .75em,#f9bec3 0) top,linear-gradient(45deg,transparent .75em,#f9bec3 0) bottom}html[data-theme=dark] .page-tag-item.tag0.clickable:hover{background:#53080e;background:linear-gradient(135deg,transparent .75em,#53080e 0) top,linear-gradient(45deg,transparent .75em,#53080e 0) bottom}.page-tag-item.tag1{background:#ffeee8;background:linear-gradient(135deg,transparent .75em,#ffeee8 0) top,linear-gradient(45deg,transparent .75em,#ffeee8 0) bottom;color:#fb7649}html[data-theme=dark] .page-tag-item.tag1{background:#441201;background:linear-gradient(135deg,transparent .75em,#441201 0) top,linear-gradient(45deg,transparent .75em,#441201 0) bottom;color:#f54205}.page-tag-item.tag1.clickable:hover{background:#fed4c6;background:linear-gradient(135deg,transparent .75em,#fed4c6 0) top,linear-gradient(45deg,transparent .75em,#fed4c6 0) bottom}html[data-theme=dark] .page-tag-item.tag1.clickable:hover{background:#6d1d02;background:linear-gradient(135deg,transparent .75em,#6d1d02 0) top,linear-gradient(45deg,transparent .75em,#6d1d02 0) bottom}.page-tag-item.tag2{background:#fef5e7;background:linear-gradient(135deg,transparent .75em,#fef5e7 0) top,linear-gradient(45deg,transparent .75em,#fef5e7 0) bottom;color:#f5b041}html[data-theme=dark] .page-tag-item.tag2{background:#3e2703;background:linear-gradient(135deg,transparent .75em,#3e2703 0) top,linear-gradient(45deg,transparent .75em,#3e2703 0) bottom;color:#e08e0b}.page-tag-item.tag2.clickable:hover{background:#fce6c4;background:linear-gradient(135deg,transparent .75em,#fce6c4 0) top,linear-gradient(45deg,transparent .75em,#fce6c4 0) bottom}html[data-theme=dark] .page-tag-item.tag2.clickable:hover{background:#633f05;background:linear-gradient(135deg,transparent .75em,#633f05 0) top,linear-gradient(45deg,transparent .75em,#633f05 0) bottom}.page-tag-item.tag3{background:#eafaf1;background:linear-gradient(135deg,transparent .75em,#eafaf1 0) top,linear-gradient(45deg,transparent .75em,#eafaf1 0) bottom;color:#55d98d}html[data-theme=dark] .page-tag-item.tag3{background:#0c331c;background:linear-gradient(135deg,transparent .75em,#0c331c 0) top,linear-gradient(45deg,transparent .75em,#0c331c 0) bottom;color:#29b866}.page-tag-item.tag3.clickable:hover{background:#caf3db;background:linear-gradient(135deg,transparent .75em,#caf3db 0) top,linear-gradient(45deg,transparent .75em,#caf3db 0) bottom}html[data-theme=dark] .page-tag-item.tag3.clickable:hover{background:#12522d;background:linear-gradient(135deg,transparent .75em,#12522d 0) top,linear-gradient(45deg,transparent .75em,#12522d 0) bottom}.page-tag-item.tag4{background:#e6f9ee;background:linear-gradient(135deg,transparent .75em,#e6f9ee 0) top,linear-gradient(45deg,transparent .75em,#e6f9ee 0) bottom;color:#36d278}html[data-theme=dark] .page-tag-item.tag4{background:#092917;background:linear-gradient(135deg,transparent .75em,#092917 0) top,linear-gradient(45deg,transparent .75em,#092917 0) bottom;color:#219552}.page-tag-item.tag4.clickable:hover{background:#c0f1d5;background:linear-gradient(135deg,transparent .75em,#c0f1d5 0) top,linear-gradient(45deg,transparent .75em,#c0f1d5 0) bottom}html[data-theme=dark] .page-tag-item.tag4.clickable:hover{background:#0f4224;background:linear-gradient(135deg,transparent .75em,#0f4224 0) top,linear-gradient(45deg,transparent .75em,#0f4224 0) bottom}.page-tag-item.tag5{background:#e1fcfc;background:linear-gradient(135deg,transparent .75em,#e1fcfc 0) top,linear-gradient(45deg,transparent .75em,#e1fcfc 0) bottom;color:#16e1e1}html[data-theme=dark] .page-tag-item.tag5{background:#042929;background:linear-gradient(135deg,transparent .75em,#042929 0) top,linear-gradient(45deg,transparent .75em,#042929 0) bottom;color:#0e9595}.page-tag-item.tag5.clickable:hover{background:#b4f8f8;background:linear-gradient(135deg,transparent .75em,#b4f8f8 0) top,linear-gradient(45deg,transparent .75em,#b4f8f8 0) bottom}html[data-theme=dark] .page-tag-item.tag5.clickable:hover{background:#064242;background:linear-gradient(135deg,transparent .75em,#064242 0) top,linear-gradient(45deg,transparent .75em,#064242 0) bottom}.page-tag-item.tag6{background:#e4f0fe;background:linear-gradient(135deg,transparent .75em,#e4f0fe 0) top,linear-gradient(45deg,transparent .75em,#e4f0fe 0) bottom;color:#2589f6}html[data-theme=dark] .page-tag-item.tag6{background:#021b36;background:linear-gradient(135deg,transparent .75em,#021b36 0) top,linear-gradient(45deg,transparent .75em,#021b36 0) bottom;color:#0862c3}.page-tag-item.tag6.clickable:hover{background:#bbdafc;background:linear-gradient(135deg,transparent .75em,#bbdafc 0) top,linear-gradient(45deg,transparent .75em,#bbdafc 0) bottom}html[data-theme=dark] .page-tag-item.tag6.clickable:hover{background:#042c57;background:linear-gradient(135deg,transparent .75em,#042c57 0) top,linear-gradient(45deg,transparent .75em,#042c57 0) bottom}.page-tag-item.tag7{background:#f7f1fd;background:linear-gradient(135deg,transparent .75em,#f7f1fd 0) top,linear-gradient(45deg,transparent .75em,#f7f1fd 0) bottom;color:#bb8ced}html[data-theme=dark] .page-tag-item.tag7{background:#2a0b4b;background:linear-gradient(135deg,transparent .75em,#2a0b4b 0) top,linear-gradient(45deg,transparent .75em,#2a0b4b 0) bottom;color:#9851e4}.page-tag-item.tag7.clickable:hover{background:#eadbfa;background:linear-gradient(135deg,transparent .75em,#eadbfa 0) top,linear-gradient(45deg,transparent .75em,#eadbfa 0) bottom}html[data-theme=dark] .page-tag-item.tag7.clickable:hover{background:#431277;background:linear-gradient(135deg,transparent .75em,#431277 0) top,linear-gradient(45deg,transparent .75em,#431277 0) bottom}.page-tag-item.tag8{background:#fdeaf5;background:linear-gradient(135deg,transparent .75em,#fdeaf5 0) top,linear-gradient(45deg,transparent .75em,#fdeaf5 0) bottom;color:#ef59ab}html[data-theme=dark] .page-tag-item.tag8{background:#400626;background:linear-gradient(135deg,transparent .75em,#400626 0) top,linear-gradient(45deg,transparent .75em,#400626 0) bottom;color:#e81689}.page-tag-item.tag8.clickable:hover{background:#facbe5;background:linear-gradient(135deg,transparent .75em,#facbe5 0) top,linear-gradient(45deg,transparent .75em,#facbe5 0) bottom}html[data-theme=dark] .page-tag-item.tag8.clickable:hover{background:#670a3d;background:linear-gradient(135deg,transparent .75em,#670a3d 0) top,linear-gradient(45deg,transparent .75em,#670a3d 0) bottom}.toc-place-holder{margin-inline:auto;padding-inline:2.5rem;position:sticky;top:calc(var(--navbar-height) + 2rem);z-index:99;max-width:var(--content-width, 740px)}@media (max-width: 959px){.toc-place-holder{padding-inline:1.5rem}}@media print{.toc-place-holder{max-width:unset}}.toc-place-holder+.theme-hope-content:not(.custom){padding-top:0}#toc{position:absolute;inset-inline-start:calc(100% + 1rem);display:none;min-width:10rem;max-width:15rem}@media (min-width: 1440px){.has-toc #toc{display:block}}@media print{#toc{display:none!important}}#toc .toc-header{margin-bottom:.75rem;margin-inline-start:.5rem;font-weight:600;font-size:.875rem}#toc .toc-wrapper{position:relative;overflow:hidden auto;max-height:75vh;margin:0 .5rem;padding-inline-start:8px;text-overflow:ellipsis;white-space:nowrap;scroll-behavior:smooth}#toc .toc-wrapper::-webkit-scrollbar-track-piece{background:transparent}#toc .toc-wrapper::-webkit-scrollbar{width:3px}#toc .toc-wrapper::-webkit-scrollbar-thumb:vertical{background:#ddd}html[data-theme=dark] #toc .toc-wrapper::-webkit-scrollbar-thumb:vertical{background:#333}#toc .toc-wrapper:before{content:" ";position:absolute;top:0;bottom:0;inset-inline-start:0;z-index:-1;width:2px;background:var(--border-color)}#toc .toc-list{position:relative;margin:0;padding:0}#toc .toc-marker{content:" ";position:absolute;top:0;inset-inline-start:-8px;z-index:2;width:2px;height:1.7rem;background:var(--theme-color);transition:top var(--vp-tt)}#toc .toc-link{position:relative;display:block;overflow:hidden;max-width:100%;color:var(--light-grey);line-height:inherit;text-overflow:ellipsis;white-space:nowrap}#toc .toc-link.level2{padding-inline-start:0px;font-size:14px}#toc .toc-link.level3{padding-inline-start:8px;font-size:13px}#toc .toc-link.level4{padding-inline-start:16px;font-size:12px}#toc .toc-link.level5{padding-inline-start:24px;font-size:11px}#toc .toc-link.level6{padding-inline-start:32px;font-size:10px}#toc .toc-item{position:relative;box-sizing:border-box;height:1.7rem;padding:0 .5rem;list-style:none;line-height:1.7rem}#toc .toc-item:hover>.toc-link{color:var(--theme-color)}#toc .toc-item.active>.toc-link{color:var(--theme-color);font-weight:700}.dropdown-wrapper{cursor:pointer}.dropdown-wrapper:not(:hover) .arrow{transform:rotate(-180deg)}.dropdown-wrapper .dropdown-title{border-width:0;background:transparent;cursor:pointer;padding:0 .25rem;color:var(--dark-grey);font-weight:500;font-size:inherit;font-family:inherit;line-height:inherit;cursor:inherit}.dropdown-wrapper .dropdown-title:hover{border-color:transparent}.dropdown-wrapper .dropdown-title .icon{margin-inline-end:.25em;font-size:1em}.dropdown-wrapper .dropdown-title .arrow{display:inline-block;vertical-align:middle;width:1em;height:1em;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='rgba(0,0,0,0.5)' d='M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z'/%3E%3C/svg%3E");line-height:normal;transition:all .3s;font-size:1.2em}html[data-theme=dark] .dropdown-wrapper .dropdown-title .arrow{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='rgba(255,255,255,0.5)' d='M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z'/%3E%3C/svg%3E")}.dropdown-wrapper .dropdown-title .arrow.down{transform:rotate(180deg)}html[dir=rtl] .dropdown-wrapper .dropdown-title .arrow.down{transform:rotate(-180deg)}.dropdown-wrapper .dropdown-title .arrow.end{transform:rotate(90deg)}html[dir=rtl] .dropdown-wrapper .dropdown-title .arrow.end,.dropdown-wrapper .dropdown-title .arrow.start{transform:rotate(-90deg)}html[dir=rtl] .dropdown-wrapper .dropdown-title .arrow.start{transform:rotate(90deg)}.dropdown-wrapper ul{margin:0;padding:0;list-style-type:none}.dropdown-wrapper .nav-dropdown{position:absolute;top:100%;inset-inline-end:0;overflow-y:auto;box-sizing:border-box;min-width:6rem;max-height:calc(100vh - var(--navbar-height));margin:0;padding:.5rem .75rem;border:1px solid var(--grey14);border-radius:.5rem;background:var(--bg-color);box-shadow:2px 2px 10px var(--card-shadow);text-align:start;white-space:nowrap;opacity:0;visibility:hidden;transition:all .18s ease-out;transform:scale(.9)}.dropdown-wrapper:hover .nav-dropdown,.dropdown-wrapper.open .nav-dropdown{z-index:2;opacity:1;visibility:visible;transform:none}.dropdown-wrapper .nav-link{position:relative;display:block;margin-bottom:0;border-bottom:none;color:var(--dark-grey);font-weight:400;font-size:.875rem;line-height:1.7rem;transition:color var(--color-transition)}.dropdown-wrapper .nav-link:hover,.dropdown-wrapper .nav-link.active{color:var(--theme-color)}.dropdown-wrapper .dropdown-subtitle{margin:0;padding:.5rem .25rem 0;color:var(--light-grey);font-weight:600;font-size:.75rem;line-height:2;text-transform:uppercase;transition:color var(--color-transition)}.dropdown-wrapper .dropdown-subitem-wrapper{padding:0 0 .25rem}.dropdown-wrapper .dropdown-item{color:inherit;line-height:1.7rem}.dropdown-wrapper .dropdown-item:last-child .dropdown-subtitle{padding-top:0}.dropdown-wrapper .dropdown-item:last-child .dropdown-subitem-wrapper{padding-bottom:0}.nav-screen-dropdown-title{border-width:0;background:transparent;position:relative;display:flex;align-items:center;width:100%;padding:0;color:var(--dark-grey);font-size:inherit;font-family:inherit;text-align:start;cursor:pointer}.nav-screen-dropdown-title:hover,.nav-screen-dropdown-title.active{color:var(--text-color)}.nav-screen-dropdown-title .title{flex:1}.nav-screen-dropdown-title .arrow{display:inline-block;vertical-align:middle;width:1em;height:1em;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='rgba(0,0,0,0.5)' d='M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z'/%3E%3C/svg%3E");line-height:normal;transition:all .3s}html[data-theme=dark] .nav-screen-dropdown-title .arrow{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='rgba(255,255,255,0.5)' d='M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z'/%3E%3C/svg%3E")}.nav-screen-dropdown-title .arrow.down{transform:rotate(180deg)}html[dir=rtl] .nav-screen-dropdown-title .arrow.down{transform:rotate(-180deg)}.nav-screen-dropdown-title .arrow.end{transform:rotate(90deg)}html[dir=rtl] .nav-screen-dropdown-title .arrow.end,.nav-screen-dropdown-title .arrow.start{transform:rotate(-90deg)}html[dir=rtl] .nav-screen-dropdown-title .arrow.start{transform:rotate(90deg)}.nav-screen-dropdown{overflow:hidden;margin:.5rem 0 0;padding:0;list-style:none;transition:transform .1s ease-out;transform:scaleY(1);transform-origin:top}.nav-screen-dropdown.hide{height:0;margin:0;transform:scaleY(0)}.nav-screen-dropdown .nav-link{position:relative;display:block;padding-inline-start:.5rem;font-weight:400;line-height:2}.nav-screen-dropdown .nav-link:hover,.nav-screen-dropdown .nav-link.active{color:var(--theme-color)}.nav-screen-dropdown .nav-link .icon{font-size:1em}.nav-screen-dropdown .dropdown-item{color:inherit;line-height:1.7rem}.nav-screen-dropdown .dropdown-subtitle{margin:0;padding-inline-start:.25rem;color:var(--light-grey);font-weight:600;font-size:.75rem;line-height:2;text-transform:uppercase;transition:color var(--color-transition)}.nav-screen-dropdown .dropdown-subtitle .nav-link{padding:0}.nav-screen-dropdown .dropdown-subitem-wrapper{margin:0;padding:0;list-style:none}.nav-screen-dropdown .dropdown-subitem{padding-inline-start:.5rem;font-size:.9em}.nav-screen-links{display:none;padding-bottom:.75rem}@media (max-width: 719px){.nav-screen-links{display:block}}.nav-screen-links .navbar-links-item{position:relative;display:block;padding:12px 4px 11px 0;border-bottom:1px solid var(--border-color);font-size:16px;line-height:1.5rem;transition:border-bottom-color var(--color-transition)}.nav-screen-links .nav-link{display:inline-block;width:100%;color:var(--dark-grey);font-weight:400}.nav-screen-links .nav-link:hover{color:var(--text-color)}.nav-screen-links .nav-link.active{color:var(--theme-color)}.vp-nav-screen-container{max-width:320px;margin:0 auto;padding:2rem 0 4rem}#nav-screen{position:fixed;inset:var(--navbar-height) 0 0 0;z-index:150;display:none;overflow-y:auto;padding:0 2rem;background:var(--bg-color);transition:background .5s}@media (max-width: 719px){#nav-screen{display:block}}#nav-screen.fade-enter-active,#nav-screen.fade-leave-active{transition:opacity .25s}#nav-screen.fade-enter-active .vp-nav-screen-container,#nav-screen.fade-leave-active .vp-nav-screen-container{transition:transform .25s ease}#nav-screen.fade-enter-from,#nav-screen.fade-leave-to{opacity:0}#nav-screen.fade-enter-from .vp-nav-screen-container,#nav-screen.fade-leave-to .vp-nav-screen-container{transform:translateY(-8px)}#nav-screen .icon{margin-inline-end:.25em;font-size:1em}#nav-screen img.icon{vertical-align:-.125em;height:1em}.vp-outlook-wrapper{display:flex;justify-content:space-around}.vp-nav-logo{vertical-align:top;height:var(--navbar-line-height);margin-inline-end:.8rem}.vp-nav-logo.light{display:inline-block}.vp-nav-logo.dark,html[data-theme=dark] .vp-nav-logo.light{display:none}html[data-theme=dark] .vp-nav-logo.dark{display:inline-block}.vp-site-name{position:relative;color:var(--text-color);font-size:1.25rem}@media (max-width: 719px){.vp-site-name{overflow:hidden;width:calc(100vw - 9.4rem);text-overflow:ellipsis;white-space:nowrap}}.vp-brand:hover .vp-site-name{color:var(--theme-color)}.vp-navbar .vp-nav-links{display:flex;align-items:center;font-size:.875rem}.vp-navbar .nav-item{position:relative;margin:0 .25rem;line-height:2rem}.vp-navbar .nav-item:first-child{margin-inline-start:0}.vp-navbar .nav-item:last-child{margin-inline-end:0}.vp-navbar .nav-item>.nav-link{color:var(--dark-grey)}.vp-navbar .nav-item>.nav-link:after{content:" ";position:absolute;inset:auto 50% 0;height:2px;border-radius:1px;background:var(--theme-color-light);visibility:hidden;transition:inset .2s ease-in-out}.vp-navbar .nav-item>.nav-link.active{color:var(--theme-color)}.vp-navbar .nav-item>.nav-link:hover:after,.vp-navbar .nav-item>.nav-link.active:after{inset:auto 0 0;visibility:visible}.vp-navbar{--navbar-line-height: calc( var(--navbar-height) - var(--navbar-vertical-padding) * 2 );position:fixed;inset:0 0 auto;z-index:175;display:flex;align-items:center;justify-content:space-between;box-sizing:border-box;height:var(--navbar-height);padding:var(--navbar-vertical-padding) var(--navbar-horizontal-padding);background:var(--navbar-bg-color);box-shadow:0 2px 8px var(--card-shadow);line-height:var(--navbar-line-height);white-space:nowrap;transition:transform ease-in-out .3s,background var(--color-transition),box-shadow var(--color-transition);-webkit-backdrop-filter:saturate(150%) blur(12px);backdrop-filter:saturate(150%) blur(12px)}@media print{.vp-navbar{display:none}}.hide-navbar .vp-navbar.auto-hide{transform:translateY(-100%)}.vp-navbar .nav-link{padding:0 .25rem;color:var(--dark-grey)}.vp-navbar .nav-link.active{color:var(--theme-color)}.vp-navbar .nav-link .icon{margin-inline-end:.25em;font-size:1em}.vp-navbar .nav-link img.icon{vertical-align:-.125em;height:1em}.vp-navbar.hide-icon .vp-nav-links .icon{display:none!important}.vp-navbar-start,.vp-navbar-end,.vp-navbar-center{display:flex;flex:1;align-items:center}.vp-navbar-start>*,.vp-navbar-end>*,.vp-navbar-center>*{position:relative;margin:0 .25rem!important}.vp-navbar-start>*:first-child,.vp-navbar-end>*:first-child,.vp-navbar-center>*:first-child{margin-inline-start:0!important}.vp-navbar-start>*:last-child,.vp-navbar-end>*:last-child,.vp-navbar-center>*:last-child{margin-inline-end:0!important}.vp-navbar-start{justify-content:start}.vp-navbar-center{justify-content:center}.vp-navbar-end{justify-content:end}.vp-navbar .vp-repo{margin:0!important}.vp-navbar .vp-repo-link{display:inline-block;margin:auto;padding:6px;color:var(--dark-grey);line-height:1}.vp-navbar .vp-repo-link:hover,.vp-navbar .vp-repo-link:active{color:var(--theme-color)}.vp-toggle-navbar-button{border-width:0;background:transparent;cursor:pointer;position:relative;display:none;align-items:center;justify-content:center;padding:6px}@media screen and (max-width: 719px){.vp-toggle-navbar-button{display:flex}}.vp-toggle-navbar-button>span{position:relative;overflow:hidden;width:16px;height:14px}.vp-toggle-navbar-button .vp-top,.vp-toggle-navbar-button .vp-middle,.vp-toggle-navbar-button .vp-bottom{position:absolute;width:16px;height:2px;background:var(--dark-grey);transition:top .25s,background .5s,transform .25s}.vp-toggle-navbar-button .vp-top{top:0;left:0;transform:translate(0)}.vp-toggle-navbar-button .vp-middle{top:6px;left:0;transform:translate(8px)}.vp-toggle-navbar-button .vp-bottom{top:12px;left:0;transform:translate(4px)}.vp-toggle-navbar-button:hover .vp-top{top:0;left:0;transform:translate(4px)}.vp-toggle-navbar-button:hover .vp-middle{top:6;left:0;transform:translate(0)}.vp-toggle-navbar-button:hover .vp-bottom{top:12px;left:0;transform:translate(8px)}.vp-toggle-navbar-button.is-active .vp-top{top:6px;transform:translate(0) rotate(225deg)}.vp-toggle-navbar-button.is-active .vp-middle{top:6px;transform:translate(16px)}.vp-toggle-navbar-button.is-active .vp-bottom{top:6px;transform:translate(0) rotate(135deg)}.vp-toggle-navbar-button.is-active:hover .vp-top,.vp-toggle-navbar-button.is-active:hover .vp-middle,.vp-toggle-navbar-button.is-active:hover .vp-bottom{background:var(--theme-color);transition:top .25s,background .25s,transform .25s}.vp-toggle-sidebar-button{border-width:0;background:transparent;cursor:pointer;display:none;vertical-align:middle;box-sizing:content-box;width:1rem;height:1rem;padding:.5rem;font:unset;transition:transform .2s ease-in-out}@media screen and (max-width: 719px){.vp-toggle-sidebar-button{display:block;padding-inline-end:var(--navbar-mobile-horizontal-padding)}}.vp-toggle-sidebar-button:before,.vp-toggle-sidebar-button:after,.vp-toggle-sidebar-button .icon{display:block;width:100%;height:2px;border-radius:.05em;background:var(--dark-grey);transition:transform .2s ease-in-out}.vp-toggle-sidebar-button:before{content:" ";margin-top:.125em}.sidebar-open .vp-toggle-sidebar-button:before{transform:translateY(.34rem) rotate(135deg)}.vp-toggle-sidebar-button:after{content:" ";margin-bottom:.125em}.sidebar-open .vp-toggle-sidebar-button:after{transform:translateY(-.34rem) rotate(-135deg)}.vp-toggle-sidebar-button .icon{margin:.2em 0}.sidebar-open .vp-toggle-sidebar-button .icon{transform:scale(0)}.appearance-title{display:block;margin:0;padding:0 .25rem;color:var(--light-grey);font-weight:600;font-size:.75rem;line-height:2;transition:color var(--color-transition)}#appearance-switch{border-width:0;background:transparent;vertical-align:middle;padding:6px;color:var(--dark-grey);cursor:pointer;transition:color var(--color-transition)}#appearance-switch:hover{color:var(--theme-color)}#appearance-switch .icon{width:1.25rem;height:1.25rem}.outlook-button{border-width:0;background:transparent;cursor:pointer;position:relative;padding:.375rem;color:var(--dark-grey)}.outlook-button .icon{vertical-align:middle;width:1.25rem;height:1.25rem}.outlook-dropdown{position:absolute;top:100%;inset-inline-end:0;overflow-y:auto;box-sizing:border-box;min-width:100px;margin:0;padding:.5rem .75rem;border:1px solid var(--grey14);border-radius:.25rem;background:var(--bg-color);box-shadow:2px 2px 10px var(--card-shadow);text-align:start;white-space:nowrap;opacity:0;visibility:hidden;transition:all .18s ease-out;transform:scale(.8)}.outlook-dropdown>*:not(:last-child){padding-bottom:.5rem;border-bottom:1px solid var(--grey14)}.outlook-button:hover .outlook-dropdown,.outlook-button.open .outlook-dropdown{z-index:2;opacity:1;visibility:visible;transform:scale(1)}.theme-color-title{display:block;margin:0;padding:0 .25rem;color:var(--light-grey);font-weight:600;font-size:.75rem;line-height:2;transition:color var(--color-transition)}#theme-color-picker{display:flex;margin:0;padding:0;list-style-type:none;font-size:14px}#theme-color-picker li span{display:inline-block;vertical-align:middle;width:15px;height:15px;margin:0 2px;border-radius:2px}#theme-color-picker li span.theme-color,#theme-color-picker li span.theme-color html[data-theme=dark]{background:#16a085}@media print{.full-screen-wrapper{display:none}}.full-screen-title{display:block;margin:0;padding:0 .25rem;color:var(--light-grey);font-weight:600;font-size:.75rem;line-height:2;transition:color var(--color-transition)}.full-screen,.cancel-full-screen{border-width:0;background:transparent;vertical-align:middle;padding:.375rem;color:var(--dark-grey);cursor:pointer}.full-screen:hover,.cancel-full-screen:hover{color:var(--theme-color)}.full-screen .icon,.cancel-full-screen .icon{width:1.25rem;height:1.25rem}.enter-fullscreen-icon:hover,.cancel-fullscreen-icon{color:var(--theme-color)}.cancel-fullscreen-icon:hover{color:var(--dark-grey)}.vp-sidebar-heading{display:flex;align-items:center;overflow:hidden;box-sizing:border-box;width:calc(100% - 1rem);margin:0;margin-inline:.5rem;padding:.25rem .5rem;border-width:0;border-radius:.375rem;background:transparent;color:var(--text-color);font-size:1.1em;line-height:1.5;-webkit-user-select:none;-moz-user-select:none;user-select:none;transition:color .15s ease;transform:rotate(0)}.vp-sidebar-heading.open{color:inherit}.vp-sidebar-heading.clickable:hover{background:var(--bg-color-secondary)}.vp-sidebar-heading.clickable.exact{border-inline-start-color:var(--theme-color);color:var(--theme-color)}.vp-sidebar-heading.clickable.exact a{color:inherit}.vp-sidebar-heading .vp-sidebar-title{flex:1}.vp-sidebar-heading .vp-arrow{display:inline-block;vertical-align:middle;width:1em;height:1em;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='rgba(0,0,0,0.5)' d='M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z'/%3E%3C/svg%3E");line-height:normal;transition:all .3s;font-size:1.5em}html[data-theme=dark] .vp-sidebar-heading .vp-arrow{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='rgba(255,255,255,0.5)' d='M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z'/%3E%3C/svg%3E")}.vp-sidebar-heading .vp-arrow.down{transform:rotate(180deg)}html[dir=rtl] .vp-sidebar-heading .vp-arrow.down{transform:rotate(-180deg)}.vp-sidebar-heading .vp-arrow.end{transform:rotate(90deg)}html[dir=rtl] .vp-sidebar-heading .vp-arrow.end,.vp-sidebar-heading .vp-arrow.start{transform:rotate(-90deg)}html[dir=rtl] .vp-sidebar-heading .vp-arrow.start{transform:rotate(90deg)}button.vp-sidebar-heading{outline:none;font-weight:inherit;font-family:inherit;line-height:inherit;text-align:start;cursor:pointer}.vp-sidebar-link{display:inline-block;box-sizing:border-box;width:calc(100% - 1rem);margin-inline:.5rem;padding:.25rem .5rem;border-radius:.375rem;color:var(--text-color);font-weight:400;font-size:1em;line-height:1.5}.vp-sidebar-link:hover{background:var(--bg-color-secondary)}.vp-sidebar-link.active{background:var(--theme-color-mask);color:var(--theme-color);font-weight:500}.vp-sidebar-link.active .icon{color:var(--theme-color)}.vp-sidebar-sub-headers .vp-sidebar-link{padding-top:.25rem;padding-bottom:.25rem;border-inline-start:none}.vp-sidebar-sub-headers .vp-sidebar-link.active{background:transparent;font-weight:500}.vp-sidebar-group:not(.collapsible) .vp-sidebar-heading:not(.clickable){color:inherit;cursor:auto}.vp-sidebar-group .vp-sidebar-group{padding-inline-start:.75rem}.vp-sidebar-group .vp-sidebar-group .vp-sidebar-heading{font-size:1em}.vp-sidebar-group .vp-sidebar-link{padding-inline-start:1.25rem}.vp-sidebar-links,.vp-sidebar-links ul{margin:0;padding:0}.vp-sidebar-links ul.vp-sidebar-sub-headers{padding-inline-start:.75rem;font-size:.95em}@media (min-width: 1440px){.has-toc .vp-sidebar-links ul.vp-sidebar-sub-headers{display:none}}.vp-sidebar-links li{list-style-type:none}.vp-sidebar>.vp-sidebar-links{padding:1.5rem 0}@media (max-width: 719px){.vp-sidebar>.vp-sidebar-links{padding:1rem 0}}.vp-sidebar>.vp-sidebar-links>li>.vp-sidebar-link{font-size:1.1em}.vp-sidebar>.vp-sidebar-links>li:not(:first-child){margin-top:.5rem}.vp-sidebar{position:fixed;top:0;bottom:0;inset-inline-start:0;z-index:1;overflow-y:auto;width:var(--sidebar-width);margin:0;padding-inline-start:calc(var(--sidebar-space) - var(--sidebar-width));background:var(--sidebar-bg-color);box-shadow:2px 0 8px var(--card-shadow);font-size:.94rem;transition:background var(--color-transition),box-shadow var(--color-transition),padding var(--transform-transition),transform var(--transform-transition);-webkit-backdrop-filter:saturate(150%) blur(12px);backdrop-filter:saturate(150%) blur(12px);scrollbar-color:var(--theme-color) var(--border-color);scrollbar-width:thin}@media (max-width: 959px){.vp-sidebar{font-size:.86em}}@media (max-width: 719px){.vp-sidebar{z-index:125;box-shadow:none;transform:translate(-100%)}html[dir=rtl] .vp-sidebar{transform:translate(100%)}}@media (min-width: 1440px){.vp-sidebar{padding-bottom:3rem;box-shadow:none;font-size:1rem}}@media print{.vp-sidebar{display:none}}.vp-sidebar a{display:inline-block;color:var(--text-color);font-weight:400}.vp-sidebar .icon{margin-inline-end:.25em;font-size:1em}.vp-sidebar img.icon{vertical-align:-.125em;height:1em}.vp-sidebar.hide-icon .icon{display:none!important}.vp-sidebar-mask{position:fixed;top:0;right:0;bottom:0;left:0;z-index:9;background:rgba(0,0,0,.15)}.vp-sidebar-mask.fade-enter-active,.vp-sidebar-mask.fade-leave-active{transition:opacity .25s}.vp-sidebar-mask.fade-enter-from,.vp-sidebar-mask.fade-leave-to{opacity:0}
<!doctype html>
<html lang="zh-CN" data-theme="light">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<meta name="generator" content="VuePress 2.0.0-beta.67" />
<meta name="theme" content="VuePress Theme Hope" />
<meta property="og:url" content="https://vuepress-theme-hope-docs-demo.netlify.app/"><meta property="og:site_name" content="我的简历"><meta property="og:title" content="主页"><meta property="og:description" content="个人在大学/实习期间,参与过多次的技术类赛事项目,熟练使用各类技术框架,积累了丰富的开发经验。同时兼具着对技术的喜爱,长期对技术源码进行钻研学习吸收其中的设计精髓。尤其对 MyBatis 源码学习后,开发了一款监控 SQL 慢查询以及优化建议插件。并将此插件发布到了 IDEA Plugin 插件市场,半年获得了3000次下载量,获得了非常好的认可,个人..."><meta property="og:type" content="website"><meta property="og:locale" content="zh-CN"><meta property="article:author" content="Mr.Hope"><script type="application/ld+json">{"@context":"https://schema.org","@type":"WebPage","name":"主页","description":"个人在大学/实习期间,参与过多次的技术类赛事项目,熟练使用各类技术框架,积累了丰富的开发经验。同时兼具着对技术的喜爱,长期对技术源码进行钻研学习吸收其中的设计精髓。尤其对 MyBatis 源码学习后,开发了一款监控 SQL 慢查询以及优化建议插件。并将此插件发布到了 IDEA Plugin 插件市场,半年获得了3000次下载量,获得了非常好的认可,个人..."}</script><title>主页 | 我的简历</title><meta name="description" content="个人在大学/实习期间,参与过多次的技术类赛事项目,熟练使用各类技术框架,积累了丰富的开发经验。同时兼具着对技术的喜爱,长期对技术源码进行钻研学习吸收其中的设计精髓。尤其对 MyBatis 源码学习后,开发了一款监控 SQL 慢查询以及优化建议插件。并将此插件发布到了 IDEA Plugin 插件市场,半年获得了3000次下载量,获得了非常好的认可,个人...">
<style>
:root {
--bg-color: #fff;
}
html[data-theme="dark"] {
--bg-color: #1d1e1f;
}
html,
body {
background: var(--bg-color);
}
</style>
<script>
const userMode = localStorage.getItem("vuepress-theme-hope-scheme");
const systemDarkMode =
window.matchMedia &&
window.matchMedia("(prefers-color-scheme: dark)").matches;
if (userMode === "dark" || (userMode !== "light" && systemDarkMode)) {
document.documentElement.setAttribute("data-theme", "dark");
}
</script>
<link rel="preload" href="/assets/style-e1af0ae0.css" as="style"><link rel="stylesheet" href="/assets/style-e1af0ae0.css">
<link rel="modulepreload" href="/assets/app-89848b6d.js"><link rel="modulepreload" href="/assets/index.html-72fa7116.js"><link rel="modulepreload" href="/assets/plugin-vue_export-helper-c27b6911.js"><link rel="modulepreload" href="/assets/index.html-3ddb8fc8.js"><link rel="prefetch" href="/assets/slides.html-e24915cf.js" as="script"><link rel="prefetch" href="/assets/resume.html-63219902.js" as="script"><link rel="prefetch" href="/assets/index.html-ee414c74.js" as="script"><link rel="prefetch" href="/assets/day01.html-96303a92.js" as="script"><link rel="prefetch" href="/assets/day02.html-bc6452cb.js" as="script"><link rel="prefetch" href="/assets/day03.html-faf19961.js" as="script"><link rel="prefetch" href="/assets/day04.html-f1431c14.js" as="script"><link rel="prefetch" href="/assets/day05.html-e1b66f43.js" as="script"><link rel="prefetch" href="/assets/day06.html-694a0d7d.js" as="script"><link rel="prefetch" href="/assets/day07~day08.html-623b7865.js" as="script"><link rel="prefetch" href="/assets/day09~day10.html-f64b96c2.js" as="script"><link rel="prefetch" href="/assets/day11.html-a02521a7.js" as="script"><link rel="prefetch" href="/assets/day12.html-59d9b776.js" as="script"><link rel="prefetch" href="/assets/404.html-a12454c5.js" as="script"><link rel="prefetch" href="/assets/index.html-38735195.js" as="script"><link rel="prefetch" href="/assets/slides.html-73aa899b.js" as="script"><link rel="prefetch" href="/assets/resume.html-0d5e8b6f.js" as="script"><link rel="prefetch" href="/assets/index.html-604f9d5c.js" as="script"><link rel="prefetch" href="/assets/day01.html-f34d072c.js" as="script"><link rel="prefetch" href="/assets/day02.html-faf555eb.js" as="script"><link rel="prefetch" href="/assets/day03.html-f3141bb2.js" as="script"><link rel="prefetch" href="/assets/day04.html-61a7012e.js" as="script"><link rel="prefetch" href="/assets/day05.html-4698622b.js" as="script"><link rel="prefetch" href="/assets/day06.html-a4c2781d.js" as="script"><link rel="prefetch" href="/assets/day07~day08.html-4e5d7c48.js" as="script"><link rel="prefetch" href="/assets/day09~day10.html-ee1cb17c.js" as="script"><link rel="prefetch" href="/assets/day11.html-13381d55.js" as="script"><link rel="prefetch" href="/assets/day12.html-4bed2fb6.js" as="script"><link rel="prefetch" href="/assets/404.html-4d74dcf3.js" as="script"><link rel="prefetch" href="/assets/index.html-f3051275.js" as="script"><link rel="prefetch" href="/assets/photoswipe.esm-060dc2da.js" as="script">
</head>
<body>
<div id="app"><!--[--><!--[--><!--[--><span tabindex="-1"></span><a href="#main-content" class="vp-skip-link sr-only">跳至主要內容</a><!--]--><div class="theme-container no-sidebar"><!--[--><header id="navbar" class="vp-navbar"><div class="vp-navbar-start"><button type="button" class="vp-toggle-sidebar-button" title="Toggle Sidebar"><span class="icon"></span></button><!--[--><!----><!--]--><!--[--><a class="vp-link vp-brand vp-brand" href="/"><img class="vp-nav-logo" src="/logo.svg" alt="我的简历"><!----><span class="vp-site-name hide-in-pad">我的简历</span></a><!--]--><!--[--><!----><!--]--></div><div class="vp-navbar-center"><!--[--><!----><!--]--><!--[--><nav class="vp-nav-links"><div class="nav-item hide-in-mobile"><a aria-label="主页" class="vp-link nav-link active nav-link active" href="/"><span class="font-icon icon fa-fw fa-sm fas fa-home" style=""></span>主页<!----></a></div><div class="nav-item hide-in-mobile"><a aria-label="个人简历" class="vp-link nav-link nav-link" href="/md/resume.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>个人简历<!----></a></div><div class="nav-item hide-in-mobile"><a aria-label="开发日志" class="vp-link nav-link nav-link" href="/md/dev-log/day01.html"><span class="font-icon icon fa-fw fa-sm fas fa-book" style=""></span>开发日志<!----></a></div></nav><!--]--><!--[--><!----><!--]--></div><div class="vp-navbar-end"><!--[--><!----><!--]--><!--[--><!----><div class="nav-item vp-repo"><a class="vp-repo-link" href="https://github.com/fuzhengwei/xfg-resume-blog" target="_blank" rel="noopener noreferrer" aria-label="GitHub"><svg xmlns="http://www.w3.org/2000/svg" class="icon github-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="github icon" style="width:1.25rem;height:1.25rem;vertical-align:middle;"><path d="M511.957 21.333C241.024 21.333 21.333 240.981 21.333 512c0 216.832 140.544 400.725 335.574 465.664 24.49 4.395 32.256-10.07 32.256-23.083 0-11.69.256-44.245 0-85.205-136.448 29.61-164.736-64.64-164.736-64.64-22.315-56.704-54.4-71.765-54.4-71.765-44.587-30.464 3.285-29.824 3.285-29.824 49.195 3.413 75.179 50.517 75.179 50.517 43.776 75.008 114.816 53.333 142.762 40.79 4.523-31.66 17.152-53.377 31.19-65.537-108.971-12.458-223.488-54.485-223.488-242.602 0-53.547 19.114-97.323 50.517-131.67-5.035-12.33-21.93-62.293 4.779-129.834 0 0 41.258-13.184 134.912 50.346a469.803 469.803 0 0 1 122.88-16.554c41.642.213 83.626 5.632 122.88 16.554 93.653-63.488 134.784-50.346 134.784-50.346 26.752 67.541 9.898 117.504 4.864 129.834 31.402 34.347 50.474 78.123 50.474 131.67 0 188.586-114.73 230.016-224.042 242.09 17.578 15.232 33.578 44.672 33.578 90.454v135.85c0 13.142 7.936 27.606 32.854 22.87C862.25 912.597 1002.667 728.747 1002.667 512c0-271.019-219.648-490.667-490.71-490.667z"></path></svg></a></div><div class="nav-item hide-in-mobile"><button type="button" id="appearance-switch"><svg xmlns="http://www.w3.org/2000/svg" class="icon auto-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="auto icon" style="display:block;"><path d="M512 992C246.92 992 32 777.08 32 512S246.92 32 512 32s480 214.92 480 480-214.92 480-480 480zm0-840c-198.78 0-360 161.22-360 360 0 198.84 161.22 360 360 360s360-161.16 360-360c0-198.78-161.22-360-360-360zm0 660V212c165.72 0 300 134.34 300 300 0 165.72-134.28 300-300 300z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" class="icon dark-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="dark icon" style="display:none;"><path d="M524.8 938.667h-4.267a439.893 439.893 0 0 1-313.173-134.4 446.293 446.293 0 0 1-11.093-597.334A432.213 432.213 0 0 1 366.933 90.027a42.667 42.667 0 0 1 45.227 9.386 42.667 42.667 0 0 1 10.24 42.667 358.4 358.4 0 0 0 82.773 375.893 361.387 361.387 0 0 0 376.747 82.774 42.667 42.667 0 0 1 54.187 55.04 433.493 433.493 0 0 1-99.84 154.88 438.613 438.613 0 0 1-311.467 128z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" class="icon light-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="light icon" style="display:none;"><path d="M952 552h-80a40 40 0 0 1 0-80h80a40 40 0 0 1 0 80zM801.88 280.08a41 41 0 0 1-57.96-57.96l57.96-58a41.04 41.04 0 0 1 58 58l-58 57.96zM512 752a240 240 0 1 1 0-480 240 240 0 0 1 0 480zm0-560a40 40 0 0 1-40-40V72a40 40 0 0 1 80 0v80a40 40 0 0 1-40 40zm-289.88 88.08-58-57.96a41.04 41.04 0 0 1 58-58l57.96 58a41 41 0 0 1-57.96 57.96zM192 512a40 40 0 0 1-40 40H72a40 40 0 0 1 0-80h80a40 40 0 0 1 40 40zm30.12 231.92a41 41 0 0 1 57.96 57.96l-57.96 58a41.04 41.04 0 0 1-58-58l58-57.96zM512 832a40 40 0 0 1 40 40v80a40 40 0 0 1-80 0v-80a40 40 0 0 1 40-40zm289.88-88.08 58 57.96a41.04 41.04 0 0 1-58 58l-57.96-58a41 41 0 0 1 57.96-57.96z"></path></svg></button></div><!----><!--]--><!--[--><!----><!--]--><button type="button" class="vp-toggle-navbar-button" aria-label="Toggle Navbar" aria-expanded="false" aria-controls="nav-screen"><span><span class="vp-top"></span><span class="vp-middle"></span><span class="vp-bottom"></span></span></button></div></header><!----><!--]--><!----><div class="toggle-sidebar-wrapper"><span class="arrow start"></span></div><aside id="sidebar" class="vp-sidebar"><!--[--><!----><!--]--><ul class="vp-sidebar-links"></ul><!--[--><!----><!--]--></aside><!--[--><main id="main-content" class="vp-project-home" aria-labelledby="main-title"><!----><header class="vp-hero-info-wrapper"><!--[--><div class="vp-hero-mask light" style="background-image:url(https://theme-hope-assets.vuejs.press/bg/6-light.svg);background-attachment:fixed;"></div><div class="vp-hero-mask dark" style="background-image:url(https://theme-hope-assets.vuejs.press/bg/6-dark.svg);background-attachment:fixed;"></div><!--]--><div class="vp-hero-info"><!--[--><img class="vp-hero-image" style="" src="/logo.svg" alt="我的博客简历"><!--]--><div class="vp-hero-infos"><h1 id="main-title">我的博客简历</h1><p class="vp-description">您好,我叫小傅哥,毕业于🎓吉林大学。在校期间积累了不错的编程经验,可熟练运用主流分布式技术栈,独立开发项目。</p><p class="vp-actions"><a aria-label="查看简历 👣" class="vp-link nav-link vp-action primary nav-link vp-action primary" href="/./md/"><!---->查看简历 👣<!----></a><a href="https://openai.gaga.plus/" rel="noopener noreferrer" target="_blank" aria-label="我的项目 💐" class="nav-link vp-action default"><!---->我的项目 💐<!----><!----></a></p></div></div></header><!--[--><div class="vp-feature-wrapper"><div class="vp-feature-bg light" style="background-image:url(/assets/bg/6-light.svg);"></div><div class="vp-feature-bg dark" style="background-image:url(/assets/bg/6-dark.svg);"></div><div class="vp-feature" style=""><!--[--><!----><!----><!--]--><!--[--><!----><!----><!--]--><div class="vp-features"><a class="vp-feature-item link" href="https://theme-hope.vuejs.press/zh/guide/markdown/others.html#link-check" role="navigation" aria-label="公众号 - 抽奖系统" target="_blank"><h3 class="vp-feature-title"><span class="font-icon icon fa-fw fa-sm fas fa-comment-dots" style=""></span><span>公众号 - 抽奖系统</span></h3><p class="vp-feature-details">23年1月,以DDD领域驱动设计架构,开发完成分布式抽奖系统。运用了全面的分布式技术栈。</p></a><a class="vp-feature-item link" href="https://theme-hope.vuejs.press/zh/guide/markdown/container.html" role="navigation" aria-label="手写 MyBatis" target="_blank"><h3 class="vp-feature-title"><span class="font-icon icon fa-fw fa-sm fas fa-box-archive" style=""></span><span>手写 MyBatis</span></h3><p class="vp-feature-details">23年4月,深度学习《手写MyBatis:渐进式源码实践》一书,完整实现了一个 MyBatis ORM 框架。</p></a><a class="vp-feature-item link" href="https://theme-hope.vuejs.press/zh/guide/markdown/tabs.html" role="navigation" aria-label="OpenAI 应用服务" target="_blank"><h3 class="vp-feature-title"><span class="font-icon icon fa-fw fa-sm fas fa-table-columns" style=""></span><span>OpenAI 应用服务</span></h3><p class="vp-feature-details">23年8月,学习 OpenAi 技术,学习 OpenAi SDK 开发,完成应用场景的对接使用「涵盖支付对接」。</p></a><a class="vp-feature-item link" href="https://theme-hope.vuejs.press/zh/guide/markdown/tabs.html" role="navigation" aria-label="SpringBoot Stater" target="_blank"><h3 class="vp-feature-title"><span class="font-icon icon fa-fw fa-sm fas fa-table-columns" style=""></span><span>SpringBoot Stater</span></h3><p class="vp-feature-details">23年10月,通过对业务项目开发中的学习,对同类共性功能的重复开发,凝练成通用的服务治理组件。</p></a></div></div></div><!--]--><!----><div class="theme-hope-content"><br><div class="hint-container tip"><p class="hint-container-title">提示</p><p>个人在大学/实习期间,参与过多次的技术类赛事项目,熟练使用各类技术框架,积累了丰富的开发经验。同时兼具着对技术的喜爱,长期对技术源码进行钻研学习吸收其中的设计精髓。尤其对 MyBatis 源码学习后,开发了一款监控 SQL 慢查询以及优化建议插件。并将此插件发布到了 IDEA Plugin 插件市场,半年获得了3000次下载量,获得了非常好的认可,个人也得到了非常多的成长。地址:http://github.com/xxxx/xxxx</p></div><blockquote><p>我是一名热爱技术的Java程序员,自从踏入这个充满挑战与机遇的专业以来,我始终保持着对技术的高度热情和追求。我深信技术的力量可以改变世界,也能够提升个人的专业素养。在日常工作中,我不仅注重个人技能的提升,更致力于跟踪和学习行业内的最新技术动态,如SpringBoot、微服务架构、容器化技术等,以确保自己的技术栈始终保持现代化和竞争力。</p></blockquote></div><!----></main><!--]--><footer class="vp-footer-wrapper"><div class="vp-footer"><div class="content"><a href="http://beian.miit.gov.cn" target="_blank">京ICP备1903****号</a> | MIT 协议, 版权所有 © 2023 你的名字,All rights reserved.</div></div><!----></footer></div><!--]--><!----><!--]--></div>
<script type="module" src="/assets/app-89848b6d.js" defer></script>
</body>
</html>
<svg t="1706580631944" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="15077" width="512" height="512"><path d="M224 960v-16c0-116.57 128.94-176 288-176s288 59.43 288 176v16z" fill="#646464" p-id="15078"></path><path d="M800 968H224a8 8 0 0 1-8-8v-16c0-58.06 30.58-106 88.42-138.68C356.93 775.67 428.71 760 512 760s155.07 15.67 207.58 45.32C777.42 838 808 885.94 808 944v16a8 8 0 0 1-8 8z m-568-16h560v-8c0-102.06-109.91-168-280-168s-280 65.94-280 168z" fill="#222222" p-id="15079"></path><path d="M560 688h-96v80l48 48 48-48v-80z" fill="#FFCEBF" p-id="15080"></path><path d="M512 827.31l-56-56V680h112v91.31z m-40-62.62l40 40 40-40V696h-80z" fill="#222222" p-id="15081"></path><path d="M506.38 349.89L168.75 223.16c-13.54-5.08-13.93-24.08-0.61-29.72l337.63-142.8a15.94 15.94 0 0 1 12.46 0l337.63 142.8c13.32 5.64 12.93 24.64-0.61 29.72L517.62 349.89a16 16 0 0 1-11.24 0z" fill="#646464" p-id="15082"></path><path d="M512 358.91a24 24 0 0 1-8.43-1.53L165.93 230.65a24 24 0 0 1-0.91-44.57L502.65 43.27a24.16 24.16 0 0 1 18.7 0L859 186.08a24 24 0 0 1-0.91 44.57L520.43 357.38a24 24 0 0 1-8.43 1.53z m-2.81-16.51a8 8 0 0 0 5.62 0l337.63-126.73a8 8 0 0 0 0.31-14.86L515.12 58a8.13 8.13 0 0 0-6.24 0L171.25 200.81a8 8 0 0 0 0.31 14.86L509.19 342.4z" fill="#222222" p-id="15083"></path><path d="M287.08 463.69m-57.54 0a57.54 57.54 0 1 0 115.08 0 57.54 57.54 0 1 0-115.08 0Z" fill="#FFCEBF" p-id="15084"></path><path d="M287.08 529.23a65.54 65.54 0 1 1 65.54-65.54 65.61 65.61 0 0 1-65.54 65.54z m0-115.08a49.54 49.54 0 1 0 49.54 49.54 49.6 49.6 0 0 0-49.54-49.54z" fill="#222222" p-id="15085"></path><path d="M736.92 463.69m-57.54 0a57.54 57.54 0 1 0 115.08 0 57.54 57.54 0 1 0-115.08 0Z" fill="#FFCEBF" p-id="15086"></path><path d="M736.92 529.23a65.54 65.54 0 1 1 65.54-65.54 65.62 65.62 0 0 1-65.54 65.54z m0-115.08a49.54 49.54 0 1 0 49.54 49.54 49.6 49.6 0 0 0-49.54-49.54z" fill="#222222" p-id="15087"></path><path d="M741.32 376l0.83 98.82C742.15 610.24 639.11 720 512 720S281.85 610.24 281.85 474.84l0.83-98.82S304 224 512 224s229.32 152 229.32 152z" fill="#FFCEBF" p-id="15088"></path><path d="M512 728c-63.71 0-123.58-26.4-168.58-74.33s-69.57-111.31-69.57-178.83l0.83-99.41 0.08-0.52c0.23-1.64 6-40.69 38.41-80 19-23 43.17-41.33 71.93-54.45C420.71 224.23 463.4 216 512 216s91.29 8.23 126.9 24.47c28.76 13.12 53 31.44 71.93 54.45 32.4 39.3 38.18 78.35 38.41 80l0.08 0.52v0.56l0.83 98.82c0 67.59-24.71 131.1-69.57 178.9S575.71 728 512 728zM290.67 376.69l-0.82 98.21C289.85 605.61 389.5 712 512 712s222.15-106.39 222.15-237.16l-0.82-98.15c-0.75-4.33-7.34-38.56-35.38-72.24C657.93 256.38 595.36 232 512 232s-145.93 24.38-185.95 72.45c-28.05 33.68-34.63 67.91-35.38 72.24z" fill="#222222" p-id="15089"></path><path d="M428.31 440h-11.5a31.39 31.39 0 0 0-60.7 0h-11.49a8 8 0 0 0 0 16h11.49a31.39 31.39 0 0 0 60.7 0h11.5a8 8 0 0 0 0-16zM679.38 440h-11.49a31.39 31.39 0 0 0-60.7 0h-11.5a8 8 0 0 0 0 16h11.5a31.39 31.39 0 0 0 60.7 0h11.49a8 8 0 1 0 0-16z" fill="#222222" p-id="15090"></path><path d="M752.62 406.15C752.62 273.27 656.44 176 512 176s-240.62 97.27-240.62 230.15c0 0 52.31 0 136-62.77-10.46 31.39-20.92 52.31-20.92 52.31s115.08-10.46 240.62-62.77c0 31.39-31.39 52.31-31.39 52.31s41.85 20.92 94.16-31.38c31.38 52.3 62.77 52.3 62.77 52.3z" fill="#644B46" p-id="15091"></path><path d="M752.62 414.15c-1.39 0-32.7-0.57-64.33-47.81-52.42 47.05-94.34 27-96.18 26.05a8 8 0 0 1-0.86-13.82c0.22-0.14 19.32-13.21 25.75-32.92-120.12 47.6-228.69 57.91-229.81 58a8 8 0 0 1-7.88-11.55c0.07-0.14 5.22-10.52 11.82-27.35-72.59 48.78-117.69 49.39-119.75 49.39a8 8 0 0 1-8-8c0-67 24.36-127.66 68.57-170.64a229.21 229.21 0 0 1 78.66-49.71C441.56 174 475.67 168 512 168s70.44 6 101.39 17.8a229.21 229.21 0 0 1 78.66 49.71c44.21 43 68.57 103.59 68.57 170.64a8 8 0 0 1-8 8zM512 184c-133.83 0-228.23 87.22-232.47 213.25 17.38-2.79 61.57-14.15 123.05-60.27a8 8 0 0 1 12.42 8.93c-5.64 16.93-11.25 30.8-15.3 40.15 34.15-4.56 126.5-19.77 224.3-60.52a8 8 0 0 1 11.08 7.38c0 21.41-12.36 38.21-22.39 48.32 14.9 1.31 40.92-2.47 71.5-33.05a8 8 0 0 1 12.52 1.54c18.84 31.41 37.39 42.46 47.71 46.34C739.64 270.67 645.42 184 512 184z" fill="#222222" p-id="15092"></path><path d="M302.76 521.23a36.62 20.92 0 1 0 73.24 0 36.62 20.92 0 1 0-73.24 0Z" fill="#FFA096" p-id="15093"></path><path d="M648 521.23a36.62 20.92 0 1 0 73.24 0 36.62 20.92 0 1 0-73.24 0Z" fill="#FFA096" p-id="15094"></path><path d="M736 192s-32-48-224-48-224 48-224 48l-16 176s48-48 240-48 240 48 240 48z" fill="#505050" p-id="15095"></path><path d="M272 376a7.92 7.92 0 0 1-3.41-0.77 8 8 0 0 1-4.55-8l16-176a8 8 0 0 1 1.31-3.72c1-1.45 10.4-14.51 43.85-27.05C368.56 144.25 431.41 136 512 136s143.44 8.25 186.81 24.51c33.45 12.54 42.88 25.6 43.85 27.05a8 8 0 0 1 1.31 3.72l16 176a8 8 0 0 1-13.63 6.38c-0.06-0.06-12.19-11.47-47-22.76C667.2 340.45 608.57 328 512 328s-155.2 12.45-187.38 22.9c-34.77 11.29-46.9 22.7-47 22.81A7.9 7.9 0 0 1 272 376z m240-64c139.08 0 204.19 25.05 230.5 39.83l-14.24-156.56c-3.2-3.27-13.51-12.1-38.11-20.89C661.57 164.17 607.46 152 512 152s-149.57 12.17-178.15 22.38c-24.6 8.79-34.91 17.62-38.11 20.89L281.5 351.83C307.81 337.05 372.92 312 512 312z m217.44-115.42z" fill="#222222" p-id="15096"></path><path d="M391.7 776.07L511.64 880l120.18-104.18L704 800 511.64 959.64 320 800l71.7-23.93z" fill="#505050" p-id="15097"></path><path d="M511.64 967.64a8 8 0 0 1-5.12-1.86L314.88 806.15a8 8 0 0 1 2.59-13.74l71.7-23.93a8 8 0 0 1 7.77 1.54l114.7 99.39 114.94-99.64a8 8 0 0 1 7.78-1.54l72.18 24.18a8 8 0 0 1 2.57 13.75L516.75 965.79a8 8 0 0 1-5.11 1.85zM336.15 803l175.5 146.19L687.83 803l-54.22-18.17L516.88 886a8 8 0 0 1-10.48 0L389.91 785.1zM856 208h16v240h-16z" fill="#222222" p-id="15098"></path><path d="M848 512h32v176h-32z" fill="#FFBE00" p-id="15099"></path><path d="M880 696h-32a8 8 0 0 1-8-8V512a8 8 0 0 1 8-8h32a8 8 0 0 1 8 8v176a8 8 0 0 1-8 8z m-24-16h16V520h-16z" fill="#222222" p-id="15100"></path><path d="M864 480m-32 0a32 32 0 1 0 64 0 32 32 0 1 0-64 0Z" fill="#FFBE00" p-id="15101"></path><path d="M864 520a40 40 0 1 1 40-40 40 40 0 0 1-40 40z m0-64a24 24 0 1 0 24 24 24 24 0 0 0-24-24z" fill="#222222" p-id="15102"></path><path d="M512 672c45 0 83-29 95.1-68.78 4.14-13.6-6.53-27.22-21.18-27.22H438.08c-14.65 0-25.32 13.62-21.18 27.22C429 643 467 672 512 672z" fill="#FF6242" p-id="15103"></path><path d="M567.08 661.33c0-29.45-24.66-53.33-55.08-53.33s-55.08 23.88-55.08 53.33c0 0 23.08 10.67 55.08 10.67s55.08-10.67 55.08-10.67z" fill="#FFA096" p-id="15104"></path><path d="M610.31 580.18A30.39 30.39 0 0 0 585.92 568H438.08a30.39 30.39 0 0 0-24.39 12.18 28.36 28.36 0 0 0-4.44 25.37c0.5 1.63 1.05 3.24 1.63 4.84a2.35 2.35 0 0 0 0.11 0.35c0.21 0.59 0.45 1.16 0.67 1.74 0.16 0.41 0.31 0.82 0.48 1.23 0.43 1.07 0.88 2.14 1.35 3.2 0.05 0.12 0.1 0.24 0.16 0.36a103.58 103.58 0 0 0 23.44 33.05 106.88 106.88 0 0 0 10.3 8.65 108.06 108.06 0 0 0 60.36 20.95c1.41 0.05 2.83 0.08 4.25 0.08s2.84 0 4.25-0.08A108.06 108.06 0 0 0 576.61 659a105.67 105.67 0 0 0 10.31-8.66 103.66 103.66 0 0 0 23.43-33c0.06-0.12 0.11-0.24 0.16-0.36 0.47-1.06 0.92-2.13 1.35-3.2 0.17-0.41 0.32-0.82 0.48-1.23 0.22-0.58 0.46-1.15 0.67-1.74a2.35 2.35 0 0 0 0.11-0.35c0.58-1.6 1.13-3.21 1.63-4.84a28.36 28.36 0 0 0-4.44-25.44z m-183.77 9.52a14.19 14.19 0 0 1 11.54-5.7h147.84a14.19 14.19 0 0 1 11.54 5.7 12.54 12.54 0 0 1 2 11.19c-0.61 2-1.31 4-2.05 5.88-0.16 0.41-0.32 0.83-0.49 1.24-0.34 0.85-0.7 1.69-1.07 2.52l-0.27 0.62c-13.3 29.36-42.68 49.8-76 52.53h-0.17c-1.06 0.09-2.14 0.15-3.21 0.2h-0.53c-1.23 0-2.47 0.07-3.71 0.07s-2.48 0-3.71-0.07h-0.53c-1.07 0-2.15-0.11-3.21-0.2h-0.17c-33.27-2.73-62.65-23.17-75.95-52.53l-0.27-0.62c-0.37-0.83-0.73-1.67-1.07-2.52-0.17-0.41-0.33-0.83-0.49-1.24-0.74-1.93-1.44-3.89-2.05-5.88a12.54 12.54 0 0 1 2.03-11.19z" fill="#222222" p-id="15105"></path></svg>
\ No newline at end of file
<!doctype html>
<html lang="zh-CN" data-theme="light">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<meta name="generator" content="VuePress 2.0.0-beta.67" />
<meta name="theme" content="VuePress Theme Hope" />
<meta property="og:url" content="https://vuepress-theme-hope-docs-demo.netlify.app/md/dev-log/day01.html"><meta property="og:site_name" content="我的简历"><meta property="og:title" content="Day01"><meta property="og:description" content="任务 [x] 环境配置; [x] 搭建项目结构; [x] 跑通广播模式 RPC 过程调用; 学习过程 1. 项目整体了解 通过对第一节文档的阅读,了解整个项目的生命周期、所需要的技术以及代码提交规范 2. 搭建项目结构,理解每个模块应该干什么 模块 作用 | ---------------------- ----------------------..."><meta property="og:type" content="article"><meta property="og:locale" content="zh-CN"><meta property="article:author" content="Mr.Hope"><script type="application/ld+json">{"@context":"https://schema.org","@type":"Article","headline":"Day01","image":[""],"dateModified":null,"author":[{"@type":"Person","name":"Mr.Hope","url":"https://mister-hope.com"}]}</script><title>Day01 | 我的简历</title><meta name="description" content="任务 [x] 环境配置; [x] 搭建项目结构; [x] 跑通广播模式 RPC 过程调用; 学习过程 1. 项目整体了解 通过对第一节文档的阅读,了解整个项目的生命周期、所需要的技术以及代码提交规范 2. 搭建项目结构,理解每个模块应该干什么 模块 作用 | ---------------------- ----------------------...">
<style>
:root {
--bg-color: #fff;
}
html[data-theme="dark"] {
--bg-color: #1d1e1f;
}
html,
body {
background: var(--bg-color);
}
</style>
<script>
const userMode = localStorage.getItem("vuepress-theme-hope-scheme");
const systemDarkMode =
window.matchMedia &&
window.matchMedia("(prefers-color-scheme: dark)").matches;
if (userMode === "dark" || (userMode !== "light" && systemDarkMode)) {
document.documentElement.setAttribute("data-theme", "dark");
}
</script>
<link rel="preload" href="/assets/style-e1af0ae0.css" as="style"><link rel="stylesheet" href="/assets/style-e1af0ae0.css">
<link rel="modulepreload" href="/assets/app-89848b6d.js"><link rel="modulepreload" href="/assets/day01.html-f34d072c.js"><link rel="modulepreload" href="/assets/plugin-vue_export-helper-c27b6911.js"><link rel="modulepreload" href="/assets/day01.html-96303a92.js"><link rel="prefetch" href="/assets/index.html-3ddb8fc8.js" as="script"><link rel="prefetch" href="/assets/slides.html-e24915cf.js" as="script"><link rel="prefetch" href="/assets/resume.html-63219902.js" as="script"><link rel="prefetch" href="/assets/index.html-ee414c74.js" as="script"><link rel="prefetch" href="/assets/day02.html-bc6452cb.js" as="script"><link rel="prefetch" href="/assets/day03.html-faf19961.js" as="script"><link rel="prefetch" href="/assets/day04.html-f1431c14.js" as="script"><link rel="prefetch" href="/assets/day05.html-e1b66f43.js" as="script"><link rel="prefetch" href="/assets/day06.html-694a0d7d.js" as="script"><link rel="prefetch" href="/assets/day07~day08.html-623b7865.js" as="script"><link rel="prefetch" href="/assets/day09~day10.html-f64b96c2.js" as="script"><link rel="prefetch" href="/assets/day11.html-a02521a7.js" as="script"><link rel="prefetch" href="/assets/day12.html-59d9b776.js" as="script"><link rel="prefetch" href="/assets/404.html-a12454c5.js" as="script"><link rel="prefetch" href="/assets/index.html-38735195.js" as="script"><link rel="prefetch" href="/assets/index.html-72fa7116.js" as="script"><link rel="prefetch" href="/assets/slides.html-73aa899b.js" as="script"><link rel="prefetch" href="/assets/resume.html-0d5e8b6f.js" as="script"><link rel="prefetch" href="/assets/index.html-604f9d5c.js" as="script"><link rel="prefetch" href="/assets/day02.html-faf555eb.js" as="script"><link rel="prefetch" href="/assets/day03.html-f3141bb2.js" as="script"><link rel="prefetch" href="/assets/day04.html-61a7012e.js" as="script"><link rel="prefetch" href="/assets/day05.html-4698622b.js" as="script"><link rel="prefetch" href="/assets/day06.html-a4c2781d.js" as="script"><link rel="prefetch" href="/assets/day07~day08.html-4e5d7c48.js" as="script"><link rel="prefetch" href="/assets/day09~day10.html-ee1cb17c.js" as="script"><link rel="prefetch" href="/assets/day11.html-13381d55.js" as="script"><link rel="prefetch" href="/assets/day12.html-4bed2fb6.js" as="script"><link rel="prefetch" href="/assets/404.html-4d74dcf3.js" as="script"><link rel="prefetch" href="/assets/index.html-f3051275.js" as="script"><link rel="prefetch" href="/assets/photoswipe.esm-060dc2da.js" as="script">
</head>
<body>
<div id="app"><!--[--><!--[--><!--[--><span tabindex="-1"></span><a href="#main-content" class="vp-skip-link sr-only">跳至主要內容</a><!--]--><div class="theme-container has-toc"><!--[--><header id="navbar" class="vp-navbar"><div class="vp-navbar-start"><button type="button" class="vp-toggle-sidebar-button" title="Toggle Sidebar"><span class="icon"></span></button><!--[--><!----><!--]--><!--[--><a class="vp-link vp-brand vp-brand" href="/"><img class="vp-nav-logo" src="/logo.svg" alt="我的简历"><!----><span class="vp-site-name hide-in-pad">我的简历</span></a><!--]--><!--[--><!----><!--]--></div><div class="vp-navbar-center"><!--[--><!----><!--]--><!--[--><nav class="vp-nav-links"><div class="nav-item hide-in-mobile"><a aria-label="主页" class="vp-link nav-link nav-link" href="/"><span class="font-icon icon fa-fw fa-sm fas fa-home" style=""></span>主页<!----></a></div><div class="nav-item hide-in-mobile"><a aria-label="个人简历" class="vp-link nav-link nav-link" href="/md/resume.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>个人简历<!----></a></div><div class="nav-item hide-in-mobile"><a aria-label="开发日志" class="vp-link nav-link active nav-link active" href="/md/dev-log/day01.html"><span class="font-icon icon fa-fw fa-sm fas fa-book" style=""></span>开发日志<!----></a></div></nav><!--]--><!--[--><!----><!--]--></div><div class="vp-navbar-end"><!--[--><!----><!--]--><!--[--><!----><div class="nav-item vp-repo"><a class="vp-repo-link" href="https://github.com/fuzhengwei/xfg-resume-blog" target="_blank" rel="noopener noreferrer" aria-label="GitHub"><svg xmlns="http://www.w3.org/2000/svg" class="icon github-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="github icon" style="width:1.25rem;height:1.25rem;vertical-align:middle;"><path d="M511.957 21.333C241.024 21.333 21.333 240.981 21.333 512c0 216.832 140.544 400.725 335.574 465.664 24.49 4.395 32.256-10.07 32.256-23.083 0-11.69.256-44.245 0-85.205-136.448 29.61-164.736-64.64-164.736-64.64-22.315-56.704-54.4-71.765-54.4-71.765-44.587-30.464 3.285-29.824 3.285-29.824 49.195 3.413 75.179 50.517 75.179 50.517 43.776 75.008 114.816 53.333 142.762 40.79 4.523-31.66 17.152-53.377 31.19-65.537-108.971-12.458-223.488-54.485-223.488-242.602 0-53.547 19.114-97.323 50.517-131.67-5.035-12.33-21.93-62.293 4.779-129.834 0 0 41.258-13.184 134.912 50.346a469.803 469.803 0 0 1 122.88-16.554c41.642.213 83.626 5.632 122.88 16.554 93.653-63.488 134.784-50.346 134.784-50.346 26.752 67.541 9.898 117.504 4.864 129.834 31.402 34.347 50.474 78.123 50.474 131.67 0 188.586-114.73 230.016-224.042 242.09 17.578 15.232 33.578 44.672 33.578 90.454v135.85c0 13.142 7.936 27.606 32.854 22.87C862.25 912.597 1002.667 728.747 1002.667 512c0-271.019-219.648-490.667-490.71-490.667z"></path></svg></a></div><div class="nav-item hide-in-mobile"><button type="button" id="appearance-switch"><svg xmlns="http://www.w3.org/2000/svg" class="icon auto-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="auto icon" style="display:block;"><path d="M512 992C246.92 992 32 777.08 32 512S246.92 32 512 32s480 214.92 480 480-214.92 480-480 480zm0-840c-198.78 0-360 161.22-360 360 0 198.84 161.22 360 360 360s360-161.16 360-360c0-198.78-161.22-360-360-360zm0 660V212c165.72 0 300 134.34 300 300 0 165.72-134.28 300-300 300z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" class="icon dark-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="dark icon" style="display:none;"><path d="M524.8 938.667h-4.267a439.893 439.893 0 0 1-313.173-134.4 446.293 446.293 0 0 1-11.093-597.334A432.213 432.213 0 0 1 366.933 90.027a42.667 42.667 0 0 1 45.227 9.386 42.667 42.667 0 0 1 10.24 42.667 358.4 358.4 0 0 0 82.773 375.893 361.387 361.387 0 0 0 376.747 82.774 42.667 42.667 0 0 1 54.187 55.04 433.493 433.493 0 0 1-99.84 154.88 438.613 438.613 0 0 1-311.467 128z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" class="icon light-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="light icon" style="display:none;"><path d="M952 552h-80a40 40 0 0 1 0-80h80a40 40 0 0 1 0 80zM801.88 280.08a41 41 0 0 1-57.96-57.96l57.96-58a41.04 41.04 0 0 1 58 58l-58 57.96zM512 752a240 240 0 1 1 0-480 240 240 0 0 1 0 480zm0-560a40 40 0 0 1-40-40V72a40 40 0 0 1 80 0v80a40 40 0 0 1-40 40zm-289.88 88.08-58-57.96a41.04 41.04 0 0 1 58-58l57.96 58a41 41 0 0 1-57.96 57.96zM192 512a40 40 0 0 1-40 40H72a40 40 0 0 1 0-80h80a40 40 0 0 1 40 40zm30.12 231.92a41 41 0 0 1 57.96 57.96l-57.96 58a41.04 41.04 0 0 1-58-58l58-57.96zM512 832a40 40 0 0 1 40 40v80a40 40 0 0 1-80 0v-80a40 40 0 0 1 40-40zm289.88-88.08 58 57.96a41.04 41.04 0 0 1-58 58l-57.96-58a41 41 0 0 1 57.96-57.96z"></path></svg></button></div><!----><!--]--><!--[--><!----><!--]--><button type="button" class="vp-toggle-navbar-button" aria-label="Toggle Navbar" aria-expanded="false" aria-controls="nav-screen"><span><span class="vp-top"></span><span class="vp-middle"></span><span class="vp-bottom"></span></span></button></div></header><!----><!--]--><!----><div class="toggle-sidebar-wrapper"><span class="arrow start"></span></div><aside id="sidebar" class="vp-sidebar"><!--[--><!----><!--]--><ul class="vp-sidebar-links"><li><!--[--><a aria-label="主页" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/"><span class="font-icon icon fa-fw fa-sm fas fa-home" style=""></span>主页<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><section class="vp-sidebar-group"><p class="vp-sidebar-heading active"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span><span class="vp-sidebar-title">Lottery 项目开发日志</span><!----></p><ul class="vp-sidebar-links"><li><!--[--><a aria-label="Day01" class="vp-link nav-link active vp-sidebar-link vp-sidebar-page active nav-link active vp-sidebar-link vp-sidebar-page active" href="/md/dev-log/day01.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day01<!----></a><ul class="vp-sidebar-sub-headers"><li class="vp-sidebar-sub-header"><a aria-label="任务" class="vp-link nav-link vp-sidebar-link vp-heading nav-link vp-sidebar-link vp-heading" href="/md/dev-log/day01.html#任务"><!---->任务<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a aria-label="学习过程" class="vp-link nav-link vp-sidebar-link vp-heading nav-link vp-sidebar-link vp-heading" href="/md/dev-log/day01.html#学习过程"><!---->学习过程<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a aria-label="遇到的问题" class="vp-link nav-link vp-sidebar-link vp-heading nav-link vp-sidebar-link vp-heading" href="/md/dev-log/day01.html#遇到的问题"><!---->遇到的问题<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a aria-label="总结" class="vp-link nav-link vp-sidebar-link vp-heading nav-link vp-sidebar-link vp-heading" href="/md/dev-log/day01.html#总结"><!---->总结<!----></a><ul class="vp-sidebar-sub-headers"></ul></li></ul><!--]--></li><li><!--[--><a aria-label="Day02" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day02.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day02<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day03" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day03.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day03<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day04" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day04.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day04<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day05" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day05.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day05<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day06" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day06.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day06<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day07 ~ Day08" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day07~day08.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day07 ~ Day08<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day09 ~ Day10" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day09~day10.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day09 ~ Day10<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day011" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day11.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day011<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day012" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day12.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day012<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li></ul></section></li></ul><!--[--><!----><!--]--></aside><!--[--><main id="main-content" class="vp-page"><!--[--><!----><!----><nav class="vp-breadcrumb disable"></nav><div class="vp-page-title"><h1><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day01</h1><div class="page-info"><span class="page-author-info" aria-label="作者🖊" data-balloon-pos="down"><svg xmlns="http://www.w3.org/2000/svg" class="icon author-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="author icon"><path d="M649.6 633.6c86.4-48 147.2-144 147.2-249.6 0-160-128-288-288-288s-288 128-288 288c0 108.8 57.6 201.6 147.2 249.6-121.6 48-214.4 153.6-240 288-3.2 9.6 0 19.2 6.4 25.6 3.2 9.6 12.8 12.8 22.4 12.8h704c9.6 0 19.2-3.2 25.6-12.8 6.4-6.4 9.6-16 6.4-25.6-25.6-134.4-121.6-240-243.2-288z"></path></svg><span><a class="page-author-item" href="https://mister-hope.com" target="_blank" rel="noopener noreferrer">Mr.Hope</a></span><span property="author" content="Mr.Hope"></span></span><!----><!----><!----><span class="page-reading-time-info" aria-label="阅读时间⌛" data-balloon-pos="down"><svg xmlns="http://www.w3.org/2000/svg" class="icon timer-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="timer icon"><path d="M799.387 122.15c4.402-2.978 7.38-7.897 7.38-13.463v-1.165c0-8.933-7.38-16.312-16.312-16.312H256.33c-8.933 0-16.311 7.38-16.311 16.312v1.165c0 5.825 2.977 10.874 7.637 13.592 4.143 194.44 97.22 354.963 220.201 392.763-122.204 37.542-214.893 196.511-220.2 389.397-4.661 5.049-7.638 11.651-7.638 19.03v5.825h566.49v-5.825c0-7.379-2.849-13.981-7.509-18.9-5.049-193.016-97.867-351.985-220.2-389.527 123.24-37.67 216.446-198.453 220.588-392.892zM531.16 450.445v352.632c117.674 1.553 211.787 40.778 211.787 88.676H304.097c0-48.286 95.149-87.382 213.728-88.676V450.445c-93.077-3.107-167.901-81.297-167.901-177.093 0-8.803 6.99-15.793 15.793-15.793 8.803 0 15.794 6.99 15.794 15.793 0 80.261 63.69 145.635 142.01 145.635s142.011-65.374 142.011-145.635c0-8.803 6.99-15.793 15.794-15.793s15.793 6.99 15.793 15.793c0 95.019-73.789 172.82-165.96 177.093z"></path></svg><span>大约 4 分钟</span><meta property="timeRequired" content="PT4M"></span><span class="page-category-info" aria-label="分类🌈" data-balloon-pos="down"><svg xmlns="http://www.w3.org/2000/svg" class="icon category-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="category icon"><path d="M148.41 106.992h282.176c22.263 0 40.31 18.048 40.31 40.31V429.48c0 22.263-18.047 40.31-40.31 40.31H148.41c-22.263 0-40.311-18.047-40.311-40.31V147.302c0-22.263 18.048-40.31 40.311-40.31zM147.556 553.478H429.73c22.263 0 40.311 18.048 40.311 40.31v282.176c0 22.263-18.048 40.312-40.31 40.312H147.555c-22.263 0-40.311-18.049-40.311-40.312V593.79c0-22.263 18.048-40.311 40.31-40.311zM593.927 106.992h282.176c22.263 0 40.31 18.048 40.31 40.31V429.48c0 22.263-18.047 40.31-40.31 40.31H593.927c-22.263 0-40.311-18.047-40.311-40.31V147.302c0-22.263 18.048-40.31 40.31-40.31zM730.22 920.502H623.926c-40.925 0-74.22-33.388-74.22-74.425V623.992c0-41.038 33.387-74.424 74.425-74.424h222.085c41.038 0 74.424 33.226 74.424 74.067v114.233c0 10.244-8.304 18.548-18.547 18.548s-18.548-8.304-18.548-18.548V623.635c0-20.388-16.746-36.974-37.33-36.974H624.13c-20.585 0-37.331 16.747-37.331 37.33v222.086c0 20.585 16.654 37.331 37.126 37.331H730.22c10.243 0 18.547 8.304 18.547 18.547 0 10.244-8.304 18.547-18.547 18.547z"></path></svg><!--[--><span class="page-category-item category1" role>开发笔记</span><span class="page-category-item category7" role>学习记录</span><!--]--><meta property="articleSection" content="开发笔记,学习记录"></span><!----></div><hr></div><div class="toc-place-holder"><aside id="toc"><!--[--><!----><!--]--><div class="toc-header">此页内容<button type="button" class="print-button" title="打印"><svg xmlns="http://www.w3.org/2000/svg" class="icon print-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="print icon"><path d="M819.2 364.8h-44.8V128c0-17.067-14.933-32-32-32H281.6c-17.067 0-32 14.933-32 32v236.8h-44.8C145.067 364.8 96 413.867 96 473.6v192c0 59.733 49.067 108.8 108.8 108.8h44.8V896c0 17.067 14.933 32 32 32h460.8c17.067 0 32-14.933 32-32V774.4h44.8c59.733 0 108.8-49.067 108.8-108.8v-192c0-59.733-49.067-108.8-108.8-108.8zM313.6 160h396.8v204.8H313.6V160zm396.8 704H313.6V620.8h396.8V864zM864 665.6c0 25.6-19.2 44.8-44.8 44.8h-44.8V588.8c0-17.067-14.933-32-32-32H281.6c-17.067 0-32 14.933-32 32v121.6h-44.8c-25.6 0-44.8-19.2-44.8-44.8v-192c0-25.6 19.2-44.8 44.8-44.8h614.4c25.6 0 44.8 19.2 44.8 44.8v192z"></path></svg></button></div><div class="toc-wrapper"><ul class="toc-list"><!--[--><li class="toc-item"><a class="vp-link toc-link level2 toc-link level2" href="/#任务">任务</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level2 toc-link level2" href="/#学习过程">学习过程</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level2 toc-link level2" href="/#遇到的问题">遇到的问题</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level2 toc-link level2" href="/#总结">总结</a></li><!----><!--]--></ul><div class="toc-marker" style="top:-1.7rem;"></div></div><!--[--><!----><!--]--></aside></div><!----><div class="theme-hope-content"><h2 id="任务" tabindex="-1"><a class="header-anchor" href="#任务" aria-hidden="true">#</a> 任务</h2><ul><li>[x] 环境配置</li><li>[x] 搭建项目结构</li><li>[x] 跑通广播模式 RPC 过程调用</li></ul><h2 id="学习过程" tabindex="-1"><a class="header-anchor" href="#学习过程" aria-hidden="true">#</a> 学习过程</h2><ol><li><p>项目整体了解</p><p>通过对第一节文档的阅读,了解整个项目的生命周期、所需要的技术以及代码提交规范</p></li><li><p>搭建项目结构,理解每个模块应该干什么</p><table><thead><tr><th>模块</th><th>作用</th></tr></thead><tbody><tr><td>Lottery</td><td>总项目,用来管理整个项目的依赖</td></tr><tr><td>lottery-application</td><td>应用层,为用户接口层提供各种应用数据展现支持服务</td></tr><tr><td>lottery-common</td><td>定义通用数据,比如统一响应数据、常量、异常、枚举等</td></tr><tr><td>lottery-domain</td><td>领域层,核心业务逻辑</td></tr><tr><td>lottery-infrastructure</td><td>基础层,为其他各层提供通用技术能力,包括数据库、Redis、ES 等</td></tr><tr><td>lottery-interfaces</td><td>用户接口层,存放与前端交互、展现数据相关的代码</td></tr><tr><td>lottery-rpc</td><td>RPC 接口文件</td></tr></tbody></table><blockquote><p>注:因为并不了解 DDD 架构,所以每个模块目前只有模糊的概念,具体的东西在后续代码编写中进行体会</p></blockquote></li><li><p>阅读 <a href="https://gitcode.net/KnowledgePlanet/Lottery/-/tree/210801_xfg_initProject" target="_blank" rel="noopener noreferrer">210801_xfg_initProject<span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">open in new window</span></span></a> 分支上的 POM 文件</p><p>通过对 POM 文件的阅读,更加清楚的了解这个项目所使用的技术,并且通过阅读发现项目没有添加 Lombok 来简化开发,具体项目开发是否使用这个插件我不知道,但是我想用,因为我<strong></strong>,所以就给加上了😄</p></li><li><p>跑通 RPC</p><ol><li>定义 response 状态码枚举供通用返回对象 Result 进行使用</li><li>定义通用返回对象 Result 类</li><li>定义 activity 表的持久化对象</li><li>定义 activity 表的 Mapper 接口</li><li>定义 mybatis 配置文件</li><li>定义 activity 表的 mapper.xml 文件</li><li>定义 rpc 的数据传输对象(DTO) ActivityDto</li><li>定义 rpc 的 请求对象 ActivityReq</li><li>定义 rpc 的响应对象 ActivityRes</li><li>定义 rpc 接口 IActivityBooth</li><li>实现 IActivityBooth 接口</li><li>编写启动类</li><li>编写配置文件 application.yml</li><li>编写测试模块 <strong>这个我是直接加在工程里面的,教程是单独开了一个项目</strong></li></ol></li></ol><h2 id="遇到的问题" tabindex="-1"><a class="header-anchor" href="#遇到的问题" aria-hidden="true">#</a> 遇到的问题</h2><ol><li><p>代码分层不清晰,不知道每个模块应该干什么事</p><p>这个问题该怎么解决呢?我觉得最好的解决办法就是不解决,哈哈哈,因为当初学 MVC 的时候最开始也不清楚为什么要这样分层,为什么就要分 Controller、Service 和 DAO,但是后来经过大量代码的编写,也逐渐熟悉了这样的分层架构,所以现在并不想解决这个问题,具体还是靠后面的代码进行了解和熟悉吧</p></li><li><p>JSON.toJSonString() 方法返回了空 <code>{}</code></p><p>问题出现原因,忘了加 <code>@Data</code> 注解,导致没有 <code>getter/setter</code> 就导致了这个问题,加上注解即可</p><p>解决!</p></li><li><p>数据库乱码问题</p><p>测试模块 RPC 远程调用返回的结果为:</p><div class="language-json line-numbers-mode" data-ext="json"><pre class="language-json"><code>测试结果:<span class="token punctuation">{</span><span class="token property">&quot;activity&quot;</span><span class="token operator">:</span><span class="token punctuation">{</span><span class="token property">&quot;activityDesc&quot;</span><span class="token operator">:</span><span class="token string">&quot;?????????&quot;</span><span class="token punctuation">,</span><span class="token property">&quot;activityId&quot;</span><span class="token operator">:</span><span class="token number">100002</span><span class="token punctuation">,</span><span class="token property">&quot;activityName&quot;</span><span class="token operator">:</span><span class="token string">&quot;????&quot;</span><span class="token punctuation">,</span><span class="token property">&quot;beginDateTime&quot;</span><span class="token operator">:</span><span class="token number">1705215282000</span><span class="token punctuation">,</span><span class="token property">&quot;endDateTime&quot;</span><span class="token operator">:</span><span class="token number">1705215282000</span><span class="token punctuation">,</span><span class="token property">&quot;stockCount&quot;</span><span class="token operator">:</span><span class="token number">100</span><span class="token punctuation">,</span><span class="token property">&quot;takeCount&quot;</span><span class="token operator">:</span><span class="token number">10</span><span class="token punctuation">}</span><span class="token punctuation">,</span><span class="token property">&quot;result&quot;</span><span class="token operator">:</span><span class="token punctuation">{</span><span class="token property">&quot;code&quot;</span><span class="token operator">:</span><span class="token string">&quot;0000&quot;</span><span class="token punctuation">,</span><span class="token property">&quot;info&quot;</span><span class="token operator">:</span><span class="token string">&quot;成功&quot;</span><span class="token punctuation">}</span><span class="token punctuation">}</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>明显的乱码问题,查看数据库,发现插入的时候就以及乱码了,看了一下配置文件中的数据库连接 url,发现使用了 useUnicode=true,并没有指定字符集,所以添加一下 utf-8 字符集即可,完整 url: <code>jdbc:mysql://127.0.0.1:3306/lottery?useUnicode=true&amp;characterEncoding=UTF-8</code></p><p>再进行一轮测试,测试结果:</p><div class="language-json line-numbers-mode" data-ext="json"><pre class="language-json"><code>测试结果:<span class="token punctuation">{</span><span class="token property">&quot;activity&quot;</span><span class="token operator">:</span><span class="token punctuation">{</span><span class="token property">&quot;activityDesc&quot;</span><span class="token operator">:</span><span class="token string">&quot;仅用于插入数据测试&quot;</span><span class="token punctuation">,</span><span class="token property">&quot;activityId&quot;</span><span class="token operator">:</span><span class="token number">100003</span><span class="token punctuation">,</span><span class="token property">&quot;activityName&quot;</span><span class="token operator">:</span><span class="token string">&quot;测试活动&quot;</span><span class="token punctuation">,</span><span class="token property">&quot;beginDateTime&quot;</span><span class="token operator">:</span><span class="token number">1705218054000</span><span class="token punctuation">,</span><span class="token property">&quot;endDateTime&quot;</span><span class="token operator">:</span><span class="token number">1705218054000</span><span class="token punctuation">,</span><span class="token property">&quot;stockCount&quot;</span><span class="token operator">:</span><span class="token number">100</span><span class="token punctuation">,</span><span class="token property">&quot;takeCount&quot;</span><span class="token operator">:</span><span class="token number">10</span><span class="token punctuation">}</span><span class="token punctuation">,</span><span class="token property">&quot;result&quot;</span><span class="token operator">:</span><span class="token punctuation">{</span><span class="token property">&quot;code&quot;</span><span class="token operator">:</span><span class="token string">&quot;0000&quot;</span><span class="token punctuation">,</span><span class="token property">&quot;info&quot;</span><span class="token operator">:</span><span class="token string">&quot;成功&quot;</span><span class="token punctuation">}</span><span class="token punctuation">}</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>解决!</p></li></ol><h2 id="总结" tabindex="-1"><a class="header-anchor" href="#总结" aria-hidden="true">#</a> 总结</h2><p>今天干了说明呢?</p><ol><li>配置环境</li><li>跑通 RPC</li></ol><p>具体怎么跑通 RPC 的呢?</p><ol><li>在 common 模块创建通用类</li><li>在 infrastructure 模块创建 dao 接口以及和数据库相对应的 po 类</li><li>在 rpc 模块下创建 RPC 通信接口以及对应的请求和响应的封装类</li><li>然后在 interfaces 模块下实现 rpc 模块的接口,在这里调用 Mapper 进行增删改查</li><li>然后就写配置呗,SpringBoot 配置、Dubbo 配置、MyBatis 配置</li></ol><p>学到了什么呢?</p><ol><li>由于之前学习一直使用的是 MVC 架构,并且命名不太规范,所以对于包的命名现在很不适应,比如什么dto、vo啥的各种 o 不太熟悉,这个就不准备纠结了,准备靠代码量进行熟悉</li><li>对每个模块有了大概的了解,至少知道了接口写在哪个模块,接口实现类在哪个模块以及 Mapper 写在哪</li><li>现在在我眼中,这个 interfaces 模块,就跟以前学的 Dubbo 的服务提供者一样吧?因为这个模块用来实现接口的,所以就会引用其他模块,要调用其他模块的东西就要添加依赖,所以这个模块起起来之后,就带动了所有模块,整个项目也就 run 起来了</li></ol><p>第一天,脑子还有点迷糊,因为基础不太牢固,所以有些小 bug 花费了挺长时间的,但是至少是跑起来了吧?也还行,路虽远,行则将至嘛,虽然年后要找实习,但是还是慌不得,慢慢来,一口吃不成个大胖子,准备晚上再补一补 Dubbo 基础</p></div><!----><footer class="page-meta"><div class="meta-item edit-link"><a href="https://github.com/fuzhengwei/xfg-resume-blog/edit/main/src/md/dev-log/day01.md" rel="noopener noreferrer" target="_blank" aria-label="在 GitHub 上编辑此页" class="nav-link label"><!--[--><svg xmlns="http://www.w3.org/2000/svg" class="icon edit-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="edit icon"><path d="M430.818 653.65a60.46 60.46 0 0 1-50.96-93.281l71.69-114.012 7.773-10.365L816.038 80.138A60.46 60.46 0 0 1 859.225 62a60.46 60.46 0 0 1 43.186 18.138l43.186 43.186a60.46 60.46 0 0 1 0 86.373L588.879 565.55l-8.637 8.637-117.466 68.234a60.46 60.46 0 0 1-31.958 11.229z"></path><path d="M728.802 962H252.891A190.883 190.883 0 0 1 62.008 771.98V296.934a190.883 190.883 0 0 1 190.883-192.61h267.754a60.46 60.46 0 0 1 0 120.92H252.891a69.962 69.962 0 0 0-69.098 69.099V771.98a69.962 69.962 0 0 0 69.098 69.098h475.911A69.962 69.962 0 0 0 797.9 771.98V503.363a60.46 60.46 0 1 1 120.922 0V771.98A190.883 190.883 0 0 1 728.802 962z"></path></svg><!--]-->在 GitHub 上编辑此页<span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">open in new window</span></span><!----></a></div><div class="meta-item git-info"><!----><!----></div></footer><nav class="vp-page-nav"><!----><a aria-label="Day02" class="vp-link nav-link next nav-link next" href="/md/dev-log/day02.html"><div class="hint">下一页<span class="arrow end"></span></div><div class="link">Day02<span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span></div></a></nav><!----><!----><!--]--></main><!--]--><footer class="vp-footer-wrapper"><div class="vp-footer">我的微信:fustack</div><div class="vp-copyright">Copyright © 2024 Mr.Hope</div></footer></div><!--]--><!----><!--]--></div>
<script type="module" src="/assets/app-89848b6d.js" defer></script>
</body>
</html>
<!doctype html>
<html lang="zh-CN" data-theme="light">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<meta name="generator" content="VuePress 2.0.0-beta.67" />
<meta name="theme" content="VuePress Theme Hope" />
<meta property="og:url" content="https://vuepress-theme-hope-docs-demo.netlify.app/md/dev-log/day02.html"><meta property="og:site_name" content="我的简历"><meta property="og:title" content="Day02"><meta property="og:description" content="任务 [x] 表设计; [x] 抽奖领域模块开发; 学习过程 1. 查询分库分表相关知识点,了解到垂直和水平分库分表,主要是为了解决数据量过大导致 MySQL 查询慢、单体容量过大问题 2. 开始写代码 1. 编写基础的持久化对象 (PO) 2. 编写 Mapper 接口 3. 编写对应的 Mapper.xml 4. 设计抽奖策略顶级接口,主要是入参..."><meta property="og:type" content="article"><meta property="og:locale" content="zh-CN"><meta property="article:author" content="Mr.Hope"><script type="application/ld+json">{"@context":"https://schema.org","@type":"Article","headline":"Day02","image":[""],"dateModified":null,"author":[{"@type":"Person","name":"Mr.Hope","url":"https://mister-hope.com"}]}</script><title>Day02 | 我的简历</title><meta name="description" content="任务 [x] 表设计; [x] 抽奖领域模块开发; 学习过程 1. 查询分库分表相关知识点,了解到垂直和水平分库分表,主要是为了解决数据量过大导致 MySQL 查询慢、单体容量过大问题 2. 开始写代码 1. 编写基础的持久化对象 (PO) 2. 编写 Mapper 接口 3. 编写对应的 Mapper.xml 4. 设计抽奖策略顶级接口,主要是入参...">
<style>
:root {
--bg-color: #fff;
}
html[data-theme="dark"] {
--bg-color: #1d1e1f;
}
html,
body {
background: var(--bg-color);
}
</style>
<script>
const userMode = localStorage.getItem("vuepress-theme-hope-scheme");
const systemDarkMode =
window.matchMedia &&
window.matchMedia("(prefers-color-scheme: dark)").matches;
if (userMode === "dark" || (userMode !== "light" && systemDarkMode)) {
document.documentElement.setAttribute("data-theme", "dark");
}
</script>
<link rel="preload" href="/assets/style-e1af0ae0.css" as="style"><link rel="stylesheet" href="/assets/style-e1af0ae0.css">
<link rel="modulepreload" href="/assets/app-89848b6d.js"><link rel="modulepreload" href="/assets/day02.html-faf555eb.js"><link rel="modulepreload" href="/assets/plugin-vue_export-helper-c27b6911.js"><link rel="modulepreload" href="/assets/day02.html-bc6452cb.js"><link rel="prefetch" href="/assets/index.html-3ddb8fc8.js" as="script"><link rel="prefetch" href="/assets/slides.html-e24915cf.js" as="script"><link rel="prefetch" href="/assets/resume.html-63219902.js" as="script"><link rel="prefetch" href="/assets/index.html-ee414c74.js" as="script"><link rel="prefetch" href="/assets/day01.html-96303a92.js" as="script"><link rel="prefetch" href="/assets/day03.html-faf19961.js" as="script"><link rel="prefetch" href="/assets/day04.html-f1431c14.js" as="script"><link rel="prefetch" href="/assets/day05.html-e1b66f43.js" as="script"><link rel="prefetch" href="/assets/day06.html-694a0d7d.js" as="script"><link rel="prefetch" href="/assets/day07~day08.html-623b7865.js" as="script"><link rel="prefetch" href="/assets/day09~day10.html-f64b96c2.js" as="script"><link rel="prefetch" href="/assets/day11.html-a02521a7.js" as="script"><link rel="prefetch" href="/assets/day12.html-59d9b776.js" as="script"><link rel="prefetch" href="/assets/404.html-a12454c5.js" as="script"><link rel="prefetch" href="/assets/index.html-38735195.js" as="script"><link rel="prefetch" href="/assets/index.html-72fa7116.js" as="script"><link rel="prefetch" href="/assets/slides.html-73aa899b.js" as="script"><link rel="prefetch" href="/assets/resume.html-0d5e8b6f.js" as="script"><link rel="prefetch" href="/assets/index.html-604f9d5c.js" as="script"><link rel="prefetch" href="/assets/day01.html-f34d072c.js" as="script"><link rel="prefetch" href="/assets/day03.html-f3141bb2.js" as="script"><link rel="prefetch" href="/assets/day04.html-61a7012e.js" as="script"><link rel="prefetch" href="/assets/day05.html-4698622b.js" as="script"><link rel="prefetch" href="/assets/day06.html-a4c2781d.js" as="script"><link rel="prefetch" href="/assets/day07~day08.html-4e5d7c48.js" as="script"><link rel="prefetch" href="/assets/day09~day10.html-ee1cb17c.js" as="script"><link rel="prefetch" href="/assets/day11.html-13381d55.js" as="script"><link rel="prefetch" href="/assets/day12.html-4bed2fb6.js" as="script"><link rel="prefetch" href="/assets/404.html-4d74dcf3.js" as="script"><link rel="prefetch" href="/assets/index.html-f3051275.js" as="script"><link rel="prefetch" href="/assets/photoswipe.esm-060dc2da.js" as="script">
</head>
<body>
<div id="app"><!--[--><!--[--><!--[--><span tabindex="-1"></span><a href="#main-content" class="vp-skip-link sr-only">跳至主要內容</a><!--]--><div class="theme-container has-toc"><!--[--><header id="navbar" class="vp-navbar"><div class="vp-navbar-start"><button type="button" class="vp-toggle-sidebar-button" title="Toggle Sidebar"><span class="icon"></span></button><!--[--><!----><!--]--><!--[--><a class="vp-link vp-brand vp-brand" href="/"><img class="vp-nav-logo" src="/logo.svg" alt="我的简历"><!----><span class="vp-site-name hide-in-pad">我的简历</span></a><!--]--><!--[--><!----><!--]--></div><div class="vp-navbar-center"><!--[--><!----><!--]--><!--[--><nav class="vp-nav-links"><div class="nav-item hide-in-mobile"><a aria-label="主页" class="vp-link nav-link nav-link" href="/"><span class="font-icon icon fa-fw fa-sm fas fa-home" style=""></span>主页<!----></a></div><div class="nav-item hide-in-mobile"><a aria-label="个人简历" class="vp-link nav-link nav-link" href="/md/resume.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>个人简历<!----></a></div><div class="nav-item hide-in-mobile"><a aria-label="开发日志" class="vp-link nav-link nav-link" href="/md/dev-log/day01.html"><span class="font-icon icon fa-fw fa-sm fas fa-book" style=""></span>开发日志<!----></a></div></nav><!--]--><!--[--><!----><!--]--></div><div class="vp-navbar-end"><!--[--><!----><!--]--><!--[--><!----><div class="nav-item vp-repo"><a class="vp-repo-link" href="https://github.com/fuzhengwei/xfg-resume-blog" target="_blank" rel="noopener noreferrer" aria-label="GitHub"><svg xmlns="http://www.w3.org/2000/svg" class="icon github-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="github icon" style="width:1.25rem;height:1.25rem;vertical-align:middle;"><path d="M511.957 21.333C241.024 21.333 21.333 240.981 21.333 512c0 216.832 140.544 400.725 335.574 465.664 24.49 4.395 32.256-10.07 32.256-23.083 0-11.69.256-44.245 0-85.205-136.448 29.61-164.736-64.64-164.736-64.64-22.315-56.704-54.4-71.765-54.4-71.765-44.587-30.464 3.285-29.824 3.285-29.824 49.195 3.413 75.179 50.517 75.179 50.517 43.776 75.008 114.816 53.333 142.762 40.79 4.523-31.66 17.152-53.377 31.19-65.537-108.971-12.458-223.488-54.485-223.488-242.602 0-53.547 19.114-97.323 50.517-131.67-5.035-12.33-21.93-62.293 4.779-129.834 0 0 41.258-13.184 134.912 50.346a469.803 469.803 0 0 1 122.88-16.554c41.642.213 83.626 5.632 122.88 16.554 93.653-63.488 134.784-50.346 134.784-50.346 26.752 67.541 9.898 117.504 4.864 129.834 31.402 34.347 50.474 78.123 50.474 131.67 0 188.586-114.73 230.016-224.042 242.09 17.578 15.232 33.578 44.672 33.578 90.454v135.85c0 13.142 7.936 27.606 32.854 22.87C862.25 912.597 1002.667 728.747 1002.667 512c0-271.019-219.648-490.667-490.71-490.667z"></path></svg></a></div><div class="nav-item hide-in-mobile"><button type="button" id="appearance-switch"><svg xmlns="http://www.w3.org/2000/svg" class="icon auto-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="auto icon" style="display:block;"><path d="M512 992C246.92 992 32 777.08 32 512S246.92 32 512 32s480 214.92 480 480-214.92 480-480 480zm0-840c-198.78 0-360 161.22-360 360 0 198.84 161.22 360 360 360s360-161.16 360-360c0-198.78-161.22-360-360-360zm0 660V212c165.72 0 300 134.34 300 300 0 165.72-134.28 300-300 300z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" class="icon dark-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="dark icon" style="display:none;"><path d="M524.8 938.667h-4.267a439.893 439.893 0 0 1-313.173-134.4 446.293 446.293 0 0 1-11.093-597.334A432.213 432.213 0 0 1 366.933 90.027a42.667 42.667 0 0 1 45.227 9.386 42.667 42.667 0 0 1 10.24 42.667 358.4 358.4 0 0 0 82.773 375.893 361.387 361.387 0 0 0 376.747 82.774 42.667 42.667 0 0 1 54.187 55.04 433.493 433.493 0 0 1-99.84 154.88 438.613 438.613 0 0 1-311.467 128z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" class="icon light-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="light icon" style="display:none;"><path d="M952 552h-80a40 40 0 0 1 0-80h80a40 40 0 0 1 0 80zM801.88 280.08a41 41 0 0 1-57.96-57.96l57.96-58a41.04 41.04 0 0 1 58 58l-58 57.96zM512 752a240 240 0 1 1 0-480 240 240 0 0 1 0 480zm0-560a40 40 0 0 1-40-40V72a40 40 0 0 1 80 0v80a40 40 0 0 1-40 40zm-289.88 88.08-58-57.96a41.04 41.04 0 0 1 58-58l57.96 58a41 41 0 0 1-57.96 57.96zM192 512a40 40 0 0 1-40 40H72a40 40 0 0 1 0-80h80a40 40 0 0 1 40 40zm30.12 231.92a41 41 0 0 1 57.96 57.96l-57.96 58a41.04 41.04 0 0 1-58-58l58-57.96zM512 832a40 40 0 0 1 40 40v80a40 40 0 0 1-80 0v-80a40 40 0 0 1 40-40zm289.88-88.08 58 57.96a41.04 41.04 0 0 1-58 58l-57.96-58a41 41 0 0 1 57.96-57.96z"></path></svg></button></div><!----><!--]--><!--[--><!----><!--]--><button type="button" class="vp-toggle-navbar-button" aria-label="Toggle Navbar" aria-expanded="false" aria-controls="nav-screen"><span><span class="vp-top"></span><span class="vp-middle"></span><span class="vp-bottom"></span></span></button></div></header><!----><!--]--><!----><div class="toggle-sidebar-wrapper"><span class="arrow start"></span></div><aside id="sidebar" class="vp-sidebar"><!--[--><!----><!--]--><ul class="vp-sidebar-links"><li><!--[--><a aria-label="主页" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/"><span class="font-icon icon fa-fw fa-sm fas fa-home" style=""></span>主页<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><section class="vp-sidebar-group"><p class="vp-sidebar-heading active"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span><span class="vp-sidebar-title">Lottery 项目开发日志</span><!----></p><ul class="vp-sidebar-links"><li><!--[--><a aria-label="Day01" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day01.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day01<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day02" class="vp-link nav-link active vp-sidebar-link vp-sidebar-page active nav-link active vp-sidebar-link vp-sidebar-page active" href="/md/dev-log/day02.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day02<!----></a><ul class="vp-sidebar-sub-headers"><li class="vp-sidebar-sub-header"><a aria-label="任务" class="vp-link nav-link vp-sidebar-link vp-heading nav-link vp-sidebar-link vp-heading" href="/md/dev-log/day02.html#任务"><!---->任务<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a aria-label="学习过程" class="vp-link nav-link vp-sidebar-link vp-heading nav-link vp-sidebar-link vp-heading" href="/md/dev-log/day02.html#学习过程"><!---->学习过程<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a aria-label="遇到的问题" class="vp-link nav-link vp-sidebar-link vp-heading nav-link vp-sidebar-link vp-heading" href="/md/dev-log/day02.html#遇到的问题"><!---->遇到的问题<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a aria-label="总结" class="vp-link nav-link vp-sidebar-link vp-heading nav-link vp-sidebar-link vp-heading" href="/md/dev-log/day02.html#总结"><!---->总结<!----></a><ul class="vp-sidebar-sub-headers"></ul></li></ul><!--]--></li><li><!--[--><a aria-label="Day03" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day03.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day03<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day04" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day04.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day04<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day05" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day05.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day05<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day06" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day06.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day06<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day07 ~ Day08" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day07~day08.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day07 ~ Day08<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day09 ~ Day10" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day09~day10.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day09 ~ Day10<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day011" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day11.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day011<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day012" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day12.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day012<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li></ul></section></li></ul><!--[--><!----><!--]--></aside><!--[--><main id="main-content" class="vp-page"><!--[--><!----><!----><nav class="vp-breadcrumb disable"></nav><div class="vp-page-title"><h1><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day02</h1><div class="page-info"><span class="page-author-info" aria-label="作者🖊" data-balloon-pos="down"><svg xmlns="http://www.w3.org/2000/svg" class="icon author-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="author icon"><path d="M649.6 633.6c86.4-48 147.2-144 147.2-249.6 0-160-128-288-288-288s-288 128-288 288c0 108.8 57.6 201.6 147.2 249.6-121.6 48-214.4 153.6-240 288-3.2 9.6 0 19.2 6.4 25.6 3.2 9.6 12.8 12.8 22.4 12.8h704c9.6 0 19.2-3.2 25.6-12.8 6.4-6.4 9.6-16 6.4-25.6-25.6-134.4-121.6-240-243.2-288z"></path></svg><span><a class="page-author-item" href="https://mister-hope.com" target="_blank" rel="noopener noreferrer">Mr.Hope</a></span><span property="author" content="Mr.Hope"></span></span><!----><!----><!----><span class="page-reading-time-info" aria-label="阅读时间⌛" data-balloon-pos="down"><svg xmlns="http://www.w3.org/2000/svg" class="icon timer-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="timer icon"><path d="M799.387 122.15c4.402-2.978 7.38-7.897 7.38-13.463v-1.165c0-8.933-7.38-16.312-16.312-16.312H256.33c-8.933 0-16.311 7.38-16.311 16.312v1.165c0 5.825 2.977 10.874 7.637 13.592 4.143 194.44 97.22 354.963 220.201 392.763-122.204 37.542-214.893 196.511-220.2 389.397-4.661 5.049-7.638 11.651-7.638 19.03v5.825h566.49v-5.825c0-7.379-2.849-13.981-7.509-18.9-5.049-193.016-97.867-351.985-220.2-389.527 123.24-37.67 216.446-198.453 220.588-392.892zM531.16 450.445v352.632c117.674 1.553 211.787 40.778 211.787 88.676H304.097c0-48.286 95.149-87.382 213.728-88.676V450.445c-93.077-3.107-167.901-81.297-167.901-177.093 0-8.803 6.99-15.793 15.793-15.793 8.803 0 15.794 6.99 15.794 15.793 0 80.261 63.69 145.635 142.01 145.635s142.011-65.374 142.011-145.635c0-8.803 6.99-15.793 15.794-15.793s15.793 6.99 15.793 15.793c0 95.019-73.789 172.82-165.96 177.093z"></path></svg><span>大约 4 分钟</span><meta property="timeRequired" content="PT4M"></span><span class="page-category-info" aria-label="分类🌈" data-balloon-pos="down"><svg xmlns="http://www.w3.org/2000/svg" class="icon category-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="category icon"><path d="M148.41 106.992h282.176c22.263 0 40.31 18.048 40.31 40.31V429.48c0 22.263-18.047 40.31-40.31 40.31H148.41c-22.263 0-40.311-18.047-40.311-40.31V147.302c0-22.263 18.048-40.31 40.311-40.31zM147.556 553.478H429.73c22.263 0 40.311 18.048 40.311 40.31v282.176c0 22.263-18.048 40.312-40.31 40.312H147.555c-22.263 0-40.311-18.049-40.311-40.312V593.79c0-22.263 18.048-40.311 40.31-40.311zM593.927 106.992h282.176c22.263 0 40.31 18.048 40.31 40.31V429.48c0 22.263-18.047 40.31-40.31 40.31H593.927c-22.263 0-40.311-18.047-40.311-40.31V147.302c0-22.263 18.048-40.31 40.31-40.31zM730.22 920.502H623.926c-40.925 0-74.22-33.388-74.22-74.425V623.992c0-41.038 33.387-74.424 74.425-74.424h222.085c41.038 0 74.424 33.226 74.424 74.067v114.233c0 10.244-8.304 18.548-18.547 18.548s-18.548-8.304-18.548-18.548V623.635c0-20.388-16.746-36.974-37.33-36.974H624.13c-20.585 0-37.331 16.747-37.331 37.33v222.086c0 20.585 16.654 37.331 37.126 37.331H730.22c10.243 0 18.547 8.304 18.547 18.547 0 10.244-8.304 18.547-18.547 18.547z"></path></svg><!--[--><span class="page-category-item category1" role>开发笔记</span><span class="page-category-item category7" role>学习记录</span><!--]--><meta property="articleSection" content="开发笔记,学习记录"></span><!----></div><hr></div><div class="toc-place-holder"><aside id="toc"><!--[--><!----><!--]--><div class="toc-header">此页内容<button type="button" class="print-button" title="打印"><svg xmlns="http://www.w3.org/2000/svg" class="icon print-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="print icon"><path d="M819.2 364.8h-44.8V128c0-17.067-14.933-32-32-32H281.6c-17.067 0-32 14.933-32 32v236.8h-44.8C145.067 364.8 96 413.867 96 473.6v192c0 59.733 49.067 108.8 108.8 108.8h44.8V896c0 17.067 14.933 32 32 32h460.8c17.067 0 32-14.933 32-32V774.4h44.8c59.733 0 108.8-49.067 108.8-108.8v-192c0-59.733-49.067-108.8-108.8-108.8zM313.6 160h396.8v204.8H313.6V160zm396.8 704H313.6V620.8h396.8V864zM864 665.6c0 25.6-19.2 44.8-44.8 44.8h-44.8V588.8c0-17.067-14.933-32-32-32H281.6c-17.067 0-32 14.933-32 32v121.6h-44.8c-25.6 0-44.8-19.2-44.8-44.8v-192c0-25.6 19.2-44.8 44.8-44.8h614.4c25.6 0 44.8 19.2 44.8 44.8v192z"></path></svg></button></div><div class="toc-wrapper"><ul class="toc-list"><!--[--><li class="toc-item"><a class="vp-link toc-link level2 toc-link level2" href="/#任务">任务</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level2 toc-link level2" href="/#学习过程">学习过程</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level2 toc-link level2" href="/#遇到的问题">遇到的问题</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level2 toc-link level2" href="/#总结">总结</a></li><!----><!--]--></ul><div class="toc-marker" style="top:-1.7rem;"></div></div><!--[--><!----><!--]--></aside></div><!----><div class="theme-hope-content"><h2 id="任务" tabindex="-1"><a class="header-anchor" href="#任务" aria-hidden="true">#</a> 任务</h2><ul><li>[x] 表设计</li><li>[x] 抽奖领域模块开发</li></ul><h2 id="学习过程" tabindex="-1"><a class="header-anchor" href="#学习过程" aria-hidden="true">#</a> 学习过程</h2><ol><li>查询分库分表相关知识点,了解到垂直和水平分库分表,主要是为了解决数据量过大导致 MySQL 查询慢、单体容量过大问题</li><li>开始写代码 <ol><li>编写基础的持久化对象 (PO)</li><li>编写 Mapper 接口</li><li>编写对应的 Mapper.xml</li><li>设计抽奖策略顶级接口,主要是入参出参,如何封装,要封装哪些数据</li><li>编写顶级接口的基础实现,实现里面公用的方法,比如把初始化方法、哈希计算的方法以及判断是否初始化完成</li><li>编写两种算法的实现</li><li>算法单元测试</li></ol></li></ol><h2 id="遇到的问题" tabindex="-1"><a class="header-anchor" href="#遇到的问题" aria-hidden="true">#</a> 遇到的问题</h2><ol><li><p>为什么在设计阶段就考虑分库分表等问题</p><p>在之前的学习过程中,并没有项目环境的支撑,导致了这个问题,一个大的项目,如果要兼顾性能以及代码的可扩展性,那么在数据库设计阶段就应该想到这些,那些是热点数据,那些数据会进行大量的插入,没有全局把控的观念,只有了解这些,才能设计出一个性能良好且代码可维护性高的项目,这个需要项目积累,这是一个很重要的东西,以后在学习的时候一定要多注意这方面,多看看别人的数据库是怎么设计的,以及为什么要这么设计,要有全局把控的观念</p></li><li><p>抽奖算法是怎么实现的呢</p><p>首先这个初始化的时候,传入奖品和对应的概率,然后概率乘以 100,就是对应的下标范围,一个奖品一个范围,是不会重复的,然后经过斐波那契哈希散列算法,将这个对应的下标进行加工,使其均匀的分布在数组中,在对下标进行加工的过程中,确保了无论传入什么数字,都会在 0 ~ 128 的范围内</p><ol><li><p>SingleRateRandomDrawAlgorithm</p><p>这种策略是生成一个 1 ~ 100 的随机数,然后经过 hashIdx 计算对应的下标,然后去上面初始化好的数组中去取奖品</p></li><li><p>DefaultRateRandomDrawAlgorithm</p><p>这是一种必中奖策略,先排除掉不在抽奖范围内的奖品ID,然后生成随机数,然后判断这个随机数是否在指定的范围内,如果不在,那么这个奖品就没中,然后看下一个奖品,重新生成随机数,然后看是否在指定的中奖概率内加上上次生成的随机数范围内</p></li></ol></li></ol><h2 id="总结" tabindex="-1"><a class="header-anchor" href="#总结" aria-hidden="true">#</a> 总结</h2><p>今天主要把抽奖算法给搞定了,虽然代码不多,但是很难理解,最开始都搞不清楚为什么这样子就实现了抽奖算法,不懂这个概率是如何保证的,然后 debug 了好久,发现其实就是一个 128 长度的数组,然后经过哈希散列排列,保证随机的均匀性,其实这 128 长度的数组就已经保证了抽奖的概率,假设不经过哈希算法,直接放进去,假设两个的抽奖概率是 0.1 和 0.2,那么放进去的时候就是下标 1~10 全是第一个奖品,下标 11 ~ 30 全是第二个奖品,随机数生成的是 1 ~ 100,那么第一个奖品也就是有 10 个数字能中奖,那不就是 10% 的中奖概率了么,加哈希散列只是为了均匀分布,增加随机性和公平性</p><p>收获:</p><ol><li>对 DDD 有更深的了解,知道什么类该写在什么包下,比昨天更清楚代码该如何组织了</li><li>了解了分库分表,虽然是第一次接触,但是至少知道了为什么要分库分表,随着项目的进行,就会学会如何分库分表了吧</li><li>了解了 Hash 散列算法,后续看看源码,要搞清楚底层是如何运作的</li></ol></div><!----><footer class="page-meta"><div class="meta-item edit-link"><a href="https://github.com/fuzhengwei/xfg-resume-blog/edit/main/src/md/dev-log/day02.md" rel="noopener noreferrer" target="_blank" aria-label="在 GitHub 上编辑此页" class="nav-link label"><!--[--><svg xmlns="http://www.w3.org/2000/svg" class="icon edit-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="edit icon"><path d="M430.818 653.65a60.46 60.46 0 0 1-50.96-93.281l71.69-114.012 7.773-10.365L816.038 80.138A60.46 60.46 0 0 1 859.225 62a60.46 60.46 0 0 1 43.186 18.138l43.186 43.186a60.46 60.46 0 0 1 0 86.373L588.879 565.55l-8.637 8.637-117.466 68.234a60.46 60.46 0 0 1-31.958 11.229z"></path><path d="M728.802 962H252.891A190.883 190.883 0 0 1 62.008 771.98V296.934a190.883 190.883 0 0 1 190.883-192.61h267.754a60.46 60.46 0 0 1 0 120.92H252.891a69.962 69.962 0 0 0-69.098 69.099V771.98a69.962 69.962 0 0 0 69.098 69.098h475.911A69.962 69.962 0 0 0 797.9 771.98V503.363a60.46 60.46 0 1 1 120.922 0V771.98A190.883 190.883 0 0 1 728.802 962z"></path></svg><!--]-->在 GitHub 上编辑此页<span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">open in new window</span></span><!----></a></div><div class="meta-item git-info"><!----><!----></div></footer><nav class="vp-page-nav"><a aria-label="Day01" class="vp-link nav-link prev nav-link prev" href="/md/dev-log/day01.html"><div class="hint"><span class="arrow start"></span>上一页</div><div class="link"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day01</div></a><a aria-label="Day03" class="vp-link nav-link next nav-link next" href="/md/dev-log/day03.html"><div class="hint">下一页<span class="arrow end"></span></div><div class="link">Day03<span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span></div></a></nav><!----><!----><!--]--></main><!--]--><footer class="vp-footer-wrapper"><div class="vp-footer">我的微信:fustack</div><div class="vp-copyright">Copyright © 2024 Mr.Hope</div></footer></div><!--]--><!----><!--]--></div>
<script type="module" src="/assets/app-89848b6d.js" defer></script>
</body>
</html>
因为 它太大了无法显示 source diff 。你可以改为 查看blob
<!doctype html>
<html lang="zh-CN" data-theme="light">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<meta name="generator" content="VuePress 2.0.0-beta.67" />
<meta name="theme" content="VuePress Theme Hope" />
<meta property="og:url" content="https://vuepress-theme-hope-docs-demo.netlify.app/md/dev-log/day04.html"><meta property="og:site_name" content="我的简历"><meta property="og:title" content="Day04"><meta property="og:description" content="任务 [x] 简单工厂搭建发奖领域; 学习过程 1. 表结构变了,先导入 SQL,然后该对应的 PO 类,然后改一下 Mapper 文件 2. 先把包结构建好 1. 新建一个领域包,负责发奖 2. 领域包内建三个子包,model 实体封装包、repository 提供仓储服务、service 提供具体的服务(重点内容) 3. 看一下代码的继承关系 4...."><meta property="og:type" content="article"><meta property="og:locale" content="zh-CN"><meta property="article:author" content="Mr.Hope"><script type="application/ld+json">{"@context":"https://schema.org","@type":"Article","headline":"Day04","image":[""],"dateModified":null,"author":[{"@type":"Person","name":"Mr.Hope","url":"https://mister-hope.com"}]}</script><title>Day04 | 我的简历</title><meta name="description" content="任务 [x] 简单工厂搭建发奖领域; 学习过程 1. 表结构变了,先导入 SQL,然后该对应的 PO 类,然后改一下 Mapper 文件 2. 先把包结构建好 1. 新建一个领域包,负责发奖 2. 领域包内建三个子包,model 实体封装包、repository 提供仓储服务、service 提供具体的服务(重点内容) 3. 看一下代码的继承关系 4....">
<style>
:root {
--bg-color: #fff;
}
html[data-theme="dark"] {
--bg-color: #1d1e1f;
}
html,
body {
background: var(--bg-color);
}
</style>
<script>
const userMode = localStorage.getItem("vuepress-theme-hope-scheme");
const systemDarkMode =
window.matchMedia &&
window.matchMedia("(prefers-color-scheme: dark)").matches;
if (userMode === "dark" || (userMode !== "light" && systemDarkMode)) {
document.documentElement.setAttribute("data-theme", "dark");
}
</script>
<link rel="preload" href="/assets/style-e1af0ae0.css" as="style"><link rel="stylesheet" href="/assets/style-e1af0ae0.css">
<link rel="modulepreload" href="/assets/app-89848b6d.js"><link rel="modulepreload" href="/assets/day04.html-61a7012e.js"><link rel="modulepreload" href="/assets/plugin-vue_export-helper-c27b6911.js"><link rel="modulepreload" href="/assets/day04.html-f1431c14.js"><link rel="prefetch" href="/assets/index.html-3ddb8fc8.js" as="script"><link rel="prefetch" href="/assets/slides.html-e24915cf.js" as="script"><link rel="prefetch" href="/assets/resume.html-63219902.js" as="script"><link rel="prefetch" href="/assets/index.html-ee414c74.js" as="script"><link rel="prefetch" href="/assets/day01.html-96303a92.js" as="script"><link rel="prefetch" href="/assets/day02.html-bc6452cb.js" as="script"><link rel="prefetch" href="/assets/day03.html-faf19961.js" as="script"><link rel="prefetch" href="/assets/day05.html-e1b66f43.js" as="script"><link rel="prefetch" href="/assets/day06.html-694a0d7d.js" as="script"><link rel="prefetch" href="/assets/day07~day08.html-623b7865.js" as="script"><link rel="prefetch" href="/assets/day09~day10.html-f64b96c2.js" as="script"><link rel="prefetch" href="/assets/day11.html-a02521a7.js" as="script"><link rel="prefetch" href="/assets/day12.html-59d9b776.js" as="script"><link rel="prefetch" href="/assets/404.html-a12454c5.js" as="script"><link rel="prefetch" href="/assets/index.html-38735195.js" as="script"><link rel="prefetch" href="/assets/index.html-72fa7116.js" as="script"><link rel="prefetch" href="/assets/slides.html-73aa899b.js" as="script"><link rel="prefetch" href="/assets/resume.html-0d5e8b6f.js" as="script"><link rel="prefetch" href="/assets/index.html-604f9d5c.js" as="script"><link rel="prefetch" href="/assets/day01.html-f34d072c.js" as="script"><link rel="prefetch" href="/assets/day02.html-faf555eb.js" as="script"><link rel="prefetch" href="/assets/day03.html-f3141bb2.js" as="script"><link rel="prefetch" href="/assets/day05.html-4698622b.js" as="script"><link rel="prefetch" href="/assets/day06.html-a4c2781d.js" as="script"><link rel="prefetch" href="/assets/day07~day08.html-4e5d7c48.js" as="script"><link rel="prefetch" href="/assets/day09~day10.html-ee1cb17c.js" as="script"><link rel="prefetch" href="/assets/day11.html-13381d55.js" as="script"><link rel="prefetch" href="/assets/day12.html-4bed2fb6.js" as="script"><link rel="prefetch" href="/assets/404.html-4d74dcf3.js" as="script"><link rel="prefetch" href="/assets/index.html-f3051275.js" as="script"><link rel="prefetch" href="/assets/photoswipe.esm-060dc2da.js" as="script">
</head>
<body>
<div id="app"><!--[--><!--[--><!--[--><span tabindex="-1"></span><a href="#main-content" class="vp-skip-link sr-only">跳至主要內容</a><!--]--><div class="theme-container has-toc"><!--[--><header id="navbar" class="vp-navbar"><div class="vp-navbar-start"><button type="button" class="vp-toggle-sidebar-button" title="Toggle Sidebar"><span class="icon"></span></button><!--[--><!----><!--]--><!--[--><a class="vp-link vp-brand vp-brand" href="/"><img class="vp-nav-logo" src="/logo.svg" alt="我的简历"><!----><span class="vp-site-name hide-in-pad">我的简历</span></a><!--]--><!--[--><!----><!--]--></div><div class="vp-navbar-center"><!--[--><!----><!--]--><!--[--><nav class="vp-nav-links"><div class="nav-item hide-in-mobile"><a aria-label="主页" class="vp-link nav-link nav-link" href="/"><span class="font-icon icon fa-fw fa-sm fas fa-home" style=""></span>主页<!----></a></div><div class="nav-item hide-in-mobile"><a aria-label="个人简历" class="vp-link nav-link nav-link" href="/md/resume.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>个人简历<!----></a></div><div class="nav-item hide-in-mobile"><a aria-label="开发日志" class="vp-link nav-link nav-link" href="/md/dev-log/day01.html"><span class="font-icon icon fa-fw fa-sm fas fa-book" style=""></span>开发日志<!----></a></div></nav><!--]--><!--[--><!----><!--]--></div><div class="vp-navbar-end"><!--[--><!----><!--]--><!--[--><!----><div class="nav-item vp-repo"><a class="vp-repo-link" href="https://github.com/fuzhengwei/xfg-resume-blog" target="_blank" rel="noopener noreferrer" aria-label="GitHub"><svg xmlns="http://www.w3.org/2000/svg" class="icon github-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="github icon" style="width:1.25rem;height:1.25rem;vertical-align:middle;"><path d="M511.957 21.333C241.024 21.333 21.333 240.981 21.333 512c0 216.832 140.544 400.725 335.574 465.664 24.49 4.395 32.256-10.07 32.256-23.083 0-11.69.256-44.245 0-85.205-136.448 29.61-164.736-64.64-164.736-64.64-22.315-56.704-54.4-71.765-54.4-71.765-44.587-30.464 3.285-29.824 3.285-29.824 49.195 3.413 75.179 50.517 75.179 50.517 43.776 75.008 114.816 53.333 142.762 40.79 4.523-31.66 17.152-53.377 31.19-65.537-108.971-12.458-223.488-54.485-223.488-242.602 0-53.547 19.114-97.323 50.517-131.67-5.035-12.33-21.93-62.293 4.779-129.834 0 0 41.258-13.184 134.912 50.346a469.803 469.803 0 0 1 122.88-16.554c41.642.213 83.626 5.632 122.88 16.554 93.653-63.488 134.784-50.346 134.784-50.346 26.752 67.541 9.898 117.504 4.864 129.834 31.402 34.347 50.474 78.123 50.474 131.67 0 188.586-114.73 230.016-224.042 242.09 17.578 15.232 33.578 44.672 33.578 90.454v135.85c0 13.142 7.936 27.606 32.854 22.87C862.25 912.597 1002.667 728.747 1002.667 512c0-271.019-219.648-490.667-490.71-490.667z"></path></svg></a></div><div class="nav-item hide-in-mobile"><button type="button" id="appearance-switch"><svg xmlns="http://www.w3.org/2000/svg" class="icon auto-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="auto icon" style="display:block;"><path d="M512 992C246.92 992 32 777.08 32 512S246.92 32 512 32s480 214.92 480 480-214.92 480-480 480zm0-840c-198.78 0-360 161.22-360 360 0 198.84 161.22 360 360 360s360-161.16 360-360c0-198.78-161.22-360-360-360zm0 660V212c165.72 0 300 134.34 300 300 0 165.72-134.28 300-300 300z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" class="icon dark-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="dark icon" style="display:none;"><path d="M524.8 938.667h-4.267a439.893 439.893 0 0 1-313.173-134.4 446.293 446.293 0 0 1-11.093-597.334A432.213 432.213 0 0 1 366.933 90.027a42.667 42.667 0 0 1 45.227 9.386 42.667 42.667 0 0 1 10.24 42.667 358.4 358.4 0 0 0 82.773 375.893 361.387 361.387 0 0 0 376.747 82.774 42.667 42.667 0 0 1 54.187 55.04 433.493 433.493 0 0 1-99.84 154.88 438.613 438.613 0 0 1-311.467 128z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" class="icon light-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="light icon" style="display:none;"><path d="M952 552h-80a40 40 0 0 1 0-80h80a40 40 0 0 1 0 80zM801.88 280.08a41 41 0 0 1-57.96-57.96l57.96-58a41.04 41.04 0 0 1 58 58l-58 57.96zM512 752a240 240 0 1 1 0-480 240 240 0 0 1 0 480zm0-560a40 40 0 0 1-40-40V72a40 40 0 0 1 80 0v80a40 40 0 0 1-40 40zm-289.88 88.08-58-57.96a41.04 41.04 0 0 1 58-58l57.96 58a41 41 0 0 1-57.96 57.96zM192 512a40 40 0 0 1-40 40H72a40 40 0 0 1 0-80h80a40 40 0 0 1 40 40zm30.12 231.92a41 41 0 0 1 57.96 57.96l-57.96 58a41.04 41.04 0 0 1-58-58l58-57.96zM512 832a40 40 0 0 1 40 40v80a40 40 0 0 1-80 0v-80a40 40 0 0 1 40-40zm289.88-88.08 58 57.96a41.04 41.04 0 0 1-58 58l-57.96-58a41 41 0 0 1 57.96-57.96z"></path></svg></button></div><!----><!--]--><!--[--><!----><!--]--><button type="button" class="vp-toggle-navbar-button" aria-label="Toggle Navbar" aria-expanded="false" aria-controls="nav-screen"><span><span class="vp-top"></span><span class="vp-middle"></span><span class="vp-bottom"></span></span></button></div></header><!----><!--]--><!----><div class="toggle-sidebar-wrapper"><span class="arrow start"></span></div><aside id="sidebar" class="vp-sidebar"><!--[--><!----><!--]--><ul class="vp-sidebar-links"><li><!--[--><a aria-label="主页" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/"><span class="font-icon icon fa-fw fa-sm fas fa-home" style=""></span>主页<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><section class="vp-sidebar-group"><p class="vp-sidebar-heading active"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span><span class="vp-sidebar-title">Lottery 项目开发日志</span><!----></p><ul class="vp-sidebar-links"><li><!--[--><a aria-label="Day01" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day01.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day01<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day02" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day02.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day02<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day03" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day03.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day03<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day04" class="vp-link nav-link active vp-sidebar-link vp-sidebar-page active nav-link active vp-sidebar-link vp-sidebar-page active" href="/md/dev-log/day04.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day04<!----></a><ul class="vp-sidebar-sub-headers"><li class="vp-sidebar-sub-header"><a aria-label="任务" class="vp-link nav-link vp-sidebar-link vp-heading nav-link vp-sidebar-link vp-heading" href="/md/dev-log/day04.html#任务"><!---->任务<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a aria-label="学习过程" class="vp-link nav-link vp-sidebar-link vp-heading nav-link vp-sidebar-link vp-heading" href="/md/dev-log/day04.html#学习过程"><!---->学习过程<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a aria-label="遇到的问题" class="vp-link nav-link vp-sidebar-link vp-heading nav-link vp-sidebar-link vp-heading" href="/md/dev-log/day04.html#遇到的问题"><!---->遇到的问题<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a aria-label="总结" class="vp-link nav-link vp-sidebar-link vp-heading nav-link vp-sidebar-link vp-heading" href="/md/dev-log/day04.html#总结"><!---->总结<!----></a><ul class="vp-sidebar-sub-headers"></ul></li></ul><!--]--></li><li><!--[--><a aria-label="Day05" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day05.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day05<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day06" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day06.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day06<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day07 ~ Day08" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day07~day08.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day07 ~ Day08<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day09 ~ Day10" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day09~day10.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day09 ~ Day10<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day011" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day11.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day011<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day012" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day12.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day012<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li></ul></section></li></ul><!--[--><!----><!--]--></aside><!--[--><main id="main-content" class="vp-page"><!--[--><!----><!----><nav class="vp-breadcrumb disable"></nav><div class="vp-page-title"><h1><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day04</h1><div class="page-info"><span class="page-author-info" aria-label="作者🖊" data-balloon-pos="down"><svg xmlns="http://www.w3.org/2000/svg" class="icon author-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="author icon"><path d="M649.6 633.6c86.4-48 147.2-144 147.2-249.6 0-160-128-288-288-288s-288 128-288 288c0 108.8 57.6 201.6 147.2 249.6-121.6 48-214.4 153.6-240 288-3.2 9.6 0 19.2 6.4 25.6 3.2 9.6 12.8 12.8 22.4 12.8h704c9.6 0 19.2-3.2 25.6-12.8 6.4-6.4 9.6-16 6.4-25.6-25.6-134.4-121.6-240-243.2-288z"></path></svg><span><a class="page-author-item" href="https://mister-hope.com" target="_blank" rel="noopener noreferrer">Mr.Hope</a></span><span property="author" content="Mr.Hope"></span></span><!----><!----><!----><span class="page-reading-time-info" aria-label="阅读时间⌛" data-balloon-pos="down"><svg xmlns="http://www.w3.org/2000/svg" class="icon timer-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="timer icon"><path d="M799.387 122.15c4.402-2.978 7.38-7.897 7.38-13.463v-1.165c0-8.933-7.38-16.312-16.312-16.312H256.33c-8.933 0-16.311 7.38-16.311 16.312v1.165c0 5.825 2.977 10.874 7.637 13.592 4.143 194.44 97.22 354.963 220.201 392.763-122.204 37.542-214.893 196.511-220.2 389.397-4.661 5.049-7.638 11.651-7.638 19.03v5.825h566.49v-5.825c0-7.379-2.849-13.981-7.509-18.9-5.049-193.016-97.867-351.985-220.2-389.527 123.24-37.67 216.446-198.453 220.588-392.892zM531.16 450.445v352.632c117.674 1.553 211.787 40.778 211.787 88.676H304.097c0-48.286 95.149-87.382 213.728-88.676V450.445c-93.077-3.107-167.901-81.297-167.901-177.093 0-8.803 6.99-15.793 15.793-15.793 8.803 0 15.794 6.99 15.794 15.793 0 80.261 63.69 145.635 142.01 145.635s142.011-65.374 142.011-145.635c0-8.803 6.99-15.793 15.794-15.793s15.793 6.99 15.793 15.793c0 95.019-73.789 172.82-165.96 177.093z"></path></svg><span>大约 2 分钟</span><meta property="timeRequired" content="PT2M"></span><span class="page-category-info" aria-label="分类🌈" data-balloon-pos="down"><svg xmlns="http://www.w3.org/2000/svg" class="icon category-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="category icon"><path d="M148.41 106.992h282.176c22.263 0 40.31 18.048 40.31 40.31V429.48c0 22.263-18.047 40.31-40.31 40.31H148.41c-22.263 0-40.311-18.047-40.311-40.31V147.302c0-22.263 18.048-40.31 40.311-40.31zM147.556 553.478H429.73c22.263 0 40.311 18.048 40.311 40.31v282.176c0 22.263-18.048 40.312-40.31 40.312H147.555c-22.263 0-40.311-18.049-40.311-40.312V593.79c0-22.263 18.048-40.311 40.31-40.311zM593.927 106.992h282.176c22.263 0 40.31 18.048 40.31 40.31V429.48c0 22.263-18.047 40.31-40.31 40.31H593.927c-22.263 0-40.311-18.047-40.311-40.31V147.302c0-22.263 18.048-40.31 40.31-40.31zM730.22 920.502H623.926c-40.925 0-74.22-33.388-74.22-74.425V623.992c0-41.038 33.387-74.424 74.425-74.424h222.085c41.038 0 74.424 33.226 74.424 74.067v114.233c0 10.244-8.304 18.548-18.547 18.548s-18.548-8.304-18.548-18.548V623.635c0-20.388-16.746-36.974-37.33-36.974H624.13c-20.585 0-37.331 16.747-37.331 37.33v222.086c0 20.585 16.654 37.331 37.126 37.331H730.22c10.243 0 18.547 8.304 18.547 18.547 0 10.244-8.304 18.547-18.547 18.547z"></path></svg><!--[--><span class="page-category-item category1" role>开发笔记</span><span class="page-category-item category7" role>学习记录</span><!--]--><meta property="articleSection" content="开发笔记,学习记录"></span><!----></div><hr></div><div class="toc-place-holder"><aside id="toc"><!--[--><!----><!--]--><div class="toc-header">此页内容<button type="button" class="print-button" title="打印"><svg xmlns="http://www.w3.org/2000/svg" class="icon print-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="print icon"><path d="M819.2 364.8h-44.8V128c0-17.067-14.933-32-32-32H281.6c-17.067 0-32 14.933-32 32v236.8h-44.8C145.067 364.8 96 413.867 96 473.6v192c0 59.733 49.067 108.8 108.8 108.8h44.8V896c0 17.067 14.933 32 32 32h460.8c17.067 0 32-14.933 32-32V774.4h44.8c59.733 0 108.8-49.067 108.8-108.8v-192c0-59.733-49.067-108.8-108.8-108.8zM313.6 160h396.8v204.8H313.6V160zm396.8 704H313.6V620.8h396.8V864zM864 665.6c0 25.6-19.2 44.8-44.8 44.8h-44.8V588.8c0-17.067-14.933-32-32-32H281.6c-17.067 0-32 14.933-32 32v121.6h-44.8c-25.6 0-44.8-19.2-44.8-44.8v-192c0-25.6 19.2-44.8 44.8-44.8h614.4c25.6 0 44.8 19.2 44.8 44.8v192z"></path></svg></button></div><div class="toc-wrapper"><ul class="toc-list"><!--[--><li class="toc-item"><a class="vp-link toc-link level3 toc-link level3" href="/#任务">任务</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3 toc-link level3" href="/#学习过程">学习过程</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level2 toc-link level2" href="/#遇到的问题">遇到的问题</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level2 toc-link level2" href="/#总结">总结</a></li><!----><!--]--></ul><div class="toc-marker" style="top:-1.7rem;"></div></div><!--[--><!----><!--]--></aside></div><!----><div class="theme-hope-content"><h3 id="任务" tabindex="-1"><a class="header-anchor" href="#任务" aria-hidden="true">#</a> 任务</h3><ul><li>[x] 简单工厂搭建发奖领域</li></ul><h3 id="学习过程" tabindex="-1"><a class="header-anchor" href="#学习过程" aria-hidden="true">#</a> 学习过程</h3><ol><li><p>表结构变了,先导入 SQL,然后该对应的 PO 类,然后改一下 Mapper 文件</p></li><li><p>先把包结构建好</p><ol><li>新建一个领域包,负责发奖</li><li>领域包内建三个子包,model 实体封装包、repository 提供仓储服务、service 提供具体的服务(重点内容)</li></ol></li><li><p>看一下代码的继承关系</p></li><li><p>debug 看一下代码执行流程,了解其中的调用关系</p><ol><li>先执行抽奖,返回抽奖结果</li><li>对抽奖结果进行判断,如果是未中奖,直接返回</li><li>中奖了就保存用户信息以及订单信息</li><li>根据中奖结果中的奖品类型获取对应的服务</li><li>然后把第三步保存的用户信息以及订单信息传进去,做一个发奖的操作</li><li>然后返回发奖结果</li></ol></li></ol><h2 id="遇到的问题" tabindex="-1"><a class="header-anchor" href="#遇到的问题" aria-hidden="true">#</a> 遇到的问题</h2><p>今天还没遇到啥问题,代码比较简单,主要是数据库字段规范之后,好多 Mapper 要改 T.T,最开始我还在纠结要不要当初建表的时候就改了</p><p><strong>就很气,本来能学两小节的,md,电脑被亲戚孩子给整挂了,直接开不了机了,麻了,修电脑都修了两小时,系统还重装了,又重装环境</strong></p><h2 id="总结" tabindex="-1"><a class="header-anchor" href="#总结" aria-hidden="true">#</a> 总结</h2><ol><li>越来越喜欢 DDD 架构这种包的组织方式了,虽然包很多,看着有点复杂,但是真的理解了之后,就感觉很干净,扩展性也很好,虽然目前还没完全搞清楚 DDD</li><li>学会了工厂模式,根据奖品类型,从工厂里面拿对应的实现类进行发奖操作</li></ol></div><!----><footer class="page-meta"><div class="meta-item edit-link"><a href="https://github.com/fuzhengwei/xfg-resume-blog/edit/main/src/md/dev-log/day04.md" rel="noopener noreferrer" target="_blank" aria-label="在 GitHub 上编辑此页" class="nav-link label"><!--[--><svg xmlns="http://www.w3.org/2000/svg" class="icon edit-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="edit icon"><path d="M430.818 653.65a60.46 60.46 0 0 1-50.96-93.281l71.69-114.012 7.773-10.365L816.038 80.138A60.46 60.46 0 0 1 859.225 62a60.46 60.46 0 0 1 43.186 18.138l43.186 43.186a60.46 60.46 0 0 1 0 86.373L588.879 565.55l-8.637 8.637-117.466 68.234a60.46 60.46 0 0 1-31.958 11.229z"></path><path d="M728.802 962H252.891A190.883 190.883 0 0 1 62.008 771.98V296.934a190.883 190.883 0 0 1 190.883-192.61h267.754a60.46 60.46 0 0 1 0 120.92H252.891a69.962 69.962 0 0 0-69.098 69.099V771.98a69.962 69.962 0 0 0 69.098 69.098h475.911A69.962 69.962 0 0 0 797.9 771.98V503.363a60.46 60.46 0 1 1 120.922 0V771.98A190.883 190.883 0 0 1 728.802 962z"></path></svg><!--]-->在 GitHub 上编辑此页<span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">open in new window</span></span><!----></a></div><div class="meta-item git-info"><!----><!----></div></footer><nav class="vp-page-nav"><a aria-label="Day03" class="vp-link nav-link prev nav-link prev" href="/md/dev-log/day03.html"><div class="hint"><span class="arrow start"></span>上一页</div><div class="link"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day03</div></a><a aria-label="Day05" class="vp-link nav-link next nav-link next" href="/md/dev-log/day05.html"><div class="hint">下一页<span class="arrow end"></span></div><div class="link">Day05<span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span></div></a></nav><!----><!----><!--]--></main><!--]--><footer class="vp-footer-wrapper"><div class="vp-footer">我的微信:fustack</div><div class="vp-copyright">Copyright © 2024 Mr.Hope</div></footer></div><!--]--><!----><!--]--></div>
<script type="module" src="/assets/app-89848b6d.js" defer></script>
</body>
</html>
<!doctype html>
<html lang="zh-CN" data-theme="light">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<meta name="generator" content="VuePress 2.0.0-beta.67" />
<meta name="theme" content="VuePress Theme Hope" />
<meta property="og:url" content="https://vuepress-theme-hope-docs-demo.netlify.app/md/dev-log/day05.html"><meta property="og:site_name" content="我的简历"><meta property="og:title" content="Day05"><meta property="og:description" content="任务 [x] 活动领域的配置与状态; 学习过程 1. 包结构变化,调整对应的包 2. 了解活动创建的整个流程,然后将流程进行编排(其实就是落库的步骤呗),写对应的 repository 层代码 1. 首先明确要做哪些操作 1. 添加活动 2. 添加奖品 3. 添加活动配置 4. 添加策略 5. 添加策略明细 2. 编写对应的 repository 接口..."><meta property="og:type" content="article"><meta property="og:locale" content="zh-CN"><meta property="article:author" content="Mr.Hope"><script type="application/ld+json">{"@context":"https://schema.org","@type":"Article","headline":"Day05","image":[""],"dateModified":null,"author":[{"@type":"Person","name":"Mr.Hope","url":"https://mister-hope.com"}]}</script><title>Day05 | 我的简历</title><meta name="description" content="任务 [x] 活动领域的配置与状态; 学习过程 1. 包结构变化,调整对应的包 2. 了解活动创建的整个流程,然后将流程进行编排(其实就是落库的步骤呗),写对应的 repository 层代码 1. 首先明确要做哪些操作 1. 添加活动 2. 添加奖品 3. 添加活动配置 4. 添加策略 5. 添加策略明细 2. 编写对应的 repository 接口...">
<style>
:root {
--bg-color: #fff;
}
html[data-theme="dark"] {
--bg-color: #1d1e1f;
}
html,
body {
background: var(--bg-color);
}
</style>
<script>
const userMode = localStorage.getItem("vuepress-theme-hope-scheme");
const systemDarkMode =
window.matchMedia &&
window.matchMedia("(prefers-color-scheme: dark)").matches;
if (userMode === "dark" || (userMode !== "light" && systemDarkMode)) {
document.documentElement.setAttribute("data-theme", "dark");
}
</script>
<link rel="preload" href="/assets/style-e1af0ae0.css" as="style"><link rel="stylesheet" href="/assets/style-e1af0ae0.css">
<link rel="modulepreload" href="/assets/app-89848b6d.js"><link rel="modulepreload" href="/assets/day05.html-4698622b.js"><link rel="modulepreload" href="/assets/plugin-vue_export-helper-c27b6911.js"><link rel="modulepreload" href="/assets/day05.html-e1b66f43.js"><link rel="prefetch" href="/assets/index.html-3ddb8fc8.js" as="script"><link rel="prefetch" href="/assets/slides.html-e24915cf.js" as="script"><link rel="prefetch" href="/assets/resume.html-63219902.js" as="script"><link rel="prefetch" href="/assets/index.html-ee414c74.js" as="script"><link rel="prefetch" href="/assets/day01.html-96303a92.js" as="script"><link rel="prefetch" href="/assets/day02.html-bc6452cb.js" as="script"><link rel="prefetch" href="/assets/day03.html-faf19961.js" as="script"><link rel="prefetch" href="/assets/day04.html-f1431c14.js" as="script"><link rel="prefetch" href="/assets/day06.html-694a0d7d.js" as="script"><link rel="prefetch" href="/assets/day07~day08.html-623b7865.js" as="script"><link rel="prefetch" href="/assets/day09~day10.html-f64b96c2.js" as="script"><link rel="prefetch" href="/assets/day11.html-a02521a7.js" as="script"><link rel="prefetch" href="/assets/day12.html-59d9b776.js" as="script"><link rel="prefetch" href="/assets/404.html-a12454c5.js" as="script"><link rel="prefetch" href="/assets/index.html-38735195.js" as="script"><link rel="prefetch" href="/assets/index.html-72fa7116.js" as="script"><link rel="prefetch" href="/assets/slides.html-73aa899b.js" as="script"><link rel="prefetch" href="/assets/resume.html-0d5e8b6f.js" as="script"><link rel="prefetch" href="/assets/index.html-604f9d5c.js" as="script"><link rel="prefetch" href="/assets/day01.html-f34d072c.js" as="script"><link rel="prefetch" href="/assets/day02.html-faf555eb.js" as="script"><link rel="prefetch" href="/assets/day03.html-f3141bb2.js" as="script"><link rel="prefetch" href="/assets/day04.html-61a7012e.js" as="script"><link rel="prefetch" href="/assets/day06.html-a4c2781d.js" as="script"><link rel="prefetch" href="/assets/day07~day08.html-4e5d7c48.js" as="script"><link rel="prefetch" href="/assets/day09~day10.html-ee1cb17c.js" as="script"><link rel="prefetch" href="/assets/day11.html-13381d55.js" as="script"><link rel="prefetch" href="/assets/day12.html-4bed2fb6.js" as="script"><link rel="prefetch" href="/assets/404.html-4d74dcf3.js" as="script"><link rel="prefetch" href="/assets/index.html-f3051275.js" as="script"><link rel="prefetch" href="/assets/photoswipe.esm-060dc2da.js" as="script">
</head>
<body>
<div id="app"><!--[--><!--[--><!--[--><span tabindex="-1"></span><a href="#main-content" class="vp-skip-link sr-only">跳至主要內容</a><!--]--><div class="theme-container has-toc"><!--[--><header id="navbar" class="vp-navbar"><div class="vp-navbar-start"><button type="button" class="vp-toggle-sidebar-button" title="Toggle Sidebar"><span class="icon"></span></button><!--[--><!----><!--]--><!--[--><a class="vp-link vp-brand vp-brand" href="/"><img class="vp-nav-logo" src="/logo.svg" alt="我的简历"><!----><span class="vp-site-name hide-in-pad">我的简历</span></a><!--]--><!--[--><!----><!--]--></div><div class="vp-navbar-center"><!--[--><!----><!--]--><!--[--><nav class="vp-nav-links"><div class="nav-item hide-in-mobile"><a aria-label="主页" class="vp-link nav-link nav-link" href="/"><span class="font-icon icon fa-fw fa-sm fas fa-home" style=""></span>主页<!----></a></div><div class="nav-item hide-in-mobile"><a aria-label="个人简历" class="vp-link nav-link nav-link" href="/md/resume.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>个人简历<!----></a></div><div class="nav-item hide-in-mobile"><a aria-label="开发日志" class="vp-link nav-link nav-link" href="/md/dev-log/day01.html"><span class="font-icon icon fa-fw fa-sm fas fa-book" style=""></span>开发日志<!----></a></div></nav><!--]--><!--[--><!----><!--]--></div><div class="vp-navbar-end"><!--[--><!----><!--]--><!--[--><!----><div class="nav-item vp-repo"><a class="vp-repo-link" href="https://github.com/fuzhengwei/xfg-resume-blog" target="_blank" rel="noopener noreferrer" aria-label="GitHub"><svg xmlns="http://www.w3.org/2000/svg" class="icon github-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="github icon" style="width:1.25rem;height:1.25rem;vertical-align:middle;"><path d="M511.957 21.333C241.024 21.333 21.333 240.981 21.333 512c0 216.832 140.544 400.725 335.574 465.664 24.49 4.395 32.256-10.07 32.256-23.083 0-11.69.256-44.245 0-85.205-136.448 29.61-164.736-64.64-164.736-64.64-22.315-56.704-54.4-71.765-54.4-71.765-44.587-30.464 3.285-29.824 3.285-29.824 49.195 3.413 75.179 50.517 75.179 50.517 43.776 75.008 114.816 53.333 142.762 40.79 4.523-31.66 17.152-53.377 31.19-65.537-108.971-12.458-223.488-54.485-223.488-242.602 0-53.547 19.114-97.323 50.517-131.67-5.035-12.33-21.93-62.293 4.779-129.834 0 0 41.258-13.184 134.912 50.346a469.803 469.803 0 0 1 122.88-16.554c41.642.213 83.626 5.632 122.88 16.554 93.653-63.488 134.784-50.346 134.784-50.346 26.752 67.541 9.898 117.504 4.864 129.834 31.402 34.347 50.474 78.123 50.474 131.67 0 188.586-114.73 230.016-224.042 242.09 17.578 15.232 33.578 44.672 33.578 90.454v135.85c0 13.142 7.936 27.606 32.854 22.87C862.25 912.597 1002.667 728.747 1002.667 512c0-271.019-219.648-490.667-490.71-490.667z"></path></svg></a></div><div class="nav-item hide-in-mobile"><button type="button" id="appearance-switch"><svg xmlns="http://www.w3.org/2000/svg" class="icon auto-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="auto icon" style="display:block;"><path d="M512 992C246.92 992 32 777.08 32 512S246.92 32 512 32s480 214.92 480 480-214.92 480-480 480zm0-840c-198.78 0-360 161.22-360 360 0 198.84 161.22 360 360 360s360-161.16 360-360c0-198.78-161.22-360-360-360zm0 660V212c165.72 0 300 134.34 300 300 0 165.72-134.28 300-300 300z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" class="icon dark-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="dark icon" style="display:none;"><path d="M524.8 938.667h-4.267a439.893 439.893 0 0 1-313.173-134.4 446.293 446.293 0 0 1-11.093-597.334A432.213 432.213 0 0 1 366.933 90.027a42.667 42.667 0 0 1 45.227 9.386 42.667 42.667 0 0 1 10.24 42.667 358.4 358.4 0 0 0 82.773 375.893 361.387 361.387 0 0 0 376.747 82.774 42.667 42.667 0 0 1 54.187 55.04 433.493 433.493 0 0 1-99.84 154.88 438.613 438.613 0 0 1-311.467 128z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" class="icon light-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="light icon" style="display:none;"><path d="M952 552h-80a40 40 0 0 1 0-80h80a40 40 0 0 1 0 80zM801.88 280.08a41 41 0 0 1-57.96-57.96l57.96-58a41.04 41.04 0 0 1 58 58l-58 57.96zM512 752a240 240 0 1 1 0-480 240 240 0 0 1 0 480zm0-560a40 40 0 0 1-40-40V72a40 40 0 0 1 80 0v80a40 40 0 0 1-40 40zm-289.88 88.08-58-57.96a41.04 41.04 0 0 1 58-58l57.96 58a41 41 0 0 1-57.96 57.96zM192 512a40 40 0 0 1-40 40H72a40 40 0 0 1 0-80h80a40 40 0 0 1 40 40zm30.12 231.92a41 41 0 0 1 57.96 57.96l-57.96 58a41.04 41.04 0 0 1-58-58l58-57.96zM512 832a40 40 0 0 1 40 40v80a40 40 0 0 1-80 0v-80a40 40 0 0 1 40-40zm289.88-88.08 58 57.96a41.04 41.04 0 0 1-58 58l-57.96-58a41 41 0 0 1 57.96-57.96z"></path></svg></button></div><!----><!--]--><!--[--><!----><!--]--><button type="button" class="vp-toggle-navbar-button" aria-label="Toggle Navbar" aria-expanded="false" aria-controls="nav-screen"><span><span class="vp-top"></span><span class="vp-middle"></span><span class="vp-bottom"></span></span></button></div></header><!----><!--]--><!----><div class="toggle-sidebar-wrapper"><span class="arrow start"></span></div><aside id="sidebar" class="vp-sidebar"><!--[--><!----><!--]--><ul class="vp-sidebar-links"><li><!--[--><a aria-label="主页" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/"><span class="font-icon icon fa-fw fa-sm fas fa-home" style=""></span>主页<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><section class="vp-sidebar-group"><p class="vp-sidebar-heading active"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span><span class="vp-sidebar-title">Lottery 项目开发日志</span><!----></p><ul class="vp-sidebar-links"><li><!--[--><a aria-label="Day01" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day01.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day01<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day02" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day02.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day02<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day03" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day03.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day03<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day04" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day04.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day04<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day05" class="vp-link nav-link active vp-sidebar-link vp-sidebar-page active nav-link active vp-sidebar-link vp-sidebar-page active" href="/md/dev-log/day05.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day05<!----></a><ul class="vp-sidebar-sub-headers"><li class="vp-sidebar-sub-header"><a aria-label="任务" class="vp-link nav-link vp-sidebar-link vp-heading nav-link vp-sidebar-link vp-heading" href="/md/dev-log/day05.html#任务"><!---->任务<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a aria-label="学习过程" class="vp-link nav-link vp-sidebar-link vp-heading nav-link vp-sidebar-link vp-heading" href="/md/dev-log/day05.html#学习过程"><!---->学习过程<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a aria-label="遇到的问题" class="vp-link nav-link vp-sidebar-link vp-heading nav-link vp-sidebar-link vp-heading" href="/md/dev-log/day05.html#遇到的问题"><!---->遇到的问题<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a aria-label="总结" class="vp-link nav-link vp-sidebar-link vp-heading nav-link vp-sidebar-link vp-heading" href="/md/dev-log/day05.html#总结"><!---->总结<!----></a><ul class="vp-sidebar-sub-headers"></ul></li></ul><!--]--></li><li><!--[--><a aria-label="Day06" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day06.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day06<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day07 ~ Day08" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day07~day08.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day07 ~ Day08<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day09 ~ Day10" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day09~day10.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day09 ~ Day10<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day011" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day11.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day011<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day012" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day12.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day012<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li></ul></section></li></ul><!--[--><!----><!--]--></aside><!--[--><main id="main-content" class="vp-page"><!--[--><!----><!----><nav class="vp-breadcrumb disable"></nav><div class="vp-page-title"><h1><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day05</h1><div class="page-info"><span class="page-author-info" aria-label="作者🖊" data-balloon-pos="down"><svg xmlns="http://www.w3.org/2000/svg" class="icon author-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="author icon"><path d="M649.6 633.6c86.4-48 147.2-144 147.2-249.6 0-160-128-288-288-288s-288 128-288 288c0 108.8 57.6 201.6 147.2 249.6-121.6 48-214.4 153.6-240 288-3.2 9.6 0 19.2 6.4 25.6 3.2 9.6 12.8 12.8 22.4 12.8h704c9.6 0 19.2-3.2 25.6-12.8 6.4-6.4 9.6-16 6.4-25.6-25.6-134.4-121.6-240-243.2-288z"></path></svg><span><a class="page-author-item" href="https://mister-hope.com" target="_blank" rel="noopener noreferrer">Mr.Hope</a></span><span property="author" content="Mr.Hope"></span></span><!----><!----><!----><span class="page-reading-time-info" aria-label="阅读时间⌛" data-balloon-pos="down"><svg xmlns="http://www.w3.org/2000/svg" class="icon timer-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="timer icon"><path d="M799.387 122.15c4.402-2.978 7.38-7.897 7.38-13.463v-1.165c0-8.933-7.38-16.312-16.312-16.312H256.33c-8.933 0-16.311 7.38-16.311 16.312v1.165c0 5.825 2.977 10.874 7.637 13.592 4.143 194.44 97.22 354.963 220.201 392.763-122.204 37.542-214.893 196.511-220.2 389.397-4.661 5.049-7.638 11.651-7.638 19.03v5.825h566.49v-5.825c0-7.379-2.849-13.981-7.509-18.9-5.049-193.016-97.867-351.985-220.2-389.527 123.24-37.67 216.446-198.453 220.588-392.892zM531.16 450.445v352.632c117.674 1.553 211.787 40.778 211.787 88.676H304.097c0-48.286 95.149-87.382 213.728-88.676V450.445c-93.077-3.107-167.901-81.297-167.901-177.093 0-8.803 6.99-15.793 15.793-15.793 8.803 0 15.794 6.99 15.794 15.793 0 80.261 63.69 145.635 142.01 145.635s142.011-65.374 142.011-145.635c0-8.803 6.99-15.793 15.794-15.793s15.793 6.99 15.793 15.793c0 95.019-73.789 172.82-165.96 177.093z"></path></svg><span>大约 4 分钟</span><meta property="timeRequired" content="PT4M"></span><span class="page-category-info" aria-label="分类🌈" data-balloon-pos="down"><svg xmlns="http://www.w3.org/2000/svg" class="icon category-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="category icon"><path d="M148.41 106.992h282.176c22.263 0 40.31 18.048 40.31 40.31V429.48c0 22.263-18.047 40.31-40.31 40.31H148.41c-22.263 0-40.311-18.047-40.311-40.31V147.302c0-22.263 18.048-40.31 40.311-40.31zM147.556 553.478H429.73c22.263 0 40.311 18.048 40.311 40.31v282.176c0 22.263-18.048 40.312-40.31 40.312H147.555c-22.263 0-40.311-18.049-40.311-40.312V593.79c0-22.263 18.048-40.311 40.31-40.311zM593.927 106.992h282.176c22.263 0 40.31 18.048 40.31 40.31V429.48c0 22.263-18.047 40.31-40.31 40.31H593.927c-22.263 0-40.311-18.047-40.311-40.31V147.302c0-22.263 18.048-40.31 40.31-40.31zM730.22 920.502H623.926c-40.925 0-74.22-33.388-74.22-74.425V623.992c0-41.038 33.387-74.424 74.425-74.424h222.085c41.038 0 74.424 33.226 74.424 74.067v114.233c0 10.244-8.304 18.548-18.547 18.548s-18.548-8.304-18.548-18.548V623.635c0-20.388-16.746-36.974-37.33-36.974H624.13c-20.585 0-37.331 16.747-37.331 37.33v222.086c0 20.585 16.654 37.331 37.126 37.331H730.22c10.243 0 18.547 8.304 18.547 18.547 0 10.244-8.304 18.547-18.547 18.547z"></path></svg><!--[--><span class="page-category-item category1" role>开发笔记</span><span class="page-category-item category7" role>学习记录</span><!--]--><meta property="articleSection" content="开发笔记,学习记录"></span><!----></div><hr></div><div class="toc-place-holder"><aside id="toc"><!--[--><!----><!--]--><div class="toc-header">此页内容<button type="button" class="print-button" title="打印"><svg xmlns="http://www.w3.org/2000/svg" class="icon print-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="print icon"><path d="M819.2 364.8h-44.8V128c0-17.067-14.933-32-32-32H281.6c-17.067 0-32 14.933-32 32v236.8h-44.8C145.067 364.8 96 413.867 96 473.6v192c0 59.733 49.067 108.8 108.8 108.8h44.8V896c0 17.067 14.933 32 32 32h460.8c17.067 0 32-14.933 32-32V774.4h44.8c59.733 0 108.8-49.067 108.8-108.8v-192c0-59.733-49.067-108.8-108.8-108.8zM313.6 160h396.8v204.8H313.6V160zm396.8 704H313.6V620.8h396.8V864zM864 665.6c0 25.6-19.2 44.8-44.8 44.8h-44.8V588.8c0-17.067-14.933-32-32-32H281.6c-17.067 0-32 14.933-32 32v121.6h-44.8c-25.6 0-44.8-19.2-44.8-44.8v-192c0-25.6 19.2-44.8 44.8-44.8h614.4c25.6 0 44.8 19.2 44.8 44.8v192z"></path></svg></button></div><div class="toc-wrapper"><ul class="toc-list"><!--[--><li class="toc-item"><a class="vp-link toc-link level2 toc-link level2" href="/#任务">任务</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level2 toc-link level2" href="/#学习过程">学习过程</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level2 toc-link level2" href="/#遇到的问题">遇到的问题</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level2 toc-link level2" href="/#总结">总结</a></li><!----><!--]--></ul><div class="toc-marker" style="top:-1.7rem;"></div></div><!--[--><!----><!--]--></aside></div><!----><div class="theme-hope-content"><h2 id="任务" tabindex="-1"><a class="header-anchor" href="#任务" aria-hidden="true">#</a> 任务</h2><ul><li>[x] 活动领域的配置与状态</li></ul><h2 id="学习过程" tabindex="-1"><a class="header-anchor" href="#学习过程" aria-hidden="true">#</a> 学习过程</h2><ol><li>包结构变化,调整对应的包</li><li>了解活动创建的整个流程,然后将流程进行编排(其实就是落库的步骤呗),写对应的 repository 层代码 <ol><li>首先明确要做哪些操作 <ol><li>添加活动</li><li>添加奖品</li><li>添加活动配置</li><li>添加策略</li><li>添加策略明细</li></ol></li><li>编写对应的 repository 接口和实现类</li><li></li></ol></li><li>debug 了解状态模式如何进行的状态判断(感觉不用刻意去学这个设计模式,通过对项目的学习,从而达到状态模式的学习,<strong>后期进行设计模式的统一学习</strong><ol><li>首先定义一个状态处理的接口,入参统一是活动ID和当前状态</li><li>定义一个活动状态抽象类,这个抽象类的子类用来判断某种状态是否可以流转</li><li>编写抽象类的实现,里面定义是否可以流转</li><li>编写状态配置类,把每一种活动状态抽象类的实现注入进去并放入 Map 中,供状态处理服务使用</li><li>编写状态处理接口的实现类 <ol><li>先从状态配置中获取当前状态所对应的活动状态流转实现类</li><li>然后实现类调用方法,通过方法的返回值来确定是否能进行操作 <ol><li>如果能进行变更的,先进行落库操作,然后根据 MyBatis 返回值返回对应信息</li><li>如果不能进行变更的,直接返回对应的错误信息</li></ol></li></ol></li></ol></li></ol><h2 id="遇到的问题" tabindex="-1"><a class="header-anchor" href="#遇到的问题" aria-hidden="true">#</a> 遇到的问题</h2><ol><li><p>为什么要使用 <code>BeanUtils.copyProperties()</code></p><p>因为原来很少使用这种方法,以前都是 new 对象,然后把传进来的对象手动一个一个赋值,对这个方法不太了解,简单来说就是实现对象的拷贝,属性名相同的就进行拷贝,属性名不相同的就不进行操作,底层使用反射,首先把读写权限都设置为 true,然后再进行获取和赋值操作,这种操作是 <strong>浅拷贝</strong></p><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code><span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token class-name">Modifier</span><span class="token punctuation">.</span><span class="token function">isPublic</span><span class="token punctuation">(</span>readMethod<span class="token punctuation">.</span><span class="token function">getDeclaringClass</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getModifiers</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
readMethod<span class="token punctuation">.</span><span class="token function">setAccessible</span><span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token class-name">Object</span> value <span class="token operator">=</span> readMethod<span class="token punctuation">.</span><span class="token function">invoke</span><span class="token punctuation">(</span>source<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token class-name">Modifier</span><span class="token punctuation">.</span><span class="token function">isPublic</span><span class="token punctuation">(</span>writeMethod<span class="token punctuation">.</span><span class="token function">getDeclaringClass</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getModifiers</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
writeMethod<span class="token punctuation">.</span><span class="token function">setAccessible</span><span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
writeMethod<span class="token punctuation">.</span><span class="token function">invoke</span><span class="token punctuation">(</span>target<span class="token punctuation">,</span> value<span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></li><li><p>数据库 bug <code>### Error updating database. Cause: java.sql.SQLException: Incorrect string value: &#39;\xE4\xB8\x80\xE7\xAD\x89...&#39; for column &#39;award_name&#39; at row 1</code></p><p>中文插入乱码问题,我建数据库的时候设置了 utf8,但是建表的时候默认没有设置成 <code>utf8</code>,使用的编码是 <code>latin1</code>,所以需要修改字段的编码为 <code>utf8</code></p></li></ol><h2 id="总结" tabindex="-1"><a class="header-anchor" href="#总结" aria-hidden="true">#</a> 总结</h2><ol><li><p>包结果的变化</p><ol><li>首先呢这个解决了我之前的一个疑问:为啥要把数据库的真实操作写到领域层呢?这不应该写到基础服务层更符合逻辑吗?</li><li>更改详情:基础服务模块引入领域模块,在领域层写 repository 接口,在基础服务层写实现</li></ol></li><li><p>状态流程处理</p><p>相对于普通的 if-else 处理流程,状态模式设计模式把状态的流转转化为方法,从而简化了 if-else 一坨接着一坨的形式,如果有新的状态,只需要添加对应的抽象实现以及在其他实现中添加对应的流转方法</p><p><em>后期对设计模式进行统一的学习,目前只了解了基础的程序运行流程,根据流程来了解对应的设计模式,目前对于状态模式的了解仅限于以下两点</em></p><ol><li>将一种状态的流转包装成一个类,然后在类里面定义是否可以流转</li><li>状态的流转通过调用方法的形式进行,而不是通过 if-else 去判断,比如要把状态修改为审核通过,那么直接调用 <code>checkPass()</code> 然后找到当前状态处理类,调用处理类的 <code>checkPass()</code> 方法,然后返回结果就可以了</li></ol></li><li><p>对于学习的思考</p><p>最近陷入了日夜颠倒的死循环,主要就是晚上窝在床上玩手机呢,然后看了会儿星球就想起床学习,一学又搞到两三点三四点,搞不好 bug 多还通了个宵,导致第二天甚至第三天状态低迷,后面要压制学习欲望了,每天该做的做完了就休息,以后每周日休息一天,晚上一点前就睡觉,避免陷入死循环,再多的任务,人的精力也是有限的,只要按部就班稳扎稳打,相信最后也会有收获,不必急于求成</p></li></ol></div><!----><footer class="page-meta"><div class="meta-item edit-link"><a href="https://github.com/fuzhengwei/xfg-resume-blog/edit/main/src/md/dev-log/day05.md" rel="noopener noreferrer" target="_blank" aria-label="在 GitHub 上编辑此页" class="nav-link label"><!--[--><svg xmlns="http://www.w3.org/2000/svg" class="icon edit-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="edit icon"><path d="M430.818 653.65a60.46 60.46 0 0 1-50.96-93.281l71.69-114.012 7.773-10.365L816.038 80.138A60.46 60.46 0 0 1 859.225 62a60.46 60.46 0 0 1 43.186 18.138l43.186 43.186a60.46 60.46 0 0 1 0 86.373L588.879 565.55l-8.637 8.637-117.466 68.234a60.46 60.46 0 0 1-31.958 11.229z"></path><path d="M728.802 962H252.891A190.883 190.883 0 0 1 62.008 771.98V296.934a190.883 190.883 0 0 1 190.883-192.61h267.754a60.46 60.46 0 0 1 0 120.92H252.891a69.962 69.962 0 0 0-69.098 69.099V771.98a69.962 69.962 0 0 0 69.098 69.098h475.911A69.962 69.962 0 0 0 797.9 771.98V503.363a60.46 60.46 0 1 1 120.922 0V771.98A190.883 190.883 0 0 1 728.802 962z"></path></svg><!--]-->在 GitHub 上编辑此页<span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">open in new window</span></span><!----></a></div><div class="meta-item git-info"><!----><!----></div></footer><nav class="vp-page-nav"><a aria-label="Day04" class="vp-link nav-link prev nav-link prev" href="/md/dev-log/day04.html"><div class="hint"><span class="arrow start"></span>上一页</div><div class="link"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day04</div></a><a aria-label="Day06" class="vp-link nav-link next nav-link next" href="/md/dev-log/day06.html"><div class="hint">下一页<span class="arrow end"></span></div><div class="link">Day06<span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span></div></a></nav><!----><!----><!--]--></main><!--]--><footer class="vp-footer-wrapper"><div class="vp-footer">我的微信:fustack</div><div class="vp-copyright">Copyright © 2024 Mr.Hope</div></footer></div><!--]--><!----><!--]--></div>
<script type="module" src="/assets/app-89848b6d.js" defer></script>
</body>
</html>
<!doctype html>
<html lang="zh-CN" data-theme="light">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<meta name="generator" content="VuePress 2.0.0-beta.67" />
<meta name="theme" content="VuePress Theme Hope" />
<meta property="og:url" content="https://vuepress-theme-hope-docs-demo.netlify.app/md/dev-log/day06.html"><meta property="og:site_name" content="我的简历"><meta property="og:title" content="Day06"><meta property="og:description" content="任务 [x] ID 生成策略开发; 学习过程 1. 先看视频了解用到了啥 2. 看小傅哥策略模式的文章 (https://mp.weixin.qq.com/s/zOFLtSFVrYEyTuihzwgKYw) 3. 看代码结构 1. 定义一个接口,用来生成 id 2. 实现接口,实现不同的 id 生成算法 3. 定义一个上下文对象,包装各种 id 生成算..."><meta property="og:type" content="article"><meta property="og:locale" content="zh-CN"><meta property="article:author" content="Mr.Hope"><script type="application/ld+json">{"@context":"https://schema.org","@type":"Article","headline":"Day06","image":[""],"dateModified":null,"author":[{"@type":"Person","name":"Mr.Hope","url":"https://mister-hope.com"}]}</script><title>Day06 | 我的简历</title><meta name="description" content="任务 [x] ID 生成策略开发; 学习过程 1. 先看视频了解用到了啥 2. 看小傅哥策略模式的文章 (https://mp.weixin.qq.com/s/zOFLtSFVrYEyTuihzwgKYw) 3. 看代码结构 1. 定义一个接口,用来生成 id 2. 实现接口,实现不同的 id 生成算法 3. 定义一个上下文对象,包装各种 id 生成算...">
<style>
:root {
--bg-color: #fff;
}
html[data-theme="dark"] {
--bg-color: #1d1e1f;
}
html,
body {
background: var(--bg-color);
}
</style>
<script>
const userMode = localStorage.getItem("vuepress-theme-hope-scheme");
const systemDarkMode =
window.matchMedia &&
window.matchMedia("(prefers-color-scheme: dark)").matches;
if (userMode === "dark" || (userMode !== "light" && systemDarkMode)) {
document.documentElement.setAttribute("data-theme", "dark");
}
</script>
<link rel="preload" href="/assets/style-e1af0ae0.css" as="style"><link rel="stylesheet" href="/assets/style-e1af0ae0.css">
<link rel="modulepreload" href="/assets/app-89848b6d.js"><link rel="modulepreload" href="/assets/day06.html-a4c2781d.js"><link rel="modulepreload" href="/assets/plugin-vue_export-helper-c27b6911.js"><link rel="modulepreload" href="/assets/day06.html-694a0d7d.js"><link rel="prefetch" href="/assets/index.html-3ddb8fc8.js" as="script"><link rel="prefetch" href="/assets/slides.html-e24915cf.js" as="script"><link rel="prefetch" href="/assets/resume.html-63219902.js" as="script"><link rel="prefetch" href="/assets/index.html-ee414c74.js" as="script"><link rel="prefetch" href="/assets/day01.html-96303a92.js" as="script"><link rel="prefetch" href="/assets/day02.html-bc6452cb.js" as="script"><link rel="prefetch" href="/assets/day03.html-faf19961.js" as="script"><link rel="prefetch" href="/assets/day04.html-f1431c14.js" as="script"><link rel="prefetch" href="/assets/day05.html-e1b66f43.js" as="script"><link rel="prefetch" href="/assets/day07~day08.html-623b7865.js" as="script"><link rel="prefetch" href="/assets/day09~day10.html-f64b96c2.js" as="script"><link rel="prefetch" href="/assets/day11.html-a02521a7.js" as="script"><link rel="prefetch" href="/assets/day12.html-59d9b776.js" as="script"><link rel="prefetch" href="/assets/404.html-a12454c5.js" as="script"><link rel="prefetch" href="/assets/index.html-38735195.js" as="script"><link rel="prefetch" href="/assets/index.html-72fa7116.js" as="script"><link rel="prefetch" href="/assets/slides.html-73aa899b.js" as="script"><link rel="prefetch" href="/assets/resume.html-0d5e8b6f.js" as="script"><link rel="prefetch" href="/assets/index.html-604f9d5c.js" as="script"><link rel="prefetch" href="/assets/day01.html-f34d072c.js" as="script"><link rel="prefetch" href="/assets/day02.html-faf555eb.js" as="script"><link rel="prefetch" href="/assets/day03.html-f3141bb2.js" as="script"><link rel="prefetch" href="/assets/day04.html-61a7012e.js" as="script"><link rel="prefetch" href="/assets/day05.html-4698622b.js" as="script"><link rel="prefetch" href="/assets/day07~day08.html-4e5d7c48.js" as="script"><link rel="prefetch" href="/assets/day09~day10.html-ee1cb17c.js" as="script"><link rel="prefetch" href="/assets/day11.html-13381d55.js" as="script"><link rel="prefetch" href="/assets/day12.html-4bed2fb6.js" as="script"><link rel="prefetch" href="/assets/404.html-4d74dcf3.js" as="script"><link rel="prefetch" href="/assets/index.html-f3051275.js" as="script"><link rel="prefetch" href="/assets/photoswipe.esm-060dc2da.js" as="script">
</head>
<body>
<div id="app"><!--[--><!--[--><!--[--><span tabindex="-1"></span><a href="#main-content" class="vp-skip-link sr-only">跳至主要內容</a><!--]--><div class="theme-container has-toc"><!--[--><header id="navbar" class="vp-navbar"><div class="vp-navbar-start"><button type="button" class="vp-toggle-sidebar-button" title="Toggle Sidebar"><span class="icon"></span></button><!--[--><!----><!--]--><!--[--><a class="vp-link vp-brand vp-brand" href="/"><img class="vp-nav-logo" src="/logo.svg" alt="我的简历"><!----><span class="vp-site-name hide-in-pad">我的简历</span></a><!--]--><!--[--><!----><!--]--></div><div class="vp-navbar-center"><!--[--><!----><!--]--><!--[--><nav class="vp-nav-links"><div class="nav-item hide-in-mobile"><a aria-label="主页" class="vp-link nav-link nav-link" href="/"><span class="font-icon icon fa-fw fa-sm fas fa-home" style=""></span>主页<!----></a></div><div class="nav-item hide-in-mobile"><a aria-label="个人简历" class="vp-link nav-link nav-link" href="/md/resume.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>个人简历<!----></a></div><div class="nav-item hide-in-mobile"><a aria-label="开发日志" class="vp-link nav-link nav-link" href="/md/dev-log/day01.html"><span class="font-icon icon fa-fw fa-sm fas fa-book" style=""></span>开发日志<!----></a></div></nav><!--]--><!--[--><!----><!--]--></div><div class="vp-navbar-end"><!--[--><!----><!--]--><!--[--><!----><div class="nav-item vp-repo"><a class="vp-repo-link" href="https://github.com/fuzhengwei/xfg-resume-blog" target="_blank" rel="noopener noreferrer" aria-label="GitHub"><svg xmlns="http://www.w3.org/2000/svg" class="icon github-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="github icon" style="width:1.25rem;height:1.25rem;vertical-align:middle;"><path d="M511.957 21.333C241.024 21.333 21.333 240.981 21.333 512c0 216.832 140.544 400.725 335.574 465.664 24.49 4.395 32.256-10.07 32.256-23.083 0-11.69.256-44.245 0-85.205-136.448 29.61-164.736-64.64-164.736-64.64-22.315-56.704-54.4-71.765-54.4-71.765-44.587-30.464 3.285-29.824 3.285-29.824 49.195 3.413 75.179 50.517 75.179 50.517 43.776 75.008 114.816 53.333 142.762 40.79 4.523-31.66 17.152-53.377 31.19-65.537-108.971-12.458-223.488-54.485-223.488-242.602 0-53.547 19.114-97.323 50.517-131.67-5.035-12.33-21.93-62.293 4.779-129.834 0 0 41.258-13.184 134.912 50.346a469.803 469.803 0 0 1 122.88-16.554c41.642.213 83.626 5.632 122.88 16.554 93.653-63.488 134.784-50.346 134.784-50.346 26.752 67.541 9.898 117.504 4.864 129.834 31.402 34.347 50.474 78.123 50.474 131.67 0 188.586-114.73 230.016-224.042 242.09 17.578 15.232 33.578 44.672 33.578 90.454v135.85c0 13.142 7.936 27.606 32.854 22.87C862.25 912.597 1002.667 728.747 1002.667 512c0-271.019-219.648-490.667-490.71-490.667z"></path></svg></a></div><div class="nav-item hide-in-mobile"><button type="button" id="appearance-switch"><svg xmlns="http://www.w3.org/2000/svg" class="icon auto-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="auto icon" style="display:block;"><path d="M512 992C246.92 992 32 777.08 32 512S246.92 32 512 32s480 214.92 480 480-214.92 480-480 480zm0-840c-198.78 0-360 161.22-360 360 0 198.84 161.22 360 360 360s360-161.16 360-360c0-198.78-161.22-360-360-360zm0 660V212c165.72 0 300 134.34 300 300 0 165.72-134.28 300-300 300z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" class="icon dark-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="dark icon" style="display:none;"><path d="M524.8 938.667h-4.267a439.893 439.893 0 0 1-313.173-134.4 446.293 446.293 0 0 1-11.093-597.334A432.213 432.213 0 0 1 366.933 90.027a42.667 42.667 0 0 1 45.227 9.386 42.667 42.667 0 0 1 10.24 42.667 358.4 358.4 0 0 0 82.773 375.893 361.387 361.387 0 0 0 376.747 82.774 42.667 42.667 0 0 1 54.187 55.04 433.493 433.493 0 0 1-99.84 154.88 438.613 438.613 0 0 1-311.467 128z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" class="icon light-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="light icon" style="display:none;"><path d="M952 552h-80a40 40 0 0 1 0-80h80a40 40 0 0 1 0 80zM801.88 280.08a41 41 0 0 1-57.96-57.96l57.96-58a41.04 41.04 0 0 1 58 58l-58 57.96zM512 752a240 240 0 1 1 0-480 240 240 0 0 1 0 480zm0-560a40 40 0 0 1-40-40V72a40 40 0 0 1 80 0v80a40 40 0 0 1-40 40zm-289.88 88.08-58-57.96a41.04 41.04 0 0 1 58-58l57.96 58a41 41 0 0 1-57.96 57.96zM192 512a40 40 0 0 1-40 40H72a40 40 0 0 1 0-80h80a40 40 0 0 1 40 40zm30.12 231.92a41 41 0 0 1 57.96 57.96l-57.96 58a41.04 41.04 0 0 1-58-58l58-57.96zM512 832a40 40 0 0 1 40 40v80a40 40 0 0 1-80 0v-80a40 40 0 0 1 40-40zm289.88-88.08 58 57.96a41.04 41.04 0 0 1-58 58l-57.96-58a41 41 0 0 1 57.96-57.96z"></path></svg></button></div><!----><!--]--><!--[--><!----><!--]--><button type="button" class="vp-toggle-navbar-button" aria-label="Toggle Navbar" aria-expanded="false" aria-controls="nav-screen"><span><span class="vp-top"></span><span class="vp-middle"></span><span class="vp-bottom"></span></span></button></div></header><!----><!--]--><!----><div class="toggle-sidebar-wrapper"><span class="arrow start"></span></div><aside id="sidebar" class="vp-sidebar"><!--[--><!----><!--]--><ul class="vp-sidebar-links"><li><!--[--><a aria-label="主页" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/"><span class="font-icon icon fa-fw fa-sm fas fa-home" style=""></span>主页<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><section class="vp-sidebar-group"><p class="vp-sidebar-heading active"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span><span class="vp-sidebar-title">Lottery 项目开发日志</span><!----></p><ul class="vp-sidebar-links"><li><!--[--><a aria-label="Day01" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day01.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day01<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day02" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day02.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day02<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day03" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day03.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day03<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day04" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day04.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day04<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day05" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day05.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day05<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day06" class="vp-link nav-link active vp-sidebar-link vp-sidebar-page active nav-link active vp-sidebar-link vp-sidebar-page active" href="/md/dev-log/day06.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day06<!----></a><ul class="vp-sidebar-sub-headers"><li class="vp-sidebar-sub-header"><a aria-label="任务" class="vp-link nav-link vp-sidebar-link vp-heading nav-link vp-sidebar-link vp-heading" href="/md/dev-log/day06.html#任务"><!---->任务<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a aria-label="学习过程" class="vp-link nav-link vp-sidebar-link vp-heading nav-link vp-sidebar-link vp-heading" href="/md/dev-log/day06.html#学习过程"><!---->学习过程<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a aria-label="遇到的问题" class="vp-link nav-link vp-sidebar-link vp-heading nav-link vp-sidebar-link vp-heading" href="/md/dev-log/day06.html#遇到的问题"><!---->遇到的问题<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a aria-label="总结" class="vp-link nav-link vp-sidebar-link vp-heading nav-link vp-sidebar-link vp-heading" href="/md/dev-log/day06.html#总结"><!---->总结<!----></a><ul class="vp-sidebar-sub-headers"></ul></li></ul><!--]--></li><li><!--[--><a aria-label="Day07 ~ Day08" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day07~day08.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day07 ~ Day08<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day09 ~ Day10" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day09~day10.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day09 ~ Day10<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day011" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day11.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day011<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day012" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day12.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day012<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li></ul></section></li></ul><!--[--><!----><!--]--></aside><!--[--><main id="main-content" class="vp-page"><!--[--><!----><!----><nav class="vp-breadcrumb disable"></nav><div class="vp-page-title"><h1><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day06</h1><div class="page-info"><span class="page-author-info" aria-label="作者🖊" data-balloon-pos="down"><svg xmlns="http://www.w3.org/2000/svg" class="icon author-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="author icon"><path d="M649.6 633.6c86.4-48 147.2-144 147.2-249.6 0-160-128-288-288-288s-288 128-288 288c0 108.8 57.6 201.6 147.2 249.6-121.6 48-214.4 153.6-240 288-3.2 9.6 0 19.2 6.4 25.6 3.2 9.6 12.8 12.8 22.4 12.8h704c9.6 0 19.2-3.2 25.6-12.8 6.4-6.4 9.6-16 6.4-25.6-25.6-134.4-121.6-240-243.2-288z"></path></svg><span><a class="page-author-item" href="https://mister-hope.com" target="_blank" rel="noopener noreferrer">Mr.Hope</a></span><span property="author" content="Mr.Hope"></span></span><!----><!----><!----><span class="page-reading-time-info" aria-label="阅读时间⌛" data-balloon-pos="down"><svg xmlns="http://www.w3.org/2000/svg" class="icon timer-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="timer icon"><path d="M799.387 122.15c4.402-2.978 7.38-7.897 7.38-13.463v-1.165c0-8.933-7.38-16.312-16.312-16.312H256.33c-8.933 0-16.311 7.38-16.311 16.312v1.165c0 5.825 2.977 10.874 7.637 13.592 4.143 194.44 97.22 354.963 220.201 392.763-122.204 37.542-214.893 196.511-220.2 389.397-4.661 5.049-7.638 11.651-7.638 19.03v5.825h566.49v-5.825c0-7.379-2.849-13.981-7.509-18.9-5.049-193.016-97.867-351.985-220.2-389.527 123.24-37.67 216.446-198.453 220.588-392.892zM531.16 450.445v352.632c117.674 1.553 211.787 40.778 211.787 88.676H304.097c0-48.286 95.149-87.382 213.728-88.676V450.445c-93.077-3.107-167.901-81.297-167.901-177.093 0-8.803 6.99-15.793 15.793-15.793 8.803 0 15.794 6.99 15.794 15.793 0 80.261 63.69 145.635 142.01 145.635s142.011-65.374 142.011-145.635c0-8.803 6.99-15.793 15.794-15.793s15.793 6.99 15.793 15.793c0 95.019-73.789 172.82-165.96 177.093z"></path></svg><span>大约 4 分钟</span><meta property="timeRequired" content="PT4M"></span><span class="page-category-info" aria-label="分类🌈" data-balloon-pos="down"><svg xmlns="http://www.w3.org/2000/svg" class="icon category-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="category icon"><path d="M148.41 106.992h282.176c22.263 0 40.31 18.048 40.31 40.31V429.48c0 22.263-18.047 40.31-40.31 40.31H148.41c-22.263 0-40.311-18.047-40.311-40.31V147.302c0-22.263 18.048-40.31 40.311-40.31zM147.556 553.478H429.73c22.263 0 40.311 18.048 40.311 40.31v282.176c0 22.263-18.048 40.312-40.31 40.312H147.555c-22.263 0-40.311-18.049-40.311-40.312V593.79c0-22.263 18.048-40.311 40.31-40.311zM593.927 106.992h282.176c22.263 0 40.31 18.048 40.31 40.31V429.48c0 22.263-18.047 40.31-40.31 40.31H593.927c-22.263 0-40.311-18.047-40.311-40.31V147.302c0-22.263 18.048-40.31 40.31-40.31zM730.22 920.502H623.926c-40.925 0-74.22-33.388-74.22-74.425V623.992c0-41.038 33.387-74.424 74.425-74.424h222.085c41.038 0 74.424 33.226 74.424 74.067v114.233c0 10.244-8.304 18.548-18.547 18.548s-18.548-8.304-18.548-18.548V623.635c0-20.388-16.746-36.974-37.33-36.974H624.13c-20.585 0-37.331 16.747-37.331 37.33v222.086c0 20.585 16.654 37.331 37.126 37.331H730.22c10.243 0 18.547 8.304 18.547 18.547 0 10.244-8.304 18.547-18.547 18.547z"></path></svg><!--[--><span class="page-category-item category1" role>开发笔记</span><span class="page-category-item category7" role>学习记录</span><!--]--><meta property="articleSection" content="开发笔记,学习记录"></span><!----></div><hr></div><div class="toc-place-holder"><aside id="toc"><!--[--><!----><!--]--><div class="toc-header">此页内容<button type="button" class="print-button" title="打印"><svg xmlns="http://www.w3.org/2000/svg" class="icon print-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="print icon"><path d="M819.2 364.8h-44.8V128c0-17.067-14.933-32-32-32H281.6c-17.067 0-32 14.933-32 32v236.8h-44.8C145.067 364.8 96 413.867 96 473.6v192c0 59.733 49.067 108.8 108.8 108.8h44.8V896c0 17.067 14.933 32 32 32h460.8c17.067 0 32-14.933 32-32V774.4h44.8c59.733 0 108.8-49.067 108.8-108.8v-192c0-59.733-49.067-108.8-108.8-108.8zM313.6 160h396.8v204.8H313.6V160zm396.8 704H313.6V620.8h396.8V864zM864 665.6c0 25.6-19.2 44.8-44.8 44.8h-44.8V588.8c0-17.067-14.933-32-32-32H281.6c-17.067 0-32 14.933-32 32v121.6h-44.8c-25.6 0-44.8-19.2-44.8-44.8v-192c0-25.6 19.2-44.8 44.8-44.8h614.4c25.6 0 44.8 19.2 44.8 44.8v192z"></path></svg></button></div><div class="toc-wrapper"><ul class="toc-list"><!--[--><li class="toc-item"><a class="vp-link toc-link level3 toc-link level3" href="/#任务">任务</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3 toc-link level3" href="/#学习过程">学习过程</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3 toc-link level3" href="/#遇到的问题">遇到的问题</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3 toc-link level3" href="/#总结">总结</a></li><!----><!--]--></ul><div class="toc-marker" style="top:-1.7rem;"></div></div><!--[--><!----><!--]--></aside></div><!----><div class="theme-hope-content"><h3 id="任务" tabindex="-1"><a class="header-anchor" href="#任务" aria-hidden="true">#</a> 任务</h3><ul><li>[x] ID 生成策略开发</li></ul><h3 id="学习过程" tabindex="-1"><a class="header-anchor" href="#学习过程" aria-hidden="true">#</a> 学习过程</h3><ol><li><p>先看视频了解用到了啥</p></li><li><p>看小傅哥策略模式的<a href="https://mp.weixin.qq.com/s/zOFLtSFVrYEyTuihzwgKYw" target="_blank" rel="noopener noreferrer">文章<span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">open in new window</span></span></a></p></li><li><p>看代码结构</p><ol><li>定义一个接口,用来生成 id</li><li>实现接口,实现不同的 id 生成算法</li><li>定义一个上下文对象,包装各种 id 生成算法,然后放到 Spring 容器中供其他类注入使用</li></ol><p>今天的代码比较简单,主要就是涉及策略模式的使用,这里的上下文对象和之前的 config 类似,都是把写好的实现类进行包装,统一放到一个容器内,然后其他类通过这个容器,配合枚举拿到对应的实现类进行调用</p></li><li><p>实操</p></li></ol><h3 id="遇到的问题" tabindex="-1"><a class="header-anchor" href="#遇到的问题" aria-hidden="true">#</a> 遇到的问题</h3><ol><li>什么是雪花算法</li><li>项目代码中的雪花算法为什么要这么写</li></ol><h3 id="总结" tabindex="-1"><a class="header-anchor" href="#总结" aria-hidden="true">#</a> 总结</h3><ol><li><p>对策略模式的新看法</p><p>现在对策略模式的看法如下:</p><ol><li>将每一种策略想象成一个又一个的工具类</li><li>这些工具类都来自同一个接口,也就是实现的功能是类似的,比如都是生成 ID,都是用来发奖的</li><li>把这些工具类进行 “打包” 处理,封装在一个 Map 中,键使用枚举进行处理</li><li>后续使用通过注入封装好的 Map 和枚举直接进行 get 操作然后使用就可以了</li></ol><p>好处:</p><p>减少 if else 的次数,如果以后要进行扩展,只需要添加一个接口实现,然后在 &quot;打包&quot; 里添加一种策略就可以了,易于扩展,避免代码过度耦合,把一坨代码进行分片,功能职责划分更清楚,并且可以动态切换算法:将实现类进行更改就可以实现动态切换</p></li><li><p>什么是雪花算法</p><p>雪花算法用于生成分布式唯一 ID,核心思想如下:</p><ol><li>将一个64位的整数划分为不同的部分,每一部分代表不同的含义</li><li>符号位(1位):始终为 0,表示生成的 ID 为正整数</li><li>时间戳(41位):记录生成 ID 的时间戳,精确到毫秒级,41位可以表示约 69 年的时间</li><li>工作机器 ID(10位):标识机器的唯一ID,用于解决分布式系统中的多节点生成 ID 的冲突问题,最多有 2^10 台机器 ,即 1024 个</li><li>序列号(12位):表示同一毫秒内的序列号,用于解决同一节点在同一毫秒内生成 ID 的冲突问题,最多可以用 2 的 12 次方个 ID,也就是同一毫秒内同一机器最多生成 4096 个</li></ol><p>通俗化:确保在分布式系统中,通过对时间戳、机器和序列号进行加工,生成一个唯一 ID</p><p>了解了这个东西就能理解项目中为啥要这么写了,后面看看雪花算法的具体源码,看看每个部分如何进行加工的</p></li><li><p>短码生成的时候进行打乱和再加工</p><p>因为没有实际项目经验之前就是直接拿当前时间戳进行获取的,没有进行打乱操作,以后要记住这个操作,避免项目数据被别人抓个包一下子就猜出来了 -.- 好歹穿件衣服,不能裸奔</p></li><li><p>预习预习明天的内容,哈哈哈,好像要开始上强度了,昨天亲戚结婚忙了一天,半夜才回来,今天就到这把,查点资料预习预习明天的,感觉 DDD 这种包组织方式特别适合每种设计模式和算法的落地,MVC 如果想要算法和设计模式落地的话,感觉要考虑的东西很多很多,要么就是牵一发而动全身,要么就是落地之后包里面有很多的多余的东西,这种方式则不会出现这种情况,一个领域里面,使用一种设计模式,并不会影响其他的包,其他的包只管调用所提供的接口就好了</p></li></ol></div><!----><footer class="page-meta"><div class="meta-item edit-link"><a href="https://github.com/fuzhengwei/xfg-resume-blog/edit/main/src/md/dev-log/day06.md" rel="noopener noreferrer" target="_blank" aria-label="在 GitHub 上编辑此页" class="nav-link label"><!--[--><svg xmlns="http://www.w3.org/2000/svg" class="icon edit-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="edit icon"><path d="M430.818 653.65a60.46 60.46 0 0 1-50.96-93.281l71.69-114.012 7.773-10.365L816.038 80.138A60.46 60.46 0 0 1 859.225 62a60.46 60.46 0 0 1 43.186 18.138l43.186 43.186a60.46 60.46 0 0 1 0 86.373L588.879 565.55l-8.637 8.637-117.466 68.234a60.46 60.46 0 0 1-31.958 11.229z"></path><path d="M728.802 962H252.891A190.883 190.883 0 0 1 62.008 771.98V296.934a190.883 190.883 0 0 1 190.883-192.61h267.754a60.46 60.46 0 0 1 0 120.92H252.891a69.962 69.962 0 0 0-69.098 69.099V771.98a69.962 69.962 0 0 0 69.098 69.098h475.911A69.962 69.962 0 0 0 797.9 771.98V503.363a60.46 60.46 0 1 1 120.922 0V771.98A190.883 190.883 0 0 1 728.802 962z"></path></svg><!--]-->在 GitHub 上编辑此页<span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">open in new window</span></span><!----></a></div><div class="meta-item git-info"><!----><!----></div></footer><nav class="vp-page-nav"><a aria-label="Day05" class="vp-link nav-link prev nav-link prev" href="/md/dev-log/day05.html"><div class="hint"><span class="arrow start"></span>上一页</div><div class="link"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day05</div></a><a aria-label="Day07 ~ Day08" class="vp-link nav-link next nav-link next" href="/md/dev-log/day07~day08.html"><div class="hint">下一页<span class="arrow end"></span></div><div class="link">Day07 ~ Day08<span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span></div></a></nav><!----><!----><!--]--></main><!--]--><footer class="vp-footer-wrapper"><div class="vp-footer">我的微信:fustack</div><div class="vp-copyright">Copyright © 2024 Mr.Hope</div></footer></div><!--]--><!----><!--]--></div>
<script type="module" src="/assets/app-89848b6d.js" defer></script>
</body>
</html>
<!doctype html>
<html lang="zh-CN" data-theme="light">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<meta name="generator" content="VuePress 2.0.0-beta.67" />
<meta name="theme" content="VuePress Theme Hope" />
<meta property="og:url" content="https://vuepress-theme-hope-docs-demo.netlify.app/md/dev-log/day07~day08.html"><meta property="og:site_name" content="我的简历"><meta property="og:title" content="Day07 ~ Day08"><meta property="og:description" content="任务 [x] 分库分表组件; 遇到的问题 问题就不说了,这一章节全是问题 T.T,基础不牢,地动山摇啊!!! 总结 首先建立一个大局观,要实现一个分库分表组件,那么先要学会如何编写 SpringBoot Starter,然后这个 Starter 需要实现的功能是分库分表,那么一定是有多个数据源,这个数据源从项目的 yml 配置文件传进来,然后就要实现多..."><meta property="og:type" content="article"><meta property="og:locale" content="zh-CN"><meta property="article:author" content="Mr.Hope"><script type="application/ld+json">{"@context":"https://schema.org","@type":"Article","headline":"Day07 ~ Day08","image":[""],"dateModified":null,"author":[{"@type":"Person","name":"Mr.Hope","url":"https://mister-hope.com"}]}</script><title>Day07 ~ Day08 | 我的简历</title><meta name="description" content="任务 [x] 分库分表组件; 遇到的问题 问题就不说了,这一章节全是问题 T.T,基础不牢,地动山摇啊!!! 总结 首先建立一个大局观,要实现一个分库分表组件,那么先要学会如何编写 SpringBoot Starter,然后这个 Starter 需要实现的功能是分库分表,那么一定是有多个数据源,这个数据源从项目的 yml 配置文件传进来,然后就要实现多...">
<style>
:root {
--bg-color: #fff;
}
html[data-theme="dark"] {
--bg-color: #1d1e1f;
}
html,
body {
background: var(--bg-color);
}
</style>
<script>
const userMode = localStorage.getItem("vuepress-theme-hope-scheme");
const systemDarkMode =
window.matchMedia &&
window.matchMedia("(prefers-color-scheme: dark)").matches;
if (userMode === "dark" || (userMode !== "light" && systemDarkMode)) {
document.documentElement.setAttribute("data-theme", "dark");
}
</script>
<link rel="preload" href="/assets/style-e1af0ae0.css" as="style"><link rel="stylesheet" href="/assets/style-e1af0ae0.css">
<link rel="modulepreload" href="/assets/app-89848b6d.js"><link rel="modulepreload" href="/assets/day07~day08.html-4e5d7c48.js"><link rel="modulepreload" href="/assets/plugin-vue_export-helper-c27b6911.js"><link rel="modulepreload" href="/assets/day07~day08.html-623b7865.js"><link rel="prefetch" href="/assets/index.html-3ddb8fc8.js" as="script"><link rel="prefetch" href="/assets/slides.html-e24915cf.js" as="script"><link rel="prefetch" href="/assets/resume.html-63219902.js" as="script"><link rel="prefetch" href="/assets/index.html-ee414c74.js" as="script"><link rel="prefetch" href="/assets/day01.html-96303a92.js" as="script"><link rel="prefetch" href="/assets/day02.html-bc6452cb.js" as="script"><link rel="prefetch" href="/assets/day03.html-faf19961.js" as="script"><link rel="prefetch" href="/assets/day04.html-f1431c14.js" as="script"><link rel="prefetch" href="/assets/day05.html-e1b66f43.js" as="script"><link rel="prefetch" href="/assets/day06.html-694a0d7d.js" as="script"><link rel="prefetch" href="/assets/day09~day10.html-f64b96c2.js" as="script"><link rel="prefetch" href="/assets/day11.html-a02521a7.js" as="script"><link rel="prefetch" href="/assets/day12.html-59d9b776.js" as="script"><link rel="prefetch" href="/assets/404.html-a12454c5.js" as="script"><link rel="prefetch" href="/assets/index.html-38735195.js" as="script"><link rel="prefetch" href="/assets/index.html-72fa7116.js" as="script"><link rel="prefetch" href="/assets/slides.html-73aa899b.js" as="script"><link rel="prefetch" href="/assets/resume.html-0d5e8b6f.js" as="script"><link rel="prefetch" href="/assets/index.html-604f9d5c.js" as="script"><link rel="prefetch" href="/assets/day01.html-f34d072c.js" as="script"><link rel="prefetch" href="/assets/day02.html-faf555eb.js" as="script"><link rel="prefetch" href="/assets/day03.html-f3141bb2.js" as="script"><link rel="prefetch" href="/assets/day04.html-61a7012e.js" as="script"><link rel="prefetch" href="/assets/day05.html-4698622b.js" as="script"><link rel="prefetch" href="/assets/day06.html-a4c2781d.js" as="script"><link rel="prefetch" href="/assets/day09~day10.html-ee1cb17c.js" as="script"><link rel="prefetch" href="/assets/day11.html-13381d55.js" as="script"><link rel="prefetch" href="/assets/day12.html-4bed2fb6.js" as="script"><link rel="prefetch" href="/assets/404.html-4d74dcf3.js" as="script"><link rel="prefetch" href="/assets/index.html-f3051275.js" as="script"><link rel="prefetch" href="/assets/photoswipe.esm-060dc2da.js" as="script">
</head>
<body>
<div id="app"><!--[--><!--[--><!--[--><span tabindex="-1"></span><a href="#main-content" class="vp-skip-link sr-only">跳至主要內容</a><!--]--><div class="theme-container has-toc"><!--[--><header id="navbar" class="vp-navbar"><div class="vp-navbar-start"><button type="button" class="vp-toggle-sidebar-button" title="Toggle Sidebar"><span class="icon"></span></button><!--[--><!----><!--]--><!--[--><a class="vp-link vp-brand vp-brand" href="/"><img class="vp-nav-logo" src="/logo.svg" alt="我的简历"><!----><span class="vp-site-name hide-in-pad">我的简历</span></a><!--]--><!--[--><!----><!--]--></div><div class="vp-navbar-center"><!--[--><!----><!--]--><!--[--><nav class="vp-nav-links"><div class="nav-item hide-in-mobile"><a aria-label="主页" class="vp-link nav-link nav-link" href="/"><span class="font-icon icon fa-fw fa-sm fas fa-home" style=""></span>主页<!----></a></div><div class="nav-item hide-in-mobile"><a aria-label="个人简历" class="vp-link nav-link nav-link" href="/md/resume.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>个人简历<!----></a></div><div class="nav-item hide-in-mobile"><a aria-label="开发日志" class="vp-link nav-link nav-link" href="/md/dev-log/day01.html"><span class="font-icon icon fa-fw fa-sm fas fa-book" style=""></span>开发日志<!----></a></div></nav><!--]--><!--[--><!----><!--]--></div><div class="vp-navbar-end"><!--[--><!----><!--]--><!--[--><!----><div class="nav-item vp-repo"><a class="vp-repo-link" href="https://github.com/fuzhengwei/xfg-resume-blog" target="_blank" rel="noopener noreferrer" aria-label="GitHub"><svg xmlns="http://www.w3.org/2000/svg" class="icon github-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="github icon" style="width:1.25rem;height:1.25rem;vertical-align:middle;"><path d="M511.957 21.333C241.024 21.333 21.333 240.981 21.333 512c0 216.832 140.544 400.725 335.574 465.664 24.49 4.395 32.256-10.07 32.256-23.083 0-11.69.256-44.245 0-85.205-136.448 29.61-164.736-64.64-164.736-64.64-22.315-56.704-54.4-71.765-54.4-71.765-44.587-30.464 3.285-29.824 3.285-29.824 49.195 3.413 75.179 50.517 75.179 50.517 43.776 75.008 114.816 53.333 142.762 40.79 4.523-31.66 17.152-53.377 31.19-65.537-108.971-12.458-223.488-54.485-223.488-242.602 0-53.547 19.114-97.323 50.517-131.67-5.035-12.33-21.93-62.293 4.779-129.834 0 0 41.258-13.184 134.912 50.346a469.803 469.803 0 0 1 122.88-16.554c41.642.213 83.626 5.632 122.88 16.554 93.653-63.488 134.784-50.346 134.784-50.346 26.752 67.541 9.898 117.504 4.864 129.834 31.402 34.347 50.474 78.123 50.474 131.67 0 188.586-114.73 230.016-224.042 242.09 17.578 15.232 33.578 44.672 33.578 90.454v135.85c0 13.142 7.936 27.606 32.854 22.87C862.25 912.597 1002.667 728.747 1002.667 512c0-271.019-219.648-490.667-490.71-490.667z"></path></svg></a></div><div class="nav-item hide-in-mobile"><button type="button" id="appearance-switch"><svg xmlns="http://www.w3.org/2000/svg" class="icon auto-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="auto icon" style="display:block;"><path d="M512 992C246.92 992 32 777.08 32 512S246.92 32 512 32s480 214.92 480 480-214.92 480-480 480zm0-840c-198.78 0-360 161.22-360 360 0 198.84 161.22 360 360 360s360-161.16 360-360c0-198.78-161.22-360-360-360zm0 660V212c165.72 0 300 134.34 300 300 0 165.72-134.28 300-300 300z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" class="icon dark-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="dark icon" style="display:none;"><path d="M524.8 938.667h-4.267a439.893 439.893 0 0 1-313.173-134.4 446.293 446.293 0 0 1-11.093-597.334A432.213 432.213 0 0 1 366.933 90.027a42.667 42.667 0 0 1 45.227 9.386 42.667 42.667 0 0 1 10.24 42.667 358.4 358.4 0 0 0 82.773 375.893 361.387 361.387 0 0 0 376.747 82.774 42.667 42.667 0 0 1 54.187 55.04 433.493 433.493 0 0 1-99.84 154.88 438.613 438.613 0 0 1-311.467 128z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" class="icon light-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="light icon" style="display:none;"><path d="M952 552h-80a40 40 0 0 1 0-80h80a40 40 0 0 1 0 80zM801.88 280.08a41 41 0 0 1-57.96-57.96l57.96-58a41.04 41.04 0 0 1 58 58l-58 57.96zM512 752a240 240 0 1 1 0-480 240 240 0 0 1 0 480zm0-560a40 40 0 0 1-40-40V72a40 40 0 0 1 80 0v80a40 40 0 0 1-40 40zm-289.88 88.08-58-57.96a41.04 41.04 0 0 1 58-58l57.96 58a41 41 0 0 1-57.96 57.96zM192 512a40 40 0 0 1-40 40H72a40 40 0 0 1 0-80h80a40 40 0 0 1 40 40zm30.12 231.92a41 41 0 0 1 57.96 57.96l-57.96 58a41.04 41.04 0 0 1-58-58l58-57.96zM512 832a40 40 0 0 1 40 40v80a40 40 0 0 1-80 0v-80a40 40 0 0 1 40-40zm289.88-88.08 58 57.96a41.04 41.04 0 0 1-58 58l-57.96-58a41 41 0 0 1 57.96-57.96z"></path></svg></button></div><!----><!--]--><!--[--><!----><!--]--><button type="button" class="vp-toggle-navbar-button" aria-label="Toggle Navbar" aria-expanded="false" aria-controls="nav-screen"><span><span class="vp-top"></span><span class="vp-middle"></span><span class="vp-bottom"></span></span></button></div></header><!----><!--]--><!----><div class="toggle-sidebar-wrapper"><span class="arrow start"></span></div><aside id="sidebar" class="vp-sidebar"><!--[--><!----><!--]--><ul class="vp-sidebar-links"><li><!--[--><a aria-label="主页" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/"><span class="font-icon icon fa-fw fa-sm fas fa-home" style=""></span>主页<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><section class="vp-sidebar-group"><p class="vp-sidebar-heading active"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span><span class="vp-sidebar-title">Lottery 项目开发日志</span><!----></p><ul class="vp-sidebar-links"><li><!--[--><a aria-label="Day01" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day01.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day01<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day02" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day02.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day02<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day03" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day03.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day03<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day04" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day04.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day04<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day05" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day05.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day05<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day06" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day06.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day06<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day07 ~ Day08" class="vp-link nav-link active vp-sidebar-link vp-sidebar-page active nav-link active vp-sidebar-link vp-sidebar-page active" href="/md/dev-log/day07~day08.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day07 ~ Day08<!----></a><ul class="vp-sidebar-sub-headers"><li class="vp-sidebar-sub-header"><a aria-label="任务" class="vp-link nav-link vp-sidebar-link vp-heading nav-link vp-sidebar-link vp-heading" href="/md/dev-log/day07~day08.html#任务"><!---->任务<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a aria-label="遇到的问题" class="vp-link nav-link vp-sidebar-link vp-heading nav-link vp-sidebar-link vp-heading" href="/md/dev-log/day07~day08.html#遇到的问题"><!---->遇到的问题<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a aria-label="总结" class="vp-link nav-link vp-sidebar-link vp-heading nav-link vp-sidebar-link vp-heading" href="/md/dev-log/day07~day08.html#总结"><!---->总结<!----></a><ul class="vp-sidebar-sub-headers"></ul></li></ul><!--]--></li><li><!--[--><a aria-label="Day09 ~ Day10" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day09~day10.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day09 ~ Day10<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day011" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day11.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day011<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day012" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day12.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day012<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li></ul></section></li></ul><!--[--><!----><!--]--></aside><!--[--><main id="main-content" class="vp-page"><!--[--><!----><!----><nav class="vp-breadcrumb disable"></nav><div class="vp-page-title"><h1><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day07 ~ Day08</h1><div class="page-info"><span class="page-author-info" aria-label="作者🖊" data-balloon-pos="down"><svg xmlns="http://www.w3.org/2000/svg" class="icon author-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="author icon"><path d="M649.6 633.6c86.4-48 147.2-144 147.2-249.6 0-160-128-288-288-288s-288 128-288 288c0 108.8 57.6 201.6 147.2 249.6-121.6 48-214.4 153.6-240 288-3.2 9.6 0 19.2 6.4 25.6 3.2 9.6 12.8 12.8 22.4 12.8h704c9.6 0 19.2-3.2 25.6-12.8 6.4-6.4 9.6-16 6.4-25.6-25.6-134.4-121.6-240-243.2-288z"></path></svg><span><a class="page-author-item" href="https://mister-hope.com" target="_blank" rel="noopener noreferrer">Mr.Hope</a></span><span property="author" content="Mr.Hope"></span></span><!----><!----><!----><span class="page-reading-time-info" aria-label="阅读时间⌛" data-balloon-pos="down"><svg xmlns="http://www.w3.org/2000/svg" class="icon timer-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="timer icon"><path d="M799.387 122.15c4.402-2.978 7.38-7.897 7.38-13.463v-1.165c0-8.933-7.38-16.312-16.312-16.312H256.33c-8.933 0-16.311 7.38-16.311 16.312v1.165c0 5.825 2.977 10.874 7.637 13.592 4.143 194.44 97.22 354.963 220.201 392.763-122.204 37.542-214.893 196.511-220.2 389.397-4.661 5.049-7.638 11.651-7.638 19.03v5.825h566.49v-5.825c0-7.379-2.849-13.981-7.509-18.9-5.049-193.016-97.867-351.985-220.2-389.527 123.24-37.67 216.446-198.453 220.588-392.892zM531.16 450.445v352.632c117.674 1.553 211.787 40.778 211.787 88.676H304.097c0-48.286 95.149-87.382 213.728-88.676V450.445c-93.077-3.107-167.901-81.297-167.901-177.093 0-8.803 6.99-15.793 15.793-15.793 8.803 0 15.794 6.99 15.794 15.793 0 80.261 63.69 145.635 142.01 145.635s142.011-65.374 142.011-145.635c0-8.803 6.99-15.793 15.794-15.793s15.793 6.99 15.793 15.793c0 95.019-73.789 172.82-165.96 177.093z"></path></svg><span>大约 3 分钟</span><meta property="timeRequired" content="PT3M"></span><span class="page-category-info" aria-label="分类🌈" data-balloon-pos="down"><svg xmlns="http://www.w3.org/2000/svg" class="icon category-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="category icon"><path d="M148.41 106.992h282.176c22.263 0 40.31 18.048 40.31 40.31V429.48c0 22.263-18.047 40.31-40.31 40.31H148.41c-22.263 0-40.311-18.047-40.311-40.31V147.302c0-22.263 18.048-40.31 40.311-40.31zM147.556 553.478H429.73c22.263 0 40.311 18.048 40.311 40.31v282.176c0 22.263-18.048 40.312-40.31 40.312H147.555c-22.263 0-40.311-18.049-40.311-40.312V593.79c0-22.263 18.048-40.311 40.31-40.311zM593.927 106.992h282.176c22.263 0 40.31 18.048 40.31 40.31V429.48c0 22.263-18.047 40.31-40.31 40.31H593.927c-22.263 0-40.311-18.047-40.311-40.31V147.302c0-22.263 18.048-40.31 40.31-40.31zM730.22 920.502H623.926c-40.925 0-74.22-33.388-74.22-74.425V623.992c0-41.038 33.387-74.424 74.425-74.424h222.085c41.038 0 74.424 33.226 74.424 74.067v114.233c0 10.244-8.304 18.548-18.547 18.548s-18.548-8.304-18.548-18.548V623.635c0-20.388-16.746-36.974-37.33-36.974H624.13c-20.585 0-37.331 16.747-37.331 37.33v222.086c0 20.585 16.654 37.331 37.126 37.331H730.22c10.243 0 18.547 8.304 18.547 18.547 0 10.244-8.304 18.547-18.547 18.547z"></path></svg><!--[--><span class="page-category-item category1" role>开发笔记</span><span class="page-category-item category7" role>学习记录</span><!--]--><meta property="articleSection" content="开发笔记,学习记录"></span><!----></div><hr></div><div class="toc-place-holder"><aside id="toc"><!--[--><!----><!--]--><div class="toc-header">此页内容<button type="button" class="print-button" title="打印"><svg xmlns="http://www.w3.org/2000/svg" class="icon print-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="print icon"><path d="M819.2 364.8h-44.8V128c0-17.067-14.933-32-32-32H281.6c-17.067 0-32 14.933-32 32v236.8h-44.8C145.067 364.8 96 413.867 96 473.6v192c0 59.733 49.067 108.8 108.8 108.8h44.8V896c0 17.067 14.933 32 32 32h460.8c17.067 0 32-14.933 32-32V774.4h44.8c59.733 0 108.8-49.067 108.8-108.8v-192c0-59.733-49.067-108.8-108.8-108.8zM313.6 160h396.8v204.8H313.6V160zm396.8 704H313.6V620.8h396.8V864zM864 665.6c0 25.6-19.2 44.8-44.8 44.8h-44.8V588.8c0-17.067-14.933-32-32-32H281.6c-17.067 0-32 14.933-32 32v121.6h-44.8c-25.6 0-44.8-19.2-44.8-44.8v-192c0-25.6 19.2-44.8 44.8-44.8h614.4c25.6 0 44.8 19.2 44.8 44.8v192z"></path></svg></button></div><div class="toc-wrapper"><ul class="toc-list"><!--[--><li class="toc-item"><a class="vp-link toc-link level3 toc-link level3" href="/#任务">任务</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3 toc-link level3" href="/#遇到的问题">遇到的问题</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3 toc-link level3" href="/#总结">总结</a></li><!----><!--]--></ul><div class="toc-marker" style="top:-1.7rem;"></div></div><!--[--><!----><!--]--></aside></div><!----><div class="theme-hope-content"><h3 id="任务" tabindex="-1"><a class="header-anchor" href="#任务" aria-hidden="true">#</a> 任务</h3><ul><li>[x] 分库分表组件</li></ul><h3 id="遇到的问题" tabindex="-1"><a class="header-anchor" href="#遇到的问题" aria-hidden="true">#</a> 遇到的问题</h3><p>问题就不说了,这一章节全是问题 T.T,基础不牢,地动山摇啊!!!</p><h3 id="总结" tabindex="-1"><a class="header-anchor" href="#总结" aria-hidden="true">#</a> 总结</h3><p>首先建立一个大局观,要实现一个分库分表组件,那么先要学会如何编写 SpringBoot Starter,然后这个 Starter 需要实现的功能是分库分表,那么一定是有多个数据源,这个数据源从项目的 yml 配置文件传进来,然后就要实现多数据源的切换,然后分表操作就是要修改 SQL 的表名,所以需要做的事情大概是如下:</p><ol><li>读取数据源信息</li><li>动态修改数据源</li><li>动态修改 SQL</li></ol><p>那么细节该如何实现呢?需要想几个问题,某条数据应该分到哪个库的哪个表呢?这个库表信息该存到哪里进行共享呢?如何动态修改数据源呢?如何动态修改 SQL 呢?那么就需要对应的技术进行支持:</p><ol><li>Spring &amp; SpringBoot 基础框架,提供依赖注入、配置管理功能</li><li><code>AbstractRoutingDataSource </code> 实现动态数据源的路由逻辑</li><li><code>AspectJ</code> 切面编程,运行时动态拦截方法调用</li><li>反射 API,从方法参数中提取路由键的值</li><li>正则表达式,解析和修改 SQL</li><li>ThreadLocal,存储路由信息,以支持动态数据源路由</li></ol><p>总体执行流程:</p><ol><li>调用被 <code>@DBRouter</code> 注解的方法</li><li>然后被切面进行拦截,拦截之后先进行路由计算,然后把计算结果保存到 ThreadLocal 中</li><li>然后 DynamicDataSource 通过保存到 ThreadLocal 中的数据确定使用哪一个数据源</li><li>然后 MyBatis 插件修改 SQL 中的表字段</li><li>然后数据库操作执行完成</li><li>切面清理 ThreadLocal 里面的数据</li><li>方法执行完成,返回结果</li></ol><p>虽然步骤不多,但是稍不注意就会出现小 bug,抑或扰动函数算法出错,抑或解析 yml 配置出错等等诸多问题,也是花了两三天才大致搞明白这个路由组件,因为这里面的东西大部分之前都没接触过,查阅了许多文档,毕竟之前连切面都不怎么用,最多也就是拿来做全局日志处理</p><p>总之,要先在大脑里面理清总体的一个执行流程,然后根据这个流程再去看代码要清晰很多,最开始的时候没理清步骤,直接看的代码,那种感觉就像第一天学 DDD 一样,直接一脸懵逼,怎么这么多包,卧槽,第一遍下来大概只学到了百分之五十吧,这一遍大概只学到了整体架构,具体的细节还没掌握,下一次努力啃啃细节,如果要我写整个这一套代码,我肯定写出来会报很多错,但是第一次就想学透整个路程怎么可能呢?好在这一次理清了整体架构,至少有了头绪,不至于开不了头,有了头绪,到处搜一搜,拼拼凑凑也能写,哈哈哈</p></div><!----><footer class="page-meta"><div class="meta-item edit-link"><a href="https://github.com/fuzhengwei/xfg-resume-blog/edit/main/src/md/dev-log/day07~day08.md" rel="noopener noreferrer" target="_blank" aria-label="在 GitHub 上编辑此页" class="nav-link label"><!--[--><svg xmlns="http://www.w3.org/2000/svg" class="icon edit-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="edit icon"><path d="M430.818 653.65a60.46 60.46 0 0 1-50.96-93.281l71.69-114.012 7.773-10.365L816.038 80.138A60.46 60.46 0 0 1 859.225 62a60.46 60.46 0 0 1 43.186 18.138l43.186 43.186a60.46 60.46 0 0 1 0 86.373L588.879 565.55l-8.637 8.637-117.466 68.234a60.46 60.46 0 0 1-31.958 11.229z"></path><path d="M728.802 962H252.891A190.883 190.883 0 0 1 62.008 771.98V296.934a190.883 190.883 0 0 1 190.883-192.61h267.754a60.46 60.46 0 0 1 0 120.92H252.891a69.962 69.962 0 0 0-69.098 69.099V771.98a69.962 69.962 0 0 0 69.098 69.098h475.911A69.962 69.962 0 0 0 797.9 771.98V503.363a60.46 60.46 0 1 1 120.922 0V771.98A190.883 190.883 0 0 1 728.802 962z"></path></svg><!--]-->在 GitHub 上编辑此页<span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">open in new window</span></span><!----></a></div><div class="meta-item git-info"><!----><!----></div></footer><nav class="vp-page-nav"><a aria-label="Day06" class="vp-link nav-link prev nav-link prev" href="/md/dev-log/day06.html"><div class="hint"><span class="arrow start"></span>上一页</div><div class="link"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day06</div></a><a aria-label="Day09 ~ Day10" class="vp-link nav-link next nav-link next" href="/md/dev-log/day09~day10.html"><div class="hint">下一页<span class="arrow end"></span></div><div class="link">Day09 ~ Day10<span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span></div></a></nav><!----><!----><!--]--></main><!--]--><footer class="vp-footer-wrapper"><div class="vp-footer">我的微信:fustack</div><div class="vp-copyright">Copyright © 2024 Mr.Hope</div></footer></div><!--]--><!----><!--]--></div>
<script type="module" src="/assets/app-89848b6d.js" defer></script>
</body>
</html>
<!doctype html>
<html lang="zh-CN" data-theme="light">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<meta name="generator" content="VuePress 2.0.0-beta.67" />
<meta name="theme" content="VuePress Theme Hope" />
<meta property="og:url" content="https://vuepress-theme-hope-docs-demo.netlify.app/md/dev-log/day09~day10.html"><meta property="og:site_name" content="我的简历"><meta property="og:title" content="Day09 ~ Day10"><meta property="og:description" content="任务 [x] 在应用层编排抽奖过程; 总结 有了前面的模板模式的基础,这一章节相对来说比较容易,自己实现的时候也没有什么大问题,大体流程就是写接口,编排流程,然后写实现类,然后写 Mapper,至于为什么花了两三天,这就不得不说上一章的分库分表了,没写过 SpringBoot Starter,没写过 MyBatis 插件,对 AOP 没有深刻的理解,纯..."><meta property="og:type" content="article"><meta property="og:locale" content="zh-CN"><meta property="article:author" content="Mr.Hope"><script type="application/ld+json">{"@context":"https://schema.org","@type":"Article","headline":"Day09 ~ Day10","image":[""],"dateModified":null,"author":[{"@type":"Person","name":"Mr.Hope","url":"https://mister-hope.com"}]}</script><title>Day09 ~ Day10 | 我的简历</title><meta name="description" content="任务 [x] 在应用层编排抽奖过程; 总结 有了前面的模板模式的基础,这一章节相对来说比较容易,自己实现的时候也没有什么大问题,大体流程就是写接口,编排流程,然后写实现类,然后写 Mapper,至于为什么花了两三天,这就不得不说上一章的分库分表了,没写过 SpringBoot Starter,没写过 MyBatis 插件,对 AOP 没有深刻的理解,纯...">
<style>
:root {
--bg-color: #fff;
}
html[data-theme="dark"] {
--bg-color: #1d1e1f;
}
html,
body {
background: var(--bg-color);
}
</style>
<script>
const userMode = localStorage.getItem("vuepress-theme-hope-scheme");
const systemDarkMode =
window.matchMedia &&
window.matchMedia("(prefers-color-scheme: dark)").matches;
if (userMode === "dark" || (userMode !== "light" && systemDarkMode)) {
document.documentElement.setAttribute("data-theme", "dark");
}
</script>
<link rel="preload" href="/assets/style-e1af0ae0.css" as="style"><link rel="stylesheet" href="/assets/style-e1af0ae0.css">
<link rel="modulepreload" href="/assets/app-89848b6d.js"><link rel="modulepreload" href="/assets/day09~day10.html-ee1cb17c.js"><link rel="modulepreload" href="/assets/plugin-vue_export-helper-c27b6911.js"><link rel="modulepreload" href="/assets/day09~day10.html-f64b96c2.js"><link rel="prefetch" href="/assets/index.html-3ddb8fc8.js" as="script"><link rel="prefetch" href="/assets/slides.html-e24915cf.js" as="script"><link rel="prefetch" href="/assets/resume.html-63219902.js" as="script"><link rel="prefetch" href="/assets/index.html-ee414c74.js" as="script"><link rel="prefetch" href="/assets/day01.html-96303a92.js" as="script"><link rel="prefetch" href="/assets/day02.html-bc6452cb.js" as="script"><link rel="prefetch" href="/assets/day03.html-faf19961.js" as="script"><link rel="prefetch" href="/assets/day04.html-f1431c14.js" as="script"><link rel="prefetch" href="/assets/day05.html-e1b66f43.js" as="script"><link rel="prefetch" href="/assets/day06.html-694a0d7d.js" as="script"><link rel="prefetch" href="/assets/day07~day08.html-623b7865.js" as="script"><link rel="prefetch" href="/assets/day11.html-a02521a7.js" as="script"><link rel="prefetch" href="/assets/day12.html-59d9b776.js" as="script"><link rel="prefetch" href="/assets/404.html-a12454c5.js" as="script"><link rel="prefetch" href="/assets/index.html-38735195.js" as="script"><link rel="prefetch" href="/assets/index.html-72fa7116.js" as="script"><link rel="prefetch" href="/assets/slides.html-73aa899b.js" as="script"><link rel="prefetch" href="/assets/resume.html-0d5e8b6f.js" as="script"><link rel="prefetch" href="/assets/index.html-604f9d5c.js" as="script"><link rel="prefetch" href="/assets/day01.html-f34d072c.js" as="script"><link rel="prefetch" href="/assets/day02.html-faf555eb.js" as="script"><link rel="prefetch" href="/assets/day03.html-f3141bb2.js" as="script"><link rel="prefetch" href="/assets/day04.html-61a7012e.js" as="script"><link rel="prefetch" href="/assets/day05.html-4698622b.js" as="script"><link rel="prefetch" href="/assets/day06.html-a4c2781d.js" as="script"><link rel="prefetch" href="/assets/day07~day08.html-4e5d7c48.js" as="script"><link rel="prefetch" href="/assets/day11.html-13381d55.js" as="script"><link rel="prefetch" href="/assets/day12.html-4bed2fb6.js" as="script"><link rel="prefetch" href="/assets/404.html-4d74dcf3.js" as="script"><link rel="prefetch" href="/assets/index.html-f3051275.js" as="script"><link rel="prefetch" href="/assets/photoswipe.esm-060dc2da.js" as="script">
</head>
<body>
<div id="app"><!--[--><!--[--><!--[--><span tabindex="-1"></span><a href="#main-content" class="vp-skip-link sr-only">跳至主要內容</a><!--]--><div class="theme-container has-toc"><!--[--><header id="navbar" class="vp-navbar"><div class="vp-navbar-start"><button type="button" class="vp-toggle-sidebar-button" title="Toggle Sidebar"><span class="icon"></span></button><!--[--><!----><!--]--><!--[--><a class="vp-link vp-brand vp-brand" href="/"><img class="vp-nav-logo" src="/logo.svg" alt="我的简历"><!----><span class="vp-site-name hide-in-pad">我的简历</span></a><!--]--><!--[--><!----><!--]--></div><div class="vp-navbar-center"><!--[--><!----><!--]--><!--[--><nav class="vp-nav-links"><div class="nav-item hide-in-mobile"><a aria-label="主页" class="vp-link nav-link nav-link" href="/"><span class="font-icon icon fa-fw fa-sm fas fa-home" style=""></span>主页<!----></a></div><div class="nav-item hide-in-mobile"><a aria-label="个人简历" class="vp-link nav-link nav-link" href="/md/resume.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>个人简历<!----></a></div><div class="nav-item hide-in-mobile"><a aria-label="开发日志" class="vp-link nav-link nav-link" href="/md/dev-log/day01.html"><span class="font-icon icon fa-fw fa-sm fas fa-book" style=""></span>开发日志<!----></a></div></nav><!--]--><!--[--><!----><!--]--></div><div class="vp-navbar-end"><!--[--><!----><!--]--><!--[--><!----><div class="nav-item vp-repo"><a class="vp-repo-link" href="https://github.com/fuzhengwei/xfg-resume-blog" target="_blank" rel="noopener noreferrer" aria-label="GitHub"><svg xmlns="http://www.w3.org/2000/svg" class="icon github-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="github icon" style="width:1.25rem;height:1.25rem;vertical-align:middle;"><path d="M511.957 21.333C241.024 21.333 21.333 240.981 21.333 512c0 216.832 140.544 400.725 335.574 465.664 24.49 4.395 32.256-10.07 32.256-23.083 0-11.69.256-44.245 0-85.205-136.448 29.61-164.736-64.64-164.736-64.64-22.315-56.704-54.4-71.765-54.4-71.765-44.587-30.464 3.285-29.824 3.285-29.824 49.195 3.413 75.179 50.517 75.179 50.517 43.776 75.008 114.816 53.333 142.762 40.79 4.523-31.66 17.152-53.377 31.19-65.537-108.971-12.458-223.488-54.485-223.488-242.602 0-53.547 19.114-97.323 50.517-131.67-5.035-12.33-21.93-62.293 4.779-129.834 0 0 41.258-13.184 134.912 50.346a469.803 469.803 0 0 1 122.88-16.554c41.642.213 83.626 5.632 122.88 16.554 93.653-63.488 134.784-50.346 134.784-50.346 26.752 67.541 9.898 117.504 4.864 129.834 31.402 34.347 50.474 78.123 50.474 131.67 0 188.586-114.73 230.016-224.042 242.09 17.578 15.232 33.578 44.672 33.578 90.454v135.85c0 13.142 7.936 27.606 32.854 22.87C862.25 912.597 1002.667 728.747 1002.667 512c0-271.019-219.648-490.667-490.71-490.667z"></path></svg></a></div><div class="nav-item hide-in-mobile"><button type="button" id="appearance-switch"><svg xmlns="http://www.w3.org/2000/svg" class="icon auto-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="auto icon" style="display:block;"><path d="M512 992C246.92 992 32 777.08 32 512S246.92 32 512 32s480 214.92 480 480-214.92 480-480 480zm0-840c-198.78 0-360 161.22-360 360 0 198.84 161.22 360 360 360s360-161.16 360-360c0-198.78-161.22-360-360-360zm0 660V212c165.72 0 300 134.34 300 300 0 165.72-134.28 300-300 300z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" class="icon dark-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="dark icon" style="display:none;"><path d="M524.8 938.667h-4.267a439.893 439.893 0 0 1-313.173-134.4 446.293 446.293 0 0 1-11.093-597.334A432.213 432.213 0 0 1 366.933 90.027a42.667 42.667 0 0 1 45.227 9.386 42.667 42.667 0 0 1 10.24 42.667 358.4 358.4 0 0 0 82.773 375.893 361.387 361.387 0 0 0 376.747 82.774 42.667 42.667 0 0 1 54.187 55.04 433.493 433.493 0 0 1-99.84 154.88 438.613 438.613 0 0 1-311.467 128z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" class="icon light-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="light icon" style="display:none;"><path d="M952 552h-80a40 40 0 0 1 0-80h80a40 40 0 0 1 0 80zM801.88 280.08a41 41 0 0 1-57.96-57.96l57.96-58a41.04 41.04 0 0 1 58 58l-58 57.96zM512 752a240 240 0 1 1 0-480 240 240 0 0 1 0 480zm0-560a40 40 0 0 1-40-40V72a40 40 0 0 1 80 0v80a40 40 0 0 1-40 40zm-289.88 88.08-58-57.96a41.04 41.04 0 0 1 58-58l57.96 58a41 41 0 0 1-57.96 57.96zM192 512a40 40 0 0 1-40 40H72a40 40 0 0 1 0-80h80a40 40 0 0 1 40 40zm30.12 231.92a41 41 0 0 1 57.96 57.96l-57.96 58a41.04 41.04 0 0 1-58-58l58-57.96zM512 832a40 40 0 0 1 40 40v80a40 40 0 0 1-80 0v-80a40 40 0 0 1 40-40zm289.88-88.08 58 57.96a41.04 41.04 0 0 1-58 58l-57.96-58a41 41 0 0 1 57.96-57.96z"></path></svg></button></div><!----><!--]--><!--[--><!----><!--]--><button type="button" class="vp-toggle-navbar-button" aria-label="Toggle Navbar" aria-expanded="false" aria-controls="nav-screen"><span><span class="vp-top"></span><span class="vp-middle"></span><span class="vp-bottom"></span></span></button></div></header><!----><!--]--><!----><div class="toggle-sidebar-wrapper"><span class="arrow start"></span></div><aside id="sidebar" class="vp-sidebar"><!--[--><!----><!--]--><ul class="vp-sidebar-links"><li><!--[--><a aria-label="主页" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/"><span class="font-icon icon fa-fw fa-sm fas fa-home" style=""></span>主页<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><section class="vp-sidebar-group"><p class="vp-sidebar-heading active"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span><span class="vp-sidebar-title">Lottery 项目开发日志</span><!----></p><ul class="vp-sidebar-links"><li><!--[--><a aria-label="Day01" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day01.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day01<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day02" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day02.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day02<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day03" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day03.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day03<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day04" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day04.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day04<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day05" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day05.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day05<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day06" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day06.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day06<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day07 ~ Day08" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day07~day08.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day07 ~ Day08<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day09 ~ Day10" class="vp-link nav-link active vp-sidebar-link vp-sidebar-page active nav-link active vp-sidebar-link vp-sidebar-page active" href="/md/dev-log/day09~day10.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day09 ~ Day10<!----></a><ul class="vp-sidebar-sub-headers"><li class="vp-sidebar-sub-header"><a aria-label="任务" class="vp-link nav-link vp-sidebar-link vp-heading nav-link vp-sidebar-link vp-heading" href="/md/dev-log/day09~day10.html#任务"><!---->任务<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a aria-label="总结" class="vp-link nav-link vp-sidebar-link vp-heading nav-link vp-sidebar-link vp-heading" href="/md/dev-log/day09~day10.html#总结"><!---->总结<!----></a><ul class="vp-sidebar-sub-headers"></ul></li></ul><!--]--></li><li><!--[--><a aria-label="Day011" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day11.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day011<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day012" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day12.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day012<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li></ul></section></li></ul><!--[--><!----><!--]--></aside><!--[--><main id="main-content" class="vp-page"><!--[--><!----><!----><nav class="vp-breadcrumb disable"></nav><div class="vp-page-title"><h1><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day09 ~ Day10</h1><div class="page-info"><span class="page-author-info" aria-label="作者🖊" data-balloon-pos="down"><svg xmlns="http://www.w3.org/2000/svg" class="icon author-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="author icon"><path d="M649.6 633.6c86.4-48 147.2-144 147.2-249.6 0-160-128-288-288-288s-288 128-288 288c0 108.8 57.6 201.6 147.2 249.6-121.6 48-214.4 153.6-240 288-3.2 9.6 0 19.2 6.4 25.6 3.2 9.6 12.8 12.8 22.4 12.8h704c9.6 0 19.2-3.2 25.6-12.8 6.4-6.4 9.6-16 6.4-25.6-25.6-134.4-121.6-240-243.2-288z"></path></svg><span><a class="page-author-item" href="https://mister-hope.com" target="_blank" rel="noopener noreferrer">Mr.Hope</a></span><span property="author" content="Mr.Hope"></span></span><!----><!----><!----><span class="page-reading-time-info" aria-label="阅读时间⌛" data-balloon-pos="down"><svg xmlns="http://www.w3.org/2000/svg" class="icon timer-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="timer icon"><path d="M799.387 122.15c4.402-2.978 7.38-7.897 7.38-13.463v-1.165c0-8.933-7.38-16.312-16.312-16.312H256.33c-8.933 0-16.311 7.38-16.311 16.312v1.165c0 5.825 2.977 10.874 7.637 13.592 4.143 194.44 97.22 354.963 220.201 392.763-122.204 37.542-214.893 196.511-220.2 389.397-4.661 5.049-7.638 11.651-7.638 19.03v5.825h566.49v-5.825c0-7.379-2.849-13.981-7.509-18.9-5.049-193.016-97.867-351.985-220.2-389.527 123.24-37.67 216.446-198.453 220.588-392.892zM531.16 450.445v352.632c117.674 1.553 211.787 40.778 211.787 88.676H304.097c0-48.286 95.149-87.382 213.728-88.676V450.445c-93.077-3.107-167.901-81.297-167.901-177.093 0-8.803 6.99-15.793 15.793-15.793 8.803 0 15.794 6.99 15.794 15.793 0 80.261 63.69 145.635 142.01 145.635s142.011-65.374 142.011-145.635c0-8.803 6.99-15.793 15.794-15.793s15.793 6.99 15.793 15.793c0 95.019-73.789 172.82-165.96 177.093z"></path></svg><span>大约 2 分钟</span><meta property="timeRequired" content="PT2M"></span><span class="page-category-info" aria-label="分类🌈" data-balloon-pos="down"><svg xmlns="http://www.w3.org/2000/svg" class="icon category-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="category icon"><path d="M148.41 106.992h282.176c22.263 0 40.31 18.048 40.31 40.31V429.48c0 22.263-18.047 40.31-40.31 40.31H148.41c-22.263 0-40.311-18.047-40.311-40.31V147.302c0-22.263 18.048-40.31 40.311-40.31zM147.556 553.478H429.73c22.263 0 40.311 18.048 40.311 40.31v282.176c0 22.263-18.048 40.312-40.31 40.312H147.555c-22.263 0-40.311-18.049-40.311-40.312V593.79c0-22.263 18.048-40.311 40.31-40.311zM593.927 106.992h282.176c22.263 0 40.31 18.048 40.31 40.31V429.48c0 22.263-18.047 40.31-40.31 40.31H593.927c-22.263 0-40.311-18.047-40.311-40.31V147.302c0-22.263 18.048-40.31 40.31-40.31zM730.22 920.502H623.926c-40.925 0-74.22-33.388-74.22-74.425V623.992c0-41.038 33.387-74.424 74.425-74.424h222.085c41.038 0 74.424 33.226 74.424 74.067v114.233c0 10.244-8.304 18.548-18.547 18.548s-18.548-8.304-18.548-18.548V623.635c0-20.388-16.746-36.974-37.33-36.974H624.13c-20.585 0-37.331 16.747-37.331 37.33v222.086c0 20.585 16.654 37.331 37.126 37.331H730.22c10.243 0 18.547 8.304 18.547 18.547 0 10.244-8.304 18.547-18.547 18.547z"></path></svg><!--[--><span class="page-category-item category1" role>开发笔记</span><span class="page-category-item category7" role>学习记录</span><!--]--><meta property="articleSection" content="开发笔记,学习记录"></span><!----></div><hr></div><div class="toc-place-holder"><aside id="toc"><!--[--><!----><!--]--><div class="toc-header">此页内容<button type="button" class="print-button" title="打印"><svg xmlns="http://www.w3.org/2000/svg" class="icon print-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="print icon"><path d="M819.2 364.8h-44.8V128c0-17.067-14.933-32-32-32H281.6c-17.067 0-32 14.933-32 32v236.8h-44.8C145.067 364.8 96 413.867 96 473.6v192c0 59.733 49.067 108.8 108.8 108.8h44.8V896c0 17.067 14.933 32 32 32h460.8c17.067 0 32-14.933 32-32V774.4h44.8c59.733 0 108.8-49.067 108.8-108.8v-192c0-59.733-49.067-108.8-108.8-108.8zM313.6 160h396.8v204.8H313.6V160zm396.8 704H313.6V620.8h396.8V864zM864 665.6c0 25.6-19.2 44.8-44.8 44.8h-44.8V588.8c0-17.067-14.933-32-32-32H281.6c-17.067 0-32 14.933-32 32v121.6h-44.8c-25.6 0-44.8-19.2-44.8-44.8v-192c0-25.6 19.2-44.8 44.8-44.8h614.4c25.6 0 44.8 19.2 44.8 44.8v192z"></path></svg></button></div><div class="toc-wrapper"><ul class="toc-list"><!--[--><li class="toc-item"><a class="vp-link toc-link level3 toc-link level3" href="/#任务">任务</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3 toc-link level3" href="/#总结">总结</a></li><!----><!--]--></ul><div class="toc-marker" style="top:-1.7rem;"></div></div><!--[--><!----><!--]--></aside></div><!----><div class="theme-hope-content"><h3 id="任务" tabindex="-1"><a class="header-anchor" href="#任务" aria-hidden="true">#</a> 任务</h3><ul><li>[x] 在应用层编排抽奖过程</li></ul><h3 id="总结" tabindex="-1"><a class="header-anchor" href="#总结" aria-hidden="true">#</a> 总结</h3><p>有了前面的模板模式的基础,这一章节相对来说比较容易,自己实现的时候也没有什么大问题,大体流程就是写接口,编排流程,然后写实现类,然后写 Mapper,至于为什么花了两三天,这就不得不说上一章的分库分表了,没写过 SpringBoot Starter,没写过 MyBatis 插件,对 AOP 没有深刻的理解,纯硬啃下来的,但是记不太劳,所以晚上睡不着觉,总感觉缺点什么东西,就花了两天干了如下几件事:</p><ol><li><p>新建一个空的 SpringBoot 项目,从 <code>SpringApplication.run()</code> 方法开始 debug,一步一步看,在这一个过程中主要学到了如下几点:</p><ul><li>一个 SpringBoot 项目是如何初始化的,在哪里创建的容器等等</li><li>如何加载第三方 Starter 的</li><li><s>在哪里打印的Banner 以及如何设置</s> 这个不是重点,哈哈哈,但是挺好玩的</li><li>还有 <code>ApplicationRunner</code><code>CommandLineRunner</code></li><li>还有异常报告器 <code>exceptionReporters</code></li><li>还有几个关于上下文环境的重要方法 <code>prepareContext()</code><code>refreshContext()</code><code>afterRefresh()</code></li></ul><p>明白了 SpringBoot 应用初始化流程就知道所写的分录分表路由 starter 是在哪个阶段进行数据源设置以及为什么要在 <code>AutoConfig</code> 类下进行 Bean 的注入了</p></li><li><p>看了看 MyBatis 插件相关的文档,大致了解了一个 MyBatis 插件如何编写,看了这个以后看 MyBatis-Plus 源码的时候可能会轻松一点</p></li><li><p>复习了一下 AOP,注解的属性有哪些以及该怎么写都有点忘了</p></li><li><p>在这个 debug 的过程中其实画了一些图,但是因为没有 OSS,所以图片不太好展示,所以使用 vuepress + github pages + github actions 搭建了一个博客,后面有空了会把看源码的过程发上去</p></li></ol><p>虽然很想继续往下学,但是感觉这个项目里面,分库分表这一章节应该是灵魂所在了,虽然还没学后面,但是感觉其他章节更多的是关注业务层面,主要是来解决业务问题的,但是分库分表这一章节感觉能彻彻底底搞明白的话收获应该是很大的,虽然进度慢了,但是通过对源码的阅读也学到了很多东西,比如代码规范,在阅读 SpringBoot 源码的时候,给我最大的感觉就是,其实好的东西是不需要太多注释的,因为他每一步所调用的方法都给你写的很明白,比如 SpringBoot 程序初始化过程,只要英文够好,就跟看<s>小学阅读一样</s>,不知道花的这两天值不值,毕竟还有一个月就找工作了,是不是应该快点把项目做完</p></div><!----><footer class="page-meta"><div class="meta-item edit-link"><a href="https://github.com/fuzhengwei/xfg-resume-blog/edit/main/src/md/dev-log/day09~day10.md" rel="noopener noreferrer" target="_blank" aria-label="在 GitHub 上编辑此页" class="nav-link label"><!--[--><svg xmlns="http://www.w3.org/2000/svg" class="icon edit-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="edit icon"><path d="M430.818 653.65a60.46 60.46 0 0 1-50.96-93.281l71.69-114.012 7.773-10.365L816.038 80.138A60.46 60.46 0 0 1 859.225 62a60.46 60.46 0 0 1 43.186 18.138l43.186 43.186a60.46 60.46 0 0 1 0 86.373L588.879 565.55l-8.637 8.637-117.466 68.234a60.46 60.46 0 0 1-31.958 11.229z"></path><path d="M728.802 962H252.891A190.883 190.883 0 0 1 62.008 771.98V296.934a190.883 190.883 0 0 1 190.883-192.61h267.754a60.46 60.46 0 0 1 0 120.92H252.891a69.962 69.962 0 0 0-69.098 69.099V771.98a69.962 69.962 0 0 0 69.098 69.098h475.911A69.962 69.962 0 0 0 797.9 771.98V503.363a60.46 60.46 0 1 1 120.922 0V771.98A190.883 190.883 0 0 1 728.802 962z"></path></svg><!--]-->在 GitHub 上编辑此页<span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">open in new window</span></span><!----></a></div><div class="meta-item git-info"><!----><!----></div></footer><nav class="vp-page-nav"><a aria-label="Day07 ~ Day08" class="vp-link nav-link prev nav-link prev" href="/md/dev-log/day07~day08.html"><div class="hint"><span class="arrow start"></span>上一页</div><div class="link"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day07 ~ Day08</div></a><a aria-label="Day011" class="vp-link nav-link next nav-link next" href="/md/dev-log/day11.html"><div class="hint">下一页<span class="arrow end"></span></div><div class="link">Day011<span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span></div></a></nav><!----><!----><!--]--></main><!--]--><footer class="vp-footer-wrapper"><div class="vp-footer">我的微信:fustack</div><div class="vp-copyright">Copyright © 2024 Mr.Hope</div></footer></div><!--]--><!----><!--]--></div>
<script type="module" src="/assets/app-89848b6d.js" defer></script>
</body>
</html>
<!doctype html>
<html lang="zh-CN" data-theme="light">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<meta name="generator" content="VuePress 2.0.0-beta.67" />
<meta name="theme" content="VuePress Theme Hope" />
<meta property="og:url" content="https://vuepress-theme-hope-docs-demo.netlify.app/md/dev-log/day11.html"><meta property="og:site_name" content="我的简历"><meta property="og:title" content="Day011"><meta property="og:description" content="任务 [x] 在应用层编排抽奖过程; 总结 今天的内容比较简单,最主要的问题就是表改了,然后花了很多时间去改对应的 PO 以及 SQL,然后今天第一次开发 application 层,感觉就是把 domain 层各个领域进行组装,然后形成一个又一个的流程,在这里面会使用 MQ 把流程进行切片,之后写门面接口应该就是调 application 层里面各个..."><meta property="og:type" content="article"><meta property="og:locale" content="zh-CN"><meta property="article:author" content="Mr.Hope"><script type="application/ld+json">{"@context":"https://schema.org","@type":"Article","headline":"Day011","image":[""],"dateModified":null,"author":[{"@type":"Person","name":"Mr.Hope","url":"https://mister-hope.com"}]}</script><title>Day011 | 我的简历</title><meta name="description" content="任务 [x] 在应用层编排抽奖过程; 总结 今天的内容比较简单,最主要的问题就是表改了,然后花了很多时间去改对应的 PO 以及 SQL,然后今天第一次开发 application 层,感觉就是把 domain 层各个领域进行组装,然后形成一个又一个的流程,在这里面会使用 MQ 把流程进行切片,之后写门面接口应该就是调 application 层里面各个...">
<style>
:root {
--bg-color: #fff;
}
html[data-theme="dark"] {
--bg-color: #1d1e1f;
}
html,
body {
background: var(--bg-color);
}
</style>
<script>
const userMode = localStorage.getItem("vuepress-theme-hope-scheme");
const systemDarkMode =
window.matchMedia &&
window.matchMedia("(prefers-color-scheme: dark)").matches;
if (userMode === "dark" || (userMode !== "light" && systemDarkMode)) {
document.documentElement.setAttribute("data-theme", "dark");
}
</script>
<link rel="preload" href="/assets/style-e1af0ae0.css" as="style"><link rel="stylesheet" href="/assets/style-e1af0ae0.css">
<link rel="modulepreload" href="/assets/app-89848b6d.js"><link rel="modulepreload" href="/assets/day11.html-13381d55.js"><link rel="modulepreload" href="/assets/plugin-vue_export-helper-c27b6911.js"><link rel="modulepreload" href="/assets/day11.html-a02521a7.js"><link rel="prefetch" href="/assets/index.html-3ddb8fc8.js" as="script"><link rel="prefetch" href="/assets/slides.html-e24915cf.js" as="script"><link rel="prefetch" href="/assets/resume.html-63219902.js" as="script"><link rel="prefetch" href="/assets/index.html-ee414c74.js" as="script"><link rel="prefetch" href="/assets/day01.html-96303a92.js" as="script"><link rel="prefetch" href="/assets/day02.html-bc6452cb.js" as="script"><link rel="prefetch" href="/assets/day03.html-faf19961.js" as="script"><link rel="prefetch" href="/assets/day04.html-f1431c14.js" as="script"><link rel="prefetch" href="/assets/day05.html-e1b66f43.js" as="script"><link rel="prefetch" href="/assets/day06.html-694a0d7d.js" as="script"><link rel="prefetch" href="/assets/day07~day08.html-623b7865.js" as="script"><link rel="prefetch" href="/assets/day09~day10.html-f64b96c2.js" as="script"><link rel="prefetch" href="/assets/day12.html-59d9b776.js" as="script"><link rel="prefetch" href="/assets/404.html-a12454c5.js" as="script"><link rel="prefetch" href="/assets/index.html-38735195.js" as="script"><link rel="prefetch" href="/assets/index.html-72fa7116.js" as="script"><link rel="prefetch" href="/assets/slides.html-73aa899b.js" as="script"><link rel="prefetch" href="/assets/resume.html-0d5e8b6f.js" as="script"><link rel="prefetch" href="/assets/index.html-604f9d5c.js" as="script"><link rel="prefetch" href="/assets/day01.html-f34d072c.js" as="script"><link rel="prefetch" href="/assets/day02.html-faf555eb.js" as="script"><link rel="prefetch" href="/assets/day03.html-f3141bb2.js" as="script"><link rel="prefetch" href="/assets/day04.html-61a7012e.js" as="script"><link rel="prefetch" href="/assets/day05.html-4698622b.js" as="script"><link rel="prefetch" href="/assets/day06.html-a4c2781d.js" as="script"><link rel="prefetch" href="/assets/day07~day08.html-4e5d7c48.js" as="script"><link rel="prefetch" href="/assets/day09~day10.html-ee1cb17c.js" as="script"><link rel="prefetch" href="/assets/day12.html-4bed2fb6.js" as="script"><link rel="prefetch" href="/assets/404.html-4d74dcf3.js" as="script"><link rel="prefetch" href="/assets/index.html-f3051275.js" as="script"><link rel="prefetch" href="/assets/photoswipe.esm-060dc2da.js" as="script">
</head>
<body>
<div id="app"><!--[--><!--[--><!--[--><span tabindex="-1"></span><a href="#main-content" class="vp-skip-link sr-only">跳至主要內容</a><!--]--><div class="theme-container has-toc"><!--[--><header id="navbar" class="vp-navbar"><div class="vp-navbar-start"><button type="button" class="vp-toggle-sidebar-button" title="Toggle Sidebar"><span class="icon"></span></button><!--[--><!----><!--]--><!--[--><a class="vp-link vp-brand vp-brand" href="/"><img class="vp-nav-logo" src="/logo.svg" alt="我的简历"><!----><span class="vp-site-name hide-in-pad">我的简历</span></a><!--]--><!--[--><!----><!--]--></div><div class="vp-navbar-center"><!--[--><!----><!--]--><!--[--><nav class="vp-nav-links"><div class="nav-item hide-in-mobile"><a aria-label="主页" class="vp-link nav-link nav-link" href="/"><span class="font-icon icon fa-fw fa-sm fas fa-home" style=""></span>主页<!----></a></div><div class="nav-item hide-in-mobile"><a aria-label="个人简历" class="vp-link nav-link nav-link" href="/md/resume.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>个人简历<!----></a></div><div class="nav-item hide-in-mobile"><a aria-label="开发日志" class="vp-link nav-link nav-link" href="/md/dev-log/day01.html"><span class="font-icon icon fa-fw fa-sm fas fa-book" style=""></span>开发日志<!----></a></div></nav><!--]--><!--[--><!----><!--]--></div><div class="vp-navbar-end"><!--[--><!----><!--]--><!--[--><!----><div class="nav-item vp-repo"><a class="vp-repo-link" href="https://github.com/fuzhengwei/xfg-resume-blog" target="_blank" rel="noopener noreferrer" aria-label="GitHub"><svg xmlns="http://www.w3.org/2000/svg" class="icon github-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="github icon" style="width:1.25rem;height:1.25rem;vertical-align:middle;"><path d="M511.957 21.333C241.024 21.333 21.333 240.981 21.333 512c0 216.832 140.544 400.725 335.574 465.664 24.49 4.395 32.256-10.07 32.256-23.083 0-11.69.256-44.245 0-85.205-136.448 29.61-164.736-64.64-164.736-64.64-22.315-56.704-54.4-71.765-54.4-71.765-44.587-30.464 3.285-29.824 3.285-29.824 49.195 3.413 75.179 50.517 75.179 50.517 43.776 75.008 114.816 53.333 142.762 40.79 4.523-31.66 17.152-53.377 31.19-65.537-108.971-12.458-223.488-54.485-223.488-242.602 0-53.547 19.114-97.323 50.517-131.67-5.035-12.33-21.93-62.293 4.779-129.834 0 0 41.258-13.184 134.912 50.346a469.803 469.803 0 0 1 122.88-16.554c41.642.213 83.626 5.632 122.88 16.554 93.653-63.488 134.784-50.346 134.784-50.346 26.752 67.541 9.898 117.504 4.864 129.834 31.402 34.347 50.474 78.123 50.474 131.67 0 188.586-114.73 230.016-224.042 242.09 17.578 15.232 33.578 44.672 33.578 90.454v135.85c0 13.142 7.936 27.606 32.854 22.87C862.25 912.597 1002.667 728.747 1002.667 512c0-271.019-219.648-490.667-490.71-490.667z"></path></svg></a></div><div class="nav-item hide-in-mobile"><button type="button" id="appearance-switch"><svg xmlns="http://www.w3.org/2000/svg" class="icon auto-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="auto icon" style="display:block;"><path d="M512 992C246.92 992 32 777.08 32 512S246.92 32 512 32s480 214.92 480 480-214.92 480-480 480zm0-840c-198.78 0-360 161.22-360 360 0 198.84 161.22 360 360 360s360-161.16 360-360c0-198.78-161.22-360-360-360zm0 660V212c165.72 0 300 134.34 300 300 0 165.72-134.28 300-300 300z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" class="icon dark-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="dark icon" style="display:none;"><path d="M524.8 938.667h-4.267a439.893 439.893 0 0 1-313.173-134.4 446.293 446.293 0 0 1-11.093-597.334A432.213 432.213 0 0 1 366.933 90.027a42.667 42.667 0 0 1 45.227 9.386 42.667 42.667 0 0 1 10.24 42.667 358.4 358.4 0 0 0 82.773 375.893 361.387 361.387 0 0 0 376.747 82.774 42.667 42.667 0 0 1 54.187 55.04 433.493 433.493 0 0 1-99.84 154.88 438.613 438.613 0 0 1-311.467 128z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" class="icon light-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="light icon" style="display:none;"><path d="M952 552h-80a40 40 0 0 1 0-80h80a40 40 0 0 1 0 80zM801.88 280.08a41 41 0 0 1-57.96-57.96l57.96-58a41.04 41.04 0 0 1 58 58l-58 57.96zM512 752a240 240 0 1 1 0-480 240 240 0 0 1 0 480zm0-560a40 40 0 0 1-40-40V72a40 40 0 0 1 80 0v80a40 40 0 0 1-40 40zm-289.88 88.08-58-57.96a41.04 41.04 0 0 1 58-58l57.96 58a41 41 0 0 1-57.96 57.96zM192 512a40 40 0 0 1-40 40H72a40 40 0 0 1 0-80h80a40 40 0 0 1 40 40zm30.12 231.92a41 41 0 0 1 57.96 57.96l-57.96 58a41.04 41.04 0 0 1-58-58l58-57.96zM512 832a40 40 0 0 1 40 40v80a40 40 0 0 1-80 0v-80a40 40 0 0 1 40-40zm289.88-88.08 58 57.96a41.04 41.04 0 0 1-58 58l-57.96-58a41 41 0 0 1 57.96-57.96z"></path></svg></button></div><!----><!--]--><!--[--><!----><!--]--><button type="button" class="vp-toggle-navbar-button" aria-label="Toggle Navbar" aria-expanded="false" aria-controls="nav-screen"><span><span class="vp-top"></span><span class="vp-middle"></span><span class="vp-bottom"></span></span></button></div></header><!----><!--]--><!----><div class="toggle-sidebar-wrapper"><span class="arrow start"></span></div><aside id="sidebar" class="vp-sidebar"><!--[--><!----><!--]--><ul class="vp-sidebar-links"><li><!--[--><a aria-label="主页" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/"><span class="font-icon icon fa-fw fa-sm fas fa-home" style=""></span>主页<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><section class="vp-sidebar-group"><p class="vp-sidebar-heading active"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span><span class="vp-sidebar-title">Lottery 项目开发日志</span><!----></p><ul class="vp-sidebar-links"><li><!--[--><a aria-label="Day01" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day01.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day01<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day02" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day02.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day02<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day03" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day03.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day03<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day04" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day04.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day04<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day05" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day05.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day05<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day06" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day06.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day06<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day07 ~ Day08" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day07~day08.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day07 ~ Day08<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day09 ~ Day10" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day09~day10.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day09 ~ Day10<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day011" class="vp-link nav-link active vp-sidebar-link vp-sidebar-page active nav-link active vp-sidebar-link vp-sidebar-page active" href="/md/dev-log/day11.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day011<!----></a><ul class="vp-sidebar-sub-headers"><li class="vp-sidebar-sub-header"><a aria-label="任务" class="vp-link nav-link vp-sidebar-link vp-heading nav-link vp-sidebar-link vp-heading" href="/md/dev-log/day11.html#任务"><!---->任务<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a aria-label="总结" class="vp-link nav-link vp-sidebar-link vp-heading nav-link vp-sidebar-link vp-heading" href="/md/dev-log/day11.html#总结"><!---->总结<!----></a><ul class="vp-sidebar-sub-headers"></ul></li></ul><!--]--></li><li><!--[--><a aria-label="Day012" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day12.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day012<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li></ul></section></li></ul><!--[--><!----><!--]--></aside><!--[--><main id="main-content" class="vp-page"><!--[--><!----><!----><nav class="vp-breadcrumb disable"></nav><div class="vp-page-title"><h1><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day011</h1><div class="page-info"><span class="page-author-info" aria-label="作者🖊" data-balloon-pos="down"><svg xmlns="http://www.w3.org/2000/svg" class="icon author-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="author icon"><path d="M649.6 633.6c86.4-48 147.2-144 147.2-249.6 0-160-128-288-288-288s-288 128-288 288c0 108.8 57.6 201.6 147.2 249.6-121.6 48-214.4 153.6-240 288-3.2 9.6 0 19.2 6.4 25.6 3.2 9.6 12.8 12.8 22.4 12.8h704c9.6 0 19.2-3.2 25.6-12.8 6.4-6.4 9.6-16 6.4-25.6-25.6-134.4-121.6-240-243.2-288z"></path></svg><span><a class="page-author-item" href="https://mister-hope.com" target="_blank" rel="noopener noreferrer">Mr.Hope</a></span><span property="author" content="Mr.Hope"></span></span><!----><!----><!----><span class="page-reading-time-info" aria-label="阅读时间⌛" data-balloon-pos="down"><svg xmlns="http://www.w3.org/2000/svg" class="icon timer-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="timer icon"><path d="M799.387 122.15c4.402-2.978 7.38-7.897 7.38-13.463v-1.165c0-8.933-7.38-16.312-16.312-16.312H256.33c-8.933 0-16.311 7.38-16.311 16.312v1.165c0 5.825 2.977 10.874 7.637 13.592 4.143 194.44 97.22 354.963 220.201 392.763-122.204 37.542-214.893 196.511-220.2 389.397-4.661 5.049-7.638 11.651-7.638 19.03v5.825h566.49v-5.825c0-7.379-2.849-13.981-7.509-18.9-5.049-193.016-97.867-351.985-220.2-389.527 123.24-37.67 216.446-198.453 220.588-392.892zM531.16 450.445v352.632c117.674 1.553 211.787 40.778 211.787 88.676H304.097c0-48.286 95.149-87.382 213.728-88.676V450.445c-93.077-3.107-167.901-81.297-167.901-177.093 0-8.803 6.99-15.793 15.793-15.793 8.803 0 15.794 6.99 15.794 15.793 0 80.261 63.69 145.635 142.01 145.635s142.011-65.374 142.011-145.635c0-8.803 6.99-15.793 15.794-15.793s15.793 6.99 15.793 15.793c0 95.019-73.789 172.82-165.96 177.093z"></path></svg><span>大约 1 分钟</span><meta property="timeRequired" content="PT1M"></span><span class="page-category-info" aria-label="分类🌈" data-balloon-pos="down"><svg xmlns="http://www.w3.org/2000/svg" class="icon category-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="category icon"><path d="M148.41 106.992h282.176c22.263 0 40.31 18.048 40.31 40.31V429.48c0 22.263-18.047 40.31-40.31 40.31H148.41c-22.263 0-40.311-18.047-40.311-40.31V147.302c0-22.263 18.048-40.31 40.311-40.31zM147.556 553.478H429.73c22.263 0 40.311 18.048 40.311 40.31v282.176c0 22.263-18.048 40.312-40.31 40.312H147.555c-22.263 0-40.311-18.049-40.311-40.312V593.79c0-22.263 18.048-40.311 40.31-40.311zM593.927 106.992h282.176c22.263 0 40.31 18.048 40.31 40.31V429.48c0 22.263-18.047 40.31-40.31 40.31H593.927c-22.263 0-40.311-18.047-40.311-40.31V147.302c0-22.263 18.048-40.31 40.31-40.31zM730.22 920.502H623.926c-40.925 0-74.22-33.388-74.22-74.425V623.992c0-41.038 33.387-74.424 74.425-74.424h222.085c41.038 0 74.424 33.226 74.424 74.067v114.233c0 10.244-8.304 18.548-18.547 18.548s-18.548-8.304-18.548-18.548V623.635c0-20.388-16.746-36.974-37.33-36.974H624.13c-20.585 0-37.331 16.747-37.331 37.33v222.086c0 20.585 16.654 37.331 37.126 37.331H730.22c10.243 0 18.547 8.304 18.547 18.547 0 10.244-8.304 18.547-18.547 18.547z"></path></svg><!--[--><span class="page-category-item category1" role>开发笔记</span><span class="page-category-item category7" role>学习记录</span><!--]--><meta property="articleSection" content="开发笔记,学习记录"></span><!----></div><hr></div><div class="toc-place-holder"><aside id="toc"><!--[--><!----><!--]--><div class="toc-header">此页内容<button type="button" class="print-button" title="打印"><svg xmlns="http://www.w3.org/2000/svg" class="icon print-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="print icon"><path d="M819.2 364.8h-44.8V128c0-17.067-14.933-32-32-32H281.6c-17.067 0-32 14.933-32 32v236.8h-44.8C145.067 364.8 96 413.867 96 473.6v192c0 59.733 49.067 108.8 108.8 108.8h44.8V896c0 17.067 14.933 32 32 32h460.8c17.067 0 32-14.933 32-32V774.4h44.8c59.733 0 108.8-49.067 108.8-108.8v-192c0-59.733-49.067-108.8-108.8-108.8zM313.6 160h396.8v204.8H313.6V160zm396.8 704H313.6V620.8h396.8V864zM864 665.6c0 25.6-19.2 44.8-44.8 44.8h-44.8V588.8c0-17.067-14.933-32-32-32H281.6c-17.067 0-32 14.933-32 32v121.6h-44.8c-25.6 0-44.8-19.2-44.8-44.8v-192c0-25.6 19.2-44.8 44.8-44.8h614.4c25.6 0 44.8 19.2 44.8 44.8v192z"></path></svg></button></div><div class="toc-wrapper"><ul class="toc-list"><!--[--><li class="toc-item"><a class="vp-link toc-link level3 toc-link level3" href="/#任务">任务</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3 toc-link level3" href="/#总结">总结</a></li><!----><!--]--></ul><div class="toc-marker" style="top:-1.7rem;"></div></div><!--[--><!----><!--]--></aside></div><!----><div class="theme-hope-content"><h3 id="任务" tabindex="-1"><a class="header-anchor" href="#任务" aria-hidden="true">#</a> 任务</h3><ul><li>[x] 在应用层编排抽奖过程</li></ul><h3 id="总结" tabindex="-1"><a class="header-anchor" href="#总结" aria-hidden="true">#</a> 总结</h3><p>今天的内容比较简单,最主要的问题就是表改了,然后花了很多时间去改对应的 PO 以及 SQL,然后今天第一次开发 application 层,感觉就是把 domain 层各个领域进行组装,然后形成一个又一个的流程,在这里面会使用 MQ 把流程进行切片,之后写门面接口应该就是调 application 层里面各个流程了,这样对于 Controller 层感觉挺好的,只需要简单的封装一下前端传进来的参数,然后调用 application 层执行各个流程就可以了</p><p>感觉今天最大的收获就在于学到了在开发的过程中要把整个流程切分一下,分成一块一块的,然后用 MQ 进行后续的操作,用户不需要感知到这一切,他只需要点进去,然后执行一个小的片段,然后剩下的操作可以使用 MQ 来慢慢操作,而不是之前那样直接单线程一个流程写完,又臭又长,返回得还慢,用户体验很不好,学到了流程切片,今天不亏,哈哈哈哈,这个东西还是很有用的</p></div><!----><footer class="page-meta"><div class="meta-item edit-link"><a href="https://github.com/fuzhengwei/xfg-resume-blog/edit/main/src/md/dev-log/day11.md" rel="noopener noreferrer" target="_blank" aria-label="在 GitHub 上编辑此页" class="nav-link label"><!--[--><svg xmlns="http://www.w3.org/2000/svg" class="icon edit-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="edit icon"><path d="M430.818 653.65a60.46 60.46 0 0 1-50.96-93.281l71.69-114.012 7.773-10.365L816.038 80.138A60.46 60.46 0 0 1 859.225 62a60.46 60.46 0 0 1 43.186 18.138l43.186 43.186a60.46 60.46 0 0 1 0 86.373L588.879 565.55l-8.637 8.637-117.466 68.234a60.46 60.46 0 0 1-31.958 11.229z"></path><path d="M728.802 962H252.891A190.883 190.883 0 0 1 62.008 771.98V296.934a190.883 190.883 0 0 1 190.883-192.61h267.754a60.46 60.46 0 0 1 0 120.92H252.891a69.962 69.962 0 0 0-69.098 69.099V771.98a69.962 69.962 0 0 0 69.098 69.098h475.911A69.962 69.962 0 0 0 797.9 771.98V503.363a60.46 60.46 0 1 1 120.922 0V771.98A190.883 190.883 0 0 1 728.802 962z"></path></svg><!--]-->在 GitHub 上编辑此页<span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">open in new window</span></span><!----></a></div><div class="meta-item git-info"><!----><!----></div></footer><nav class="vp-page-nav"><a aria-label="Day09 ~ Day10" class="vp-link nav-link prev nav-link prev" href="/md/dev-log/day09~day10.html"><div class="hint"><span class="arrow start"></span>上一页</div><div class="link"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day09 ~ Day10</div></a><a aria-label="Day012" class="vp-link nav-link next nav-link next" href="/md/dev-log/day12.html"><div class="hint">下一页<span class="arrow end"></span></div><div class="link">Day012<span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span></div></a></nav><!----><!----><!--]--></main><!--]--><footer class="vp-footer-wrapper"><div class="vp-footer">我的微信:fustack</div><div class="vp-copyright">Copyright © 2024 Mr.Hope</div></footer></div><!--]--><!----><!--]--></div>
<script type="module" src="/assets/app-89848b6d.js" defer></script>
</body>
</html>
<!doctype html>
<html lang="zh-CN" data-theme="light">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<meta name="generator" content="VuePress 2.0.0-beta.67" />
<meta name="theme" content="VuePress Theme Hope" />
<meta property="og:url" content="https://vuepress-theme-hope-docs-demo.netlify.app/md/dev-log/day12.html"><meta property="og:site_name" content="我的简历"><meta property="og:title" content="Day012"><meta property="og:description" content="任务 [x] 规则引擎量化人群参与活动; 总结 首先先去了解了一下组合模式和决策树,然后看了看数据库,其实就是把一个类似于二叉树的结构存到了数据库里,分别对应了三个东西,一个表用来保存决策树的树根信息,然后一个表用来保存树上的所有节点的信息,然后一个表用来存决策树的连接信息,我们可以通过树根的 ID 拿到所有相关的连线信息以及所有相关的节点信息,明白了..."><meta property="og:type" content="article"><meta property="og:locale" content="zh-CN"><meta property="article:author" content="Mr.Hope"><script type="application/ld+json">{"@context":"https://schema.org","@type":"Article","headline":"Day012","image":[""],"dateModified":null,"author":[{"@type":"Person","name":"Mr.Hope","url":"https://mister-hope.com"}]}</script><title>Day012 | 我的简历</title><meta name="description" content="任务 [x] 规则引擎量化人群参与活动; 总结 首先先去了解了一下组合模式和决策树,然后看了看数据库,其实就是把一个类似于二叉树的结构存到了数据库里,分别对应了三个东西,一个表用来保存决策树的树根信息,然后一个表用来保存树上的所有节点的信息,然后一个表用来存决策树的连接信息,我们可以通过树根的 ID 拿到所有相关的连线信息以及所有相关的节点信息,明白了...">
<style>
:root {
--bg-color: #fff;
}
html[data-theme="dark"] {
--bg-color: #1d1e1f;
}
html,
body {
background: var(--bg-color);
}
</style>
<script>
const userMode = localStorage.getItem("vuepress-theme-hope-scheme");
const systemDarkMode =
window.matchMedia &&
window.matchMedia("(prefers-color-scheme: dark)").matches;
if (userMode === "dark" || (userMode !== "light" && systemDarkMode)) {
document.documentElement.setAttribute("data-theme", "dark");
}
</script>
<link rel="preload" href="/assets/style-e1af0ae0.css" as="style"><link rel="stylesheet" href="/assets/style-e1af0ae0.css">
<link rel="modulepreload" href="/assets/app-89848b6d.js"><link rel="modulepreload" href="/assets/day12.html-59d9b776.js"><link rel="modulepreload" href="/assets/day12.html-4bed2fb6.js"><link rel="modulepreload" href="/assets/plugin-vue_export-helper-c27b6911.js"><link rel="prefetch" href="/assets/index.html-3ddb8fc8.js" as="script"><link rel="prefetch" href="/assets/slides.html-e24915cf.js" as="script"><link rel="prefetch" href="/assets/resume.html-63219902.js" as="script"><link rel="prefetch" href="/assets/index.html-ee414c74.js" as="script"><link rel="prefetch" href="/assets/day01.html-96303a92.js" as="script"><link rel="prefetch" href="/assets/day02.html-bc6452cb.js" as="script"><link rel="prefetch" href="/assets/day03.html-faf19961.js" as="script"><link rel="prefetch" href="/assets/day04.html-f1431c14.js" as="script"><link rel="prefetch" href="/assets/day05.html-e1b66f43.js" as="script"><link rel="prefetch" href="/assets/day06.html-694a0d7d.js" as="script"><link rel="prefetch" href="/assets/day07~day08.html-623b7865.js" as="script"><link rel="prefetch" href="/assets/day09~day10.html-f64b96c2.js" as="script"><link rel="prefetch" href="/assets/day11.html-a02521a7.js" as="script"><link rel="prefetch" href="/assets/404.html-a12454c5.js" as="script"><link rel="prefetch" href="/assets/index.html-38735195.js" as="script"><link rel="prefetch" href="/assets/index.html-72fa7116.js" as="script"><link rel="prefetch" href="/assets/slides.html-73aa899b.js" as="script"><link rel="prefetch" href="/assets/resume.html-0d5e8b6f.js" as="script"><link rel="prefetch" href="/assets/index.html-604f9d5c.js" as="script"><link rel="prefetch" href="/assets/day01.html-f34d072c.js" as="script"><link rel="prefetch" href="/assets/day02.html-faf555eb.js" as="script"><link rel="prefetch" href="/assets/day03.html-f3141bb2.js" as="script"><link rel="prefetch" href="/assets/day04.html-61a7012e.js" as="script"><link rel="prefetch" href="/assets/day05.html-4698622b.js" as="script"><link rel="prefetch" href="/assets/day06.html-a4c2781d.js" as="script"><link rel="prefetch" href="/assets/day07~day08.html-4e5d7c48.js" as="script"><link rel="prefetch" href="/assets/day09~day10.html-ee1cb17c.js" as="script"><link rel="prefetch" href="/assets/day11.html-13381d55.js" as="script"><link rel="prefetch" href="/assets/404.html-4d74dcf3.js" as="script"><link rel="prefetch" href="/assets/index.html-f3051275.js" as="script"><link rel="prefetch" href="/assets/photoswipe.esm-060dc2da.js" as="script">
</head>
<body>
<div id="app"><!--[--><!--[--><!--[--><span tabindex="-1"></span><a href="#main-content" class="vp-skip-link sr-only">跳至主要內容</a><!--]--><div class="theme-container has-toc"><!--[--><header id="navbar" class="vp-navbar"><div class="vp-navbar-start"><button type="button" class="vp-toggle-sidebar-button" title="Toggle Sidebar"><span class="icon"></span></button><!--[--><!----><!--]--><!--[--><a class="vp-link vp-brand vp-brand" href="/"><img class="vp-nav-logo" src="/logo.svg" alt="我的简历"><!----><span class="vp-site-name hide-in-pad">我的简历</span></a><!--]--><!--[--><!----><!--]--></div><div class="vp-navbar-center"><!--[--><!----><!--]--><!--[--><nav class="vp-nav-links"><div class="nav-item hide-in-mobile"><a aria-label="主页" class="vp-link nav-link nav-link" href="/"><span class="font-icon icon fa-fw fa-sm fas fa-home" style=""></span>主页<!----></a></div><div class="nav-item hide-in-mobile"><a aria-label="个人简历" class="vp-link nav-link nav-link" href="/md/resume.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>个人简历<!----></a></div><div class="nav-item hide-in-mobile"><a aria-label="开发日志" class="vp-link nav-link nav-link" href="/md/dev-log/day01.html"><span class="font-icon icon fa-fw fa-sm fas fa-book" style=""></span>开发日志<!----></a></div></nav><!--]--><!--[--><!----><!--]--></div><div class="vp-navbar-end"><!--[--><!----><!--]--><!--[--><!----><div class="nav-item vp-repo"><a class="vp-repo-link" href="https://github.com/fuzhengwei/xfg-resume-blog" target="_blank" rel="noopener noreferrer" aria-label="GitHub"><svg xmlns="http://www.w3.org/2000/svg" class="icon github-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="github icon" style="width:1.25rem;height:1.25rem;vertical-align:middle;"><path d="M511.957 21.333C241.024 21.333 21.333 240.981 21.333 512c0 216.832 140.544 400.725 335.574 465.664 24.49 4.395 32.256-10.07 32.256-23.083 0-11.69.256-44.245 0-85.205-136.448 29.61-164.736-64.64-164.736-64.64-22.315-56.704-54.4-71.765-54.4-71.765-44.587-30.464 3.285-29.824 3.285-29.824 49.195 3.413 75.179 50.517 75.179 50.517 43.776 75.008 114.816 53.333 142.762 40.79 4.523-31.66 17.152-53.377 31.19-65.537-108.971-12.458-223.488-54.485-223.488-242.602 0-53.547 19.114-97.323 50.517-131.67-5.035-12.33-21.93-62.293 4.779-129.834 0 0 41.258-13.184 134.912 50.346a469.803 469.803 0 0 1 122.88-16.554c41.642.213 83.626 5.632 122.88 16.554 93.653-63.488 134.784-50.346 134.784-50.346 26.752 67.541 9.898 117.504 4.864 129.834 31.402 34.347 50.474 78.123 50.474 131.67 0 188.586-114.73 230.016-224.042 242.09 17.578 15.232 33.578 44.672 33.578 90.454v135.85c0 13.142 7.936 27.606 32.854 22.87C862.25 912.597 1002.667 728.747 1002.667 512c0-271.019-219.648-490.667-490.71-490.667z"></path></svg></a></div><div class="nav-item hide-in-mobile"><button type="button" id="appearance-switch"><svg xmlns="http://www.w3.org/2000/svg" class="icon auto-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="auto icon" style="display:block;"><path d="M512 992C246.92 992 32 777.08 32 512S246.92 32 512 32s480 214.92 480 480-214.92 480-480 480zm0-840c-198.78 0-360 161.22-360 360 0 198.84 161.22 360 360 360s360-161.16 360-360c0-198.78-161.22-360-360-360zm0 660V212c165.72 0 300 134.34 300 300 0 165.72-134.28 300-300 300z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" class="icon dark-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="dark icon" style="display:none;"><path d="M524.8 938.667h-4.267a439.893 439.893 0 0 1-313.173-134.4 446.293 446.293 0 0 1-11.093-597.334A432.213 432.213 0 0 1 366.933 90.027a42.667 42.667 0 0 1 45.227 9.386 42.667 42.667 0 0 1 10.24 42.667 358.4 358.4 0 0 0 82.773 375.893 361.387 361.387 0 0 0 376.747 82.774 42.667 42.667 0 0 1 54.187 55.04 433.493 433.493 0 0 1-99.84 154.88 438.613 438.613 0 0 1-311.467 128z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" class="icon light-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="light icon" style="display:none;"><path d="M952 552h-80a40 40 0 0 1 0-80h80a40 40 0 0 1 0 80zM801.88 280.08a41 41 0 0 1-57.96-57.96l57.96-58a41.04 41.04 0 0 1 58 58l-58 57.96zM512 752a240 240 0 1 1 0-480 240 240 0 0 1 0 480zm0-560a40 40 0 0 1-40-40V72a40 40 0 0 1 80 0v80a40 40 0 0 1-40 40zm-289.88 88.08-58-57.96a41.04 41.04 0 0 1 58-58l57.96 58a41 41 0 0 1-57.96 57.96zM192 512a40 40 0 0 1-40 40H72a40 40 0 0 1 0-80h80a40 40 0 0 1 40 40zm30.12 231.92a41 41 0 0 1 57.96 57.96l-57.96 58a41.04 41.04 0 0 1-58-58l58-57.96zM512 832a40 40 0 0 1 40 40v80a40 40 0 0 1-80 0v-80a40 40 0 0 1 40-40zm289.88-88.08 58 57.96a41.04 41.04 0 0 1-58 58l-57.96-58a41 41 0 0 1 57.96-57.96z"></path></svg></button></div><!----><!--]--><!--[--><!----><!--]--><button type="button" class="vp-toggle-navbar-button" aria-label="Toggle Navbar" aria-expanded="false" aria-controls="nav-screen"><span><span class="vp-top"></span><span class="vp-middle"></span><span class="vp-bottom"></span></span></button></div></header><!----><!--]--><!----><div class="toggle-sidebar-wrapper"><span class="arrow start"></span></div><aside id="sidebar" class="vp-sidebar"><!--[--><!----><!--]--><ul class="vp-sidebar-links"><li><!--[--><a aria-label="主页" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/"><span class="font-icon icon fa-fw fa-sm fas fa-home" style=""></span>主页<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><section class="vp-sidebar-group"><p class="vp-sidebar-heading active"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span><span class="vp-sidebar-title">Lottery 项目开发日志</span><!----></p><ul class="vp-sidebar-links"><li><!--[--><a aria-label="Day01" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day01.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day01<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day02" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day02.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day02<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day03" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day03.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day03<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day04" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day04.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day04<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day05" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day05.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day05<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day06" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day06.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day06<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day07 ~ Day08" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day07~day08.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day07 ~ Day08<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day09 ~ Day10" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day09~day10.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day09 ~ Day10<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day011" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day11.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day011<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day012" class="vp-link nav-link active vp-sidebar-link vp-sidebar-page active nav-link active vp-sidebar-link vp-sidebar-page active" href="/md/dev-log/day12.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day012<!----></a><ul class="vp-sidebar-sub-headers"><li class="vp-sidebar-sub-header"><a aria-label="任务" class="vp-link nav-link vp-sidebar-link vp-heading nav-link vp-sidebar-link vp-heading" href="/md/dev-log/day12.html#任务"><!---->任务<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a aria-label="总结" class="vp-link nav-link vp-sidebar-link vp-heading nav-link vp-sidebar-link vp-heading" href="/md/dev-log/day12.html#总结"><!---->总结<!----></a><ul class="vp-sidebar-sub-headers"></ul></li></ul><!--]--></li></ul></section></li></ul><!--[--><!----><!--]--></aside><!--[--><main id="main-content" class="vp-page"><!--[--><!----><!----><nav class="vp-breadcrumb disable"></nav><div class="vp-page-title"><h1><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day012</h1><div class="page-info"><span class="page-author-info" aria-label="作者🖊" data-balloon-pos="down"><svg xmlns="http://www.w3.org/2000/svg" class="icon author-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="author icon"><path d="M649.6 633.6c86.4-48 147.2-144 147.2-249.6 0-160-128-288-288-288s-288 128-288 288c0 108.8 57.6 201.6 147.2 249.6-121.6 48-214.4 153.6-240 288-3.2 9.6 0 19.2 6.4 25.6 3.2 9.6 12.8 12.8 22.4 12.8h704c9.6 0 19.2-3.2 25.6-12.8 6.4-6.4 9.6-16 6.4-25.6-25.6-134.4-121.6-240-243.2-288z"></path></svg><span><a class="page-author-item" href="https://mister-hope.com" target="_blank" rel="noopener noreferrer">Mr.Hope</a></span><span property="author" content="Mr.Hope"></span></span><!----><!----><!----><span class="page-reading-time-info" aria-label="阅读时间⌛" data-balloon-pos="down"><svg xmlns="http://www.w3.org/2000/svg" class="icon timer-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="timer icon"><path d="M799.387 122.15c4.402-2.978 7.38-7.897 7.38-13.463v-1.165c0-8.933-7.38-16.312-16.312-16.312H256.33c-8.933 0-16.311 7.38-16.311 16.312v1.165c0 5.825 2.977 10.874 7.637 13.592 4.143 194.44 97.22 354.963 220.201 392.763-122.204 37.542-214.893 196.511-220.2 389.397-4.661 5.049-7.638 11.651-7.638 19.03v5.825h566.49v-5.825c0-7.379-2.849-13.981-7.509-18.9-5.049-193.016-97.867-351.985-220.2-389.527 123.24-37.67 216.446-198.453 220.588-392.892zM531.16 450.445v352.632c117.674 1.553 211.787 40.778 211.787 88.676H304.097c0-48.286 95.149-87.382 213.728-88.676V450.445c-93.077-3.107-167.901-81.297-167.901-177.093 0-8.803 6.99-15.793 15.793-15.793 8.803 0 15.794 6.99 15.794 15.793 0 80.261 63.69 145.635 142.01 145.635s142.011-65.374 142.011-145.635c0-8.803 6.99-15.793 15.794-15.793s15.793 6.99 15.793 15.793c0 95.019-73.789 172.82-165.96 177.093z"></path></svg><span>大约 3 分钟</span><meta property="timeRequired" content="PT3M"></span><span class="page-category-info" aria-label="分类🌈" data-balloon-pos="down"><svg xmlns="http://www.w3.org/2000/svg" class="icon category-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="category icon"><path d="M148.41 106.992h282.176c22.263 0 40.31 18.048 40.31 40.31V429.48c0 22.263-18.047 40.31-40.31 40.31H148.41c-22.263 0-40.311-18.047-40.311-40.31V147.302c0-22.263 18.048-40.31 40.311-40.31zM147.556 553.478H429.73c22.263 0 40.311 18.048 40.311 40.31v282.176c0 22.263-18.048 40.312-40.31 40.312H147.555c-22.263 0-40.311-18.049-40.311-40.312V593.79c0-22.263 18.048-40.311 40.31-40.311zM593.927 106.992h282.176c22.263 0 40.31 18.048 40.31 40.31V429.48c0 22.263-18.047 40.31-40.31 40.31H593.927c-22.263 0-40.311-18.047-40.311-40.31V147.302c0-22.263 18.048-40.31 40.31-40.31zM730.22 920.502H623.926c-40.925 0-74.22-33.388-74.22-74.425V623.992c0-41.038 33.387-74.424 74.425-74.424h222.085c41.038 0 74.424 33.226 74.424 74.067v114.233c0 10.244-8.304 18.548-18.547 18.548s-18.548-8.304-18.548-18.548V623.635c0-20.388-16.746-36.974-37.33-36.974H624.13c-20.585 0-37.331 16.747-37.331 37.33v222.086c0 20.585 16.654 37.331 37.126 37.331H730.22c10.243 0 18.547 8.304 18.547 18.547 0 10.244-8.304 18.547-18.547 18.547z"></path></svg><!--[--><span class="page-category-item category1" role>开发笔记</span><span class="page-category-item category7" role>学习记录</span><!--]--><meta property="articleSection" content="开发笔记,学习记录"></span><!----></div><hr></div><div class="toc-place-holder"><aside id="toc"><!--[--><!----><!--]--><div class="toc-header">此页内容<button type="button" class="print-button" title="打印"><svg xmlns="http://www.w3.org/2000/svg" class="icon print-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="print icon"><path d="M819.2 364.8h-44.8V128c0-17.067-14.933-32-32-32H281.6c-17.067 0-32 14.933-32 32v236.8h-44.8C145.067 364.8 96 413.867 96 473.6v192c0 59.733 49.067 108.8 108.8 108.8h44.8V896c0 17.067 14.933 32 32 32h460.8c17.067 0 32-14.933 32-32V774.4h44.8c59.733 0 108.8-49.067 108.8-108.8v-192c0-59.733-49.067-108.8-108.8-108.8zM313.6 160h396.8v204.8H313.6V160zm396.8 704H313.6V620.8h396.8V864zM864 665.6c0 25.6-19.2 44.8-44.8 44.8h-44.8V588.8c0-17.067-14.933-32-32-32H281.6c-17.067 0-32 14.933-32 32v121.6h-44.8c-25.6 0-44.8-19.2-44.8-44.8v-192c0-25.6 19.2-44.8 44.8-44.8h614.4c25.6 0 44.8 19.2 44.8 44.8v192z"></path></svg></button></div><div class="toc-wrapper"><ul class="toc-list"><!--[--><li class="toc-item"><a class="vp-link toc-link level3 toc-link level3" href="/#任务">任务</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level2 toc-link level2" href="/#总结">总结</a></li><!----><!--]--></ul><div class="toc-marker" style="top:-1.7rem;"></div></div><!--[--><!----><!--]--></aside></div><!----><div class="theme-hope-content"><h3 id="任务" tabindex="-1"><a class="header-anchor" href="#任务" aria-hidden="true">#</a> 任务</h3><ul><li>[x] 规则引擎量化人群参与活动</li></ul><h2 id="总结" tabindex="-1"><a class="header-anchor" href="#总结" aria-hidden="true">#</a> 总结</h2><p>首先先去了解了一下组合模式和决策树,然后看了看数据库,其实就是把一个类似于二叉树的结构存到了数据库里,分别对应了三个东西,一个表用来保存决策树的树根信息,然后一个表用来保存树上的所有节点的信息,然后一个表用来存决策树的连接信息,我们可以通过树根的 ID 拿到所有相关的连线信息以及所有相关的节点信息,明白了数据库相关的东西之后屡屡代码结构</p><p>什么是组合模式呢?先看看维基百科对组合模式的定义,然后直接看代码,给我的第一感觉就是把每一个 if-else 的条件抽取出来,然后变成一个又一个的 filter,然后在规则引擎中进行使用,首先把一个个 filter 包装到 map 中,供子类使用</p><p>其中最重要的代码我觉得是这个:</p><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code> <span class="token keyword">protected</span> <span class="token class-name">TreeNodeVO</span> <span class="token function">engineDecisionMaker</span><span class="token punctuation">(</span><span class="token class-name">TreeRuleRich</span> treeRuleRich<span class="token punctuation">,</span> <span class="token class-name">DecisionMatterReq</span> matterReq<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token class-name">TreeRootVO</span> treeRoot <span class="token operator">=</span> treeRuleRich<span class="token punctuation">.</span><span class="token function">getTreeRoot</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">Map</span><span class="token generics"><span class="token punctuation">&lt;</span><span class="token class-name">Long</span><span class="token punctuation">,</span> <span class="token class-name">TreeNodeVO</span><span class="token punctuation">&gt;</span></span> treeNodeMap <span class="token operator">=</span> treeRuleRich<span class="token punctuation">.</span><span class="token function">getTreeNodeMap</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">Long</span> rootNodeId <span class="token operator">=</span> treeRoot<span class="token punctuation">.</span><span class="token function">getTreeRootNodeId</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">TreeNodeVO</span> treeNodeInfo <span class="token operator">=</span> treeNodeMap<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>rootNodeId<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token class-name">Constants<span class="token punctuation">.</span>NodeType</span><span class="token punctuation">.</span><span class="token constant">STEM</span><span class="token punctuation">.</span><span class="token function">equals</span><span class="token punctuation">(</span>treeNodeInfo<span class="token punctuation">.</span><span class="token function">getNodeType</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token class-name">String</span> ruleKey <span class="token operator">=</span> treeNodeInfo<span class="token punctuation">.</span><span class="token function">getRuleKey</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">LogicFilter</span> logicFilter <span class="token operator">=</span> logicFilterMap<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>ruleKey<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">String</span> matterValue <span class="token operator">=</span> logicFilter<span class="token punctuation">.</span><span class="token function">matterValue</span><span class="token punctuation">(</span>matterReq<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">Long</span> nextNode <span class="token operator">=</span> logicFilter<span class="token punctuation">.</span><span class="token function">filter</span><span class="token punctuation">(</span>matterValue<span class="token punctuation">,</span> treeNodeInfo<span class="token punctuation">.</span><span class="token function">getTreeNodeLineInfoList</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
treeNodeInfo <span class="token operator">=</span> treeNodeMap<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>nextNode<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">return</span> treeNodeInfo<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><ol><li>获取树根节点信息</li><li>获取树根所对应的所有节点信息</li><li>判断每个节点是不是叶子节点 <ol><li>如果不是,就执行决策,如果通过就返回下一个节点</li><li>如果是叶子节点,也就是找到了对应的活动号,表示可以参与</li></ol></li></ol><p>那么就可以将代码结构分为两个部分,一个是决策者,提供决策相关逻辑,一个是执行者,对决策链条进行链路执行,然后返回最终结果,那么到这里应该代码逻辑就清晰了,决策者根据一定的比较规则,返回 ture 或者 false,执行者根据这个结果来判断是否要继续进行下一个判断,直到判断到叶子节点</p><p>了解了这个之后代码就好写了</p><p>感觉这个章节最大的难点就在于如果之前没有设计模式基础的话,会很难受,代码跳过去跳过来有时候找不到方向,一般我遇到这种情况的时候我就会梳理一下业务逻辑,代码结构无论怎么变,也一定是根据业务逻辑来的,之前做的事情一样不少,所以就按照自己想的逻辑去代码中找对应,去看看哪里做的比较,哪里拿到的链路结构,这样就将大问题化成了小问题,然后去对应代码中的每一个部分,这里也就是将逻辑执行步骤进行“打散”的过程,找到了每段代码对应那一段逻辑之后,看一看代码的继承体系,大概也就了解个七七八八了</p></div><!----><footer class="page-meta"><div class="meta-item edit-link"><a href="https://github.com/fuzhengwei/xfg-resume-blog/edit/main/src/md/dev-log/day12.md" rel="noopener noreferrer" target="_blank" aria-label="在 GitHub 上编辑此页" class="nav-link label"><!--[--><svg xmlns="http://www.w3.org/2000/svg" class="icon edit-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="edit icon"><path d="M430.818 653.65a60.46 60.46 0 0 1-50.96-93.281l71.69-114.012 7.773-10.365L816.038 80.138A60.46 60.46 0 0 1 859.225 62a60.46 60.46 0 0 1 43.186 18.138l43.186 43.186a60.46 60.46 0 0 1 0 86.373L588.879 565.55l-8.637 8.637-117.466 68.234a60.46 60.46 0 0 1-31.958 11.229z"></path><path d="M728.802 962H252.891A190.883 190.883 0 0 1 62.008 771.98V296.934a190.883 190.883 0 0 1 190.883-192.61h267.754a60.46 60.46 0 0 1 0 120.92H252.891a69.962 69.962 0 0 0-69.098 69.099V771.98a69.962 69.962 0 0 0 69.098 69.098h475.911A69.962 69.962 0 0 0 797.9 771.98V503.363a60.46 60.46 0 1 1 120.922 0V771.98A190.883 190.883 0 0 1 728.802 962z"></path></svg><!--]-->在 GitHub 上编辑此页<span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">open in new window</span></span><!----></a></div><div class="meta-item git-info"><!----><!----></div></footer><nav class="vp-page-nav"><a aria-label="Day011" class="vp-link nav-link prev nav-link prev" href="/md/dev-log/day11.html"><div class="hint"><span class="arrow start"></span>上一页</div><div class="link"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day011</div></a><!----></nav><!----><!----><!--]--></main><!--]--><footer class="vp-footer-wrapper"><div class="vp-footer">我的微信:fustack</div><div class="vp-copyright">Copyright © 2024 Mr.Hope</div></footer></div><!--]--><!----><!--]--></div>
<script type="module" src="/assets/app-89848b6d.js" defer></script>
</body>
</html>
<!doctype html>
<html lang="zh-CN" data-theme="light">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<meta name="generator" content="VuePress 2.0.0-beta.67" />
<meta name="theme" content="VuePress Theme Hope" />
<meta property="og:url" content="https://vuepress-theme-hope-docs-demo.netlify.app/md/dev-log/"><meta property="og:site_name" content="我的简历"><meta property="og:title" content="开发日志"><meta property="og:description" content="day01.md (day01.md);"><meta property="og:type" content="article"><meta property="og:locale" content="zh-CN"><meta property="article:author" content="Mr.Hope"><script type="application/ld+json">{"@context":"https://schema.org","@type":"Article","headline":"开发日志","image":[""],"dateModified":null,"author":[{"@type":"Person","name":"Mr.Hope","url":"https://mister-hope.com"}]}</script><title>开发日志 | 我的简历</title><meta name="description" content="day01.md (day01.md);">
<style>
:root {
--bg-color: #fff;
}
html[data-theme="dark"] {
--bg-color: #1d1e1f;
}
html,
body {
background: var(--bg-color);
}
</style>
<script>
const userMode = localStorage.getItem("vuepress-theme-hope-scheme");
const systemDarkMode =
window.matchMedia &&
window.matchMedia("(prefers-color-scheme: dark)").matches;
if (userMode === "dark" || (userMode !== "light" && systemDarkMode)) {
document.documentElement.setAttribute("data-theme", "dark");
}
</script>
<link rel="preload" href="/assets/style-e1af0ae0.css" as="style"><link rel="stylesheet" href="/assets/style-e1af0ae0.css">
<link rel="modulepreload" href="/assets/app-89848b6d.js"><link rel="modulepreload" href="/assets/index.html-604f9d5c.js"><link rel="modulepreload" href="/assets/plugin-vue_export-helper-c27b6911.js"><link rel="modulepreload" href="/assets/index.html-ee414c74.js"><link rel="prefetch" href="/assets/index.html-3ddb8fc8.js" as="script"><link rel="prefetch" href="/assets/slides.html-e24915cf.js" as="script"><link rel="prefetch" href="/assets/resume.html-63219902.js" as="script"><link rel="prefetch" href="/assets/day01.html-96303a92.js" as="script"><link rel="prefetch" href="/assets/day02.html-bc6452cb.js" as="script"><link rel="prefetch" href="/assets/day03.html-faf19961.js" as="script"><link rel="prefetch" href="/assets/day04.html-f1431c14.js" as="script"><link rel="prefetch" href="/assets/day05.html-e1b66f43.js" as="script"><link rel="prefetch" href="/assets/day06.html-694a0d7d.js" as="script"><link rel="prefetch" href="/assets/day07~day08.html-623b7865.js" as="script"><link rel="prefetch" href="/assets/day09~day10.html-f64b96c2.js" as="script"><link rel="prefetch" href="/assets/day11.html-a02521a7.js" as="script"><link rel="prefetch" href="/assets/day12.html-59d9b776.js" as="script"><link rel="prefetch" href="/assets/404.html-a12454c5.js" as="script"><link rel="prefetch" href="/assets/index.html-38735195.js" as="script"><link rel="prefetch" href="/assets/index.html-72fa7116.js" as="script"><link rel="prefetch" href="/assets/slides.html-73aa899b.js" as="script"><link rel="prefetch" href="/assets/resume.html-0d5e8b6f.js" as="script"><link rel="prefetch" href="/assets/day01.html-f34d072c.js" as="script"><link rel="prefetch" href="/assets/day02.html-faf555eb.js" as="script"><link rel="prefetch" href="/assets/day03.html-f3141bb2.js" as="script"><link rel="prefetch" href="/assets/day04.html-61a7012e.js" as="script"><link rel="prefetch" href="/assets/day05.html-4698622b.js" as="script"><link rel="prefetch" href="/assets/day06.html-a4c2781d.js" as="script"><link rel="prefetch" href="/assets/day07~day08.html-4e5d7c48.js" as="script"><link rel="prefetch" href="/assets/day09~day10.html-ee1cb17c.js" as="script"><link rel="prefetch" href="/assets/day11.html-13381d55.js" as="script"><link rel="prefetch" href="/assets/day12.html-4bed2fb6.js" as="script"><link rel="prefetch" href="/assets/404.html-4d74dcf3.js" as="script"><link rel="prefetch" href="/assets/index.html-f3051275.js" as="script"><link rel="prefetch" href="/assets/photoswipe.esm-060dc2da.js" as="script">
</head>
<body>
<div id="app"><!--[--><!--[--><!--[--><span tabindex="-1"></span><a href="#main-content" class="vp-skip-link sr-only">跳至主要內容</a><!--]--><div class="theme-container has-toc"><!--[--><header id="navbar" class="vp-navbar"><div class="vp-navbar-start"><button type="button" class="vp-toggle-sidebar-button" title="Toggle Sidebar"><span class="icon"></span></button><!--[--><!----><!--]--><!--[--><a class="vp-link vp-brand vp-brand" href="/"><img class="vp-nav-logo" src="/logo.svg" alt="我的简历"><!----><span class="vp-site-name hide-in-pad">我的简历</span></a><!--]--><!--[--><!----><!--]--></div><div class="vp-navbar-center"><!--[--><!----><!--]--><!--[--><nav class="vp-nav-links"><div class="nav-item hide-in-mobile"><a aria-label="主页" class="vp-link nav-link nav-link" href="/"><span class="font-icon icon fa-fw fa-sm fas fa-home" style=""></span>主页<!----></a></div><div class="nav-item hide-in-mobile"><a aria-label="个人简历" class="vp-link nav-link nav-link" href="/md/resume.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>个人简历<!----></a></div><div class="nav-item hide-in-mobile"><a aria-label="开发日志" class="vp-link nav-link nav-link" href="/md/dev-log/day01.html"><span class="font-icon icon fa-fw fa-sm fas fa-book" style=""></span>开发日志<!----></a></div></nav><!--]--><!--[--><!----><!--]--></div><div class="vp-navbar-end"><!--[--><!----><!--]--><!--[--><!----><div class="nav-item vp-repo"><a class="vp-repo-link" href="https://github.com/fuzhengwei/xfg-resume-blog" target="_blank" rel="noopener noreferrer" aria-label="GitHub"><svg xmlns="http://www.w3.org/2000/svg" class="icon github-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="github icon" style="width:1.25rem;height:1.25rem;vertical-align:middle;"><path d="M511.957 21.333C241.024 21.333 21.333 240.981 21.333 512c0 216.832 140.544 400.725 335.574 465.664 24.49 4.395 32.256-10.07 32.256-23.083 0-11.69.256-44.245 0-85.205-136.448 29.61-164.736-64.64-164.736-64.64-22.315-56.704-54.4-71.765-54.4-71.765-44.587-30.464 3.285-29.824 3.285-29.824 49.195 3.413 75.179 50.517 75.179 50.517 43.776 75.008 114.816 53.333 142.762 40.79 4.523-31.66 17.152-53.377 31.19-65.537-108.971-12.458-223.488-54.485-223.488-242.602 0-53.547 19.114-97.323 50.517-131.67-5.035-12.33-21.93-62.293 4.779-129.834 0 0 41.258-13.184 134.912 50.346a469.803 469.803 0 0 1 122.88-16.554c41.642.213 83.626 5.632 122.88 16.554 93.653-63.488 134.784-50.346 134.784-50.346 26.752 67.541 9.898 117.504 4.864 129.834 31.402 34.347 50.474 78.123 50.474 131.67 0 188.586-114.73 230.016-224.042 242.09 17.578 15.232 33.578 44.672 33.578 90.454v135.85c0 13.142 7.936 27.606 32.854 22.87C862.25 912.597 1002.667 728.747 1002.667 512c0-271.019-219.648-490.667-490.71-490.667z"></path></svg></a></div><div class="nav-item hide-in-mobile"><button type="button" id="appearance-switch"><svg xmlns="http://www.w3.org/2000/svg" class="icon auto-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="auto icon" style="display:block;"><path d="M512 992C246.92 992 32 777.08 32 512S246.92 32 512 32s480 214.92 480 480-214.92 480-480 480zm0-840c-198.78 0-360 161.22-360 360 0 198.84 161.22 360 360 360s360-161.16 360-360c0-198.78-161.22-360-360-360zm0 660V212c165.72 0 300 134.34 300 300 0 165.72-134.28 300-300 300z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" class="icon dark-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="dark icon" style="display:none;"><path d="M524.8 938.667h-4.267a439.893 439.893 0 0 1-313.173-134.4 446.293 446.293 0 0 1-11.093-597.334A432.213 432.213 0 0 1 366.933 90.027a42.667 42.667 0 0 1 45.227 9.386 42.667 42.667 0 0 1 10.24 42.667 358.4 358.4 0 0 0 82.773 375.893 361.387 361.387 0 0 0 376.747 82.774 42.667 42.667 0 0 1 54.187 55.04 433.493 433.493 0 0 1-99.84 154.88 438.613 438.613 0 0 1-311.467 128z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" class="icon light-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="light icon" style="display:none;"><path d="M952 552h-80a40 40 0 0 1 0-80h80a40 40 0 0 1 0 80zM801.88 280.08a41 41 0 0 1-57.96-57.96l57.96-58a41.04 41.04 0 0 1 58 58l-58 57.96zM512 752a240 240 0 1 1 0-480 240 240 0 0 1 0 480zm0-560a40 40 0 0 1-40-40V72a40 40 0 0 1 80 0v80a40 40 0 0 1-40 40zm-289.88 88.08-58-57.96a41.04 41.04 0 0 1 58-58l57.96 58a41 41 0 0 1-57.96 57.96zM192 512a40 40 0 0 1-40 40H72a40 40 0 0 1 0-80h80a40 40 0 0 1 40 40zm30.12 231.92a41 41 0 0 1 57.96 57.96l-57.96 58a41.04 41.04 0 0 1-58-58l58-57.96zM512 832a40 40 0 0 1 40 40v80a40 40 0 0 1-80 0v-80a40 40 0 0 1 40-40zm289.88-88.08 58 57.96a41.04 41.04 0 0 1-58 58l-57.96-58a41 41 0 0 1 57.96-57.96z"></path></svg></button></div><!----><!--]--><!--[--><!----><!--]--><button type="button" class="vp-toggle-navbar-button" aria-label="Toggle Navbar" aria-expanded="false" aria-controls="nav-screen"><span><span class="vp-top"></span><span class="vp-middle"></span><span class="vp-bottom"></span></span></button></div></header><!----><!--]--><!----><div class="toggle-sidebar-wrapper"><span class="arrow start"></span></div><aside id="sidebar" class="vp-sidebar"><!--[--><!----><!--]--><ul class="vp-sidebar-links"><li><!--[--><a aria-label="主页" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/"><span class="font-icon icon fa-fw fa-sm fas fa-home" style=""></span>主页<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><section class="vp-sidebar-group"><p class="vp-sidebar-heading"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span><span class="vp-sidebar-title">Lottery 项目开发日志</span><!----></p><ul class="vp-sidebar-links"><li><!--[--><a aria-label="Day01" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day01.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day01<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day02" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day02.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day02<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day03" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day03.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day03<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day04" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day04.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day04<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day05" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day05.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day05<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day06" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day06.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day06<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day07 ~ Day08" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day07~day08.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day07 ~ Day08<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day09 ~ Day10" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day09~day10.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day09 ~ Day10<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day011" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day11.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day011<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day012" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day12.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day012<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li></ul></section></li></ul><!--[--><!----><!--]--></aside><!--[--><main id="main-content" class="vp-page"><!--[--><!----><!----><nav class="vp-breadcrumb disable"></nav><div class="vp-page-title"><h1><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>开发日志</h1><div class="page-info"><span class="page-author-info" aria-label="作者🖊" data-balloon-pos="down"><svg xmlns="http://www.w3.org/2000/svg" class="icon author-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="author icon"><path d="M649.6 633.6c86.4-48 147.2-144 147.2-249.6 0-160-128-288-288-288s-288 128-288 288c0 108.8 57.6 201.6 147.2 249.6-121.6 48-214.4 153.6-240 288-3.2 9.6 0 19.2 6.4 25.6 3.2 9.6 12.8 12.8 22.4 12.8h704c9.6 0 19.2-3.2 25.6-12.8 6.4-6.4 9.6-16 6.4-25.6-25.6-134.4-121.6-240-243.2-288z"></path></svg><span><a class="page-author-item" href="https://mister-hope.com" target="_blank" rel="noopener noreferrer">Mr.Hope</a></span><span property="author" content="Mr.Hope"></span></span><!----><!----><!----><span class="page-reading-time-info" aria-label="阅读时间⌛" data-balloon-pos="down"><svg xmlns="http://www.w3.org/2000/svg" class="icon timer-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="timer icon"><path d="M799.387 122.15c4.402-2.978 7.38-7.897 7.38-13.463v-1.165c0-8.933-7.38-16.312-16.312-16.312H256.33c-8.933 0-16.311 7.38-16.311 16.312v1.165c0 5.825 2.977 10.874 7.637 13.592 4.143 194.44 97.22 354.963 220.201 392.763-122.204 37.542-214.893 196.511-220.2 389.397-4.661 5.049-7.638 11.651-7.638 19.03v5.825h566.49v-5.825c0-7.379-2.849-13.981-7.509-18.9-5.049-193.016-97.867-351.985-220.2-389.527 123.24-37.67 216.446-198.453 220.588-392.892zM531.16 450.445v352.632c117.674 1.553 211.787 40.778 211.787 88.676H304.097c0-48.286 95.149-87.382 213.728-88.676V450.445c-93.077-3.107-167.901-81.297-167.901-177.093 0-8.803 6.99-15.793 15.793-15.793 8.803 0 15.794 6.99 15.794 15.793 0 80.261 63.69 145.635 142.01 145.635s142.011-65.374 142.011-145.635c0-8.803 6.99-15.793 15.794-15.793s15.793 6.99 15.793 15.793c0 95.019-73.789 172.82-165.96 177.093z"></path></svg><span>小于 1 分钟</span><meta property="timeRequired" content="PT1M"></span><span class="page-category-info" aria-label="分类🌈" data-balloon-pos="down"><svg xmlns="http://www.w3.org/2000/svg" class="icon category-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="category icon"><path d="M148.41 106.992h282.176c22.263 0 40.31 18.048 40.31 40.31V429.48c0 22.263-18.047 40.31-40.31 40.31H148.41c-22.263 0-40.311-18.047-40.311-40.31V147.302c0-22.263 18.048-40.31 40.311-40.31zM147.556 553.478H429.73c22.263 0 40.311 18.048 40.311 40.31v282.176c0 22.263-18.048 40.312-40.31 40.312H147.555c-22.263 0-40.311-18.049-40.311-40.312V593.79c0-22.263 18.048-40.311 40.31-40.311zM593.927 106.992h282.176c22.263 0 40.31 18.048 40.31 40.31V429.48c0 22.263-18.047 40.31-40.31 40.31H593.927c-22.263 0-40.311-18.047-40.311-40.31V147.302c0-22.263 18.048-40.31 40.31-40.31zM730.22 920.502H623.926c-40.925 0-74.22-33.388-74.22-74.425V623.992c0-41.038 33.387-74.424 74.425-74.424h222.085c41.038 0 74.424 33.226 74.424 74.067v114.233c0 10.244-8.304 18.548-18.547 18.548s-18.548-8.304-18.548-18.548V623.635c0-20.388-16.746-36.974-37.33-36.974H624.13c-20.585 0-37.331 16.747-37.331 37.33v222.086c0 20.585 16.654 37.331 37.126 37.331H730.22c10.243 0 18.547 8.304 18.547 18.547 0 10.244-8.304 18.547-18.547 18.547z"></path></svg><!--[--><span class="page-category-item category0" role>自我介绍</span><span class="page-category-item category7" role>专业技能</span><span class="page-category-item category8" role>项目经验</span><!--]--><meta property="articleSection" content="自我介绍,专业技能,项目经验"></span><!----></div><hr></div><!----><!----><div class="theme-hope-content"><ul><li><a href="/md/dev-log/day01.html" class="">day01.md</a></li></ul></div><!----><footer class="page-meta"><div class="meta-item edit-link"><a href="https://github.com/fuzhengwei/xfg-resume-blog/edit/main/src/md/dev-log/README.md" rel="noopener noreferrer" target="_blank" aria-label="在 GitHub 上编辑此页" class="nav-link label"><!--[--><svg xmlns="http://www.w3.org/2000/svg" class="icon edit-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="edit icon"><path d="M430.818 653.65a60.46 60.46 0 0 1-50.96-93.281l71.69-114.012 7.773-10.365L816.038 80.138A60.46 60.46 0 0 1 859.225 62a60.46 60.46 0 0 1 43.186 18.138l43.186 43.186a60.46 60.46 0 0 1 0 86.373L588.879 565.55l-8.637 8.637-117.466 68.234a60.46 60.46 0 0 1-31.958 11.229z"></path><path d="M728.802 962H252.891A190.883 190.883 0 0 1 62.008 771.98V296.934a190.883 190.883 0 0 1 190.883-192.61h267.754a60.46 60.46 0 0 1 0 120.92H252.891a69.962 69.962 0 0 0-69.098 69.099V771.98a69.962 69.962 0 0 0 69.098 69.098h475.911A69.962 69.962 0 0 0 797.9 771.98V503.363a60.46 60.46 0 1 1 120.922 0V771.98A190.883 190.883 0 0 1 728.802 962z"></path></svg><!--]-->在 GitHub 上编辑此页<span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">open in new window</span></span><!----></a></div><div class="meta-item git-info"><!----><!----></div></footer><!----><!----><!----><!--]--></main><!--]--><footer class="vp-footer-wrapper"><div class="vp-footer">我的微信:fustack</div><div class="vp-copyright">Copyright © 2024 Mr.Hope</div></footer></div><!--]--><!----><!--]--></div>
<script type="module" src="/assets/app-89848b6d.js" defer></script>
</body>
</html>
<!doctype html>
<html lang="zh-CN" data-theme="light">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<meta name="generator" content="VuePress 2.0.0-beta.67" />
<meta name="theme" content="VuePress Theme Hope" />
<meta property="og:url" content="https://vuepress-theme-hope-docs-demo.netlify.app/md/"><meta property="og:site_name" content="我的简历"><meta property="og:title" content="Md"><meta property="og:type" content="website"><meta property="og:locale" content="zh-CN"><meta property="article:author" content="Mr.Hope"><script type="application/ld+json">{"@context":"https://schema.org","@type":"WebPage","name":"Md"}</script><title>Md | 我的简历</title><meta name="description" content="">
<style>
:root {
--bg-color: #fff;
}
html[data-theme="dark"] {
--bg-color: #1d1e1f;
}
html,
body {
background: var(--bg-color);
}
</style>
<script>
const userMode = localStorage.getItem("vuepress-theme-hope-scheme");
const systemDarkMode =
window.matchMedia &&
window.matchMedia("(prefers-color-scheme: dark)").matches;
if (userMode === "dark" || (userMode !== "light" && systemDarkMode)) {
document.documentElement.setAttribute("data-theme", "dark");
}
</script>
<link rel="preload" href="/assets/style-e1af0ae0.css" as="style"><link rel="stylesheet" href="/assets/style-e1af0ae0.css">
<link rel="modulepreload" href="/assets/app-89848b6d.js"><link rel="modulepreload" href="/assets/index.html-f3051275.js"><link rel="modulepreload" href="/assets/plugin-vue_export-helper-c27b6911.js"><link rel="modulepreload" href="/assets/index.html-38735195.js"><link rel="prefetch" href="/assets/index.html-3ddb8fc8.js" as="script"><link rel="prefetch" href="/assets/slides.html-e24915cf.js" as="script"><link rel="prefetch" href="/assets/resume.html-63219902.js" as="script"><link rel="prefetch" href="/assets/index.html-ee414c74.js" as="script"><link rel="prefetch" href="/assets/day01.html-96303a92.js" as="script"><link rel="prefetch" href="/assets/day02.html-bc6452cb.js" as="script"><link rel="prefetch" href="/assets/day03.html-faf19961.js" as="script"><link rel="prefetch" href="/assets/day04.html-f1431c14.js" as="script"><link rel="prefetch" href="/assets/day05.html-e1b66f43.js" as="script"><link rel="prefetch" href="/assets/day06.html-694a0d7d.js" as="script"><link rel="prefetch" href="/assets/day07~day08.html-623b7865.js" as="script"><link rel="prefetch" href="/assets/day09~day10.html-f64b96c2.js" as="script"><link rel="prefetch" href="/assets/day11.html-a02521a7.js" as="script"><link rel="prefetch" href="/assets/day12.html-59d9b776.js" as="script"><link rel="prefetch" href="/assets/404.html-a12454c5.js" as="script"><link rel="prefetch" href="/assets/index.html-72fa7116.js" as="script"><link rel="prefetch" href="/assets/slides.html-73aa899b.js" as="script"><link rel="prefetch" href="/assets/resume.html-0d5e8b6f.js" as="script"><link rel="prefetch" href="/assets/index.html-604f9d5c.js" as="script"><link rel="prefetch" href="/assets/day01.html-f34d072c.js" as="script"><link rel="prefetch" href="/assets/day02.html-faf555eb.js" as="script"><link rel="prefetch" href="/assets/day03.html-f3141bb2.js" as="script"><link rel="prefetch" href="/assets/day04.html-61a7012e.js" as="script"><link rel="prefetch" href="/assets/day05.html-4698622b.js" as="script"><link rel="prefetch" href="/assets/day06.html-a4c2781d.js" as="script"><link rel="prefetch" href="/assets/day07~day08.html-4e5d7c48.js" as="script"><link rel="prefetch" href="/assets/day09~day10.html-ee1cb17c.js" as="script"><link rel="prefetch" href="/assets/day11.html-13381d55.js" as="script"><link rel="prefetch" href="/assets/day12.html-4bed2fb6.js" as="script"><link rel="prefetch" href="/assets/404.html-4d74dcf3.js" as="script"><link rel="prefetch" href="/assets/photoswipe.esm-060dc2da.js" as="script">
</head>
<body>
<div id="app"><!--[--><!--[--><!--[--><span tabindex="-1"></span><a href="#main-content" class="vp-skip-link sr-only">跳至主要內容</a><!--]--><div class="theme-container has-toc"><!--[--><header id="navbar" class="vp-navbar"><div class="vp-navbar-start"><button type="button" class="vp-toggle-sidebar-button" title="Toggle Sidebar"><span class="icon"></span></button><!--[--><!----><!--]--><!--[--><a class="vp-link vp-brand vp-brand" href="/"><img class="vp-nav-logo" src="/logo.svg" alt="我的简历"><!----><span class="vp-site-name hide-in-pad">我的简历</span></a><!--]--><!--[--><!----><!--]--></div><div class="vp-navbar-center"><!--[--><!----><!--]--><!--[--><nav class="vp-nav-links"><div class="nav-item hide-in-mobile"><a aria-label="主页" class="vp-link nav-link nav-link" href="/"><span class="font-icon icon fa-fw fa-sm fas fa-home" style=""></span>主页<!----></a></div><div class="nav-item hide-in-mobile"><a aria-label="个人简历" class="vp-link nav-link nav-link" href="/md/resume.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>个人简历<!----></a></div><div class="nav-item hide-in-mobile"><a aria-label="开发日志" class="vp-link nav-link nav-link" href="/md/dev-log/day01.html"><span class="font-icon icon fa-fw fa-sm fas fa-book" style=""></span>开发日志<!----></a></div></nav><!--]--><!--[--><!----><!--]--></div><div class="vp-navbar-end"><!--[--><!----><!--]--><!--[--><!----><div class="nav-item vp-repo"><a class="vp-repo-link" href="https://github.com/fuzhengwei/xfg-resume-blog" target="_blank" rel="noopener noreferrer" aria-label="GitHub"><svg xmlns="http://www.w3.org/2000/svg" class="icon github-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="github icon" style="width:1.25rem;height:1.25rem;vertical-align:middle;"><path d="M511.957 21.333C241.024 21.333 21.333 240.981 21.333 512c0 216.832 140.544 400.725 335.574 465.664 24.49 4.395 32.256-10.07 32.256-23.083 0-11.69.256-44.245 0-85.205-136.448 29.61-164.736-64.64-164.736-64.64-22.315-56.704-54.4-71.765-54.4-71.765-44.587-30.464 3.285-29.824 3.285-29.824 49.195 3.413 75.179 50.517 75.179 50.517 43.776 75.008 114.816 53.333 142.762 40.79 4.523-31.66 17.152-53.377 31.19-65.537-108.971-12.458-223.488-54.485-223.488-242.602 0-53.547 19.114-97.323 50.517-131.67-5.035-12.33-21.93-62.293 4.779-129.834 0 0 41.258-13.184 134.912 50.346a469.803 469.803 0 0 1 122.88-16.554c41.642.213 83.626 5.632 122.88 16.554 93.653-63.488 134.784-50.346 134.784-50.346 26.752 67.541 9.898 117.504 4.864 129.834 31.402 34.347 50.474 78.123 50.474 131.67 0 188.586-114.73 230.016-224.042 242.09 17.578 15.232 33.578 44.672 33.578 90.454v135.85c0 13.142 7.936 27.606 32.854 22.87C862.25 912.597 1002.667 728.747 1002.667 512c0-271.019-219.648-490.667-490.71-490.667z"></path></svg></a></div><div class="nav-item hide-in-mobile"><button type="button" id="appearance-switch"><svg xmlns="http://www.w3.org/2000/svg" class="icon auto-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="auto icon" style="display:block;"><path d="M512 992C246.92 992 32 777.08 32 512S246.92 32 512 32s480 214.92 480 480-214.92 480-480 480zm0-840c-198.78 0-360 161.22-360 360 0 198.84 161.22 360 360 360s360-161.16 360-360c0-198.78-161.22-360-360-360zm0 660V212c165.72 0 300 134.34 300 300 0 165.72-134.28 300-300 300z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" class="icon dark-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="dark icon" style="display:none;"><path d="M524.8 938.667h-4.267a439.893 439.893 0 0 1-313.173-134.4 446.293 446.293 0 0 1-11.093-597.334A432.213 432.213 0 0 1 366.933 90.027a42.667 42.667 0 0 1 45.227 9.386 42.667 42.667 0 0 1 10.24 42.667 358.4 358.4 0 0 0 82.773 375.893 361.387 361.387 0 0 0 376.747 82.774 42.667 42.667 0 0 1 54.187 55.04 433.493 433.493 0 0 1-99.84 154.88 438.613 438.613 0 0 1-311.467 128z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" class="icon light-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="light icon" style="display:none;"><path d="M952 552h-80a40 40 0 0 1 0-80h80a40 40 0 0 1 0 80zM801.88 280.08a41 41 0 0 1-57.96-57.96l57.96-58a41.04 41.04 0 0 1 58 58l-58 57.96zM512 752a240 240 0 1 1 0-480 240 240 0 0 1 0 480zm0-560a40 40 0 0 1-40-40V72a40 40 0 0 1 80 0v80a40 40 0 0 1-40 40zm-289.88 88.08-58-57.96a41.04 41.04 0 0 1 58-58l57.96 58a41 41 0 0 1-57.96 57.96zM192 512a40 40 0 0 1-40 40H72a40 40 0 0 1 0-80h80a40 40 0 0 1 40 40zm30.12 231.92a41 41 0 0 1 57.96 57.96l-57.96 58a41.04 41.04 0 0 1-58-58l58-57.96zM512 832a40 40 0 0 1 40 40v80a40 40 0 0 1-80 0v-80a40 40 0 0 1 40-40zm289.88-88.08 58 57.96a41.04 41.04 0 0 1-58 58l-57.96-58a41 41 0 0 1 57.96-57.96z"></path></svg></button></div><!----><!--]--><!--[--><!----><!--]--><button type="button" class="vp-toggle-navbar-button" aria-label="Toggle Navbar" aria-expanded="false" aria-controls="nav-screen"><span><span class="vp-top"></span><span class="vp-middle"></span><span class="vp-bottom"></span></span></button></div></header><!----><!--]--><!----><div class="toggle-sidebar-wrapper"><span class="arrow start"></span></div><aside id="sidebar" class="vp-sidebar"><!--[--><!----><!--]--><ul class="vp-sidebar-links"><li><!--[--><a aria-label="主页" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/"><span class="font-icon icon fa-fw fa-sm fas fa-home" style=""></span>主页<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><section class="vp-sidebar-group"><p class="vp-sidebar-heading"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span><span class="vp-sidebar-title">Lottery 项目开发日志</span><!----></p><ul class="vp-sidebar-links"><li><!--[--><a aria-label="Day01" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day01.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day01<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day02" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day02.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day02<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day03" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day03.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day03<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day04" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day04.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day04<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day05" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day05.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day05<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day06" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day06.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day06<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day07 ~ Day08" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day07~day08.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day07 ~ Day08<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day09 ~ Day10" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day09~day10.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day09 ~ Day10<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day011" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day11.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day011<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day012" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day12.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day012<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li></ul></section></li></ul><!--[--><!----><!--]--></aside><!--[--><main id="main-content" class="vp-page"><!--[--><!----><!----><nav class="vp-breadcrumb disable"></nav><div class="vp-page-title"><h1><!---->Md</h1><div class="page-info"><span class="page-author-info" aria-label="作者🖊" data-balloon-pos="down"><svg xmlns="http://www.w3.org/2000/svg" class="icon author-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="author icon"><path d="M649.6 633.6c86.4-48 147.2-144 147.2-249.6 0-160-128-288-288-288s-288 128-288 288c0 108.8 57.6 201.6 147.2 249.6-121.6 48-214.4 153.6-240 288-3.2 9.6 0 19.2 6.4 25.6 3.2 9.6 12.8 12.8 22.4 12.8h704c9.6 0 19.2-3.2 25.6-12.8 6.4-6.4 9.6-16 6.4-25.6-25.6-134.4-121.6-240-243.2-288z"></path></svg><span><a class="page-author-item" href="https://mister-hope.com" target="_blank" rel="noopener noreferrer">Mr.Hope</a></span><span property="author" content="Mr.Hope"></span></span><!----><!----><!----><span class="page-reading-time-info" aria-label="阅读时间⌛" data-balloon-pos="down"><svg xmlns="http://www.w3.org/2000/svg" class="icon timer-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="timer icon"><path d="M799.387 122.15c4.402-2.978 7.38-7.897 7.38-13.463v-1.165c0-8.933-7.38-16.312-16.312-16.312H256.33c-8.933 0-16.311 7.38-16.311 16.312v1.165c0 5.825 2.977 10.874 7.637 13.592 4.143 194.44 97.22 354.963 220.201 392.763-122.204 37.542-214.893 196.511-220.2 389.397-4.661 5.049-7.638 11.651-7.638 19.03v5.825h566.49v-5.825c0-7.379-2.849-13.981-7.509-18.9-5.049-193.016-97.867-351.985-220.2-389.527 123.24-37.67 216.446-198.453 220.588-392.892zM531.16 450.445v352.632c117.674 1.553 211.787 40.778 211.787 88.676H304.097c0-48.286 95.149-87.382 213.728-88.676V450.445c-93.077-3.107-167.901-81.297-167.901-177.093 0-8.803 6.99-15.793 15.793-15.793 8.803 0 15.794 6.99 15.794 15.793 0 80.261 63.69 145.635 142.01 145.635s142.011-65.374 142.011-145.635c0-8.803 6.99-15.793 15.794-15.793s15.793 6.99 15.793 15.793c0 95.019-73.789 172.82-165.96 177.093z"></path></svg><span>小于 1 分钟</span><meta property="timeRequired" content="PT1M"></span><!----><!----></div><hr></div><!----><!----><div class="theme-hope-content"><div class="vp-catalog-wrapper"><h2 class="vp-catalog-main-title">目录</h2><!--[--><div class="vp-catalog-child-title"><a class="vp-link vp-catalog-title vp-catalog-title" href="/md/dev-log/"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>开发日志</a></div><!--]--></div></div><!----><footer class="page-meta"><!----><div class="meta-item git-info"><!----><!----></div></footer><!----><!----><!----><!--]--></main><!--]--><footer class="vp-footer-wrapper"><div class="vp-footer">我的微信:fustack</div><div class="vp-copyright">Copyright © 2024 Mr.Hope</div></footer></div><!--]--><!----><!--]--></div>
<script type="module" src="/assets/app-89848b6d.js" defer></script>
</body>
</html>
<!doctype html>
<html lang="zh-CN" data-theme="light">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<meta name="generator" content="VuePress 2.0.0-beta.67" />
<meta name="theme" content="VuePress Theme Hope" />
<meta property="og:url" content="https://vuepress-theme-hope-docs-demo.netlify.app/md/resume.html"><meta property="og:site_name" content="我的简历"><meta property="og:title" content="个人简历"><meta property="og:description" content="个人信息 姓名; 电话; 邮箱; 毕业时间; 工作时间; Github:https://github.com/fuzhengwei; 开源项目:vo2dto (https://bugstack.cn/md/product/idea-plugin/vo2dto.html) - IDEA Plugin 自动转换对象插件,5.4k 下载使用; 毕业院校 时间..."><meta property="og:type" content="article"><meta property="og:locale" content="zh-CN"><meta property="article:author" content="Mr.Hope"><script type="application/ld+json">{"@context":"https://schema.org","@type":"Article","headline":"个人简历","image":[""],"dateModified":null,"author":[{"@type":"Person","name":"Mr.Hope","url":"https://mister-hope.com"}]}</script><title>个人简历 | 我的简历</title><meta name="description" content="个人信息 姓名; 电话; 邮箱; 毕业时间; 工作时间; Github:https://github.com/fuzhengwei; 开源项目:vo2dto (https://bugstack.cn/md/product/idea-plugin/vo2dto.html) - IDEA Plugin 自动转换对象插件,5.4k 下载使用; 毕业院校 时间...">
<style>
:root {
--bg-color: #fff;
}
html[data-theme="dark"] {
--bg-color: #1d1e1f;
}
html,
body {
background: var(--bg-color);
}
</style>
<script>
const userMode = localStorage.getItem("vuepress-theme-hope-scheme");
const systemDarkMode =
window.matchMedia &&
window.matchMedia("(prefers-color-scheme: dark)").matches;
if (userMode === "dark" || (userMode !== "light" && systemDarkMode)) {
document.documentElement.setAttribute("data-theme", "dark");
}
</script>
<link rel="preload" href="/assets/style-e1af0ae0.css" as="style"><link rel="stylesheet" href="/assets/style-e1af0ae0.css">
<link rel="modulepreload" href="/assets/app-89848b6d.js"><link rel="modulepreload" href="/assets/resume.html-0d5e8b6f.js"><link rel="modulepreload" href="/assets/plugin-vue_export-helper-c27b6911.js"><link rel="modulepreload" href="/assets/resume.html-63219902.js"><link rel="prefetch" href="/assets/index.html-3ddb8fc8.js" as="script"><link rel="prefetch" href="/assets/slides.html-e24915cf.js" as="script"><link rel="prefetch" href="/assets/index.html-ee414c74.js" as="script"><link rel="prefetch" href="/assets/day01.html-96303a92.js" as="script"><link rel="prefetch" href="/assets/day02.html-bc6452cb.js" as="script"><link rel="prefetch" href="/assets/day03.html-faf19961.js" as="script"><link rel="prefetch" href="/assets/day04.html-f1431c14.js" as="script"><link rel="prefetch" href="/assets/day05.html-e1b66f43.js" as="script"><link rel="prefetch" href="/assets/day06.html-694a0d7d.js" as="script"><link rel="prefetch" href="/assets/day07~day08.html-623b7865.js" as="script"><link rel="prefetch" href="/assets/day09~day10.html-f64b96c2.js" as="script"><link rel="prefetch" href="/assets/day11.html-a02521a7.js" as="script"><link rel="prefetch" href="/assets/day12.html-59d9b776.js" as="script"><link rel="prefetch" href="/assets/404.html-a12454c5.js" as="script"><link rel="prefetch" href="/assets/index.html-38735195.js" as="script"><link rel="prefetch" href="/assets/index.html-72fa7116.js" as="script"><link rel="prefetch" href="/assets/slides.html-73aa899b.js" as="script"><link rel="prefetch" href="/assets/index.html-604f9d5c.js" as="script"><link rel="prefetch" href="/assets/day01.html-f34d072c.js" as="script"><link rel="prefetch" href="/assets/day02.html-faf555eb.js" as="script"><link rel="prefetch" href="/assets/day03.html-f3141bb2.js" as="script"><link rel="prefetch" href="/assets/day04.html-61a7012e.js" as="script"><link rel="prefetch" href="/assets/day05.html-4698622b.js" as="script"><link rel="prefetch" href="/assets/day06.html-a4c2781d.js" as="script"><link rel="prefetch" href="/assets/day07~day08.html-4e5d7c48.js" as="script"><link rel="prefetch" href="/assets/day09~day10.html-ee1cb17c.js" as="script"><link rel="prefetch" href="/assets/day11.html-13381d55.js" as="script"><link rel="prefetch" href="/assets/day12.html-4bed2fb6.js" as="script"><link rel="prefetch" href="/assets/404.html-4d74dcf3.js" as="script"><link rel="prefetch" href="/assets/index.html-f3051275.js" as="script"><link rel="prefetch" href="/assets/photoswipe.esm-060dc2da.js" as="script">
</head>
<body>
<div id="app"><!--[--><!--[--><!--[--><span tabindex="-1"></span><a href="#main-content" class="vp-skip-link sr-only">跳至主要內容</a><!--]--><div class="theme-container has-toc"><!--[--><header id="navbar" class="vp-navbar"><div class="vp-navbar-start"><button type="button" class="vp-toggle-sidebar-button" title="Toggle Sidebar"><span class="icon"></span></button><!--[--><!----><!--]--><!--[--><a class="vp-link vp-brand vp-brand" href="/"><img class="vp-nav-logo" src="/logo.svg" alt="我的简历"><!----><span class="vp-site-name hide-in-pad">我的简历</span></a><!--]--><!--[--><!----><!--]--></div><div class="vp-navbar-center"><!--[--><!----><!--]--><!--[--><nav class="vp-nav-links"><div class="nav-item hide-in-mobile"><a aria-label="主页" class="vp-link nav-link nav-link" href="/"><span class="font-icon icon fa-fw fa-sm fas fa-home" style=""></span>主页<!----></a></div><div class="nav-item hide-in-mobile"><a aria-label="个人简历" class="vp-link nav-link active nav-link active" href="/md/resume.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>个人简历<!----></a></div><div class="nav-item hide-in-mobile"><a aria-label="开发日志" class="vp-link nav-link nav-link" href="/md/dev-log/day01.html"><span class="font-icon icon fa-fw fa-sm fas fa-book" style=""></span>开发日志<!----></a></div></nav><!--]--><!--[--><!----><!--]--></div><div class="vp-navbar-end"><!--[--><!----><!--]--><!--[--><!----><div class="nav-item vp-repo"><a class="vp-repo-link" href="https://github.com/fuzhengwei/xfg-resume-blog" target="_blank" rel="noopener noreferrer" aria-label="GitHub"><svg xmlns="http://www.w3.org/2000/svg" class="icon github-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="github icon" style="width:1.25rem;height:1.25rem;vertical-align:middle;"><path d="M511.957 21.333C241.024 21.333 21.333 240.981 21.333 512c0 216.832 140.544 400.725 335.574 465.664 24.49 4.395 32.256-10.07 32.256-23.083 0-11.69.256-44.245 0-85.205-136.448 29.61-164.736-64.64-164.736-64.64-22.315-56.704-54.4-71.765-54.4-71.765-44.587-30.464 3.285-29.824 3.285-29.824 49.195 3.413 75.179 50.517 75.179 50.517 43.776 75.008 114.816 53.333 142.762 40.79 4.523-31.66 17.152-53.377 31.19-65.537-108.971-12.458-223.488-54.485-223.488-242.602 0-53.547 19.114-97.323 50.517-131.67-5.035-12.33-21.93-62.293 4.779-129.834 0 0 41.258-13.184 134.912 50.346a469.803 469.803 0 0 1 122.88-16.554c41.642.213 83.626 5.632 122.88 16.554 93.653-63.488 134.784-50.346 134.784-50.346 26.752 67.541 9.898 117.504 4.864 129.834 31.402 34.347 50.474 78.123 50.474 131.67 0 188.586-114.73 230.016-224.042 242.09 17.578 15.232 33.578 44.672 33.578 90.454v135.85c0 13.142 7.936 27.606 32.854 22.87C862.25 912.597 1002.667 728.747 1002.667 512c0-271.019-219.648-490.667-490.71-490.667z"></path></svg></a></div><div class="nav-item hide-in-mobile"><button type="button" id="appearance-switch"><svg xmlns="http://www.w3.org/2000/svg" class="icon auto-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="auto icon" style="display:block;"><path d="M512 992C246.92 992 32 777.08 32 512S246.92 32 512 32s480 214.92 480 480-214.92 480-480 480zm0-840c-198.78 0-360 161.22-360 360 0 198.84 161.22 360 360 360s360-161.16 360-360c0-198.78-161.22-360-360-360zm0 660V212c165.72 0 300 134.34 300 300 0 165.72-134.28 300-300 300z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" class="icon dark-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="dark icon" style="display:none;"><path d="M524.8 938.667h-4.267a439.893 439.893 0 0 1-313.173-134.4 446.293 446.293 0 0 1-11.093-597.334A432.213 432.213 0 0 1 366.933 90.027a42.667 42.667 0 0 1 45.227 9.386 42.667 42.667 0 0 1 10.24 42.667 358.4 358.4 0 0 0 82.773 375.893 361.387 361.387 0 0 0 376.747 82.774 42.667 42.667 0 0 1 54.187 55.04 433.493 433.493 0 0 1-99.84 154.88 438.613 438.613 0 0 1-311.467 128z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" class="icon light-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="light icon" style="display:none;"><path d="M952 552h-80a40 40 0 0 1 0-80h80a40 40 0 0 1 0 80zM801.88 280.08a41 41 0 0 1-57.96-57.96l57.96-58a41.04 41.04 0 0 1 58 58l-58 57.96zM512 752a240 240 0 1 1 0-480 240 240 0 0 1 0 480zm0-560a40 40 0 0 1-40-40V72a40 40 0 0 1 80 0v80a40 40 0 0 1-40 40zm-289.88 88.08-58-57.96a41.04 41.04 0 0 1 58-58l57.96 58a41 41 0 0 1-57.96 57.96zM192 512a40 40 0 0 1-40 40H72a40 40 0 0 1 0-80h80a40 40 0 0 1 40 40zm30.12 231.92a41 41 0 0 1 57.96 57.96l-57.96 58a41.04 41.04 0 0 1-58-58l58-57.96zM512 832a40 40 0 0 1 40 40v80a40 40 0 0 1-80 0v-80a40 40 0 0 1 40-40zm289.88-88.08 58 57.96a41.04 41.04 0 0 1-58 58l-57.96-58a41 41 0 0 1 57.96-57.96z"></path></svg></button></div><!----><!--]--><!--[--><!----><!--]--><button type="button" class="vp-toggle-navbar-button" aria-label="Toggle Navbar" aria-expanded="false" aria-controls="nav-screen"><span><span class="vp-top"></span><span class="vp-middle"></span><span class="vp-bottom"></span></span></button></div></header><!----><!--]--><!----><div class="toggle-sidebar-wrapper"><span class="arrow start"></span></div><aside id="sidebar" class="vp-sidebar"><!--[--><!----><!--]--><ul class="vp-sidebar-links"><li><!--[--><a aria-label="主页" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/"><span class="font-icon icon fa-fw fa-sm fas fa-home" style=""></span>主页<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><section class="vp-sidebar-group"><p class="vp-sidebar-heading"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span><span class="vp-sidebar-title">Lottery 项目开发日志</span><!----></p><ul class="vp-sidebar-links"><li><!--[--><a aria-label="Day01" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day01.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day01<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day02" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day02.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day02<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day03" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day03.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day03<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day04" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day04.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day04<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day05" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day05.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day05<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day06" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day06.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day06<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day07 ~ Day08" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day07~day08.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day07 ~ Day08<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day09 ~ Day10" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day09~day10.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day09 ~ Day10<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day011" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day11.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day011<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-label="Day012" class="vp-link nav-link vp-sidebar-link vp-sidebar-page nav-link vp-sidebar-link vp-sidebar-page" href="/md/dev-log/day12.html"><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>Day012<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li></ul></section></li></ul><!--[--><!----><!--]--></aside><!--[--><main id="main-content" class="vp-page"><!--[--><!----><!----><nav class="vp-breadcrumb disable"></nav><div class="vp-page-title"><h1><span class="font-icon icon fa-fw fa-sm fas fa-laptop-code" style=""></span>个人简历</h1><div class="page-info"><span class="page-author-info" aria-label="作者🖊" data-balloon-pos="down"><svg xmlns="http://www.w3.org/2000/svg" class="icon author-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="author icon"><path d="M649.6 633.6c86.4-48 147.2-144 147.2-249.6 0-160-128-288-288-288s-288 128-288 288c0 108.8 57.6 201.6 147.2 249.6-121.6 48-214.4 153.6-240 288-3.2 9.6 0 19.2 6.4 25.6 3.2 9.6 12.8 12.8 22.4 12.8h704c9.6 0 19.2-3.2 25.6-12.8 6.4-6.4 9.6-16 6.4-25.6-25.6-134.4-121.6-240-243.2-288z"></path></svg><span><a class="page-author-item" href="https://mister-hope.com" target="_blank" rel="noopener noreferrer">Mr.Hope</a></span><span property="author" content="Mr.Hope"></span></span><!----><!----><!----><span class="page-reading-time-info" aria-label="阅读时间⌛" data-balloon-pos="down"><svg xmlns="http://www.w3.org/2000/svg" class="icon timer-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="timer icon"><path d="M799.387 122.15c4.402-2.978 7.38-7.897 7.38-13.463v-1.165c0-8.933-7.38-16.312-16.312-16.312H256.33c-8.933 0-16.311 7.38-16.311 16.312v1.165c0 5.825 2.977 10.874 7.637 13.592 4.143 194.44 97.22 354.963 220.201 392.763-122.204 37.542-214.893 196.511-220.2 389.397-4.661 5.049-7.638 11.651-7.638 19.03v5.825h566.49v-5.825c0-7.379-2.849-13.981-7.509-18.9-5.049-193.016-97.867-351.985-220.2-389.527 123.24-37.67 216.446-198.453 220.588-392.892zM531.16 450.445v352.632c117.674 1.553 211.787 40.778 211.787 88.676H304.097c0-48.286 95.149-87.382 213.728-88.676V450.445c-93.077-3.107-167.901-81.297-167.901-177.093 0-8.803 6.99-15.793 15.793-15.793 8.803 0 15.794 6.99 15.794 15.793 0 80.261 63.69 145.635 142.01 145.635s142.011-65.374 142.011-145.635c0-8.803 6.99-15.793 15.794-15.793s15.793 6.99 15.793 15.793c0 95.019-73.789 172.82-165.96 177.093z"></path></svg><span>大约 9 分钟</span><meta property="timeRequired" content="PT9M"></span><span class="page-category-info" aria-label="分类🌈" data-balloon-pos="down"><svg xmlns="http://www.w3.org/2000/svg" class="icon category-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="category icon"><path d="M148.41 106.992h282.176c22.263 0 40.31 18.048 40.31 40.31V429.48c0 22.263-18.047 40.31-40.31 40.31H148.41c-22.263 0-40.311-18.047-40.311-40.31V147.302c0-22.263 18.048-40.31 40.311-40.31zM147.556 553.478H429.73c22.263 0 40.311 18.048 40.311 40.31v282.176c0 22.263-18.048 40.312-40.31 40.312H147.555c-22.263 0-40.311-18.049-40.311-40.312V593.79c0-22.263 18.048-40.311 40.31-40.311zM593.927 106.992h282.176c22.263 0 40.31 18.048 40.31 40.31V429.48c0 22.263-18.047 40.31-40.31 40.31H593.927c-22.263 0-40.311-18.047-40.311-40.31V147.302c0-22.263 18.048-40.31 40.31-40.31zM730.22 920.502H623.926c-40.925 0-74.22-33.388-74.22-74.425V623.992c0-41.038 33.387-74.424 74.425-74.424h222.085c41.038 0 74.424 33.226 74.424 74.067v114.233c0 10.244-8.304 18.548-18.547 18.548s-18.548-8.304-18.548-18.548V623.635c0-20.388-16.746-36.974-37.33-36.974H624.13c-20.585 0-37.331 16.747-37.331 37.33v222.086c0 20.585 16.654 37.331 37.126 37.331H730.22c10.243 0 18.547 8.304 18.547 18.547 0 10.244-8.304 18.547-18.547 18.547z"></path></svg><!--[--><span class="page-category-item category0" role>自我介绍</span><span class="page-category-item category7" role>专业技能</span><span class="page-category-item category8" role>项目经验</span><!--]--><meta property="articleSection" content="自我介绍,专业技能,项目经验"></span><!----></div><hr></div><div class="toc-place-holder"><aside id="toc"><!--[--><!----><!--]--><div class="toc-header">此页内容<button type="button" class="print-button" title="打印"><svg xmlns="http://www.w3.org/2000/svg" class="icon print-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="print icon"><path d="M819.2 364.8h-44.8V128c0-17.067-14.933-32-32-32H281.6c-17.067 0-32 14.933-32 32v236.8h-44.8C145.067 364.8 96 413.867 96 473.6v192c0 59.733 49.067 108.8 108.8 108.8h44.8V896c0 17.067 14.933 32 32 32h460.8c17.067 0 32-14.933 32-32V774.4h44.8c59.733 0 108.8-49.067 108.8-108.8v-192c0-59.733-49.067-108.8-108.8-108.8zM313.6 160h396.8v204.8H313.6V160zm396.8 704H313.6V620.8h396.8V864zM864 665.6c0 25.6-19.2 44.8-44.8 44.8h-44.8V588.8c0-17.067-14.933-32-32-32H281.6c-17.067 0-32 14.933-32 32v121.6h-44.8c-25.6 0-44.8-19.2-44.8-44.8v-192c0-25.6 19.2-44.8 44.8-44.8h614.4c25.6 0 44.8 19.2 44.8 44.8v192z"></path></svg></button></div><div class="toc-wrapper"><ul class="toc-list"><!--[--><li class="toc-item"><a class="vp-link toc-link level2 toc-link level2" href="/#个人信息">个人信息</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level2 toc-link level2" href="/#毕业院校">毕业院校</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level2 toc-link level2" href="/#专业技能">专业技能</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level2 toc-link level2" href="/#工作经历【在校生无】">工作经历【在校生无】</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level2 toc-link level2" href="/#项目经验">项目经验</a></li><li><ul class="toc-list"><!--[--><li class="toc-item"><a class="vp-link toc-link level3 toc-link level3" href="/#_1-营销活动平台-lottery-微服务抽奖系统">1. 营销活动平台 - Lottery 微服务抽奖系统</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3 toc-link level3" href="/#_2-手写-mybatis">2. 手写 MyBatis</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3 toc-link level3" href="/#_3-openai-应用服务-辅助工作提效工具开发">3. OpenAI 应用服务 - 辅助工作提效工具开发</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3 toc-link level3" href="/#_4-服务治理-springboot-中间件">4. 服务治理 SpringBoot 中间件</a></li><!----><!--]--></ul></li><!--]--></ul><div class="toc-marker" style="top:-1.7rem;"></div></div><!--[--><!----><!--]--></aside></div><!----><div class="theme-hope-content"><h2 id="个人信息" tabindex="-1"><a class="header-anchor" href="#个人信息" aria-hidden="true">#</a> 个人信息</h2><ul><li>姓名</li><li>电话</li><li>邮箱</li><li>毕业时间</li><li>工作时间</li><li>Github:https://github.com/fuzhengwei</li><li>开源项目:<a href="https://bugstack.cn/md/product/idea-plugin/vo2dto.html" target="_blank" rel="noopener noreferrer">vo2dto<span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">open in new window</span></span></a> - IDEA Plugin 自动转换对象插件,5.4k 下载使用</li></ul><h2 id="毕业院校" tabindex="-1"><a class="header-anchor" href="#毕业院校" aria-hidden="true">#</a> 毕业院校</h2><ul><li>时间、院校、专业、学位</li><li>荣誉、成绩</li></ul><h2 id="专业技能" tabindex="-1"><a class="header-anchor" href="#专业技能" aria-hidden="true">#</a> 专业技能</h2><ul><li>熟练掌握 Java 核心知识、JUC、HashMap、斐波那契散列等,具备良好的面向对象编程思想。</li><li>熟练掌握 Java 设计模式,如工厂、代理、组合、策略等设计模式,并善用设计原则构建可复用代码。</li><li>熟练使用 IDEA、Eclipse、Visual Studio Code、Navicat、PostMan、Git、Maven、SVN 等开发工具。</li><li>深入理解 JVM 底层原理,熟悉 JVM 各类垃圾收集器的使用及核心参数的调优,具备一定的 JVM 调优能力。</li><li><code>深入学习 Spring 核心流程模块,如IOC、AOP、依赖倒置等,掌握Spring解决复杂场景所需的分治、抽象和知识(设计模式、设计原则),能从核心原理上解决Spring场景问题。同时,具备基于 Spring 开发 SpringBoot Starter 的技能,减少研发成本,为复杂项目提供通用技术组件。</code></li><li><code>深入学习 MyBatis 核心流程模块,包括会话、反射、代理、事务和插件,熟练掌握 ORM 框架的设计思想、实现方式和应用价值。并根据需求结合 MyBatis 插件机制,开发企业所需的功能,如数据分页、数据库表路由、监控日志和数据安全等。</code></li><li>深入理解 Spring Boot,Spring Cloud 等微服务框架的设计原理及底层架构,熟悉各种微服务架构设计比如服务注册与发现,服务降级,限流,熔断,服务网关路由设计,服务安全认证架构。</li><li>熟悉 Dubbo、Zookeeper 等分布式服务协调与治理等技术。</li><li>熟练掌握 MySql,掌握 MySQL 主从同步,读写分离技术以及集群的搭建,具备一定的 SQL 调优能力。</li><li>深入理解 Redis 线程模型,熟练掌握 Redis 的核心数据结构的使用场景,熟悉各种缓存高并发的使用场景,比如缓存雪崩,缓存穿透等。</li><li>熟练掌握分布式场景中的常见的技术问题及解决,比如分布式锁,分布式事务,分布式 session,分布式任务调度。</li><li>熟悉 RabbitMQ、Kafka 等常用的消息中间件进行消息的异步数据处理。</li><li>了解分布式搜索引擎 ElasticSearch,并能基于 ELK+Kafka 搭建分布式日志收集系统,以及 x-pack-jdbc 的扩展使用。</li><li>熟悉 docker 常用命令,能够实现基于 docker+Jenkins 实现自动化部署</li><li>掌握 Linux 常用命令,了解 Nginx 服务器的反向代理、负载均衡、动静分离等。</li><li>熟练运用 DDD 四层架构领域驱动设计,构建出易于迭代和维护的工程架构,遵守整洁代码、洋葱架构设计思想。</li></ul><h2 id="工作经历【在校生无】" tabindex="-1"><a class="header-anchor" href="#工作经历【在校生无】" aria-hidden="true">#</a> 工作经历【在校生无】</h2><ul><li>公司</li><li>岗位</li><li>时间</li><li>职责【可选】</li><li>成绩【可选】</li></ul><h2 id="项目经验" tabindex="-1"><a class="header-anchor" href="#项目经验" aria-hidden="true">#</a> 项目经验</h2><h3 id="_1-营销活动平台-lottery-微服务抽奖系统" tabindex="-1"><a class="header-anchor" href="#_1-营销活动平台-lottery-微服务抽奖系统" aria-hidden="true">#</a> 1. 营销活动平台 - Lottery 微服务抽奖系统</h3><ul><li>系统架构:以 DDD 领域驱动设计开发,微服务拆分的分布式系统架构</li><li>核心技术:SpringBoot、MyBatis、Dubbo、MQ、MySQL、XDB-Router、ES、ZK</li><li>项目描述:抽奖系统是营销平台的重要微服务之一,可以满足 C 端人群的需求,例如拉新、促活、留存等。该系统运用抽象、分治和 DDD 知识,拆解服务边界,凝练领域服务功能。围绕抽奖服务建设领域服务,包括规则引擎、抽奖策略、活动玩法、奖品发放等。这可以满足业务产品快速迭代上线的需求,同时减少研发成本,提高交付效率。</li><li>核心职责: <ul><li>【高级】构建以 DDD 分层结构的处理方式,搭建整个抽奖系统架构。运用设计原则和工厂、代理、模板、组合、策略等设计模式的综合使用,搭建易于维护和迭代的系统工程。</li><li>【高级】鉴于系统内有较多的规则策略过滤,包括准入、人群、风控、A/BTest等需求,为适应系统规模可快速开发和使用的方式,搭建了去中心化的量化人群规则引擎组件。通过业务需求对逻辑的扩展和内置引擎执行器的使用,完成自由组合的人群过滤服务。这降低了共性功能重复开发所带来的成本问题,并提高了研发效率。</li><li>【高级】根据实际秒杀峰值场景 <code>TPS 5000 ~ 8000</code> 的需求,开发了统一路由组件。该组件不仅可以满足差异化不同字段的分库分表组合,还支持 Redis 库存分片和秒杀滑动库存分块。而且,开发了统一路由 XDB-Router 的 SpringBoot Starter 技术组件。该套组件已经经历了多次大促活动场景的考验,支持横向扩展,可以满足业务规模的快速增长。</li><li>【简单】运用模板、策略、工厂三个设计模式,定义抽奖过程标准和实现对应的多类型抽奖的服务模块。</li><li>【简单】因活动秒杀的并发场景,将秒杀从最开始的数据库行级锁优化为Redis Key 加锁,又从 Redis Key 的独占锁,优化为滑块锁。优化后整体秒杀有了非常可观的性能提升。</li><li>【简单】解耦抽奖流程,把抽奖和发奖用MQ消息串联起来,避免一个流程太长,导致用户一直等待。</li></ul></li></ul><h3 id="_2-手写-mybatis" tabindex="-1"><a class="header-anchor" href="#_2-手写-mybatis" aria-hidden="true">#</a> 2. 手写 MyBatis</h3><ul><li>项目架构:Object Relational Mapping</li><li>项目描述:MyBatis 是 Java 应用编程开发中,非常常用的技术框架。需要较深入的学习和使用,具备 MyBatis 插件开发能力,解决日常场景问题。才能更好更高效的工作。为此,深度学习了《手写MyBatis:渐进式源码实践》一书,完整实现了一个 MyBatis ORM 框架。技术积累颇深,提高了设计思维和编码能力。</li><li>个人收获: <ul><li>首先学习到为什么日常使用 MyBatis 时,可以仅提供 IDao 接口,就可以关联对应配置的SQL语句,完成数据库操作。这是因为做了代理与映射,封装调用逻辑到 SqlSession 会话功能实现中。</li><li>掌握了数10种设计模式的运用,其中感触最大的是 MyBatis 如何管理多边服务的设计。如创建会话模型,统一调度执行器使用和数据的封装,并把这些复杂的操作,通过 SqlSessionFactory 工厂统一对外提供 SqlSession 服务。</li><li>彻底了解并掌握了 MyBatis Plugin 设计模型,这个技术可以让我基于 MyBatis 做出日志监控、库表路由、字段加解密等操作。为以后编程工作,提供更多的解决方案。</li><li>除此之外,还有一级缓存、二级缓存的装饰器模式使用,MyBatis 开发后与 Spring、SpringBoot 整合的实现,让我对 MyBatis 的全体系开发流程和对应的技术整合,已经非常清晰,便于以后应用和从根上快速排查解决问题,并给出合理的技术方案。</li></ul></li></ul><h3 id="_3-openai-应用服务-辅助工作提效工具开发" tabindex="-1"><a class="header-anchor" href="#_3-openai-应用服务-辅助工作提效工具开发" aria-hidden="true">#</a> 3. OpenAI 应用服务 - 辅助工作提效工具开发</h3><ul><li>项目架构:微服务架构设计,OpenAI-SDK 多模型组件【ChatGLM、ChatGPT】、DDD 应用服务API封装、WEB REACT 前端界面【按需编写】</li><li>核心技术:SpringBoot、MyBatis、Redis/Guava、OKHttp3、OpenAI 大模型【可对接ChatGLM、腾讯混元等】、React、TypeScript</li><li>项目描述:此项目以应用OpenAI技术,对接多种大模型提供生成式服务,为XXX场景提效。项目的架构设计实现以微服务进行拆分,涵盖;OpenAI-SDK、OpenAI-API、公众号鉴权、企业支付【暂时申请中,如果你对接了可以写】等。并以模块化设计,积木式构建应用,让不同的场景诉求都可以配置化对接。</li><li>核心职责: <ul><li>首先这是我们xxx公司/实践/实训的第一个OpenAI项目,后续势必会有更多的场景以不同的方式接入。包括 SDK 独立接入、API 接口接入、MQ 消息接入,以及使用提供好的服务类接入。所以在这部分设计的时候,我采用了微服务的架构设计,按照职责边界进行拆分设计。</li><li>采用 DDD 架构 API,以及便于不同领域模块的独立设计,一个领域就是一个功能域。在功能域中提供模型、仓储、事件、服务。这样可以更好扩展。</li><li>鉴于生成式服务的文本生成可能会有不可靠信息,所以对这部分内容添加了敏感词的过滤。并可根据不同场景选择不同范围的敏感词处理。</li><li>OpenAI 大模型有多种,这部分在架构上设计独立的 SDK,在实现上采用了 Session 会话模型进行处理,以及通过工厂处理服务。在细节对上,采用了 OKHttp3 框架完成模型对接,这样的方式更好扩展,代码也更易于维护。</li><li>在整套工程的设计实现中,采用了较多的分治、抽象的思想和设计模式和设计原则知识的运用,来解决各类场景问题。</li><li>对接微信扫码支付,完成从商品库、下单支付、异步发货、掉单补偿等核心流程实现。让用户可以在线购买对话额度。</li><li>注意:你还可以根据项目中提到的各类技术和章节,来编写你的职责。</li></ul></li></ul><h3 id="_4-服务治理-springboot-中间件" tabindex="-1"><a class="header-anchor" href="#_4-服务治理-springboot-中间件" aria-hidden="true">#</a> 4. 服务治理 SpringBoot 中间件</h3><ul><li>系统架构:SpringBoot Starter 组件开发</li><li>核心技术:熔断、降级、限流、切量、白名单、人群控制</li><li>项目描述:该SpringBoot Starter中间件实现了熔断、降级、限流、切量、白名单等服务治理功能,减少了开发工作量和出错风险。利用SpringBoot的自动化配置机制简化了集成和使用,并提供了可扩展接口,以满足不同场景的需求。</li><li>核心职责: <ul><li>鉴于组内同类需求的重复开发,设计并实现服务治理 SpringBoot Starter 中间件,提高开发效率和降低重复开发成本。 该中间件的核心功能包括服务治理中的熔断、降级、限流、切量和白名单等。</li><li>通过利用SpringBoot的自动化配置机制,该中间件可以简化集成和使用,同时提供足够的配置选项以满足不同场景的需求。</li><li>此外,该中间件还提供了可扩展的接口,方便用户根据自身需求扩展功能,从而更好地满足不同的业务需求。</li></ul></li></ul></div><!----><footer class="page-meta"><div class="meta-item edit-link"><a href="https://github.com/fuzhengwei/xfg-resume-blog/edit/main/src/md/resume.md" rel="noopener noreferrer" target="_blank" aria-label="在 GitHub 上编辑此页" class="nav-link label"><!--[--><svg xmlns="http://www.w3.org/2000/svg" class="icon edit-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="edit icon"><path d="M430.818 653.65a60.46 60.46 0 0 1-50.96-93.281l71.69-114.012 7.773-10.365L816.038 80.138A60.46 60.46 0 0 1 859.225 62a60.46 60.46 0 0 1 43.186 18.138l43.186 43.186a60.46 60.46 0 0 1 0 86.373L588.879 565.55l-8.637 8.637-117.466 68.234a60.46 60.46 0 0 1-31.958 11.229z"></path><path d="M728.802 962H252.891A190.883 190.883 0 0 1 62.008 771.98V296.934a190.883 190.883 0 0 1 190.883-192.61h267.754a60.46 60.46 0 0 1 0 120.92H252.891a69.962 69.962 0 0 0-69.098 69.099V771.98a69.962 69.962 0 0 0 69.098 69.098h475.911A69.962 69.962 0 0 0 797.9 771.98V503.363a60.46 60.46 0 1 1 120.922 0V771.98A190.883 190.883 0 0 1 728.802 962z"></path></svg><!--]-->在 GitHub 上编辑此页<span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">open in new window</span></span><!----></a></div><div class="meta-item git-info"><!----><!----></div></footer><!----><!----><!----><!--]--></main><!--]--><footer class="vp-footer-wrapper"><div class="vp-footer">我的微信:fustack</div><div class="vp-copyright">Copyright © 2024 Mr.Hope</div></footer></div><!--]--><!----><!--]--></div>
<script type="module" src="/assets/app-89848b6d.js" defer></script>
</body>
</html>
User-agent:*
Disallow:
Sitemap: https://vuepress-theme-hope-docs-demo.netlify.app/sitemap.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/sitemap.xsl"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:news="http://www.google.com/schemas/sitemap-news/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns:video="http://www.google.com/schemas/sitemap-video/1.1"><url><loc>https://vuepress-theme-hope-docs-demo.netlify.app/</loc><changefreq>daily</changefreq></url><url><loc>https://vuepress-theme-hope-docs-demo.netlify.app/slides.html</loc><changefreq>daily</changefreq></url><url><loc>https://vuepress-theme-hope-docs-demo.netlify.app/md/resume.html</loc><changefreq>daily</changefreq></url><url><loc>https://vuepress-theme-hope-docs-demo.netlify.app/md/dev-log/</loc><changefreq>daily</changefreq></url><url><loc>https://vuepress-theme-hope-docs-demo.netlify.app/md/dev-log/day01.html</loc><changefreq>daily</changefreq></url><url><loc>https://vuepress-theme-hope-docs-demo.netlify.app/md/dev-log/day02.html</loc><changefreq>daily</changefreq></url><url><loc>https://vuepress-theme-hope-docs-demo.netlify.app/md/dev-log/day03.html</loc><changefreq>daily</changefreq></url><url><loc>https://vuepress-theme-hope-docs-demo.netlify.app/md/dev-log/day04.html</loc><changefreq>daily</changefreq></url><url><loc>https://vuepress-theme-hope-docs-demo.netlify.app/md/dev-log/day05.html</loc><changefreq>daily</changefreq></url><url><loc>https://vuepress-theme-hope-docs-demo.netlify.app/md/dev-log/day06.html</loc><changefreq>daily</changefreq></url><url><loc>https://vuepress-theme-hope-docs-demo.netlify.app/md/dev-log/day07~day08.html</loc><changefreq>daily</changefreq></url><url><loc>https://vuepress-theme-hope-docs-demo.netlify.app/md/dev-log/day09~day10.html</loc><changefreq>daily</changefreq></url><url><loc>https://vuepress-theme-hope-docs-demo.netlify.app/md/dev-log/day11.html</loc><changefreq>daily</changefreq></url><url><loc>https://vuepress-theme-hope-docs-demo.netlify.app/md/dev-log/day12.html</loc><changefreq>daily</changefreq></url></urlset>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
xmlns:html="http://www.w3.org/TR/REC-html40"
xmlns:sitemap="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" version="1.0" encoding="UTF-8" indent="yes" />
<xsl:template match="/">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>XML Sitemap</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style type="text/css">
body {
font-size: 14px;
}
a {
color: inherit;
}
table {
width: 100%;
border-radius: 8px;
border-collapse: collapse;
overflow: hidden;
text-align: center;
}
caption {
font-weight: bold;
font-size: 1.5rem;
line-height: 2;
}
th {
min-width: 56px;
padding: 8px;
background-color: #41b883;
color: #fff;
font-weight: bold;
font-size: 16px;
}
@media (max-width: 719px) {
th {
font-size: 14px;
}
}
th:first-child {
text-align: start;
}
tr:nth-child(even) {
background-color: #f2f2f2;
}
tr:hover {
background-color: #e8e8e8;
}
td {
padding: 4px;
font-size: 14px;
}
@media (max-width: 719px) {
td {
font-size: 12px;
}
}
td:first-child {
text-align: start;
}
footer {
margin-top: 10px;
padding: 4px;
color: grey;
font-size: 12px;
text-align: center;
}
</style>
</head>
<body>
<h1>XML Sitemap</h1>
<div id="content">
<table>
<caption>URLs list</caption>
<thead>
<tr>
<th>
<xsl:value-of select="concat('URL (', count(sitemap:urlset/sitemap:url), ')')" />
</th>
<th>Priority</th>
<th>Change Frequency</th>
<th>Last Updated Time</th>
</tr>
</thead>
<tbody>
<xsl:variable name="lower" select="'abcdefghijklmnopqrstuvwxyz'" />
<xsl:variable name="upper" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" />
<xsl:for-each select="sitemap:urlset/sitemap:url">
<tr>
<td>
<xsl:variable name="itemURL">
<xsl:value-of select="sitemap:loc" />
</xsl:variable>
<a href="{$itemURL}">
<xsl:value-of select="sitemap:loc" />
</a>
</td>
<td>
<xsl:choose>
<xsl:when test="sitemap:priority">
<xsl:value-of select="concat(sitemap:priority*100,'%a')" />
</xsl:when>
<xsl:otherwise>
<xsl:text>0.5</xsl:text>
</xsl:otherwise>
</xsl:choose>
</td>
<td>
<xsl:choose>
<xsl:when test="sitemap:changefreq">
<xsl:value-of select="concat(translate(substring(sitemap:changefreq, 1, 1),concat($lower, $upper),concat($upper, $lower)),substring(sitemap:changefreq, 2))" />
</xsl:when>
<xsl:otherwise>
<xsl:text>-</xsl:text>
</xsl:otherwise>
</xsl:choose>
</td>
<td>
<xsl:value-of select="concat(substring(sitemap:lastmod,0,11),concat(' ', substring(sitemap:lastmod,12,5)))" />
</td>
</tr>
</xsl:for-each>
</tbody>
</table>
</div>
<footer>
Generatd by <a href="https://plugin-sitemap2.vuejs.press">vuepress-plugin-sitemap2</a>
</footer>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
<!doctype html>
<html lang="zh-CN" data-theme="light">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<meta name="generator" content="VuePress 2.0.0-beta.67" />
<meta name="theme" content="VuePress Theme Hope" />
<meta property="og:url" content="https://vuepress-theme-hope-docs-demo.netlify.app/slides.html"><meta property="og:site_name" content="我的简历"><meta property="og:title" content="幻灯片页"><meta property="og:description" content="slidestart 幻灯片演示 一个简单的幻灯片演示与各种小贴士。 作者 Mr.Hope. 请滚动鼠标滚轮进入下一页 标注幻灯片 👇 (#/1/1) -- 标注幻灯片 使用 --- 标注水平幻灯片 在水平幻灯片中使用 -- 分割垂直幻灯片 使用 在幻灯片上添加属性 使用 在前一个 HTML 元素上添加属性 Markdown 你可以在幻灯片中使用 M..."><meta property="og:type" content="article"><meta property="og:locale" content="zh-CN"><meta property="article:author" content="Mr.Hope"><script type="application/ld+json">{"@context":"https://schema.org","@type":"Article","headline":"幻灯片页","image":[""],"dateModified":null,"author":[{"@type":"Person","name":"Mr.Hope","url":"https://mister-hope.com"}]}</script><title>幻灯片页 | 我的简历</title><meta name="description" content="slidestart 幻灯片演示 一个简单的幻灯片演示与各种小贴士。 作者 Mr.Hope. 请滚动鼠标滚轮进入下一页 标注幻灯片 👇 (#/1/1) -- 标注幻灯片 使用 --- 标注水平幻灯片 在水平幻灯片中使用 -- 分割垂直幻灯片 使用 在幻灯片上添加属性 使用 在前一个 HTML 元素上添加属性 Markdown 你可以在幻灯片中使用 M...">
<style>
:root {
--bg-color: #fff;
}
html[data-theme="dark"] {
--bg-color: #1d1e1f;
}
html,
body {
background: var(--bg-color);
}
</style>
<script>
const userMode = localStorage.getItem("vuepress-theme-hope-scheme");
const systemDarkMode =
window.matchMedia &&
window.matchMedia("(prefers-color-scheme: dark)").matches;
if (userMode === "dark" || (userMode !== "light" && systemDarkMode)) {
document.documentElement.setAttribute("data-theme", "dark");
}
</script>
<link rel="preload" href="/assets/style-e1af0ae0.css" as="style"><link rel="stylesheet" href="/assets/style-e1af0ae0.css">
<link rel="modulepreload" href="/assets/app-89848b6d.js"><link rel="modulepreload" href="/assets/slides.html-73aa899b.js"><link rel="modulepreload" href="/assets/plugin-vue_export-helper-c27b6911.js"><link rel="modulepreload" href="/assets/slides.html-e24915cf.js"><link rel="prefetch" href="/assets/index.html-3ddb8fc8.js" as="script"><link rel="prefetch" href="/assets/resume.html-63219902.js" as="script"><link rel="prefetch" href="/assets/index.html-ee414c74.js" as="script"><link rel="prefetch" href="/assets/day01.html-96303a92.js" as="script"><link rel="prefetch" href="/assets/day02.html-bc6452cb.js" as="script"><link rel="prefetch" href="/assets/day03.html-faf19961.js" as="script"><link rel="prefetch" href="/assets/day04.html-f1431c14.js" as="script"><link rel="prefetch" href="/assets/day05.html-e1b66f43.js" as="script"><link rel="prefetch" href="/assets/day06.html-694a0d7d.js" as="script"><link rel="prefetch" href="/assets/day07~day08.html-623b7865.js" as="script"><link rel="prefetch" href="/assets/day09~day10.html-f64b96c2.js" as="script"><link rel="prefetch" href="/assets/day11.html-a02521a7.js" as="script"><link rel="prefetch" href="/assets/day12.html-59d9b776.js" as="script"><link rel="prefetch" href="/assets/404.html-a12454c5.js" as="script"><link rel="prefetch" href="/assets/index.html-38735195.js" as="script"><link rel="prefetch" href="/assets/index.html-72fa7116.js" as="script"><link rel="prefetch" href="/assets/resume.html-0d5e8b6f.js" as="script"><link rel="prefetch" href="/assets/index.html-604f9d5c.js" as="script"><link rel="prefetch" href="/assets/day01.html-f34d072c.js" as="script"><link rel="prefetch" href="/assets/day02.html-faf555eb.js" as="script"><link rel="prefetch" href="/assets/day03.html-f3141bb2.js" as="script"><link rel="prefetch" href="/assets/day04.html-61a7012e.js" as="script"><link rel="prefetch" href="/assets/day05.html-4698622b.js" as="script"><link rel="prefetch" href="/assets/day06.html-a4c2781d.js" as="script"><link rel="prefetch" href="/assets/day07~day08.html-4e5d7c48.js" as="script"><link rel="prefetch" href="/assets/day09~day10.html-ee1cb17c.js" as="script"><link rel="prefetch" href="/assets/day11.html-13381d55.js" as="script"><link rel="prefetch" href="/assets/day12.html-4bed2fb6.js" as="script"><link rel="prefetch" href="/assets/404.html-4d74dcf3.js" as="script"><link rel="prefetch" href="/assets/index.html-f3051275.js" as="script"><link rel="prefetch" href="/assets/photoswipe.esm-060dc2da.js" as="script">
</head>
<body>
<div id="app"><!--[--><!----><!----><!--]--></div>
<script type="module" src="/assets/app-89848b6d.js" defer></script>
</body>
</html>
172.18.0.1 - - [30/Jan/2024:06:32:14 +0000] "GET / HTTP/1.1" 200 30821 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:32:14 +0000] "GET /json-viewer/jquery.json-viewer.css HTTP/1.1" 200 1080 "http://0.0.0.0/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:32:14 +0000] "GET /css/default.css HTTP/1.1" 200 7446 "http://0.0.0.0/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:32:14 +0000] "GET /jstree/themes/default/style.min.css HTTP/1.1" 200 27353 "http://0.0.0.0/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:32:14 +0000] "GET /clipboard/clipboard.min.js HTTP/1.1" 200 9034 "http://0.0.0.0/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:32:14 +0000] "GET /scripts/jquery-2.2.4.js HTTP/1.1" 200 85578 "http://0.0.0.0/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:32:14 +0000] "GET /bootstrap/css/bootstrap.css HTTP/1.1" 200 127343 "http://0.0.0.0/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:32:15 +0000] "GET /scripts/jquery.resize.min.js HTTP/1.1" 200 1098 "http://0.0.0.0/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:32:15 +0000] "GET /json-viewer/jquery.json-viewer.js HTTP/1.1" 200 5834 "http://0.0.0.0/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:32:15 +0000] "GET /scripts/ejs.min.js HTTP/1.1" 200 23632 "http://0.0.0.0/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:32:15 +0000] "GET /dateformat/dateformat.js HTTP/1.1" 200 7100 "http://0.0.0.0/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:32:15 +0000] "GET /scripts/binaryView.js HTTP/1.1" 200 3231 "http://0.0.0.0/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:32:15 +0000] "GET /scripts/browserify.js HTTP/1.1" 200 94260 "http://0.0.0.0/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:32:15 +0000] "GET /scripts/redisCommander.js HTTP/1.1" 200 57642 "http://0.0.0.0/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:32:15 +0000] "GET /images/RedisCommandLogo.png HTTP/1.1" 200 6082 "http://0.0.0.0/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:32:15 +0000] "GET /bootstrap/js/bootstrap.js HTTP/1.1" 200 61884 "http://0.0.0.0/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:32:15 +0000] "GET /jstree/jstree.js HTTP/1.1" 200 307794 "http://0.0.0.0/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:32:16 +0000] "POST /signin HTTP/1.1" 200 12 "http://0.0.0.0/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:32:16 +0000] "GET /bootstrap/img/glyphicons-halflings.png HTTP/1.1" 200 12799 "http://0.0.0.0/bootstrap/css/bootstrap.css" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:32:16 +0000] "GET /bootstrap/img/glyphicons-halflings-white.png HTTP/1.1" 200 8777 "http://0.0.0.0/bootstrap/css/bootstrap.css" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:32:16 +0000] "GET /favicon.png HTTP/1.1" 200 3550 "http://0.0.0.0/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:00 +0000] "GET / HTTP/1.1" 200 15882 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:00 +0000] "GET /assets/style-e1af0ae0.css HTTP/1.1" 200 130662 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:00 +0000] "GET /assets/app-186445af.js HTTP/1.1" 200 237430 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:00 +0000] "GET /assets/index.html-965b98ac.js HTTP/1.1" 200 1438 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:00 +0000] "GET /assets/plugin-vue_export-helper-c27b6911.js HTTP/1.1" 200 91 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:00 +0000] "GET /assets/index.html-26e5bbc7.js HTTP/1.1" 200 4290 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:00 +0000] "GET /logo.svg HTTP/1.1" 200 7788 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:00 +0000] "GET /assets/resume.html-63219902.js HTTP/1.1" 200 2901 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:00 +0000] "GET /assets/day03.html-faf19961.js HTTP/1.1" 200 2340 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:00 +0000] "GET /assets/day02.html-bc6452cb.js HTTP/1.1" 200 2266 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:00 +0000] "GET /assets/day01.html-96303a92.js HTTP/1.1" 200 2206 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:00 +0000] "GET /assets/day04.html-f1431c14.js HTTP/1.1" 200 2249 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:00 +0000] "GET /assets/slides.html-e24915cf.js HTTP/1.1" 200 5280 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:00 +0000] "GET /assets/day07~day08.html-623b7865.js HTTP/1.1" 200 2305 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:00 +0000] "GET /assets/day06.html-694a0d7d.js HTTP/1.1" 200 2145 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:00 +0000] "GET /assets/index.html-ee414c74.js HTTP/1.1" 200 1180 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:00 +0000] "GET /assets/day11.html-a02521a7.js HTTP/1.1" 200 2124 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:00 +0000] "GET /assets/day12.html-59d9b776.js HTTP/1.1" 200 2292 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:00 +0000] "GET /assets/404.html-a12454c5.js HTTP/1.1" 200 726 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:00 +0000] "GET /assets/day05.html-e1b66f43.js HTTP/1.1" 200 2262 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:00 +0000] "GET /assets/resume.html-5cfcd916.js HTTP/1.1" 200 12357 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:00 +0000] "GET /assets/slides.html-bedae67d.js HTTP/1.1" 200 17320 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:00 +0000] "GET /assets/day09~day10.html-f64b96c2.js HTTP/1.1" 200 2194 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:00 +0000] "GET /assets/day01.html-6f75ed4c.js HTTP/1.1" 200 10815 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:00 +0000] "GET /assets/day02.html-4dc294c0.js HTTP/1.1" 200 4390 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:00 +0000] "GET /assets/index.html-38735195.js HTTP/1.1" 200 806 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:00 +0000] "GET /assets/day04.html-95ecbdaf.js HTTP/1.1" 200 2358 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:00 +0000] "GET /assets/day03.html-ad5c77d7.js HTTP/1.1" 200 845482 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:00 +0000] "GET /assets/day06.html-b06c4aa9.js HTTP/1.1" 200 4827 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:00 +0000] "GET /assets/index.html-c7fbbb93.js HTTP/1.1" 200 397 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:00 +0000] "GET /assets/day09~day10.html-d816a6aa.js HTTP/1.1" 200 3347 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:00 +0000] "GET /assets/day11.html-c41ca19f.js HTTP/1.1" 200 1674 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:00 +0000] "GET /assets/day12.html-7eccb79b.js HTTP/1.1" 200 8209 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:00 +0000] "GET /assets/day05.html-ca20845f.js HTTP/1.1" 200 8207 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:00 +0000] "GET /assets/day07~day08.html-ced4d973.js HTTP/1.1" 200 3568 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:00 +0000] "GET /assets/index.html-eb2052a0.js HTTP/1.1" 200 275 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:00 +0000] "GET /assets/404.html-5bc9882c.js HTTP/1.1" 200 222 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:00 +0000] "GET /assets/photoswipe.esm-060dc2da.js HTTP/1.1" 200 60365 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:00 +0000] "GET /favicon.ico HTTP/1.1" 200 67646 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:43 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:43 +0000] "GET /assets/style-e1af0ae0.css HTTP/1.1" 304 0 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:43 +0000] "GET /logo.svg HTTP/1.1" 304 0 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:43 +0000] "GET /assets/plugin-vue_export-helper-c27b6911.js HTTP/1.1" 304 0 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:43 +0000] "GET /assets/app-186445af.js HTTP/1.1" 304 0 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:43 +0000] "GET /assets/index.html-26e5bbc7.js HTTP/1.1" 304 0 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:43 +0000] "GET /assets/index.html-965b98ac.js HTTP/1.1" 304 0 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:43 +0000] "GET /assets/resume.html-63219902.js HTTP/1.1" 304 0 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:43 +0000] "GET /assets/index.html-ee414c74.js HTTP/1.1" 304 0 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:43 +0000] "GET /assets/day02.html-bc6452cb.js HTTP/1.1" 304 0 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:43 +0000] "GET /assets/slides.html-e24915cf.js HTTP/1.1" 304 0 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:43 +0000] "GET /assets/day01.html-96303a92.js HTTP/1.1" 304 0 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:43 +0000] "GET /assets/day03.html-faf19961.js HTTP/1.1" 304 0 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:43 +0000] "GET /assets/day05.html-e1b66f43.js HTTP/1.1" 304 0 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:43 +0000] "GET /assets/day07~day08.html-623b7865.js HTTP/1.1" 304 0 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:43 +0000] "GET /assets/day06.html-694a0d7d.js HTTP/1.1" 304 0 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:43 +0000] "GET /assets/photoswipe.esm-060dc2da.js HTTP/1.1" 304 0 "http://localhost/assets/app-186445af.js" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:43 +0000] "GET /assets/day04.html-f1431c14.js HTTP/1.1" 304 0 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:43 +0000] "GET /assets/day09~day10.html-f64b96c2.js HTTP/1.1" 304 0 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:43 +0000] "GET /assets/day11.html-a02521a7.js HTTP/1.1" 304 0 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:43 +0000] "GET /assets/index.html-38735195.js HTTP/1.1" 304 0 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:43 +0000] "GET /assets/slides.html-bedae67d.js HTTP/1.1" 304 0 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:43 +0000] "GET /assets/day12.html-59d9b776.js HTTP/1.1" 304 0 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:43 +0000] "GET /assets/404.html-a12454c5.js HTTP/1.1" 304 0 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:43 +0000] "GET /assets/resume.html-5cfcd916.js HTTP/1.1" 304 0 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:43 +0000] "GET /assets/index.html-c7fbbb93.js HTTP/1.1" 304 0 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:43 +0000] "GET /assets/day02.html-4dc294c0.js HTTP/1.1" 304 0 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:43 +0000] "GET /assets/day01.html-6f75ed4c.js HTTP/1.1" 304 0 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:43 +0000] "GET /assets/day06.html-b06c4aa9.js HTTP/1.1" 304 0 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:43 +0000] "GET /assets/day09~day10.html-d816a6aa.js HTTP/1.1" 304 0 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:43 +0000] "GET /assets/day07~day08.html-ced4d973.js HTTP/1.1" 304 0 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:43 +0000] "GET /assets/day03.html-ad5c77d7.js HTTP/1.1" 304 0 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:43 +0000] "GET /assets/day05.html-ca20845f.js HTTP/1.1" 304 0 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:43 +0000] "GET /assets/day04.html-95ecbdaf.js HTTP/1.1" 304 0 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:43 +0000] "GET /assets/404.html-5bc9882c.js HTTP/1.1" 304 0 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:43 +0000] "GET /assets/index.html-eb2052a0.js HTTP/1.1" 304 0 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:43 +0000] "GET /assets/day11.html-c41ca19f.js HTTP/1.1" 304 0 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:43 +0000] "GET /assets/day12.html-7eccb79b.js HTTP/1.1" 304 0 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
172.18.0.1 - - [30/Jan/2024:06:35:44 +0000] "GET /favicon.ico HTTP/1.1" 304 0 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
2024/01/30 06:31:48 [notice] 1#1: using the "epoll" event method
2024/01/30 06:31:48 [notice] 1#1: nginx/1.25.3
2024/01/30 06:31:48 [notice] 1#1: built by gcc 12.2.0 (Debian 12.2.0-14)
2024/01/30 06:31:48 [notice] 1#1: OS: Linux 5.15.49-linuxkit-pr
2024/01/30 06:31:48 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2024/01/30 06:31:48 [notice] 1#1: start worker processes
2024/01/30 06:31:48 [notice] 1#1: start worker process 20
2024/01/30 06:31:48 [notice] 1#1: start worker process 21
2024/01/30 06:31:48 [notice] 1#1: start worker process 22
2024/01/30 06:31:48 [notice] 1#1: start worker process 23
2024/01/30 06:31:48 [notice] 1#1: start worker process 24
2024/01/30 06:34:49 [notice] 1#1: signal 3 (SIGQUIT) received, shutting down
2024/01/30 06:34:49 [notice] 22#22: gracefully shutting down
2024/01/30 06:34:49 [notice] 20#20: gracefully shutting down
2024/01/30 06:34:49 [notice] 23#23: gracefully shutting down
2024/01/30 06:34:49 [notice] 21#21: gracefully shutting down
2024/01/30 06:34:49 [notice] 23#23: exiting
2024/01/30 06:34:49 [notice] 24#24: gracefully shutting down
2024/01/30 06:34:49 [notice] 20#20: exiting
2024/01/30 06:34:49 [notice] 22#22: exiting
2024/01/30 06:34:49 [notice] 21#21: exiting
2024/01/30 06:34:49 [notice] 23#23: exit
2024/01/30 06:34:49 [notice] 24#24: exiting
2024/01/30 06:34:49 [notice] 24#24: exit
2024/01/30 06:34:49 [notice] 20#20: exit
2024/01/30 06:34:49 [notice] 21#21: exit
2024/01/30 06:34:49 [notice] 22#22: exit
2024/01/30 06:34:49 [notice] 1#1: signal 17 (SIGCHLD) received from 23
2024/01/30 06:34:49 [notice] 1#1: worker process 21 exited with code 0
2024/01/30 06:34:49 [notice] 1#1: worker process 22 exited with code 0
2024/01/30 06:34:49 [notice] 1#1: worker process 23 exited with code 0
2024/01/30 06:34:49 [notice] 1#1: worker process 24 exited with code 0
2024/01/30 06:34:49 [notice] 1#1: signal 29 (SIGIO) received
2024/01/30 06:34:49 [notice] 1#1: signal 17 (SIGCHLD) received from 20
2024/01/30 06:34:49 [notice] 1#1: worker process 20 exited with code 0
2024/01/30 06:34:49 [notice] 1#1: exit
2024/01/30 06:34:50 [notice] 1#1: using the "epoll" event method
2024/01/30 06:34:50 [notice] 1#1: nginx/1.25.3
2024/01/30 06:34:50 [notice] 1#1: built by gcc 12.2.0 (Debian 12.2.0-14)
2024/01/30 06:34:50 [notice] 1#1: OS: Linux 5.15.49-linuxkit-pr
2024/01/30 06:34:50 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2024/01/30 06:34:50 [notice] 1#1: start worker processes
2024/01/30 06:34:50 [notice] 1#1: start worker process 20
2024/01/30 06:34:50 [notice] 1#1: start worker process 21
2024/01/30 06:34:50 [notice] 1#1: start worker process 22
2024/01/30 06:34:50 [notice] 1#1: start worker process 23
2024/01/30 06:34:50 [notice] 1#1: start worker process 24
2024/01/30 06:35:41 [notice] 1#1: signal 3 (SIGQUIT) received, shutting down
2024/01/30 06:35:41 [notice] 20#20: gracefully shutting down
2024/01/30 06:35:41 [notice] 22#22: gracefully shutting down
2024/01/30 06:35:41 [notice] 24#24: gracefully shutting down
2024/01/30 06:35:41 [notice] 23#23: gracefully shutting down
2024/01/30 06:35:41 [notice] 21#21: gracefully shutting down
2024/01/30 06:35:41 [notice] 23#23: exiting
2024/01/30 06:35:41 [notice] 20#20: exiting
2024/01/30 06:35:41 [notice] 21#21: exiting
2024/01/30 06:35:41 [notice] 22#22: exiting
2024/01/30 06:35:41 [notice] 24#24: exiting
2024/01/30 06:35:41 [notice] 23#23: exit
2024/01/30 06:35:41 [notice] 20#20: exit
2024/01/30 06:35:41 [notice] 21#21: exit
2024/01/30 06:35:41 [notice] 22#22: exit
2024/01/30 06:35:41 [notice] 24#24: exit
2024/01/30 06:35:41 [notice] 1#1: signal 17 (SIGCHLD) received from 24
2024/01/30 06:35:41 [notice] 1#1: worker process 20 exited with code 0
2024/01/30 06:35:41 [notice] 1#1: worker process 24 exited with code 0
2024/01/30 06:35:41 [notice] 1#1: signal 29 (SIGIO) received
2024/01/30 06:35:41 [notice] 1#1: signal 17 (SIGCHLD) received from 22
2024/01/30 06:35:41 [notice] 1#1: worker process 21 exited with code 0
2024/01/30 06:35:41 [notice] 1#1: worker process 22 exited with code 0
2024/01/30 06:35:41 [notice] 1#1: worker process 23 exited with code 0
2024/01/30 06:35:41 [notice] 1#1: exit
2024/01/30 06:35:41 [notice] 1#1: using the "epoll" event method
2024/01/30 06:35:41 [notice] 1#1: nginx/1.25.3
2024/01/30 06:35:41 [notice] 1#1: built by gcc 12.2.0 (Debian 12.2.0-14)
2024/01/30 06:35:41 [notice] 1#1: OS: Linux 5.15.49-linuxkit-pr
2024/01/30 06:35:41 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2024/01/30 06:35:41 [notice] 1#1: start worker processes
2024/01/30 06:35:41 [notice] 1#1: start worker process 20
2024/01/30 06:35:41 [notice] 1#1: start worker process 21
2024/01/30 06:35:41 [notice] 1#1: start worker process 22
2024/01/30 06:35:41 [notice] 1#1: start worker process 23
2024/01/30 06:35:41 [notice] 1#1: start worker process 24
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAz2Smopt+Tmv9YR3cwuAqbImxQz9Fu+zQzXd21I3tQDk1YS9y
/Cqd4RYYJI5YCnUyquXqqEbLAHmXQ4ij6p1qzczihy5gfxr4fVWQebE6hdira5vX
bgTYabHIdf0e/zNJ5qYW7PIcaBcpbCGwOrH/JHki3pWjOxKpIuLIqVTn3/qJ+4WZ
MMLamJ2kAMD2OaltQFzron8HQCo/P85WQD6QrAjPikR85wD19rw+Jsju3e5ugwuU
8MjhdQSJge74vOWWeMiq1LZEf61WLGjFAcIhBCT1M58g6e5pqb9n3Dz4xUa2EwOQ
HziCj24DsNgp09YpjTL8Gyjh4e2+EojXszWMPQIDAQABAoIBABPw9BrPg7ILrSXQ
5sCwKDQeezZhl5VtvFf9RCZE7UqPFaReGRrJCDwz0Sd2rl13DmOjTtBWWj+V8Wbz
dPtinnniWOexnGKsV7dJamZhFaT4A+eJaQnxmlNzXjiGGZxlNJZiYvLuhq+1hmyY
wqaqJcO+iA1J6xOLhErP7oZlnRQKiSSK7vFumgaRhNP0DRPxI1Gg+HPs4hCZFuYC
PnS5lTJSZZmwH/el3ifNQlJJTRh1RHquYDIzlc0Mbr4jV4Lig+KY6uxGBa/VE5/D
1Xe0Kv8rOUIwXQdikvCBdOc2VGGtSQ0Sudi+W++SvSkfAFzq0baxidM4oxU1vV0D
h3iIBhsCgYEA9MvL+5GAKYpr6B1XO8WwuxY9HDFCmX/Vtyexo5X/wiqZ3ovPHqys
m9QrUnL50va7e5rdBK4K/FR7nqKc2h2sySFSeLKaZOgmIYSy5GrzczynBUNESdZx
KPw/cdMPkA60r+39dLs55tlZjw/Lr1FspbgXEyA4hxmvNzgwUpWrgRcCgYEA2OKd
gO0D8pjtfNwA+ZCK5UfUcnnGJhGddD6o4HNwt8zKFlhvKpo2N1Ul43QfvA7A1cfe
0jZw82GQ/XSdeS/OWl4cqC60dqR6FeNPNTW/hHhTHwbwAdgsFy0Bo/x+KxBoB07l
sPlYTS92ByZVZsoG7reLPiksBVAaLzv4/YayqcsCgYEAnaJmlnbZiuaCGhRayjjB
V5g4feESu/nfy3OaJnc/HO+F6hMpqt0Swb3cr9kuGrWbgTr2PD8+/8H/YOXiD2qw
i0wT6XlJhtUfSNJEyGY+ouRZwT/Rx6J5eCUHTerVyLRPkkK0xeiSnp8z1rYbOag7
SHPFGCHVhNn7RJnANE4BBL0CgYEArr2WbMOJhLIV1Z1j467DWYuP7VOThCR5GalK
YtxfmpaS04IYvthUiiw+RI3Q67FvSE6qhe96/XxEVxDXt0X/GevtZsuKdnR6MJxd
ut89GLvhLIRoZvQGQf3u7nKGLKghSJIWmYmrzTRKAeSutgxbnYWf2EtPvlAVaK0H
JSybUhUCgYACgb9bXru6CLx+3YI92j5s26+elU3AkxapHzHRanCf0xgQJ+t4pA9t
+NjFXIe624s9Mgy4THSCRunZpcqUH/e7ceNwm+ykBCbrZbJmUgBP1WLhVizej3aJ
t9Wh6NL+8eOwvySvtOpukOPZBW14s/Njzhf2IbKJ4Q4IYtBRs10NbA==
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIIF9TCCBN2gAwIBAgIQCvtYJvg2x1xu3LnaRr7LSDANBgkqhkiG9w0BAQsFADBu
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMS0wKwYDVQQDEyRFbmNyeXB0aW9uIEV2ZXJ5d2hlcmUg
RFYgVExTIENBIC0gRzIwHhcNMjQwMTMwMDAwMDAwWhcNMjQwNDI4MjM1OTU5WjAa
MRgwFgYDVQQDEw9ibG9ncy5nYWdhLnBsdXMwggEiMA0GCSqGSIb3DQEBAQUAA4IB
DwAwggEKAoIBAQDPZKaim35Oa/1hHdzC4CpsibFDP0W77NDNd3bUje1AOTVhL3L8
Kp3hFhgkjlgKdTKq5eqoRssAeZdDiKPqnWrNzOKHLmB/Gvh9VZB5sTqF2Ktrm9du
BNhpsch1/R7/M0nmphbs8hxoFylsIbA6sf8keSLelaM7Eqki4sipVOff+on7hZkw
wtqYnaQAwPY5qW1AXOuifwdAKj8/zlZAPpCsCM+KRHznAPX2vD4myO7d7m6DC5Tw
yOF1BImB7vi85ZZ4yKrUtkR/rVYsaMUBwiEEJPUznyDp7mmpv2fcPPjFRrYTA5Af
OIKPbgOw2CnT1imNMvwbKOHh7b4SiNezNYw9AgMBAAGjggLhMIIC3TAfBgNVHSME
GDAWgBR435GQX+7erPbFdevVTFVT7yRKtjAdBgNVHQ4EFgQUtkjdS8XNmfmk/NeS
imMs8LCoVsowGgYDVR0RBBMwEYIPYmxvZ3MuZ2FnYS5wbHVzMD4GA1UdIAQ3MDUw
MwYGZ4EMAQIBMCkwJwYIKwYBBQUHAgEWG2h0dHA6Ly93d3cuZGlnaWNlcnQuY29t
L0NQUzAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUF
BwMCMIGABggrBgEFBQcBAQR0MHIwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRp
Z2ljZXJ0LmNvbTBKBggrBgEFBQcwAoY+aHR0cDovL2NhY2VydHMuZGlnaWNlcnQu
Y29tL0VuY3J5cHRpb25FdmVyeXdoZXJlRFZUTFNDQS1HMi5jcnQwDAYDVR0TAQH/
BAIwADCCAX0GCisGAQQB1nkCBAIEggFtBIIBaQFnAHUA7s3QZNXbGs7FXLedtM0T
ojKHRny87N7DUUhZRnEftZsAAAGNWVFqCwAABAMARjBEAiAdpdltr3EpD3s+AwgM
NUpQvc8NEysirYRWmMeRg0QyugIgd9zhflgvIC8sT4p65rz/gXRw213/YBz1A9C7
+DiXChgAdQBIsONr2qZHNA/lagL6nTDrHFIBy1bdLIHZu7+rOdiEcwAAAY1ZUWo5
AAAEAwBGMEQCIEFvBlT9eza5zM5EZ3mts4RdjbpxU24SxZ8XBSF9t/waAiBjtdW9
TmUHszEfeZBI5DfgdsdYw/6QcYk6/MeGmjqXyQB3ANq2v2s/tbYin5vCu1xr6HCR
cWy7UYSFNL2kPTBI1/urAAABjVlRajsAAAQDAEgwRgIhANweEoVz3b1GMPT+GHYK
uzcH1QjX8EBmRckvnsPlFayZAiEA3KlMZkdnVgrsZiQmdL7TOSPZlFUMlKaWgMOQ
ig6n+f8wDQYJKoZIhvcNAQELBQADggEBADS5xZxI2je/SVvc9rp7S8aCYzJ1CWmQ
znYB7864RiwyJYHxlUB8f1Gb3lh5cKnVL+nzKbIR2Ll+adEvOqRZDgj047Q0mnhC
8IB3v5t/naKRqtvS6n1Egv4KJSsOmnZRzRhAdcPBGU5Q44DdkDieC6x97hCaYbHO
2suZ0jkMuR7f8GQyokfMCsOVSMI2/w8/ZKNdihH+n69Esmm2RSsc4eAwjbJjwoGE
s9gPVhhsexhxpZbRU3QPo62vVSKZfjLmOJJ/Jbvfnnlcq073rYwk5z0TLemjGhgI
h3ONMFuJJOGqt+ziY+t/tJlhcr8X9yYhYXRNu/m1q0RR/E+fZdRUVsU=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIEqjCCA5KgAwIBAgIQDeD/te5iy2EQn2CMnO1e0zANBgkqhkiG9w0BAQsFADBh
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH
MjAeFw0xNzExMjcxMjQ2NDBaFw0yNzExMjcxMjQ2NDBaMG4xCzAJBgNVBAYTAlVT
MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
b20xLTArBgNVBAMTJEVuY3J5cHRpb24gRXZlcnl3aGVyZSBEViBUTFMgQ0EgLSBH
MjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAO8Uf46i/nr7pkgTDqnE
eSIfCFqvPnUq3aF1tMJ5hh9MnO6Lmt5UdHfBGwC9Si+XjK12cjZgxObsL6Rg1njv
NhAMJ4JunN0JGGRJGSevbJsA3sc68nbPQzuKp5Jc8vpryp2mts38pSCXorPR+sch
QisKA7OSQ1MjcFN0d7tbrceWFNbzgL2csJVQeogOBGSe/KZEIZw6gXLKeFe7mupn
NYJROi2iC11+HuF79iAttMc32Cv6UOxixY/3ZV+LzpLnklFq98XORgwkIJL1HuvP
ha8yvb+W6JislZJL+HLFtidoxmI7Qm3ZyIV66W533DsGFimFJkz3y0GeHWuSVMbI
lfsCAwEAAaOCAU8wggFLMB0GA1UdDgQWBBR435GQX+7erPbFdevVTFVT7yRKtjAf
BgNVHSMEGDAWgBROIlQgGJXm427mD/r6uRLtBhePOTAOBgNVHQ8BAf8EBAMCAYYw
HQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBIGA1UdEwEB/wQIMAYBAf8C
AQAwNAYIKwYBBQUHAQEEKDAmMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdp
Y2VydC5jb20wQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2NybDMuZGlnaWNlcnQu
Y29tL0RpZ2lDZXJ0R2xvYmFsUm9vdEcyLmNybDBMBgNVHSAERTBDMDcGCWCGSAGG
/WwBAjAqMCgGCCsGAQUFBwIBFhxodHRwczovL3d3dy5kaWdpY2VydC5jb20vQ1BT
MAgGBmeBDAECATANBgkqhkiG9w0BAQsFAAOCAQEAoBs1eCLKakLtVRPFRjBIJ9LJ
L0s8ZWum8U8/1TMVkQMBn+CPb5xnCD0GSA6L/V0ZFrMNqBirrr5B241OesECvxIi
98bZ90h9+q/X5eMyOD35f8YTaEMpdnQCnawIwiHx06/0BfiTj+b/XQih+mqt3ZXe
xNCJqKexdiB2IWGSKcgahPacWkk/BAQFisKIFYEqHzV974S3FAz/8LIfD58xnsEN
GfzyIDkH3JrwYZ8caPTf6ZX9M1GrISN8HnWTtdNCH2xEajRa/h9ZBXjUyFKQrGk2
n2hcLrfZSbynEC/pSw/ET7H5nWwckjmAJ1l9fcnbqkU/pf6uMQmnfl0JQjJNSg==
-----END CERTIFICATE-----
因为 它太大了无法显示 source diff 。你可以改为 查看blob
{
"name": "resume-blog",
"version": "2.0.0",
"description": "简历博客",
"license": "MIT",
"type": "module",
"scripts": {
"docs:build": "vuepress build src",
"docs:clean-dev": "vuepress dev src --clean-cache",
"docs:dev": "vuepress dev src",
"docs:update-package": "npx vp-update"
},
"devDependencies": {
"@vuepress/client": "2.0.0-beta.67",
"vue": "^3.3.4",
"vuepress": "2.0.0-beta.67",
"vuepress-theme-hope": "2.0.0-beta.246"
}
}
import {
isPerformanceSupported,
now,
setupDevtoolsPlugin
} from "./chunk-J4VLYDXT.js";
export {
isPerformanceSupported,
now,
setupDevtoolsPlugin
};
//# sourceMappingURL=@vue_devtools-api.js.map
{
"version": 3,
"sources": [],
"sourcesContent": [],
"mappings": "",
"names": []
}
import {
isArray,
isFunction,
isString
} from "./chunk-EVOPDU7K.js";
// node_modules/@vuepress/shared/dist/index.js
var resolveHeadIdentifier = ([
tag,
attrs,
content
]) => {
if (tag === "meta" && attrs.name) {
return `${tag}.${attrs.name}`;
}
if (["title", "base"].includes(tag)) {
return tag;
}
if (tag === "template" && attrs.id) {
return `${tag}.${attrs.id}`;
}
return JSON.stringify([tag, attrs, content]);
};
var dedupeHead = (head) => {
const identifierSet = /* @__PURE__ */ new Set();
const result = [];
head.forEach((item) => {
const identifier = resolveHeadIdentifier(item);
if (!identifierSet.has(identifier)) {
identifierSet.add(identifier);
result.push(item);
}
});
return result;
};
var ensureLeadingSlash = (str) => str[0] === "/" ? str : `/${str}`;
var ensureEndingSlash = (str) => str[str.length - 1] === "/" || str.endsWith(".html") ? str : `${str}/`;
var formatDateString = (str, defaultDateString = "") => {
const dateMatch = str.match(/\b(\d{4})-(\d{1,2})-(\d{1,2})\b/);
if (dateMatch === null) {
return defaultDateString;
}
const [, yearStr, monthStr, dayStr] = dateMatch;
return [yearStr, monthStr.padStart(2, "0"), dayStr.padStart(2, "0")].join("-");
};
var isLinkFtp = (link) => link.startsWith("ftp://");
var isLinkHttp = (link) => /^(https?:)?\/\//.test(link);
var markdownLinkRegexp = /.md((\?|#).*)?$/;
var isLinkExternal = (link, base = "/") => {
if (isLinkHttp(link) || isLinkFtp(link)) {
return true;
}
if (link.startsWith("/") && !link.startsWith(base) && !markdownLinkRegexp.test(link)) {
return true;
}
return false;
};
var isLinkMailto = (link) => /^mailto:/.test(link);
var isLinkTel = (link) => /^tel:/.test(link);
var isPlainObject = (val) => Object.prototype.toString.call(val) === "[object Object]";
var omit = (obj, ...keys) => {
const result = { ...obj };
for (const key of keys) {
delete result[key];
}
return result;
};
var removeEndingSlash = (str) => str[str.length - 1] === "/" ? str.slice(0, -1) : str;
var removeLeadingSlash = (str) => str[0] === "/" ? str.slice(1) : str;
var resolveLocalePath = (locales, routePath) => {
const localePaths = Object.keys(locales).sort((a, b) => {
const levelDelta = b.split("/").length - a.split("/").length;
if (levelDelta !== 0) {
return levelDelta;
}
return b.length - a.length;
});
for (const localePath of localePaths) {
if (routePath.startsWith(localePath)) {
return localePath;
}
}
return "/";
};
var resolveRoutePathFromUrl = (url, base = "/") => {
const pathname = url.replace(/^(https?:)?\/\/[^/]*/, "");
return pathname.startsWith(base) ? `/${pathname.slice(base.length)}` : pathname;
};
export {
dedupeHead,
ensureEndingSlash,
ensureLeadingSlash,
formatDateString,
isArray,
isFunction,
isLinkExternal,
isLinkFtp,
isLinkHttp,
isLinkMailto,
isLinkTel,
isPlainObject,
isString,
omit,
removeEndingSlash,
removeLeadingSlash,
resolveHeadIdentifier,
resolveLocalePath,
resolveRoutePathFromUrl
};
//# sourceMappingURL=@vuepress_shared.js.map
{
"version": 3,
"sources": ["../../../../node_modules/@vuepress/shared/dist/index.js"],
"sourcesContent": ["// src/utils/index.ts\nimport { isArray, isFunction, isString } from \"@vue/shared\";\n\n// src/utils/resolveHeadIdentifier.ts\nvar resolveHeadIdentifier = ([\n tag,\n attrs,\n content\n]) => {\n if (tag === \"meta\" && attrs.name) {\n return `${tag}.${attrs.name}`;\n }\n if ([\"title\", \"base\"].includes(tag)) {\n return tag;\n }\n if (tag === \"template\" && attrs.id) {\n return `${tag}.${attrs.id}`;\n }\n return JSON.stringify([tag, attrs, content]);\n};\n\n// src/utils/dedupeHead.ts\nvar dedupeHead = (head) => {\n const identifierSet = /* @__PURE__ */ new Set();\n const result = [];\n head.forEach((item) => {\n const identifier = resolveHeadIdentifier(item);\n if (!identifierSet.has(identifier)) {\n identifierSet.add(identifier);\n result.push(item);\n }\n });\n return result;\n};\n\n// src/utils/ensureLeadingSlash.ts\nvar ensureLeadingSlash = (str) => str[0] === \"/\" ? str : `/${str}`;\n\n// src/utils/ensureEndingSlash.ts\nvar ensureEndingSlash = (str) => str[str.length - 1] === \"/\" || str.endsWith(\".html\") ? str : `${str}/`;\n\n// src/utils/formatDateString.ts\nvar formatDateString = (str, defaultDateString = \"\") => {\n const dateMatch = str.match(/\\b(\\d{4})-(\\d{1,2})-(\\d{1,2})\\b/);\n if (dateMatch === null) {\n return defaultDateString;\n }\n const [, yearStr, monthStr, dayStr] = dateMatch;\n return [yearStr, monthStr.padStart(2, \"0\"), dayStr.padStart(2, \"0\")].join(\"-\");\n};\n\n// src/utils/isLinkFtp.ts\nvar isLinkFtp = (link) => link.startsWith(\"ftp://\");\n\n// src/utils/isLinkHttp.ts\nvar isLinkHttp = (link) => /^(https?:)?\\/\\//.test(link);\n\n// src/utils/isLinkExternal.ts\nvar markdownLinkRegexp = /.md((\\?|#).*)?$/;\nvar isLinkExternal = (link, base = \"/\") => {\n if (isLinkHttp(link) || isLinkFtp(link)) {\n return true;\n }\n if (link.startsWith(\"/\") && !link.startsWith(base) && !markdownLinkRegexp.test(link)) {\n return true;\n }\n return false;\n};\n\n// src/utils/isLinkMailto.ts\nvar isLinkMailto = (link) => /^mailto:/.test(link);\n\n// src/utils/isLinkTel.ts\nvar isLinkTel = (link) => /^tel:/.test(link);\n\n// src/utils/isPlainObject.ts\nvar isPlainObject = (val) => Object.prototype.toString.call(val) === \"[object Object]\";\n\n// src/utils/omit.ts\nvar omit = (obj, ...keys) => {\n const result = { ...obj };\n for (const key of keys) {\n delete result[key];\n }\n return result;\n};\n\n// src/utils/removeEndingSlash.ts\nvar removeEndingSlash = (str) => str[str.length - 1] === \"/\" ? str.slice(0, -1) : str;\n\n// src/utils/removeLeadingSlash.ts\nvar removeLeadingSlash = (str) => str[0] === \"/\" ? str.slice(1) : str;\n\n// src/utils/resolveLocalePath.ts\nvar resolveLocalePath = (locales, routePath) => {\n const localePaths = Object.keys(locales).sort((a, b) => {\n const levelDelta = b.split(\"/\").length - a.split(\"/\").length;\n if (levelDelta !== 0) {\n return levelDelta;\n }\n return b.length - a.length;\n });\n for (const localePath of localePaths) {\n if (routePath.startsWith(localePath)) {\n return localePath;\n }\n }\n return \"/\";\n};\n\n// src/utils/resolveRoutePathFromUrl.ts\nvar resolveRoutePathFromUrl = (url, base = \"/\") => {\n const pathname = url.replace(/^(https?:)?\\/\\/[^/]*/, \"\");\n return pathname.startsWith(base) ? `/${pathname.slice(base.length)}` : pathname;\n};\nexport {\n dedupeHead,\n ensureEndingSlash,\n ensureLeadingSlash,\n formatDateString,\n isArray,\n isFunction,\n isLinkExternal,\n isLinkFtp,\n isLinkHttp,\n isLinkMailto,\n isLinkTel,\n isPlainObject,\n isString,\n omit,\n removeEndingSlash,\n removeLeadingSlash,\n resolveHeadIdentifier,\n resolveLocalePath,\n resolveRoutePathFromUrl\n};\n"],
"mappings": ";;;;;;;AAIA,IAAI,wBAAwB,CAAC;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,MAAI,QAAQ,UAAU,MAAM,MAAM;AAChC,WAAO,GAAG,GAAG,IAAI,MAAM,IAAI;AAAA,EAC7B;AACA,MAAI,CAAC,SAAS,MAAM,EAAE,SAAS,GAAG,GAAG;AACnC,WAAO;AAAA,EACT;AACA,MAAI,QAAQ,cAAc,MAAM,IAAI;AAClC,WAAO,GAAG,GAAG,IAAI,MAAM,EAAE;AAAA,EAC3B;AACA,SAAO,KAAK,UAAU,CAAC,KAAK,OAAO,OAAO,CAAC;AAC7C;AAGA,IAAI,aAAa,CAAC,SAAS;AACzB,QAAM,gBAAgC,oBAAI,IAAI;AAC9C,QAAM,SAAS,CAAC;AAChB,OAAK,QAAQ,CAAC,SAAS;AACrB,UAAM,aAAa,sBAAsB,IAAI;AAC7C,QAAI,CAAC,cAAc,IAAI,UAAU,GAAG;AAClC,oBAAc,IAAI,UAAU;AAC5B,aAAO,KAAK,IAAI;AAAA,IAClB;AAAA,EACF,CAAC;AACD,SAAO;AACT;AAGA,IAAI,qBAAqB,CAAC,QAAQ,IAAI,CAAC,MAAM,MAAM,MAAM,IAAI,GAAG;AAGhE,IAAI,oBAAoB,CAAC,QAAQ,IAAI,IAAI,SAAS,CAAC,MAAM,OAAO,IAAI,SAAS,OAAO,IAAI,MAAM,GAAG,GAAG;AAGpG,IAAI,mBAAmB,CAAC,KAAK,oBAAoB,OAAO;AACtD,QAAM,YAAY,IAAI,MAAM,iCAAiC;AAC7D,MAAI,cAAc,MAAM;AACtB,WAAO;AAAA,EACT;AACA,QAAM,CAAC,EAAE,SAAS,UAAU,MAAM,IAAI;AACtC,SAAO,CAAC,SAAS,SAAS,SAAS,GAAG,GAAG,GAAG,OAAO,SAAS,GAAG,GAAG,CAAC,EAAE,KAAK,GAAG;AAC/E;AAGA,IAAI,YAAY,CAAC,SAAS,KAAK,WAAW,QAAQ;AAGlD,IAAI,aAAa,CAAC,SAAS,kBAAkB,KAAK,IAAI;AAGtD,IAAI,qBAAqB;AACzB,IAAI,iBAAiB,CAAC,MAAM,OAAO,QAAQ;AACzC,MAAI,WAAW,IAAI,KAAK,UAAU,IAAI,GAAG;AACvC,WAAO;AAAA,EACT;AACA,MAAI,KAAK,WAAW,GAAG,KAAK,CAAC,KAAK,WAAW,IAAI,KAAK,CAAC,mBAAmB,KAAK,IAAI,GAAG;AACpF,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAGA,IAAI,eAAe,CAAC,SAAS,WAAW,KAAK,IAAI;AAGjD,IAAI,YAAY,CAAC,SAAS,QAAQ,KAAK,IAAI;AAG3C,IAAI,gBAAgB,CAAC,QAAQ,OAAO,UAAU,SAAS,KAAK,GAAG,MAAM;AAGrE,IAAI,OAAO,CAAC,QAAQ,SAAS;AAC3B,QAAM,SAAS,EAAE,GAAG,IAAI;AACxB,aAAW,OAAO,MAAM;AACtB,WAAO,OAAO,GAAG;AAAA,EACnB;AACA,SAAO;AACT;AAGA,IAAI,oBAAoB,CAAC,QAAQ,IAAI,IAAI,SAAS,CAAC,MAAM,MAAM,IAAI,MAAM,GAAG,EAAE,IAAI;AAGlF,IAAI,qBAAqB,CAAC,QAAQ,IAAI,CAAC,MAAM,MAAM,IAAI,MAAM,CAAC,IAAI;AAGlE,IAAI,oBAAoB,CAAC,SAAS,cAAc;AAC9C,QAAM,cAAc,OAAO,KAAK,OAAO,EAAE,KAAK,CAAC,GAAG,MAAM;AACtD,UAAM,aAAa,EAAE,MAAM,GAAG,EAAE,SAAS,EAAE,MAAM,GAAG,EAAE;AACtD,QAAI,eAAe,GAAG;AACpB,aAAO;AAAA,IACT;AACA,WAAO,EAAE,SAAS,EAAE;AAAA,EACtB,CAAC;AACD,aAAW,cAAc,aAAa;AACpC,QAAI,UAAU,WAAW,UAAU,GAAG;AACpC,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAGA,IAAI,0BAA0B,CAAC,KAAK,OAAO,QAAQ;AACjD,QAAM,WAAW,IAAI,QAAQ,wBAAwB,EAAE;AACvD,SAAO,SAAS,WAAW,IAAI,IAAI,IAAI,SAAS,MAAM,KAAK,MAAM,CAAC,KAAK;AACzE;",
"names": []
}
因为 它太大了无法显示 source diff 。你可以改为 查看blob
因为 它太大了无法显示 source diff 。你可以改为 查看blob
{
"hash": "befa4fa6",
"browserHash": "03175f58",
"optimized": {
"@vueuse/core": {
"src": "../../../../node_modules/@vueuse/core/index.mjs",
"file": "@vueuse_core.js",
"fileHash": "6e3aac34",
"needsInterop": false
},
"@vue/devtools-api": {
"src": "../../../../node_modules/@vue/devtools-api/lib/esm/index.js",
"file": "@vue_devtools-api.js",
"fileHash": "f113f382",
"needsInterop": false
},
"@vuepress/shared": {
"src": "../../../../node_modules/@vuepress/shared/dist/index.js",
"file": "@vuepress_shared.js",
"fileHash": "7c1994c6",
"needsInterop": false
},
"vue": {
"src": "../../../../node_modules/vue/dist/vue.runtime.esm-bundler.js",
"file": "vue.js",
"fileHash": "bff6c35e",
"needsInterop": false
},
"vue-router": {
"src": "../../../../node_modules/vue-router/dist/vue-router.esm-bundler.js",
"file": "vue-router.js",
"fileHash": "92268f06",
"needsInterop": false
}
},
"chunks": {
"chunk-J4VLYDXT": {
"file": "chunk-J4VLYDXT.js"
},
"chunk-PYXZ4PKZ": {
"file": "chunk-PYXZ4PKZ.js"
},
"chunk-EVOPDU7K": {
"file": "chunk-EVOPDU7K.js"
}
}
}
\ No newline at end of file
// node_modules/@vue/shared/dist/shared.esm-bundler.js
function makeMap(str, expectsLowerCase) {
const set = new Set(str.split(","));
return expectsLowerCase ? (val) => set.has(val.toLowerCase()) : (val) => set.has(val);
}
var EMPTY_OBJ = true ? Object.freeze({}) : {};
var EMPTY_ARR = true ? Object.freeze([]) : [];
var NOOP = () => {
};
var NO = () => false;
var isOn = (key) => key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && // uppercase letter
(key.charCodeAt(2) > 122 || key.charCodeAt(2) < 97);
var isModelListener = (key) => key.startsWith("onUpdate:");
var extend = Object.assign;
var remove = (arr, el) => {
const i = arr.indexOf(el);
if (i > -1) {
arr.splice(i, 1);
}
};
var hasOwnProperty = Object.prototype.hasOwnProperty;
var hasOwn = (val, key) => hasOwnProperty.call(val, key);
var isArray = Array.isArray;
var isMap = (val) => toTypeString(val) === "[object Map]";
var isSet = (val) => toTypeString(val) === "[object Set]";
var isDate = (val) => toTypeString(val) === "[object Date]";
var isRegExp = (val) => toTypeString(val) === "[object RegExp]";
var isFunction = (val) => typeof val === "function";
var isString = (val) => typeof val === "string";
var isSymbol = (val) => typeof val === "symbol";
var isObject = (val) => val !== null && typeof val === "object";
var isPromise = (val) => {
return (isObject(val) || isFunction(val)) && isFunction(val.then) && isFunction(val.catch);
};
var objectToString = Object.prototype.toString;
var toTypeString = (value) => objectToString.call(value);
var toRawType = (value) => {
return toTypeString(value).slice(8, -1);
};
var isPlainObject = (val) => toTypeString(val) === "[object Object]";
var isIntegerKey = (key) => isString(key) && key !== "NaN" && key[0] !== "-" && "" + parseInt(key, 10) === key;
var isReservedProp = makeMap(
// the leading comma is intentional so empty string "" is also included
",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"
);
var isBuiltInDirective = makeMap(
"bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo"
);
var cacheStringFunction = (fn) => {
const cache = /* @__PURE__ */ Object.create(null);
return (str) => {
const hit = cache[str];
return hit || (cache[str] = fn(str));
};
};
var camelizeRE = /-(\w)/g;
var camelize = cacheStringFunction((str) => {
return str.replace(camelizeRE, (_, c) => c ? c.toUpperCase() : "");
});
var hyphenateRE = /\B([A-Z])/g;
var hyphenate = cacheStringFunction(
(str) => str.replace(hyphenateRE, "-$1").toLowerCase()
);
var capitalize = cacheStringFunction((str) => {
return str.charAt(0).toUpperCase() + str.slice(1);
});
var toHandlerKey = cacheStringFunction((str) => {
const s = str ? `on${capitalize(str)}` : ``;
return s;
});
var hasChanged = (value, oldValue) => !Object.is(value, oldValue);
var invokeArrayFns = (fns, arg) => {
for (let i = 0; i < fns.length; i++) {
fns[i](arg);
}
};
var def = (obj, key, value) => {
Object.defineProperty(obj, key, {
configurable: true,
enumerable: false,
value
});
};
var looseToNumber = (val) => {
const n = parseFloat(val);
return isNaN(n) ? val : n;
};
var toNumber = (val) => {
const n = isString(val) ? Number(val) : NaN;
return isNaN(n) ? val : n;
};
var _globalThis;
var getGlobalThis = () => {
return _globalThis || (_globalThis = typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : {});
};
var GLOBALS_ALLOWED = "Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,console,Error";
var isGloballyAllowed = makeMap(GLOBALS_ALLOWED);
function normalizeStyle(value) {
if (isArray(value)) {
const res = {};
for (let i = 0; i < value.length; i++) {
const item = value[i];
const normalized = isString(item) ? parseStringStyle(item) : normalizeStyle(item);
if (normalized) {
for (const key in normalized) {
res[key] = normalized[key];
}
}
}
return res;
} else if (isString(value) || isObject(value)) {
return value;
}
}
var listDelimiterRE = /;(?![^(]*\))/g;
var propertyDelimiterRE = /:([^]+)/;
var styleCommentRE = /\/\*[^]*?\*\//g;
function parseStringStyle(cssText) {
const ret = {};
cssText.replace(styleCommentRE, "").split(listDelimiterRE).forEach((item) => {
if (item) {
const tmp = item.split(propertyDelimiterRE);
tmp.length > 1 && (ret[tmp[0].trim()] = tmp[1].trim());
}
});
return ret;
}
function stringifyStyle(styles) {
let ret = "";
if (!styles || isString(styles)) {
return ret;
}
for (const key in styles) {
const value = styles[key];
const normalizedKey = key.startsWith(`--`) ? key : hyphenate(key);
if (isString(value) || typeof value === "number") {
ret += `${normalizedKey}:${value};`;
}
}
return ret;
}
function normalizeClass(value) {
let res = "";
if (isString(value)) {
res = value;
} else if (isArray(value)) {
for (let i = 0; i < value.length; i++) {
const normalized = normalizeClass(value[i]);
if (normalized) {
res += normalized + " ";
}
}
} else if (isObject(value)) {
for (const name in value) {
if (value[name]) {
res += name + " ";
}
}
}
return res.trim();
}
function normalizeProps(props) {
if (!props)
return null;
let { class: klass, style } = props;
if (klass && !isString(klass)) {
props.class = normalizeClass(klass);
}
if (style) {
props.style = normalizeStyle(style);
}
return props;
}
var HTML_TAGS = "html,body,base,head,link,meta,style,title,address,article,aside,footer,header,hgroup,h1,h2,h3,h4,h5,h6,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,summary,template,blockquote,iframe,tfoot";
var SVG_TAGS = "svg,animate,animateMotion,animateTransform,circle,clipPath,color-profile,defs,desc,discard,ellipse,feBlend,feColorMatrix,feComponentTransfer,feComposite,feConvolveMatrix,feDiffuseLighting,feDisplacementMap,feDistantLight,feDropShadow,feFlood,feFuncA,feFuncB,feFuncG,feFuncR,feGaussianBlur,feImage,feMerge,feMergeNode,feMorphology,feOffset,fePointLight,feSpecularLighting,feSpotLight,feTile,feTurbulence,filter,foreignObject,g,hatch,hatchpath,image,line,linearGradient,marker,mask,mesh,meshgradient,meshpatch,meshrow,metadata,mpath,path,pattern,polygon,polyline,radialGradient,rect,set,solidcolor,stop,switch,symbol,text,textPath,title,tspan,unknown,use,view";
var MATH_TAGS = "annotation,annotation-xml,maction,maligngroup,malignmark,math,menclose,merror,mfenced,mfrac,mfraction,mglyph,mi,mlabeledtr,mlongdiv,mmultiscripts,mn,mo,mover,mpadded,mphantom,mprescripts,mroot,mrow,ms,mscarries,mscarry,msgroup,msline,mspace,msqrt,msrow,mstack,mstyle,msub,msubsup,msup,mtable,mtd,mtext,mtr,munder,munderover,none,semantics";
var VOID_TAGS = "area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr";
var isHTMLTag = makeMap(HTML_TAGS);
var isSVGTag = makeMap(SVG_TAGS);
var isMathMLTag = makeMap(MATH_TAGS);
var isVoidTag = makeMap(VOID_TAGS);
var specialBooleanAttrs = `itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly`;
var isSpecialBooleanAttr = makeMap(specialBooleanAttrs);
var isBooleanAttr = makeMap(
specialBooleanAttrs + `,async,autofocus,autoplay,controls,default,defer,disabled,hidden,inert,loop,open,required,reversed,scoped,seamless,checked,muted,multiple,selected`
);
function includeBooleanAttr(value) {
return !!value || value === "";
}
var isKnownHtmlAttr = makeMap(
`accept,accept-charset,accesskey,action,align,allow,alt,async,autocapitalize,autocomplete,autofocus,autoplay,background,bgcolor,border,buffered,capture,challenge,charset,checked,cite,class,code,codebase,color,cols,colspan,content,contenteditable,contextmenu,controls,coords,crossorigin,csp,data,datetime,decoding,default,defer,dir,dirname,disabled,download,draggable,dropzone,enctype,enterkeyhint,for,form,formaction,formenctype,formmethod,formnovalidate,formtarget,headers,height,hidden,high,href,hreflang,http-equiv,icon,id,importance,inert,integrity,ismap,itemprop,keytype,kind,label,lang,language,loading,list,loop,low,manifest,max,maxlength,minlength,media,min,multiple,muted,name,novalidate,open,optimum,pattern,ping,placeholder,poster,preload,radiogroup,readonly,referrerpolicy,rel,required,reversed,rows,rowspan,sandbox,scope,scoped,selected,shape,size,sizes,slot,span,spellcheck,src,srcdoc,srclang,srcset,start,step,style,summary,tabindex,target,title,translate,type,usemap,value,width,wrap`
);
var isKnownSvgAttr = makeMap(
`xmlns,accent-height,accumulate,additive,alignment-baseline,alphabetic,amplitude,arabic-form,ascent,attributeName,attributeType,azimuth,baseFrequency,baseline-shift,baseProfile,bbox,begin,bias,by,calcMode,cap-height,class,clip,clipPathUnits,clip-path,clip-rule,color,color-interpolation,color-interpolation-filters,color-profile,color-rendering,contentScriptType,contentStyleType,crossorigin,cursor,cx,cy,d,decelerate,descent,diffuseConstant,direction,display,divisor,dominant-baseline,dur,dx,dy,edgeMode,elevation,enable-background,end,exponent,fill,fill-opacity,fill-rule,filter,filterRes,filterUnits,flood-color,flood-opacity,font-family,font-size,font-size-adjust,font-stretch,font-style,font-variant,font-weight,format,from,fr,fx,fy,g1,g2,glyph-name,glyph-orientation-horizontal,glyph-orientation-vertical,glyphRef,gradientTransform,gradientUnits,hanging,height,href,hreflang,horiz-adv-x,horiz-origin-x,id,ideographic,image-rendering,in,in2,intercept,k,k1,k2,k3,k4,kernelMatrix,kernelUnitLength,kerning,keyPoints,keySplines,keyTimes,lang,lengthAdjust,letter-spacing,lighting-color,limitingConeAngle,local,marker-end,marker-mid,marker-start,markerHeight,markerUnits,markerWidth,mask,maskContentUnits,maskUnits,mathematical,max,media,method,min,mode,name,numOctaves,offset,opacity,operator,order,orient,orientation,origin,overflow,overline-position,overline-thickness,panose-1,paint-order,path,pathLength,patternContentUnits,patternTransform,patternUnits,ping,pointer-events,points,pointsAtX,pointsAtY,pointsAtZ,preserveAlpha,preserveAspectRatio,primitiveUnits,r,radius,referrerPolicy,refX,refY,rel,rendering-intent,repeatCount,repeatDur,requiredExtensions,requiredFeatures,restart,result,rotate,rx,ry,scale,seed,shape-rendering,slope,spacing,specularConstant,specularExponent,speed,spreadMethod,startOffset,stdDeviation,stemh,stemv,stitchTiles,stop-color,stop-opacity,strikethrough-position,strikethrough-thickness,string,stroke,stroke-dasharray,stroke-dashoffset,stroke-linecap,stroke-linejoin,stroke-miterlimit,stroke-opacity,stroke-width,style,surfaceScale,systemLanguage,tabindex,tableValues,target,targetX,targetY,text-anchor,text-decoration,text-rendering,textLength,to,transform,transform-origin,type,u1,u2,underline-position,underline-thickness,unicode,unicode-bidi,unicode-range,units-per-em,v-alphabetic,v-hanging,v-ideographic,v-mathematical,values,vector-effect,version,vert-adv-y,vert-origin-x,vert-origin-y,viewBox,viewTarget,visibility,width,widths,word-spacing,writing-mode,x,x-height,x1,x2,xChannelSelector,xlink:actuate,xlink:arcrole,xlink:href,xlink:role,xlink:show,xlink:title,xlink:type,xmlns:xlink,xml:base,xml:lang,xml:space,y,y1,y2,yChannelSelector,z,zoomAndPan`
);
function isRenderableAttrValue(value) {
if (value == null) {
return false;
}
const type = typeof value;
return type === "string" || type === "number" || type === "boolean";
}
function looseCompareArrays(a, b) {
if (a.length !== b.length)
return false;
let equal = true;
for (let i = 0; equal && i < a.length; i++) {
equal = looseEqual(a[i], b[i]);
}
return equal;
}
function looseEqual(a, b) {
if (a === b)
return true;
let aValidType = isDate(a);
let bValidType = isDate(b);
if (aValidType || bValidType) {
return aValidType && bValidType ? a.getTime() === b.getTime() : false;
}
aValidType = isSymbol(a);
bValidType = isSymbol(b);
if (aValidType || bValidType) {
return a === b;
}
aValidType = isArray(a);
bValidType = isArray(b);
if (aValidType || bValidType) {
return aValidType && bValidType ? looseCompareArrays(a, b) : false;
}
aValidType = isObject(a);
bValidType = isObject(b);
if (aValidType || bValidType) {
if (!aValidType || !bValidType) {
return false;
}
const aKeysCount = Object.keys(a).length;
const bKeysCount = Object.keys(b).length;
if (aKeysCount !== bKeysCount) {
return false;
}
for (const key in a) {
const aHasKey = a.hasOwnProperty(key);
const bHasKey = b.hasOwnProperty(key);
if (aHasKey && !bHasKey || !aHasKey && bHasKey || !looseEqual(a[key], b[key])) {
return false;
}
}
}
return String(a) === String(b);
}
function looseIndexOf(arr, val) {
return arr.findIndex((item) => looseEqual(item, val));
}
var toDisplayString = (val) => {
return isString(val) ? val : val == null ? "" : isArray(val) || isObject(val) && (val.toString === objectToString || !isFunction(val.toString)) ? JSON.stringify(val, replacer, 2) : String(val);
};
var replacer = (_key, val) => {
if (val && val.__v_isRef) {
return replacer(_key, val.value);
} else if (isMap(val)) {
return {
[`Map(${val.size})`]: [...val.entries()].reduce(
(entries, [key, val2], i) => {
entries[stringifySymbol(key, i) + " =>"] = val2;
return entries;
},
{}
)
};
} else if (isSet(val)) {
return {
[`Set(${val.size})`]: [...val.values()].map((v) => stringifySymbol(v))
};
} else if (isSymbol(val)) {
return stringifySymbol(val);
} else if (isObject(val) && !isArray(val) && !isPlainObject(val)) {
return String(val);
}
return val;
};
var stringifySymbol = (v, i = "") => {
var _a;
return isSymbol(v) ? `Symbol(${(_a = v.description) != null ? _a : i})` : v;
};
export {
makeMap,
EMPTY_OBJ,
EMPTY_ARR,
NOOP,
NO,
isOn,
isModelListener,
extend,
remove,
hasOwn,
isArray,
isMap,
isSet,
isRegExp,
isFunction,
isString,
isSymbol,
isObject,
isPromise,
toRawType,
isPlainObject,
isIntegerKey,
isReservedProp,
isBuiltInDirective,
camelize,
hyphenate,
capitalize,
toHandlerKey,
hasChanged,
invokeArrayFns,
def,
looseToNumber,
toNumber,
getGlobalThis,
isGloballyAllowed,
normalizeStyle,
stringifyStyle,
normalizeClass,
normalizeProps,
isHTMLTag,
isSVGTag,
isMathMLTag,
isSpecialBooleanAttr,
isBooleanAttr,
includeBooleanAttr,
isKnownHtmlAttr,
isKnownSvgAttr,
isRenderableAttrValue,
looseEqual,
looseIndexOf,
toDisplayString
};
/*! Bundled license information:
@vue/shared/dist/shared.esm-bundler.js:
(**
* @vue/shared v3.4.15
* (c) 2018-present Yuxi (Evan) You and Vue contributors
* @license MIT
**)
*/
//# sourceMappingURL=chunk-EVOPDU7K.js.map
{
"version": 3,
"sources": ["../../../../node_modules/@vue/shared/dist/shared.esm-bundler.js"],
"sourcesContent": ["/**\n* @vue/shared v3.4.15\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/\nfunction makeMap(str, expectsLowerCase) {\n const set = new Set(str.split(\",\"));\n return expectsLowerCase ? (val) => set.has(val.toLowerCase()) : (val) => set.has(val);\n}\n\nconst EMPTY_OBJ = !!(process.env.NODE_ENV !== \"production\") ? Object.freeze({}) : {};\nconst EMPTY_ARR = !!(process.env.NODE_ENV !== \"production\") ? Object.freeze([]) : [];\nconst NOOP = () => {\n};\nconst NO = () => false;\nconst isOn = (key) => key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && // uppercase letter\n(key.charCodeAt(2) > 122 || key.charCodeAt(2) < 97);\nconst isModelListener = (key) => key.startsWith(\"onUpdate:\");\nconst extend = Object.assign;\nconst remove = (arr, el) => {\n const i = arr.indexOf(el);\n if (i > -1) {\n arr.splice(i, 1);\n }\n};\nconst hasOwnProperty = Object.prototype.hasOwnProperty;\nconst hasOwn = (val, key) => hasOwnProperty.call(val, key);\nconst isArray = Array.isArray;\nconst isMap = (val) => toTypeString(val) === \"[object Map]\";\nconst isSet = (val) => toTypeString(val) === \"[object Set]\";\nconst isDate = (val) => toTypeString(val) === \"[object Date]\";\nconst isRegExp = (val) => toTypeString(val) === \"[object RegExp]\";\nconst isFunction = (val) => typeof val === \"function\";\nconst isString = (val) => typeof val === \"string\";\nconst isSymbol = (val) => typeof val === \"symbol\";\nconst isObject = (val) => val !== null && typeof val === \"object\";\nconst isPromise = (val) => {\n return (isObject(val) || isFunction(val)) && isFunction(val.then) && isFunction(val.catch);\n};\nconst objectToString = Object.prototype.toString;\nconst toTypeString = (value) => objectToString.call(value);\nconst toRawType = (value) => {\n return toTypeString(value).slice(8, -1);\n};\nconst isPlainObject = (val) => toTypeString(val) === \"[object Object]\";\nconst isIntegerKey = (key) => isString(key) && key !== \"NaN\" && key[0] !== \"-\" && \"\" + parseInt(key, 10) === key;\nconst isReservedProp = /* @__PURE__ */ makeMap(\n // the leading comma is intentional so empty string \"\" is also included\n \",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted\"\n);\nconst isBuiltInDirective = /* @__PURE__ */ makeMap(\n \"bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo\"\n);\nconst cacheStringFunction = (fn) => {\n const cache = /* @__PURE__ */ Object.create(null);\n return (str) => {\n const hit = cache[str];\n return hit || (cache[str] = fn(str));\n };\n};\nconst camelizeRE = /-(\\w)/g;\nconst camelize = cacheStringFunction((str) => {\n return str.replace(camelizeRE, (_, c) => c ? c.toUpperCase() : \"\");\n});\nconst hyphenateRE = /\\B([A-Z])/g;\nconst hyphenate = cacheStringFunction(\n (str) => str.replace(hyphenateRE, \"-$1\").toLowerCase()\n);\nconst capitalize = cacheStringFunction((str) => {\n return str.charAt(0).toUpperCase() + str.slice(1);\n});\nconst toHandlerKey = cacheStringFunction((str) => {\n const s = str ? `on${capitalize(str)}` : ``;\n return s;\n});\nconst hasChanged = (value, oldValue) => !Object.is(value, oldValue);\nconst invokeArrayFns = (fns, arg) => {\n for (let i = 0; i < fns.length; i++) {\n fns[i](arg);\n }\n};\nconst def = (obj, key, value) => {\n Object.defineProperty(obj, key, {\n configurable: true,\n enumerable: false,\n value\n });\n};\nconst looseToNumber = (val) => {\n const n = parseFloat(val);\n return isNaN(n) ? val : n;\n};\nconst toNumber = (val) => {\n const n = isString(val) ? Number(val) : NaN;\n return isNaN(n) ? val : n;\n};\nlet _globalThis;\nconst getGlobalThis = () => {\n return _globalThis || (_globalThis = typeof globalThis !== \"undefined\" ? globalThis : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : typeof global !== \"undefined\" ? global : {});\n};\nconst identRE = /^[_$a-zA-Z\\xA0-\\uFFFF][_$a-zA-Z0-9\\xA0-\\uFFFF]*$/;\nfunction genPropsAccessExp(name) {\n return identRE.test(name) ? `__props.${name}` : `__props[${JSON.stringify(name)}]`;\n}\n\nconst PatchFlags = {\n \"TEXT\": 1,\n \"1\": \"TEXT\",\n \"CLASS\": 2,\n \"2\": \"CLASS\",\n \"STYLE\": 4,\n \"4\": \"STYLE\",\n \"PROPS\": 8,\n \"8\": \"PROPS\",\n \"FULL_PROPS\": 16,\n \"16\": \"FULL_PROPS\",\n \"NEED_HYDRATION\": 32,\n \"32\": \"NEED_HYDRATION\",\n \"STABLE_FRAGMENT\": 64,\n \"64\": \"STABLE_FRAGMENT\",\n \"KEYED_FRAGMENT\": 128,\n \"128\": \"KEYED_FRAGMENT\",\n \"UNKEYED_FRAGMENT\": 256,\n \"256\": \"UNKEYED_FRAGMENT\",\n \"NEED_PATCH\": 512,\n \"512\": \"NEED_PATCH\",\n \"DYNAMIC_SLOTS\": 1024,\n \"1024\": \"DYNAMIC_SLOTS\",\n \"DEV_ROOT_FRAGMENT\": 2048,\n \"2048\": \"DEV_ROOT_FRAGMENT\",\n \"HOISTED\": -1,\n \"-1\": \"HOISTED\",\n \"BAIL\": -2,\n \"-2\": \"BAIL\"\n};\nconst PatchFlagNames = {\n [1]: `TEXT`,\n [2]: `CLASS`,\n [4]: `STYLE`,\n [8]: `PROPS`,\n [16]: `FULL_PROPS`,\n [32]: `NEED_HYDRATION`,\n [64]: `STABLE_FRAGMENT`,\n [128]: `KEYED_FRAGMENT`,\n [256]: `UNKEYED_FRAGMENT`,\n [512]: `NEED_PATCH`,\n [1024]: `DYNAMIC_SLOTS`,\n [2048]: `DEV_ROOT_FRAGMENT`,\n [-1]: `HOISTED`,\n [-2]: `BAIL`\n};\n\nconst ShapeFlags = {\n \"ELEMENT\": 1,\n \"1\": \"ELEMENT\",\n \"FUNCTIONAL_COMPONENT\": 2,\n \"2\": \"FUNCTIONAL_COMPONENT\",\n \"STATEFUL_COMPONENT\": 4,\n \"4\": \"STATEFUL_COMPONENT\",\n \"TEXT_CHILDREN\": 8,\n \"8\": \"TEXT_CHILDREN\",\n \"ARRAY_CHILDREN\": 16,\n \"16\": \"ARRAY_CHILDREN\",\n \"SLOTS_CHILDREN\": 32,\n \"32\": \"SLOTS_CHILDREN\",\n \"TELEPORT\": 64,\n \"64\": \"TELEPORT\",\n \"SUSPENSE\": 128,\n \"128\": \"SUSPENSE\",\n \"COMPONENT_SHOULD_KEEP_ALIVE\": 256,\n \"256\": \"COMPONENT_SHOULD_KEEP_ALIVE\",\n \"COMPONENT_KEPT_ALIVE\": 512,\n \"512\": \"COMPONENT_KEPT_ALIVE\",\n \"COMPONENT\": 6,\n \"6\": \"COMPONENT\"\n};\n\nconst SlotFlags = {\n \"STABLE\": 1,\n \"1\": \"STABLE\",\n \"DYNAMIC\": 2,\n \"2\": \"DYNAMIC\",\n \"FORWARDED\": 3,\n \"3\": \"FORWARDED\"\n};\nconst slotFlagsText = {\n [1]: \"STABLE\",\n [2]: \"DYNAMIC\",\n [3]: \"FORWARDED\"\n};\n\nconst GLOBALS_ALLOWED = \"Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,console,Error\";\nconst isGloballyAllowed = /* @__PURE__ */ makeMap(GLOBALS_ALLOWED);\nconst isGloballyWhitelisted = isGloballyAllowed;\n\nconst range = 2;\nfunction generateCodeFrame(source, start = 0, end = source.length) {\n let lines = source.split(/(\\r?\\n)/);\n const newlineSequences = lines.filter((_, idx) => idx % 2 === 1);\n lines = lines.filter((_, idx) => idx % 2 === 0);\n let count = 0;\n const res = [];\n for (let i = 0; i < lines.length; i++) {\n count += lines[i].length + (newlineSequences[i] && newlineSequences[i].length || 0);\n if (count >= start) {\n for (let j = i - range; j <= i + range || end > count; j++) {\n if (j < 0 || j >= lines.length)\n continue;\n const line = j + 1;\n res.push(\n `${line}${\" \".repeat(Math.max(3 - String(line).length, 0))}| ${lines[j]}`\n );\n const lineLength = lines[j].length;\n const newLineSeqLength = newlineSequences[j] && newlineSequences[j].length || 0;\n if (j === i) {\n const pad = start - (count - (lineLength + newLineSeqLength));\n const length = Math.max(\n 1,\n end > count ? lineLength - pad : end - start\n );\n res.push(` | ` + \" \".repeat(pad) + \"^\".repeat(length));\n } else if (j > i) {\n if (end > count) {\n const length = Math.max(Math.min(end - count, lineLength), 1);\n res.push(` | ` + \"^\".repeat(length));\n }\n count += lineLength + newLineSeqLength;\n }\n }\n break;\n }\n }\n return res.join(\"\\n\");\n}\n\nfunction normalizeStyle(value) {\n if (isArray(value)) {\n const res = {};\n for (let i = 0; i < value.length; i++) {\n const item = value[i];\n const normalized = isString(item) ? parseStringStyle(item) : normalizeStyle(item);\n if (normalized) {\n for (const key in normalized) {\n res[key] = normalized[key];\n }\n }\n }\n return res;\n } else if (isString(value) || isObject(value)) {\n return value;\n }\n}\nconst listDelimiterRE = /;(?![^(]*\\))/g;\nconst propertyDelimiterRE = /:([^]+)/;\nconst styleCommentRE = /\\/\\*[^]*?\\*\\//g;\nfunction parseStringStyle(cssText) {\n const ret = {};\n cssText.replace(styleCommentRE, \"\").split(listDelimiterRE).forEach((item) => {\n if (item) {\n const tmp = item.split(propertyDelimiterRE);\n tmp.length > 1 && (ret[tmp[0].trim()] = tmp[1].trim());\n }\n });\n return ret;\n}\nfunction stringifyStyle(styles) {\n let ret = \"\";\n if (!styles || isString(styles)) {\n return ret;\n }\n for (const key in styles) {\n const value = styles[key];\n const normalizedKey = key.startsWith(`--`) ? key : hyphenate(key);\n if (isString(value) || typeof value === \"number\") {\n ret += `${normalizedKey}:${value};`;\n }\n }\n return ret;\n}\nfunction normalizeClass(value) {\n let res = \"\";\n if (isString(value)) {\n res = value;\n } else if (isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n const normalized = normalizeClass(value[i]);\n if (normalized) {\n res += normalized + \" \";\n }\n }\n } else if (isObject(value)) {\n for (const name in value) {\n if (value[name]) {\n res += name + \" \";\n }\n }\n }\n return res.trim();\n}\nfunction normalizeProps(props) {\n if (!props)\n return null;\n let { class: klass, style } = props;\n if (klass && !isString(klass)) {\n props.class = normalizeClass(klass);\n }\n if (style) {\n props.style = normalizeStyle(style);\n }\n return props;\n}\n\nconst HTML_TAGS = \"html,body,base,head,link,meta,style,title,address,article,aside,footer,header,hgroup,h1,h2,h3,h4,h5,h6,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,summary,template,blockquote,iframe,tfoot\";\nconst SVG_TAGS = \"svg,animate,animateMotion,animateTransform,circle,clipPath,color-profile,defs,desc,discard,ellipse,feBlend,feColorMatrix,feComponentTransfer,feComposite,feConvolveMatrix,feDiffuseLighting,feDisplacementMap,feDistantLight,feDropShadow,feFlood,feFuncA,feFuncB,feFuncG,feFuncR,feGaussianBlur,feImage,feMerge,feMergeNode,feMorphology,feOffset,fePointLight,feSpecularLighting,feSpotLight,feTile,feTurbulence,filter,foreignObject,g,hatch,hatchpath,image,line,linearGradient,marker,mask,mesh,meshgradient,meshpatch,meshrow,metadata,mpath,path,pattern,polygon,polyline,radialGradient,rect,set,solidcolor,stop,switch,symbol,text,textPath,title,tspan,unknown,use,view\";\nconst MATH_TAGS = \"annotation,annotation-xml,maction,maligngroup,malignmark,math,menclose,merror,mfenced,mfrac,mfraction,mglyph,mi,mlabeledtr,mlongdiv,mmultiscripts,mn,mo,mover,mpadded,mphantom,mprescripts,mroot,mrow,ms,mscarries,mscarry,msgroup,msline,mspace,msqrt,msrow,mstack,mstyle,msub,msubsup,msup,mtable,mtd,mtext,mtr,munder,munderover,none,semantics\";\nconst VOID_TAGS = \"area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr\";\nconst isHTMLTag = /* @__PURE__ */ makeMap(HTML_TAGS);\nconst isSVGTag = /* @__PURE__ */ makeMap(SVG_TAGS);\nconst isMathMLTag = /* @__PURE__ */ makeMap(MATH_TAGS);\nconst isVoidTag = /* @__PURE__ */ makeMap(VOID_TAGS);\n\nconst specialBooleanAttrs = `itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly`;\nconst isSpecialBooleanAttr = /* @__PURE__ */ makeMap(specialBooleanAttrs);\nconst isBooleanAttr = /* @__PURE__ */ makeMap(\n specialBooleanAttrs + `,async,autofocus,autoplay,controls,default,defer,disabled,hidden,inert,loop,open,required,reversed,scoped,seamless,checked,muted,multiple,selected`\n);\nfunction includeBooleanAttr(value) {\n return !!value || value === \"\";\n}\nconst unsafeAttrCharRE = /[>/=\"'\\u0009\\u000a\\u000c\\u0020]/;\nconst attrValidationCache = {};\nfunction isSSRSafeAttrName(name) {\n if (attrValidationCache.hasOwnProperty(name)) {\n return attrValidationCache[name];\n }\n const isUnsafe = unsafeAttrCharRE.test(name);\n if (isUnsafe) {\n console.error(`unsafe attribute name: ${name}`);\n }\n return attrValidationCache[name] = !isUnsafe;\n}\nconst propsToAttrMap = {\n acceptCharset: \"accept-charset\",\n className: \"class\",\n htmlFor: \"for\",\n httpEquiv: \"http-equiv\"\n};\nconst isKnownHtmlAttr = /* @__PURE__ */ makeMap(\n `accept,accept-charset,accesskey,action,align,allow,alt,async,autocapitalize,autocomplete,autofocus,autoplay,background,bgcolor,border,buffered,capture,challenge,charset,checked,cite,class,code,codebase,color,cols,colspan,content,contenteditable,contextmenu,controls,coords,crossorigin,csp,data,datetime,decoding,default,defer,dir,dirname,disabled,download,draggable,dropzone,enctype,enterkeyhint,for,form,formaction,formenctype,formmethod,formnovalidate,formtarget,headers,height,hidden,high,href,hreflang,http-equiv,icon,id,importance,inert,integrity,ismap,itemprop,keytype,kind,label,lang,language,loading,list,loop,low,manifest,max,maxlength,minlength,media,min,multiple,muted,name,novalidate,open,optimum,pattern,ping,placeholder,poster,preload,radiogroup,readonly,referrerpolicy,rel,required,reversed,rows,rowspan,sandbox,scope,scoped,selected,shape,size,sizes,slot,span,spellcheck,src,srcdoc,srclang,srcset,start,step,style,summary,tabindex,target,title,translate,type,usemap,value,width,wrap`\n);\nconst isKnownSvgAttr = /* @__PURE__ */ makeMap(\n `xmlns,accent-height,accumulate,additive,alignment-baseline,alphabetic,amplitude,arabic-form,ascent,attributeName,attributeType,azimuth,baseFrequency,baseline-shift,baseProfile,bbox,begin,bias,by,calcMode,cap-height,class,clip,clipPathUnits,clip-path,clip-rule,color,color-interpolation,color-interpolation-filters,color-profile,color-rendering,contentScriptType,contentStyleType,crossorigin,cursor,cx,cy,d,decelerate,descent,diffuseConstant,direction,display,divisor,dominant-baseline,dur,dx,dy,edgeMode,elevation,enable-background,end,exponent,fill,fill-opacity,fill-rule,filter,filterRes,filterUnits,flood-color,flood-opacity,font-family,font-size,font-size-adjust,font-stretch,font-style,font-variant,font-weight,format,from,fr,fx,fy,g1,g2,glyph-name,glyph-orientation-horizontal,glyph-orientation-vertical,glyphRef,gradientTransform,gradientUnits,hanging,height,href,hreflang,horiz-adv-x,horiz-origin-x,id,ideographic,image-rendering,in,in2,intercept,k,k1,k2,k3,k4,kernelMatrix,kernelUnitLength,kerning,keyPoints,keySplines,keyTimes,lang,lengthAdjust,letter-spacing,lighting-color,limitingConeAngle,local,marker-end,marker-mid,marker-start,markerHeight,markerUnits,markerWidth,mask,maskContentUnits,maskUnits,mathematical,max,media,method,min,mode,name,numOctaves,offset,opacity,operator,order,orient,orientation,origin,overflow,overline-position,overline-thickness,panose-1,paint-order,path,pathLength,patternContentUnits,patternTransform,patternUnits,ping,pointer-events,points,pointsAtX,pointsAtY,pointsAtZ,preserveAlpha,preserveAspectRatio,primitiveUnits,r,radius,referrerPolicy,refX,refY,rel,rendering-intent,repeatCount,repeatDur,requiredExtensions,requiredFeatures,restart,result,rotate,rx,ry,scale,seed,shape-rendering,slope,spacing,specularConstant,specularExponent,speed,spreadMethod,startOffset,stdDeviation,stemh,stemv,stitchTiles,stop-color,stop-opacity,strikethrough-position,strikethrough-thickness,string,stroke,stroke-dasharray,stroke-dashoffset,stroke-linecap,stroke-linejoin,stroke-miterlimit,stroke-opacity,stroke-width,style,surfaceScale,systemLanguage,tabindex,tableValues,target,targetX,targetY,text-anchor,text-decoration,text-rendering,textLength,to,transform,transform-origin,type,u1,u2,underline-position,underline-thickness,unicode,unicode-bidi,unicode-range,units-per-em,v-alphabetic,v-hanging,v-ideographic,v-mathematical,values,vector-effect,version,vert-adv-y,vert-origin-x,vert-origin-y,viewBox,viewTarget,visibility,width,widths,word-spacing,writing-mode,x,x-height,x1,x2,xChannelSelector,xlink:actuate,xlink:arcrole,xlink:href,xlink:role,xlink:show,xlink:title,xlink:type,xmlns:xlink,xml:base,xml:lang,xml:space,y,y1,y2,yChannelSelector,z,zoomAndPan`\n);\nfunction isRenderableAttrValue(value) {\n if (value == null) {\n return false;\n }\n const type = typeof value;\n return type === \"string\" || type === \"number\" || type === \"boolean\";\n}\n\nconst escapeRE = /[\"'&<>]/;\nfunction escapeHtml(string) {\n const str = \"\" + string;\n const match = escapeRE.exec(str);\n if (!match) {\n return str;\n }\n let html = \"\";\n let escaped;\n let index;\n let lastIndex = 0;\n for (index = match.index; index < str.length; index++) {\n switch (str.charCodeAt(index)) {\n case 34:\n escaped = \"&quot;\";\n break;\n case 38:\n escaped = \"&amp;\";\n break;\n case 39:\n escaped = \"&#39;\";\n break;\n case 60:\n escaped = \"&lt;\";\n break;\n case 62:\n escaped = \"&gt;\";\n break;\n default:\n continue;\n }\n if (lastIndex !== index) {\n html += str.slice(lastIndex, index);\n }\n lastIndex = index + 1;\n html += escaped;\n }\n return lastIndex !== index ? html + str.slice(lastIndex, index) : html;\n}\nconst commentStripRE = /^-?>|<!--|-->|--!>|<!-$/g;\nfunction escapeHtmlComment(src) {\n return src.replace(commentStripRE, \"\");\n}\n\nfunction looseCompareArrays(a, b) {\n if (a.length !== b.length)\n return false;\n let equal = true;\n for (let i = 0; equal && i < a.length; i++) {\n equal = looseEqual(a[i], b[i]);\n }\n return equal;\n}\nfunction looseEqual(a, b) {\n if (a === b)\n return true;\n let aValidType = isDate(a);\n let bValidType = isDate(b);\n if (aValidType || bValidType) {\n return aValidType && bValidType ? a.getTime() === b.getTime() : false;\n }\n aValidType = isSymbol(a);\n bValidType = isSymbol(b);\n if (aValidType || bValidType) {\n return a === b;\n }\n aValidType = isArray(a);\n bValidType = isArray(b);\n if (aValidType || bValidType) {\n return aValidType && bValidType ? looseCompareArrays(a, b) : false;\n }\n aValidType = isObject(a);\n bValidType = isObject(b);\n if (aValidType || bValidType) {\n if (!aValidType || !bValidType) {\n return false;\n }\n const aKeysCount = Object.keys(a).length;\n const bKeysCount = Object.keys(b).length;\n if (aKeysCount !== bKeysCount) {\n return false;\n }\n for (const key in a) {\n const aHasKey = a.hasOwnProperty(key);\n const bHasKey = b.hasOwnProperty(key);\n if (aHasKey && !bHasKey || !aHasKey && bHasKey || !looseEqual(a[key], b[key])) {\n return false;\n }\n }\n }\n return String(a) === String(b);\n}\nfunction looseIndexOf(arr, val) {\n return arr.findIndex((item) => looseEqual(item, val));\n}\n\nconst toDisplayString = (val) => {\n return isString(val) ? val : val == null ? \"\" : isArray(val) || isObject(val) && (val.toString === objectToString || !isFunction(val.toString)) ? JSON.stringify(val, replacer, 2) : String(val);\n};\nconst replacer = (_key, val) => {\n if (val && val.__v_isRef) {\n return replacer(_key, val.value);\n } else if (isMap(val)) {\n return {\n [`Map(${val.size})`]: [...val.entries()].reduce(\n (entries, [key, val2], i) => {\n entries[stringifySymbol(key, i) + \" =>\"] = val2;\n return entries;\n },\n {}\n )\n };\n } else if (isSet(val)) {\n return {\n [`Set(${val.size})`]: [...val.values()].map((v) => stringifySymbol(v))\n };\n } else if (isSymbol(val)) {\n return stringifySymbol(val);\n } else if (isObject(val) && !isArray(val) && !isPlainObject(val)) {\n return String(val);\n }\n return val;\n};\nconst stringifySymbol = (v, i = \"\") => {\n var _a;\n return isSymbol(v) ? `Symbol(${(_a = v.description) != null ? _a : i})` : v;\n};\n\nexport { EMPTY_ARR, EMPTY_OBJ, NO, NOOP, PatchFlagNames, PatchFlags, ShapeFlags, SlotFlags, camelize, capitalize, def, escapeHtml, escapeHtmlComment, extend, genPropsAccessExp, generateCodeFrame, getGlobalThis, hasChanged, hasOwn, hyphenate, includeBooleanAttr, invokeArrayFns, isArray, isBooleanAttr, isBuiltInDirective, isDate, isFunction, isGloballyAllowed, isGloballyWhitelisted, isHTMLTag, isIntegerKey, isKnownHtmlAttr, isKnownSvgAttr, isMap, isMathMLTag, isModelListener, isObject, isOn, isPlainObject, isPromise, isRegExp, isRenderableAttrValue, isReservedProp, isSSRSafeAttrName, isSVGTag, isSet, isSpecialBooleanAttr, isString, isSymbol, isVoidTag, looseEqual, looseIndexOf, looseToNumber, makeMap, normalizeClass, normalizeProps, normalizeStyle, objectToString, parseStringStyle, propsToAttrMap, remove, slotFlagsText, stringifyStyle, toDisplayString, toHandlerKey, toNumber, toRawType, toTypeString };\n"],
"mappings": ";AAKA,SAAS,QAAQ,KAAK,kBAAkB;AACtC,QAAM,MAAM,IAAI,IAAI,IAAI,MAAM,GAAG,CAAC;AAClC,SAAO,mBAAmB,CAAC,QAAQ,IAAI,IAAI,IAAI,YAAY,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,GAAG;AACtF;AAEA,IAAM,YAAY,OAA4C,OAAO,OAAO,CAAC,CAAC,IAAI,CAAC;AACnF,IAAM,YAAY,OAA4C,OAAO,OAAO,CAAC,CAAC,IAAI,CAAC;AACnF,IAAM,OAAO,MAAM;AACnB;AACA,IAAM,KAAK,MAAM;AACjB,IAAM,OAAO,CAAC,QAAQ,IAAI,WAAW,CAAC,MAAM,OAAO,IAAI,WAAW,CAAC,MAAM;AAAA,CACxE,IAAI,WAAW,CAAC,IAAI,OAAO,IAAI,WAAW,CAAC,IAAI;AAChD,IAAM,kBAAkB,CAAC,QAAQ,IAAI,WAAW,WAAW;AAC3D,IAAM,SAAS,OAAO;AACtB,IAAM,SAAS,CAAC,KAAK,OAAO;AAC1B,QAAM,IAAI,IAAI,QAAQ,EAAE;AACxB,MAAI,IAAI,IAAI;AACV,QAAI,OAAO,GAAG,CAAC;AAAA,EACjB;AACF;AACA,IAAM,iBAAiB,OAAO,UAAU;AACxC,IAAM,SAAS,CAAC,KAAK,QAAQ,eAAe,KAAK,KAAK,GAAG;AACzD,IAAM,UAAU,MAAM;AACtB,IAAM,QAAQ,CAAC,QAAQ,aAAa,GAAG,MAAM;AAC7C,IAAM,QAAQ,CAAC,QAAQ,aAAa,GAAG,MAAM;AAC7C,IAAM,SAAS,CAAC,QAAQ,aAAa,GAAG,MAAM;AAC9C,IAAM,WAAW,CAAC,QAAQ,aAAa,GAAG,MAAM;AAChD,IAAM,aAAa,CAAC,QAAQ,OAAO,QAAQ;AAC3C,IAAM,WAAW,CAAC,QAAQ,OAAO,QAAQ;AACzC,IAAM,WAAW,CAAC,QAAQ,OAAO,QAAQ;AACzC,IAAM,WAAW,CAAC,QAAQ,QAAQ,QAAQ,OAAO,QAAQ;AACzD,IAAM,YAAY,CAAC,QAAQ;AACzB,UAAQ,SAAS,GAAG,KAAK,WAAW,GAAG,MAAM,WAAW,IAAI,IAAI,KAAK,WAAW,IAAI,KAAK;AAC3F;AACA,IAAM,iBAAiB,OAAO,UAAU;AACxC,IAAM,eAAe,CAAC,UAAU,eAAe,KAAK,KAAK;AACzD,IAAM,YAAY,CAAC,UAAU;AAC3B,SAAO,aAAa,KAAK,EAAE,MAAM,GAAG,EAAE;AACxC;AACA,IAAM,gBAAgB,CAAC,QAAQ,aAAa,GAAG,MAAM;AACrD,IAAM,eAAe,CAAC,QAAQ,SAAS,GAAG,KAAK,QAAQ,SAAS,IAAI,CAAC,MAAM,OAAO,KAAK,SAAS,KAAK,EAAE,MAAM;AAC7G,IAAM,iBAAiC;AAAA;AAAA,EAErC;AACF;AACA,IAAM,qBAAqC;AAAA,EACzC;AACF;AACA,IAAM,sBAAsB,CAAC,OAAO;AAClC,QAAM,QAAwB,uBAAO,OAAO,IAAI;AAChD,SAAO,CAAC,QAAQ;AACd,UAAM,MAAM,MAAM,GAAG;AACrB,WAAO,QAAQ,MAAM,GAAG,IAAI,GAAG,GAAG;AAAA,EACpC;AACF;AACA,IAAM,aAAa;AACnB,IAAM,WAAW,oBAAoB,CAAC,QAAQ;AAC5C,SAAO,IAAI,QAAQ,YAAY,CAAC,GAAG,MAAM,IAAI,EAAE,YAAY,IAAI,EAAE;AACnE,CAAC;AACD,IAAM,cAAc;AACpB,IAAM,YAAY;AAAA,EAChB,CAAC,QAAQ,IAAI,QAAQ,aAAa,KAAK,EAAE,YAAY;AACvD;AACA,IAAM,aAAa,oBAAoB,CAAC,QAAQ;AAC9C,SAAO,IAAI,OAAO,CAAC,EAAE,YAAY,IAAI,IAAI,MAAM,CAAC;AAClD,CAAC;AACD,IAAM,eAAe,oBAAoB,CAAC,QAAQ;AAChD,QAAM,IAAI,MAAM,KAAK,WAAW,GAAG,CAAC,KAAK;AACzC,SAAO;AACT,CAAC;AACD,IAAM,aAAa,CAAC,OAAO,aAAa,CAAC,OAAO,GAAG,OAAO,QAAQ;AAClE,IAAM,iBAAiB,CAAC,KAAK,QAAQ;AACnC,WAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACnC,QAAI,CAAC,EAAE,GAAG;AAAA,EACZ;AACF;AACA,IAAM,MAAM,CAAC,KAAK,KAAK,UAAU;AAC/B,SAAO,eAAe,KAAK,KAAK;AAAA,IAC9B,cAAc;AAAA,IACd,YAAY;AAAA,IACZ;AAAA,EACF,CAAC;AACH;AACA,IAAM,gBAAgB,CAAC,QAAQ;AAC7B,QAAM,IAAI,WAAW,GAAG;AACxB,SAAO,MAAM,CAAC,IAAI,MAAM;AAC1B;AACA,IAAM,WAAW,CAAC,QAAQ;AACxB,QAAM,IAAI,SAAS,GAAG,IAAI,OAAO,GAAG,IAAI;AACxC,SAAO,MAAM,CAAC,IAAI,MAAM;AAC1B;AACA,IAAI;AACJ,IAAM,gBAAgB,MAAM;AAC1B,SAAO,gBAAgB,cAAc,OAAO,eAAe,cAAc,aAAa,OAAO,SAAS,cAAc,OAAO,OAAO,WAAW,cAAc,SAAS,OAAO,WAAW,cAAc,SAAS,CAAC;AAChN;AA4FA,IAAM,kBAAkB;AACxB,IAAM,oBAAoC,QAAQ,eAAe;AA2CjE,SAAS,eAAe,OAAO;AAC7B,MAAI,QAAQ,KAAK,GAAG;AAClB,UAAM,MAAM,CAAC;AACb,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,YAAM,OAAO,MAAM,CAAC;AACpB,YAAM,aAAa,SAAS,IAAI,IAAI,iBAAiB,IAAI,IAAI,eAAe,IAAI;AAChF,UAAI,YAAY;AACd,mBAAW,OAAO,YAAY;AAC5B,cAAI,GAAG,IAAI,WAAW,GAAG;AAAA,QAC3B;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT,WAAW,SAAS,KAAK,KAAK,SAAS,KAAK,GAAG;AAC7C,WAAO;AAAA,EACT;AACF;AACA,IAAM,kBAAkB;AACxB,IAAM,sBAAsB;AAC5B,IAAM,iBAAiB;AACvB,SAAS,iBAAiB,SAAS;AACjC,QAAM,MAAM,CAAC;AACb,UAAQ,QAAQ,gBAAgB,EAAE,EAAE,MAAM,eAAe,EAAE,QAAQ,CAAC,SAAS;AAC3E,QAAI,MAAM;AACR,YAAM,MAAM,KAAK,MAAM,mBAAmB;AAC1C,UAAI,SAAS,MAAM,IAAI,IAAI,CAAC,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,EAAE,KAAK;AAAA,IACtD;AAAA,EACF,CAAC;AACD,SAAO;AACT;AACA,SAAS,eAAe,QAAQ;AAC9B,MAAI,MAAM;AACV,MAAI,CAAC,UAAU,SAAS,MAAM,GAAG;AAC/B,WAAO;AAAA,EACT;AACA,aAAW,OAAO,QAAQ;AACxB,UAAM,QAAQ,OAAO,GAAG;AACxB,UAAM,gBAAgB,IAAI,WAAW,IAAI,IAAI,MAAM,UAAU,GAAG;AAChE,QAAI,SAAS,KAAK,KAAK,OAAO,UAAU,UAAU;AAChD,aAAO,GAAG,aAAa,IAAI,KAAK;AAAA,IAClC;AAAA,EACF;AACA,SAAO;AACT;AACA,SAAS,eAAe,OAAO;AAC7B,MAAI,MAAM;AACV,MAAI,SAAS,KAAK,GAAG;AACnB,UAAM;AAAA,EACR,WAAW,QAAQ,KAAK,GAAG;AACzB,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,YAAM,aAAa,eAAe,MAAM,CAAC,CAAC;AAC1C,UAAI,YAAY;AACd,eAAO,aAAa;AAAA,MACtB;AAAA,IACF;AAAA,EACF,WAAW,SAAS,KAAK,GAAG;AAC1B,eAAW,QAAQ,OAAO;AACxB,UAAI,MAAM,IAAI,GAAG;AACf,eAAO,OAAO;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AACA,SAAO,IAAI,KAAK;AAClB;AACA,SAAS,eAAe,OAAO;AAC7B,MAAI,CAAC;AACH,WAAO;AACT,MAAI,EAAE,OAAO,OAAO,MAAM,IAAI;AAC9B,MAAI,SAAS,CAAC,SAAS,KAAK,GAAG;AAC7B,UAAM,QAAQ,eAAe,KAAK;AAAA,EACpC;AACA,MAAI,OAAO;AACT,UAAM,QAAQ,eAAe,KAAK;AAAA,EACpC;AACA,SAAO;AACT;AAEA,IAAM,YAAY;AAClB,IAAM,WAAW;AACjB,IAAM,YAAY;AAClB,IAAM,YAAY;AAClB,IAAM,YAA4B,QAAQ,SAAS;AACnD,IAAM,WAA2B,QAAQ,QAAQ;AACjD,IAAM,cAA8B,QAAQ,SAAS;AACrD,IAAM,YAA4B,QAAQ,SAAS;AAEnD,IAAM,sBAAsB;AAC5B,IAAM,uBAAuC,QAAQ,mBAAmB;AACxE,IAAM,gBAAgC;AAAA,EACpC,sBAAsB;AACxB;AACA,SAAS,mBAAmB,OAAO;AACjC,SAAO,CAAC,CAAC,SAAS,UAAU;AAC9B;AAmBA,IAAM,kBAAkC;AAAA,EACtC;AACF;AACA,IAAM,iBAAiC;AAAA,EACrC;AACF;AACA,SAAS,sBAAsB,OAAO;AACpC,MAAI,SAAS,MAAM;AACjB,WAAO;AAAA,EACT;AACA,QAAM,OAAO,OAAO;AACpB,SAAO,SAAS,YAAY,SAAS,YAAY,SAAS;AAC5D;AA8CA,SAAS,mBAAmB,GAAG,GAAG;AAChC,MAAI,EAAE,WAAW,EAAE;AACjB,WAAO;AACT,MAAI,QAAQ;AACZ,WAAS,IAAI,GAAG,SAAS,IAAI,EAAE,QAAQ,KAAK;AAC1C,YAAQ,WAAW,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AAAA,EAC/B;AACA,SAAO;AACT;AACA,SAAS,WAAW,GAAG,GAAG;AACxB,MAAI,MAAM;AACR,WAAO;AACT,MAAI,aAAa,OAAO,CAAC;AACzB,MAAI,aAAa,OAAO,CAAC;AACzB,MAAI,cAAc,YAAY;AAC5B,WAAO,cAAc,aAAa,EAAE,QAAQ,MAAM,EAAE,QAAQ,IAAI;AAAA,EAClE;AACA,eAAa,SAAS,CAAC;AACvB,eAAa,SAAS,CAAC;AACvB,MAAI,cAAc,YAAY;AAC5B,WAAO,MAAM;AAAA,EACf;AACA,eAAa,QAAQ,CAAC;AACtB,eAAa,QAAQ,CAAC;AACtB,MAAI,cAAc,YAAY;AAC5B,WAAO,cAAc,aAAa,mBAAmB,GAAG,CAAC,IAAI;AAAA,EAC/D;AACA,eAAa,SAAS,CAAC;AACvB,eAAa,SAAS,CAAC;AACvB,MAAI,cAAc,YAAY;AAC5B,QAAI,CAAC,cAAc,CAAC,YAAY;AAC9B,aAAO;AAAA,IACT;AACA,UAAM,aAAa,OAAO,KAAK,CAAC,EAAE;AAClC,UAAM,aAAa,OAAO,KAAK,CAAC,EAAE;AAClC,QAAI,eAAe,YAAY;AAC7B,aAAO;AAAA,IACT;AACA,eAAW,OAAO,GAAG;AACnB,YAAM,UAAU,EAAE,eAAe,GAAG;AACpC,YAAM,UAAU,EAAE,eAAe,GAAG;AACpC,UAAI,WAAW,CAAC,WAAW,CAAC,WAAW,WAAW,CAAC,WAAW,EAAE,GAAG,GAAG,EAAE,GAAG,CAAC,GAAG;AAC7E,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACA,SAAO,OAAO,CAAC,MAAM,OAAO,CAAC;AAC/B;AACA,SAAS,aAAa,KAAK,KAAK;AAC9B,SAAO,IAAI,UAAU,CAAC,SAAS,WAAW,MAAM,GAAG,CAAC;AACtD;AAEA,IAAM,kBAAkB,CAAC,QAAQ;AAC/B,SAAO,SAAS,GAAG,IAAI,MAAM,OAAO,OAAO,KAAK,QAAQ,GAAG,KAAK,SAAS,GAAG,MAAM,IAAI,aAAa,kBAAkB,CAAC,WAAW,IAAI,QAAQ,KAAK,KAAK,UAAU,KAAK,UAAU,CAAC,IAAI,OAAO,GAAG;AACjM;AACA,IAAM,WAAW,CAAC,MAAM,QAAQ;AAC9B,MAAI,OAAO,IAAI,WAAW;AACxB,WAAO,SAAS,MAAM,IAAI,KAAK;AAAA,EACjC,WAAW,MAAM,GAAG,GAAG;AACrB,WAAO;AAAA,MACL,CAAC,OAAO,IAAI,IAAI,GAAG,GAAG,CAAC,GAAG,IAAI,QAAQ,CAAC,EAAE;AAAA,QACvC,CAAC,SAAS,CAAC,KAAK,IAAI,GAAG,MAAM;AAC3B,kBAAQ,gBAAgB,KAAK,CAAC,IAAI,KAAK,IAAI;AAC3C,iBAAO;AAAA,QACT;AAAA,QACA,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF,WAAW,MAAM,GAAG,GAAG;AACrB,WAAO;AAAA,MACL,CAAC,OAAO,IAAI,IAAI,GAAG,GAAG,CAAC,GAAG,IAAI,OAAO,CAAC,EAAE,IAAI,CAAC,MAAM,gBAAgB,CAAC,CAAC;AAAA,IACvE;AAAA,EACF,WAAW,SAAS,GAAG,GAAG;AACxB,WAAO,gBAAgB,GAAG;AAAA,EAC5B,WAAW,SAAS,GAAG,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,cAAc,GAAG,GAAG;AAChE,WAAO,OAAO,GAAG;AAAA,EACnB;AACA,SAAO;AACT;AACA,IAAM,kBAAkB,CAAC,GAAG,IAAI,OAAO;AACrC,MAAI;AACJ,SAAO,SAAS,CAAC,IAAI,WAAW,KAAK,EAAE,gBAAgB,OAAO,KAAK,CAAC,MAAM;AAC5E;",
"names": []
}
// node_modules/@vue/devtools-api/lib/esm/env.js
function getDevtoolsGlobalHook() {
return getTarget().__VUE_DEVTOOLS_GLOBAL_HOOK__;
}
function getTarget() {
return typeof navigator !== "undefined" && typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : {};
}
var isProxyAvailable = typeof Proxy === "function";
// node_modules/@vue/devtools-api/lib/esm/const.js
var HOOK_SETUP = "devtools-plugin:setup";
var HOOK_PLUGIN_SETTINGS_SET = "plugin:settings:set";
// node_modules/@vue/devtools-api/lib/esm/time.js
var supported;
var perf;
function isPerformanceSupported() {
var _a;
if (supported !== void 0) {
return supported;
}
if (typeof window !== "undefined" && window.performance) {
supported = true;
perf = window.performance;
} else if (typeof global !== "undefined" && ((_a = global.perf_hooks) === null || _a === void 0 ? void 0 : _a.performance)) {
supported = true;
perf = global.perf_hooks.performance;
} else {
supported = false;
}
return supported;
}
function now() {
return isPerformanceSupported() ? perf.now() : Date.now();
}
// node_modules/@vue/devtools-api/lib/esm/proxy.js
var ApiProxy = class {
constructor(plugin, hook) {
this.target = null;
this.targetQueue = [];
this.onQueue = [];
this.plugin = plugin;
this.hook = hook;
const defaultSettings = {};
if (plugin.settings) {
for (const id in plugin.settings) {
const item = plugin.settings[id];
defaultSettings[id] = item.defaultValue;
}
}
const localSettingsSaveId = `__vue-devtools-plugin-settings__${plugin.id}`;
let currentSettings = Object.assign({}, defaultSettings);
try {
const raw = localStorage.getItem(localSettingsSaveId);
const data = JSON.parse(raw);
Object.assign(currentSettings, data);
} catch (e) {
}
this.fallbacks = {
getSettings() {
return currentSettings;
},
setSettings(value) {
try {
localStorage.setItem(localSettingsSaveId, JSON.stringify(value));
} catch (e) {
}
currentSettings = value;
},
now() {
return now();
}
};
if (hook) {
hook.on(HOOK_PLUGIN_SETTINGS_SET, (pluginId, value) => {
if (pluginId === this.plugin.id) {
this.fallbacks.setSettings(value);
}
});
}
this.proxiedOn = new Proxy({}, {
get: (_target, prop) => {
if (this.target) {
return this.target.on[prop];
} else {
return (...args) => {
this.onQueue.push({
method: prop,
args
});
};
}
}
});
this.proxiedTarget = new Proxy({}, {
get: (_target, prop) => {
if (this.target) {
return this.target[prop];
} else if (prop === "on") {
return this.proxiedOn;
} else if (Object.keys(this.fallbacks).includes(prop)) {
return (...args) => {
this.targetQueue.push({
method: prop,
args,
resolve: () => {
}
});
return this.fallbacks[prop](...args);
};
} else {
return (...args) => {
return new Promise((resolve) => {
this.targetQueue.push({
method: prop,
args,
resolve
});
});
};
}
}
});
}
async setRealTarget(target) {
this.target = target;
for (const item of this.onQueue) {
this.target.on[item.method](...item.args);
}
for (const item of this.targetQueue) {
item.resolve(await this.target[item.method](...item.args));
}
}
};
// node_modules/@vue/devtools-api/lib/esm/index.js
function setupDevtoolsPlugin(pluginDescriptor, setupFn) {
const descriptor = pluginDescriptor;
const target = getTarget();
const hook = getDevtoolsGlobalHook();
const enableProxy = isProxyAvailable && descriptor.enableEarlyProxy;
if (hook && (target.__VUE_DEVTOOLS_PLUGIN_API_AVAILABLE__ || !enableProxy)) {
hook.emit(HOOK_SETUP, pluginDescriptor, setupFn);
} else {
const proxy = enableProxy ? new ApiProxy(descriptor, hook) : null;
const list = target.__VUE_DEVTOOLS_PLUGINS__ = target.__VUE_DEVTOOLS_PLUGINS__ || [];
list.push({
pluginDescriptor: descriptor,
setupFn,
proxy
});
if (proxy)
setupFn(proxy.proxiedTarget);
}
}
export {
isPerformanceSupported,
now,
setupDevtoolsPlugin
};
//# sourceMappingURL=chunk-J4VLYDXT.js.map
{
"version": 3,
"sources": ["../../../../node_modules/@vue/devtools-api/lib/esm/env.js", "../../../../node_modules/@vue/devtools-api/lib/esm/const.js", "../../../../node_modules/@vue/devtools-api/lib/esm/time.js", "../../../../node_modules/@vue/devtools-api/lib/esm/proxy.js", "../../../../node_modules/@vue/devtools-api/lib/esm/index.js"],
"sourcesContent": ["export function getDevtoolsGlobalHook() {\n return getTarget().__VUE_DEVTOOLS_GLOBAL_HOOK__;\n}\nexport function getTarget() {\n // @ts-ignore\n return (typeof navigator !== 'undefined' && typeof window !== 'undefined')\n ? window\n : typeof global !== 'undefined'\n ? global\n : {};\n}\nexport const isProxyAvailable = typeof Proxy === 'function';\n", "export const HOOK_SETUP = 'devtools-plugin:setup';\nexport const HOOK_PLUGIN_SETTINGS_SET = 'plugin:settings:set';\n", "let supported;\nlet perf;\nexport function isPerformanceSupported() {\n var _a;\n if (supported !== undefined) {\n return supported;\n }\n if (typeof window !== 'undefined' && window.performance) {\n supported = true;\n perf = window.performance;\n }\n else if (typeof global !== 'undefined' && ((_a = global.perf_hooks) === null || _a === void 0 ? void 0 : _a.performance)) {\n supported = true;\n perf = global.perf_hooks.performance;\n }\n else {\n supported = false;\n }\n return supported;\n}\nexport function now() {\n return isPerformanceSupported() ? perf.now() : Date.now();\n}\n", "import { HOOK_PLUGIN_SETTINGS_SET } from './const.js';\nimport { now } from './time.js';\nexport class ApiProxy {\n constructor(plugin, hook) {\n this.target = null;\n this.targetQueue = [];\n this.onQueue = [];\n this.plugin = plugin;\n this.hook = hook;\n const defaultSettings = {};\n if (plugin.settings) {\n for (const id in plugin.settings) {\n const item = plugin.settings[id];\n defaultSettings[id] = item.defaultValue;\n }\n }\n const localSettingsSaveId = `__vue-devtools-plugin-settings__${plugin.id}`;\n let currentSettings = Object.assign({}, defaultSettings);\n try {\n const raw = localStorage.getItem(localSettingsSaveId);\n const data = JSON.parse(raw);\n Object.assign(currentSettings, data);\n }\n catch (e) {\n // noop\n }\n this.fallbacks = {\n getSettings() {\n return currentSettings;\n },\n setSettings(value) {\n try {\n localStorage.setItem(localSettingsSaveId, JSON.stringify(value));\n }\n catch (e) {\n // noop\n }\n currentSettings = value;\n },\n now() {\n return now();\n },\n };\n if (hook) {\n hook.on(HOOK_PLUGIN_SETTINGS_SET, (pluginId, value) => {\n if (pluginId === this.plugin.id) {\n this.fallbacks.setSettings(value);\n }\n });\n }\n this.proxiedOn = new Proxy({}, {\n get: (_target, prop) => {\n if (this.target) {\n return this.target.on[prop];\n }\n else {\n return (...args) => {\n this.onQueue.push({\n method: prop,\n args,\n });\n };\n }\n },\n });\n this.proxiedTarget = new Proxy({}, {\n get: (_target, prop) => {\n if (this.target) {\n return this.target[prop];\n }\n else if (prop === 'on') {\n return this.proxiedOn;\n }\n else if (Object.keys(this.fallbacks).includes(prop)) {\n return (...args) => {\n this.targetQueue.push({\n method: prop,\n args,\n resolve: () => { },\n });\n return this.fallbacks[prop](...args);\n };\n }\n else {\n return (...args) => {\n return new Promise(resolve => {\n this.targetQueue.push({\n method: prop,\n args,\n resolve,\n });\n });\n };\n }\n },\n });\n }\n async setRealTarget(target) {\n this.target = target;\n for (const item of this.onQueue) {\n this.target.on[item.method](...item.args);\n }\n for (const item of this.targetQueue) {\n item.resolve(await this.target[item.method](...item.args));\n }\n }\n}\n", "import { getTarget, getDevtoolsGlobalHook, isProxyAvailable } from './env.js';\nimport { HOOK_SETUP } from './const.js';\nimport { ApiProxy } from './proxy.js';\nexport * from './api/index.js';\nexport * from './plugin.js';\nexport * from './time.js';\nexport function setupDevtoolsPlugin(pluginDescriptor, setupFn) {\n const descriptor = pluginDescriptor;\n const target = getTarget();\n const hook = getDevtoolsGlobalHook();\n const enableProxy = isProxyAvailable && descriptor.enableEarlyProxy;\n if (hook && (target.__VUE_DEVTOOLS_PLUGIN_API_AVAILABLE__ || !enableProxy)) {\n hook.emit(HOOK_SETUP, pluginDescriptor, setupFn);\n }\n else {\n const proxy = enableProxy ? new ApiProxy(descriptor, hook) : null;\n const list = target.__VUE_DEVTOOLS_PLUGINS__ = target.__VUE_DEVTOOLS_PLUGINS__ || [];\n list.push({\n pluginDescriptor: descriptor,\n setupFn,\n proxy,\n });\n if (proxy)\n setupFn(proxy.proxiedTarget);\n }\n}\n"],
"mappings": ";AAAO,SAAS,wBAAwB;AACpC,SAAO,UAAU,EAAE;AACvB;AACO,SAAS,YAAY;AAExB,SAAQ,OAAO,cAAc,eAAe,OAAO,WAAW,cACxD,SACA,OAAO,WAAW,cACd,SACA,CAAC;AACf;AACO,IAAM,mBAAmB,OAAO,UAAU;;;ACX1C,IAAM,aAAa;AACnB,IAAM,2BAA2B;;;ACDxC,IAAI;AACJ,IAAI;AACG,SAAS,yBAAyB;AACrC,MAAI;AACJ,MAAI,cAAc,QAAW;AACzB,WAAO;AAAA,EACX;AACA,MAAI,OAAO,WAAW,eAAe,OAAO,aAAa;AACrD,gBAAY;AACZ,WAAO,OAAO;AAAA,EAClB,WACS,OAAO,WAAW,iBAAiB,KAAK,OAAO,gBAAgB,QAAQ,OAAO,SAAS,SAAS,GAAG,cAAc;AACtH,gBAAY;AACZ,WAAO,OAAO,WAAW;AAAA,EAC7B,OACK;AACD,gBAAY;AAAA,EAChB;AACA,SAAO;AACX;AACO,SAAS,MAAM;AAClB,SAAO,uBAAuB,IAAI,KAAK,IAAI,IAAI,KAAK,IAAI;AAC5D;;;ACpBO,IAAM,WAAN,MAAe;AAAA,EAClB,YAAY,QAAQ,MAAM;AACtB,SAAK,SAAS;AACd,SAAK,cAAc,CAAC;AACpB,SAAK,UAAU,CAAC;AAChB,SAAK,SAAS;AACd,SAAK,OAAO;AACZ,UAAM,kBAAkB,CAAC;AACzB,QAAI,OAAO,UAAU;AACjB,iBAAW,MAAM,OAAO,UAAU;AAC9B,cAAM,OAAO,OAAO,SAAS,EAAE;AAC/B,wBAAgB,EAAE,IAAI,KAAK;AAAA,MAC/B;AAAA,IACJ;AACA,UAAM,sBAAsB,mCAAmC,OAAO,EAAE;AACxE,QAAI,kBAAkB,OAAO,OAAO,CAAC,GAAG,eAAe;AACvD,QAAI;AACA,YAAM,MAAM,aAAa,QAAQ,mBAAmB;AACpD,YAAM,OAAO,KAAK,MAAM,GAAG;AAC3B,aAAO,OAAO,iBAAiB,IAAI;AAAA,IACvC,SACO,GAAG;AAAA,IAEV;AACA,SAAK,YAAY;AAAA,MACb,cAAc;AACV,eAAO;AAAA,MACX;AAAA,MACA,YAAY,OAAO;AACf,YAAI;AACA,uBAAa,QAAQ,qBAAqB,KAAK,UAAU,KAAK,CAAC;AAAA,QACnE,SACO,GAAG;AAAA,QAEV;AACA,0BAAkB;AAAA,MACtB;AAAA,MACA,MAAM;AACF,eAAO,IAAI;AAAA,MACf;AAAA,IACJ;AACA,QAAI,MAAM;AACN,WAAK,GAAG,0BAA0B,CAAC,UAAU,UAAU;AACnD,YAAI,aAAa,KAAK,OAAO,IAAI;AAC7B,eAAK,UAAU,YAAY,KAAK;AAAA,QACpC;AAAA,MACJ,CAAC;AAAA,IACL;AACA,SAAK,YAAY,IAAI,MAAM,CAAC,GAAG;AAAA,MAC3B,KAAK,CAAC,SAAS,SAAS;AACpB,YAAI,KAAK,QAAQ;AACb,iBAAO,KAAK,OAAO,GAAG,IAAI;AAAA,QAC9B,OACK;AACD,iBAAO,IAAI,SAAS;AAChB,iBAAK,QAAQ,KAAK;AAAA,cACd,QAAQ;AAAA,cACR;AAAA,YACJ,CAAC;AAAA,UACL;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ,CAAC;AACD,SAAK,gBAAgB,IAAI,MAAM,CAAC,GAAG;AAAA,MAC/B,KAAK,CAAC,SAAS,SAAS;AACpB,YAAI,KAAK,QAAQ;AACb,iBAAO,KAAK,OAAO,IAAI;AAAA,QAC3B,WACS,SAAS,MAAM;AACpB,iBAAO,KAAK;AAAA,QAChB,WACS,OAAO,KAAK,KAAK,SAAS,EAAE,SAAS,IAAI,GAAG;AACjD,iBAAO,IAAI,SAAS;AAChB,iBAAK,YAAY,KAAK;AAAA,cAClB,QAAQ;AAAA,cACR;AAAA,cACA,SAAS,MAAM;AAAA,cAAE;AAAA,YACrB,CAAC;AACD,mBAAO,KAAK,UAAU,IAAI,EAAE,GAAG,IAAI;AAAA,UACvC;AAAA,QACJ,OACK;AACD,iBAAO,IAAI,SAAS;AAChB,mBAAO,IAAI,QAAQ,aAAW;AAC1B,mBAAK,YAAY,KAAK;AAAA,gBAClB,QAAQ;AAAA,gBACR;AAAA,gBACA;AAAA,cACJ,CAAC;AAAA,YACL,CAAC;AAAA,UACL;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ,CAAC;AAAA,EACL;AAAA,EACA,MAAM,cAAc,QAAQ;AACxB,SAAK,SAAS;AACd,eAAW,QAAQ,KAAK,SAAS;AAC7B,WAAK,OAAO,GAAG,KAAK,MAAM,EAAE,GAAG,KAAK,IAAI;AAAA,IAC5C;AACA,eAAW,QAAQ,KAAK,aAAa;AACjC,WAAK,QAAQ,MAAM,KAAK,OAAO,KAAK,MAAM,EAAE,GAAG,KAAK,IAAI,CAAC;AAAA,IAC7D;AAAA,EACJ;AACJ;;;ACpGO,SAAS,oBAAoB,kBAAkB,SAAS;AAC3D,QAAM,aAAa;AACnB,QAAM,SAAS,UAAU;AACzB,QAAM,OAAO,sBAAsB;AACnC,QAAM,cAAc,oBAAoB,WAAW;AACnD,MAAI,SAAS,OAAO,yCAAyC,CAAC,cAAc;AACxE,SAAK,KAAK,YAAY,kBAAkB,OAAO;AAAA,EACnD,OACK;AACD,UAAM,QAAQ,cAAc,IAAI,SAAS,YAAY,IAAI,IAAI;AAC7D,UAAM,OAAO,OAAO,2BAA2B,OAAO,4BAA4B,CAAC;AACnF,SAAK,KAAK;AAAA,MACN,kBAAkB;AAAA,MAClB;AAAA,MACA;AAAA,IACJ,CAAC;AACD,QAAI;AACA,cAAQ,MAAM,aAAa;AAAA,EACnC;AACJ;",
"names": []
}
因为 它太大了无法显示 source diff 。你可以改为 查看blob
因为 它太大了无法显示 source diff 。你可以改为 查看blob
import {
setupDevtoolsPlugin
} from "./chunk-J4VLYDXT.js";
import {
computed,
defineComponent,
getCurrentInstance,
h,
inject,
nextTick,
onActivated,
onDeactivated,
onUnmounted,
provide,
reactive,
ref,
shallowReactive,
shallowRef,
unref,
watch,
watchEffect
} from "./chunk-PYXZ4PKZ.js";
import "./chunk-EVOPDU7K.js";
// node_modules/vue-router/dist/vue-router.mjs
var isBrowser = typeof window !== "undefined";
function isESModule(obj) {
return obj.__esModule || obj[Symbol.toStringTag] === "Module";
}
var assign = Object.assign;
function applyToParams(fn, params) {
const newParams = {};
for (const key in params) {
const value = params[key];
newParams[key] = isArray(value) ? value.map(fn) : fn(value);
}
return newParams;
}
var noop = () => {
};
var isArray = Array.isArray;
function warn(msg) {
const args = Array.from(arguments).slice(1);
console.warn.apply(console, ["[Vue Router warn]: " + msg].concat(args));
}
var TRAILING_SLASH_RE = /\/$/;
var removeTrailingSlash = (path) => path.replace(TRAILING_SLASH_RE, "");
function parseURL(parseQuery2, location2, currentLocation = "/") {
let path, query = {}, searchString = "", hash = "";
const hashPos = location2.indexOf("#");
let searchPos = location2.indexOf("?");
if (hashPos < searchPos && hashPos >= 0) {
searchPos = -1;
}
if (searchPos > -1) {
path = location2.slice(0, searchPos);
searchString = location2.slice(searchPos + 1, hashPos > -1 ? hashPos : location2.length);
query = parseQuery2(searchString);
}
if (hashPos > -1) {
path = path || location2.slice(0, hashPos);
hash = location2.slice(hashPos, location2.length);
}
path = resolveRelativePath(path != null ? path : location2, currentLocation);
return {
fullPath: path + (searchString && "?") + searchString + hash,
path,
query,
hash
};
}
function stringifyURL(stringifyQuery2, location2) {
const query = location2.query ? stringifyQuery2(location2.query) : "";
return location2.path + (query && "?") + query + (location2.hash || "");
}
function stripBase(pathname, base) {
if (!base || !pathname.toLowerCase().startsWith(base.toLowerCase()))
return pathname;
return pathname.slice(base.length) || "/";
}
function isSameRouteLocation(stringifyQuery2, a, b) {
const aLastIndex = a.matched.length - 1;
const bLastIndex = b.matched.length - 1;
return aLastIndex > -1 && aLastIndex === bLastIndex && isSameRouteRecord(a.matched[aLastIndex], b.matched[bLastIndex]) && isSameRouteLocationParams(a.params, b.params) && stringifyQuery2(a.query) === stringifyQuery2(b.query) && a.hash === b.hash;
}
function isSameRouteRecord(a, b) {
return (a.aliasOf || a) === (b.aliasOf || b);
}
function isSameRouteLocationParams(a, b) {
if (Object.keys(a).length !== Object.keys(b).length)
return false;
for (const key in a) {
if (!isSameRouteLocationParamsValue(a[key], b[key]))
return false;
}
return true;
}
function isSameRouteLocationParamsValue(a, b) {
return isArray(a) ? isEquivalentArray(a, b) : isArray(b) ? isEquivalentArray(b, a) : a === b;
}
function isEquivalentArray(a, b) {
return isArray(b) ? a.length === b.length && a.every((value, i) => value === b[i]) : a.length === 1 && a[0] === b;
}
function resolveRelativePath(to, from) {
if (to.startsWith("/"))
return to;
if (!from.startsWith("/")) {
warn(`Cannot resolve a relative location without an absolute path. Trying to resolve "${to}" from "${from}". It should look like "/${from}".`);
return to;
}
if (!to)
return from;
const fromSegments = from.split("/");
const toSegments = to.split("/");
const lastToSegment = toSegments[toSegments.length - 1];
if (lastToSegment === ".." || lastToSegment === ".") {
toSegments.push("");
}
let position = fromSegments.length - 1;
let toPosition;
let segment;
for (toPosition = 0; toPosition < toSegments.length; toPosition++) {
segment = toSegments[toPosition];
if (segment === ".")
continue;
if (segment === "..") {
if (position > 1)
position--;
} else
break;
}
return fromSegments.slice(0, position).join("/") + "/" + toSegments.slice(toPosition - (toPosition === toSegments.length ? 1 : 0)).join("/");
}
var NavigationType;
(function(NavigationType2) {
NavigationType2["pop"] = "pop";
NavigationType2["push"] = "push";
})(NavigationType || (NavigationType = {}));
var NavigationDirection;
(function(NavigationDirection2) {
NavigationDirection2["back"] = "back";
NavigationDirection2["forward"] = "forward";
NavigationDirection2["unknown"] = "";
})(NavigationDirection || (NavigationDirection = {}));
var START = "";
function normalizeBase(base) {
if (!base) {
if (isBrowser) {
const baseEl = document.querySelector("base");
base = baseEl && baseEl.getAttribute("href") || "/";
base = base.replace(/^\w+:\/\/[^\/]+/, "");
} else {
base = "/";
}
}
if (base[0] !== "/" && base[0] !== "#")
base = "/" + base;
return removeTrailingSlash(base);
}
var BEFORE_HASH_RE = /^[^#]+#/;
function createHref(base, location2) {
return base.replace(BEFORE_HASH_RE, "#") + location2;
}
function getElementPosition(el, offset) {
const docRect = document.documentElement.getBoundingClientRect();
const elRect = el.getBoundingClientRect();
return {
behavior: offset.behavior,
left: elRect.left - docRect.left - (offset.left || 0),
top: elRect.top - docRect.top - (offset.top || 0)
};
}
var computeScrollPosition = () => ({
left: window.pageXOffset,
top: window.pageYOffset
});
function scrollToPosition(position) {
let scrollToOptions;
if ("el" in position) {
const positionEl = position.el;
const isIdSelector = typeof positionEl === "string" && positionEl.startsWith("#");
if (typeof position.el === "string") {
if (!isIdSelector || !document.getElementById(position.el.slice(1))) {
try {
const foundEl = document.querySelector(position.el);
if (isIdSelector && foundEl) {
warn(`The selector "${position.el}" should be passed as "el: document.querySelector('${position.el}')" because it starts with "#".`);
return;
}
} catch (err) {
warn(`The selector "${position.el}" is invalid. If you are using an id selector, make sure to escape it. You can find more information about escaping characters in selectors at https://mathiasbynens.be/notes/css-escapes or use CSS.escape (https://developer.mozilla.org/en-US/docs/Web/API/CSS/escape).`);
return;
}
}
}
const el = typeof positionEl === "string" ? isIdSelector ? document.getElementById(positionEl.slice(1)) : document.querySelector(positionEl) : positionEl;
if (!el) {
warn(`Couldn't find element using selector "${position.el}" returned by scrollBehavior.`);
return;
}
scrollToOptions = getElementPosition(el, position);
} else {
scrollToOptions = position;
}
if ("scrollBehavior" in document.documentElement.style)
window.scrollTo(scrollToOptions);
else {
window.scrollTo(scrollToOptions.left != null ? scrollToOptions.left : window.pageXOffset, scrollToOptions.top != null ? scrollToOptions.top : window.pageYOffset);
}
}
function getScrollKey(path, delta) {
const position = history.state ? history.state.position - delta : -1;
return position + path;
}
var scrollPositions = /* @__PURE__ */ new Map();
function saveScrollPosition(key, scrollPosition) {
scrollPositions.set(key, scrollPosition);
}
function getSavedScrollPosition(key) {
const scroll = scrollPositions.get(key);
scrollPositions.delete(key);
return scroll;
}
var createBaseLocation = () => location.protocol + "//" + location.host;
function createCurrentLocation(base, location2) {
const { pathname, search, hash } = location2;
const hashPos = base.indexOf("#");
if (hashPos > -1) {
let slicePos = hash.includes(base.slice(hashPos)) ? base.slice(hashPos).length : 1;
let pathFromHash = hash.slice(slicePos);
if (pathFromHash[0] !== "/")
pathFromHash = "/" + pathFromHash;
return stripBase(pathFromHash, "");
}
const path = stripBase(pathname, base);
return path + search + hash;
}
function useHistoryListeners(base, historyState, currentLocation, replace) {
let listeners = [];
let teardowns = [];
let pauseState = null;
const popStateHandler = ({ state }) => {
const to = createCurrentLocation(base, location);
const from = currentLocation.value;
const fromState = historyState.value;
let delta = 0;
if (state) {
currentLocation.value = to;
historyState.value = state;
if (pauseState && pauseState === from) {
pauseState = null;
return;
}
delta = fromState ? state.position - fromState.position : 0;
} else {
replace(to);
}
listeners.forEach((listener) => {
listener(currentLocation.value, from, {
delta,
type: NavigationType.pop,
direction: delta ? delta > 0 ? NavigationDirection.forward : NavigationDirection.back : NavigationDirection.unknown
});
});
};
function pauseListeners() {
pauseState = currentLocation.value;
}
function listen(callback) {
listeners.push(callback);
const teardown = () => {
const index = listeners.indexOf(callback);
if (index > -1)
listeners.splice(index, 1);
};
teardowns.push(teardown);
return teardown;
}
function beforeUnloadListener() {
const { history: history2 } = window;
if (!history2.state)
return;
history2.replaceState(assign({}, history2.state, { scroll: computeScrollPosition() }), "");
}
function destroy() {
for (const teardown of teardowns)
teardown();
teardowns = [];
window.removeEventListener("popstate", popStateHandler);
window.removeEventListener("beforeunload", beforeUnloadListener);
}
window.addEventListener("popstate", popStateHandler);
window.addEventListener("beforeunload", beforeUnloadListener, {
passive: true
});
return {
pauseListeners,
listen,
destroy
};
}
function buildState(back, current, forward, replaced = false, computeScroll = false) {
return {
back,
current,
forward,
replaced,
position: window.history.length,
scroll: computeScroll ? computeScrollPosition() : null
};
}
function useHistoryStateNavigation(base) {
const { history: history2, location: location2 } = window;
const currentLocation = {
value: createCurrentLocation(base, location2)
};
const historyState = { value: history2.state };
if (!historyState.value) {
changeLocation(currentLocation.value, {
back: null,
current: currentLocation.value,
forward: null,
// the length is off by one, we need to decrease it
position: history2.length - 1,
replaced: true,
// don't add a scroll as the user may have an anchor, and we want
// scrollBehavior to be triggered without a saved position
scroll: null
}, true);
}
function changeLocation(to, state, replace2) {
const hashIndex = base.indexOf("#");
const url = hashIndex > -1 ? (location2.host && document.querySelector("base") ? base : base.slice(hashIndex)) + to : createBaseLocation() + base + to;
try {
history2[replace2 ? "replaceState" : "pushState"](state, "", url);
historyState.value = state;
} catch (err) {
if (true) {
warn("Error with push/replace State", err);
} else {
console.error(err);
}
location2[replace2 ? "replace" : "assign"](url);
}
}
function replace(to, data) {
const state = assign({}, history2.state, buildState(
historyState.value.back,
// keep back and forward entries but override current position
to,
historyState.value.forward,
true
), data, { position: historyState.value.position });
changeLocation(to, state, true);
currentLocation.value = to;
}
function push(to, data) {
const currentState = assign(
{},
// use current history state to gracefully handle a wrong call to
// history.replaceState
// https://github.com/vuejs/router/issues/366
historyState.value,
history2.state,
{
forward: to,
scroll: computeScrollPosition()
}
);
if (!history2.state) {
warn(`history.state seems to have been manually replaced without preserving the necessary values. Make sure to preserve existing history state if you are manually calling history.replaceState:
history.replaceState(history.state, '', url)
You can find more information at https://next.router.vuejs.org/guide/migration/#usage-of-history-state.`);
}
changeLocation(currentState.current, currentState, true);
const state = assign({}, buildState(currentLocation.value, to, null), { position: currentState.position + 1 }, data);
changeLocation(to, state, false);
currentLocation.value = to;
}
return {
location: currentLocation,
state: historyState,
push,
replace
};
}
function createWebHistory(base) {
base = normalizeBase(base);
const historyNavigation = useHistoryStateNavigation(base);
const historyListeners = useHistoryListeners(base, historyNavigation.state, historyNavigation.location, historyNavigation.replace);
function go(delta, triggerListeners = true) {
if (!triggerListeners)
historyListeners.pauseListeners();
history.go(delta);
}
const routerHistory = assign({
// it's overridden right after
location: "",
base,
go,
createHref: createHref.bind(null, base)
}, historyNavigation, historyListeners);
Object.defineProperty(routerHistory, "location", {
enumerable: true,
get: () => historyNavigation.location.value
});
Object.defineProperty(routerHistory, "state", {
enumerable: true,
get: () => historyNavigation.state.value
});
return routerHistory;
}
function createMemoryHistory(base = "") {
let listeners = [];
let queue = [START];
let position = 0;
base = normalizeBase(base);
function setLocation(location2) {
position++;
if (position !== queue.length) {
queue.splice(position);
}
queue.push(location2);
}
function triggerListeners(to, from, { direction, delta }) {
const info = {
direction,
delta,
type: NavigationType.pop
};
for (const callback of listeners) {
callback(to, from, info);
}
}
const routerHistory = {
// rewritten by Object.defineProperty
location: START,
// TODO: should be kept in queue
state: {},
base,
createHref: createHref.bind(null, base),
replace(to) {
queue.splice(position--, 1);
setLocation(to);
},
push(to, data) {
setLocation(to);
},
listen(callback) {
listeners.push(callback);
return () => {
const index = listeners.indexOf(callback);
if (index > -1)
listeners.splice(index, 1);
};
},
destroy() {
listeners = [];
queue = [START];
position = 0;
},
go(delta, shouldTrigger = true) {
const from = this.location;
const direction = (
// we are considering delta === 0 going forward, but in abstract mode
// using 0 for the delta doesn't make sense like it does in html5 where
// it reloads the page
delta < 0 ? NavigationDirection.back : NavigationDirection.forward
);
position = Math.max(0, Math.min(position + delta, queue.length - 1));
if (shouldTrigger) {
triggerListeners(this.location, from, {
direction,
delta
});
}
}
};
Object.defineProperty(routerHistory, "location", {
enumerable: true,
get: () => queue[position]
});
return routerHistory;
}
function createWebHashHistory(base) {
base = location.host ? base || location.pathname + location.search : "";
if (!base.includes("#"))
base += "#";
if (!base.endsWith("#/") && !base.endsWith("#")) {
warn(`A hash base must end with a "#":
"${base}" should be "${base.replace(/#.*$/, "#")}".`);
}
return createWebHistory(base);
}
function isRouteLocation(route) {
return typeof route === "string" || route && typeof route === "object";
}
function isRouteName(name) {
return typeof name === "string" || typeof name === "symbol";
}
var START_LOCATION_NORMALIZED = {
path: "/",
name: void 0,
params: {},
query: {},
hash: "",
fullPath: "/",
matched: [],
meta: {},
redirectedFrom: void 0
};
var NavigationFailureSymbol = Symbol(true ? "navigation failure" : "");
var NavigationFailureType;
(function(NavigationFailureType2) {
NavigationFailureType2[NavigationFailureType2["aborted"] = 4] = "aborted";
NavigationFailureType2[NavigationFailureType2["cancelled"] = 8] = "cancelled";
NavigationFailureType2[NavigationFailureType2["duplicated"] = 16] = "duplicated";
})(NavigationFailureType || (NavigationFailureType = {}));
var ErrorTypeMessages = {
[
1
/* ErrorTypes.MATCHER_NOT_FOUND */
]({ location: location2, currentLocation }) {
return `No match for
${JSON.stringify(location2)}${currentLocation ? "\nwhile being at\n" + JSON.stringify(currentLocation) : ""}`;
},
[
2
/* ErrorTypes.NAVIGATION_GUARD_REDIRECT */
]({ from, to }) {
return `Redirected from "${from.fullPath}" to "${stringifyRoute(to)}" via a navigation guard.`;
},
[
4
/* ErrorTypes.NAVIGATION_ABORTED */
]({ from, to }) {
return `Navigation aborted from "${from.fullPath}" to "${to.fullPath}" via a navigation guard.`;
},
[
8
/* ErrorTypes.NAVIGATION_CANCELLED */
]({ from, to }) {
return `Navigation cancelled from "${from.fullPath}" to "${to.fullPath}" with a new navigation.`;
},
[
16
/* ErrorTypes.NAVIGATION_DUPLICATED */
]({ from, to }) {
return `Avoided redundant navigation to current location: "${from.fullPath}".`;
}
};
function createRouterError(type, params) {
if (true) {
return assign(new Error(ErrorTypeMessages[type](params)), {
type,
[NavigationFailureSymbol]: true
}, params);
} else {
return assign(new Error(), {
type,
[NavigationFailureSymbol]: true
}, params);
}
}
function isNavigationFailure(error, type) {
return error instanceof Error && NavigationFailureSymbol in error && (type == null || !!(error.type & type));
}
var propertiesToLog = ["params", "query", "hash"];
function stringifyRoute(to) {
if (typeof to === "string")
return to;
if ("path" in to)
return to.path;
const location2 = {};
for (const key of propertiesToLog) {
if (key in to)
location2[key] = to[key];
}
return JSON.stringify(location2, null, 2);
}
var BASE_PARAM_PATTERN = "[^/]+?";
var BASE_PATH_PARSER_OPTIONS = {
sensitive: false,
strict: false,
start: true,
end: true
};
var REGEX_CHARS_RE = /[.+*?^${}()[\]/\\]/g;
function tokensToParser(segments, extraOptions) {
const options = assign({}, BASE_PATH_PARSER_OPTIONS, extraOptions);
const score = [];
let pattern = options.start ? "^" : "";
const keys = [];
for (const segment of segments) {
const segmentScores = segment.length ? [] : [
90
/* PathScore.Root */
];
if (options.strict && !segment.length)
pattern += "/";
for (let tokenIndex = 0; tokenIndex < segment.length; tokenIndex++) {
const token = segment[tokenIndex];
let subSegmentScore = 40 + (options.sensitive ? 0.25 : 0);
if (token.type === 0) {
if (!tokenIndex)
pattern += "/";
pattern += token.value.replace(REGEX_CHARS_RE, "\\$&");
subSegmentScore += 40;
} else if (token.type === 1) {
const { value, repeatable, optional, regexp } = token;
keys.push({
name: value,
repeatable,
optional
});
const re2 = regexp ? regexp : BASE_PARAM_PATTERN;
if (re2 !== BASE_PARAM_PATTERN) {
subSegmentScore += 10;
try {
new RegExp(`(${re2})`);
} catch (err) {
throw new Error(`Invalid custom RegExp for param "${value}" (${re2}): ` + err.message);
}
}
let subPattern = repeatable ? `((?:${re2})(?:/(?:${re2}))*)` : `(${re2})`;
if (!tokenIndex)
subPattern = // avoid an optional / if there are more segments e.g. /:p?-static
// or /:p?-:p2
optional && segment.length < 2 ? `(?:/${subPattern})` : "/" + subPattern;
if (optional)
subPattern += "?";
pattern += subPattern;
subSegmentScore += 20;
if (optional)
subSegmentScore += -8;
if (repeatable)
subSegmentScore += -20;
if (re2 === ".*")
subSegmentScore += -50;
}
segmentScores.push(subSegmentScore);
}
score.push(segmentScores);
}
if (options.strict && options.end) {
const i = score.length - 1;
score[i][score[i].length - 1] += 0.7000000000000001;
}
if (!options.strict)
pattern += "/?";
if (options.end)
pattern += "$";
else if (options.strict)
pattern += "(?:/|$)";
const re = new RegExp(pattern, options.sensitive ? "" : "i");
function parse(path) {
const match = path.match(re);
const params = {};
if (!match)
return null;
for (let i = 1; i < match.length; i++) {
const value = match[i] || "";
const key = keys[i - 1];
params[key.name] = value && key.repeatable ? value.split("/") : value;
}
return params;
}
function stringify(params) {
let path = "";
let avoidDuplicatedSlash = false;
for (const segment of segments) {
if (!avoidDuplicatedSlash || !path.endsWith("/"))
path += "/";
avoidDuplicatedSlash = false;
for (const token of segment) {
if (token.type === 0) {
path += token.value;
} else if (token.type === 1) {
const { value, repeatable, optional } = token;
const param = value in params ? params[value] : "";
if (isArray(param) && !repeatable) {
throw new Error(`Provided param "${value}" is an array but it is not repeatable (* or + modifiers)`);
}
const text = isArray(param) ? param.join("/") : param;
if (!text) {
if (optional) {
if (segment.length < 2) {
if (path.endsWith("/"))
path = path.slice(0, -1);
else
avoidDuplicatedSlash = true;
}
} else
throw new Error(`Missing required param "${value}"`);
}
path += text;
}
}
}
return path || "/";
}
return {
re,
score,
keys,
parse,
stringify
};
}
function compareScoreArray(a, b) {
let i = 0;
while (i < a.length && i < b.length) {
const diff = b[i] - a[i];
if (diff)
return diff;
i++;
}
if (a.length < b.length) {
return a.length === 1 && a[0] === 40 + 40 ? -1 : 1;
} else if (a.length > b.length) {
return b.length === 1 && b[0] === 40 + 40 ? 1 : -1;
}
return 0;
}
function comparePathParserScore(a, b) {
let i = 0;
const aScore = a.score;
const bScore = b.score;
while (i < aScore.length && i < bScore.length) {
const comp = compareScoreArray(aScore[i], bScore[i]);
if (comp)
return comp;
i++;
}
if (Math.abs(bScore.length - aScore.length) === 1) {
if (isLastScoreNegative(aScore))
return 1;
if (isLastScoreNegative(bScore))
return -1;
}
return bScore.length - aScore.length;
}
function isLastScoreNegative(score) {
const last = score[score.length - 1];
return score.length > 0 && last[last.length - 1] < 0;
}
var ROOT_TOKEN = {
type: 0,
value: ""
};
var VALID_PARAM_RE = /[a-zA-Z0-9_]/;
function tokenizePath(path) {
if (!path)
return [[]];
if (path === "/")
return [[ROOT_TOKEN]];
if (!path.startsWith("/")) {
throw new Error(true ? `Route paths should start with a "/": "${path}" should be "/${path}".` : `Invalid path "${path}"`);
}
function crash(message) {
throw new Error(`ERR (${state})/"${buffer}": ${message}`);
}
let state = 0;
let previousState = state;
const tokens = [];
let segment;
function finalizeSegment() {
if (segment)
tokens.push(segment);
segment = [];
}
let i = 0;
let char;
let buffer = "";
let customRe = "";
function consumeBuffer() {
if (!buffer)
return;
if (state === 0) {
segment.push({
type: 0,
value: buffer
});
} else if (state === 1 || state === 2 || state === 3) {
if (segment.length > 1 && (char === "*" || char === "+"))
crash(`A repeatable param (${buffer}) must be alone in its segment. eg: '/:ids+.`);
segment.push({
type: 1,
value: buffer,
regexp: customRe,
repeatable: char === "*" || char === "+",
optional: char === "*" || char === "?"
});
} else {
crash("Invalid state to consume buffer");
}
buffer = "";
}
function addCharToBuffer() {
buffer += char;
}
while (i < path.length) {
char = path[i++];
if (char === "\\" && state !== 2) {
previousState = state;
state = 4;
continue;
}
switch (state) {
case 0:
if (char === "/") {
if (buffer) {
consumeBuffer();
}
finalizeSegment();
} else if (char === ":") {
consumeBuffer();
state = 1;
} else {
addCharToBuffer();
}
break;
case 4:
addCharToBuffer();
state = previousState;
break;
case 1:
if (char === "(") {
state = 2;
} else if (VALID_PARAM_RE.test(char)) {
addCharToBuffer();
} else {
consumeBuffer();
state = 0;
if (char !== "*" && char !== "?" && char !== "+")
i--;
}
break;
case 2:
if (char === ")") {
if (customRe[customRe.length - 1] == "\\")
customRe = customRe.slice(0, -1) + char;
else
state = 3;
} else {
customRe += char;
}
break;
case 3:
consumeBuffer();
state = 0;
if (char !== "*" && char !== "?" && char !== "+")
i--;
customRe = "";
break;
default:
crash("Unknown state");
break;
}
}
if (state === 2)
crash(`Unfinished custom RegExp for param "${buffer}"`);
consumeBuffer();
finalizeSegment();
return tokens;
}
function createRouteRecordMatcher(record, parent, options) {
const parser = tokensToParser(tokenizePath(record.path), options);
if (true) {
const existingKeys = /* @__PURE__ */ new Set();
for (const key of parser.keys) {
if (existingKeys.has(key.name))
warn(`Found duplicated params with name "${key.name}" for path "${record.path}". Only the last one will be available on "$route.params".`);
existingKeys.add(key.name);
}
}
const matcher = assign(parser, {
record,
parent,
// these needs to be populated by the parent
children: [],
alias: []
});
if (parent) {
if (!matcher.record.aliasOf === !parent.record.aliasOf)
parent.children.push(matcher);
}
return matcher;
}
function createRouterMatcher(routes, globalOptions) {
const matchers = [];
const matcherMap = /* @__PURE__ */ new Map();
globalOptions = mergeOptions({ strict: false, end: true, sensitive: false }, globalOptions);
function getRecordMatcher(name) {
return matcherMap.get(name);
}
function addRoute(record, parent, originalRecord) {
const isRootAdd = !originalRecord;
const mainNormalizedRecord = normalizeRouteRecord(record);
if (true) {
checkChildMissingNameWithEmptyPath(mainNormalizedRecord, parent);
}
mainNormalizedRecord.aliasOf = originalRecord && originalRecord.record;
const options = mergeOptions(globalOptions, record);
const normalizedRecords = [
mainNormalizedRecord
];
if ("alias" in record) {
const aliases = typeof record.alias === "string" ? [record.alias] : record.alias;
for (const alias of aliases) {
normalizedRecords.push(assign({}, mainNormalizedRecord, {
// this allows us to hold a copy of the `components` option
// so that async components cache is hold on the original record
components: originalRecord ? originalRecord.record.components : mainNormalizedRecord.components,
path: alias,
// we might be the child of an alias
aliasOf: originalRecord ? originalRecord.record : mainNormalizedRecord
// the aliases are always of the same kind as the original since they
// are defined on the same record
}));
}
}
let matcher;
let originalMatcher;
for (const normalizedRecord of normalizedRecords) {
const { path } = normalizedRecord;
if (parent && path[0] !== "/") {
const parentPath = parent.record.path;
const connectingSlash = parentPath[parentPath.length - 1] === "/" ? "" : "/";
normalizedRecord.path = parent.record.path + (path && connectingSlash + path);
}
if (normalizedRecord.path === "*") {
throw new Error('Catch all routes ("*") must now be defined using a param with a custom regexp.\nSee more at https://next.router.vuejs.org/guide/migration/#removed-star-or-catch-all-routes.');
}
matcher = createRouteRecordMatcher(normalizedRecord, parent, options);
if (parent && path[0] === "/")
checkMissingParamsInAbsolutePath(matcher, parent);
if (originalRecord) {
originalRecord.alias.push(matcher);
if (true) {
checkSameParams(originalRecord, matcher);
}
} else {
originalMatcher = originalMatcher || matcher;
if (originalMatcher !== matcher)
originalMatcher.alias.push(matcher);
if (isRootAdd && record.name && !isAliasRecord(matcher))
removeRoute(record.name);
}
if (mainNormalizedRecord.children) {
const children = mainNormalizedRecord.children;
for (let i = 0; i < children.length; i++) {
addRoute(children[i], matcher, originalRecord && originalRecord.children[i]);
}
}
originalRecord = originalRecord || matcher;
if (matcher.record.components && Object.keys(matcher.record.components).length || matcher.record.name || matcher.record.redirect) {
insertMatcher(matcher);
}
}
return originalMatcher ? () => {
removeRoute(originalMatcher);
} : noop;
}
function removeRoute(matcherRef) {
if (isRouteName(matcherRef)) {
const matcher = matcherMap.get(matcherRef);
if (matcher) {
matcherMap.delete(matcherRef);
matchers.splice(matchers.indexOf(matcher), 1);
matcher.children.forEach(removeRoute);
matcher.alias.forEach(removeRoute);
}
} else {
const index = matchers.indexOf(matcherRef);
if (index > -1) {
matchers.splice(index, 1);
if (matcherRef.record.name)
matcherMap.delete(matcherRef.record.name);
matcherRef.children.forEach(removeRoute);
matcherRef.alias.forEach(removeRoute);
}
}
}
function getRoutes() {
return matchers;
}
function insertMatcher(matcher) {
let i = 0;
while (i < matchers.length && comparePathParserScore(matcher, matchers[i]) >= 0 && // Adding children with empty path should still appear before the parent
// https://github.com/vuejs/router/issues/1124
(matcher.record.path !== matchers[i].record.path || !isRecordChildOf(matcher, matchers[i])))
i++;
matchers.splice(i, 0, matcher);
if (matcher.record.name && !isAliasRecord(matcher))
matcherMap.set(matcher.record.name, matcher);
}
function resolve(location2, currentLocation) {
let matcher;
let params = {};
let path;
let name;
if ("name" in location2 && location2.name) {
matcher = matcherMap.get(location2.name);
if (!matcher)
throw createRouterError(1, {
location: location2
});
if (true) {
const invalidParams = Object.keys(location2.params || {}).filter((paramName) => !matcher.keys.find((k) => k.name === paramName));
if (invalidParams.length) {
warn(`Discarded invalid param(s) "${invalidParams.join('", "')}" when navigating. See https://github.com/vuejs/router/blob/main/packages/router/CHANGELOG.md#414-2022-08-22 for more details.`);
}
}
name = matcher.record.name;
params = assign(
// paramsFromLocation is a new object
paramsFromLocation(
currentLocation.params,
// only keep params that exist in the resolved location
// TODO: only keep optional params coming from a parent record
matcher.keys.filter((k) => !k.optional).map((k) => k.name)
),
// discard any existing params in the current location that do not exist here
// #1497 this ensures better active/exact matching
location2.params && paramsFromLocation(location2.params, matcher.keys.map((k) => k.name))
);
path = matcher.stringify(params);
} else if ("path" in location2) {
path = location2.path;
if (!path.startsWith("/")) {
warn(`The Matcher cannot resolve relative paths but received "${path}". Unless you directly called \`matcher.resolve("${path}")\`, this is probably a bug in vue-router. Please open an issue at https://github.com/vuejs/router/issues/new/choose.`);
}
matcher = matchers.find((m) => m.re.test(path));
if (matcher) {
params = matcher.parse(path);
name = matcher.record.name;
}
} else {
matcher = currentLocation.name ? matcherMap.get(currentLocation.name) : matchers.find((m) => m.re.test(currentLocation.path));
if (!matcher)
throw createRouterError(1, {
location: location2,
currentLocation
});
name = matcher.record.name;
params = assign({}, currentLocation.params, location2.params);
path = matcher.stringify(params);
}
const matched = [];
let parentMatcher = matcher;
while (parentMatcher) {
matched.unshift(parentMatcher.record);
parentMatcher = parentMatcher.parent;
}
return {
name,
path,
params,
matched,
meta: mergeMetaFields(matched)
};
}
routes.forEach((route) => addRoute(route));
return { addRoute, resolve, removeRoute, getRoutes, getRecordMatcher };
}
function paramsFromLocation(params, keys) {
const newParams = {};
for (const key of keys) {
if (key in params)
newParams[key] = params[key];
}
return newParams;
}
function normalizeRouteRecord(record) {
return {
path: record.path,
redirect: record.redirect,
name: record.name,
meta: record.meta || {},
aliasOf: void 0,
beforeEnter: record.beforeEnter,
props: normalizeRecordProps(record),
children: record.children || [],
instances: {},
leaveGuards: /* @__PURE__ */ new Set(),
updateGuards: /* @__PURE__ */ new Set(),
enterCallbacks: {},
components: "components" in record ? record.components || null : record.component && { default: record.component }
};
}
function normalizeRecordProps(record) {
const propsObject = {};
const props = record.props || false;
if ("component" in record) {
propsObject.default = props;
} else {
for (const name in record.components)
propsObject[name] = typeof props === "object" ? props[name] : props;
}
return propsObject;
}
function isAliasRecord(record) {
while (record) {
if (record.record.aliasOf)
return true;
record = record.parent;
}
return false;
}
function mergeMetaFields(matched) {
return matched.reduce((meta, record) => assign(meta, record.meta), {});
}
function mergeOptions(defaults, partialOptions) {
const options = {};
for (const key in defaults) {
options[key] = key in partialOptions ? partialOptions[key] : defaults[key];
}
return options;
}
function isSameParam(a, b) {
return a.name === b.name && a.optional === b.optional && a.repeatable === b.repeatable;
}
function checkSameParams(a, b) {
for (const key of a.keys) {
if (!key.optional && !b.keys.find(isSameParam.bind(null, key)))
return warn(`Alias "${b.record.path}" and the original record: "${a.record.path}" must have the exact same param named "${key.name}"`);
}
for (const key of b.keys) {
if (!key.optional && !a.keys.find(isSameParam.bind(null, key)))
return warn(`Alias "${b.record.path}" and the original record: "${a.record.path}" must have the exact same param named "${key.name}"`);
}
}
function checkChildMissingNameWithEmptyPath(mainNormalizedRecord, parent) {
if (parent && parent.record.name && !mainNormalizedRecord.name && !mainNormalizedRecord.path) {
warn(`The route named "${String(parent.record.name)}" has a child without a name and an empty path. Using that name won't render the empty path child so you probably want to move the name to the child instead. If this is intentional, add a name to the child route to remove the warning.`);
}
}
function checkMissingParamsInAbsolutePath(record, parent) {
for (const key of parent.keys) {
if (!record.keys.find(isSameParam.bind(null, key)))
return warn(`Absolute path "${record.record.path}" must have the exact same param named "${key.name}" as its parent "${parent.record.path}".`);
}
}
function isRecordChildOf(record, parent) {
return parent.children.some((child) => child === record || isRecordChildOf(record, child));
}
var HASH_RE = /#/g;
var AMPERSAND_RE = /&/g;
var SLASH_RE = /\//g;
var EQUAL_RE = /=/g;
var IM_RE = /\?/g;
var PLUS_RE = /\+/g;
var ENC_BRACKET_OPEN_RE = /%5B/g;
var ENC_BRACKET_CLOSE_RE = /%5D/g;
var ENC_CARET_RE = /%5E/g;
var ENC_BACKTICK_RE = /%60/g;
var ENC_CURLY_OPEN_RE = /%7B/g;
var ENC_PIPE_RE = /%7C/g;
var ENC_CURLY_CLOSE_RE = /%7D/g;
var ENC_SPACE_RE = /%20/g;
function commonEncode(text) {
return encodeURI("" + text).replace(ENC_PIPE_RE, "|").replace(ENC_BRACKET_OPEN_RE, "[").replace(ENC_BRACKET_CLOSE_RE, "]");
}
function encodeHash(text) {
return commonEncode(text).replace(ENC_CURLY_OPEN_RE, "{").replace(ENC_CURLY_CLOSE_RE, "}").replace(ENC_CARET_RE, "^");
}
function encodeQueryValue(text) {
return commonEncode(text).replace(PLUS_RE, "%2B").replace(ENC_SPACE_RE, "+").replace(HASH_RE, "%23").replace(AMPERSAND_RE, "%26").replace(ENC_BACKTICK_RE, "`").replace(ENC_CURLY_OPEN_RE, "{").replace(ENC_CURLY_CLOSE_RE, "}").replace(ENC_CARET_RE, "^");
}
function encodeQueryKey(text) {
return encodeQueryValue(text).replace(EQUAL_RE, "%3D");
}
function encodePath(text) {
return commonEncode(text).replace(HASH_RE, "%23").replace(IM_RE, "%3F");
}
function encodeParam(text) {
return text == null ? "" : encodePath(text).replace(SLASH_RE, "%2F");
}
function decode(text) {
try {
return decodeURIComponent("" + text);
} catch (err) {
warn(`Error decoding "${text}". Using original value`);
}
return "" + text;
}
function parseQuery(search) {
const query = {};
if (search === "" || search === "?")
return query;
const hasLeadingIM = search[0] === "?";
const searchParams = (hasLeadingIM ? search.slice(1) : search).split("&");
for (let i = 0; i < searchParams.length; ++i) {
const searchParam = searchParams[i].replace(PLUS_RE, " ");
const eqPos = searchParam.indexOf("=");
const key = decode(eqPos < 0 ? searchParam : searchParam.slice(0, eqPos));
const value = eqPos < 0 ? null : decode(searchParam.slice(eqPos + 1));
if (key in query) {
let currentValue = query[key];
if (!isArray(currentValue)) {
currentValue = query[key] = [currentValue];
}
currentValue.push(value);
} else {
query[key] = value;
}
}
return query;
}
function stringifyQuery(query) {
let search = "";
for (let key in query) {
const value = query[key];
key = encodeQueryKey(key);
if (value == null) {
if (value !== void 0) {
search += (search.length ? "&" : "") + key;
}
continue;
}
const values = isArray(value) ? value.map((v) => v && encodeQueryValue(v)) : [value && encodeQueryValue(value)];
values.forEach((value2) => {
if (value2 !== void 0) {
search += (search.length ? "&" : "") + key;
if (value2 != null)
search += "=" + value2;
}
});
}
return search;
}
function normalizeQuery(query) {
const normalizedQuery = {};
for (const key in query) {
const value = query[key];
if (value !== void 0) {
normalizedQuery[key] = isArray(value) ? value.map((v) => v == null ? null : "" + v) : value == null ? value : "" + value;
}
}
return normalizedQuery;
}
var matchedRouteKey = Symbol(true ? "router view location matched" : "");
var viewDepthKey = Symbol(true ? "router view depth" : "");
var routerKey = Symbol(true ? "router" : "");
var routeLocationKey = Symbol(true ? "route location" : "");
var routerViewLocationKey = Symbol(true ? "router view location" : "");
function useCallbacks() {
let handlers = [];
function add(handler) {
handlers.push(handler);
return () => {
const i = handlers.indexOf(handler);
if (i > -1)
handlers.splice(i, 1);
};
}
function reset() {
handlers = [];
}
return {
add,
list: () => handlers.slice(),
reset
};
}
function registerGuard(record, name, guard) {
const removeFromList = () => {
record[name].delete(guard);
};
onUnmounted(removeFromList);
onDeactivated(removeFromList);
onActivated(() => {
record[name].add(guard);
});
record[name].add(guard);
}
function onBeforeRouteLeave(leaveGuard) {
if (!getCurrentInstance()) {
warn("getCurrentInstance() returned null. onBeforeRouteLeave() must be called at the top of a setup function");
return;
}
const activeRecord = inject(
matchedRouteKey,
// to avoid warning
{}
).value;
if (!activeRecord) {
warn("No active route record was found when calling `onBeforeRouteLeave()`. Make sure you call this function inside a component child of <router-view>. Maybe you called it inside of App.vue?");
return;
}
registerGuard(activeRecord, "leaveGuards", leaveGuard);
}
function onBeforeRouteUpdate(updateGuard) {
if (!getCurrentInstance()) {
warn("getCurrentInstance() returned null. onBeforeRouteUpdate() must be called at the top of a setup function");
return;
}
const activeRecord = inject(
matchedRouteKey,
// to avoid warning
{}
).value;
if (!activeRecord) {
warn("No active route record was found when calling `onBeforeRouteUpdate()`. Make sure you call this function inside a component child of <router-view>. Maybe you called it inside of App.vue?");
return;
}
registerGuard(activeRecord, "updateGuards", updateGuard);
}
function guardToPromiseFn(guard, to, from, record, name) {
const enterCallbackArray = record && // name is defined if record is because of the function overload
(record.enterCallbacks[name] = record.enterCallbacks[name] || []);
return () => new Promise((resolve, reject) => {
const next = (valid) => {
if (valid === false) {
reject(createRouterError(4, {
from,
to
}));
} else if (valid instanceof Error) {
reject(valid);
} else if (isRouteLocation(valid)) {
reject(createRouterError(2, {
from: to,
to: valid
}));
} else {
if (enterCallbackArray && // since enterCallbackArray is truthy, both record and name also are
record.enterCallbacks[name] === enterCallbackArray && typeof valid === "function") {
enterCallbackArray.push(valid);
}
resolve();
}
};
const guardReturn = guard.call(record && record.instances[name], to, from, true ? canOnlyBeCalledOnce(next, to, from) : next);
let guardCall = Promise.resolve(guardReturn);
if (guard.length < 3)
guardCall = guardCall.then(next);
if (guard.length > 2) {
const message = `The "next" callback was never called inside of ${guard.name ? '"' + guard.name + '"' : ""}:
${guard.toString()}
. If you are returning a value instead of calling "next", make sure to remove the "next" parameter from your function.`;
if (typeof guardReturn === "object" && "then" in guardReturn) {
guardCall = guardCall.then((resolvedValue) => {
if (!next._called) {
warn(message);
return Promise.reject(new Error("Invalid navigation guard"));
}
return resolvedValue;
});
} else if (guardReturn !== void 0) {
if (!next._called) {
warn(message);
reject(new Error("Invalid navigation guard"));
return;
}
}
}
guardCall.catch((err) => reject(err));
});
}
function canOnlyBeCalledOnce(next, to, from) {
let called = 0;
return function() {
if (called++ === 1)
warn(`The "next" callback was called more than once in one navigation guard when going from "${from.fullPath}" to "${to.fullPath}". It should be called exactly one time in each navigation guard. This will fail in production.`);
next._called = true;
if (called === 1)
next.apply(null, arguments);
};
}
function extractComponentsGuards(matched, guardType, to, from) {
const guards = [];
for (const record of matched) {
if (!record.components && !record.children.length) {
warn(`Record with path "${record.path}" is either missing a "component(s)" or "children" property.`);
}
for (const name in record.components) {
let rawComponent = record.components[name];
if (true) {
if (!rawComponent || typeof rawComponent !== "object" && typeof rawComponent !== "function") {
warn(`Component "${name}" in record with path "${record.path}" is not a valid component. Received "${String(rawComponent)}".`);
throw new Error("Invalid route component");
} else if ("then" in rawComponent) {
warn(`Component "${name}" in record with path "${record.path}" is a Promise instead of a function that returns a Promise. Did you write "import('./MyPage.vue')" instead of "() => import('./MyPage.vue')" ? This will break in production if not fixed.`);
const promise = rawComponent;
rawComponent = () => promise;
} else if (rawComponent.__asyncLoader && // warn only once per component
!rawComponent.__warnedDefineAsync) {
rawComponent.__warnedDefineAsync = true;
warn(`Component "${name}" in record with path "${record.path}" is defined using "defineAsyncComponent()". Write "() => import('./MyPage.vue')" instead of "defineAsyncComponent(() => import('./MyPage.vue'))".`);
}
}
if (guardType !== "beforeRouteEnter" && !record.instances[name])
continue;
if (isRouteComponent(rawComponent)) {
const options = rawComponent.__vccOpts || rawComponent;
const guard = options[guardType];
guard && guards.push(guardToPromiseFn(guard, to, from, record, name));
} else {
let componentPromise = rawComponent();
if (!("catch" in componentPromise)) {
warn(`Component "${name}" in record with path "${record.path}" is a function that does not return a Promise. If you were passing a functional component, make sure to add a "displayName" to the component. This will break in production if not fixed.`);
componentPromise = Promise.resolve(componentPromise);
}
guards.push(() => componentPromise.then((resolved) => {
if (!resolved)
return Promise.reject(new Error(`Couldn't resolve component "${name}" at "${record.path}"`));
const resolvedComponent = isESModule(resolved) ? resolved.default : resolved;
record.components[name] = resolvedComponent;
const options = resolvedComponent.__vccOpts || resolvedComponent;
const guard = options[guardType];
return guard && guardToPromiseFn(guard, to, from, record, name)();
}));
}
}
}
return guards;
}
function isRouteComponent(component) {
return typeof component === "object" || "displayName" in component || "props" in component || "__vccOpts" in component;
}
function loadRouteLocation(route) {
return route.matched.every((record) => record.redirect) ? Promise.reject(new Error("Cannot load a route that redirects.")) : Promise.all(route.matched.map((record) => record.components && Promise.all(Object.keys(record.components).reduce((promises, name) => {
const rawComponent = record.components[name];
if (typeof rawComponent === "function" && !("displayName" in rawComponent)) {
promises.push(rawComponent().then((resolved) => {
if (!resolved)
return Promise.reject(new Error(`Couldn't resolve component "${name}" at "${record.path}". Ensure you passed a function that returns a promise.`));
const resolvedComponent = isESModule(resolved) ? resolved.default : resolved;
record.components[name] = resolvedComponent;
return;
}));
}
return promises;
}, [])))).then(() => route);
}
function useLink(props) {
const router = inject(routerKey);
const currentRoute = inject(routeLocationKey);
const route = computed(() => router.resolve(unref(props.to)));
const activeRecordIndex = computed(() => {
const { matched } = route.value;
const { length } = matched;
const routeMatched = matched[length - 1];
const currentMatched = currentRoute.matched;
if (!routeMatched || !currentMatched.length)
return -1;
const index = currentMatched.findIndex(isSameRouteRecord.bind(null, routeMatched));
if (index > -1)
return index;
const parentRecordPath = getOriginalPath(matched[length - 2]);
return (
// we are dealing with nested routes
length > 1 && // if the parent and matched route have the same path, this link is
// referring to the empty child. Or we currently are on a different
// child of the same parent
getOriginalPath(routeMatched) === parentRecordPath && // avoid comparing the child with its parent
currentMatched[currentMatched.length - 1].path !== parentRecordPath ? currentMatched.findIndex(isSameRouteRecord.bind(null, matched[length - 2])) : index
);
});
const isActive = computed(() => activeRecordIndex.value > -1 && includesParams(currentRoute.params, route.value.params));
const isExactActive = computed(() => activeRecordIndex.value > -1 && activeRecordIndex.value === currentRoute.matched.length - 1 && isSameRouteLocationParams(currentRoute.params, route.value.params));
function navigate(e = {}) {
if (guardEvent(e)) {
return router[unref(props.replace) ? "replace" : "push"](
unref(props.to)
// avoid uncaught errors are they are logged anyway
).catch(noop);
}
return Promise.resolve();
}
if (isBrowser) {
const instance = getCurrentInstance();
if (instance) {
const linkContextDevtools = {
route: route.value,
isActive: isActive.value,
isExactActive: isExactActive.value
};
instance.__vrl_devtools = instance.__vrl_devtools || [];
instance.__vrl_devtools.push(linkContextDevtools);
watchEffect(() => {
linkContextDevtools.route = route.value;
linkContextDevtools.isActive = isActive.value;
linkContextDevtools.isExactActive = isExactActive.value;
}, { flush: "post" });
}
}
return {
route,
href: computed(() => route.value.href),
isActive,
isExactActive,
navigate
};
}
var RouterLinkImpl = defineComponent({
name: "RouterLink",
compatConfig: { MODE: 3 },
props: {
to: {
type: [String, Object],
required: true
},
replace: Boolean,
activeClass: String,
// inactiveClass: String,
exactActiveClass: String,
custom: Boolean,
ariaCurrentValue: {
type: String,
default: "page"
}
},
useLink,
setup(props, { slots }) {
const link = reactive(useLink(props));
const { options } = inject(routerKey);
const elClass = computed(() => ({
[getLinkClass(props.activeClass, options.linkActiveClass, "router-link-active")]: link.isActive,
// [getLinkClass(
// props.inactiveClass,
// options.linkInactiveClass,
// 'router-link-inactive'
// )]: !link.isExactActive,
[getLinkClass(props.exactActiveClass, options.linkExactActiveClass, "router-link-exact-active")]: link.isExactActive
}));
return () => {
const children = slots.default && slots.default(link);
return props.custom ? children : h("a", {
"aria-current": link.isExactActive ? props.ariaCurrentValue : null,
href: link.href,
// this would override user added attrs but Vue will still add
// the listener, so we end up triggering both
onClick: link.navigate,
class: elClass.value
}, children);
};
}
});
var RouterLink = RouterLinkImpl;
function guardEvent(e) {
if (e.metaKey || e.altKey || e.ctrlKey || e.shiftKey)
return;
if (e.defaultPrevented)
return;
if (e.button !== void 0 && e.button !== 0)
return;
if (e.currentTarget && e.currentTarget.getAttribute) {
const target = e.currentTarget.getAttribute("target");
if (/\b_blank\b/i.test(target))
return;
}
if (e.preventDefault)
e.preventDefault();
return true;
}
function includesParams(outer, inner) {
for (const key in inner) {
const innerValue = inner[key];
const outerValue = outer[key];
if (typeof innerValue === "string") {
if (innerValue !== outerValue)
return false;
} else {
if (!isArray(outerValue) || outerValue.length !== innerValue.length || innerValue.some((value, i) => value !== outerValue[i]))
return false;
}
}
return true;
}
function getOriginalPath(record) {
return record ? record.aliasOf ? record.aliasOf.path : record.path : "";
}
var getLinkClass = (propClass, globalClass, defaultClass) => propClass != null ? propClass : globalClass != null ? globalClass : defaultClass;
var RouterViewImpl = defineComponent({
name: "RouterView",
// #674 we manually inherit them
inheritAttrs: false,
props: {
name: {
type: String,
default: "default"
},
route: Object
},
// Better compat for @vue/compat users
// https://github.com/vuejs/router/issues/1315
compatConfig: { MODE: 3 },
setup(props, { attrs, slots }) {
warnDeprecatedUsage();
const injectedRoute = inject(routerViewLocationKey);
const routeToDisplay = computed(() => props.route || injectedRoute.value);
const injectedDepth = inject(viewDepthKey, 0);
const depth = computed(() => {
let initialDepth = unref(injectedDepth);
const { matched } = routeToDisplay.value;
let matchedRoute;
while ((matchedRoute = matched[initialDepth]) && !matchedRoute.components) {
initialDepth++;
}
return initialDepth;
});
const matchedRouteRef = computed(() => routeToDisplay.value.matched[depth.value]);
provide(viewDepthKey, computed(() => depth.value + 1));
provide(matchedRouteKey, matchedRouteRef);
provide(routerViewLocationKey, routeToDisplay);
const viewRef = ref();
watch(() => [viewRef.value, matchedRouteRef.value, props.name], ([instance, to, name], [oldInstance, from, oldName]) => {
if (to) {
to.instances[name] = instance;
if (from && from !== to && instance && instance === oldInstance) {
if (!to.leaveGuards.size) {
to.leaveGuards = from.leaveGuards;
}
if (!to.updateGuards.size) {
to.updateGuards = from.updateGuards;
}
}
}
if (instance && to && // if there is no instance but to and from are the same this might be
// the first visit
(!from || !isSameRouteRecord(to, from) || !oldInstance)) {
(to.enterCallbacks[name] || []).forEach((callback) => callback(instance));
}
}, { flush: "post" });
return () => {
const route = routeToDisplay.value;
const currentName = props.name;
const matchedRoute = matchedRouteRef.value;
const ViewComponent = matchedRoute && matchedRoute.components[currentName];
if (!ViewComponent) {
return normalizeSlot(slots.default, { Component: ViewComponent, route });
}
const routePropsOption = matchedRoute.props[currentName];
const routeProps = routePropsOption ? routePropsOption === true ? route.params : typeof routePropsOption === "function" ? routePropsOption(route) : routePropsOption : null;
const onVnodeUnmounted = (vnode) => {
if (vnode.component.isUnmounted) {
matchedRoute.instances[currentName] = null;
}
};
const component = h(ViewComponent, assign({}, routeProps, attrs, {
onVnodeUnmounted,
ref: viewRef
}));
if (isBrowser && component.ref) {
const info = {
depth: depth.value,
name: matchedRoute.name,
path: matchedRoute.path,
meta: matchedRoute.meta
};
const internalInstances = isArray(component.ref) ? component.ref.map((r) => r.i) : [component.ref.i];
internalInstances.forEach((instance) => {
instance.__vrv_devtools = info;
});
}
return (
// pass the vnode to the slot as a prop.
// h and <component :is="..."> both accept vnodes
normalizeSlot(slots.default, { Component: component, route }) || component
);
};
}
});
function normalizeSlot(slot, data) {
if (!slot)
return null;
const slotContent = slot(data);
return slotContent.length === 1 ? slotContent[0] : slotContent;
}
var RouterView = RouterViewImpl;
function warnDeprecatedUsage() {
const instance = getCurrentInstance();
const parentName = instance.parent && instance.parent.type.name;
const parentSubTreeType = instance.parent && instance.parent.subTree && instance.parent.subTree.type;
if (parentName && (parentName === "KeepAlive" || parentName.includes("Transition")) && typeof parentSubTreeType === "object" && parentSubTreeType.name === "RouterView") {
const comp = parentName === "KeepAlive" ? "keep-alive" : "transition";
warn(`<router-view> can no longer be used directly inside <transition> or <keep-alive>.
Use slot props instead:
<router-view v-slot="{ Component }">
<${comp}>
<component :is="Component" />
</${comp}>
</router-view>`);
}
}
function formatRouteLocation(routeLocation, tooltip) {
const copy = assign({}, routeLocation, {
// remove variables that can contain vue instances
matched: routeLocation.matched.map((matched) => omit(matched, ["instances", "children", "aliasOf"]))
});
return {
_custom: {
type: null,
readOnly: true,
display: routeLocation.fullPath,
tooltip,
value: copy
}
};
}
function formatDisplay(display) {
return {
_custom: {
display
}
};
}
var routerId = 0;
function addDevtools(app, router, matcher) {
if (router.__hasDevtools)
return;
router.__hasDevtools = true;
const id = routerId++;
setupDevtoolsPlugin({
id: "org.vuejs.router" + (id ? "." + id : ""),
label: "Vue Router",
packageName: "vue-router",
homepage: "https://router.vuejs.org",
logo: "https://router.vuejs.org/logo.png",
componentStateTypes: ["Routing"],
app
}, (api) => {
if (typeof api.now !== "function") {
console.warn("[Vue Router]: You seem to be using an outdated version of Vue Devtools. Are you still using the Beta release instead of the stable one? You can find the links at https://devtools.vuejs.org/guide/installation.html.");
}
api.on.inspectComponent((payload, ctx) => {
if (payload.instanceData) {
payload.instanceData.state.push({
type: "Routing",
key: "$route",
editable: false,
value: formatRouteLocation(router.currentRoute.value, "Current Route")
});
}
});
api.on.visitComponentTree(({ treeNode: node, componentInstance }) => {
if (componentInstance.__vrv_devtools) {
const info = componentInstance.__vrv_devtools;
node.tags.push({
label: (info.name ? `${info.name.toString()}: ` : "") + info.path,
textColor: 0,
tooltip: "This component is rendered by &lt;router-view&gt;",
backgroundColor: PINK_500
});
}
if (isArray(componentInstance.__vrl_devtools)) {
componentInstance.__devtoolsApi = api;
componentInstance.__vrl_devtools.forEach((devtoolsData) => {
let backgroundColor = ORANGE_400;
let tooltip = "";
if (devtoolsData.isExactActive) {
backgroundColor = LIME_500;
tooltip = "This is exactly active";
} else if (devtoolsData.isActive) {
backgroundColor = BLUE_600;
tooltip = "This link is active";
}
node.tags.push({
label: devtoolsData.route.path,
textColor: 0,
tooltip,
backgroundColor
});
});
}
});
watch(router.currentRoute, () => {
refreshRoutesView();
api.notifyComponentUpdate();
api.sendInspectorTree(routerInspectorId);
api.sendInspectorState(routerInspectorId);
});
const navigationsLayerId = "router:navigations:" + id;
api.addTimelineLayer({
id: navigationsLayerId,
label: `Router${id ? " " + id : ""} Navigations`,
color: 4237508
});
router.onError((error, to) => {
api.addTimelineEvent({
layerId: navigationsLayerId,
event: {
title: "Error during Navigation",
subtitle: to.fullPath,
logType: "error",
time: api.now(),
data: { error },
groupId: to.meta.__navigationId
}
});
});
let navigationId = 0;
router.beforeEach((to, from) => {
const data = {
guard: formatDisplay("beforeEach"),
from: formatRouteLocation(from, "Current Location during this navigation"),
to: formatRouteLocation(to, "Target location")
};
Object.defineProperty(to.meta, "__navigationId", {
value: navigationId++
});
api.addTimelineEvent({
layerId: navigationsLayerId,
event: {
time: api.now(),
title: "Start of navigation",
subtitle: to.fullPath,
data,
groupId: to.meta.__navigationId
}
});
});
router.afterEach((to, from, failure) => {
const data = {
guard: formatDisplay("afterEach")
};
if (failure) {
data.failure = {
_custom: {
type: Error,
readOnly: true,
display: failure ? failure.message : "",
tooltip: "Navigation Failure",
value: failure
}
};
data.status = formatDisplay("");
} else {
data.status = formatDisplay("");
}
data.from = formatRouteLocation(from, "Current Location during this navigation");
data.to = formatRouteLocation(to, "Target location");
api.addTimelineEvent({
layerId: navigationsLayerId,
event: {
title: "End of navigation",
subtitle: to.fullPath,
time: api.now(),
data,
logType: failure ? "warning" : "default",
groupId: to.meta.__navigationId
}
});
});
const routerInspectorId = "router-inspector:" + id;
api.addInspector({
id: routerInspectorId,
label: "Routes" + (id ? " " + id : ""),
icon: "book",
treeFilterPlaceholder: "Search routes"
});
function refreshRoutesView() {
if (!activeRoutesPayload)
return;
const payload = activeRoutesPayload;
let routes = matcher.getRoutes().filter((route) => !route.parent || // these routes have a parent with no component which will not appear in the view
// therefore we still need to include them
!route.parent.record.components);
routes.forEach(resetMatchStateOnRouteRecord);
if (payload.filter) {
routes = routes.filter((route) => (
// save matches state based on the payload
isRouteMatching(route, payload.filter.toLowerCase())
));
}
routes.forEach((route) => markRouteRecordActive(route, router.currentRoute.value));
payload.rootNodes = routes.map(formatRouteRecordForInspector);
}
let activeRoutesPayload;
api.on.getInspectorTree((payload) => {
activeRoutesPayload = payload;
if (payload.app === app && payload.inspectorId === routerInspectorId) {
refreshRoutesView();
}
});
api.on.getInspectorState((payload) => {
if (payload.app === app && payload.inspectorId === routerInspectorId) {
const routes = matcher.getRoutes();
const route = routes.find((route2) => route2.record.__vd_id === payload.nodeId);
if (route) {
payload.state = {
options: formatRouteRecordMatcherForStateInspector(route)
};
}
}
});
api.sendInspectorTree(routerInspectorId);
api.sendInspectorState(routerInspectorId);
});
}
function modifierForKey(key) {
if (key.optional) {
return key.repeatable ? "*" : "?";
} else {
return key.repeatable ? "+" : "";
}
}
function formatRouteRecordMatcherForStateInspector(route) {
const { record } = route;
const fields = [
{ editable: false, key: "path", value: record.path }
];
if (record.name != null) {
fields.push({
editable: false,
key: "name",
value: record.name
});
}
fields.push({ editable: false, key: "regexp", value: route.re });
if (route.keys.length) {
fields.push({
editable: false,
key: "keys",
value: {
_custom: {
type: null,
readOnly: true,
display: route.keys.map((key) => `${key.name}${modifierForKey(key)}`).join(" "),
tooltip: "Param keys",
value: route.keys
}
}
});
}
if (record.redirect != null) {
fields.push({
editable: false,
key: "redirect",
value: record.redirect
});
}
if (route.alias.length) {
fields.push({
editable: false,
key: "aliases",
value: route.alias.map((alias) => alias.record.path)
});
}
if (Object.keys(route.record.meta).length) {
fields.push({
editable: false,
key: "meta",
value: route.record.meta
});
}
fields.push({
key: "score",
editable: false,
value: {
_custom: {
type: null,
readOnly: true,
display: route.score.map((score) => score.join(", ")).join(" | "),
tooltip: "Score used to sort routes",
value: route.score
}
}
});
return fields;
}
var PINK_500 = 15485081;
var BLUE_600 = 2450411;
var LIME_500 = 8702998;
var CYAN_400 = 2282478;
var ORANGE_400 = 16486972;
var DARK = 6710886;
function formatRouteRecordForInspector(route) {
const tags = [];
const { record } = route;
if (record.name != null) {
tags.push({
label: String(record.name),
textColor: 0,
backgroundColor: CYAN_400
});
}
if (record.aliasOf) {
tags.push({
label: "alias",
textColor: 0,
backgroundColor: ORANGE_400
});
}
if (route.__vd_match) {
tags.push({
label: "matches",
textColor: 0,
backgroundColor: PINK_500
});
}
if (route.__vd_exactActive) {
tags.push({
label: "exact",
textColor: 0,
backgroundColor: LIME_500
});
}
if (route.__vd_active) {
tags.push({
label: "active",
textColor: 0,
backgroundColor: BLUE_600
});
}
if (record.redirect) {
tags.push({
label: typeof record.redirect === "string" ? `redirect: ${record.redirect}` : "redirects",
textColor: 16777215,
backgroundColor: DARK
});
}
let id = record.__vd_id;
if (id == null) {
id = String(routeRecordId++);
record.__vd_id = id;
}
return {
id,
label: record.path,
tags,
children: route.children.map(formatRouteRecordForInspector)
};
}
var routeRecordId = 0;
var EXTRACT_REGEXP_RE = /^\/(.*)\/([a-z]*)$/;
function markRouteRecordActive(route, currentRoute) {
const isExactActive = currentRoute.matched.length && isSameRouteRecord(currentRoute.matched[currentRoute.matched.length - 1], route.record);
route.__vd_exactActive = route.__vd_active = isExactActive;
if (!isExactActive) {
route.__vd_active = currentRoute.matched.some((match) => isSameRouteRecord(match, route.record));
}
route.children.forEach((childRoute) => markRouteRecordActive(childRoute, currentRoute));
}
function resetMatchStateOnRouteRecord(route) {
route.__vd_match = false;
route.children.forEach(resetMatchStateOnRouteRecord);
}
function isRouteMatching(route, filter) {
const found = String(route.re).match(EXTRACT_REGEXP_RE);
route.__vd_match = false;
if (!found || found.length < 3) {
return false;
}
const nonEndingRE = new RegExp(found[1].replace(/\$$/, ""), found[2]);
if (nonEndingRE.test(filter)) {
route.children.forEach((child) => isRouteMatching(child, filter));
if (route.record.path !== "/" || filter === "/") {
route.__vd_match = route.re.test(filter);
return true;
}
return false;
}
const path = route.record.path.toLowerCase();
const decodedPath = decode(path);
if (!filter.startsWith("/") && (decodedPath.includes(filter) || path.includes(filter)))
return true;
if (decodedPath.startsWith(filter) || path.startsWith(filter))
return true;
if (route.record.name && String(route.record.name).includes(filter))
return true;
return route.children.some((child) => isRouteMatching(child, filter));
}
function omit(obj, keys) {
const ret = {};
for (const key in obj) {
if (!keys.includes(key)) {
ret[key] = obj[key];
}
}
return ret;
}
function createRouter(options) {
const matcher = createRouterMatcher(options.routes, options);
const parseQuery$1 = options.parseQuery || parseQuery;
const stringifyQuery$1 = options.stringifyQuery || stringifyQuery;
const routerHistory = options.history;
if (!routerHistory)
throw new Error('Provide the "history" option when calling "createRouter()": https://next.router.vuejs.org/api/#history.');
const beforeGuards = useCallbacks();
const beforeResolveGuards = useCallbacks();
const afterGuards = useCallbacks();
const currentRoute = shallowRef(START_LOCATION_NORMALIZED);
let pendingLocation = START_LOCATION_NORMALIZED;
if (isBrowser && options.scrollBehavior && "scrollRestoration" in history) {
history.scrollRestoration = "manual";
}
const normalizeParams = applyToParams.bind(null, (paramValue) => "" + paramValue);
const encodeParams = applyToParams.bind(null, encodeParam);
const decodeParams = (
// @ts-expect-error: intentionally avoid the type check
applyToParams.bind(null, decode)
);
function addRoute(parentOrRoute, route) {
let parent;
let record;
if (isRouteName(parentOrRoute)) {
parent = matcher.getRecordMatcher(parentOrRoute);
record = route;
} else {
record = parentOrRoute;
}
return matcher.addRoute(record, parent);
}
function removeRoute(name) {
const recordMatcher = matcher.getRecordMatcher(name);
if (recordMatcher) {
matcher.removeRoute(recordMatcher);
} else if (true) {
warn(`Cannot remove non-existent route "${String(name)}"`);
}
}
function getRoutes() {
return matcher.getRoutes().map((routeMatcher) => routeMatcher.record);
}
function hasRoute(name) {
return !!matcher.getRecordMatcher(name);
}
function resolve(rawLocation, currentLocation) {
currentLocation = assign({}, currentLocation || currentRoute.value);
if (typeof rawLocation === "string") {
const locationNormalized = parseURL(parseQuery$1, rawLocation, currentLocation.path);
const matchedRoute2 = matcher.resolve({ path: locationNormalized.path }, currentLocation);
const href2 = routerHistory.createHref(locationNormalized.fullPath);
if (true) {
if (href2.startsWith("//"))
warn(`Location "${rawLocation}" resolved to "${href2}". A resolved location cannot start with multiple slashes.`);
else if (!matchedRoute2.matched.length) {
warn(`No match found for location with path "${rawLocation}"`);
}
}
return assign(locationNormalized, matchedRoute2, {
params: decodeParams(matchedRoute2.params),
hash: decode(locationNormalized.hash),
redirectedFrom: void 0,
href: href2
});
}
let matcherLocation;
if ("path" in rawLocation) {
if ("params" in rawLocation && !("name" in rawLocation) && // @ts-expect-error: the type is never
Object.keys(rawLocation.params).length) {
warn(`Path "${rawLocation.path}" was passed with params but they will be ignored. Use a named route alongside params instead.`);
}
matcherLocation = assign({}, rawLocation, {
path: parseURL(parseQuery$1, rawLocation.path, currentLocation.path).path
});
} else {
const targetParams = assign({}, rawLocation.params);
for (const key in targetParams) {
if (targetParams[key] == null) {
delete targetParams[key];
}
}
matcherLocation = assign({}, rawLocation, {
params: encodeParams(targetParams)
});
currentLocation.params = encodeParams(currentLocation.params);
}
const matchedRoute = matcher.resolve(matcherLocation, currentLocation);
const hash = rawLocation.hash || "";
if (hash && !hash.startsWith("#")) {
warn(`A \`hash\` should always start with the character "#". Replace "${hash}" with "#${hash}".`);
}
matchedRoute.params = normalizeParams(decodeParams(matchedRoute.params));
const fullPath = stringifyURL(stringifyQuery$1, assign({}, rawLocation, {
hash: encodeHash(hash),
path: matchedRoute.path
}));
const href = routerHistory.createHref(fullPath);
if (true) {
if (href.startsWith("//")) {
warn(`Location "${rawLocation}" resolved to "${href}". A resolved location cannot start with multiple slashes.`);
} else if (!matchedRoute.matched.length) {
warn(`No match found for location with path "${"path" in rawLocation ? rawLocation.path : rawLocation}"`);
}
}
return assign({
fullPath,
// keep the hash encoded so fullPath is effectively path + encodedQuery +
// hash
hash,
query: (
// if the user is using a custom query lib like qs, we might have
// nested objects, so we keep the query as is, meaning it can contain
// numbers at `$route.query`, but at the point, the user will have to
// use their own type anyway.
// https://github.com/vuejs/router/issues/328#issuecomment-649481567
stringifyQuery$1 === stringifyQuery ? normalizeQuery(rawLocation.query) : rawLocation.query || {}
)
}, matchedRoute, {
redirectedFrom: void 0,
href
});
}
function locationAsObject(to) {
return typeof to === "string" ? parseURL(parseQuery$1, to, currentRoute.value.path) : assign({}, to);
}
function checkCanceledNavigation(to, from) {
if (pendingLocation !== to) {
return createRouterError(8, {
from,
to
});
}
}
function push(to) {
return pushWithRedirect(to);
}
function replace(to) {
return push(assign(locationAsObject(to), { replace: true }));
}
function handleRedirectRecord(to) {
const lastMatched = to.matched[to.matched.length - 1];
if (lastMatched && lastMatched.redirect) {
const { redirect } = lastMatched;
let newTargetLocation = typeof redirect === "function" ? redirect(to) : redirect;
if (typeof newTargetLocation === "string") {
newTargetLocation = newTargetLocation.includes("?") || newTargetLocation.includes("#") ? newTargetLocation = locationAsObject(newTargetLocation) : (
// force empty params
{ path: newTargetLocation }
);
newTargetLocation.params = {};
}
if (!("path" in newTargetLocation) && !("name" in newTargetLocation)) {
warn(`Invalid redirect found:
${JSON.stringify(newTargetLocation, null, 2)}
when navigating to "${to.fullPath}". A redirect must contain a name or path. This will break in production.`);
throw new Error("Invalid redirect");
}
return assign({
query: to.query,
hash: to.hash,
// avoid transferring params if the redirect has a path
params: "path" in newTargetLocation ? {} : to.params
}, newTargetLocation);
}
}
function pushWithRedirect(to, redirectedFrom) {
const targetLocation = pendingLocation = resolve(to);
const from = currentRoute.value;
const data = to.state;
const force = to.force;
const replace2 = to.replace === true;
const shouldRedirect = handleRedirectRecord(targetLocation);
if (shouldRedirect)
return pushWithRedirect(
assign(locationAsObject(shouldRedirect), {
state: typeof shouldRedirect === "object" ? assign({}, data, shouldRedirect.state) : data,
force,
replace: replace2
}),
// keep original redirectedFrom if it exists
redirectedFrom || targetLocation
);
const toLocation = targetLocation;
toLocation.redirectedFrom = redirectedFrom;
let failure;
if (!force && isSameRouteLocation(stringifyQuery$1, from, targetLocation)) {
failure = createRouterError(16, { to: toLocation, from });
handleScroll(
from,
from,
// this is a push, the only way for it to be triggered from a
// history.listen is with a redirect, which makes it become a push
true,
// This cannot be the first navigation because the initial location
// cannot be manually navigated to
false
);
}
return (failure ? Promise.resolve(failure) : navigate(toLocation, from)).catch((error) => isNavigationFailure(error) ? (
// navigation redirects still mark the router as ready
isNavigationFailure(
error,
2
/* ErrorTypes.NAVIGATION_GUARD_REDIRECT */
) ? error : markAsReady(error)
) : (
// reject any unknown error
triggerError(error, toLocation, from)
)).then((failure2) => {
if (failure2) {
if (isNavigationFailure(
failure2,
2
/* ErrorTypes.NAVIGATION_GUARD_REDIRECT */
)) {
if (// we are redirecting to the same location we were already at
isSameRouteLocation(stringifyQuery$1, resolve(failure2.to), toLocation) && // and we have done it a couple of times
redirectedFrom && // @ts-expect-error: added only in dev
(redirectedFrom._count = redirectedFrom._count ? (
// @ts-expect-error
redirectedFrom._count + 1
) : 1) > 30) {
warn(`Detected a possibly infinite redirection in a navigation guard when going from "${from.fullPath}" to "${toLocation.fullPath}". Aborting to avoid a Stack Overflow.
Are you always returning a new location within a navigation guard? That would lead to this error. Only return when redirecting or aborting, that should fix this. This might break in production if not fixed.`);
return Promise.reject(new Error("Infinite redirect in navigation guard"));
}
return pushWithRedirect(
// keep options
assign({
// preserve an existing replacement but allow the redirect to override it
replace: replace2
}, locationAsObject(failure2.to), {
state: typeof failure2.to === "object" ? assign({}, data, failure2.to.state) : data,
force
}),
// preserve the original redirectedFrom if any
redirectedFrom || toLocation
);
}
} else {
failure2 = finalizeNavigation(toLocation, from, true, replace2, data);
}
triggerAfterEach(toLocation, from, failure2);
return failure2;
});
}
function checkCanceledNavigationAndReject(to, from) {
const error = checkCanceledNavigation(to, from);
return error ? Promise.reject(error) : Promise.resolve();
}
function runWithContext(fn) {
const app = installedApps.values().next().value;
return app && typeof app.runWithContext === "function" ? app.runWithContext(fn) : fn();
}
function navigate(to, from) {
let guards;
const [leavingRecords, updatingRecords, enteringRecords] = extractChangingRecords(to, from);
guards = extractComponentsGuards(leavingRecords.reverse(), "beforeRouteLeave", to, from);
for (const record of leavingRecords) {
record.leaveGuards.forEach((guard) => {
guards.push(guardToPromiseFn(guard, to, from));
});
}
const canceledNavigationCheck = checkCanceledNavigationAndReject.bind(null, to, from);
guards.push(canceledNavigationCheck);
return runGuardQueue(guards).then(() => {
guards = [];
for (const guard of beforeGuards.list()) {
guards.push(guardToPromiseFn(guard, to, from));
}
guards.push(canceledNavigationCheck);
return runGuardQueue(guards);
}).then(() => {
guards = extractComponentsGuards(updatingRecords, "beforeRouteUpdate", to, from);
for (const record of updatingRecords) {
record.updateGuards.forEach((guard) => {
guards.push(guardToPromiseFn(guard, to, from));
});
}
guards.push(canceledNavigationCheck);
return runGuardQueue(guards);
}).then(() => {
guards = [];
for (const record of enteringRecords) {
if (record.beforeEnter) {
if (isArray(record.beforeEnter)) {
for (const beforeEnter of record.beforeEnter)
guards.push(guardToPromiseFn(beforeEnter, to, from));
} else {
guards.push(guardToPromiseFn(record.beforeEnter, to, from));
}
}
}
guards.push(canceledNavigationCheck);
return runGuardQueue(guards);
}).then(() => {
to.matched.forEach((record) => record.enterCallbacks = {});
guards = extractComponentsGuards(enteringRecords, "beforeRouteEnter", to, from);
guards.push(canceledNavigationCheck);
return runGuardQueue(guards);
}).then(() => {
guards = [];
for (const guard of beforeResolveGuards.list()) {
guards.push(guardToPromiseFn(guard, to, from));
}
guards.push(canceledNavigationCheck);
return runGuardQueue(guards);
}).catch((err) => isNavigationFailure(
err,
8
/* ErrorTypes.NAVIGATION_CANCELLED */
) ? err : Promise.reject(err));
}
function triggerAfterEach(to, from, failure) {
afterGuards.list().forEach((guard) => runWithContext(() => guard(to, from, failure)));
}
function finalizeNavigation(toLocation, from, isPush, replace2, data) {
const error = checkCanceledNavigation(toLocation, from);
if (error)
return error;
const isFirstNavigation = from === START_LOCATION_NORMALIZED;
const state = !isBrowser ? {} : history.state;
if (isPush) {
if (replace2 || isFirstNavigation)
routerHistory.replace(toLocation.fullPath, assign({
scroll: isFirstNavigation && state && state.scroll
}, data));
else
routerHistory.push(toLocation.fullPath, data);
}
currentRoute.value = toLocation;
handleScroll(toLocation, from, isPush, isFirstNavigation);
markAsReady();
}
let removeHistoryListener;
function setupListeners() {
if (removeHistoryListener)
return;
removeHistoryListener = routerHistory.listen((to, _from, info) => {
if (!router.listening)
return;
const toLocation = resolve(to);
const shouldRedirect = handleRedirectRecord(toLocation);
if (shouldRedirect) {
pushWithRedirect(assign(shouldRedirect, { replace: true }), toLocation).catch(noop);
return;
}
pendingLocation = toLocation;
const from = currentRoute.value;
if (isBrowser) {
saveScrollPosition(getScrollKey(from.fullPath, info.delta), computeScrollPosition());
}
navigate(toLocation, from).catch((error) => {
if (isNavigationFailure(
error,
4 | 8
/* ErrorTypes.NAVIGATION_CANCELLED */
)) {
return error;
}
if (isNavigationFailure(
error,
2
/* ErrorTypes.NAVIGATION_GUARD_REDIRECT */
)) {
pushWithRedirect(
error.to,
toLocation
// avoid an uncaught rejection, let push call triggerError
).then((failure) => {
if (isNavigationFailure(
failure,
4 | 16
/* ErrorTypes.NAVIGATION_DUPLICATED */
) && !info.delta && info.type === NavigationType.pop) {
routerHistory.go(-1, false);
}
}).catch(noop);
return Promise.reject();
}
if (info.delta) {
routerHistory.go(-info.delta, false);
}
return triggerError(error, toLocation, from);
}).then((failure) => {
failure = failure || finalizeNavigation(
// after navigation, all matched components are resolved
toLocation,
from,
false
);
if (failure) {
if (info.delta && // a new navigation has been triggered, so we do not want to revert, that will change the current history
// entry while a different route is displayed
!isNavigationFailure(
failure,
8
/* ErrorTypes.NAVIGATION_CANCELLED */
)) {
routerHistory.go(-info.delta, false);
} else if (info.type === NavigationType.pop && isNavigationFailure(
failure,
4 | 16
/* ErrorTypes.NAVIGATION_DUPLICATED */
)) {
routerHistory.go(-1, false);
}
}
triggerAfterEach(toLocation, from, failure);
}).catch(noop);
});
}
let readyHandlers = useCallbacks();
let errorListeners = useCallbacks();
let ready;
function triggerError(error, to, from) {
markAsReady(error);
const list = errorListeners.list();
if (list.length) {
list.forEach((handler) => handler(error, to, from));
} else {
if (true) {
warn("uncaught error during route navigation:");
}
console.error(error);
}
return Promise.reject(error);
}
function isReady() {
if (ready && currentRoute.value !== START_LOCATION_NORMALIZED)
return Promise.resolve();
return new Promise((resolve2, reject) => {
readyHandlers.add([resolve2, reject]);
});
}
function markAsReady(err) {
if (!ready) {
ready = !err;
setupListeners();
readyHandlers.list().forEach(([resolve2, reject]) => err ? reject(err) : resolve2());
readyHandlers.reset();
}
return err;
}
function handleScroll(to, from, isPush, isFirstNavigation) {
const { scrollBehavior } = options;
if (!isBrowser || !scrollBehavior)
return Promise.resolve();
const scrollPosition = !isPush && getSavedScrollPosition(getScrollKey(to.fullPath, 0)) || (isFirstNavigation || !isPush) && history.state && history.state.scroll || null;
return nextTick().then(() => scrollBehavior(to, from, scrollPosition)).then((position) => position && scrollToPosition(position)).catch((err) => triggerError(err, to, from));
}
const go = (delta) => routerHistory.go(delta);
let started;
const installedApps = /* @__PURE__ */ new Set();
const router = {
currentRoute,
listening: true,
addRoute,
removeRoute,
hasRoute,
getRoutes,
resolve,
options,
push,
replace,
go,
back: () => go(-1),
forward: () => go(1),
beforeEach: beforeGuards.add,
beforeResolve: beforeResolveGuards.add,
afterEach: afterGuards.add,
onError: errorListeners.add,
isReady,
install(app) {
const router2 = this;
app.component("RouterLink", RouterLink);
app.component("RouterView", RouterView);
app.config.globalProperties.$router = router2;
Object.defineProperty(app.config.globalProperties, "$route", {
enumerable: true,
get: () => unref(currentRoute)
});
if (isBrowser && // used for the initial navigation client side to avoid pushing
// multiple times when the router is used in multiple apps
!started && currentRoute.value === START_LOCATION_NORMALIZED) {
started = true;
push(routerHistory.location).catch((err) => {
if (true)
warn("Unexpected error when starting the router:", err);
});
}
const reactiveRoute = {};
for (const key in START_LOCATION_NORMALIZED) {
Object.defineProperty(reactiveRoute, key, {
get: () => currentRoute.value[key],
enumerable: true
});
}
app.provide(routerKey, router2);
app.provide(routeLocationKey, shallowReactive(reactiveRoute));
app.provide(routerViewLocationKey, currentRoute);
const unmountApp = app.unmount;
installedApps.add(app);
app.unmount = function() {
installedApps.delete(app);
if (installedApps.size < 1) {
pendingLocation = START_LOCATION_NORMALIZED;
removeHistoryListener && removeHistoryListener();
removeHistoryListener = null;
currentRoute.value = START_LOCATION_NORMALIZED;
started = false;
ready = false;
}
unmountApp();
};
if (isBrowser) {
addDevtools(app, router2, matcher);
}
}
};
function runGuardQueue(guards) {
return guards.reduce((promise, guard) => promise.then(() => runWithContext(guard)), Promise.resolve());
}
return router;
}
function extractChangingRecords(to, from) {
const leavingRecords = [];
const updatingRecords = [];
const enteringRecords = [];
const len = Math.max(from.matched.length, to.matched.length);
for (let i = 0; i < len; i++) {
const recordFrom = from.matched[i];
if (recordFrom) {
if (to.matched.find((record) => isSameRouteRecord(record, recordFrom)))
updatingRecords.push(recordFrom);
else
leavingRecords.push(recordFrom);
}
const recordTo = to.matched[i];
if (recordTo) {
if (!from.matched.find((record) => isSameRouteRecord(record, recordTo))) {
enteringRecords.push(recordTo);
}
}
}
return [leavingRecords, updatingRecords, enteringRecords];
}
function useRouter() {
return inject(routerKey);
}
function useRoute() {
return inject(routeLocationKey);
}
export {
NavigationFailureType,
RouterLink,
RouterView,
START_LOCATION_NORMALIZED as START_LOCATION,
createMemoryHistory,
createRouter,
createRouterMatcher,
createWebHashHistory,
createWebHistory,
isNavigationFailure,
loadRouteLocation,
matchedRouteKey,
onBeforeRouteLeave,
onBeforeRouteUpdate,
parseQuery,
routeLocationKey,
routerKey,
routerViewLocationKey,
stringifyQuery,
useLink,
useRoute,
useRouter,
viewDepthKey
};
/*! Bundled license information:
vue-router/dist/vue-router.mjs:
(*!
* vue-router v4.2.5
* (c) 2023 Eduardo San Martin Morote
* @license MIT
*)
*/
//# sourceMappingURL=vue-router.js.map
因为 它太大了无法显示 source diff 。你可以改为 查看blob
import {
BaseTransition,
BaseTransitionPropsValidators,
Comment,
DeprecationTypes,
EffectScope,
ErrorCodes,
ErrorTypeStrings,
Fragment,
KeepAlive,
ReactiveEffect,
Static,
Suspense,
Teleport,
Text,
TrackOpTypes,
Transition,
TransitionGroup,
TriggerOpTypes,
VueElement,
assertNumber,
callWithAsyncErrorHandling,
callWithErrorHandling,
cloneVNode,
compatUtils,
compile,
computed,
createApp,
createBaseVNode,
createBlock,
createCommentVNode,
createElementBlock,
createHydrationRenderer,
createPropsRestProxy,
createRenderer,
createSSRApp,
createSlots,
createStaticVNode,
createTextVNode,
createVNode,
customRef,
defineAsyncComponent,
defineComponent,
defineCustomElement,
defineEmits,
defineExpose,
defineModel,
defineOptions,
defineProps,
defineSSRCustomElement,
defineSlots,
devtools,
effect,
effectScope,
getCurrentInstance,
getCurrentScope,
getTransitionRawChildren,
guardReactiveProps,
h,
handleError,
hasInjectionContext,
hydrate,
initCustomFormatter,
initDirectivesForSSR,
inject,
isMemoSame,
isProxy,
isReactive,
isReadonly,
isRef,
isRuntimeOnly,
isShallow,
isVNode,
markRaw,
mergeDefaults,
mergeModels,
mergeProps,
nextTick,
onActivated,
onBeforeMount,
onBeforeUnmount,
onBeforeUpdate,
onDeactivated,
onErrorCaptured,
onMounted,
onRenderTracked,
onRenderTriggered,
onScopeDispose,
onServerPrefetch,
onUnmounted,
onUpdated,
openBlock,
popScopeId,
provide,
proxyRefs,
pushScopeId,
queuePostFlushCb,
reactive,
readonly,
ref,
registerRuntimeCompiler,
render,
renderList,
renderSlot,
resolveComponent,
resolveDirective,
resolveDynamicComponent,
resolveFilter,
resolveTransitionHooks,
setBlockTracking,
setDevtoolsHook,
setTransitionHooks,
shallowReactive,
shallowReadonly,
shallowRef,
ssrContextKey,
ssrUtils,
stop,
toHandlers,
toRaw,
toRef,
toRefs,
toValue,
transformVNodeArgs,
triggerRef,
unref,
useAttrs,
useCssModule,
useCssVars,
useModel,
useSSRContext,
useSlots,
useTransitionState,
vModelCheckbox,
vModelDynamic,
vModelRadio,
vModelSelect,
vModelText,
vShow,
version,
warn,
watch,
watchEffect,
watchPostEffect,
watchSyncEffect,
withAsyncContext,
withCtx,
withDefaults,
withDirectives,
withKeys,
withMemo,
withModifiers,
withScopeId
} from "./chunk-PYXZ4PKZ.js";
import {
camelize,
capitalize,
normalizeClass,
normalizeProps,
normalizeStyle,
toDisplayString,
toHandlerKey
} from "./chunk-EVOPDU7K.js";
export {
BaseTransition,
BaseTransitionPropsValidators,
Comment,
DeprecationTypes,
EffectScope,
ErrorCodes,
ErrorTypeStrings,
Fragment,
KeepAlive,
ReactiveEffect,
Static,
Suspense,
Teleport,
Text,
TrackOpTypes,
Transition,
TransitionGroup,
TriggerOpTypes,
VueElement,
assertNumber,
callWithAsyncErrorHandling,
callWithErrorHandling,
camelize,
capitalize,
cloneVNode,
compatUtils,
compile,
computed,
createApp,
createBlock,
createCommentVNode,
createElementBlock,
createBaseVNode as createElementVNode,
createHydrationRenderer,
createPropsRestProxy,
createRenderer,
createSSRApp,
createSlots,
createStaticVNode,
createTextVNode,
createVNode,
customRef,
defineAsyncComponent,
defineComponent,
defineCustomElement,
defineEmits,
defineExpose,
defineModel,
defineOptions,
defineProps,
defineSSRCustomElement,
defineSlots,
devtools,
effect,
effectScope,
getCurrentInstance,
getCurrentScope,
getTransitionRawChildren,
guardReactiveProps,
h,
handleError,
hasInjectionContext,
hydrate,
initCustomFormatter,
initDirectivesForSSR,
inject,
isMemoSame,
isProxy,
isReactive,
isReadonly,
isRef,
isRuntimeOnly,
isShallow,
isVNode,
markRaw,
mergeDefaults,
mergeModels,
mergeProps,
nextTick,
normalizeClass,
normalizeProps,
normalizeStyle,
onActivated,
onBeforeMount,
onBeforeUnmount,
onBeforeUpdate,
onDeactivated,
onErrorCaptured,
onMounted,
onRenderTracked,
onRenderTriggered,
onScopeDispose,
onServerPrefetch,
onUnmounted,
onUpdated,
openBlock,
popScopeId,
provide,
proxyRefs,
pushScopeId,
queuePostFlushCb,
reactive,
readonly,
ref,
registerRuntimeCompiler,
render,
renderList,
renderSlot,
resolveComponent,
resolveDirective,
resolveDynamicComponent,
resolveFilter,
resolveTransitionHooks,
setBlockTracking,
setDevtoolsHook,
setTransitionHooks,
shallowReactive,
shallowReadonly,
shallowRef,
ssrContextKey,
ssrUtils,
stop,
toDisplayString,
toHandlerKey,
toHandlers,
toRaw,
toRef,
toRefs,
toValue,
transformVNodeArgs,
triggerRef,
unref,
useAttrs,
useCssModule,
useCssVars,
useModel,
useSSRContext,
useSlots,
useTransitionState,
vModelCheckbox,
vModelDynamic,
vModelRadio,
vModelSelect,
vModelText,
vShow,
version,
warn,
watch,
watchEffect,
watchPostEffect,
watchSyncEffect,
withAsyncContext,
withCtx,
withDefaults,
withDirectives,
withKeys,
withMemo,
withModifiers,
withScopeId
};
//# sourceMappingURL=vue.js.map
{
"version": 3,
"sources": [],
"sourcesContent": [],
"mappings": "",
"names": []
}
import { defineClientConfig } from "@vuepress/client";
import { hasGlobalComponent } from "/Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/node_modules/vuepress-shared/lib/client/index.js";
import { h } from "vue";
import { useScriptTag } from "/Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/node_modules/@vueuse/core/index.mjs";
import Badge from "/Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/node_modules/vuepress-plugin-components/lib/client/components/Badge.js";
import FontIcon from "/Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/node_modules/vuepress-plugin-components/lib/client/components/FontIcon.js";
import BackToTop from "/Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/node_modules/vuepress-plugin-components/lib/client/components/BackToTop.js";
import "/Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/node_modules/vuepress-plugin-components/lib/client/styles/sr-only.scss";
export default defineClientConfig({
enhance: ({ app }) => {
if(!hasGlobalComponent("Badge")) app.component("Badge", Badge);
if(!hasGlobalComponent("FontIcon")) app.component("FontIcon", FontIcon);
},
setup: () => {
useScriptTag(
`https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6/js/brands.min.js`,
() => {},
{ attrs: { "data-auto-replace-svg": "nest" } }
);
useScriptTag(
`https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6/js/solid.min.js`,
() => {},
{ attrs: { "data-auto-replace-svg": "nest" } }
);
useScriptTag(
`https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6/js/fontawesome.min.js`,
() => {},
{ attrs: { "data-auto-replace-svg": "nest" } }
);
},
rootComponents: [
() => h(BackToTop, {}),
],
});
import clientConfig0 from '/Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/src/.vuepress/.temp/sass-palette/load-hope.js'
import clientConfig1 from '/Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/src/.vuepress/.temp/components/config.js'
import clientConfig2 from '/Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/node_modules/@vuepress/plugin-active-header-links/lib/client/config.js'
import clientConfig3 from '/Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/node_modules/vuepress-plugin-auto-catalog/lib/client/config.js'
import clientConfig4 from '/Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/node_modules/@vuepress/plugin-external-link-icon/lib/client/config.js'
import clientConfig5 from '/Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/node_modules/@vuepress/plugin-nprogress/lib/client/config.js'
import clientConfig6 from '/Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/node_modules/@vuepress/plugin-theme-data/lib/client/config.js'
import clientConfig7 from '/Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/node_modules/vuepress-plugin-copy-code2/lib/client/config.js'
import clientConfig8 from '/Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/src/.vuepress/.temp/md-enhance/config.js'
import clientConfig9 from '/Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/node_modules/vuepress-plugin-photo-swipe/lib/client/config.js'
import clientConfig10 from '/Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/src/.vuepress/.temp/theme-hope/config.js'
export const clientConfigs = [
clientConfig0,
clientConfig1,
clientConfig2,
clientConfig3,
clientConfig4,
clientConfig5,
clientConfig6,
clientConfig7,
clientConfig8,
clientConfig9,
clientConfig10,
]
import { defineAsyncComponent } from 'vue'
export const pagesComponents = {
// path: /
"v-8daa1a0e": defineAsyncComponent(() => import(/* webpackChunkName: "v-8daa1a0e" */"/Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/src/.vuepress/.temp/pages/index.html.vue")),
// path: /slides.html
"v-2e3eac9e": defineAsyncComponent(() => import(/* webpackChunkName: "v-2e3eac9e" */"/Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/src/.vuepress/.temp/pages/slides.html.vue")),
// path: /md/resume.html
"v-1d59d0e6": defineAsyncComponent(() => import(/* webpackChunkName: "v-1d59d0e6" */"/Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/src/.vuepress/.temp/pages/md/resume.html.vue")),
// path: /md/dev-log/
"v-7c27fd02": defineAsyncComponent(() => import(/* webpackChunkName: "v-7c27fd02" */"/Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/src/.vuepress/.temp/pages/md/dev-log/index.html.vue")),
// path: /md/dev-log/day01.html
"v-49312a44": defineAsyncComponent(() => import(/* webpackChunkName: "v-49312a44" */"/Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/src/.vuepress/.temp/pages/md/dev-log/day01.html.vue")),
// path: /md/dev-log/day02.html
"v-45c77906": defineAsyncComponent(() => import(/* webpackChunkName: "v-45c77906" */"/Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/src/.vuepress/.temp/pages/md/dev-log/day02.html.vue")),
// path: /md/dev-log/day03.html
"v-425dc7c8": defineAsyncComponent(() => import(/* webpackChunkName: "v-425dc7c8" */"/Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/src/.vuepress/.temp/pages/md/dev-log/day03.html.vue")),
// path: /md/dev-log/day04.html
"v-3ef4168a": defineAsyncComponent(() => import(/* webpackChunkName: "v-3ef4168a" */"/Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/src/.vuepress/.temp/pages/md/dev-log/day04.html.vue")),
// path: /md/dev-log/day05.html
"v-3b8a654c": defineAsyncComponent(() => import(/* webpackChunkName: "v-3b8a654c" */"/Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/src/.vuepress/.temp/pages/md/dev-log/day05.html.vue")),
// path: /md/dev-log/day06.html
"v-3820b40e": defineAsyncComponent(() => import(/* webpackChunkName: "v-3820b40e" */"/Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/src/.vuepress/.temp/pages/md/dev-log/day06.html.vue")),
// path: /md/dev-log/day07~day08.html
"v-649fe232": defineAsyncComponent(() => import(/* webpackChunkName: "v-649fe232" */"/Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/src/.vuepress/.temp/pages/md/dev-log/day07~day08.html.vue")),
// path: /md/dev-log/day09~day10.html
"v-c97ab98e": defineAsyncComponent(() => import(/* webpackChunkName: "v-c97ab98e" */"/Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/src/.vuepress/.temp/pages/md/dev-log/day09~day10.html.vue")),
// path: /md/dev-log/day11.html
"v-104da61f": defineAsyncComponent(() => import(/* webpackChunkName: "v-104da61f" */"/Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/src/.vuepress/.temp/pages/md/dev-log/day11.html.vue")),
// path: /md/dev-log/day12.html
"v-12027ebe": defineAsyncComponent(() => import(/* webpackChunkName: "v-12027ebe" */"/Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/src/.vuepress/.temp/pages/md/dev-log/day12.html.vue")),
// path: /404.html
"v-3706649a": defineAsyncComponent(() => import(/* webpackChunkName: "v-3706649a" */"/Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/src/.vuepress/.temp/pages/404.html.vue")),
// path: /md/
"v-2d0aa3df": defineAsyncComponent(() => import(/* webpackChunkName: "v-2d0aa3df" */"/Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/src/.vuepress/.temp/pages/md/index.html.vue")),
}
export const pagesData = {
// path: /
"v-8daa1a0e": () => import(/* webpackChunkName: "v-8daa1a0e" */"/Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/src/.vuepress/.temp/pages/index.html.js").then(({ data }) => data),
// path: /slides.html
"v-2e3eac9e": () => import(/* webpackChunkName: "v-2e3eac9e" */"/Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/src/.vuepress/.temp/pages/slides.html.js").then(({ data }) => data),
// path: /md/resume.html
"v-1d59d0e6": () => import(/* webpackChunkName: "v-1d59d0e6" */"/Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/src/.vuepress/.temp/pages/md/resume.html.js").then(({ data }) => data),
// path: /md/dev-log/
"v-7c27fd02": () => import(/* webpackChunkName: "v-7c27fd02" */"/Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/src/.vuepress/.temp/pages/md/dev-log/index.html.js").then(({ data }) => data),
// path: /md/dev-log/day01.html
"v-49312a44": () => import(/* webpackChunkName: "v-49312a44" */"/Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/src/.vuepress/.temp/pages/md/dev-log/day01.html.js").then(({ data }) => data),
// path: /md/dev-log/day02.html
"v-45c77906": () => import(/* webpackChunkName: "v-45c77906" */"/Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/src/.vuepress/.temp/pages/md/dev-log/day02.html.js").then(({ data }) => data),
// path: /md/dev-log/day03.html
"v-425dc7c8": () => import(/* webpackChunkName: "v-425dc7c8" */"/Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/src/.vuepress/.temp/pages/md/dev-log/day03.html.js").then(({ data }) => data),
// path: /md/dev-log/day04.html
"v-3ef4168a": () => import(/* webpackChunkName: "v-3ef4168a" */"/Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/src/.vuepress/.temp/pages/md/dev-log/day04.html.js").then(({ data }) => data),
// path: /md/dev-log/day05.html
"v-3b8a654c": () => import(/* webpackChunkName: "v-3b8a654c" */"/Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/src/.vuepress/.temp/pages/md/dev-log/day05.html.js").then(({ data }) => data),
// path: /md/dev-log/day06.html
"v-3820b40e": () => import(/* webpackChunkName: "v-3820b40e" */"/Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/src/.vuepress/.temp/pages/md/dev-log/day06.html.js").then(({ data }) => data),
// path: /md/dev-log/day07~day08.html
"v-649fe232": () => import(/* webpackChunkName: "v-649fe232" */"/Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/src/.vuepress/.temp/pages/md/dev-log/day07~day08.html.js").then(({ data }) => data),
// path: /md/dev-log/day09~day10.html
"v-c97ab98e": () => import(/* webpackChunkName: "v-c97ab98e" */"/Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/src/.vuepress/.temp/pages/md/dev-log/day09~day10.html.js").then(({ data }) => data),
// path: /md/dev-log/day11.html
"v-104da61f": () => import(/* webpackChunkName: "v-104da61f" */"/Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/src/.vuepress/.temp/pages/md/dev-log/day11.html.js").then(({ data }) => data),
// path: /md/dev-log/day12.html
"v-12027ebe": () => import(/* webpackChunkName: "v-12027ebe" */"/Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/src/.vuepress/.temp/pages/md/dev-log/day12.html.js").then(({ data }) => data),
// path: /404.html
"v-3706649a": () => import(/* webpackChunkName: "v-3706649a" */"/Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/src/.vuepress/.temp/pages/404.html.js").then(({ data }) => data),
// path: /md/
"v-2d0aa3df": () => import(/* webpackChunkName: "v-2d0aa3df" */"/Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/src/.vuepress/.temp/pages/md/index.html.js").then(({ data }) => data),
}
export const pagesRoutes = [
["v-8daa1a0e","/",{"y":"h","t":"主页","i":"home"},["/README.md"]],
["v-2e3eac9e","/slides.html",{"y":"s","t":"幻灯片页","i":"person-chalkboard"},[":md"]],
["v-1d59d0e6","/md/resume.html",{"y":"a","t":"个人简历","i":"laptop-code","I":0},[":md"]],
["v-7c27fd02","/md/dev-log/",{"y":"a","t":"开发日志","i":"laptop-code"},["/md/dev-log/README.md"]],
["v-49312a44","/md/dev-log/day01.html",{"y":"a","t":"Day01","i":"laptop-code","I":0},[":md"]],
["v-45c77906","/md/dev-log/day02.html",{"y":"a","t":"Day02","i":"laptop-code","I":0},[":md"]],
["v-425dc7c8","/md/dev-log/day03.html",{"y":"a","t":"Day03","i":"laptop-code","I":0},[":md"]],
["v-3ef4168a","/md/dev-log/day04.html",{"y":"a","t":"Day04","i":"laptop-code","I":0},[":md"]],
["v-3b8a654c","/md/dev-log/day05.html",{"y":"a","t":"Day05","i":"laptop-code","I":0},[":md"]],
["v-3820b40e","/md/dev-log/day06.html",{"y":"a","t":"Day06","i":"laptop-code","I":0},[":md"]],
["v-649fe232","/md/dev-log/day07~day08.html",{"y":"a","t":"Day07 ~ Day08","i":"laptop-code","I":0},[":md"]],
["v-c97ab98e","/md/dev-log/day09~day10.html",{"y":"a","t":"Day09 ~ Day10","i":"laptop-code","I":0},[":md"]],
["v-104da61f","/md/dev-log/day11.html",{"y":"a","t":"Day011","i":"laptop-code","I":0},[":md"]],
["v-12027ebe","/md/dev-log/day12.html",{"y":"a","t":"Day012","i":"laptop-code","I":0},[":md"]],
["v-3706649a","/404.html",{"y":"p","t":""},[]],
["v-2d0aa3df","/md/",{"y":"p","t":"Md"},[]],
]
export const siteData = JSON.parse("{\"base\":\"/\",\"lang\":\"zh-CN\",\"title\":\"我的简历\",\"description\":\"关于我自己的学习成长经历\",\"head\":[],\"locales\":{}}")
export const themeData = JSON.parse("{\"encrypt\":{\"config\":{\"/demo/encrypt.html\":[\"$2a$10$jWhKZH6Bfs7BenJv2oYcrOuzhsHE9aP6KRw96nOb6.7HZdqbeZQeW\"]}},\"author\":{\"name\":\"Mr.Hope\",\"url\":\"https://mister-hope.com\"},\"logo\":\"/logo.svg\",\"repo\":\"fuzhengwei/xfg-resume-blog\",\"docsDir\":\"src\",\"footer\":\"我的微信:fustack\",\"displayFooter\":true,\"locales\":{\"/\":{\"lang\":\"zh-CN\",\"navbarLocales\":{\"langName\":\"简体中文\",\"selectLangAriaLabel\":\"选择语言\"},\"metaLocales\":{\"author\":\"作者\",\"date\":\"写作日期\",\"origin\":\"原创\",\"views\":\"访问量\",\"category\":\"分类\",\"tag\":\"标签\",\"readingTime\":\"阅读时间\",\"words\":\"字数\",\"toc\":\"此页内容\",\"prev\":\"上一页\",\"next\":\"下一页\",\"lastUpdated\":\"上次编辑于\",\"contributors\":\"贡献者\",\"editLink\":\"在 GitHub 上编辑此页\",\"print\":\"打印\"},\"outlookLocales\":{\"themeColor\":\"主题色\",\"darkmode\":\"外观\",\"fullscreen\":\"全屏\"},\"encryptLocales\":{\"iconLabel\":\"文章已加密\",\"placeholder\":\"输入密码\",\"remember\":\"记住密码\",\"errorHint\":\"请输入正确的密码\"},\"routeLocales\":{\"skipToContent\":\"跳至主要內容\",\"notFoundTitle\":\"页面不存在\",\"notFoundMsg\":[\"这里什么也没有\",\"我们是怎么来到这儿的?\",\"这 是 四 零 四 !\",\"看起来你访问了一个失效的链接\"],\"back\":\"返回上一页\",\"home\":\"带我回家\",\"openInNewWindow\":\"Open in new window\"},\"navbar\":[\"/\",\"/md/resume\",{\"text\":\"开发日志\",\"icon\":\"book\",\"link\":\"/md/dev-log/day01.md\"}],\"sidebar\":{\"/\":[\"\",{\"text\":\"Lottery 项目开发日志\",\"icon\":\"laptop-code\",\"prefix\":\"md/dev-log/\",\"children\":[\"day01.md\",\"day02.md\",\"day03.md\",\"day04.md\",\"day05.md\",\"day06.md\",\"day07~day08.md\",\"day09~day10.md\",\"day11.md\",\"day12.md\"]}]}}}}")
import { defineClientConfig } from "@vuepress/client";
import VPCard from "/Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/node_modules/vuepress-plugin-md-enhance/lib/client/components/VPCard.js";
import CodeTabs from "/Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/node_modules/vuepress-plugin-md-enhance/lib/client/components/CodeTabs.js";
import { hasGlobalComponent } from "/Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/node_modules/vuepress-shared/lib/client/index.js";
import { CodeGroup, CodeGroupItem } from "/Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/node_modules/vuepress-plugin-md-enhance/lib/client/compact/index.js";
import { useContainer } from "/Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/node_modules/vuepress-plugin-md-enhance/lib/client/composables/container.js";
import "/Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/node_modules/vuepress-plugin-md-enhance/lib/client/styles/container/index.scss";
import CodeDemo from "/Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/node_modules/vuepress-plugin-md-enhance/lib/client/components/CodeDemo.js";
import MdDemo from "/Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/node_modules/vuepress-plugin-md-enhance/lib/client/components/MdDemo.js";
import "/Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/node_modules/vuepress-plugin-md-enhance/lib/client/styles/figure.scss";
import Playground from "/Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/node_modules/vuepress-plugin-md-enhance/lib/client/components/Playground.js";
import Tabs from "/Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/node_modules/vuepress-plugin-md-enhance/lib/client/components/Tabs.js";
export default defineClientConfig({
enhance: ({ app }) => {
app.component("VPCard", VPCard)
app.component("CodeTabs", CodeTabs);
if(!hasGlobalComponent("CodeGroup", app)) app.component("CodeGroup", CodeGroup);
if(!hasGlobalComponent("CodeGroupItem", app)) app.component("CodeGroupItem", CodeGroupItem);
app.component("CodeDemo", CodeDemo);
app.component("MdDemo", MdDemo);
app.component("Playground", Playground);
app.component("Tabs", Tabs);
},
setup: () => {
useContainer();
}
});
export const data = JSON.parse("{\"key\":\"v-3706649a\",\"path\":\"/404.html\",\"title\":\"\",\"lang\":\"zh-CN\",\"frontmatter\":{\"layout\":\"NotFound\",\"description\":\"\",\"head\":[[\"meta\",{\"property\":\"og:url\",\"content\":\"https://vuepress-theme-hope-docs-demo.netlify.app/404.html\"}],[\"meta\",{\"property\":\"og:site_name\",\"content\":\"我的简历\"}],[\"meta\",{\"property\":\"og:type\",\"content\":\"website\"}],[\"meta\",{\"property\":\"og:locale\",\"content\":\"zh-CN\"}],[\"meta\",{\"property\":\"article:author\",\"content\":\"Mr.Hope\"}],[\"script\",{\"type\":\"application/ld+json\"},\"{\\\"@context\\\":\\\"https://schema.org\\\",\\\"@type\\\":\\\"WebPage\\\",\\\"name\\\":\\\"\\\"}\"]]},\"headers\":[],\"git\":{},\"readingTime\":{\"minutes\":0,\"words\":0},\"filePathRelative\":null,\"autoDesc\":true}")
<template><div></div></template>
export const data = JSON.parse("{\"key\":\"v-4e65ec78\",\"path\":\"/md/disable.html\",\"title\":\"布局与功能禁用\",\"lang\":\"zh-CN\",\"frontmatter\":{\"title\":\"布局与功能禁用\",\"icon\":\"gears\",\"order\":3,\"category\":[\"使用指南\"],\"tag\":[\"禁用\"],\"navbar\":false,\"sidebar\":false,\"breadcrumb\":false,\"pageInfo\":false,\"contributors\":false,\"editLink\":false,\"lastUpdated\":false,\"prev\":false,\"next\":false,\"comment\":false,\"footer\":false,\"backtotop\":false,\"description\":\"你可以通过设置页面的 Frontmatter,在页面禁用功能与布局。 本页面就是一个示例,禁用了如下功能: 导航栏; 侧边栏; 路径导航; 页面信息; 贡献者; 编辑此页链接; 更新时间; 上一篇/下一篇 链接; 评论; 页脚; 返回顶部按钮;\",\"head\":[[\"meta\",{\"property\":\"og:url\",\"content\":\"https://vuepress-theme-hope-docs-demo.netlify.app/demo/disable.html\"}],[\"meta\",{\"property\":\"og:site_name\",\"content\":\"我的简历\"}],[\"meta\",{\"property\":\"og:title\",\"content\":\"布局与功能禁用\"}],[\"meta\",{\"property\":\"og:description\",\"content\":\"你可以通过设置页面的 Frontmatter,在页面禁用功能与布局。 本页面就是一个示例,禁用了如下功能: 导航栏; 侧边栏; 路径导航; 页面信息; 贡献者; 编辑此页链接; 更新时间; 上一篇/下一篇 链接; 评论; 页脚; 返回顶部按钮;\"}],[\"meta\",{\"property\":\"og:type\",\"content\":\"article\"}],[\"meta\",{\"property\":\"og:locale\",\"content\":\"zh-CN\"}],[\"meta\",{\"property\":\"article:author\",\"content\":\"Mr.Hope\"}],[\"meta\",{\"property\":\"article:tag\",\"content\":\"禁用\"}],[\"script\",{\"type\":\"application/ld+json\"},\"{\\\"@context\\\":\\\"https://schema.org\\\",\\\"@type\\\":\\\"Article\\\",\\\"headline\\\":\\\"布局与功能禁用\\\",\\\"image\\\":[\\\"\\\"],\\\"dateModified\\\":null,\\\"author\\\":[{\\\"@type\\\":\\\"Person\\\",\\\"name\\\":\\\"Mr.Hope\\\",\\\"url\\\":\\\"https://mister-hope.com\\\"}]}\"]]},\"headers\":[],\"readingTime\":{\"minutes\":0.43,\"words\":128},\"filePathRelative\":\"md/disable.md\",\"autoDesc\":true}")
if (import.meta.webpackHot) {
import.meta.webpackHot.accept()
if (__VUE_HMR_RUNTIME__.updatePageData) {
__VUE_HMR_RUNTIME__.updatePageData(data)
}
}
if (import.meta.hot) {
import.meta.hot.accept(({ data }) => {
__VUE_HMR_RUNTIME__.updatePageData(data)
})
}
<template><div><p>你可以通过设置页面的 Frontmatter,在页面禁用功能与布局。</p>
<!-- more -->
<p>本页面就是一个示例,禁用了如下功能:</p>
<ul>
<li>导航栏</li>
<li>侧边栏</li>
<li>路径导航</li>
<li>页面信息</li>
<li>贡献者</li>
<li>编辑此页链接</li>
<li>更新时间</li>
<li>上一篇/下一篇 链接</li>
<li>评论</li>
<li>页脚</li>
<li>返回顶部按钮</li>
</ul>
</div></template>
export const data = JSON.parse("{\"key\":\"v-c151bf32\",\"path\":\"/md/encrypt.html\",\"title\":\"密码加密的文章\",\"lang\":\"zh-CN\",\"frontmatter\":{\"icon\":\"lock\",\"category\":[\"使用指南\"],\"tag\":[\"文章加密\"],\"feed\":false,\"seo\":false,\"head\":[]},\"headers\":[],\"readingTime\":{\"minutes\":0.52,\"words\":156},\"filePathRelative\":\"md/encrypt.md\"}")
if (import.meta.webpackHot) {
import.meta.webpackHot.accept()
if (__VUE_HMR_RUNTIME__.updatePageData) {
__VUE_HMR_RUNTIME__.updatePageData(data)
}
}
if (import.meta.hot) {
import.meta.hot.accept(({ data }) => {
__VUE_HMR_RUNTIME__.updatePageData(data)
})
}
<template><div><h1 id="密码加密的文章" tabindex="-1"><a class="header-anchor" href="#密码加密的文章" aria-hidden="true">#</a> 密码加密的文章</h1>
<p>实际的文章内容。</p>
<p>段落 1 文字段落 1 文字段落 1 文字段落 1 文字段落 1 文字段落 1 文字段落 1 文字段落 1 文字段落 1 文字段落 1 文字段落 1 文字段落 1 文字。</p>
<p>段落 2 文字段落 2 文字段落 2 文字段落 2 文字段落 2 文字段落 2 文字段落 2 文字段落 2 文字段落 2 文字段落 2 文字段落 2 文字段落 2 文字段落 2 文字段落 2 文字。</p>
</div></template>
export const data = JSON.parse("{\"key\":\"v-1473bf53\",\"path\":\"/md/\",\"title\":\"主要功能与配置演示\",\"lang\":\"zh-CN\",\"frontmatter\":{\"title\":\"主要功能与配置演示\",\"index\":false,\"icon\":\"laptop-code\",\"category\":[\"使用指南\"],\"description\":\"目录 Markdown 展示 (markdown.md); 页面展示 (page.md); 禁用展示 (disable.md); 加密展示 (encrypt.md);\",\"head\":[[\"meta\",{\"property\":\"og:url\",\"content\":\"https://vuepress-theme-hope-docs-demo.netlify.app/demo/\"}],[\"meta\",{\"property\":\"og:site_name\",\"content\":\"我的简历\"}],[\"meta\",{\"property\":\"og:title\",\"content\":\"主要功能与配置演示\"}],[\"meta\",{\"property\":\"og:description\",\"content\":\"目录 Markdown 展示 (markdown.md); 页面展示 (page.md); 禁用展示 (disable.md); 加密展示 (encrypt.md);\"}],[\"meta\",{\"property\":\"og:type\",\"content\":\"article\"}],[\"meta\",{\"property\":\"og:locale\",\"content\":\"zh-CN\"}],[\"meta\",{\"property\":\"article:author\",\"content\":\"Mr.Hope\"}],[\"script\",{\"type\":\"application/ld+json\"},\"{\\\"@context\\\":\\\"https://schema.org\\\",\\\"@type\\\":\\\"Article\\\",\\\"headline\\\":\\\"主要功能与配置演示\\\",\\\"image\\\":[\\\"\\\"],\\\"dateModified\\\":null,\\\"author\\\":[{\\\"@type\\\":\\\"Person\\\",\\\"name\\\":\\\"Mr.Hope\\\",\\\"url\\\":\\\"https://mister-hope.com\\\"}]}\"]]},\"headers\":[{\"level\":2,\"title\":\"目录\",\"slug\":\"目录\",\"link\":\"#目录\",\"children\":[]}],\"readingTime\":{\"minutes\":0.14,\"words\":41},\"filePathRelative\":\"md/resume.md\",\"autoDesc\":true}")
if (import.meta.webpackHot) {
import.meta.webpackHot.accept()
if (__VUE_HMR_RUNTIME__.updatePageData) {
__VUE_HMR_RUNTIME__.updatePageData(data)
}
}
if (import.meta.hot) {
import.meta.hot.accept(({ data }) => {
__VUE_HMR_RUNTIME__.updatePageData(data)
})
}
<template><div><h2 id="目录" tabindex="-1"><a class="header-anchor" href="#目录" aria-hidden="true">#</a> 目录</h2>
<ul>
<li>
<p><RouterLink to="/demo/markdown.html">Markdown 展示</RouterLink></p>
</li>
<li>
<p><RouterLink to="/demo/page.html">页面展示</RouterLink></p>
</li>
<li>
<p><RouterLink to="/demo/disable.html">禁用展示</RouterLink></p>
</li>
<li>
<p><RouterLink to="/demo/encrypt.html">加密展示</RouterLink></p>
</li>
</ul>
</div></template>
export const data = JSON.parse("{\"key\":\"v-438ffe52\",\"path\":\"/md/markdown.html\",\"title\":\"Markdown 展示\",\"lang\":\"zh-CN\",\"frontmatter\":{\"title\":\"Markdown 展示\",\"icon\":\"fab fa-markdown\",\"order\":2,\"category\":[\"使用指南\"],\"tag\":[\"Markdown\"],\"description\":\"VuePress 主要从 Markdown 文件生成页面。因此,你可以使用它轻松生成文档或博客站点。 你应该创建和编写 Markdown 文件,以便 VuePress 可以根据文件结构将它们转换为不同的页面。 Markdown 介绍 如果你是一个新手,还不会编写 Markdown,请先阅读 Markdown 介绍 (https://theme-hope...\",\"head\":[[\"meta\",{\"property\":\"og:url\",\"content\":\"https://vuepress-theme-hope-docs-demo.netlify.app/demo/markdown.html\"}],[\"meta\",{\"property\":\"og:site_name\",\"content\":\"我的简历\"}],[\"meta\",{\"property\":\"og:title\",\"content\":\"Markdown 展示\"}],[\"meta\",{\"property\":\"og:description\",\"content\":\"VuePress 主要从 Markdown 文件生成页面。因此,你可以使用它轻松生成文档或博客站点。 你应该创建和编写 Markdown 文件,以便 VuePress 可以根据文件结构将它们转换为不同的页面。 Markdown 介绍 如果你是一个新手,还不会编写 Markdown,请先阅读 Markdown 介绍 (https://theme-hope...\"}],[\"meta\",{\"property\":\"og:type\",\"content\":\"article\"}],[\"meta\",{\"property\":\"og:locale\",\"content\":\"zh-CN\"}],[\"meta\",{\"property\":\"article:author\",\"content\":\"Mr.Hope\"}],[\"meta\",{\"property\":\"article:tag\",\"content\":\"Markdown\"}],[\"script\",{\"type\":\"application/ld+json\"},\"{\\\"@context\\\":\\\"https://schema.org\\\",\\\"@type\\\":\\\"Article\\\",\\\"headline\\\":\\\"Markdown 展示\\\",\\\"image\\\":[\\\"\\\"],\\\"dateModified\\\":null,\\\"author\\\":[{\\\"@type\\\":\\\"Person\\\",\\\"name\\\":\\\"Mr.Hope\\\",\\\"url\\\":\\\"https://mister-hope.com\\\"}]}\"]]},\"headers\":[{\"level\":2,\"title\":\"Markdown 介绍\",\"slug\":\"markdown-介绍\",\"link\":\"#markdown-介绍\",\"children\":[]},{\"level\":2,\"title\":\"Markdown 配置\",\"slug\":\"markdown-配置\",\"link\":\"#markdown-配置\",\"children\":[]},{\"level\":2,\"title\":\"Markdown 扩展\",\"slug\":\"markdown-扩展\",\"link\":\"#markdown-扩展\",\"children\":[{\"level\":3,\"title\":\"VuePress 扩展\",\"slug\":\"vuepress-扩展\",\"link\":\"#vuepress-扩展\",\"children\":[]},{\"level\":3,\"title\":\"主题扩展\",\"slug\":\"主题扩展\",\"link\":\"#主题扩展\",\"children\":[]},{\"level\":3,\"title\":\"图片增强\",\"slug\":\"图片增强\",\"link\":\"#图片增强\",\"children\":[]}]}],\"readingTime\":{\"minutes\":3.43,\"words\":1030},\"filePathRelative\":\"md/markdown.md\",\"autoDesc\":true}")
if (import.meta.webpackHot) {
import.meta.webpackHot.accept()
if (__VUE_HMR_RUNTIME__.updatePageData) {
__VUE_HMR_RUNTIME__.updatePageData(data)
}
}
if (import.meta.hot) {
import.meta.hot.accept(({ data }) => {
__VUE_HMR_RUNTIME__.updatePageData(data)
})
}
<template><div><p>VuePress 主要从 Markdown 文件生成页面。因此,你可以使用它轻松生成文档或博客站点。</p>
<p>你应该创建和编写 Markdown 文件,以便 VuePress 可以根据文件结构将它们转换为不同的页面。</p>
<!-- more -->
<h2 id="markdown-介绍" tabindex="-1"><a class="header-anchor" href="#markdown-介绍" aria-hidden="true">#</a> Markdown 介绍</h2>
<p>如果你是一个新手,还不会编写 Markdown,请先阅读 <a href="https://theme-hope.vuejs.press/zh/cookbook/markdown/" target="_blank" rel="noopener noreferrer">Markdown 介绍<ExternalLinkIcon/></a><a href="https://theme-hope.vuejs.press/zh/cookbook/markdown/demo.html" target="_blank" rel="noopener noreferrer">Markdown 演示<ExternalLinkIcon/></a></p>
<h2 id="markdown-配置" tabindex="-1"><a class="header-anchor" href="#markdown-配置" aria-hidden="true">#</a> Markdown 配置</h2>
<p>VuePress 通过 Frontmatter 为每个 Markdown 页面引入配置。</p>
<div class="hint-container info">
<p class="hint-container-title">相关信息</p>
<p>Frontmatter 是 VuePress 中很重要的一个概念,如果你不了解它,你需要阅读 <a href="https://theme-hope.vuejs.press/zh/cookbook/vuepress/page.html#front-matter" target="_blank" rel="noopener noreferrer">Frontmatter 介绍<ExternalLinkIcon/></a></p>
</div>
<h2 id="markdown-扩展" tabindex="-1"><a class="header-anchor" href="#markdown-扩展" aria-hidden="true">#</a> Markdown 扩展</h2>
<p>VuePress 会使用 <a href="https://github.com/markdown-it/markdown-it" target="_blank" rel="noopener noreferrer">markdown-it<ExternalLinkIcon/></a> 来解析 Markdown 内容,因此可以借助于 markdown-it 插件来实现 <a href="https://github.com/markdown-it/markdown-it#syntax-extensions" target="_blank" rel="noopener noreferrer">语法扩展<ExternalLinkIcon/></a></p>
<h3 id="vuepress-扩展" tabindex="-1"><a class="header-anchor" href="#vuepress-扩展" aria-hidden="true">#</a> VuePress 扩展</h3>
<p>为了丰富文档写作,VuePress 对 Markdown 语法进行了扩展。</p>
<p>关于这些扩展,请阅读 <a href="https://theme-hope.vuejs.press/zh/cookbook/vuepress/markdown.html" target="_blank" rel="noopener noreferrer">VuePress 中的 Markdown 扩展<ExternalLinkIcon/></a></p>
<h3 id="主题扩展" tabindex="-1"><a class="header-anchor" href="#主题扩展" aria-hidden="true">#</a> 主题扩展</h3>
<p>通过 <a href="https://plugin-md-enhance.vuejs.press/zh/" target="_blank" rel="noopener noreferrer"><code v-pre>vuepress-plugin-md-enhance</code><ExternalLinkIcon/></a>,主题扩展了更多 Markdown 语法,提供更加丰富的写作功能。</p>
<h4 id="自定义容器" tabindex="-1"><a class="header-anchor" href="#自定义容器" aria-hidden="true">#</a> 自定义容器</h4>
<div v-pre>
<p>安全的在 Markdown 中使用 {{ variable }}</p>
</div>
<div class="hint-container info">
<p class="hint-container-title">自定义标题</p>
<p>信息容器,包含 <code v-pre>代码</code><a href="#%E8%87%AA%E5%AE%9A%E4%B9%89%E5%AE%B9%E5%99%A8">链接</a></p>
<div class="language-javascript line-numbers-mode" data-ext="js"><pre v-pre class="language-javascript"><code><span class="token keyword">const</span> a <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div></div>
<div class="hint-container tip">
<p class="hint-container-title">自定义标题</p>
<p>提示容器</p>
</div>
<div class="hint-container warning">
<p class="hint-container-title">自定义标题</p>
<p>警告容器</p>
</div>
<div class="hint-container danger">
<p class="hint-container-title">自定义标题</p>
<p>危险容器</p>
</div>
<details class="hint-container details"><summary>自定义标题</summary>
<p>详情容器</p>
</details>
<ul>
<li><a href="https://theme-hope.vuejs.press/zh/guide/markdown/container.html" target="_blank" rel="noopener noreferrer">查看详情<ExternalLinkIcon/></a></li>
</ul>
<h4 id="代码块" tabindex="-1"><a class="header-anchor" href="#代码块" aria-hidden="true">#</a> 代码块</h4>
<CodeTabs id="89" :data='[{"id":"pnpm"},{"id":"yarn"},{"id":"npm"}]' :active="2">
<template #title0="{ value, isActive }">pnpm</template>
<template #title1="{ value, isActive }">yarn</template>
<template #title2="{ value, isActive }">npm</template>
<template #tab0="{ value, isActive }">
<div class="language-bash line-numbers-mode" data-ext="sh"><pre v-pre class="language-bash"><code><span class="token function">pnpm</span> <span class="token function">add</span> <span class="token parameter variable">-D</span> vuepress-theme-hope
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div></template>
<template #tab1="{ value, isActive }">
<div class="language-bash line-numbers-mode" data-ext="sh"><pre v-pre class="language-bash"><code><span class="token function">yarn</span> <span class="token function">add</span> <span class="token parameter variable">-D</span> vuepress-theme-hope
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div></template>
<template #tab2="{ value, isActive }">
<div class="language-bash line-numbers-mode" data-ext="sh"><pre v-pre class="language-bash"><code><span class="token function">npm</span> i <span class="token parameter variable">-D</span> vuepress-theme-hope
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div></template>
</CodeTabs>
<ul>
<li><a href="https://theme-hope.vuejs.press/zh/guide/markdown/code-tabs.html" target="_blank" rel="noopener noreferrer">查看详情<ExternalLinkIcon/></a></li>
</ul>
<h4 id="上下角标" tabindex="-1"><a class="header-anchor" href="#上下角标" aria-hidden="true">#</a> 上下角标</h4>
<p>19<sup>th</sup> H<sub>2</sub>O</p>
<ul>
<li><a href="https://theme-hope.vuejs.press/zh/guide/markdown/sup-sub.html" target="_blank" rel="noopener noreferrer">查看详情<ExternalLinkIcon/></a></li>
</ul>
<h4 id="自定义对齐" tabindex="-1"><a class="header-anchor" href="#自定义对齐" aria-hidden="true">#</a> 自定义对齐</h4>
<div style="text-align:center">
<p>我是居中的</p>
</div>
<div style="text-align:right">
<p>我在右对齐</p>
</div>
<ul>
<li><a href="https://theme-hope.vuejs.press/zh/guide/markdown/align.html" target="_blank" rel="noopener noreferrer">查看详情<ExternalLinkIcon/></a></li>
</ul>
<h4 id="attrs" tabindex="-1"><a class="header-anchor" href="#attrs" aria-hidden="true">#</a> Attrs</h4>
<p>一个拥有 ID 的 <strong id="word">单词</strong></p>
<ul>
<li><a href="https://theme-hope.vuejs.press/zh/guide/markdown/attrs.html" target="_blank" rel="noopener noreferrer">查看详情<ExternalLinkIcon/></a></li>
</ul>
<h4 id="脚注" tabindex="-1"><a class="header-anchor" href="#脚注" aria-hidden="true">#</a> 脚注</h4>
<p>此文字有脚注<a href="%E8%BF%99%E6%98%AF%E8%84%9A%E6%B3%A8%E5%86%85%E5%AE%B9">^first</a>.</p>
<ul>
<li><a href="https://theme-hope.vuejs.press/zh/guide/markdown/footnote.html" target="_blank" rel="noopener noreferrer">查看详情<ExternalLinkIcon/></a></li>
</ul>
<h4 id="标记" tabindex="-1"><a class="header-anchor" href="#标记" aria-hidden="true">#</a> 标记</h4>
<p>你可以标记 <mark>重要的内容</mark></p>
<ul>
<li><a href="https://theme-hope.vuejs.press/zh/guide/markdown/mark.html" target="_blank" rel="noopener noreferrer">查看详情<ExternalLinkIcon/></a></li>
</ul>
<h4 id="任务列表" tabindex="-1"><a class="header-anchor" href="#任务列表" aria-hidden="true">#</a> 任务列表</h4>
<ul>
<li>
<p>[x] 计划 1</p>
</li>
<li>
<p>[ ] 计划 2</p>
</li>
<li>
<p><a href="https://theme-hope.vuejs.press/zh/guide/markdown/tasklist.html" target="_blank" rel="noopener noreferrer">查看详情<ExternalLinkIcon/></a></p>
</li>
</ul>
<h3 id="图片增强" tabindex="-1"><a class="header-anchor" href="#图片增强" aria-hidden="true">#</a> 图片增强</h3>
<p>支持为图片设置颜色模式和大小</p>
<ul>
<li><a href="https://theme-hope.vuejs.press/zh/guide/markdown/image.html" target="_blank" rel="noopener noreferrer">查看详情<ExternalLinkIcon/></a></li>
</ul>
<h4 id="卡片" tabindex="-1"><a class="header-anchor" href="#卡片" aria-hidden="true">#</a> 卡片</h4>
<VPCard v-bind='{"title":"Mr.Hope","desc":"Where there is light, there is hope","logo":"https://mister-hope.com/logo.svg","link":"https://mister-hope.com","color":"rgba(253, 230, 138, 0.15)"}' /><ul>
<li><a href="https://theme-hope.vuejs.press/zh/guide/markdown/card.html" target="_blank" rel="noopener noreferrer">查看详情<ExternalLinkIcon/></a></li>
</ul>
<h4 id="导入文件" tabindex="-1"><a class="header-anchor" href="#导入文件" aria-hidden="true">#</a> 导入文件</h4>
<ul>
<li>
<p><RouterLink to="/demo/markdown.html">Markdown 展示</RouterLink></p>
</li>
<li>
<p><RouterLink to="/demo/page.html">页面展示</RouterLink></p>
</li>
<li>
<p><RouterLink to="/demo/disable.html">禁用展示</RouterLink></p>
</li>
<li>
<p><RouterLink to="/demo/encrypt.html">加密展示</RouterLink></p>
</li>
</ul>
<ul>
<li><a href="https://theme-hope.vuejs.press/zh/guide/markdown/include.html" target="_blank" rel="noopener noreferrer">查看详情<ExternalLinkIcon/></a></li>
</ul>
<h4 id="代码演示" tabindex="-1"><a class="header-anchor" href="#代码演示" aria-hidden="true">#</a> 代码演示</h4>
<CodeDemo id="code-demo-260" type="normal" title="%E4%B8%80%E4%B8%AA%E6%99%AE%E9%80%9A%20Demo" code="eJwljrGKAjEQhl9lbq5REJdrvZju4IorDhSrNEsysKvZZE2ygoiPopXgK4j4Olv4Fk7cZor5v3++OWCVGoszFNWXXHX0HyhGWFbUEPz6lkTBe+VEK0VsSwe1mSvcUdgrlM/Tub/dRJED2T/u/eX6IYqWcZzgOvJR43XXkEvTbceVBVnSyYeRws/hxHhaGvOzY+Kvjokc5UzbWm8UTmA0hrmEg3IApaWQOBuUg4vr38od82Cfjln4/vHd0N76MINAJkOMHF8ck1dC">
<div class="language-html line-numbers-mode" data-ext="html"><pre v-pre class="language-html"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>h1</span><span class="token punctuation">></span></span>VuePress Theme Hope<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>h1</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>p</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>span</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>very<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>非常<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>span</span><span class="token punctuation">></span></span>强大!<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>p</span><span class="token punctuation">></span></span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div></div></div><div class="language-javascript line-numbers-mode" data-ext="js"><pre v-pre class="language-javascript"><code>document<span class="token punctuation">.</span><span class="token function">querySelector</span><span class="token punctuation">(</span><span class="token string">"#very"</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">addEventListener</span><span class="token punctuation">(</span><span class="token string">"click"</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
<span class="token function">alert</span><span class="token punctuation">(</span><span class="token string">"非常强大"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><div class="language-css line-numbers-mode" data-ext="css"><pre v-pre class="language-css"><code><span class="token selector">span</span> <span class="token punctuation">{</span>
<span class="token property">color</span><span class="token punctuation">:</span> red<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></CodeDemo><ul>
<li><a href="https://theme-hope.vuejs.press/zh/guide/markdown/demo.html" target="_blank" rel="noopener noreferrer">查看详情<ExternalLinkIcon/></a></li>
</ul>
<h4 id="样式化" tabindex="-1"><a class="header-anchor" href="#样式化" aria-hidden="true">#</a> 样式化</h4>
<p>向 Mr.Hope 捐赠一杯咖啡。 <Badge type="tip">Recommended</Badge></p>
<ul>
<li><a href="https://theme-hope.vuejs.press/zh/guide/markdown/stylize.html" target="_blank" rel="noopener noreferrer">查看详情<ExternalLinkIcon/></a></li>
</ul>
<h4 id="交互演示" tabindex="-1"><a class="header-anchor" href="#交互演示" aria-hidden="true">#</a> 交互演示</h4>
<Playground key="d2f9e8d0" title="TS%20%E6%A1%88%E4%BE%8B" link="https%3A%2F%2Fwww.typescriptlang.org%2Fplay%23code%2FMYewdgzgLgBAthA5jAvDARACwKYBtcgwDuIATrgCboDcAULaJLBAA7YCGA1qjABQKIAXDGikAlmEQBKVAD4YjCCFzYAdAUT8kUurVYdOW6XSA">
</Playground>
<ul>
<li><a href="https://theme-hope.vuejs.press/zh/guide/markdown/playground.html" target="_blank" rel="noopener noreferrer">查看详情<ExternalLinkIcon/></a></li>
</ul>
<h4 id="图表" tabindex="-1"><a class="header-anchor" href="#图表" aria-hidden="true">#</a> 图表</h4>
<p>::: chart 一个散点图案例</p>
<div class="language-json line-numbers-mode" data-ext="json"><pre v-pre class="language-json"><code><span class="token punctuation">{</span>
<span class="token property">"type"</span><span class="token operator">:</span> <span class="token string">"scatter"</span><span class="token punctuation">,</span>
<span class="token property">"data"</span><span class="token operator">:</span> <span class="token punctuation">{</span>
<span class="token property">"datasets"</span><span class="token operator">:</span> <span class="token punctuation">[</span>
<span class="token punctuation">{</span>
<span class="token property">"label"</span><span class="token operator">:</span> <span class="token string">"散点数据集"</span><span class="token punctuation">,</span>
<span class="token property">"data"</span><span class="token operator">:</span> <span class="token punctuation">[</span>
<span class="token punctuation">{</span> <span class="token property">"x"</span><span class="token operator">:</span> <span class="token number">-10</span><span class="token punctuation">,</span> <span class="token property">"y"</span><span class="token operator">:</span> <span class="token number">0</span> <span class="token punctuation">}</span><span class="token punctuation">,</span>
<span class="token punctuation">{</span> <span class="token property">"x"</span><span class="token operator">:</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token property">"y"</span><span class="token operator">:</span> <span class="token number">10</span> <span class="token punctuation">}</span><span class="token punctuation">,</span>
<span class="token punctuation">{</span> <span class="token property">"x"</span><span class="token operator">:</span> <span class="token number">10</span><span class="token punctuation">,</span> <span class="token property">"y"</span><span class="token operator">:</span> <span class="token number">5</span> <span class="token punctuation">}</span><span class="token punctuation">,</span>
<span class="token punctuation">{</span> <span class="token property">"x"</span><span class="token operator">:</span> <span class="token number">0.5</span><span class="token punctuation">,</span> <span class="token property">"y"</span><span class="token operator">:</span> <span class="token number">5.5</span> <span class="token punctuation">}</span>
<span class="token punctuation">]</span><span class="token punctuation">,</span>
<span class="token property">"backgroundColor"</span><span class="token operator">:</span> <span class="token string">"rgb(255, 99, 132)"</span>
<span class="token punctuation">}</span>
<span class="token punctuation">]</span>
<span class="token punctuation">}</span><span class="token punctuation">,</span>
<span class="token property">"options"</span><span class="token operator">:</span> <span class="token punctuation">{</span>
<span class="token property">"scales"</span><span class="token operator">:</span> <span class="token punctuation">{</span>
<span class="token property">"x"</span><span class="token operator">:</span> <span class="token punctuation">{</span>
<span class="token property">"type"</span><span class="token operator">:</span> <span class="token string">"linear"</span><span class="token punctuation">,</span>
<span class="token property">"position"</span><span class="token operator">:</span> <span class="token string">"bottom"</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>:::</p>
<ul>
<li><a href="https://theme-hope.vuejs.press/zh/guide/markdown/chart.html" target="_blank" rel="noopener noreferrer">查看详情<ExternalLinkIcon/></a></li>
</ul>
<h4 id="echarts" tabindex="-1"><a class="header-anchor" href="#echarts" aria-hidden="true">#</a> Echarts</h4>
<p>::: echarts 一个折线图案例</p>
<div class="language-json line-numbers-mode" data-ext="json"><pre v-pre class="language-json"><code><span class="token punctuation">{</span>
<span class="token property">"xAxis"</span><span class="token operator">:</span> <span class="token punctuation">{</span>
<span class="token property">"type"</span><span class="token operator">:</span> <span class="token string">"category"</span><span class="token punctuation">,</span>
<span class="token property">"data"</span><span class="token operator">:</span> <span class="token punctuation">[</span><span class="token string">"Mon"</span><span class="token punctuation">,</span> <span class="token string">"Tue"</span><span class="token punctuation">,</span> <span class="token string">"Wed"</span><span class="token punctuation">,</span> <span class="token string">"Thu"</span><span class="token punctuation">,</span> <span class="token string">"Fri"</span><span class="token punctuation">,</span> <span class="token string">"Sat"</span><span class="token punctuation">,</span> <span class="token string">"Sun"</span><span class="token punctuation">]</span>
<span class="token punctuation">}</span><span class="token punctuation">,</span>
<span class="token property">"yAxis"</span><span class="token operator">:</span> <span class="token punctuation">{</span>
<span class="token property">"type"</span><span class="token operator">:</span> <span class="token string">"value"</span>
<span class="token punctuation">}</span><span class="token punctuation">,</span>
<span class="token property">"series"</span><span class="token operator">:</span> <span class="token punctuation">[</span>
<span class="token punctuation">{</span>
<span class="token property">"data"</span><span class="token operator">:</span> <span class="token punctuation">[</span><span class="token number">150</span><span class="token punctuation">,</span> <span class="token number">230</span><span class="token punctuation">,</span> <span class="token number">224</span><span class="token punctuation">,</span> <span class="token number">218</span><span class="token punctuation">,</span> <span class="token number">135</span><span class="token punctuation">,</span> <span class="token number">147</span><span class="token punctuation">,</span> <span class="token number">260</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
<span class="token property">"type"</span><span class="token operator">:</span> <span class="token string">"line"</span>
<span class="token punctuation">}</span>
<span class="token punctuation">]</span>
<span class="token punctuation">}</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>:::</p>
<ul>
<li><a href="https://theme-hope.vuejs.press/zh/guide/markdown/echarts.html" target="_blank" rel="noopener noreferrer">查看详情<ExternalLinkIcon/></a></li>
</ul>
<h4 id="流程图" tabindex="-1"><a class="header-anchor" href="#流程图" aria-hidden="true">#</a> 流程图</h4>
<div class="language-flow line-numbers-mode" data-ext="flow"><pre v-pre class="language-flow"><code>cond<span class="token operator">=></span>condition<span class="token operator">:</span> 是否执行操作<span class="token operator">?</span>
process<span class="token operator">=></span>operation<span class="token operator">:</span> 操作
e<span class="token operator">=></span>end<span class="token operator">:</span> 结束
<span class="token function">cond</span><span class="token punctuation">(</span>yes<span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span>process<span class="token operator">-</span><span class="token operator">></span>e
<span class="token function">cond</span><span class="token punctuation">(</span>no<span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span>e
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><ul>
<li><a href="https://theme-hope.vuejs.press/zh/guide/markdown/flowchart.html" target="_blank" rel="noopener noreferrer">查看详情<ExternalLinkIcon/></a></li>
</ul>
<h4 id="mermaid" tabindex="-1"><a class="header-anchor" href="#mermaid" aria-hidden="true">#</a> Mermaid</h4>
<div class="language-mermaid line-numbers-mode" data-ext="mermaid"><pre v-pre class="language-mermaid"><code><span class="token arrow operator">---</span>
title<span class="token operator">:</span> Flowchart
<span class="token arrow operator">---</span>
<span class="token keyword">flowchart</span> TB
c1<span class="token arrow operator">--></span>a2
<span class="token keyword">subgraph</span> one
a1<span class="token arrow operator">--></span>a2
<span class="token keyword">end</span>
<span class="token keyword">subgraph</span> two
b1<span class="token arrow operator">--></span>b2
<span class="token keyword">end</span>
<span class="token keyword">subgraph</span> three
c1<span class="token arrow operator">--></span>c2
<span class="token keyword">end</span>
one <span class="token arrow operator">--></span> two
three <span class="token arrow operator">--></span> two
two <span class="token arrow operator">--></span> c2
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><ul>
<li><a href="https://theme-hope.vuejs.press/zh/guide/markdown/mermaid.html" target="_blank" rel="noopener noreferrer">查看详情<ExternalLinkIcon/></a></li>
</ul>
<h4 id="tex-语法" tabindex="-1"><a class="header-anchor" href="#tex-语法" aria-hidden="true">#</a> Tex 语法</h4>
<p>$$
\frac {\partial^r} {\partial \omega^r} \left(\frac {y^{\omega}} {\omega}\right)
= \left(\frac {y^{\omega}} {\omega}\right) \left{(\log y)^r + \sum_{i=1}^r \frac {(-1)^i r \cdots (r-i+1) (\log y)^{r-i}} {\omega^i} \right}
$$</p>
<ul>
<li><a href="https://theme-hope.vuejs.press/zh/guide/markdown/tex.html" target="_blank" rel="noopener noreferrer">查看详情<ExternalLinkIcon/></a></li>
</ul>
<h4 id="vue-交互演示" tabindex="-1"><a class="header-anchor" href="#vue-交互演示" aria-hidden="true">#</a> Vue 交互演示</h4>
<p>::: vue-playground Vue 交互演示</p>
<template>
<div class="language-vue line-numbers-mode" data-ext="vue"><pre v-pre class="language-vue"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">setup</span><span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript">
<span class="token keyword">import</span> <span class="token punctuation">{</span> ref <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"vue"</span><span class="token punctuation">;</span>
<span class="token keyword">const</span> msg <span class="token operator">=</span> <span class="token function">ref</span><span class="token punctuation">(</span><span class="token string">"Hello World!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>template</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>h1</span><span class="token punctuation">></span></span>{{ msg }}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>h1</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>input</span> <span class="token attr-name">v-model</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>msg<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>template</span><span class="token punctuation">></span></span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>:::</p>
<ul>
<li><a href="https://theme-hope.vuejs.press/zh/guide/markdown/vue-playground.html" target="_blank" rel="noopener noreferrer">查看详情<ExternalLinkIcon/></a></li>
</ul>
<h4 id="幻灯片" tabindex="-1"><a class="header-anchor" href="#幻灯片" aria-hidden="true">#</a> 幻灯片</h4>
<p>@slidestart</p>
<h2 id="幻灯片-1" tabindex="-1"><a class="header-anchor" href="#幻灯片-1" aria-hidden="true">#</a> 幻灯片 1</h2>
<p>一个有文字和 <a href="https://mister-hope.com" target="_blank" rel="noopener noreferrer">链接<ExternalLinkIcon/></a> 的段落</p>
<hr>
<h2 id="幻灯片-2" tabindex="-1"><a class="header-anchor" href="#幻灯片-2" aria-hidden="true">#</a> 幻灯片 2</h2>
<ul>
<li>项目 1</li>
<li>项目 2</li>
</ul>
<hr>
<h2 id="幻灯片-3-1" tabindex="-1"><a class="header-anchor" href="#幻灯片-3-1" aria-hidden="true">#</a> 幻灯片 3.1</h2>
<div class="language-javascript line-numbers-mode" data-ext="js"><pre v-pre class="language-javascript"><code><span class="token keyword">const</span> a <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>--</p>
<h2 id="幻灯片-3-2" tabindex="-1"><a class="header-anchor" href="#幻灯片-3-2" aria-hidden="true">#</a> 幻灯片 3.2</h2>
<p>$$
J(\theta_0,\theta_1) = \sum_{i=0}
$$</p>
<p>@slideend</p>
<ul>
<li><a href="https://theme-hope.vuejs.press/zh/guide/markdown/revealjs.html" target="_blank" rel="noopener noreferrer">查看详情<ExternalLinkIcon/></a></li>
</ul>
</template>
</div></template>
export const data = JSON.parse("{\"key\":\"v-6e19edb7\",\"path\":\"/md/page.html\",\"title\":\"页面配置\",\"lang\":\"zh-CN\",\"frontmatter\":{\"title\":\"页面配置\",\"icon\":\"file\",\"order\":1,\"author\":\"Ms.Hope\",\"date\":\"2020-01-01T00:00:00.000Z\",\"category\":[\"使用指南\"],\"tag\":[\"页面配置\",\"使用指南\"],\"sticky\":true,\"star\":true,\"footer\":\"这是测试显示的页脚\",\"copyright\":\"无版权\",\"description\":\"more 注释之前的内容被视为文章摘要。 页面信息 你可以在 Markdown 的 Frontmatter 中设置页面信息。 作者设置为 Ms.Hope。; 写作日期为 2020 年 1 月 1 日; 分类为 “使用指南”; 标签为 “页面配置” 和 “使用指南”; 页面内容 你可以自由在这里书写你的 Markdown。 你可以将图片和 Markdow...\",\"head\":[[\"meta\",{\"property\":\"og:url\",\"content\":\"https://vuepress-theme-hope-docs-demo.netlify.app/demo/page.html\"}],[\"meta\",{\"property\":\"og:site_name\",\"content\":\"我的简历\"}],[\"meta\",{\"property\":\"og:title\",\"content\":\"页面配置\"}],[\"meta\",{\"property\":\"og:description\",\"content\":\"more 注释之前的内容被视为文章摘要。 页面信息 你可以在 Markdown 的 Frontmatter 中设置页面信息。 作者设置为 Ms.Hope。; 写作日期为 2020 年 1 月 1 日; 分类为 “使用指南”; 标签为 “页面配置” 和 “使用指南”; 页面内容 你可以自由在这里书写你的 Markdown。 你可以将图片和 Markdow...\"}],[\"meta\",{\"property\":\"og:type\",\"content\":\"article\"}],[\"meta\",{\"property\":\"og:locale\",\"content\":\"zh-CN\"}],[\"meta\",{\"property\":\"article:author\",\"content\":\"Ms.Hope\"}],[\"meta\",{\"property\":\"article:tag\",\"content\":\"页面配置\"}],[\"meta\",{\"property\":\"article:tag\",\"content\":\"使用指南\"}],[\"meta\",{\"property\":\"article:published_time\",\"content\":\"2020-01-01T00:00:00.000Z\"}],[\"script\",{\"type\":\"application/ld+json\"},\"{\\\"@context\\\":\\\"https://schema.org\\\",\\\"@type\\\":\\\"Article\\\",\\\"headline\\\":\\\"页面配置\\\",\\\"image\\\":[\\\"\\\"],\\\"datePublished\\\":\\\"2020-01-01T00:00:00.000Z\\\",\\\"dateModified\\\":null,\\\"author\\\":[{\\\"@type\\\":\\\"Person\\\",\\\"name\\\":\\\"Ms.Hope\\\"}]}\"]]},\"headers\":[{\"level\":2,\"title\":\"页面信息\",\"slug\":\"页面信息\",\"link\":\"#页面信息\",\"children\":[]},{\"level\":2,\"title\":\"页面内容\",\"slug\":\"页面内容\",\"link\":\"#页面内容\",\"children\":[]},{\"level\":2,\"title\":\"页面结构\",\"slug\":\"页面结构\",\"link\":\"#页面结构\",\"children\":[]}],\"readingTime\":{\"minutes\":1.43,\"words\":429},\"filePathRelative\":\"md/page.md\",\"localizedDate\":\"2020年1月1日\",\"autoDesc\":true}")
if (import.meta.webpackHot) {
import.meta.webpackHot.accept()
if (__VUE_HMR_RUNTIME__.updatePageData) {
__VUE_HMR_RUNTIME__.updatePageData(data)
}
}
if (import.meta.hot) {
import.meta.hot.accept(({ data }) => {
__VUE_HMR_RUNTIME__.updatePageData(data)
})
}
<template><div><p><code v-pre>more</code> 注释之前的内容被视为文章摘要。</p>
<!-- more -->
<h2 id="页面信息" tabindex="-1"><a class="header-anchor" href="#页面信息" aria-hidden="true">#</a> 页面信息</h2>
<p>你可以在 Markdown 的 Frontmatter 中设置页面信息。</p>
<ul>
<li>作者设置为 Ms.Hope。</li>
<li>写作日期为 2020 年 1 月 1 日</li>
<li>分类为 “使用指南”</li>
<li>标签为 “页面配置” 和 “使用指南”</li>
</ul>
<h2 id="页面内容" tabindex="-1"><a class="header-anchor" href="#页面内容" aria-hidden="true">#</a> 页面内容</h2>
<p>你可以自由在这里书写你的 Markdown。</p>
<div class="hint-container tip">
<p class="hint-container-title">提示</p>
<ul>
<li>
<p>你可以将图片和 Markdown 文件放置在一起,但是你需要使用<strong>相对链接</strong><code v-pre>./</code> 进行引用。</p>
</li>
<li>
<p>对于 <code v-pre>.vuepress/public</code> 文件夹的图片,请使用绝对链接 <code v-pre>/</code> 进行引用。</p>
</li>
</ul>
</div>
<p>主题包含了一个自定义徽章可以使用:</p>
<blockquote>
<p>文字结尾应该有深蓝色的 徽章文字 徽章。 <Badge text="徽章文字" color="#242378" /></p>
</blockquote>
<h2 id="页面结构" tabindex="-1"><a class="header-anchor" href="#页面结构" aria-hidden="true">#</a> 页面结构</h2>
<p>此页面应当包含:</p>
<ul>
<li><a href="https://theme-hope.vuejs.press/zh/guide/layout/breadcrumb.html" target="_blank" rel="noopener noreferrer">路径导航<ExternalLinkIcon/></a></li>
<li><a href="https://theme-hope.vuejs.press/zh/guide/feature/page-info.html" target="_blank" rel="noopener noreferrer">标题和页面信息<ExternalLinkIcon/></a></li>
<li><a href="https://theme-hope.vuejs.press/zh/guide/layout/page.html#%E6%A0%87%E9%A2%98%E5%88%97%E8%A1%A8" target="_blank" rel="noopener noreferrer">TOC (文章标题列表)<ExternalLinkIcon/></a></li>
<li><a href="https://theme-hope.vuejs.press/guide/feature/meta.html" target="_blank" rel="noopener noreferrer">贡献者、更新时间等页面元信息<ExternalLinkIcon/></a></li>
<li><a href="https://theme-hope.vuejs.press/zh/guide/feature/comment.html" target="_blank" rel="noopener noreferrer">评论<ExternalLinkIcon/></a></li>
<li><a href="https://theme-hope.vuejs.press/zh/guide/layout/navbar.html" target="_blank" rel="noopener noreferrer">导航栏<ExternalLinkIcon/></a></li>
<li><a href="https://theme-hope.vuejs.press/zh/guide/layout/sidebar.html" target="_blank" rel="noopener noreferrer">侧边栏<ExternalLinkIcon/></a></li>
<li><a href="https://theme-hope.vuejs.press/zh/guide/layout/footer.html" target="_blank" rel="noopener noreferrer">页脚<ExternalLinkIcon/></a></li>
<li>返回顶部按钮</li>
</ul>
<p>你可以通过主题选项和页面 Frontmatter 自定义它们。</p>
</div></template>
export const data = JSON.parse("{\"key\":\"v-177e1f06\",\"path\":\"/guide/bar/baz.html\",\"title\":\"Baz\",\"lang\":\"zh-CN\",\"frontmatter\":{\"title\":\"Baz\",\"icon\":\"circle-info\",\"description\":\"功能详情...\",\"head\":[[\"meta\",{\"property\":\"og:url\",\"content\":\"https://vuepress-theme-hope-docs-demo.netlify.app/guide/bar/baz.html\"}],[\"meta\",{\"property\":\"og:site_name\",\"content\":\"我的简历\"}],[\"meta\",{\"property\":\"og:title\",\"content\":\"Baz\"}],[\"meta\",{\"property\":\"og:description\",\"content\":\"功能详情...\"}],[\"meta\",{\"property\":\"og:type\",\"content\":\"article\"}],[\"meta\",{\"property\":\"og:locale\",\"content\":\"zh-CN\"}],[\"meta\",{\"property\":\"article:author\",\"content\":\"Mr.Hope\"}],[\"script\",{\"type\":\"application/ld+json\"},\"{\\\"@context\\\":\\\"https://schema.org\\\",\\\"@type\\\":\\\"Article\\\",\\\"headline\\\":\\\"Baz\\\",\\\"image\\\":[\\\"\\\"],\\\"dateModified\\\":null,\\\"author\\\":[{\\\"@type\\\":\\\"Person\\\",\\\"name\\\":\\\"Mr.Hope\\\",\\\"url\\\":\\\"https://mister-hope.com\\\"}]}\"]]},\"headers\":[],\"readingTime\":{\"minutes\":0.03,\"words\":10},\"filePathRelative\":\"guide/bar/baz.md\",\"autoDesc\":true}")
if (import.meta.webpackHot) {
import.meta.webpackHot.accept()
if (__VUE_HMR_RUNTIME__.updatePageData) {
__VUE_HMR_RUNTIME__.updatePageData(data)
}
}
if (import.meta.hot) {
import.meta.hot.accept(({ data }) => {
__VUE_HMR_RUNTIME__.updatePageData(data)
})
}
<template><div><p>功能详情...</p>
</div></template>
export const data = JSON.parse("{\"key\":\"v-5d5c2d30\",\"path\":\"/guide/bar/\",\"title\":\"Bar 功能\",\"lang\":\"zh-CN\",\"frontmatter\":{\"title\":\"Bar 功能\",\"icon\":\"lightbulb\",\"description\":\"介绍 我们支持 bar 功能,... 详情 baz (baz.md); ...;\",\"head\":[[\"meta\",{\"property\":\"og:url\",\"content\":\"https://vuepress-theme-hope-docs-demo.netlify.app/guide/bar/\"}],[\"meta\",{\"property\":\"og:site_name\",\"content\":\"我的简历\"}],[\"meta\",{\"property\":\"og:title\",\"content\":\"Bar 功能\"}],[\"meta\",{\"property\":\"og:description\",\"content\":\"介绍 我们支持 bar 功能,... 详情 baz (baz.md); ...;\"}],[\"meta\",{\"property\":\"og:type\",\"content\":\"article\"}],[\"meta\",{\"property\":\"og:locale\",\"content\":\"zh-CN\"}],[\"meta\",{\"property\":\"article:author\",\"content\":\"Mr.Hope\"}],[\"script\",{\"type\":\"application/ld+json\"},\"{\\\"@context\\\":\\\"https://schema.org\\\",\\\"@type\\\":\\\"Article\\\",\\\"headline\\\":\\\"Bar 功能\\\",\\\"image\\\":[\\\"\\\"],\\\"dateModified\\\":null,\\\"author\\\":[{\\\"@type\\\":\\\"Person\\\",\\\"name\\\":\\\"Mr.Hope\\\",\\\"url\\\":\\\"https://mister-hope.com\\\"}]}\"]]},\"headers\":[{\"level\":2,\"title\":\"介绍\",\"slug\":\"介绍\",\"link\":\"#介绍\",\"children\":[]},{\"level\":2,\"title\":\"详情\",\"slug\":\"详情\",\"link\":\"#详情\",\"children\":[]}],\"readingTime\":{\"minutes\":0.07,\"words\":21},\"filePathRelative\":\"guide/bar/resume.md\",\"autoDesc\":true}")
if (import.meta.webpackHot) {
import.meta.webpackHot.accept()
if (__VUE_HMR_RUNTIME__.updatePageData) {
__VUE_HMR_RUNTIME__.updatePageData(data)
}
}
if (import.meta.hot) {
import.meta.hot.accept(({ data }) => {
__VUE_HMR_RUNTIME__.updatePageData(data)
})
}
<template><div><h2 id="介绍" tabindex="-1"><a class="header-anchor" href="#介绍" aria-hidden="true">#</a> 介绍</h2>
<p>我们支持 bar 功能,...</p>
<h2 id="详情" tabindex="-1"><a class="header-anchor" href="#详情" aria-hidden="true">#</a> 详情</h2>
<ul>
<li><RouterLink to="/guide/bar/baz.html">baz</RouterLink></li>
<li>...</li>
</ul>
</div></template>
export const data = JSON.parse("{\"key\":\"v-5d5821d6\",\"path\":\"/guide/foo/\",\"title\":\"Foo 功能\",\"lang\":\"zh-CN\",\"frontmatter\":{\"title\":\"Foo 功能\",\"icon\":\"lightbulb\",\"description\":\"介绍 我们支持 foo 功能,... 详情 ray (ray.md); ...;\",\"head\":[[\"meta\",{\"property\":\"og:url\",\"content\":\"https://vuepress-theme-hope-docs-demo.netlify.app/guide/foo/\"}],[\"meta\",{\"property\":\"og:site_name\",\"content\":\"我的简历\"}],[\"meta\",{\"property\":\"og:title\",\"content\":\"Foo 功能\"}],[\"meta\",{\"property\":\"og:description\",\"content\":\"介绍 我们支持 foo 功能,... 详情 ray (ray.md); ...;\"}],[\"meta\",{\"property\":\"og:type\",\"content\":\"article\"}],[\"meta\",{\"property\":\"og:locale\",\"content\":\"zh-CN\"}],[\"meta\",{\"property\":\"article:author\",\"content\":\"Mr.Hope\"}],[\"script\",{\"type\":\"application/ld+json\"},\"{\\\"@context\\\":\\\"https://schema.org\\\",\\\"@type\\\":\\\"Article\\\",\\\"headline\\\":\\\"Foo 功能\\\",\\\"image\\\":[\\\"\\\"],\\\"dateModified\\\":null,\\\"author\\\":[{\\\"@type\\\":\\\"Person\\\",\\\"name\\\":\\\"Mr.Hope\\\",\\\"url\\\":\\\"https://mister-hope.com\\\"}]}\"]]},\"headers\":[{\"level\":2,\"title\":\"介绍\",\"slug\":\"介绍\",\"link\":\"#介绍\",\"children\":[]},{\"level\":2,\"title\":\"详情\",\"slug\":\"详情\",\"link\":\"#详情\",\"children\":[]}],\"readingTime\":{\"minutes\":0.07,\"words\":21},\"filePathRelative\":\"guide/foo/resume.md\",\"autoDesc\":true}")
if (import.meta.webpackHot) {
import.meta.webpackHot.accept()
if (__VUE_HMR_RUNTIME__.updatePageData) {
__VUE_HMR_RUNTIME__.updatePageData(data)
}
}
if (import.meta.hot) {
import.meta.hot.accept(({ data }) => {
__VUE_HMR_RUNTIME__.updatePageData(data)
})
}
<template><div><h2 id="介绍" tabindex="-1"><a class="header-anchor" href="#介绍" aria-hidden="true">#</a> 介绍</h2>
<p>我们支持 foo 功能,...</p>
<h2 id="详情" tabindex="-1"><a class="header-anchor" href="#详情" aria-hidden="true">#</a> 详情</h2>
<ul>
<li><RouterLink to="/guide/foo/ray.html">ray</RouterLink></li>
<li>...</li>
</ul>
</div></template>
export const data = JSON.parse("{\"key\":\"v-0b6fc5f8\",\"path\":\"/guide/foo/ray.html\",\"title\":\"Ray\",\"lang\":\"zh-CN\",\"frontmatter\":{\"title\":\"Ray\",\"icon\":\"circle-info\",\"description\":\"功能详情...\",\"head\":[[\"meta\",{\"property\":\"og:url\",\"content\":\"https://vuepress-theme-hope-docs-demo.netlify.app/guide/foo/ray.html\"}],[\"meta\",{\"property\":\"og:site_name\",\"content\":\"我的简历\"}],[\"meta\",{\"property\":\"og:title\",\"content\":\"Ray\"}],[\"meta\",{\"property\":\"og:description\",\"content\":\"功能详情...\"}],[\"meta\",{\"property\":\"og:type\",\"content\":\"article\"}],[\"meta\",{\"property\":\"og:locale\",\"content\":\"zh-CN\"}],[\"meta\",{\"property\":\"article:author\",\"content\":\"Mr.Hope\"}],[\"script\",{\"type\":\"application/ld+json\"},\"{\\\"@context\\\":\\\"https://schema.org\\\",\\\"@type\\\":\\\"Article\\\",\\\"headline\\\":\\\"Ray\\\",\\\"image\\\":[\\\"\\\"],\\\"dateModified\\\":null,\\\"author\\\":[{\\\"@type\\\":\\\"Person\\\",\\\"name\\\":\\\"Mr.Hope\\\",\\\"url\\\":\\\"https://mister-hope.com\\\"}]}\"]]},\"headers\":[],\"readingTime\":{\"minutes\":0.03,\"words\":10},\"filePathRelative\":\"guide/foo/ray.md\",\"autoDesc\":true}")
if (import.meta.webpackHot) {
import.meta.webpackHot.accept()
if (__VUE_HMR_RUNTIME__.updatePageData) {
__VUE_HMR_RUNTIME__.updatePageData(data)
}
}
if (import.meta.hot) {
import.meta.hot.accept(({ data }) => {
__VUE_HMR_RUNTIME__.updatePageData(data)
})
}
<template><div><p>功能详情...</p>
</div></template>
export const data = JSON.parse("{\"key\":\"v-fffb8e28\",\"path\":\"/guide/\",\"title\":\"指南\",\"lang\":\"zh-CN\",\"frontmatter\":{\"title\":\"指南\",\"icon\":\"lightbulb\",\"description\":\"功能亮点 Bar baz (bar/baz.md); ...; Foo ray (foo/ray.md); ...;\",\"head\":[[\"meta\",{\"property\":\"og:url\",\"content\":\"https://vuepress-theme-hope-docs-demo.netlify.app/guide/\"}],[\"meta\",{\"property\":\"og:site_name\",\"content\":\"我的简历\"}],[\"meta\",{\"property\":\"og:title\",\"content\":\"指南\"}],[\"meta\",{\"property\":\"og:description\",\"content\":\"功能亮点 Bar baz (bar/baz.md); ...; Foo ray (foo/ray.md); ...;\"}],[\"meta\",{\"property\":\"og:type\",\"content\":\"article\"}],[\"meta\",{\"property\":\"og:locale\",\"content\":\"zh-CN\"}],[\"meta\",{\"property\":\"article:author\",\"content\":\"Mr.Hope\"}],[\"script\",{\"type\":\"application/ld+json\"},\"{\\\"@context\\\":\\\"https://schema.org\\\",\\\"@type\\\":\\\"Article\\\",\\\"headline\\\":\\\"指南\\\",\\\"image\\\":[\\\"\\\"],\\\"dateModified\\\":null,\\\"author\\\":[{\\\"@type\\\":\\\"Person\\\",\\\"name\\\":\\\"Mr.Hope\\\",\\\"url\\\":\\\"https://mister-hope.com\\\"}]}\"]]},\"headers\":[{\"level\":2,\"title\":\"功能亮点\",\"slug\":\"功能亮点\",\"link\":\"#功能亮点\",\"children\":[{\"level\":3,\"title\":\"Bar\",\"slug\":\"bar\",\"link\":\"#bar\",\"children\":[]},{\"level\":3,\"title\":\"Foo\",\"slug\":\"foo\",\"link\":\"#foo\",\"children\":[]}]}],\"readingTime\":{\"minutes\":0.06,\"words\":17},\"filePathRelative\":\"guide/resume.md\",\"autoDesc\":true}")
if (import.meta.webpackHot) {
import.meta.webpackHot.accept()
if (__VUE_HMR_RUNTIME__.updatePageData) {
__VUE_HMR_RUNTIME__.updatePageData(data)
}
}
if (import.meta.hot) {
import.meta.hot.accept(({ data }) => {
__VUE_HMR_RUNTIME__.updatePageData(data)
})
}
<template><div><h2 id="功能亮点" tabindex="-1"><a class="header-anchor" href="#功能亮点" aria-hidden="true">#</a> 功能亮点</h2>
<h3 id="bar" tabindex="-1"><a class="header-anchor" href="#bar" aria-hidden="true">#</a> Bar</h3>
<ul>
<li><RouterLink to="/guide/bar/baz.html">baz</RouterLink></li>
<li>...</li>
</ul>
<h3 id="foo" tabindex="-1"><a class="header-anchor" href="#foo" aria-hidden="true">#</a> Foo</h3>
<ul>
<li><RouterLink to="/guide/foo/ray.html">ray</RouterLink></li>
<li>...</li>
</ul>
</div></template>
export const data = JSON.parse("{\"key\":\"v-8daa1a0e\",\"path\":\"/\",\"title\":\"主页\",\"lang\":\"zh-CN\",\"frontmatter\":{\"home\":true,\"icon\":\"home\",\"title\":\"主页\",\"heroImage\":\"/logo.svg\",\"bgImage\":\"https://theme-hope-assets.vuejs.press/bg/6-light.svg\",\"bgImageDark\":\"https://theme-hope-assets.vuejs.press/bg/6-dark.svg\",\"bgImageStyle\":{\"background-attachment\":\"fixed\"},\"heroText\":\"我的博客简历\",\"tagline\":\"您好,我叫小傅哥,毕业于🎓吉林大学。在校期间积累了不错的编程经验,可熟练运用主流分布式技术栈,独立开发项目。\",\"actions\":[{\"text\":\"查看简历 👣\",\"link\":\"./md/\",\"type\":\"primary\"},{\"text\":\"我的项目 💐\",\"link\":\"https://openai.gaga.plus/\"}],\"highlights\":[{\"header\":null,\"bgImage\":\"/assets/bg/6-light.svg\",\"bgImageDark\":\"/assets/bg/6-dark.svg\",\"features\":[{\"title\":\"公众号 - 抽奖系统\",\"icon\":\"comment-dots\",\"details\":\"23年1月,以DDD领域驱动设计架构,开发完成分布式抽奖系统。运用了全面的分布式技术栈。\",\"link\":\"https://theme-hope.vuejs.press/zh/guide/markdown/others.html#link-check\"},{\"title\":\"手写 MyBatis\",\"icon\":\"box-archive\",\"details\":\"23年4月,深度学习《手写MyBatis:渐进式源码实践》一书,完整实现了一个 MyBatis ORM 框架。\",\"link\":\"https://theme-hope.vuejs.press/zh/guide/markdown/container.html\"},{\"title\":\"OpenAI 应用服务\",\"icon\":\"table-columns\",\"details\":\"23年8月,学习 OpenAi 技术,学习 OpenAi SDK 开发,完成应用场景的对接使用「涵盖支付对接」。\",\"link\":\"https://theme-hope.vuejs.press/zh/guide/markdown/tabs.html\"},{\"title\":\"SpringBoot Stater\",\"icon\":\"table-columns\",\"details\":\"23年10月,通过对业务项目开发中的学习,对同类共性功能的重复开发,凝练成通用的服务治理组件。\",\"link\":\"https://theme-hope.vuejs.press/zh/guide/markdown/tabs.html\"}]}],\"copyright\":false,\"footer\":\"<div class=\\\"content\\\"><a href=\\\"http://beian.miit.gov.cn\\\" target=\\\"_blank\\\">京ICP备1903****号</a> | MIT 协议, 版权所有 © 2023 你的名字,All rights reserved.</div>\",\"description\":\"个人在大学/实习期间,参与过多次的技术类赛事项目,熟练使用各类技术框架,积累了丰富的开发经验。同时兼具着对技术的喜爱,长期对技术源码进行钻研学习吸收其中的设计精髓。尤其对 MyBatis 源码学习后,开发了一款监控 SQL 慢查询以及优化建议插件。并将此插件发布到了 IDEA Plugin 插件市场,半年获得了3000次下载量,获得了非常好的认可,个人...\",\"head\":[[\"meta\",{\"property\":\"og:url\",\"content\":\"https://vuepress-theme-hope-docs-demo.netlify.app/\"}],[\"meta\",{\"property\":\"og:site_name\",\"content\":\"我的简历\"}],[\"meta\",{\"property\":\"og:title\",\"content\":\"主页\"}],[\"meta\",{\"property\":\"og:description\",\"content\":\"个人在大学/实习期间,参与过多次的技术类赛事项目,熟练使用各类技术框架,积累了丰富的开发经验。同时兼具着对技术的喜爱,长期对技术源码进行钻研学习吸收其中的设计精髓。尤其对 MyBatis 源码学习后,开发了一款监控 SQL 慢查询以及优化建议插件。并将此插件发布到了 IDEA Plugin 插件市场,半年获得了3000次下载量,获得了非常好的认可,个人...\"}],[\"meta\",{\"property\":\"og:type\",\"content\":\"website\"}],[\"meta\",{\"property\":\"og:locale\",\"content\":\"zh-CN\"}],[\"meta\",{\"property\":\"article:author\",\"content\":\"Mr.Hope\"}],[\"script\",{\"type\":\"application/ld+json\"},\"{\\\"@context\\\":\\\"https://schema.org\\\",\\\"@type\\\":\\\"WebPage\\\",\\\"name\\\":\\\"主页\\\",\\\"description\\\":\\\"个人在大学/实习期间,参与过多次的技术类赛事项目,熟练使用各类技术框架,积累了丰富的开发经验。同时兼具着对技术的喜爱,长期对技术源码进行钻研学习吸收其中的设计精髓。尤其对 MyBatis 源码学习后,开发了一款监控 SQL 慢查询以及优化建议插件。并将此插件发布到了 IDEA Plugin 插件市场,半年获得了3000次下载量,获得了非常好的认可,个人...\\\"}\"]]},\"headers\":[],\"git\":{},\"readingTime\":{\"minutes\":2.12,\"words\":637},\"filePathRelative\":\"README.md\",\"autoDesc\":true}")
<template><div><br/>
<div class="hint-container tip">
<p class="hint-container-title">提示</p>
<p>个人在大学/实习期间,参与过多次的技术类赛事项目,熟练使用各类技术框架,积累了丰富的开发经验。同时兼具着对技术的喜爱,长期对技术源码进行钻研学习吸收其中的设计精髓。尤其对 MyBatis 源码学习后,开发了一款监控 SQL 慢查询以及优化建议插件。并将此插件发布到了 IDEA Plugin 插件市场,半年获得了3000次下载量,获得了非常好的认可,个人也得到了非常多的成长。地址:http://github.com/xxxx/xxxx</p>
</div>
<blockquote>
<p>我是一名热爱技术的Java程序员,自从踏入这个充满挑战与机遇的专业以来,我始终保持着对技术的高度热情和追求。我深信技术的力量可以改变世界,也能够提升个人的专业素养。在日常工作中,我不仅注重个人技能的提升,更致力于跟踪和学习行业内的最新技术动态,如SpringBoot、微服务架构、容器化技术等,以确保自己的技术栈始终保持现代化和竞争力。</p>
</blockquote>
</div></template>
export const data = JSON.parse("{\"key\":\"v-03bec7a8\",\"path\":\"/md/dev-log.html\",\"title\":\"开发日志\",\"lang\":\"zh-CN\",\"frontmatter\":{\"title\":\"开发日志\",\"index\":false,\"icon\":\"laptop-code\",\"category\":[\"自我介绍\",\"专业技能\",\"项目经验\"],\"description\":\"个人信息\",\"head\":[[\"meta\",{\"property\":\"og:url\",\"content\":\"https://vuepress-theme-hope-docs-demo.netlify.app/md/dev-log.html\"}],[\"meta\",{\"property\":\"og:site_name\",\"content\":\"我的简历\"}],[\"meta\",{\"property\":\"og:title\",\"content\":\"开发日志\"}],[\"meta\",{\"property\":\"og:description\",\"content\":\"个人信息\"}],[\"meta\",{\"property\":\"og:type\",\"content\":\"article\"}],[\"meta\",{\"property\":\"og:locale\",\"content\":\"zh-CN\"}],[\"meta\",{\"property\":\"article:author\",\"content\":\"Mr.Hope\"}],[\"script\",{\"type\":\"application/ld+json\"},\"{\\\"@context\\\":\\\"https://schema.org\\\",\\\"@type\\\":\\\"Article\\\",\\\"headline\\\":\\\"开发日志\\\",\\\"image\\\":[\\\"\\\"],\\\"dateModified\\\":null,\\\"author\\\":[{\\\"@type\\\":\\\"Person\\\",\\\"name\\\":\\\"Mr.Hope\\\",\\\"url\\\":\\\"https://mister-hope.com\\\"}]}\"]]},\"headers\":[{\"level\":2,\"title\":\"个人信息\",\"slug\":\"个人信息\",\"link\":\"#个人信息\",\"children\":[]}],\"readingTime\":{\"minutes\":0.09,\"words\":27},\"filePathRelative\":\"md/dev-log.md\",\"autoDesc\":true}")
if (import.meta.webpackHot) {
import.meta.webpackHot.accept()
if (__VUE_HMR_RUNTIME__.updatePageData) {
__VUE_HMR_RUNTIME__.updatePageData(data)
}
}
if (import.meta.hot) {
import.meta.hot.accept(({ data }) => {
__VUE_HMR_RUNTIME__.updatePageData(data)
})
}
<template><div><h2 id="个人信息" tabindex="-1"><a class="header-anchor" href="#个人信息" aria-hidden="true">#</a> 个人信息</h2>
</div></template>
export const data = JSON.parse("{\"key\":\"v-49312a44\",\"path\":\"/md/dev-log/day01.html\",\"title\":\"Day01\",\"lang\":\"zh-CN\",\"frontmatter\":{\"title\":\"Day01\",\"index\":false,\"icon\":\"laptop-code\",\"category\":[\"开发笔记\",\"学习记录\"],\"description\":\"任务\\r[x] 环境配置; \\r[x] 搭建项目结构; \\r[x] 跑通广播模式 RPC 过程调用; 学习过程 1. 项目整体了解 通过对第一节文档的阅读,了解整个项目的生命周期、所需要的技术以及代码提交规范 2. 搭建项目结构,理解每个模块应该干什么 模块 作用 | ---------------------- ----------------------...\",\"head\":[[\"meta\",{\"property\":\"og:url\",\"content\":\"https://vuepress-theme-hope-docs-demo.netlify.app/md/dev-log/day01.html\"}],[\"meta\",{\"property\":\"og:site_name\",\"content\":\"我的简历\"}],[\"meta\",{\"property\":\"og:title\",\"content\":\"Day01\"}],[\"meta\",{\"property\":\"og:description\",\"content\":\"任务\\r[x] 环境配置; \\r[x] 搭建项目结构; \\r[x] 跑通广播模式 RPC 过程调用; 学习过程 1. 项目整体了解 通过对第一节文档的阅读,了解整个项目的生命周期、所需要的技术以及代码提交规范 2. 搭建项目结构,理解每个模块应该干什么 模块 作用 | ---------------------- ----------------------...\"}],[\"meta\",{\"property\":\"og:type\",\"content\":\"article\"}],[\"meta\",{\"property\":\"og:locale\",\"content\":\"zh-CN\"}],[\"meta\",{\"property\":\"article:author\",\"content\":\"Mr.Hope\"}],[\"script\",{\"type\":\"application/ld+json\"},\"{\\\"@context\\\":\\\"https://schema.org\\\",\\\"@type\\\":\\\"Article\\\",\\\"headline\\\":\\\"Day01\\\",\\\"image\\\":[\\\"\\\"],\\\"dateModified\\\":null,\\\"author\\\":[{\\\"@type\\\":\\\"Person\\\",\\\"name\\\":\\\"Mr.Hope\\\",\\\"url\\\":\\\"https://mister-hope.com\\\"}]}\"]]},\"headers\":[{\"level\":2,\"title\":\"任务\",\"slug\":\"任务\",\"link\":\"#任务\",\"children\":[]},{\"level\":2,\"title\":\"学习过程\",\"slug\":\"学习过程\",\"link\":\"#学习过程\",\"children\":[]},{\"level\":2,\"title\":\"遇到的问题\",\"slug\":\"遇到的问题\",\"link\":\"#遇到的问题\",\"children\":[]},{\"level\":2,\"title\":\"总结\",\"slug\":\"总结\",\"link\":\"#总结\",\"children\":[]}],\"git\":{},\"readingTime\":{\"minutes\":4.48,\"words\":1343},\"filePathRelative\":\"md/dev-log/day01.md\",\"autoDesc\":true}")
<template><div><h2 id="任务" tabindex="-1"><a class="header-anchor" href="#任务" aria-hidden="true">#</a> 任务</h2>
<ul>
<li>[x] 环境配置</li>
<li>[x] 搭建项目结构</li>
<li>[x] 跑通广播模式 RPC 过程调用</li>
</ul>
<h2 id="学习过程" tabindex="-1"><a class="header-anchor" href="#学习过程" aria-hidden="true">#</a> 学习过程</h2>
<ol>
<li>
<p>项目整体了解</p>
<p>通过对第一节文档的阅读,了解整个项目的生命周期、所需要的技术以及代码提交规范</p>
</li>
<li>
<p>搭建项目结构,理解每个模块应该干什么</p>
<table>
<thead>
<tr>
<th>模块</th>
<th>作用</th>
</tr>
</thead>
<tbody>
<tr>
<td>Lottery</td>
<td>总项目,用来管理整个项目的依赖</td>
</tr>
<tr>
<td>lottery-application</td>
<td>应用层,为用户接口层提供各种应用数据展现支持服务</td>
</tr>
<tr>
<td>lottery-common</td>
<td>定义通用数据,比如统一响应数据、常量、异常、枚举等</td>
</tr>
<tr>
<td>lottery-domain</td>
<td>领域层,核心业务逻辑</td>
</tr>
<tr>
<td>lottery-infrastructure</td>
<td>基础层,为其他各层提供通用技术能力,包括数据库、Redis、ES 等</td>
</tr>
<tr>
<td>lottery-interfaces</td>
<td>用户接口层,存放与前端交互、展现数据相关的代码</td>
</tr>
<tr>
<td>lottery-rpc</td>
<td>RPC 接口文件</td>
</tr>
</tbody>
</table>
<blockquote>
<p>注:因为并不了解 DDD 架构,所以每个模块目前只有模糊的概念,具体的东西在后续代码编写中进行体会</p>
</blockquote>
</li>
<li>
<p>阅读 <a href="https://gitcode.net/KnowledgePlanet/Lottery/-/tree/210801_xfg_initProject" target="_blank" rel="noopener noreferrer">210801_xfg_initProject<ExternalLinkIcon/></a> 分支上的 POM 文件</p>
<p>通过对 POM 文件的阅读,更加清楚的了解这个项目所使用的技术,并且通过阅读发现项目没有添加 Lombok 来简化开发,具体项目开发是否使用这个插件我不知道,但是我想用,因为我<strong></strong>,所以就给加上了😄</p>
</li>
<li>
<p>跑通 RPC</p>
<ol>
<li>定义 response 状态码枚举供通用返回对象 Result 进行使用</li>
<li>定义通用返回对象 Result 类</li>
<li>定义 activity 表的持久化对象</li>
<li>定义 activity 表的 Mapper 接口</li>
<li>定义 mybatis 配置文件</li>
<li>定义 activity 表的 mapper.xml 文件</li>
<li>定义 rpc 的数据传输对象(DTO) ActivityDto</li>
<li>定义 rpc 的 请求对象 ActivityReq</li>
<li>定义 rpc 的响应对象 ActivityRes</li>
<li>定义 rpc 接口 IActivityBooth</li>
<li>实现 IActivityBooth 接口</li>
<li>编写启动类</li>
<li>编写配置文件 application.yml</li>
<li>编写测试模块 <strong>这个我是直接加在工程里面的,教程是单独开了一个项目</strong></li>
</ol>
</li>
</ol>
<h2 id="遇到的问题" tabindex="-1"><a class="header-anchor" href="#遇到的问题" aria-hidden="true">#</a> 遇到的问题</h2>
<ol>
<li>
<p>代码分层不清晰,不知道每个模块应该干什么事</p>
<p>这个问题该怎么解决呢?我觉得最好的解决办法就是不解决,哈哈哈,因为当初学 MVC 的时候最开始也不清楚为什么要这样分层,为什么就要分 Controller、Service 和 DAO,但是后来经过大量代码的编写,也逐渐熟悉了这样的分层架构,所以现在并不想解决这个问题,具体还是靠后面的代码进行了解和熟悉吧</p>
</li>
<li>
<p>JSON.toJSonString() 方法返回了空 <code v-pre>{}</code></p>
<p>问题出现原因,忘了加 <code v-pre>@Data</code> 注解,导致没有 <code v-pre>getter/setter</code> 就导致了这个问题,加上注解即可</p>
<p>解决!</p>
</li>
<li>
<p>数据库乱码问题</p>
<p>测试模块 RPC 远程调用返回的结果为:</p>
<div class="language-json line-numbers-mode" data-ext="json"><pre v-pre class="language-json"><code>测试结果:<span class="token punctuation">{</span><span class="token property">"activity"</span><span class="token operator">:</span><span class="token punctuation">{</span><span class="token property">"activityDesc"</span><span class="token operator">:</span><span class="token string">"?????????"</span><span class="token punctuation">,</span><span class="token property">"activityId"</span><span class="token operator">:</span><span class="token number">100002</span><span class="token punctuation">,</span><span class="token property">"activityName"</span><span class="token operator">:</span><span class="token string">"????"</span><span class="token punctuation">,</span><span class="token property">"beginDateTime"</span><span class="token operator">:</span><span class="token number">1705215282000</span><span class="token punctuation">,</span><span class="token property">"endDateTime"</span><span class="token operator">:</span><span class="token number">1705215282000</span><span class="token punctuation">,</span><span class="token property">"stockCount"</span><span class="token operator">:</span><span class="token number">100</span><span class="token punctuation">,</span><span class="token property">"takeCount"</span><span class="token operator">:</span><span class="token number">10</span><span class="token punctuation">}</span><span class="token punctuation">,</span><span class="token property">"result"</span><span class="token operator">:</span><span class="token punctuation">{</span><span class="token property">"code"</span><span class="token operator">:</span><span class="token string">"0000"</span><span class="token punctuation">,</span><span class="token property">"info"</span><span class="token operator">:</span><span class="token string">"成功"</span><span class="token punctuation">}</span><span class="token punctuation">}</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>明显的乱码问题,查看数据库,发现插入的时候就以及乱码了,看了一下配置文件中的数据库连接 url,发现使用了 useUnicode=true,并没有指定字符集,所以添加一下 utf-8 字符集即可,完整 url: <code v-pre>jdbc:mysql://127.0.0.1:3306/lottery?useUnicode=true&amp;characterEncoding=UTF-8</code></p>
<p>再进行一轮测试,测试结果:</p>
<div class="language-json line-numbers-mode" data-ext="json"><pre v-pre class="language-json"><code>测试结果:<span class="token punctuation">{</span><span class="token property">"activity"</span><span class="token operator">:</span><span class="token punctuation">{</span><span class="token property">"activityDesc"</span><span class="token operator">:</span><span class="token string">"仅用于插入数据测试"</span><span class="token punctuation">,</span><span class="token property">"activityId"</span><span class="token operator">:</span><span class="token number">100003</span><span class="token punctuation">,</span><span class="token property">"activityName"</span><span class="token operator">:</span><span class="token string">"测试活动"</span><span class="token punctuation">,</span><span class="token property">"beginDateTime"</span><span class="token operator">:</span><span class="token number">1705218054000</span><span class="token punctuation">,</span><span class="token property">"endDateTime"</span><span class="token operator">:</span><span class="token number">1705218054000</span><span class="token punctuation">,</span><span class="token property">"stockCount"</span><span class="token operator">:</span><span class="token number">100</span><span class="token punctuation">,</span><span class="token property">"takeCount"</span><span class="token operator">:</span><span class="token number">10</span><span class="token punctuation">}</span><span class="token punctuation">,</span><span class="token property">"result"</span><span class="token operator">:</span><span class="token punctuation">{</span><span class="token property">"code"</span><span class="token operator">:</span><span class="token string">"0000"</span><span class="token punctuation">,</span><span class="token property">"info"</span><span class="token operator">:</span><span class="token string">"成功"</span><span class="token punctuation">}</span><span class="token punctuation">}</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>解决!</p>
</li>
</ol>
<h2 id="总结" tabindex="-1"><a class="header-anchor" href="#总结" aria-hidden="true">#</a> 总结</h2>
<p>今天干了说明呢?</p>
<ol>
<li>配置环境</li>
<li>跑通 RPC</li>
</ol>
<p>具体怎么跑通 RPC 的呢?</p>
<ol>
<li>在 common 模块创建通用类</li>
<li>在 infrastructure 模块创建 dao 接口以及和数据库相对应的 po 类</li>
<li>在 rpc 模块下创建 RPC 通信接口以及对应的请求和响应的封装类</li>
<li>然后在 interfaces 模块下实现 rpc 模块的接口,在这里调用 Mapper 进行增删改查</li>
<li>然后就写配置呗,SpringBoot 配置、Dubbo 配置、MyBatis 配置</li>
</ol>
<p>学到了什么呢?</p>
<ol>
<li>由于之前学习一直使用的是 MVC 架构,并且命名不太规范,所以对于包的命名现在很不适应,比如什么dto、vo啥的各种 o 不太熟悉,这个就不准备纠结了,准备靠代码量进行熟悉</li>
<li>对每个模块有了大概的了解,至少知道了接口写在哪个模块,接口实现类在哪个模块以及 Mapper 写在哪</li>
<li>现在在我眼中,这个 interfaces 模块,就跟以前学的 Dubbo 的服务提供者一样吧?因为这个模块用来实现接口的,所以就会引用其他模块,要调用其他模块的东西就要添加依赖,所以这个模块起起来之后,就带动了所有模块,整个项目也就 run 起来了</li>
</ol>
<p>第一天,脑子还有点迷糊,因为基础不太牢固,所以有些小 bug 花费了挺长时间的,但是至少是跑起来了吧?也还行,路虽远,行则将至嘛,虽然年后要找实习,但是还是慌不得,慢慢来,一口吃不成个大胖子,准备晚上再补一补 Dubbo 基础</p>
</div></template>
export const data = JSON.parse("{\"key\":\"v-45c77906\",\"path\":\"/md/dev-log/day02.html\",\"title\":\"Day02\",\"lang\":\"zh-CN\",\"frontmatter\":{\"title\":\"Day02\",\"index\":false,\"icon\":\"laptop-code\",\"category\":[\"开发笔记\",\"学习记录\"],\"description\":\"任务\\r[x] 表设计; \\r[x] 抽奖领域模块开发; 学习过程 1. 查询分库分表相关知识点,了解到垂直和水平分库分表,主要是为了解决数据量过大导致 MySQL 查询慢、单体容量过大问题 2. 开始写代码 1. 编写基础的持久化对象 (PO) 2. 编写 Mapper 接口 3. 编写对应的 Mapper.xml 4. 设计抽奖策略顶级接口,主要是入参...\",\"head\":[[\"meta\",{\"property\":\"og:url\",\"content\":\"https://vuepress-theme-hope-docs-demo.netlify.app/md/dev-log/day02.html\"}],[\"meta\",{\"property\":\"og:site_name\",\"content\":\"我的简历\"}],[\"meta\",{\"property\":\"og:title\",\"content\":\"Day02\"}],[\"meta\",{\"property\":\"og:description\",\"content\":\"任务\\r[x] 表设计; \\r[x] 抽奖领域模块开发; 学习过程 1. 查询分库分表相关知识点,了解到垂直和水平分库分表,主要是为了解决数据量过大导致 MySQL 查询慢、单体容量过大问题 2. 开始写代码 1. 编写基础的持久化对象 (PO) 2. 编写 Mapper 接口 3. 编写对应的 Mapper.xml 4. 设计抽奖策略顶级接口,主要是入参...\"}],[\"meta\",{\"property\":\"og:type\",\"content\":\"article\"}],[\"meta\",{\"property\":\"og:locale\",\"content\":\"zh-CN\"}],[\"meta\",{\"property\":\"article:author\",\"content\":\"Mr.Hope\"}],[\"script\",{\"type\":\"application/ld+json\"},\"{\\\"@context\\\":\\\"https://schema.org\\\",\\\"@type\\\":\\\"Article\\\",\\\"headline\\\":\\\"Day02\\\",\\\"image\\\":[\\\"\\\"],\\\"dateModified\\\":null,\\\"author\\\":[{\\\"@type\\\":\\\"Person\\\",\\\"name\\\":\\\"Mr.Hope\\\",\\\"url\\\":\\\"https://mister-hope.com\\\"}]}\"]]},\"headers\":[{\"level\":2,\"title\":\"任务\",\"slug\":\"任务\",\"link\":\"#任务\",\"children\":[]},{\"level\":2,\"title\":\"学习过程\",\"slug\":\"学习过程\",\"link\":\"#学习过程\",\"children\":[]},{\"level\":2,\"title\":\"遇到的问题\",\"slug\":\"遇到的问题\",\"link\":\"#遇到的问题\",\"children\":[]},{\"level\":2,\"title\":\"总结\",\"slug\":\"总结\",\"link\":\"#总结\",\"children\":[]}],\"git\":{},\"readingTime\":{\"minutes\":3.53,\"words\":1059},\"filePathRelative\":\"md/dev-log/day02.md\",\"autoDesc\":true}")
<template><div><h2 id="任务" tabindex="-1"><a class="header-anchor" href="#任务" aria-hidden="true">#</a> 任务</h2>
<ul>
<li>[x] 表设计</li>
<li>[x] 抽奖领域模块开发</li>
</ul>
<h2 id="学习过程" tabindex="-1"><a class="header-anchor" href="#学习过程" aria-hidden="true">#</a> 学习过程</h2>
<ol>
<li>查询分库分表相关知识点,了解到垂直和水平分库分表,主要是为了解决数据量过大导致 MySQL 查询慢、单体容量过大问题</li>
<li>开始写代码
<ol>
<li>编写基础的持久化对象 (PO)</li>
<li>编写 Mapper 接口</li>
<li>编写对应的 Mapper.xml</li>
<li>设计抽奖策略顶级接口,主要是入参出参,如何封装,要封装哪些数据</li>
<li>编写顶级接口的基础实现,实现里面公用的方法,比如把初始化方法、哈希计算的方法以及判断是否初始化完成</li>
<li>编写两种算法的实现</li>
<li>算法单元测试</li>
</ol>
</li>
</ol>
<h2 id="遇到的问题" tabindex="-1"><a class="header-anchor" href="#遇到的问题" aria-hidden="true">#</a> 遇到的问题</h2>
<ol>
<li>
<p>为什么在设计阶段就考虑分库分表等问题</p>
<p>在之前的学习过程中,并没有项目环境的支撑,导致了这个问题,一个大的项目,如果要兼顾性能以及代码的可扩展性,那么在数据库设计阶段就应该想到这些,那些是热点数据,那些数据会进行大量的插入,没有全局把控的观念,只有了解这些,才能设计出一个性能良好且代码可维护性高的项目,这个需要项目积累,这是一个很重要的东西,以后在学习的时候一定要多注意这方面,多看看别人的数据库是怎么设计的,以及为什么要这么设计,要有全局把控的观念</p>
</li>
<li>
<p>抽奖算法是怎么实现的呢</p>
<p>首先这个初始化的时候,传入奖品和对应的概率,然后概率乘以 100,就是对应的下标范围,一个奖品一个范围,是不会重复的,然后经过斐波那契哈希散列算法,将这个对应的下标进行加工,使其均匀的分布在数组中,在对下标进行加工的过程中,确保了无论传入什么数字,都会在 0 ~ 128 的范围内</p>
<ol>
<li>
<p>SingleRateRandomDrawAlgorithm</p>
<p>这种策略是生成一个 1 ~ 100 的随机数,然后经过 hashIdx 计算对应的下标,然后去上面初始化好的数组中去取奖品</p>
</li>
<li>
<p>DefaultRateRandomDrawAlgorithm</p>
<p>这是一种必中奖策略,先排除掉不在抽奖范围内的奖品ID,然后生成随机数,然后判断这个随机数是否在指定的范围内,如果不在,那么这个奖品就没中,然后看下一个奖品,重新生成随机数,然后看是否在指定的中奖概率内加上上次生成的随机数范围内</p>
</li>
</ol>
</li>
</ol>
<h2 id="总结" tabindex="-1"><a class="header-anchor" href="#总结" aria-hidden="true">#</a> 总结</h2>
<p>今天主要把抽奖算法给搞定了,虽然代码不多,但是很难理解,最开始都搞不清楚为什么这样子就实现了抽奖算法,不懂这个概率是如何保证的,然后 debug 了好久,发现其实就是一个 128 长度的数组,然后经过哈希散列排列,保证随机的均匀性,其实这 128 长度的数组就已经保证了抽奖的概率,假设不经过哈希算法,直接放进去,假设两个的抽奖概率是 0.1 和 0.2,那么放进去的时候就是下标 1~10 全是第一个奖品,下标 11 ~ 30 全是第二个奖品,随机数生成的是 1 ~ 100,那么第一个奖品也就是有 10 个数字能中奖,那不就是 10% 的中奖概率了么,加哈希散列只是为了均匀分布,增加随机性和公平性</p>
<p>收获:</p>
<ol>
<li>对 DDD 有更深的了解,知道什么类该写在什么包下,比昨天更清楚代码该如何组织了</li>
<li>了解了分库分表,虽然是第一次接触,但是至少知道了为什么要分库分表,随着项目的进行,就会学会如何分库分表了吧</li>
<li>了解了 Hash 散列算法,后续看看源码,要搞清楚底层是如何运作的</li>
</ol>
</div></template>
export const data = JSON.parse("{\"key\":\"v-425dc7c8\",\"path\":\"/md/dev-log/day03.html\",\"title\":\"Day03\",\"lang\":\"zh-CN\",\"frontmatter\":{\"title\":\"Day03\",\"index\":false,\"icon\":\"laptop-code\",\"category\":[\"开发笔记\",\"学习记录\"],\"description\":\"day03 任务\\r[x] 模板模式处理抽奖流程; 学习过程 1. 因为之前没学过设计模式,先学一学模板模式,用到一种学一种,哈哈哈 2. 先看一下整个抽奖流程 ![抽奖过程][step] 3. 了解了抽奖流程之后就开始写代码 1. 先写对应的 dao 层 1. 要查策略吧?写个策略的 Mapper 2. 要查策略详情吧?写个策略详情的 Mapper 3...\",\"head\":[[\"meta\",{\"property\":\"og:url\",\"content\":\"https://vuepress-theme-hope-docs-demo.netlify.app/md/dev-log/day03.html\"}],[\"meta\",{\"property\":\"og:site_name\",\"content\":\"我的简历\"}],[\"meta\",{\"property\":\"og:title\",\"content\":\"Day03\"}],[\"meta\",{\"property\":\"og:description\",\"content\":\"day03 任务\\r[x] 模板模式处理抽奖流程; 学习过程 1. 因为之前没学过设计模式,先学一学模板模式,用到一种学一种,哈哈哈 2. 先看一下整个抽奖流程 ![抽奖过程][step] 3. 了解了抽奖流程之后就开始写代码 1. 先写对应的 dao 层 1. 要查策略吧?写个策略的 Mapper 2. 要查策略详情吧?写个策略详情的 Mapper 3...\"}],[\"meta\",{\"property\":\"og:type\",\"content\":\"article\"}],[\"meta\",{\"property\":\"og:locale\",\"content\":\"zh-CN\"}],[\"meta\",{\"property\":\"article:author\",\"content\":\"Mr.Hope\"}],[\"script\",{\"type\":\"application/ld+json\"},\"{\\\"@context\\\":\\\"https://schema.org\\\",\\\"@type\\\":\\\"Article\\\",\\\"headline\\\":\\\"Day03\\\",\\\"image\\\":[\\\"\\\"],\\\"dateModified\\\":null,\\\"author\\\":[{\\\"@type\\\":\\\"Person\\\",\\\"name\\\":\\\"Mr.Hope\\\",\\\"url\\\":\\\"https://mister-hope.com\\\"}]}\"]]},\"headers\":[{\"level\":2,\"title\":\"day03\",\"slug\":\"day03\",\"link\":\"#day03\",\"children\":[{\"level\":3,\"title\":\"任务\",\"slug\":\"任务\",\"link\":\"#任务\",\"children\":[]},{\"level\":3,\"title\":\"学习过程\",\"slug\":\"学习过程\",\"link\":\"#学习过程\",\"children\":[]},{\"level\":3,\"title\":\"遇到的问题\",\"slug\":\"遇到的问题\",\"link\":\"#遇到的问题\",\"children\":[]},{\"level\":3,\"title\":\"总结\",\"slug\":\"总结\",\"link\":\"#总结\",\"children\":[]}]}],\"git\":{},\"readingTime\":{\"minutes\":39.64,\"words\":11893},\"filePathRelative\":\"md/dev-log/day03.md\",\"autoDesc\":true}")
因为 它太大了无法显示 source diff 。你可以改为 查看blob
export const data = JSON.parse("{\"key\":\"v-3ef4168a\",\"path\":\"/md/dev-log/day04.html\",\"title\":\"Day04\",\"lang\":\"zh-CN\",\"frontmatter\":{\"title\":\"Day04\",\"index\":false,\"icon\":\"laptop-code\",\"category\":[\"开发笔记\",\"学习记录\"],\"description\":\"任务 [x] 简单工厂搭建发奖领域; 学习过程 1. 表结构变了,先导入 SQL,然后该对应的 PO 类,然后改一下 Mapper 文件 2. 先把包结构建好 1. 新建一个领域包,负责发奖 2. 领域包内建三个子包,model 实体封装包、repository 提供仓储服务、service 提供具体的服务(重点内容) 3. 看一下代码的继承关系 4....\",\"head\":[[\"meta\",{\"property\":\"og:url\",\"content\":\"https://vuepress-theme-hope-docs-demo.netlify.app/md/dev-log/day04.html\"}],[\"meta\",{\"property\":\"og:site_name\",\"content\":\"我的简历\"}],[\"meta\",{\"property\":\"og:title\",\"content\":\"Day04\"}],[\"meta\",{\"property\":\"og:description\",\"content\":\"任务 [x] 简单工厂搭建发奖领域; 学习过程 1. 表结构变了,先导入 SQL,然后该对应的 PO 类,然后改一下 Mapper 文件 2. 先把包结构建好 1. 新建一个领域包,负责发奖 2. 领域包内建三个子包,model 实体封装包、repository 提供仓储服务、service 提供具体的服务(重点内容) 3. 看一下代码的继承关系 4....\"}],[\"meta\",{\"property\":\"og:type\",\"content\":\"article\"}],[\"meta\",{\"property\":\"og:locale\",\"content\":\"zh-CN\"}],[\"meta\",{\"property\":\"article:author\",\"content\":\"Mr.Hope\"}],[\"script\",{\"type\":\"application/ld+json\"},\"{\\\"@context\\\":\\\"https://schema.org\\\",\\\"@type\\\":\\\"Article\\\",\\\"headline\\\":\\\"Day04\\\",\\\"image\\\":[\\\"\\\"],\\\"dateModified\\\":null,\\\"author\\\":[{\\\"@type\\\":\\\"Person\\\",\\\"name\\\":\\\"Mr.Hope\\\",\\\"url\\\":\\\"https://mister-hope.com\\\"}]}\"]]},\"headers\":[{\"level\":3,\"title\":\"任务\",\"slug\":\"任务\",\"link\":\"#任务\",\"children\":[]},{\"level\":3,\"title\":\"学习过程\",\"slug\":\"学习过程\",\"link\":\"#学习过程\",\"children\":[]},{\"level\":2,\"title\":\"遇到的问题\",\"slug\":\"遇到的问题\",\"link\":\"#遇到的问题\",\"children\":[]},{\"level\":2,\"title\":\"总结\",\"slug\":\"总结\",\"link\":\"#总结\",\"children\":[]}],\"git\":{},\"readingTime\":{\"minutes\":1.54,\"words\":461},\"filePathRelative\":\"md/dev-log/day04.md\",\"autoDesc\":true}")
<template><div><h3 id="任务" tabindex="-1"><a class="header-anchor" href="#任务" aria-hidden="true">#</a> 任务</h3>
<ul>
<li>[x] 简单工厂搭建发奖领域</li>
</ul>
<h3 id="学习过程" tabindex="-1"><a class="header-anchor" href="#学习过程" aria-hidden="true">#</a> 学习过程</h3>
<ol>
<li>
<p>表结构变了,先导入 SQL,然后该对应的 PO 类,然后改一下 Mapper 文件</p>
</li>
<li>
<p>先把包结构建好</p>
<ol>
<li>新建一个领域包,负责发奖</li>
<li>领域包内建三个子包,model 实体封装包、repository 提供仓储服务、service 提供具体的服务(重点内容)</li>
</ol>
</li>
<li>
<p>看一下代码的继承关系</p>
</li>
<li>
<p>debug 看一下代码执行流程,了解其中的调用关系</p>
<ol>
<li>先执行抽奖,返回抽奖结果</li>
<li>对抽奖结果进行判断,如果是未中奖,直接返回</li>
<li>中奖了就保存用户信息以及订单信息</li>
<li>根据中奖结果中的奖品类型获取对应的服务</li>
<li>然后把第三步保存的用户信息以及订单信息传进去,做一个发奖的操作</li>
<li>然后返回发奖结果</li>
</ol>
</li>
</ol>
<h2 id="遇到的问题" tabindex="-1"><a class="header-anchor" href="#遇到的问题" aria-hidden="true">#</a> 遇到的问题</h2>
<p>今天还没遇到啥问题,代码比较简单,主要是数据库字段规范之后,好多 Mapper 要改 T.T,最开始我还在纠结要不要当初建表的时候就改了</p>
<p><strong>就很气,本来能学两小节的,md,电脑被亲戚孩子给整挂了,直接开不了机了,麻了,修电脑都修了两小时,系统还重装了,又重装环境</strong></p>
<h2 id="总结" tabindex="-1"><a class="header-anchor" href="#总结" aria-hidden="true">#</a> 总结</h2>
<ol>
<li>越来越喜欢 DDD 架构这种包的组织方式了,虽然包很多,看着有点复杂,但是真的理解了之后,就感觉很干净,扩展性也很好,虽然目前还没完全搞清楚 DDD</li>
<li>学会了工厂模式,根据奖品类型,从工厂里面拿对应的实现类进行发奖操作</li>
</ol>
</div></template>
export const data = JSON.parse("{\"key\":\"v-3b8a654c\",\"path\":\"/md/dev-log/day05.html\",\"title\":\"Day05\",\"lang\":\"zh-CN\",\"frontmatter\":{\"title\":\"Day05\",\"index\":false,\"icon\":\"laptop-code\",\"category\":[\"开发笔记\",\"学习记录\"],\"description\":\"任务\\r[x] 活动领域的配置与状态; 学习过程 1. 包结构变化,调整对应的包 2. 了解活动创建的整个流程,然后将流程进行编排(其实就是落库的步骤呗),写对应的 repository 层代码 1. 首先明确要做哪些操作 1. 添加活动 2. 添加奖品 3. 添加活动配置 4. 添加策略 5. 添加策略明细 2. 编写对应的 repository 接口...\",\"head\":[[\"meta\",{\"property\":\"og:url\",\"content\":\"https://vuepress-theme-hope-docs-demo.netlify.app/md/dev-log/day05.html\"}],[\"meta\",{\"property\":\"og:site_name\",\"content\":\"我的简历\"}],[\"meta\",{\"property\":\"og:title\",\"content\":\"Day05\"}],[\"meta\",{\"property\":\"og:description\",\"content\":\"任务\\r[x] 活动领域的配置与状态; 学习过程 1. 包结构变化,调整对应的包 2. 了解活动创建的整个流程,然后将流程进行编排(其实就是落库的步骤呗),写对应的 repository 层代码 1. 首先明确要做哪些操作 1. 添加活动 2. 添加奖品 3. 添加活动配置 4. 添加策略 5. 添加策略明细 2. 编写对应的 repository 接口...\"}],[\"meta\",{\"property\":\"og:type\",\"content\":\"article\"}],[\"meta\",{\"property\":\"og:locale\",\"content\":\"zh-CN\"}],[\"meta\",{\"property\":\"article:author\",\"content\":\"Mr.Hope\"}],[\"script\",{\"type\":\"application/ld+json\"},\"{\\\"@context\\\":\\\"https://schema.org\\\",\\\"@type\\\":\\\"Article\\\",\\\"headline\\\":\\\"Day05\\\",\\\"image\\\":[\\\"\\\"],\\\"dateModified\\\":null,\\\"author\\\":[{\\\"@type\\\":\\\"Person\\\",\\\"name\\\":\\\"Mr.Hope\\\",\\\"url\\\":\\\"https://mister-hope.com\\\"}]}\"]]},\"headers\":[{\"level\":2,\"title\":\"任务\",\"slug\":\"任务\",\"link\":\"#任务\",\"children\":[]},{\"level\":2,\"title\":\"学习过程\",\"slug\":\"学习过程\",\"link\":\"#学习过程\",\"children\":[]},{\"level\":2,\"title\":\"遇到的问题\",\"slug\":\"遇到的问题\",\"link\":\"#遇到的问题\",\"children\":[]},{\"level\":2,\"title\":\"总结\",\"slug\":\"总结\",\"link\":\"#总结\",\"children\":[]}],\"git\":{},\"readingTime\":{\"minutes\":3.98,\"words\":1193},\"filePathRelative\":\"md/dev-log/day05.md\",\"autoDesc\":true}")
<template><div><h2 id="任务" tabindex="-1"><a class="header-anchor" href="#任务" aria-hidden="true">#</a> 任务</h2>
<ul>
<li>[x] 活动领域的配置与状态</li>
</ul>
<h2 id="学习过程" tabindex="-1"><a class="header-anchor" href="#学习过程" aria-hidden="true">#</a> 学习过程</h2>
<ol>
<li>包结构变化,调整对应的包</li>
<li>了解活动创建的整个流程,然后将流程进行编排(其实就是落库的步骤呗),写对应的 repository 层代码
<ol>
<li>首先明确要做哪些操作
<ol>
<li>添加活动</li>
<li>添加奖品</li>
<li>添加活动配置</li>
<li>添加策略</li>
<li>添加策略明细</li>
</ol>
</li>
<li>编写对应的 repository 接口和实现类</li>
<li></li>
</ol>
</li>
<li>debug 了解状态模式如何进行的状态判断(感觉不用刻意去学这个设计模式,通过对项目的学习,从而达到状态模式的学习,<strong>后期进行设计模式的统一学习</strong>
<ol>
<li>首先定义一个状态处理的接口,入参统一是活动ID和当前状态</li>
<li>定义一个活动状态抽象类,这个抽象类的子类用来判断某种状态是否可以流转</li>
<li>编写抽象类的实现,里面定义是否可以流转</li>
<li>编写状态配置类,把每一种活动状态抽象类的实现注入进去并放入 Map 中,供状态处理服务使用</li>
<li>编写状态处理接口的实现类
<ol>
<li>先从状态配置中获取当前状态所对应的活动状态流转实现类</li>
<li>然后实现类调用方法,通过方法的返回值来确定是否能进行操作
<ol>
<li>如果能进行变更的,先进行落库操作,然后根据 MyBatis 返回值返回对应信息</li>
<li>如果不能进行变更的,直接返回对应的错误信息</li>
</ol>
</li>
</ol>
</li>
</ol>
</li>
</ol>
<h2 id="遇到的问题" tabindex="-1"><a class="header-anchor" href="#遇到的问题" aria-hidden="true">#</a> 遇到的问题</h2>
<ol>
<li>
<p>为什么要使用 <code v-pre>BeanUtils.copyProperties()</code></p>
<p>因为原来很少使用这种方法,以前都是 new 对象,然后把传进来的对象手动一个一个赋值,对这个方法不太了解,简单来说就是实现对象的拷贝,属性名相同的就进行拷贝,属性名不相同的就不进行操作,底层使用反射,首先把读写权限都设置为 true,然后再进行获取和赋值操作,这种操作是 <strong>浅拷贝</strong></p>
<div class="language-java line-numbers-mode" data-ext="java"><pre v-pre class="language-java"><code><span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token class-name">Modifier</span><span class="token punctuation">.</span><span class="token function">isPublic</span><span class="token punctuation">(</span>readMethod<span class="token punctuation">.</span><span class="token function">getDeclaringClass</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getModifiers</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
readMethod<span class="token punctuation">.</span><span class="token function">setAccessible</span><span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token class-name">Object</span> value <span class="token operator">=</span> readMethod<span class="token punctuation">.</span><span class="token function">invoke</span><span class="token punctuation">(</span>source<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token class-name">Modifier</span><span class="token punctuation">.</span><span class="token function">isPublic</span><span class="token punctuation">(</span>writeMethod<span class="token punctuation">.</span><span class="token function">getDeclaringClass</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getModifiers</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
writeMethod<span class="token punctuation">.</span><span class="token function">setAccessible</span><span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
writeMethod<span class="token punctuation">.</span><span class="token function">invoke</span><span class="token punctuation">(</span>target<span class="token punctuation">,</span> value<span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></li>
<li>
<p>数据库 bug <code v-pre>### Error updating database. Cause: java.sql.SQLException: Incorrect string value: '\xE4\xB8\x80\xE7\xAD\x89...' for column 'award_name' at row 1</code></p>
<p>中文插入乱码问题,我建数据库的时候设置了 utf8,但是建表的时候默认没有设置成 <code v-pre>utf8</code>,使用的编码是 <code v-pre>latin1</code>,所以需要修改字段的编码为 <code v-pre>utf8</code></p>
</li>
</ol>
<h2 id="总结" tabindex="-1"><a class="header-anchor" href="#总结" aria-hidden="true">#</a> 总结</h2>
<ol>
<li>
<p>包结果的变化</p>
<ol>
<li>首先呢这个解决了我之前的一个疑问:为啥要把数据库的真实操作写到领域层呢?这不应该写到基础服务层更符合逻辑吗?</li>
<li>更改详情:基础服务模块引入领域模块,在领域层写 repository 接口,在基础服务层写实现</li>
</ol>
</li>
<li>
<p>状态流程处理</p>
<p>相对于普通的 if-else 处理流程,状态模式设计模式把状态的流转转化为方法,从而简化了 if-else 一坨接着一坨的形式,如果有新的状态,只需要添加对应的抽象实现以及在其他实现中添加对应的流转方法</p>
<p><em>后期对设计模式进行统一的学习,目前只了解了基础的程序运行流程,根据流程来了解对应的设计模式,目前对于状态模式的了解仅限于以下两点</em></p>
<ol>
<li>将一种状态的流转包装成一个类,然后在类里面定义是否可以流转</li>
<li>状态的流转通过调用方法的形式进行,而不是通过 if-else 去判断,比如要把状态修改为审核通过,那么直接调用 <code v-pre>checkPass()</code> 然后找到当前状态处理类,调用处理类的 <code v-pre>checkPass()</code> 方法,然后返回结果就可以了</li>
</ol>
</li>
<li>
<p>对于学习的思考</p>
<p>最近陷入了日夜颠倒的死循环,主要就是晚上窝在床上玩手机呢,然后看了会儿星球就想起床学习,一学又搞到两三点三四点,搞不好 bug 多还通了个宵,导致第二天甚至第三天状态低迷,后面要压制学习欲望了,每天该做的做完了就休息,以后每周日休息一天,晚上一点前就睡觉,避免陷入死循环,再多的任务,人的精力也是有限的,只要按部就班稳扎稳打,相信最后也会有收获,不必急于求成</p>
</li>
</ol>
</div></template>
export const data = JSON.parse("{\"key\":\"v-3820b40e\",\"path\":\"/md/dev-log/day06.html\",\"title\":\"Day06\",\"lang\":\"zh-CN\",\"frontmatter\":{\"title\":\"Day06\",\"index\":false,\"icon\":\"laptop-code\",\"category\":[\"开发笔记\",\"学习记录\"],\"description\":\"任务 [x] ID 生成策略开发; 学习过程 1. 先看视频了解用到了啥 2. 看小傅哥策略模式的文章 (https://mp.weixin.qq.com/s/zOFLtSFVrYEyTuihzwgKYw) 3. 看代码结构 1. 定义一个接口,用来生成 id 2. 实现接口,实现不同的 id 生成算法 3. 定义一个上下文对象,包装各种 id 生成算...\",\"head\":[[\"meta\",{\"property\":\"og:url\",\"content\":\"https://vuepress-theme-hope-docs-demo.netlify.app/md/dev-log/day06.html\"}],[\"meta\",{\"property\":\"og:site_name\",\"content\":\"我的简历\"}],[\"meta\",{\"property\":\"og:title\",\"content\":\"Day06\"}],[\"meta\",{\"property\":\"og:description\",\"content\":\"任务 [x] ID 生成策略开发; 学习过程 1. 先看视频了解用到了啥 2. 看小傅哥策略模式的文章 (https://mp.weixin.qq.com/s/zOFLtSFVrYEyTuihzwgKYw) 3. 看代码结构 1. 定义一个接口,用来生成 id 2. 实现接口,实现不同的 id 生成算法 3. 定义一个上下文对象,包装各种 id 生成算...\"}],[\"meta\",{\"property\":\"og:type\",\"content\":\"article\"}],[\"meta\",{\"property\":\"og:locale\",\"content\":\"zh-CN\"}],[\"meta\",{\"property\":\"article:author\",\"content\":\"Mr.Hope\"}],[\"script\",{\"type\":\"application/ld+json\"},\"{\\\"@context\\\":\\\"https://schema.org\\\",\\\"@type\\\":\\\"Article\\\",\\\"headline\\\":\\\"Day06\\\",\\\"image\\\":[\\\"\\\"],\\\"dateModified\\\":null,\\\"author\\\":[{\\\"@type\\\":\\\"Person\\\",\\\"name\\\":\\\"Mr.Hope\\\",\\\"url\\\":\\\"https://mister-hope.com\\\"}]}\"]]},\"headers\":[{\"level\":3,\"title\":\"任务\",\"slug\":\"任务\",\"link\":\"#任务\",\"children\":[]},{\"level\":3,\"title\":\"学习过程\",\"slug\":\"学习过程\",\"link\":\"#学习过程\",\"children\":[]},{\"level\":3,\"title\":\"遇到的问题\",\"slug\":\"遇到的问题\",\"link\":\"#遇到的问题\",\"children\":[]},{\"level\":3,\"title\":\"总结\",\"slug\":\"总结\",\"link\":\"#总结\",\"children\":[]}],\"git\":{},\"readingTime\":{\"minutes\":3.6,\"words\":1081},\"filePathRelative\":\"md/dev-log/day06.md\",\"autoDesc\":true}")
<template><div><h3 id="任务" tabindex="-1"><a class="header-anchor" href="#任务" aria-hidden="true">#</a> 任务</h3>
<ul>
<li>[x] ID 生成策略开发</li>
</ul>
<h3 id="学习过程" tabindex="-1"><a class="header-anchor" href="#学习过程" aria-hidden="true">#</a> 学习过程</h3>
<ol>
<li>
<p>先看视频了解用到了啥</p>
</li>
<li>
<p>看小傅哥策略模式的<a href="https://mp.weixin.qq.com/s/zOFLtSFVrYEyTuihzwgKYw" target="_blank" rel="noopener noreferrer">文章<ExternalLinkIcon/></a></p>
</li>
<li>
<p>看代码结构</p>
<ol>
<li>定义一个接口,用来生成 id</li>
<li>实现接口,实现不同的 id 生成算法</li>
<li>定义一个上下文对象,包装各种 id 生成算法,然后放到 Spring 容器中供其他类注入使用</li>
</ol>
<p>今天的代码比较简单,主要就是涉及策略模式的使用,这里的上下文对象和之前的 config 类似,都是把写好的实现类进行包装,统一放到一个容器内,然后其他类通过这个容器,配合枚举拿到对应的实现类进行调用</p>
</li>
<li>
<p>实操</p>
</li>
</ol>
<h3 id="遇到的问题" tabindex="-1"><a class="header-anchor" href="#遇到的问题" aria-hidden="true">#</a> 遇到的问题</h3>
<ol>
<li>什么是雪花算法</li>
<li>项目代码中的雪花算法为什么要这么写</li>
</ol>
<h3 id="总结" tabindex="-1"><a class="header-anchor" href="#总结" aria-hidden="true">#</a> 总结</h3>
<ol>
<li>
<p>对策略模式的新看法</p>
<p>现在对策略模式的看法如下:</p>
<ol>
<li>将每一种策略想象成一个又一个的工具类</li>
<li>这些工具类都来自同一个接口,也就是实现的功能是类似的,比如都是生成 ID,都是用来发奖的</li>
<li>把这些工具类进行 “打包” 处理,封装在一个 Map 中,键使用枚举进行处理</li>
<li>后续使用通过注入封装好的 Map 和枚举直接进行 get 操作然后使用就可以了</li>
</ol>
<p>好处:</p>
<p>减少 if else 的次数,如果以后要进行扩展,只需要添加一个接口实现,然后在 &quot;打包&quot; 里添加一种策略就可以了,易于扩展,避免代码过度耦合,把一坨代码进行分片,功能职责划分更清楚,并且可以动态切换算法:将实现类进行更改就可以实现动态切换</p>
</li>
<li>
<p>什么是雪花算法</p>
<p>雪花算法用于生成分布式唯一 ID,核心思想如下:</p>
<ol>
<li>将一个64位的整数划分为不同的部分,每一部分代表不同的含义</li>
<li>符号位(1位):始终为 0,表示生成的 ID 为正整数</li>
<li>时间戳(41位):记录生成 ID 的时间戳,精确到毫秒级,41位可以表示约 69 年的时间</li>
<li>工作机器 ID(10位):标识机器的唯一ID,用于解决分布式系统中的多节点生成 ID 的冲突问题,最多有 2^10 台机器 ,即 1024 个</li>
<li>序列号(12位):表示同一毫秒内的序列号,用于解决同一节点在同一毫秒内生成 ID 的冲突问题,最多可以用 2 的 12 次方个 ID,也就是同一毫秒内同一机器最多生成 4096 个</li>
</ol>
<p>通俗化:确保在分布式系统中,通过对时间戳、机器和序列号进行加工,生成一个唯一 ID</p>
<p>了解了这个东西就能理解项目中为啥要这么写了,后面看看雪花算法的具体源码,看看每个部分如何进行加工的</p>
</li>
<li>
<p>短码生成的时候进行打乱和再加工</p>
<p>因为没有实际项目经验之前就是直接拿当前时间戳进行获取的,没有进行打乱操作,以后要记住这个操作,避免项目数据被别人抓个包一下子就猜出来了 -.- 好歹穿件衣服,不能裸奔</p>
</li>
<li>
<p>预习预习明天的内容,哈哈哈,好像要开始上强度了,昨天亲戚结婚忙了一天,半夜才回来,今天就到这把,查点资料预习预习明天的,感觉 DDD 这种包组织方式特别适合每种设计模式和算法的落地,MVC 如果想要算法和设计模式落地的话,感觉要考虑的东西很多很多,要么就是牵一发而动全身,要么就是落地之后包里面有很多的多余的东西,这种方式则不会出现这种情况,一个领域里面,使用一种设计模式,并不会影响其他的包,其他的包只管调用所提供的接口就好了</p>
</li>
</ol>
</div></template>
export const data = JSON.parse("{\"key\":\"v-649fe232\",\"path\":\"/md/dev-log/day07~day08.html\",\"title\":\"Day07 ~ Day08\",\"lang\":\"zh-CN\",\"frontmatter\":{\"title\":\"Day07 ~ Day08\",\"index\":false,\"icon\":\"laptop-code\",\"category\":[\"开发笔记\",\"学习记录\"],\"description\":\"任务\\r[x] 分库分表组件; 遇到的问题 问题就不说了,这一章节全是问题 T.T,基础不牢,地动山摇啊!!! 总结 首先建立一个大局观,要实现一个分库分表组件,那么先要学会如何编写 SpringBoot Starter,然后这个 Starter 需要实现的功能是分库分表,那么一定是有多个数据源,这个数据源从项目的 yml 配置文件传进来,然后就要实现多...\",\"head\":[[\"meta\",{\"property\":\"og:url\",\"content\":\"https://vuepress-theme-hope-docs-demo.netlify.app/md/dev-log/day07~day08.html\"}],[\"meta\",{\"property\":\"og:site_name\",\"content\":\"我的简历\"}],[\"meta\",{\"property\":\"og:title\",\"content\":\"Day07 ~ Day08\"}],[\"meta\",{\"property\":\"og:description\",\"content\":\"任务\\r[x] 分库分表组件; 遇到的问题 问题就不说了,这一章节全是问题 T.T,基础不牢,地动山摇啊!!! 总结 首先建立一个大局观,要实现一个分库分表组件,那么先要学会如何编写 SpringBoot Starter,然后这个 Starter 需要实现的功能是分库分表,那么一定是有多个数据源,这个数据源从项目的 yml 配置文件传进来,然后就要实现多...\"}],[\"meta\",{\"property\":\"og:type\",\"content\":\"article\"}],[\"meta\",{\"property\":\"og:locale\",\"content\":\"zh-CN\"}],[\"meta\",{\"property\":\"article:author\",\"content\":\"Mr.Hope\"}],[\"script\",{\"type\":\"application/ld+json\"},\"{\\\"@context\\\":\\\"https://schema.org\\\",\\\"@type\\\":\\\"Article\\\",\\\"headline\\\":\\\"Day07 ~ Day08\\\",\\\"image\\\":[\\\"\\\"],\\\"dateModified\\\":null,\\\"author\\\":[{\\\"@type\\\":\\\"Person\\\",\\\"name\\\":\\\"Mr.Hope\\\",\\\"url\\\":\\\"https://mister-hope.com\\\"}]}\"]]},\"headers\":[{\"level\":3,\"title\":\"任务\",\"slug\":\"任务\",\"link\":\"#任务\",\"children\":[]},{\"level\":3,\"title\":\"遇到的问题\",\"slug\":\"遇到的问题\",\"link\":\"#遇到的问题\",\"children\":[]},{\"level\":3,\"title\":\"总结\",\"slug\":\"总结\",\"link\":\"#总结\",\"children\":[]}],\"git\":{},\"readingTime\":{\"minutes\":2.75,\"words\":824},\"filePathRelative\":\"md/dev-log/day07~day08.md\",\"autoDesc\":true}")
<template><div><h3 id="任务" tabindex="-1"><a class="header-anchor" href="#任务" aria-hidden="true">#</a> 任务</h3>
<ul>
<li>[x] 分库分表组件</li>
</ul>
<h3 id="遇到的问题" tabindex="-1"><a class="header-anchor" href="#遇到的问题" aria-hidden="true">#</a> 遇到的问题</h3>
<p>问题就不说了,这一章节全是问题 T.T,基础不牢,地动山摇啊!!!</p>
<h3 id="总结" tabindex="-1"><a class="header-anchor" href="#总结" aria-hidden="true">#</a> 总结</h3>
<p>首先建立一个大局观,要实现一个分库分表组件,那么先要学会如何编写 SpringBoot Starter,然后这个 Starter 需要实现的功能是分库分表,那么一定是有多个数据源,这个数据源从项目的 yml 配置文件传进来,然后就要实现多数据源的切换,然后分表操作就是要修改 SQL 的表名,所以需要做的事情大概是如下:</p>
<ol>
<li>读取数据源信息</li>
<li>动态修改数据源</li>
<li>动态修改 SQL</li>
</ol>
<p>那么细节该如何实现呢?需要想几个问题,某条数据应该分到哪个库的哪个表呢?这个库表信息该存到哪里进行共享呢?如何动态修改数据源呢?如何动态修改 SQL 呢?那么就需要对应的技术进行支持:</p>
<ol>
<li>Spring &amp; SpringBoot 基础框架,提供依赖注入、配置管理功能</li>
<li><code v-pre>AbstractRoutingDataSource </code> 实现动态数据源的路由逻辑</li>
<li><code v-pre>AspectJ</code> 切面编程,运行时动态拦截方法调用</li>
<li>反射 API,从方法参数中提取路由键的值</li>
<li>正则表达式,解析和修改 SQL</li>
<li>ThreadLocal,存储路由信息,以支持动态数据源路由</li>
</ol>
<p>总体执行流程:</p>
<ol>
<li>调用被 <code v-pre>@DBRouter</code> 注解的方法</li>
<li>然后被切面进行拦截,拦截之后先进行路由计算,然后把计算结果保存到 ThreadLocal 中</li>
<li>然后 DynamicDataSource 通过保存到 ThreadLocal 中的数据确定使用哪一个数据源</li>
<li>然后 MyBatis 插件修改 SQL 中的表字段</li>
<li>然后数据库操作执行完成</li>
<li>切面清理 ThreadLocal 里面的数据</li>
<li>方法执行完成,返回结果</li>
</ol>
<p>虽然步骤不多,但是稍不注意就会出现小 bug,抑或扰动函数算法出错,抑或解析 yml 配置出错等等诸多问题,也是花了两三天才大致搞明白这个路由组件,因为这里面的东西大部分之前都没接触过,查阅了许多文档,毕竟之前连切面都不怎么用,最多也就是拿来做全局日志处理</p>
<p>总之,要先在大脑里面理清总体的一个执行流程,然后根据这个流程再去看代码要清晰很多,最开始的时候没理清步骤,直接看的代码,那种感觉就像第一天学 DDD 一样,直接一脸懵逼,怎么这么多包,卧槽,第一遍下来大概只学到了百分之五十吧,这一遍大概只学到了整体架构,具体的细节还没掌握,下一次努力啃啃细节,如果要我写整个这一套代码,我肯定写出来会报很多错,但是第一次就想学透整个路程怎么可能呢?好在这一次理清了整体架构,至少有了头绪,不至于开不了头,有了头绪,到处搜一搜,拼拼凑凑也能写,哈哈哈</p>
</div></template>
export const data = JSON.parse("{\"key\":\"v-c97ab98e\",\"path\":\"/md/dev-log/day09~day10.html\",\"title\":\"Day09 ~ Day10\",\"lang\":\"zh-CN\",\"frontmatter\":{\"title\":\"Day09 ~ Day10\",\"index\":false,\"icon\":\"laptop-code\",\"category\":[\"开发笔记\",\"学习记录\"],\"description\":\"任务 [x] 在应用层编排抽奖过程; 总结 有了前面的模板模式的基础,这一章节相对来说比较容易,自己实现的时候也没有什么大问题,大体流程就是写接口,编排流程,然后写实现类,然后写 Mapper,至于为什么花了两三天,这就不得不说上一章的分库分表了,没写过 SpringBoot Starter,没写过 MyBatis 插件,对 AOP 没有深刻的理解,纯...\",\"head\":[[\"meta\",{\"property\":\"og:url\",\"content\":\"https://vuepress-theme-hope-docs-demo.netlify.app/md/dev-log/day09~day10.html\"}],[\"meta\",{\"property\":\"og:site_name\",\"content\":\"我的简历\"}],[\"meta\",{\"property\":\"og:title\",\"content\":\"Day09 ~ Day10\"}],[\"meta\",{\"property\":\"og:description\",\"content\":\"任务 [x] 在应用层编排抽奖过程; 总结 有了前面的模板模式的基础,这一章节相对来说比较容易,自己实现的时候也没有什么大问题,大体流程就是写接口,编排流程,然后写实现类,然后写 Mapper,至于为什么花了两三天,这就不得不说上一章的分库分表了,没写过 SpringBoot Starter,没写过 MyBatis 插件,对 AOP 没有深刻的理解,纯...\"}],[\"meta\",{\"property\":\"og:type\",\"content\":\"article\"}],[\"meta\",{\"property\":\"og:locale\",\"content\":\"zh-CN\"}],[\"meta\",{\"property\":\"article:author\",\"content\":\"Mr.Hope\"}],[\"script\",{\"type\":\"application/ld+json\"},\"{\\\"@context\\\":\\\"https://schema.org\\\",\\\"@type\\\":\\\"Article\\\",\\\"headline\\\":\\\"Day09 ~ Day10\\\",\\\"image\\\":[\\\"\\\"],\\\"dateModified\\\":null,\\\"author\\\":[{\\\"@type\\\":\\\"Person\\\",\\\"name\\\":\\\"Mr.Hope\\\",\\\"url\\\":\\\"https://mister-hope.com\\\"}]}\"]]},\"headers\":[{\"level\":3,\"title\":\"任务\",\"slug\":\"任务\",\"link\":\"#任务\",\"children\":[]},{\"level\":3,\"title\":\"总结\",\"slug\":\"总结\",\"link\":\"#总结\",\"children\":[]}],\"git\":{},\"readingTime\":{\"minutes\":2.48,\"words\":744},\"filePathRelative\":\"md/dev-log/day09~day10.md\",\"autoDesc\":true}")
<template><div><h3 id="任务" tabindex="-1"><a class="header-anchor" href="#任务" aria-hidden="true">#</a> 任务</h3>
<ul>
<li>[x] 在应用层编排抽奖过程</li>
</ul>
<h3 id="总结" tabindex="-1"><a class="header-anchor" href="#总结" aria-hidden="true">#</a> 总结</h3>
<p>有了前面的模板模式的基础,这一章节相对来说比较容易,自己实现的时候也没有什么大问题,大体流程就是写接口,编排流程,然后写实现类,然后写 Mapper,至于为什么花了两三天,这就不得不说上一章的分库分表了,没写过 SpringBoot Starter,没写过 MyBatis 插件,对 AOP 没有深刻的理解,纯硬啃下来的,但是记不太劳,所以晚上睡不着觉,总感觉缺点什么东西,就花了两天干了如下几件事:</p>
<ol>
<li>
<p>新建一个空的 SpringBoot 项目,从 <code v-pre>SpringApplication.run()</code> 方法开始 debug,一步一步看,在这一个过程中主要学到了如下几点:</p>
<ul>
<li>一个 SpringBoot 项目是如何初始化的,在哪里创建的容器等等</li>
<li>如何加载第三方 Starter 的</li>
<li><s>在哪里打印的Banner 以及如何设置</s> 这个不是重点,哈哈哈,但是挺好玩的</li>
<li>还有 <code v-pre>ApplicationRunner</code><code v-pre>CommandLineRunner</code></li>
<li>还有异常报告器 <code v-pre>exceptionReporters</code></li>
<li>还有几个关于上下文环境的重要方法 <code v-pre>prepareContext()</code><code v-pre>refreshContext()</code><code v-pre>afterRefresh()</code></li>
</ul>
<p>明白了 SpringBoot 应用初始化流程就知道所写的分录分表路由 starter 是在哪个阶段进行数据源设置以及为什么要在 <code v-pre>AutoConfig</code> 类下进行 Bean 的注入了</p>
</li>
<li>
<p>看了看 MyBatis 插件相关的文档,大致了解了一个 MyBatis 插件如何编写,看了这个以后看 MyBatis-Plus 源码的时候可能会轻松一点</p>
</li>
<li>
<p>复习了一下 AOP,注解的属性有哪些以及该怎么写都有点忘了</p>
</li>
<li>
<p>在这个 debug 的过程中其实画了一些图,但是因为没有 OSS,所以图片不太好展示,所以使用 vuepress + github pages + github actions 搭建了一个博客,后面有空了会把看源码的过程发上去</p>
</li>
</ol>
<p>虽然很想继续往下学,但是感觉这个项目里面,分库分表这一章节应该是灵魂所在了,虽然还没学后面,但是感觉其他章节更多的是关注业务层面,主要是来解决业务问题的,但是分库分表这一章节感觉能彻彻底底搞明白的话收获应该是很大的,虽然进度慢了,但是通过对源码的阅读也学到了很多东西,比如代码规范,在阅读 SpringBoot 源码的时候,给我最大的感觉就是,其实好的东西是不需要太多注释的,因为他每一步所调用的方法都给你写的很明白,比如 SpringBoot 程序初始化过程,只要英文够好,就跟看<s>小学阅读一样</s>,不知道花的这两天值不值,毕竟还有一个月就找工作了,是不是应该快点把项目做完</p>
</div></template>
export const data = JSON.parse("{\"key\":\"v-104da61f\",\"path\":\"/md/dev-log/day11.html\",\"title\":\"Day011\",\"lang\":\"zh-CN\",\"frontmatter\":{\"title\":\"Day011\",\"index\":false,\"icon\":\"laptop-code\",\"category\":[\"开发笔记\",\"学习记录\"],\"description\":\"任务 [x] 在应用层编排抽奖过程; 总结 今天的内容比较简单,最主要的问题就是表改了,然后花了很多时间去改对应的 PO 以及 SQL,然后今天第一次开发 application 层,感觉就是把 domain 层各个领域进行组装,然后形成一个又一个的流程,在这里面会使用 MQ 把流程进行切片,之后写门面接口应该就是调 application 层里面各个...\",\"head\":[[\"meta\",{\"property\":\"og:url\",\"content\":\"https://vuepress-theme-hope-docs-demo.netlify.app/md/dev-log/day11.html\"}],[\"meta\",{\"property\":\"og:site_name\",\"content\":\"我的简历\"}],[\"meta\",{\"property\":\"og:title\",\"content\":\"Day011\"}],[\"meta\",{\"property\":\"og:description\",\"content\":\"任务 [x] 在应用层编排抽奖过程; 总结 今天的内容比较简单,最主要的问题就是表改了,然后花了很多时间去改对应的 PO 以及 SQL,然后今天第一次开发 application 层,感觉就是把 domain 层各个领域进行组装,然后形成一个又一个的流程,在这里面会使用 MQ 把流程进行切片,之后写门面接口应该就是调 application 层里面各个...\"}],[\"meta\",{\"property\":\"og:type\",\"content\":\"article\"}],[\"meta\",{\"property\":\"og:locale\",\"content\":\"zh-CN\"}],[\"meta\",{\"property\":\"article:author\",\"content\":\"Mr.Hope\"}],[\"script\",{\"type\":\"application/ld+json\"},\"{\\\"@context\\\":\\\"https://schema.org\\\",\\\"@type\\\":\\\"Article\\\",\\\"headline\\\":\\\"Day011\\\",\\\"image\\\":[\\\"\\\"],\\\"dateModified\\\":null,\\\"author\\\":[{\\\"@type\\\":\\\"Person\\\",\\\"name\\\":\\\"Mr.Hope\\\",\\\"url\\\":\\\"https://mister-hope.com\\\"}]}\"]]},\"headers\":[{\"level\":3,\"title\":\"任务\",\"slug\":\"任务\",\"link\":\"#任务\",\"children\":[]},{\"level\":3,\"title\":\"总结\",\"slug\":\"总结\",\"link\":\"#总结\",\"children\":[]}],\"git\":{},\"readingTime\":{\"minutes\":1.14,\"words\":341},\"filePathRelative\":\"md/dev-log/day11.md\",\"autoDesc\":true}")
<template><div><h3 id="任务" tabindex="-1"><a class="header-anchor" href="#任务" aria-hidden="true">#</a> 任务</h3>
<ul>
<li>[x] 在应用层编排抽奖过程</li>
</ul>
<h3 id="总结" tabindex="-1"><a class="header-anchor" href="#总结" aria-hidden="true">#</a> 总结</h3>
<p>今天的内容比较简单,最主要的问题就是表改了,然后花了很多时间去改对应的 PO 以及 SQL,然后今天第一次开发 application 层,感觉就是把 domain 层各个领域进行组装,然后形成一个又一个的流程,在这里面会使用 MQ 把流程进行切片,之后写门面接口应该就是调 application 层里面各个流程了,这样对于 Controller 层感觉挺好的,只需要简单的封装一下前端传进来的参数,然后调用 application 层执行各个流程就可以了</p>
<p>感觉今天最大的收获就在于学到了在开发的过程中要把整个流程切分一下,分成一块一块的,然后用 MQ 进行后续的操作,用户不需要感知到这一切,他只需要点进去,然后执行一个小的片段,然后剩下的操作可以使用 MQ 来慢慢操作,而不是之前那样直接单线程一个流程写完,又臭又长,返回得还慢,用户体验很不好,学到了流程切片,今天不亏,哈哈哈哈,这个东西还是很有用的</p>
</div></template>
export const data = JSON.parse("{\"key\":\"v-12027ebe\",\"path\":\"/md/dev-log/day12.html\",\"title\":\"Day012\",\"lang\":\"zh-CN\",\"frontmatter\":{\"title\":\"Day012\",\"index\":false,\"icon\":\"laptop-code\",\"category\":[\"开发笔记\",\"学习记录\"],\"description\":\"任务 [x] 规则引擎量化人群参与活动; 总结 首先先去了解了一下组合模式和决策树,然后看了看数据库,其实就是把一个类似于二叉树的结构存到了数据库里,分别对应了三个东西,一个表用来保存决策树的树根信息,然后一个表用来保存树上的所有节点的信息,然后一个表用来存决策树的连接信息,我们可以通过树根的 ID 拿到所有相关的连线信息以及所有相关的节点信息,明白了...\",\"head\":[[\"meta\",{\"property\":\"og:url\",\"content\":\"https://vuepress-theme-hope-docs-demo.netlify.app/md/dev-log/day12.html\"}],[\"meta\",{\"property\":\"og:site_name\",\"content\":\"我的简历\"}],[\"meta\",{\"property\":\"og:title\",\"content\":\"Day012\"}],[\"meta\",{\"property\":\"og:description\",\"content\":\"任务 [x] 规则引擎量化人群参与活动; 总结 首先先去了解了一下组合模式和决策树,然后看了看数据库,其实就是把一个类似于二叉树的结构存到了数据库里,分别对应了三个东西,一个表用来保存决策树的树根信息,然后一个表用来保存树上的所有节点的信息,然后一个表用来存决策树的连接信息,我们可以通过树根的 ID 拿到所有相关的连线信息以及所有相关的节点信息,明白了...\"}],[\"meta\",{\"property\":\"og:type\",\"content\":\"article\"}],[\"meta\",{\"property\":\"og:locale\",\"content\":\"zh-CN\"}],[\"meta\",{\"property\":\"article:author\",\"content\":\"Mr.Hope\"}],[\"script\",{\"type\":\"application/ld+json\"},\"{\\\"@context\\\":\\\"https://schema.org\\\",\\\"@type\\\":\\\"Article\\\",\\\"headline\\\":\\\"Day012\\\",\\\"image\\\":[\\\"\\\"],\\\"dateModified\\\":null,\\\"author\\\":[{\\\"@type\\\":\\\"Person\\\",\\\"name\\\":\\\"Mr.Hope\\\",\\\"url\\\":\\\"https://mister-hope.com\\\"}]}\"]]},\"headers\":[{\"level\":3,\"title\":\"任务\",\"slug\":\"任务\",\"link\":\"#任务\",\"children\":[]},{\"level\":2,\"title\":\"总结\",\"slug\":\"总结\",\"link\":\"#总结\",\"children\":[]}],\"git\":{},\"readingTime\":{\"minutes\":2.62,\"words\":786},\"filePathRelative\":\"md/dev-log/day12.md\",\"autoDesc\":true}")
<template><div><h3 id="任务" tabindex="-1"><a class="header-anchor" href="#任务" aria-hidden="true">#</a> 任务</h3>
<ul>
<li>[x] 规则引擎量化人群参与活动</li>
</ul>
<h2 id="总结" tabindex="-1"><a class="header-anchor" href="#总结" aria-hidden="true">#</a> 总结</h2>
<p>首先先去了解了一下组合模式和决策树,然后看了看数据库,其实就是把一个类似于二叉树的结构存到了数据库里,分别对应了三个东西,一个表用来保存决策树的树根信息,然后一个表用来保存树上的所有节点的信息,然后一个表用来存决策树的连接信息,我们可以通过树根的 ID 拿到所有相关的连线信息以及所有相关的节点信息,明白了数据库相关的东西之后屡屡代码结构</p>
<p>什么是组合模式呢?先看看维基百科对组合模式的定义,然后直接看代码,给我的第一感觉就是把每一个 if-else 的条件抽取出来,然后变成一个又一个的 filter,然后在规则引擎中进行使用,首先把一个个 filter 包装到 map 中,供子类使用</p>
<p>其中最重要的代码我觉得是这个:</p>
<div class="language-java line-numbers-mode" data-ext="java"><pre v-pre class="language-java"><code> <span class="token keyword">protected</span> <span class="token class-name">TreeNodeVO</span> <span class="token function">engineDecisionMaker</span><span class="token punctuation">(</span><span class="token class-name">TreeRuleRich</span> treeRuleRich<span class="token punctuation">,</span> <span class="token class-name">DecisionMatterReq</span> matterReq<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token class-name">TreeRootVO</span> treeRoot <span class="token operator">=</span> treeRuleRich<span class="token punctuation">.</span><span class="token function">getTreeRoot</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">Map</span><span class="token generics"><span class="token punctuation">&lt;</span><span class="token class-name">Long</span><span class="token punctuation">,</span> <span class="token class-name">TreeNodeVO</span><span class="token punctuation">></span></span> treeNodeMap <span class="token operator">=</span> treeRuleRich<span class="token punctuation">.</span><span class="token function">getTreeNodeMap</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">Long</span> rootNodeId <span class="token operator">=</span> treeRoot<span class="token punctuation">.</span><span class="token function">getTreeRootNodeId</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">TreeNodeVO</span> treeNodeInfo <span class="token operator">=</span> treeNodeMap<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>rootNodeId<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token class-name">Constants<span class="token punctuation">.</span>NodeType</span><span class="token punctuation">.</span><span class="token constant">STEM</span><span class="token punctuation">.</span><span class="token function">equals</span><span class="token punctuation">(</span>treeNodeInfo<span class="token punctuation">.</span><span class="token function">getNodeType</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token class-name">String</span> ruleKey <span class="token operator">=</span> treeNodeInfo<span class="token punctuation">.</span><span class="token function">getRuleKey</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">LogicFilter</span> logicFilter <span class="token operator">=</span> logicFilterMap<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>ruleKey<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">String</span> matterValue <span class="token operator">=</span> logicFilter<span class="token punctuation">.</span><span class="token function">matterValue</span><span class="token punctuation">(</span>matterReq<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">Long</span> nextNode <span class="token operator">=</span> logicFilter<span class="token punctuation">.</span><span class="token function">filter</span><span class="token punctuation">(</span>matterValue<span class="token punctuation">,</span> treeNodeInfo<span class="token punctuation">.</span><span class="token function">getTreeNodeLineInfoList</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
treeNodeInfo <span class="token operator">=</span> treeNodeMap<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>nextNode<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">return</span> treeNodeInfo<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><ol>
<li>获取树根节点信息</li>
<li>获取树根所对应的所有节点信息</li>
<li>判断每个节点是不是叶子节点
<ol>
<li>如果不是,就执行决策,如果通过就返回下一个节点</li>
<li>如果是叶子节点,也就是找到了对应的活动号,表示可以参与</li>
</ol>
</li>
</ol>
<p>那么就可以将代码结构分为两个部分,一个是决策者,提供决策相关逻辑,一个是执行者,对决策链条进行链路执行,然后返回最终结果,那么到这里应该代码逻辑就清晰了,决策者根据一定的比较规则,返回 ture 或者 false,执行者根据这个结果来判断是否要继续进行下一个判断,直到判断到叶子节点</p>
<p>了解了这个之后代码就好写了</p>
<p>感觉这个章节最大的难点就在于如果之前没有设计模式基础的话,会很难受,代码跳过去跳过来有时候找不到方向,一般我遇到这种情况的时候我就会梳理一下业务逻辑,代码结构无论怎么变,也一定是根据业务逻辑来的,之前做的事情一样不少,所以就按照自己想的逻辑去代码中找对应,去看看哪里做的比较,哪里拿到的链路结构,这样就将大问题化成了小问题,然后去对应代码中的每一个部分,这里也就是将逻辑执行步骤进行“打散”的过程,找到了每段代码对应那一段逻辑之后,看一看代码的继承体系,大概也就了解个七七八八了</p>
</div></template>
export const data = JSON.parse("{\"key\":\"v-7c27fd02\",\"path\":\"/md/dev-log/\",\"title\":\"开发日志\",\"lang\":\"zh-CN\",\"frontmatter\":{\"title\":\"开发日志\",\"index\":false,\"icon\":\"laptop-code\",\"category\":[\"自我介绍\",\"专业技能\",\"项目经验\"],\"description\":\"day01.md (day01.md);\",\"head\":[[\"meta\",{\"property\":\"og:url\",\"content\":\"https://vuepress-theme-hope-docs-demo.netlify.app/md/dev-log/\"}],[\"meta\",{\"property\":\"og:site_name\",\"content\":\"我的简历\"}],[\"meta\",{\"property\":\"og:title\",\"content\":\"开发日志\"}],[\"meta\",{\"property\":\"og:description\",\"content\":\"day01.md (day01.md);\"}],[\"meta\",{\"property\":\"og:type\",\"content\":\"article\"}],[\"meta\",{\"property\":\"og:locale\",\"content\":\"zh-CN\"}],[\"meta\",{\"property\":\"article:author\",\"content\":\"Mr.Hope\"}],[\"script\",{\"type\":\"application/ld+json\"},\"{\\\"@context\\\":\\\"https://schema.org\\\",\\\"@type\\\":\\\"Article\\\",\\\"headline\\\":\\\"开发日志\\\",\\\"image\\\":[\\\"\\\"],\\\"dateModified\\\":null,\\\"author\\\":[{\\\"@type\\\":\\\"Person\\\",\\\"name\\\":\\\"Mr.Hope\\\",\\\"url\\\":\\\"https://mister-hope.com\\\"}]}\"]]},\"headers\":[],\"git\":{},\"readingTime\":{\"minutes\":0.08,\"words\":25},\"filePathRelative\":\"md/dev-log/README.md\",\"autoDesc\":true}")
<template><div><ul>
<li><RouterLink to="/md/dev-log/day01.html">day01.md</RouterLink></li>
</ul>
</div></template>
export const data = JSON.parse("{\"key\":\"v-3c550760\",\"path\":\"/md/disable.html\",\"title\":\"布局与功能禁用\",\"lang\":\"zh-CN\",\"frontmatter\":{\"title\":\"布局与功能禁用\",\"icon\":\"gears\",\"order\":3,\"category\":[\"使用指南\"],\"tag\":[\"禁用\"],\"navbar\":false,\"sidebar\":false,\"breadcrumb\":false,\"pageInfo\":false,\"contributors\":false,\"editLink\":false,\"lastUpdated\":false,\"prev\":false,\"next\":false,\"comment\":false,\"footer\":false,\"backtotop\":false,\"description\":\"你可以通过设置页面的 Frontmatter,在页面禁用功能与布局。 本页面就是一个示例,禁用了如下功能: 导航栏; 侧边栏; 路径导航; 页面信息; 贡献者; 编辑此页链接; 更新时间; 上一篇/下一篇 链接; 评论; 页脚; 返回顶部按钮;\",\"head\":[[\"meta\",{\"property\":\"og:url\",\"content\":\"https://vuepress-theme-hope-docs-demo.netlify.app/md/disable.html\"}],[\"meta\",{\"property\":\"og:site_name\",\"content\":\"我的简历\"}],[\"meta\",{\"property\":\"og:title\",\"content\":\"布局与功能禁用\"}],[\"meta\",{\"property\":\"og:description\",\"content\":\"你可以通过设置页面的 Frontmatter,在页面禁用功能与布局。 本页面就是一个示例,禁用了如下功能: 导航栏; 侧边栏; 路径导航; 页面信息; 贡献者; 编辑此页链接; 更新时间; 上一篇/下一篇 链接; 评论; 页脚; 返回顶部按钮;\"}],[\"meta\",{\"property\":\"og:type\",\"content\":\"article\"}],[\"meta\",{\"property\":\"og:locale\",\"content\":\"zh-CN\"}],[\"meta\",{\"property\":\"article:author\",\"content\":\"Mr.Hope\"}],[\"meta\",{\"property\":\"article:tag\",\"content\":\"禁用\"}],[\"script\",{\"type\":\"application/ld+json\"},\"{\\\"@context\\\":\\\"https://schema.org\\\",\\\"@type\\\":\\\"Article\\\",\\\"headline\\\":\\\"布局与功能禁用\\\",\\\"image\\\":[\\\"\\\"],\\\"dateModified\\\":null,\\\"author\\\":[{\\\"@type\\\":\\\"Person\\\",\\\"name\\\":\\\"Mr.Hope\\\",\\\"url\\\":\\\"https://mister-hope.com\\\"}]}\"]]},\"headers\":[],\"readingTime\":{\"minutes\":0.43,\"words\":128},\"filePathRelative\":\"md/disable.md\",\"autoDesc\":true}")
if (import.meta.webpackHot) {
import.meta.webpackHot.accept()
if (__VUE_HMR_RUNTIME__.updatePageData) {
__VUE_HMR_RUNTIME__.updatePageData(data)
}
}
if (import.meta.hot) {
import.meta.hot.accept(({ data }) => {
__VUE_HMR_RUNTIME__.updatePageData(data)
})
}
<template><div><p>你可以通过设置页面的 Frontmatter,在页面禁用功能与布局。</p>
<!-- more -->
<p>本页面就是一个示例,禁用了如下功能:</p>
<ul>
<li>导航栏</li>
<li>侧边栏</li>
<li>路径导航</li>
<li>页面信息</li>
<li>贡献者</li>
<li>编辑此页链接</li>
<li>更新时间</li>
<li>上一篇/下一篇 链接</li>
<li>评论</li>
<li>页脚</li>
<li>返回顶部按钮</li>
</ul>
</div></template>
export const data = JSON.parse("{\"key\":\"v-af40da1a\",\"path\":\"/md/encrypt.html\",\"title\":\"密码加密的文章\",\"lang\":\"zh-CN\",\"frontmatter\":{\"icon\":\"lock\",\"category\":[\"使用指南\"],\"tag\":[\"文章加密\"],\"description\":\"实际的文章内容。 段落 1 文字段落 1 文字段落 1 文字段落 1 文字段落 1 文字段落 1 文字段落 1 文字段落 1 文字段落 1 文字段落 1 文字段落 1 文字段落 1 文字。 段落 2 文字段落 2 文字段落 2 文字段落 2 文字段落 2 文字段落 2 文字段落 2 文字段落 2 文字段落 2 文字段落 2 文字段落 2 文字段落 2 ...\",\"head\":[[\"meta\",{\"property\":\"og:url\",\"content\":\"https://vuepress-theme-hope-docs-demo.netlify.app/md/encrypt.html\"}],[\"meta\",{\"property\":\"og:site_name\",\"content\":\"我的简历\"}],[\"meta\",{\"property\":\"og:title\",\"content\":\"密码加密的文章\"}],[\"meta\",{\"property\":\"og:description\",\"content\":\"实际的文章内容。 段落 1 文字段落 1 文字段落 1 文字段落 1 文字段落 1 文字段落 1 文字段落 1 文字段落 1 文字段落 1 文字段落 1 文字段落 1 文字段落 1 文字。 段落 2 文字段落 2 文字段落 2 文字段落 2 文字段落 2 文字段落 2 文字段落 2 文字段落 2 文字段落 2 文字段落 2 文字段落 2 文字段落 2 ...\"}],[\"meta\",{\"property\":\"og:type\",\"content\":\"article\"}],[\"meta\",{\"property\":\"og:locale\",\"content\":\"zh-CN\"}],[\"meta\",{\"property\":\"article:author\",\"content\":\"Mr.Hope\"}],[\"meta\",{\"property\":\"article:tag\",\"content\":\"文章加密\"}],[\"script\",{\"type\":\"application/ld+json\"},\"{\\\"@context\\\":\\\"https://schema.org\\\",\\\"@type\\\":\\\"Article\\\",\\\"headline\\\":\\\"密码加密的文章\\\",\\\"image\\\":[\\\"\\\"],\\\"dateModified\\\":null,\\\"author\\\":[{\\\"@type\\\":\\\"Person\\\",\\\"name\\\":\\\"Mr.Hope\\\",\\\"url\\\":\\\"https://mister-hope.com\\\"}]}\"]]},\"headers\":[],\"readingTime\":{\"minutes\":0.52,\"words\":156},\"filePathRelative\":\"md/encrypt.md\",\"autoDesc\":true}")
if (import.meta.webpackHot) {
import.meta.webpackHot.accept()
if (__VUE_HMR_RUNTIME__.updatePageData) {
__VUE_HMR_RUNTIME__.updatePageData(data)
}
}
if (import.meta.hot) {
import.meta.hot.accept(({ data }) => {
__VUE_HMR_RUNTIME__.updatePageData(data)
})
}
<template><div><h1 id="密码加密的文章" tabindex="-1"><a class="header-anchor" href="#密码加密的文章" aria-hidden="true">#</a> 密码加密的文章</h1>
<p>实际的文章内容。</p>
<p>段落 1 文字段落 1 文字段落 1 文字段落 1 文字段落 1 文字段落 1 文字段落 1 文字段落 1 文字段落 1 文字段落 1 文字段落 1 文字段落 1 文字。</p>
<p>段落 2 文字段落 2 文字段落 2 文字段落 2 文字段落 2 文字段落 2 文字段落 2 文字段落 2 文字段落 2 文字段落 2 文字段落 2 文字段落 2 文字段落 2 文字段落 2 文字。</p>
</div></template>
export const data = JSON.parse("{\"key\":\"v-2d0aa3df\",\"path\":\"/md/\",\"title\":\"Md\",\"lang\":\"zh-CN\",\"frontmatter\":{\"title\":\"Md\",\"article\":false,\"feed\":false,\"sitemap\":false,\"description\":\"\",\"head\":[[\"meta\",{\"property\":\"og:url\",\"content\":\"https://vuepress-theme-hope-docs-demo.netlify.app/md/\"}],[\"meta\",{\"property\":\"og:site_name\",\"content\":\"我的简历\"}],[\"meta\",{\"property\":\"og:title\",\"content\":\"Md\"}],[\"meta\",{\"property\":\"og:type\",\"content\":\"website\"}],[\"meta\",{\"property\":\"og:locale\",\"content\":\"zh-CN\"}],[\"meta\",{\"property\":\"article:author\",\"content\":\"Mr.Hope\"}],[\"script\",{\"type\":\"application/ld+json\"},\"{\\\"@context\\\":\\\"https://schema.org\\\",\\\"@type\\\":\\\"WebPage\\\",\\\"name\\\":\\\"Md\\\"}\"]]},\"headers\":[],\"git\":{},\"readingTime\":{\"minutes\":0,\"words\":1},\"filePathRelative\":null,\"autoDesc\":true}")
<template><div><AutoCatalog/></div></template>
export const data = JSON.parse("{\"key\":\"v-1384406a\",\"path\":\"/md/markdown.html\",\"title\":\"Markdown 展示\",\"lang\":\"zh-CN\",\"frontmatter\":{\"title\":\"Markdown 展示\",\"icon\":\"fab fa-markdown\",\"order\":2,\"category\":[\"使用指南\"],\"tag\":[\"Markdown\"],\"description\":\"VuePress 主要从 Markdown 文件生成页面。因此,你可以使用它轻松生成文档或博客站点。 你应该创建和编写 Markdown 文件,以便 VuePress 可以根据文件结构将它们转换为不同的页面。 Markdown 介绍 如果你是一个新手,还不会编写 Markdown,请先阅读 Markdown 介绍 (https://theme-hope...\"},\"headers\":[{\"level\":2,\"title\":\"Markdown 介绍\",\"slug\":\"markdown-介绍\",\"link\":\"#markdown-介绍\",\"children\":[]},{\"level\":2,\"title\":\"Markdown 配置\",\"slug\":\"markdown-配置\",\"link\":\"#markdown-配置\",\"children\":[]},{\"level\":2,\"title\":\"Markdown 扩展\",\"slug\":\"markdown-扩展\",\"link\":\"#markdown-扩展\",\"children\":[{\"level\":3,\"title\":\"VuePress 扩展\",\"slug\":\"vuepress-扩展\",\"link\":\"#vuepress-扩展\",\"children\":[]},{\"level\":3,\"title\":\"主题扩展\",\"slug\":\"主题扩展\",\"link\":\"#主题扩展\",\"children\":[]},{\"level\":3,\"title\":\"图片增强\",\"slug\":\"图片增强\",\"link\":\"#图片增强\",\"children\":[]}]},{\"level\":2,\"title\":\"个人信息\",\"slug\":\"个人信息\",\"link\":\"#个人信息\",\"children\":[]}],\"readingTime\":{\"minutes\":3.43,\"words\":1030},\"filePathRelative\":\"md/markdown.md\",\"autoDesc\":true}")
if (import.meta.webpackHot) {
import.meta.webpackHot.accept()
if (__VUE_HMR_RUNTIME__.updatePageData) {
__VUE_HMR_RUNTIME__.updatePageData(data)
}
}
if (import.meta.hot) {
import.meta.hot.accept(({ data }) => {
__VUE_HMR_RUNTIME__.updatePageData(data)
})
}
<template><div><p>VuePress 主要从 Markdown 文件生成页面。因此,你可以使用它轻松生成文档或博客站点。</p>
<p>你应该创建和编写 Markdown 文件,以便 VuePress 可以根据文件结构将它们转换为不同的页面。</p>
<!-- more -->
<h2 id="markdown-介绍" tabindex="-1"><a class="header-anchor" href="#markdown-介绍" aria-hidden="true">#</a> Markdown 介绍</h2>
<p>如果你是一个新手,还不会编写 Markdown,请先阅读 <a href="https://theme-hope.vuejs.press/zh/cookbook/markdown/" target="_blank" rel="noopener noreferrer">Markdown 介绍<ExternalLinkIcon/></a><a href="https://theme-hope.vuejs.press/zh/cookbook/markdown/demo.html" target="_blank" rel="noopener noreferrer">Markdown 演示<ExternalLinkIcon/></a></p>
<h2 id="markdown-配置" tabindex="-1"><a class="header-anchor" href="#markdown-配置" aria-hidden="true">#</a> Markdown 配置</h2>
<p>VuePress 通过 Frontmatter 为每个 Markdown 页面引入配置。</p>
<div class="hint-container info">
<p class="hint-container-title">相关信息</p>
<p>Frontmatter 是 VuePress 中很重要的一个概念,如果你不了解它,你需要阅读 <a href="https://theme-hope.vuejs.press/zh/cookbook/vuepress/page.html#front-matter" target="_blank" rel="noopener noreferrer">Frontmatter 介绍<ExternalLinkIcon/></a></p>
</div>
<h2 id="markdown-扩展" tabindex="-1"><a class="header-anchor" href="#markdown-扩展" aria-hidden="true">#</a> Markdown 扩展</h2>
<p>VuePress 会使用 <a href="https://github.com/markdown-it/markdown-it" target="_blank" rel="noopener noreferrer">markdown-it<ExternalLinkIcon/></a> 来解析 Markdown 内容,因此可以借助于 markdown-it 插件来实现 <a href="https://github.com/markdown-it/markdown-it#syntax-extensions" target="_blank" rel="noopener noreferrer">语法扩展<ExternalLinkIcon/></a></p>
<h3 id="vuepress-扩展" tabindex="-1"><a class="header-anchor" href="#vuepress-扩展" aria-hidden="true">#</a> VuePress 扩展</h3>
<p>为了丰富文档写作,VuePress 对 Markdown 语法进行了扩展。</p>
<p>关于这些扩展,请阅读 <a href="https://theme-hope.vuejs.press/zh/cookbook/vuepress/markdown.html" target="_blank" rel="noopener noreferrer">VuePress 中的 Markdown 扩展<ExternalLinkIcon/></a></p>
<h3 id="主题扩展" tabindex="-1"><a class="header-anchor" href="#主题扩展" aria-hidden="true">#</a> 主题扩展</h3>
<p>通过 <a href="https://plugin-md-enhance.vuejs.press/zh/" target="_blank" rel="noopener noreferrer"><code v-pre>vuepress-plugin-md-enhance</code><ExternalLinkIcon/></a>,主题扩展了更多 Markdown 语法,提供更加丰富的写作功能。</p>
<h4 id="自定义容器" tabindex="-1"><a class="header-anchor" href="#自定义容器" aria-hidden="true">#</a> 自定义容器</h4>
<div v-pre>
<p>安全的在 Markdown 中使用 {{ variable }}</p>
</div>
<div class="hint-container info">
<p class="hint-container-title">自定义标题</p>
<p>信息容器,包含 <code v-pre>代码</code><a href="#%E8%87%AA%E5%AE%9A%E4%B9%89%E5%AE%B9%E5%99%A8">链接</a></p>
<div class="language-javascript line-numbers-mode" data-ext="js"><pre v-pre class="language-javascript"><code><span class="token keyword">const</span> a <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div></div>
<div class="hint-container tip">
<p class="hint-container-title">自定义标题</p>
<p>提示容器</p>
</div>
<div class="hint-container warning">
<p class="hint-container-title">自定义标题</p>
<p>警告容器</p>
</div>
<div class="hint-container danger">
<p class="hint-container-title">自定义标题</p>
<p>危险容器</p>
</div>
<details class="hint-container details"><summary>自定义标题</summary>
<p>详情容器</p>
</details>
<ul>
<li><a href="https://theme-hope.vuejs.press/zh/guide/markdown/container.html" target="_blank" rel="noopener noreferrer">查看详情<ExternalLinkIcon/></a></li>
</ul>
<h4 id="代码块" tabindex="-1"><a class="header-anchor" href="#代码块" aria-hidden="true">#</a> 代码块</h4>
<CodeTabs id="89" :data='[{"id":"pnpm"},{"id":"yarn"},{"id":"npm"}]' :active="2">
<template #title0="{ value, isActive }">pnpm</template>
<template #title1="{ value, isActive }">yarn</template>
<template #title2="{ value, isActive }">npm</template>
<template #tab0="{ value, isActive }">
<div class="language-bash line-numbers-mode" data-ext="sh"><pre v-pre class="language-bash"><code><span class="token function">pnpm</span> <span class="token function">add</span> <span class="token parameter variable">-D</span> vuepress-theme-hope
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div></template>
<template #tab1="{ value, isActive }">
<div class="language-bash line-numbers-mode" data-ext="sh"><pre v-pre class="language-bash"><code><span class="token function">yarn</span> <span class="token function">add</span> <span class="token parameter variable">-D</span> vuepress-theme-hope
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div></template>
<template #tab2="{ value, isActive }">
<div class="language-bash line-numbers-mode" data-ext="sh"><pre v-pre class="language-bash"><code><span class="token function">npm</span> i <span class="token parameter variable">-D</span> vuepress-theme-hope
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div></template>
</CodeTabs>
<ul>
<li><a href="https://theme-hope.vuejs.press/zh/guide/markdown/code-tabs.html" target="_blank" rel="noopener noreferrer">查看详情<ExternalLinkIcon/></a></li>
</ul>
<h4 id="上下角标" tabindex="-1"><a class="header-anchor" href="#上下角标" aria-hidden="true">#</a> 上下角标</h4>
<p>19<sup>th</sup> H<sub>2</sub>O</p>
<ul>
<li><a href="https://theme-hope.vuejs.press/zh/guide/markdown/sup-sub.html" target="_blank" rel="noopener noreferrer">查看详情<ExternalLinkIcon/></a></li>
</ul>
<h4 id="自定义对齐" tabindex="-1"><a class="header-anchor" href="#自定义对齐" aria-hidden="true">#</a> 自定义对齐</h4>
<div style="text-align:center">
<p>我是居中的</p>
</div>
<div style="text-align:right">
<p>我在右对齐</p>
</div>
<ul>
<li><a href="https://theme-hope.vuejs.press/zh/guide/markdown/align.html" target="_blank" rel="noopener noreferrer">查看详情<ExternalLinkIcon/></a></li>
</ul>
<h4 id="attrs" tabindex="-1"><a class="header-anchor" href="#attrs" aria-hidden="true">#</a> Attrs</h4>
<p>一个拥有 ID 的 <strong id="word">单词</strong></p>
<ul>
<li><a href="https://theme-hope.vuejs.press/zh/guide/markdown/attrs.html" target="_blank" rel="noopener noreferrer">查看详情<ExternalLinkIcon/></a></li>
</ul>
<h4 id="脚注" tabindex="-1"><a class="header-anchor" href="#脚注" aria-hidden="true">#</a> 脚注</h4>
<p>此文字有脚注<a href="%E8%BF%99%E6%98%AF%E8%84%9A%E6%B3%A8%E5%86%85%E5%AE%B9">^first</a>.</p>
<ul>
<li><a href="https://theme-hope.vuejs.press/zh/guide/markdown/footnote.html" target="_blank" rel="noopener noreferrer">查看详情<ExternalLinkIcon/></a></li>
</ul>
<h4 id="标记" tabindex="-1"><a class="header-anchor" href="#标记" aria-hidden="true">#</a> 标记</h4>
<p>你可以标记 <mark>重要的内容</mark></p>
<ul>
<li><a href="https://theme-hope.vuejs.press/zh/guide/markdown/mark.html" target="_blank" rel="noopener noreferrer">查看详情<ExternalLinkIcon/></a></li>
</ul>
<h4 id="任务列表" tabindex="-1"><a class="header-anchor" href="#任务列表" aria-hidden="true">#</a> 任务列表</h4>
<ul>
<li>
<p>[x] 计划 1</p>
</li>
<li>
<p>[ ] 计划 2</p>
</li>
<li>
<p><a href="https://theme-hope.vuejs.press/zh/guide/markdown/tasklist.html" target="_blank" rel="noopener noreferrer">查看详情<ExternalLinkIcon/></a></p>
</li>
</ul>
<h3 id="图片增强" tabindex="-1"><a class="header-anchor" href="#图片增强" aria-hidden="true">#</a> 图片增强</h3>
<p>支持为图片设置颜色模式和大小</p>
<ul>
<li><a href="https://theme-hope.vuejs.press/zh/guide/markdown/image.html" target="_blank" rel="noopener noreferrer">查看详情<ExternalLinkIcon/></a></li>
</ul>
<h4 id="卡片" tabindex="-1"><a class="header-anchor" href="#卡片" aria-hidden="true">#</a> 卡片</h4>
<VPCard v-bind='{"title":"Mr.Hope","desc":"Where there is light, there is hope","logo":"https://mister-hope.com/logo.svg","link":"https://mister-hope.com","color":"rgba(253, 230, 138, 0.15)"}' /><ul>
<li><a href="https://theme-hope.vuejs.press/zh/guide/markdown/card.html" target="_blank" rel="noopener noreferrer">查看详情<ExternalLinkIcon/></a></li>
</ul>
<h4 id="导入文件" tabindex="-1"><a class="header-anchor" href="#导入文件" aria-hidden="true">#</a> 导入文件</h4>
<h2 id="个人信息" tabindex="-1"><a class="header-anchor" href="#个人信息" aria-hidden="true">#</a> 个人信息</h2>
<ul>
<li>姓名</li>
<li>电话</li>
<li>邮箱</li>
<li>毕业时间</li>
<li>工作时间</li>
</ul>
<ul>
<li><a href="https://theme-hope.vuejs.press/zh/guide/markdown/include.html" target="_blank" rel="noopener noreferrer">查看详情<ExternalLinkIcon/></a></li>
</ul>
<h4 id="代码演示" tabindex="-1"><a class="header-anchor" href="#代码演示" aria-hidden="true">#</a> 代码演示</h4>
<CodeDemo id="code-demo-268" type="normal" title="%E4%B8%80%E4%B8%AA%E6%99%AE%E9%80%9A%20Demo" code="eJwljrGKAjEQhl9lbq5REJdrvZju4IorDhSrNEsysKvZZE2ygoiPopXgK4j4Olv4Fk7cZor5v3++OWCVGoszFNWXXHX0HyhGWFbUEPz6lkTBe+VEK0VsSwe1mSvcUdgrlM/Tub/dRJED2T/u/eX6IYqWcZzgOvJR43XXkEvTbceVBVnSyYeRws/hxHhaGvOzY+Kvjokc5UzbWm8UTmA0hrmEg3IApaWQOBuUg4vr38od82Cfjln4/vHd0N76MINAJkOMHF8ck1dC">
<div class="language-html line-numbers-mode" data-ext="html"><pre v-pre class="language-html"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>h1</span><span class="token punctuation">></span></span>VuePress Theme Hope<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>h1</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>p</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>span</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>very<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>非常<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>span</span><span class="token punctuation">></span></span>强大!<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>p</span><span class="token punctuation">></span></span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div></div></div><div class="language-javascript line-numbers-mode" data-ext="js"><pre v-pre class="language-javascript"><code>document<span class="token punctuation">.</span><span class="token function">querySelector</span><span class="token punctuation">(</span><span class="token string">"#very"</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">addEventListener</span><span class="token punctuation">(</span><span class="token string">"click"</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
<span class="token function">alert</span><span class="token punctuation">(</span><span class="token string">"非常强大"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><div class="language-css line-numbers-mode" data-ext="css"><pre v-pre class="language-css"><code><span class="token selector">span</span> <span class="token punctuation">{</span>
<span class="token property">color</span><span class="token punctuation">:</span> red<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></CodeDemo><ul>
<li><a href="https://theme-hope.vuejs.press/zh/guide/markdown/demo.html" target="_blank" rel="noopener noreferrer">查看详情<ExternalLinkIcon/></a></li>
</ul>
<h4 id="样式化" tabindex="-1"><a class="header-anchor" href="#样式化" aria-hidden="true">#</a> 样式化</h4>
<p>向 Mr.Hope 捐赠一杯咖啡。 <Badge type="tip">Recommended</Badge></p>
<ul>
<li><a href="https://theme-hope.vuejs.press/zh/guide/markdown/stylize.html" target="_blank" rel="noopener noreferrer">查看详情<ExternalLinkIcon/></a></li>
</ul>
<h4 id="交互演示" tabindex="-1"><a class="header-anchor" href="#交互演示" aria-hidden="true">#</a> 交互演示</h4>
<Playground key="d6d07c16" title="TS%20%E6%A1%88%E4%BE%8B" link="https%3A%2F%2Fwww.typescriptlang.org%2Fplay%23code%2FMYewdgzgLgBAthA5jAvDARACwKYBtcgwDuIATrgCboDcAULaJLBAA7YCGA1qjABQKIAXDGikAlmEQBKVAD4YjCCFzYAdAUT8kUurVYdOW6XSA">
</Playground>
<ul>
<li><a href="https://theme-hope.vuejs.press/zh/guide/markdown/playground.html" target="_blank" rel="noopener noreferrer">查看详情<ExternalLinkIcon/></a></li>
</ul>
<h4 id="图表" tabindex="-1"><a class="header-anchor" href="#图表" aria-hidden="true">#</a> 图表</h4>
<p>::: chart 一个散点图案例</p>
<div class="language-json line-numbers-mode" data-ext="json"><pre v-pre class="language-json"><code><span class="token punctuation">{</span>
<span class="token property">"type"</span><span class="token operator">:</span> <span class="token string">"scatter"</span><span class="token punctuation">,</span>
<span class="token property">"data"</span><span class="token operator">:</span> <span class="token punctuation">{</span>
<span class="token property">"datasets"</span><span class="token operator">:</span> <span class="token punctuation">[</span>
<span class="token punctuation">{</span>
<span class="token property">"label"</span><span class="token operator">:</span> <span class="token string">"散点数据集"</span><span class="token punctuation">,</span>
<span class="token property">"data"</span><span class="token operator">:</span> <span class="token punctuation">[</span>
<span class="token punctuation">{</span> <span class="token property">"x"</span><span class="token operator">:</span> <span class="token number">-10</span><span class="token punctuation">,</span> <span class="token property">"y"</span><span class="token operator">:</span> <span class="token number">0</span> <span class="token punctuation">}</span><span class="token punctuation">,</span>
<span class="token punctuation">{</span> <span class="token property">"x"</span><span class="token operator">:</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token property">"y"</span><span class="token operator">:</span> <span class="token number">10</span> <span class="token punctuation">}</span><span class="token punctuation">,</span>
<span class="token punctuation">{</span> <span class="token property">"x"</span><span class="token operator">:</span> <span class="token number">10</span><span class="token punctuation">,</span> <span class="token property">"y"</span><span class="token operator">:</span> <span class="token number">5</span> <span class="token punctuation">}</span><span class="token punctuation">,</span>
<span class="token punctuation">{</span> <span class="token property">"x"</span><span class="token operator">:</span> <span class="token number">0.5</span><span class="token punctuation">,</span> <span class="token property">"y"</span><span class="token operator">:</span> <span class="token number">5.5</span> <span class="token punctuation">}</span>
<span class="token punctuation">]</span><span class="token punctuation">,</span>
<span class="token property">"backgroundColor"</span><span class="token operator">:</span> <span class="token string">"rgb(255, 99, 132)"</span>
<span class="token punctuation">}</span>
<span class="token punctuation">]</span>
<span class="token punctuation">}</span><span class="token punctuation">,</span>
<span class="token property">"options"</span><span class="token operator">:</span> <span class="token punctuation">{</span>
<span class="token property">"scales"</span><span class="token operator">:</span> <span class="token punctuation">{</span>
<span class="token property">"x"</span><span class="token operator">:</span> <span class="token punctuation">{</span>
<span class="token property">"type"</span><span class="token operator">:</span> <span class="token string">"linear"</span><span class="token punctuation">,</span>
<span class="token property">"position"</span><span class="token operator">:</span> <span class="token string">"bottom"</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>:::</p>
<ul>
<li><a href="https://theme-hope.vuejs.press/zh/guide/markdown/chart.html" target="_blank" rel="noopener noreferrer">查看详情<ExternalLinkIcon/></a></li>
</ul>
<h4 id="echarts" tabindex="-1"><a class="header-anchor" href="#echarts" aria-hidden="true">#</a> Echarts</h4>
<p>::: echarts 一个折线图案例</p>
<div class="language-json line-numbers-mode" data-ext="json"><pre v-pre class="language-json"><code><span class="token punctuation">{</span>
<span class="token property">"xAxis"</span><span class="token operator">:</span> <span class="token punctuation">{</span>
<span class="token property">"type"</span><span class="token operator">:</span> <span class="token string">"category"</span><span class="token punctuation">,</span>
<span class="token property">"data"</span><span class="token operator">:</span> <span class="token punctuation">[</span><span class="token string">"Mon"</span><span class="token punctuation">,</span> <span class="token string">"Tue"</span><span class="token punctuation">,</span> <span class="token string">"Wed"</span><span class="token punctuation">,</span> <span class="token string">"Thu"</span><span class="token punctuation">,</span> <span class="token string">"Fri"</span><span class="token punctuation">,</span> <span class="token string">"Sat"</span><span class="token punctuation">,</span> <span class="token string">"Sun"</span><span class="token punctuation">]</span>
<span class="token punctuation">}</span><span class="token punctuation">,</span>
<span class="token property">"yAxis"</span><span class="token operator">:</span> <span class="token punctuation">{</span>
<span class="token property">"type"</span><span class="token operator">:</span> <span class="token string">"value"</span>
<span class="token punctuation">}</span><span class="token punctuation">,</span>
<span class="token property">"series"</span><span class="token operator">:</span> <span class="token punctuation">[</span>
<span class="token punctuation">{</span>
<span class="token property">"data"</span><span class="token operator">:</span> <span class="token punctuation">[</span><span class="token number">150</span><span class="token punctuation">,</span> <span class="token number">230</span><span class="token punctuation">,</span> <span class="token number">224</span><span class="token punctuation">,</span> <span class="token number">218</span><span class="token punctuation">,</span> <span class="token number">135</span><span class="token punctuation">,</span> <span class="token number">147</span><span class="token punctuation">,</span> <span class="token number">260</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
<span class="token property">"type"</span><span class="token operator">:</span> <span class="token string">"line"</span>
<span class="token punctuation">}</span>
<span class="token punctuation">]</span>
<span class="token punctuation">}</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>:::</p>
<ul>
<li><a href="https://theme-hope.vuejs.press/zh/guide/markdown/echarts.html" target="_blank" rel="noopener noreferrer">查看详情<ExternalLinkIcon/></a></li>
</ul>
<h4 id="流程图" tabindex="-1"><a class="header-anchor" href="#流程图" aria-hidden="true">#</a> 流程图</h4>
<div class="language-flow line-numbers-mode" data-ext="flow"><pre v-pre class="language-flow"><code>cond<span class="token operator">=></span>condition<span class="token operator">:</span> 是否执行操作<span class="token operator">?</span>
process<span class="token operator">=></span>operation<span class="token operator">:</span> 操作
e<span class="token operator">=></span>end<span class="token operator">:</span> 结束
<span class="token function">cond</span><span class="token punctuation">(</span>yes<span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span>process<span class="token operator">-</span><span class="token operator">></span>e
<span class="token function">cond</span><span class="token punctuation">(</span>no<span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span>e
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><ul>
<li><a href="https://theme-hope.vuejs.press/zh/guide/markdown/flowchart.html" target="_blank" rel="noopener noreferrer">查看详情<ExternalLinkIcon/></a></li>
</ul>
<h4 id="mermaid" tabindex="-1"><a class="header-anchor" href="#mermaid" aria-hidden="true">#</a> Mermaid</h4>
<div class="language-mermaid line-numbers-mode" data-ext="mermaid"><pre v-pre class="language-mermaid"><code><span class="token arrow operator">---</span>
title<span class="token operator">:</span> Flowchart
<span class="token arrow operator">---</span>
<span class="token keyword">flowchart</span> TB
c1<span class="token arrow operator">--></span>a2
<span class="token keyword">subgraph</span> one
a1<span class="token arrow operator">--></span>a2
<span class="token keyword">end</span>
<span class="token keyword">subgraph</span> two
b1<span class="token arrow operator">--></span>b2
<span class="token keyword">end</span>
<span class="token keyword">subgraph</span> three
c1<span class="token arrow operator">--></span>c2
<span class="token keyword">end</span>
one <span class="token arrow operator">--></span> two
three <span class="token arrow operator">--></span> two
two <span class="token arrow operator">--></span> c2
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><ul>
<li><a href="https://theme-hope.vuejs.press/zh/guide/markdown/mermaid.html" target="_blank" rel="noopener noreferrer">查看详情<ExternalLinkIcon/></a></li>
</ul>
<h4 id="tex-语法" tabindex="-1"><a class="header-anchor" href="#tex-语法" aria-hidden="true">#</a> Tex 语法</h4>
<p>$$
\frac {\partial^r} {\partial \omega^r} \left(\frac {y^{\omega}} {\omega}\right)
= \left(\frac {y^{\omega}} {\omega}\right) \left{(\log y)^r + \sum_{i=1}^r \frac {(-1)^i r \cdots (r-i+1) (\log y)^{r-i}} {\omega^i} \right}
$$</p>
<ul>
<li><a href="https://theme-hope.vuejs.press/zh/guide/markdown/tex.html" target="_blank" rel="noopener noreferrer">查看详情<ExternalLinkIcon/></a></li>
</ul>
<h4 id="vue-交互演示" tabindex="-1"><a class="header-anchor" href="#vue-交互演示" aria-hidden="true">#</a> Vue 交互演示</h4>
<p>::: vue-playground Vue 交互演示</p>
<template>
<div class="language-vue line-numbers-mode" data-ext="vue"><pre v-pre class="language-vue"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">setup</span><span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript">
<span class="token keyword">import</span> <span class="token punctuation">{</span> ref <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"vue"</span><span class="token punctuation">;</span>
<span class="token keyword">const</span> msg <span class="token operator">=</span> <span class="token function">ref</span><span class="token punctuation">(</span><span class="token string">"Hello World!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>template</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>h1</span><span class="token punctuation">></span></span>{{ msg }}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>h1</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>input</span> <span class="token attr-name">v-model</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>msg<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>template</span><span class="token punctuation">></span></span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>:::</p>
<ul>
<li><a href="https://theme-hope.vuejs.press/zh/guide/markdown/vue-playground.html" target="_blank" rel="noopener noreferrer">查看详情<ExternalLinkIcon/></a></li>
</ul>
<h4 id="幻灯片" tabindex="-1"><a class="header-anchor" href="#幻灯片" aria-hidden="true">#</a> 幻灯片</h4>
<p>@slidestart</p>
<h2 id="幻灯片-1" tabindex="-1"><a class="header-anchor" href="#幻灯片-1" aria-hidden="true">#</a> 幻灯片 1</h2>
<p>一个有文字和 <a href="https://mister-hope.com" target="_blank" rel="noopener noreferrer">链接<ExternalLinkIcon/></a> 的段落</p>
<hr>
<h2 id="幻灯片-2" tabindex="-1"><a class="header-anchor" href="#幻灯片-2" aria-hidden="true">#</a> 幻灯片 2</h2>
<ul>
<li>项目 1</li>
<li>项目 2</li>
</ul>
<hr>
<h2 id="幻灯片-3-1" tabindex="-1"><a class="header-anchor" href="#幻灯片-3-1" aria-hidden="true">#</a> 幻灯片 3.1</h2>
<div class="language-javascript line-numbers-mode" data-ext="js"><pre v-pre class="language-javascript"><code><span class="token keyword">const</span> a <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>--</p>
<h2 id="幻灯片-3-2" tabindex="-1"><a class="header-anchor" href="#幻灯片-3-2" aria-hidden="true">#</a> 幻灯片 3.2</h2>
<p>$$
J(\theta_0,\theta_1) = \sum_{i=0}
$$</p>
<p>@slideend</p>
<ul>
<li><a href="https://theme-hope.vuejs.press/zh/guide/markdown/revealjs.html" target="_blank" rel="noopener noreferrer">查看详情<ExternalLinkIcon/></a></li>
</ul>
</template>
</div></template>
export const data = JSON.parse("{\"key\":\"v-c1a532aa\",\"path\":\"/md/page.html\",\"title\":\"页面配置\",\"lang\":\"zh-CN\",\"frontmatter\":{\"title\":\"页面配置\",\"icon\":\"file\",\"order\":1,\"author\":\"Ms.Hope\",\"date\":\"2020-01-01T00:00:00.000Z\",\"category\":[\"使用指南\"],\"tag\":[\"页面配置\",\"使用指南\"],\"sticky\":true,\"star\":true,\"footer\":\"这是测试显示的页脚\",\"copyright\":\"无版权\",\"description\":\"more 注释之前的内容被视为文章摘要。 页面信息 你可以在 Markdown 的 Frontmatter 中设置页面信息。 作者设置为 Ms.Hope。; 写作日期为 2020 年 1 月 1 日; 分类为 “使用指南”; 标签为 “页面配置” 和 “使用指南”; 页面内容 你可以自由在这里书写你的 Markdown。 你可以将图片和 Markdow...\",\"head\":[[\"meta\",{\"property\":\"og:url\",\"content\":\"https://vuepress-theme-hope-docs-demo.netlify.app/md/page.html\"}],[\"meta\",{\"property\":\"og:site_name\",\"content\":\"我的简历\"}],[\"meta\",{\"property\":\"og:title\",\"content\":\"页面配置\"}],[\"meta\",{\"property\":\"og:description\",\"content\":\"more 注释之前的内容被视为文章摘要。 页面信息 你可以在 Markdown 的 Frontmatter 中设置页面信息。 作者设置为 Ms.Hope。; 写作日期为 2020 年 1 月 1 日; 分类为 “使用指南”; 标签为 “页面配置” 和 “使用指南”; 页面内容 你可以自由在这里书写你的 Markdown。 你可以将图片和 Markdow...\"}],[\"meta\",{\"property\":\"og:type\",\"content\":\"article\"}],[\"meta\",{\"property\":\"og:locale\",\"content\":\"zh-CN\"}],[\"meta\",{\"property\":\"article:author\",\"content\":\"Ms.Hope\"}],[\"meta\",{\"property\":\"article:tag\",\"content\":\"页面配置\"}],[\"meta\",{\"property\":\"article:tag\",\"content\":\"使用指南\"}],[\"meta\",{\"property\":\"article:published_time\",\"content\":\"2020-01-01T00:00:00.000Z\"}],[\"script\",{\"type\":\"application/ld+json\"},\"{\\\"@context\\\":\\\"https://schema.org\\\",\\\"@type\\\":\\\"Article\\\",\\\"headline\\\":\\\"页面配置\\\",\\\"image\\\":[\\\"\\\"],\\\"datePublished\\\":\\\"2020-01-01T00:00:00.000Z\\\",\\\"dateModified\\\":null,\\\"author\\\":[{\\\"@type\\\":\\\"Person\\\",\\\"name\\\":\\\"Ms.Hope\\\"}]}\"]]},\"headers\":[{\"level\":2,\"title\":\"页面信息\",\"slug\":\"页面信息\",\"link\":\"#页面信息\",\"children\":[]},{\"level\":2,\"title\":\"页面内容\",\"slug\":\"页面内容\",\"link\":\"#页面内容\",\"children\":[]},{\"level\":2,\"title\":\"页面结构\",\"slug\":\"页面结构\",\"link\":\"#页面结构\",\"children\":[]}],\"readingTime\":{\"minutes\":1.43,\"words\":429},\"filePathRelative\":\"md/page.md\",\"localizedDate\":\"2020年1月1日\",\"autoDesc\":true}")
if (import.meta.webpackHot) {
import.meta.webpackHot.accept()
if (__VUE_HMR_RUNTIME__.updatePageData) {
__VUE_HMR_RUNTIME__.updatePageData(data)
}
}
if (import.meta.hot) {
import.meta.hot.accept(({ data }) => {
__VUE_HMR_RUNTIME__.updatePageData(data)
})
}
<template><div><p><code v-pre>more</code> 注释之前的内容被视为文章摘要。</p>
<!-- more -->
<h2 id="页面信息" tabindex="-1"><a class="header-anchor" href="#页面信息" aria-hidden="true">#</a> 页面信息</h2>
<p>你可以在 Markdown 的 Frontmatter 中设置页面信息。</p>
<ul>
<li>作者设置为 Ms.Hope。</li>
<li>写作日期为 2020 年 1 月 1 日</li>
<li>分类为 “使用指南”</li>
<li>标签为 “页面配置” 和 “使用指南”</li>
</ul>
<h2 id="页面内容" tabindex="-1"><a class="header-anchor" href="#页面内容" aria-hidden="true">#</a> 页面内容</h2>
<p>你可以自由在这里书写你的 Markdown。</p>
<div class="hint-container tip">
<p class="hint-container-title">提示</p>
<ul>
<li>
<p>你可以将图片和 Markdown 文件放置在一起,但是你需要使用<strong>相对链接</strong><code v-pre>./</code> 进行引用。</p>
</li>
<li>
<p>对于 <code v-pre>.vuepress/public</code> 文件夹的图片,请使用绝对链接 <code v-pre>/</code> 进行引用。</p>
</li>
</ul>
</div>
<p>主题包含了一个自定义徽章可以使用:</p>
<blockquote>
<p>文字结尾应该有深蓝色的 徽章文字 徽章。 <Badge text="徽章文字" color="#242378" /></p>
</blockquote>
<h2 id="页面结构" tabindex="-1"><a class="header-anchor" href="#页面结构" aria-hidden="true">#</a> 页面结构</h2>
<p>此页面应当包含:</p>
<ul>
<li><a href="https://theme-hope.vuejs.press/zh/guide/layout/breadcrumb.html" target="_blank" rel="noopener noreferrer">路径导航<ExternalLinkIcon/></a></li>
<li><a href="https://theme-hope.vuejs.press/zh/guide/feature/page-info.html" target="_blank" rel="noopener noreferrer">标题和页面信息<ExternalLinkIcon/></a></li>
<li><a href="https://theme-hope.vuejs.press/zh/guide/layout/page.html#%E6%A0%87%E9%A2%98%E5%88%97%E8%A1%A8" target="_blank" rel="noopener noreferrer">TOC (文章标题列表)<ExternalLinkIcon/></a></li>
<li><a href="https://theme-hope.vuejs.press/guide/feature/meta.html" target="_blank" rel="noopener noreferrer">贡献者、更新时间等页面元信息<ExternalLinkIcon/></a></li>
<li><a href="https://theme-hope.vuejs.press/zh/guide/feature/comment.html" target="_blank" rel="noopener noreferrer">评论<ExternalLinkIcon/></a></li>
<li><a href="https://theme-hope.vuejs.press/zh/guide/layout/navbar.html" target="_blank" rel="noopener noreferrer">导航栏<ExternalLinkIcon/></a></li>
<li><a href="https://theme-hope.vuejs.press/zh/guide/layout/sidebar.html" target="_blank" rel="noopener noreferrer">侧边栏<ExternalLinkIcon/></a></li>
<li><a href="https://theme-hope.vuejs.press/zh/guide/layout/footer.html" target="_blank" rel="noopener noreferrer">页脚<ExternalLinkIcon/></a></li>
<li>返回顶部按钮</li>
</ul>
<p>你可以通过主题选项和页面 Frontmatter 自定义它们。</p>
</div></template>
export const data = JSON.parse("{\"key\":\"v-1d59d0e6\",\"path\":\"/md/resume.html\",\"title\":\"个人简历\",\"lang\":\"zh-CN\",\"frontmatter\":{\"title\":\"个人简历\",\"index\":false,\"icon\":\"laptop-code\",\"category\":[\"自我介绍\",\"专业技能\",\"项目经验\"],\"description\":\"个人信息 姓名; 电话; 邮箱; 毕业时间; 工作时间; Github:https://github.com/fuzhengwei; 开源项目:vo2dto (https://bugstack.cn/md/product/idea-plugin/vo2dto.html) - IDEA Plugin 自动转换对象插件,5.4k 下载使用; 毕业院校 时间...\",\"head\":[[\"meta\",{\"property\":\"og:url\",\"content\":\"https://vuepress-theme-hope-docs-demo.netlify.app/md/resume.html\"}],[\"meta\",{\"property\":\"og:site_name\",\"content\":\"我的简历\"}],[\"meta\",{\"property\":\"og:title\",\"content\":\"个人简历\"}],[\"meta\",{\"property\":\"og:description\",\"content\":\"个人信息 姓名; 电话; 邮箱; 毕业时间; 工作时间; Github:https://github.com/fuzhengwei; 开源项目:vo2dto (https://bugstack.cn/md/product/idea-plugin/vo2dto.html) - IDEA Plugin 自动转换对象插件,5.4k 下载使用; 毕业院校 时间...\"}],[\"meta\",{\"property\":\"og:type\",\"content\":\"article\"}],[\"meta\",{\"property\":\"og:locale\",\"content\":\"zh-CN\"}],[\"meta\",{\"property\":\"article:author\",\"content\":\"Mr.Hope\"}],[\"script\",{\"type\":\"application/ld+json\"},\"{\\\"@context\\\":\\\"https://schema.org\\\",\\\"@type\\\":\\\"Article\\\",\\\"headline\\\":\\\"个人简历\\\",\\\"image\\\":[\\\"\\\"],\\\"dateModified\\\":null,\\\"author\\\":[{\\\"@type\\\":\\\"Person\\\",\\\"name\\\":\\\"Mr.Hope\\\",\\\"url\\\":\\\"https://mister-hope.com\\\"}]}\"]]},\"headers\":[{\"level\":2,\"title\":\"个人信息\",\"slug\":\"个人信息\",\"link\":\"#个人信息\",\"children\":[]},{\"level\":2,\"title\":\"毕业院校\",\"slug\":\"毕业院校\",\"link\":\"#毕业院校\",\"children\":[]},{\"level\":2,\"title\":\"专业技能\",\"slug\":\"专业技能\",\"link\":\"#专业技能\",\"children\":[]},{\"level\":2,\"title\":\"工作经历【在校生无】\",\"slug\":\"工作经历【在校生无】\",\"link\":\"#工作经历【在校生无】\",\"children\":[]},{\"level\":2,\"title\":\"项目经验\",\"slug\":\"项目经验\",\"link\":\"#项目经验\",\"children\":[{\"level\":3,\"title\":\"1. 营销活动平台 - Lottery 微服务抽奖系统\",\"slug\":\"_1-营销活动平台-lottery-微服务抽奖系统\",\"link\":\"#_1-营销活动平台-lottery-微服务抽奖系统\",\"children\":[]},{\"level\":3,\"title\":\"2. 手写 MyBatis\",\"slug\":\"_2-手写-mybatis\",\"link\":\"#_2-手写-mybatis\",\"children\":[]},{\"level\":3,\"title\":\"3. OpenAI 应用服务 - 辅助工作提效工具开发\",\"slug\":\"_3-openai-应用服务-辅助工作提效工具开发\",\"link\":\"#_3-openai-应用服务-辅助工作提效工具开发\",\"children\":[]},{\"level\":3,\"title\":\"4. 服务治理 SpringBoot 中间件\",\"slug\":\"_4-服务治理-springboot-中间件\",\"link\":\"#_4-服务治理-springboot-中间件\",\"children\":[]}]}],\"git\":{},\"readingTime\":{\"minutes\":9.19,\"words\":2757},\"filePathRelative\":\"md/resume.md\",\"autoDesc\":true}")
<template><div><h2 id="个人信息" tabindex="-1"><a class="header-anchor" href="#个人信息" aria-hidden="true">#</a> 个人信息</h2>
<ul>
<li>姓名</li>
<li>电话</li>
<li>邮箱</li>
<li>毕业时间</li>
<li>工作时间</li>
<li>Github:https://github.com/fuzhengwei</li>
<li>开源项目:<a href="https://bugstack.cn/md/product/idea-plugin/vo2dto.html" target="_blank" rel="noopener noreferrer">vo2dto<ExternalLinkIcon/></a> - IDEA Plugin 自动转换对象插件,5.4k 下载使用</li>
</ul>
<h2 id="毕业院校" tabindex="-1"><a class="header-anchor" href="#毕业院校" aria-hidden="true">#</a> 毕业院校</h2>
<ul>
<li>时间、院校、专业、学位</li>
<li>荣誉、成绩</li>
</ul>
<h2 id="专业技能" tabindex="-1"><a class="header-anchor" href="#专业技能" aria-hidden="true">#</a> 专业技能</h2>
<ul>
<li>熟练掌握 Java 核心知识、JUC、HashMap、斐波那契散列等,具备良好的面向对象编程思想。</li>
<li>熟练掌握 Java 设计模式,如工厂、代理、组合、策略等设计模式,并善用设计原则构建可复用代码。</li>
<li>熟练使用 IDEA、Eclipse、Visual Studio Code、Navicat、PostMan、Git、Maven、SVN 等开发工具。</li>
<li>深入理解 JVM 底层原理,熟悉 JVM 各类垃圾收集器的使用及核心参数的调优,具备一定的 JVM 调优能力。</li>
<li><code v-pre>深入学习 Spring 核心流程模块,如IOC、AOP、依赖倒置等,掌握Spring解决复杂场景所需的分治、抽象和知识(设计模式、设计原则),能从核心原理上解决Spring场景问题。同时,具备基于 Spring 开发 SpringBoot Starter 的技能,减少研发成本,为复杂项目提供通用技术组件。</code></li>
<li><code v-pre>深入学习 MyBatis 核心流程模块,包括会话、反射、代理、事务和插件,熟练掌握 ORM 框架的设计思想、实现方式和应用价值。并根据需求结合 MyBatis 插件机制,开发企业所需的功能,如数据分页、数据库表路由、监控日志和数据安全等。</code></li>
<li>深入理解 Spring Boot,Spring Cloud 等微服务框架的设计原理及底层架构,熟悉各种微服务架构设计比如服务注册与发现,服务降级,限流,熔断,服务网关路由设计,服务安全认证架构。</li>
<li>熟悉 Dubbo、Zookeeper 等分布式服务协调与治理等技术。</li>
<li>熟练掌握 MySql,掌握 MySQL 主从同步,读写分离技术以及集群的搭建,具备一定的 SQL 调优能力。</li>
<li>深入理解 Redis 线程模型,熟练掌握 Redis 的核心数据结构的使用场景,熟悉各种缓存高并发的使用场景,比如缓存雪崩,缓存穿透等。</li>
<li>熟练掌握分布式场景中的常见的技术问题及解决,比如分布式锁,分布式事务,分布式 session,分布式任务调度。</li>
<li>熟悉 RabbitMQ、Kafka 等常用的消息中间件进行消息的异步数据处理。</li>
<li>了解分布式搜索引擎 ElasticSearch,并能基于 ELK+Kafka 搭建分布式日志收集系统,以及 x-pack-jdbc 的扩展使用。</li>
<li>熟悉 docker 常用命令,能够实现基于 docker+Jenkins 实现自动化部署</li>
<li>掌握 Linux 常用命令,了解 Nginx 服务器的反向代理、负载均衡、动静分离等。</li>
<li>熟练运用 DDD 四层架构领域驱动设计,构建出易于迭代和维护的工程架构,遵守整洁代码、洋葱架构设计思想。</li>
</ul>
<h2 id="工作经历【在校生无】" tabindex="-1"><a class="header-anchor" href="#工作经历【在校生无】" aria-hidden="true">#</a> 工作经历【在校生无】</h2>
<ul>
<li>公司</li>
<li>岗位</li>
<li>时间</li>
<li>职责【可选】</li>
<li>成绩【可选】</li>
</ul>
<h2 id="项目经验" tabindex="-1"><a class="header-anchor" href="#项目经验" aria-hidden="true">#</a> 项目经验</h2>
<h3 id="_1-营销活动平台-lottery-微服务抽奖系统" tabindex="-1"><a class="header-anchor" href="#_1-营销活动平台-lottery-微服务抽奖系统" aria-hidden="true">#</a> 1. 营销活动平台 - Lottery 微服务抽奖系统</h3>
<ul>
<li>系统架构:以 DDD 领域驱动设计开发,微服务拆分的分布式系统架构</li>
<li>核心技术:SpringBoot、MyBatis、Dubbo、MQ、MySQL、XDB-Router、ES、ZK</li>
<li>项目描述:抽奖系统是营销平台的重要微服务之一,可以满足 C 端人群的需求,例如拉新、促活、留存等。该系统运用抽象、分治和 DDD 知识,拆解服务边界,凝练领域服务功能。围绕抽奖服务建设领域服务,包括规则引擎、抽奖策略、活动玩法、奖品发放等。这可以满足业务产品快速迭代上线的需求,同时减少研发成本,提高交付效率。</li>
<li>核心职责:
<ul>
<li>【高级】构建以 DDD 分层结构的处理方式,搭建整个抽奖系统架构。运用设计原则和工厂、代理、模板、组合、策略等设计模式的综合使用,搭建易于维护和迭代的系统工程。</li>
<li>【高级】鉴于系统内有较多的规则策略过滤,包括准入、人群、风控、A/BTest等需求,为适应系统规模可快速开发和使用的方式,搭建了去中心化的量化人群规则引擎组件。通过业务需求对逻辑的扩展和内置引擎执行器的使用,完成自由组合的人群过滤服务。这降低了共性功能重复开发所带来的成本问题,并提高了研发效率。</li>
<li>【高级】根据实际秒杀峰值场景 <code v-pre>TPS 5000 ~ 8000</code> 的需求,开发了统一路由组件。该组件不仅可以满足差异化不同字段的分库分表组合,还支持 Redis 库存分片和秒杀滑动库存分块。而且,开发了统一路由 XDB-Router 的 SpringBoot Starter 技术组件。该套组件已经经历了多次大促活动场景的考验,支持横向扩展,可以满足业务规模的快速增长。</li>
<li>【简单】运用模板、策略、工厂三个设计模式,定义抽奖过程标准和实现对应的多类型抽奖的服务模块。</li>
<li>【简单】因活动秒杀的并发场景,将秒杀从最开始的数据库行级锁优化为Redis Key 加锁,又从 Redis Key 的独占锁,优化为滑块锁。优化后整体秒杀有了非常可观的性能提升。</li>
<li>【简单】解耦抽奖流程,把抽奖和发奖用MQ消息串联起来,避免一个流程太长,导致用户一直等待。</li>
</ul>
</li>
</ul>
<h3 id="_2-手写-mybatis" tabindex="-1"><a class="header-anchor" href="#_2-手写-mybatis" aria-hidden="true">#</a> 2. 手写 MyBatis</h3>
<ul>
<li>项目架构:Object Relational Mapping</li>
<li>项目描述:MyBatis 是 Java 应用编程开发中,非常常用的技术框架。需要较深入的学习和使用,具备 MyBatis 插件开发能力,解决日常场景问题。才能更好更高效的工作。为此,深度学习了《手写MyBatis:渐进式源码实践》一书,完整实现了一个 MyBatis ORM 框架。技术积累颇深,提高了设计思维和编码能力。</li>
<li>个人收获:
<ul>
<li>首先学习到为什么日常使用 MyBatis 时,可以仅提供 IDao 接口,就可以关联对应配置的SQL语句,完成数据库操作。这是因为做了代理与映射,封装调用逻辑到 SqlSession 会话功能实现中。</li>
<li>掌握了数10种设计模式的运用,其中感触最大的是 MyBatis 如何管理多边服务的设计。如创建会话模型,统一调度执行器使用和数据的封装,并把这些复杂的操作,通过 SqlSessionFactory 工厂统一对外提供 SqlSession 服务。</li>
<li>彻底了解并掌握了 MyBatis Plugin 设计模型,这个技术可以让我基于 MyBatis 做出日志监控、库表路由、字段加解密等操作。为以后编程工作,提供更多的解决方案。</li>
<li>除此之外,还有一级缓存、二级缓存的装饰器模式使用,MyBatis 开发后与 Spring、SpringBoot 整合的实现,让我对 MyBatis 的全体系开发流程和对应的技术整合,已经非常清晰,便于以后应用和从根上快速排查解决问题,并给出合理的技术方案。</li>
</ul>
</li>
</ul>
<h3 id="_3-openai-应用服务-辅助工作提效工具开发" tabindex="-1"><a class="header-anchor" href="#_3-openai-应用服务-辅助工作提效工具开发" aria-hidden="true">#</a> 3. OpenAI 应用服务 - 辅助工作提效工具开发</h3>
<ul>
<li>项目架构:微服务架构设计,OpenAI-SDK 多模型组件【ChatGLM、ChatGPT】、DDD 应用服务API封装、WEB REACT 前端界面【按需编写】</li>
<li>核心技术:SpringBoot、MyBatis、Redis/Guava、OKHttp3、OpenAI 大模型【可对接ChatGLM、腾讯混元等】、React、TypeScript</li>
<li>项目描述:此项目以应用OpenAI技术,对接多种大模型提供生成式服务,为XXX场景提效。项目的架构设计实现以微服务进行拆分,涵盖;OpenAI-SDK、OpenAI-API、公众号鉴权、企业支付【暂时申请中,如果你对接了可以写】等。并以模块化设计,积木式构建应用,让不同的场景诉求都可以配置化对接。</li>
<li>核心职责:
<ul>
<li>首先这是我们xxx公司/实践/实训的第一个OpenAI项目,后续势必会有更多的场景以不同的方式接入。包括 SDK 独立接入、API 接口接入、MQ 消息接入,以及使用提供好的服务类接入。所以在这部分设计的时候,我采用了微服务的架构设计,按照职责边界进行拆分设计。</li>
<li>采用 DDD 架构 API,以及便于不同领域模块的独立设计,一个领域就是一个功能域。在功能域中提供模型、仓储、事件、服务。这样可以更好扩展。</li>
<li>鉴于生成式服务的文本生成可能会有不可靠信息,所以对这部分内容添加了敏感词的过滤。并可根据不同场景选择不同范围的敏感词处理。</li>
<li>OpenAI 大模型有多种,这部分在架构上设计独立的 SDK,在实现上采用了 Session 会话模型进行处理,以及通过工厂处理服务。在细节对上,采用了 OKHttp3 框架完成模型对接,这样的方式更好扩展,代码也更易于维护。</li>
<li>在整套工程的设计实现中,采用了较多的分治、抽象的思想和设计模式和设计原则知识的运用,来解决各类场景问题。</li>
<li>对接微信扫码支付,完成从商品库、下单支付、异步发货、掉单补偿等核心流程实现。让用户可以在线购买对话额度。</li>
<li>注意:你还可以根据项目中提到的各类技术和章节,来编写你的职责。</li>
</ul>
</li>
</ul>
<h3 id="_4-服务治理-springboot-中间件" tabindex="-1"><a class="header-anchor" href="#_4-服务治理-springboot-中间件" aria-hidden="true">#</a> 4. 服务治理 SpringBoot 中间件</h3>
<ul>
<li>系统架构:SpringBoot Starter 组件开发</li>
<li>核心技术:熔断、降级、限流、切量、白名单、人群控制</li>
<li>项目描述:该SpringBoot Starter中间件实现了熔断、降级、限流、切量、白名单等服务治理功能,减少了开发工作量和出错风险。利用SpringBoot的自动化配置机制简化了集成和使用,并提供了可扩展接口,以满足不同场景的需求。</li>
<li>核心职责:
<ul>
<li>鉴于组内同类需求的重复开发,设计并实现服务治理 SpringBoot Starter 中间件,提高开发效率和降低重复开发成本。 该中间件的核心功能包括服务治理中的熔断、降级、限流、切量和白名单等。</li>
<li>通过利用SpringBoot的自动化配置机制,该中间件可以简化集成和使用,同时提供足够的配置选项以满足不同场景的需求。</li>
<li>此外,该中间件还提供了可扩展的接口,方便用户根据自身需求扩展功能,从而更好地满足不同的业务需求。</li>
</ul>
</li>
</ul>
</div></template>
export const data = JSON.parse("{\"key\":\"v-2e3eac9e\",\"path\":\"/slides.html\",\"title\":\"幻灯片页\",\"lang\":\"zh-CN\",\"frontmatter\":{\"title\":\"幻灯片页\",\"icon\":\"person-chalkboard\",\"layout\":\"Slide\",\"description\":\"slidestart 幻灯片演示 一个简单的幻灯片演示与各种小贴士。 作者 Mr.Hope. 请滚动鼠标滚轮进入下一页 标注幻灯片 👇 (#/1/1) -- 标注幻灯片 使用 --- 标注水平幻灯片 在水平幻灯片中使用 -- 分割垂直幻灯片 使用 在幻灯片上添加属性 使用 在前一个 HTML 元素上添加属性 Markdown 你可以在幻灯片中使用 M...\",\"head\":[[\"meta\",{\"property\":\"og:url\",\"content\":\"https://vuepress-theme-hope-docs-demo.netlify.app/slides.html\"}],[\"meta\",{\"property\":\"og:site_name\",\"content\":\"我的简历\"}],[\"meta\",{\"property\":\"og:title\",\"content\":\"幻灯片页\"}],[\"meta\",{\"property\":\"og:description\",\"content\":\"slidestart 幻灯片演示 一个简单的幻灯片演示与各种小贴士。 作者 Mr.Hope. 请滚动鼠标滚轮进入下一页 标注幻灯片 👇 (#/1/1) -- 标注幻灯片 使用 --- 标注水平幻灯片 在水平幻灯片中使用 -- 分割垂直幻灯片 使用 在幻灯片上添加属性 使用 在前一个 HTML 元素上添加属性 Markdown 你可以在幻灯片中使用 M...\"}],[\"meta\",{\"property\":\"og:type\",\"content\":\"article\"}],[\"meta\",{\"property\":\"og:locale\",\"content\":\"zh-CN\"}],[\"meta\",{\"property\":\"article:author\",\"content\":\"Mr.Hope\"}],[\"script\",{\"type\":\"application/ld+json\"},\"{\\\"@context\\\":\\\"https://schema.org\\\",\\\"@type\\\":\\\"Article\\\",\\\"headline\\\":\\\"幻灯片页\\\",\\\"image\\\":[\\\"\\\"],\\\"dateModified\\\":null,\\\"author\\\":[{\\\"@type\\\":\\\"Person\\\",\\\"name\\\":\\\"Mr.Hope\\\",\\\"url\\\":\\\"https://mister-hope.com\\\"}]}\"]]},\"headers\":[{\"level\":2,\"title\":\"幻灯片演示\",\"slug\":\"幻灯片演示\",\"link\":\"#幻灯片演示\",\"children\":[]},{\"level\":2,\"title\":\"标注幻灯片\",\"slug\":\"标注幻灯片\",\"link\":\"#标注幻灯片\",\"children\":[]},{\"level\":2,\"title\":\"标注幻灯片\",\"slug\":\"标注幻灯片-1\",\"link\":\"#标注幻灯片-1\",\"children\":[]},{\"level\":2,\"title\":\"Markdown\",\"slug\":\"markdown\",\"link\":\"#markdown\",\"children\":[]},{\"level\":2,\"title\":\"Markdown\",\"slug\":\"markdown-1\",\"link\":\"#markdown-1\",\"children\":[{\"level\":3,\"title\":\"这是一个 H3\",\"slug\":\"这是一个-h3\",\"link\":\"#这是一个-h3\",\"children\":[]}]},{\"level\":2,\"title\":\"Markdown\",\"slug\":\"markdown-2\",\"link\":\"#markdown-2\",\"children\":[]},{\"level\":2,\"title\":\"Markdown\",\"slug\":\"markdown-3\",\"link\":\"#markdown-3\",\"children\":[]},{\"level\":2,\"title\":\"Markdown\",\"slug\":\"markdown-4\",\"link\":\"#markdown-4\",\"children\":[]},{\"level\":2,\"title\":\"Markdown\",\"slug\":\"markdown-5\",\"link\":\"#markdown-5\",\"children\":[]},{\"level\":2,\"title\":\"布局\",\"slug\":\"布局\",\"link\":\"#布局\",\"children\":[]},{\"level\":2,\"title\":\"布局\",\"slug\":\"布局-1\",\"link\":\"#布局-1\",\"children\":[]},{\"level\":2,\"title\":\"布局\",\"slug\":\"布局-2\",\"link\":\"#布局-2\",\"children\":[]},{\"level\":2,\"title\":\"布局\",\"slug\":\"布局-3\",\"link\":\"#布局-3\",\"children\":[{\"level\":3,\"title\":\"背景\",\"slug\":\"背景\",\"link\":\"#背景\",\"children\":[]}]},{\"level\":2,\"title\":\"动画片段\",\"slug\":\"动画片段\",\"link\":\"#动画片段\",\"children\":[]},{\"level\":2,\"title\":\"动画片段\",\"slug\":\"动画片段-1\",\"link\":\"#动画片段-1\",\"children\":[]},{\"level\":2,\"title\":\"动画片段\",\"slug\":\"动画片段-2\",\"link\":\"#动画片段-2\",\"children\":[{\"level\":3,\"title\":\"动画 class\",\"slug\":\"动画-class\",\"link\":\"#动画-class\",\"children\":[]}]},{\"level\":2,\"title\":\"动画片段\",\"slug\":\"动画片段-3\",\"link\":\"#动画片段-3\",\"children\":[{\"level\":3,\"title\":\"动画 class\",\"slug\":\"动画-class-1\",\"link\":\"#动画-class-1\",\"children\":[]}]},{\"level\":2,\"title\":\"动画片段\",\"slug\":\"动画片段-4\",\"link\":\"#动画片段-4\",\"children\":[{\"level\":3,\"title\":\"多个动画片段\",\"slug\":\"多个动画片段\",\"link\":\"#多个动画片段\",\"children\":[]}]},{\"level\":2,\"title\":\"动画片段\",\"slug\":\"动画片段-5\",\"link\":\"#动画片段-5\",\"children\":[{\"level\":3,\"title\":\"顺序\",\"slug\":\"顺序\",\"link\":\"#顺序\",\"children\":[]}]},{\"level\":2,\"title\":\"渐变\",\"slug\":\"渐变\",\"link\":\"#渐变\",\"children\":[]},{\"level\":2,\"title\":\"渐变\",\"slug\":\"渐变-1\",\"link\":\"#渐变-1\",\"children\":[]},{\"level\":2,\"title\":\"渐变\",\"slug\":\"渐变-2\",\"link\":\"#渐变-2\",\"children\":[{\"level\":3,\"title\":\"过渡动画\",\"slug\":\"过渡动画\",\"link\":\"#过渡动画\",\"children\":[]}]},{\"level\":2,\"title\":\"功能\",\"slug\":\"功能\",\"link\":\"#功能\",\"children\":[]},{\"level\":2,\"title\":\"功能\",\"slug\":\"功能-1\",\"link\":\"#功能-1\",\"children\":[{\"level\":3,\"title\":\"代码\",\"slug\":\"代码\",\"link\":\"#代码\",\"children\":[]}]},{\"level\":2,\"title\":\"功能\",\"slug\":\"功能-2\",\"link\":\"#功能-2\",\"children\":[{\"level\":3,\"title\":\"预览模式\",\"slug\":\"预览模式\",\"link\":\"#预览模式\",\"children\":[]}]},{\"level\":2,\"title\":\"功能\",\"slug\":\"功能-3\",\"link\":\"#功能-3\",\"children\":[{\"level\":3,\"title\":\"全屏模式\",\"slug\":\"全屏模式\",\"link\":\"#全屏模式\",\"children\":[]}]},{\"level\":2,\"title\":\"功能\",\"slug\":\"功能-4\",\"link\":\"#功能-4\",\"children\":[{\"level\":3,\"title\":\"缩放\",\"slug\":\"缩放\",\"link\":\"#缩放\",\"children\":[]}]},{\"level\":2,\"title\":\"结束\",\"slug\":\"结束\",\"link\":\"#结束\",\"children\":[]}],\"git\":{},\"readingTime\":{\"minutes\":4.51,\"words\":1352},\"filePathRelative\":\"slides.md\",\"autoDesc\":true}")
<template><div><!-- markdownlint-disable MD024 MD033 MD051 -->
<p>@slidestart</p>
<!-- .slide: data-transition="slide" -->
<h2 id="幻灯片演示" tabindex="-1"><a class="header-anchor" href="#幻灯片演示" aria-hidden="true">#</a> 幻灯片演示</h2>
<!-- .element: class="r-fit-text" -->
<p>一个简单的幻灯片演示与各种小贴士。</p>
<!-- .element: class="r-fit-text" -->
<blockquote>
<p>作者 Mr.Hope. 请滚动鼠标滚轮进入下一页</p>
</blockquote>
<hr>
<h2 id="标注幻灯片" tabindex="-1"><a class="header-anchor" href="#标注幻灯片" aria-hidden="true">#</a> 标注幻灯片</h2>
<!-- .element: class="r-fit-text" -->
<p><a href="#/1/1">👇</a></p>
<p>--</p>
<h2 id="标注幻灯片-1" tabindex="-1"><a class="header-anchor" href="#标注幻灯片-1" aria-hidden="true">#</a> 标注幻灯片</h2>
<!-- .element: class="r-fit-text" -->
<p>使用 <code v-pre>---</code> 标注水平幻灯片</p>
<!-- .element: class="fragment fade-in" -->
<p>在水平幻灯片中使用 <code v-pre>--</code> 分割垂直幻灯片</p>
<!-- .element: class="fragment fade-in" -->
<p>使用 <code v-pre>&lt;!-- .slide: ... --&gt;</code> 在幻灯片上添加属性</p>
<!-- .element: class="fragment fade-in" -->
<p>使用 <code v-pre>&lt;!-- .element: ... --&gt;</code> 在前一个 HTML 元素上添加属性</p>
<!-- .element: class="fragment fade-in" -->
<hr>
<!-- .slide: data-transition="slide" data-auto-animate -->
<h2 id="markdown" tabindex="-1"><a class="header-anchor" href="#markdown" aria-hidden="true">#</a> Markdown</h2>
<!-- .element: class="r-fit-text" -->
<p>你可以在幻灯片中使用 Markdown 语法的各种标记.</p>
<!-- .element: class="r-fit-text" -->
<p>--</p>
<!-- .slide: data-auto-animate -->
<h2 id="markdown-1" tabindex="-1"><a class="header-anchor" href="#markdown-1" aria-hidden="true">#</a> Markdown</h2>
<p>你可以在幻灯片中使用 Markdown 语法的各种标记.</p>
<h3 id="这是一个-h3" tabindex="-1"><a class="header-anchor" href="#这是一个-h3" aria-hidden="true">#</a> 这是一个 H3</h3>
<p>标题默认会自动转换为大写。</p>
<p>这是一个有着 <strong>粗体</strong>, <em>斜体</em>, <s>删除线</s> 文字并包含 <a href="https://mister-hope.com" target="_blank" rel="noopener noreferrer">一个链接<ExternalLinkIcon/></a> 的段落,并且它会自动换行。所以你无需担心它的长度。</p>
<p>--</p>
<!-- .slide: data-auto-animate -->
<h2 id="markdown-2" tabindex="-1"><a class="header-anchor" href="#markdown-2" aria-hidden="true">#</a> Markdown</h2>
<p>你可以在幻灯片中使用 Markdown 语法的各种标记.</p>
<p>列表默认为 <code v-pre>inline-block</code></p>
<ul>
<li>项目</li>
<li>项目</li>
<li>项目</li>
</ul>
<ol>
<li>项目 1</li>
<li>项目 2</li>
<li>项目 3</li>
</ol>
<p>--</p>
<!-- .slide: data-auto-animate -->
<h2 id="markdown-3" tabindex="-1"><a class="header-anchor" href="#markdown-3" aria-hidden="true">#</a> Markdown</h2>
<p>你可以在幻灯片中使用 Markdown 语法的各种标记.</p>
<p>在你启用 <code v-pre>highlight</code> 插件后,代码块会自动高亮。</p>
<div class="language-javascript line-numbers-mode" data-ext="js"><pre v-pre class="language-javascript"><code><span class="token keyword">const</span> a <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>--</p>
<!-- .slide: data-auto-animate -->
<h2 id="markdown-4" tabindex="-1"><a class="header-anchor" href="#markdown-4" aria-hidden="true">#</a> Markdown</h2>
<p>你可以在幻灯片中使用 Markdown 语法的各种标记.</p>
<p>在你启用 <code v-pre>math</code> 插件后,你也可以使用 TEX 格式使用数学公式。</p>
<p>$$
J(\theta_0,\theta_1) = \sum_{i=0}
$$</p>
<p>--</p>
<!-- .slide: data-auto-animate -->
<h2 id="markdown-5" tabindex="-1"><a class="header-anchor" href="#markdown-5" aria-hidden="true">#</a> Markdown</h2>
<p>你可以在幻灯片中使用 Markdown 语法的各种标记.</p>
<p><strong>请注意</strong>: 表格和分割线,以及所有不在 Markdown 标准语法中的内容均不受支持。</p>
<hr>
<!-- .slide: data-transition="slide" data-auto-animate -->
<h2 id="布局" tabindex="-1"><a class="header-anchor" href="#布局" aria-hidden="true">#</a> 布局</h2>
<!-- .element: class="r-fit-text" -->
<p>--</p>
<!-- .slide: data-auto-animate -->
<h2 id="布局-1" tabindex="-1"><a class="header-anchor" href="#布局-1" aria-hidden="true">#</a> 布局</h2>
<!-- .element: class="r-fit-text" -->
<p>👆 <code v-pre>r-fit-text</code> class 会让文字在不超出幻灯片范围的情况下尽可能大。</p>
<p>--</p>
<!-- .slide: data-auto-animate -->
<h2 id="布局-2" tabindex="-1"><a class="header-anchor" href="#布局-2" aria-hidden="true">#</a> 布局</h2>
<figure><img src="/logo.svg" alt="Logo" tabindex="0" loading="lazy"><figcaption>Logo</figcaption></figure>
<!-- .element: class="r-stretch" -->
<p>👆 <code v-pre>r-stretch</code> class 帮助你控制注入图片或视频的大小,使它们填充满幻灯片垂直方向上的剩余空间。</p>
<p>--</p>
<!-- .slide: data-auto-animate data-background-color="rgb(70, 70, 255)" -->
<h2 id="布局-3" tabindex="-1"><a class="header-anchor" href="#布局-3" aria-hidden="true">#</a> 布局</h2>
<h3 id="背景" tabindex="-1"><a class="header-anchor" href="#背景" aria-hidden="true">#</a> 背景</h3>
<p>你可以通过向特定幻灯片添加 <code v-pre>data-background</code> 属性自定义幻灯片背景.</p>
<hr>
<!-- .slide: data-auto-animate -->
<h2 id="动画片段" tabindex="-1"><a class="header-anchor" href="#动画片段" aria-hidden="true">#</a> 动画片段</h2>
<!-- .element: class="r-fit-text" -->
<p>--</p>
<!-- .slide: data-auto-animate -->
<h2 id="动画片段-1" tabindex="-1"><a class="header-anchor" href="#动画片段-1" aria-hidden="true">#</a> 动画片段</h2>
<!-- .element: class="r-fit-text" -->
<p>动画片段用于高亮或显隐幻灯片中的元素。</p>
<p>你需要在元素上添加 <code v-pre>fragment</code> 和动画 class。</p>
<p>--</p>
<!-- .slide: data-auto-animate -->
<h2 id="动画片段-2" tabindex="-1"><a class="header-anchor" href="#动画片段-2" aria-hidden="true">#</a> 动画片段</h2>
<h3 id="动画-class" tabindex="-1"><a class="header-anchor" href="#动画-class" aria-hidden="true">#</a> 动画 class</h3>
<ul>
<li><code v-pre>fade-in</code></li>
</ul>
<!-- .element: class="fragment fade-in" -->
<ul>
<li><code v-pre>fade-out</code></li>
</ul>
<!-- .element: class="fragment fade-out" -->
<ul>
<li><code v-pre>fade-up</code></li>
</ul>
<!-- .element: class="fragment fade-up" -->
<!-- list break -->
<ul>
<li><code v-pre>fade-down</code></li>
</ul>
<!-- .element: class="fragment fade-down" -->
<ul>
<li><code v-pre>fade-left</code></li>
</ul>
<!-- .element: class="fragment fade-left" -->
<ul>
<li><code v-pre>fade-right</code></li>
</ul>
<!-- .element: class="fragment fade-right" -->
<!-- list break -->
<ul>
<li><code v-pre>fade-in-then-out</code></li>
</ul>
<!-- .element: class="fragment fade-in-then-out" -->
<ul>
<li><code v-pre>fade-in-then-semi-out</code></li>
</ul>
<!-- .element: class="fragment fade-in-then-semi-out" -->
<p>--</p>
<!-- .slide: data-auto-animate -->
<h2 id="动画片段-3" tabindex="-1"><a class="header-anchor" href="#动画片段-3" aria-hidden="true">#</a> 动画片段</h2>
<h3 id="动画-class-1" tabindex="-1"><a class="header-anchor" href="#动画-class-1" aria-hidden="true">#</a> 动画 class</h3>
<ul>
<li><code v-pre>grow</code></li>
</ul>
<!-- .element: class="fragment grow" -->
<ul>
<li><code v-pre>shrink</code></li>
</ul>
<!-- .element: class="fragment shrink" -->
<ul>
<li><code v-pre>strike</code></li>
</ul>
<!-- .element: class="fragment strike" -->
<!-- list break -->
<ul>
<li><code v-pre>highlight-red</code></li>
</ul>
<!-- .element: class="fragment highlight-red" -->
<ul>
<li><code v-pre>highlight-green</code></li>
</ul>
<!-- .element: class="fragment highlight-green" -->
<ul>
<li><code v-pre>highlight-blue</code></li>
</ul>
<!-- .element: class="fragment highlight-blue" -->
<!-- list break -->
<ul>
<li><code v-pre>highlight-current-red</code></li>
</ul>
<!-- .element: class="fragment highlight-current-red" -->
<ul>
<li><code v-pre>highlight-current-green</code></li>
</ul>
<!-- .element: class="fragment highlight-current-green" -->
<ul>
<li><code v-pre>highlight-current-blue</code></li>
</ul>
<!-- .element: class="fragment highlight-current-blue" -->
<p>--</p>
<!-- .slide: data-auto-animate -->
<h2 id="动画片段-4" tabindex="-1"><a class="header-anchor" href="#动画片段-4" aria-hidden="true">#</a> 动画片段</h2>
<h3 id="多个动画片段" tabindex="-1"><a class="header-anchor" href="#多个动画片段" aria-hidden="true">#</a> 多个动画片段</h3>
<p>你可以按照顺序包裹一个 HTML 元素使其拥有多个动画片段</p>
<span class="fragment fade-in">
<span class="fragment highlight-red">
<span class="fragment fade-out">
渐入 > 变红 > 渐出
</span>
</span>
</span>
<p>--</p>
<!-- .slide: data-auto-animate -->
<h2 id="动画片段-5" tabindex="-1"><a class="header-anchor" href="#动画片段-5" aria-hidden="true">#</a> 动画片段</h2>
<h3 id="顺序" tabindex="-1"><a class="header-anchor" href="#顺序" aria-hidden="true">#</a> 顺序</h3>
<p>你可以使用 <code v-pre>data-fragment-index</code> 属性改变元素的动画顺序。</p>
<p>不同元素可以有相同的动画顺序。</p>
<ul>
<li>最后显示</li>
</ul>
<!-- .element: class="fragment" data-fragment-index="3"-->
<ul>
<li>第二个显示</li>
</ul>
<!-- .element: class="fragment" data-fragment-index="2"-->
<!-- list break -->
<ul>
<li>第一个显示</li>
</ul>
<!-- .element: class="fragment" data-fragment-index="1"-->
<ul>
<li>第二个显示</li>
</ul>
<!-- .element: class="fragment" data-fragment-index="2"-->
<hr>
<!-- .slide: data-transition="slide" data-auto-animate -->
<h2 id="渐变" tabindex="-1"><a class="header-anchor" href="#渐变" aria-hidden="true">#</a> 渐变</h2>
<!-- .element: class="r-fit-text" -->
<p>--</p>
<!-- .slide: data-transition="slide" data-auto-animate -->
<h2 id="渐变-1" tabindex="-1"><a class="header-anchor" href="#渐变-1" aria-hidden="true">#</a> 渐变</h2>
<!-- .element: class="r-fit-text" -->
<p>Transition 可以通过配置中的 <code v-pre>transition</code> 选项全局设置,也可以通过在特定幻灯片添加 <code v-pre>data-transition</code> 属性局部设置.</p>
<p>可能的值:</p>
<ul>
<li>none</li>
<li>fade</li>
<li>slide</li>
</ul>
<!-- list break -->
<ul>
<li>convex</li>
<li>concave</li>
<li>zoom</li>
</ul>
<p>--</p>
<!-- .slide: data-auto-animate -->
<h2 id="渐变-2" tabindex="-1"><a class="header-anchor" href="#渐变-2" aria-hidden="true">#</a> 渐变</h2>
<!-- .element: class="r-fit-text" -->
<h3 id="过渡动画" tabindex="-1"><a class="header-anchor" href="#过渡动画" aria-hidden="true">#</a> 过渡动画</h3>
<p>你可以在相邻的幻灯片上添加 <code v-pre>data-auto-animate</code> 使相同的 HTML 元素产生过渡动画效果。</p>
<hr>
<!-- .slide: data-transition="slide" data-auto-animate -->
<h2 id="功能" tabindex="-1"><a class="header-anchor" href="#功能" aria-hidden="true">#</a> 功能</h2>
<!-- .element: class="r-fit-text" -->
<p>--</p>
<!-- .slide: data-transition="slide" data-auto-animate -->
<h2 id="功能-1" tabindex="-1"><a class="header-anchor" href="#功能-1" aria-hidden="true">#</a> 功能</h2>
<!-- .element: class="r-fit-text" -->
<h3 id="代码" tabindex="-1"><a class="header-anchor" href="#代码" aria-hidden="true">#</a> 代码</h3>
<p>通过启用 <code v-pre>highlight</code> 插件,你可以对代码块进行高亮。</p>
<p>你可以使用 <code v-pre>[a-b|c-d]</code> 语法来分布高亮特定行。</p>
<div class="language-javascript line-numbers-mode" data-ext="js"><pre v-pre class="language-javascript"><code><span class="token keyword">let</span> a <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span>
<span class="token keyword">let</span> b <span class="token operator">=</span> <span class="token number">2</span><span class="token punctuation">;</span>
<span class="token keyword">let</span> <span class="token function-variable function">c</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token parameter">x</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token number">1</span> <span class="token operator">+</span> <span class="token number">2</span> <span class="token operator">+</span> x<span class="token punctuation">;</span>
<span class="token function">c</span><span class="token punctuation">(</span><span class="token number">3</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>--</p>
<!-- .slide: data-transition="slide" data-auto-animate -->
<h2 id="功能-2" tabindex="-1"><a class="header-anchor" href="#功能-2" aria-hidden="true">#</a> 功能</h2>
<!-- .element: class="r-fit-text" -->
<h3 id="预览模式" tabindex="-1"><a class="header-anchor" href="#预览模式" aria-hidden="true">#</a> 预览模式</h3>
<p>按下 <code v-pre>Esc</code><code v-pre>O</code> 即可在幻灯片获得焦点时进入预览模式。</p>
<p>--</p>
<!-- .slide: data-transition="slide" data-auto-animate -->
<h2 id="功能-3" tabindex="-1"><a class="header-anchor" href="#功能-3" aria-hidden="true">#</a> 功能</h2>
<!-- .element: class="r-fit-text" -->
<h3 id="全屏模式" tabindex="-1"><a class="header-anchor" href="#全屏模式" aria-hidden="true">#</a> 全屏模式</h3>
<p>按下 <code v-pre>F</code><code v-pre>F11</code> 即可在幻灯片获得焦点时进入全屏模式。</p>
<p>--</p>
<!-- .slide: data-transition="slide" data-auto-animate -->
<h2 id="功能-4" tabindex="-1"><a class="header-anchor" href="#功能-4" aria-hidden="true">#</a> 功能</h2>
<!-- .element: class="r-fit-text" -->
<h3 id="缩放" tabindex="-1"><a class="header-anchor" href="#缩放" aria-hidden="true">#</a> 缩放</h3>
<p>按下 <code v-pre>alt</code> (Linux 上使用 <code v-pre>ctrl</code>) 的同时点击幻灯片的任何元素,即可以向此元素进行放大。</p>
<p>再次点击即可缩小。</p>
<hr>
<!-- .element: class="r-fit-text" -->
<h2 id="结束" tabindex="-1"><a class="header-anchor" href="#结束" aria-hidden="true">#</a> 结束</h2>
<p>@slideend</p>
</div></template>
@import "file:////Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/node_modules/vuepress-theme-hope/templates/palette/palette.scss";
@import "file:////Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/node_modules/vuepress-theme-hope/templates/palette/config.scss";
@import "file:////Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/src/.vuepress/styles/palette.scss";
@import "file:////Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/src/.vuepress/styles/config.scss";
@import "file:////Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/node_modules/vuepress-theme-hope/templates/palette/generator.scss";
@use "sass:meta";
@use "@sass-palette/helper";
@use "@sass-palette/hope-palette";
$palette-variables: meta.module-variables("hope-palette");
@if meta.global-variable-exists("dark-selector", $module: "hope-config") {
@include helper.inject($palette-variables, hope-config.$dark-selector);
} @else {
@include helper.inject($palette-variables);
}
@import "file:////Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/node_modules/vuepress-theme-hope/templates/palette/palette.scss";
@import "file:////Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/src/.vuepress/styles/palette.scss";
@import "file:////Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/node_modules/vuepress-theme-hope/templates/palette/generator.scss";
@forward "file:////Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/src/.vuepress/styles/index.scss";
import "@sass-palette/hope-inject";
export default {};
import { defineClientConfig } from "@vuepress/client";
import { VPLink } from "/Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/node_modules/vuepress-shared/lib/client/index.js";
import { HopeIcon, Layout, NotFound, useScrollPromise, injectDarkmode, setupDarkmode, setupSidebarItems } from "/Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/node_modules/vuepress-theme-hope/lib/bundle/export.js";
import { defineAutoCatalogIconComponent } from "/Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/node_modules/vuepress-plugin-auto-catalog/lib/client/index.js"
import { GlobalEncrypt, LocalEncrypt } from "/Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/node_modules/vuepress-theme-hope/lib/bundle/modules/encrypt/export.js";
import "/Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/node_modules/vuepress-theme-hope/lib/bundle/modules/encrypt/styles/all.scss"
import "/Users/fuzhengwei1/Documents/develop/github/xfg-studio/xfg-resume-blog/node_modules/vuepress-theme-hope/lib/bundle/styles/all.scss";
defineAutoCatalogIconComponent(HopeIcon);
export default defineClientConfig({
enhance: ({ app, router }) => {
const { scrollBehavior } = router.options;
router.options.scrollBehavior = async (...args) => {
await useScrollPromise().wait();
return scrollBehavior(...args);
};
// inject global properties
injectDarkmode(app);
// provide HopeIcon as global component
app.component("HopeIcon", HopeIcon);
// provide VPLink as global component
app.component("VPLink", VPLink);
app.component("GlobalEncrypt", GlobalEncrypt);
app.component("LocalEncrypt", LocalEncrypt);
},
setup: () => {
setupDarkmode();
setupSidebarItems();
},
layouts: {
Layout,
NotFound,
}
});
\ No newline at end of file
$highlighter: "prismjs";
$light-theme: "one-light";
$dark-theme: "one-dark";
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
</head>
<body>
<div id="app"></div>
<script type="module">
import '@vuepress/client/app'
</script>
</body>
</html>
import { defineUserConfig } from "vuepress";
import theme from "./theme.js";
export default defineUserConfig({
dest: "./dev-ops/nginx/html",
base: "/",
lang: "zh-CN",
title: "我的简历",
description: "关于我自己的学习成长经历",
theme,
});
import { navbar } from "vuepress-theme-hope";
export default navbar([
"/",
"/md/resume",
{
text: "开发日志",
icon: "book",
link: "/md/dev-log/day01.md",
},
]);
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 2000 1500"><path fill="#133727" d="M0 0h2000v1500H0z"/><defs><radialGradient id="c" gradientUnits="objectBoundingBox"><stop offset="0" stop-color="#2C7051"/><stop offset="1" stop-color="#133727"/></radialGradient><linearGradient id="a" x1="0" x2="1550" y1="750" y2="750" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#20543c"/><stop offset="1" stop-color="#133727"/></linearGradient><path id="b" fill="url(#a)" d="M1549.2 51.6c-5.4 99.1-20.2 197.6-44.2 293.6-24.1 96-57.4 189.4-99.3 278.6-41.9 89.2-92.4 174.1-150.3 253.3-58 79.2-123.4 152.6-195.1 219-71.7 66.4-149.6 125.8-232.2 177.2-82.7 51.4-170.1 94.7-260.7 129.1-90.6 34.4-184.4 60-279.5 76.3C192.6 1495 96.1 1502 0 1500c96.1-2.1 191.8-13.3 285.4-33.6 93.6-20.2 185-49.5 272.5-87.2 87.6-37.7 171.3-83.8 249.6-137.3 78.4-53.5 151.5-114.5 217.9-181.7 66.5-67.2 126.4-140.7 178.6-218.9 52.3-78.3 96.9-161.4 133-247.9 36.1-86.5 63.8-176.2 82.6-267.6 18.8-91.4 28.6-184.4 29.6-277.4.3-27.6 23.2-48.7 50.8-48.4s49.5 21.8 49.2 49.5c0 .7 0 1.3-.1 2l.1.1z"/><g id="d"><use href="#b" transform="rotate(60) scale(.12)"/><use href="#b" transform="rotate(10) scale(.2)"/><use href="#b" transform="rotate(40) scale(.25)"/><use href="#b" transform="rotate(-20) scale(.3)"/><use href="#b" transform="rotate(-30) scale(.4)"/><use href="#b" transform="rotate(20) scale(.5)"/><use href="#b" transform="rotate(60) scale(.6)"/><use href="#b" transform="rotate(10) scale(.7)"/><use href="#b" transform="rotate(-40) scale(.835)"/><use href="#b" transform="rotate(40) scale(.9)"/><use href="#b" transform="rotate(25) scale(1.05)"/><use href="#b" transform="rotate(8) scale(1.2)"/><use href="#b" transform="rotate(-60) scale(1.333)"/><use href="#b" transform="rotate(-30) scale(1.45)"/><use href="#b" transform="rotate(10) scale(1.6)"/></g></defs><circle r="3000" fill="url(#c)"/><g fill="url(#c)" opacity=".5"><circle r="2000"/><circle r="1800"/><circle r="1700"/><circle r="1651"/><circle r="1450"/><circle r="1250"/><circle r="1175"/><circle r="900"/><circle r="750"/><circle r="500"/><circle r="380"/><circle r="250"/></g><use href="#d" transform="rotate(10)"/><use href="#d" transform="rotate(120)"/><use href="#d" transform="rotate(240)"/><circle r="3000" fill="url(#c)" fill-opacity=".1"/></svg>
\ No newline at end of file
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 2000 1500"><path fill="#9ADBBE" d="M0 0h2000v1500H0z"/><defs><radialGradient id="c" gradientUnits="objectBoundingBox"><stop offset="0" stop-color="#FFF"/><stop offset="1" stop-color="#9ADBBE"/></radialGradient><linearGradient id="a" x1="0" x2="1550" y1="750" y2="750" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#cdeddf"/><stop offset="1" stop-color="#9ADBBE"/></linearGradient><path id="b" fill="url(#a)" d="M1549.2 51.6c-5.4 99.1-20.2 197.6-44.2 293.6-24.1 96-57.4 189.4-99.3 278.6-41.9 89.2-92.4 174.1-150.3 253.3-58 79.2-123.4 152.6-195.1 219-71.7 66.4-149.6 125.8-232.2 177.2-82.7 51.4-170.1 94.7-260.7 129.1-90.6 34.4-184.4 60-279.5 76.3C192.6 1495 96.1 1502 0 1500c96.1-2.1 191.8-13.3 285.4-33.6 93.6-20.2 185-49.5 272.5-87.2 87.6-37.7 171.3-83.8 249.6-137.3 78.4-53.5 151.5-114.5 217.9-181.7 66.5-67.2 126.4-140.7 178.6-218.9 52.3-78.3 96.9-161.4 133-247.9 36.1-86.5 63.8-176.2 82.6-267.6 18.8-91.4 28.6-184.4 29.6-277.4.3-27.6 23.2-48.7 50.8-48.4s49.5 21.8 49.2 49.5c0 .7 0 1.3-.1 2l.1.1z"/><g id="d"><use href="#b" transform="rotate(60) scale(.12)"/><use href="#b" transform="rotate(10) scale(.2)"/><use href="#b" transform="rotate(40) scale(.25)"/><use href="#b" transform="rotate(-20) scale(.3)"/><use href="#b" transform="rotate(-30) scale(.4)"/><use href="#b" transform="rotate(20) scale(.5)"/><use href="#b" transform="rotate(60) scale(.6)"/><use href="#b" transform="rotate(10) scale(.7)"/><use href="#b" transform="rotate(-40) scale(.835)"/><use href="#b" transform="rotate(40) scale(.9)"/><use href="#b" transform="rotate(25) scale(1.05)"/><use href="#b" transform="rotate(8) scale(1.2)"/><use href="#b" transform="rotate(-60) scale(1.333)"/><use href="#b" transform="rotate(-30) scale(1.45)"/><use href="#b" transform="rotate(10) scale(1.6)"/></g></defs><circle r="3000" fill="url(#c)"/><g fill="url(#c)" opacity=".5"><circle r="2000"/><circle r="1800"/><circle r="1700"/><circle r="1651"/><circle r="1450"/><circle r="1250"/><circle r="1175"/><circle r="900"/><circle r="750"/><circle r="500"/><circle r="380"/><circle r="250"/></g><use href="#d" transform="rotate(10)"/><use href="#d" transform="rotate(120)"/><use href="#d" transform="rotate(240)"/><circle r="3000" fill="none"/></svg>
\ No newline at end of file
<svg xmlns="http://www.w3.org/2000/svg" width="1024" height="1024"><defs><linearGradient id="a" x1="311.63" x2="682.213" y1="892.395" y2="892.395" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#d7d8d5"/><stop offset="1" stop-color="#ededee"/></linearGradient><linearGradient id="b" x1="311.765" x2="682.212" y1="823.503" y2="823.503" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#f1edec"/><stop offset="1" stop-color="#ececea"/></linearGradient><linearGradient id="c" x1="392.855" x2="586.024" y1="720.444" y2="720.444" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#d7d8d5"/><stop offset="1" stop-color="#f6f6f9"/></linearGradient><linearGradient id="d" x1="433.894" x2="590.577" y1="732.829" y2="732.829" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#fbfbfb"/><stop offset="1" stop-color="#fbfbfb"/></linearGradient><linearGradient id="e" x1="144.813" x2="749.738" y1="458.081" y2="458.081" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#d7d8d5"/><stop offset="1" stop-color="#f6f6f9"/></linearGradient><linearGradient id="f" x1="224.595" x2="739.673" y1="472.49" y2="472.49" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#8474f9"/><stop offset="1" stop-color="#a298fe"/></linearGradient><linearGradient id="g" x1="570.823" x2="605.748" y1="672.063" y2="672.063" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#7365e0"/><stop offset="1" stop-color="#9180f2"/></linearGradient><linearGradient id="i" x1="570.823" x2="605.748" y1="672.063" y2="672.063" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#7365e0"/><stop offset="1" stop-color="#9180f2"/></linearGradient><linearGradient id="j" x1="567.956" x2="604.653" y1="670.76" y2="670.76" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#7365e0"/><stop offset="1" stop-color="#9180f2"/></linearGradient><linearGradient id="l" x1="567.956" x2="604.653" y1="670.76" y2="670.76" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#7365e0"/><stop offset="1" stop-color="#9180f2"/></linearGradient><linearGradient id="m" x1="649.832" x2="723.193" y1="387.174" y2="387.174" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#7365e0"/><stop offset="1" stop-color="#9180f2"/></linearGradient><linearGradient id="n" x1="497.37" x2="627.068" y1="523.93" y2="523.93" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#7365e0"/><stop offset="1" stop-color="#9180f2"/></linearGradient><linearGradient id="o" x1="634.158" x2="671.665" y1="317.878" y2="317.878" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#7365e0"/><stop offset="1" stop-color="#9180f2"/></linearGradient><linearGradient id="q" x1="634.158" x2="668.136" y1="317.354" y2="317.354" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#7365e0"/><stop offset="1" stop-color="#9180f2"/></linearGradient><linearGradient id="r" x1="634.306" x2="669.068" y1="317.413" y2="317.413" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#7365e0"/><stop offset="1" stop-color="#9180f2"/></linearGradient><linearGradient id="s" x1="635.238" x2="669.942" y1="317.568" y2="317.568" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#7365e0"/><stop offset="1" stop-color="#9180f2"/></linearGradient><linearGradient id="t" x1="636.112" x2="670.777" y1="317.817" y2="317.817" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#7365e0"/><stop offset="1" stop-color="#9180f2"/></linearGradient><linearGradient id="u" x1="636.947" x2="671.582" y1="318.161" y2="318.161" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#7365e0"/><stop offset="1" stop-color="#9180f2"/></linearGradient><linearGradient id="v" x1="637.752" x2="671.665" y1="318.382" y2="318.382" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#7365e0"/><stop offset="1" stop-color="#9180f2"/></linearGradient><linearGradient id="w" x1="424.437" x2="470.852" y1="691.21" y2="691.21" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#7365e0"/><stop offset="1" stop-color="#9180f2"/></linearGradient><linearGradient id="x" x1="409.294" x2="733.378" y1="532.351" y2="532.351" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#8474f9"/><stop offset="1" stop-color="#a298fe"/></linearGradient><linearGradient id="y" x1="528.141" x2="613.767" y1="531.97" y2="531.97" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset=".005" stop-color="#eff0f4"/><stop offset="1" stop-color="#feffff"/></linearGradient><linearGradient id="z" x1="375.464" x2="667.988" y1="488.243" y2="488.243" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#7365e0"/><stop offset="1" stop-color="#9180f2"/></linearGradient><linearGradient id="A" x1="645.82" x2="861.671" y1="748.761" y2="748.761" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#d7d8d5"/><stop offset="1" stop-color="#f6f6f9"/></linearGradient><clipPath id="h"><path d="m605.7 682.3-33.8-19.7c-.4-.2-.7-.5-1.1-.8l33.8 19.7c.4.3.8.5 1.1.8Z"/></clipPath><clipPath id="k"><path d="m568 660 33.8 19.7c1.1.7 2.1 1.3 2.9 1.9l-33.8-19.7c-.8-.6-1.8-1.2-2.9-1.9Z"/></clipPath><clipPath id="p"><path d="m637.8 308.6 33.8 19.7c-1.1-.6-2.3-1-3.7-1.1l-33.8-19.7c1.4.1 2.7.5 3.7 1.1Z"/></clipPath></defs><path fill="#e5ad65" d="m853.5 860.6 4.9.3"/><path fill="url(#a)" d="M682.2 806.5c0 .7-.1 1.5-.4 2.2 0 .1 0 .2-.1.2-.2.7-.6 1.3-1 2-.1.1-.2.2-.2.4-.5.6-1 1.3-1.7 1.9-.4.4-1 .8-1.5 1.1-.4.3-.8.6-1.3.9l-192.8 112c-1.3.7-2.7 1.3-4.2 1.8-.5.2-1.1.3-1.6.5-.7.2-1.4.4-2.1.5-.9.2-1.7.3-2.6.4-.2 0-.4.1-.6.1-1.2.1-2.4.2-3.6.2h-.6c-1.2 0-2.4-.1-3.5-.2-.2 0-.4 0-.5-.1-1.2-.1-2.3-.3-3.4-.6-.2 0-.4-.1-.6-.1l-3-.9c-.2-.1-.4-.1-.5-.2-1.1-.4-2.2-1-3.3-1.5l-134.9-77.9c-4.2-2.4-6.3-5.6-6.3-8.8l-.1 47.5c0 3.2 2.1 6.4 6.3 8.8L453 974.6c1 .6 2 1 3.1 1.5.1 0 .1 0 .2.1.2.1.3.1.5.2.6.2 1.2.5 1.9.6.3.1.7.2 1.1.3.2.1.4.1.6.1.2 0 .4.1.6.1.7.1 1.4.3 2.1.4.3 0 .5.1.8.1.2 0 .4 0 .5.1.3 0 .5.1.8.1.7.1 1.4.1 2.1.1h2.3c.8 0 1.6-.1 2.4-.2h.3c.2 0 .4-.1.6-.1.6-.1 1.2-.1 1.8-.3.3 0 .5-.1.8-.2.7-.1 1.4-.3 2.1-.5.4-.1.8-.2 1.1-.3.2-.1.3-.2.5-.2 1.5-.5 2.9-1.1 4.2-1.8l192.8-112.1c.1-.1.2-.1.3-.2.4-.2.7-.5 1.1-.8.5-.4 1.1-.7 1.5-1.1l.1-.1c.5-.5.9-.9 1.3-1.4.1-.1.1-.2.2-.3.1-.1.2-.2.2-.4.1-.2.3-.4.4-.6l.6-1.2c0-.1 0-.1.1-.2 0-.1 0-.2.1-.2.1-.3.2-.5.2-.8.1-.4.1-.8.1-1.2v-.2l-.2-47.4Z"/><path fill="url(#b)" d="M675.9 797.7c8.4 4.8 8.4 12.7.1 17.5l-192.8 112c-8.3 4.8-21.8 4.8-30.2 0l-134.9-77.9c-8.4-4.8-8.4-12.7-.1-17.5l192.8-112.1c8.3-4.8 21.8-4.8 30.2 0l134.9 78Z"/><path fill="url(#c)" d="M545 554.7s-.1 0 0 0c-.3-.2-.5-.3-.8-.4-.2-.1-.5-.2-.7-.3-.2 0-.3-.1-.5-.1H542.7c-.3 0-.5-.1-.8-.1h-1.4c-.2 0-.4 0-.5.1-.4.1-.8.1-1.2.3-.2 0-.3.1-.5.2-.2 0-.3.1-.5.2s-.4.1-.6.2c-.6.3-1.2.6-1.9.9L406.4 630c-.9.5-1.7 1.1-2.6 1.8-.3.2-.5.5-.8.7-.4.3-.8.7-1.2 1-.2.2-.4.4-.5.6-.2.2-.3.3-.4.5-.2.2-.3.4-.5.5-.4.4-.7.9-1.1 1.3-.1.2-.3.3-.4.5-.1.1-.1.2-.2.3-.1.2-.2.3-.3.5-.3.4-.5.8-.8 1.2-.2.4-.5.8-.7 1.2 0 0 0 .1-.1.1 0 0 0 .1-.1.1-.2.3-.4.6-.5.9l-.6 1.2c-.2.4-.3.7-.5 1.1v.2c-.2.4-.3.8-.5 1.2-.2.4-.3.9-.5 1.3-.1.2-.1.4-.2.6 0 .1-.1.2-.1.3 0 .2-.1.3-.1.5-.1.5-.3 1-.4 1.6-.1.3-.1.6-.2.9 0 .2-.1.3-.1.5s-.1.3-.1.5c-.1.9-.2 1.8-.2 2.6l.6 201c0 4.3 1.5 7.3 4 8.7l41 23.8c-2.4-1.4-4-4.4-4-8.7l-.6-201c0-1 .1-2.1.3-3.1 0-.2.1-.3.1-.5.2-1 .4-2 .7-3 0-.1.1-.2.1-.3.3-1.1.7-2.2 1.2-3.2v-.1c.5-1.1 1-2.1 1.6-3.2 0 0 0-.1.1-.1.6-1 1.2-2 1.9-2.9.1-.1.1-.2.2-.3.6-.8 1.3-1.6 2-2.4.1-.2.3-.3.4-.5.6-.6 1.1-1.1 1.7-1.6.3-.2.5-.5.8-.7.8-.7 1.7-1.3 2.6-1.8l128.9-74.4c.9-.5 1.7-.9 2.5-1.1.2-.1.3-.1.5-.2.8-.2 1.5-.4 2.2-.5h.2c.8-.1 1.5 0 2.2.1h.1c.7.2 1.4.4 2 .7l-41-23.7Z"/><path fill="url(#d)" d="M576.4 579.5c7.5-4.3 13.6-.8 13.7 7.8l.6 201c0 8.6-6.1 19.2-13.6 23.5l-128.9 74.4c-7.5 4.3-13.6.8-13.7-7.8l-.6-201c0-8.6 6.1-19.2 13.6-23.5l128.9-74.4Z"/><path fill="url(#e)" d="M729 79.3c.9-.3 1.8-.7 2.7-.9.6-.2 1.1-.3 1.7-.5l1.5-.3c.7-.1 1.4-.2 2-.3.4 0 .8-.1 1.1-.1.9-.1 1.7-.1 2.5 0h.5c1 .1 1.9.2 2.8.4.2 0 .5.1.7.2l2.1.6c.2.1.4.1.6.2.9.3 1.7.7 2.5 1.2l-41-23.8c-.1 0-.1-.1-.2-.1-.6-.3-1.3-.7-1.9-.9-.1 0-.2-.1-.4-.1-.2-.1-.4-.2-.7-.2-.3-.1-.7-.3-1-.4-.3-.1-.7-.2-1.1-.2-.2-.1-.5-.1-.7-.2-.1 0-.3-.1-.4-.1-.7-.1-1.5-.2-2.3-.3h-2.5c-.2 0-.4 0-.6.1-.4 0-.8.1-1.1.1-.4 0-.7.1-1.1.1-.3 0-.6.1-.9.2l-1.5.3c-.3.1-.6.1-.9.2-.3.1-.6.2-.8.3l-2.7.9c-.3.1-.6.2-1 .3-.2.1-.4.2-.5.3-1.5.7-3.1 1.4-4.7 2.3L182.6 346.5c-1.2.7-2.4 1.5-3.6 2.3-.4.3-.8.5-1.1.8l-2.4 1.8c-.4.3-.9.7-1.3 1.1-.7.6-1.4 1.2-2.1 1.9-.4.4-.8.8-1.3 1.2-.3.2-.5.5-.8.7-.3.3-.5.6-.8.9-.9.9-1.7 1.8-2.5 2.7l-.8.8c-.2.3-.4.5-.7.8l-1.5 1.8c-.3.4-.6.7-.9 1.1-.3.3-.5.7-.8 1.1-.4.5-.7 1-1.1 1.4-.2.3-.5.6-.7 1l-1.2 1.8c-.2.4-.5.7-.7 1.1-.1.1-.2.3-.3.4-.7 1.1-1.3 2.1-2 3.2 0 .1-.1.2-.1.2-.1.2-.3.5-.4.7-.4.8-.9 1.5-1.3 2.3-.2.4-.4.7-.6 1.1-.2.4-.4.8-.6 1.1-.2.3-.3.7-.5 1-.4.9-.8 1.7-1.2 2.6l-.3.6c0 .1 0 .1-.1.2-.5 1.1-1 2.3-1.4 3.4-.1.2-.1.4-.2.6-.2.4-.3.8-.4 1.2l-.6 1.8c-.1.4-.3.9-.4 1.3-.2.5-.3 1-.5 1.6-.1.3-.2.7-.3 1-.2.6-.3 1.1-.4 1.7-.2.6-.3 1.3-.5 1.9-.1.2-.1.5-.2.7-.1.5-.2.9-.2 1.4-.2 1-.4 2-.5 3 0 .3-.1.6-.1.9 0 .3 0 .5-.1.8-.3 2.2-.4 4.4-.4 6.6l1.1 402.8c0 11.9 4.3 20.3 11.1 24.3l41 23.8c-6.8-4-11.1-12.4-11.1-24.3l-1.1-402.8c0-2.2.2-4.4.4-6.6.1-.5.1-1.1.2-1.6.1-1 .3-2 .5-3 .1-.7.3-1.4.4-2.1.1-.6.3-1.3.5-1.9.2-.9.5-1.8.7-2.7.2-.5.3-1 .5-1.6.3-1 .7-2 1-3.1.1-.4.3-.8.4-1.2.5-1.4 1.1-2.8 1.7-4.2.1-.2.2-.4.2-.5.5-1.2 1.1-2.4 1.7-3.6l.6-1.2c.6-1.1 1.2-2.3 1.8-3.4.1-.2.3-.5.4-.7l2.4-3.9c.2-.4.5-.7.7-1.1.6-.9 1.2-1.8 1.9-2.7.4-.5.7-1 1.1-1.5.6-.7 1.1-1.5 1.7-2.2l1.5-1.8c.5-.6 1-1.1 1.5-1.7.8-.9 1.7-1.8 2.5-2.7l1.6-1.6c.4-.4.8-.8 1.3-1.2.7-.6 1.4-1.3 2.2-1.9.4-.4.8-.7 1.3-1.1l2.4-1.8c.4-.3.7-.6 1.1-.8 1.2-.8 2.4-1.6 3.6-2.3l499.3-288c1.6-.9 3.2-1.7 4.7-2.3.5-.3 1-.4 1.5-.6Z"/><path fill="#fdfdfd" d="M722.8 82.2c20.8-12 38-2.3 38 21.7l1.1 402.8c.1 24-16.9 53.5-37.8 65.5L225 860.4c-20.8 12-38 2.3-38-21.7l-1.1-402.8c-.1-24 16.9-53.5 37.8-65.5L722.8 82.2Z"/><path fill="url(#f)" d="M738.7 160.2c-.1-19.5-14-27.5-31-17.7l-45.5 26.2c-.3.1-.5.2-.8.4l-406 234.6c-17 9.8-30.8 33.8-30.8 53.3l.9 327.8c.1 19.5 14 27.5 31 17.7l45.5-26.2c.3-.1.5-.2.8-.4L709 541.4c17-9.8 30.8-33.8 30.8-53.3l-1.1-327.9Z"/><path fill="#fff" fill-opacity=".36" d="M775.1 183.7c-.1-19.5-14-27.5-31-17.7l-45.5 26.2c-.3.1-.5.2-.8.4L291.7 427.2c-17 9.8-30.8 33.8-30.8 53.3l.9 327.8c.1 19.5 14 27.5 31 17.7l45.5-26.2c.3-.1.5-.2.8-.4l406.2-234.5c17-9.8 30.8-33.8 30.8-53.3l-1-327.9Z"/><path fill="url(#g)" d="m605.7 682.3-33.8-19.7c-.4-.2-.7-.5-1.1-.8l33.8 19.7c.4.3.8.5 1.1.8Z"/><g clip-path="url(#h)"><path fill="url(#i)" d="m605.7 682.3-33.8-19.7c-.4-.2-.7-.5-1.1-.8l33.8 19.7c.4.3.8.5 1.1.8"/></g><path fill="url(#j)" d="m568 660 33.8 19.7c1.1.7 2.1 1.3 2.9 1.9l-33.8-19.7c-.8-.6-1.8-1.2-2.9-1.9Z"/><g clip-path="url(#k)"><path fill="url(#l)" d="m604.7 681.5-33.8-19.7c-.8-.6-1.7-1.2-2.9-1.9l33.8 19.7c1.1.7 2.1 1.4 2.9 1.9"/></g><path fill="url(#m)" d="M689.4 374.4c-.1 0-.1 0 0 0-.3-.2-.6-.3-.9-.4-.3-.1-.5-.2-.8-.3H687.4c-.1 0-.3-.1-.4-.1-.3 0-.5-.1-.8-.1h-.8c-.3 0-.6 0-.9.1-.3 0-.6.1-1 .2-.1 0-.2.1-.2.1-.1 0-.2.1-.3.1-.2.1-.5.1-.7.2-.5.2-.9.4-1.4.7l-1.5.8c-1.7 1-3.4 1.8-5.1 2.5-.5.2-1.1.4-1.6.6-1 .4-1.9.7-2.9 1-.6.2-1.3.4-1.9.5-.6.1-1.1.3-1.7.4-.8.1-1.5.3-2.2.3-.4 0-.8.1-1.2.1-1 .1-2 .1-2.9 0h-.3c-1.1-.1-2.1-.2-3.1-.4-.3-.1-.5-.1-.8-.2-.8-.2-1.5-.4-2.3-.7-.2-.1-.5-.2-.7-.3-1-.4-1.9-.8-2.8-1.3l33.8 19.7c.1 0 .2.1.2.1.7.4 1.4.7 2.2 1.1.1.1.3.1.4.1.2.1.5.2.7.3.4.1.8.3 1.2.4.4.1.7.2 1.1.3.3.1.5.1.8.2.2 0 .3.1.5.1.8.1 1.7.2 2.6.3h.4c.8 0 1.6.1 2.4 0 .2 0 .4 0 .6-.1.4 0 .8-.1 1.2-.1.4 0 .9-.1 1.3-.1.3 0 .6-.1.9-.2.6-.1 1.1-.2 1.7-.4.3-.1.7-.1 1-.2l.9-.3c1-.3 1.9-.6 2.9-1 .4-.1.7-.2 1.1-.4l.6-.3c1.7-.7 3.4-1.5 5.1-2.5l1.5-.8c.7-.4 1.4-.7 2.1-.9.1 0 .2-.1.3-.1.7-.2 1.4-.3 2.1-.4.7 0 1.3 0 2 .2h.1c.6.2 1.3.4 1.8.8l-34-19.6Z"/><path fill="url(#n)" d="M626.3 510.5c.1-.9.2-1.9.3-2.8.1-.7.1-1.3.2-2 .2-2.1.3-4.2.2-6.2-.1-17.7-6.3-30.2-16.4-36l-33.8-19.7c10.1 5.9 16.3 18.3 16.4 36 0 2-.1 4.1-.2 6.2 0 .7-.1 1.3-.2 2-.1 1.3-.3 2.7-.5 4-.2 1.5-.5 3-.8 4.5-.2 1-.4 2-.6 3.1-.2 1-.5 1.9-.7 2.9-.3 1.3-.7 2.7-1.1 4-.2.8-.5 1.5-.7 2.3l-1.5 4.5c-.2.6-.4 1.2-.7 1.9-.8 2.1-1.6 4.1-2.5 6.2-.1.2-.2.5-.3.7-.8 1.8-1.7 3.7-2.6 5.5-.3.6-.6 1.1-.9 1.7l-2.7 5.1c-.2.3-.4.6-.5 1-1.1 1.9-2.3 3.9-3.5 5.7-.4.5-.7 1.1-1.1 1.6-.9 1.4-1.8 2.7-2.8 4-.5.7-1 1.4-1.6 2.1-.8 1.1-1.7 2.2-2.5 3.2-.7.9-1.4 1.8-2.2 2.7l-2.1 2.4c-1.2 1.4-2.5 2.7-3.7 4l-2.4 2.4c-.6.6-1.3 1.2-1.9 1.8-1 1-2.1 1.9-3.2 2.8-.6.5-1.3 1.1-1.9 1.6-1.2.9-2.3 1.8-3.5 2.7-.6.4-1.1.8-1.7 1.2-1.8 1.2-3.5 2.4-5.4 3.4-1.7 1-3.5 1.9-5.1 2.7-.4.2-.9.4-1.3.6-.9.4-1.9.8-2.8 1.1-1.3.5-2.7 1-4 1.4-.8.3-1.7.5-2.5.7-.8.2-1.5.3-2.3.5-1 .2-2 .3-3 .5-.6.1-1.1.1-1.7.2-1.2.1-2.4.1-3.6.1h-.8c-1.4-.1-2.8-.3-4.1-.5-.3-.1-.7-.2-1-.2-1.1-.2-2.1-.5-3.1-.9l-.9-.3c-1.3-.5-2.5-1.1-3.7-1.7l33.8 19.7c.1.1.2.1.3.2.9.5 1.8 1 2.8 1.4.2.1.4.1.6.2l.9.3c.5.2 1 .4 1.5.5.5.2 1.1.3 1.6.4.3.1.7.2 1 .2.2 0 .3.1.5.1 1.1.2 2.2.3 3.4.4h1c.9 0 1.8.1 2.7 0 .3 0 .6-.1.9-.1.6 0 1.1-.1 1.7-.2.5-.1 1-.1 1.6-.2.5-.1.9-.2 1.4-.3.8-.1 1.5-.3 2.3-.5.4-.1.8-.1 1.2-.3.4-.1.8-.3 1.3-.4 1.3-.4 2.6-.8 4-1.4.5-.2.9-.3 1.4-.5.5-.2.9-.4 1.4-.6.4-.2.9-.4 1.3-.6 1.7-.8 3.4-1.7 5.1-2.7 1.8-1 3.6-2.2 5.4-3.4.6-.4 1.1-.8 1.7-1.2 1.2-.9 2.4-1.7 3.5-2.7.6-.5 1.3-1.1 1.9-1.6 1.1-.9 2.1-1.8 3.2-2.8.6-.6 1.3-1.2 1.9-1.8.4-.4.8-.7 1.2-1.1.4-.4.8-.9 1.2-1.3 1.3-1.3 2.5-2.6 3.7-4 .4-.4.8-.8 1.2-1.3.3-.4.6-.8.9-1.1.7-.9 1.5-1.8 2.2-2.7.5-.6 1-1.1 1.4-1.7.4-.5.7-1 1.1-1.5.5-.7 1-1.4 1.6-2.1.4-.5.7-1 1.1-1.5.6-.8 1.1-1.7 1.7-2.5.4-.5.7-1.1 1.1-1.6.1-.2.3-.5.5-.7 1-1.6 2-3.1 2.9-4.7.1-.1.1-.2.2-.3.2-.3.4-.6.5-1 .6-1.1 1.3-2.3 1.9-3.4.3-.5.5-1.1.8-1.6.3-.6.6-1.1.9-1.7.2-.5.5-1 .7-1.5.6-1.3 1.2-2.7 1.8-4 .1-.2.2-.5.3-.7 0-.1.1-.1.1-.2.7-1.7 1.4-3.3 2.1-5l.3-.9c.2-.6.4-1.2.7-1.9.3-.8.6-1.7.9-2.5.2-.7.4-1.3.6-2 .2-.8.5-1.5.7-2.3.1-.5.3-.9.4-1.4.2-.9.4-1.7.6-2.6.2-1 .5-1.9.7-2.9.1-.3.2-.7.2-1 .1-.7.2-1.4.4-2.1.3-1.5.6-3 .8-4.5.2-.7.3-1.1.3-1.5Z"/><path fill="url(#o)" d="m637.8 308.6 33.8 19.7c-1.1-.6-2.3-1-3.7-1.1l-33.8-19.7c1.4.1 2.7.5 3.7 1.1Z"/><g clip-path="url(#p)"><path fill="url(#q)" d="m668 327.2-33.8-19.7h.1l33.8 19.7h-.1"/><path fill="url(#r)" d="m668.1 327.2-33.8-19.7c.3 0 .6.1.9.1l33.8 19.7c-.2-.1-.5-.1-.9-.1"/><path fill="url(#s)" d="m669.1 327.3-33.8-19.7c.3.1.6.1.9.2l33.8 19.7c-.3-.1-.6-.2-.9-.2"/><path fill="url(#t)" d="m669.9 327.5-33.8-19.7c.3.1.6.2.8.3l33.8 19.7c-.2-.1-.5-.2-.8-.3"/><path fill="url(#u)" d="M670.8 327.8 637 308.1c.3.1.5.2.8.4l33.8 19.7c-.3-.2-.5-.3-.8-.4"/><path fill="url(#v)" d="m671.6 328.2-33.8-19.7h.1l33.7 19.7"/></g><path fill="url(#w)" d="M466 730.1c0-.1-.1-.2-.1-.3-.2-.6-.4-1.3-.5-2 0-.2-.1-.5-.1-.7-.1-.6-.1-1.3-.1-2v-.7c0-.9.1-1.8.2-2.8 0-.2.1-.3.1-.5.1-.9.3-1.8.6-2.7 0-.1 0-.1.1-.2.3-1.1.7-2.2 1.1-3.3 0-.1.1-.3.2-.6 0-.1.1-.2.1-.4s.1-.3.1-.5c.1-.2.1-.4.2-.6 0-.1.1-.2.1-.4.2-.6.3-1.3.5-2 0-.2.1-.3.1-.5.2-.7.3-1.4.5-2.1 0-.2.1-.4.1-.6 0-.1.1-.3.1-.4.1-.4.2-.8.2-1.2.1-.6.2-1.1.3-1.8.1-.5.2-1.1.3-1.6.1-.6.2-1.2.3-1.9 0-.1 0-.3.1-.4v-.4c.2-1.9.4-3.8.4-5.5 0-13.6-4.9-23.1-12.6-27.6l-33.8-19.7c7.7 4.5 12.5 14 12.6 27.6 0 1.7-.2 3.6-.4 5.5 0 .3-.1.6-.1.9l-.3 1.8c-.1.5-.2 1.1-.3 1.6l-.3 1.8c-.1.5-.2 1.1-.3 1.6 0 .2-.1.4-.1.6-.2.7-.3 1.4-.5 2.1 0 .2-.1.3-.1.5-.2.7-.4 1.4-.5 2 0 .1-.1.2-.1.4-.1.5-.2.9-.3 1.2 0 .1-.1.2-.1.3-.1.3-.2.5-.2.6 0 .1-.1.2-.1.4-.2.4-.3.9-.5 1.3-.2.5-.3 1-.4 1.5v.1c0 .1 0 .1-.1.2-.1.4-.2.9-.3 1.3-.1.5-.2 1-.2 1.5 0 .2-.1.3-.1.5v.2c-.1.9-.2 1.7-.2 2.5v.6c0 .7.1 1.3.1 2 0 .2.1.5.1.7.1.7.3 1.4.5 2 0 .1 0 .2.1.3.2.7.5 1.4.9 2 .1.2.2.3.3.5.3.4.6.9.9 1.2l.4.4c.5.5 1 .9 1.6 1.2l33.8 19.7c-.6-.3-1.1-.8-1.6-1.2l-.4-.4c-.3-.4-.7-.8-.9-1.2-.1-.2-.2-.3-.3-.5-.6-.5-.9-1.1-1.1-1.9Z"/><path fill="#d5e9f4" d="M528.5 550.4c.1-1 .2-2 .4-3 .2-1.1.3-2.2.6-3.2.2-.8.3-1.7.5-2.5.2-.7.3-1.4.5-2.2.3-1 .5-2.1.9-3.1.2-.6.3-1.2.5-1.8.4-1.2.8-2.5 1.3-3.7.1-.4.3-.8.4-1.2.6-1.6 1.2-3.2 1.9-4.7.2-.4.3-.7.5-1.1.6-1.3 1.2-2.5 1.8-3.7.2-.4.4-.9.7-1.3.8-1.5 1.5-2.9 2.4-4.3.1-.1.1-.2.2-.3.9-1.5 1.8-3 2.7-4.4.3-.5.6-.9.9-1.4.7-1 1.4-2 2-2.9.4-.6.8-1.1 1.3-1.7.6-.8 1.2-1.6 1.9-2.4.6-.7 1.2-1.4 1.7-2.1.5-.6 1.1-1.2 1.6-1.8 1-1.1 1.9-2.1 2.9-3.1.6-.6 1.2-1.2 1.7-1.8.5-.4.9-.9 1.4-1.3l2.4-2.1c.5-.4.9-.8 1.4-1.2.9-.7 1.8-1.4 2.6-2l1.2-.9c1.3-.9 2.6-1.8 4-2.5 1.7-1 3.4-1.8 5.1-2.6.6-.2 1.1-.4 1.7-.7 1-.4 2-.7 2.9-1 .7-.2 1.3-.4 2-.5.6-.1 1.2-.3 1.7-.4.8-.1 1.5-.3 2.3-.3.4 0 .8-.1 1.3-.1 1-.1 2.1-.1 3 0h.3c1.1.1 2.2.2 3.2.4.3.1.6.1.8.2.8.2 1.6.4 2.3.7.2.1.5.2.7.3 1 .4 1.9.8 2.9 1.4l-33.8-19.7c-.1 0-.2-.1-.2-.1-.7-.4-1.5-.8-2.2-1.1-.1-.1-.3-.1-.4-.1-.2-.1-.5-.2-.7-.3-.4-.1-.8-.3-1.2-.4l-1.2-.3c-.3-.1-.5-.1-.8-.2-.2 0-.3-.1-.5-.1-.9-.1-1.7-.3-2.6-.3h-.4c-.8 0-1.6-.1-2.5 0-.2 0-.4 0-.6.1-.4 0-.8.1-1.3.1s-.9.1-1.4.1c-.3 0-.6.1-.9.2-.6.1-1.2.2-1.7.4-.4.1-.7.1-1.1.2l-.9.3c-1 .3-2 .6-2.9 1-.4.1-.7.2-1.1.4l-.6.3c-1.7.7-3.4 1.6-5.1 2.6-1.3.8-2.6 1.6-4 2.5l-1.2.9c-.9.6-1.8 1.3-2.6 2-.5.4-1 .8-1.4 1.2l-2.4 2.1c-.5.4-.9.9-1.4 1.3-.3.3-.6.5-.8.8-.3.3-.6.7-.9 1-1 1-2 2-2.9 3.1l-.9.9c-.3.3-.5.6-.7.9-.6.7-1.2 1.4-1.7 2.1-.4.4-.7.9-1.1 1.3-.3.4-.5.7-.8 1.1-.4.6-.8 1.1-1.3 1.7l-.9 1.2-1.2 1.8c-.3.5-.6.9-.9 1.4-.1.2-.3.4-.4.6-.8 1.2-1.5 2.5-2.3 3.7v.1c0 .1-.1.2-.1.3-.6 1.1-1.3 2.2-1.9 3.4-.2.3-.3.6-.5.9-.2.4-.4.9-.7 1.3-.2.5-.5 1-.7 1.5-.4.7-.7 1.5-1 2.3-.2.4-.3.7-.5 1.1-.1.2-.1.3-.2.5-.6 1.3-1.1 2.6-1.6 3.9 0 .1-.1.3-.1.4-.1.4-.3.8-.4 1.1-.3.8-.6 1.7-.9 2.5-.1.4-.2.8-.4 1.2-.2.6-.4 1.2-.5 1.7-.1.5-.3 1-.4 1.4-.2.6-.3 1.1-.4 1.7-.2.7-.4 1.4-.5 2.2-.1.3-.2.7-.2 1l-.3 1.5c-.2 1.1-.4 2.2-.6 3.2-.1.4-.1.7-.2 1.1-.1.6-.1 1.3-.2 1.9 0 .5-.1 1-.1 1.5-.1 1.6-.2 3.1-.2 4.7 0 13.5 4.8 23 12.5 27.4l33.8 19.7c-7.7-4.5-12.5-14-12.5-27.4 0-1.5.1-3.1.2-4.7-.1-.8-.1-1.3 0-1.8Z"/><path fill="url(#x)" d="M728.8 404.2c0 .8 3.8 19.1 4.5 33.1 0 16.1-3.6 38.6-3.6 39.5-2.2 12.3-7.3 22.1-14 25.9l-1.5.9c-22.9 13.2-42 47.2-41.9 73.5 0 9.3 3.6 16.2 3.8 16.5 3 6.8.8 19.9-6.6 30.1l-41.3 50.2c-2.2 2.1-5.2 4.7-8.1 6.4-6.7 3.8-11.8 4.3-15.5 1.3-5.2-3.8-20.7-11.8-34-4.1-12.5 7.2-28.8 33.6-33.9 42.5-4.4 7.6-9.6 13.2-15.5 16.6-2.2 1.3-5.2 3-7.4 2.6l-39.9-2.4c-8.1-.4-11.1-10.6-6.7-21.6.2-.6 3.7-12.3 3.7-20.8-.1-27.2-19.3-38.1-42.2-24.9l-1.5.8c-6.7 3.8-12.6-.4-14.1-9.7 0-.8-3.7-19.1-3.8-35.2 0-15.2 3.6-37.8 3.6-38.6 2.2-11.5 7.3-22 14-25.9 23.6-13.6 42.7-47.6 42.7-73.9 0-9.3-3.6-16.2-3.8-16.5-3.7-6.4-.8-20.8 5.8-30.6l42.7-51c2.2-2.1 5.2-4.7 8.1-6.4 5.9-3.4 11.8-4.3 15.5-.5 5.2 3.8 20.7 10.1 33.3 2.9 12.6-7.3 28-31.5 33.2-40.4 3.7-7.2 8.8-12.7 14.7-16.1 2.2-1.3 5.2-2.1 7.4-2.6l41.4 1.6c8.1.4 11.1 11.4 6.7 22.4-.2.6-3.7 12.3-3.7 20.8.1 27.2 19.4 38.1 42.2 24.9l1.5-.8c6.8-4 12.7.2 14.2 9.5ZM571.1 596.4c31-17.9 56-61.2 55.9-96.9-.1-35.6-25.3-50-56.3-32.1-31 17.9-56 61.2-55.9 96.9.1 35.6 25.3 50 56.3 32.1"/><path fill="url(#y)" d="M570.8 482.7c22.9-13.2 42.9-2.7 43 24.5.1 27.2-19.8 60.7-42.7 73.9-23.6 13.6-42.9 2.7-43-24.5 0-27.2 19.8-60.7 42.7-73.9Z"/><path fill="url(#z)" d="M624.3 326.1c.1 0 .2-.1.4-.1.7-.2 1.3-.3 1.9-.4l41.4 1.6-33.8-19.7-41.4-1.6c-.6.1-1.3.3-1.9.4h-.1c-.1 0-.1.1-.2.1-.9.3-1.9.6-2.8.9-.1 0-.2.1-.3.1 0 0-.1 0-.1.1-.7.3-1.3.6-1.9.9-1.4.8-2.7 1.7-4 2.7-.4.3-.8.7-1.2 1-.6.5-1.2 1-1.8 1.6-.3.3-.6.7-1 1-.2.2-.3.4-.5.5-.2.2-.4.4-.5.6-.5.6-1 1.1-1.4 1.7-.4.5-.8 1.1-1.2 1.6 0 .1-.1.1-.1.2l-.1.1c-.3.4-.5.8-.8 1.2-.3.5-.6 1-.9 1.6-.3.5-.6 1.1-.9 1.6l-.3.6c-.2.3-.4.7-.6 1.1-.4.8-.9 1.6-1.5 2.5-.1.1-.1.2-.2.3-.6 1-1.3 2.1-2 3.2l-.6.9c-.6.9-1.2 1.9-1.9 2.9-.2.2-.3.4-.5.7-.8 1.2-1.7 2.4-2.5 3.7-.1.2-.3.4-.4.6-1.5 2.2-3.1 4.3-4.8 6.5-.2.2-.3.4-.5.6-1.4 1.8-2.8 3.5-4.3 5.2-.2.2-.4.5-.6.7-1.4 1.6-2.7 3-4.1 4.4-.3.3-.6.6-1 .9l-.9.9c-.5.4-1 .9-1.4 1.3-.3.3-.6.5-.9.8l-1.5 1.2c-.2.2-.5.4-.7.6-.8.5-1.5 1-2.2 1.5-1.2.7-2.5 1.3-3.8 1.7-.3.1-.7.2-1 .4-1.3.4-2.6.7-3.9.9h-.3c-1.2.2-2.4.2-3.6.2h-1.3c-.9 0-1.7-.1-2.6-.2-.5-.1-1.1-.1-1.6-.2-.7-.1-1.4-.3-2-.4-.8-.2-1.5-.3-2.2-.5-.5-.1-1.1-.3-1.6-.5l-2.7-.9c-.1 0-.2-.1-.3-.1l-8-4.7s-.1 0-.1-.1c-.3-.2-.5-.3-.8-.4-.1-.1-.3-.1-.4-.1-.1 0-.2-.1-.2-.1-.1 0-.2-.1-.2-.1-.3-.1-.6-.2-.9-.2h-.5c-.2 0-.4-.1-.6-.1h-1.2c-.5 0-.9.1-1.4.1-.1 0-.2.1-.4.1-.5.1-.9.2-1.4.3-.7.2-1.5.5-2.2.8-.1 0-.1 0-.2.1-.1 0-.2.1-.3.2-1 .4-1.9.9-2.9 1.4-2.9 1.7-5.9 4.2-8.1 6.4l-42.7 51c-.2.3-.4.6-.6.8-.3.5-.6.9-.8 1.4-.3.5-.6 1-.8 1.5 0 0 0 .1-.1.1 0 0 0 .1-.1.1-.2.4-.5.9-.7 1.3-.3.6-.5 1.1-.8 1.7-.1.3-.2.5-.3.8-.1.1-.1.3-.2.4l-.3.6c-.3.7-.5 1.4-.7 2-.1.4-.2.7-.3 1.1-.1.2-.1.4-.2.6-.1.2-.1.4-.2.6-.2.9-.5 1.8-.7 2.7 0 .1 0 .3-.1.4-.1.3-.1.7-.2 1-.1.6-.2 1.2-.3 1.7 0 .3 0 .6-.1.9 0 .5-.1 1-.1 1.4v2.2c0 .4 0 .9.1 1.3l.3 2.1c.1.3.1.7.2 1 .3.9.6 1.8 1 2.6.2.4 3.7 7.2 3.8 16.5 0 1.5-.1 3-.2 4.6 0 .5-.1 1-.1 1.4-.1 1-.2 2-.4 3l-.6 3.3c-.2.8-.3 1.6-.5 2.4-.2.7-.4 1.5-.5 2.2-.3 1-.5 2-.8 3l-.6 1.8c-.4 1.1-.7 2.3-1.1 3.4-.2.5-.3 1-.5 1.5-.6 1.6-1.2 3.2-1.9 4.7-.1.1-.1.3-.2.4-.6 1.4-1.3 2.9-2 4.3-.2.4-.5.9-.7 1.3-.6 1.2-1.3 2.4-1.9 3.6-.2.4-.4.7-.6 1.1l-2.7 4.5c-.2.3-.4.7-.7 1-.7 1.1-1.5 2.3-2.3 3.4-.4.5-.8 1.1-1.2 1.6-.6.9-1.3 1.7-2 2.6-.6.7-1.1 1.4-1.7 2-.6.7-1.2 1.3-1.7 2-.9 1-1.8 2-2.8 3-.6.6-1.1 1.2-1.7 1.7-.4.4-.9.8-1.3 1.3-.8.8-1.6 1.5-2.5 2.2-.5.4-.9.8-1.4 1.2-.9.7-1.8 1.4-2.7 2-.4.3-.8.6-1.3.9-1.3.9-2.7 1.8-4 2.6-.7.4-1.5 1-2.2 1.6-.2.2-.4.3-.6.5-.2.2-.4.3-.6.5-.4.4-.8.8-1.2 1.3 0 .1-.1.1-.1.2s-.1.1-.1.2c-.2.3-.4.5-.6.8-.3.4-.6.7-.8 1.1-.2.2-.3.4-.4.7 0 .1-.1.1-.1.2-.1.1-.1.2-.2.3-.3.4-.5.8-.8 1.3-.3.4-.5.9-.8 1.4 0 0 0 .1-.1.1 0 .1-.1.1-.1.2l-.6 1.2c-.3.6-.5 1.2-.8 1.8 0 .1-.1.2-.1.3-.1.1-.1.3-.2.4-.2.4-.4.8-.5 1.3-.3.7-.5 1.5-.8 2.2 0 .1 0 .1-.1.2v.1l-.9 3c-.1.2-.1.4-.1.5-.1.5-.3 1.1-.4 1.6-.1.5-.3 1.1-.4 1.6-.1.5-.2 1-.3 1.4 0 .1 0 .3-.1.7v.3c0 .2-.1.5-.1.8 0 .3-.1.6-.1.9-.1.4-.1.8-.2 1.2-.1.4-.1.8-.2 1.3 0 .3-.1.5-.1.8l-.3 2.1v.4c-.1.9-.2 1.9-.4 2.9 0 .3-.1.7-.1 1-.1.7-.2 1.5-.3 2.2 0 .4-.1.8-.1 1.2l-.3 2.4c0 .4-.1.7-.1 1.1l-.3 3.3v.4l-.3 3.6c0 .4-.1.7-.1 1.1-.1.9-.1 1.7-.2 2.6 0 .4 0 .8-.1 1.3 0 .8-.1 1.7-.1 2.5v1.1c0 1.2-.1 2.3 0 3.4 0 16.1 3.8 34.4 3.8 35.2.4 2.5 1.1 4.6 2.1 6.3 1 1.7 2.2 3 3.6 3.8l33.8 19.7c-2.8-1.6-4.9-5.1-5.7-10.1 0-.8-3.7-19.1-3.8-35.2v-4.5c0-.8.1-1.7.1-2.5 0-.4 0-.8.1-1.2.1-.9.1-1.7.2-2.6 0-.4 0-.7.1-1.1l.3-3.6v-.2c.1-1.2.2-2.3.3-3.5 0-.4.1-.8.1-1.1l.3-2.4c0-.4.1-.8.1-1.2.1-.8.2-1.6.3-2.3 0-.3.1-.6.1-.9.1-1 .3-2 .4-2.9v-.4c.1-.7.2-1.5.3-2.1 0-.2.1-.4.1-.6.1-.6.2-1.1.2-1.6 0-.2 0-.3.1-.4.1-.6.2-1.1.2-1.6 0-.3.1-.5.1-.7v-.4c0-.3.1-.6.1-.7.2-1 .4-2.1.7-3.1.1-.5.3-1.1.4-1.6.3-1.2.7-2.4 1.1-3.6 0-.1 0-.1.1-.2.4-1.2.8-2.3 1.3-3.4.1-.1.1-.3.2-.4.5-1.2 1-2.3 1.6-3.3 0-.1.1-.1.1-.2.6-1.1 1.2-2.1 1.8-3.1 0-.1.1-.1.1-.2.6-.9 1.3-1.8 1.9-2.6 0-.1.1-.1.1-.2.6-.7 1.3-1.4 1.9-2 .2-.2.4-.3.6-.5.7-.6 1.4-1.1 2.2-1.6 1.4-.8 2.7-1.7 4-2.6.4-.3.8-.6 1.3-.9.9-.7 1.8-1.3 2.7-2 .5-.4.9-.8 1.4-1.2.8-.7 1.7-1.4 2.5-2.2.5-.4.9-.8 1.3-1.3.2-.2.5-.4.7-.7.3-.3.7-.7 1-1.1.9-1 1.9-2 2.8-3 .3-.3.5-.6.8-.9.3-.4.6-.8.9-1.1.6-.7 1.1-1.4 1.7-2.1.3-.4.6-.7.9-1.1.4-.5.7-1 1.1-1.5.4-.5.8-1.1 1.2-1.6.2-.3.4-.5.6-.8.6-.8 1.1-1.7 1.7-2.5.2-.3.5-.7.7-1 .1-.1.1-.2.2-.3.8-1.2 1.5-2.5 2.3-3.7.1-.2.2-.3.3-.5.2-.4.4-.7.6-1.1.4-.7.8-1.4 1.2-2.2.2-.5.5-.9.7-1.4.2-.4.5-.9.7-1.4.2-.3.3-.7.5-1l1.5-3.3c.1-.2.1-.3.2-.4 0 0 0-.1.1-.1.6-1.3 1.1-2.6 1.6-3.9.1-.2.2-.5.2-.7.2-.5.3-1 .5-1.5.2-.7.5-1.3.7-2 .2-.5.3-.9.4-1.4l.6-1.8c.1-.4.3-.8.4-1.2.2-.6.3-1.2.4-1.8.2-.7.4-1.5.5-2.2.1-.3.2-.6.2-.9l.3-1.5.6-3.3c0-.3.1-.7.2-1 .1-.7.1-1.3.2-2 0-.5.1-1 .1-1.4.1-1.5.2-3.1.2-4.6 0-9.3-3.6-16.2-3.8-16.5-.4-.7-.8-1.6-1-2.6-.1-.3-.1-.7-.2-1-.1-.7-.3-1.4-.3-2.1 0-.4 0-.9-.1-1.3v-2.2c0-.5.1-.9.1-1.4.1-.9.2-1.8.4-2.7.1-.3.1-.7.2-1 .2-1.2.6-2.5.9-3.7.1-.2.1-.4.2-.6.4-1.3.8-2.5 1.3-3.8.1-.1.1-.3.2-.4.5-1.3 1.1-2.6 1.8-3.9 0 0 0-.1.1-.1.7-1.3 1.5-2.6 2.3-3.8l42.7-51c2.2-2.1 5.2-4.7 8.1-6.4 1-.6 1.9-1 2.9-1.4.2-.1.4-.2.5-.2.7-.3 1.5-.6 2.2-.8.5-.1 1-.2 1.4-.3.1 0 .2-.1.4-.1.5-.1 1.1-.1 1.6-.1h.4c.4 0 .8 0 1.2.1h.3c.2 0 .4.1.6.1l5.9 3.4c.1.1.2.1.3.2l.6.3c.8.4 1.6.8 2.5 1.2.2.1.3.2.5.3.2.1.5.2.8.3.8.3 1.7.6 2.7.9l.9.3c.2.1.4.1.7.2.7.2 1.5.4 2.2.5.5.1.9.2 1.3.3.2 0 .5 0 .7.1.5.1 1.1.1 1.6.2s1 .1 1.5.2H560.2c.9 0 1.8-.1 2.7-.3h.4c1-.1 1.9-.3 2.9-.6l.9-.3c.3-.1.7-.2 1-.3.4-.1.7-.2 1.1-.4.9-.4 1.9-.8 2.8-1.4.7-.4 1.5-.9 2.2-1.5.2-.2.5-.4.7-.6l1.5-1.2c.3-.2.6-.5.9-.8.5-.4 1-.8 1.4-1.3l.9-.9.6-.6c.1-.1.2-.3.4-.4 1.4-1.4 2.8-2.9 4.1-4.4l.2-.2c.1-.1.2-.3.3-.4 1.5-1.7 2.9-3.4 4.3-5.2.1-.1.1-.2.2-.3.1-.1.2-.3.3-.4 1.7-2.2 3.3-4.4 4.8-6.5.1-.1.1-.2.2-.3.1-.1.1-.2.2-.3.9-1.3 1.7-2.5 2.5-3.7.2-.2.3-.5.5-.7.7-1 1.3-2 1.9-2.9.1-.2.2-.3.3-.5.1-.1.2-.3.2-.4.7-1.1 1.4-2.2 2-3.2.1-.1.1-.2.2-.3.5-.9 1-1.7 1.5-2.5.1-.1.2-.2.2-.4.1-.3.3-.5.4-.7.9-1.8 1.9-3.4 3-5l.1-.1c1-1.5 2.1-2.8 3.3-4.1.2-.2.3-.4.5-.5.9-.9 1.8-1.8 2.8-2.6.4-.3.8-.7 1.2-1 1.3-1 2.6-1.9 4-2.7.6-.3 1.3-.7 1.9-.9.1-.1.2-.1.4-.1.3.1 1.3-.2 2.2-.5Z"/><path fill="url(#A)" d="M861.6 679.6c0 .4-.1.7-.1 1.1-.1.3-.1.6-.2.9-.1.3-.2.7-.3 1-.1.3-.2.6-.4.8-.2.4-.3.7-.5 1.1-.1.3-.3.5-.5.7-.2.4-.5.8-.8 1.2-.2.2-.4.5-.5.7-.4.5-.9 1-1.4 1.5l-.6.6c-.3.3-.7.6-1 .9-.3.3-.6.5-.9.7-.4.3-.8.5-1.2.8-.4.3-.8.6-1.3.8l-73.7 42.8c-1.5.9-3.1 1.6-4.7 2.2-.4.2-.9.3-1.3.5-1 .4-2.1.7-3.2 1-1.1.3-2.2.6-3.4.8-1.4.3-2.7.5-4.1.7-.3 0-.7.1-1 .1-1.9.2-3.8.3-5.7.3h-.9c-1.9 0-3.8-.1-5.6-.3-.3 0-.6-.1-.8-.1-1.8-.2-3.7-.5-5.4-.9-.3-.1-.6-.2-1-.2-1.6-.4-3.2-.9-4.7-1.4-.3-.1-.6-.2-.8-.3-1.8-.7-3.6-1.5-5.2-2.4l-74.1-42.8c-6.7-3.9-10-8.9-10-14l-.2 78.3c0 5.1 3.3 10.1 10 14l74.1 42.8c1.5.9 3.2 1.7 4.9 2.4.1 0 .2.1.3.1.3.1.6.2.8.3 1 .4 2 .7 3 1 .5.2 1.1.3 1.7.4.3.1.6.2 1 .2.3.1.6.2.9.2 1.1.2 2.2.4 3.4.6.4.1.8.1 1.2.1.3 0 .6.1.8.1.4 0 .8.1 1.2.1 1.1.1 2.2.2 3.3.2h3.4c1.3 0 2.5-.1 3.8-.3.1 0 .3 0 .4-.1.3 0 .7-.1 1-.1 1-.1 1.9-.2 2.9-.4l1.2-.3c1.2-.2 2.3-.5 3.4-.8.6-.2 1.2-.3 1.8-.4.5-.2.9-.4 1.4-.5.4-.2.9-.3 1.3-.5 1.7-.7 3.3-1.4 4.7-2.2l73.7-42.8c.1-.1.3-.2.4-.2l.9-.6c.4-.3.8-.5 1.2-.8.3-.2.6-.5 1-.8.4-.3.7-.6 1-.9l.2-.2c.1-.1.2-.3.4-.4.5-.5 1-1 1.4-1.5l.3-.3c.1-.1.1-.2.2-.3.3-.4.6-.8.8-1.2.1-.2.2-.3.3-.5 0-.1.1-.2.1-.3.2-.3.3-.7.5-1.1l.3-.6c0-.1 0-.1.1-.2.1-.3.2-.7.3-1 .1-.2.2-.5.2-.7v-.2c.1-.4.1-.7.1-1.1 0-.2.1-.5.1-.7v-.3l.2-78.3c0 .3-.1.6-.1 1Z"/><path fill="#fdfdfd" d="M851.6 664.6c13.3 7.7 13.4 20.1.2 27.8l-73.7 42.8c-13.2 7.7-34.7 7.7-48 0L656 692.4c-13.3-7.7-13.4-20.1-.2-27.8l73.7-42.8c13.2-7.7 34.7-7.7 48 0l74.1 42.8Z"/><path fill="#fdfdfd" d="M851.6 664.6c13.3 7.7 13.4 20.1.2 27.8l-73.7 42.8c-13.2 7.7-34.7 7.7-48 0L656 692.4c-13.3-7.7-13.4-20.1-.2-27.8l73.7-42.8c13.2-7.7 34.7-7.7 48 0l74.1 42.8Z"/></svg>
\ No newline at end of file
<svg xmlns="http://www.w3.org/2000/svg" width="1209" height="1442" fill="none"><path fill="url(#a)" fill-opacity=".6" d="M299.286 3.163c-12.689-7.334-22.952-1.486-22.952 13.115v656.574c0 5.596 3.935 12.416 8.842 15.301l890.004 513.787c4.87 2.82 8.82.54 8.82-5.06V540.311c0-14.591-10.28-32.329-23.01-39.674L299.286 3.163Z"/><path fill="url(#b)" fill-opacity=".8" d="M196.286 72.163c-12.689-7.334-22.952-1.486-22.952 13.115v656.574c0 5.596 3.935 12.416 8.842 15.301l890.004 513.787c4.87 2.82 8.82.54 8.82-5.06V609.311c0-14.591-10.28-32.329-23.01-39.674L196.286 72.163Z"/><path fill="url(#c)" d="M648.783 485.09 121.286 180.509c-12.689-7.333-49.008 2.339-49.008 16.941L70.28 856.198c0 5.596 3.946 12.416 8.853 15.302l893.97 519.41c4.886 2.82 32.898-11.01 32.898-16.6V717.69c0-14.591-10.285-32.329-22.952-39.674L648.783 485.09Z"/><path fill="#fff" d="M976.891 1005.46V727.35c0-14.602-10.285-32.34-22.952-39.685L92.231 190.158c-12.689-7.323-22.952-1.486-22.952 13.115v656.574c0 5.596 3.935 12.427 8.842 15.301L968.18 1389.03c4.875 2.81 8.82.53 8.82-5.06V1088.3" opacity=".4"/><path fill="#fff" d="M612.537 1131.85 125.373 862.58C114.127 856.084 105 838.663 105 823.657V274.85c0-15.007 9.127-21.901 20.373-15.405l487.164 269.284c11.245 6.496 20.373 23.929 20.373 38.936v548.805c0 14.98-9.128 21.88-20.373 15.38Z"/><path fill="url(#d)" fill-opacity=".5" d="M168.074 332.906v153.04c0 6.681 4.858 14.576 10.324 17.612l414.181 244.136 6.68-3.644c2.429-1.215 4.251-4.251 4.251-7.288V588.581c0-6.681-4.859-14.576-10.324-17.612l-411.752-238.67c-4.251-1.822-9.109-1.822-13.36.607Z"/><path fill="url(#e)" d="M137.324 365.12c-5.466-3.037-10.324-.608-10.324 6.073v148.789c0 6.68 4.858 14.575 10.324 17.612l414.788 239.884c5.466 3.037 10.324.608 10.324-6.073V622.616c0-6.68-4.858-14.575-10.324-17.612L137.324 365.12Z"/><path fill="#fff" d="M236.922 473.116c0-4.249 4.619-6.888 8.28-4.73l290.972 171.539a5.24 5.24 0 0 1 2.578 4.512c0 4.051-4.4 6.569-7.892 4.517L239.632 477.85a5.49 5.49 0 0 1-2.71-4.734ZM236.922 510.31c0-4.047 4.4-6.56 7.886-4.505l291.495 171.847a4.976 4.976 0 0 1 2.449 4.287c0 3.848-4.18 6.24-7.497 4.291L239.503 514.818a5.228 5.228 0 0 1-2.581-4.508ZM236.922 547.811c0-4.246 4.619-6.883 8.276-4.723l130.041 76.792a5.242 5.242 0 0 1 2.578 4.515c0 4.052-4.4 6.573-7.896 4.524l-130.287-76.375a5.486 5.486 0 0 1-2.712-4.733Z"/><path fill="url(#f)" d="M205.95 483.544c3.036-2.429 4.858-6.68 4.858-12.146 0-12.753-9.109-29.15-20.648-35.223-10.932-6.681-20.649-1.215-20.649 11.538 0 9.11 4.252 18.827 10.325 26.722-10.932 5.465-18.827 16.397-18.827 29.758v7.895l60.73 35.83v-17.004c.608-17.612-5.465-34.009-15.789-47.37Z"/><path fill="#DFE6FD" d="M241.776 666.065c0-3.85 4.185-6.241 7.501-4.285l263.616 155.411a4.745 4.745 0 0 1 2.335 4.088c0 3.67-3.986 5.951-7.15 4.092L244.23 670.354a4.976 4.976 0 0 1-2.454-4.289ZM241.776 699.763c0-3.666 3.985-5.943 7.144-4.081l264.089 155.691a4.508 4.508 0 0 1 2.219 3.884c0 3.486-3.787 5.653-6.792 3.887L244.114 703.848a4.736 4.736 0 0 1-2.338-4.085ZM241.776 733.738c0-3.848 4.184-6.236 7.497-4.28l117.815 69.572a4.751 4.751 0 0 1 2.336 4.091c0 3.672-3.987 5.956-7.154 4.099l-118.038-69.194a4.971 4.971 0 0 1-2.456-4.288Z"/><path fill="url(#g)" d="M196.715 660.513c2.751-2.201 4.402-6.053 4.402-11.004 0-11.555-8.253-26.41-18.707-31.912-9.904-6.053-18.707-1.101-18.707 10.454 0 8.253 3.851 17.056 9.353 24.209-9.903 4.951-17.056 14.855-17.056 26.96v7.152l55.021 32.462v-15.405c.55-15.956-4.952-30.812-14.306-42.916Z"/><path fill="#DFE6FD" d="M229.776 796.065c0-3.85 4.185-6.241 7.501-4.285l263.616 155.411a4.745 4.745 0 0 1 2.335 4.088c0 3.67-3.986 5.951-7.15 4.092L232.23 800.354a4.976 4.976 0 0 1-2.454-4.289ZM229.776 829.763c0-3.666 3.985-5.943 7.144-4.081l264.089 155.691a4.508 4.508 0 0 1 2.219 3.884c0 3.486-3.787 5.653-6.792 3.887L232.114 833.848a4.736 4.736 0 0 1-2.338-4.085ZM229.776 863.738c0-3.848 4.184-6.236 7.497-4.28l117.815 69.572a4.751 4.751 0 0 1 2.336 4.091c0 3.672-3.987 5.956-7.154 4.099l-118.038-69.194a4.971 4.971 0 0 1-2.456-4.288Z"/><path fill="url(#h)" d="M188.715 790.513c2.751-2.201 4.402-6.053 4.402-11.004 0-11.555-8.253-26.41-18.707-31.912-9.904-6.053-18.707-1.101-18.707 10.454 0 8.253 3.851 17.056 9.353 24.209-9.903 4.951-17.056 14.855-17.056 26.96v7.152l55.021 32.462v-15.405c.55-15.956-4.952-30.812-14.306-42.916Z"/><path fill="url(#i)" d="m916.537 1306.85-240.164-139.27c-11.246-6.5-20.373-23.92-20.373-38.92V897.85c0-15.007 9.127-21.901 20.373-15.405l240.164 139.285c11.245 6.49 20.373 23.93 20.373 38.93v230.81c0 14.98-9.128 21.88-20.373 15.38Z" opacity=".65"/><path fill="#DFE6FD" d="M837.103 1188.93c0 4.38-4.734 7.13-8.538 4.95l-108.491-61.99a6.11 6.11 0 0 1-3.074-5.3c0-4.7 5.094-7.64 9.161-5.28l108.098 62.68a5.706 5.706 0 0 1 2.844 4.94ZM804.602 1202.66c0 4.37-4.721 7.12-8.521 4.95l-54.2-30.85a5.7 5.7 0 0 1-2.881-4.95c0-4.38 4.721-7.12 8.522-4.96l54.199 30.85a5.716 5.716 0 0 1 2.881 4.96Z"/><path fill="#fff" d="m714 1061 35.452 20.23v30.44L714 1091.44V1061ZM770 1093l35.452 20.23v30.44L770 1123.44V1093ZM822.908 1123.89l35.452 20.24v30.43l-35.452-20.23v-30.44ZM806.715 1034.51c2.751-2.2 4.402-6.05 4.402-11 0-11.56-8.253-26.411-18.707-31.913-9.904-6.053-18.707-1.101-18.707 10.453 0 8.25 3.851 17.06 9.353 24.21-9.903 4.95-17.056 14.86-17.056 26.96v7.15l55.021 32.46v-15.4c.55-15.96-4.952-30.81-14.306-42.92ZM916.537 990.851 676.373 851.58C665.127 845.084 656 827.663 656 812.657V581.85c0-15.007 9.127-21.901 20.373-15.405l240.164 139.284c11.245 6.496 20.373 23.929 20.373 38.936v230.806c0 14.982-9.128 21.875-20.373 15.38Z"/><path fill="url(#j)" d="m830.215 815.783-58.374 5.936c-6.926.99-14.841-7.915-14.841-15.83V738.61c0-7.915 8.905-8.904 14.841-1.979l58.374 61.343c6.926 7.915 6.926 16.819 0 17.809l-58.374 5.936c-6.926.99-14.841-7.915-14.841-15.83V738.61c0-7.915 8.905-8.904 14.841-1.979l58.374 61.343c6.926 7.915 6.926 16.819 0 17.809Z"/><path fill="url(#k)" d="M680 621.515c0-7.741 8.417-12.547 15.083-8.612l114.12 67.363a10 10 0 0 1 4.917 8.612v13.308c0 7.695-8.327 12.507-14.994 8.664l-114.12-65.777a10.002 10.002 0 0 1-5.006-8.664v-14.894Z"/><path fill="url(#l)" d="M1001.48 648.032 90.651 119.178C80.908 113.542 73 98.458 73 85.454c0-12.991 7.908-18.96 17.651-13.338L1001.48 600.97c9.75 5.636 17.64 20.72 17.64 33.711 0 13.005-7.91 18.974-17.64 13.351Z"/><path fill="#fff" d="M100.745 108.037c-2.052-4.821-1.504-9.67 1.223-10.83 2.727-1.16 6.601 1.807 8.652 6.628 2.051 4.821 1.504 9.67-1.223 10.83-2.727 1.161-6.601-1.807-8.652-6.628ZM121.922 120.26c-2.052-4.822-1.504-9.67 1.223-10.831 2.727-1.16 6.601 1.808 8.652 6.629 2.051 4.821 1.504 9.67-1.223 10.83-2.727 1.16-6.601-1.807-8.652-6.628ZM143.104 132.494c-2.051-4.821-1.504-9.67 1.223-10.83 2.727-1.161 6.601 1.807 8.652 6.628 2.052 4.821 1.504 9.67-1.223 10.83-2.727 1.161-6.601-1.807-8.652-6.628ZM817.396 525.758 223.813 182.453c-3.414-1.964-6.174-7.253-6.174-11.797 0-4.545 2.76-6.637 6.174-4.673l593.583 343.305c3.414 1.964 6.175 7.253 6.175 11.798.051 4.544-2.709 6.636-6.175 4.672ZM916.935 581.542l-31.76-18.332c-3.402-1.977-6.175-7.253-6.175-11.798 0-4.557 2.773-6.636 6.175-4.672l31.76 18.331c3.414 1.977 6.187 7.254 6.187 11.798 0 4.557-2.773 6.65-6.187 4.673ZM974.279 614.649l-31.747-18.332c-3.402-1.976-6.175-7.253-6.175-11.797 0-4.557 2.773-6.637 6.175-4.673l31.76 18.332c3.415 1.977 6.188 7.253 6.188 11.797-.013 4.558-2.786 6.612-6.201 4.673Z"/><defs><linearGradient id="a" x1="730.174" x2="730.174" y1="336.35" y2="1197.62" gradientUnits="userSpaceOnUse"><stop offset=".02" stop-color="#BFD1FF"/><stop offset="1" stop-color="#fff"/></linearGradient><linearGradient id="b" x1="627.174" x2="627.174" y1="405.35" y2="1266.62" gradientUnits="userSpaceOnUse"><stop offset=".02" stop-color="#BFD1FF"/><stop offset="1" stop-color="#fff"/></linearGradient><linearGradient id="c" x1="539.146" x2="539.146" y1="500.505" y2="1221.33" gradientUnits="userSpaceOnUse"><stop offset=".02" stop-color="#2575F2"/><stop offset="1" stop-color="#6A11C1"/></linearGradient><linearGradient id="d" x1="168.022" x2="603.4" y1="539.289" y2="539.289" gradientUnits="userSpaceOnUse"><stop stop-color="#623FE9"/><stop offset=".168" stop-color="#6D49E8"/><stop offset=".7" stop-color="#8C65E5"/><stop offset="1" stop-color="#976FE4"/></linearGradient><linearGradient id="e" x1="169.87" x2="573.667" y1="333.915" y2="608.791" gradientUnits="userSpaceOnUse"><stop stop-color="#8B87FF"/><stop offset="1" stop-color="#F68BC6"/></linearGradient><linearGradient id="f" x1="161.425" x2="222.264" y1="490.089" y2="490.089" gradientUnits="userSpaceOnUse"><stop stop-color="#E967CD"/><stop offset=".159" stop-color="#EB6FC3"/><stop offset=".429" stop-color="#F086A9"/><stop offset=".772" stop-color="#F8AA7E"/><stop offset="1" stop-color="#FEC55E"/></linearGradient><linearGradient id="g" x1="161.421" x2="229.128" y1="606.999" y2="628.785" gradientUnits="userSpaceOnUse"><stop stop-color="#8B87FF"/><stop offset="1" stop-color="#F68BC6"/></linearGradient><linearGradient id="h" x1="153.421" x2="221.128" y1="736.999" y2="758.785" gradientUnits="userSpaceOnUse"><stop stop-color="#8B87FF"/><stop offset="1" stop-color="#F68BC6"/></linearGradient><linearGradient id="i" x1="715.61" x2="977.416" y1="1353.79" y2="1188.92" gradientUnits="userSpaceOnUse"><stop stop-color="#9CCFF7"/><stop offset="1" stop-color="#2E7FEB"/></linearGradient><linearGradient id="j" x1="757.073" x2="835.741" y1="777.045" y2="777.045" gradientUnits="userSpaceOnUse"><stop stop-color="#E967CD"/><stop offset=".159" stop-color="#EB6FC3"/><stop offset=".429" stop-color="#F086A9"/><stop offset=".772" stop-color="#F8AA7E"/><stop offset="1" stop-color="#FEC55E"/></linearGradient><linearGradient id="k" x1="760.736" x2="781.953" y1="623.159" y2="656.936" gradientUnits="userSpaceOnUse"><stop offset=".02" stop-color="#2575F2"/><stop offset="1" stop-color="#6A11C1"/></linearGradient><linearGradient id="l" x1="861.628" x2="109.549" y1="536.144" y2="111.136" gradientUnits="userSpaceOnUse"><stop offset=".02" stop-color="#2575F2"/><stop offset="1" stop-color="#6A11C1"/></linearGradient></defs></svg>
\ No newline at end of file
<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200" class="icon" viewBox="0 0 1024 1024"><path fill="#FDD7AD" d="M512 0 335.448 88.272l-70.616 35.312-70.624 35.312-176.552 88.28v529.648L512 1024l494.344-247.176V247.176z"/><path fill="#CBB292" d="m759.176 370.76-70.624 35.304-494.344-247.168 70.624-35.312zM512 494.344V1024L17.656 776.824V247.176z"/><path fill="#7F6E5D" d="M1006.344 247.168v529.656L512 1024V494.344l176.552-88.28v70.624l141.24-70.624v-70.616z"/><path fill="#7F5B53" d="M829.792 335.448v70.624L688.56 476.68v-70.624z"/><path fill="#CBB292" d="m829.792 335.448-70.624 35.312-494.344-247.176 70.624-35.312z"/><path fill="#2C3E50" d="m682.52 550.32 157.032-78.512a17.656 17.656 0 0 1 25.552 15.792v9.32a52.96 52.96 0 0 1-29.28 47.376L678.8 622.8a17.656 17.656 0 0 1-25.552-15.792v-9.312a52.96 52.96 0 0 1 29.28-47.376z"/></svg>
\ No newline at end of file
<svg xmlns="http://www.w3.org/2000/svg" width="1024" height="1024"><defs><linearGradient id="a" x1="522.593" x2="522.593" y1="-70.302" y2="-335.937" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#fe5d5a" stop-opacity=".1"/><stop offset=".908" stop-color="#ef1220" stop-opacity=".5"/></linearGradient><linearGradient id="b" x1="107.12" x2="935.038" y1="-373.67" y2="-373.67" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#ff5e59"/><stop offset="1" stop-color="#f01422"/></linearGradient><linearGradient id="c" x1="519.405" x2="519.405" y1="-195.547" y2="-726.816" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#ffe2e2"/><stop offset=".888" stop-color="#ff8e8e"/></linearGradient><linearGradient id="d" x1="191.5" x2="483.9" y1="-564.9" y2="-564.9" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#e92700" stop-opacity=".3"/><stop offset=".013" stop-color="#ef1220" stop-opacity=".2"/></linearGradient><linearGradient id="e" x1="403.502" x2="253.121" y1="-847.32" y2="-586.853" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#ff5e59"/><stop offset=".201" stop-color="#f01422"/></linearGradient><linearGradient id="f" x1="330.485" x2="330.485" y1="-801.787" y2="-625.789" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#ff5e59"/><stop offset=".201" stop-color="#f01422"/></linearGradient><linearGradient id="g" x1="397.351" x2="256.845" y1="-647.231" y2="-890.596" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#ffa6a6"/><stop offset=".908" stop-color="#ff6b5d"/></linearGradient></defs><path fill="url(#a)" d="M501.2 662.3 327.6 763.8c-13.9 8.1-14.2 28.1-.5 36.7l179.1 97.7c10.9 5.9 24.1 5.9 34.9-.1l177-97.9c13.6-8.5 13.4-28.3-.3-36.5l-168.4-101c-14.8-9-33.3-9.1-48.2-.4Z"/><path fill="#f63037" d="m110.2 525.7-3.1 77.6 57.5 18.5L184 519.4Z"/><path fill="url(#b)" d="m476.6 363.5-328 154.6c-21 42.7-55.4 65.4-35.5 103.5 4.2 8 9.4 14.4 15.4 18.1l358.2 195.5c21.8 11.9 48.1 11.8 69.8-.2l354-195.8c27.2-16.9 34.8-90.3 7.3-106.8L573 364.1c-29.7-17.8-66.6-18-96.4-.6Z"/><path fill="url(#c)" d="M476.6 298.7 129.4 501.6c-27.8 16.3-28.4 56.3-1 73.3l358.2 195.5c21.8 11.9 48.1 11.8 69.8-.2l354-195.8c27.2-16.9 26.9-56.6-.6-73.1L573 299.3c-29.7-17.8-66.6-18-96.4-.6Z"/><path fill="#ff8989" fill-opacity=".31" d="m481.2 387.8 39.4 123.4c1.1 3.4 4 6 7.6 6.6l173.4 30.4-33-118.3c-.9-3.3-3.6-5.8-7-6.5l-180.4-35.6ZM327 499.2l40.4 101.1L496.7 525c2.5-1.5 3.7-4.5 2.7-7.3l-36-106.8-127.6 65c-8.6 4.3-12.4 14.4-8.8 23.3ZM523.8 540.5l-140.3 77.2L567.2 659c3.2.7 6.6.1 9.3-1.6l134.6-85-174.7-33.8c-4.3-1-8.7-.3-12.6 1.9Z"/><path fill="url(#d)" d="M483.9 406.1c0 35.46-65.46 64.2-146.2 64.2s-146.2-28.74-146.2-64.2c0-35.46 65.46-64.2 146.2-64.2s146.2 28.74 146.2 64.2Z"/><path fill="url(#e)" d="m254.2 188.4-123 83.1c-1.8 1.3-2.6 3.6-1.8 5.7l39.1 110.6c.6 1.7 2 2.9 3.8 3.2l221.8 40.5c1.3.3 2.7-.1 3.7-.8l131.7-93.6c1.9-1.4 2.6-3.9 1.7-6.1l-49.4-107c-.6-1.5-2.1-2.6-3.7-2.8l-220.3-33.5c-1.3-.2-2.6.1-3.6.7Z"/><path fill="url(#f)" d="m528.6 274.5 3 59.1-205 65.6-177.2-72.7-20-49.2 1.9-54.1Z"/><path fill="url(#g)" d="m250.6 138-112.3 76c-6 4.1-8.5 11.7-6.1 18.5l34.2 96.6c1.9 5.4 6.6 9.3 12.1 10.4l211 38.5c4.3.7 8.6-.2 12.1-2.7l120.5-85.5c6.3-4.4 8.4-12.7 5.3-19.7l-43.1-93.5c-2.2-4.9-6.8-8.3-12.1-9.1L262 135.6c-4-.7-8 .2-11.4 2.4Z"/><path fill="#fff" d="m419.8 252.8-79-11-29-57.7c-3.8-7.6-13.2-10.7-20.8-6.9-7.6 3.8-10.7 13.2-6.9 20.8l26.6 52.9-61.8 42.2c-7.1 4.8-8.9 14.5-4.1 21.5 3 4.4 7.9 6.8 12.8 6.8 3 0 6-.9 8.7-2.7l68-46.4 81.1 11.2c.7.1 1.4.1 2.1.1 7.6 0 14.3-5.6 15.3-13.4 1.4-8.4-4.5-16.2-13-17.4Z"/></svg>
\ No newline at end of file
<svg width="98" height="96" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M48.854 0C21.839 0 0 22 0 49.217c0 21.756 13.993 40.172 33.405 46.69 2.427.49 3.316-1.059 3.316-2.362 0-1.141-.08-5.052-.08-9.127-13.59 2.934-16.42-5.867-16.42-5.867-2.184-5.704-5.42-7.17-5.42-7.17-4.448-3.015.324-3.015.324-3.015 4.934.326 7.523 5.052 7.523 5.052 4.367 7.496 11.404 5.378 14.235 4.074.404-3.178 1.699-5.378 3.074-6.6-10.839-1.141-22.243-5.378-22.243-24.283 0-5.378 1.94-9.778 5.014-13.2-.485-1.222-2.184-6.275.486-13.038 0 0 4.125-1.304 13.426 5.052a46.97 46.97 0 0 1 12.214-1.63c4.125 0 8.33.571 12.213 1.63 9.302-6.356 13.427-5.052 13.427-5.052 2.67 6.763.97 11.816.485 13.038 3.155 3.422 5.015 7.822 5.015 13.2 0 18.905-11.404 23.06-22.324 24.283 1.78 1.548 3.316 4.481 3.316 9.126 0 6.6-.08 11.897-.08 13.526 0 1.304.89 2.853 3.316 2.364 19.412-6.52 33.405-24.935 33.405-46.691C97.707 22 75.788 0 48.854 0z" fill="#24292f"/></svg>
\ No newline at end of file
<svg width="98" height="96" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M48.854 0C21.839 0 0 22 0 49.217c0 21.756 13.993 40.172 33.405 46.69 2.427.49 3.316-1.059 3.316-2.362 0-1.141-.08-5.052-.08-9.127-13.59 2.934-16.42-5.867-16.42-5.867-2.184-5.704-5.42-7.17-5.42-7.17-4.448-3.015.324-3.015.324-3.015 4.934.326 7.523 5.052 7.523 5.052 4.367 7.496 11.404 5.378 14.235 4.074.404-3.178 1.699-5.378 3.074-6.6-10.839-1.141-22.243-5.378-22.243-24.283 0-5.378 1.94-9.778 5.014-13.2-.485-1.222-2.184-6.275.486-13.038 0 0 4.125-1.304 13.426 5.052a46.97 46.97 0 0 1 12.214-1.63c4.125 0 8.33.571 12.213 1.63 9.302-6.356 13.427-5.052 13.427-5.052 2.67 6.763.97 11.816.485 13.038 3.155 3.422 5.015 7.822 5.015 13.2 0 18.905-11.404 23.06-22.324 24.283 1.78 1.548 3.316 4.481 3.316 9.126 0 6.6-.08 11.897-.08 13.526 0 1.304.89 2.853 3.316 2.364 19.412-6.52 33.405-24.935 33.405-46.691C97.707 22 75.788 0 48.854 0z" fill="#fff"/></svg>
\ No newline at end of file
<svg xmlns="http://www.w3.org/2000/svg" width="1165" height="1320"><defs><linearGradient id="b" x1="515.826" x2="515.826" y1="342.35" y2="1203.62" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset=".02" stop-color="#bfd1ff"/><stop offset="1" stop-color="#fff"/></linearGradient><linearGradient id="c" x1="631.319" x2="631.319" y1="428.328" y2="1149.16" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset=".02" stop-color="#2575f2"/><stop offset="1" stop-color="#6a11c1"/></linearGradient><linearGradient id="d" x1="229.649" x2="1083.65" y1="665.309" y2="212.481" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset=".02" stop-color="#2575f2"/><stop offset="1" stop-color="#6a11c1"/></linearGradient><linearGradient id="e" x1="804.918" x2="1066.7" y1="443.308" y2="443.308" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#6dacef"/><stop offset="1" stop-color="#97c9fe"/></linearGradient><linearGradient id="f" x1="804.919" x2="1066.7" y1="672.17" y2="672.17" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#6dacef"/><stop offset="1" stop-color="#97c9fe"/></linearGradient><linearGradient id="g" x1="903.368" x2="1195.93" y1="611.995" y2="529.939" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset=".02" stop-color="#2575f2"/><stop offset="1" stop-color="#b881ff"/></linearGradient><linearGradient id="h" x1="971.638" x2="904.165" y1="462.143" y2="484.252" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#8b87ff"/><stop offset="1" stop-color="#f68bc6"/></linearGradient><linearGradient id="i" x1="913.423" x2="1205.98" y1="842.367" y2="760.305" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset=".02" stop-color="#2575f2"/><stop offset="1" stop-color="#b881ff"/></linearGradient><linearGradient id="j" x1="983.638" x2="916.165" y1="691.143" y2="713.252" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#8b87ff"/><stop offset="1" stop-color="#f68bc6"/></linearGradient><clipPath id="a"><path d="M0 0h1164.22v1320H0Z"/></clipPath></defs><g clip-path="url(#a)"><path fill="url(#b)" d="M946.71 9.16c12.69-7.33 22.96-1.48 22.96 13.12v656.57c0 5.6-3.94 12.42-8.85 15.3l-890 513.79c-4.87 2.82-8.82.54-8.82-5.06V546.31c0-14.59 10.28-32.33 23.01-39.67L946.71 9.16Z"/><path fill="url(#c)" d="m521.68 412.91 527.5-304.58c12.69-7.33 49.01 2.34 49.01 16.94l4 664.75c0 5.6-3.95 12.42-8.86 15.3l-895.97 513.41c-4.88 2.82-32.89-11-32.89-16.6V645.51c0-14.59 10.28-32.33 22.95-39.67l334.26-192.93Z"/><path fill="#fff" fill-opacity=".4" d="M191.62 935.26V657.15c0-14.6 10.28-32.34 22.95-39.68l861.7-497.51c12.69-7.32 22.96-1.49 22.96 13.12v656.57c0 5.6-3.94 12.43-8.85 15.3l-890.06 513.88c-4.87 2.81-8.82.54-8.82-5.06v-295.66"/><path fill="url(#d)" d="M752.17 388.67 191.62 712.31v-54.45c0-14.6 10.28-32.34 22.95-39.68l861.7-497.51c12.69-7.32 22.96-1.47 22.96 13.12v54.45"/><path fill="#fff" d="M240.35 643.75c0 6.09-4.31 13.51-9.61 16.58-5.3 3.07-9.61.62-9.61-5.46s4.3-13.51 9.61-16.57c5.31-3.06 9.61-.63 9.61 5.45ZM265.36 629.32c0 6.08-4.31 13.5-9.61 16.57-5.3 3.08-9.62.62-9.62-5.46s4.31-13.52 9.62-16.58c5.31-3.06 9.61-.62 9.61 5.47ZM290.36 614.88c0 6.1-4.3 13.52-9.61 16.58-5.3 3.06-9.61.61-9.61-5.47 0-6.07 4.3-13.52 9.61-16.58 5.32-3.06 9.61-.62 9.61 5.47Z"/><path fill="url(#e)" fill-opacity=".3" d="M1055.98 282.63c5.92-3.4 10.72-.67 10.72 6.12v157.98c0 6.8-4.8 15.07-10.72 18.49l-240.3 138.76c-5.92 3.42-10.72.68-10.72-6.11V439.89c0-6.79 4.8-15.08 10.72-18.5l240.3-138.76Z"/><path fill="url(#f)" fill-opacity=".3" d="M1055.98 511.5c5.92-3.42 10.72-.68 10.72 6.11v157.98c0 6.79-4.8 15.07-10.72 18.49L815.64 832.89c-5.92 3.41-10.72.68-10.72-6.11V668.79c0-6.79 4.8-15.07 10.72-18.49l240.34-138.8Z"/><path fill="#fff" fill-opacity=".3" d="M691.48 482.85c9.6-5.54 17.37-1.09 17.37 9.9v346.01c0 11-7.77 24.41-17.37 29.95L237.03 1130.3c-9.6 5.54-17.37 1.09-17.37-9.84V774.4c0-11 7.77-24.41 17.37-29.95l454.45-261.6Z"/><path fill="#fff" fill-opacity=".3" d="M752.85 521.9c9.6-5.53 17.37-1.09 17.37 9.9v346.01c0 11-7.77 24.41-17.37 29.95l-454.46 261.6c-9.59 5.53-17.36 1.09-17.36-9.9V813.45c0-11 7.77-24.41 17.36-29.95l454.46-261.6Z"/><path fill="#fff" d="M829.72 558.24c9.59-5.54 17.36-1.09 17.36 9.9v346c0 11-7.77 24.41-17.36 29.95l-454.49 261.6c-9.6 5.54-17.37 1.09-17.37-9.9V849.78c0-11 7.77-24.41 17.37-29.94l454.49-261.6Z"/><path fill="#8b87ff" d="M664.94 786.33c0-4.6-4.98-7.49-8.98-5.21l-23.45 13.39a5.979 5.979 0 0 0-3.02 5.21v16.62c0 4.6 4.97 7.49 8.97 5.21l23.45-13.39a5.988 5.988 0 0 0 3.03-5.21v-16.62ZM611.86 817.22c0-4.61-4.98-7.5-8.98-5.22l-23.45 13.39a6.003 6.003 0 0 0-3.02 5.21v16.62c0 4.61 4.97 7.5 8.97 5.21l23.45-13.38a6.012 6.012 0 0 0 3.03-5.21v-16.62ZM556.03 849.23c0-4.61-4.98-7.5-8.98-5.22L523.6 857.4a6.003 6.003 0 0 0-3.02 5.21v16.62c0 4.61 4.97 7.5 8.97 5.21L553 871.06a6.012 6.012 0 0 0 3.03-5.21v-16.62ZM504.83 878.7c0-4.6-4.97-7.49-8.97-5.21l-23.45 13.39a5.988 5.988 0 0 0-3.03 5.21v16.62c0 4.6 4.97 7.49 8.97 5.21l23.46-13.39a5.979 5.979 0 0 0 3.02-5.21V878.7ZM445.45 913.07c0-4.6-4.96-7.49-8.96-5.22l-23.45 13.33a5.989 5.989 0 0 0-3.04 5.21v16.71c0 4.6 4.97 7.49 8.97 5.21l23.46-13.39a5.979 5.979 0 0 0 3.02-5.21v-16.64Z"/><path fill="#f68bc6" d="M597.9 757.39c0-4.62-5-7.5-9-5.19L413 853.74c-1.86 1.07-3 3.05-3 5.19v22.3c0 4.62 5 7.51 9 5.2l175.9-101.54c1.86-1.07 3-3.05 3-5.2v-22.3Z"/><path fill="#8b87ff" d="M799.9 641.39c0-4.62-5-7.5-9-5.19L615 737.74c-1.86 1.07-3 3.05-3 5.19v22.3c0 4.62 5 7.51 9 5.2l175.9-101.54c1.86-1.07 3-3.05 3-5.2v-22.3Z"/><path fill="#6491fb" d="m655.34 956.56 126.14-72.82c2.18-1.23 3.89-4.57 3.89-7.43 0-2.86-1.74-4.18-3.89-2.94L655.34 946.2c-2.19 1.24-3.88 4.56-3.88 7.42 0 2.87 1.74 4.19 3.88 2.94Z"/><path fill="#94f2b5" d="m579.61 1000.3 53.38-30.81c2.18-1.23 3.88-4.57 3.88-7.43 0-2.86-1.74-4.17-3.88-2.94l-53.38 30.82c-2.19 1.24-3.88 4.56-3.88 7.42-.03 2.88 1.69 4.19 3.88 2.94Z"/><path fill="#ffc99c" d="m541.62 1041.85 156.03-90.12c2.18-1.23 3.89.08 3.89 2.94 0 2.87-1.74 6.2-3.89 7.44l-156.06 90.1c-2.19 1.24-3.9-.08-3.9-2.94.04-2.87 1.78-6.19 3.93-7.42Z"/><path fill="#a69cfb" d="m416.89 1114.43 97.75-56.44c2.19-1.24 3.89.07 3.89 2.94 0 2.86-1.73 6.18-3.89 7.43l-97.75 56.44c-2.19 1.23-3.89-.08-3.89-2.94.02-1.46.39-2.89 1.06-4.18a9.42 9.42 0 0 1 2.83-3.25Z"/><path fill="#ffc99c" d="m614.38 950.84-197.49 113.99c-2.19 1.25-3.89-.08-3.89-2.94.02-1.46.39-2.89 1.06-4.18a9.42 9.42 0 0 1 2.83-3.25l197.45-113.99c2.19-1.24 3.89.07 3.89 2.93a9.365 9.365 0 0 1-1.04 4.18 9.382 9.382 0 0 1-2.81 3.26Z"/><path fill="#f99" d="m740.2 877.6-85.93 49.61c-2.19 1.23-3.89-.08-3.89-2.94 0-2.87 1.74-6.19 3.89-7.43l85.93-49.61c2.18-1.25 3.89.07 3.89 2.94 0 2.86-1.74 6.18-3.89 7.43Z"/><path fill="#94f2b5" d="m497.77 988.19-80.88 46.66c-2.19 1.24-3.89-.08-3.89-2.94.02-1.46.39-2.89 1.06-4.18a9.42 9.42 0 0 1 2.83-3.25l80.88-46.66c2.18-1.24 3.89.08 3.89 2.94a9.486 9.486 0 0 1-1.06 4.18 9.42 9.42 0 0 1-2.83 3.25ZM796.01 815.41l-97.76 56.44c-2.19 1.25-3.88-.08-3.88-2.94s1.74-6.19 3.88-7.43l97.76-56.44c2.19-1.24 3.89.08 3.89 2.94-.04 2.9-1.79 6.17-3.89 7.43Z"/><path fill="#a69cfb" d="m482.65 968.04-65.76 37.95c-2.19 1.24-3.89-.08-3.89-2.94s1.75-6.2 3.89-7.43l65.72-37.95c2.19-1.23 3.88.08 3.88 2.94.04 2.87-1.69 6.23-3.84 7.43Z"/><path fill="#f99" d="m636.3 877.62-128.14 73.97c-2.18 1.24-3.88-.08-3.88-2.94s1.74-6.18 3.88-7.43l128.14-73.97c2.19-1.25 3.88.08 3.88 2.94s-1.74 6.19-3.88 7.43Z"/><path fill="#ffc99c" d="M780.03 794.63 651.91 868.6c-2.19 1.24-3.89-.07-3.89-2.94 0-2.86 1.73-6.18 3.89-7.43l128.12-73.97c2.19-1.24 3.89.08 3.89 2.94a9.352 9.352 0 0 1-1.06 4.18 9.317 9.317 0 0 1-2.83 3.25Z"/><path fill="url(#g)" d="M1143.46 314.77c5.92-3.42 10.72-.68 10.72 6.11v157.98c0 6.79-4.8 15.07-10.72 18.49L903.12 636.16c-5.92 3.41-10.72.68-10.72-6.11V472.06c0-6.8 4.8-15.07 10.72-18.49l240.34-138.8Z"/><path fill="url(#h)" d="M936.34 515.51c-2.75-2.2-4.4-6.05-4.4-11 0-11.56 8.25-26.41 18.71-31.91 9.9-6.06 18.71-1.1 18.71 10.45 0 8.25-3.86 17.06-9.36 24.21 9.91 4.95 17.06 14.86 17.06 26.96v7.15l-55.02 32.46v-15.4c-.55-15.96 4.95-30.81 14.3-42.92Z"/><path fill="#fff" d="M1119.18 408.42c0-3.72-4.05-6.04-7.26-4.14l-114.55 67.5a4.814 4.814 0 0 0-2.37 4.15c0 3.72 4.05 6.03 7.26 4.14l114.55-67.5a4.814 4.814 0 0 0 2.37-4.15ZM1073.03 471.43c0-3.73-4.05-6.04-7.26-4.14l-68.41 40.41a4.81 4.81 0 0 0-2.36 4.14c0 3.73 4.05 6.04 7.26 4.14l68.41-40.41a4.822 4.822 0 0 0 2.36-4.14Z"/><path fill="url(#i)" d="M1153.51 545.17c5.91-3.42 10.72-.68 10.72 6.11v157.95c0 6.79-4.81 15.07-10.72 18.49L913.17 866.53c-5.92 3.41-10.72.68-10.72-6.12V702.42c0-6.8 4.8-15.07 10.72-18.49l240.34-138.76Z"/><path fill="url(#j)" d="M948.34 744.51c-2.75-2.2-4.4-6.05-4.4-11 0-11.56 8.25-26.41 18.71-31.91 9.9-6.06 18.71-1.1 18.71 10.45 0 8.25-3.86 17.06-9.36 24.21 9.91 4.95 17.06 14.86 17.06 26.96v7.15l-55.02 32.46v-15.4c-.55-15.96 4.95-30.81 14.3-42.92Z"/><path fill="#fff" d="M1129.18 640.42c0-3.72-4.05-6.04-7.26-4.14l-114.55 67.5a4.814 4.814 0 0 0-2.37 4.15c0 3.72 4.05 6.04 7.26 4.14l114.55-67.5a4.814 4.814 0 0 0 2.37-4.15ZM1083.03 703.43c0-3.73-4.05-6.04-7.26-4.14l-68.41 40.41a4.822 4.822 0 0 0-2.36 4.14c0 3.73 4.05 6.04 7.26 4.14l68.41-40.41a4.822 4.822 0 0 0 2.36-4.14Z"/></g></svg>
\ No newline at end of file
<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200" class="icon" viewBox="0 0 1536 1024"><path fill="#1296db" d="M1425.067.256H110.933A110.933 110.933 0 0 0 0 110.848v723.627a110.933 110.933 0 0 0 110.933 110.933h1314.39c61.269 0 110.933-49.75 110.677-110.677V110.848A110.933 110.933 0 0 0 1425.067.256z" class="selected" data-spm-anchor-id="a313x.7781069.0.i4"/><path fill="#FFF" d="M664.747 723.797V435.883L517.12 620.373l-147.456-184.49v288l-148.053-67.158V221.781h147.626l147.627 184.576 147.541-184.576h147.627v565.76z"/><path d="M1024 0h426.667A85.333 85.333 0 0 1 1536 85.333v768a85.333 85.333 0 0 1-85.333 85.334H1024V0z" opacity=".1"/><path fill="#FFF" d="m1256.96 731.307-170.667-216.491h113.75V304.64h113.749v210.176h113.835z" opacity=".5"/></svg>
\ No newline at end of file
<svg t="1706580631944" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="15077" width="512" height="512"><path d="M224 960v-16c0-116.57 128.94-176 288-176s288 59.43 288 176v16z" fill="#646464" p-id="15078"></path><path d="M800 968H224a8 8 0 0 1-8-8v-16c0-58.06 30.58-106 88.42-138.68C356.93 775.67 428.71 760 512 760s155.07 15.67 207.58 45.32C777.42 838 808 885.94 808 944v16a8 8 0 0 1-8 8z m-568-16h560v-8c0-102.06-109.91-168-280-168s-280 65.94-280 168z" fill="#222222" p-id="15079"></path><path d="M560 688h-96v80l48 48 48-48v-80z" fill="#FFCEBF" p-id="15080"></path><path d="M512 827.31l-56-56V680h112v91.31z m-40-62.62l40 40 40-40V696h-80z" fill="#222222" p-id="15081"></path><path d="M506.38 349.89L168.75 223.16c-13.54-5.08-13.93-24.08-0.61-29.72l337.63-142.8a15.94 15.94 0 0 1 12.46 0l337.63 142.8c13.32 5.64 12.93 24.64-0.61 29.72L517.62 349.89a16 16 0 0 1-11.24 0z" fill="#646464" p-id="15082"></path><path d="M512 358.91a24 24 0 0 1-8.43-1.53L165.93 230.65a24 24 0 0 1-0.91-44.57L502.65 43.27a24.16 24.16 0 0 1 18.7 0L859 186.08a24 24 0 0 1-0.91 44.57L520.43 357.38a24 24 0 0 1-8.43 1.53z m-2.81-16.51a8 8 0 0 0 5.62 0l337.63-126.73a8 8 0 0 0 0.31-14.86L515.12 58a8.13 8.13 0 0 0-6.24 0L171.25 200.81a8 8 0 0 0 0.31 14.86L509.19 342.4z" fill="#222222" p-id="15083"></path><path d="M287.08 463.69m-57.54 0a57.54 57.54 0 1 0 115.08 0 57.54 57.54 0 1 0-115.08 0Z" fill="#FFCEBF" p-id="15084"></path><path d="M287.08 529.23a65.54 65.54 0 1 1 65.54-65.54 65.61 65.61 0 0 1-65.54 65.54z m0-115.08a49.54 49.54 0 1 0 49.54 49.54 49.6 49.6 0 0 0-49.54-49.54z" fill="#222222" p-id="15085"></path><path d="M736.92 463.69m-57.54 0a57.54 57.54 0 1 0 115.08 0 57.54 57.54 0 1 0-115.08 0Z" fill="#FFCEBF" p-id="15086"></path><path d="M736.92 529.23a65.54 65.54 0 1 1 65.54-65.54 65.62 65.62 0 0 1-65.54 65.54z m0-115.08a49.54 49.54 0 1 0 49.54 49.54 49.6 49.6 0 0 0-49.54-49.54z" fill="#222222" p-id="15087"></path><path d="M741.32 376l0.83 98.82C742.15 610.24 639.11 720 512 720S281.85 610.24 281.85 474.84l0.83-98.82S304 224 512 224s229.32 152 229.32 152z" fill="#FFCEBF" p-id="15088"></path><path d="M512 728c-63.71 0-123.58-26.4-168.58-74.33s-69.57-111.31-69.57-178.83l0.83-99.41 0.08-0.52c0.23-1.64 6-40.69 38.41-80 19-23 43.17-41.33 71.93-54.45C420.71 224.23 463.4 216 512 216s91.29 8.23 126.9 24.47c28.76 13.12 53 31.44 71.93 54.45 32.4 39.3 38.18 78.35 38.41 80l0.08 0.52v0.56l0.83 98.82c0 67.59-24.71 131.1-69.57 178.9S575.71 728 512 728zM290.67 376.69l-0.82 98.21C289.85 605.61 389.5 712 512 712s222.15-106.39 222.15-237.16l-0.82-98.15c-0.75-4.33-7.34-38.56-35.38-72.24C657.93 256.38 595.36 232 512 232s-145.93 24.38-185.95 72.45c-28.05 33.68-34.63 67.91-35.38 72.24z" fill="#222222" p-id="15089"></path><path d="M428.31 440h-11.5a31.39 31.39 0 0 0-60.7 0h-11.49a8 8 0 0 0 0 16h11.49a31.39 31.39 0 0 0 60.7 0h11.5a8 8 0 0 0 0-16zM679.38 440h-11.49a31.39 31.39 0 0 0-60.7 0h-11.5a8 8 0 0 0 0 16h11.5a31.39 31.39 0 0 0 60.7 0h11.49a8 8 0 1 0 0-16z" fill="#222222" p-id="15090"></path><path d="M752.62 406.15C752.62 273.27 656.44 176 512 176s-240.62 97.27-240.62 230.15c0 0 52.31 0 136-62.77-10.46 31.39-20.92 52.31-20.92 52.31s115.08-10.46 240.62-62.77c0 31.39-31.39 52.31-31.39 52.31s41.85 20.92 94.16-31.38c31.38 52.3 62.77 52.3 62.77 52.3z" fill="#644B46" p-id="15091"></path><path d="M752.62 414.15c-1.39 0-32.7-0.57-64.33-47.81-52.42 47.05-94.34 27-96.18 26.05a8 8 0 0 1-0.86-13.82c0.22-0.14 19.32-13.21 25.75-32.92-120.12 47.6-228.69 57.91-229.81 58a8 8 0 0 1-7.88-11.55c0.07-0.14 5.22-10.52 11.82-27.35-72.59 48.78-117.69 49.39-119.75 49.39a8 8 0 0 1-8-8c0-67 24.36-127.66 68.57-170.64a229.21 229.21 0 0 1 78.66-49.71C441.56 174 475.67 168 512 168s70.44 6 101.39 17.8a229.21 229.21 0 0 1 78.66 49.71c44.21 43 68.57 103.59 68.57 170.64a8 8 0 0 1-8 8zM512 184c-133.83 0-228.23 87.22-232.47 213.25 17.38-2.79 61.57-14.15 123.05-60.27a8 8 0 0 1 12.42 8.93c-5.64 16.93-11.25 30.8-15.3 40.15 34.15-4.56 126.5-19.77 224.3-60.52a8 8 0 0 1 11.08 7.38c0 21.41-12.36 38.21-22.39 48.32 14.9 1.31 40.92-2.47 71.5-33.05a8 8 0 0 1 12.52 1.54c18.84 31.41 37.39 42.46 47.71 46.34C739.64 270.67 645.42 184 512 184z" fill="#222222" p-id="15092"></path><path d="M302.76 521.23a36.62 20.92 0 1 0 73.24 0 36.62 20.92 0 1 0-73.24 0Z" fill="#FFA096" p-id="15093"></path><path d="M648 521.23a36.62 20.92 0 1 0 73.24 0 36.62 20.92 0 1 0-73.24 0Z" fill="#FFA096" p-id="15094"></path><path d="M736 192s-32-48-224-48-224 48-224 48l-16 176s48-48 240-48 240 48 240 48z" fill="#505050" p-id="15095"></path><path d="M272 376a7.92 7.92 0 0 1-3.41-0.77 8 8 0 0 1-4.55-8l16-176a8 8 0 0 1 1.31-3.72c1-1.45 10.4-14.51 43.85-27.05C368.56 144.25 431.41 136 512 136s143.44 8.25 186.81 24.51c33.45 12.54 42.88 25.6 43.85 27.05a8 8 0 0 1 1.31 3.72l16 176a8 8 0 0 1-13.63 6.38c-0.06-0.06-12.19-11.47-47-22.76C667.2 340.45 608.57 328 512 328s-155.2 12.45-187.38 22.9c-34.77 11.29-46.9 22.7-47 22.81A7.9 7.9 0 0 1 272 376z m240-64c139.08 0 204.19 25.05 230.5 39.83l-14.24-156.56c-3.2-3.27-13.51-12.1-38.11-20.89C661.57 164.17 607.46 152 512 152s-149.57 12.17-178.15 22.38c-24.6 8.79-34.91 17.62-38.11 20.89L281.5 351.83C307.81 337.05 372.92 312 512 312z m217.44-115.42z" fill="#222222" p-id="15096"></path><path d="M391.7 776.07L511.64 880l120.18-104.18L704 800 511.64 959.64 320 800l71.7-23.93z" fill="#505050" p-id="15097"></path><path d="M511.64 967.64a8 8 0 0 1-5.12-1.86L314.88 806.15a8 8 0 0 1 2.59-13.74l71.7-23.93a8 8 0 0 1 7.77 1.54l114.7 99.39 114.94-99.64a8 8 0 0 1 7.78-1.54l72.18 24.18a8 8 0 0 1 2.57 13.75L516.75 965.79a8 8 0 0 1-5.11 1.85zM336.15 803l175.5 146.19L687.83 803l-54.22-18.17L516.88 886a8 8 0 0 1-10.48 0L389.91 785.1zM856 208h16v240h-16z" fill="#222222" p-id="15098"></path><path d="M848 512h32v176h-32z" fill="#FFBE00" p-id="15099"></path><path d="M880 696h-32a8 8 0 0 1-8-8V512a8 8 0 0 1 8-8h32a8 8 0 0 1 8 8v176a8 8 0 0 1-8 8z m-24-16h16V520h-16z" fill="#222222" p-id="15100"></path><path d="M864 480m-32 0a32 32 0 1 0 64 0 32 32 0 1 0-64 0Z" fill="#FFBE00" p-id="15101"></path><path d="M864 520a40 40 0 1 1 40-40 40 40 0 0 1-40 40z m0-64a24 24 0 1 0 24 24 24 24 0 0 0-24-24z" fill="#222222" p-id="15102"></path><path d="M512 672c45 0 83-29 95.1-68.78 4.14-13.6-6.53-27.22-21.18-27.22H438.08c-14.65 0-25.32 13.62-21.18 27.22C429 643 467 672 512 672z" fill="#FF6242" p-id="15103"></path><path d="M567.08 661.33c0-29.45-24.66-53.33-55.08-53.33s-55.08 23.88-55.08 53.33c0 0 23.08 10.67 55.08 10.67s55.08-10.67 55.08-10.67z" fill="#FFA096" p-id="15104"></path><path d="M610.31 580.18A30.39 30.39 0 0 0 585.92 568H438.08a30.39 30.39 0 0 0-24.39 12.18 28.36 28.36 0 0 0-4.44 25.37c0.5 1.63 1.05 3.24 1.63 4.84a2.35 2.35 0 0 0 0.11 0.35c0.21 0.59 0.45 1.16 0.67 1.74 0.16 0.41 0.31 0.82 0.48 1.23 0.43 1.07 0.88 2.14 1.35 3.2 0.05 0.12 0.1 0.24 0.16 0.36a103.58 103.58 0 0 0 23.44 33.05 106.88 106.88 0 0 0 10.3 8.65 108.06 108.06 0 0 0 60.36 20.95c1.41 0.05 2.83 0.08 4.25 0.08s2.84 0 4.25-0.08A108.06 108.06 0 0 0 576.61 659a105.67 105.67 0 0 0 10.31-8.66 103.66 103.66 0 0 0 23.43-33c0.06-0.12 0.11-0.24 0.16-0.36 0.47-1.06 0.92-2.13 1.35-3.2 0.17-0.41 0.32-0.82 0.48-1.23 0.22-0.58 0.46-1.15 0.67-1.74a2.35 2.35 0 0 0 0.11-0.35c0.58-1.6 1.13-3.21 1.63-4.84a28.36 28.36 0 0 0-4.44-25.44z m-183.77 9.52a14.19 14.19 0 0 1 11.54-5.7h147.84a14.19 14.19 0 0 1 11.54 5.7 12.54 12.54 0 0 1 2 11.19c-0.61 2-1.31 4-2.05 5.88-0.16 0.41-0.32 0.83-0.49 1.24-0.34 0.85-0.7 1.69-1.07 2.52l-0.27 0.62c-13.3 29.36-42.68 49.8-76 52.53h-0.17c-1.06 0.09-2.14 0.15-3.21 0.2h-0.53c-1.23 0-2.47 0.07-3.71 0.07s-2.48 0-3.71-0.07h-0.53c-1.07 0-2.15-0.11-3.21-0.2h-0.17c-33.27-2.73-62.65-23.17-75.95-52.53l-0.27-0.62c-0.37-0.83-0.73-1.67-1.07-2.52-0.17-0.41-0.33-0.83-0.49-1.24-0.74-1.93-1.44-3.89-2.05-5.88a12.54 12.54 0 0 1 2.03-11.19z" fill="#222222" p-id="15105"></path></svg>
\ No newline at end of file
import { sidebar } from "vuepress-theme-hope";
export default sidebar({
"/": [
"",
{
text: "Lottery 项目开发日志",
icon: "laptop-code",
prefix: "md/dev-log/",
children: ["day01.md","day02.md","day03.md","day04.md","day05.md","day06.md","day07~day08.md","day09~day10.md","day11.md","day12.md"],
},
],
});
// you can change config here
$colors: #c0392b, #d35400, #f39c12, #27ae60, #16a085, #2980b9, #8e44ad, #2c3e50,
#7f8c8d !default;
// place your custom styles here
// you can change colors here
$theme-color: #16a085;
$sidebar-width: 20rem;
$sidebar-mobile-width: 16rem;
import { hopeTheme } from "vuepress-theme-hope";
import navbar from "./navbar.js";
import sidebar from "./sidebar.js";
export default hopeTheme({
hostname: "https://vuepress-theme-hope-docs-demo.netlify.app",
author: {
name: "小傅哥",
url: "https://mister-hope.com",
},
iconAssets: "fontawesome-with-brands",
logo: "/logo.svg",
repo: "fuzhengwei/xfg-resume-blog",
docsDir: "src",
// navbar
navbar,
// sidebar
sidebar,
footer: "我的微信:fustack",
displayFooter: true,
encrypt: {
config: {
"/demo/encrypt.html": ["1234"],
},
},
// page meta
metaLocales: {
editLink: "在 GitHub 上编辑此页",
},
plugins: {
// You should generate and use your own comment service
// comment: {
// provider: "Giscus",
// repo: "vuepress-theme-hope/giscus-discussions",
// repoId: "R_kgDOG_Pt2A",
// category: "Announcements",
// categoryId: "DIC_kwDOG_Pt2M4COD69",
// },
// All features are enabled for md, only preserve features you need here
mdEnhance: {
align: true,
attrs: true,
card: true,
// install chart.js before enabling it
// chart: true,
codetabs: true,
demo: true,
// install echarts before enabling it
// echarts: true,
figure: true,
// install flowchart.ts before enabling it
// flowchart: true,
// gfm requires mathjax-full to provide tex support
// gfm: true,
imgLazyload: true,
imgSize: true,
include: true,
// install katex before enabling it
// katex: true,
// install mathjax-full before enabling it
// mathjax: true,
mark: true,
// install mermaid before enabling it
// mermaid: true,
playground: {
presets: ["ts", "vue"],
},
// install reveal.js before enabling it
// revealJs: {
// plugins: ["highlight", "math", "search", "notes", "zoom"],
// },
stylize: [
{
matcher: "Recommended",
replacer: ({ tag }) => {
if (tag === "em")
return {
tag: "Badge",
attrs: { type: "tip" },
content: "Recommended",
};
},
},
],
sub: true,
sup: true,
tabs: true,
vPre: true,
// install @vue/repl before enabling it
// vuePlayground: true,
},
// uncomment these if you want a pwa
// pwa: {
// favicon: "/favicon.ico",
// cacheHTML: true,
// cachePic: true,
// appendBase: true,
// apple: {
// icon: "/assets/icon/apple-icon-152.png",
// statusBarColor: "black",
// },
// msTile: {
// image: "/assets/icon/ms-icon-144.png",
// color: "#ffffff",
// },
// manifest: {
// icons: [
// {
// src: "/assets/icon/chrome-mask-512.png",
// sizes: "512x512",
// purpose: "maskable",
// type: "image/png",
// },
// {
// src: "/assets/icon/chrome-mask-192.png",
// sizes: "192x192",
// purpose: "maskable",
// type: "image/png",
// },
// {
// src: "/assets/icon/chrome-512.png",
// sizes: "512x512",
// type: "image/png",
// },
// {
// src: "/assets/icon/chrome-192.png",
// sizes: "192x192",
// type: "image/png",
// },
// ],
// shortcuts: [
// {
// name: "Demo",
// short_name: "Demo",
// url: "/md/",
// icons: [
// {
// src: "/assets/icon/guide-maskable.png",
// sizes: "192x192",
// purpose: "maskable",
// type: "image/png",
// },
// ],
// },
// ],
// },
// },
},
});
---
home: true
icon: home
title: 主页
heroImage: /logo.svg
bgImage: https://theme-hope-assets.vuejs.press/bg/6-light.svg
bgImageDark: https://theme-hope-assets.vuejs.press/bg/6-dark.svg
bgImageStyle:
background-attachment: fixed
heroText: 我的博客简历
tagline: 您好,我叫小傅哥,毕业于🎓吉林大学。在校期间积累了不错的编程经验,可熟练运用主流分布式技术栈,独立开发项目。
actions:
- text: 查看简历 👣
link: ./md/
type: primary
- text: 我的项目 💐
link: https://openai.gaga.plus/
highlights:
- header:
bgImage: /assets/bg/6-light.svg
bgImageDark: /assets/bg/6-dark.svg
features:
- title: 公众号 - 抽奖系统
icon: comment-dots
details: 23年1月,以DDD领域驱动设计架构,开发完成分布式抽奖系统。运用了全面的分布式技术栈。
link: https://theme-hope.vuejs.press/zh/guide/markdown/others.html#link-check
- title: 手写 MyBatis
icon: box-archive
details: 23年4月,深度学习《手写MyBatis:渐进式源码实践》一书,完整实现了一个 MyBatis ORM 框架。
link: https://theme-hope.vuejs.press/zh/guide/markdown/container.html
- title: OpenAI 应用服务
icon: table-columns
details: 23年8月,学习 OpenAi 技术,学习 OpenAi SDK 开发,完成应用场景的对接使用「涵盖支付对接」。
link: https://theme-hope.vuejs.press/zh/guide/markdown/tabs.html
- title: SpringBoot Stater
icon: table-columns
details: 23年10月,通过对业务项目开发中的学习,对同类共性功能的重复开发,凝练成通用的服务治理组件。
link: https://theme-hope.vuejs.press/zh/guide/markdown/tabs.html
copyright: false
footer: |-
<div class="content"><a href="http://beian.miit.gov.cn" target="_blank">京ICP备1903****号</a> | MIT 协议, 版权所有 © 2023 你的名字,All rights reserved.</div>
---
<br/>
::: tip
个人在大学/实习期间,参与过多次的技术类赛事项目,熟练使用各类技术框架,积累了丰富的开发经验。同时兼具着对技术的喜爱,长期对技术源码进行钻研学习吸收其中的设计精髓。尤其对 MyBatis 源码学习后,开发了一款监控 SQL 慢查询以及优化建议插件。并将此插件发布到了 IDEA Plugin 插件市场,半年获得了3000次下载量,获得了非常好的认可,个人也得到了非常多的成长。地址:http://github.com/xxxx/xxxx
:::
>我是一名热爱技术的Java程序员,自从踏入这个充满挑战与机遇的专业以来,我始终保持着对技术的高度热情和追求。我深信技术的力量可以改变世界,也能够提升个人的专业素养。在日常工作中,我不仅注重个人技能的提升,更致力于跟踪和学习行业内的最新技术动态,如SpringBoot、微服务架构、容器化技术等,以确保自己的技术栈始终保持现代化和竞争力。
\ No newline at end of file
---
title: 开发日志
index: false
icon: laptop-code
category:
- 自我介绍
- 专业技能
- 项目经验
---
- [day01.md](day01.md)
\ No newline at end of file
---
title: Day01
index: false
icon: laptop-code
category:
- 开发笔记
- 学习记录
---
## 任务
- [x] 环境配置
- [x] 搭建项目结构
- [x] 跑通广播模式 RPC 过程调用
## 学习过程
1. 项目整体了解
通过对第一节文档的阅读,了解整个项目的生命周期、所需要的技术以及代码提交规范
2. 搭建项目结构,理解每个模块应该干什么
| 模块 | 作用 |
| ---------------------- | ------------------------------------------------------------ |
| Lottery | 总项目,用来管理整个项目的依赖 |
| lottery-application | 应用层,为用户接口层提供各种应用数据展现支持服务 |
| lottery-common | 定义通用数据,比如统一响应数据、常量、异常、枚举等 |
| lottery-domain | 领域层,核心业务逻辑 |
| lottery-infrastructure | 基础层,为其他各层提供通用技术能力,包括数据库、Redis、ES 等 |
| lottery-interfaces | 用户接口层,存放与前端交互、展现数据相关的代码 |
| lottery-rpc | RPC 接口文件 |
> 注:因为并不了解 DDD 架构,所以每个模块目前只有模糊的概念,具体的东西在后续代码编写中进行体会
3. 阅读 [210801_xfg_initProject](https://gitcode.net/KnowledgePlanet/Lottery/-/tree/210801_xfg_initProject) 分支上的 POM 文件
通过对 POM 文件的阅读,更加清楚的了解这个项目所使用的技术,并且通过阅读发现项目没有添加 Lombok 来简化开发,具体项目开发是否使用这个插件我不知道,但是我想用,因为我**懒**,所以就给加上了😄
4. 跑通 RPC
1. 定义 response 状态码枚举供通用返回对象 Result 进行使用
2. 定义通用返回对象 Result 类
3. 定义 activity 表的持久化对象
4. 定义 activity 表的 Mapper 接口
5. 定义 mybatis 配置文件
6. 定义 activity 表的 mapper.xml 文件
7. 定义 rpc 的数据传输对象(DTO) ActivityDto
8. 定义 rpc 的 请求对象 ActivityReq
9. 定义 rpc 的响应对象 ActivityRes
10. 定义 rpc 接口 IActivityBooth
11. 实现 IActivityBooth 接口
12. 编写启动类
13. 编写配置文件 application.yml
14. 编写测试模块 **这个我是直接加在工程里面的,教程是单独开了一个项目**
## 遇到的问题
1. 代码分层不清晰,不知道每个模块应该干什么事
这个问题该怎么解决呢?我觉得最好的解决办法就是不解决,哈哈哈,因为当初学 MVC 的时候最开始也不清楚为什么要这样分层,为什么就要分 Controller、Service 和 DAO,但是后来经过大量代码的编写,也逐渐熟悉了这样的分层架构,所以现在并不想解决这个问题,具体还是靠后面的代码进行了解和熟悉吧
2. JSON.toJSonString() 方法返回了空 `{}`
问题出现原因,忘了加 `@Data` 注解,导致没有 `getter/setter` 就导致了这个问题,加上注解即可
解决!
3. 数据库乱码问题
测试模块 RPC 远程调用返回的结果为:
```json
测试结果:{"activity":{"activityDesc":"?????????","activityId":100002,"activityName":"????","beginDateTime":1705215282000,"endDateTime":1705215282000,"stockCount":100,"takeCount":10},"result":{"code":"0000","info":"成功"}}
```
明显的乱码问题,查看数据库,发现插入的时候就以及乱码了,看了一下配置文件中的数据库连接 url,发现使用了 useUnicode=true,并没有指定字符集,所以添加一下 utf-8 字符集即可,完整 url: `jdbc:mysql://127.0.0.1:3306/lottery?useUnicode=true&characterEncoding=UTF-8`
再进行一轮测试,测试结果:
```json
测试结果:{"activity":{"activityDesc":"仅用于插入数据测试","activityId":100003,"activityName":"测试活动","beginDateTime":1705218054000,"endDateTime":1705218054000,"stockCount":100,"takeCount":10},"result":{"code":"0000","info":"成功"}}
```
解决!
## 总结
今天干了说明呢?
1. 配置环境
2. 跑通 RPC
具体怎么跑通 RPC 的呢?
1. 在 common 模块创建通用类
2. 在 infrastructure 模块创建 dao 接口以及和数据库相对应的 po 类
3. 在 rpc 模块下创建 RPC 通信接口以及对应的请求和响应的封装类
4. 然后在 interfaces 模块下实现 rpc 模块的接口,在这里调用 Mapper 进行增删改查
5. 然后就写配置呗,SpringBoot 配置、Dubbo 配置、MyBatis 配置
学到了什么呢?
1. 由于之前学习一直使用的是 MVC 架构,并且命名不太规范,所以对于包的命名现在很不适应,比如什么dto、vo啥的各种 o 不太熟悉,这个就不准备纠结了,准备靠代码量进行熟悉
2. 对每个模块有了大概的了解,至少知道了接口写在哪个模块,接口实现类在哪个模块以及 Mapper 写在哪
3. 现在在我眼中,这个 interfaces 模块,就跟以前学的 Dubbo 的服务提供者一样吧?因为这个模块用来实现接口的,所以就会引用其他模块,要调用其他模块的东西就要添加依赖,所以这个模块起起来之后,就带动了所有模块,整个项目也就 run 起来了
第一天,脑子还有点迷糊,因为基础不太牢固,所以有些小 bug 花费了挺长时间的,但是至少是跑起来了吧?也还行,路虽远,行则将至嘛,虽然年后要找实习,但是还是慌不得,慢慢来,一口吃不成个大胖子,准备晚上再补一补 Dubbo 基础
---
title: Day02
index: false
icon: laptop-code
category:
- 开发笔记
- 学习记录
---
## 任务
- [x] 表设计
- [x] 抽奖领域模块开发
## 学习过程
1. 查询分库分表相关知识点,了解到垂直和水平分库分表,主要是为了解决数据量过大导致 MySQL 查询慢、单体容量过大问题
2. 开始写代码
1. 编写基础的持久化对象 (PO)
2. 编写 Mapper 接口
3. 编写对应的 Mapper.xml
4. 设计抽奖策略顶级接口,主要是入参出参,如何封装,要封装哪些数据
5. 编写顶级接口的基础实现,实现里面公用的方法,比如把初始化方法、哈希计算的方法以及判断是否初始化完成
6. 编写两种算法的实现
7. 算法单元测试
## 遇到的问题
1. 为什么在设计阶段就考虑分库分表等问题
在之前的学习过程中,并没有项目环境的支撑,导致了这个问题,一个大的项目,如果要兼顾性能以及代码的可扩展性,那么在数据库设计阶段就应该想到这些,那些是热点数据,那些数据会进行大量的插入,没有全局把控的观念,只有了解这些,才能设计出一个性能良好且代码可维护性高的项目,这个需要项目积累,这是一个很重要的东西,以后在学习的时候一定要多注意这方面,多看看别人的数据库是怎么设计的,以及为什么要这么设计,要有全局把控的观念
2. 抽奖算法是怎么实现的呢
首先这个初始化的时候,传入奖品和对应的概率,然后概率乘以 100,就是对应的下标范围,一个奖品一个范围,是不会重复的,然后经过斐波那契哈希散列算法,将这个对应的下标进行加工,使其均匀的分布在数组中,在对下标进行加工的过程中,确保了无论传入什么数字,都会在 0 ~ 128 的范围内
1. SingleRateRandomDrawAlgorithm
这种策略是生成一个 1 ~ 100 的随机数,然后经过 hashIdx 计算对应的下标,然后去上面初始化好的数组中去取奖品
2. DefaultRateRandomDrawAlgorithm
这是一种必中奖策略,先排除掉不在抽奖范围内的奖品ID,然后生成随机数,然后判断这个随机数是否在指定的范围内,如果不在,那么这个奖品就没中,然后看下一个奖品,重新生成随机数,然后看是否在指定的中奖概率内加上上次生成的随机数范围内
## 总结
今天主要把抽奖算法给搞定了,虽然代码不多,但是很难理解,最开始都搞不清楚为什么这样子就实现了抽奖算法,不懂这个概率是如何保证的,然后 debug 了好久,发现其实就是一个 128 长度的数组,然后经过哈希散列排列,保证随机的均匀性,其实这 128 长度的数组就已经保证了抽奖的概率,假设不经过哈希算法,直接放进去,假设两个的抽奖概率是 0.1 和 0.2,那么放进去的时候就是下标 1~10 全是第一个奖品,下标 11 ~ 30 全是第二个奖品,随机数生成的是 1 ~ 100,那么第一个奖品也就是有 10 个数字能中奖,那不就是 10% 的中奖概率了么,加哈希散列只是为了均匀分布,增加随机性和公平性
收获:
1. 对 DDD 有更深的了解,知道什么类该写在什么包下,比昨天更清楚代码该如何组织了
2. 了解了分库分表,虽然是第一次接触,但是至少知道了为什么要分库分表,随着项目的进行,就会学会如何分库分表了吧
3. 了解了 Hash 散列算法,后续看看源码,要搞清楚底层是如何运作的
因为 它太大了无法显示 source diff 。你可以改为 查看blob
---
title: Day04
index: false
icon: laptop-code
category:
- 开发笔记
- 学习记录
---
### 任务
- [x] 简单工厂搭建发奖领域
### 学习过程
1. 表结构变了,先导入 SQL,然后该对应的 PO 类,然后改一下 Mapper 文件
2. 先把包结构建好
1. 新建一个领域包,负责发奖
2. 领域包内建三个子包,model 实体封装包、repository 提供仓储服务、service 提供具体的服务(重点内容)
3. 看一下代码的继承关系
4. debug 看一下代码执行流程,了解其中的调用关系
1. 先执行抽奖,返回抽奖结果
2. 对抽奖结果进行判断,如果是未中奖,直接返回
3. 中奖了就保存用户信息以及订单信息
4. 根据中奖结果中的奖品类型获取对应的服务
5. 然后把第三步保存的用户信息以及订单信息传进去,做一个发奖的操作
6. 然后返回发奖结果
## 遇到的问题
今天还没遇到啥问题,代码比较简单,主要是数据库字段规范之后,好多 Mapper 要改 T.T,最开始我还在纠结要不要当初建表的时候就改了
**就很气,本来能学两小节的,md,电脑被亲戚孩子给整挂了,直接开不了机了,麻了,修电脑都修了两小时,系统还重装了,又重装环境**
## 总结
1. 越来越喜欢 DDD 架构这种包的组织方式了,虽然包很多,看着有点复杂,但是真的理解了之后,就感觉很干净,扩展性也很好,虽然目前还没完全搞清楚 DDD
2. 学会了工厂模式,根据奖品类型,从工厂里面拿对应的实现类进行发奖操作
\ No newline at end of file
---
title: Day05
index: false
icon: laptop-code
category:
- 开发笔记
- 学习记录
---
## 任务
- [x] 活动领域的配置与状态
## 学习过程
1. 包结构变化,调整对应的包
2. 了解活动创建的整个流程,然后将流程进行编排(其实就是落库的步骤呗),写对应的 repository 层代码
1. 首先明确要做哪些操作
1. 添加活动
2. 添加奖品
3. 添加活动配置
4. 添加策略
5. 添加策略明细
2. 编写对应的 repository 接口和实现类
3.
3. debug 了解状态模式如何进行的状态判断(感觉不用刻意去学这个设计模式,通过对项目的学习,从而达到状态模式的学习,**后期进行设计模式的统一学习**
1. 首先定义一个状态处理的接口,入参统一是活动ID和当前状态
2. 定义一个活动状态抽象类,这个抽象类的子类用来判断某种状态是否可以流转
3. 编写抽象类的实现,里面定义是否可以流转
4. 编写状态配置类,把每一种活动状态抽象类的实现注入进去并放入 Map 中,供状态处理服务使用
5. 编写状态处理接口的实现类
1. 先从状态配置中获取当前状态所对应的活动状态流转实现类
2. 然后实现类调用方法,通过方法的返回值来确定是否能进行操作
1. 如果能进行变更的,先进行落库操作,然后根据 MyBatis 返回值返回对应信息
2. 如果不能进行变更的,直接返回对应的错误信息
## 遇到的问题
1. 为什么要使用 `BeanUtils.copyProperties()`
因为原来很少使用这种方法,以前都是 new 对象,然后把传进来的对象手动一个一个赋值,对这个方法不太了解,简单来说就是实现对象的拷贝,属性名相同的就进行拷贝,属性名不相同的就不进行操作,底层使用反射,首先把读写权限都设置为 true,然后再进行获取和赋值操作,这种操作是 **浅拷贝**
```java
if (!Modifier.isPublic(readMethod.getDeclaringClass().getModifiers())) {
readMethod.setAccessible(true);
}
Object value = readMethod.invoke(source);
if (!Modifier.isPublic(writeMethod.getDeclaringClass().getModifiers())) {
writeMethod.setAccessible(true);
}
writeMethod.invoke(target, value);
```
2. 数据库 bug `### Error updating database. Cause: java.sql.SQLException: Incorrect string value: '\xE4\xB8\x80\xE7\xAD\x89...' for column 'award_name' at row 1`
中文插入乱码问题,我建数据库的时候设置了 utf8,但是建表的时候默认没有设置成 `utf8`,使用的编码是 `latin1`,所以需要修改字段的编码为 `utf8`
## 总结
1. 包结果的变化
1. 首先呢这个解决了我之前的一个疑问:为啥要把数据库的真实操作写到领域层呢?这不应该写到基础服务层更符合逻辑吗?
2. 更改详情:基础服务模块引入领域模块,在领域层写 repository 接口,在基础服务层写实现
2. 状态流程处理
相对于普通的 if-else 处理流程,状态模式设计模式把状态的流转转化为方法,从而简化了 if-else 一坨接着一坨的形式,如果有新的状态,只需要添加对应的抽象实现以及在其他实现中添加对应的流转方法
*后期对设计模式进行统一的学习,目前只了解了基础的程序运行流程,根据流程来了解对应的设计模式,目前对于状态模式的了解仅限于以下两点*
1. 将一种状态的流转包装成一个类,然后在类里面定义是否可以流转
2. 状态的流转通过调用方法的形式进行,而不是通过 if-else 去判断,比如要把状态修改为审核通过,那么直接调用 `checkPass()` 然后找到当前状态处理类,调用处理类的 `checkPass()` 方法,然后返回结果就可以了
3. 对于学习的思考
最近陷入了日夜颠倒的死循环,主要就是晚上窝在床上玩手机呢,然后看了会儿星球就想起床学习,一学又搞到两三点三四点,搞不好 bug 多还通了个宵,导致第二天甚至第三天状态低迷,后面要压制学习欲望了,每天该做的做完了就休息,以后每周日休息一天,晚上一点前就睡觉,避免陷入死循环,再多的任务,人的精力也是有限的,只要按部就班稳扎稳打,相信最后也会有收获,不必急于求成
\ No newline at end of file
---
title: Day06
index: false
icon: laptop-code
category:
- 开发笔记
- 学习记录
---
### 任务
- [x] ID 生成策略开发
### 学习过程
1. 先看视频了解用到了啥
2. 看小傅哥策略模式的[文章](https://mp.weixin.qq.com/s/zOFLtSFVrYEyTuihzwgKYw)
3. 看代码结构
1. 定义一个接口,用来生成 id
2. 实现接口,实现不同的 id 生成算法
3. 定义一个上下文对象,包装各种 id 生成算法,然后放到 Spring 容器中供其他类注入使用
今天的代码比较简单,主要就是涉及策略模式的使用,这里的上下文对象和之前的 config 类似,都是把写好的实现类进行包装,统一放到一个容器内,然后其他类通过这个容器,配合枚举拿到对应的实现类进行调用
4. 实操
### 遇到的问题
1. 什么是雪花算法
2. 项目代码中的雪花算法为什么要这么写
### 总结
1. 对策略模式的新看法
现在对策略模式的看法如下:
1. 将每一种策略想象成一个又一个的工具类
2. 这些工具类都来自同一个接口,也就是实现的功能是类似的,比如都是生成 ID,都是用来发奖的
3. 把这些工具类进行 “打包” 处理,封装在一个 Map 中,键使用枚举进行处理
4. 后续使用通过注入封装好的 Map 和枚举直接进行 get 操作然后使用就可以了
好处:
减少 if else 的次数,如果以后要进行扩展,只需要添加一个接口实现,然后在 "打包" 里添加一种策略就可以了,易于扩展,避免代码过度耦合,把一坨代码进行分片,功能职责划分更清楚,并且可以动态切换算法:将实现类进行更改就可以实现动态切换
2. 什么是雪花算法
雪花算法用于生成分布式唯一 ID,核心思想如下:
1. 将一个64位的整数划分为不同的部分,每一部分代表不同的含义
2. 符号位(1位):始终为 0,表示生成的 ID 为正整数
3. 时间戳(41位):记录生成 ID 的时间戳,精确到毫秒级,41位可以表示约 69 年的时间
4. 工作机器 ID(10位):标识机器的唯一ID,用于解决分布式系统中的多节点生成 ID 的冲突问题,最多有 2^10 台机器 ,即 1024 个
5. 序列号(12位):表示同一毫秒内的序列号,用于解决同一节点在同一毫秒内生成 ID 的冲突问题,最多可以用 2 的 12 次方个 ID,也就是同一毫秒内同一机器最多生成 4096 个
通俗化:确保在分布式系统中,通过对时间戳、机器和序列号进行加工,生成一个唯一 ID
了解了这个东西就能理解项目中为啥要这么写了,后面看看雪花算法的具体源码,看看每个部分如何进行加工的
3. 短码生成的时候进行打乱和再加工
因为没有实际项目经验之前就是直接拿当前时间戳进行获取的,没有进行打乱操作,以后要记住这个操作,避免项目数据被别人抓个包一下子就猜出来了 -.- 好歹穿件衣服,不能裸奔
4. 预习预习明天的内容,哈哈哈,好像要开始上强度了,昨天亲戚结婚忙了一天,半夜才回来,今天就到这把,查点资料预习预习明天的,感觉 DDD 这种包组织方式特别适合每种设计模式和算法的落地,MVC 如果想要算法和设计模式落地的话,感觉要考虑的东西很多很多,要么就是牵一发而动全身,要么就是落地之后包里面有很多的多余的东西,这种方式则不会出现这种情况,一个领域里面,使用一种设计模式,并不会影响其他的包,其他的包只管调用所提供的接口就好了
\ No newline at end of file
---
title: Day07 ~ Day08
index: false
icon: laptop-code
category:
- 开发笔记
- 学习记录
---
### 任务
- [x] 分库分表组件
### 遇到的问题
问题就不说了,这一章节全是问题 T.T,基础不牢,地动山摇啊!!!
### 总结
首先建立一个大局观,要实现一个分库分表组件,那么先要学会如何编写 SpringBoot Starter,然后这个 Starter 需要实现的功能是分库分表,那么一定是有多个数据源,这个数据源从项目的 yml 配置文件传进来,然后就要实现多数据源的切换,然后分表操作就是要修改 SQL 的表名,所以需要做的事情大概是如下:
1. 读取数据源信息
2. 动态修改数据源
3. 动态修改 SQL
那么细节该如何实现呢?需要想几个问题,某条数据应该分到哪个库的哪个表呢?这个库表信息该存到哪里进行共享呢?如何动态修改数据源呢?如何动态修改 SQL 呢?那么就需要对应的技术进行支持:
1. Spring & SpringBoot 基础框架,提供依赖注入、配置管理功能
2. `AbstractRoutingDataSource ` 实现动态数据源的路由逻辑
3. `AspectJ` 切面编程,运行时动态拦截方法调用
4. 反射 API,从方法参数中提取路由键的值
5. 正则表达式,解析和修改 SQL
6. ThreadLocal,存储路由信息,以支持动态数据源路由
总体执行流程:
1. 调用被 `@DBRouter` 注解的方法
2. 然后被切面进行拦截,拦截之后先进行路由计算,然后把计算结果保存到 ThreadLocal 中
3. 然后 DynamicDataSource 通过保存到 ThreadLocal 中的数据确定使用哪一个数据源
4. 然后 MyBatis 插件修改 SQL 中的表字段
5. 然后数据库操作执行完成
6. 切面清理 ThreadLocal 里面的数据
7. 方法执行完成,返回结果
虽然步骤不多,但是稍不注意就会出现小 bug,抑或扰动函数算法出错,抑或解析 yml 配置出错等等诸多问题,也是花了两三天才大致搞明白这个路由组件,因为这里面的东西大部分之前都没接触过,查阅了许多文档,毕竟之前连切面都不怎么用,最多也就是拿来做全局日志处理
总之,要先在大脑里面理清总体的一个执行流程,然后根据这个流程再去看代码要清晰很多,最开始的时候没理清步骤,直接看的代码,那种感觉就像第一天学 DDD 一样,直接一脸懵逼,怎么这么多包,卧槽,第一遍下来大概只学到了百分之五十吧,这一遍大概只学到了整体架构,具体的细节还没掌握,下一次努力啃啃细节,如果要我写整个这一套代码,我肯定写出来会报很多错,但是第一次就想学透整个路程怎么可能呢?好在这一次理清了整体架构,至少有了头绪,不至于开不了头,有了头绪,到处搜一搜,拼拼凑凑也能写,哈哈哈
\ No newline at end of file
---
title: Day09 ~ Day10
index: false
icon: laptop-code
category:
- 开发笔记
- 学习记录
---
### 任务
- [x] 在应用层编排抽奖过程
### 总结
有了前面的模板模式的基础,这一章节相对来说比较容易,自己实现的时候也没有什么大问题,大体流程就是写接口,编排流程,然后写实现类,然后写 Mapper,至于为什么花了两三天,这就不得不说上一章的分库分表了,没写过 SpringBoot Starter,没写过 MyBatis 插件,对 AOP 没有深刻的理解,纯硬啃下来的,但是记不太劳,所以晚上睡不着觉,总感觉缺点什么东西,就花了两天干了如下几件事:
1. 新建一个空的 SpringBoot 项目,从 `SpringApplication.run()` 方法开始 debug,一步一步看,在这一个过程中主要学到了如下几点:
- 一个 SpringBoot 项目是如何初始化的,在哪里创建的容器等等
- 如何加载第三方 Starter 的
- ~~在哪里打印的Banner 以及如何设置~~ 这个不是重点,哈哈哈,但是挺好玩的
- 还有 `ApplicationRunner``CommandLineRunner`
- 还有异常报告器 `exceptionReporters`
- 还有几个关于上下文环境的重要方法 `prepareContext()``refreshContext()``afterRefresh()`
明白了 SpringBoot 应用初始化流程就知道所写的分录分表路由 starter 是在哪个阶段进行数据源设置以及为什么要在 `AutoConfig` 类下进行 Bean 的注入了
2. 看了看 MyBatis 插件相关的文档,大致了解了一个 MyBatis 插件如何编写,看了这个以后看 MyBatis-Plus 源码的时候可能会轻松一点
3. 复习了一下 AOP,注解的属性有哪些以及该怎么写都有点忘了
4. 在这个 debug 的过程中其实画了一些图,但是因为没有 OSS,所以图片不太好展示,所以使用 vuepress + github pages + github actions 搭建了一个博客,后面有空了会把看源码的过程发上去
虽然很想继续往下学,但是感觉这个项目里面,分库分表这一章节应该是灵魂所在了,虽然还没学后面,但是感觉其他章节更多的是关注业务层面,主要是来解决业务问题的,但是分库分表这一章节感觉能彻彻底底搞明白的话收获应该是很大的,虽然进度慢了,但是通过对源码的阅读也学到了很多东西,比如代码规范,在阅读 SpringBoot 源码的时候,给我最大的感觉就是,其实好的东西是不需要太多注释的,因为他每一步所调用的方法都给你写的很明白,比如 SpringBoot 程序初始化过程,只要英文够好,就跟看~~小学阅读一样~~,不知道花的这两天值不值,毕竟还有一个月就找工作了,是不是应该快点把项目做完
\ No newline at end of file
---
title: Day011
index: false
icon: laptop-code
category:
- 开发笔记
- 学习记录
---
### 任务
- [x] 在应用层编排抽奖过程
### 总结
今天的内容比较简单,最主要的问题就是表改了,然后花了很多时间去改对应的 PO 以及 SQL,然后今天第一次开发 application 层,感觉就是把 domain 层各个领域进行组装,然后形成一个又一个的流程,在这里面会使用 MQ 把流程进行切片,之后写门面接口应该就是调 application 层里面各个流程了,这样对于 Controller 层感觉挺好的,只需要简单的封装一下前端传进来的参数,然后调用 application 层执行各个流程就可以了
感觉今天最大的收获就在于学到了在开发的过程中要把整个流程切分一下,分成一块一块的,然后用 MQ 进行后续的操作,用户不需要感知到这一切,他只需要点进去,然后执行一个小的片段,然后剩下的操作可以使用 MQ 来慢慢操作,而不是之前那样直接单线程一个流程写完,又臭又长,返回得还慢,用户体验很不好,学到了流程切片,今天不亏,哈哈哈哈,这个东西还是很有用的
\ No newline at end of file
---
title: Day012
index: false
icon: laptop-code
category:
- 开发笔记
- 学习记录
---
### 任务
- [x] 规则引擎量化人群参与活动
## 总结
首先先去了解了一下组合模式和决策树,然后看了看数据库,其实就是把一个类似于二叉树的结构存到了数据库里,分别对应了三个东西,一个表用来保存决策树的树根信息,然后一个表用来保存树上的所有节点的信息,然后一个表用来存决策树的连接信息,我们可以通过树根的 ID 拿到所有相关的连线信息以及所有相关的节点信息,明白了数据库相关的东西之后屡屡代码结构
什么是组合模式呢?先看看维基百科对组合模式的定义,然后直接看代码,给我的第一感觉就是把每一个 if-else 的条件抽取出来,然后变成一个又一个的 filter,然后在规则引擎中进行使用,首先把一个个 filter 包装到 map 中,供子类使用
其中最重要的代码我觉得是这个:
```java
protected TreeNodeVO engineDecisionMaker(TreeRuleRich treeRuleRich, DecisionMatterReq matterReq) {
TreeRootVO treeRoot = treeRuleRich.getTreeRoot();
Map<Long, TreeNodeVO> treeNodeMap = treeRuleRich.getTreeNodeMap();
Long rootNodeId = treeRoot.getTreeRootNodeId();
TreeNodeVO treeNodeInfo = treeNodeMap.get(rootNodeId);
while (Constants.NodeType.STEM.equals(treeNodeInfo.getNodeType())) {
String ruleKey = treeNodeInfo.getRuleKey();
LogicFilter logicFilter = logicFilterMap.get(ruleKey);
String matterValue = logicFilter.matterValue(matterReq);
Long nextNode = logicFilter.filter(matterValue, treeNodeInfo.getTreeNodeLineInfoList());
treeNodeInfo = treeNodeMap.get(nextNode);
}
return treeNodeInfo;
}
```
1. 获取树根节点信息
2. 获取树根所对应的所有节点信息
3. 判断每个节点是不是叶子节点
1. 如果不是,就执行决策,如果通过就返回下一个节点
2. 如果是叶子节点,也就是找到了对应的活动号,表示可以参与
那么就可以将代码结构分为两个部分,一个是决策者,提供决策相关逻辑,一个是执行者,对决策链条进行链路执行,然后返回最终结果,那么到这里应该代码逻辑就清晰了,决策者根据一定的比较规则,返回 ture 或者 false,执行者根据这个结果来判断是否要继续进行下一个判断,直到判断到叶子节点
了解了这个之后代码就好写了
感觉这个章节最大的难点就在于如果之前没有设计模式基础的话,会很难受,代码跳过去跳过来有时候找不到方向,一般我遇到这种情况的时候我就会梳理一下业务逻辑,代码结构无论怎么变,也一定是根据业务逻辑来的,之前做的事情一样不少,所以就按照自己想的逻辑去代码中找对应,去看看哪里做的比较,哪里拿到的链路结构,这样就将大问题化成了小问题,然后去对应代码中的每一个部分,这里也就是将逻辑执行步骤进行“打散”的过程,找到了每段代码对应那一段逻辑之后,看一看代码的继承体系,大概也就了解个七七八八了
\ No newline at end of file
---
title: 个人简历
index: false
icon: laptop-code
category:
- 自我介绍
- 专业技能
- 项目经验
---
## 个人信息
- 姓名
- 电话
- 邮箱
- 毕业时间
- 工作时间
- Github:https://github.com/fuzhengwei
- 开源项目:[vo2dto](https://bugstack.cn/md/product/idea-plugin/vo2dto.html) - IDEA Plugin 自动转换对象插件,5.4k 下载使用
## 毕业院校
- 时间、院校、专业、学位
- 荣誉、成绩
## 专业技能
- 熟练掌握 Java 核心知识、JUC、HashMap、斐波那契散列等,具备良好的面向对象编程思想。
- 熟练掌握 Java 设计模式,如工厂、代理、组合、策略等设计模式,并善用设计原则构建可复用代码。
- 熟练使用 IDEA、Eclipse、Visual Studio Code、Navicat、PostMan、Git、Maven、SVN 等开发工具。
- 深入理解 JVM 底层原理,熟悉 JVM 各类垃圾收集器的使用及核心参数的调优,具备一定的 JVM 调优能力。
- `深入学习 Spring 核心流程模块,如IOC、AOP、依赖倒置等,掌握Spring解决复杂场景所需的分治、抽象和知识(设计模式、设计原则),能从核心原理上解决Spring场景问题。同时,具备基于 Spring 开发 SpringBoot Starter 的技能,减少研发成本,为复杂项目提供通用技术组件。`
- `深入学习 MyBatis 核心流程模块,包括会话、反射、代理、事务和插件,熟练掌握 ORM 框架的设计思想、实现方式和应用价值。并根据需求结合 MyBatis 插件机制,开发企业所需的功能,如数据分页、数据库表路由、监控日志和数据安全等。`
- 深入理解 Spring Boot,Spring Cloud 等微服务框架的设计原理及底层架构,熟悉各种微服务架构设计比如服务注册与发现,服务降级,限流,熔断,服务网关路由设计,服务安全认证架构。
- 熟悉 Dubbo、Zookeeper 等分布式服务协调与治理等技术。
- 熟练掌握 MySql,掌握 MySQL 主从同步,读写分离技术以及集群的搭建,具备一定的 SQL 调优能力。
- 深入理解 Redis 线程模型,熟练掌握 Redis 的核心数据结构的使用场景,熟悉各种缓存高并发的使用场景,比如缓存雪崩,缓存穿透等。
- 熟练掌握分布式场景中的常见的技术问题及解决,比如分布式锁,分布式事务,分布式 session,分布式任务调度。
- 熟悉 RabbitMQ、Kafka 等常用的消息中间件进行消息的异步数据处理。
- 了解分布式搜索引擎 ElasticSearch,并能基于 ELK+Kafka 搭建分布式日志收集系统,以及 x-pack-jdbc 的扩展使用。
- 熟悉 docker 常用命令,能够实现基于 docker+Jenkins 实现自动化部署
- 掌握 Linux 常用命令,了解 Nginx 服务器的反向代理、负载均衡、动静分离等。
- 熟练运用 DDD 四层架构领域驱动设计,构建出易于迭代和维护的工程架构,遵守整洁代码、洋葱架构设计思想。
## 工作经历【在校生无】
- 公司
- 岗位
- 时间
- 职责【可选】
- 成绩【可选】
## 项目经验
### 1. 营销活动平台 - Lottery 微服务抽奖系统
- 系统架构:以 DDD 领域驱动设计开发,微服务拆分的分布式系统架构
- 核心技术:SpringBoot、MyBatis、Dubbo、MQ、MySQL、XDB-Router、ES、ZK
- 项目描述:抽奖系统是营销平台的重要微服务之一,可以满足 C 端人群的需求,例如拉新、促活、留存等。该系统运用抽象、分治和 DDD 知识,拆解服务边界,凝练领域服务功能。围绕抽奖服务建设领域服务,包括规则引擎、抽奖策略、活动玩法、奖品发放等。这可以满足业务产品快速迭代上线的需求,同时减少研发成本,提高交付效率。
- 核心职责:
- 【高级】构建以 DDD 分层结构的处理方式,搭建整个抽奖系统架构。运用设计原则和工厂、代理、模板、组合、策略等设计模式的综合使用,搭建易于维护和迭代的系统工程。
- 【高级】鉴于系统内有较多的规则策略过滤,包括准入、人群、风控、A/BTest等需求,为适应系统规模可快速开发和使用的方式,搭建了去中心化的量化人群规则引擎组件。通过业务需求对逻辑的扩展和内置引擎执行器的使用,完成自由组合的人群过滤服务。这降低了共性功能重复开发所带来的成本问题,并提高了研发效率。
- 【高级】根据实际秒杀峰值场景 `TPS 5000 ~ 8000` 的需求,开发了统一路由组件。该组件不仅可以满足差异化不同字段的分库分表组合,还支持 Redis 库存分片和秒杀滑动库存分块。而且,开发了统一路由 XDB-Router 的 SpringBoot Starter 技术组件。该套组件已经经历了多次大促活动场景的考验,支持横向扩展,可以满足业务规模的快速增长。
- 【简单】运用模板、策略、工厂三个设计模式,定义抽奖过程标准和实现对应的多类型抽奖的服务模块。
- 【简单】因活动秒杀的并发场景,将秒杀从最开始的数据库行级锁优化为Redis Key 加锁,又从 Redis Key 的独占锁,优化为滑块锁。优化后整体秒杀有了非常可观的性能提升。
- 【简单】解耦抽奖流程,把抽奖和发奖用MQ消息串联起来,避免一个流程太长,导致用户一直等待。
### 2. 手写 MyBatis
- 项目架构:Object Relational Mapping
- 项目描述:MyBatis 是 Java 应用编程开发中,非常常用的技术框架。需要较深入的学习和使用,具备 MyBatis 插件开发能力,解决日常场景问题。才能更好更高效的工作。为此,深度学习了《手写MyBatis:渐进式源码实践》一书,完整实现了一个 MyBatis ORM 框架。技术积累颇深,提高了设计思维和编码能力。
- 个人收获:
- 首先学习到为什么日常使用 MyBatis 时,可以仅提供 IDao 接口,就可以关联对应配置的SQL语句,完成数据库操作。这是因为做了代理与映射,封装调用逻辑到 SqlSession 会话功能实现中。
- 掌握了数10种设计模式的运用,其中感触最大的是 MyBatis 如何管理多边服务的设计。如创建会话模型,统一调度执行器使用和数据的封装,并把这些复杂的操作,通过 SqlSessionFactory 工厂统一对外提供 SqlSession 服务。
- 彻底了解并掌握了 MyBatis Plugin 设计模型,这个技术可以让我基于 MyBatis 做出日志监控、库表路由、字段加解密等操作。为以后编程工作,提供更多的解决方案。
- 除此之外,还有一级缓存、二级缓存的装饰器模式使用,MyBatis 开发后与 Spring、SpringBoot 整合的实现,让我对 MyBatis 的全体系开发流程和对应的技术整合,已经非常清晰,便于以后应用和从根上快速排查解决问题,并给出合理的技术方案。
### 3. OpenAI 应用服务 - 辅助工作提效工具开发
- 项目架构:微服务架构设计,OpenAI-SDK 多模型组件【ChatGLM、ChatGPT】、DDD 应用服务API封装、WEB REACT 前端界面【按需编写】
- 核心技术:SpringBoot、MyBatis、Redis/Guava、OKHttp3、OpenAI 大模型【可对接ChatGLM、腾讯混元等】、React、TypeScript
- 项目描述:此项目以应用OpenAI技术,对接多种大模型提供生成式服务,为XXX场景提效。项目的架构设计实现以微服务进行拆分,涵盖;OpenAI-SDK、OpenAI-API、公众号鉴权、企业支付【暂时申请中,如果你对接了可以写】等。并以模块化设计,积木式构建应用,让不同的场景诉求都可以配置化对接。
- 核心职责:
- 首先这是我们xxx公司/实践/实训的第一个OpenAI项目,后续势必会有更多的场景以不同的方式接入。包括 SDK 独立接入、API 接口接入、MQ 消息接入,以及使用提供好的服务类接入。所以在这部分设计的时候,我采用了微服务的架构设计,按照职责边界进行拆分设计。
- 采用 DDD 架构 API,以及便于不同领域模块的独立设计,一个领域就是一个功能域。在功能域中提供模型、仓储、事件、服务。这样可以更好扩展。
- 鉴于生成式服务的文本生成可能会有不可靠信息,所以对这部分内容添加了敏感词的过滤。并可根据不同场景选择不同范围的敏感词处理。
- OpenAI 大模型有多种,这部分在架构上设计独立的 SDK,在实现上采用了 Session 会话模型进行处理,以及通过工厂处理服务。在细节对上,采用了 OKHttp3 框架完成模型对接,这样的方式更好扩展,代码也更易于维护。
- 在整套工程的设计实现中,采用了较多的分治、抽象的思想和设计模式和设计原则知识的运用,来解决各类场景问题。
- 对接微信扫码支付,完成从商品库、下单支付、异步发货、掉单补偿等核心流程实现。让用户可以在线购买对话额度。
- 注意:你还可以根据项目中提到的各类技术和章节,来编写你的职责。
### 4. 服务治理 SpringBoot 中间件
- 系统架构:SpringBoot Starter 组件开发
- 核心技术:熔断、降级、限流、切量、白名单、人群控制
- 项目描述:该SpringBoot Starter中间件实现了熔断、降级、限流、切量、白名单等服务治理功能,减少了开发工作量和出错风险。利用SpringBoot的自动化配置机制简化了集成和使用,并提供了可扩展接口,以满足不同场景的需求。
- 核心职责:
- 鉴于组内同类需求的重复开发,设计并实现服务治理 SpringBoot Starter 中间件,提高开发效率和降低重复开发成本。 该中间件的核心功能包括服务治理中的熔断、降级、限流、切量和白名单等。
- 通过利用SpringBoot的自动化配置机制,该中间件可以简化集成和使用,同时提供足够的配置选项以满足不同场景的需求。
- 此外,该中间件还提供了可扩展的接口,方便用户根据自身需求扩展功能,从而更好地满足不同的业务需求。
---
title: 幻灯片页
icon: person-chalkboard
layout: Slide
---
<!-- markdownlint-disable MD024 MD033 MD051 -->
@slidestart
<!-- .slide: data-transition="slide" -->
## 幻灯片演示
<!-- .element: class="r-fit-text" -->
一个简单的幻灯片演示与各种小贴士。
<!-- .element: class="r-fit-text" -->
> 作者 Mr.Hope. 请滚动鼠标滚轮进入下一页
---
## 标注幻灯片
<!-- .element: class="r-fit-text" -->
[👇](#/1/1)
--
## 标注幻灯片
<!-- .element: class="r-fit-text" -->
使用 `---` 标注水平幻灯片
<!-- .element: class="fragment fade-in" -->
在水平幻灯片中使用 `--` 分割垂直幻灯片
<!-- .element: class="fragment fade-in" -->
使用 `<!-- .slide: ... -->` 在幻灯片上添加属性
<!-- .element: class="fragment fade-in" -->
使用 `<!-- .element: ... -->` 在前一个 HTML 元素上添加属性
<!-- .element: class="fragment fade-in" -->
---
<!-- .slide: data-transition="slide" data-auto-animate -->
## Markdown
<!-- .element: class="r-fit-text" -->
你可以在幻灯片中使用 Markdown 语法的各种标记.
<!-- .element: class="r-fit-text" -->
--
<!-- .slide: data-auto-animate -->
## Markdown
你可以在幻灯片中使用 Markdown 语法的各种标记.
### 这是一个 H3
标题默认会自动转换为大写。
这是一个有着 **粗体**, _斜体_, ~~删除线~~ 文字并包含 [一个链接](https://mister-hope.com) 的段落,并且它会自动换行。所以你无需担心它的长度。
--
<!-- .slide: data-auto-animate -->
## Markdown
你可以在幻灯片中使用 Markdown 语法的各种标记.
列表默认为 `inline-block`
- 项目
- 项目
- 项目
1. 项目 1
1. 项目 2
1. 项目 3
--
<!-- .slide: data-auto-animate -->
## Markdown
你可以在幻灯片中使用 Markdown 语法的各种标记.
在你启用 `highlight` 插件后,代码块会自动高亮。
```js
const a = 1;
```
--
<!-- .slide: data-auto-animate -->
## Markdown
你可以在幻灯片中使用 Markdown 语法的各种标记.
在你启用 `math` 插件后,你也可以使用 TEX 格式使用数学公式。
$$
J(\theta_0,\theta_1) = \sum_{i=0}
$$
--
<!-- .slide: data-auto-animate -->
## Markdown
你可以在幻灯片中使用 Markdown 语法的各种标记.
**请注意**: 表格和分割线,以及所有不在 Markdown 标准语法中的内容均不受支持。
---
<!-- .slide: data-transition="slide" data-auto-animate -->
## 布局
<!-- .element: class="r-fit-text" -->
--
<!-- .slide: data-auto-animate -->
## 布局
<!-- .element: class="r-fit-text" -->
👆 `r-fit-text` class 会让文字在不超出幻灯片范围的情况下尽可能大。
--
<!-- .slide: data-auto-animate -->
## 布局
![Logo](/logo.svg)
<!-- .element: class="r-stretch" -->
👆 `r-stretch` class 帮助你控制注入图片或视频的大小,使它们填充满幻灯片垂直方向上的剩余空间。
--
<!-- .slide: data-auto-animate data-background-color="rgb(70, 70, 255)" -->
## 布局
### 背景
你可以通过向特定幻灯片添加 `data-background` 属性自定义幻灯片背景.
---
<!-- .slide: data-auto-animate -->
## 动画片段
<!-- .element: class="r-fit-text" -->
--
<!-- .slide: data-auto-animate -->
## 动画片段
<!-- .element: class="r-fit-text" -->
动画片段用于高亮或显隐幻灯片中的元素。
你需要在元素上添加 `fragment` 和动画 class。
--
<!-- .slide: data-auto-animate -->
## 动画片段
### 动画 class
- `fade-in`
<!-- .element: class="fragment fade-in" -->
- `fade-out`
<!-- .element: class="fragment fade-out" -->
- `fade-up`
<!-- .element: class="fragment fade-up" -->
<!-- list break -->
- `fade-down`
<!-- .element: class="fragment fade-down" -->
- `fade-left`
<!-- .element: class="fragment fade-left" -->
- `fade-right`
<!-- .element: class="fragment fade-right" -->
<!-- list break -->
- `fade-in-then-out`
<!-- .element: class="fragment fade-in-then-out" -->
- `fade-in-then-semi-out`
<!-- .element: class="fragment fade-in-then-semi-out" -->
--
<!-- .slide: data-auto-animate -->
## 动画片段
### 动画 class
- `grow`
<!-- .element: class="fragment grow" -->
- `shrink`
<!-- .element: class="fragment shrink" -->
- `strike`
<!-- .element: class="fragment strike" -->
<!-- list break -->
- `highlight-red`
<!-- .element: class="fragment highlight-red" -->
- `highlight-green`
<!-- .element: class="fragment highlight-green" -->
- `highlight-blue`
<!-- .element: class="fragment highlight-blue" -->
<!-- list break -->
- `highlight-current-red`
<!-- .element: class="fragment highlight-current-red" -->
- `highlight-current-green`
<!-- .element: class="fragment highlight-current-green" -->
- `highlight-current-blue`
<!-- .element: class="fragment highlight-current-blue" -->
--
<!-- .slide: data-auto-animate -->
## 动画片段
### 多个动画片段
你可以按照顺序包裹一个 HTML 元素使其拥有多个动画片段
<span class="fragment fade-in">
<span class="fragment highlight-red">
<span class="fragment fade-out">
渐入 > 变红 > 渐出
</span>
</span>
</span>
--
<!-- .slide: data-auto-animate -->
## 动画片段
### 顺序
你可以使用 `data-fragment-index` 属性改变元素的动画顺序。
不同元素可以有相同的动画顺序。
- 最后显示
<!-- .element: class="fragment" data-fragment-index="3"-->
- 第二个显示
<!-- .element: class="fragment" data-fragment-index="2"-->
<!-- list break -->
- 第一个显示
<!-- .element: class="fragment" data-fragment-index="1"-->
- 第二个显示
<!-- .element: class="fragment" data-fragment-index="2"-->
---
<!-- .slide: data-transition="slide" data-auto-animate -->
## 渐变
<!-- .element: class="r-fit-text" -->
--
<!-- .slide: data-transition="slide" data-auto-animate -->
## 渐变
<!-- .element: class="r-fit-text" -->
Transition 可以通过配置中的 `transition` 选项全局设置,也可以通过在特定幻灯片添加 `data-transition` 属性局部设置.
可能的值:
- none
- fade
- slide
<!-- list break -->
- convex
- concave
- zoom
--
<!-- .slide: data-auto-animate -->
## 渐变
<!-- .element: class="r-fit-text" -->
### 过渡动画
你可以在相邻的幻灯片上添加 `data-auto-animate` 使相同的 HTML 元素产生过渡动画效果。
---
<!-- .slide: data-transition="slide" data-auto-animate -->
## 功能
<!-- .element: class="r-fit-text" -->
--
<!-- .slide: data-transition="slide" data-auto-animate -->
## 功能
<!-- .element: class="r-fit-text" -->
### 代码
通过启用 `highlight` 插件,你可以对代码块进行高亮。
你可以使用 `[a-b|c-d]` 语法来分布高亮特定行。
```js [1-2|3|4]
let a = 1;
let b = 2;
let c = (x) => 1 + 2 + x;
c(3);
```
--
<!-- .slide: data-transition="slide" data-auto-animate -->
## 功能
<!-- .element: class="r-fit-text" -->
### 预览模式
按下 `Esc``O` 即可在幻灯片获得焦点时进入预览模式。
--
<!-- .slide: data-transition="slide" data-auto-animate -->
## 功能
<!-- .element: class="r-fit-text" -->
### 全屏模式
按下 `F``F11` 即可在幻灯片获得焦点时进入全屏模式。
--
<!-- .slide: data-transition="slide" data-auto-animate -->
## 功能
<!-- .element: class="r-fit-text" -->
### 缩放
按下 `alt` (Linux 上使用 `ctrl`) 的同时点击幻灯片的任何元素,即可以向此元素进行放大。
再次点击即可缩小。
---
<!-- .element: class="r-fit-text" -->
## 结束
@slideend
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册