Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
何 广一
chatroom
Commits
1865fb3e
Commit
1865fb3e
authored
Aug 13, 2025
by
何 广一
Browse files
fetch rooms
parent
881e18d5
Changes
3
Show whitespace changes
Inline
Side-by-side
chat-room/src/app/interface.tsx
0 → 100644
View file @
1865fb3e
export
const
urlPrefix
=
'
https://chatroom.zjuxlab.com
'
export
interface
BackendResponse
<
T
>
{
code
:
number
;
message
:
string
;
data
:
T
;
}
export
interface
Message
{
messageId
:
number
;
// 消息 id
roomId
:
number
;
// 房间 id
sender
:
string
;
// 发送人的 username
content
:
string
;
// 消息内容
time
:
number
;
// 消息发送时间戳
}
export
interface
RoomPreviewInfo
{
roomId
:
number
;
roomName
:
string
;
lastMessage
:
Message
|
null
;
}
export
interface
RoomAddArgs
{
user
:
string
;
roomName
:
string
;
}
export
interface
RoomAddResult
{
roomId
:
number
;
}
export
interface
RoomListRes
{
rooms
:
RoomPreviewInfo
[];
}
export
interface
RoomDeleteArgs
{
user
:
string
;
roomId
:
number
;
}
export
interface
MessageAddArgs
{
roomId
:
number
;
content
:
string
;
sender
:
string
;
}
chat-room/src/app/page.tsx
View file @
1865fb3e
import
Image
from
"
next/image
"
;
import
*
as
Ty
from
'
./interface
'
import
RoomListProvider
from
'
./room-list
'
;
export
default
function
Home
()
{
return
(
<
div
className
=
"font-sans grid grid-rows-[20px_1fr_20px] items-center justify-items-center min-h-screen p-8 pb-20 gap-16 sm:p-20"
>
<
main
className
=
"flex flex-col gap-[32px] row-start-2 items-center sm:items-start"
>
<
Image
className
=
"dark:invert"
src
=
"/next.svg"
alt
=
"Next.js logo"
width
=
{
180
}
height
=
{
38
}
priority
/>
<
ol
className
=
"font-mono list-inside list-decimal text-sm/6 text-center sm:text-left"
>
<
li
className
=
"mb-2 tracking-[-.01em]"
>
Get started by editing
{
"
"
}
<
code
className
=
"bg-black/[.05] dark:bg-white/[.06] font-mono font-semibold px-1 py-0.5 rounded"
>
src/app/page.tsx
</
code
>
.
</
li
>
<
li
className
=
"tracking-[-.01em]"
>
Save and see your changes instantly.
</
li
>
</
ol
>
<
div
className
=
"flex gap-4 items-center flex-col sm:flex-row"
>
<
a
className
=
"rounded-full border border-solid border-transparent transition-colors flex items-center justify-center bg-foreground text-background gap-2 hover:bg-[#383838] dark:hover:bg-[#ccc] font-medium text-sm sm:text-base h-10 sm:h-12 px-4 sm:px-5 sm:w-auto"
href
=
"https://vercel.com/new?utm_source=create-next-app&utm_medium=appdir-template-tw&utm_campaign=create-next-app"
target
=
"_blank"
rel
=
"noopener noreferrer"
>
<
Image
className
=
"dark:invert"
src
=
"/vercel.svg"
alt
=
"Vercel logomark"
width
=
{
20
}
height
=
{
20
}
/>
Deploy now
</
a
>
<
a
className
=
"rounded-full border border-solid border-black/[.08] dark:border-white/[.145] transition-colors flex items-center justify-center hover:bg-[#f2f2f2] dark:hover:bg-[#1a1a1a] hover:border-transparent font-medium text-sm sm:text-base h-10 sm:h-12 px-4 sm:px-5 w-full sm:w-auto md:w-[158px]"
href
=
"https://nextjs.org/docs?utm_source=create-next-app&utm_medium=appdir-template-tw&utm_campaign=create-next-app"
target
=
"_blank"
rel
=
"noopener noreferrer"
>
Read our docs
</
a
>
</
div
>
</
main
>
<
footer
className
=
"row-start-3 flex gap-[24px] flex-wrap items-center justify-center"
>
<
a
className
=
"flex items-center gap-2 hover:underline hover:underline-offset-4"
href
=
"https://nextjs.org/learn?utm_source=create-next-app&utm_medium=appdir-template-tw&utm_campaign=create-next-app"
target
=
"_blank"
rel
=
"noopener noreferrer"
>
<
Image
aria-hidden
src
=
"/file.svg"
alt
=
"File icon"
width
=
{
16
}
height
=
{
16
}
/>
Learn
</
a
>
<
a
className
=
"flex items-center gap-2 hover:underline hover:underline-offset-4"
href
=
"https://vercel.com/templates?framework=next.js&utm_source=create-next-app&utm_medium=appdir-template-tw&utm_campaign=create-next-app"
target
=
"_blank"
rel
=
"noopener noreferrer"
>
<
Image
aria-hidden
src
=
"/window.svg"
alt
=
"Window icon"
width
=
{
16
}
height
=
{
16
}
/>
Examples
</
a
>
<
a
className
=
"flex items-center gap-2 hover:underline hover:underline-offset-4"
href
=
"https://nextjs.org?utm_source=create-next-app&utm_medium=appdir-template-tw&utm_campaign=create-next-app"
target
=
"_blank"
rel
=
"noopener noreferrer"
>
<
Image
aria-hidden
src
=
"/globe.svg"
alt
=
"Globe icon"
width
=
{
16
}
height
=
{
16
}
/>
Go to nextjs.org →
</
a
>
</
footer
>
</
div
>
<>
<
RoomListProvider
/>
</>
);
}
chat-room/src/app/room-list.tsx
0 → 100644
View file @
1865fb3e
'
use client
'
import
{
useState
,
useEffect
}
from
'
react
'
import
*
as
Ty
from
'
./interface
'
export
default
function
RoomListProvider
()
{
const
[
roomsLoading
,
setRoomsLoading
]
=
useState
<
boolean
>
(
false
)
const
[
roomsError
,
setRoomsError
]
=
useState
<
string
>
(
''
)
const
[
rooms
,
setRooms
]
=
useState
<
Ty
.
RoomPreviewInfo
[]
>
([])
/*
- url: /api/room/list
- method: GET
- argument: null
- response:
interface RoomListRes {
rooms: RoomPreviewInfo[];
}
*/
const
getRooms
=
async
()
=>
{
setRoomsLoading
(
true
)
setRoomsError
(
''
)
try
{
const
res
=
await
fetch
(
Ty
.
urlPrefix
+
'
/api/room/list
'
,
{
method
:
'
GET
'
,
});
if
(
!
res
.
ok
)
{
throw
new
Error
(
'
无法获取房间列表,错误码:
'
+
res
.
status
);
}
const
data
:
Ty
.
BackendResponse
<
Ty
.
RoomListRes
>
=
await
res
.
json
();
setRooms
(
data
.
data
.
rooms
);
}
catch
(
error
)
{
console
.
error
(
'
房间列表获取失败:
'
,
error
);
setRoomsError
(
error
.
message
);
}
finally
{
setRoomsLoading
(
false
);
}
}
useEffect
(()
=>
{
getRooms
();
const
interval
=
setInterval
(()
=>
{
getRooms
();
},
1000
);
// 1秒
// 组件卸载时清除定时器
return
()
=>
{
clearInterval
(
interval
)
}
},
[]);
return
(
<
div
className
=
"room-container"
>
<
ul
>
{
rooms
&&
rooms
.
map
((
room
)
=>
(
<
li
key
=
{
room
.
roomId
}
>
<
h3
>
{
room
.
roomName
}
(ID:
{
room
.
roomId
}
)
</
h3
>
{
room
.
lastMessage
?
(
<
p
>
Last message from
{
room
.
lastMessage
.
sender
}
:
{
room
.
lastMessage
.
content
}
</
p
>
)
:
(
<
p
>
No messages yet.
</
p
>
)
}
</
li
>
))
}
</
ul
>
</
div
>
);
}
\ No newline at end of file
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment