mirror of
				https://github.com/soybeanjs/soybean-admin.git
				synced 2025-11-04 07:43:42 +08:00 
			
		
		
		
	feat(projects): add websocket demo
This commit is contained in:
		@@ -72,6 +72,7 @@
 | 
			
		||||
    "pinia": "2.1.4",
 | 
			
		||||
    "print-js": "1.6.0",
 | 
			
		||||
    "qs": "6.11.2",
 | 
			
		||||
    "socket.io-client": "^4.6.2",
 | 
			
		||||
    "swiper": "9.4.1",
 | 
			
		||||
    "ua-parser-js": "1.0.35",
 | 
			
		||||
    "vditor": "3.9.3",
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										72
									
								
								pnpm-lock.yaml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										72
									
								
								pnpm-lock.yaml
									
									
									
										generated
									
									
									
								
							@@ -61,6 +61,9 @@ dependencies:
 | 
			
		||||
  qs:
 | 
			
		||||
    specifier: 6.11.2
 | 
			
		||||
    version: 6.11.2
 | 
			
		||||
  socket.io-client:
 | 
			
		||||
    specifier: ^4.6.2
 | 
			
		||||
    version: 4.6.2
 | 
			
		||||
  swiper:
 | 
			
		||||
    specifier: 9.4.1
 | 
			
		||||
    version: 9.4.1
 | 
			
		||||
@@ -187,7 +190,7 @@ devDependencies:
 | 
			
		||||
    specifier: 2.0.1
 | 
			
		||||
    version: 2.0.1(vite@4.3.9)
 | 
			
		||||
  vite-plugin-vue-devtools:
 | 
			
		||||
    specifier: ^0.2.0
 | 
			
		||||
    specifier: 0.2.0
 | 
			
		||||
    version: 0.2.0(@types/node@20.3.1)(axios-cache-adapter@2.7.3)(axios@1.4.0)(body-parser@1.20.2)(cli-color@2.0.3)(express@4.18.2)(image-downloader@4.3.0)(jimp@0.16.13)(morgan@1.10.0)(pug@3.0.2)(rollup@2.79.1)(vite@4.3.9)(vue@3.3.4)
 | 
			
		||||
  vue-tsc:
 | 
			
		||||
    specifier: 1.6.5
 | 
			
		||||
@@ -2824,6 +2827,10 @@ packages:
 | 
			
		||||
    engines: {node: '>=14.16'}
 | 
			
		||||
    dev: true
 | 
			
		||||
 | 
			
		||||
  /@socket.io/component-emitter@3.1.0:
 | 
			
		||||
    resolution: {integrity: sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /@soybeanjs/changelog@0.0.4:
 | 
			
		||||
    resolution: {integrity: sha512-+aDF1k8Vy5StReDe+1bm1cymOnFCdnY2huf6Nuj1u2sbnfaTaySQ3XcFR56rxNVSh9iRaWSOPEkj74rLYjuFxg==}
 | 
			
		||||
    dependencies:
 | 
			
		||||
@@ -4995,7 +5002,6 @@ packages:
 | 
			
		||||
        optional: true
 | 
			
		||||
    dependencies:
 | 
			
		||||
      ms: 2.1.2
 | 
			
		||||
    dev: true
 | 
			
		||||
 | 
			
		||||
  /decode-uri-component@0.2.2:
 | 
			
		||||
    resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==}
 | 
			
		||||
@@ -5284,6 +5290,25 @@ packages:
 | 
			
		||||
    dev: true
 | 
			
		||||
    optional: true
 | 
			
		||||
 | 
			
		||||
  /engine.io-client@6.4.0:
 | 
			
		||||
    resolution: {integrity: sha512-GyKPDyoEha+XZ7iEqam49vz6auPnNJ9ZBfy89f+rMMas8AuiMWOZ9PVzu8xb9ZC6rafUqiGHSCfu22ih66E+1g==}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      '@socket.io/component-emitter': 3.1.0
 | 
			
		||||
      debug: 4.3.4
 | 
			
		||||
      engine.io-parser: 5.0.7
 | 
			
		||||
      ws: 8.11.0
 | 
			
		||||
      xmlhttprequest-ssl: 2.0.0
 | 
			
		||||
    transitivePeerDependencies:
 | 
			
		||||
      - bufferutil
 | 
			
		||||
      - supports-color
 | 
			
		||||
      - utf-8-validate
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /engine.io-parser@5.0.7:
 | 
			
		||||
    resolution: {integrity: sha512-P+jDFbvK6lE3n1OL+q9KuzdOFWkkZ/cMV9gol/SbVfpyqfvrfrFTOFJ6fQm2VC3PZHlU3QPhVwmbsCnauHF2MQ==}
 | 
			
		||||
    engines: {node: '>=10.0.0'}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /enquirer@2.3.6:
 | 
			
		||||
    resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==}
 | 
			
		||||
    engines: {node: '>=8.6'}
 | 
			
		||||
@@ -8221,7 +8246,6 @@ packages:
 | 
			
		||||
 | 
			
		||||
  /ms@2.1.2:
 | 
			
		||||
    resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
 | 
			
		||||
    dev: true
 | 
			
		||||
 | 
			
		||||
  /ms@2.1.3:
 | 
			
		||||
    resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
 | 
			
		||||
@@ -9939,6 +9963,30 @@ packages:
 | 
			
		||||
      - supports-color
 | 
			
		||||
    dev: true
 | 
			
		||||
 | 
			
		||||
  /socket.io-client@4.6.2:
 | 
			
		||||
    resolution: {integrity: sha512-OwWrMbbA8wSqhBAR0yoPK6EdQLERQAYjXb3A0zLpgxfM1ZGLKoxHx8gVmCHA6pcclRX5oA/zvQf7bghAS11jRA==}
 | 
			
		||||
    engines: {node: '>=10.0.0'}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      '@socket.io/component-emitter': 3.1.0
 | 
			
		||||
      debug: 4.3.4
 | 
			
		||||
      engine.io-client: 6.4.0
 | 
			
		||||
      socket.io-parser: 4.2.4
 | 
			
		||||
    transitivePeerDependencies:
 | 
			
		||||
      - bufferutil
 | 
			
		||||
      - supports-color
 | 
			
		||||
      - utf-8-validate
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /socket.io-parser@4.2.4:
 | 
			
		||||
    resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==}
 | 
			
		||||
    engines: {node: '>=10.0.0'}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      '@socket.io/component-emitter': 3.1.0
 | 
			
		||||
      debug: 4.3.4
 | 
			
		||||
    transitivePeerDependencies:
 | 
			
		||||
      - supports-color
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /socks-proxy-agent@7.0.0:
 | 
			
		||||
    resolution: {integrity: sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==}
 | 
			
		||||
    engines: {node: '>= 10'}
 | 
			
		||||
@@ -11548,6 +11596,19 @@ packages:
 | 
			
		||||
      typedarray-to-buffer: 3.1.5
 | 
			
		||||
    dev: true
 | 
			
		||||
 | 
			
		||||
  /ws@8.11.0:
 | 
			
		||||
    resolution: {integrity: sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==}
 | 
			
		||||
    engines: {node: '>=10.0.0'}
 | 
			
		||||
    peerDependencies:
 | 
			
		||||
      bufferutil: ^4.0.1
 | 
			
		||||
      utf-8-validate: ^5.0.2
 | 
			
		||||
    peerDependenciesMeta:
 | 
			
		||||
      bufferutil:
 | 
			
		||||
        optional: true
 | 
			
		||||
      utf-8-validate:
 | 
			
		||||
        optional: true
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /xdg-basedir@5.1.0:
 | 
			
		||||
    resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==}
 | 
			
		||||
    engines: {node: '>=12'}
 | 
			
		||||
@@ -11606,6 +11667,11 @@ packages:
 | 
			
		||||
    engines: {node: '>=4.0'}
 | 
			
		||||
    dev: true
 | 
			
		||||
 | 
			
		||||
  /xmlhttprequest-ssl@2.0.0:
 | 
			
		||||
    resolution: {integrity: sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==}
 | 
			
		||||
    engines: {node: '>=0.4.0'}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /xtend@4.0.2:
 | 
			
		||||
    resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==}
 | 
			
		||||
    engines: {node: '>=0.4'}
 | 
			
		||||
 
 | 
			
		||||
@@ -4,3 +4,4 @@ export * from './layout';
 | 
			
		||||
export * from './events';
 | 
			
		||||
export * from './echarts';
 | 
			
		||||
export * from './icon';
 | 
			
		||||
export * from './websocket';
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										50
									
								
								src/composables/websocket.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								src/composables/websocket.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,50 @@
 | 
			
		||||
import { io } from 'socket.io-client';
 | 
			
		||||
import type { Socket } from 'socket.io-client';
 | 
			
		||||
import { useAppStore } from '../store';
 | 
			
		||||
 | 
			
		||||
type ListenEvents = {
 | 
			
		||||
  update: (id: string, data: { name: string; age: number }) => void;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
type EmitEvents = {
 | 
			
		||||
  update: (id: string, data: { name: string; age: number }) => void;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export function useWebsocket() {
 | 
			
		||||
  const app = useAppStore();
 | 
			
		||||
 | 
			
		||||
  const socket: Socket<ListenEvents, EmitEvents> = (app.socket || io('ws://localhost:8080')) as Socket<
 | 
			
		||||
    ListenEvents,
 | 
			
		||||
    EmitEvents
 | 
			
		||||
  >;
 | 
			
		||||
 | 
			
		||||
  if (!app.socket) {
 | 
			
		||||
    app.setSocket(socket);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  function init() {
 | 
			
		||||
    window.console.log('[socket.io] connecting...');
 | 
			
		||||
 | 
			
		||||
    socket.on('connect', () => {
 | 
			
		||||
      window.console.log('[socket.io] connected.');
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    socket.on('disconnect', () => {
 | 
			
		||||
      window.console.log('[socket.io] disconnected.');
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    socket.on('update', (id, data) => {
 | 
			
		||||
      window.console.log('[socket.io] update', id, data);
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  function handleUpdate(id: string, data: { name: string; age: number }) {
 | 
			
		||||
    socket.emit('update', id, data);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  init();
 | 
			
		||||
 | 
			
		||||
  return {
 | 
			
		||||
    handleUpdate
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
@@ -1,5 +1,6 @@
 | 
			
		||||
import { nextTick } from 'vue';
 | 
			
		||||
import { defineStore } from 'pinia';
 | 
			
		||||
import type { Socket } from 'socket.io-client';
 | 
			
		||||
import { LAYOUT_SCROLL_EL_ID } from '@soybeanjs/vue-materials';
 | 
			
		||||
 | 
			
		||||
interface AppState {
 | 
			
		||||
@@ -17,6 +18,8 @@ interface AppState {
 | 
			
		||||
  siderCollapse: boolean;
 | 
			
		||||
  /** vertical-mix模式下 侧边栏的固定状态 */
 | 
			
		||||
  mixSiderFixed: boolean;
 | 
			
		||||
  /** socket.io 实例 */
 | 
			
		||||
  socket: Socket | null;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export const useAppStore = defineStore('app-store', {
 | 
			
		||||
@@ -27,7 +30,8 @@ export const useAppStore = defineStore('app-store', {
 | 
			
		||||
    reloadFlag: true,
 | 
			
		||||
    settingDrawerVisible: false,
 | 
			
		||||
    siderCollapse: false,
 | 
			
		||||
    mixSiderFixed: false
 | 
			
		||||
    mixSiderFixed: false,
 | 
			
		||||
    socket: null
 | 
			
		||||
  }),
 | 
			
		||||
  actions: {
 | 
			
		||||
    /**
 | 
			
		||||
@@ -97,6 +101,10 @@ export const useAppStore = defineStore('app-store', {
 | 
			
		||||
    /** 设置主体内容全屏 */
 | 
			
		||||
    setContentFull(full: boolean) {
 | 
			
		||||
      this.contentFull = full;
 | 
			
		||||
    },
 | 
			
		||||
    /** 设置socket实例 */
 | 
			
		||||
    setSocket<T extends Socket = Socket>(socket: T) {
 | 
			
		||||
      this.socket = socket;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
});
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								src/typings/page-route.d.ts
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								src/typings/page-route.d.ts
									
									
									
									
										vendored
									
									
								
							@@ -47,6 +47,7 @@ declare namespace PageRoute {
 | 
			
		||||
    | 'function_tab-detail'
 | 
			
		||||
    | 'function_tab-multi-detail'
 | 
			
		||||
    | 'function_tab'
 | 
			
		||||
    | 'function_websocket'
 | 
			
		||||
    | 'management'
 | 
			
		||||
    | 'management_auth'
 | 
			
		||||
    | 'management_role'
 | 
			
		||||
@@ -102,6 +103,7 @@ declare namespace PageRoute {
 | 
			
		||||
    | 'function_tab-detail'
 | 
			
		||||
    | 'function_tab-multi-detail'
 | 
			
		||||
    | 'function_tab'
 | 
			
		||||
    | 'function_websocket'
 | 
			
		||||
    | 'management_auth'
 | 
			
		||||
    | 'management_role'
 | 
			
		||||
    | 'management_route'
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										7
									
								
								src/views/function/websocket/index.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								src/views/function/websocket/index.vue
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,7 @@
 | 
			
		||||
<template>
 | 
			
		||||
  <div></div>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script setup lang="ts"></script>
 | 
			
		||||
 | 
			
		||||
<style scoped></style>
 | 
			
		||||
@@ -29,6 +29,7 @@ export const views: Record<
 | 
			
		||||
  'function_tab-detail': () => import('./function/tab-detail/index.vue'),
 | 
			
		||||
  'function_tab-multi-detail': () => import('./function/tab-multi-detail/index.vue'),
 | 
			
		||||
  function_tab: () => import('./function/tab/index.vue'),
 | 
			
		||||
  function_websocket: () => import('./function/websocket/index.vue'),
 | 
			
		||||
  management_auth: () => import('./management/auth/index.vue'),
 | 
			
		||||
  management_role: () => import('./management/role/index.vue'),
 | 
			
		||||
  management_route: () => import('./management/route/index.vue'),
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user