新增SSE

This commit is contained in:
wanggeng 2024-07-29 19:48:37 +08:00
parent 8b2acb15c5
commit 06c26fb6f7
10 changed files with 65 additions and 26 deletions

13
package-lock.json generated
View File

@ -11,6 +11,7 @@
"@ant-design/cssinjs": "^1.19.1", "@ant-design/cssinjs": "^1.19.1",
"antd": "^5.15.2", "antd": "^5.15.2",
"axios": "^1.6.7", "axios": "^1.6.7",
"event-source-polyfill": "^1.0.31",
"localforage": "^1.10.0", "localforage": "^1.10.0",
"match-sorter": "^6.3.4", "match-sorter": "^6.3.4",
"pinyin-pro": "^3.19.6", "pinyin-pro": "^3.19.6",
@ -22,6 +23,7 @@
"sort-by": "^1.2.0" "sort-by": "^1.2.0"
}, },
"devDependencies": { "devDependencies": {
"@types/event-source-polyfill": "^1.0.5",
"@types/react": "^18.2.56", "@types/react": "^18.2.56",
"@types/react-dom": "^18.2.19", "@types/react-dom": "^18.2.19",
"@typescript-eslint/eslint-plugin": "^7.0.2", "@typescript-eslint/eslint-plugin": "^7.0.2",
@ -1438,6 +1440,12 @@
"integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
"dev": true "dev": true
}, },
"node_modules/@types/event-source-polyfill": {
"version": "1.0.5",
"resolved": "https://registry.npmmirror.com/@types/event-source-polyfill/-/event-source-polyfill-1.0.5.tgz",
"integrity": "sha512-iaiDuDI2aIFft7XkcwMzDWLqo7LVDixd2sR6B4wxJut9xcp/Ev9bO4EFg4rm6S9QxATLBj5OPxdeocgmhjwKaw==",
"dev": true
},
"node_modules/@types/json-schema": { "node_modules/@types/json-schema": {
"version": "7.0.15", "version": "7.0.15",
"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
@ -2444,6 +2452,11 @@
"node": ">=0.10.0" "node": ">=0.10.0"
} }
}, },
"node_modules/event-source-polyfill": {
"version": "1.0.31",
"resolved": "https://registry.npmmirror.com/event-source-polyfill/-/event-source-polyfill-1.0.31.tgz",
"integrity": "sha512-4IJSItgS/41IxN5UVAVuAyczwZF7ZIEsM1XAoUzIHA6A+xzusEZUutdXz2Nr+MQPLxfTiCvqE79/C8HT8fKFvA=="
},
"node_modules/fast-deep-equal": { "node_modules/fast-deep-equal": {
"version": "3.1.3", "version": "3.1.3",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",

View File

@ -13,6 +13,7 @@
"@ant-design/cssinjs": "^1.19.1", "@ant-design/cssinjs": "^1.19.1",
"antd": "^5.15.2", "antd": "^5.15.2",
"axios": "^1.6.7", "axios": "^1.6.7",
"event-source-polyfill": "^1.0.31",
"localforage": "^1.10.0", "localforage": "^1.10.0",
"match-sorter": "^6.3.4", "match-sorter": "^6.3.4",
"pinyin-pro": "^3.19.6", "pinyin-pro": "^3.19.6",
@ -24,6 +25,7 @@
"sort-by": "^1.2.0" "sort-by": "^1.2.0"
}, },
"devDependencies": { "devDependencies": {
"@types/event-source-polyfill": "^1.0.5",
"@types/react": "^18.2.56", "@types/react": "^18.2.56",
"@types/react-dom": "^18.2.19", "@types/react-dom": "^18.2.19",
"@typescript-eslint/eslint-plugin": "^7.0.2", "@typescript-eslint/eslint-plugin": "^7.0.2",

View File

@ -88,8 +88,6 @@ export default function CardProj(props: any) {
} }
useEffect(() => { useEffect(() => {
console.log('查找图片', data);
const charge = props.item.pay.charge.split(':')[0]; const charge = props.item.pay.charge.split(':')[0];
let chargeName = ''; let chargeName = '';
if (charge == ProjChargeType.ALL) { if (charge == ProjChargeType.ALL) {

View File

@ -67,7 +67,6 @@ export default function ListProj() {
setIsLoading(true); setIsLoading(true);
}, },
onSuccess({ data }) { onSuccess({ data }) {
console.log('看看结果', data);
setPage(data.page); setPage(data.page);
setTotal(data.total); setTotal(data.total);
setProjs(data.rows); setProjs(data.rows);
@ -151,7 +150,6 @@ export default function ListProj() {
reqData(1); reqData(1);
renderCategory(); renderCategory();
} }
console.log(page);
setTimeout(() => { setTimeout(() => {
setShowPage(true) setShowPage(true)

View File

@ -173,7 +173,6 @@ export default function Payment(props: IPaymentProps) {
const renderMoney = () => { const renderMoney = () => {
console.log(form.getFieldValue('rechargeMoney'))
if (isRechargeMoneyEdit) { if (isRechargeMoneyEdit) {
return ( return (
<div> <div>
@ -363,7 +362,6 @@ export default function Payment(props: IPaymentProps) {
style={{ marginBottom: '0' }} style={{ marginBottom: '0' }}
valuePropName="fileList" valuePropName="fileList"
getValueFromEvent={(e: any) => { getValueFromEvent={(e: any) => {
console.log(e);
if (e.file.status === 'done') { if (e.file.status === 'done') {
rechargeVoucherArray.push(e.file.response.data.fileId); rechargeVoucherArray.push(e.file.response.data.fileId);
setRechargeVoucherArray(rechargeVoucherArray); setRechargeVoucherArray(rechargeVoucherArray);

View File

@ -1,11 +1,43 @@
import './recharge-head.css'; import './recharge-head.css';
import Payment from "../payment/Payment.tsx"; import Payment from "../payment/Payment.tsx";
import { Modal } from "antd"; import { Modal, message } from "antd";
import { useState } from "react"; import { useEffect, useState, useContext } from "react";
import { Axios, DevUserId } from "../../util/AjaxUtils.ts";
import { EventSourcePolyfill } from 'event-source-polyfill';
import { GlobalContext, GlobalDispatchContext, reloadUser } from "../../context/GlobalContext.ts";
type SseMsg = {
msg: string;
type: string;
}
export default function RechargeHead() { export default function RechargeHead() {
const [isPaymentModalOpen, setIsPaymentModalOpen] = useState(false); const [isPaymentModalOpen, setIsPaymentModalOpen] = useState(false);
const globalContext = useContext(GlobalContext);
const globalDispatchContext = useContext(GlobalDispatchContext);
const [messageApi] = message.useMessage();
// sse
const initSse = () => {
const evtSource = new EventSourcePolyfill(`${Axios.defaults.baseURL}/api/sse/connect`, {
headers: {
'X-USER-ID': DevUserId
}
});
evtSource.onmessage = function (event:any) {
const msg = JSON.parse(event.data) as SseMsg;
if(msg.type === 'AMOUNT_RECEIVED') {
reloadUser(messageApi, globalDispatchContext).then(() => {
setIsPaymentModalOpen(false);
});
}
};
}
useEffect(() => {
initSse();
}, [globalContext.user])
return ( return (
<> <>

View File

@ -16,6 +16,7 @@ import { reMenuActive } from '../../util/cache';
// import BelongPeople from '../../components/BelongPeople/BelongPeople.tsx' // import BelongPeople from '../../components/BelongPeople/BelongPeople.tsx'
import BelongPeople from '../../components/BelongPeople/BelongPeople.tsx' import BelongPeople from '../../components/BelongPeople/BelongPeople.tsx'
import ContactPeople from '../../components/ContactPeople/ContactPeople.tsx' import ContactPeople from '../../components/ContactPeople/ContactPeople.tsx'
export default function Head() { export default function Head() {
const globalContext = useContext(GlobalContext); const globalContext = useContext(GlobalContext);
const globalDispatchContext = useContext(GlobalDispatchContext); const globalDispatchContext = useContext(GlobalDispatchContext);
@ -53,6 +54,7 @@ export default function Head() {
applyContactPhone: '', applyContactPhone: '',
applyContactCompany: '' applyContactCompany: ''
}) })
useEffect(() => { useEffect(() => {
reloadUser(messageApi, globalDispatchContext).then((data) => { reloadUser(messageApi, globalDispatchContext).then((data) => {
if (!data.hasUserInfo) { if (!data.hasUserInfo) {
@ -182,7 +184,7 @@ export default function Head() {
title="个人信息" title="个人信息"
footer={false} footer={false}
onCancel={() => { onCancel={() => {
if (!globalContext.user.hasUserInfo ) { if (!globalContext.user.hasUserInfo) {
messageApi.info('请完善个人信息'); messageApi.info('请完善个人信息');
return; return;
} }

View File

@ -19,7 +19,6 @@ export default function Home() {
// setListType(state.listType) // setListType(state.listType)
// } // }
// console.log('传递过来的',listType); // console.log('传递过来的',listType);
console.log('页面判断',indexListContext.type);
return ( return (

View File

@ -200,7 +200,6 @@ export default function Index() {
const [showSearchBox, setShowSearchBox] = useState(true) const [showSearchBox, setShowSearchBox] = useState(true)
useEffect(() => { useEffect(() => {
// const nowname = sessionStorage.getItem('now') // const nowname = sessionStorage.getItem('now')
console.log('路由名字', location.pathname);
if (location.pathname.includes('/home')) { if (location.pathname.includes('/home')) {
setNow('首页') setNow('首页')
setPathArray([{ title: '首页' }]) setPathArray([{ title: '首页' }])
@ -331,7 +330,6 @@ export default function Index() {
}, []); }, []);
useEffect(() => { useEffect(() => {
console.log('监听type', type);
if (location.pathname.includes('/home')) { if (location.pathname.includes('/home')) {
nav('/home', { nav('/home', {
state: { state: {

View File

@ -1,15 +1,15 @@
import axios, {AxiosRequestConfig, AxiosResponse} from "axios"; import axios, { AxiosRequestConfig, AxiosResponse } from "axios";
import type {MessageInstance} from "antd/es/message/interface"; import type { MessageInstance } from "antd/es/message/interface";
export const Axios = axios; export const Axios = axios;
axios.defaults.baseURL = 'http://192.168.0.15:7025/copyright'; // axios.defaults.baseURL = 'http://192.168.0.15:7025/copyright';
// axios.defaults.baseURL = 'http://192.168.43.145:7025/copyright'; // axios.defaults.baseURL = 'http://192.168.43.145:7025/copyright';
// axios.defaults.baseURL = 'http://127.0.0.1:7025/copyright'; axios.defaults.baseURL = 'http://127.0.0.1:7025/copyright';
// axios.defaults.baseURL = 'https://www.aimzhu.com/copyright'; // axios.defaults.baseURL = 'https://www.aimzhu.com/copyright';
// axios.defaults.baseURL = '/copyright'; // axios.defaults.baseURL = '/copyright';
// export const WebSocketBaseUrl: string = 'ws://127.0.0.1:7025/copyright'; export const WebSocketBaseUrl: string = 'ws://127.0.0.1:7025/copyright';
export const WebSocketBaseUrl: string = 'ws://192.168.0.15:7025/copyright'; // export const WebSocketBaseUrl: string = 'ws://192.168.0.15:7025/copyright';
// export const WebSocketBaseUrl: string = '/copyright'; // export const WebSocketBaseUrl: string = '/copyright';
export const DevUserId: string = '80d3365e-0597-4988-979e-18ef1c3ec671'; // 18634604067 export const DevUserId: string = '80d3365e-0597-4988-979e-18ef1c3ec671'; // 18634604067
// export const DevUserId: string = 'eb9a82a6-6ed3-4ba0-90e6-d836cefff915'; // 15042810561 // export const DevUserId: string = 'eb9a82a6-6ed3-4ba0-90e6-d836cefff915'; // 15042810561
@ -35,12 +35,11 @@ export interface IDictionary {
axios.interceptors.request.use(config => { axios.interceptors.request.use(config => {
if (config.method === 'get') { if (config.method === 'get') {
config.data = {unused: 0} // 这个是关键点解决get 请求添加不上content_type config.data = { unused: 0 } // 这个是关键点解决get 请求添加不上content_type
} }
config.headers['X-USER-ID'] = DevUserId; config.headers['X-USER-ID'] = DevUserId;
return config return config
} });
);
export function websocketUrl() { export function websocketUrl() {
if (WebSocketBaseUrl.startsWith('ws')) { if (WebSocketBaseUrl.startsWith('ws')) {
@ -70,7 +69,7 @@ export async function listDictionary(parentId: string, messageApi: MessageInstan
get<IDictionary[]>({ get<IDictionary[]>({
messageApi, messageApi,
url: `/api/data/listbyparentid/${parentId}`, url: `/api/data/listbyparentid/${parentId}`,
onSuccess({data}) { onSuccess({ data }) {
resolve(data); resolve(data);
} }
}) })