From e2ec7bc3937d3a4d9c8fb8885df8144b9e478eae Mon Sep 17 00:00:00 2001
From: pfewmlupo <3097217416@qq.com>
Date: Tue, 8 Oct 2024 20:50:25 +0800
Subject: [PATCH] =?UTF-8?q?Add=20=E6=B3=A8=E9=87=8A=EF=BC=881=EF=BC=89?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
注释(1) | 296 ++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 296 insertions(+)
create mode 100644 注释(1)
diff --git a/注释(1) b/注释(1)
new file mode 100644
index 0000000..1ea6a14
--- /dev/null
+++ b/注释(1)
@@ -0,0 +1,296 @@
+poetizepoetize-im-uisrcmain.js
+// 引入Vue 3的createApp方法,用于创建Vue应用实例
+import { createApp } from 'vue';
+
+// 引入应用的根组件
+import App from './App.vue';
+
+// 引入Vue Router实例,用于管理前端路由
+import router from './router';
+
+// 引入Vuex或Pinia实例,用于状态管理
+import store from './store';
+
+// 从naive-ui库中引入多个UI组件,并使用create方法创建一个Naive UI插件实例
+import {
+ create,
+ NAvatar,
+ NInput,
+ NIcon,
+ NTag,
+ NDivider,
+ NButton,
+ NDrawer,
+ NCard,
+ NTabs,
+ NTabPane,
+ NSwitch,
+ NModal,
+ NBadge,
+ NPopover,
+ NImage,
+ NPopconfirm
+} from 'naive-ui';
+
+poetizepoetize-im-uisrcApp.vue
+// 从element-plus库中引入特定组件,并引入其样式文件
+import {
+ ElUpload,
+ ElButton,
+ ElRadioGroup,
+ ElRadioButton
+} from 'element-plus';
+import 'element-plus/dist/index.css';
+
+// 引入自定义的HTTP请求工具、通用方法和常量
+import http from './utils/request';
+import common from './utils/common';
+import constant from './utils/constant';
+
+// 引入自定义字体和样式文件
+import 'vfonts/FiraCode.css';
+import './assets/css/index.css';
+import './assets/css/color.css';
+import './assets/css/animation.css';
+
+// 创建一个Naive UI插件实例,并注册所有需要的组件
+const naive = create({
+ components: [
+ NAvatar, NInput, NIcon, NTag, NDivider, NButton,
+ NDrawer, NCard, NTabs, NTabPane, NSwitch, NModal,
+ NBadge, NPopover, NImage, NPopconfirm
+ ]
+});
+
+// 创建Vue应用实例
+const app = createApp(App);
+
+// 使用Vue Router和状态管理实例
+app.use(router);
+app.use(store);
+
+// 使用Naive UI插件
+app.use(naive);
+
+// 单独注册Element Plus的组件,使它们可以在应用的全局范围内使用
+app.component(ElUpload.name, ElUpload);
+app.component(ElButton.name, ElButton);
+app.component(ElRadioGroup.name, ElRadioGroup);
+app.component(ElRadioButton.name, ElRadioButton);
+
+// 添加全局属性,用于HTTP请求、通用方法和常量
+app.config.globalProperties.$http = http;
+app.config.globalProperties.$common = common;
+app.config.globalProperties.$constant = constant;
+
+// 添加全局前置路由守卫
+router.beforeEach((to, from, next) => {
+ // 检查目标路由是否需要认证
+ if (to.meta.requiresAuth) {
+ // 如果是根路径,则检查URL查询参数
+ if (to.path === "/") {
+ // 如果存在defaultStoreType查询参数,则存储到localStorage
+ if (typeof to.query.defaultStoreType !== "undefined") {
+ localStorage.setItem("defaultStoreType", to.query.defaultStoreType);
+ }
+ // 如果存在userToken查询参数,则验证token
+ if (typeof to.query.userToken !== "undefined") {
+ let userToken = to.query.userToken;
+ const xhr = new XMLHttpRequest();
+ xhr.open('post', constant.baseURL + "/user/token", false); // 同步请求,不推荐在生产环境中使用
+ xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
+ xhr.send("userToken=" + userToken);
+ let result = JSON.parse(xhr.responseText);
+ // 如果token验证通过,则加载用户信息并重定向到应用主页面
+ if (!common.isEmpty(result) && result.code === 200) {
+ store.commit("loadCurrentUser", result.data);
+ localStorage.setItem("userToken", result.data.accessToken);
+ window.location.href = constant.imURL;
+ next();
+ } else {
+ // 如果token验证失败,则重定向到登录页面
+ window.location.href = constant.webBaseURL;
+ }
+ } else if (Boolean(localStorage.getItem("userToken"))) {
+ // 如果已存储userToken,则允许路由变化
+ next();
+ } else {
+ // 如果没有userToken,则重定向到登录页面
+ window.location.href = constant.webBaseURL;
+ }
+ } else {
+ // 如果不是根路径,则检查是否已存储userToken
+ if (Boolean(localStorage.getItem("userToken"))) {
+ // 如果已存储userToken,则允许路由变化
+ next();
+ } else {
+ // 如果没有userToken,则重定向到登录页面
+ window.location.href = constant.webBaseURL;
+ }
+ }
+ } else {
+ // 如果目标路由不需要认证,则直接允许路由变化
+ next();
+ }
+});
+
+// 将Vue应用挂载到HTML中的#app元素上
+app.mount('#app');
+
+poetizepoetize-im-uisrcutilsajaxUpload.js
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+// 从当前目录下的common.js文件中导入common模块(可能包含一些工具函数或配置)
+import common from './common';
+
+// 定义一个函数,用于根据XMLHttpRequest对象生成一个错误对象
+function getError(action, option, xhr) {
+ let msg; // 定义一个变量用于存储错误信息
+
+ // 如果xhr对象有response属性(通常用于处理响应体为JSON的情况)
+ if (xhr.response) {
+ // 使用xhr.response.error(如果存在)或xhr.response作为错误信息
+ msg = `${xhr.response.error || xhr.response}`;
+ }
+ // 如果xhr对象有responseText属性(用于处理文本响应)
+ else if (xhr.responseText) {
+ // 直接使用xhr.responseText作为错误信息
+ msg = `${xhr.responseText}`;
+ }
+ // 如果以上两种情况都不满足
+ else {
+ // 使用一个通用的错误信息,包括失败的动作和HTTP状态码
+ msg = `fail to ${action} ${xhr.status}`;
+ }
+
+ // 返回一个包含错误信息的Error对象
+ return new Error(msg);
+}
+
+// 定义一个函数,用于获取XMLHttpRequest对象的响应体
+function getBody(xhr) {
+ const text = xhr.responseText || xhr.response; // 尝试获取responseText或response属性
+
+ // 如果没有响应文本,则直接返回
+ if (!text) {
+ return text;
+ }
+
+ // 尝试将文本解析为JSON对象
+ try {
+ return JSON.parse(text);
+ } catch {
+ // 如果解析失败,则返回原始的文本
+ return text;
+ }
+}
+
+// 导出默认函数,该函数用于发送一个XMLHttpRequest请求
+export default function (option) {
+ const xhr = new XMLHttpRequest(); // 创建一个新的XMLHttpRequest对象
+ const action = option.action; // 从option对象中获取请求的URL
+
+ const formData = new FormData(); // 创建一个FormData对象用于存储要发送的数据
+
+ // 如果option对象中有data属性,则遍历其键值对并添加到formData中
+ if (option.data) {
+ for (const [key, value] of Object.entries(option.data)) {
+ // 如果值是数组,则使用...操作符将其展开为多个参数传递给append方法
+ if (Array.isArray(value)) formData.append(key, ...value);
+ else formData.append(key, value);
+ }
+ }
+
+ // 添加文件数据到formData中,文件名和文件对象从option中获取
+ formData.append(option.filename, option.file, option.file.name);
+
+ // 监听错误事件,并在错误发生时调用option.onError函数,传入一个Error对象
+ xhr.addEventListener('error', () => {
+ option.onError(getError(action, option, xhr));
+ });
+
+ // 监听加载完成事件,并根据响应状态码调用相应的回调函数
+ xhr.addEventListener('load', () => {
+ // 如果响应状态码表示错误(不是2xx)
+ if (xhr.status < 200 || xhr.status >= 300) {
+ // 调用option.onError函数,传入一个Error对象
+ return option.onError(getError(action, option, xhr));
+ }
+ // 如果响应成功,则调用option.onSuccess函数,并传入响应体
+ option.onSuccess(getBody(xhr));
+ });
+
+ // 打开请求,指定方法(如GET、POST)、URL和是否异步
+ xhr.open(option.method, action, true);
+
+ // 如果option对象中有withCredentials属性且xhr对象支持该属性,则设置withCredentials为true
+ if (option.withCredentials && 'withCredentials' in xhr) {
+ xhr.withCredentials = true;
+ }
+
+ // 设置请求头,如果option对象中有headers属性
+ const headers = option.headers || {};
+ if (headers instanceof Headers) {
+ // 如果headers是一个Headers对象,则遍历其键值对并设置到xhr中
+ headers.forEach((value, key) => xhr.setRequestHeader(key, value));
+ } else {
+ // 否则,遍历一个普通的对象并设置请求头,跳过空值
+ for (const [key, value] of Object.entries(headers)) {
+ if (common.isEmpty(value)) continue; // 使用common模块的isEmpty函数检查值是否为空
+ xhr.setRequestHeader(key, value);
+ }
+ }
+
+ // 发送请求,并传入formData作为请求体
+ xhr.send(formData);
+
+ // 返回xhr对象,允许调用者进一步操作(如取消请求)
+ return xhr;
+}
\ No newline at end of file