npm package: @gt6/sdk
Description: GT6 SDK for articles management - A comprehensive JavaScript/TypeScript library for managing articles, categories, and tags in GT6 platform
Author: GT6 Team
Latest version: 1.0.49

# @gt6/sdk

GT6 SDK 是一个用于管理文章、分类和标签的JavaScript/TypeScript库，专门为GT6平台设计。

## 安装

```bash
npm install @gt6/sdk
```

## 快速开始

### 基础配置

```typescript
import { GT6SDK } from '@gt6/sdk';

const sdk = new GT6SDK({
  baseUrl: 'https://data.shopasb.io',
  platformId: '1747558688',
  // 文章相关配置
  rootCategoryId: '969287034',  // 文章根分类ID
  tagAlias: '002',              // 文章标签别名
  // 产品相关配置
  productRootCategoryId: '277233', // 产品根分类ID
  productTagAlias: '01',           // 产品标签别名
  // 缓存配置
  cache: {
    enabled: true,
    ttl: 300000 // 5分钟
  }
});
```

### 配置选项

| 字段 | 类型 | 必需 | 默认值 | 描述 |
|------|------|------|--------|------|
| `baseUrl` | string | ✅ | - | API 基础URL |
| `platformId` | string \| number | ✅ | - | 平台ID |
| `rootCategoryId` | string \| number | ❌ | '671920' | 文章根分类ID |
| `tagAlias` | string | ❌ | '001' | 文章标签别名 |
| `productRootCategoryId` | string \| number | ❌ | '277233' | 产品根分类ID |
| `productTagAlias` | string | ❌ | '01' | 产品标签别名 |
| `timeout` | number | ❌ | 10000 | 请求超时时间（毫秒） |
| `cache.enabled` | boolean | ❌ | true | 是否启用缓存 |
| `cache.ttl` | number | ❌ | 300000 | 缓存时间（毫秒） |

### 基本使用

```typescript
import { GT6SDK } from '@gt6/sdk';

// 初始化SDK
const sdk = new GT6SDK({
  baseUrl: 'https://data.shopasb.io',
  platformId: '1747558688',
  rootCategoryId: '969287034', // 可选，默认为671920
  tagAlias: '002', // 可选，默认为001
  productRootCategoryId: '277233',
  productTagAlias: '01',
  cache: {
    enabled: true,
    ttl: 300000
  }
});

// 获取文章详情
const article = await sdk.getArticle(921546067);
console.log(article.title);

// 获取分类列表
const categories = await sdk.getCategories();
console.log('分类列表:', categories.map(cat => cat.categoryName));

// 获取标签列表
const tags = await sdk.getTags();
console.log('标签列表:', tags.map(tag => tag.tagName));

// 根据分类获取文章
const categoryArticles = await sdk.getArticlesByCategory(782714);
console.log(`分类文章总数: ${categoryArticles.total}`);

// 根据标签获取文章
const tagArticles = await sdk.getArticlesByTag(236656846);
console.log(`标签文章总数: ${tagArticles.total}`);

// 获取分类层级路径
const categoryPath = await sdk.getCategoryPath(782714);
console.log('面包屑路径:', categoryPath.breadcrumbs.map(crumb => crumb.categoryName).join(' > '));

// 获取子分类
const subCategories = await sdk.getSubCategories(671920);
console.log(`子分类数量: ${subCategories.total}`);
```

### 高级功能

```typescript
// 按分类获取文章
const categoryArticles = await sdk.getArticlesByCategory(782714);

// 按标签获取文章
const tagArticles = await sdk.getArticlesByTag(236656846);

// 获取分类层级路径（用于面包屑导航）
const categoryPath = await sdk.getCategoryPath(782714);

// 获取子分类
const subCategories = await sdk.getSubCategories(671920);

// 获取已发布的文章
const publishedArticles = await sdk.articles.getPublishedArticles();

// 搜索文章
const searchResults = await sdk.articles.searchArticles('CRM');

// 获取文章统计信息
const stats = await sdk.articles.getArticleStats();
console.log(`总文章数: ${stats.total}`);
console.log(`已发布: ${stats.published}`);
console.log(`草稿: ${stats.draft}`);

// 获取推荐文章
const recommended = await sdk.articles.getRecommendedArticles(921546067, 5);
```

### 全局参数设置获取

SDK提供了全局参数设置获取功能，可以从指定的URL获取平台配置参数。

#### 获取所有设置

```typescript
// 获取所有全局设置
const allSettings = await sdk.getSettings();
console.log('所有设置:', allSettings);

// 设置包含各种配置参数，如：
// - product_tag01: 产品标签配置
// - article_tag01: 文章标签配置
// - platform_config: 平台配置
// - payment_settings: 支付设置
// - shipping_settings: 运费设置
```

#### 获取单个设置

```typescript
// 获取特定的设置项
const productTagSetting = await sdk.getSetting('product_tag01');
console.log('产品标签设置:', productTagSetting);

const articleTagSetting = await sdk.getSetting('article_tag01');
console.log('文章标签设置:', articleTagSetting);

const platformConfig = await sdk.getSetting('platform_config');
console.log('平台配置:', platformConfig);
```

#### 在Astro项目中使用

```typescript
// Layout.astro
---
import { GT6SDK } from '@gt6/sdk';

const sdk = new GT6SDK({
  baseUrl: 'https://data.shopasb.io',
  platformId: '1747558688',
  rootCategoryId: '969287034',
  tagAlias: '002',
  productRootCategoryId: '277233',
  productTagAlias: '01'
});

// 获取全局设置
const settings = await sdk.getSettings();
const productTagSetting = await sdk.getSetting('product_tag01');
---

<html>
  <head>
    <title>GT6TRADE</title>
    <!-- 使用设置中的配置 -->
    <meta name="product-tag" content={productTagSetting?.value || '01'}>
  </head>
  <body>
    <slot />
  </body>
</html>
```

#### 错误处理

```typescript
try {
  const settings = await sdk.getSettings();
  console.log('设置获取成功:', settings);
} catch (error) {
  console.error('获取设置失败:', error);
  // 使用默认配置
  const defaultSettings = {
    product_tag01: { value: '01' },
    article_tag01: { value: '002' }
  };
}
```

#### 缓存机制

全局设置也支持缓存机制，默认缓存5分钟：

```typescript
const sdk = new GT6SDK({
  baseUrl: 'https://data.shopasb.io',
  platformId: '1747558688',
  cache: {
    enabled: true,
    ttl: 300000 // 5分钟
  }
});

// 设置会被缓存，提高性能
const settings = await sdk.getSettings(); // 第一次请求
const settings2 = await sdk.getSettings(); // 从缓存获取

// 清除缓存
sdk.clearCache();
```

### 在Astro项目中使用

```typescript
// [id].astro
---
import { GT6SDK } from '@gt6/sdk';

const sdk = new GT6SDK({
  baseUrl: 'https://data.shopasb.io',
  platformId: '1747558688',
  rootCategoryId: '969287034',
  tagAlias: '002',
  productRootCategoryId: '277233',
  productTagAlias: '01',
  cache: {
    enabled: true,
    ttl: 300000
  }
});

const { id } = Astro.params;
const article = await sdk.getArticle(id);
const recommended = await sdk.articles.getRecommendedArticles(Number(id), 3);
---

<html>
  <head>
    <title>{article.title}</title>
  </head>
  <body>
    <h1>{article.title}</h1>
    <div set:html={article.content}></div>
    
    <h2>推荐文章</h2>
    <ul>
      {recommended.map(rec => (
        <li><a href={`/articles/${rec.articleId}`}>{rec.title}</a></li>
      ))}
    </ul>
  </body>
</html>
```

## API 参考

### GT6SDK 类

#### 构造函数

```typescript
new GT6SDK(config: GT6Config)
```

**配置参数:**

- `baseUrl` (string): API基础URL
- `platformId` (string | number): 平台ID
- `rootCategoryId` (string | number, 可选): 根分类ID，默认为'671920'
- `tagAlias` (string, 可选): 标签别名，默认为'001'
- `timeout` (number, 可选): 请求超时时间，默认为10000ms
- `cache` (object, 可选): 缓存配置
  - `enabled` (boolean): 是否启用缓存，默认为true
  - `ttl` (number): 缓存时间，默认为300000ms (5分钟)

#### 便捷方法

- `getArticle(articleId: number | string): Promise<Article>`
- `getCategories(rootCategoryId?: number | string): Promise<Category[]>`
- `getTags(tagAlias?: string): Promise<Tag[]>`
- `getArticlesByCategory(categoryId: number | number[], options?: ArticlesByCategoryOptions): Promise<{ articles: Article[]; total: number; page: number; limit: number }>`
- `getArticlesByTag(tagId: number | number[], options?: ArticlesByTagOptions): Promise<{ articles: Article[]; total: number; page: number; limit: number }>`
- `getCategoryPath(categoryId: number): Promise<{ path: Category[]; currentCategory: Category | null; breadcrumbs: Array<{ categoryId: number; categoryName: string; level: number }> }>`
- `getSubCategories(categoryId: number, options?: { recursive?: boolean; includeCurrent?: boolean; maxDepth?: number }): Promise<{ subCategories: Category[]; currentCategory: Category | null; total: number; depth: number }>`
- `getSettings(): Promise<SettingsResponse>` - 获取所有全局设置
- `getSetting(key: string): Promise<SingleSetting | null>` - 获取单个设置项

#### 缓存管理

- `clearCache(): void` - 清除所有缓存
- `getCacheStats()` - 获取缓存统计信息

### ArticlesAPI 类

#### 文章相关方法

- `getArticle(articleId: number | string): Promise<Article>`
- `getArticles(params?: ArticleQueryParams): Promise<Article[]>`
- `getArticleList(params?: ArticleQueryParams): Promise<ArticleListItem[]>`
- `getArticlesByCategory(categoryId: number | number[], options?: ArticlesByCategoryOptions): Promise<{ articles: Article[]; total: number; page: number; limit: number }>`
- `getArticlesByTag(tagId: number | number[], options?: ArticlesByTagOptions): Promise<{ articles: Article[]; total: number; page: number; limit: number }>`
- `getCategoryPath(categoryId: number): Promise<{ path: Category[]; currentCategory: Category | null; breadcrumbs: Array<{ categoryId: number; categoryName: string; level: number }> }>`
- `getSubCategories(categoryId: number, options?: { recursive?: boolean; includeCurrent?: boolean; maxDepth?: number }): Promise<{ subCategories: Category[]; currentCategory: Category | null; total: number; depth: number }>`
- `getPublishedArticles(params?: Omit<ArticleQueryParams, 'status'>): Promise<Article[]>`
- `searchArticles(query: string, params?: ArticleQueryParams): Promise<Article[]>`
- `getRecommendedArticles(articleId: number, limit?: number): Promise<Article[]>`

#### 分类和标签方法

- `getCategories(rootCategoryId?: number | string): Promise<Category[]>`
- `getTags(tagAlias?: string): Promise<Tag[]>`

#### 统计方法

- `getArticleStats(): Promise<ArticleStats>`

### TransactionsAPI 类

#### 交易相关方法

- `uploadFile(file: File): Promise<UploadResponse>` - 上传文件
- `deductFunds(deductData: DeductFundsRequest): Promise<DeductFundsResponse>` - 资金扣款
- `createRetailOrder(orderData: CreateRetailOrderRequest): Promise<CreateRetailOrderResponse>` - 创建零售订单

#### 资金扣款

```typescript
// 资金扣款
const deductResult = await sdk.transactions.deductFunds({
  userId: 12345,
  userType: 2,
  amount: '100.00',
  description: '购买商品扣款',
  orderId: 'ORDER123456'
});

if (deductResult.success) {
  console.log('扣款成功');
  console.log('资金日志ID:', deductResult.fundLogId);
  console.log('新余额:', deductResult.newBalance);
} else {
  console.log('扣款失败:', deductResult.message);
}
```

#### 创建零售订单

```typescript
// 创建零售订单
const orderData = {
  user_id: 12345,
  user_type: 2,
  total_amount: 150.00,
  pay_way: 1, // 钱包支付
  product_type: 1,
  platform_id: 1747558688,
  d1: 0,
  d2: 0,
  d3: 0,
  products: [
    {
      product_id: 1001,
      quantity: 2,
      sku: 'PROD001',
      price: 50.00,
      region_id: 1,
      address_id: 101,
      shipping_fee: 10.00,
      tax_fee: 5.00
    }
  ]
};

const orderResult = await sdk.transactions.createRetailOrder(orderData);

if (orderResult.success) {
  console.log('订单创建成功');
  console.log('订单ID:', orderResult.orderId);
  console.log('订单状态:', orderResult.order?.status);
} else {
  console.log('订单创建失败:', orderResult.message);
}
```

#### 完整交易流程

```typescript
// 完整的购买流程示例
async function completePurchase(userId: number, amount: number, products: any[]) {
  // 第一步：扣款
  const deductResult = await sdk.transactions.deductFunds({
    userId,
    userType: 2,
    amount: amount.toString(),
    description: '购买商品扣款'
  });

  if (!deductResult.success) {
    throw new Error(`扣款失败: ${deductResult.message}`);
  }

  // 第二步：创建订单
  const orderData = {
    user_id: userId,
    user_type: 2,
    total_amount: amount,
    pay_way: 1,
    product_type: 1,
    platform_id: 1747558688,
    d1: 0,
    d2: 0,
    d3: 0,
    products
  };

  const orderResult = await sdk.transactions.createRetailOrder(orderData);

  if (!orderResult.success) {
    // 注意：如果订单创建失败，需要考虑退款处理
    throw new Error(`订单创建失败: ${orderResult.message}`);
  }

  return {
    fundLogId: deductResult.fundLogId,
    orderId: orderResult.orderId,
    newBalance: deductResult.newBalance
  };
}
```

## 使用示例

### 根据分类获取文章

```typescript
// 获取单个分类的文章
const result = await sdk.getArticlesByCategory(782714);
console.log(`分类文章总数: ${result.total}`);
console.log(`返回文章数: ${result.articles.length}`);

// 获取多个分类的文章（去重）
const multiResult = await sdk.getArticlesByCategory([782714, 821172]);
console.log(`多分类文章总数: ${multiResult.total}`);

// 使用分页和状态过滤
const paginatedResult = await sdk.getArticlesByCategory(782714, {
  page: 1,
  limit: 10,
  status: 'published'
});
```

### 根据标签获取文章

```typescript
// 获取单个标签的文章
const result = await sdk.getArticlesByTag(236656846);
console.log(`标签文章总数: ${result.total}`);

// 获取多个标签的文章（去重）
const multiResult = await sdk.getArticlesByTag([236656846, 497329737]);
console.log(`多标签文章总数: ${multiResult.total}`);

// 使用分页和状态过滤
const paginatedResult = await sdk.getArticlesByTag(236656846, {
  page: 1,
  limit: 10,
  status: 'published'
});

// 指定标签别名获取文章
const customTagResult = await sdk.getArticlesByTag(236656846, {
  tagAlias: '002', // 使用自定义标签别名
  limit: 10,
  status: 'published'
});
```

### 获取分类层级路径（面包屑导航）

```typescript
// 获取分类的完整层级路径
const pathResult = await sdk.getCategoryPath(821172);

// 输出面包屑导航数据
console.log('当前分类:', pathResult.currentCategory?.categoryName);
console.log('完整路径:', pathResult.path.map(cat => cat.categoryName).join(' > '));

// 前端面包屑导航使用
pathResult.breadcrumbs.forEach((crumb, index) => {
  if (index < pathResult.breadcrumbs.length - 1) {
    console.log(`<a href="/category/${crumb.categoryId}">${crumb.categoryName}</a> >`);
  } else {
    console.log(`<span>${crumb.categoryName}</span>`);
  }
});
```

### 获取子分类

```typescript
// 获取直接子分类
const result = await sdk.getSubCategories(671920);
console.log(`子分类数量: ${result.total}`);
console.log(`递归深度: ${result.depth}`);

// 递归获取所有层级的子分类
const recursiveResult = await sdk.getSubCategories(671920, { 
  recursive: true 
});
console.log(`所有子分类数量: ${recursiveResult.total}`);

// 包含当前分类
const includeCurrentResult = await sdk.getSubCategories(671920, { 
  includeCurrent: true 
});
console.log(`包含当前分类的总数量: ${includeCurrentResult.total}`);

// 限制递归深度
const limitedResult = await sdk.getSubCategories(671920, { 
  recursive: true, 
  maxDepth: 2 
});
console.log(`限制深度后的子分类数量: ${limitedResult.total}`);
```

## 在Astro中使用

### 面包屑导航组件

```astro
---
// Breadcrumb.astro
export interface Props {
  categoryId: number;
  currentPage?: number;
}

const { categoryId, currentPage = 1 } = Astro.props;
const sdk = new GT6SDK({ 
  baseUrl: 'https://data.shopasb.io', 
  platformId: '1747558688', 
  rootCategoryId: '969287034',
  tagAlias: '002',
  productRootCategoryId: '277233',
  productTagAlias: '01',
  cache: {
    enabled: true,
    ttl: 300000
  }
});
const categoryPath = await sdk.getCategoryPath(categoryId);
---

<nav aria-label="面包屑导航" class="mb-3">
  <ol class="breadcrumb justify-content-center">
    <li class="breadcrumb-item">
      <a href="/" class="text-decoration-none">
        <i class="bi bi-house"></i> 首页
      </a>
    </li>
    {categoryPath.breadcrumbs.map((crumb, index) => (
      <li class={`breadcrumb-item ${index === categoryPath.breadcrumbs.length - 1 ? 'active' : ''}`}>
        {index === categoryPath.breadcrumbs.length - 1 ? (
          <span>{crumb.categoryName}</span>
        ) : (
          <a href={`/postlist/${crumb.categoryId}-1`} class="text-decoration-none">
            {crumb.categoryName}
          </a>
        )}
      </li>
    ))}
    {currentPage > 1 && (
      <li class="breadcrumb-item active">
        <span>第 {currentPage} 页</span>
      </li>
    )}
  </ol>
</nav>

<style>
  .breadcrumb {
    background: transparent;
    padding: 0.5rem 0;
  }
  
  .breadcrumb-item + .breadcrumb-item::before {
    content: ">";
    color: #6c757d;
  }
  
  .breadcrumb-item.active span {
    color: #495057;
    font-weight: 500;
  }
</style>
```

### 标签面包屑导航组件

```astro
---
// TagBreadcrumb.astro
export interface Props {
  tagId: number;
  currentPage?: number;
  baseUrl?: string;
  platformId?: string | number;
  rootCategoryId?: string | number;
}

const { 
  tagId, 
  currentPage = 1, 
  baseUrl = 'https://data.shopasb.io',
  platformId = '1747558688',
  rootCategoryId = '969287034',
  productRootCategoryId = '277233',
  productTagAlias = '01'
} = Astro.props;

const sdk = new GT6SDK({ 
  baseUrl, 
  platformId, 
  rootCategoryId,
  productRootCategoryId,
  productTagAlias,
  cache: {
    enabled: true,
    ttl: 300000
  }
});
const tags = await sdk.getTags();
const currentTag = tags.find(tag => tag.tagId === tagId);
---

<nav aria-label="面包屑导航" class="mb-3">
  <ol class="breadcrumb justify-content-center">
    <li class="breadcrumb-item">
      <a href="/" class="text-decoration-none">
        <i class="bi bi-house"></i> 首页
      </a>
    </li>
    <li class="breadcrumb-item">
      <a href="/tags" class="text-decoration-none">标签</a>
    </li>
    <li class="breadcrumb-item active">
      <span>{currentTag?.tagName || `标签 ${tagId}`}</span>
    </li>
    {currentPage > 1 && (
      <li class="breadcrumb-item active">
        <span>第 {currentPage} 页</span>
      </li>
    )}
  </ol>
</nav>

<style>
  .breadcrumb {
    background: transparent;
    padding: 0.5rem 0;
    margin-bottom: 0;
  }
  
  .breadcrumb-item + .breadcrumb-item::before {
    content: ">";
    color: #6c757d;
    margin: 0 0.5rem;
  }
  
  .breadcrumb-item.active span {
    color: #495057;
    font-weight: 500;
  }
  
  .breadcrumb-item a {
    color: #6c757d;
    text-decoration: none;
  }
  
  .breadcrumb-item a:hover {
    color: #495057;
    text-decoration: underline;
  }
  
  .breadcrumb-item i {
    margin-right: 0.25rem;
  }
</style>
```

### 分类列表页面

```astro
---
// [categoryId]-[pageId].astro
import { GT6SDK } from '@gt6/sdk';
import Breadcrumb from '../components/Breadcrumb.astro';

const { categoryId, pageId } = Astro.params;
const sdk = new GT6SDK({ 
  baseUrl: 'https://data.shopasb.io', 
  platformId: '1747558688', 
  rootCategoryId: '969287034',
  tagAlias: '002',
  productRootCategoryId: '277233',
  productTagAlias: '01',
  cache: {
    enabled: true,
    ttl: 300000
  }
});

const currentPage = parseInt(pageId);
const categoryArticles = await sdk.getArticlesByCategory(parseInt(categoryId), {
  page: currentPage,
  limit: 9,
  status: 'published'
});

const categoryPath = await sdk.getCategoryPath(parseInt(categoryId));
const currentCategory = categoryPath.currentCategory;
---

<html>
  <head>
    <title>{currentCategory?.categoryName} - GT6TRADE</title>
  </head>
  <body>
    <Breadcrumb 
      categoryId={parseInt(categoryId)} 
      currentPage={currentPage}
    />
    
    <section>
      <h1>{currentCategory?.categoryName}</h1>
      <p>共 {categoryArticles.total} 篇文章</p>
      
      <div class="articles">
        {categoryArticles.articles.map(article => (
          <article>
            <h2><a href={`/post/${article.articleId}`}>{article.title}</a></h2>
            <p>{article.content.substring(0, 200)}...</p>
          </article>
        ))}
      </div>
    </section>
  </body>
</html>
```

### 标签列表页面

```astro
---
// [tagId]-[pageId].astro
import { GT6SDK } from '@gt6/sdk';
import TagBreadcrumb from '../components/TagBreadcrumb.astro';

const { tagId, pageId } = Astro.params;
const sdk = new GT6SDK({ 
  baseUrl: 'https://data.shopasb.io', 
  platformId: '1747558688', 
  rootCategoryId: '969287034',
  tagAlias: '002',
  productRootCategoryId: '277233',
  productTagAlias: '01',
  cache: {
    enabled: true,
    ttl: 300000
  }
});

const currentPage = parseInt(pageId);
const tagArticles = await sdk.getArticlesByTag(parseInt(tagId), {
  page: currentPage,
  limit: 9,
  status: 'published',
  tagAlias: '002'
});

const tags = await sdk.getTags('002');
const currentTag = tags.find(tag => tag.tagId === parseInt(tagId));
---

<html>
  <head>
    <title>{currentTag?.tagName} - GT6TRADE</title>
  </head>
  <body>
    <TagBreadcrumb 
      tagId={parseInt(tagId)} 
      currentPage={currentPage}
    />
    
    <section>
      <h1>{currentTag?.tagName}</h1>
      <p>共 {tagArticles.total} 篇文章</p>
      
      <div class="articles">
        {tagArticles.articles.map(article => (
          <article>
            <h2><a href={`/post/${article.articleId}`}>{article.title}</a></h2>
            <p>{article.content.substring(0, 200)}...</p>
          </article>
        ))}
      </div>
    </section>
  </body>
</html>
```

## 数据类型

### Article (文章)

```typescript
interface Article {
  articleId: number;
  title: string;
  content: string;
  status: 'published' | 'draft' | 'archived';
  publishedAt: string;
  templateId: number;
  aiId: number;
  platformId: number;
  isVisible: boolean;
  displayTemplate: string;
  createdAt: any;
  updatedAt: any;
  categories: Category[];
  tags: Tag[];
  metaData: ArticleMetaData[];
  images: ArticleImage[];
  generatedAt: string;
}
```

### Category (分类)

```typescript
interface Category {
  categoryId: number;
  categoryName: string;
  categoryDescription: string;
  metaKeywords: string;
  status: number;
  parentId: number;
  sortOrder: number;
  createdAt: any;
  updatedAt: any;
  platformId: number;
  articleIds: number[];
  children: Category[];
}
```

### Tag (标签)

```typescript
interface Tag {
  tagId: number;
  tagName: string;
  type: number;
  platformId: number;
  aliases: string;
  createdAt: any;
  articleIds: number[];
}
```

### 选项类型

```typescript
interface ArticlesByCategoryOptions {
  page?: number;
  limit?: number;
  status?: 'published' | 'draft' | 'archived';
}

interface ArticlesByTagOptions {
  page?: number;
  limit?: number;
  status?: 'published' | 'draft' | 'archived';
  tagAlias?: string;
}

interface ProductsByCategoryOptions {
  page?: number;
  limit?: number;
  status?: number;
}

interface ProductsByTagOptions {
  page?: number;
  limit?: number;
  status?: number;
  productTagAlias?: string;
}
```

### 产品选项类型

```typescript
interface ProductsByCategoryOptions {
  page?: number;
  limit?: number;
  status?: number;
}

interface ProductsByTagOptions {
  page?: number;
  limit?: number;
  status?: number;
  productTagAlias?: string;
}
```

### 全局设置类型

```typescript
// 单个设置项的结构
interface SingleSetting {
  key: string;
  value: string;
  description?: string;
  updatedAt: string;
}

// 所有设置的响应结构
interface SettingsResponse {
  [key: string]: SingleSetting;
}
```

## 错误处理

SDK使用自定义的 `GT6Error` 类来处理错误：

```typescript
import { GT6Error } from '@gt6/sdk';

try {
  const article = await sdk.getArticle(999999);
} catch (error) {
  if (error instanceof GT6Error) {
    console.error(`错误: ${error.message}`);
    console.error(`状态码: ${error.status}`);
  }
}
```

## 缓存机制

SDK内置缓存机制，默认缓存5分钟：

```typescript
const sdk = new GT6SDK({
  baseUrl: 'https://data.shopasb.io',
  platformId: '1747558688',
  cache: {
    enabled: true,
    ttl: 300000 // 5分钟
  }
});

// 清除缓存
sdk.clearCache();

// 获取缓存统计
const stats = sdk.getCacheStats();
console.log(`缓存条目数: ${stats.size}`);
```

## 开发

### 安装依赖

```bash
npm install
```

### 构建

```bash
npm run build
```

### 测试

```bash
npm test
```

### 类型检查

```bash
npm run type-check
```

## 许可证

MIT 

## 产品管理

### 获取产品详情

```typescript
const product = await sdk.getProduct(424210);
console.log(product.productName); // "极简不对称设计纯色短袖T恤"
console.log(product.price); // "30.00"

// 检查产品类型
if (product.productType === 2) {
  // 订阅产品
  console.log(product.subscription?.billingCycleUnit); // "month"
  console.log(product.subscription?.trialDays); // 5
} else if (product.productType === 3) {
  // 批发产品
  console.log(product.wholesale?.minOrderQuantity); // 最小订购量
  console.log(product.priceTiers?.length); // 价格层级数量
} else if (product.productType === 4) {
  // 众筹产品
  console.log(product.crowdfunding?.targetAmount); // 目标金额
  console.log(product.crowdfunding?.currentAmount); // 当前金额
  console.log(product.rewards?.length); // 奖励数量
} else if (product.productType === 5) {
  // 简单理财产品
  console.log(product.simpleFinance?.interestRate); // 年化收益率
  console.log(product.simpleFinance?.minInvestment); // 最小投资金额
  console.log(product.simpleFinance?.investmentPeriod); // 投资期限
} else {
  // 普通产品
  console.log(product.variants.length); // 变体数量
}

// 税费和运费模板规则自动填充
// SDK会自动为产品的税费模板和运费模板添加适用的规则
if (product.taxTemplates && product.taxTemplates.length > 0) {
  product.taxTemplates.forEach(template => {
    console.log(`税费模板: ${template.templateName}`);
    console.log(`默认税率: ${template.defaultTaxRate}%`);
    if (template.rules && template.rules.length > 0) {
      console.log(`适用规则数量: ${template.rules.length}`);
      template.rules.forEach(rule => {
        console.log(`  区域 ${rule.regionId}: ${rule.taxRate}%`);
      });
    }
  });
}

if (product.shippingTemplates && product.shippingTemplates.length > 0) {
  product.shippingTemplates.forEach(template => {
    console.log(`运费模板: ${template.templateName}`);
    console.log(`默认运费: ${template.defaultFee}`);
    if (template.rules && template.rules.length > 0) {
      console.log(`适用规则数量: ${template.rules.length}`);
      template.rules.forEach(rule => {
        console.log(`  区域 ${rule.regionId}: 首${rule.firstUnit}件${rule.firstFee}元，续${rule.additionalUnit}件${rule.additionalFee}元`);
      });
    }
  });
}
```

### 获取产品分类列表

```typescript
const categories = await sdk.getProductCategories();
console.log(categories.length); // 分类数量

// 或者指定产品根分类ID
const categories = await sdk.getProductCategories('277233');
```

### 获取产品标签列表

```typescript
const tags = await sdk.getProductTags();
console.log(tags.length); // 标签数量

// 或者指定产品标签别名
const tags = await sdk.getProductTags('01');
```

### 根据分类获取产品列表

```typescript
const result = await sdk.getProductsByCategory(367704, {
  page: 1,
  limit: 10,
  status: 1
});

console.log(result.products.length); // 产品数量
console.log(result.total); // 总产品数
```

### 根据标签获取产品列表

```typescript
const result = await sdk.getProductsByTag(567515, {
  page: 1,
  limit: 10,
  status: 1,
  productTagAlias: '01'
});

console.log(result.products.length); // 产品数量
console.log(result.total); // 总产品数
```

### 获取产品分类路径（面包屑导航）

```typescript
const categoryPath = await sdk.getProductCategoryPath(categoryId);
console.log(categoryPath.breadcrumbs);
// [
//   { categoryId: 277233, categoryName: "中文商品", level: 0 },
//   { categoryId: 367704, categoryName: "女装", level: 1 },
//   { categoryId: 907691, categoryName: "T恤", level: 2 }
// ]
```

### 获取产品子分类

```typescript
const subCategories = await sdk.getProductSubCategories(367704, {
  recursive: true,
  includeCurrent: false,
  maxDepth: 2
});

console.log(subCategories.subCategories.length); // 子分类数量
```

### 获取税费信息

```typescript
const taxInfo = await sdk.getTaxInfo();
console.log('税费模板数量:', taxInfo.templates.length);

taxInfo.templates.forEach(template => {
  console.log(`模板 ${template.templateId}: ${template.templateName}`);
  console.log(`  默认税率: ${template.defaultTaxRate}%`);
  console.log(`  规则数量: ${template.rules.length}`);
  
  template.rules.forEach(rule => {
    console.log(`    区域 ${rule.regionId}: ${rule.taxRate}%`);
  });
});
```

### 获取运费信息

```typescript
const shippingInfo = await sdk.getShippingInfo();
console.log('运费模板数量:', shippingInfo.templates.length);

shippingInfo.templates.forEach(template => {
  console.log(`模板 ${template.templateId}: ${template.templateName}`);
  console.log(`  默认运费: ${template.defaultFee}`);
  console.log(`  免运费门槛: ${template.freeShippingLimit}`);
  console.log(`  规则数量: ${template.rules.length}`);
  
  template.rules.forEach(rule => {
    console.log(`    区域 ${rule.regionId}: 首${rule.firstUnit}件${rule.firstFee}元，续${rule.additionalUnit}件${rule.additionalFee}元`);
  });
});
```

### 获取区域信息

```typescript
const regionInfo = await sdk.getRegions();
console.log('区域数量:', regionInfo.regions.length);

// 递归显示区域层级结构
const displayRegions = (regions: any[], level: number = 0) => {
  regions.forEach(region => {
    const indent = '  '.repeat(level);
    console.log(`${indent}${region.regionName} (${region.regionCode}) - ${region.regionLevel}`);
    
    if (region.children && region.children.length > 0) {
      displayRegions(region.children, level + 1);
    }
  });
};

displayRegions(regionInfo.regions);
```

### 税费和运费模板规则自动填充

SDK在获取产品详情时会自动为税费模板和运费模板填充适用的规则：

**触发条件：**
- 产品有销售区域（`regions` 不为空）
- 产品有税费模板（`taxTemplates` 不为空）或运费模板（`shippingTemplates` 不为空）

**自动填充逻辑：**
1. 获取平台的所有税费/运费模板和规则
2. 根据产品的销售区域过滤出适用的规则
3. 将适用规则添加到对应的模板中
4. 如果获取模板信息失败，不影响产品详情返回

**示例：**
```typescript
const product = await sdk.getProduct(424210);

// 税费模板会自动包含适用区域的规则
if (product.taxTemplates) {
  product.taxTemplates.forEach(template => {
    console.log(`模板: ${template.templateName}`);
    console.log(`默认税率: ${template.defaultTaxRate}%`);
    
    // 自动填充的规则
    if (template.rules) {
      template.rules.forEach(rule => {
        console.log(`区域 ${rule.regionId}: ${rule.taxRate}%`);
      });
    }
  });
}

// 运费模板会自动包含适用区域的规则
if (product.shippingTemplates) {
  product.shippingTemplates.forEach(template => {
    console.log(`模板: ${template.templateName}`);
    console.log(`默认运费: ${template.defaultFee}`);
    
    // 自动填充的规则
    if (template.rules) {
      template.rules.forEach(rule => {
        console.log(`区域 ${rule.regionId}: 首${rule.firstUnit}件${rule.firstFee}元`);
      });
    }
  });
}
```

**注意事项：**
- 如果产品没有销售区域或模板，不会进行自动填充
- 如果获取模板信息失败，产品详情仍会正常返回，只是模板中没有规则
- 自动填充的规则只包含产品可销售区域的规则，确保数据的准确性

### 产品类型说明

- **productType: 1** - 普通产品（包含 variants、options 等）
- **productType: 2** - 订阅产品（包含 subscription 信息）
- **productType: 3** - 批发产品（包含 wholesale、priceTiers、variantPrices 信息）
- **productType: 4** - 众筹产品（包含 crowdfunding、rewards、updates、faqs 信息）
- **productType: 5** - 简单理财产品（包含 simpleFinance 信息）

### 订阅产品示例

```typescript
const subscriptionProduct = await sdk.getProduct(305191);

if (subscriptionProduct.subscription) {
  console.log('订阅周期:', subscriptionProduct.subscription.billingCycleUnit);
  console.log('试用天数:', subscriptionProduct.subscription.trialDays);
  console.log('设置费用:', subscriptionProduct.subscription.setupFee);
  console.log('续费折扣:', subscriptionProduct.subscription.renewalDiscount);
  console.log('自动续费:', subscriptionProduct.subscription.autoRenew);
}
```

### 批发产品示例

```typescript
const wholesaleProduct = await sdk.getProduct(369374);

if (wholesaleProduct.wholesale) {
  console.log('最小订购量:', wholesaleProduct.wholesale.minOrderQuantity);
  console.log('最大订购量:', wholesaleProduct.wholesale.maxOrderQuantity);
  console.log('允许混合变体:', wholesaleProduct.wholesale.allowMixedVariants);
  console.log('显示零售价:', wholesaleProduct.wholesale.showRetailPrice);
  console.log('批发描述:', wholesaleProduct.wholesale.wholesaleDescription);
  console.log('付款条件:', wholesaleProduct.wholesale.paymentTerms);
  console.log('运输条件:', wholesaleProduct.wholesale.shippingTerms);
  
  // 价格层级
  console.log('价格层级数量:', wholesaleProduct.priceTiers?.length);
  wholesaleProduct.priceTiers?.forEach(tier => {
    console.log(`层级 ${tier.tierId}: ${tier.minQuantity}-${tier.maxQuantity}件, 价格调整: ${tier.priceValue}`);
  });
  
  // 变体价格
  console.log('变体价格数量:', wholesaleProduct.variantPrices?.length);
}
```

### 众筹产品示例

```typescript
const crowdfundingProduct = await sdk.getProduct(803421);

if (crowdfundingProduct.crowdfunding) {
  console.log('目标金额:', crowdfundingProduct.crowdfunding.targetAmount);
  console.log('当前金额:', crowdfundingProduct.crowdfunding.currentAmount);
  console.log('支持者数量:', crowdfundingProduct.crowdfunding.supporterCount);
  console.log('最小支持金额:', crowdfundingProduct.crowdfunding.minSupportAmount);
  console.log('允许超额众筹:', crowdfundingProduct.crowdfunding.allowOverFunding);
  console.log('超额限制:', crowdfundingProduct.crowdfunding.overFundingLimit);
  
  // 众筹进度
  const progress = (parseFloat(crowdfundingProduct.crowdfunding.currentAmount) / parseFloat(crowdfundingProduct.crowdfunding.targetAmount)) * 100;
  console.log(`众筹进度: ${progress.toFixed(2)}%`);
  
  // 奖励列表
  console.log('奖励数量:', crowdfundingProduct.rewards?.length);
  crowdfundingProduct.rewards?.forEach(reward => {
    console.log(`奖励 ${reward.rewardId}: ${reward.rewardName} - ${reward.rewardAmount}`);
    console.log(`  已认领: ${reward.rewardClaimed}/${reward.rewardLimit || '无限制'}`);
  });
  
  // 项目更新
  console.log('项目更新数量:', crowdfundingProduct.updates?.length);
  crowdfundingProduct.updates?.forEach(update => {
    console.log(`更新 ${update.updateId}: ${update.updateTitle} (${update.isPublic ? '公开' : '私密'})`);
  });
  
  // FAQ
  console.log('FAQ数量:', crowdfundingProduct.faqs?.length);
  crowdfundingProduct.faqs?.forEach(faq => {
    console.log(`FAQ ${faq.faqId}: ${faq.question}`);
  });
}
```

### 简单理财产品示例

```typescript
const financeProduct = await sdk.getProduct(249478);

if (financeProduct.simpleFinance) {
  console.log('年化收益率:', financeProduct.simpleFinance.interestRate + '%');
  console.log('最小投资金额:', financeProduct.simpleFinance.minInvestment + ' ' + financeProduct.simpleFinance.minInvestmentUnit);
  console.log('最大投资金额:', financeProduct.simpleFinance.maxInvestment + ' ' + financeProduct.simpleFinance.maxInvestmentUnit);
  console.log('投资期限:', financeProduct.simpleFinance.investmentPeriod + ' ' + financeProduct.simpleFinance.investmentPeriodUnit);
  console.log('计息周期:', financeProduct.simpleFinance.calculationPeriod + ' ' + financeProduct.simpleFinance.calculationPeriodUnit);
  
  // 计算投资收益示例
  const investmentAmount = 5000; // 投资金额
  const interestRate = parseFloat(financeProduct.simpleFinance.interestRate);
  const investmentPeriod = financeProduct.simpleFinance.investmentPeriod;
  
  // 简单年化收益计算
  const annualReturn = (investmentAmount * interestRate / 100);
  const totalReturn = annualReturn * investmentPeriod;
  
  console.log(`投资 ${investmentAmount} ${financeProduct.simpleFinance.minInvestmentUnit} 的预期收益:`);
  console.log(`  年化收益: ${annualReturn.toFixed(2)} ${financeProduct.simpleFinance.minInvestmentUnit}`);
  console.log(`  总收益: ${totalReturn.toFixed(2)} ${financeProduct.simpleFinance.minInvestmentUnit}`);
  console.log(`  到期金额: ${(investmentAmount + totalReturn).toFixed(2)} ${financeProduct.simpleFinance.minInvestmentUnit}`);
}
```

## 支付方式模块 (Payment Methods)

SDK提供了支付方式管理功能，支持获取各种类型的支付方式。

### 基础使用

```typescript
// 获取所有支付方式（使用默认别名'01'）
const paymentMethods = await sdk.getPaymentMethods();
console.log('支付方式总数:', paymentMethods.methods.length);

// 获取指定别名的支付方式
const paymentMethods02 = await sdk.getPaymentMethods('02');
console.log('别名02的支付方式总数:', paymentMethods02.methods.length);

// 根据类型获取支付方式（使用默认别名）
const apiMethods = await sdk.getPaymentMethodsByType('Api');
const manualMethods = await sdk.getPaymentMethodsByType('Manual');

// 根据类型获取支付方式（使用指定别名）
const apiMethods02 = await sdk.getPaymentMethodsByType('Api', '02');
const manualMethods02 = await sdk.getPaymentMethodsByType('Manual', '02');
```

### 获取特定支付方式

```typescript
// 根据ID获取支付方式详情（使用默认别名）
const method = await sdk.getPaymentMethodById(3);
if (method) {
  console.log('支付方式:', method.name);
  console.log('类型:', method.type);
  
  // 显示属性
  method.attrs.forEach(attr => {
    console.log(`  ${attr.attrName}: ${attr.attrValue}`);
  });
}

// 根据ID获取支付方式详情（使用指定别名）
const method02 = await sdk.getPaymentMethodById(3, '02');

// 获取特定属性值（使用默认别名）
const walletAddress = await sdk.getPaymentMethodAttribute(3, '钱包地址');

// 获取特定属性值（使用指定别名）
const walletAddress02 = await sdk.getPaymentMethodAttribute(3, '钱包地址', '02');
```

### 支付方式类型

- **Api** - API支付方式（如加密货币）
- **Manual** - 手动支付方式（如银行转账）
- **Gateway** - 网关支付方式
- **Crypto** - 加密货币支付方式

### 支付方式别名

支付方式别名用于区分不同的支付配置集合：
- **默认别名**: '01'（如果不指定）
- **其他别名**: '02', '03' 等，用于不同的支付场景或配置

## 表单提交模块 (Forms)

表单提交模块提供了通用的表单提交功能，支持多种类型的表单提交。

### API 方法

#### `submitForm(aliases, email, fieldValue, options?)`
通用表单提交方法

**参数:**
- `aliases` (string): 表单别名（如 'CONTACT', 'FEEDBACK' 等）
- `email` (string): 用户邮箱
- `fieldValue` (Record<string, any>): 表单字段值
- `options` (FormSubmitOptions, 可选): 提交选项

**返回:** `Promise<FormSubmitResponse>`

#### `submitContactForm(formData)`
联系表单提交

**参数:**
- `formData` (object): 联系表单数据
  - `firstName` (string): 名字
  - `lastName` (string, 可选): 姓氏
  - `email` (string): 邮箱
  - `phone` (string, 可选): 电话
  - `subject` (string): 主题
  - `message` (string): 消息内容

#### `submitFeedbackForm(formData)`
反馈表单提交

**参数:**
- `formData` (object): 反馈表单数据
  - `name` (string): 姓名
  - `email` (string): 邮箱
  - `type` (string): 反馈类型
  - `message` (string): 消息内容
  - `rating` (number, 可选): 评分

#### `submitCustomForm(aliases, formData, emailField?)`
自定义表单提交

**参数:**
- `aliases` (string): 表单别名
- `formData` (Record<string, any>): 表单数据对象
- `emailField` (string, 可选): 邮箱字段名，默认为 'email'

### 使用示例

```javascript
// 联系表单提交
const contactResult = await sdk.submitContactForm({
    firstName: 'John',
    lastName: 'Doe',
    email: 'john.doe@example.com',
    phone: '+1234567890',
    subject: 'General Inquiry',
    message: 'This is a test message.'
});

// 反馈表单提交
const feedbackResult = await sdk.submitFeedbackForm({
    name: 'Jane Smith',
    email: 'jane.smith@example.com',
    type: 'Bug Report',
    message: 'Found a bug in the checkout process.',
    rating: 4
});

// 通用表单提交
const generalResult = await sdk.submitForm('CUSTOM_FORM', 'user@example.com', {
    name: 'Test User',
    company: 'Test Company',
    inquiry: 'General inquiry about services'
});

// 自定义表单提交
const customResult = await sdk.submitCustomForm('NEWSLETTER_SIGNUP', {
    username: 'newuser',
    email: 'newuser@example.com',
    password: 'securepassword123',
    agreeTerms: true
});
```

### 错误处理

表单提交方法返回统一的响应格式：

```typescript
interface FormSubmitResponse {
    success: boolean;
    message: string;
    data?: any;
    code?: number;
}
```

### 类型定义

```typescript
interface FormSubmitData {
    platformId: number | string;
    aliases: string;
    email: string;
    fieldValue: Record<string, any>;
    createSecret?: string;
}

interface FormSubmitOptions {
    endpoint?: string;
    createSecret?: string;
}
```

## 支付方式模块 (Payment Methods)

## 用户认证模块 (Users)

用户认证模块提供了完整的用户登录、注册和会话管理功能。

### API 方法

#### `login(username, password, platformId)`
用户登录

**参数:**
- `username` (string): 用户名
- `password` (string): 密码
- `platformId` (number): 平台ID

**返回:** `Promise<LoginResponse>`

#### `register(username, password, platformId, ibcode?)`
用户注册

**参数:**
- `username` (string): 用户名
- `password` (string): 密码
- `platformId` (number): 平台ID
- `ibcode` (string, 可选): 邀请码

**返回:** `Promise<RegisterResponse>`

#### `isLoggedIn()`
检查用户是否已登录

**返回:** `boolean`

#### `getCurrentUser()`
获取当前登录用户信息

**返回:** `UserInfo | null`

#### `getToken()`
获取当前登录用户的token

**返回:** `string | null`

#### `logout()`
用户登出

#### `saveUserData(userData)`
保存用户数据到本地存储

**参数:**
- `userData` (UserData): 用户数据对象

#### `getUserData()`
从本地存储获取用户数据

**返回:** `UserData | null`

#### `rememberLogin(username, password)`
记住用户登录信息

**参数:**
- `username` (string): 用户名
- `password` (string): 密码

#### `getRememberedLogin()`
获取记住的登录信息

**返回:** `{ username: string; password: string } | null`

#### `clearRememberedLogin()`
清除记住的登录信息

### 使用示例

```javascript
// 用户登录
const loginResult = await sdk.login('username', 'password', 1);
if (loginResult.success && loginResult.token && loginResult.user) {
  // 保存用户数据到本地存储
  const userData = {
    ...loginResult.user,
    token: loginResult.token
  };
  sdk.saveUserData(userData);
  console.log('登录成功:', loginResult.user);
} else {
  console.error('登录失败:', loginResult.message);
}

// 用户注册
const registerResult = await sdk.register('newuser', 'password123', 1, 'INVITE123');
if (registerResult.success) {
  console.log('注册成功，用户ID:', registerResult.userId);
} else {
  console.error('注册失败:', registerResult.message);
}

// 检查登录状态
if (sdk.isLoggedIn()) {
  const user = sdk.getCurrentUser();
  const token = sdk.getToken();
  console.log('用户已登录:', user);
  console.log('Token:', token);
} else {
  console.log('用户未登录');
}

// 记住登录信息
sdk.rememberLogin('username', 'password');

// 获取记住的登录信息
const remembered = sdk.getRememberedLogin();
if (remembered) {
  console.log('记住的登录信息:', remembered);
}

// 用户登出
sdk.logout();
```

### 完整的登录流程示例

```javascript
async function completeLoginFlow() {
  // 检查是否已登录
  if (sdk.isLoggedIn()) {
    console.log('用户已登录，无需重新登录');
    return true;
  }

  // 尝试使用记住的登录信息
  const remembered = sdk.getRememberedLogin();
  if (remembered) {
    console.log('使用记住的登录信息');
    const result = await sdk.login(remembered.username, remembered.password, 1);
    if (result.success) {
      console.log('使用记住的信息登录成功');
      return true;
    }
  }

  // 手动登录
  console.log('需要手动登录');
  return false;
}
```

### 表单验证示例

```javascript
// 登录验证
async function loginWithValidation(username, password, platformId) {
  // 基本验证
  if (!username || !password) {
    console.error('用户名和密码不能为空');
    return false;
  }

  if (password.length < 6) {
    console.error('密码长度不能少于6位');
    return false;
  }

  // 执行登录
  const result = await sdk.login(username, password, platformId);
  
  if (result.success && result.token && result.user) {
    // 保存用户数据
    const userData = {
      ...result.user,
      token: result.token
    };
    sdk.saveUserData(userData);
    
    console.log('登录成功');
    return true;
  } else {
    console.error('登录失败:', result.message);
    return false;
  }
}

// 注册验证
async function registerWithValidation(username, password, confirmPassword, platformId, ibcode) {
  // 基本验证
  if (!username || !password || !confirmPassword) {
    console.error('用户名、密码和确认密码不能为空');
    return false;
  }

  if (password !== confirmPassword) {
    console.error('两次输入的密码不一致');
    return false;
  }

  if (password.length < 6) {
    console.error('密码长度不能少于6位');
    return false;
  }

  if (username.length < 3) {
    console.error('用户名长度不能少于3位');
    return false;
  }

  // 执行注册
  const result = await sdk.register(username, password, platformId, ibcode);
  
  if (result.success) {
    console.log('注册成功，用户ID:', result.userId);
    return true;
  } else {
    console.error('注册失败:', result.message);
    return false;
  }
}
```

### 类型定义

```typescript
interface LoginRequest {
  username: string;
  password: string;
  platformId: number;
}

interface LoginResponse {
  success: boolean;
  message?: string;
  token?: string;
  user?: {
    userId: number;
    username: string;
    userLevel: number;
    status: boolean;
    platformId: number;
    d1: number;
    d2: number;
    d3: number;
  };
}

interface RegisterRequest {
  username: string;
  password: string;
  platformId: number;
  ibcode?: string;
}

interface RegisterResponse {
  success: boolean;
  message?: string;
  userId?: number;
}

interface UserData {
  userId: number;
  username: string;
  userLevel: number;
  status: boolean;
  platformId: number;
  d1: number;
  d2: number;
  d3: number;
  token: string;
}
```

### 在Astro项目中使用

```astro
---
// Layout.astro
import { GT6SDK } from '@gt6/sdk';

const sdk = new GT6SDK({
  baseUrl: 'https://data.shopasb.io',
  platformId: '1747558688'
});

// 检查用户登录状态
const isLoggedIn = sdk.isLoggedIn();
const currentUser = sdk.getCurrentUser();
---

<html>
  <head>
    <title>GT6TRADE</title>
  </head>
  <body>
    <header>
      {isLoggedIn ? (
        <div>
          <span>欢迎, {currentUser?.username}</span>
          <button onclick="logout()">登出</button>
        </div>
      ) : (
        <div>
          <button onclick="showLoginModal()">登录</button>
          <button onclick="showRegisterModal()">注册</button>
        </div>
      )}
    </header>
    
    <slot />
    
    <script>
      // 全局SDK实例
      window.gt6SDK = new GT6SDK({
        baseUrl: 'https://data.shopasb.io',
        platformId: 1747558688
      });
      
      // 登出函数
      function logout() {
        window.gt6SDK.logout();
        window.location.reload();
      }
      
      // 显示登录模态框
      function showLoginModal() {
        // 实现登录模态框显示逻辑
      }
      
      // 显示注册模态框
      function showRegisterModal() {
        // 实现注册模态框显示逻辑
      }
    </script>
  </body>
</html>
```

### 错误处理

用户认证方法返回统一的响应格式：

```typescript
// 登录成功响应
{
  success: true,
  token: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  user: {
    userId: 123,
    username: "testuser",
    userLevel: 1,
    status: true,
    platformId: 1,
    d1: 0,
    d2: 0,
    d3: 0
  }
}

// 登录失败响应
{
  success: false,
  message: "用户名或密码错误"
}

// 注册成功响应
{
  success: true,
  userId: 123,
  message: "注册成功"
}

// 注册失败响应
{
  success: false,
  message: "用户名已存在"
}
```

### 用户资金和订单管理

用户模块还提供了资金信息、资金日志、零售订单和地址管理功能。

#### 获取用户资金信息

```javascript
// 获取用户资金信息（完整响应）
const fundsResponse = await sdk.getUserFunds();
if (fundsResponse.success) {
  console.log('可用余额:', fundsResponse.fund.fund);
  console.log('冻结金额:', fundsResponse.fund.noFund);
  console.log('租金:', fundsResponse.fund.rentFund);
  console.log('保证金:', fundsResponse.fund.marginFund);
  console.log('冻结保证金:', fundsResponse.fund.marginNoFund);
  console.log('积分:', fundsResponse.fund.userIntegral);
  console.log('信用等级:', fundsResponse.fund.creditLevel);
} else {
  console.error('获取资金信息失败:', fundsResponse.message);
}

// 获取用户资金信息（简化版本）
const funds = await sdk.getFunds();
if (funds) {
  console.log('可用余额:', funds.fund);
  console.log('冻结金额:', funds.noFund);
} else {
  console.log('获取资金信息失败');
}
```

#### 获取资金日志列表

```javascript
// 获取资金日志列表（完整响应）
const fundLogsResponse = await sdk.getFundLogs({
  page: 1,
  pageSize: 10
});

if (fundLogsResponse.success) {
  console.log('资金日志总数:', fundLogsResponse.total);
  fundLogsResponse.logs.forEach(log => {
    console.log(`日志ID: ${log.logId}`);
    console.log(`操作类型: ${log.fieldName}`);
    console.log(`变动金额: ${log.changeAmount}`);
    console.log(`新余额: ${log.newBalance}`);
    console.log(`操作时间: ${log.operationTime}`);
    console.log(`备注: ${log.remark || '-'}`);
  });
} else {
  console.error('获取资金日志失败:', fundLogsResponse.message);
}

// 获取资金日志列表（简化版本）
const fundLogs = await sdk.getFundLogsSimple(1, 10);
if (fundLogs) {
  console.log('资金日志总数:', fundLogs.total);
  fundLogs.logs.forEach(log => {
    console.log(`操作类型: ${log.fieldName}, 变动金额: ${log.changeAmount}`);
  });
} else {
  console.log('获取资金日志失败');
}
```

#### 获取零售订单列表

```javascript
// 获取零售订单列表（完整响应）
const retailOrdersResponse = await sdk.getRetailOrders({
  page: 1,
  pageSize: 10
});

if (retailOrdersResponse.success) {
  console.log('订单总数:', retailOrdersResponse.data.total);
  retailOrdersResponse.data.orders.forEach(order => {
    console.log(`订单ID: ${order.order_id}`);
    console.log(`订单金额: $${order.total_amount}`);
    console.log(`支付方式: ${order.pay_way}`);
    console.log(`订单状态: ${order.status}`);
    console.log(`创建时间: ${order.created_at}`);
    
    // 订单详情
    if (order.details && order.details.length > 0) {
      order.details.forEach(detail => {
        console.log(`  商品ID: ${detail.product_id}`);
        console.log(`  SKU: ${detail.sku}`);
        console.log(`  数量: ${detail.quantity}`);
        console.log(`  单价: $${detail.single_price}`);
        console.log(`  总价: $${detail.total_price}`);
      });
    }
  });
} else {
  console.error('获取零售订单失败:', retailOrdersResponse.message);
}

// 获取零售订单列表（简化版本）
const retailOrders = await sdk.getRetailOrdersSimple(1, 10);
if (retailOrders) {
  console.log('订单总数:', retailOrders.total);
  retailOrders.orders.forEach(order => {
    console.log(`订单ID: ${order.order_id}, 金额: $${order.total_amount}, 状态: ${order.status}`);
  });
} else {
  console.log('获取零售订单失败');
}
```

#### 获取用户地址列表

```javascript
// 获取用户地址列表（完整响应）
const addressesResponse = await sdk.getAddresses();
if (addressesResponse.success && addressesResponse.addresses) {
  addressesResponse.addresses.forEach(address => {
    console.log(`地址ID: ${address.addressId}`);
    console.log(`收货人: ${address.consignee}`);
    console.log(`电话: ${address.phone}`);
    console.log(`地址: ${address.address}`);
    console.log(`区域ID: ${address.regionId}`);
    console.log(`是否默认: ${address.isDefault}`);
  });
} else {
  console.error('获取地址列表失败:', addressesResponse.message);
}

// 获取用户地址列表（简化版本）
const addresses = await sdk.getAddressesSimple();
if (addresses) {
  addresses.forEach(address => {
    console.log(`收货人: ${address.consignee}, 地址: ${address.address}`);
  });
} else {
  console.log('获取地址列表失败');
}

// 根据地址ID获取地址信息
const address = await sdk.getAddressById(123);
if (address) {
  console.log('地址信息:', address);
} else {
  console.log('地址不存在');
}
```

#### 获取支付记录列表

```javascript
// 获取支付记录列表（完整响应）
const paymentRecordsResponse = await sdk.getPaymentRecords({
  page: 1,
  pageSize: 10,
  status: 'completed', // 可选：筛选状态
  recordType: 1,       // 可选：筛选记录类型
  methodId: 1          // 可选：筛选支付方式
});

if (paymentRecordsResponse.success) {
  console.log('支付记录总数:', paymentRecordsResponse.total);
  paymentRecordsResponse.records.forEach(record => {
    console.log(`记录ID: ${record.id}`);
    console.log(`订单ID: ${record.orderId}`);
    console.log(`金额: $${record.amount}`);
    console.log(`状态: ${record.status}`);
    console.log(`创建时间: ${record.createTime}`);
    console.log(`描述: ${record.description || '-'}`);
  });
} else {
  console.error('获取支付记录失败:', paymentRecordsResponse.message);
}

// 获取支付记录列表（简化版本）
const paymentRecords = await sdk.getPaymentRecordsSimple(1, 10);
if (paymentRecords) {
  console.log('支付记录总数:', paymentRecords.total);
  paymentRecords.records.forEach(record => {
    console.log(`订单ID: ${record.orderId}, 金额: $${record.amount}, 状态: ${record.status}`);
  });
} else {
  console.log('获取支付记录失败');
}
```

#### 在Astro组件中使用

```astro
---
// dashboard.astro
import { GT6SDK } from '@gt6/sdk';

const sdk = new GT6SDK({
  baseUrl: 'https://data.shopasb.io',
  platformId: '1747558688'
});

// 检查用户登录状态
const isLoggedIn = sdk.isLoggedIn();
let userFunds = null;
let fundLogs = null;
let retailOrders = null;

if (isLoggedIn) {
  // 获取用户资金信息
  userFunds = await sdk.getFunds();
  
  // 获取资金日志
  fundLogs = await sdk.getFundLogsSimple(1, 5);
  
  // 获取零售订单
  retailOrders = await sdk.getRetailOrdersSimple(1, 5);
}
---

<html>
  <head>
    <title>用户仪表板</title>
  </head>
  <body>
    {isLoggedIn ? (
      <div>
        <h1>用户仪表板</h1>
        
        <!-- 资金信息 -->
        {userFunds && (
          <div>
            <h2>资金信息</h2>
            <p>可用余额: ${userFunds.fund}</p>
            <p>冻结金额: ${userFunds.noFund}</p>
            <p>积分: {userFunds.userIntegral}</p>
          </div>
        )}
        
        <!-- 资金日志 -->
        {fundLogs && (
          <div>
            <h2>最近资金日志</h2>
            <ul>
              {fundLogs.logs.map(log => (
                <li>
                  {log.fieldName}: {log.changeAmount} (余额: {log.newBalance})
                  <br>
                  <small>{new Date(log.operationTime).toLocaleString()}</small>
                </li>
              ))}
            </ul>
          </div>
        )}
        
        <!-- 零售订单 -->
        {retailOrders && (
          <div>
            <h2>最近订单</h2>
            <ul>
              {retailOrders.orders.map(order => (
                <li>
                  订单 #{order.order_id}: ${order.total_amount}
                  <br>
                  <small>状态: {order.status}</small>
                </li>
              ))}
            </ul>
          </div>
        )}
      </div>
    ) : (
      <div>
        <h1>请先登录</h1>
        <a href="/login">去登录</a>
      </div>
    )}
  </body>
</html>
```

#### 类型定义

```typescript
// 资金信息类型
interface UserFunds {
  id: number;
  userId: number;
  userType: number;
  fund: string;           // 可用余额
  noFund: string;         // 冻结金额
  rentFund: string;       // 租金
  marginFund: string;     // 保证金
  marginNoFund: string;   // 冻结保证金
  userIntegral: number;   // 积分
  creditLevel: number;    // 信用等级
}

// 资金日志类型
interface FundLog {
  logId: number;
  fundId: number | null;
  userId: number;
  fieldName: string;      // 操作类型
  oldBalance: string;     // 旧余额
  newBalance: string;     // 新余额
  changeAmount: string;   // 变动金额
  operatorId: number;     // 操作者ID
  operationTime: string;  // 操作时间
  remark: string | null;  // 备注
}

// 零售订单类型
interface RetailOrder {
  order_id: number;
  user_id: number;
  user_type: number;
  total_amount: number;   // 订单总金额
  pay_way: number;        // 支付方式
  payment_record_id: number | null;
  fund_log_id: number | null;
  status: number;         // 订单状态
  product_type: number;
  created_at: string;     // 创建时间
  updated_at: string;     // 更新时间
  platform_id: number;
  d1: number;
  d2: number;
  d3: number;
  details: RetailOrderDetail[]; // 订单详情
}

// 零售订单详情类型
interface RetailOrderDetail {
  detail_id: number;
  product_id: number;
  product_name: string;
  address_id: number;
  sku: string;
  shipping_fee: number;   // 运费
  tax_fee: number;        // 税费
  quantity: number;       // 数量
  single_price: number;   // 单价
  total_price: number;    // 总价
  region_id: number;
  remark: string;
  created_at: string;
  updated_at: string;
}

// 地址信息类型
interface AddressInfo {
  addressId: number;
  consignee: string;      // 收货人
  phone: string;          // 电话
  address: string;        // 地址
  regionId: number;       // 区域ID
  isDefault: boolean;     // 是否默认地址
}

// 支付记录类型
interface PaymentRecord {
  id: number;
  orderId: string;
  userId: number;
  userType: number;
  methodId: number;       // 支付方式ID
  recordType: number;     // 记录类型
  amount: string;         // 金额
  status: string;         // 状态
  description?: string;   // 描述
  adminDescription?: string;
  img?: string;           // 图片
  createTime: string;     // 创建时间
  updateTime?: string;    // 更新时间
}
```

### 错误处理

用户认证方法返回统一的响应格式：

```typescript
// 登录成功响应
{
  success: true,
  token: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  user: {
    userId: 123,
    username: "testuser",
    userLevel: 1,
    status: true,
    platformId: 1,
    d1: 0,
    d2: 0,
    d3: 0
  }
}

// 登录失败响应
{
  success: false,
  message: "用户名或密码错误"
}

// 注册成功响应
{
  success: true,
  userId: 123,
  message: "注册成功"
}

// 注册失败响应
{
  success: false,
  message: "用户名已存在"
}
```

### 安全注意事项

1. **密码安全**: 确保密码在传输前进行适当的加密
2. **Token管理**: 妥善保存和管理用户token，避免泄露
3. **会话管理**: 定期检查token有效性，及时清理过期会话
4. **本地存储**: 敏感信息存储时考虑使用更安全的存储方式
5. **输入验证**: 在客户端和服务端都进行充分的输入验证

## 许可证

MIT License