diff --git a/.gitignore b/.gitignore
index 05d49be..77cc42f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -53,3 +53,5 @@ package-lock.json
docker/mysql/data/*
+
+client_dist
\ No newline at end of file
diff --git a/client/.vscode/settings.json b/client/.vscode/settings.json
new file mode 100644
index 0000000..7a73a41
--- /dev/null
+++ b/client/.vscode/settings.json
@@ -0,0 +1,2 @@
+{
+}
\ No newline at end of file
diff --git a/client/package.json b/client/package.json
index 31b8c91..4824ba1 100644
--- a/client/package.json
+++ b/client/package.json
@@ -4,7 +4,8 @@
"description": "",
"main": "index.js",
"scripts": {
- "dev:web": "pnpm -C packages/rtc-web dev"
+ "dev:web": "pnpm -C packages/rtc-web dev",
+ "build:web": "pnpm -C packages/rtc-web build"
},
"keywords": [],
"author": "",
diff --git a/client/packages/rtc-web/.eslintrc.cjs b/client/packages/rtc-web/.eslintrc.cjs
index 874f700..6a48d3c 100644
--- a/client/packages/rtc-web/.eslintrc.cjs
+++ b/client/packages/rtc-web/.eslintrc.cjs
@@ -18,10 +18,11 @@ module.exports = {
},
plugins: ['vue', '@typescript-eslint', 'prettier'],
rules: {
- indent: ['error', 2],
+ indent: ['error', 2, { offsetTernaryExpressions: true }],
semi: ['error', 'always'],
'vue/attribute-hyphenation': 'off',
'@typescript-eslint/no-explicit-any': 'off',
'no-debugger': 'off',
+ '@typescript-eslint/no-non-null-assertion': 'off',
},
};
diff --git a/client/packages/rtc-web/package.json b/client/packages/rtc-web/package.json
index 9b0982a..9908eab 100644
--- a/client/packages/rtc-web/package.json
+++ b/client/packages/rtc-web/package.json
@@ -11,10 +11,15 @@
"@types/lodash": "^4.14.195",
"@vitejs/plugin-vue-jsx": "^3.0.1",
"@vueuse/core": "^10.2.0",
+ "@vueuse/router": "^10.2.1",
+ "dayjs": "^1.11.9",
"lodash": "^4.17.21",
"nanoid": "^4.0.2",
+ "socket.io-client": "2.3.0",
"vue": "^3.3.4",
- "vue-router": "4"
+ "vue-router": "4",
+ "vue3-emoji-picker": "^1.1.7",
+ "vue3-popper": "^1.5.0"
},
"devDependencies": {
"@types/node": "^20.3.1",
@@ -32,7 +37,9 @@
"prettier": "^2.8.8",
"prettier-plugin-tailwindcss": "^0.3.0",
"tailwindcss": "^3.3.2",
+ "terser": "^5.19.4",
"typescript": "^5.1.3",
+ "vconsole": "^3.15.1",
"vite": "^4.3.9",
"vite-plugin-eslint": "^1.8.1",
"vite-plugin-svg-icons": "^2.0.1",
diff --git a/client/packages/rtc-web/src/App.vue b/client/packages/rtc-web/src/App.vue
index 8853cc7..5c9710c 100644
--- a/client/packages/rtc-web/src/App.vue
+++ b/client/packages/rtc-web/src/App.vue
@@ -1,8 +1,20 @@
-
+
+
+
+
+
+
diff --git a/client/packages/rtc-web/src/assets/styles/index.css b/client/packages/rtc-web/src/assets/styles/index.css
index 77d1d3c..6d49701 100644
--- a/client/packages/rtc-web/src/assets/styles/index.css
+++ b/client/packages/rtc-web/src/assets/styles/index.css
@@ -1 +1,21 @@
@import './tailwindcss';
+
+/* width */
+::-webkit-scrollbar {
+ width: 4px;
+}
+
+/* Track */
+::-webkit-scrollbar-track {
+ background: #f1f1f1;
+}
+
+/* Handle */
+::-webkit-scrollbar-thumb {
+ background: #888;
+}
+
+/* Handle on hover */
+::-webkit-scrollbar-thumb:hover {
+ background: #555;
+}
diff --git a/client/packages/rtc-web/src/assets/svg-icon/audio.svg b/client/packages/rtc-web/src/assets/svg-icon/audio.svg
new file mode 100644
index 0000000..9c36589
--- /dev/null
+++ b/client/packages/rtc-web/src/assets/svg-icon/audio.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/client/packages/rtc-web/src/assets/svg-icon/back.svg b/client/packages/rtc-web/src/assets/svg-icon/back.svg
new file mode 100644
index 0000000..c823dcf
--- /dev/null
+++ b/client/packages/rtc-web/src/assets/svg-icon/back.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/client/packages/rtc-web/src/assets/svg-icon/camera.svg b/client/packages/rtc-web/src/assets/svg-icon/camera.svg
new file mode 100644
index 0000000..2fdee6c
--- /dev/null
+++ b/client/packages/rtc-web/src/assets/svg-icon/camera.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/client/packages/rtc-web/src/assets/svg-icon/chat.svg b/client/packages/rtc-web/src/assets/svg-icon/chat.svg
new file mode 100644
index 0000000..0d08497
--- /dev/null
+++ b/client/packages/rtc-web/src/assets/svg-icon/chat.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/client/packages/rtc-web/src/assets/svg-icon/count.svg b/client/packages/rtc-web/src/assets/svg-icon/count.svg
new file mode 100644
index 0000000..5427670
--- /dev/null
+++ b/client/packages/rtc-web/src/assets/svg-icon/count.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/client/packages/rtc-web/src/assets/svg-icon/emoji.svg b/client/packages/rtc-web/src/assets/svg-icon/emoji.svg
new file mode 100644
index 0000000..7126d84
--- /dev/null
+++ b/client/packages/rtc-web/src/assets/svg-icon/emoji.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/client/packages/rtc-web/src/assets/svg-icon/hang-up.svg b/client/packages/rtc-web/src/assets/svg-icon/hang-up.svg
new file mode 100644
index 0000000..1dc9f80
--- /dev/null
+++ b/client/packages/rtc-web/src/assets/svg-icon/hang-up.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/client/packages/rtc-web/src/assets/svg-icon/member.svg b/client/packages/rtc-web/src/assets/svg-icon/member.svg
new file mode 100644
index 0000000..5d824d1
--- /dev/null
+++ b/client/packages/rtc-web/src/assets/svg-icon/member.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/client/packages/rtc-web/src/assets/svg-icon/mirror-image.svg b/client/packages/rtc-web/src/assets/svg-icon/mirror-image.svg
new file mode 100644
index 0000000..bf4be28
--- /dev/null
+++ b/client/packages/rtc-web/src/assets/svg-icon/mirror-image.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/client/packages/rtc-web/src/assets/svg-icon/up.svg b/client/packages/rtc-web/src/assets/svg-icon/up.svg
new file mode 100644
index 0000000..6445439
--- /dev/null
+++ b/client/packages/rtc-web/src/assets/svg-icon/up.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/client/packages/rtc-web/src/assets/svg-icon/user-smail.svg b/client/packages/rtc-web/src/assets/svg-icon/user-smail.svg
new file mode 100644
index 0000000..a425c7f
--- /dev/null
+++ b/client/packages/rtc-web/src/assets/svg-icon/user-smail.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/client/packages/rtc-web/src/components/back/back-previous-level.vue b/client/packages/rtc-web/src/components/back/back-previous-level.vue
new file mode 100644
index 0000000..27eab48
--- /dev/null
+++ b/client/packages/rtc-web/src/components/back/back-previous-level.vue
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
diff --git a/client/packages/rtc-web/src/components/back/back-title.vue b/client/packages/rtc-web/src/components/back/back-title.vue
new file mode 100644
index 0000000..5fbc3a6
--- /dev/null
+++ b/client/packages/rtc-web/src/components/back/back-title.vue
@@ -0,0 +1,26 @@
+
+
+
+
+
+
{{ props.title }}
+
+
+
diff --git a/client/packages/rtc-web/src/components/back/index.ts b/client/packages/rtc-web/src/components/back/index.ts
new file mode 100644
index 0000000..7525fb5
--- /dev/null
+++ b/client/packages/rtc-web/src/components/back/index.ts
@@ -0,0 +1,2 @@
+export { default as BackPreviousLevel } from './back-previous-level.vue';
+export { default as BackTitle } from './back-title.vue';
diff --git a/client/packages/rtc-web/src/components/base/dropdown.vue b/client/packages/rtc-web/src/components/base/dropdown.vue
new file mode 100644
index 0000000..4c5f3e5
--- /dev/null
+++ b/client/packages/rtc-web/src/components/base/dropdown.vue
@@ -0,0 +1,34 @@
+
+
+
+
+
diff --git a/client/packages/rtc-web/src/components/base/index.ts b/client/packages/rtc-web/src/components/base/index.ts
index 5637d61..29d3aac 100644
--- a/client/packages/rtc-web/src/components/base/index.ts
+++ b/client/packages/rtc-web/src/components/base/index.ts
@@ -1,3 +1,5 @@
export { default as SvgIcon } from './svg-icon.vue';
export { default as NavIcons } from './nav-icons.vue';
export { default as Modal } from './modal.vue';
+export { default as Dropdown } from './dropdown.vue';
+export { default as ToastBox } from './toast.vue';
diff --git a/client/packages/rtc-web/src/components/base/nav-icons.vue b/client/packages/rtc-web/src/components/base/nav-icons.vue
index 4ed2cbc..df87805 100644
--- a/client/packages/rtc-web/src/components/base/nav-icons.vue
+++ b/client/packages/rtc-web/src/components/base/nav-icons.vue
@@ -1,11 +1,15 @@
+
+
+
+
+
+ {{ props.msg }}
+
+
+
diff --git a/client/packages/rtc-web/src/components/chat-room/chat-content.vue b/client/packages/rtc-web/src/components/chat-room/chat-content.vue
new file mode 100644
index 0000000..8aca609
--- /dev/null
+++ b/client/packages/rtc-web/src/components/chat-room/chat-content.vue
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
diff --git a/client/packages/rtc-web/src/components/chat-room/chat-input.vue b/client/packages/rtc-web/src/components/chat-room/chat-input.vue
new file mode 100644
index 0000000..12ff1bb
--- /dev/null
+++ b/client/packages/rtc-web/src/components/chat-room/chat-input.vue
@@ -0,0 +1,54 @@
+
+
+
+
+
diff --git a/client/packages/rtc-web/src/components/chat-room/chat-message.vue b/client/packages/rtc-web/src/components/chat-room/chat-message.vue
new file mode 100644
index 0000000..8f73385
--- /dev/null
+++ b/client/packages/rtc-web/src/components/chat-room/chat-message.vue
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+ {{ props.message }}
+
+
+
+
diff --git a/client/packages/rtc-web/src/components/chat-room/chat-room-user.vue b/client/packages/rtc-web/src/components/chat-room/chat-room-user.vue
new file mode 100644
index 0000000..68bd5fd
--- /dev/null
+++ b/client/packages/rtc-web/src/components/chat-room/chat-room-user.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
房主
+
+
+
+ 房间成员 ({{ memberwithoutOwner.length }})
+
+
+
+
diff --git a/client/packages/rtc-web/src/components/chat-room/index.ts b/client/packages/rtc-web/src/components/chat-room/index.ts
new file mode 100644
index 0000000..1e0007a
--- /dev/null
+++ b/client/packages/rtc-web/src/components/chat-room/index.ts
@@ -0,0 +1,5 @@
+export { default as ChatInput } from './chat-input.vue';
+export { default as ChatMessage } from './chat-message.vue';
+export { default as ChatRoomUser } from './chat-room-user.vue';
+export { default as ChatContent } from './chat-content.vue';
+export { default as UserCard } from './user-card.vue';
diff --git a/client/packages/rtc-web/src/components/chat-room/props.ts b/client/packages/rtc-web/src/components/chat-room/props.ts
new file mode 100644
index 0000000..8088b7d
--- /dev/null
+++ b/client/packages/rtc-web/src/components/chat-room/props.ts
@@ -0,0 +1,7 @@
+export type UserCardProps = {
+ iconname?: string;
+ iconcolor?: string;
+ username?: string;
+ time?: string;
+ reverse?: boolean;
+};
diff --git a/client/packages/rtc-web/src/components/chat-room/user-card.vue b/client/packages/rtc-web/src/components/chat-room/user-card.vue
new file mode 100644
index 0000000..8a30ea9
--- /dev/null
+++ b/client/packages/rtc-web/src/components/chat-room/user-card.vue
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+ {{ username }}
+ {{
+ time
+ }}
+
+
+
+
+
+
diff --git a/client/packages/rtc-web/src/components/emoji/index.vue b/client/packages/rtc-web/src/components/emoji/index.vue
new file mode 100644
index 0000000..3f2c001
--- /dev/null
+++ b/client/packages/rtc-web/src/components/emoji/index.vue
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/client/packages/rtc-web/src/components/error-boundary/index.vue b/client/packages/rtc-web/src/components/error-boundary/index.vue
new file mode 100644
index 0000000..bd7e647
--- /dev/null
+++ b/client/packages/rtc-web/src/components/error-boundary/index.vue
@@ -0,0 +1,31 @@
+
+
+
+
+
+
无法显示?也许可以帮到您:
+
+ -
+ {{ index + 1 }}. {{ item }}
+
+
+
+
+
+
+
+
+
diff --git a/client/packages/rtc-web/src/components/form-room/form-room.vue b/client/packages/rtc-web/src/components/form-room/form-room.vue
index 0216a9a..d1fd70c 100644
--- a/client/packages/rtc-web/src/components/form-room/form-room.vue
+++ b/client/packages/rtc-web/src/components/form-room/form-room.vue
@@ -2,7 +2,6 @@
import { useRoom } from '@/hooks';
import { useForm } from '../form-base';
import { computed } from 'vue';
-import { watch } from 'vue';
defineOptions({
name: 'FormRoom',
@@ -16,13 +15,6 @@ const { validateRoomId } = useRoom(() => formData.value.roomId || '');
const roomIdValid = computed(() => !formErrors.value['roomId']);
-watch(
- () => roomIdValid.value,
- (v) => {
- console.log(v);
- }
-);
-
defineExpose({
onSubmit: handleSubmit,
resetForm: resetFields,
diff --git a/client/packages/rtc-web/src/components/lib.tsx b/client/packages/rtc-web/src/components/lib.tsx
index 37351cb..a57ae15 100644
--- a/client/packages/rtc-web/src/components/lib.tsx
+++ b/client/packages/rtc-web/src/components/lib.tsx
@@ -1,8 +1,12 @@
import { SetupContext } from 'vue';
import { SvgIcon, NavIcons } from './base';
import { MenuSide } from './menu';
+import { resetUrl } from '@/utils';
-export const NavHeader = () => {
+export const NavHeader = (
+ { showSiderbar }: Partial<{ showSiderbar: boolean }>,
+ ctx: SetupContext
+) => {
return (
@@ -10,22 +14,39 @@ export const NavHeader = () => {
{/* Navbar */}
-
+ {showSiderbar ? (
+
+ ) : undefined}
+
+
+
+ Web-Rtc
+
-
Web-Rtc
-
-
-
-
+
+ {showSiderbar ? (
+
+
+
+
+ ) : undefined}
);
};
@@ -47,7 +68,7 @@ export const FullHeightFlexBox = (
};
return (
-
+
{ctx.slots.default?.()}
);
diff --git a/client/packages/rtc-web/src/components/list/select-list.vue b/client/packages/rtc-web/src/components/list/select-list.vue
new file mode 100644
index 0000000..ac1605b
--- /dev/null
+++ b/client/packages/rtc-web/src/components/list/select-list.vue
@@ -0,0 +1,40 @@
+
+
+
+
+
+ {{ props.title }}
+
+
+
+
diff --git a/client/packages/rtc-web/src/components/menu-action.vue b/client/packages/rtc-web/src/components/menu-action.vue
new file mode 100644
index 0000000..66805d5
--- /dev/null
+++ b/client/packages/rtc-web/src/components/menu-action.vue
@@ -0,0 +1,75 @@
+
+
+
+
+
diff --git a/client/packages/rtc-web/src/components/menu/menu-list.vue b/client/packages/rtc-web/src/components/menu/menu-list.vue
index 0a7558f..f5cd5fa 100644
--- a/client/packages/rtc-web/src/components/menu/menu-list.vue
+++ b/client/packages/rtc-web/src/components/menu/menu-list.vue
@@ -20,6 +20,11 @@ const menuListData = ref([
icon: 'add-icon',
label: '聊天',
},
+ {
+ key: 'video',
+ icon: 'add-icon',
+ label: '视频聊天',
+ },
]);
const currentCreateRoomByKey = ref('');
@@ -56,7 +61,10 @@ const handleClose = () => {
class="flex items-center justify-between"
>
{{ item.label }}
-
diff --git a/client/packages/rtc-web/src/components/menu/menu-side.vue b/client/packages/rtc-web/src/components/menu/menu-side.vue
index 2da499e..68f429f 100644
--- a/client/packages/rtc-web/src/components/menu/menu-side.vue
+++ b/client/packages/rtc-web/src/components/menu/menu-side.vue
@@ -7,7 +7,7 @@ defineOptions({
-