Files
Django/gvsdsdk/API.md

667 lines
20 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# GVS-DSDK API 使用手册
> 版本1.0.0 | 更新日期2026-06-13
## 目录
- [1. 概述](#1-概述)
- [2. 快速开始](#2-快速开始)
- [3. 包结构](#3-包结构)
- [4. 用户管理 (UserManager)](#4-用户管理-usermanager)
- [5. 角色管理 (RoleManager)](#5-角色管理-rolemanager)
- [6. 商铺管理 (ShopManager)](#6-商铺管理-shopmanager)
- [7. 职务管理 (PositionManager)](#7-职务管理-positionmanager)
- [8. 权限验证 (PermissionVerifier)](#8-权限验证-permissionverifier)
- [9. ELT 认证](#9-elt-认证)
- [10. 分佣引擎 (CommissionEngine)](#10-分佣引擎-commissionengine)
- [11. 支付网关 (PaymentManager)](#11-支付网关-paymentmanager)
- [12. MSYNC 服务间通信](#12-msync-服务间通信)
- [13. FluentQuery ORM 查询](#13-fluentquery-orm-查询)
- [14. 数据库路由与建表](#14-数据库路由与建表)
- [15. 数据模型一览](#15-数据模型一览)
---
## 1. 概述
GVS-DSDK 是 GVS 分布式服务 SDK提供
- **SAAS 用户管理**:用户、角色、权限、商铺、职务的完整 CRUD 和关联管理
- **ELT 认证**Cookie → EphemeralToken → User 的无状态认证体系
- **分佣引擎**5 种分账策略 + 预结算 + 邀请链分佣
- **支付网关**:微信/支付宝/银行卡三渠道适配 + 统一编排
- **MSYNC 通信**:服务注册/发现/OGM/分布式事务
- **FluentQuery**SQLAlchemy 风格的 ORM 查询层
全程 PascalCase 命名,从数据库到前端无中间转换层。
---
## 2. 快速开始
### 安装
```bash
pip install -e /path/to/gvsdsdk
```
### settings.py 配置
```python
INSTALLED_APPS = [
...
'gvsdsdk',
]
# 方式一:子服务器连接 SAAS 主库(只读)
DATABASES = {
'default': { ... }, # 本地数据库
'saas': { # SAAS 主库
'ENGINE': 'django.db.backends.mysql',
'NAME': 'Users',
'USER': 'root',
'PASSWORD': '***',
'HOST': 'saas-db.gvsds.com',
'PORT': '3306',
},
}
DATABASE_ROUTERS = ['gvsdsdk.db_router.SAASDatabaseRouter']
GVSDSDK_SAAS_READ_ONLY = True # 默认 True
# 方式二:同源数据库(可读写)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'mydb',
...
},
}
DATABASE_ROUTERS = []
GVSDSDK_MANAGE_TABLES = True # 允许 Django 管理表
```
### 建表
```bash
# 方式一Django migrate需 GVSDSDK_MANAGE_TABLES=True
python manage.py makemigrations gvsdsdk
python manage.py migrate
# 方式二gvsdsdk_init 命令(无需 GVSDSDK_MANAGE_TABLES
python manage.py gvsdsdk_init --db default
python manage.py gvsdsdk_init --db default --dry-run # 仅打印 SQL
python manage.py gvsdsdk_init --db default --modules auth,commission,payment
```
---
## 3. 包结构
```
gvsdsdk/
├── __init__.py # 统一入口(惰性加载 90+ 符号)
├── models.py # SAAS 核心数据模型17 张表)
├── model_base.py # QModel 元类 + FluentQuery 注入
├── model_utils.py # UUIDObj
├── fluent.py # FluentQuery ORM 查询层
├── db_router.py # SAASDatabaseRouter
├── apps.py # Django AppConfig
├── management/
│ └── commands/
│ └── gvsdsdk_init.py # 建表命令
├── auth/ # ELT 用户认证模块
│ ├── elt_auth.py # ELT 认证后端
│ ├── cookie.py # Cookie 管理
│ ├── crypto.py # 密码哈希 + AES-256-GCM
│ ├── middleware.py # ELTAuthMiddleware + CurrentRoleMiddleware
│ ├── permissions.py # RBAC/ABAC 权限
│ └── managers.py # UserManager + RoleManager + ShopManager + PositionManager
├── msync/ # MSYNC 服务间通信
│ ├── auth.py # 服务认证签名
│ ├── registry.py # 服务注册中心
│ ├── ogm.py # 全局对象映射
│ ├── Transaction.py # 分布式事务
│ ├── LocalTx.py # 本地事务
│ └── client.py # 服务客户端
├── commission/ # 分佣引擎
│ ├── models.py # 6 张数据模型
│ ├── manager.py # CommissionEngine 编排器
│ └── strategies/
│ └── engine.py # 5 种策略 + 工厂
└── payment/ # 支付网关
├── models.py # 2 张数据模型
├── manager.py # PaymentManager 编排器
└── gateways/
├── base.py # 抽象网关 + 数据类
├── registry.py # GatewayRegistry + payment_registry
├── wechat.py # 微信支付适配器
├── alipay.py # 支付宝适配器
└── bank.py # 银行卡适配器
```
---
## 4. 用户管理 (UserManager)
```python
from gvsdsdk.models import User
# 创建用户
user = User.objects.create_user(username='alice', password='xxx', email='a@b.com')
user = User.objects.create_superuser(username='admin', password='xxx')
# 密码
user.SetPassword('new_pass') # bcrypt 哈希
user.CheckPassword('input') # 验证密码
# 查询
user = User.objects.get(UserName='alice')
users = User.objects.filter(UserAccountLicense=1)
# 属性
user.IsActive # UserAccountLicense == 1
user.IsOnJob # UserPositionStatus == 0
user.UUIDStr # UUID 字符串
user.HasPermission('menu:admin') # 检查权限
```
---
## 5. 角色管理 (RoleManager)
```python
from gvsdsdk.auth.managers import RoleManager
# 创建角色
role = RoleManager.CreateRole(name='管理员', company_uuid=company_uuid)
# 分配/移除角色
RoleManager.AssignRole(user_uuid=user.UserUUID, role_uuid=role.RoleUUID)
RoleManager.RemoveRole(user_uuid=user.UserUUID, role_uuid=role.RoleUUID)
# 查询角色
roles = RoleManager.GetRolesForUser(user_uuid=user.UserUUID)
users = RoleManager.GetUsersForRole(role_uuid=role.RoleUUID)
# 分配/移除权限
RoleManager.AssignPermission(role_uuid=role.RoleUUID, perm_code='menu:admin', perm_name='菜单管理')
RoleManager.RemovePermission(role_uuid=role.RoleUUID, perm_code='menu:admin')
# 查询权限
perms = RoleManager.GetPermissionsForRole(role_uuid=role.RoleUUID)
```
---
## 6. 商铺管理 (ShopManager)
```python
from gvsdsdk.auth.managers import ShopManager
# 创建商铺
shop = ShopManager.CreateShop(
name='旗舰店',
company_uuid=company_uuid,
code='SHOP-001',
shop_type=1,
ShopAddress='北京市朝阳区xxx',
ShopContact='张三',
ShopPhone='13800138000',
ShopDesc='公司旗舰门店',
)
# 角色关联商铺
ShopManager.AssignRole(role_uuid=role.RoleUUID, shop_uuid=shop.ShopUUID, is_main_shop=True)
ShopManager.RemoveRole(role_uuid=role.RoleUUID, shop_uuid=shop.ShopUUID)
# 查询
shops = ShopManager.GetShopsForRole(role_uuid=role.RoleUUID) # 角色的所有商铺
roles = ShopManager.GetRolesForShop(shop_uuid=shop.ShopUUID) # 商铺的所有角色
main_shop = ShopManager.GetMainShopForRole(role_uuid=role.RoleUUID) # 角色的主商铺
company_shops = ShopManager.GetShopsForCompany(company_uuid=company_uuid) # 公司的所有商铺
# 模型方法
shop.GetRoles() # 商铺关联的所有角色
```
### 商铺模型字段
| 字段 | 类型 | 说明 |
|------|------|------|
| ShopUUID | BINARY(16) PK | 商铺 UUID |
| CompanyUUID | BINARY(16) | 所属公司 UUID |
| ShopName | VARCHAR(128) | 商铺名称 |
| ShopCode | VARCHAR(64) | 商铺编码 |
| ShopType | SMALLINT | 商铺类型 |
| ShopStatus | SMALLINT | 状态1=启用) |
| ShopAddress | VARCHAR(512) | 地址 |
| ShopContact | VARCHAR(128) | 联系人 |
| ShopPhone | VARCHAR(32) | 联系电话 |
| ShopDesc | VARCHAR(512) | 描述 |
| CreateTime | DATETIME | 创建时间 |
| UpdateTime | DATETIME | 更新时间 |
### 角色商铺关联表 (RoleShop)
| 字段 | 类型 | 说明 |
|------|------|------|
| RoleShopUUID | BINARY(16) PK | 关联 UUID |
| RoleUUID | BINARY(16) | 角色 UUID |
| ShopUUID | BINARY(16) | 商铺 UUID |
| IsMainShop | SMALLINT | 是否主商铺0/1 |
| CreateTime | DATETIME | 创建时间 |
---
## 7. 职务管理 (PositionManager)
```python
from gvsdsdk.auth.managers import PositionManager
# 创建职务
position = PositionManager.CreatePosition(
name='总经理',
company_uuid=company_uuid,
code='POS-CEO',
level=10,
PositionDesc='公司最高管理职务',
)
# 角色关联职务
PositionManager.AssignRole(role_uuid=role.RoleUUID, position_uuid=position.PositionUUID, is_main_position=True)
PositionManager.RemoveRole(role_uuid=role.RoleUUID, position_uuid=position.PositionUUID)
# 查询
positions = PositionManager.GetPositionsForRole(role_uuid=role.RoleUUID) # 角色的所有职务
roles = PositionManager.GetRolesForPosition(position_uuid=position.PositionUUID) # 职务的所有角色
main_pos = PositionManager.GetMainPositionForRole(role_uuid=role.RoleUUID) # 角色的主职务
company_positions = PositionManager.GetPositionsForCompany(company_uuid=company_uuid) # 公司的所有职务
# 模型方法
position.GetRoles() # 职务关联的所有角色
```
### 职务模型字段
| 字段 | 类型 | 说明 |
|------|------|------|
| PositionUUID | BINARY(16) PK | 职务 UUID |
| CompanyUUID | BINARY(16) | 所属公司 UUID |
| PositionName | VARCHAR(128) | 职务名称 |
| PositionCode | VARCHAR(64) | 职务编码 |
| PositionLevel | SMALLINT | 职务级别 |
| PositionStatus | SMALLINT | 状态1=启用) |
| PositionDesc | VARCHAR(512) | 描述 |
| CreateTime | DATETIME | 创建时间 |
| UpdateTime | DATETIME | 更新时间 |
### 角色职务关联表 (RolePosition)
| 字段 | 类型 | 说明 |
|------|------|------|
| RolePositionUUID | BINARY(16) PK | 关联 UUID |
| RoleUUID | BINARY(16) | 角色 UUID |
| PositionUUID | BINARY(16) | 职务 UUID |
| IsMainPosition | SMALLINT | 是否主职务0/1 |
| CreateTime | DATETIME | 创建时间 |
---
## 8. 权限验证 (PermissionVerifier)
```python
from gvsdsdk.auth.permissions import PermissionVerifier, IsAdminUser, CompanyScopedMixin
# 手动验证
if PermissionVerifier(perm_level=1, perm_attrs=['menu:admin'], user=request.user, request=request):
pass
# DRF 权限类
class MyViewSet(viewsets.ModelViewSet):
permission_classes = [IsAuthenticated, IsAdminUser]
# 公司范围自动过滤
class MyCompanyViewSet(CompanyScopedMixin, viewsets.ModelViewSet):
company_field = 'CompanyUUID' # 自动按当前角色公司过滤
```
---
## 9. ELT 认证
### 认证流程
```
浏览器 Cookie (ELT_TOKEN) → ELTAuthentication → EphemeralToken → User
```
### 中间件
```python
# settings.py MIDDLEWARE
'gvsdsdk.auth.middleware.ELTAuthMiddleware', # 解析 ELT Cookie
'gvsdsdk.auth.middleware.CurrentRoleMiddleware', # 注入 request.current_role
# 视图中使用
request.user # gvsdsdk.models.User 实例
request.current_role # gvsdsdk.models.Role 实例(或 None
request.current_company_uuid # 当前角色所属公司 UUID或 None
```
### Cookie 管理
```python
from gvsdsdk.auth.cookie import SetELTCookie, DeleteELTCookie, ELT_COOKIE_NAME
# 登录成功后设置 Cookie
SetELTCookie(response, token_value)
# 登出时删除 Cookie
DeleteELTCookie(response)
```
### 加密工具
```python
from gvsdsdk.auth.crypto import HashPassword, VerifyPassword, SymmetricEncrypt, SymmetricDecrypt
# 密码
hashed = HashPassword('plaintext')
is_valid = VerifyPassword('plaintext', hashed)
# AES-256-GCM 对称加密
encrypted = SymmetricEncrypt('sensitive data', key)
decrypted = SymmetricDecrypt(encrypted, key)
```
---
## 10. 分佣引擎 (CommissionEngine)
```python
from gvsdsdk.commission import CommissionEngine, CommissionError
engine = CommissionEngine()
# 配置规则
engine.ConfigureRule(
event_type='order_complete',
participant_rules=[
{'Type': 'percentage', 'Rate': 0.10, 'ParticipantID': 'platform'},
{'Type': 'fixed', 'Amount': 50.00, 'ParticipantID': 'agent'},
{'Type': 'remainder', 'ParticipantID': 'merchant'},
],
)
# 触发分佣
engine.Dispatch(
event_type='order_complete',
event_key='ORDER-12345',
total_amount=1000.00,
tenant_uuid=tenant_uuid,
)
# 邀请链分佣
engine.BuildInviteChainCommission(
event_type='member_purchase',
event_key='MEMBER-67890',
total_amount=500.00,
invite_chain=[user_uuid_1, user_uuid_2, user_uuid_3],
tenant_uuid=tenant_uuid,
)
# 预结算
engine.PreSettle(event_key='ORDER-12345', participant_id='agent', amount=50.00)
engine.ConfirmPreSettlement(presettlement_uuid=uuid)
engine.RejectPreSettlement(presettlement_uuid=uuid)
# 查询
records = engine.QueryRecords(participant_id='agent')
total = engine.TotalByParticipant(participant_id='agent')
```
### 策略类型
| 策略 | Type | 说明 |
|------|------|------|
| PercentageStrategy | `percentage` | 比例分账,支持保底/封顶 |
| FixedStrategy | `fixed` | 固定金额 |
| TieredStrategy | `tiered` | 阶梯分账 |
| RemainderStrategy | `remainder` | 剩余归平台 |
| WithdrawalFeeStrategy | `withdrawal_fee` | 提现手续费 |
---
## 11. 支付网关 (PaymentManager)
```python
from gvsdsdk.payment import PaymentManager, PaymentError
manager = PaymentManager()
# 配置网关
manager.ConfigureGateway(
tenant_uuid=tenant_uuid,
platform='wechat',
app_id='wx1234567890',
merchant_id='1234567890',
api_key='***',
)
# 发起支付
response = manager.Pay(
tenant_uuid=tenant_uuid,
platform='wechat',
out_trade_no='ORDER-12345',
total_amount=100.00,
subject='商品名称',
pay_method='JSAPI',
openid='user_openid',
)
# 查询订单
result = manager.Query(tenant_uuid=tenant_uuid, out_trade_no='ORDER-12345')
# 退款
result = manager.Refund(
tenant_uuid=tenant_uuid,
out_trade_no='ORDER-12345',
refund_amount=50.00,
refund_reason='用户申请退款',
)
# 企业转账
result = manager.Transfer(
tenant_uuid=tenant_uuid,
platform='wechat',
out_trade_no='TRANSFER-001',
amount=100.00,
transfer_type='balance',
openid='user_openid',
)
# 处理回调
result = manager.HandleNotify(platform='wechat', raw_body=request.body)
# 列出可用渠道
channels = manager.ListChannels()
```
### 支付渠道
| 渠道 | Platform | 支付方式 | 转账 |
|------|----------|---------|------|
| 微信支付 | `wechat` | JSAPI/Native/H5/小程序 | 支持 |
| 支付宝 | `alipay` | APP/H5/Native | 支持 |
| 银行卡 | `bank` | APP/H5/Native | 仅 bank 类型 |
---
## 12. MSYNC 服务间通信
```python
from gvsdsdk.msync import ServiceRegistry, OGMManager, TransactionManager, ServiceClient
from gvsdsdk.msync.auth import SignPayload, BuildAuthPayload
# 服务注册
registry = ServiceRegistry()
registry.Register(
service_name='my-service',
domain='https://my-service.gvsds.com',
secret='***',
scope=['ogm:read', 'ogm:write'],
)
# OGM 全局对象映射
ogm = OGMManager()
mapping_id = ogm.CreateMapping(local_type='User', local_id=user_id)
remote_obj = ogm.GetRemote(mapping_id)
# 分布式事务
tx_mgr = TransactionManager()
tx = tx_mgr.Begin(participants=['service-a', 'service-b'])
tx_mgr.ExecuteStep(tx, 'service-a', 'create_order', {'item': 'xxx'})
tx_mgr.ExecuteStep(tx, 'service-b', 'deduct_stock', {'item': 'xxx'})
tx_mgr.Commit(tx)
# 服务客户端
client = ServiceClient(service_name='target-service')
response = client.Call('/api/resource', method='GET')
```
---
## 13. FluentQuery ORM 查询
```python
from gvsdsdk.models import User, Role, Shop, Position
# 通过 .query 属性使用 FluentQuery
users = User.query.filter(User.UserAccountLicense == 1).all()
admins = User.query.filter(User.IsSuperuser == True).all()
# 运算符重载
young = User.query.filter(User.UserAccountLicense != 0).all()
# 排序和分页
users = User.query.filter(User.IsActive == True).order_by(User.UserCreateTime).limit(10)
# Django ORM 原生查询(始终可用)
users = User.objects.filter(UserAccountLicense=1)
users = User.objects.filter(UserName__contains='admin')
```
---
## 14. 数据库路由与建表
### SAASDatabaseRouter
```python
# settings.py — 子服务器连接 SAAS 主库
DATABASE_ROUTERS = ['gvsdsdk.db_router.SAASDatabaseRouter']
# 可选配置
GVSDSDK_SAAS_DB_ALIAS = 'saas' # SAAS 数据库别名,默认 'saas'
GVSDSDK_SAAS_READ_ONLY = True # 子服务器只读,默认 True
```
### gvsdsdk_init 建表命令
```bash
# 完整建表
python manage.py gvsdsdk_init --db default
# 仅打印 SQL
python manage.py gvsdsdk_init --db default --dry-run
# 按模块建表
python manage.py gvsdsdk_init --db default --modules auth
python manage.py gvsdsdk_init --db default --modules auth,commission,payment
```
### GVSDSDK_MANAGE_TABLES
```python
# settings.py — 同源数据库,允许 Django 管理表
GVSDSDK_MANAGE_TABLES = True
# 然后执行
# python manage.py makemigrations gvsdsdk
# python manage.py migrate
```
---
## 15. 数据模型一览
### SAAS 核心模型 (gvsdsdk.models)
| 模型 | 表名 | 说明 |
|------|------|------|
| User | User | 用户表 |
| Role | Role | 角色表 |
| Permission | Permission | 权限表 |
| UserRole | UserRole | 用户-角色多对多 |
| RoleDept | RoleDept | 角色-部门多对多 |
| Shop | Shop | 商铺表 |
| RoleShop | RoleShop | 角色-商铺多对多 |
| Position | Position | 职务表 |
| RolePosition | RolePosition | 角色-职务多对多 |
| EphemeralToken | EphemeralToken | ELT 令牌表 |
| User2FA | User2FA | 双因素认证表 |
| UserPending2FA | UserPending2FA | 2FA 待验证表 |
| UserAvatar | UserAvatar | 用户头像表 |
| UserLoginLog | UserLoginLog | 登录日志表 |
| AccountActivation | AccountActivation | 账户激活码表 |
| UserABAC | UserABAC | 用户 ABAC 表 |
| Password | Password | 密码表 |
### 分佣模型 (gvsdsdk.commission.models)
| 模型 | 表名 | 说明 |
|------|------|------|
| CommissionEvent | CommissionEvent | 分佣事件表 |
| RateTable | CommissionRateTable | 费率表 |
| RateEntry | CommissionRateEntry | 费率条目表 |
| CommissionRule | CommissionRule | 分佣规则表 |
| CommissionRecord | CommissionRecord | 分佣记录表 |
| PreSettlement | CommissionPreSettlement | 预结算表 |
### 支付模型 (gvsdsdk.payment.models)
| 模型 | 表名 | 说明 |
|------|------|------|
| PaymentGatewayConfig | PaymentGatewayConfig | 支付网关配置表 |
| PaymentTransaction | PaymentTransaction | 支付交易流水表 |
---
## 导入速查表
| 用途 | 导入路径 | 顶层快捷 |
|------|---------|---------|
| 用户模型 | `from gvsdsdk.models import User` | `from gvsdsdk import User` |
| 角色管理 | `from gvsdsdk.auth.managers import RoleManager` | `from gvsdsdk import RoleManager` |
| 商铺管理 | `from gvsdsdk.auth.managers import ShopManager` | `from gvsdsdk import ShopManager` |
| 职务管理 | `from gvsdsdk.auth.managers import PositionManager` | `from gvsdsdk import PositionManager` |
| 权限验证 | `from gvsdsdk.auth.permissions import PermissionVerifier` | `from gvsdsdk import PermissionVerifier` |
| ELT 认证 | `from gvsdsdk.auth.elt_auth import ELTAuthentication` | `from gvsdsdk import ELTAuthentication` |
| Cookie | `from gvsdsdk.auth.cookie import SetELTCookie` | `from gvsdsdk import SetELTCookie` |
| 加密 | `from gvsdsdk.auth.crypto import SymmetricEncrypt` | `from gvsdsdk import SymmetricEncrypt` |
| 中间件 | `from gvsdsdk.auth.middleware import ELTAuthMiddleware` | `from gvsdsdk import ELTAuthMiddleware` |
| 分佣引擎 | `from gvsdsdk.commission import CommissionEngine` | `from gvsdsdk import CommissionEngine` |
| 支付网关 | `from gvsdsdk.payment import PaymentManager` | `from gvsdsdk import PaymentManager` |
| 微信支付 | `from gvsdsdk.payment.gateways.wechat import WechatPaymentGateway` | `from gvsdsdk import WechatPaymentGateway` |
| MSYNC 认证 | `from gvsdsdk.msync.auth import SignPayload` | `from gvsdsdk import SignPayload` |
| 服务注册 | `from gvsdsdk.msync import ServiceRegistry` | `from gvsdsdk import ServiceRegistry` |
| OGM | `from gvsdsdk.msync import OGMManager` | `from gvsdsdk import OGMManager` |
| 事务 | `from gvsdsdk.msync import TransactionManager` | `from gvsdsdk import TransactionManager` |
| 数据库路由 | `from gvsdsdk.db_router import SAASDatabaseRouter` | — |
| UUID 工具 | `from gvsdsdk.model_utils import UUIDObj` | `from gvsdsdk import UUIDObj` |
| QModel | `from gvsdsdk.model_base import QModel` | `from gvsdsdk import QModel` |