@pisell/pisellos 2.3.74 → 2.3.76
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core/index.js +6 -10
- package/dist/model/strategy/adapter/promotion/index.js +9 -0
- package/dist/model/strategy/adapter/walletPass/example.js +3 -26
- package/dist/model/strategy/strategy-example.js +5 -19
- package/dist/modules/Cart/index.js +0 -3
- package/dist/modules/Cart/utils/cartProduct.js +0 -1
- package/dist/modules/Date/index.js +1 -5
- package/dist/modules/Discount/index.js +2 -4
- package/dist/modules/OpenData/index.js +0 -2
- package/dist/modules/Order/index.d.ts +1 -1
- package/dist/modules/Order/index.js +75 -91
- package/dist/modules/Order/types.d.ts +3 -1
- package/dist/modules/Payment/index.js +97 -162
- package/dist/modules/Rules/index.js +1 -4
- package/dist/modules/Schedule/index.js +0 -1
- package/dist/modules/Schedule/utils.js +0 -1
- package/dist/modules/Step/index.js +0 -1
- package/dist/plugins/request.js +1 -4
- package/dist/plugins/window.js +2 -6
- package/dist/server/index.js +97 -129
- package/dist/server/modules/menu/index.js +32 -41
- package/dist/server/modules/order/index.js +2 -4
- package/dist/server/modules/products/index.js +24 -42
- package/dist/server/modules/quotation/index.js +29 -38
- package/dist/server/modules/resource/index.js +3 -4
- package/dist/server/modules/schedule/index.js +27 -35
- package/dist/server/utils/product.js +0 -1
- package/dist/solution/BaseSales/index.js +100 -72
- package/dist/solution/BaseSales/utils/cartPromotion.d.ts +5 -0
- package/dist/solution/BaseSales/utils/cartPromotion.js +15 -6
- package/dist/solution/BookingByStep/index.js +7 -59
- package/dist/solution/BookingByStep/utils/capacity.js +1 -11
- package/dist/solution/BookingByStep/utils/resources.js +1 -3
- package/dist/solution/BookingByStep/utils/timeslots.js +2 -43
- package/dist/solution/BookingTicket/index.js +0 -2
- package/dist/solution/BookingTicket/utils/scan/cloudSearch.js +6 -7
- package/dist/solution/BookingTicket/utils/scan/handleScan.js +25 -31
- package/dist/solution/BookingTicket/utils/scan/index.js +6 -10
- package/dist/solution/BuyTickets/index.js +9 -12
- package/dist/solution/Checkout/index.js +177 -252
- package/dist/solution/Checkout/utils/index.js +4 -16
- package/dist/solution/RegisterAndLogin/index.js +30 -76
- package/dist/solution/ScanOrder/index.js +50 -60
- package/dist/solution/ShopDiscount/index.js +2 -7
- package/dist/solution/VenueBooking/index.js +45 -55
- package/dist/utils/task.js +15 -18
- package/dist/utils/watch.js +0 -1
- package/lib/apis/picoding.js +2 -0
- package/lib/core/index.js +134 -134
- package/lib/effects/index.js +46 -57
- package/lib/index.js +82 -49
- package/lib/model/index.js +14 -21
- package/lib/model/strategy/adapter/dataVariant/adapter.js +38 -50
- package/lib/model/strategy/adapter/dataVariant/evaluator.js +162 -236
- package/lib/model/strategy/adapter/dataVariant/examples.js +229 -237
- package/lib/model/strategy/adapter/dataVariant/index.js +39 -34
- package/lib/model/strategy/adapter/dataVariant/type.js +57 -28
- package/lib/model/strategy/adapter/index.js +100 -64
- package/lib/model/strategy/adapter/itemRule/adapter.js +156 -144
- package/lib/model/strategy/adapter/itemRule/evaluator.js +36 -48
- package/lib/model/strategy/adapter/itemRule/examples.js +295 -225
- package/lib/model/strategy/adapter/itemRule/index.js +83 -57
- package/lib/model/strategy/adapter/itemRule/type.js +97 -36
- package/lib/model/strategy/adapter/promotion/adapter.js +91 -69
- package/lib/model/strategy/adapter/promotion/evaluator.js +444 -310
- package/lib/model/strategy/adapter/promotion/examples.js +222 -234
- package/lib/model/strategy/adapter/promotion/index.js +1 -0
- package/lib/model/strategy/adapter/promotion/type.js +243 -36
- package/lib/model/strategy/adapter/type.js +4 -16
- package/lib/model/strategy/adapter/walletPass/evaluator.js +180 -150
- package/lib/model/strategy/adapter/walletPass/example.js +217 -190
- package/lib/model/strategy/adapter/walletPass/index.js +75 -51
- package/lib/model/strategy/adapter/walletPass/locales.js +36 -58
- package/lib/model/strategy/adapter/walletPass/type.js +4 -16
- package/lib/model/strategy/adapter/walletPass/utils.js +588 -378
- package/lib/model/strategy/engine.js +270 -168
- package/lib/model/strategy/index.js +49 -34
- package/lib/model/strategy/strategy-example.js +243 -239
- package/lib/model/strategy/type.js +100 -40
- package/lib/modules/Account/index.js +39 -53
- package/lib/modules/Account/types.js +20 -33
- package/lib/modules/AccountList/index.js +116 -154
- package/lib/modules/AccountList/types.js +30 -31
- package/lib/modules/AccountList/utils.js +18 -30
- package/lib/modules/BaseModule.js +23 -42
- package/lib/modules/BookingContext/index.js +158 -136
- package/lib/modules/BookingContext/types.js +46 -32
- package/lib/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +138 -146
- package/lib/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +78 -83
- package/lib/modules/BookingContext/utils/cacheItemToBookingInput.js +170 -150
- package/lib/modules/BookingContext/utils/flexible.js +38 -55
- package/lib/modules/BookingContext/utils/formatResourceList.js +19 -34
- package/lib/modules/BookingContext/utils/index.js +124 -41
- package/lib/modules/BookingContext/utils/noResource.js +58 -70
- package/lib/modules/BookingContext/utils/orderLineDisplay.js +14 -41
- package/lib/modules/BookingContext/utils/productExtend.js +202 -155
- package/lib/modules/BookingContext/utils/resourceErrors.js +53 -53
- package/lib/modules/BookingContext/utils/resourceSelection.js +19 -41
- package/lib/modules/BookingContext/utils/resources.js +209 -167
- package/lib/modules/BookingContext/utils/serviceTimes.js +115 -116
- package/lib/modules/BookingContext/utils/timeSlices.js +76 -86
- package/lib/modules/Cart/index.js +170 -124
- package/lib/modules/Cart/types.js +46 -51
- package/lib/modules/Cart/utils/cartAccount.js +40 -39
- package/lib/modules/Cart/utils/cartDate.js +56 -61
- package/lib/modules/Cart/utils/cartDiscount.js +28 -33
- package/lib/modules/Cart/utils/cartNote.js +27 -32
- package/lib/modules/Cart/utils/cartProduct.js +321 -251
- package/lib/modules/Cart/utils/cartRelationForms.js +29 -35
- package/lib/modules/Cart/utils/cartResource.js +70 -78
- package/lib/modules/Cart/utils/changePrice.js +22 -50
- package/lib/modules/Cart/utils/index.js +106 -48
- package/lib/modules/Customer/constants.js +13 -34
- package/lib/modules/Customer/index.js +235 -172
- package/lib/modules/Customer/types.js +38 -35
- package/lib/modules/Date/index.js +116 -115
- package/lib/modules/Date/types.js +16 -28
- package/lib/modules/Date/utils.js +174 -123
- package/lib/modules/Discount/index.js +122 -127
- package/lib/modules/Discount/types.js +9 -31
- package/lib/modules/Guests/index.js +30 -56
- package/lib/modules/Guests/types.js +23 -33
- package/lib/modules/Holder/index.js +209 -189
- package/lib/modules/Holder/types.js +4 -16
- package/lib/modules/Holder/utils.js +20 -49
- package/lib/modules/OpenData/index.js +70 -76
- package/lib/modules/OpenData/types.js +4 -16
- package/lib/modules/OpenData/utils.js +44 -78
- package/lib/modules/Order/index.d.ts +1 -1
- package/lib/modules/Order/index.js +1733 -2121
- package/lib/modules/Order/payment-utils.js +77 -120
- package/lib/modules/Order/types.d.ts +3 -1
- package/lib/modules/Order/types.js +88 -35
- package/lib/modules/Order/utils/bundleDiscountHydration.js +41 -74
- package/lib/modules/Order/utils/discountProductLineIdentity.js +142 -100
- package/lib/modules/Order/utils/manualProductDiscount.js +124 -123
- package/lib/modules/Order/utils/orderCollectionIdentity.js +184 -244
- package/lib/modules/Order/utils.js +814 -647
- package/lib/modules/Payment/cash.js +20 -33
- package/lib/modules/Payment/cashRecommendationAlgorithm.js +145 -76
- package/lib/modules/Payment/eftpos.js +16 -30
- package/lib/modules/Payment/index.js +532 -399
- package/lib/modules/Payment/mx51.js +1 -0
- package/lib/modules/Payment/types.js +230 -108
- package/lib/modules/Payment/utils.js +52 -51
- package/lib/modules/Payment/walletpass.js +485 -660
- package/lib/modules/Product/index.js +51 -46
- package/lib/modules/Product/types.js +4 -16
- package/lib/modules/Product/utils.js +32 -33
- package/lib/modules/ProductList/index.js +113 -123
- package/lib/modules/ProductList/types.js +9 -31
- package/lib/modules/Quotation/index.js +81 -118
- package/lib/modules/Quotation/types.js +4 -16
- package/lib/modules/Resource/index.js +27 -59
- package/lib/modules/Resource/types.js +22 -32
- package/lib/modules/Resource/utils.js +30 -38
- package/lib/modules/ResourcePlanner/index.js +25 -23
- package/lib/modules/ResourcePlanner/localClock.js +54 -119
- package/lib/modules/ResourcePlanner/planner.js +589 -770
- package/lib/modules/ResourcePlanner/types.js +10 -29
- package/lib/modules/Rules/index.js +1218 -959
- package/lib/modules/Rules/types.js +17 -40
- package/lib/modules/SalesSummary/index.js +85 -90
- package/lib/modules/SalesSummary/types.js +4 -16
- package/lib/modules/SalesSummary/utils.js +355 -430
- package/lib/modules/ScanOrderLogger/index.js +59 -79
- package/lib/modules/ScanOrderLogger/providers/feishu.js +54 -78
- package/lib/modules/ScanOrderLogger/providers/grafana.js +13 -36
- package/lib/modules/ScanOrderLogger/types.js +4 -16
- package/lib/modules/Schedule/getDateIsInSchedule.js +334 -163
- package/lib/modules/Schedule/index.js +100 -114
- package/lib/modules/Schedule/type.js +4 -16
- package/lib/modules/Schedule/types.js +4 -16
- package/lib/modules/Schedule/utils.js +433 -291
- package/lib/modules/Step/index.js +40 -52
- package/lib/modules/Step/tyeps.js +4 -16
- package/lib/modules/Summary/index.js +66 -71
- package/lib/modules/Summary/types.js +4 -16
- package/lib/modules/Summary/utils.js +773 -418
- package/lib/modules/SurchargeList/index.js +46 -60
- package/lib/modules/SurchargeList/types.js +4 -16
- package/lib/modules/index.js +245 -63
- package/lib/plugins/app.js +4 -16
- package/lib/plugins/index.js +36 -25
- package/lib/plugins/request.js +137 -126
- package/lib/plugins/shopStore.js +4 -16
- package/lib/plugins/user.js +4 -16
- package/lib/plugins/window.js +171 -179
- package/lib/server/index.js +3050 -2665
- package/lib/server/modules/floor-plan/index.js +118 -134
- package/lib/server/modules/floor-plan/types.js +15 -30
- package/lib/server/modules/index.js +106 -68
- package/lib/server/modules/menu/index.js +142 -122
- package/lib/server/modules/menu/types.js +18 -31
- package/lib/server/modules/order/index.js +784 -1002
- package/lib/server/modules/order/types.js +122 -33
- package/lib/server/modules/order/utils/filterBookings.js +219 -194
- package/lib/server/modules/order/utils/filterOrders.js +118 -92
- package/lib/server/modules/payment/index.js +59 -83
- package/lib/server/modules/payment/types.js +4 -16
- package/lib/server/modules/products/index.js +583 -471
- package/lib/server/modules/products/types.js +44 -34
- package/lib/server/modules/quotation/index.js +137 -172
- package/lib/server/modules/quotation/types.js +21 -31
- package/lib/server/modules/resource/index.js +220 -186
- package/lib/server/modules/resource/types.js +42 -33
- package/lib/server/modules/schedule/index.js +135 -123
- package/lib/server/modules/schedule/types.js +14 -21
- package/lib/server/modules/schedule/utils.js +334 -163
- package/lib/server/types.js +4 -16
- package/lib/server/utils/index.js +25 -23
- package/lib/server/utils/product.js +196 -139
- package/lib/server/utils/schedule.js +34 -41
- package/lib/server/utils/small-ticket.js +479 -456
- package/lib/server/utils/time.js +40 -49
- package/lib/solution/BaseSales/index.js +1220 -1412
- package/lib/solution/BaseSales/types.js +42 -38
- package/lib/solution/BaseSales/utils/cartPromotion.d.ts +5 -0
- package/lib/solution/BaseSales/utils/cartPromotion.js +652 -498
- package/lib/solution/BaseSales/utils/parseSalesResponse.js +85 -105
- package/lib/solution/BaseSales/utils/quotationPrice.js +56 -114
- package/lib/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +108 -145
- package/lib/solution/BaseSales/utils.js +158 -143
- package/lib/solution/BookingByStep/index.js +1527 -1340
- package/lib/solution/BookingByStep/types.js +40 -99
- package/lib/solution/BookingByStep/utils/capacity.js +192 -160
- package/lib/solution/BookingByStep/utils/products.js +42 -52
- package/lib/solution/BookingByStep/utils/resources.js +527 -330
- package/lib/solution/BookingByStep/utils/stock.js +65 -44
- package/lib/solution/BookingByStep/utils/timeslots.js +129 -131
- package/lib/solution/BookingTicket/index.js +607 -522
- package/lib/solution/BookingTicket/types.js +99 -77
- package/lib/solution/BookingTicket/utils/addProductDecision.js +226 -189
- package/lib/solution/BookingTicket/utils/addTimeAvailability.js +58 -89
- package/lib/solution/BookingTicket/utils/bookingStatus.js +107 -78
- package/lib/solution/BookingTicket/utils/cartView.js +114 -99
- package/lib/solution/BookingTicket/utils/exampleData.js +185 -0
- package/lib/solution/BookingTicket/utils/orderCustomer.js +18 -41
- package/lib/solution/BookingTicket/utils/resolveBestAddTimePlan.js +219 -86
- package/lib/solution/BookingTicket/utils/scan/applyGlobalScan.js +168 -116
- package/lib/solution/BookingTicket/utils/scan/cloudSearch.js +79 -91
- package/lib/solution/BookingTicket/utils/scan/formatGlobalScan.js +54 -41
- package/lib/solution/BookingTicket/utils/scan/handleScan.js +84 -81
- package/lib/solution/BookingTicket/utils/scan/index.js +98 -104
- package/lib/solution/BookingTicket/utils/scan/scanCache.js +90 -43
- package/lib/solution/BookingTicket/utils/scan/scanProductValues.js +52 -64
- package/lib/solution/BookingTicket/utils/sessionCatalogStale.js +56 -58
- package/lib/solution/BookingTicket/utils/weighingProductSku.js +34 -48
- package/lib/solution/BuyTickets/index.js +67 -70
- package/lib/solution/BuyTickets/types.js +22 -38
- package/lib/solution/Checkout/index.js +1451 -1158
- package/lib/solution/Checkout/types.js +91 -61
- package/lib/solution/Checkout/utils/index.js +228 -156
- package/lib/solution/PlaceOrder/index.js +55 -0
- package/lib/solution/RegisterAndLogin/config.js +493 -460
- package/lib/solution/RegisterAndLogin/index.js +633 -630
- package/lib/solution/RegisterAndLogin/types.js +189 -76
- package/lib/solution/RegisterAndLogin/utils.js +183 -125
- package/lib/solution/Sales/index.js +328 -324
- package/lib/solution/Sales/types.js +27 -33
- package/lib/solution/ScanOrder/index.js +832 -864
- package/lib/solution/ScanOrder/types.js +33 -34
- package/lib/solution/ScanOrder/utils.js +409 -374
- package/lib/solution/ShopDiscount/index.js +226 -232
- package/lib/solution/ShopDiscount/types.js +15 -37
- package/lib/solution/ShopDiscount/utils.js +300 -172
- package/lib/solution/UnifiedBookingSales/index.js +1035 -1201
- package/lib/solution/UnifiedBookingSales/remoteOccupancyCache.js +99 -159
- package/lib/solution/UnifiedBookingSales/types.js +10 -32
- package/lib/solution/VenueBooking/index.js +811 -879
- package/lib/solution/VenueBooking/types.js +19 -39
- package/lib/solution/VenueBooking/utils/dateSummary.js +27 -56
- package/lib/solution/VenueBooking/utils/resource.js +31 -54
- package/lib/solution/VenueBooking/utils/slotMerge.js +94 -107
- package/lib/solution/VenueBooking/utils/timeSlot.js +132 -132
- package/lib/solution/VenueBooking/utils.js +130 -67
- package/lib/solution/index.js +124 -41
- package/lib/store/createStore.js +32 -29
- package/lib/types/index.js +4 -16
- package/lib/utils/payment-number.js +26 -46
- package/lib/utils/task.js +36 -36
- package/lib/utils/watch.js +81 -47
- package/package.json +2 -1
|
@@ -1,105 +1,126 @@
|
|
|
1
|
-
|
|
2
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
-
var __export = (target, all) => {
|
|
6
|
-
for (var name in all)
|
|
7
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
8
|
-
};
|
|
9
|
-
var __copyProps = (to, from, except, desc) => {
|
|
10
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
11
|
-
for (let key of __getOwnPropNames(from))
|
|
12
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
13
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
14
|
-
}
|
|
15
|
-
return to;
|
|
16
|
-
};
|
|
17
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
1
|
+
"use strict";
|
|
18
2
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
__export(utils_exports, {
|
|
22
|
-
debounce: () => debounce,
|
|
23
|
-
deepClone: () => deepClone,
|
|
24
|
-
formatEmailDisplay: () => formatEmailDisplay,
|
|
25
|
-
formatPhoneDisplay: () => formatPhoneDisplay,
|
|
26
|
-
formatTimestamp: () => formatTimestamp,
|
|
27
|
-
generateRandomString: () => generateRandomString,
|
|
28
|
-
getDeviceType: () => getDeviceType,
|
|
29
|
-
getOAuthProviderDisplayName: () => getOAuthProviderDisplayName,
|
|
30
|
-
getOAuthProviderIconUrl: () => getOAuthProviderIconUrl,
|
|
31
|
-
getTimeDifference: () => getTimeDifference,
|
|
32
|
-
isAndroidDevice: () => isAndroidDevice,
|
|
33
|
-
isIOSDevice: () => isIOSDevice,
|
|
34
|
-
isMobileDevice: () => isMobileDevice,
|
|
35
|
-
isTimestampExpired: () => isTimestampExpired,
|
|
36
|
-
isWebAuthnSupported: () => isWebAuthnSupported,
|
|
37
|
-
safeJsonParse: () => safeJsonParse,
|
|
38
|
-
safeJsonStringify: () => safeJsonStringify,
|
|
39
|
-
throttle: () => throttle,
|
|
40
|
-
validateEmail: () => validateEmail,
|
|
41
|
-
validatePassword: () => validatePassword,
|
|
42
|
-
validatePhone: () => validatePhone,
|
|
43
|
-
validateVerificationCode: () => validateVerificationCode
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
44
5
|
});
|
|
45
|
-
|
|
46
|
-
|
|
6
|
+
exports.debounce = debounce;
|
|
7
|
+
exports.deepClone = deepClone;
|
|
8
|
+
exports.formatEmailDisplay = formatEmailDisplay;
|
|
9
|
+
exports.formatPhoneDisplay = formatPhoneDisplay;
|
|
10
|
+
exports.formatTimestamp = formatTimestamp;
|
|
11
|
+
exports.generateRandomString = generateRandomString;
|
|
12
|
+
exports.getDeviceType = getDeviceType;
|
|
13
|
+
exports.getOAuthProviderDisplayName = getOAuthProviderDisplayName;
|
|
14
|
+
exports.getOAuthProviderIconUrl = getOAuthProviderIconUrl;
|
|
15
|
+
exports.getTimeDifference = getTimeDifference;
|
|
16
|
+
exports.isAndroidDevice = isAndroidDevice;
|
|
17
|
+
exports.isIOSDevice = isIOSDevice;
|
|
18
|
+
exports.isMobileDevice = isMobileDevice;
|
|
19
|
+
exports.isTimestampExpired = isTimestampExpired;
|
|
20
|
+
exports.isWebAuthnSupported = isWebAuthnSupported;
|
|
21
|
+
exports.safeJsonParse = safeJsonParse;
|
|
22
|
+
exports.safeJsonStringify = safeJsonStringify;
|
|
23
|
+
exports.throttle = throttle;
|
|
24
|
+
exports.validateEmail = validateEmail;
|
|
25
|
+
exports.validatePassword = validatePassword;
|
|
26
|
+
exports.validatePhone = validatePhone;
|
|
27
|
+
exports.validateVerificationCode = validateVerificationCode;
|
|
28
|
+
var _types = require("./types");
|
|
29
|
+
/**
|
|
30
|
+
* 注册登录工具函数
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* 验证邮箱格式
|
|
35
|
+
*/
|
|
47
36
|
function validateEmail(email) {
|
|
48
37
|
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
49
38
|
return emailRegex.test(email);
|
|
50
39
|
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* 验证手机号格式(支持多种国际格式)
|
|
43
|
+
*/
|
|
51
44
|
function validatePhone(phone) {
|
|
52
|
-
|
|
45
|
+
// 移除所有非数字字符(除了 + 号)
|
|
46
|
+
const cleanPhone = phone.replace(/[^\d+]/g, '');
|
|
47
|
+
|
|
48
|
+
// 基本的手机号验证规则
|
|
53
49
|
const phoneRegex = /^(\+\d{1,3}[- ]?)?\d{10,14}$/;
|
|
54
50
|
return phoneRegex.test(cleanPhone);
|
|
55
51
|
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* 验证密码强度
|
|
55
|
+
*/
|
|
56
56
|
function validatePassword(password) {
|
|
57
57
|
const errors = [];
|
|
58
58
|
if (password.length < 8) {
|
|
59
|
-
errors.push(
|
|
59
|
+
errors.push('密码长度至少为8位');
|
|
60
60
|
}
|
|
61
61
|
if (password.length > 128) {
|
|
62
|
-
errors.push(
|
|
62
|
+
errors.push('密码长度不能超过128位');
|
|
63
63
|
}
|
|
64
64
|
if (!/[a-z]/.test(password)) {
|
|
65
|
-
errors.push(
|
|
65
|
+
errors.push('密码必须包含至少一个小写字母');
|
|
66
66
|
}
|
|
67
67
|
if (!/[A-Z]/.test(password)) {
|
|
68
|
-
errors.push(
|
|
68
|
+
errors.push('密码必须包含至少一个大写字母');
|
|
69
69
|
}
|
|
70
70
|
if (!/\d/.test(password)) {
|
|
71
|
-
errors.push(
|
|
71
|
+
errors.push('密码必须包含至少一个数字');
|
|
72
72
|
}
|
|
73
73
|
if (!/[!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?]/.test(password)) {
|
|
74
|
-
errors.push(
|
|
74
|
+
errors.push('密码必须包含至少一个特殊字符');
|
|
75
75
|
}
|
|
76
76
|
return {
|
|
77
77
|
isValid: errors.length === 0,
|
|
78
78
|
errors
|
|
79
79
|
};
|
|
80
80
|
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* 验证验证码格式
|
|
84
|
+
*/
|
|
81
85
|
function validateVerificationCode(code, type) {
|
|
82
|
-
|
|
86
|
+
// 移除所有空格
|
|
87
|
+
const cleanCode = code.replace(/\s/g, '');
|
|
83
88
|
switch (type) {
|
|
84
|
-
case
|
|
85
|
-
case
|
|
89
|
+
case _types.VerificationCodeType.EMAIL:
|
|
90
|
+
case _types.VerificationCodeType.SMS:
|
|
91
|
+
// 通常是4-8位数字
|
|
86
92
|
return /^\d{4,8}$/.test(cleanCode);
|
|
87
93
|
default:
|
|
88
94
|
return false;
|
|
89
95
|
}
|
|
90
96
|
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* 格式化手机号显示
|
|
100
|
+
*/
|
|
91
101
|
function formatPhoneDisplay(phone) {
|
|
92
|
-
|
|
102
|
+
// 移除所有非数字字符(除了 + 号)
|
|
103
|
+
const cleanPhone = phone.replace(/[^\d+]/g, '');
|
|
104
|
+
|
|
105
|
+
// 如果是中国手机号(11位数字)
|
|
93
106
|
if (/^\d{11}$/.test(cleanPhone)) {
|
|
94
|
-
return cleanPhone.replace(/(\d{3})(\d{4})(\d{4})/,
|
|
107
|
+
return cleanPhone.replace(/(\d{3})(\d{4})(\d{4})/, '$1 $2 $3');
|
|
95
108
|
}
|
|
96
|
-
|
|
109
|
+
|
|
110
|
+
// 如果是国际号码(以 + 开头)
|
|
111
|
+
if (cleanPhone.startsWith('+')) {
|
|
97
112
|
return cleanPhone;
|
|
98
113
|
}
|
|
114
|
+
|
|
115
|
+
// 其他格式保持原样
|
|
99
116
|
return phone;
|
|
100
117
|
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* 格式化邮箱显示(隐藏部分字符)
|
|
121
|
+
*/
|
|
101
122
|
function formatEmailDisplay(email, maskLength = 3) {
|
|
102
|
-
const [localPart, domain] = email.split(
|
|
123
|
+
const [localPart, domain] = email.split('@');
|
|
103
124
|
if (!localPart || !domain) {
|
|
104
125
|
return email;
|
|
105
126
|
}
|
|
@@ -108,76 +129,110 @@ function formatEmailDisplay(email, maskLength = 3) {
|
|
|
108
129
|
}
|
|
109
130
|
const visibleStart = localPart.substring(0, maskLength);
|
|
110
131
|
const visibleEnd = localPart.substring(localPart.length - maskLength);
|
|
111
|
-
const maskedPart =
|
|
132
|
+
const maskedPart = '*'.repeat(localPart.length - maskLength * 2);
|
|
112
133
|
return `${visibleStart}${maskedPart}${visibleEnd}@${domain}`;
|
|
113
134
|
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* 生成随机字符串(用于状态参数等)
|
|
138
|
+
*/
|
|
114
139
|
function generateRandomString(length = 32) {
|
|
115
|
-
const chars =
|
|
116
|
-
let result =
|
|
140
|
+
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
|
|
141
|
+
let result = '';
|
|
117
142
|
for (let i = 0; i < length; i++) {
|
|
118
143
|
result += chars.charAt(Math.floor(Math.random() * chars.length));
|
|
119
144
|
}
|
|
120
145
|
return result;
|
|
121
146
|
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* 获取 OAuth 提供商的显示名称
|
|
150
|
+
*/
|
|
122
151
|
function getOAuthProviderDisplayName(provider) {
|
|
123
152
|
const displayNames = {
|
|
124
|
-
[
|
|
125
|
-
[
|
|
126
|
-
[
|
|
127
|
-
[
|
|
128
|
-
[
|
|
153
|
+
[_types.OAuthProvider.FACEBOOK]: 'Facebook',
|
|
154
|
+
[_types.OAuthProvider.APPLE]: 'Apple',
|
|
155
|
+
[_types.OAuthProvider.GOOGLE]: 'Google',
|
|
156
|
+
[_types.OAuthProvider.WECHAT]: '微信',
|
|
157
|
+
[_types.OAuthProvider.GITHUB]: 'GitHub'
|
|
129
158
|
};
|
|
130
159
|
return displayNames[provider] || provider;
|
|
131
160
|
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* 获取 OAuth 提供商的图标 URL
|
|
164
|
+
*/
|
|
132
165
|
function getOAuthProviderIconUrl(provider) {
|
|
133
166
|
const iconUrls = {
|
|
134
|
-
[
|
|
135
|
-
[
|
|
136
|
-
[
|
|
137
|
-
[
|
|
138
|
-
[
|
|
167
|
+
[_types.OAuthProvider.FACEBOOK]: 'https://cdn.jsdelivr.net/npm/simple-icons@v9/icons/facebook.svg',
|
|
168
|
+
[_types.OAuthProvider.APPLE]: 'https://cdn.jsdelivr.net/npm/simple-icons@v9/icons/apple.svg',
|
|
169
|
+
[_types.OAuthProvider.GOOGLE]: 'https://cdn.jsdelivr.net/npm/simple-icons@v9/icons/google.svg',
|
|
170
|
+
[_types.OAuthProvider.WECHAT]: 'https://cdn.jsdelivr.net/npm/simple-icons@v9/icons/wechat.svg',
|
|
171
|
+
[_types.OAuthProvider.GITHUB]: 'https://cdn.jsdelivr.net/npm/simple-icons@v9/icons/github.svg'
|
|
139
172
|
};
|
|
140
|
-
return iconUrls[provider] ||
|
|
173
|
+
return iconUrls[provider] || '';
|
|
141
174
|
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* 检查是否在移动设备上
|
|
178
|
+
*/
|
|
142
179
|
function isMobileDevice() {
|
|
143
|
-
if (typeof window ===
|
|
180
|
+
if (typeof window === 'undefined') {
|
|
144
181
|
return false;
|
|
145
182
|
}
|
|
146
|
-
return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(
|
|
147
|
-
navigator.userAgent
|
|
148
|
-
);
|
|
183
|
+
return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
|
|
149
184
|
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* 检查是否支持 WebAuthn
|
|
188
|
+
*/
|
|
150
189
|
function isWebAuthnSupported() {
|
|
151
|
-
if (typeof window ===
|
|
190
|
+
if (typeof window === 'undefined') {
|
|
152
191
|
return false;
|
|
153
192
|
}
|
|
154
193
|
return !!(navigator.credentials && navigator.credentials.create);
|
|
155
194
|
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* 检查是否在 iOS 设备上
|
|
198
|
+
*/
|
|
156
199
|
function isIOSDevice() {
|
|
157
|
-
if (typeof window ===
|
|
200
|
+
if (typeof window === 'undefined') {
|
|
158
201
|
return false;
|
|
159
202
|
}
|
|
160
203
|
return /iPad|iPhone|iPod/.test(navigator.userAgent);
|
|
161
204
|
}
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* 检查是否在 Android 设备上
|
|
208
|
+
*/
|
|
162
209
|
function isAndroidDevice() {
|
|
163
|
-
if (typeof window ===
|
|
210
|
+
if (typeof window === 'undefined') {
|
|
164
211
|
return false;
|
|
165
212
|
}
|
|
166
213
|
return /Android/.test(navigator.userAgent);
|
|
167
214
|
}
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* 获取设备类型
|
|
218
|
+
*/
|
|
168
219
|
function getDeviceType() {
|
|
169
|
-
if (typeof window ===
|
|
170
|
-
return
|
|
220
|
+
if (typeof window === 'undefined') {
|
|
221
|
+
return 'desktop';
|
|
171
222
|
}
|
|
172
223
|
const userAgent = navigator.userAgent;
|
|
173
224
|
if (/iPad/.test(userAgent)) {
|
|
174
|
-
return
|
|
225
|
+
return 'tablet';
|
|
175
226
|
}
|
|
176
227
|
if (/Android|webOS|iPhone|iPod|BlackBerry|IEMobile|Opera Mini/i.test(userAgent)) {
|
|
177
|
-
return
|
|
228
|
+
return 'mobile';
|
|
178
229
|
}
|
|
179
|
-
return
|
|
230
|
+
return 'desktop';
|
|
180
231
|
}
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* 防抖函数
|
|
235
|
+
*/
|
|
181
236
|
function debounce(func, wait) {
|
|
182
237
|
let timeout = null;
|
|
183
238
|
return (...args) => {
|
|
@@ -189,6 +244,10 @@ function debounce(func, wait) {
|
|
|
189
244
|
}, wait);
|
|
190
245
|
};
|
|
191
246
|
}
|
|
247
|
+
|
|
248
|
+
/**
|
|
249
|
+
* 节流函数
|
|
250
|
+
*/
|
|
192
251
|
function throttle(func, wait) {
|
|
193
252
|
let lastTime = 0;
|
|
194
253
|
return (...args) => {
|
|
@@ -199,17 +258,21 @@ function throttle(func, wait) {
|
|
|
199
258
|
}
|
|
200
259
|
};
|
|
201
260
|
}
|
|
261
|
+
|
|
262
|
+
/**
|
|
263
|
+
* 深拷贝对象
|
|
264
|
+
*/
|
|
202
265
|
function deepClone(obj) {
|
|
203
|
-
if (obj === null || typeof obj !==
|
|
266
|
+
if (obj === null || typeof obj !== 'object') {
|
|
204
267
|
return obj;
|
|
205
268
|
}
|
|
206
269
|
if (obj instanceof Date) {
|
|
207
270
|
return new Date(obj.getTime());
|
|
208
271
|
}
|
|
209
272
|
if (obj instanceof Array) {
|
|
210
|
-
return obj.map(
|
|
273
|
+
return obj.map(item => deepClone(item));
|
|
211
274
|
}
|
|
212
|
-
if (typeof obj ===
|
|
275
|
+
if (typeof obj === 'object') {
|
|
213
276
|
const cloned = {};
|
|
214
277
|
for (const key in obj) {
|
|
215
278
|
if (obj.hasOwnProperty(key)) {
|
|
@@ -220,60 +283,55 @@ function deepClone(obj) {
|
|
|
220
283
|
}
|
|
221
284
|
return obj;
|
|
222
285
|
}
|
|
286
|
+
|
|
287
|
+
/**
|
|
288
|
+
* 安全的 JSON 解析
|
|
289
|
+
*/
|
|
223
290
|
function safeJsonParse(jsonString, defaultValue) {
|
|
224
291
|
try {
|
|
225
292
|
return JSON.parse(jsonString);
|
|
226
293
|
} catch (error) {
|
|
227
|
-
console.warn(
|
|
294
|
+
console.warn('JSON 解析失败:', error);
|
|
228
295
|
return defaultValue;
|
|
229
296
|
}
|
|
230
297
|
}
|
|
231
|
-
|
|
298
|
+
|
|
299
|
+
/**
|
|
300
|
+
* 安全的 JSON 字符串化
|
|
301
|
+
*/
|
|
302
|
+
function safeJsonStringify(obj, defaultValue = '{}') {
|
|
232
303
|
try {
|
|
233
304
|
return JSON.stringify(obj);
|
|
234
305
|
} catch (error) {
|
|
235
|
-
console.warn(
|
|
306
|
+
console.warn('JSON 字符串化失败:', error);
|
|
236
307
|
return defaultValue;
|
|
237
308
|
}
|
|
238
309
|
}
|
|
239
|
-
|
|
310
|
+
|
|
311
|
+
/**
|
|
312
|
+
* 格式化时间戳为可读时间
|
|
313
|
+
*/
|
|
314
|
+
function formatTimestamp(timestamp, format = 'YYYY-MM-DD HH:mm:ss') {
|
|
240
315
|
const date = new Date(timestamp);
|
|
241
316
|
const year = date.getFullYear();
|
|
242
|
-
const month = String(date.getMonth() + 1).padStart(2,
|
|
243
|
-
const day = String(date.getDate()).padStart(2,
|
|
244
|
-
const hours = String(date.getHours()).padStart(2,
|
|
245
|
-
const minutes = String(date.getMinutes()).padStart(2,
|
|
246
|
-
const seconds = String(date.getSeconds()).padStart(2,
|
|
247
|
-
return format.replace(
|
|
317
|
+
const month = String(date.getMonth() + 1).padStart(2, '0');
|
|
318
|
+
const day = String(date.getDate()).padStart(2, '0');
|
|
319
|
+
const hours = String(date.getHours()).padStart(2, '0');
|
|
320
|
+
const minutes = String(date.getMinutes()).padStart(2, '0');
|
|
321
|
+
const seconds = String(date.getSeconds()).padStart(2, '0');
|
|
322
|
+
return format.replace('YYYY', year.toString()).replace('MM', month).replace('DD', day).replace('HH', hours).replace('mm', minutes).replace('ss', seconds);
|
|
248
323
|
}
|
|
324
|
+
|
|
325
|
+
/**
|
|
326
|
+
* 计算两个时间戳之间的差值(秒)
|
|
327
|
+
*/
|
|
249
328
|
function getTimeDifference(timestamp1, timestamp2) {
|
|
250
|
-
return Math.abs(timestamp1 - timestamp2) /
|
|
329
|
+
return Math.abs(timestamp1 - timestamp2) / 1000;
|
|
251
330
|
}
|
|
252
|
-
|
|
331
|
+
|
|
332
|
+
/**
|
|
333
|
+
* 检查时间戳是否过期
|
|
334
|
+
*/
|
|
335
|
+
function isTimestampExpired(timestamp, expirationTime = 5 * 60 * 1000) {
|
|
253
336
|
return Date.now() - timestamp > expirationTime;
|
|
254
|
-
}
|
|
255
|
-
// Annotate the CommonJS export names for ESM import in node:
|
|
256
|
-
0 && (module.exports = {
|
|
257
|
-
debounce,
|
|
258
|
-
deepClone,
|
|
259
|
-
formatEmailDisplay,
|
|
260
|
-
formatPhoneDisplay,
|
|
261
|
-
formatTimestamp,
|
|
262
|
-
generateRandomString,
|
|
263
|
-
getDeviceType,
|
|
264
|
-
getOAuthProviderDisplayName,
|
|
265
|
-
getOAuthProviderIconUrl,
|
|
266
|
-
getTimeDifference,
|
|
267
|
-
isAndroidDevice,
|
|
268
|
-
isIOSDevice,
|
|
269
|
-
isMobileDevice,
|
|
270
|
-
isTimestampExpired,
|
|
271
|
-
isWebAuthnSupported,
|
|
272
|
-
safeJsonParse,
|
|
273
|
-
safeJsonStringify,
|
|
274
|
-
throttle,
|
|
275
|
-
validateEmail,
|
|
276
|
-
validatePassword,
|
|
277
|
-
validatePhone,
|
|
278
|
-
validateVerificationCode
|
|
279
|
-
});
|
|
337
|
+
}
|