1+ <template >
2+ <footer class =" footer" >
3+ <div class =" footer-content" >
4+ <!-- Brand Section -->
5+ <div class =" footer-section brand-section" >
6+ <div class =" section-title" >FastAPI Best Architecture</div >
7+ <div class =" section-description" >
8+ 基于 FastAPI 构建的企业级后端架构解决方案
9+ </div >
10+ <div class =" social-links" >
11+ <a
12+ href =" https://github.com/fastapi-practices/fastapi_best_architecture"
13+ target =" _blank"
14+ rel =" noopener noreferrer"
15+ class =" social-link"
16+ >
17+ <Icon name =" line-md:github" size =" 2rem" />
18+ </a >
19+ <a href =" /fastapi_best_architecture_docs/blog/" class =" social-link" >
20+ <Icon name =" la:blog" size =" 2rem" />
21+ </a >
22+ </div >
23+ </div >
24+ <div class =" footer-section" >
25+ <div class =" section-title" >使用文档</div >
26+ <div class =" link-list" >
27+ <a
28+ v-for =" link in links.product"
29+ :key =" link.name"
30+ :href =" link.href"
31+ :target =" link.href.startsWith('http') ? '_blank' : undefined"
32+ rel =" noopener noreferrer"
33+ class =" footer-link"
34+ >
35+ {{ link.name }}
36+ </a >
37+ </div >
38+ </div >
39+ <div class =" footer-section" >
40+ <div class =" section-title" >生态系统</div >
41+ <div class =" link-list" >
42+ <a
43+ v-for =" link in links.community"
44+ :key =" link.name"
45+ :href =" link.href"
46+ :target =" link.href.startsWith('http') ? '_blank' : undefined"
47+ rel =" noopener noreferrer"
48+ class =" footer-link"
49+ >
50+ {{ link.name }}
51+ </a >
52+ </div >
53+ </div >
54+ <div class =" footer-section" >
55+ <div class =" section-title" >插件系统</div >
56+ <div class =" link-list" >
57+ <a
58+ v-for =" link in links.resources"
59+ :key =" link.name"
60+ :href =" link.href"
61+ :target =" link.href.startsWith('http') ? '_blank' : undefined"
62+ rel =" noopener noreferrer"
63+ class =" footer-link"
64+ >
65+ {{ link.name }}
66+ </a >
67+ </div >
68+ </div >
69+ <div class =" footer-section" >
70+ <div class =" section-title" >更多</div >
71+ <div class =" link-list" >
72+ <a
73+ v-for =" link in links.friendlyLinks"
74+ :key =" link.name"
75+ :href =" link.href"
76+ rel =" noopener noreferrer"
77+ class =" footer-link"
78+ >
79+ {{ link.name }}
80+ </a >
81+ </div >
82+ </div >
83+ </div >
84+
85+ <div class =" separator" ></div >
86+
87+ <div class =" footer-bottom" >
88+ <div class =" footer-bottom-left" >
89+ <span >Copyright © 2023-{{ currentYear }} FastAPI Practices and contributors.</span >
90+ <span >
91+ Released under the
92+ <a
93+ href =" https://github.com/fastapi-practices/fastapi_best_architecture/blob/master/LICENSE"
94+ target =" _blank"
95+ rel =" noopener noreferrer"
96+ class =" footer-link"
97+ >
98+ MIT License
99+ </a >
100+ </span >
101+ </div >
102+ <span >
103+ Made with ❤️ by
104+ <a
105+ href =" https://wu-clan.github.io/homepage/"
106+ target =" _blank"
107+ rel =" noopener noreferrer"
108+ class =" footer-link"
109+ >
110+ wu-clan
111+ </a >
112+ </span >
113+ </div >
114+ </footer >
115+ </template >
116+
117+ <script setup>
118+ const currentYear = new Date ().getFullYear ();
119+
120+ const links = {
121+ product: [
122+ { name: " 快速开始" , href: " /fastapi_best_architecture_docs/backend/summary/quick-start" },
123+ { name: " Vben UI" , href: " /fastapi_best_architecture_docs/frontend/summary/intro" },
124+ { name: " Apifox" , href: " https://apifox.com/apidoc/shared-28a93f02-730b-4f33-bb5e-4dad92058cc0" },
125+ { name: " 常见问题" , href: " /fastapi_best_architecture_docs/questions" },
126+ {
127+ name: " 更新记录" ,
128+ href: " https://github.com/fastapi-practices/fastapi_best_architecture/blob/master/CHANGELOG.md"
129+ },
130+ ],
131+ community: [
132+ { name: " 开源项目" , href: " /fastapi_best_architecture_docs/opensource" },
133+ { name: " 技术栈" , href: " /fastapi_best_architecture_docs/stack" },
134+ { name: " 用户登记" , href: " /fastapi_best_architecture_docs/users" },
135+ { name: " Github 问题" , href: " https://github.com/fastapi-practices/fastapi_best_architecture/issues" },
136+ { name: " Github 讨论" , href: " https://github.com/fastapi-practices/fastapi_best_architecture/discussions" },
137+ ],
138+ resources: [
139+ { name: " 插件开发" , href: " /fastapi_best_architecture_docs/plugin/dev" },
140+ { name: " 插件分享" , href: " /fastapi_best_architecture_docs/plugin/share" },
141+ { name: " 插件安装" , href: " /fastapi_best_architecture_docs/plugin/install" },
142+ { name: " 插件市场" , href: " /fastapi_best_architecture_docs/market" },
143+ ],
144+ friendlyLinks: [
145+ { name: " 视频教程" , href: " https://space.bilibili.com/284237214/lists" },
146+ { name: " 博客" , href: " /fastapi_best_architecture_docs/blog/" },
147+ { name: " 隐私政策" , href: " /fastapi_best_architecture_docs/privacy-policy" },
148+ ],
149+ };
150+ </script >
151+
152+ <style scoped>
153+ .footer {
154+ background-color : var (--vp-c-bg-alt );
155+ padding : 3rem ;
156+ }
157+
158+ .footer-content {
159+ display : flex ;
160+ justify-content : space-between ;
161+ max-width : 1500px ;
162+ margin : 0 auto ;
163+ }
164+
165+ .footer-section {
166+ min-width : 140px ;
167+ max-width : 200px ;
168+ display : flex ;
169+ flex-direction : column ;
170+ }
171+
172+ .brand-section {
173+ flex : 1 ;
174+ min-width : 280px ;
175+ max-width : 400px ;
176+ }
177+
178+ .section-title {
179+ font-size : 1.125rem ;
180+ font-weight : 600 ;
181+ margin-bottom : 1rem ;
182+ }
183+
184+ .section-description {
185+ color : var (--vp-c-text-2 );
186+ font-size : 0.875rem ;
187+ margin-bottom : 0.875rem ;
188+ }
189+
190+ .social-links {
191+ display : flex ;
192+ gap : 1rem ;
193+ margin-top : auto ;
194+ }
195+
196+ .social-link ,
197+ .footer-link {
198+ color : var (--vp-c-text-2 );
199+ font-size : 0.875rem ;
200+ text-decoration : none !important ;
201+ transition : color 0.2s ;
202+ }
203+
204+ .social-link :hover ,
205+ .footer-link :hover {
206+ color : var (--vp-c-text );
207+ text-decoration : none !important ;
208+ }
209+
210+ .link-list {
211+ display : flex ;
212+ flex-direction : column ;
213+ gap : 0.875rem ;
214+ }
215+
216+ .separator {
217+ border-top : 1px solid var (--vp-c-border );
218+ margin : 3rem 0 2rem ;
219+ }
220+
221+ .footer-bottom {
222+ display : flex ;
223+ justify-content : space-between ;
224+ align-items : center ;
225+ color : var (--vp-c-text-2 );
226+ font-size : 0.875rem ;
227+ max-width : 1500px ;
228+ margin : 0 auto ;
229+ }
230+
231+ .footer-bottom-left {
232+ display : flex ;
233+ flex-direction : column ;
234+ gap : 0.25rem ;
235+ }
236+
237+ @media (max-width : 768px ) {
238+ .footer-content {
239+ flex-direction : column ;
240+ gap : 2rem ;
241+ }
242+
243+ .footer-section {
244+ min-width : 100% ;
245+ max-width : 100% ;
246+ }
247+
248+ .brand-section {
249+ min-width : 100% ;
250+ max-width : 100% ;
251+ }
252+
253+ .footer-bottom {
254+ flex-direction : column ;
255+ align-items : flex-start ;
256+ gap : 0.5rem ;
257+ }
258+ }
259+ </style >
0 commit comments