commit 6bf56a4b4c4404568128acfb2f3f1aeca7c3487f
Author: sexygoat <1538832180@qq.com>
Date: Thu Jan 22 17:25:30 2026 +0800
first
diff --git a/.claude/settings.local.json b/.claude/settings.local.json
new file mode 100644
index 0000000..7b274cb
--- /dev/null
+++ b/.claude/settings.local.json
@@ -0,0 +1,9 @@
+{
+ "permissions": {
+ "allow": [
+ "Bash(git add:*)"
+ ],
+ "deny": [],
+ "ask": []
+ }
+}
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..71e2bf4
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,94 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+
+# Runtime data
+pids
+*.pid
+*.seed
+*.pid.lock
+
+# Directory for instrumented libs generated by jscoverage/JSCover
+lib-cov
+
+# Coverage directory used by tools like istanbul
+coverage/
+
+# nyc test coverage
+.nyc_output
+
+# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
+.grunt
+
+# Bower dependency directory (https://bower.io/)
+bower_components
+
+# node-waf configuration
+.lock-wscript
+
+# Compiled binary addons (https://nodejs.org/api/addons.html)
+build/Release
+
+# Dependency directories
+node_modules/
+jspm_packages/
+
+# Optional npm cache directory
+.npm
+
+# Optional eslint cache
+.eslintcache
+
+# Optional REPL history
+.node_repl_history
+
+# Output of 'npm pack'
+*.tgz
+
+# Yarn Integrity file
+.yarn-integrity
+
+# dotenv environment variables file
+.env
+
+# parcel-bundler cache (https://parceljs.org/)
+.cache
+.parcel-cache
+
+# next.js build output
+.next
+
+# nuxt.js build output
+.nuxt
+
+# vuepress build output
+.vuepress/dist
+
+# Serverless directories
+.serverless
+
+# FuseBox cache
+.fusebox/
+
+# DynamoDB Local files
+.dynamodb/
+
+# uni-app
+unpackage/
+dist/
+
+# VS Code
+.vscode/
+
+# IDE
+.idea/
+*.swp
+*.swo
+*~
+
+# OS
+.DS_Store
+Thumbs.db
\ No newline at end of file
diff --git a/App.vue b/App.vue
new file mode 100644
index 0000000..6d0310d
--- /dev/null
+++ b/App.vue
@@ -0,0 +1,594 @@
+
+
+
\ No newline at end of file
diff --git a/api/request.js b/api/request.js
new file mode 100644
index 0000000..1cdbc70
--- /dev/null
+++ b/api/request.js
@@ -0,0 +1,220 @@
+/**
+ * 统一请求拦截器
+ */
+
+import {
+ userStore
+} from '@/store/index.js';
+
+// 基础配置
+const BASE_CONFIG = {
+ timeout: 30000, // 30秒超时
+ header: {
+ 'Content-Type': 'application/json',
+ 'X-Requested-With': 'XMLHttpRequest'
+ }
+};
+
+/**
+ * 创建请求实例
+ */
+class HttpRequest {
+ constructor() {
+ this.config = {
+ ...BASE_CONFIG
+ };
+ }
+
+ /**
+ * 响应拦截器 - 处理Cookie和错误
+ * @param {Object} response 响应对象
+ * @returns {Promise} 处理后的响应
+ */
+ async interceptResponse(response) {
+ try {
+ if (response.data.system_result_message_key) {
+ uni.showToast({
+ title: response.data.system_result_message_key + ",请重新登录",
+ icon: 'none'
+ });
+
+ // 等待 logout 操作完成
+ await userStore.actions.logout();
+
+ setTimeout(() => {
+ uni.navigateTo({
+ url: '/pages/login/login'
+ });
+ }, 500);
+ }
+
+ // 检查HTTP状态码
+ if (response.statusCode >= 200 && response.statusCode < 300) {
+ // 检查业务状态码
+ if (response.data && typeof response.data === 'object') {
+ if (response.data.code === '0' || response.data.code === 0 || response.data.code === 200) {
+ // 业务成功
+ return response.data;
+ } else {
+ // 业务失败
+ const error = new Error(response.data.message || response.data.msg || '请求失败');
+ error.code = response.data.code;
+ error.data = response.data;
+ throw error;
+ }
+ } else {
+ // 非JSON响应,直接返回
+ return response.data;
+ }
+ } else {
+ // HTTP状态码错误
+ const error = new Error(
+ `HTTP ${response.statusCode}: ${this.getStatusText(response.statusCode)}`
+ );
+ error.statusCode = response.statusCode;
+ error.response = response;
+ throw error;
+ }
+ } catch (error) {
+ console.error('响应拦截器错误:', error);
+ throw error;
+ }
+ }
+
+
+ /**
+ * 获取状态码描述
+ * @param {number} statusCode HTTP状态码
+ * @returns {string} 状态描述
+ */
+ getStatusText(statusCode) {
+ const statusMap = {
+ 400: 'Bad Request',
+ 401: 'Unauthorized',
+ 403: 'Forbidden',
+ 404: 'Not Found',
+ 500: 'Internal Server Error',
+ 502: 'Bad Gateway',
+ 503: 'Service Unavailable'
+ };
+ return statusMap[statusCode] || 'Unknown Error';
+ }
+
+ /**
+ * 通用请求方法
+ * @param {Object} options 请求选项
+ * @returns {Promise} 请求Promise
+ */
+ request(options) {
+ return new Promise((resolve, reject) => {
+ // 合并配置,特别处理 header
+ const config = {
+ ...this.config,
+ ...options,
+ header: {
+ ...this.config.header,
+ ...(options.header || options.headers || {})
+ },
+ withCredentials: false
+ };
+
+ // 发起请求
+ uni.request({
+ ...config,
+ success: (response) => {
+ this.interceptResponse(response)
+ .then(resolve)
+ .catch(reject);
+ },
+ fail: (error) => {
+ console.error('请求失败:', error);
+ const err = new Error(error.errMsg || '网络请求失败');
+ err.error = error;
+ reject(err);
+ }
+ });
+ });
+ }
+
+ /**
+ * GET请求
+ * @param {string} url 请求地址
+ * @param {Object} params 查询参数
+ * @param {Object} options 其他选项
+ * @returns {Promise} 请求Promise
+ */
+ get(url, params = {}, options = {}) {
+ // 构建查询字符串
+ const queryString = Object.keys(params)
+ .filter(key => params[key] !== undefined && params[key] !== null)
+ .map(key => `${encodeURIComponent(key)}=${encodeURIComponent(params[key])}`)
+ .join('&');
+
+ const finalUrl = queryString ? `${url}${url.includes('?') ? '&' : '?'}${queryString}` : url;
+
+ return this.request({
+ url: finalUrl,
+ method: 'GET',
+ ...options
+ });
+ }
+
+ /**
+ * POST请求
+ * @param {string} url 请求地址
+ * @param {Object} data 请求体数据
+ * @param {Object} options 其他选项
+ * @returns {Promise} 请求Promise
+ */
+ post(url, data = {}, options = {}) {
+ return this.request({
+ url,
+ method: 'POST',
+ data,
+ ...options
+ });
+ }
+
+ /**
+ * PUT请求
+ * @param {string} url 请求地址
+ * @param {Object} data 请求体数据
+ * @param {Object} options 其他选项
+ * @returns {Promise} 请求Promise
+ */
+ put(url, data = {}, options = {}) {
+ return this.request({
+ url,
+ method: 'PUT',
+ data,
+ ...options
+ });
+ }
+
+ /**
+ * DELETE请求
+ * @param {string} url 请求地址
+ * @param {Object} params 查询参数
+ * @param {Object} options 其他选项
+ * @returns {Promise} 请求Promise
+ */
+ delete(url, params = {}, options = {}) {
+ return this.get(url, params, {
+ ...options,
+ method: 'DELETE'
+ });
+ }
+}
+
+// 创建请求实例
+const httpRequest = new HttpRequest();
+
+export default httpRequest;
+
+// 导出常用方法
+export const {
+ get,
+ post,
+ put,
+ delete: del
+} = httpRequest;
\ No newline at end of file
diff --git a/api/user.js b/api/user.js
new file mode 100644
index 0000000..5f7ae46
--- /dev/null
+++ b/api/user.js
@@ -0,0 +1,757 @@
+/**
+ * 用户相关API接口
+ */
+
+import httpRequest from './request.js';
+import {
+ generateRfm
+} from '@/utils/common.js';
+
+class UserApi {
+ constructor() {
+ this.baseUrl = '/kyhl-weixin-1.0';
+ this.cardBaseUrl = '/cm-api/v1'
+ }
+
+ // 检查是否有公众号OpenId(获取Cookie的关键接口)
+ async getCookie() {
+ try {
+ const fullUrl = `${this.cardBaseUrl}/auth/get-auth`;
+
+ const response = await httpRequest.post(fullUrl);
+
+ return response;
+ } catch (error) {
+ console.error('checkHasGzhOpenId请求失败:', error);
+ throw error;
+ }
+ }
+
+ // 获取设备信息(管理平台)
+ async getDeviceInfoAdmin(device_id) {
+ try {
+ const fullUrl = `${this.cardBaseUrl}/device/query`;
+
+ const response = await httpRequest.post(fullUrl, {
+ page: 1,
+ page_size: 1,
+ device_id
+ });
+
+ return response;
+ } catch (error) {
+ console.error('获取设备信息(管理平台):', error);
+ throw error;
+ }
+ }
+
+ // 获取WXUrl
+ /*
+ {
+ "code": "0",
+ "current_session_user_resource_ids_index": "",
+ "app_result_key": "0",
+ "wxAuthUrl": "",
+ "system_result_key": "0"
+ }
+ */
+ async getWxUrl() {
+ try {
+ const params = {
+ responseFunction: 'checkHasGzhOpenId',
+ needGzhOpenId: true,
+ currentPageUrl: 'https://m1.whjhft.com/pages/index/index',
+ checkFrom: 'cardlogin',
+ rfm: generateRfm()
+ };
+
+ const queryString = this.buildQueryString(params);
+ const fullUrl = `${this.baseUrl}/wxauth/checkHasGzhOpenId.do?${queryString}`;
+
+ const response = await httpRequest.post(fullUrl, null);
+
+ return response;
+ } catch (error) {
+ console.error('登录请求失败:', error);
+ throw error;
+ }
+ }
+
+
+ // 用户登录接口
+ async login(iccidMark) {
+ try {
+ console.log(iccidMark);
+ const params = {
+ responseFunction: 'findByiccidMarkCallback',
+ iccidMark,
+ rfm: generateRfm()
+ };
+
+ const queryString = this.buildQueryString(params);
+ const fullUrl = `${this.baseUrl}/card/login.do?${queryString}`;
+
+ const response = await httpRequest.post(fullUrl, null);
+
+ return response;
+ } catch (error) {
+ console.error('登录请求失败:', error);
+ throw error;
+ }
+ }
+
+ // 判断是否实名接口
+ async getRealNameInfo() {
+ try {
+ const params = {
+ iccidOrPhone: "",
+ responseFunction: "getRealNameInfoCallback",
+ rfm: generateRfm()
+ };
+
+ const queryString = this.buildQueryString(params);
+ const fullUrl = `${this.baseUrl}/user/getRealNameInfo.do?${queryString}`;
+
+ const response = await httpRequest.post(fullUrl, null);
+
+ return response;
+ } catch (error) {
+ console.error('获取实名信息失败:', error);
+ throw error;
+ }
+ }
+
+
+ // 获取用户信息接口
+ async getUserInfo() {
+ try {
+ const params = {
+ responseFunction: 'findByOpenIdCallback',
+ DoNotGetRealNameInfo: true,
+ rfm: generateRfm()
+ };
+
+ const queryString = this.buildQueryString(params);
+ const fullUrl = `${this.baseUrl}/user/findByOpenId.do?${queryString}`;
+
+ const response = await httpRequest.post(fullUrl, null);
+
+ return response;
+ } catch (error) {
+ console.error('获取用户信息失败:', error);
+ throw error;
+ }
+ }
+
+ // 切换运营商 1: 电信 2: 联通 3: 移动 esim参数值
+ async changeOperator(esim, iccidMark) {
+ try {
+ const params = {
+ responseFunction: 'updateWifi',
+ optwifi: "esim",
+ esim,
+ iccidMark,
+ rfm: generateRfm()
+ };
+
+ const queryString = this.buildQueryString(params);
+ const fullUrl = `${this.baseUrl}/card/updateWifi.do?${queryString}`;
+
+ const response = await httpRequest.post(fullUrl, null);
+
+ return response;
+ } catch (error) {
+ console.error('切换运营商失败:', error);
+ throw error;
+ }
+ }
+
+ // 进入实名是否只显示主卡
+ async getIsOnlyMainCard(iccidMark) {
+ try {
+ const fullUrl = `${this.cardBaseUrl}/call/device/${iccidMark}/exists`;
+
+ const response = await httpRequest.get(fullUrl);
+
+ return response;
+ } catch (error) {
+ console.error('进入实名是否只显示主卡请求失败:', error);
+ throw error;
+ }
+ }
+
+ // 获取openId接口
+ async getOpenId() {
+ try {
+ const params = {
+ responseFunction: 'getUserCardInfo',
+ DoNotGetRealNameInfo: true,
+ rfm: generateRfm()
+ };
+
+ const queryString = this.buildQueryString(params);
+ const fullUrl = `${this.baseUrl}/usercard/getUserCardInfo.do?${queryString}`;
+
+ const response = await httpRequest.post(fullUrl, null);
+
+ return response;
+ } catch (error) {
+ console.error('获取openId失败:', error);
+ throw error;
+ }
+ }
+
+ // 进行授权
+ async getAuthorize(code) {
+ try {
+ const params = {
+ origin_html_url: 'https://m1.whjhft.com/pages/index/index',
+ code: code,
+ state: null
+ };
+
+ const queryString = this.buildQueryString(params);
+ const fullUrl = `${this.baseUrl}/wxauth/recvCode.do?${queryString}`;
+
+ const response = await httpRequest.get(fullUrl);
+
+ return response;
+ } catch (error) {
+ console.error('获取授权失败:', error);
+ throw error;
+ }
+ }
+
+ // 获取微信支付签名
+ /*
+ {
+ "code": "0",
+ "signature": "3771f2fce5802b3630377e7d2618a7195d136007",
+ "current_session_user_resource_ids_index": "",
+ "appId": "wxea8c599fe100ce8a",
+ "nonceStr": "31565688940e48cb91827adbf6aeb499",
+ "system_result_key": "0",
+ "timestamp": 1766209145,
+ "isSuccess": "0"
+ }
+ */
+ async getWxPaySign() {
+ try {
+ const fullUrl = `${this.baseUrl}/weixinPay/getWxSign.do`;
+
+ const response = await httpRequest.get(fullUrl);
+
+ return response;
+ } catch (error) {
+ console.error('获取微信支付签名失败:', error);
+ throw error;
+ }
+ }
+
+ getCurrentPageUrl() {
+ try {
+ // #ifdef H5
+ if (typeof window !== 'undefined' && window.location) {
+ const currentUrl = window.location.href;
+ console.log('当前页面URL:', currentUrl);
+ return encodeURIComponent(currentUrl);
+ }
+ // #endif
+
+ const defaultUrl = "https://m1.whjhft.com/pages/index/index";
+ console.log('使用默认URL:', defaultUrl);
+ return encodeURIComponent(defaultUrl);
+ } catch (error) {
+ console.error('获取当前页面URL失败:', error);
+ return encodeURIComponent('https://m1.whjhft.com/pages/index/index');
+ }
+ }
+
+ // 获取套餐列表 smList
+ async getPackageList() {
+ try {
+ const params = {
+ responseFunction: 'findByCardNoCallback',
+ rfm: generateRfm()
+ };
+
+ const queryString = this.buildQueryString(params);
+ const fullUrl = `${this.baseUrl}//setmeal/findByCardNo.do?${queryString}`;
+
+ const response = await httpRequest.post(fullUrl, null);
+
+ return response;
+ } catch (error) {
+ console.error('获取套餐列表失败:', error);
+ throw error;
+ }
+ }
+
+
+ // 1. checkHasGzhOpenId 判断当前用户是否已经绑定了微信公众号的 OpenId
+ /*
+ {
+ "code": "0",
+ "current_session_user_resource_ids_index": "",
+ "app_result_key": "0",
+ "wxAuthUrl": "",
+ "system_result_key": "0"
+ }
+ */
+ // 如果返回的wxAuthUrl: 是空的就表示已经授权了, 没有就需要再来一次授权流程
+ async checkHasGzhOpenId() {
+ try {
+ const params = {
+ responseFunction: 'checkHasGzhOpenId',
+ needGzhOpenId: true,
+ currentPageUrl: "https://m1.whjhft.com/pages/package-order/package-order",
+ rfm: generateRfm()
+ };
+
+ const queryString = this.buildQueryString(params);
+ const fullUrl = `${this.baseUrl}//wxauth/checkHasGzhOpenId.do?${queryString}`;
+
+ const response = await httpRequest.post(fullUrl, null);
+
+ return response;
+ } catch (error) {
+ console.error('checkHasGzhOpenId:', error);
+ throw error;
+ }
+ }
+
+ // 2. checkYgosWxInfo 检查当前用户是否具有与微信支付相关的特定信息
+ async checkYgosWxInfo() {
+ try {
+ const params = {
+ responseFunction: 'checkYgosWxInfo',
+ hasYgGzhPm: false,
+ currentPageUrl: "https://m1.whjhft.com/pages/package-order/package-order",
+ rfm: generateRfm()
+ };
+
+ const queryString = this.buildQueryString(params);
+ const fullUrl = `${this.baseUrl}//weixinPay/checkYgosWxInfo.do?${queryString}`;
+
+ const response = await httpRequest.post(fullUrl, null);
+
+ return response;
+ } catch (error) {
+ console.error('checkYgosWxInfo:', error);
+ throw error;
+ }
+ }
+
+ // 3. checkXwzfWxInfo 检查微信信息
+ async checkXwzfWxInfo() {
+ try {
+ const params = {
+ responseFunction: 'checkXwzfWxInfo',
+ hasXwzfPm: false,
+ zwxMchId: "",
+ currentPageUrl: "https://m1.whjhft.com/pages/package-order/package-order",
+ rfm: generateRfm()
+ };
+
+ const queryString = this.buildQueryString(params);
+ const fullUrl = `${this.baseUrl}//weixinPay/checkXwzfWxInfo.do?${queryString}`;
+
+ const response = await httpRequest.post(fullUrl, null);
+
+ return response;
+ } catch (error) {
+ console.error('checkXwzfWxInfo:', error);
+ throw error;
+ }
+ }
+
+
+
+ // 4. 获取支付方式
+ /*
+ {
+ "onlyWalletRechargeCard": false,
+ "code": "0",
+ "walletBalance": 0.0,
+ "current_session_user_resource_ids_index": "",
+ "payMethodList": [
+ {
+ "mybatisRecordCount": 0,
+ "orderNo": "",
+ "jsonUpdateFlag": "0",
+ "id": "a333",
+ "createDate": "",
+ "createUserId": "",
+ "createUserName": "",
+ "payMethod": 2,
+ "showStatus": "",
+ "selectStatus": 2,
+ "sortNum": 44,
+ "showName": "余额支付",
+ "showIconUrl": "http://jh.whjhft.com/kyhl-weixin-1.0/img/yezf.png",
+ "appId": "",
+ "appSecret": "",
+ "gzhId": "",
+ "gzhName": "",
+ "gzhUsername": "",
+ "gzhPassword": "",
+ "mchId": "",
+ "mchKey": "",
+ "systemDomain": "",
+ "mchCertUrl": "",
+ "notifyUrl": "",
+ "returnUrl": "",
+ "profitSharingConfigNo": "",
+ "createDateStr": "",
+ "showApp": true,
+ "needOpenId": false,
+ "payMethodStr": "余额支付",
+ "showStatusStr": "",
+ "selectStatusStr": "否"
+ },
+ {
+ "mybatisRecordCount": 0,
+ "orderNo": "",
+ "jsonUpdateFlag": "0",
+ "id": "4F31156EE9654A35B16CF0E3A6569F53",
+ "createDate": "",
+ "createUserId": "",
+ "createUserName": "",
+ "payMethod": 1,
+ "showStatus": "",
+ "selectStatus": 1,
+ "sortNum": "",
+ "showName": "微信支付",
+ "showIconUrl": "http://jhft.whjhft.com/kyhl-weixin-1.0/img/wx.png",
+ "appId": "",
+ "appSecret": "",
+ "gzhId": "",
+ "gzhName": "",
+ "gzhUsername": "",
+ "gzhPassword": "",
+ "mchId": "",
+ "mchKey": "",
+ "systemDomain": "",
+ "mchCertUrl": "",
+ "notifyUrl": "",
+ "returnUrl": "",
+ "profitSharingConfigNo": "",
+ "createDateStr": "",
+ "showApp": false,
+ "needOpenId": true,
+ "payMethodStr": "微信支付",
+ "showStatusStr": "",
+ "selectStatusStr": "是"
+ }
+ ],
+ "app_result_key": "0",
+ "buyMealMealPrice": 29.0,
+ "pwdEmpty": false,
+ "system_result_key": "0",
+ "isSuccess": "1"
+ }
+ */
+ async getPayList(mealId) {
+ try {
+ const params = {
+ responseFunction: 'getNeedPayMoneyAndWalletBalance',
+ mealId,
+ getMealPrice: true,
+ allowWalletPay: true,
+ rfm: generateRfm()
+ };
+
+ const queryString = this.buildQueryString(params);
+ const fullUrl = `${this.baseUrl}//cardwallet/getNeedPayMoneyAndWalletBalance.do?${queryString}`;
+
+ const response = await httpRequest.post(fullUrl, null);
+
+ return response;
+ } catch (error) {
+ console.error('获取支付方式失败:', error);
+ throw error;
+ }
+ }
+ /*
+ {
+ "code": "0",
+ "current_session_user_resource_ids_index": "",
+ "wp": {
+ "appId": "wxea8c599fe100ce8a",
+ "timeStamp": "1766388518476",
+ "nonceStr": "1d64e63b37f349cfb3699643757268a3",
+ "prepayId": "prepay_id=wx2215283841316122e94a592ddd8e7f0000",
+ "paySign": "FDCD3D358E55C568725A10B4E7BC4F5B",
+ "signType": ""
+ },
+ "system_result_key": "0",
+ "isSuccess": "0"
+ }
+ */
+ // 5. 调用 orderPayPageUse.do 创建订单 并拉起支付 我只要微信支付即可
+ async createOrder(data) {
+ try {
+ const fullUrl = `${this.baseUrl}/weixinPay/orderPayPageUse.do`;
+
+ // 将数据转换为 URL 编码格式
+ const p = new URLSearchParams(data).toString();
+
+ // 确保 header 中的 Content-Type 为 x-www-form-urlencoded
+ const response = await httpRequest.post(fullUrl, p, {
+ header: {
+ 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
+ }
+ });
+
+ return response;
+ } catch (error) {
+ console.error('创建订单失败', error);
+ throw error;
+ }
+ }
+
+ // 获取切卡列表-设备流量-WIFI信息-连接数
+ async getSwitchCardList() {
+ try {
+ const params = {
+ responseFunction: 'findNetWorkInfo',
+ rfm: generateRfm()
+ };
+
+ const queryString = this.buildQueryString(params);
+ const fullUrl = `${this.baseUrl}/card/findCardMchInfo.do?${queryString}`;
+
+ const response = await httpRequest.post(fullUrl, null);
+
+ return response;
+ } catch (error) {
+ console.error('获取切卡列表-设备流量-WIFI信息-连接数异常:', error);
+ throw error;
+ }
+ }
+
+ // 获取卡信息(过期时间expireDate-状态statusStr)
+ async getCardInfo() {
+ try {
+ const params = {
+ iccidOrPhone: '',
+ responseFunction: 'findCardInfoCallback',
+ skipGift: true,
+ rfm: generateRfm()
+ };
+
+ const queryString = this.buildQueryString(params);
+ const fullUrl = `${this.baseUrl}/card/findCardInfo.do?${queryString}`;
+
+ const response = await httpRequest.post(fullUrl, null);
+
+ return response;
+ } catch (error) {
+ console.error('获取切卡列表-设备流量-WIFI信息-连接数异常:', error);
+ throw error;
+ }
+ }
+
+
+ // 修改WiFi信息
+ async modifyWifi({
+ cardNo,
+ ssid,
+ password
+ }) {
+ try {
+ const fullUrl = `${this.cardBaseUrl}/device/wifi-config`;
+
+ const response = await httpRequest.post(fullUrl, {
+ cardNo,
+ ssid,
+ password
+ });
+
+ return response;
+ } catch (error) {
+ console.error('修改WiFi信息失败:', error);
+ throw error;
+ }
+ }
+
+ // 重启设备
+ async restartDevice(deviceId) {
+
+ try {
+ const fullUrl = `${this.cardBaseUrl}/device/restart`;
+
+ const response = await httpRequest.post(fullUrl, {
+ cardNo: deviceId
+ });
+
+ return response;
+ } catch (error) {
+ console.error('重启设备失败:', error);
+ throw error;
+ }
+ }
+
+ // 恢复出厂设置
+ async restDevice(deviceId) {
+ try {
+ const fullUrl = `${this.cardBaseUrl}/device/factory-reset`;
+
+ const response = await httpRequest.post(fullUrl, {
+ cardNo: deviceId
+ });
+
+ return response;
+ } catch (error) {
+ console.error('恢复出厂设置失败:', error);
+ throw error;
+ }
+ }
+
+ // 获取实名地址
+ async getRealNameAddress(iccidMark) {
+ try {
+ const params = {
+ iccidOrPhone: "",
+ responseFunction: "getRealNameInfoCallback",
+ force: true,
+ iccidMark,
+ rfm: generateRfm()
+ };
+
+ const queryString = this.buildQueryString(params);
+ const fullUrl = `${this.baseUrl}/user/getRealNameInfo.do?${queryString}`;
+
+ const response = await httpRequest.post(fullUrl, null);
+
+ return response;
+ } catch (error) {
+ console.error('获取实名地址异常:', error);
+ throw error;
+ }
+ }
+
+ // 智能诊断
+ /*
+ {
+ "internalRetMsg": "",
+ "code": "0",
+ "current_session_user_resource_ids_index": "",
+ "app_result_key": "0",
+ "retMsg": "已提交复机申请,预计1小时内复机。",
+ "system_result_key": "0",
+ "isSuccess": "0"
+ }
+ */
+ async intelligentDiagnosis(iccidMark) {
+ try {
+ const params = {
+ responseFunction: "intelliDiagnose"
+ };
+
+ const queryString = this.buildQueryString(params);
+ const fullUrl = `${this.baseUrl}/card/intelliDiagnose.do?${queryString}`;
+
+ const response = await httpRequest.post(fullUrl, null);
+
+ return response;
+ } catch (error) {
+ console.error('智能诊断异常:', error);
+ throw error;
+ }
+ }
+
+ // 获取设备绑定的手机号
+ async getDeviceBindPhone() {
+ try {
+ const params = {
+ responseFunction: 'findMyBindRecord',
+ rfm: generateRfm()
+ };
+
+ const queryString = this.buildQueryString(params);
+ const fullUrl = `${this.baseUrl}/phonebindrecord/findMyBindRecord.do?${queryString}`;
+
+ const response = await httpRequest.post(fullUrl, null);
+
+ return response;
+ } catch (error) {
+ console.error('获取设备绑定的手机号异常:', error);
+ throw error;
+ }
+ }
+
+ // 获取短信验证码
+ async getSmsNumber(mobile) {
+ try {
+ const params = {
+ responseFunction: 'sendSms',
+ mobile,
+ rfm: generateRfm()
+ };
+
+ const queryString = this.buildQueryString(params);
+ const fullUrl = `${this.baseUrl}/phonebindrecord/sendSms.do?${queryString}`;
+
+ const response = await httpRequest.post(fullUrl, null);
+
+ return response;
+ } catch (error) {
+ console.error('获取短信验证码异常:', error);
+ throw error;
+ }
+ }
+
+ // 绑定手机号
+ async bindCardPhone(mobile, code) {
+ try {
+ const params = {
+ responseFunction: 'saveBind',
+ mobile,
+ code,
+ rfm: generateRfm()
+ };
+
+ const queryString = this.buildQueryString(params);
+ const fullUrl = `${this.baseUrl}/phonebindrecord/saveBind1.do?${queryString}`;
+
+ const response = await httpRequest.post(fullUrl, null);
+
+ return response;
+ } catch (error) {
+ console.error('绑定手机号异常:', error);
+ throw error;
+ }
+ }
+
+ // 退出登录
+ async logout() {
+ try {
+ const params = {
+ responseFunction: 'logoutCallback',
+ rfm: generateRfm()
+ };
+
+ const queryString = this.buildQueryString(params);
+ const fullUrl = `${this.baseUrl}/card/logout.do?${queryString}`;
+
+ const response = await httpRequest.post(fullUrl, null);
+
+ return response;
+ } catch (error) {
+ console.error('退出登录异常:', error);
+ throw error;
+ }
+ }
+
+ buildQueryString(params) {
+ return Object.keys(params)
+ .filter(key => params[key] !== undefined && params[key] !== null)
+ .map(key => `${encodeURIComponent(key)}=${encodeURIComponent(params[key])}`)
+ .join('&');
+ }
+}
+
+const userApi = new UserApi();
+
+export default userApi;
\ No newline at end of file
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..01e05e3
--- /dev/null
+++ b/index.html
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/main.js b/main.js
new file mode 100644
index 0000000..b2a139f
--- /dev/null
+++ b/main.js
@@ -0,0 +1,24 @@
+import App from './App'
+import uviewPlus from 'uview-plus'
+
+// #ifndef VUE3
+import Vue from 'vue'
+import './uni.promisify.adaptor'
+Vue.config.productionTip = false
+App.mpType = 'app'
+const app = new Vue({
+ ...App
+})
+app.$mount()
+// #endif
+
+// #ifdef VUE3
+import { createSSRApp } from 'vue'
+export function createApp() {
+ const app = createSSRApp(App)
+ app.use(uviewPlus)
+ return {
+ app
+ }
+}
+// #endif
\ No newline at end of file
diff --git a/manifest.json b/manifest.json
new file mode 100644
index 0000000..998ee59
--- /dev/null
+++ b/manifest.json
@@ -0,0 +1,101 @@
+{
+ "name": "singer-card-h5",
+ "appid": "__UNI__45F0251",
+ "description": "",
+ "versionName": "1.0.0",
+ "versionCode": "100",
+ "transformPx": false,
+ /* 5+App特有相关 */
+ "app-plus": {
+ "usingComponents": true,
+ "nvueStyleCompiler": "uni-app",
+ "compilerVersion": 3,
+ "splashscreen": {
+ "alwaysShowBeforeRender": true,
+ "waiting": true,
+ "autoclose": true,
+ "delay": 0
+ },
+ /* 模块配置 */
+ "modules": {},
+ /* 应用发布信息 */
+ "distribute": {
+ /* android打包配置 */
+ "android": {
+ "permissions": [
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ ""
+ ]
+ },
+ /* ios打包配置 */
+ "ios": {},
+ /* SDK配置 */
+ "sdkConfigs": {}
+ }
+ },
+ /* 快应用特有相关 */
+ "quickapp": {},
+ /* 小程序特有相关 */
+ "mp-weixin": {
+ "appid": "",
+ "setting": {
+ "urlCheck": false
+ },
+ "usingComponents": true
+ },
+ "mp-alipay": {
+ "usingComponents": true
+ },
+ "mp-baidu": {
+ "usingComponents": true
+ },
+ "mp-toutiao": {
+ "usingComponents": true
+ },
+ "uniStatistics": {
+ "enable": false
+ },
+ "vueVersion": "3",
+ "h5": {
+ "title": "物联网卡查询",
+ "template": "index.html",
+ "router": {
+ "mode": "history",
+ "base": "/singer-card/"
+ },
+ "optimization": {
+ "treeShaking": {
+ "enable": true
+ }
+ },
+ "publicPath": "./singer-card/",
+ "devServer": {
+ "proxy": {
+ "/kyhl-weixin-1.0": {
+ "target": "http://jhwl.whjhft.com",
+ "changeOrigin": true,
+ "secure": false
+ },
+ "/cm-api": {
+ "target": "http://report.whjhft.com",
+ "changeOrigin": true,
+ "secure": false
+ }
+ }
+ },
+ "sdkConfigs": {}
+ }
+}
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..7746928
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,1621 @@
+{
+ "name": "singer-card-h5",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "dependencies": {
+ "clipboard": "^2.0.11",
+ "dayjs": "^1.11.19",
+ "uview-plus": "^3.6.29"
+ },
+ "devDependencies": {
+ "sass": "^1.63.2",
+ "sass-loader": "^10.4.1"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.13",
+ "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
+ "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.0",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/source-map": {
+ "version": "0.3.11",
+ "resolved": "https://registry.npmmirror.com/@jridgewell/source-map/-/source-map-0.3.11.tgz",
+ "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.25"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.5",
+ "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
+ "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.31",
+ "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
+ "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@types/eslint": {
+ "version": "9.6.1",
+ "resolved": "https://registry.npmmirror.com/@types/eslint/-/eslint-9.6.1.tgz",
+ "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@types/estree": "*",
+ "@types/json-schema": "*"
+ }
+ },
+ "node_modules/@types/eslint-scope": {
+ "version": "3.7.7",
+ "resolved": "https://registry.npmmirror.com/@types/eslint-scope/-/eslint-scope-3.7.7.tgz",
+ "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@types/eslint": "*",
+ "@types/estree": "*"
+ }
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.8.tgz",
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.15",
+ "resolved": "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.15.tgz",
+ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/node": {
+ "version": "25.0.3",
+ "resolved": "https://registry.npmmirror.com/@types/node/-/node-25.0.3.tgz",
+ "integrity": "sha512-W609buLVRVmeW693xKfzHeIV6nJGGz98uCPfeXI1ELMLXVeKYZ9m15fAMSaUPBHYLGFsVRcMmSCksQOrZV9BYA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "undici-types": "~7.16.0"
+ }
+ },
+ "node_modules/@webassemblyjs/ast": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/ast/-/ast-1.14.1.tgz",
+ "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@webassemblyjs/helper-numbers": "1.13.2",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2"
+ }
+ },
+ "node_modules/@webassemblyjs/floating-point-hex-parser": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz",
+ "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@webassemblyjs/helper-api-error": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz",
+ "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@webassemblyjs/helper-buffer": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz",
+ "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@webassemblyjs/helper-numbers": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz",
+ "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@webassemblyjs/floating-point-hex-parser": "1.13.2",
+ "@webassemblyjs/helper-api-error": "1.13.2",
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@webassemblyjs/helper-wasm-bytecode": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz",
+ "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@webassemblyjs/helper-wasm-section": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz",
+ "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-buffer": "1.14.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
+ "@webassemblyjs/wasm-gen": "1.14.1"
+ }
+ },
+ "node_modules/@webassemblyjs/ieee754": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz",
+ "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@xtuc/ieee754": "^1.2.0"
+ }
+ },
+ "node_modules/@webassemblyjs/leb128": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/leb128/-/leb128-1.13.2.tgz",
+ "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "peer": true,
+ "dependencies": {
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@webassemblyjs/utf8": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/utf8/-/utf8-1.13.2.tgz",
+ "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@webassemblyjs/wasm-edit": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz",
+ "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-buffer": "1.14.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
+ "@webassemblyjs/helper-wasm-section": "1.14.1",
+ "@webassemblyjs/wasm-gen": "1.14.1",
+ "@webassemblyjs/wasm-opt": "1.14.1",
+ "@webassemblyjs/wasm-parser": "1.14.1",
+ "@webassemblyjs/wast-printer": "1.14.1"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-gen": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz",
+ "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
+ "@webassemblyjs/ieee754": "1.13.2",
+ "@webassemblyjs/leb128": "1.13.2",
+ "@webassemblyjs/utf8": "1.13.2"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-opt": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz",
+ "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-buffer": "1.14.1",
+ "@webassemblyjs/wasm-gen": "1.14.1",
+ "@webassemblyjs/wasm-parser": "1.14.1"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-parser": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz",
+ "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-api-error": "1.13.2",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
+ "@webassemblyjs/ieee754": "1.13.2",
+ "@webassemblyjs/leb128": "1.13.2",
+ "@webassemblyjs/utf8": "1.13.2"
+ }
+ },
+ "node_modules/@webassemblyjs/wast-printer": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz",
+ "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.14.1",
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@xtuc/ieee754": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
+ "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "peer": true
+ },
+ "node_modules/@xtuc/long": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmmirror.com/@xtuc/long/-/long-4.2.2.tgz",
+ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "peer": true
+ },
+ "node_modules/acorn": {
+ "version": "8.15.0",
+ "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.15.0.tgz",
+ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-import-phases": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmmirror.com/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz",
+ "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=10.13.0"
+ },
+ "peerDependencies": {
+ "acorn": "^8.14.0"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ajv-formats": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmmirror.com/ajv-formats/-/ajv-formats-2.1.1.tgz",
+ "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "ajv": "^8.0.0"
+ },
+ "peerDependencies": {
+ "ajv": "^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "ajv": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/ajv-formats/node_modules/ajv": {
+ "version": "8.17.1",
+ "resolved": "https://registry.npmmirror.com/ajv/-/ajv-8.17.1.tgz",
+ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ajv-formats/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/ajv-keywords": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmmirror.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "ajv": "^6.9.1"
+ }
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/baseline-browser-mapping": {
+ "version": "2.9.10",
+ "resolved": "https://registry.npmmirror.com/baseline-browser-mapping/-/baseline-browser-mapping-2.9.10.tgz",
+ "integrity": "sha512-2VIKvDx8Z1a9rTB2eCkdPE5nSe28XnA+qivGnWHoB40hMMt/h1hSz0960Zqsn6ZyxWXUie0EBdElKv8may20AA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "peer": true,
+ "bin": {
+ "baseline-browser-mapping": "dist/cli.js"
+ }
+ },
+ "node_modules/big.js": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmmirror.com/big.js/-/big.js-5.2.2.tgz",
+ "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.3.0.tgz",
+ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.28.1",
+ "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.28.1.tgz",
+ "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "baseline-browser-mapping": "^2.9.0",
+ "caniuse-lite": "^1.0.30001759",
+ "electron-to-chromium": "^1.5.263",
+ "node-releases": "^2.0.27",
+ "update-browserslist-db": "^1.2.0"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001761",
+ "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001761.tgz",
+ "integrity": "sha512-JF9ptu1vP2coz98+5051jZ4PwQgd2ni8A+gYSN7EA7dPKIMf0pDlSUxhdmVOaV3/fYK5uWBkgSXJaRLr4+3A6g==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "CC-BY-4.0",
+ "peer": true
+ },
+ "node_modules/chokidar": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.6.0.tgz",
+ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/chrome-trace-event": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmmirror.com/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz",
+ "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=6.0"
+ }
+ },
+ "node_modules/clipboard": {
+ "version": "2.0.11",
+ "resolved": "https://registry.npmmirror.com/clipboard/-/clipboard-2.0.11.tgz",
+ "integrity": "sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==",
+ "license": "MIT",
+ "dependencies": {
+ "good-listener": "^1.2.2",
+ "select": "^1.1.2",
+ "tiny-emitter": "^2.0.0"
+ }
+ },
+ "node_modules/commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/dayjs": {
+ "version": "1.11.19",
+ "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.19.tgz",
+ "integrity": "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==",
+ "license": "MIT"
+ },
+ "node_modules/delegate": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmmirror.com/delegate/-/delegate-3.2.0.tgz",
+ "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==",
+ "license": "MIT"
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.5.267",
+ "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz",
+ "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==",
+ "dev": true,
+ "license": "ISC",
+ "peer": true
+ },
+ "node_modules/emojis-list": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/emojis-list/-/emojis-list-3.0.0.tgz",
+ "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/enhanced-resolve": {
+ "version": "5.18.4",
+ "resolved": "https://registry.npmmirror.com/enhanced-resolve/-/enhanced-resolve-5.18.4.tgz",
+ "integrity": "sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "graceful-fs": "^4.2.4",
+ "tapable": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/es-module-lexer": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/es-module-lexer/-/es-module-lexer-2.0.0.tgz",
+ "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "peer": true,
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "peer": true,
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esrecurse/node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "peer": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "peer": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/events": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmmirror.com/events/-/events-3.3.0.tgz",
+ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=0.8.x"
+ }
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-uri": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/fast-uri/-/fast-uri-3.1.0.tgz",
+ "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fastify"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fastify"
+ }
+ ],
+ "license": "BSD-3-Clause",
+ "peer": true
+ },
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/glob-to-regexp": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmmirror.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
+ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "peer": true
+ },
+ "node_modules/good-listener": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmmirror.com/good-listener/-/good-listener-1.2.2.tgz",
+ "integrity": "sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==",
+ "license": "MIT",
+ "dependencies": {
+ "delegate": "^3.1.2"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "dev": true,
+ "license": "ISC",
+ "peer": true
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/immutable": {
+ "version": "4.3.7",
+ "resolved": "https://registry.npmmirror.com/immutable/-/immutable-4.3.7.tgz",
+ "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/jest-worker": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmmirror.com/jest-worker/-/jest-worker-27.5.1.tgz",
+ "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@types/node": "*",
+ "merge-stream": "^2.0.0",
+ "supports-color": "^8.0.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ }
+ },
+ "node_modules/json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/klona": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmmirror.com/klona/-/klona-2.0.6.tgz",
+ "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/loader-runner": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmmirror.com/loader-runner/-/loader-runner-4.3.1.tgz",
+ "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=6.11.5"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/loader-utils": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-2.0.4.tgz",
+ "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^2.1.2"
+ },
+ "engines": {
+ "node": ">=8.9.0"
+ }
+ },
+ "node_modules/merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/neo-async": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmmirror.com/neo-async/-/neo-async-2.6.2.tgz",
+ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.27",
+ "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.27.tgz",
+ "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "dev": true,
+ "license": "ISC",
+ "peer": true
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/randombytes": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz",
+ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/require-from-string": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmmirror.com/require-from-string/-/require-from-string-2.0.2.tgz",
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/sass": {
+ "version": "1.63.2",
+ "resolved": "https://registry.npmmirror.com/sass/-/sass-1.63.2.tgz",
+ "integrity": "sha512-u56TU0AIFqMtauKl/OJ1AeFsXqRHkgO7nCWmHaDwfxDo9GUMSqBA4NEh6GMuh1CYVM7zuROYtZrHzPc2ixK+ww==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "chokidar": ">=3.0.0 <4.0.0",
+ "immutable": "^4.0.0",
+ "source-map-js": ">=0.6.2 <2.0.0"
+ },
+ "bin": {
+ "sass": "sass.js"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/sass-loader": {
+ "version": "10.4.1",
+ "resolved": "https://registry.npmmirror.com/sass-loader/-/sass-loader-10.4.1.tgz",
+ "integrity": "sha512-aX/iJZTTpNUNx/OSYzo2KsjIUQHqvWsAhhUijFjAPdZTEhstjZI9zTNvkTTwsx+uNUJqUwOw5gacxQMx4hJxGQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "klona": "^2.0.4",
+ "loader-utils": "^2.0.0",
+ "neo-async": "^2.6.2",
+ "schema-utils": "^3.0.0",
+ "semver": "^7.3.2"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "fibers": ">= 3.1.0",
+ "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0",
+ "sass": "^1.3.0",
+ "webpack": "^4.36.0 || ^5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "fibers": {
+ "optional": true
+ },
+ "node-sass": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/schema-utils": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-3.3.0.tgz",
+ "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/json-schema": "^7.0.8",
+ "ajv": "^6.12.5",
+ "ajv-keywords": "^3.5.2"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/select": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmmirror.com/select/-/select-1.1.2.tgz",
+ "integrity": "sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==",
+ "license": "MIT"
+ },
+ "node_modules/semver": {
+ "version": "7.7.3",
+ "resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.3.tgz",
+ "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/serialize-javascript": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmmirror.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz",
+ "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "peer": true,
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-support": {
+ "version": "0.5.21",
+ "resolved": "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz",
+ "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "node_modules/tapable": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmmirror.com/tapable/-/tapable-2.3.0.tgz",
+ "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/terser": {
+ "version": "5.44.1",
+ "resolved": "https://registry.npmmirror.com/terser/-/terser-5.44.1.tgz",
+ "integrity": "sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "peer": true,
+ "dependencies": {
+ "@jridgewell/source-map": "^0.3.3",
+ "acorn": "^8.15.0",
+ "commander": "^2.20.0",
+ "source-map-support": "~0.5.20"
+ },
+ "bin": {
+ "terser": "bin/terser"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/terser-webpack-plugin": {
+ "version": "5.3.16",
+ "resolved": "https://registry.npmmirror.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.16.tgz",
+ "integrity": "sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jridgewell/trace-mapping": "^0.3.25",
+ "jest-worker": "^27.4.5",
+ "schema-utils": "^4.3.0",
+ "serialize-javascript": "^6.0.2",
+ "terser": "^5.31.1"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^5.1.0"
+ },
+ "peerDependenciesMeta": {
+ "@swc/core": {
+ "optional": true
+ },
+ "esbuild": {
+ "optional": true
+ },
+ "uglify-js": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/terser-webpack-plugin/node_modules/ajv": {
+ "version": "8.17.1",
+ "resolved": "https://registry.npmmirror.com/ajv/-/ajv-8.17.1.tgz",
+ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmmirror.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
+ "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3"
+ },
+ "peerDependencies": {
+ "ajv": "^8.8.2"
+ }
+ },
+ "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/terser-webpack-plugin/node_modules/schema-utils": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-4.3.3.tgz",
+ "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@types/json-schema": "^7.0.9",
+ "ajv": "^8.9.0",
+ "ajv-formats": "^2.1.1",
+ "ajv-keywords": "^5.1.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/tiny-emitter": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz",
+ "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==",
+ "license": "MIT"
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/undici-types": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-7.16.0.tgz",
+ "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz",
+ "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "escalade": "^3.2.0",
+ "picocolors": "^1.1.1"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/uview-plus": {
+ "version": "3.6.29",
+ "resolved": "https://registry.npmmirror.com/uview-plus/-/uview-plus-3.6.29.tgz",
+ "integrity": "sha512-zK522LR074rB4k3EARysmjsoOh+WjtFevIpvmV1wjVFqS3TT6brLZLd+gKa1ewxBsIgIPDTAabmnHWPsW9DWkQ==",
+ "dependencies": {
+ "clipboard": "^2.0.11",
+ "dayjs": "^1.11.3"
+ },
+ "engines": {
+ "HBuilderX": "^3.1.0",
+ "uni-app": "^4.66",
+ "uni-app-x": ""
+ }
+ },
+ "node_modules/watchpack": {
+ "version": "2.4.4",
+ "resolved": "https://registry.npmmirror.com/watchpack/-/watchpack-2.4.4.tgz",
+ "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "glob-to-regexp": "^0.4.1",
+ "graceful-fs": "^4.1.2"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/webpack": {
+ "version": "5.104.1",
+ "resolved": "https://registry.npmmirror.com/webpack/-/webpack-5.104.1.tgz",
+ "integrity": "sha512-Qphch25abbMNtekmEGJmeRUhLDbe+QfiWTiqpKYkpCOWY64v9eyl+KRRLmqOFA2AvKPpc9DC6+u2n76tQLBoaA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@types/eslint-scope": "^3.7.7",
+ "@types/estree": "^1.0.8",
+ "@types/json-schema": "^7.0.15",
+ "@webassemblyjs/ast": "^1.14.1",
+ "@webassemblyjs/wasm-edit": "^1.14.1",
+ "@webassemblyjs/wasm-parser": "^1.14.1",
+ "acorn": "^8.15.0",
+ "acorn-import-phases": "^1.0.3",
+ "browserslist": "^4.28.1",
+ "chrome-trace-event": "^1.0.2",
+ "enhanced-resolve": "^5.17.4",
+ "es-module-lexer": "^2.0.0",
+ "eslint-scope": "5.1.1",
+ "events": "^3.2.0",
+ "glob-to-regexp": "^0.4.1",
+ "graceful-fs": "^4.2.11",
+ "json-parse-even-better-errors": "^2.3.1",
+ "loader-runner": "^4.3.1",
+ "mime-types": "^2.1.27",
+ "neo-async": "^2.6.2",
+ "schema-utils": "^4.3.3",
+ "tapable": "^2.3.0",
+ "terser-webpack-plugin": "^5.3.16",
+ "watchpack": "^2.4.4",
+ "webpack-sources": "^3.3.3"
+ },
+ "bin": {
+ "webpack": "bin/webpack.js"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependenciesMeta": {
+ "webpack-cli": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/webpack-sources": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmmirror.com/webpack-sources/-/webpack-sources-3.3.3.tgz",
+ "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/webpack/node_modules/ajv": {
+ "version": "8.17.1",
+ "resolved": "https://registry.npmmirror.com/ajv/-/ajv-8.17.1.tgz",
+ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/webpack/node_modules/ajv-keywords": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmmirror.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
+ "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3"
+ },
+ "peerDependencies": {
+ "ajv": "^8.8.2"
+ }
+ },
+ "node_modules/webpack/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/webpack/node_modules/schema-utils": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-4.3.3.tgz",
+ "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@types/json-schema": "^7.0.9",
+ "ajv": "^8.9.0",
+ "ajv-formats": "^2.1.1",
+ "ajv-keywords": "^5.1.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ }
+ }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..ebb9f9b
--- /dev/null
+++ b/package.json
@@ -0,0 +1,11 @@
+{
+ "devDependencies": {
+ "sass": "^1.63.2",
+ "sass-loader": "^10.4.1"
+ },
+ "dependencies": {
+ "clipboard": "^2.0.11",
+ "dayjs": "^1.11.19",
+ "uview-plus": "^3.6.29"
+ }
+}
diff --git a/pages.json b/pages.json
new file mode 100644
index 0000000..1125c68
--- /dev/null
+++ b/pages.json
@@ -0,0 +1,61 @@
+{
+ "easycom": {
+ "autoscan": true,
+ // 注意一定要放在custom里,否则无效,https://ask.dcloud.net.cn/question/131175
+ "custom": {
+ "^u--(.*)": "uview-plus/components/u-$1/u-$1.vue",
+ "^up-(.*)": "uview-plus/components/u-$1/u-$1.vue",
+ "^u-([^-].*)": "uview-plus/components/u-$1/u-$1.vue"
+ }
+ },
+ "pages": [{
+ "path": "pages/login/login",
+ "style": {
+ "navigationStyle": "custom"
+ }
+ },
+ {
+ "path": "pages/index/index",
+ "style": {
+ "navigationStyle": "custom"
+ }
+ },
+ {
+ "path": "pages/package-order/package-order",
+ "style": {
+ "navigationBarTitleText": "套餐列表"
+ }
+ },
+ {
+ "path": "pages/switch/switch",
+ "style": {
+ "navigationBarTitleText": "切换运营商"
+ }
+ },
+ {
+ "path": "pages/bind/bind",
+ "style": {
+ "navigationBarTitleText": "绑定手机号"
+ }
+ },
+ {
+ "path": "pages/auth/auth",
+ "style": {
+ "navigationBarTitleText": "实名认证"
+ }
+ },
+ {
+ "path": "pages/error/error",
+ "style": {
+ "navigationStyle": "custom"
+ }
+ }
+ ],
+ "globalStyle": {
+ "navigationBarTextStyle": "black",
+ "navigationBarTitleText": "物联网卡查询",
+ "navigationBarBackgroundColor": "#F8F8F8",
+ "backgroundColor": "#F8F8F8"
+ },
+ "uniIdRouter": {}
+}
\ No newline at end of file
diff --git a/pages/auth/auth.vue b/pages/auth/auth.vue
new file mode 100644
index 0000000..921da12
--- /dev/null
+++ b/pages/auth/auth.vue
@@ -0,0 +1,221 @@
+
+
+
+
+
+
+
+
+
+ ICCID: {{item.iccidMark}}
+
+
+ 运营商: {{getLogo(item.category).name}}
+
+
+
+
+
+
+ 已实名
+
+
+ 去实名
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/bind/bind.vue b/pages/bind/bind.vue
new file mode 100644
index 0000000..bc023bc
--- /dev/null
+++ b/pages/bind/bind.vue
@@ -0,0 +1,148 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 绑定手机号
+
+
+
+
+
+
+
+
+
+
+
+
+ 更换绑定
+ 退出
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/error/error.vue b/pages/error/error.vue
new file mode 100644
index 0000000..ced36b7
--- /dev/null
+++ b/pages/error/error.vue
@@ -0,0 +1,21 @@
+
+
+ 请在微信中打开...
+
+
+
+
+
+
diff --git a/pages/index/index.vue b/pages/index/index.vue
new file mode 100644
index 0000000..5adc371
--- /dev/null
+++ b/pages/index/index.vue
@@ -0,0 +1,1102 @@
+
+
+
+
+
+
+
+
+
+ {{userInfo.nickname || "单卡用户"}}
+ 设备已运行:{{formatSecondsToTime(deviceInfo.run_time)}}
+
+
+ {{onlineStatus}}
+
+
+
+
+
+
+
+
+
+
+ 当前使用卡:{{deviceInfo.currentIccid || "无"}}
+
+
+
+ {{isRealName ? "已实名" : "未实名"}}
+
+
+
+
+
+ 到期时间:{{deviceInfo.expireDate}}
+
+
+ {{deviceInfo.statusStr}}
+
+
+
+
+
+
+
+ 信号强度
+ {{getSignalText(deviceInfo.rssi)}}
+
+
+ 设备电量
+ {{deviceInfo.battery || 0 }} %
+
+
+ 连接数量
+ {{deviceInfo.connCnt || 0}} 台
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 已使用
+
+ {{formatDataSize(deviceInfo.totalBytesCnt)}}
+ GB
+
+
+
+ 总流量
+
+ {{formatDataSize(deviceInfo.flowSize)}}
+ GB
+
+
+
+ 剩余
+
+ {{formatDataSize(deviceInfo.flowSize - deviceInfo.totalBytesCnt)}}
+ GB
+
+
+
+
+
+
+
+
+
+
+
+ 网络名称
+ {{deviceInfo.ssidName}}
+
+
+
+
+
+ 连接密码
+ {{deviceInfo.ssidPwd}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 套餐订购
+
+
+
+
+
+ 智能诊断
+
+
+
+
+
+ 后台管理
+
+
+
+
+
+
+
+ {{alreadyBindPhone ? "已绑定" : "未绑定" }}
+
+
+
+
+
+
+
+ {{isRealName ? "已实名" : "未实名"}}
+
+
+
+
+
+
+ 重启设备
+
+
+
+
+
+ 恢复出厂
+
+
+
+
+
+ 退出登录
+
+
+
+
+
+
+
+
+ 修改WIFI
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 在线客服
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/login/login.vue b/pages/login/login.vue
new file mode 100644
index 0000000..172caa9
--- /dev/null
+++ b/pages/login/login.vue
@@ -0,0 +1,109 @@
+
+
+
+
+ 物联网卡登录
+
+
+
+
+
+ 立即登录
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/package-order/package-order.vue b/pages/package-order/package-order.vue
new file mode 100644
index 0000000..5576e40
--- /dev/null
+++ b/pages/package-order/package-order.vue
@@ -0,0 +1,301 @@
+
+
+
+
+ {{item.name}}
+
+
+ ¥{{item.accountMoney}}
+
+
+ 请在套餐有效期内使用,有效期内流量用完可充值加餐包即可继续使用
+
+
+ 立即订购
+
+
+
+
+
+
+ 该设备暂无套餐, 请联系客服购买
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/switch/switch.vue b/pages/switch/switch.vue
new file mode 100644
index 0000000..c5c4414
--- /dev/null
+++ b/pages/switch/switch.vue
@@ -0,0 +1,234 @@
+
+
+
+
+
+
+
+
+
+
+
+ ICCID: {{item.iccidMark}}
+
+
+ {{getLogo(item.category).name}}
+
+
+
+
+ {{item.iccidMark===currentIccid ? "当前使用" : ""}}
+
+
+ {{item.iccidMark===currentIccidMain ? "当前主卡" : ""}}
+
+
+
+ {{item.isRealName ? "已实名" : "未实名"}}
+
+
+
+
+
+
+
+
+ 切换此运营商
+
+
+ 跳转实名页面
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/static/authentication.png b/static/authentication.png
new file mode 100644
index 0000000..e003035
Binary files /dev/null and b/static/authentication.png differ
diff --git a/static/back.png b/static/back.png
new file mode 100644
index 0000000..4ca89d1
Binary files /dev/null and b/static/back.png differ
diff --git a/static/bind-phone.png b/static/bind-phone.png
new file mode 100644
index 0000000..25f4c0c
Binary files /dev/null and b/static/bind-phone.png differ
diff --git a/static/change.png b/static/change.png
new file mode 100644
index 0000000..8781c25
Binary files /dev/null and b/static/change.png differ
diff --git a/static/diagnosis.png b/static/diagnosis.png
new file mode 100644
index 0000000..f3bc1aa
Binary files /dev/null and b/static/diagnosis.png differ
diff --git a/static/link.png b/static/link.png
new file mode 100644
index 0000000..b515f70
Binary files /dev/null and b/static/link.png differ
diff --git a/static/login.png b/static/login.png
new file mode 100644
index 0000000..b78804b
Binary files /dev/null and b/static/login.png differ
diff --git a/static/out.png b/static/out.png
new file mode 100644
index 0000000..97358e0
Binary files /dev/null and b/static/out.png differ
diff --git a/static/recover.png b/static/recover.png
new file mode 100644
index 0000000..5ba27be
Binary files /dev/null and b/static/recover.png differ
diff --git a/static/restart.png b/static/restart.png
new file mode 100644
index 0000000..39d9d94
Binary files /dev/null and b/static/restart.png differ
diff --git a/static/shop.png b/static/shop.png
new file mode 100644
index 0000000..21e83c4
Binary files /dev/null and b/static/shop.png differ
diff --git a/store/index.js b/store/index.js
new file mode 100644
index 0000000..9b1ea35
--- /dev/null
+++ b/store/index.js
@@ -0,0 +1,15 @@
+/**
+ * 简单的响应式状态管理
+ * 基于 Vue 3 reactive API
+ */
+
+import { reactive, ref } from 'vue';
+import userStore from './modules/user.js';
+
+// 创建全局状态
+const globalStore = reactive({
+ user: userStore
+});
+
+export default globalStore;
+export { userStore };
\ No newline at end of file
diff --git a/store/modules/user.js b/store/modules/user.js
new file mode 100644
index 0000000..38aad77
--- /dev/null
+++ b/store/modules/user.js
@@ -0,0 +1,435 @@
+/**
+ * 用户状态管理模块
+ */
+
+import {
+ reactive,
+ computed
+} from 'vue';
+import userApi from '@/api/user.js';
+
+// 用户状态数据
+const state = reactive({
+ userInfo: {
+ nickname: '单卡用户', // 昵称
+ avatar: 'https://img1.baidu.com/it/u=2462918877,1866131262&fm=253&fmt=auto&app=138&f=JPEG?w=506&h=500', // 头像
+ deviceId: '' // 设备ID
+ },
+ // 用户信息
+ isLoggedIn: false, // 登录状态
+ error: null // 错误信息
+});
+
+// 计算属性
+const getters = {
+ // 是否已登录
+ isLoggedIn: computed(() => state.isLoggedIn && !!state.userInfo.deviceId),
+ // 用户信息
+ userInfo: computed(() => state.userInfo)
+};
+
+// 操作方法
+const actions = {
+ // 获取Cookies
+ async getCookie() {
+ try {
+ return userApi.getCookie();
+ } catch (error) {
+ console.error('获取微信授权失败:', error);
+ state.error = error.message;
+ throw error;
+ }
+ },
+
+ // 登录
+ async login(iccidMark) {
+ try {
+ // 调用login接口
+ const result = await userApi.login(iccidMark);
+
+ // 如果登录成功,设置登录状态和用户信息
+ if (!result.system_result_message_key) {
+ state.isLoggedIn = true;
+ state.userInfo.deviceId = iccidMark;
+ // 同步到本地存储
+ uni.setStorageSync('device_id', iccidMark);
+ uni.setStorageSync('isLoggedIn', true);
+ console.log('登录成功,已设置登录状态');
+ }
+
+ return result;
+ } catch (error) {
+ console.error('登录失败:', error);
+ state.error = error.message;
+ state.isLoggedIn = false;
+ throw error;
+ }
+ },
+
+ // 获取用户实名信息
+ async getRealNameInfo() {
+ try {
+ return userApi.getRealNameInfo();
+ } catch (error) {
+ console.error('获取用户实名信息失败:', error);
+ state.error = error.message;
+ throw error;
+ }
+ },
+
+ // 获取用户信息
+ async getUserInfo() {
+ try {
+ const result = await userApi.getUserInfo();
+ if (result?.entity) {
+ state.userInfo.avatar = result.entity.headimgurl
+ state.userInfo.nickname = result.entity.nickname
+ } else {
+ const result_once = await userApi.getUserInfo();
+ if (result_once?.entity) {
+ state.userInfo.avatar = result_once.entity.headimgurl
+ state.userInfo.nickname = result_once.entity.nickname
+ }
+ }
+ return result
+ } catch (error) {
+ console.error('获取用户信息失败:', error);
+ state.error = error.message;
+ throw error;
+ }
+ },
+
+ // 获取wxUrl
+ async getWxUrl() {
+ try {
+ return userApi.getWxUrl();
+ } catch (error) {
+ console.error('获取获取wxUrl失败:', error);
+ state.error = error.message;
+ throw error;
+ }
+ },
+
+ // 获取getOpenId
+ async getOpenId() {
+ try {
+ return userApi.getOpenId();
+ } catch (error) {
+ console.error('获取获取getOpenId失败:', error);
+ state.error = error.message;
+ throw error;
+ }
+ },
+
+ // 微信授权
+ async getAuthorize(code) {
+ try {
+ return userApi.getAuthorize(code);
+ } catch (error) {
+ console.error('获取微信授权失败:', error);
+ state.error = error.message;
+ throw error;
+ }
+ },
+
+ // 获取微信支付签名
+ async getWxPaySign() {
+ try {
+ return userApi.getWxPaySign();
+ } catch (error) {
+ console.error('获取微信支付签名失败:', error);
+ state.error = error.message;
+ throw error;
+ }
+ },
+
+ // 恢复出厂设置
+ async restDevice(deviceId) {
+ try {
+ return userApi.restDevice(deviceId);
+ } catch (error) {
+ console.error('恢复出厂设置失败:', error);
+ state.error = error.message;
+ throw error;
+ }
+ },
+
+ // 重启设备
+ async restartDevice(deviceId) {
+ try {
+ return userApi.restartDevice(deviceId);
+ } catch (error) {
+ console.error('重启设备失败:', error);
+ state.error = error.message;
+ throw error;
+ }
+ },
+
+ // 获取设备信息
+ async getCardInfo() {
+ try {
+ return userApi.getCardInfo();
+ } catch (error) {
+ console.error('获取设备信息失败:', error);
+ state.error = error.message;
+ throw error;
+ }
+ },
+
+ // 获取设备信息(管理平台)
+ async getDeviceInfoAdmin(device_id) {
+ try {
+ return userApi.getDeviceInfoAdmin(device_id);
+ } catch (error) {
+ console.error('获取设备信息(管理平台)', error);
+ state.error = error.message;
+ throw error;
+ }
+ },
+
+ // 获取首页信息-设备列表
+ async getSwitchCardList() {
+ try {
+ return userApi.getSwitchCardList();
+ } catch (error) {
+ console.error('获取首页信息-设备列表失败:', error);
+ state.error = error.message;
+ throw error;
+ }
+ },
+
+ // 修改WiFi
+ async modifyWifi(data) {
+ try {
+ return userApi.modifyWifi(data);
+ } catch (error) {
+ console.error('修改WiFi失败:', error);
+ state.error = error.message;
+ throw error;
+ }
+ },
+
+ // 获取套餐列表
+ async getPackageList() {
+ try {
+ return userApi.getPackageList();
+ } catch (error) {
+ console.error('获取套餐列表失败:', error);
+ state.error = error.message;
+ throw error;
+ }
+ },
+
+ // 智能诊断
+ async intelligentDiagnosis() {
+ try {
+ return userApi.intelligentDiagnosis();
+ } catch (error) {
+ console.error('智能诊断失败:', error);
+ state.error = error.message;
+ throw error;
+ }
+ },
+
+ // 获取绑定手机号
+ async getDeviceBindPhone() {
+ try {
+ return userApi.getDeviceBindPhone();
+ } catch (error) {
+ console.error('获取绑定手机号失败:', error);
+ state.error = error.message;
+ throw error;
+ }
+ },
+
+ // 获取验证码
+ async getSmsNumber(mobile) {
+ try {
+ return userApi.getSmsNumber(mobile);
+ } catch (error) {
+ console.error('获取验证码失败:', error);
+ state.error = error.message;
+ throw error;
+ }
+ },
+
+ // 绑定手机号
+ async bindCardPhone(mobile, code) {
+ try {
+ return userApi.bindCardPhone(mobile, code);
+ } catch (error) {
+ console.error('绑定手机号失败:', error);
+ state.error = error.message;
+ throw error;
+ }
+ },
+
+ // 是否显示主号
+ async getIsOnlyMainCard(iccid) {
+ try {
+ return userApi.getIsOnlyMainCard(iccid);
+ } catch (error) {
+ console.error('是否显示主号失败:', error);
+ state.error = error.message;
+ throw error;
+ }
+ },
+
+ // 获取实名地址
+ async getRealNameAddress(iccid) {
+ try {
+ return userApi.getRealNameAddress(iccid);
+ } catch (error) {
+ console.error('获取实名地址失败:', error);
+ state.error = error.message;
+ throw error;
+ }
+ },
+
+ // 切换运营商
+ async changeOperator(esim, iccid) {
+ try {
+ return userApi.changeOperator(esim, iccid);
+ } catch (error) {
+ console.error('切换运营商失败:', error);
+ state.error = error.message;
+ throw error;
+ }
+ },
+
+ // 1. checkHasGzhOpenId 判断当前用户是否已经绑定了微信公众号的
+ async checkHasGzhOpenId() {
+ try {
+ return userApi.checkHasGzhOpenId();
+ } catch (error) {
+ console.error('checkHasGzhOpenId 失败:', error);
+ state.error = error.message;
+ throw error;
+ }
+ },
+
+ // 2. checkYgosWxInfo 检查当前用户是否具有与微信支付相关的特定信息
+ async checkYgosWxInfo() {
+ try {
+ return userApi.checkYgosWxInfo();
+ } catch (error) {
+ console.error('checkYgosWxInfo 失败:', error);
+ state.error = error.message;
+ throw error;
+ }
+ },
+
+ // 3. checkXwzfWxInfo 检查当前用户是否具有与微信支付相关的特定信息
+ async checkXwzfWxInfo() {
+ try {
+ return userApi.checkXwzfWxInfo();
+ } catch (error) {
+ console.error('checkXwzfWxInfo 失败:', error);
+ state.error = error.message;
+ throw error;
+ }
+ },
+
+ // 4. 获取支付列表
+ async getPayList(mealId) {
+ try {
+ return userApi.getPayList(mealId);
+ } catch (error) {
+ console.error('获取支付列表失败:', error);
+ state.error = error.message;
+ throw error;
+ }
+ },
+
+ // 5. createOrder 创建订单 并拉起支付 这个会返回微信支付参数
+ async createOrder(data) {
+ try {
+ return userApi.createOrder(data);
+ } catch (error) {
+ console.error('createOrder 失败:', error);
+ state.error = error.message;
+ throw error;
+ }
+ },
+
+ // 登出(清除Cookie和状态)
+ async logout() {
+ try {
+ await userApi.logout();
+
+ // 重置状态
+ state.isLoggedIn = false;
+ state.userInfo = {
+ nickname: '',
+ avatar: '',
+ deviceId: ''
+ };
+ state.error = null;
+
+ // 清除本地存储
+ uni.removeStorageSync('device_id');
+ uni.removeStorageSync('isLoggedIn');
+
+ console.log('退出登录成功,已清除登录状态');
+
+ // 跳转到登录页
+ uni.redirectTo({
+ url: '/pages/login/login'
+ });
+ } catch (error) {
+ console.error('登出失败:', error);
+ state.error = error.message;
+
+ // 即使服务端退出失败,也要清除本地状态
+ state.isLoggedIn = false;
+ state.userInfo = {
+ nickname: '',
+ avatar: '',
+ deviceId: ''
+ };
+ uni.removeStorageSync('device_id');
+ uni.removeStorageSync('isLoggedIn');
+
+ // 跳转到登录页
+ uni.redirectTo({
+ url: '/pages/login/login'
+ });
+ }
+ },
+
+ // 重置错误状态
+ clearError() {
+ state.error = null;
+ },
+
+ // 初始化登录状态(从本地存储恢复)
+ initLoginState() {
+ try {
+ const deviceId = uni.getStorageSync('device_id');
+ const isLoggedIn = uni.getStorageSync('isLoggedIn');
+
+ if (deviceId && isLoggedIn) {
+ state.isLoggedIn = true;
+ state.userInfo.deviceId = deviceId;
+ console.log('从本地存储恢复登录状态:', deviceId);
+ } else {
+ state.isLoggedIn = false;
+ state.userInfo.deviceId = '';
+ console.log('未找到有效的登录状态');
+ }
+ } catch (error) {
+ console.error('初始化登录状态失败:', error);
+ state.isLoggedIn = false;
+ state.userInfo.deviceId = '';
+ }
+ },
+};
+
+// 创建用户store
+const userStore = {
+ state,
+ getters,
+ actions
+};
+
+export default userStore;
\ No newline at end of file
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 0000000..a4764b7
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,15 @@
+{
+ "compilerOptions": {
+ "sourceMap": true,
+ "baseUrl": ".",
+ "paths": {
+ "@/*": ["./src/*"]
+ },
+ "lib": ["esnext", "dom"],
+ "types": [
+ "@dcloudio/types",
+ "uview-plus/types"
+ ]
+ },
+ "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"]
+}
\ No newline at end of file
diff --git a/uni.promisify.adaptor.js b/uni.promisify.adaptor.js
new file mode 100644
index 0000000..5fec4f3
--- /dev/null
+++ b/uni.promisify.adaptor.js
@@ -0,0 +1,13 @@
+uni.addInterceptor({
+ returnValue (res) {
+ if (!(!!res && (typeof res === "object" || typeof res === "function") && typeof res.then === "function")) {
+ return res;
+ }
+ return new Promise((resolve, reject) => {
+ res.then((res) => {
+ if (!res) return resolve(res)
+ return res[0] ? reject(res[0]) : resolve(res[1])
+ });
+ });
+ },
+});
\ No newline at end of file
diff --git a/uni.scss b/uni.scss
new file mode 100644
index 0000000..c7f439e
--- /dev/null
+++ b/uni.scss
@@ -0,0 +1,76 @@
+/**
+ * 这里是uni-app内置的常用样式变量
+ *
+ * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
+ * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
+ *
+ */
+
+/**
+ * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
+ *
+ * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
+ */
+
+/* 颜色变量 */
+@import 'uview-plus/theme.scss';
+/* 行为相关颜色 */
+$uni-color-primary: #007aff;
+$uni-color-success: #4cd964;
+$uni-color-warning: #f0ad4e;
+$uni-color-error: #dd524d;
+
+/* 文字基本颜色 */
+$uni-text-color:#333;//基本色
+$uni-text-color-inverse:#fff;//反色
+$uni-text-color-grey:#999;//辅助灰色,如加载更多的提示信息
+$uni-text-color-placeholder: #808080;
+$uni-text-color-disable:#c0c0c0;
+
+/* 背景颜色 */
+$uni-bg-color:#ffffff;
+$uni-bg-color-grey:#f8f8f8;
+$uni-bg-color-hover:#f1f1f1;//点击状态颜色
+$uni-bg-color-mask:rgba(0, 0, 0, 0.4);//遮罩颜色
+
+/* 边框颜色 */
+$uni-border-color:#c8c7cc;
+
+/* 尺寸变量 */
+
+/* 文字尺寸 */
+$uni-font-size-sm:12px;
+$uni-font-size-base:14px;
+$uni-font-size-lg:16px;
+
+/* 图片尺寸 */
+$uni-img-size-sm:20px;
+$uni-img-size-base:26px;
+$uni-img-size-lg:40px;
+
+/* Border Radius */
+$uni-border-radius-sm: 2px;
+$uni-border-radius-base: 3px;
+$uni-border-radius-lg: 6px;
+$uni-border-radius-circle: 50%;
+
+/* 水平间距 */
+$uni-spacing-row-sm: 5px;
+$uni-spacing-row-base: 10px;
+$uni-spacing-row-lg: 15px;
+
+/* 垂直间距 */
+$uni-spacing-col-sm: 4px;
+$uni-spacing-col-base: 8px;
+$uni-spacing-col-lg: 12px;
+
+/* 透明度 */
+$uni-opacity-disabled: 0.3; // 组件禁用态的透明度
+
+/* 文章场景相关 */
+$uni-color-title: #2C405A; // 文章标题颜色
+$uni-font-size-title:20px;
+$uni-color-subtitle: #555555; // 二级标题颜色
+$uni-font-size-subtitle:26px;
+$uni-color-paragraph: #3F536E; // 文章段落颜色
+$uni-font-size-paragraph:15px;
diff --git a/utils/common.js b/utils/common.js
new file mode 100644
index 0000000..88a9696
--- /dev/null
+++ b/utils/common.js
@@ -0,0 +1,92 @@
+/**
+ * 公共工具函数
+ */
+
+/**
+ * 生成随机浮点数参数(rfm)
+ * 用于接口请求的防重复参数
+ * @returns {number} 0到1之间的随机浮点数
+ */
+export function generateRfm() {
+ return Math.random();
+}
+
+/**
+ * 获取当前时间戳
+ * @returns {number} 当前时间戳
+ */
+export function getTimestamp() {
+ return Date.now();
+}
+
+/**
+ * 生成带时间戳的随机参数
+ * @returns {number} 带时间戳的随机数
+ */
+export function generateTimestampRfm() {
+ return Math.random() + Date.now() / 1000000;
+}
+
+/**
+ * 构建通用请求参数
+ * @param {Object} customParams - 自定义参数
+ * @returns {Object} 包含通用参数的对象
+ */
+export function buildCommonParams(customParams = {}) {
+ return {
+ rfm: generateRfm(),
+ ...customParams
+ };
+}
+/*
+ * 转换成GB
+ * */
+export function convertToGB(value, type) {
+ if (type === 'flowSize') {
+ // flowSize 单位是 MB,转换为 GB
+ return (value / 1024).toFixed(2);
+ } else if (type === 'totalBytesCnt') {
+ // totalBytesCnt 单位是 MB,转换为 GB
+ return (value / 1024).toFixed(2);
+ }
+ return value;
+}
+
+/**
+ * 秒转时间字符串
+ * @param {number} seconds 秒
+ * @returns {string} HH:mm:ss
+ */
+export function formatSecondsToTime(seconds) {
+ if (!seconds && seconds !== 0) return '00:00:00';
+
+ const h = Math.floor(seconds / 3600);
+ const m = Math.floor((seconds % 3600) / 60);
+ const s = seconds % 60;
+
+ return (
+ String(h).padStart(2, '0') + ':' +
+ String(m).padStart(2, '0') + ':' +
+ String(s).padStart(2, '0')
+ );
+}
+
+/**
+ * 根据信号强度(dBm)返回信号等级与体验描述
+ * @param {number} dbm 信号强度(负数,如 -65)
+ * @returns {string}
+ */
+export function getSignalText(dbm) {
+ if (!dbm) {
+ return '未知'
+ }
+ if (dbm >= -50) {
+ return '极强'
+ }
+
+ if (dbm >= -70) {
+ return '良好'
+ }
+
+ return '一般'
+}
\ No newline at end of file