feat: 系统配置支持动态增删用户类型和会员套餐
新增功能: - UserTypeConfig 模型:用户类型配置支持动态增删 - MembershipPlanConfig 模型:会员套餐配置支持动态增删 - 用户类型管理页面:添加、编辑、删除、启用/禁用用户类型 - 会员套餐管理页面:添加、编辑、删除、上架/下架、推荐套餐 - 功能权限配置:支持选择功能列表 - 初始化默认配置功能 改进: - settings.html 页面重构,提供配置入口链接 - 新增API接口支持增删改查操作
This commit is contained in:
105
models.py
105
models.py
@@ -417,4 +417,107 @@ class DynamicConfig(db.Model):
|
||||
db.session.add(config)
|
||||
|
||||
db.session.commit()
|
||||
return config
|
||||
return config
|
||||
|
||||
|
||||
# ==================== 用户类型配置(动态增删) ====================
|
||||
class UserTypeConfig(db.Model):
|
||||
"""用户类型配置表 - 支持动态增删"""
|
||||
__tablename__ = 'user_type_config'
|
||||
|
||||
id = db.Column(db.Integer, primary_key=True)
|
||||
type_key = db.Column(db.String(50), unique=True, nullable=False) # 类型标识: guest, free, vip_basic, etc.
|
||||
display_name = db.Column(db.String(100), nullable=False) # 显示名称: 访客, 免费用户, 基础会员
|
||||
|
||||
# 权限配置
|
||||
daily_translations = db.Column(db.Integer, default=10) # 每日翻译次数 (-1=无限)
|
||||
max_pages = db.Column(db.Integer, default=50) # 最大页数 (-1=无限)
|
||||
max_file_size = db.Column(db.Integer, default=30*1024*1024) # 最大文件大小(bytes)
|
||||
|
||||
# 功能列表(JSON)
|
||||
features = db.Column(db.Text, default='[]') # JSON数组: ["basic_translate", "history"]
|
||||
|
||||
# 排序和状态
|
||||
sort_order = db.Column(db.Integer, default=0) # 排序权重
|
||||
is_active = db.Column(db.Boolean, default=True) # 是否启用
|
||||
is_system = db.Column(db.Boolean, default=False) # 是否系统内置(不可删除)
|
||||
|
||||
# 时间
|
||||
created_at = db.Column(db.DateTime, default=datetime.utcnow)
|
||||
updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
|
||||
|
||||
def get_features(self):
|
||||
"""获取功能列表"""
|
||||
import json
|
||||
try:
|
||||
return json.loads(self.features) if self.features else []
|
||||
except:
|
||||
return []
|
||||
|
||||
def set_features(self, feature_list):
|
||||
"""设置功能列表"""
|
||||
import json
|
||||
self.features = json.dumps(feature_list, ensure_ascii=False)
|
||||
|
||||
def to_dict(self):
|
||||
return {
|
||||
'id': self.id,
|
||||
'type_key': self.type_key,
|
||||
'display_name': self.display_name,
|
||||
'daily_translations': self.daily_translations,
|
||||
'max_pages': self.max_pages,
|
||||
'max_file_size': self.max_file_size,
|
||||
'features': self.get_features(),
|
||||
'sort_order': self.sort_order,
|
||||
'is_active': self.is_active,
|
||||
'is_system': self.is_system,
|
||||
}
|
||||
|
||||
|
||||
# ==================== 会员套餐配置(动态增删) ====================
|
||||
class MembershipPlanConfig(db.Model):
|
||||
"""会员套餐配置表 - 支持动态增删"""
|
||||
__tablename__ = 'membership_plan_config'
|
||||
|
||||
id = db.Column(db.Integer, primary_key=True)
|
||||
plan_key = db.Column(db.String(50), unique=True, nullable=False) # 套餐标识: vip_basic, vip_pro, etc.
|
||||
display_name = db.Column(db.String(100), nullable=False) # 显示名称: 基础会员
|
||||
|
||||
# 价格配置
|
||||
price = db.Column(db.Float, default=0) # 价格
|
||||
original_price = db.Column(db.Float, nullable=True) # 原价(用于折扣显示)
|
||||
period = db.Column(db.String(20), default='month') # 周期: month, quarter, year
|
||||
period_days = db.Column(db.Integer, default=30) # 周期天数
|
||||
|
||||
# 描述
|
||||
description = db.Column(db.String(255), nullable=True) # 套餐描述
|
||||
|
||||
# 对应的用户类型
|
||||
user_type_key = db.Column(db.String(50), nullable=True) # 购买后升级到的用户类型
|
||||
|
||||
# 排序和状态
|
||||
sort_order = db.Column(db.Integer, default=0)
|
||||
is_active = db.Column(db.Boolean, default=True)
|
||||
is_recommended = db.Column(db.Boolean, default=False) # 是否推荐
|
||||
is_system = db.Column(db.Boolean, default=False) # 是否系统内置(不可删除)
|
||||
|
||||
# 时间
|
||||
created_at = db.Column(db.DateTime, default=datetime.utcnow)
|
||||
updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
|
||||
|
||||
def to_dict(self):
|
||||
return {
|
||||
'id': self.id,
|
||||
'plan_key': self.plan_key,
|
||||
'display_name': self.display_name,
|
||||
'price': self.price,
|
||||
'original_price': self.original_price,
|
||||
'period': self.period,
|
||||
'period_days': self.period_days,
|
||||
'description': self.description,
|
||||
'user_type_key': self.user_type_key,
|
||||
'sort_order': self.sort_order,
|
||||
'is_active': self.is_active,
|
||||
'is_recommended': self.is_recommended,
|
||||
'is_system': self.is_system,
|
||||
}
|
||||
Reference in New Issue
Block a user