@gt6/sdk 1.0.9 → 1.0.11

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/README.md CHANGED
@@ -1264,7 +1264,7 @@ if (financeProduct.simpleFinance) {
1264
1264
  }
1265
1265
  ```
1266
1266
 
1267
- ## 支付方式模块
1267
+ ## 支付方式模块 (Payment Methods)
1268
1268
 
1269
1269
  SDK提供了支付方式管理功能,支持获取各种类型的支付方式。
1270
1270
 
@@ -1442,4 +1442,390 @@ interface FormSubmitOptions {
1442
1442
  }
1443
1443
  ```
1444
1444
 
1445
- ## 支付方式模块 (Payment Methods)
1445
+ ## 支付方式模块 (Payment Methods)
1446
+
1447
+ ## 用户认证模块 (Users)
1448
+
1449
+ 用户认证模块提供了完整的用户登录、注册和会话管理功能。
1450
+
1451
+ ### API 方法
1452
+
1453
+ #### `login(username, password, platformId)`
1454
+ 用户登录
1455
+
1456
+ **参数:**
1457
+ - `username` (string): 用户名
1458
+ - `password` (string): 密码
1459
+ - `platformId` (number): 平台ID
1460
+
1461
+ **返回:** `Promise<LoginResponse>`
1462
+
1463
+ #### `register(username, password, platformId, ibcode?)`
1464
+ 用户注册
1465
+
1466
+ **参数:**
1467
+ - `username` (string): 用户名
1468
+ - `password` (string): 密码
1469
+ - `platformId` (number): 平台ID
1470
+ - `ibcode` (string, 可选): 邀请码
1471
+
1472
+ **返回:** `Promise<RegisterResponse>`
1473
+
1474
+ #### `isLoggedIn()`
1475
+ 检查用户是否已登录
1476
+
1477
+ **返回:** `boolean`
1478
+
1479
+ #### `getCurrentUser()`
1480
+ 获取当前登录用户信息
1481
+
1482
+ **返回:** `UserInfo | null`
1483
+
1484
+ #### `getToken()`
1485
+ 获取当前登录用户的token
1486
+
1487
+ **返回:** `string | null`
1488
+
1489
+ #### `logout()`
1490
+ 用户登出
1491
+
1492
+ #### `saveUserData(userData)`
1493
+ 保存用户数据到本地存储
1494
+
1495
+ **参数:**
1496
+ - `userData` (UserData): 用户数据对象
1497
+
1498
+ #### `getUserData()`
1499
+ 从本地存储获取用户数据
1500
+
1501
+ **返回:** `UserData | null`
1502
+
1503
+ #### `rememberLogin(username, password)`
1504
+ 记住用户登录信息
1505
+
1506
+ **参数:**
1507
+ - `username` (string): 用户名
1508
+ - `password` (string): 密码
1509
+
1510
+ #### `getRememberedLogin()`
1511
+ 获取记住的登录信息
1512
+
1513
+ **返回:** `{ username: string; password: string } | null`
1514
+
1515
+ #### `clearRememberedLogin()`
1516
+ 清除记住的登录信息
1517
+
1518
+ ### 使用示例
1519
+
1520
+ ```javascript
1521
+ // 用户登录
1522
+ const loginResult = await sdk.login('username', 'password', 1);
1523
+ if (loginResult.success && loginResult.token && loginResult.user) {
1524
+ // 保存用户数据到本地存储
1525
+ const userData = {
1526
+ ...loginResult.user,
1527
+ token: loginResult.token
1528
+ };
1529
+ sdk.saveUserData(userData);
1530
+ console.log('登录成功:', loginResult.user);
1531
+ } else {
1532
+ console.error('登录失败:', loginResult.message);
1533
+ }
1534
+
1535
+ // 用户注册
1536
+ const registerResult = await sdk.register('newuser', 'password123', 1, 'INVITE123');
1537
+ if (registerResult.success) {
1538
+ console.log('注册成功,用户ID:', registerResult.userId);
1539
+ } else {
1540
+ console.error('注册失败:', registerResult.message);
1541
+ }
1542
+
1543
+ // 检查登录状态
1544
+ if (sdk.isLoggedIn()) {
1545
+ const user = sdk.getCurrentUser();
1546
+ const token = sdk.getToken();
1547
+ console.log('用户已登录:', user);
1548
+ console.log('Token:', token);
1549
+ } else {
1550
+ console.log('用户未登录');
1551
+ }
1552
+
1553
+ // 记住登录信息
1554
+ sdk.rememberLogin('username', 'password');
1555
+
1556
+ // 获取记住的登录信息
1557
+ const remembered = sdk.getRememberedLogin();
1558
+ if (remembered) {
1559
+ console.log('记住的登录信息:', remembered);
1560
+ }
1561
+
1562
+ // 用户登出
1563
+ sdk.logout();
1564
+ ```
1565
+
1566
+ ### 完整的登录流程示例
1567
+
1568
+ ```javascript
1569
+ async function completeLoginFlow() {
1570
+ // 检查是否已登录
1571
+ if (sdk.isLoggedIn()) {
1572
+ console.log('用户已登录,无需重新登录');
1573
+ return true;
1574
+ }
1575
+
1576
+ // 尝试使用记住的登录信息
1577
+ const remembered = sdk.getRememberedLogin();
1578
+ if (remembered) {
1579
+ console.log('使用记住的登录信息');
1580
+ const result = await sdk.login(remembered.username, remembered.password, 1);
1581
+ if (result.success) {
1582
+ console.log('使用记住的信息登录成功');
1583
+ return true;
1584
+ }
1585
+ }
1586
+
1587
+ // 手动登录
1588
+ console.log('需要手动登录');
1589
+ return false;
1590
+ }
1591
+ ```
1592
+
1593
+ ### 表单验证示例
1594
+
1595
+ ```javascript
1596
+ // 登录验证
1597
+ async function loginWithValidation(username, password, platformId) {
1598
+ // 基本验证
1599
+ if (!username || !password) {
1600
+ console.error('用户名和密码不能为空');
1601
+ return false;
1602
+ }
1603
+
1604
+ if (password.length < 6) {
1605
+ console.error('密码长度不能少于6位');
1606
+ return false;
1607
+ }
1608
+
1609
+ // 执行登录
1610
+ const result = await sdk.login(username, password, platformId);
1611
+
1612
+ if (result.success && result.token && result.user) {
1613
+ // 保存用户数据
1614
+ const userData = {
1615
+ ...result.user,
1616
+ token: result.token
1617
+ };
1618
+ sdk.saveUserData(userData);
1619
+
1620
+ console.log('登录成功');
1621
+ return true;
1622
+ } else {
1623
+ console.error('登录失败:', result.message);
1624
+ return false;
1625
+ }
1626
+ }
1627
+
1628
+ // 注册验证
1629
+ async function registerWithValidation(username, password, confirmPassword, platformId, ibcode) {
1630
+ // 基本验证
1631
+ if (!username || !password || !confirmPassword) {
1632
+ console.error('用户名、密码和确认密码不能为空');
1633
+ return false;
1634
+ }
1635
+
1636
+ if (password !== confirmPassword) {
1637
+ console.error('两次输入的密码不一致');
1638
+ return false;
1639
+ }
1640
+
1641
+ if (password.length < 6) {
1642
+ console.error('密码长度不能少于6位');
1643
+ return false;
1644
+ }
1645
+
1646
+ if (username.length < 3) {
1647
+ console.error('用户名长度不能少于3位');
1648
+ return false;
1649
+ }
1650
+
1651
+ // 执行注册
1652
+ const result = await sdk.register(username, password, platformId, ibcode);
1653
+
1654
+ if (result.success) {
1655
+ console.log('注册成功,用户ID:', result.userId);
1656
+ return true;
1657
+ } else {
1658
+ console.error('注册失败:', result.message);
1659
+ return false;
1660
+ }
1661
+ }
1662
+ ```
1663
+
1664
+ ### 类型定义
1665
+
1666
+ ```typescript
1667
+ interface LoginRequest {
1668
+ username: string;
1669
+ password: string;
1670
+ platformId: number;
1671
+ }
1672
+
1673
+ interface LoginResponse {
1674
+ success: boolean;
1675
+ message?: string;
1676
+ token?: string;
1677
+ user?: {
1678
+ userId: number;
1679
+ username: string;
1680
+ userLevel: number;
1681
+ status: boolean;
1682
+ platformId: number;
1683
+ d1: number;
1684
+ d2: number;
1685
+ d3: number;
1686
+ };
1687
+ }
1688
+
1689
+ interface RegisterRequest {
1690
+ username: string;
1691
+ password: string;
1692
+ platformId: number;
1693
+ ibcode?: string;
1694
+ }
1695
+
1696
+ interface RegisterResponse {
1697
+ success: boolean;
1698
+ message?: string;
1699
+ userId?: number;
1700
+ }
1701
+
1702
+ interface UserData {
1703
+ userId: number;
1704
+ username: string;
1705
+ userLevel: number;
1706
+ status: boolean;
1707
+ platformId: number;
1708
+ d1: number;
1709
+ d2: number;
1710
+ d3: number;
1711
+ token: string;
1712
+ }
1713
+ ```
1714
+
1715
+ ### 在Astro项目中使用
1716
+
1717
+ ```astro
1718
+ ---
1719
+ // Layout.astro
1720
+ import { GT6SDK } from '@gt6/sdk';
1721
+
1722
+ const sdk = new GT6SDK({
1723
+ baseUrl: 'https://data.shopasb.io',
1724
+ platformId: '1747558688'
1725
+ });
1726
+
1727
+ // 检查用户登录状态
1728
+ const isLoggedIn = sdk.isLoggedIn();
1729
+ const currentUser = sdk.getCurrentUser();
1730
+ ---
1731
+
1732
+ <html>
1733
+ <head>
1734
+ <title>GT6TRADE</title>
1735
+ </head>
1736
+ <body>
1737
+ <header>
1738
+ {isLoggedIn ? (
1739
+ <div>
1740
+ <span>欢迎, {currentUser?.username}</span>
1741
+ <button onclick="logout()">登出</button>
1742
+ </div>
1743
+ ) : (
1744
+ <div>
1745
+ <button onclick="showLoginModal()">登录</button>
1746
+ <button onclick="showRegisterModal()">注册</button>
1747
+ </div>
1748
+ )}
1749
+ </header>
1750
+
1751
+ <slot />
1752
+
1753
+ <script>
1754
+ // 全局SDK实例
1755
+ window.gt6SDK = new GT6SDK({
1756
+ baseUrl: 'https://data.shopasb.io',
1757
+ platformId: 1747558688
1758
+ });
1759
+
1760
+ // 登出函数
1761
+ function logout() {
1762
+ window.gt6SDK.logout();
1763
+ window.location.reload();
1764
+ }
1765
+
1766
+ // 显示登录模态框
1767
+ function showLoginModal() {
1768
+ // 实现登录模态框显示逻辑
1769
+ }
1770
+
1771
+ // 显示注册模态框
1772
+ function showRegisterModal() {
1773
+ // 实现注册模态框显示逻辑
1774
+ }
1775
+ </script>
1776
+ </body>
1777
+ </html>
1778
+ ```
1779
+
1780
+ ### 错误处理
1781
+
1782
+ 用户认证方法返回统一的响应格式:
1783
+
1784
+ ```typescript
1785
+ // 登录成功响应
1786
+ {
1787
+ success: true,
1788
+ token: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
1789
+ user: {
1790
+ userId: 123,
1791
+ username: "testuser",
1792
+ userLevel: 1,
1793
+ status: true,
1794
+ platformId: 1,
1795
+ d1: 0,
1796
+ d2: 0,
1797
+ d3: 0
1798
+ }
1799
+ }
1800
+
1801
+ // 登录失败响应
1802
+ {
1803
+ success: false,
1804
+ message: "用户名或密码错误"
1805
+ }
1806
+
1807
+ // 注册成功响应
1808
+ {
1809
+ success: true,
1810
+ userId: 123,
1811
+ message: "注册成功"
1812
+ }
1813
+
1814
+ // 注册失败响应
1815
+ {
1816
+ success: false,
1817
+ message: "用户名已存在"
1818
+ }
1819
+ ```
1820
+
1821
+ ### 安全注意事项
1822
+
1823
+ 1. **密码安全**: 确保密码在传输前进行适当的加密
1824
+ 2. **Token管理**: 妥善保存和管理用户token,避免泄露
1825
+ 3. **会话管理**: 定期检查token有效性,及时清理过期会话
1826
+ 4. **本地存储**: 敏感信息存储时考虑使用更安全的存储方式
1827
+ 5. **输入验证**: 在客户端和服务端都进行充分的输入验证
1828
+
1829
+ ## 许可证
1830
+
1831
+ MIT License
@@ -833,9 +833,201 @@ class FormsAPI {
833
833
  }
834
834
  }
835
835
 
836
+ /**
837
+ * 用户管理API模块
838
+ * 提供用户登录、注册等功能
839
+ */
840
+ class UsersAPI {
841
+ constructor(client) {
842
+ this.client = client;
843
+ }
844
+ /**
845
+ * 用户登录
846
+ * @param loginData 登录数据
847
+ * @returns 登录响应
848
+ */
849
+ async login(loginData) {
850
+ try {
851
+ const response = await this.client.request('/web/user/login', {
852
+ method: 'POST',
853
+ headers: {
854
+ 'Content-Type': 'application/json',
855
+ },
856
+ body: JSON.stringify(loginData)
857
+ });
858
+ return response;
859
+ }
860
+ catch (error) {
861
+ // 如果是HTTP错误,尝试解析响应体
862
+ if (error.statusCode && error.message) {
863
+ // 对于401错误,返回特定的错误信息
864
+ if (error.statusCode === 401) {
865
+ return {
866
+ success: false,
867
+ message: '用户名或密码错误'
868
+ };
869
+ }
870
+ // 对于其他HTTP错误,返回状态码信息
871
+ return {
872
+ success: false,
873
+ message: error.message || `HTTP ${error.statusCode} 错误`
874
+ };
875
+ }
876
+ // 对于网络错误或其他错误
877
+ return {
878
+ success: false,
879
+ message: error instanceof Error ? error.message : '登录请求失败'
880
+ };
881
+ }
882
+ }
883
+ /**
884
+ * 用户注册
885
+ * @param registerData 注册数据
886
+ * @returns 注册响应
887
+ */
888
+ async register(registerData) {
889
+ try {
890
+ const response = await this.client.request('/web/user/register', {
891
+ method: 'POST',
892
+ headers: {
893
+ 'Content-Type': 'application/json',
894
+ },
895
+ body: JSON.stringify(registerData)
896
+ });
897
+ return response;
898
+ }
899
+ catch (error) {
900
+ // 如果是HTTP错误,尝试解析响应体
901
+ if (error.statusCode && error.message) {
902
+ // 对于400错误,可能是用户名已存在等验证错误
903
+ if (error.statusCode === 400) {
904
+ return {
905
+ success: false,
906
+ message: '注册信息有误,请检查输入'
907
+ };
908
+ }
909
+ // 对于其他HTTP错误,返回状态码信息
910
+ return {
911
+ success: false,
912
+ message: error.message || `HTTP ${error.statusCode} 错误`
913
+ };
914
+ }
915
+ // 对于网络错误或其他错误
916
+ return {
917
+ success: false,
918
+ message: error instanceof Error ? error.message : '注册请求失败'
919
+ };
920
+ }
921
+ }
922
+ /**
923
+ * 保存用户数据到本地存储
924
+ * @param userData 用户数据
925
+ */
926
+ saveUserData(userData) {
927
+ if (typeof window !== 'undefined' && window.localStorage) {
928
+ localStorage.setItem('userData', JSON.stringify(userData));
929
+ }
930
+ }
931
+ /**
932
+ * 从本地存储获取用户数据
933
+ * @returns 用户数据或null
934
+ */
935
+ getUserData() {
936
+ if (typeof window !== 'undefined' && window.localStorage) {
937
+ const userDataStr = localStorage.getItem('userData');
938
+ if (userDataStr) {
939
+ try {
940
+ return JSON.parse(userDataStr);
941
+ }
942
+ catch (error) {
943
+ console.warn('解析用户数据失败:', error);
944
+ return null;
945
+ }
946
+ }
947
+ }
948
+ return null;
949
+ }
950
+ /**
951
+ * 清除本地存储的用户数据
952
+ */
953
+ clearUserData() {
954
+ if (typeof window !== 'undefined' && window.localStorage) {
955
+ localStorage.removeItem('userData');
956
+ }
957
+ }
958
+ /**
959
+ * 检查用户是否已登录
960
+ * @returns 是否已登录
961
+ */
962
+ isLoggedIn() {
963
+ const userData = this.getUserData();
964
+ return userData !== null && userData.token !== undefined;
965
+ }
966
+ /**
967
+ * 获取当前登录用户的token
968
+ * @returns token或null
969
+ */
970
+ getToken() {
971
+ const userData = this.getUserData();
972
+ return userData?.token || null;
973
+ }
974
+ /**
975
+ * 获取当前登录用户信息
976
+ * @returns 用户信息或null
977
+ */
978
+ getCurrentUser() {
979
+ const userData = this.getUserData();
980
+ if (userData) {
981
+ const { token, ...userInfo } = userData;
982
+ return userInfo;
983
+ }
984
+ return null;
985
+ }
986
+ /**
987
+ * 用户登出
988
+ */
989
+ logout() {
990
+ this.clearUserData();
991
+ }
992
+ /**
993
+ * 记住用户登录信息
994
+ * @param username 用户名
995
+ * @param password 密码
996
+ */
997
+ rememberLogin(username, password) {
998
+ if (typeof window !== 'undefined' && window.localStorage) {
999
+ localStorage.setItem('rememberedUsername', username);
1000
+ localStorage.setItem('rememberedPassword', password);
1001
+ }
1002
+ }
1003
+ /**
1004
+ * 获取记住的登录信息
1005
+ * @returns 记住的登录信息
1006
+ */
1007
+ getRememberedLogin() {
1008
+ if (typeof window !== 'undefined' && window.localStorage) {
1009
+ const username = localStorage.getItem('rememberedUsername');
1010
+ const password = localStorage.getItem('rememberedPassword');
1011
+ if (username && password) {
1012
+ return { username, password };
1013
+ }
1014
+ }
1015
+ return null;
1016
+ }
1017
+ /**
1018
+ * 清除记住的登录信息
1019
+ */
1020
+ clearRememberedLogin() {
1021
+ if (typeof window !== 'undefined' && window.localStorage) {
1022
+ localStorage.removeItem('rememberedUsername');
1023
+ localStorage.removeItem('rememberedPassword');
1024
+ }
1025
+ }
1026
+ }
1027
+
836
1028
  /**
837
1029
  * GT6 SDK 主类
838
- * 提供文章、产品和设置管理相关的所有功能
1030
+ * 提供文章、产品、设置、表单和用户管理相关的所有功能
839
1031
  */
840
1032
  class GT6SDK {
841
1033
  constructor(config) {
@@ -844,6 +1036,7 @@ class GT6SDK {
844
1036
  this.products = new ProductsAPI(client);
845
1037
  this.settings = new SettingsAPI(client);
846
1038
  this.forms = new FormsAPI(client);
1039
+ this.users = new UsersAPI(client);
847
1040
  }
848
1041
  /**
849
1042
  * 获取客户端实例(用于高级用法)
@@ -1025,6 +1218,72 @@ class GT6SDK {
1025
1218
  async submitCustomForm(aliases, formData, emailField) {
1026
1219
  return this.forms.submitCustomForm(aliases, formData, emailField);
1027
1220
  }
1221
+ /**
1222
+ * 28. 便捷方法:用户登录
1223
+ */
1224
+ async login(username, password, platformId) {
1225
+ return this.users.login({ username, password, platformId });
1226
+ }
1227
+ /**
1228
+ * 29. 便捷方法:用户注册
1229
+ */
1230
+ async register(username, password, platformId, ibcode) {
1231
+ return this.users.register({ username, password, platformId, ibcode });
1232
+ }
1233
+ /**
1234
+ * 30. 便捷方法:检查用户是否已登录
1235
+ */
1236
+ isLoggedIn() {
1237
+ return this.users.isLoggedIn();
1238
+ }
1239
+ /**
1240
+ * 31. 便捷方法:获取当前登录用户信息
1241
+ */
1242
+ getCurrentUser() {
1243
+ return this.users.getCurrentUser();
1244
+ }
1245
+ /**
1246
+ * 32. 便捷方法:获取当前登录用户的token
1247
+ */
1248
+ getToken() {
1249
+ return this.users.getToken();
1250
+ }
1251
+ /**
1252
+ * 33. 便捷方法:用户登出
1253
+ */
1254
+ logout() {
1255
+ return this.users.logout();
1256
+ }
1257
+ /**
1258
+ * 34. 便捷方法:保存用户数据
1259
+ */
1260
+ saveUserData(userData) {
1261
+ return this.users.saveUserData(userData);
1262
+ }
1263
+ /**
1264
+ * 35. 便捷方法:获取用户数据
1265
+ */
1266
+ getUserData() {
1267
+ return this.users.getUserData();
1268
+ }
1269
+ /**
1270
+ * 36. 便捷方法:记住登录信息
1271
+ */
1272
+ rememberLogin(username, password) {
1273
+ return this.users.rememberLogin(username, password);
1274
+ }
1275
+ /**
1276
+ * 37. 便捷方法:获取记住的登录信息
1277
+ */
1278
+ getRememberedLogin() {
1279
+ return this.users.getRememberedLogin();
1280
+ }
1281
+ /**
1282
+ * 38. 便捷方法:清除记住的登录信息
1283
+ */
1284
+ clearRememberedLogin() {
1285
+ return this.users.clearRememberedLogin();
1286
+ }
1028
1287
  }
1029
1288
 
1030
1289
  exports.ArticlesAPI = ArticlesAPI;
@@ -1034,5 +1293,6 @@ exports.GT6Error = GT6Error;
1034
1293
  exports.GT6SDK = GT6SDK;
1035
1294
  exports.ProductsAPI = ProductsAPI;
1036
1295
  exports.SettingsAPI = SettingsAPI;
1296
+ exports.UsersAPI = UsersAPI;
1037
1297
  exports.default = GT6SDK;
1038
1298
  //# sourceMappingURL=gt6-sdk.cjs.js.map