加入了 GVSDSDK 模块,进行了 QModel 兼容层的尝试,生产环境可用
This commit is contained in:
666
gvsdsdk/API.md
Normal file
666
gvsdsdk/API.md
Normal file
@@ -0,0 +1,666 @@
|
||||
# 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` |
|
||||
Reference in New Issue
Block a user