Skip to content

Commit b4d68e3

Browse files
authored
solved some bugs (crates-pro#82)
* aaa * solved some bugs
1 parent b9308a6 commit b4d68e3

File tree

10 files changed

+144
-138
lines changed

10 files changed

+144
-138
lines changed

Dockerfile

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
FROM node:22.12.0-alpine3.19 AS builder
2+
WORKDIR /app
3+
4+
COPY package*.json ./
5+
6+
RUN npm ci
7+
8+
COPY . .
9+
10+
RUN npm run build
11+
12+
13+
14+
15+
16+
# 使用轻量级的 Node.js 镜像
17+
FROM node:22.12.0-alpine3.19 AS runner
18+
19+
# 设置工作目录
20+
WORKDIR /app
21+
22+
# 复制构建好的文件
23+
COPY --from=builder /app ./
24+
25+
# 暴露应用运行的端口
26+
EXPOSE 3000
27+
28+
# 启动应用
29+
CMD ["npm", "start"]

app/homepage/[nsfront]/[nsbehind]/[name]/[version]/page.tsx

Lines changed: 61 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -1,104 +1,76 @@
1-
//Overview页面
1+
// Overview页面
22
"use client";
33
import React, { useEffect, useState } from 'react';
44
import Link from 'next/link';
5-
//import { useSearchParams } from 'next/navigation';
65
import { cratesInfo } from '@/app/lib/all_interface';
76
import { useParams } from 'next/navigation';
87

9-
10-
11-
12-
138
const CratePage = () => {
14-
159
const params = useParams();
16-
17-
18-
19-
20-
21-
2210
const [results, setResults] = useState<cratesInfo | null>(null);
2311
const [loading, setLoading] = useState(true);
2412
const [error, setError] = useState<string | null>(null);
2513

26-
27-
2814
useEffect(() => {
2915
const fetchCrateData = async () => {
3016
try {
3117
const response = await fetch(`/api/crates/${params.nsfront}/${params.nsbehind}/${params.name}/${params.version}`);
32-
3318
if (!response.ok) {
3419
throw new Error(`HTTP error! status: ${response.status}`);
3520
}
36-
3721
const data = await response.json();
38-
console.log('overviewwwwwwwwwwwwww:', data);
39-
40-
setResults(data); // 设置获取的数据
41-
22+
setResults(data);
4223
} catch (error) {
43-
console.log('Error fetching data:', error);
24+
console.error('Error fetching data:', error);
4425
setError('An error occurred');
4526
} finally {
46-
setLoading(false); // 完成加载
27+
setLoading(false);
4728
}
4829
};
4930

31+
fetchCrateData();
32+
}, [params.name, params.version, params.nsfront, params.nsbehind]);
5033

51-
fetchCrateData(); // 调用函数来获取数据
52-
}, [params.name, params.version, params.nsfront, params.nsbehind]); // 依赖项数组,确保在 name 或 version 改变时重新获取数据
53-
54-
// 渲染部分
5534
if (loading) return <p>Loading...</p>;
5635
if (error) return <p>Error: {error}</p>;
5736

58-
59-
60-
6137
return (
6238
<div>
63-
{/* cve */}
6439
<div className="container mx-auto my-8 grid grid-cols-1 lg:grid-cols-2 gap-6">
6540
<div className="space-y-6">
6641
{/* Security Advisories */}
6742
<div className="bg-white shadow rounded-lg p-4">
6843
<h2 className="text-lg font-bold mb-2">Security Advisories</h2>
69-
<p>cve: {results ? JSON.stringify(results.cves) : 'No results available'}</p>
44+
<p className="text-gray-500 text-sm">
45+
cve: {results && results.cves && results.cves.length > 0 && results.cves[0] !== '' ? JSON.stringify(results.cves) : 'No results available'}
46+
</p>
7047
</div>
7148
{/* Licenses */}
7249
<div className="bg-white shadow rounded-lg p-4">
7350
<h2 className="text-lg font-bold mb-2">Licenses</h2>
7451
<div className="mb-2">
75-
<span className="font-bold">LICENSES:</span> MIT
52+
<span className="font-bold">LICENSES: {results ? results.license : 'No results available'}</span>
7653
</div>
7754
<div className="mb-2">
7855
<span className="font-bold">DEPENDENCY LICENSES:</span>
7956
<ul className="list-disc pl-6">
8057
<li>Apache-2.0 OR MIT (116)</li>
8158
<li>MIT (27)</li>
8259
<li>MIT OR Uniclicense (7)</li>
83-
{/* Add more dependency licenses */}
8460
</ul>
8561
</div>
8662
</div>
8763
{/* Dependencies */}
8864
<div className="bg-white shadow rounded-lg p-4">
8965
<h2 className="text-lg font-bold mb-2">Dependencies</h2>
9066
<div className="mb-2">
91-
<span className="font-bold">Direct: {results ? JSON.stringify(results.dependencies.direct) : 'No results available'}</span>
67+
<span className="font-bold">Direct: {results ? JSON.stringify(results.dependencies.direct) : 'No cves detected.'}</span>
9268
</div>
9369
<div className="mb-2">
9470
<span className="font-bold">Indirect: {results ? JSON.stringify(results.dependencies.indirect) : 'No results available'}</span>
9571
</div>
96-
<Link
97-
href={`/homepage/${params.nsfront}/${params.nsbehind}/${params.name}/${params.version}/dependencies`}
98-
>
99-
<div className="text-blue-500 hover:underline">
100-
View all dependencies
101-
</div>
72+
<Link href={`/homepage/${params.nsfront}/${params.nsbehind}/${params.name}/${params.version}/dependencies`}>
73+
<div className="text-blue-500 hover:underline">View all dependencies</div>
10274
</Link>
10375
</div>
10476
{/* Dependents */}
@@ -110,66 +82,64 @@ const CratePage = () => {
11082
<div className="mb-2">
11183
<span className="font-bold">Indirect: {results ? JSON.stringify(results.dependents.indirect) : 'No results available'}</span>
11284
</div>
113-
<Link
114-
href={`/homepage/${params.nsfront}/${params.nsbehind}/${params.name}/${params.version}/dependents`}
115-
>
116-
<div className="text-blue-500 hover:underline">
117-
View all dependencies
118-
</div>
85+
<Link href={`/homepage/${params.nsfront}/${params.nsbehind}/${params.name}/${params.version}/dependents`}>
86+
<div className="text-blue-500 hover:underline">View all dependents</div>
11987
</Link>
12088
</div>
12189
</div>
122-
<div className="bg-white shadow rounded-lg p-4">
123-
<h2 className="text-lg font-bold mb-2">OpenSSF scorecard</h2>
124-
<p>The Open Source Security Foundation is a cross-industry collaboration to improve the security of open source software (OSS). The Scorecard provides security health metrics for open source projects.</p>
125-
<a href="#" className="text-blue-500 hover:underline">
126-
View information about checks and how to fix failures.
127-
</a>
128-
<div className="flex items-center justify-between mt-4">
129-
<div className="text-3xl font-bold">8.3/10</div>
130-
<div className="text-sm text-gray-500">Scorecard as of November 11, 2024.</div>
131-
</div>
132-
<div className="mt-4 space-y-2">
133-
<div className="flex justify-between">
134-
<span>Code-Review</span>
135-
<span>10/10</span>
136-
</div>
137-
<div className="flex justify-between">
138-
<span>Maintained</span>
139-
<span>10/10</span>
140-
</div>
141-
<div className="flex justify-between">
142-
<span>CI/Best-Practices</span>
143-
<span>0/10</span>
144-
</div>
145-
<div className="flex justify-between">
146-
<span>License</span>
147-
<span>10/10</span>
148-
</div>
149-
<div className="flex justify-between">
150-
<span>Dangerous-Workflow</span>
151-
<span>10/10</span>
152-
</div>
153-
<div className="flex justify-between">
154-
<span>Security-Policy</span>
155-
<span>10/10</span>
90+
91+
{/* 新增的块: doc_url 和 github_url */}
92+
<div className="space-y-6">
93+
<div className="bg-white shadow rounded-lg p-4 mb-6">
94+
<h2 className="text-lg font-bold mb-2">Documentation & GitHub Links</h2>
95+
<div className="mb-2">
96+
<span className="font-bold">Documentation URL: </span>
97+
<a
98+
href={results ? results.doc_url : 'No results available'}
99+
className="text-blue-500 hover:underline"
100+
target="_blank"
101+
rel="noopener noreferrer"
102+
>
103+
{results ? results.doc_url : 'No results available'}
104+
</a>
156105
</div>
157-
<div className="flex justify-between">
158-
<span>Token-Permissions</span>
159-
<span>10/10</span>
106+
<div className="mb-2">
107+
<span className="font-bold">GitHub URL: </span>
108+
<a
109+
href={results ? results.github_url : 'No results available'}
110+
className="text-blue-500 hover:underline"
111+
target="_blank"
112+
rel="noopener noreferrer"
113+
>
114+
{results ? results.github_url : 'No results available'}
115+
</a>
160116
</div>
161-
<div className="flex justify-between">
162-
<span>Binary-Artifacts</span>
163-
<span>10/10</span>
117+
</div>
118+
119+
{/* OpenSSF scorecard */}
120+
<div className="bg-white shadow rounded-lg p-4">
121+
<h2 className="text-lg font-bold mb-2">OpenSSF scorecard</h2>
122+
<p>The Open Source Security Foundation is a cross-industry collaboration to improve the security of open source software (OSS). The Scorecard provides security health metrics for open source projects.</p>
123+
<a href="#" className="text-blue-500 hover:underline">View information about checks and how to fix failures.</a>
124+
<div className="flex items-center justify-between mt-4">
125+
<div className="text-3xl font-bold">8.3/10</div>
126+
<div className="text-sm text-gray-500">Scorecard as of November 11, 2024.</div>
164127
</div>
165-
<div className="flex justify-between">
166-
<span>Pinned-Dependencies</span>
167-
<span>0/10</span>
128+
<div className="mt-4 space-y-2">
129+
<div className="flex justify-between"><span>Code-Review</span><span>10/10</span></div>
130+
<div className="flex justify-between"><span>Maintained</span><span>10/10</span></div>
131+
<div className="flex justify-between"><span>CI/Best-Practices</span><span>0/10</span></div>
132+
<div className="flex justify-between"><span>License</span><span>10/10</span></div>
133+
<div className="flex justify-between"><span>Dangerous-Workflow</span><span>10/10</span></div>
134+
<div className="flex justify-between"><span>Security-Policy</span><span>10/10</span></div>
135+
<div className="flex justify-between"><span>Token-Permissions</span><span>10/10</span></div>
136+
<div className="flex justify-between"><span>Binary-Artifacts</span><span>10/10</span></div>
137+
<div className="flex justify-between"><span>Pinned-Dependencies</span><span>0/10</span></div>
168138
</div>
169139
</div>
170140
</div>
171141
</div>
172-
</div>
142+
</div >
173143
);
174144
};
175145

app/homepage/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ const HomePage: React.FC = () => {
8484

8585

8686
{/* 一些介绍 */}
87-
<div className="flex container mx-auto p-10">
87+
<div className="relative container mx-auto p-10">
8888
<div className="bg-gray-800 p-5 mb-6 rounded shadow-md">
8989
<h2 className="text-2xl font-semibold">New features in the deps.dev API</h2>
9090
<p className="mt-2">The deps.dev API, which provides free access to the data that powers this website, now has experimental batch and pull support, as well as a new version that comes with a stability guarantee and deprecation policy.</p>

app/homepage/search/page.tsx

Lines changed: 33 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { searchResult } from '@/app/lib/all_interface';
88
const Search = () => {
99
const [results, setResults] = useState<searchResult | null>(null);
1010
const [currentPage, setCurrentPage] = useState(1); // 添加当前页码状态
11+
const [loading, setLoading] = useState(false); // 添加加载状态
1112
const searchParams = useSearchParams();
1213
const name = searchParams.get('crate_name');
1314

@@ -18,6 +19,7 @@ const Search = () => {
1819
}, [name, currentPage]); // 当 name 或 currentPage 改变时重新运行
1920

2021
const fetchResults = async (query: string, page: number) => {
22+
setLoading(true); // 开始加载数据
2123
try {
2224
const response = await fetch('/api/search', {
2325
method: 'POST',
@@ -40,6 +42,8 @@ const Search = () => {
4042
setResults(data); // 假设返回的数据data字段
4143
} catch (error) {
4244
console.error('Error fetching data:', error);
45+
} finally {
46+
setLoading(false); // 数据加载完成
4347
}
4448
};
4549

@@ -57,12 +61,14 @@ const Search = () => {
5761

5862
console.log("results:", results?.data.items);
5963
return (
60-
<div className="min-h-screen bg-gray-100">
64+
<div className="min-h-screen bg-gray-100 flex flex-col">
6165
<NewHeader />
62-
<div className="max-w-2xl ml-10 p-4">
66+
<div className="max-w-2xl ml-10 p-4 flex-grow">
6367
<div id="results" className="space-y-4">
64-
{results ? (
65-
results.data.total_page > 0 ? (
68+
{loading ? (
69+
<p>Loading...</p>
70+
) : results ? (
71+
results.data.total_page > 0 && results.data.items.length > 0 ? (
6672
results.data.items.map((item, index) => (
6773
<Link
6874
key={index}
@@ -83,32 +89,35 @@ const Search = () => {
8389
<p>Loading...</p>
8490
)}
8591
</div>
92+
</div>
8693

87-
{/* 显示当前页数和总页数 */}
94+
{/* 当前页数在按钮上方 */}
95+
<div className="flex flex-col items-start mt-2 mb-4 custom-margin-left">
8896
{results && (
89-
<div className="mt-4 text-center">
97+
<div className="mb-2">
9098
<p>
91-
当前页: {currentPage} / 总页数: {results.data.total_page}
99+
Current page: {currentPage} / Total page: {results.data.total_page}
92100
</p>
93101
</div>
94102
)}
95-
96-
<div className="flex justify-between mt-4">
97-
<button
98-
onClick={handlePreviousPage}
99-
disabled={currentPage === 1}
100-
className="px-4 py-2 bg-blue-500 text-white rounded-md disabled:bg-gray-300"
101-
>
102-
Previous
103-
</button>
104-
<button
105-
onClick={handleNextPage}
106-
disabled={results === null || currentPage >= results.data.total_page}
107-
className="px-4 py-2 bg-blue-500 text-white rounded-md disabled:bg-gray-300"
108-
>
109-
Next
110-
</button>
111-
</div>
103+
{results && results.data.total_page > 0 && (
104+
<div className="flex">
105+
<button
106+
onClick={handlePreviousPage}
107+
disabled={currentPage === 1}
108+
className="mx-0 px-4 py-2 bg-blue-500 text-white rounded-md disabled:bg-gray-300"
109+
>
110+
Previous
111+
</button>
112+
<button
113+
onClick={handleNextPage}
114+
disabled={results === null || currentPage >= results.data.total_page}
115+
className="mx-20 px-4 py-2 bg-blue-500 text-white rounded-md disabled:bg-gray-300"
116+
>
117+
Next
118+
</button>
119+
</div>
120+
)}
112121
</div>
113122
</div>
114123
);

app/homepage/styles.css

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
/* styles.css */
2+
.custom-margin-left {
3+
margin-left: 100px;
4+
/* 自定义的左边距 */
5+
}

app/lib/all_interface.ts

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,10 @@ export interface cratesInfo {
3131
"indirect": number
3232
},
3333

34-
"cves": [
35-
{
36-
"cve_id": string,
37-
"url": string,
38-
"description": string
39-
}
40-
],
34+
"cves": string[],
35+
"license": string,
36+
"github_url": string,
37+
"doc_url": string,
4138
"versions": string[],
4239

4340
}

0 commit comments

Comments
 (0)