mirror of
https://codeup.aliyun.com/67762337eccfc218f6110e0e/vue/fe-manage.git
synced 2025-12-10 11:26:45 +08:00
feat:合并
This commit is contained in:
15
.env
15
.env
@@ -1,11 +1,8 @@
|
|||||||
VITE_BASE=/manage
|
VUE_APP_BASE=/manage
|
||||||
VITE_BASE_API=/
|
VUE_APP_BASE_API=/manageApi
|
||||||
VITE_PROXY_URL=http://111.231.196.214:30001/
|
VUE_APP_PROXY_URL=http://111.231.196.214:30001/
|
||||||
VITE_LOGIN_URL=https://u-pre.boe.com/web
|
VUE_APP_LOGIN_URL=https://u-pre.boe.com/web
|
||||||
|
|
||||||
|
|
||||||
VITE_BOE_ONLINE_CLASS_URL=https://u-pre.boe.com/pc/course/studyindex?id=
|
VUE_APP_IFRAME_URL=https://u-pre.boe.com/pc-release/iframe
|
||||||
VITE_BOE_CASS_DETAIL_URL=https://u-pre.boe.com/pc/case/detail?id=
|
VUE_APP_IFRAME_STUDENT_URL=https://u-pre.boe.com/pc-release/loading
|
||||||
VITE_BOE_TEST_DETAIL_URL=https://u-pre.boe.com/web/quizsummary?detailId=
|
|
||||||
|
|
||||||
VITE_BOE_API_URL=https://u-pre.boe.com
|
|
||||||
|
|||||||
9
.env.boe
9
.env.boe
@@ -1,9 +1,4 @@
|
|||||||
VITE_BASE=/manage
|
VUE_APP_BASE=/manage
|
||||||
VITE_BASE_API=/manageApi
|
VUE_APP_BASE_API=/manageApi
|
||||||
|
|
||||||
|
|
||||||
VITE_BOE_ONLINE_CLASS_URL=https://u-pre.boe.com/pc/course/studyindex?id=
|
|
||||||
VITE_BOE_CASS_DETAIL_URL=https://u-pre.boe.com/pc/case/detail?id=
|
|
||||||
VITE_BOE_TEST_DETAIL_URL=https://u-pre.boe.com/web/quizsummary?detailId=
|
|
||||||
|
|
||||||
VITE_BOE_API_URL=https://u-pre.boe.com
|
|
||||||
10
.env.prod
10
.env.prod
@@ -1,8 +1,2 @@
|
|||||||
VITE_BASE=/fe-student-release
|
VUE_APP_BASE=/manage
|
||||||
VITE_BASE_API=/manageApi-release
|
VUE_APP_BASE_API=/manageApi
|
||||||
|
|
||||||
VITE_BOE_ONLINE_CLASS_URL=https://u.boe.com/pc-release/course/studyindex?id=
|
|
||||||
VITE_BOE_CASS_DETAIL_URL=https://u.boe.com/pc-release/case/detail?id=
|
|
||||||
VITE_BOE_TEST_DETAIL_URL=https://u.boe.com/web/quizsummary?detailId=
|
|
||||||
|
|
||||||
VITE_BOE_API_URL=https://u.boe.com
|
|
||||||
13
.env.release
13
.env.release
@@ -1,10 +1,7 @@
|
|||||||
VITE_BASE=/fe-student-release
|
VUE_APP_BASE=/manage-release
|
||||||
VITE_BASE_API=/manageApi-release
|
VUE_APP_BASE_API=/manageApi-release
|
||||||
VITE_LOGIN_URL=https://u.boe.com/web
|
VUE_APP_LOGIN_URL=https://u.boe.com/web
|
||||||
|
|
||||||
|
|
||||||
VITE_BOE_ONLINE_CLASS_URL=https://u.boe.com/pc-release/course/studyindex?id=
|
VUE_APP_IFRAME_URL=https://u-pre.boe.com/pc-release/iframe
|
||||||
VITE_BOE_CASS_DETAIL_URL=https://u.boe.com/pc-release/case/detail?id=
|
VUE_APP_IFRAME_STUDENT_URL=https://u-pre.boe.com/pc-release/loading
|
||||||
VITE_BOE_TEST_DETAIL_URL=https://u.boe.com/web/quizsummary?detailId=
|
|
||||||
|
|
||||||
VITE_BOE_API_URL=https://u.boe.com
|
|
||||||
@@ -1,9 +1,4 @@
|
|||||||
VITE_BASE=/fe-student
|
VUE_APP_BASE=/manage
|
||||||
VITE_BASE_API=/manageApi
|
VUE_APP_BASE_API=/manageApi
|
||||||
|
|
||||||
|
|
||||||
VITE_BOE_ONLINE_CLASS_URL=https://u.boe.com/pc-release/course/studyindex?id=
|
|
||||||
VITE_BOE_CASS_DETAIL_URL=https://u-pre.boe.com/pc/case/detail?id=
|
|
||||||
VITE_BOE_TEST_DETAIL_URL=https://u-pre.boe.com/web/quizsummary?detailId=
|
|
||||||
|
|
||||||
VITE_BOE_API_URL=https://u-pre.boe.com
|
|
||||||
135
package.json
135
package.json
@@ -1,68 +1,71 @@
|
|||||||
{
|
{
|
||||||
"name": "fe_manage",
|
"name": "fe_manage",
|
||||||
"version": "0.1.0",
|
"version": "0.1.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"serve": "vue-cli-service serve --mode boe",
|
"serve": "vue-cli-service serve",
|
||||||
"build": "vue-cli-service build",
|
"build": "vue-cli-service build",
|
||||||
"lint": "vue-cli-service lint"
|
"build:boe": "vue-cli-service build --mode boe",
|
||||||
},
|
"build:release": "vue-cli-service build --mode release",
|
||||||
"dependencies": {
|
"build:prod": "vue-cli-service build --mode prod",
|
||||||
"@wangeditor/editor": "^5.1.23",
|
"build:test": "vue-cli-service build --mode test"
|
||||||
"@wangeditor/editor-for-vue": "^5.1.12",
|
},
|
||||||
"ant-design-vue": "^3.2.12",
|
"dependencies": {
|
||||||
"axios": "^1.1.3",
|
"@wangeditor/editor": "^5.1.23",
|
||||||
"core-js": "^3.8.3",
|
"@wangeditor/editor-for-vue": "^5.1.12",
|
||||||
"dayjs": "^1.11.6",
|
"ant-design-vue": "^3.2.12",
|
||||||
"element-plus": "^2.2.17",
|
"axios": "^1.1.3",
|
||||||
"element-resize-detector": "^1.2.4",
|
"core-js": "^3.8.3",
|
||||||
"html2canvas": "^1.4.1",
|
"dayjs": "^1.11.6",
|
||||||
"jquery": "^3.6.1",
|
"element-plus": "^2.2.17",
|
||||||
"mitt": "^3.0.0",
|
"element-resize-detector": "^1.2.4",
|
||||||
"moment": "^2.29.4",
|
"html2canvas": "^1.4.1",
|
||||||
"qrcode.vue": "^3.3.3",
|
"jquery": "^3.6.1",
|
||||||
"qs": "^6.11.0",
|
"mitt": "^3.0.0",
|
||||||
"sortablejs": "^1.15.0",
|
"moment": "^2.29.4",
|
||||||
"vue": "^3.2.13",
|
"qrcode.vue": "^3.3.3",
|
||||||
"vue-router": "^4.0.3",
|
"qs": "^6.11.0",
|
||||||
"vuedraggable": "^4.1.0",
|
"sortablejs": "^1.15.0",
|
||||||
"vuex": "^4.0.0"
|
"vue": "^3.2.13",
|
||||||
},
|
"vue-router": "^4.0.3",
|
||||||
"devDependencies": {
|
"vuedraggable": "^4.1.0",
|
||||||
"@babel/core": "^7.12.16",
|
"vuex": "^4.0.0"
|
||||||
"@babel/eslint-parser": "^7.12.16",
|
},
|
||||||
"@vue/cli-plugin-babel": "~5.0.0",
|
"devDependencies": {
|
||||||
"@vue/cli-plugin-eslint": "~5.0.0",
|
"@babel/core": "^7.12.16",
|
||||||
"@vue/cli-plugin-router": "~5.0.0",
|
"@babel/eslint-parser": "^7.12.16",
|
||||||
"@vue/cli-plugin-vuex": "~5.0.0",
|
"@vue/cli-plugin-babel": "~5.0.0",
|
||||||
"@vue/cli-service": "~5.0.0",
|
"@vue/cli-plugin-eslint": "~5.0.0",
|
||||||
"eslint": "^7.32.0",
|
"@vue/cli-plugin-router": "~5.0.0",
|
||||||
"eslint-plugin-vue": "^8.0.3",
|
"@vue/cli-plugin-vuex": "~5.0.0",
|
||||||
"sass": "^1.32.7",
|
"@vue/cli-service": "~5.0.0",
|
||||||
"sass-loader": "^12.0.0"
|
"eslint": "^7.32.0",
|
||||||
},
|
"eslint-plugin-vue": "^8.0.3",
|
||||||
"eslintConfig": {
|
"sass": "^1.32.7",
|
||||||
"root": true,
|
"sass-loader": "^12.0.0"
|
||||||
"env": {
|
},
|
||||||
"node": true
|
"eslintConfig": {
|
||||||
},
|
"root": true,
|
||||||
"extends": [
|
"env": {
|
||||||
"plugin:vue/vue3-essential",
|
"node": true
|
||||||
"eslint:recommended"
|
},
|
||||||
],
|
"extends": [
|
||||||
"parserOptions": {
|
"plugin:vue/vue3-essential",
|
||||||
"parser": "@babel/eslint-parser"
|
"eslint:recommended"
|
||||||
},
|
],
|
||||||
"rules": {
|
"parserOptions": {
|
||||||
"no-console": "off",
|
"parser": "@babel/eslint-parser"
|
||||||
"no-debugger": "off",
|
},
|
||||||
"no-mixed-spaces-and-tabs": "off"
|
"rules": {
|
||||||
}
|
"no-console": "off",
|
||||||
},
|
"no-debugger": "off",
|
||||||
"browserslist": [
|
"no-mixed-spaces-and-tabs": "off"
|
||||||
"> 1%",
|
}
|
||||||
"last 2 versions",
|
},
|
||||||
"not dead",
|
"browserslist": [
|
||||||
"not ie 11"
|
"> 1%",
|
||||||
]
|
"last 2 versions",
|
||||||
|
"not dead",
|
||||||
|
"not ie 11"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ import router from "@/router";
|
|||||||
|
|
||||||
axios.defaults.withCredentials = true;
|
axios.defaults.withCredentials = true;
|
||||||
const http = axios.create({
|
const http = axios.create({
|
||||||
baseURL: process.env.VITE_BASE_API,
|
baseURL: process.env.VUE_APP_BASE_API,
|
||||||
timeout: 1000 * 15,
|
timeout: 1000 * 15,
|
||||||
// headers: { "Content-Type": "multipart/form-data" },
|
// headers: { "Content-Type": "multipart/form-data" },
|
||||||
headers: { "Content-Type": "application/json" },
|
headers: { "Content-Type": "application/json" },
|
||||||
@@ -57,7 +57,7 @@ http.interceptors.response.use(
|
|||||||
return response;
|
return response;
|
||||||
} else {
|
} else {
|
||||||
if (code === 1000) {
|
if (code === 1000) {
|
||||||
process.env.NODE_ENV === 'development' ? router.push({ path: 'login' }) : (window.location.href = process.env.VITE_LOGIN_URL)
|
process.env.NODE_ENV === 'development' ? router.push({ path: 'login' }) : (window.location.href = process.env.VUE_APP_LOGIN_URL)
|
||||||
}
|
}
|
||||||
console.log("api %o", msg);
|
console.log("api %o", msg);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -276,9 +276,9 @@ const commonData = {
|
|||||||
const organizationalTree = []
|
const organizationalTree = []
|
||||||
|
|
||||||
//嵌套页面
|
//嵌套页面
|
||||||
const iframeUrl = "https://u-pre.boe.com/pc/iframe"
|
const iframeUrl = process.env.VUE_APP_IFRAME_URL
|
||||||
//学员端路由
|
//学员端路由
|
||||||
const studentUrl = 'https://u-pre.boe.com/pc/loading'
|
const studentUrl = process.env.VUE_APP_IFRAME_STUDENT_URL
|
||||||
|
|
||||||
//二维码
|
//二维码
|
||||||
const codeUrl = "https://u-pre.boe.com"
|
const codeUrl = "https://u-pre.boe.com"
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ const routes = [
|
|||||||
...routesConfig
|
...routesConfig
|
||||||
]
|
]
|
||||||
const router = createRouter({
|
const router = createRouter({
|
||||||
history: createWebHistory(process.env.VITE_BASE),
|
history: createWebHistory(process.env.VUE_APP_BASE),
|
||||||
routes,
|
routes,
|
||||||
|
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -75,7 +75,7 @@
|
|||||||
<a-range-picker
|
<a-range-picker
|
||||||
v-model:value="projectTime"
|
v-model:value="projectTime"
|
||||||
style="width: 420px"
|
style="width: 420px"
|
||||||
valueFormat="X"
|
format="YYYY-MM-DD"
|
||||||
separator="至"
|
separator="至"
|
||||||
:placeholder="[' 开始时间', ' 结束时间']"
|
:placeholder="[' 开始时间', ' 结束时间']"
|
||||||
/>
|
/>
|
||||||
@@ -2958,26 +2958,26 @@ const columns1 = [
|
|||||||
return text ? text : "-";
|
return text ? text : "-";
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
// {
|
||||||
title: "学习人数",
|
// title: "学习人数",
|
||||||
width: 130,
|
// width: 130,
|
||||||
dataIndex: "stunum",
|
// dataIndex: "stunum",
|
||||||
key: "4",
|
// key: "4",
|
||||||
align: "center",
|
// align: "center",
|
||||||
customRender: ({ text }) => {
|
// customRender: ({ text }) => {
|
||||||
return text ? text : "0";
|
// // return text ? text : "0";
|
||||||
},
|
// },
|
||||||
},
|
// },
|
||||||
{
|
// {
|
||||||
title: "评分",
|
// title: "评分",
|
||||||
width: 130,
|
// width: 130,
|
||||||
dataIndex: "grade",
|
// dataIndex: "grade",
|
||||||
key: "5",
|
// key: "5",
|
||||||
align: "center",
|
// align: "center",
|
||||||
customRender: ({ text }) => {
|
// customRender: ({ text }) => {
|
||||||
return text ? text : "0";
|
// return text ? text : "0";
|
||||||
},
|
// },
|
||||||
},
|
// },
|
||||||
{
|
{
|
||||||
title: "状态",
|
title: "状态",
|
||||||
width: 130,
|
width: 130,
|
||||||
@@ -3632,7 +3632,7 @@ export default defineComponent({
|
|||||||
|
|
||||||
imageUrl: "",
|
imageUrl: "",
|
||||||
imgList: [],
|
imgList: [],
|
||||||
validate: false,
|
validate:true,
|
||||||
|
|
||||||
pageSize2: 10,
|
pageSize2: 10,
|
||||||
currentPage2: 0,
|
currentPage2: 0,
|
||||||
@@ -3984,8 +3984,16 @@ export default defineComponent({
|
|||||||
let startTime = "";
|
let startTime = "";
|
||||||
let endTime = "";
|
let endTime = "";
|
||||||
if (state.projectTime) {
|
if (state.projectTime) {
|
||||||
startTime = state.projectTime[0];
|
|
||||||
endTime = state.projectTime[1];
|
startTime = toDate(
|
||||||
|
new Date(state.projectTime[0].$d).getTime() / 1000,
|
||||||
|
"Y-M-D"
|
||||||
|
);
|
||||||
|
endTime = toDate(
|
||||||
|
new Date(state.projectTime[1].$d).getTime() / 1000,
|
||||||
|
"Y-M-D"
|
||||||
|
);
|
||||||
|
|
||||||
}
|
}
|
||||||
let res = await list({
|
let res = await list({
|
||||||
pageNo: state.currentPage1,
|
pageNo: state.currentPage1,
|
||||||
|
|||||||
@@ -1499,14 +1499,14 @@ export default {
|
|||||||
align: "center",
|
align: "center",
|
||||||
className: "h",
|
className: "h",
|
||||||
},
|
},
|
||||||
// {
|
{
|
||||||
// title: "进度",
|
title: "进度",
|
||||||
// dataIndex: "jin",
|
dataIndex: "jin",
|
||||||
// key: "jin",
|
key: "jin",
|
||||||
// width: 110,
|
width: 110,
|
||||||
// align: "center",
|
align: "center",
|
||||||
// className: "h",
|
className: "h",
|
||||||
// },
|
},
|
||||||
{
|
{
|
||||||
title: "开始时间",
|
title: "开始时间",
|
||||||
dataIndex: "time",
|
dataIndex: "time",
|
||||||
|
|||||||
@@ -1547,14 +1547,14 @@ export default {
|
|||||||
align: "center",
|
align: "center",
|
||||||
className: "h",
|
className: "h",
|
||||||
},
|
},
|
||||||
// {
|
{
|
||||||
// title: "进度",
|
title: "进度",
|
||||||
// dataIndex: "jin",
|
dataIndex: "jin",
|
||||||
// key: "jin",
|
key: "jin",
|
||||||
// width: 110,
|
width: 110,
|
||||||
// align: "center",
|
align: "center",
|
||||||
// className: "h",
|
className: "h",
|
||||||
// },
|
},
|
||||||
{
|
{
|
||||||
title: "开始时间",
|
title: "开始时间",
|
||||||
dataIndex: "time",
|
dataIndex: "time",
|
||||||
|
|||||||
@@ -47,12 +47,7 @@
|
|||||||
<div class="addTime">创建时间:</div>
|
<div class="addTime">创建时间:</div>
|
||||||
<a-range-picker
|
<a-range-picker
|
||||||
v-model:value="searchParam.valueDate"
|
v-model:value="searchParam.valueDate"
|
||||||
:show-time="{
|
format="YYYY-MM-DD"
|
||||||
defaultValue: [
|
|
||||||
moment('00:00:00', 'HH:mm:ss'),
|
|
||||||
moment('23:59:59', 'HH:mm:ss'),
|
|
||||||
],
|
|
||||||
}"
|
|
||||||
style="border-radius: 8px; height: 40px; margin-left: 5px"
|
style="border-radius: 8px; height: 40px; margin-left: 5px"
|
||||||
:placeholder="[' 开始时间', ' 结束时间']"
|
:placeholder="[' 开始时间', ' 结束时间']"
|
||||||
valueFormat="X"
|
valueFormat="X"
|
||||||
@@ -832,6 +827,7 @@ import * as moment from "moment";
|
|||||||
import { changeOwnership } from "@/api/method";
|
import { changeOwnership } from "@/api/method";
|
||||||
import NameInput from "@/components/project/NameInput";
|
import NameInput from "@/components/project/NameInput";
|
||||||
import { validateName } from "@/api/index1";
|
import { validateName } from "@/api/index1";
|
||||||
|
import { toDate } from "../../api/method";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "projectManage",
|
name: "projectManage",
|
||||||
@@ -1701,12 +1697,16 @@ export default {
|
|||||||
beginTime:
|
beginTime:
|
||||||
state.searchParam.valueDate &&
|
state.searchParam.valueDate &&
|
||||||
state.searchParam.valueDate.length === 2
|
state.searchParam.valueDate.length === 2
|
||||||
? state.searchParam.valueDate[0]
|
? toDate(
|
||||||
|
new Date(state.searchParam.valueDate[0].$d).getTime() / 1000,
|
||||||
|
"Y-M-D")
|
||||||
: "",
|
: "",
|
||||||
endTime:
|
endTime:
|
||||||
state.searchParam.valueDate &&
|
state.searchParam.valueDate &&
|
||||||
state.searchParam.valueDate.length === 2
|
state.searchParam.valueDate.length === 2
|
||||||
? state.searchParam.valueDate[1]
|
? toDate(
|
||||||
|
new Date(state.searchParam.valueDate[1].$d).getTime() / 1000,
|
||||||
|
"Y-M-D")
|
||||||
: "",
|
: "",
|
||||||
})
|
})
|
||||||
.then((res) => {
|
.then((res) => {
|
||||||
|
|||||||
@@ -3108,7 +3108,7 @@ export default {
|
|||||||
title: "姓名",
|
title: "姓名",
|
||||||
dataIndex: "name",
|
dataIndex: "name",
|
||||||
key: "name",
|
key: "name",
|
||||||
// width: 30,
|
width:"20%",
|
||||||
align: "left",
|
align: "left",
|
||||||
className: "h",
|
className: "h",
|
||||||
// scopedSlots: { customRender: "action" }, //引入的插槽
|
// scopedSlots: { customRender: "action" }, //引入的插槽
|
||||||
@@ -3145,9 +3145,10 @@ export default {
|
|||||||
title: "部门",
|
title: "部门",
|
||||||
dataIndex: "bum",
|
dataIndex: "bum",
|
||||||
key: "bum",
|
key: "bum",
|
||||||
// width: 50,
|
width:"10%",
|
||||||
align: "center",
|
align: "center",
|
||||||
className: "h",
|
className: "h",
|
||||||
|
ellipsis: true,
|
||||||
},
|
},
|
||||||
// {
|
// {
|
||||||
// title: "岗位",
|
// title: "岗位",
|
||||||
@@ -3165,14 +3166,15 @@ export default {
|
|||||||
// align: "center",
|
// align: "center",
|
||||||
// className: "h",
|
// className: "h",
|
||||||
// },
|
// },
|
||||||
// {
|
{
|
||||||
// title: "进度",
|
title: "进度",
|
||||||
// dataIndex: "progress",
|
dataIndex: "progress",
|
||||||
// key: "progress",
|
key: "progress",
|
||||||
// width: 30,
|
width:"10%",
|
||||||
// align: "center",
|
align: "center",
|
||||||
// className: "h",
|
className: "h",
|
||||||
// },
|
ellipsis: true,
|
||||||
|
},
|
||||||
// {
|
// {
|
||||||
// title: "证书",
|
// title: "证书",
|
||||||
// dataIndex: "diploma",
|
// dataIndex: "diploma",
|
||||||
@@ -3185,7 +3187,7 @@ export default {
|
|||||||
title: "最近学习时间",
|
title: "最近学习时间",
|
||||||
dataIndex: "stutime",
|
dataIndex: "stutime",
|
||||||
key: "stutime",
|
key: "stutime",
|
||||||
// width: 50,
|
width:"20%",
|
||||||
align: "center",
|
align: "center",
|
||||||
className: "h",
|
className: "h",
|
||||||
// sorter: {
|
// sorter: {
|
||||||
@@ -3197,15 +3199,16 @@ export default {
|
|||||||
title: "加入方式",
|
title: "加入方式",
|
||||||
dataIndex: "putin",
|
dataIndex: "putin",
|
||||||
key: "putin",
|
key: "putin",
|
||||||
// width: 40,
|
width:"10%",
|
||||||
align: "center",
|
align: "center",
|
||||||
className: "h",
|
className: "h",
|
||||||
|
ellipsis: true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "操作",
|
title: "操作",
|
||||||
dataIndex: "operation",
|
dataIndex: "operation",
|
||||||
key: "operation",
|
key: "operation",
|
||||||
// width: 60,
|
width:"20%",
|
||||||
align: "center",
|
align: "center",
|
||||||
className: "h",
|
className: "h",
|
||||||
scopedSlots: { customRender: "action" }, //引入的插槽
|
scopedSlots: { customRender: "action" }, //引入的插槽
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ module.exports = defineConfig({
|
|||||||
port: 8080,
|
port: 8080,
|
||||||
proxy: {
|
proxy: {
|
||||||
"/manageApi": {
|
"/manageApi": {
|
||||||
target: process.env.VITE_PROXY_URL,
|
target: process.env.VUE_APP_PROXY_URL,
|
||||||
changeOrigin: true, //表示是否改变原域名
|
changeOrigin: true, //表示是否改变原域名
|
||||||
// secure: false,
|
// secure: false,
|
||||||
// ws: false, //表示WebSocket协议
|
// ws: false, //表示WebSocket协议
|
||||||
|
|||||||
Reference in New Issue
Block a user