2025/2/8第一次更新

This commit is contained in:
爱吃咸鱼小猫咪
2025-02-08 18:50:38 +08:00
commit d7af560866
26519 changed files with 5046029 additions and 0 deletions
+50
View File
@@ -0,0 +1,50 @@
"use strict";
const common_vendor = require("../common/vendor.js");
const formatDateTime = (date, template = "YYYY-MM-DD HH:mm:ss") => {
return date ? common_vendor.dayjs(date).format(template) : "";
};
const isVideo = (url) => {
if (!url)
return false;
const videoTypes = ["mp4", "webm", "mov", "avi", "mkv", "flv"];
return videoTypes.some((type) => url.endsWith(type));
};
const generateRandomNumber = (length = 9) => {
const min = Math.pow(10, length - 1);
const max = Math.pow(10, length) - 1;
return Math.floor(Math.random() * (max - min + 1) + min);
};
const randomId = (length = 8) => {
const lowerCaseLetters = "abcdefghijklmnopqrstuvwxyz";
const upperCaseLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
const digits = "0123456789";
const allChars = lowerCaseLetters + upperCaseLetters + digits;
let randomString = "";
for (let i = 0; i < length; i++) {
const randomIndex = Math.floor(Math.random() * allChars.length);
randomString += allChars[randomIndex];
}
return randomString;
};
const parseJSONToObject = (json) => {
let msgObj;
try {
let parsedString = JSON.parse(json);
if (typeof parsedString === "string") {
msgObj = JSON.parse(parsedString);
} else {
msgObj = parsedString;
}
} catch (err) {
throw new Error("not json");
}
if (!msgObj) {
throw new Error("not json");
}
return msgObj;
};
exports.formatDateTime = formatDateTime;
exports.generateRandomNumber = generateRandomNumber;
exports.isVideo = isVideo;
exports.parseJSONToObject = parseJSONToObject;
exports.randomId = randomId;
+14
View File
@@ -0,0 +1,14 @@
"use strict";
const common_vendor = require("../common/vendor.js");
const emit = (event, payload) => {
common_vendor.index.$emit(event, payload);
};
const on = (event, callback) => {
common_vendor.index.$on(event, callback);
};
const off = (event, callback) => {
common_vendor.index.$off(event, callback);
};
exports.emit = emit;
exports.off = off;
exports.on = on;
+168
View File
@@ -0,0 +1,168 @@
"use strict";
const common_vendor = require("../common/vendor.js");
const composables_useCommon = require("../composables/useCommon.js");
const request = (apiUrl, options = {}, retry = true) => {
const fullUrl = apiUrl.startsWith("/") ? apiUrl : `/${apiUrl}`;
return new Promise((resolve, reject) => {
common_vendor.index.request({
url: `${getBaseURL()}${fullUrl}`,
header: {
Authorization: `Bearer ${getToken()}`
},
...options,
success: async (res) => {
if (res.statusCode === 401 && retry) {
const { token } = await refreshToken(getRefreshToken());
composables_useCommon.saveLoginInfo({ token });
console.log("刷新后获取的token", token);
if (token) {
options.header = {
Authorization: `Bearer ${token}`
};
request(apiUrl, options, false).then((res2) => {
resolve(res2);
}).catch((err) => {
reject(err);
});
} else {
reject(res);
}
} else {
if (res.data.data) {
resolve(res.data.data);
} else {
resolve(res.data);
}
}
},
fail: async (err) => {
console.log(233333333);
},
complete: async (err) => {
console.log("请求完成", err);
}
});
});
};
const refreshToken = async (refreshToken2, apiUrl = "/auth/refreshTokens", maxRetries = 3, retryInterval = 200, timeout = 5e3) => {
const apiPath = apiUrl.startsWith("/") ? apiUrl : `/${apiUrl}`;
let attempt = 0;
while (attempt < maxRetries) {
attempt++;
console.log(`尝试第 ${attempt} 次刷新Token, refreshToken:`, refreshToken2);
try {
return await new Promise((resolve, reject) => {
common_vendor.index.request({
url: `${getBaseURL()}${apiPath}`,
method: "POST",
headers: {
"Content-Type": "application/json"
},
data: { refreshToken: refreshToken2 },
timeout,
success: (res) => {
if (res.statusCode >= 400) {
reject(res);
} else {
resolve(res.data);
}
},
fail: (err) => {
console.error("刷新Token失败", err);
reject(err);
}
});
});
} catch (err) {
if (err.name === "AbortError") {
console.error(`${attempt} 次刷新Token超时`);
} else {
console.error(`${attempt} 次刷新Token失败`, err);
}
}
if (attempt < maxRetries) {
console.log(`等待 ${retryInterval} 毫秒后重试...`);
await new Promise((resolve) => setTimeout(resolve, retryInterval));
}
}
console.log("刷新Token失败,已达到最大重试次数");
return null;
};
const uploadFile = (filePath, options = {}, apiUrl = "/file/upload") => {
const fullUrl = apiUrl.startsWith("/") ? apiUrl : `/${apiUrl}`;
return new Promise((resolve, reject) => {
common_vendor.index.uploadFile({
url: `${getBaseURL()}${fullUrl}`,
filePath,
name: "file",
header: {
Authorization: `Bearer ${getToken()}`
},
...options,
success: async (res) => {
if (res.statusCode === 401) {
const _refreshToken = getRefreshToken();
if (!_refreshToken) {
reject(res);
}
const { token } = await refreshToken(_refreshToken);
composables_useCommon.saveLoginInfo({ token });
console.log("刷新后获取的token", token);
if (token) {
options.header = {
Authorization: `Bearer ${token}`
};
uploadFile(filePath, options).then((res2) => {
resolve(res2);
}).catch((err) => {
reject(err);
});
} else {
reject(res);
}
} else {
console.log("success", res);
const data = JSON.parse(res.data);
if (data.data) {
resolve(data.data);
} else {
resolve(data);
}
}
},
fail: async (err) => {
console.log("fail", err);
if (err) {
const _refreshToken = getRefreshToken();
if (!_refreshToken) {
reject(err);
}
const { token } = await refreshToken(_refreshToken);
composables_useCommon.saveLoginInfo({ token });
console.log("刷新后获取的token", token);
if (token) {
options.header = {
Authorization: `Bearer ${token}`
};
uploadFile(filePath, options).then((res) => {
resolve(res);
}).catch((err2) => {
reject(err2);
});
} else {
reject(err);
}
} else {
reject(err);
}
}
});
});
};
const getBaseURL = () => "https://scschool.cc/api";
const getBaseWsURL = () => "wss://scschool.cc/websocket";
const getToken = () => composables_useCommon.getLoginInfo().token;
const getRefreshToken = () => composables_useCommon.getLoginInfo().refresh_token;
exports.getBaseWsURL = getBaseWsURL;
exports.request = request;
exports.uploadFile = uploadFile;