diff --git a/application/forms/article.py b/application/forms/article.py index 250c7d3..20833c3 100644 --- a/application/forms/article.py +++ b/application/forms/article.py @@ -1,218 +1,8 @@ """ -文章表单验证模块 +兼容 shim(绞杀者迁移期间保留) ============================================================= -提供文章相关的表单验证功能,包括: -- 文章添加/更新表单验证 -- 文章状态设置表单验证 +表单已迁移至 src.modules.cms.article.schema。 +本文件仅作兼容转发,最终在 P7(切尾)阶段删除。 """ - -from wtforms import IntegerField, StringField, TextAreaField -from wtforms.validators import NumberRange, DataRequired, Length, Optional - -from application.forms.base_form import BaseForm - - -# ============================================================ -# 文章表单验证(添加和更新共用) -# ============================================================ - -class ArticleForm(BaseForm): - """ - 文章表单验证类 - - 用于添加和更新文章时的数据验证。 - 添加时 id 为 None,更新时 id 必须有值。 - - Attributes: - id: 文章ID(更新时必填,添加时可选) - categoryId: 分类ID(可选) - title: 文章标题(可选,最长150字符) - cover: 文章封面(可选,最长255字符) - images: 文章图集(可选,JSON格式) - intro: 文章导读(可选,最长255字符) - content: 文章内容(可选) - author: 文章作者(可选,最长100字符) - status: 文章状态(可选,0-正常,1-下架) - sort: 文章排序(可选,0-99999之间的整数) - """ - - # ============================================================ - # 文章ID - # ============================================================ - id = IntegerField( - label='文章ID', - validators=[ - Optional(), - NumberRange(min=1, message='文章ID必须大于0') - ], - description='文章唯一标识,更新时必填,添加时自动生成' - ) - - # ============================================================ - # 分类ID - # ============================================================ - categoryId = IntegerField( - label='分类ID', - validators=[ - Optional(), - NumberRange(min=0, message='分类ID必须大于等于0') - ], - description='文章所属分类ID' - ) - - # ============================================================ - # 文章标题 - # ============================================================ - title = StringField( - label='文章标题', - validators=[ - Optional(), - Length(max=150, message='文章标题长度不得超过150个字符') - ], - description='文章标题' - ) - - # ============================================================ - # 文章封面(逗号分隔的图片路径) - # ============================================================ - cover = StringField( - label='文章封面', - validators=[ - Optional(), - Length(max=255, message='文章封面路径长度不得超过255个字符') - ], - description='文章封面图片URL' - ) - - # ============================================================ - # 文章图集 - # ============================================================ - images = TextAreaField( - label='文章图集', - validators=[ - Optional() - ], - description='文章图集,JSON格式存储多张图片' - ) - - # ============================================================ - # 文章导读 - # ============================================================ - intro = StringField( - label='文章导读', - validators=[ - Optional(), - Length(max=255, message='文章导读长度不得超过255个字符') - ], - description='文章简介/导读' - ) - - # ============================================================ - # 文章内容 - # ============================================================ - content = TextAreaField( - label='文章内容', - validators=[ - Optional() - ], - description='文章正文内容,支持富文本' - ) - - # ============================================================ - # 文章作者 - # ============================================================ - author = StringField( - label='文章作者', - validators=[ - Optional(), - Length(max=100, message='文章作者长度不得超过100个字符') - ], - description='文章作者名称' - ) - - # ============================================================ - # 文章状态 - # ============================================================ - status = IntegerField( - label='文章状态', - validators=[ - Optional(), - NumberRange(min=0, max=1, message='文章状态值在0~1之间') - ], - description='文章状态:0-正常,1-下架' - ) - - # ============================================================ - # 文章排序 - # ============================================================ - sort = IntegerField( - label='文章排序', - validators=[ - Optional(), - NumberRange(min=0, max=99999, message='文章排序值在0~99999之间') - ], - description='排序值,数值越小越靠前' - ) - - # # ============================================================ - # # 自定义验证方法 - # # ============================================================ - # - # def validate_images(self, field): - # """ - # 自定义验证:验证images字段是否为有效的JSON格式 - # - # Args: - # field: images 字段对象 - # - # Raises: - # ValidationError: JSON格式无效时抛出验证错误 - # """ - # if field.data: - # try: - # # 尝试解析JSON - # if isinstance(field.data, str): - # json.loads(field.data) - # except json.JSONDecodeError: - # raise ValidationError("图集格式无效,请传入有效的JSON数组") - - -# ============================================================ -# 文章状态设置表单 -# ============================================================ - -class ArticleStatusForm(BaseForm): - """ - 文章状态设置表单验证类 - - 用于单独修改文章状态时的数据验证。 - - Attributes: - id: 文章ID(必填,必须大于0) - status: 文章状态(必填,0-正常,1-下架) - """ - - # ============================================================ - # 文章ID - # ============================================================ - id = IntegerField( - label='文章ID', - validators=[ - DataRequired(message='文章ID不能为空'), - NumberRange(min=1, message='文章ID必须大于0') - ], - description='要修改状态的文章ID' - ) - - # ============================================================ - # 文章状态 - # ============================================================ - status = IntegerField( - label='文章状态', - validators=[ - DataRequired(message='文章状态不能为空'), - NumberRange(min=0, max=1, message='文章状态值在0~1之间') - ], - description='目标状态:0-正常,1-下架' - ) +from src.modules.cms.article.schema import * # noqa: F401,F403 diff --git a/application/forms/category.py b/application/forms/category.py index 98a47d5..735f215 100644 --- a/application/forms/category.py +++ b/application/forms/category.py @@ -1,178 +1,8 @@ """ -分类表单验证模块 +兼容 shim(绞杀者迁移期间保留) ============================================================= -提供分类相关的表单验证功能,包括: -- 分类添加/更新表单验证 +表单已迁移至 src.modules.cms.category.schema。 +本文件仅作兼容转发,最终在 P7(切尾)阶段删除。 """ - -from wtforms import ValidationError, IntegerField, StringField -from wtforms.validators import NumberRange, DataRequired, Length, Optional - -from application.forms.base_form import BaseForm -from application.models.category import Category - - -# ============================================================ -# 分类表单验证(添加和更新共用) -# ============================================================ - -class CategoryForm(BaseForm): - """ - 分类表单验证类 - - 用于添加和更新分类时的数据验证。 - 添加时 id 为 None,更新时 id 必须有值。 - - Attributes: - id: 分类ID(更新时必填,添加时可选) - categoryName: 分类名称(必填,最长100字符,不可重复) - categoryCode: 分类编码(可选,最长100字符,不可重复) - parentId: 上级ID(可选,不得小于0) - sort: 分类排序(可选,0-99999之间的整数) - note: 分类备注(可选,最长100字符) - type: 分类类型(必填,1-公司,2-子公司,3-部门,4-小组) - """ - - # ============================================================ - # 分类ID - # ============================================================ - id = IntegerField( - label='分类ID', - validators=[ - Optional(), # 允许为空(添加时) - NumberRange(min=1, message='分类ID必须大于0') - ], - description='分类唯一标识,更新时必填,添加时自动生成' - ) - - # ============================================================ - # 分类名称 - # ============================================================ - categoryName = StringField( - label='分类名称', - validators=[ - DataRequired(message='分类名称不能为空'), - Length(max=100, message='分类名称长度不得超过100个字符') - ], - description='分类显示名称,如:新闻资讯、产品动态' - ) - - # ============================================================ - # 分类编码 - # ============================================================ - categoryCode = StringField( - label='分类编码', - validators=[ - Optional(), - Length(max=100, message='分类编码长度不得超过100个字符') - ], - description='分类唯一标识编码,用于程序调用' - ) - - # ============================================================ - # 上级ID - # ============================================================ - parentId = IntegerField( - label='上级ID', - validators=[ - NumberRange(min=0, message='上级ID不得小于0') - ], - description='上级分类ID,0表示顶级分类' - ) - - # ============================================================ - # 分类排序 - # ============================================================ - sort = IntegerField( - label='分类排序', - validators=[ - Optional(), - NumberRange(min=0, max=99999, message='分类排序值在0~99999之间') - ], - description='排序值,数值越小越靠前' - ) - - # ============================================================ - # 分类备注 - # ============================================================ - note = StringField( - label='分类备注', - validators=[ - Optional(), - Length(max=100, message='分类备注长度不得超过100个字符') - ], - description='分类补充说明' - ) - - # ============================================================ - # 自定义验证方法 - # ============================================================ - - def validate_categoryName(self, field): - """ - 自定义验证:分类名称不能重复 - - 验证逻辑: - 1. 添加时:检查数据库中是否存在同名记录 - 2. 更新时:排除当前记录自身,检查其他记录是否同名 - - Args: - field: categoryName 字段对象 - - Raises: - ValidationError: 分类名称已存在时抛出验证错误 - """ - if not field.data: - return - - # 获取当前记录的ID(更新时存在,添加时为None) - current_id = self.id.data if self.id.data else None - - # 构建查询:查找同名记录 - query = Category.query.filter( - Category.category_name == field.data, - Category.is_delete == 0 - ) - - # 如果是更新操作,排除当前记录自身 - if current_id: - query = query.filter(Category.id != current_id) - - # 如果存在同名记录,抛出验证错误 - if query.first(): - raise ValidationError("分类名称已存在") - - def validate_categoryCode(self, field): - """ - 自定义验证:分类编码不能重复 - - 验证逻辑: - 1. 添加时:检查数据库中是否存在相同编码的记录 - 2. 更新时:排除当前记录自身,检查其他记录是否编码相同 - - Args: - field: categoryCode 字段对象 - - Raises: - ValidationError: 分类编码已存在时抛出验证错误 - """ - if not field.data: - return - - # 获取当前记录的ID(更新时存在,添加时为None) - current_id = self.id.data if self.id.data else None - - # 构建查询:查找相同编码的记录 - query = Category.query.filter( - Category.category_code == field.data, - Category.is_delete == 0 - ) - - # 如果是更新操作,排除当前记录自身 - if current_id: - query = query.filter(Category.id != current_id) - - # 如果存在相同编码的记录,抛出验证错误 - if query.first(): - raise ValidationError("分类编码已存在") +from src.modules.cms.category.schema import * # noqa: F401,F403 diff --git a/application/forms/city.py b/application/forms/city.py index a0eca1b..5552858 100644 --- a/application/forms/city.py +++ b/application/forms/city.py @@ -1,211 +1,8 @@ -# +====================================================================== -# | DjangoAdmin 企业数字化开发平台 [ 赋能开发者,助力企业发展 ] -# +---------------------------------------------------------------------- -# | Copyright (c) 2021-2026 一米阳光团队 版权所有 -# +---------------------------------------------------------------------- -# | 开源协议: Apache-2.0 -# | 重要声明: 未经书面许可,不得移除或修改本框架相关版权标识。 -# +---------------------------------------------------------------------- -# | 官方网站: https://www.djangoadmin.cn -# +---------------------------------------------------------------------- -# | 研发团队: 一米阳光团队 荣誉出品 -# +====================================================================== -# | 版权和免责声明: -# | 一、知识产权声明 -# | 本团队对该软件框架产品(以下简称“本产品”)拥有完整知识产权,包括但不限于商标权、专利权、 -# | 著作权、商业秘密等。前述权利均受中华人民共和国及相关国际法律法规保护。未经本团队书面授权, -# | 任何个人或单位不得基于本产品本身申请任何形式的知识产权。 -# | 二、使用限制与禁止条款 -# | 您理解并同意,禁止将本产品用于以下任何行为: -# | 1. 任何违反中华人民共和国法律法规的用途; -# | 2. 任何侵害他人合法权益(包括但不限于人身权、财产权、知识产权等)的行为; -# | 3. 任何危害国家安全、公共利益及社会道德风尚的行为。 -# | 三、责任豁免 -# | 因使用本产品而产生的任何损失或法律纠纷(包括但不限于直接损失、间接损失、附带损失、衍生损失 -# | 以及因违约、侵权等引发的责任),本团队均不承担任何法律责任。若因违规使用本产品导致任何第三 -# | 方提起索赔或行政机关进行调查,您应独立承担全部责任。 -# | 四、违约与法律责任 -# | 如发现任何违反本声明的行为,本团队有权: -# | 1. 无条件配合公安机关及其他有权机关的调查取证工作; -# | 2. 依法追究相关方的民事责任,并要求赔偿全部损失; -# | 3. 保留进一步采取刑事控告等法律措施的权利。 -# | 五、许可范围说明 -# | 1、被授权方应视本产品源代码为核心机密信息,负有最高标准的保密与保管义务。禁止以任何形式(包 -# | 括但不限于直接或间接的分享、复制、传播、分发、转售、出租、开源、反向工程、反编译、反汇编或通 -# | 过网络服务提供给任何第三方)泄露、披露或处置源代码的全部或部分内容。任何未经授权的复制、使用、 -# | 传播行为均构成对本团队知识产权的严重侵权,本团队有权依法追究其全部法律责任,并要求赔偿因此造 -# | 成的一切经济损失及商誉损害。 -# | 2、本产品仅限于公司或个人在法律允许范围内,用于内部且合规的软件产品研发。具体权利义务以《软件 -# | 许可协议》附件为准。 -# +====================================================================== - """ -城市表单验证模块 +兼容 shim(绞杀者迁移期间保留) ============================================================= -提供城市相关的表单验证功能,包括: -- 城市添加/更新表单验证 +表单已迁移至 src.modules.city.schema。 +本文件仅作兼容转发,最终在 P7(切尾)阶段删除。 """ - -from wtforms import IntegerField, StringField -from wtforms.validators import NumberRange, DataRequired, Length, Optional - -from application.forms.base_form import BaseForm - - -# ============================================================ -# 城市表单验证(添加和更新共用) -# ============================================================ - -class CityForm(BaseForm): - """ - 城市表单验证类 - - 用于添加和更新城市时的数据验证。 - 添加时 id 为 None,更新时 id 必须有值。 - - Attributes: - id: 城市ID(更新时必填,添加时可选) - name: 城市名称(必填,最长150字符,不可重复) - shortName: 城市简称(必填,最长150字符) - pinyin: 城市拼音(必填,最长150字符) - cityCode: 城市区号(必填,最长6字符) - areaCode: 行政编码(必填,最长20字符) - zipCode: 城市邮编(必填,最长6字符) - level: 城市级别(必填,1-省份,2-城市,3-县区,4-街道) - lng: 城市经度(必填,最长150字符) - lat: 城市纬度(必填,最长150字符) - pid: 上级ID(可选) - """ - - # ============================================================ - # 城市ID - # ============================================================ - id = IntegerField( - label='城市ID', - validators=[ - # 允许为空(添加时) - Optional(), # 允许为空(添加时) - NumberRange(min=1, message='城市ID必须大于0') - ], - description='城市唯一标识,更新时必填,添加时自动生成' - ) - - # ============================================================ - # 城市区号 - # ============================================================ - cityCode = StringField( - label='城市区号', - validators=[ - DataRequired(message='城市区号不能为空'), - Length(max=6, message='城市区号长度不得超过6个字符') - ], - description='电话区号,如:010、021' - ) - - # ============================================================ - # 行政编码 - # ============================================================ - areaCode = StringField( - label='行政编码', - validators=[ - DataRequired(message='行政编码不能为空'), - Length(max=20, message='行政编码长度不得超过20个字符') - ], - description='国家行政区域编码' - ) - - # ============================================================ - # 上级编码 - # ============================================================ - parentCode = StringField( - label='上级编码', - validators=[ - DataRequired(message='上级编码不能为空'), - Length(max=20, message='上级编码长度不得超过20个字符') - ], - description='国家行政区域上级编码' - ) - - # ============================================================ - # 城市邮编 - # ============================================================ - zipCode = StringField( - label='城市邮编', - validators=[ - DataRequired(message='城市邮编不能为空'), - Length(max=6, message='城市邮编长度不得超过6个字符') - ], - description='邮政编码' - ) - - # ============================================================ - # 城市级别 - # ============================================================ - level = IntegerField( - label='城市级别', - validators=[ - DataRequired(message='城市级别不能为空'), - NumberRange(min=1, max=4, message='城市级别值在1~4之间') - ], - description='城市级别:1-省份,2-城市,3-县区,4-街道' - ) - - # ============================================================ - # 城市名称 - # ============================================================ - name = StringField( - label='城市名称', - validators=[ - DataRequired(message='城市名称不能为空'), - Length(max=150, message='城市名称长度不得超过150个字符') - ], - description='城市显示名称,如:北京市、上海市' - ) - - # ============================================================ - # 城市简称 - # ============================================================ - shortName = StringField( - label='城市简称', - validators=[ - DataRequired(message='城市简称不能为空'), - Length(max=150, message='城市简称长度不得超过150个字符') - ], - description='城市简称,如:京、沪' - ) - - # ============================================================ - # 上级ID - # ============================================================ - pid = IntegerField( - label='上级ID', - validators=[ - # 可选字段,用于树形结构 - ], - description='上级城市ID,用于构建城市层级关系' - ) - - # ============================================================ - # 城市经度 - # ============================================================ - lng = StringField( - label='城市经度', - validators=[ - DataRequired(message='城市经度不能为空'), - Length(max=150, message='城市经度长度不得超过150个字符') - ], - description='地理经度坐标' - ) - - # ============================================================ - # 城市纬度 - # ============================================================ - lat = StringField( - label='城市纬度', - validators=[ - DataRequired(message='城市纬度不能为空'), - Length(max=150, message='城市纬度长度不得超过150个字符') - ], - description='地理纬度坐标' - ) +from src.modules.city.schema import * # noqa: F401,F403 diff --git a/application/forms/config.py b/application/forms/config.py index c4ff726..351a298 100644 --- a/application/forms/config.py +++ b/application/forms/config.py @@ -1,206 +1,8 @@ -# +====================================================================== -# | DjangoAdmin 企业数字化开发平台 [ 赋能开发者,助力企业发展 ] -# +---------------------------------------------------------------------- -# | Copyright (c) 2021-2026 一米阳光团队 版权所有 -# +---------------------------------------------------------------------- -# | 开源协议: Apache-2.0 -# | 重要声明: 未经书面许可,不得移除或修改本框架相关版权标识。 -# +---------------------------------------------------------------------- -# | 官方网站: https://www.djangoadmin.cn -# +---------------------------------------------------------------------- -# | 研发团队: 一米阳光团队 荣誉出品 -# +====================================================================== -# | 版权和免责声明: -# | 一、知识产权声明 -# | 本团队对该软件框架产品(以下简称“本产品”)拥有完整知识产权,包括但不限于商标权、专利权、 -# | 著作权、商业秘密等。前述权利均受中华人民共和国及相关国际法律法规保护。未经本团队书面授权, -# | 任何个人或单位不得基于本产品本身申请任何形式的知识产权。 -# | 二、使用限制与禁止条款 -# | 您理解并同意,禁止将本产品用于以下任何行为: -# | 1. 任何违反中华人民共和国法律法规的用途; -# | 2. 任何侵害他人合法权益(包括但不限于人身权、财产权、知识产权等)的行为; -# | 3. 任何危害国家安全、公共利益及社会道德风尚的行为。 -# | 三、责任豁免 -# | 因使用本产品而产生的任何损失或法律纠纷(包括但不限于直接损失、间接损失、附带损失、衍生损失 -# | 以及因违约、侵权等引发的责任),本团队均不承担任何法律责任。若因违规使用本产品导致任何第三 -# | 方提起索赔或行政机关进行调查,您应独立承担全部责任。 -# | 四、违约与法律责任 -# | 如发现任何违反本声明的行为,本团队有权: -# | 1. 无条件配合公安机关及其他有权机关的调查取证工作; -# | 2. 依法追究相关方的民事责任,并要求赔偿全部损失; -# | 3. 保留进一步采取刑事控告等法律措施的权利。 -# | 五、许可范围说明 -# | 1、被授权方应视本产品源代码为核心机密信息,负有最高标准的保密与保管义务。禁止以任何形式(包 -# | 括但不限于直接或间接的分享、复制、传播、分发、转售、出租、开源、反向工程、反编译、反汇编或通 -# | 过网络服务提供给任何第三方)泄露、披露或处置源代码的全部或部分内容。任何未经授权的复制、使用、 -# | 传播行为均构成对本团队知识产权的严重侵权,本团队有权依法追究其全部法律责任,并要求赔偿因此造 -# | 成的一切经济损失及商誉损害。 -# | 2、本产品仅限于公司或个人在法律允许范围内,用于内部且合规的软件产品研发。具体权利义务以《软件 -# | 许可协议》附件为准。 -# +====================================================================== - """ -配置表单验证模块 +兼容 shim(绞杀者迁移期间保留) ============================================================= -提供配置相关的表单验证功能,包括: -- 配置添加/更新表单验证 -- 配置名称唯一性验证 -- 配置编码唯一性验证 - -命名规范: -- 类名使用驼峰命名(如 ConfigForm) -- 字段名使用下划线命名(如 name, code, sort) -- 验证方法使用 validate_字段名 格式 +表单已迁移至 src.modules.configuration.schema。 +本文件仅作兼容转发,最终在 P7(切尾)阶段删除。 """ - -from wtforms import IntegerField, StringField -from wtforms.validators import NumberRange, DataRequired, Length, ValidationError, Optional - -from application.forms.base_form import BaseForm -from application.models.config import Config - - -# ============================================================ -# 配置表单验证(添加和更新共用) -# ============================================================ - -class ConfigForm(BaseForm): - """ - 配置表单验证类 - - 用于添加和更新配置时的数据验证。 - 添加时 id 为 None,更新时 id 必须有值。 - - Attributes: - id: 配置ID(更新时必填,添加时可选) - name: 配置名称(必填,最长100字符,不可重复) - code: 配置编码(必填,最长100字符,不可重复) - sort: 配置排序(必填,0-99999之间的整数) - note: 配置备注(可选,最长255字符) - """ - - # ============================================================ - # 配置ID - # ============================================================ - id = IntegerField( - label='配置ID', - validators=[ - Optional(), # 允许为空(添加时) - NumberRange(min=1, message='配置ID必须大于0') - ], - description='配置唯一标识,更新时必填,添加时自动生成' - ) - - # ============================================================ - # 配置名称 - # ============================================================ - name = StringField( - label='配置名称', - validators=[ - DataRequired(message='配置名称不能为空'), - Length(max=100, message='配置名称长度不得超过100个字符') - ], - description='配置显示名称' - ) - - # ============================================================ - # 配置编码 - # ============================================================ - code = StringField( - label='配置编码', - validators=[ - DataRequired(message='配置编码不能为空'), - Length(max=100, message='配置编码长度不得超过100个字符') - ], - description='配置唯一标识编码,用于程序调用' - ) - - # ============================================================ - # 配置排序 - # ============================================================ - sort = IntegerField( - label='配置排序', - validators=[ - Optional(), - NumberRange(min=0, max=99999, message='配置排序值在0~99999之间') - ], - description='排序值,数值越小越靠前' - ) - - # ============================================================ - # 配置备注 - # ============================================================ - note = StringField( - label='配置备注', - validators=[ - Length(max=255, message='配置备注长度不得超过255个字符') - ], - description='配置补充说明' - ) - - # ============================================================ - # 自定义验证方法 - # ============================================================ - - def validate_name(self, field): - """ - 自定义验证:配置名称不能重复 - - 验证逻辑: - 1. 添加时:检查数据库中是否存在同名记录 - 2. 更新时:排除当前记录自身,检查其他记录是否同名 - - Args: - field: name 字段对象 - - Raises: - ValidationError: 配置名称已存在时抛出验证错误 - """ - if not field.data: - return - - # 获取当前记录的ID(更新时存在,添加时为None) - current_id = self.id.data if self.id.data else None - - # 构建查询:查找同名记录 - query = Config.query.filter(Config.name == field.data, Config.is_delete == 0) - - # 如果是更新操作,排除当前记录自身 - if current_id: - query = query.filter(Config.id != current_id) - - # 如果存在同名记录,抛出验证错误 - if query.first(): - raise ValidationError("配置名称已存在") - - def validate_code(self, field): - """ - 自定义验证:配置编码不能重复 - - 验证逻辑: - 1. 添加时:检查数据库中是否存在相同编码的记录 - 2. 更新时:排除当前记录自身,检查其他记录是否编码相同 - - Args: - field: code 字段对象 - - Raises: - ValidationError: 配置编码已存在时抛出验证错误 - """ - if not field.data: - return - - # 获取当前记录的ID(更新时存在,添加时为None) - current_id = self.id.data if self.id.data else None - - # 构建查询:查找相同编码的记录 - query = Config.query.filter(Config.code == field.data, Config.is_delete == 0) - - # 如果是更新操作,排除当前记录自身 - if current_id: - query = query.filter(Config.id != current_id) - - # 如果存在相同编码的记录,抛出验证错误 - if query.first(): - raise ValidationError("配置编码已存在") +from src.modules.configuration.schema import * # noqa: F401,F403 diff --git a/application/forms/config_item.py b/application/forms/config_item.py index 26b3c7f..351a298 100644 --- a/application/forms/config_item.py +++ b/application/forms/config_item.py @@ -1,283 +1,8 @@ -# +====================================================================== -# | DjangoAdmin 企业数字化开发平台 [ 赋能开发者,助力企业发展 ] -# +---------------------------------------------------------------------- -# | Copyright (c) 2021-2026 一米阳光团队 版权所有 -# +---------------------------------------------------------------------- -# | 开源协议: Apache-2.0 -# | 重要声明: 未经书面许可,不得移除或修改本框架相关版权标识。 -# +---------------------------------------------------------------------- -# | 官方网站: https://www.djangoadmin.cn -# +---------------------------------------------------------------------- -# | 研发团队: 一米阳光团队 荣誉出品 -# +====================================================================== -# | 版权和免责声明: -# | 一、知识产权声明 -# | 本团队对该软件框架产品(以下简称“本产品”)拥有完整知识产权,包括但不限于商标权、专利权、 -# | 著作权、商业秘密等。前述权利均受中华人民共和国及相关国际法律法规保护。未经本团队书面授权, -# | 任何个人或单位不得基于本产品本身申请任何形式的知识产权。 -# | 二、使用限制与禁止条款 -# | 您理解并同意,禁止将本产品用于以下任何行为: -# | 1. 任何违反中华人民共和国法律法规的用途; -# | 2. 任何侵害他人合法权益(包括但不限于人身权、财产权、知识产权等)的行为; -# | 3. 任何危害国家安全、公共利益及社会道德风尚的行为。 -# | 三、责任豁免 -# | 因使用本产品而产生的任何损失或法律纠纷(包括但不限于直接损失、间接损失、附带损失、衍生损失 -# | 以及因违约、侵权等引发的责任),本团队均不承担任何法律责任。若因违规使用本产品导致任何第三 -# | 方提起索赔或行政机关进行调查,您应独立承担全部责任。 -# | 四、违约与法律责任 -# | 如发现任何违反本声明的行为,本团队有权: -# | 1. 无条件配合公安机关及其他有权机关的调查取证工作; -# | 2. 依法追究相关方的民事责任,并要求赔偿全部损失; -# | 3. 保留进一步采取刑事控告等法律措施的权利。 -# | 五、许可范围说明 -# | 1、被授权方应视本产品源代码为核心机密信息,负有最高标准的保密与保管义务。禁止以任何形式(包 -# | 括但不限于直接或间接的分享、复制、传播、分发、转售、出租、开源、反向工程、反编译、反汇编或通 -# | 过网络服务提供给任何第三方)泄露、披露或处置源代码的全部或部分内容。任何未经授权的复制、使用、 -# | 传播行为均构成对本团队知识产权的严重侵权,本团队有权依法追究其全部法律责任,并要求赔偿因此造 -# | 成的一切经济损失及商誉损害。 -# | 2、本产品仅限于公司或个人在法律允许范围内,用于内部且合规的软件产品研发。具体权利义务以《软件 -# | 许可协议》附件为准。 -# +====================================================================== - """ -配置项表单验证模块 +兼容 shim(绞杀者迁移期间保留) ============================================================= -提供配置项相关的表单验证功能,包括: -- 配置项添加/更新表单验证 -- 配置项状态设置表单验证 +表单已迁移至 src.modules.configuration.schema。 +本文件仅作兼容转发,最终在 P7(切尾)阶段删除。 """ - -from wtforms import ValidationError, IntegerField, StringField -from wtforms.validators import NumberRange, DataRequired, Length, Optional - -from application.forms.base_form import BaseForm -from application.models.config_item import ConfigItem - - -# ============================================================ -# 配置项表单验证(添加和更新共用) -# ============================================================ - -class ConfigItemForm(BaseForm): - """ - 配置项表单验证类 - - 用于添加和更新配置项时的数据验证。 - 添加时 id 为 None,更新时 id 必须有值。 - - Attributes: - id: 配置项ID(更新时必填,添加时可选) - configId: 配置ID(必填,不得小于0) - name: 配置项名称(必填,最长100字符,不可重复) - code: 配置项编码(必填,最长100字符,不可重复) - value: 配置项值(必填,最长1000字符) - options: 配置选项(可选,最长1000字符) - type: 配置类型(必填,最长100字符) - sort: 配置项排序(必填,0-99999之间的整数) - note: 配置项备注(可选,最长255字符) - """ - - # ============================================================ - # 配置项ID - # ============================================================ - id = IntegerField( - label='配置项ID', - validators=[ - Optional(), # 允许为空(添加时) - NumberRange(min=1, message='配置项ID必须大于0') - ], - description='配置项唯一标识,更新时必填,添加时自动生成' - ) - - # ============================================================ - # 配置ID - # ============================================================ - configId = IntegerField( - label='配置ID', - validators=[ - DataRequired(message='配置ID不能为空'), - NumberRange(min=0, message='配置ID不得小于0') - ], - description='配置ID' - ) - - # ============================================================ - # 配置项名称 - # ============================================================ - name = StringField( - label='配置项名称', - validators=[ - DataRequired(message='配置项名称不能为空'), - Length(max=100, message='配置项名称长度不得超过100个字符') - ], - description='配置项显示标题' - ) - - # ============================================================ - # 配置项编码 - # ============================================================ - code = StringField( - label='配置项编码', - validators=[ - DataRequired(message='配置项编码不能为空'), - Length(max=100, message='配置项编码长度不得超过100个字符') - ], - description='配置项唯一标识编码' - ) - - # ============================================================ - # 配置项值 - # ============================================================ - value = StringField( - label='配置项值', - validators=[ - DataRequired(message='配置项值不能为空'), - Length(max=1000, message='配置项值长度不得超过1000个字符') - ], - description='配置项存储值' - ) - - # ============================================================ - # 配置选项 - # ============================================================ - options = StringField( - label='配置选项', - validators=[ - Length(max=1000, message='配置选项长度不得超过1000个字符') - ], - description='配置项可选值列表,用于下拉选择等场景' - ) - - # ============================================================ - # 配置类型 - # ============================================================ - type = StringField( - label='配置类型', - validators=[ - DataRequired(message='配置类型不能为空'), - Length(max=100, message='配置类型长度不得超过100个字符') - ], - description='配置项数据类型,如:text、number、select等' - ) - - # ============================================================ - # 配置项排序 - # ============================================================ - sort = IntegerField( - label='配置项排序', - validators=[ - Optional(), - NumberRange(min=0, max=99999, message='配置项排序值在0~99999之间') - ], - description='排序值,数值越小越靠前' - ) - - # ============================================================ - # 配置项备注 - # ============================================================ - note = StringField( - label='配置项备注', - validators=[ - Length(max=255, message='配置项备注长度不得超过255个字符') - ], - description='配置项补充说明' - ) - - # ============================================================ - # 自定义验证方法 - # ============================================================ - - def validate_name(self, field): - """ - 自定义验证:配置项名称不能重复 - - 验证逻辑: - 1. 添加时:检查数据库中是否存在同名记录 - 2. 更新时:排除当前记录自身,检查其他记录是否同名 - - Args: - field: name 字段对象 - - Raises: - ValidationError: 配置项名称已存在时抛出验证错误 - """ - if not field.data: - return - - current_id = self.id.data if self.id.data else None - - query = ConfigItem.query.filter(ConfigItem.name == field.data, ConfigItem.is_delete == 0) - - if current_id: - query = query.filter(ConfigItem.id != current_id) - - if query.first(): - raise ValidationError("配置项名称已存在") - - def validate_code(self, field): - """ - 自定义验证:配置项编码不能重复 - - 验证逻辑: - 1. 添加时:检查数据库中是否存在相同编码记录 - 2. 更新时:排除当前记录自身,检查其他记录是否相同编码 - - Args: - field: code 字段对象 - - Raises: - ValidationError: 配置项编码已存在时抛出验证错误 - """ - if not field.data: - return - - current_id = self.id.data if self.id.data else None - - query = ConfigItem.query.filter(ConfigItem.code == field.data, ConfigItem.is_delete == 0) - - if current_id: - query = query.filter(ConfigItem.id != current_id) - - if query.first(): - raise ValidationError("配置项编码已存在") - - -# ============================================================ -# 状态设置表单 -# ============================================================ - -class ConfigItemStatusForm(BaseForm): - """ - 配置项状态设置表单验证类 - - 用于单独修改配置项状态时的数据验证。 - - Attributes: - id: 配置项ID(必填,必须大于0) - status: 配置项状态(必填,1-在用,2-停用) - """ - - # ============================================================ - # 配置项ID - # ============================================================ - id = IntegerField( - label='配置项ID', - validators=[ - DataRequired(message='配置项ID不能为空'), - NumberRange(min=1, message='配置项ID必须大于0') - ], - description='要修改状态的配置项ID' - ) - - # ============================================================ - # 配置项状态 - # ============================================================ - status = IntegerField( - label='配置项状态', - validators=[ - DataRequired(message='配置项状态不能为空'), - NumberRange(min=1, max=2, message='配置项状态值在1~2之间') - ], - description='目标状态:1-在用,2-停用' - ) +from src.modules.configuration.schema import * # noqa: F401,F403 diff --git a/application/forms/dept.py b/application/forms/dept.py index 8348f80..4f58cab 100644 --- a/application/forms/dept.py +++ b/application/forms/dept.py @@ -1,181 +1,8 @@ -# +====================================================================== -# | DjangoAdmin 企业数字化开发平台 [ 赋能开发者,助力企业发展 ] -# +---------------------------------------------------------------------- -# | Copyright (c) 2021-2026 一米阳光团队 版权所有 -# +---------------------------------------------------------------------- -# | 开源协议: Apache-2.0 -# | 重要声明: 未经书面许可,不得移除或修改本框架相关版权标识。 -# +---------------------------------------------------------------------- -# | 官方网站: https://www.djangoadmin.cn -# +---------------------------------------------------------------------- -# | 研发团队: 一米阳光团队 荣誉出品 -# +====================================================================== -# | 版权和免责声明: -# | 一、知识产权声明 -# | 本团队对该软件框架产品(以下简称“本产品”)拥有完整知识产权,包括但不限于商标权、专利权、 -# | 著作权、商业秘密等。前述权利均受中华人民共和国及相关国际法律法规保护。未经本团队书面授权, -# | 任何个人或单位不得基于本产品本身申请任何形式的知识产权。 -# | 二、使用限制与禁止条款 -# | 您理解并同意,禁止将本产品用于以下任何行为: -# | 1. 任何违反中华人民共和国法律法规的用途; -# | 2. 任何侵害他人合法权益(包括但不限于人身权、财产权、知识产权等)的行为; -# | 3. 任何危害国家安全、公共利益及社会道德风尚的行为。 -# | 三、责任豁免 -# | 因使用本产品而产生的任何损失或法律纠纷(包括但不限于直接损失、间接损失、附带损失、衍生损失 -# | 以及因违约、侵权等引发的责任),本团队均不承担任何法律责任。若因违规使用本产品导致任何第三 -# | 方提起索赔或行政机关进行调查,您应独立承担全部责任。 -# | 四、违约与法律责任 -# | 如发现任何违反本声明的行为,本团队有权: -# | 1. 无条件配合公安机关及其他有权机关的调查取证工作; -# | 2. 依法追究相关方的民事责任,并要求赔偿全部损失; -# | 3. 保留进一步采取刑事控告等法律措施的权利。 -# | 五、许可范围说明 -# | 1、被授权方应视本产品源代码为核心机密信息,负有最高标准的保密与保管义务。禁止以任何形式(包 -# | 括但不限于直接或间接的分享、复制、传播、分发、转售、出租、开源、反向工程、反编译、反汇编或通 -# | 过网络服务提供给任何第三方)泄露、披露或处置源代码的全部或部分内容。任何未经授权的复制、使用、 -# | 传播行为均构成对本团队知识产权的严重侵权,本团队有权依法追究其全部法律责任,并要求赔偿因此造 -# | 成的一切经济损失及商誉损害。 -# | 2、本产品仅限于公司或个人在法律允许范围内,用于内部且合规的软件产品研发。具体权利义务以《软件 -# | 许可协议》附件为准。 -# +====================================================================== - """ -部门表单验证模块 +兼容 shim(绞杀者迁移期间保留) ============================================================= -提供部门相关的表单验证功能,包括: -- 部门添加/更新表单验证 +表单已迁移至 src.modules.system.dept.schema。 +本文件仅作兼容转发,最终在 P7(切尾)阶段删除。 """ - -from wtforms import ValidationError, IntegerField, StringField -from wtforms.validators import NumberRange, DataRequired, Length, Optional - -from application.forms.base_form import BaseForm -from application.models.dept import Dept - - -# ============================================================ -# 部门表单验证(添加和更新共用) -# ============================================================ - -class DeptForm(BaseForm): - """ - 部门表单验证类 - - 用于添加和更新部门时的数据验证。 - 添加时 id 为 None,更新时 id 必须有值。 - - Attributes: - id: 部门ID(更新时必填,添加时可选) - name: 部门名称(必填,最长150字符,不可重复) - code: 部门编码(必填,最长150字符,不可重复) - type: 部门类型(必填,1-公司,2-子公司,3-部门,4-小组) - parentId: 上级ID(可选,不得小于0) - sort: 部门排序(必填,0-99999之间的整数) - note: 部门备注(可选,最长255字符) - """ - - # ============================================================ - # 部门ID - # ============================================================ - id = IntegerField( - label='部门ID', - validators=[ - Optional(), # 允许为空(添加时) - NumberRange(min=1, message='部门ID必须大于0') - ], - description='部门唯一标识,更新时必填,添加时自动生成' - ) - - # ============================================================ - # 部门名称 - # ============================================================ - name = StringField( - label='部门名称', - validators=[ - DataRequired(message='部门名称不能为空'), - Length(max=150, message='部门名称长度不得超过150个字符') - ], - description='部门显示名称,如:技术部、市场部' - ) - - # ============================================================ - # 部门类型 - # ============================================================ - type = IntegerField( - label='部门类型', - validators=[ - DataRequired(message='部门类型不能为空'), - NumberRange(min=1, max=4, message='部门类型值在1~4之间') - ], - description='部门类型:1-公司,2-子公司,3-部门,4-小组' - ) - - # ============================================================ - # 上级ID - # ============================================================ - parentId = IntegerField( - label='上级ID', - validators=[ - NumberRange(min=0, message='上级ID不得小于0') - ], - description='上级部门ID,0表示顶级部门' - ) - - # ============================================================ - # 部门排序 - # ============================================================ - sort = IntegerField( - label='部门排序', - validators=[ - Optional(), - NumberRange(min=0, max=99999, message='部门排序值在0~99999之间') - ], - description='排序值,数值越小越靠前' - ) - - # ============================================================ - # 部门备注 - # ============================================================ - note = StringField( - label='部门备注', - validators=[ - Length(max=255, message='部门备注长度不得超过255个字符') - ], - description='部门补充说明' - ) - - # ============================================================ - # 自定义验证方法 - # ============================================================ - - def validate_name(self, field): - """ - 自定义验证:部门名称不能重复 - - 验证逻辑: - 1. 添加时:检查数据库中是否存在同名记录 - 2. 更新时:排除当前记录自身,检查其他记录是否同名 - - Args: - field: name 字段对象 - - Raises: - ValidationError: 部门名称已存在时抛出验证错误 - """ - if not field.data: - return - - # 获取当前记录的ID(更新时存在,添加时为None) - current_id = self.id.data if self.id.data else None - - # 构建查询:查找同名记录 - query = Dept.query.filter(Dept.name == field.data, Dept.is_delete == 0) - - # 如果是更新操作,排除当前记录自身 - if current_id: - query = query.filter(Dept.id != current_id) - - # 如果存在同名记录,抛出验证错误 - if query.first(): - raise ValidationError("部门名称已存在") +from src.modules.system.dept.schema import * # noqa: F401,F403 diff --git a/application/forms/dict.py b/application/forms/dict.py index cf5f5ca..14838e4 100644 --- a/application/forms/dict.py +++ b/application/forms/dict.py @@ -1,199 +1,8 @@ -# +====================================================================== -# | DjangoAdmin 企业数字化开发平台 [ 赋能开发者,助力企业发展 ] -# +---------------------------------------------------------------------- -# | Copyright (c) 2021-2026 一米阳光团队 版权所有 -# +---------------------------------------------------------------------- -# | 开源协议: Apache-2.0 -# | 重要声明: 未经书面许可,不得移除或修改本框架相关版权标识。 -# +---------------------------------------------------------------------- -# | 官方网站: https://www.djangoadmin.cn -# +---------------------------------------------------------------------- -# | 研发团队: 一米阳光团队 荣誉出品 -# +====================================================================== -# | 版权和免责声明: -# | 一、知识产权声明 -# | 本团队对该软件框架产品(以下简称“本产品”)拥有完整知识产权,包括但不限于商标权、专利权、 -# | 著作权、商业秘密等。前述权利均受中华人民共和国及相关国际法律法规保护。未经本团队书面授权, -# | 任何个人或单位不得基于本产品本身申请任何形式的知识产权。 -# | 二、使用限制与禁止条款 -# | 您理解并同意,禁止将本产品用于以下任何行为: -# | 1. 任何违反中华人民共和国法律法规的用途; -# | 2. 任何侵害他人合法权益(包括但不限于人身权、财产权、知识产权等)的行为; -# | 3. 任何危害国家安全、公共利益及社会道德风尚的行为。 -# | 三、责任豁免 -# | 因使用本产品而产生的任何损失或法律纠纷(包括但不限于直接损失、间接损失、附带损失、衍生损失 -# | 以及因违约、侵权等引发的责任),本团队均不承担任何法律责任。若因违规使用本产品导致任何第三 -# | 方提起索赔或行政机关进行调查,您应独立承担全部责任。 -# | 四、违约与法律责任 -# | 如发现任何违反本声明的行为,本团队有权: -# | 1. 无条件配合公安机关及其他有权机关的调查取证工作; -# | 2. 依法追究相关方的民事责任,并要求赔偿全部损失; -# | 3. 保留进一步采取刑事控告等法律措施的权利。 -# | 五、许可范围说明 -# | 1、被授权方应视本产品源代码为核心机密信息,负有最高标准的保密与保管义务。禁止以任何形式(包 -# | 括但不限于直接或间接的分享、复制、传播、分发、转售、出租、开源、反向工程、反编译、反汇编或通 -# | 过网络服务提供给任何第三方)泄露、披露或处置源代码的全部或部分内容。任何未经授权的复制、使用、 -# | 传播行为均构成对本团队知识产权的严重侵权,本团队有权依法追究其全部法律责任,并要求赔偿因此造 -# | 成的一切经济损失及商誉损害。 -# | 2、本产品仅限于公司或个人在法律允许范围内,用于内部且合规的软件产品研发。具体权利义务以《软件 -# | 许可协议》附件为准。 -# +====================================================================== - """ -字典表单验证模块 +兼容 shim(绞杀者迁移期间保留) ============================================================= -提供字典相关的表单验证功能,包括: -- 字典添加/更新表单验证 +表单已迁移至 src.modules.dictionary.schema。 +本文件仅作兼容转发,最终在 P7(切尾)阶段删除。 """ - -from wtforms import ValidationError, IntegerField, StringField -from wtforms.validators import NumberRange, DataRequired, Length, Optional - -from application.forms.base_form import BaseForm -from application.models.dict import Dict - - -# ============================================================ -# 字典表单验证(添加和更新共用) -# ============================================================ - -class DictForm(BaseForm): - """ - 字典表单验证类 - - 用于添加和更新字典时的数据验证。 - 添加时 id 为 None,更新时 id 必须有值。 - - Attributes: - id: 字典ID(更新时必填,添加时可选) - name: 字典名称(必填,最长150字符,不可重复) - code: 字典编码(必填,最长150字符,不可重复) - sort: 字典排序(必填,0-99999之间的整数) - note: 字典备注(可选,最长255字符) - """ - - # ============================================================ - # 字典ID - # ============================================================ - id = IntegerField( - label='字典ID', - validators=[ - Optional(), # 允许为空(添加时) - NumberRange(min=1, message='字典ID必须大于0') - ], - description='字典唯一标识,更新时必填,添加时自动生成' - ) - - # ============================================================ - # 字典名称 - # ============================================================ - name = StringField( - label='字典名称', - validators=[ - DataRequired(message='字典名称不能为空'), - Length(max=150, message='字典名称长度不得超过150个字符') - ], - description='字典显示名称,如:性别、状态' - ) - - # ============================================================ - # 字典编码 - # ============================================================ - code = StringField( - label='字典编码', - validators=[ - DataRequired(message='字典编码不能为空'), - Length(max=150, message='字典编码长度不得超过150个字符') - ], - description='字典唯一标识编码,如:gender、status' - ) - - # ============================================================ - # 字典排序 - # ============================================================ - sort = IntegerField( - label='字典排序', - validators=[ - Optional(), - NumberRange(min=0, max=99999, message='字典排序值在0~99999之间') - ], - description='排序值,数值越小越靠前' - ) - - # ============================================================ - # 字典备注 - # ============================================================ - note = StringField( - label='字典备注', - validators=[ - Length(max=255, message='字典备注长度不得超过255个字符') - ], - description='字典补充说明' - ) - - # ============================================================ - # 自定义验证方法 - # ============================================================ - - def validate_name(self, field): - """ - 自定义验证:字典名称不能重复 - - 验证逻辑: - 1. 添加时:检查数据库中是否存在同名记录 - 2. 更新时:排除当前记录自身,检查其他记录是否同名 - - Args: - field: name 字段对象 - - Raises: - ValidationError: 字典名称已存在时抛出验证错误 - """ - if not field.data: - return - - # 获取当前记录的ID(更新时存在,添加时为None) - current_id = self.id.data if self.id.data else None - - # 构建查询:查找同名记录 - query = Dict.query.filter(Dict.name == field.data, Dict.is_delete == 0) - - # 如果是更新操作,排除当前记录自身 - if current_id: - query = query.filter(Dict.id != current_id) - - # 如果存在同名记录,抛出验证错误 - if query.first(): - raise ValidationError("字典名称已存在") - - def validate_code(self, field): - """ - 自定义验证:字典编码不能重复 - - 验证逻辑: - 1. 添加时:检查数据库中是否存在相同编码记录 - 2. 更新时:排除当前记录自身,检查其他记录是否相同编码 - - Args: - field: code 字段对象 - - Raises: - ValidationError: 字典编码已存在时抛出验证错误 - """ - if not field.data: - return - - # 获取当前记录的ID(更新时存在,添加时为None) - current_id = self.id.data if self.id.data else None - - # 构建查询:查找相同编码记录 - query = Dict.query.filter(Dict.code == field.data, Dict.is_delete == 0) - - # 如果是更新操作,排除当前记录自身 - if current_id: - query = query.filter(Dict.id != current_id) - - # 如果存在相同编码记录,抛出验证错误 - if query.first(): - raise ValidationError("字典编码已存在") +from src.modules.dictionary.schema import * # noqa: F401,F403 diff --git a/application/forms/dict_item.py b/application/forms/dict_item.py index d94e48b..14838e4 100644 --- a/application/forms/dict_item.py +++ b/application/forms/dict_item.py @@ -1,222 +1,8 @@ -# +====================================================================== -# | DjangoAdmin 企业数字化开发平台 [ 赋能开发者,助力企业发展 ] -# +---------------------------------------------------------------------- -# | Copyright (c) 2021-2026 一米阳光团队 版权所有 -# +---------------------------------------------------------------------- -# | 开源协议: Apache-2.0 -# | 重要声明: 未经书面许可,不得移除或修改本框架相关版权标识。 -# +---------------------------------------------------------------------- -# | 官方网站: https://www.djangoadmin.cn -# +---------------------------------------------------------------------- -# | 研发团队: 一米阳光团队 荣誉出品 -# +====================================================================== -# | 版权和免责声明: -# | 一、知识产权声明 -# | 本团队对该软件框架产品(以下简称“本产品”)拥有完整知识产权,包括但不限于商标权、专利权、 -# | 著作权、商业秘密等。前述权利均受中华人民共和国及相关国际法律法规保护。未经本团队书面授权, -# | 任何个人或单位不得基于本产品本身申请任何形式的知识产权。 -# | 二、使用限制与禁止条款 -# | 您理解并同意,禁止将本产品用于以下任何行为: -# | 1. 任何违反中华人民共和国法律法规的用途; -# | 2. 任何侵害他人合法权益(包括但不限于人身权、财产权、知识产权等)的行为; -# | 3. 任何危害国家安全、公共利益及社会道德风尚的行为。 -# | 三、责任豁免 -# | 因使用本产品而产生的任何损失或法律纠纷(包括但不限于直接损失、间接损失、附带损失、衍生损失 -# | 以及因违约、侵权等引发的责任),本团队均不承担任何法律责任。若因违规使用本产品导致任何第三 -# | 方提起索赔或行政机关进行调查,您应独立承担全部责任。 -# | 四、违约与法律责任 -# | 如发现任何违反本声明的行为,本团队有权: -# | 1. 无条件配合公安机关及其他有权机关的调查取证工作; -# | 2. 依法追究相关方的民事责任,并要求赔偿全部损失; -# | 3. 保留进一步采取刑事控告等法律措施的权利。 -# | 五、许可范围说明 -# | 1、被授权方应视本产品源代码为核心机密信息,负有最高标准的保密与保管义务。禁止以任何形式(包 -# | 括但不限于直接或间接的分享、复制、传播、分发、转售、出租、开源、反向工程、反编译、反汇编或通 -# | 过网络服务提供给任何第三方)泄露、披露或处置源代码的全部或部分内容。任何未经授权的复制、使用、 -# | 传播行为均构成对本团队知识产权的严重侵权,本团队有权依法追究其全部法律责任,并要求赔偿因此造 -# | 成的一切经济损失及商誉损害。 -# | 2、本产品仅限于公司或个人在法律允许范围内,用于内部且合规的软件产品研发。具体权利义务以《软件 -# | 许可协议》附件为准。 -# +====================================================================== - """ -字典项表单验证模块 +兼容 shim(绞杀者迁移期间保留) ============================================================= -提供字典项相关的表单验证功能,包括: -- 字典项添加/更新表单验证 +表单已迁移至 src.modules.dictionary.schema。 +本文件仅作兼容转发,最终在 P7(切尾)阶段删除。 """ - -from wtforms import ValidationError, IntegerField, StringField -from wtforms.validators import NumberRange, DataRequired, Length, Optional - -from application.forms.base_form import BaseForm -from application.models.dict_item import DictItem - - -# ============================================================ -# 字典项表单验证(添加和更新共用) -# ============================================================ - -class DictItemForm(BaseForm): - """ - 字典项表单验证类 - - 用于添加和更新字典项时的数据验证。 - 添加时 id 为 None,更新时 id 必须有值。 - - Attributes: - id: 字典项ID(更新时必填,添加时可选) - name: 字典项名称(必填,最长150字符,不可重复) - value: 字典项值(必填,最长150字符) - dictId: 字典ID(必填,不得小于0) - note: 字典项备注(可选,最长255字符) - sort: 字典项排序(必填,0-99999之间的整数) - """ - - # ============================================================ - # 字典项ID - # ============================================================ - id = IntegerField( - label='字典项ID', - validators=[ - Optional(), # 允许为空(添加时) - NumberRange(min=1, message='字典项ID必须大于0') - ], - description='字典项唯一标识,更新时必填,添加时自动生成' - ) - - # ============================================================ - # 字典项名称 - # ============================================================ - name = StringField( - label='字典项名称', - validators=[ - DataRequired(message='字典项名称不能为空'), - Length(max=150, message='字典项名称长度不得超过150个字符') - ], - description='字典项显示名称,如:男、女' - ) - - # ============================================================ - # 字典项值 - # ============================================================ - value = StringField( - label='字典项值', - validators=[ - DataRequired(message='字典项值不能为空'), - Length(max=150, message='字典项值长度不得超过150个字符') - ], - description='字典项实际存储值,如:1、2' - ) - - # ============================================================ - # 字典ID - # ============================================================ - dictId = IntegerField( - label='字典ID', - validators=[ - DataRequired(message='字典ID不能为空'), - NumberRange(min=0, message='字典ID值不得小于0') - ], - description='所属字典分组ID' - ) - - # ============================================================ - # 字典项备注 - # ============================================================ - note = StringField( - label='字典项备注', - validators=[ - Length(max=255, message='字典项备注长度不得超过255个字符') - ], - description='字典项补充说明' - ) - - # ============================================================ - # 字典项排序 - # ============================================================ - sort = IntegerField( - label='字典项排序', - validators=[ - Optional(), - NumberRange(min=0, max=99999, message='字典项排序值在0~99999之间') - ], - description='排序值,数值越小越靠前' - ) - - # ============================================================ - # 自定义验证方法 - # ============================================================ - - def validate_name(self, field): - """ - 自定义验证:字典项名称不能重复 - - 验证逻辑: - 1. 添加时:检查数据库中是否存在同名记录 - 2. 更新时:排除当前记录自身,检查其他记录是否同名 - - Args: - field: name 字段对象 - - Raises: - ValidationError: 字典项名称已存在时抛出验证错误 - """ - if not field.data: - return - - # 获取当前记录的ID(更新时存在,添加时为None) - current_id = self.id.data if self.id.data else None - - # 构建查询:查找同名记录 - query = DictItem.query.filter(DictItem.name == field.data, DictItem.is_delete == 0) - - # 如果是更新操作,排除当前记录自身 - if current_id: - query = query.filter(DictItem.id != current_id) - - # 如果存在同名记录,抛出验证错误 - if query.first(): - raise ValidationError("字典项名称已存在") - - def validate_value(self, field): - """ - 自定义验证:字典项值在同一字典下不能重复 - - 验证逻辑: - 1. 添加时:检查同一字典下是否存在相同值记录 - 2. 更新时:排除当前记录自身,检查其他记录是否相同值 - - Args: - field: value 字段对象 - - Raises: - ValidationError: 字典项值已存在时抛出验证错误 - """ - if not field.data: - return - - # 获取当前记录的ID(更新时存在,添加时为None) - current_id = self.id.data if self.id.data else None - - # 获取字典ID - dict_id = self.dictId.data if self.dictId.data else None - - if dict_id is None: - return - - # 构建查询:查找同一字典下相同值的记录 - query = DictItem.query.filter( - DictItem.dict_id == dict_id, - DictItem.value == field.data, - DictItem.is_delete == 0 - ) - - # 如果是更新操作,排除当前记录自身 - if current_id: - query = query.filter(DictItem.id != current_id) - - # 如果存在相同值记录,抛出验证错误 - if query.first(): - raise ValidationError("字典项值已存在") +from src.modules.dictionary.schema import * # noqa: F401,F403 diff --git a/application/forms/file_template.py b/application/forms/file_template.py index 990345b..3f1f625 100644 --- a/application/forms/file_template.py +++ b/application/forms/file_template.py @@ -1,156 +1,8 @@ """ -文件模板表单验证模块 +兼容 shim(绞杀者迁移期间保留) ============================================================= -提供文件模板相关的表单验证功能,包括: -- 文件模板添加/更新表单验证 +表单已迁移至 src.modules.file_template.schema。 +本文件仅作兼容转发,最终在 P7(切尾)阶段删除。 """ - -from wtforms import ValidationError, StringField, IntegerField -from wtforms.validators import DataRequired, Length, NumberRange, Optional - -from application.forms.base_form import BaseForm -from application.models.file_template import FileTemplate - - -# ============================================================ -# 文件模板表单验证(添加和更新共用) -# ============================================================ - -class FileTemplateForm(BaseForm): - """ - 文件模板表单验证类 - - 用于添加和更新文件模板时的数据验证。 - - Attributes: - id: 模板ID(更新时必填,添加时可选) - name: 模板名称(可选,最长100字符) - code: 模板编码(可选,最长50字符,不可重复) - fileName: 文件名称(可选,最长255字符) - filePath: 文件路径(可选,最长255字符) - note: 模板备注(可选,最长255字符) - sort: 模板排序(必填,0-99999之间的整数) - """ - - # ============================================================ - # 模板ID - # ============================================================ - id = IntegerField( - label='模板ID', - validators=[ - Optional(), # 允许为空(添加时) - NumberRange(min=1, message='模板ID必须大于0') - ], - description='模板唯一标识,更新时必填,添加时自动生成' - ) - - # ============================================================ - # 模板名称 - # ============================================================ - name = StringField( - label='模板名称', - validators=[ - Optional(), # 允许为空 - Length(max=100, message='模板名称长度不得超过100个字符') - ], - description='模板显示名称' - ) - - # ============================================================ - # 模板编码 - # ============================================================ - code = StringField( - label='模板编码', - validators=[ - Optional(), # 允许为空 - Length(max=50, message='模板编码长度不得超过50个字符') - ], - description='模板唯一标识编码,用于程序调用' - ) - - # ============================================================ - # 文件名称 - # ============================================================ - fileName = StringField( - label='文件名称', - validators=[ - Optional(), # 允许为空 - Length(max=255, message='文件名称长度不得超过255个字符') - ], - description='文件名称' - ) - - # ============================================================ - # 文件路径 - # ============================================================ - filePath = StringField( - label='文件路径', - validators=[ - Optional(), # 允许为空 - Length(max=255, message='文件路径长度不得超过255个字符') - ], - description='文件存储路径' - ) - - # ============================================================ - # 模板备注 - # ============================================================ - note = StringField( - label='模板备注', - validators=[ - Optional(), # 允许为空 - Length(max=255, message='模板备注长度不得超过255个字符') - ], - description='模板补充说明' - ) - - # ============================================================ - # 模板排序 - # ============================================================ - sort = IntegerField( - label='模板排序', - validators=[ - DataRequired(message='模板排序不能为空'), - NumberRange(min=0, max=99999, message='模板排序值在0~99999之间') - ], - description='排序值,数值越小越靠前' - ) - - # ============================================================ - # 自定义验证方法 - # ============================================================ - - def validate_code(self, field): - """ - 自定义验证:模板编码不能重复 - - 验证逻辑: - 1. 添加时:检查数据库中是否存在相同编码的记录 - 2. 更新时:排除当前记录自身,检查其他记录是否编码相同 - - Args: - field: code 字段对象 - - Raises: - ValidationError: 模板编码已存在时抛出验证错误 - """ - if not field.data: - return - - # 获取当前记录的ID(更新时存在,添加时为None) - current_id = self.id.data if self.id.data else None - - # 构建查询:查找相同编码的记录 - query = FileTemplate.query.filter( - FileTemplate.code == field.data, - FileTemplate.is_delete == 0 - ) - - # 如果是更新操作,排除当前记录自身 - if current_id: - query = query.filter(FileTemplate.id != current_id) - - # 如果存在相同编码的记录,抛出验证错误 - if query.first(): - raise ValidationError("模板编码已存在") +from src.modules.file_template.schema import * # noqa: F401,F403 diff --git a/application/forms/job.py b/application/forms/job.py index 4bfffa6..8e464bd 100644 --- a/application/forms/job.py +++ b/application/forms/job.py @@ -1,174 +1,8 @@ """ -定时任务表单验证模块 +兼容 shim(绞杀者迁移期间保留) ============================================================= -提供定时任务相关的表单验证功能。 +表单已迁移至 src.modules.job.schema。 +本文件仅作兼容转发,最终在 P7(切尾)阶段删除。 """ - -from wtforms import ValidationError, IntegerField, StringField -from wtforms.validators import NumberRange, DataRequired, Length, Optional - -from application.forms.base_form import BaseForm -from application.models.job import Job - - -# ============================================================ -# 定时任务表单验证 -# ============================================================ - -class JobForm(BaseForm): - """ - 定时任务表单验证类 - - 用于添加和更新定时任务时的数据验证。 - """ - - # 任务ID - id = IntegerField( - label='任务ID', - validators=[ - Optional(), - NumberRange(min=1, message='任务ID必须大于0') - ], - description='任务唯一标识,更新时必填' - ) - - # 任务名称 - jobName = StringField( - label='任务名称', - validators=[ - DataRequired(message='任务名称不能为空'), - Length(max=255, message='任务名称长度不得超过255个字符') - ], - description='任务名称' - ) - - # 任务别名 - jobAlias = StringField( - label='任务别名', - validators=[ - Optional(), - Length(max=255, message='任务别名长度不得超过255个字符') - ], - description='任务别名' - ) - - # 任务分组 - jobGroup = StringField( - label='任务分组', - validators=[ - Optional(), - Length(max=255, message='任务分组长度不得超过255个字符') - ], - description='任务分组,默认DEFAULT' - ) - - # 任务触发器 - jobTrigger = StringField( - label='任务触发器', - validators=[ - Optional(), - Length(max=255, message='任务触发器长度不得超过255个字符') - ], - description='任务触发器标识' - ) - - # 任务状态 - status = IntegerField( - label='任务状态', - validators=[ - DataRequired(message='任务状态不能为空'), - NumberRange(min=0, max=3, message='任务状态值在0~3之间') - ], - description='任务状态:0-未发布 1-运行中 2-暂停 3-删除' - ) - - # Cron表达式 - cronExpression = StringField( - label='Cron表达式', - validators=[ - Optional(), - Length(max=255, message='Cron表达式长度不得超过255个字符') - ], - description='Cron表达式,如:0 2 * * *' - ) - - # 执行策略 - executePolicy = IntegerField( - label='执行策略', - validators=[ - DataRequired(message='执行策略不能为空'), - NumberRange(min=1, max=3, message='执行策略值在1~3之间') - ], - description='执行策略:1-立即执行 2-执行一次 3-放弃执行' - ) - - # 是否同步任务 - isSync = IntegerField( - label='是否同步任务', - validators=[ - DataRequired(message='是否同步任务不能为空'), - NumberRange(min=0, max=1, message='是否同步任务值在0~1之间') - ], - description='是否同步任务:0-异步 1-同步' - ) - - # 任务URL - url = StringField( - label='任务URL', - validators=[ - Optional(), - Length(max=255, message='任务URL长度不得超过255个字符') - ], - description='任务请求URL' - ) - - # 任务备注 - note = StringField( - label='任务备注', - validators=[ - Optional(), - Length(max=255, message='任务备注长度不得超过255个字符') - ], - description='任务备注说明' - ) - - def validate_job_name(self, field): - """验证任务名称不能重复""" - if not field.data: - return - - current_id = self.id.data if self.id.data else None - query = Job.query.filter(Job.job_name == field.data, Job.is_delete == 0) - - if current_id: - query = query.filter(Job.id != current_id) - - if query.first(): - raise ValidationError("任务名称已存在") - - -# ============================================================ -# 任务状态设置表单 -# ============================================================ - -class JobStatusForm(BaseForm): - """任务状态设置表单验证类""" - - id = IntegerField( - label='任务ID', - validators=[ - DataRequired(message='任务ID不能为空'), - NumberRange(min=1, message='任务ID必须大于0') - ], - description='要修改状态的任务ID' - ) - - status = IntegerField( - label='任务状态', - validators=[ - Optional(), - NumberRange(min=0, max=3, message='任务状态值在0~3之间') - ], - description='目标状态:0-未发布 1-运行中 2-暂停 3-删除' - ) +from src.modules.job.schema import * # noqa: F401,F403 diff --git a/application/forms/level.py b/application/forms/level.py index 7c03203..978f47e 100644 --- a/application/forms/level.py +++ b/application/forms/level.py @@ -1,197 +1,8 @@ -# +====================================================================== -# | DjangoAdmin 企业数字化开发平台 [ 赋能开发者,助力企业发展 ] -# +---------------------------------------------------------------------- -# | Copyright (c) 2021-2026 一米阳光团队 版权所有 -# +---------------------------------------------------------------------- -# | 开源协议: Apache-2.0 -# | 重要声明: 未经书面许可,不得移除或修改本框架相关版权标识。 -# +---------------------------------------------------------------------- -# | 官方网站: https://www.djangoadmin.cn -# +---------------------------------------------------------------------- -# | 研发团队: 一米阳光团队 荣誉出品 -# +====================================================================== -# | 版权和免责声明: -# | 一、知识产权声明 -# | 本团队对该软件框架产品(以下简称“本产品”)拥有完整知识产权,包括但不限于商标权、专利权、 -# | 著作权、商业秘密等。前述权利均受中华人民共和国及相关国际法律法规保护。未经本团队书面授权, -# | 任何个人或单位不得基于本产品本身申请任何形式的知识产权。 -# | 二、使用限制与禁止条款 -# | 您理解并同意,禁止将本产品用于以下任何行为: -# | 1. 任何违反中华人民共和国法律法规的用途; -# | 2. 任何侵害他人合法权益(包括但不限于人身权、财产权、知识产权等)的行为; -# | 3. 任何危害国家安全、公共利益及社会道德风尚的行为。 -# | 三、责任豁免 -# | 因使用本产品而产生的任何损失或法律纠纷(包括但不限于直接损失、间接损失、附带损失、衍生损失 -# | 以及因违约、侵权等引发的责任),本团队均不承担任何法律责任。若因违规使用本产品导致任何第三 -# | 方提起索赔或行政机关进行调查,您应独立承担全部责任。 -# | 四、违约与法律责任 -# | 如发现任何违反本声明的行为,本团队有权: -# | 1. 无条件配合公安机关及其他有权机关的调查取证工作; -# | 2. 依法追究相关方的民事责任,并要求赔偿全部损失; -# | 3. 保留进一步采取刑事控告等法律措施的权利。 -# | 五、许可范围说明 -# | 1、被授权方应视本产品源代码为核心机密信息,负有最高标准的保密与保管义务。禁止以任何形式(包 -# | 括但不限于直接或间接的分享、复制、传播、分发、转售、出租、开源、反向工程、反编译、反汇编或通 -# | 过网络服务提供给任何第三方)泄露、披露或处置源代码的全部或部分内容。任何未经授权的复制、使用、 -# | 传播行为均构成对本团队知识产权的严重侵权,本团队有权依法追究其全部法律责任,并要求赔偿因此造 -# | 成的一切经济损失及商誉损害。 -# | 2、本产品仅限于公司或个人在法律允许范围内,用于内部且合规的软件产品研发。具体权利义务以《软件 -# | 许可协议》附件为准。 -# +====================================================================== - """ -职级表单验证模块 +兼容 shim(绞杀者迁移期间保留) ============================================================= -提供职级相关的表单验证功能,包括: -- 职级添加/更新表单验证 -- 职级状态设置表单验证 +表单已迁移至 src.modules.system.level.schema。 +本文件仅作兼容转发,最终在 P7(切尾)阶段删除。 """ - -from wtforms import ValidationError, StringField, IntegerField -from wtforms.validators import DataRequired, Length, NumberRange, Optional - -from application.forms.base_form import BaseForm -from application.models.level import Level - - -# ============================================================ -# 职级表单验证(添加和更新共用) -# ============================================================ - -class LevelForm(BaseForm): - """ - 职级表单验证类 - - 用于添加和更新职级时的数据验证。 - 添加时 id 为 None,更新时 id 必须有值。 - - Attributes: - id: 职级ID(更新时必填,添加时可选) - name: 职级名称(必填,最长150字符,不可重复) - status: 职级状态(必填,1-在用,2-停用) - sort: 职级排序(必填,0-99999之间的整数) - """ - - # ============================================================ - # 职级ID - # ============================================================ - id = IntegerField( - label='职级ID', - validators=[ - Optional(), # 允许为空(添加时) - NumberRange(min=1, message='职级ID必须大于0') - ], - description='职级唯一标识,更新时必填,添加时自动生成' - ) - - # ============================================================ - # 职级名称 - # ============================================================ - name = StringField( - label='职级名称', - validators=[ - DataRequired(message='职级名称不能为空'), - Length(max=150, message='职级名称长度不得超过150个字符') - ], - description='职级显示名称,如:初级、中级、高级' - ) - - # ============================================================ - # 职级状态 - # ============================================================ - status = IntegerField( - label='职级状态', - validators=[ - DataRequired(message='职级状态不能为空'), - NumberRange(min=1, max=2, message='职级状态值在1~2之间') - ], - description='职级状态:1-在用,2-停用' - ) - - # ============================================================ - # 职级排序 - # ============================================================ - sort = IntegerField( - label='职级排序', - validators=[ - Optional(), - NumberRange(min=0, max=99999, message='职级排序值在0~99999之间') - ], - description='排序值,数值越小越靠前' - ) - - # ============================================================ - # 自定义验证方法 - # ============================================================ - - def validate_name(self, field): - """ - 自定义验证:职级名称不能重复 - - 验证逻辑: - 1. 添加时:检查数据库中是否存在同名记录 - 2. 更新时:排除当前记录自身,检查其他记录是否同名 - - Args: - field: name 字段对象 - - Raises: - ValidationError: 职级名称已存在时抛出验证错误 - """ - if not field.data: - return - - # 获取当前记录的ID(更新时存在,添加时为None) - current_id = self.id.data if self.id.data else None - - # 构建查询:查找同名记录 - query = Level.query.filter(Level.name == field.data, Level.is_delete == 0) - - # 如果是更新操作,排除当前记录自身 - if current_id: - query = query.filter(Level.id != current_id) - - # 如果存在同名记录,抛出验证错误 - if query.first(): - raise ValidationError("职级名称已存在") - - -# ============================================================ -# 状态设置表单 -# ============================================================ - -class LevelStatusForm(BaseForm): - """ - 职级状态设置表单验证类 - - 用于单独修改职级状态时的数据验证。 - - Attributes: - id: 职级ID(必填,必须大于0) - status: 职级状态(必填,1-在用,2-停用) - """ - - # ============================================================ - # 职级ID - # ============================================================ - id = IntegerField( - label='职级ID', - validators=[ - DataRequired(message='职级ID不能为空'), - NumberRange(min=1, message='职级ID必须大于0') - ], - description='要修改状态的职级ID' - ) - - # ============================================================ - # 职级状态 - # ============================================================ - status = IntegerField( - label='职级状态', - validators=[ - DataRequired(message='职级状态不能为空'), - NumberRange(min=1, max=2, message='职级状态值在1~2之间') - ], - description='目标状态:1-在用,2-停用' - ) +from src.modules.system.level.schema import * # noqa: F401,F403 diff --git a/application/forms/link.py b/application/forms/link.py index f4579df..32abba5 100644 --- a/application/forms/link.py +++ b/application/forms/link.py @@ -1,261 +1,8 @@ -# +====================================================================== -# | DjangoAdmin 企业数字化开发平台 [ 赋能开发者,助力企业发展 ] -# +---------------------------------------------------------------------- -# | Copyright (c) 2021-2026 一米阳光团队 版权所有 -# +---------------------------------------------------------------------- -# | 开源协议: Apache-2.0 -# | 重要声明: 未经书面许可,不得移除或修改本框架相关版权标识。 -# +---------------------------------------------------------------------- -# | 官方网站: https://www.djangoadmin.cn -# +---------------------------------------------------------------------- -# | 研发团队: 一米阳光团队 荣誉出品 -# +====================================================================== -# | 版权和免责声明: -# | 一、知识产权声明 -# | 本团队对该软件框架产品(以下简称“本产品”)拥有完整知识产权,包括但不限于商标权、专利权、 -# | 著作权、商业秘密等。前述权利均受中华人民共和国及相关国际法律法规保护。未经本团队书面授权, -# | 任何个人或单位不得基于本产品本身申请任何形式的知识产权。 -# | 二、使用限制与禁止条款 -# | 您理解并同意,禁止将本产品用于以下任何行为: -# | 1. 任何违反中华人民共和国法律法规的用途; -# | 2. 任何侵害他人合法权益(包括但不限于人身权、财产权、知识产权等)的行为; -# | 3. 任何危害国家安全、公共利益及社会道德风尚的行为。 -# | 三、责任豁免 -# | 因使用本产品而产生的任何损失或法律纠纷(包括但不限于直接损失、间接损失、附带损失、衍生损失 -# | 以及因违约、侵权等引发的责任),本团队均不承担任何法律责任。若因违规使用本产品导致任何第三 -# | 方提起索赔或行政机关进行调查,您应独立承担全部责任。 -# | 四、违约与法律责任 -# | 如发现任何违反本声明的行为,本团队有权: -# | 1. 无条件配合公安机关及其他有权机关的调查取证工作; -# | 2. 依法追究相关方的民事责任,并要求赔偿全部损失; -# | 3. 保留进一步采取刑事控告等法律措施的权利。 -# | 五、许可范围说明 -# | 1、被授权方应视本产品源代码为核心机密信息,负有最高标准的保密与保管义务。禁止以任何形式(包 -# | 括但不限于直接或间接的分享、复制、传播、分发、转售、出租、开源、反向工程、反编译、反汇编或通 -# | 过网络服务提供给任何第三方)泄露、披露或处置源代码的全部或部分内容。任何未经授权的复制、使用、 -# | 传播行为均构成对本团队知识产权的严重侵权,本团队有权依法追究其全部法律责任,并要求赔偿因此造 -# | 成的一切经济损失及商誉损害。 -# | 2、本产品仅限于公司或个人在法律允许范围内,用于内部且合规的软件产品研发。具体权利义务以《软件 -# | 许可协议》附件为准。 -# +====================================================================== - """ -友链表单验证模块 +兼容 shim(绞杀者迁移期间保留) ============================================================= -提供友链相关的表单验证功能,包括: -- 友链添加/更新表单验证 -- 友链状态设置表单验证 +表单已迁移至 src.modules.cms.link.schema。 +本文件仅作兼容转发,最终在 P7(切尾)阶段删除。 """ - -from wtforms import ValidationError, IntegerField, StringField -from wtforms.validators import NumberRange, DataRequired, Length, Optional - -from application.forms.base_form import BaseForm -from application.models.link import Link - - -# ============================================================ -# 友链表单验证(添加和更新共用) -# ============================================================ - -class LinkForm(BaseForm): - """ - 友链表单验证类 - - 用于添加和更新友链时的数据验证。 - 添加时 id 为 None,更新时 id 必须有值。 - - Attributes: - id: 友链ID(更新时必填,添加时可选) - name: 友链名称(必填,最长255字符,不可重复) - type: 友链类型(必填,1-友情链接,2-合作伙伴) - url: 友链URL(必填,最长255字符) - form: 友链形式(必填,1-文字链接,2-图片链接) - image: 友链图片(必填,最长255字符) - status: 友链状态(必填,1-在用,2-停用) - sort: 友链排序(必填,0-99999之间的整数) - note: 友链备注(可选,最长255字符) - """ - - # ============================================================ - # 友链ID - # ============================================================ - id = IntegerField( - label='友链ID', - validators=[ - Optional(), # 允许为空(添加时) - NumberRange(min=1, message='友链ID必须大于0') - ], - description='友链唯一标识,更新时必填,添加时自动生成' - ) - - # ============================================================ - # 友链名称 - # ============================================================ - name = StringField( - label='友链名称', - validators=[ - DataRequired(message='友链名称不能为空'), - Length(max=255, message='友链名称长度不得超过255个字符') - ], - description='友链显示名称,如:百度、谷歌' - ) - - # ============================================================ - # 友链类型 - # ============================================================ - type = IntegerField( - label='友链类型', - validators=[ - DataRequired(message='友链类型不能为空'), - NumberRange(min=1, max=2, message='友链类型值在1~2之间') - ], - description='友链类型:1-友情链接,2-合作伙伴' - ) - - # ============================================================ - # 友链URL - # ============================================================ - url = StringField( - label='友链URL', - validators=[ - DataRequired(message='友链URL不能为空'), - Length(max=255, message='友链URL长度不得超过255个字符') - ], - description='友链跳转地址,如:https://www.example.com' - ) - - # ============================================================ - # 友链形式 - # ============================================================ - form = IntegerField( - label='友链形式', - validators=[ - DataRequired(message='友链形式不能为空'), - NumberRange(min=1, max=2, message='友链形式的值在1~2之间') - ], - description='友链形式:1-文字链接,2-图片链接' - ) - - # ============================================================ - # 友链图片 - # ============================================================ - image = StringField( - label='友链图片', - validators=[ - DataRequired(message='友链图片不能为空'), - Length(max=255, message='友链图片长度不得超过255个字符') - ], - description='友链图片地址,当友链形式为图片链接时必填' - ) - - # ============================================================ - # 友链状态 - # ============================================================ - status = IntegerField( - label='友链状态', - validators=[ - DataRequired(message='友链状态不能为空'), - NumberRange(min=1, max=2, message='友链状态值在1~2之间') - ], - description='友链状态:1-在用,2-停用' - ) - - # ============================================================ - # 友链排序 - # ============================================================ - sort = IntegerField( - label='友链排序', - validators=[ - Optional(), - NumberRange(min=0, max=99999, message='友链排序值在0~99999之间') - ], - description='排序值,数值越小越靠前' - ) - - # ============================================================ - # 友链备注 - # ============================================================ - note = StringField( - label='友链备注', - validators=[ - Length(max=255, message='友链备注长度不得超过255个字符') - ], - description='友链补充说明' - ) - - # ============================================================ - # 自定义验证方法 - # ============================================================ - - def validate_name(self, field): - """ - 自定义验证:友链名称不能重复 - - 验证逻辑: - 1. 添加时:检查数据库中是否存在同名记录 - 2. 更新时:排除当前记录自身,检查其他记录是否同名 - - Args: - field: name 字段对象 - - Raises: - ValidationError: 友链名称已存在时抛出验证错误 - """ - if not field.data: - return - - # 获取当前记录的ID(更新时存在,添加时为None) - current_id = self.id.data if self.id.data else None - - # 构建查询:查找同名记录 - query = Link.query.filter(Link.name == field.data, Link.is_delete == 0) - - # 如果是更新操作,排除当前记录自身 - if current_id: - query = query.filter(Link.id != current_id) - - # 如果存在同名记录,抛出验证错误 - if query.first(): - raise ValidationError("友链名称已存在") - - -# ============================================================ -# 状态设置表单 -# ============================================================ - -class LinkStatusForm(BaseForm): - """ - 友链状态设置表单验证类 - - 用于单独修改友链状态时的数据验证。 - - Attributes: - id: 友链ID(必填,必须大于0) - status: 友链状态(必填,1-在用,2-停用) - """ - - # ============================================================ - # 友链ID - # ============================================================ - id = IntegerField( - label='友链ID', - validators=[ - DataRequired(message='友链ID不能为空'), - NumberRange(min=1, message='友链ID必须大于0') - ], - description='要修改状态的友链ID' - ) - - # ============================================================ - # 友链状态 - # ============================================================ - status = IntegerField( - label='友链状态', - validators=[ - DataRequired(message='友链状态不能为空'), - NumberRange(min=1, max=2, message='友链状态值在1~2之间') - ], - description='目标状态:1-在用,2-停用' - ) +from src.modules.cms.link.schema import * # noqa: F401,F403 diff --git a/application/forms/login.py b/application/forms/login.py index 3132c97..f823523 100644 --- a/application/forms/login.py +++ b/application/forms/login.py @@ -1,118 +1,8 @@ -# +====================================================================== -# | DjangoAdmin 企业数字化开发平台 [ 赋能开发者,助力企业发展 ] -# +---------------------------------------------------------------------- -# | Copyright (c) 2021-2026 一米阳光团队 版权所有 -# +---------------------------------------------------------------------- -# | 开源协议: Apache-2.0 -# | 重要声明: 未经书面许可,不得移除或修改本框架相关版权标识。 -# +---------------------------------------------------------------------- -# | 官方网站: https://www.djangoadmin.cn -# +---------------------------------------------------------------------- -# | 研发团队: 一米阳光团队 荣誉出品 -# +====================================================================== -# | 版权和免责声明: -# | 一、知识产权声明 -# | 本团队对该软件框架产品(以下简称“本产品”)拥有完整知识产权,包括但不限于商标权、专利权、 -# | 著作权、商业秘密等。前述权利均受中华人民共和国及相关国际法律法规保护。未经本团队书面授权, -# | 任何个人或单位不得基于本产品本身申请任何形式的知识产权。 -# | 二、使用限制与禁止条款 -# | 您理解并同意,禁止将本产品用于以下任何行为: -# | 1. 任何违反中华人民共和国法律法规的用途; -# | 2. 任何侵害他人合法权益(包括但不限于人身权、财产权、知识产权等)的行为; -# | 3. 任何危害国家安全、公共利益及社会道德风尚的行为。 -# | 三、责任豁免 -# | 因使用本产品而产生的任何损失或法律纠纷(包括但不限于直接损失、间接损失、附带损失、衍生损失 -# | 以及因违约、侵权等引发的责任),本团队均不承担任何法律责任。若因违规使用本产品导致任何第三 -# | 方提起索赔或行政机关进行调查,您应独立承担全部责任。 -# | 四、违约与法律责任 -# | 如发现任何违反本声明的行为,本团队有权: -# | 1. 无条件配合公安机关及其他有权机关的调查取证工作; -# | 2. 依法追究相关方的民事责任,并要求赔偿全部损失; -# | 3. 保留进一步采取刑事控告等法律措施的权利。 -# | 五、许可范围说明 -# | 1、被授权方应视本产品源代码为核心机密信息,负有最高标准的保密与保管义务。禁止以任何形式(包 -# | 括但不限于直接或间接的分享、复制、传播、分发、转售、出租、开源、反向工程、反编译、反汇编或通 -# | 过网络服务提供给任何第三方)泄露、披露或处置源代码的全部或部分内容。任何未经授权的复制、使用、 -# | 传播行为均构成对本团队知识产权的严重侵权,本团队有权依法追究其全部法律责任,并要求赔偿因此造 -# | 成的一切经济损失及商誉损害。 -# | 2、本产品仅限于公司或个人在法律允许范围内,用于内部且合规的软件产品研发。具体权利义务以《软件 -# | 许可协议》附件为准。 -# +====================================================================== - """ -登录表单验证模块 +兼容 shim(绞杀者迁移期间保留) ============================================================= -提供登录相关的表单验证功能,包括: -- 用户登录表单验证 +表单已迁移至 src.modules.auth.schema。 +本文件仅作兼容转发,最终在 P7(切尾)阶段删除。 """ - -from wtforms import StringField -from wtforms.validators import DataRequired, Length - -from application.forms.base_form import BaseForm - - -# ============================================================ -# 登录表单验证 -# ============================================================ - -class LoginForm(BaseForm): - """ - 登录表单验证类 - - 用于用户登录时的数据验证。 - - Attributes: - username: 登录账号(必填,最长20字符) - password: 登录密码(必填,长度6~12字符) - code: 验证码(必填,长度6字符) - key: KEY值(必填,用于验证码校验) - """ - - # ============================================================ - # 登录账号 - # ============================================================ - username = StringField( - label='登录账号', - validators=[ - DataRequired(message='登录账号不能为空'), - Length(max=20, message='登录账号长度不得超过20个字符') - ], - description='用户登录账号,支持用户名/手机号/邮箱' - ) - - # ============================================================ - # 登录密码 - # ============================================================ - password = StringField( - label='登录密码', - validators=[ - DataRequired(message='登录密码不能为空'), - Length(min=6, max=12, message='登录密码长度在6~12个字符之间') - ], - description='用户登录密码,长度6-12个字符' - ) - - # ============================================================ - # 验证码 - # ============================================================ - code = StringField( - label='验证码', - validators=[ - DataRequired(message='验证码不能为空'), - Length(min=6, max=6, message='验证码长度为6个字符') - ], - description='图片验证码,不区分大小写' - ) - - # ============================================================ - # KEY值 - # ============================================================ - key = StringField( - label='KEY值', - validators=[ - DataRequired(message='KEY值不能为空'), - ], - description='验证码唯一标识KEY,用于从缓存中获取验证码' - ) +from src.modules.auth.schema import * # noqa: F401,F403 diff --git a/application/forms/menu.py b/application/forms/menu.py index 2c991f2..2d59457 100644 --- a/application/forms/menu.py +++ b/application/forms/menu.py @@ -1,272 +1,8 @@ -# +====================================================================== -# | DjangoAdmin 企业数字化开发平台 [ 赋能开发者,助力企业发展 ] -# +---------------------------------------------------------------------- -# | Copyright (c) 2021-2026 一米阳光团队 版权所有 -# +---------------------------------------------------------------------- -# | 开源协议: Apache-2.0 -# | 重要声明: 未经书面许可,不得移除或修改本框架相关版权标识。 -# +---------------------------------------------------------------------- -# | 官方网站: https://www.djangoadmin.cn -# +---------------------------------------------------------------------- -# | 研发团队: 一米阳光团队 荣誉出品 -# +====================================================================== -# | 版权和免责声明: -# | 一、知识产权声明 -# | 本团队对该软件框架产品(以下简称“本产品”)拥有完整知识产权,包括但不限于商标权、专利权、 -# | 著作权、商业秘密等。前述权利均受中华人民共和国及相关国际法律法规保护。未经本团队书面授权, -# | 任何个人或单位不得基于本产品本身申请任何形式的知识产权。 -# | 二、使用限制与禁止条款 -# | 您理解并同意,禁止将本产品用于以下任何行为: -# | 1. 任何违反中华人民共和国法律法规的用途; -# | 2. 任何侵害他人合法权益(包括但不限于人身权、财产权、知识产权等)的行为; -# | 3. 任何危害国家安全、公共利益及社会道德风尚的行为。 -# | 三、责任豁免 -# | 因使用本产品而产生的任何损失或法律纠纷(包括但不限于直接损失、间接损失、附带损失、衍生损失 -# | 以及因违约、侵权等引发的责任),本团队均不承担任何法律责任。若因违规使用本产品导致任何第三 -# | 方提起索赔或行政机关进行调查,您应独立承担全部责任。 -# | 四、违约与法律责任 -# | 如发现任何违反本声明的行为,本团队有权: -# | 1. 无条件配合公安机关及其他有权机关的调查取证工作; -# | 2. 依法追究相关方的民事责任,并要求赔偿全部损失; -# | 3. 保留进一步采取刑事控告等法律措施的权利。 -# | 五、许可范围说明 -# | 1、被授权方应视本产品源代码为核心机密信息,负有最高标准的保密与保管义务。禁止以任何形式(包 -# | 括但不限于直接或间接的分享、复制、传播、分发、转售、出租、开源、反向工程、反编译、反汇编或通 -# | 过网络服务提供给任何第三方)泄露、披露或处置源代码的全部或部分内容。任何未经授权的复制、使用、 -# | 传播行为均构成对本团队知识产权的严重侵权,本团队有权依法追究其全部法律责任,并要求赔偿因此造 -# | 成的一切经济损失及商誉损害。 -# | 2、本产品仅限于公司或个人在法律允许范围内,用于内部且合规的软件产品研发。具体权利义务以《软件 -# | 许可协议》附件为准。 -# +====================================================================== - """ -菜单表单验证模块 +兼容 shim(绞杀者迁移期间保留) ============================================================= -提供菜单相关的表单验证功能,包括: -- 菜单添加/更新表单验证 +表单已迁移至 src.modules.system.menu.schema。 +本文件仅作兼容转发,最终在 P7(切尾)阶段删除。 """ - -from wtforms import ValidationError, IntegerField, StringField -from wtforms.validators import NumberRange, DataRequired, Length, Optional - -from application.forms.base_form import BaseForm -from application.models.menu import Menu - - -# ============================================================ -# 菜单表单验证(添加和更新共用) -# ============================================================ - -class MenuForm(BaseForm): - """ - 菜单表单验证类 - - 用于添加和更新菜单时的数据验证。 - 添加时 id 为 None,更新时 id 必须有值。 - - Attributes: - id: 菜单ID(更新时必填,添加时可选) - name: 菜单名称(必填,最长100字符,同级不可重复) - icon: 菜单图标(可选,最长50字符) - path: 路由地址(可选,最长255字符) - component: 组件路径(可选,最长255字符) - parentId: 上级ID(可选) - type: 菜单类型(可选,0-菜单,1-节点) - target: 打开方式(可选,0-内部打开,1-外部打开,最长30字符) - permission: 权限节点(可选,最长100字符) - hide: 是否可见(可选,0-可见,1-不可见) - status: 菜单状态(必填,1-正常,2-禁用) - sort: 菜单排序(必填,0-99999之间的整数) - note: 菜单备注(可选,最长255字符) - checkedList: 权限节点列表(可选,最长500字符) - """ - - # ============================================================ - # 菜单ID - # ============================================================ - id = IntegerField( - label='菜单ID', - validators=[ - Optional(), # 允许为空(添加时) - NumberRange(min=1, message='菜单ID必须大于0') - ], - description='菜单唯一标识,更新时必填,添加时自动生成' - ) - - # ============================================================ - # 菜单名称 - # ============================================================ - name = StringField( - label='菜单名称', - validators=[ - DataRequired(message='菜单名称不能为空'), - Length(max=100, message='菜单名称长度不得超过100个字符') - ], - description='菜单显示标题,如:系统管理、用户管理' - ) - - # ============================================================ - # 菜单图标 - # ============================================================ - icon = StringField( - label='菜单图标', - validators=[ - Length(max=50, message='菜单图标长度不得超过50个字符') - ], - description='菜单图标CSS类名或图标路径' - ) - - # ============================================================ - # 上级ID - # ============================================================ - parentId = IntegerField( - label='上级ID', - validators=[ - Optional(), - NumberRange(min=0, message='上级ID不得小于0') - ], - description='上级菜单ID,0表示顶级菜单' - ) - - # ============================================================ - # 路由地址 - # ============================================================ - path = StringField( - label='路由地址', - validators=[ - Length(max=255, message='路由地址长度不得超过255个字符') - ], - description='前端路由地址,如:/system/user' - ) - - # ============================================================ - # 组件路径 - # ============================================================ - component = StringField( - label='组件路径', - validators=[ - Length(max=255, message='组件路径长度不得超过255个字符') - ], - description='前端组件文件路径,如:system/user/index' - ) - - # ============================================================ - # 权限节点 - # ============================================================ - permission = StringField( - label='权限节点', - validators=[ - Length(max=100, message='权限节点长度不得超过100个字符') - ], - description='权限标识符,如:system:user:list' - ) - - # ============================================================ - # 打开方式 - # ============================================================ - target = IntegerField( - label='打开方式', - validators=[ - NumberRange(min=0, max=1, message='打开方式值在0~1之间'), - ], - description='打开方式:0-内部打开,1-外部打开' - ) - - # ============================================================ - # 菜单类型 - # ============================================================ - type = IntegerField( - label='菜单类型', - validators=[ - NumberRange(min=0, max=1, message='菜单类型值在0~1之间') - ], - description='菜单类型:0-菜单,1-节点(权限点)' - ) - - # ============================================================ - # 菜单状态 - # ============================================================ - status = IntegerField( - label='菜单状态', - validators=[ - NumberRange(min=0, max=1, message='菜单状态值在0~1之间') - ], - description='菜单状态:0-正常,1-禁用' - ) - - # ============================================================ - # 是否可见 - # ============================================================ - hide = IntegerField( - label='是否可见', - validators=[ - NumberRange(min=0, max=1, message='是否可见值在0~1之间') - ], - description='是否可见:0-可见,1-不可见(隐藏)' - ) - - # ============================================================ - # 菜单排序 - # ============================================================ - sort = IntegerField( - label='菜单排序', - validators=[ - Optional(), - NumberRange(min=0, max=99999, message='菜单排序值在0~99999之间') - ], - description='排序值,数值越小越靠前' - ) - - # ============================================================ - # 菜单备注 - # ============================================================ - note = StringField( - label='菜单备注', - validators=[ - Length(max=255, message='菜单备注长度不得超过255个字符') - ], - description='菜单补充说明' - ) - - # ============================================================ - # 自定义验证方法 - # ============================================================ - - def validate_name(self, field): - """ - 自定义验证:同级菜单名称不能重复 - - 验证逻辑: - 1. 添加时:检查同一父级下是否存在同名标题 - 2. 更新时:排除当前记录自身,检查其他记录是否同名 - - Args: - field: name 字段对象 - - Raises: - ValidationError: 菜单名称已存在时抛出验证错误 - """ - if not field.data: - return - - # 获取当前记录的ID(更新时存在,添加时为None) - current_id = self.id.data if self.id.data else None - - # 获取上级ID - parent_id = self.parentId.data if self.parentId.data else 0 - - # 构建查询:查找同级下同名标题记录 - query = Menu.query.filter( - Menu.name == field.data, - Menu.parent_id == parent_id, - Menu.is_delete == 0 - ) - - # 如果是更新操作,排除当前记录自身 - if current_id: - query = query.filter(Menu.id != current_id) - - # 如果存在同名记录,抛出验证错误 - if query.first(): - raise ValidationError("同级菜单下标题已存在") +from src.modules.system.menu.schema import * # noqa: F401,F403 diff --git a/application/forms/notice.py b/application/forms/notice.py index 7dfa175..528ca9b 100644 --- a/application/forms/notice.py +++ b/application/forms/notice.py @@ -1,181 +1,8 @@ -# +====================================================================== -# | DjangoAdmin 企业数字化开发平台 [ 赋能开发者,助力企业发展 ] -# +---------------------------------------------------------------------- -# | Copyright (c) 2021-2026 一米阳光团队 版权所有 -# +---------------------------------------------------------------------- -# | 开源协议: Apache-2.0 -# | 重要声明: 未经书面许可,不得移除或修改本框架相关版权标识。 -# +---------------------------------------------------------------------- -# | 官方网站: https://www.djangoadmin.cn -# +---------------------------------------------------------------------- -# | 研发团队: 一米阳光团队 荣誉出品 -# +====================================================================== -# | 版权和免责声明: -# | 一、知识产权声明 -# | 本团队对该软件框架产品(以下简称“本产品”)拥有完整知识产权,包括但不限于商标权、专利权、 -# | 著作权、商业秘密等。前述权利均受中华人民共和国及相关国际法律法规保护。未经本团队书面授权, -# | 任何个人或单位不得基于本产品本身申请任何形式的知识产权。 -# | 二、使用限制与禁止条款 -# | 您理解并同意,禁止将本产品用于以下任何行为: -# | 1. 任何违反中华人民共和国法律法规的用途; -# | 2. 任何侵害他人合法权益(包括但不限于人身权、财产权、知识产权等)的行为; -# | 3. 任何危害国家安全、公共利益及社会道德风尚的行为。 -# | 三、责任豁免 -# | 因使用本产品而产生的任何损失或法律纠纷(包括但不限于直接损失、间接损失、附带损失、衍生损失 -# | 以及因违约、侵权等引发的责任),本团队均不承担任何法律责任。若因违规使用本产品导致任何第三 -# | 方提起索赔或行政机关进行调查,您应独立承担全部责任。 -# | 四、违约与法律责任 -# | 如发现任何违反本声明的行为,本团队有权: -# | 1. 无条件配合公安机关及其他有权机关的调查取证工作; -# | 2. 依法追究相关方的民事责任,并要求赔偿全部损失; -# | 3. 保留进一步采取刑事控告等法律措施的权利。 -# | 五、许可范围说明 -# | 1、被授权方应视本产品源代码为核心机密信息,负有最高标准的保密与保管义务。禁止以任何形式(包 -# | 括但不限于直接或间接的分享、复制、传播、分发、转售、出租、开源、反向工程、反编译、反汇编或通 -# | 过网络服务提供给任何第三方)泄露、披露或处置源代码的全部或部分内容。任何未经授权的复制、使用、 -# | 传播行为均构成对本团队知识产权的严重侵权,本团队有权依法追究其全部法律责任,并要求赔偿因此造 -# | 成的一切经济损失及商誉损害。 -# | 2、本产品仅限于公司或个人在法律允许范围内,用于内部且合规的软件产品研发。具体权利义务以《软件 -# | 许可协议》附件为准。 -# +====================================================================== - """ -通知表单验证模块 +兼容 shim(绞杀者迁移期间保留) ============================================================= -提供通知相关的表单验证功能,包括: -- 通知添加/更新表单验证 +表单已迁移至 src.modules.notice.schema。 +本文件仅作兼容转发,最终在 P7(切尾)阶段删除。 """ - -from wtforms import ValidationError, IntegerField, StringField -from wtforms.validators import NumberRange, DataRequired, Length, Optional - -from application.forms.base_form import BaseForm -from application.models.notice import Notice - - -# ============================================================ -# 通知表单验证(添加和更新共用) -# ============================================================ - -class NoticeForm(BaseForm): - """ - 通知表单验证类 - - 用于添加和更新通知时的数据验证。 - 添加时 id 为 None,更新时 id 必须有值。 - - Attributes: - id: 通知ID(更新时必填,添加时可选) - title: 通知标题(必填,最长150字符,不可重复) - cover: 通知封面(必填,最长255字符) - type: 通知类型(必填,1-通知 2-公告) - status: 通知状态(必填,1-正常,2-停用) - content: 通知内容(可选) - """ - - # ============================================================ - # 通知ID - # ============================================================ - id = IntegerField( - label='通知ID', - validators=[ - Optional(), # 允许为空(添加时) - NumberRange(min=1, message='通知ID必须大于0') - ], - description='通知唯一标识,更新时必填,添加时自动生成' - ) - - # ============================================================ - # 通知标题 - # ============================================================ - title = StringField( - label='通知标题', - validators=[ - DataRequired(message='通知标题不能为空'), - Length(max=150, message='通知标题长度不得超过255个字符') - ], - description='通知标题,如:系统升级公告、节假日安排' - ) - - # ============================================================ - # 通知封面 - # ============================================================ - cover = StringField( - label='通知封面', - validators=[ - DataRequired(message='通知封面不能为空'), - Length(max=255, message='通知封面长度不得超过255个字符') - ], - description='通知封面' - ) - - # ============================================================ - # 通知类型 - # ============================================================ - type = IntegerField( - label='通知类型', - validators=[ - DataRequired(message='通知类型不能为空'), - NumberRange(min=1, max=2, message='通知类型值在1~4之间') - ], - description='通知类型:1-通知 2-公告' - ) - - # ============================================================ - # 通知状态 - # ============================================================ - status = IntegerField( - label='通知状态', - validators=[ - DataRequired(message='通知状态不能为空'), - NumberRange(min=1, max=2, message='通知状态值在1~2之间') - ], - description='通知状态:1-正常,2-停用' - ) - - # ============================================================ - # 通知内容 - # ============================================================ - content = StringField( - label='通知内容', - validators=[ - # 可选字段,支持富文本 - ], - description='通知详细内容,支持HTML格式' - ) - - # ============================================================ - # 自定义验证方法 - # ============================================================ - - def validate_title(self, field): - """ - 自定义验证:通知标题不能重复 - - 验证逻辑: - 1. 添加时:检查数据库中是否存在同名标题记录 - 2. 更新时:排除当前记录自身,检查其他记录是否同名 - - Args: - field: title 字段对象 - - Raises: - ValidationError: 通知标题已存在时抛出验证错误 - """ - if not field.data: - return - - # 获取当前记录的ID(更新时存在,添加时为None) - current_id = self.id.data if self.id.data else None - - # 构建查询:查找同名标题记录 - query = Notice.query.filter(Notice.title == field.data, Notice.is_delete == 0) - - # 如果是更新操作,排除当前记录自身 - if current_id: - query = query.filter(Notice.id != current_id) - - # 如果存在同名记录,抛出验证错误 - if query.first(): - raise ValidationError("通知标题已存在") +from src.modules.notice.schema import * # noqa: F401,F403 diff --git a/application/forms/param.py b/application/forms/param.py index 5f12938..57591b2 100644 --- a/application/forms/param.py +++ b/application/forms/param.py @@ -1,239 +1,8 @@ """ -参数表单验证模块 +兼容 shim(绞杀者迁移期间保留) ============================================================= -提供参数相关的表单验证功能,包括: -- 参数添加/更新表单验证 -- 参数状态设置表单验证 +表单已迁移至 src.modules.param.schema。 +本文件仅作兼容转发,最终在 P7(切尾)阶段删除。 """ - -from wtforms import ValidationError, StringField, IntegerField -from wtforms.validators import DataRequired, Length, NumberRange, Optional - -from application.forms.base_form import BaseForm -from application.models.param import Param - - -# ============================================================ -# 参数表单验证(添加和更新共用) -# ============================================================ - -class ParamForm(BaseForm): - """ - 参数表单验证类 - - 用于添加和更新参数时的数据验证。 - 添加时 id 为 None,更新时 id 必须有值。 - - Attributes: - id: 参数ID(更新时必填,添加时可选) - name: 参数名称(必填,最长100字符,不可重复) - code: 参数编码(必填,最长100字符,不可重复) - value: 参数值(必填,最长255字符) - type: 参数类型(必填,0-系统 1-业务) - status: 参数状态(必填,1-正常 2-禁用) - sort: 参数排序(必填,0-99999之间的整数) - note: 参数备注(可选,最长255字符) - """ - - # ============================================================ - # 参数ID - # ============================================================ - id = IntegerField( - label='参数ID', - validators=[ - Optional(), # 允许为空(添加时) - NumberRange(min=1, message='参数ID必须大于0') - ], - description='参数唯一标识,更新时必填,添加时自动生成' - ) - - # ============================================================ - # 参数名称 - # ============================================================ - name = StringField( - label='参数名称', - validators=[ - DataRequired(message='参数名称不能为空'), - Length(max=100, message='参数名称长度不得超过100个字符') - ], - description='参数显示名称,如:网站名称、系统版本' - ) - - # ============================================================ - # 参数编码 - # ============================================================ - code = StringField( - label='参数编码', - validators=[ - DataRequired(message='参数编码不能为空'), - Length(max=100, message='参数编码长度不得超过100个字符') - ], - description='参数唯一标识编码,用于程序调用,如:site_name、system_version' - ) - - # ============================================================ - # 参数值 - # ============================================================ - value = StringField( - label='参数值', - validators=[ - DataRequired(message='参数值不能为空'), - Length(max=255, message='参数值长度不得超过255个字符') - ], - description='参数的具体值' - ) - - # ============================================================ - # 参数类型 - # ============================================================ - type = IntegerField( - label='参数类型', - validators=[ - Optional(), - NumberRange(min=0, max=1, message='参数类型值在0~1之间') - ], - description='参数类型:0-系统参数,1-业务参数' - ) - - # ============================================================ - # 参数状态 - # ============================================================ - status = IntegerField( - label='参数状态', - validators=[ - DataRequired(message='参数状态不能为空'), - NumberRange(min=1, max=2, message='参数状态值在1~2之间') - ], - description='参数状态:1-正常,2-禁用' - ) - - # ============================================================ - # 参数排序 - # ============================================================ - sort = IntegerField( - label='参数排序', - validators=[ - Optional(), - NumberRange(min=0, max=99999, message='参数排序值在0~99999之间') - ], - description='排序值,数值越小越靠前' - ) - - # ============================================================ - # 参数备注 - # ============================================================ - note = StringField( - label='参数备注', - validators=[ - Optional(), # 允许为空 - Length(max=255, message='参数备注长度不得超过255个字符') - ], - description='参数补充说明' - ) - - # ============================================================ - # 自定义验证方法 - # ============================================================ - - def validate_name(self, field): - """ - 自定义验证:参数名称不能重复 - - 验证逻辑: - 1. 添加时:检查数据库中是否存在同名记录 - 2. 更新时:排除当前记录自身,检查其他记录是否同名 - - Args: - field: name 字段对象 - - Raises: - ValidationError: 参数名称已存在时抛出验证错误 - """ - if not field.data: - return - - # 获取当前记录的ID(更新时存在,添加时为None) - current_id = self.id.data if self.id.data else None - - # 构建查询:查找同名记录 - query = Param.query.filter(Param.name == field.data, Param.is_delete == 0) - - # 如果是更新操作,排除当前记录自身 - if current_id: - query = query.filter(Param.id != current_id) - - # 如果存在同名记录,抛出验证错误 - if query.first(): - raise ValidationError("参数名称已存在") - - def validate_code(self, field): - """ - 自定义验证:参数编码不能重复 - - 验证逻辑: - 1. 添加时:检查数据库中是否存在相同编码的记录 - 2. 更新时:排除当前记录自身,检查其他记录是否编码相同 - - Args: - field: code 字段对象 - - Raises: - ValidationError: 参数编码已存在时抛出验证错误 - """ - if not field.data: - return - - # 获取当前记录的ID(更新时存在,添加时为None) - current_id = self.id.data if self.id.data else None - - # 构建查询:查找相同编码的记录 - query = Param.query.filter(Param.code == field.data, Param.is_delete == 0) - - # 如果是更新操作,排除当前记录自身 - if current_id: - query = query.filter(Param.id != current_id) - - # 如果存在相同编码的记录,抛出验证错误 - if query.first(): - raise ValidationError("参数编码已存在") - - -# ============================================================ -# 状态设置表单 -# ============================================================ - -class ParamStatusForm(BaseForm): - """ - 参数状态设置表单验证类 - - 用于单独修改参数状态时的数据验证。 - - Attributes: - id: 参数ID(必填,必须大于0) - status: 参数状态(必填,1-正常 2-禁用) - """ - - # ============================================================ - # 参数ID - # ============================================================ - id = IntegerField( - label='参数ID', - validators=[ - DataRequired(message='参数ID不能为空'), - NumberRange(min=1, message='参数ID必须大于0') - ], - description='要修改状态的参数ID' - ) - - # ============================================================ - # 参数状态 - # ============================================================ - status = IntegerField( - label='参数状态', - validators=[ - DataRequired(message='参数状态不能为空'), - NumberRange(min=1, max=2, message='参数状态值在1~2之间') - ], - description='目标状态:1-正常,2-禁用' - ) +from src.modules.param.schema import * # noqa: F401,F403 diff --git a/application/forms/position.py b/application/forms/position.py index 0514677..d23d60d 100644 --- a/application/forms/position.py +++ b/application/forms/position.py @@ -1,197 +1,8 @@ -# +====================================================================== -# | DjangoAdmin 企业数字化开发平台 [ 赋能开发者,助力企业发展 ] -# +---------------------------------------------------------------------- -# | Copyright (c) 2021-2026 一米阳光团队 版权所有 -# +---------------------------------------------------------------------- -# | 开源协议: Apache-2.0 -# | 重要声明: 未经书面许可,不得移除或修改本框架相关版权标识。 -# +---------------------------------------------------------------------- -# | 官方网站: https://www.djangoadmin.cn -# +---------------------------------------------------------------------- -# | 研发团队: 一米阳光团队 荣誉出品 -# +====================================================================== -# | 版权和免责声明: -# | 一、知识产权声明 -# | 本团队对该软件框架产品(以下简称“本产品”)拥有完整知识产权,包括但不限于商标权、专利权、 -# | 著作权、商业秘密等。前述权利均受中华人民共和国及相关国际法律法规保护。未经本团队书面授权, -# | 任何个人或单位不得基于本产品本身申请任何形式的知识产权。 -# | 二、使用限制与禁止条款 -# | 您理解并同意,禁止将本产品用于以下任何行为: -# | 1. 任何违反中华人民共和国法律法规的用途; -# | 2. 任何侵害他人合法权益(包括但不限于人身权、财产权、知识产权等)的行为; -# | 3. 任何危害国家安全、公共利益及社会道德风尚的行为。 -# | 三、责任豁免 -# | 因使用本产品而产生的任何损失或法律纠纷(包括但不限于直接损失、间接损失、附带损失、衍生损失 -# | 以及因违约、侵权等引发的责任),本团队均不承担任何法律责任。若因违规使用本产品导致任何第三 -# | 方提起索赔或行政机关进行调查,您应独立承担全部责任。 -# | 四、违约与法律责任 -# | 如发现任何违反本声明的行为,本团队有权: -# | 1. 无条件配合公安机关及其他有权机关的调查取证工作; -# | 2. 依法追究相关方的民事责任,并要求赔偿全部损失; -# | 3. 保留进一步采取刑事控告等法律措施的权利。 -# | 五、许可范围说明 -# | 1、被授权方应视本产品源代码为核心机密信息,负有最高标准的保密与保管义务。禁止以任何形式(包 -# | 括但不限于直接或间接的分享、复制、传播、分发、转售、出租、开源、反向工程、反编译、反汇编或通 -# | 过网络服务提供给任何第三方)泄露、披露或处置源代码的全部或部分内容。任何未经授权的复制、使用、 -# | 传播行为均构成对本团队知识产权的严重侵权,本团队有权依法追究其全部法律责任,并要求赔偿因此造 -# | 成的一切经济损失及商誉损害。 -# | 2、本产品仅限于公司或个人在法律允许范围内,用于内部且合规的软件产品研发。具体权利义务以《软件 -# | 许可协议》附件为准。 -# +====================================================================== - """ -岗位表单验证模块 +兼容 shim(绞杀者迁移期间保留) ============================================================= -提供岗位相关的表单验证功能,包括: -- 岗位添加/更新表单验证 -- 岗位状态设置表单验证 +表单已迁移至 src.modules.system.position.schema。 +本文件仅作兼容转发,最终在 P7(切尾)阶段删除。 """ - -from wtforms import ValidationError, StringField, IntegerField -from wtforms.validators import DataRequired, Length, NumberRange, Optional - -from application.forms.base_form import BaseForm -from application.models.position import Position - - -# ============================================================ -# 岗位表单验证(添加和更新共用) -# ============================================================ - -class PositionForm(BaseForm): - """ - 岗位表单验证类 - - 用于添加和更新岗位时的数据验证。 - 添加时 id 为 None,更新时 id 必须有值。 - - Attributes: - id: 岗位ID(更新时必填,添加时可选) - name: 岗位名称(必填,最长150字符,不可重复) - status: 岗位状态(必填,1-在用,2-停用) - sort: 岗位排序(必填,0-99999之间的整数) - """ - - # ============================================================ - # 岗位ID - # ============================================================ - id = IntegerField( - label='岗位ID', - validators=[ - Optional(), # 允许为空(添加时) - NumberRange(min=1, message='岗位ID必须大于0') - ], - description='岗位唯一标识,更新时必填,添加时自动生成' - ) - - # ============================================================ - # 岗位名称 - # ============================================================ - name = StringField( - label='岗位名称', - validators=[ - DataRequired(message='岗位名称不能为空'), - Length(max=150, message='岗位名称长度不得超过150个字符') - ], - description='岗位显示名称,如:技术总监、产品经理' - ) - - # ============================================================ - # 岗位状态 - # ============================================================ - status = IntegerField( - label='岗位状态', - validators=[ - DataRequired(message='岗位状态不能为空'), - NumberRange(min=1, max=2, message='岗位状态值在1~2之间') - ], - description='岗位状态:1-在用,2-停用' - ) - - # ============================================================ - # 岗位排序 - # ============================================================ - sort = IntegerField( - label='岗位排序', - validators=[ - Optional(), - NumberRange(min=0, max=99999, message='岗位排序值在0~99999之间') - ], - description='排序值,数值越小越靠前' - ) - - # ============================================================ - # 自定义验证方法 - # ============================================================ - - def validate_name(self, field): - """ - 自定义验证:岗位名称不能重复 - - 验证逻辑: - 1. 添加时:检查数据库中是否存在同名记录 - 2. 更新时:排除当前记录自身,检查其他记录是否同名 - - Args: - field: name 字段对象 - - Raises: - ValidationError: 岗位名称已存在时抛出验证错误 - """ - if not field.data: - return - - # 获取当前记录的ID(更新时存在,添加时为None) - current_id = self.id.data if self.id.data else None - - # 构建查询:查找同名记录 - query = Position.query.filter(Position.name == field.data, Position.is_delete == 0) - - # 如果是更新操作,排除当前记录自身 - if current_id: - query = query.filter(Position.id != current_id) - - # 如果存在同名记录,抛出验证错误 - if query.first(): - raise ValidationError("岗位名称已存在") - - -# ============================================================ -# 状态设置表单 -# ============================================================ - -class PositionStatusForm(BaseForm): - """ - 岗位状态设置表单验证类 - - 用于单独修改岗位状态时的数据验证。 - - Attributes: - id: 岗位ID(必填,必须大于0) - status: 岗位状态(必填,1-在用,2-停用) - """ - - # ============================================================ - # 岗位ID - # ============================================================ - id = IntegerField( - label='岗位ID', - validators=[ - DataRequired(message='岗位ID不能为空'), - NumberRange(min=1, message='岗位ID必须大于0') - ], - description='要修改状态的岗位ID' - ) - - # ============================================================ - # 岗位状态 - # ============================================================ - status = IntegerField( - label='岗位状态', - validators=[ - DataRequired(message='岗位状态不能为空'), - NumberRange(min=1, max=2, message='岗位状态值在1~2之间') - ], - description='目标状态:1-在用,2-停用' - ) +from src.modules.system.position.schema import * # noqa: F401,F403 diff --git a/application/forms/role.py b/application/forms/role.py index 7203600..cc1c363 100644 --- a/application/forms/role.py +++ b/application/forms/role.py @@ -1,201 +1,8 @@ -# +====================================================================== -# | DjangoAdmin 企业数字化开发平台 [ 赋能开发者,助力企业发展 ] -# +---------------------------------------------------------------------- -# | Copyright (c) 2021-2026 一米阳光团队 版权所有 -# +---------------------------------------------------------------------- -# | 开源协议: Apache-2.0 -# | 重要声明: 未经书面许可,不得移除或修改本框架相关版权标识。 -# +---------------------------------------------------------------------- -# | 官方网站: https://www.djangoadmin.cn -# +---------------------------------------------------------------------- -# | 研发团队: 一米阳光团队 荣誉出品 -# +====================================================================== -# | 版权和免责声明: -# | 一、知识产权声明 -# | 本团队对该软件框架产品(以下简称“本产品”)拥有完整知识产权,包括但不限于商标权、专利权、 -# | 著作权、商业秘密等。前述权利均受中华人民共和国及相关国际法律法规保护。未经本团队书面授权, -# | 任何个人或单位不得基于本产品本身申请任何形式的知识产权。 -# | 二、使用限制与禁止条款 -# | 您理解并同意,禁止将本产品用于以下任何行为: -# | 1. 任何违反中华人民共和国法律法规的用途; -# | 2. 任何侵害他人合法权益(包括但不限于人身权、财产权、知识产权等)的行为; -# | 3. 任何危害国家安全、公共利益及社会道德风尚的行为。 -# | 三、责任豁免 -# | 因使用本产品而产生的任何损失或法律纠纷(包括但不限于直接损失、间接损失、附带损失、衍生损失 -# | 以及因违约、侵权等引发的责任),本团队均不承担任何法律责任。若因违规使用本产品导致任何第三 -# | 方提起索赔或行政机关进行调查,您应独立承担全部责任。 -# | 四、违约与法律责任 -# | 如发现任何违反本声明的行为,本团队有权: -# | 1. 无条件配合公安机关及其他有权机关的调查取证工作; -# | 2. 依法追究相关方的民事责任,并要求赔偿全部损失; -# | 3. 保留进一步采取刑事控告等法律措施的权利。 -# | 五、许可范围说明 -# | 1、被授权方应视本产品源代码为核心机密信息,负有最高标准的保密与保管义务。禁止以任何形式(包 -# | 括但不限于直接或间接的分享、复制、传播、分发、转售、出租、开源、反向工程、反编译、反汇编或通 -# | 过网络服务提供给任何第三方)泄露、披露或处置源代码的全部或部分内容。任何未经授权的复制、使用、 -# | 传播行为均构成对本团队知识产权的严重侵权,本团队有权依法追究其全部法律责任,并要求赔偿因此造 -# | 成的一切经济损失及商誉损害。 -# | 2、本产品仅限于公司或个人在法律允许范围内,用于内部且合规的软件产品研发。具体权利义务以《软件 -# | 许可协议》附件为准。 -# +====================================================================== - """ -角色表单验证模块 +兼容 shim(绞杀者迁移期间保留) ============================================================= -提供角色相关的表单验证功能,包括: -- 角色添加/更新表单验证 -- 角色状态设置表单验证 +表单已迁移至 src.modules.system.role.schema。 +本文件仅作兼容转发,最终在 P7(切尾)阶段删除。 """ - -from wtforms import ValidationError, IntegerField, StringField -from wtforms.validators import NumberRange, DataRequired, Length, Optional - -from application.forms.base_form import BaseForm -from application.models.role import Role - - -# ============================================================ -# 角色表单验证(添加和更新共用) -# ============================================================ - -class RoleForm(BaseForm): - """ - 角色表单验证类 - - 用于添加和更新角色时的数据验证。 - 添加时 id 为 None,更新时 id 必须有值。 - - Attributes: - id: 角色ID(更新时必填,添加时可选) - name: 角色名称(必填,最长150字符,不可重复) - code: 角色编码(必填,最长30字符,不可重复) - status: 角色状态(必填,1-在用,2-停用) - sort: 角色排序(必填,0-99999之间的整数) - note: 角色备注(可选,最长255字符) - """ - - # ============================================================ - # 角色ID - # ============================================================ - id = IntegerField( - label='角色ID', - validators=[ - Optional(), # 允许为空(添加时) - NumberRange(min=1, message='角色ID必须大于0') - ], - description='角色唯一标识,更新时必填,添加时自动生成' - ) - - # ============================================================ - # 角色名称 - # ============================================================ - name = StringField( - label='角色名称', - validators=[ - DataRequired(message='角色名称不能为空'), - Length(max=150, message='角色名称长度不得超过150个字符') - ], - description='角色显示名称,如:超级管理员、普通用户' - ) - - # ============================================================ - # 角色编码 - # ============================================================ - code = StringField( - label='角色编码', - validators=[ - DataRequired(message='角色编码不能为空'), - Length(max=30, message='角色编码长度不得超过30个字符') - ], - description='角色唯一标识编码,如:admin、user' - ) - - # ============================================================ - # 角色排序 - # ============================================================ - sort = IntegerField( - label='角色排序', - validators=[ - Optional(), - NumberRange(min=0, max=99999, message='角色排序值在0~99999之间') - ], - description='排序值,数值越小越靠前' - ) - - # ============================================================ - # 角色备注 - # ============================================================ - note = StringField( - label='角色备注', - validators=[ - Length(max=255, message='角色备注长度不得超过255个字符') - ], - description='角色补充说明' - ) - - # ============================================================ - # 自定义验证方法 - # ============================================================ - - def validate_name(self, field): - """ - 自定义验证:角色名称不能重复 - - 验证逻辑: - 1. 添加时:检查数据库中是否存在同名记录 - 2. 更新时:排除当前记录自身,检查其他记录是否同名 - - Args: - field: name 字段对象 - - Raises: - ValidationError: 角色名称已存在时抛出验证错误 - """ - if not field.data: - return - - # 获取当前记录的ID(更新时存在,添加时为None) - current_id = self.id.data if self.id.data else None - - # 构建查询:查找同名记录 - query = Role.query.filter(Role.name == field.data, Role.is_delete == 0) - - # 如果是更新操作,排除当前记录自身 - if current_id: - query = query.filter(Role.id != current_id) - - # 如果存在同名记录,抛出验证错误 - if query.first(): - raise ValidationError("角色名称已存在") - - def validate_code(self, field): - """ - 自定义验证:角色编码不能重复 - - 验证逻辑: - 1. 添加时:检查数据库中是否存在相同编码记录 - 2. 更新时:排除当前记录自身,检查其他记录是否相同编码 - - Args: - field: code 字段对象 - - Raises: - ValidationError: 角色编码已存在时抛出验证错误 - """ - if not field.data: - return - - # 获取当前记录的ID(更新时存在,添加时为None) - current_id = self.id.data if self.id.data else None - - # 构建查询:查找相同编码记录 - query = Role.query.filter(Role.code == field.data, Role.is_delete == 0) - - # 如果是更新操作,排除当前记录自身 - if current_id: - query = query.filter(Role.id != current_id) - - # 如果存在相同编码记录,抛出验证错误 - if query.first(): - raise ValidationError("角色编码已存在") +from src.modules.system.role.schema import * # noqa: F401,F403 diff --git a/application/forms/role_menu.py b/application/forms/role_menu.py index 0318e45..732eaaf 100644 --- a/application/forms/role_menu.py +++ b/application/forms/role_menu.py @@ -1,96 +1,8 @@ -# +====================================================================== -# | DjangoAdmin 企业数字化开发平台 [ 赋能开发者,助力企业发展 ] -# +---------------------------------------------------------------------- -# | Copyright (c) 2021-2026 一米阳光团队 版权所有 -# +---------------------------------------------------------------------- -# | 开源协议: Apache-2.0 -# | 重要声明: 未经书面许可,不得移除或修改本框架相关版权标识。 -# +---------------------------------------------------------------------- -# | 官方网站: https://www.djangoadmin.cn -# +---------------------------------------------------------------------- -# | 研发团队: 一米阳光团队 荣誉出品 -# +====================================================================== -# | 版权和免责声明: -# | 一、知识产权声明 -# | 本团队对该软件框架产品(以下简称“本产品”)拥有完整知识产权,包括但不限于商标权、专利权、 -# | 著作权、商业秘密等。前述权利均受中华人民共和国及相关国际法律法规保护。未经本团队书面授权, -# | 任何个人或单位不得基于本产品本身申请任何形式的知识产权。 -# | 二、使用限制与禁止条款 -# | 您理解并同意,禁止将本产品用于以下任何行为: -# | 1. 任何违反中华人民共和国法律法规的用途; -# | 2. 任何侵害他人合法权益(包括但不限于人身权、财产权、知识产权等)的行为; -# | 3. 任何危害国家安全、公共利益及社会道德风尚的行为。 -# | 三、责任豁免 -# | 因使用本产品而产生的任何损失或法律纠纷(包括但不限于直接损失、间接损失、附带损失、衍生损失 -# | 以及因违约、侵权等引发的责任),本团队均不承担任何法律责任。若因违规使用本产品导致任何第三 -# | 方提起索赔或行政机关进行调查,您应独立承担全部责任。 -# | 四、违约与法律责任 -# | 如发现任何违反本声明的行为,本团队有权: -# | 1. 无条件配合公安机关及其他有权机关的调查取证工作; -# | 2. 依法追究相关方的民事责任,并要求赔偿全部损失; -# | 3. 保留进一步采取刑事控告等法律措施的权利。 -# | 五、许可范围说明 -# | 1、被授权方应视本产品源代码为核心机密信息,负有最高标准的保密与保管义务。禁止以任何形式(包 -# | 括但不限于直接或间接的分享、复制、传播、分发、转售、出租、开源、反向工程、反编译、反汇编或通 -# | 过网络服务提供给任何第三方)泄露、披露或处置源代码的全部或部分内容。任何未经授权的复制、使用、 -# | 传播行为均构成对本团队知识产权的严重侵权,本团队有权依法追究其全部法律责任,并要求赔偿因此造 -# | 成的一切经济损失及商誉损害。 -# | 2、本产品仅限于公司或个人在法律允许范围内,用于内部且合规的软件产品研发。具体权利义务以《软件 -# | 许可协议》附件为准。 -# +====================================================================== - """ -角色菜单表单验证模块 +兼容 shim(绞杀者迁移期间保留) ============================================================= -提供角色菜单相关的表单验证功能,包括: -- 角色菜单分配表单验证 +表单已迁移至 src.modules.association.role_menu.schema。 +本文件仅作兼容转发,最终在 P7(切尾)阶段删除。 """ - -from wtforms import IntegerField -from wtforms.fields.choices import SelectMultipleField -from wtforms.validators import DataRequired, NumberRange, Optional - -from application.forms.base_form import BaseForm - - -# ============================================================ -# 角色菜单表单验证 -# ============================================================ - -class RoleMenuForm(BaseForm): - """ - 角色菜单表单验证类 - - 用于角色分配菜单权限时的数据验证。 - - Attributes: - roleId: 角色ID(必填,必须大于0) - menuIds: 菜单ID列表(可选,多个菜单ID用逗号分隔) - """ - - # ============================================================ - # 角色ID - # ============================================================ - roleId = IntegerField( - label='角色ID', - validators=[ - DataRequired(message='角色ID不能为空'), - NumberRange(min=1, message='角色ID必须大于0') - ], - description='要分配菜单权限的角色ID' - ) - - # ============================================================ - # 菜单ID列表 - # ============================================================ - menuIds = SelectMultipleField( - label='菜单ID列表', - validators=[ - Optional(), # 允许为空(清空所有菜单权限) - ], - coerce=int, # 将每个选项值转换为整数 - choices=[], # 动态设置,可在视图层传入 - validate_choice=False, # 关键:禁用选项验证 - description='分配的菜单ID列表' - ) +from src.modules.association.role_menu.schema import * # noqa: F401,F403 diff --git a/application/forms/user.py b/application/forms/user.py index cf9e6b2..e3a15b7 100644 --- a/application/forms/user.py +++ b/application/forms/user.py @@ -1,597 +1,8 @@ -# +====================================================================== -# | DjangoAdmin 企业数字化开发平台 [ 赋能开发者,助力企业发展 ] -# +---------------------------------------------------------------------- -# | Copyright (c) 2021-2026 一米阳光团队 版权所有 -# +---------------------------------------------------------------------- -# | 开源协议: Apache-2.0 -# | 重要声明: 未经书面许可,不得移除或修改本框架相关版权标识。 -# +---------------------------------------------------------------------- -# | 官方网站: https://www.djangoadmin.cn -# +---------------------------------------------------------------------- -# | 研发团队: 一米阳光团队 荣誉出品 -# +====================================================================== -# | 版权和免责声明: -# | 一、知识产权声明 -# | 本团队对该软件框架产品(以下简称“本产品”)拥有完整知识产权,包括但不限于商标权、专利权、 -# | 著作权、商业秘密等。前述权利均受中华人民共和国及相关国际法律法规保护。未经本团队书面授权, -# | 任何个人或单位不得基于本产品本身申请任何形式的知识产权。 -# | 二、使用限制与禁止条款 -# | 您理解并同意,禁止将本产品用于以下任何行为: -# | 1. 任何违反中华人民共和国法律法规的用途; -# | 2. 任何侵害他人合法权益(包括但不限于人身权、财产权、知识产权等)的行为; -# | 3. 任何危害国家安全、公共利益及社会道德风尚的行为。 -# | 三、责任豁免 -# | 因使用本产品而产生的任何损失或法律纠纷(包括但不限于直接损失、间接损失、附带损失、衍生损失 -# | 以及因违约、侵权等引发的责任),本团队均不承担任何法律责任。若因违规使用本产品导致任何第三 -# | 方提起索赔或行政机关进行调查,您应独立承担全部责任。 -# | 四、违约与法律责任 -# | 如发现任何违反本声明的行为,本团队有权: -# | 1. 无条件配合公安机关及其他有权机关的调查取证工作; -# | 2. 依法追究相关方的民事责任,并要求赔偿全部损失; -# | 3. 保留进一步采取刑事控告等法律措施的权利。 -# | 五、许可范围说明 -# | 1、被授权方应视本产品源代码为核心机密信息,负有最高标准的保密与保管义务。禁止以任何形式(包 -# | 括但不限于直接或间接的分享、复制、传播、分发、转售、出租、开源、反向工程、反编译、反汇编或通 -# | 过网络服务提供给任何第三方)泄露、披露或处置源代码的全部或部分内容。任何未经授权的复制、使用、 -# | 传播行为均构成对本团队知识产权的严重侵权,本团队有权依法追究其全部法律责任,并要求赔偿因此造 -# | 成的一切经济损失及商誉损害。 -# | 2、本产品仅限于公司或个人在法律允许范围内,用于内部且合规的软件产品研发。具体权利义务以《软件 -# | 许可协议》附件为准。 -# +====================================================================== - """ -用户表单验证模块 +兼容 shim(绞杀者迁移期间保留) ============================================================= -提供用户相关的表单验证功能,包括: -- 用户添加/更新表单验证 -- 用户状态设置表单验证 -- 修改个人信息表单验证 -- 修改密码表单验证 -- 重置密码表单验证 +表单已迁移至 src.modules.system.user.schema。 +本文件仅作兼容转发,最终在 P7(切尾)阶段删除。 """ - -from wtforms import IntegerField, StringField -from wtforms.validators import NumberRange, DataRequired, Length, ValidationError, Optional - -from application.forms.fields import ArrayField -from application.forms.base_form import BaseForm -from application.models.user import User - - -# ============================================================ -# 用户表单验证(添加和更新共用) -# ============================================================ - -class UserForm(BaseForm): - """ - 用户表单验证类 - - 用于添加和更新用户时的数据验证。 - 添加时 id 为 None,更新时 id 必须有值。 - - Attributes: - id: 用户ID(更新时必填,添加时可选) - realname: 用户姓名(必填,最长150字符) - gender: 性别(必填,1-男,2-女,3-保密) - avatar: 头像(必填,最长255字符) - mobile: 手机号(必填,最长30字符) - email: 邮箱(必填,最长30字符) - deptId: 部门ID(必填,不得小于0) - levelId: 职级ID(必填,不得小于0) - positionId: 岗位ID(必填,不得小于0) - city: 行政区划(必填) - provinceCode: 省份编码(可选) - cityCode: 城市编码(可选) - streetCode: 县区编码(可选) - districtCode: 县区编码(可选) - address: 详细地址(必填,最长255字符) - username: 登录账号(必填,最长30字符,不可重复) - password: 登录密码(可选,最长255字符) - intro: 个人简介(可选,最长255字符) - status: 用户状态(必填,1-在用,2-停用) - note: 用户备注(可选,最长255字符) - sort: 用户排序(必填,0-99999之间的整数) - roles: 用户角色(可选) - """ - - # ============================================================ - # 用户ID - # ============================================================ - id = IntegerField( - label='用户ID', - validators=[ - Optional(), # 允许为空(添加时) - NumberRange(min=1, message='用户ID必须大于0') - ], - description='用户唯一标识,更新时必填,添加时自动生成' - ) - - # ============================================================ - # 用户姓名 - # ============================================================ - realname = StringField( - label='用户姓名', - validators=[ - DataRequired(message='用户姓名不能为空'), - Length(max=150, message='用户姓名长度不得超过150个字符') - ], - description='用户真实姓名' - ) - - # ============================================================ - # 性别 - # ============================================================ - gender = IntegerField( - label='性别', - validators=[ - DataRequired(message='性别不能为空'), - NumberRange(min=1, max=3, message='性别值在1~3之间') - ], - description='性别:1-男,2-女,3-保密' - ) - - # ============================================================ - # 头像 - # ============================================================ - avatar = StringField( - label='头像', - validators=[ - DataRequired(message='头像不能为空'), - Length(max=255, message='头像长度不得超过255个字符') - ], - description='用户头像图片地址' - ) - - # ============================================================ - # 手机号 - # ============================================================ - mobile = StringField( - label='手机号', - validators=[ - DataRequired(message='手机号不能为空'), - Length(max=30, message='手机号长度不得超过30个字符') - ], - description='用户手机号码' - ) - - # ============================================================ - # 邮箱 - # ============================================================ - email = StringField( - label='邮箱', - validators=[ - DataRequired(message='邮箱不能为空'), - Length(max=30, message='邮箱长度不得超过30个字符') - ], - description='用户电子邮箱地址' - ) - - # ============================================================ - # 部门ID - # ============================================================ - deptId = IntegerField( - label='部门ID', - validators=[ - DataRequired(message='部门ID不能为空'), - NumberRange(min=0, message='部门ID不得小于0') - ], - description='所属部门ID,0表示无部门' - ) - - # ============================================================ - # 职级ID - # ============================================================ - levelId = IntegerField( - label='职级ID', - validators=[ - DataRequired(message='职级ID不能为空'), - NumberRange(min=0, message='职级ID不得小于0') - ], - description='所属职级ID,0表示无职级' - ) - - # ============================================================ - # 岗位ID - # ============================================================ - positionId = IntegerField( - label='岗位ID', - validators=[ - DataRequired(message='岗位ID不能为空'), - NumberRange(min=0, message='岗位ID不得小于0') - ], - description='所属岗位ID,0表示无岗位' - ) - - # ============================================================ - # 行政区划 - # ============================================================ - city = ArrayField( - label='行政区划', - validators=[ - DataRequired(message='请选择行政区划'), - ], - description='行政区划选择组件数据' - ) - - # ============================================================ - # 省份编码 - # ============================================================ - provinceCode = StringField( - label='省份编码', - validators=[ - Optional(), - ], - description='省份行政编码' - ) - - # ============================================================ - # 城市编码 - # ============================================================ - cityCode = StringField( - label='城市编码', - validators=[ - Optional(), - ], - description='城市行政编码' - ) - - # ============================================================ - # 县区编码 - # ============================================================ - districtCode = StringField( - label='县区编码', - validators=[ - Optional(), - ], - description='县区行政编码' - ) - - # ============================================================ - # 街道编码 - # ============================================================ - streetCode = StringField( - label='街道编码', - validators=[ - Optional(), - ], - description='街道行政编码' - ) - - # ============================================================ - # 详细地址 - # ============================================================ - address = StringField( - label='详细地址', - validators=[ - DataRequired(message='详细地址不能为空'), - Length(max=255, message='详细地址长度不得超过255个字符') - ], - description='详细街道门牌号地址' - ) - - # ============================================================ - # 登录账号 - # ============================================================ - username = StringField( - label='登录账号', - validators=[ - DataRequired(message='登录账号不能为空'), - Length(max=30, message='登录账号长度不得超过30个字符') - ], - description='用户登录账号,唯一标识' - ) - - # ============================================================ - # 登录密码 - # ============================================================ - password = StringField( - label='登录密码', - validators=[ - Length(max=255, message='登录密码长度不得超过255个字符') - ], - description='用户登录密码,添加时必填,更新时可选' - ) - - # ============================================================ - # 个人简介 - # ============================================================ - intro = StringField( - label='个人简介', - validators=[ - Length(max=255, message='个人简介长度不得超过255个字符') - ], - description='用户个人简介或签名' - ) - - # ============================================================ - # 用户状态 - # ============================================================ - status = IntegerField( - label='用户状态', - validators=[ - DataRequired(message='用户状态不能为空'), - NumberRange(min=1, max=2, message='用户状态值在1~2之间') - ], - description='用户状态:1-在用,2-停用' - ) - - # ============================================================ - # 用户备注 - # ============================================================ - note = StringField( - label='用户备注', - validators=[ - Length(max=255, message='用户备注长度不得超过255个字符') - ], - description='用户补充说明' - ) - - # ============================================================ - # 用户排序 - # ============================================================ - sort = IntegerField( - label='用户排序', - validators=[ - Optional(), - NumberRange(min=0, max=99999, message='用户排序值在0~99999之间') - ], - description='排序值,数值越小越靠前' - ) - - # ============================================================ - # 用户角色 - # ============================================================ - roles = ArrayField( - label='用户角色', - validators=[ - Optional(), - ], - description='用户角色ID列表' - ) - - # ============================================================ - # 自定义验证方法 - # ============================================================ - - def validate_username(self, field): - """ - 自定义验证:登录账号不能重复 - - 验证逻辑: - 1. 添加时:检查数据库中是否存在相同账号记录 - 2. 更新时:排除当前记录自身,检查其他记录是否相同账号 - - Args: - field: username 字段对象 - - Raises: - ValidationError: 登录账号已存在时抛出验证错误 - """ - if not field.data: - return - - # 获取当前记录的ID(更新时存在,添加时为None) - current_id = self.id.data if self.id.data else None - - # 构建查询:查找相同账号记录 - query = User.query.filter(User.username == field.data, User.is_delete == 0) - - # 如果是更新操作,排除当前记录自身 - if current_id: - query = query.filter(User.id != current_id) - - # 如果存在相同账号记录,抛出验证错误 - if query.first(): - raise ValidationError("登录账号已存在") - - -# ============================================================ -# 状态设置表单 -# ============================================================ - -class UserStatusForm(BaseForm): - """ - 用户状态设置表单验证类 - - 用于单独修改用户状态时的数据验证。 - - Attributes: - id: 用户ID(必填,必须大于0) - status: 用户状态(必填,1-在用,2-停用) - """ - - # ============================================================ - # 用户ID - # ============================================================ - id = IntegerField( - label='用户ID', - validators=[ - DataRequired(message='用户ID不能为空'), - NumberRange(min=1, message='用户ID必须大于0') - ], - description='要修改状态的用户ID' - ) - - # ============================================================ - # 用户状态 - # ============================================================ - status = IntegerField( - label='用户状态', - validators=[ - DataRequired(message='用户状态不能为空'), - NumberRange(min=1, max=2, message='用户状态值在1~2之间') - ], - description='目标状态:1-在用,2-停用' - ) - - -# ============================================================ -# 修改个人信息表单验证 -# ============================================================ - -class UserInfoForm(BaseForm): - """ - 修改个人信息表单验证类 - - 用于用户修改个人基本信息时的数据验证。 - - Attributes: - realname: 用户姓名(必填,最长150字符) - gender: 性别(必填,1-男,2-女,3-保密) - mobile: 手机号(必填,最长30字符) - email: 邮箱(必填,最长30字符) - address: 详细地址(必填,最长255字符) - intro: 个人简介(可选,最长255字符) - """ - - # ============================================================ - # 用户姓名 - # ============================================================ - realname = StringField( - label='用户姓名', - validators=[ - DataRequired(message='用户姓名不能为空'), - Length(max=150, message='用户姓名长度不得超过150个字符') - ], - description='用户真实姓名' - ) - - # ============================================================ - # 性别 - # ============================================================ - gender = IntegerField( - label='性别', - validators=[ - DataRequired(message='性别不能为空'), - NumberRange(min=1, max=3, message='性别值在1~3之间') - ], - description='性别:1-男,2-女,3-保密' - ) - - # ============================================================ - # 手机号 - # ============================================================ - mobile = StringField( - label='手机号', - validators=[ - DataRequired(message='手机号不能为空'), - Length(max=30, message='手机号长度不得超过30个字符') - ], - description='用户手机号码' - ) - - # ============================================================ - # 邮箱 - # ============================================================ - email = StringField( - label='邮箱', - validators=[ - DataRequired(message='邮箱不能为空'), - Length(max=30, message='邮箱长度不得超过30个字符') - ], - description='用户电子邮箱地址' - ) - - # ============================================================ - # 详细地址 - # ============================================================ - address = StringField( - label='详细地址', - validators=[ - DataRequired(message='详细地址不能为空'), - Length(max=255, message='详细地址长度不得超过255个字符') - ], - description='详细街道门牌号地址' - ) - - # ============================================================ - # 个人简介 - # ============================================================ - intro = StringField( - label='个人简介', - validators=[ - Length(max=255, message='个人简介长度不得超过255个字符') - ], - description='用户个人简介或签名' - ) - - -# ============================================================ -# 修改密码表单验证 -# ============================================================ - -class UpdatePwdForm(BaseForm): - """ - 修改密码表单验证类 - - 用于用户修改登录密码时的数据验证。 - - Attributes: - oldPassword: 原始密码(必填,长度6~12字符) - newPassword: 新密码(必填,长度6~12字符) - rePassword: 确认密码(必填,长度6~12字符,需与新密码一致) - """ - - # ============================================================ - # 原始密码 - # ============================================================ - oldPassword = StringField( - label='原始密码', - validators=[ - DataRequired(message='原始密码不能为空'), - Length(min=6, max=12, message='原始密码长度为6~12个字符') - ], - description='用户当前登录密码' - ) - - # ============================================================ - # 新密码 - # ============================================================ - newPassword = StringField( - label='新密码', - validators=[ - DataRequired(message='新密码不能为空'), - Length(min=6, max=12, message='新密码长度为6~12个字符') - ], - description='新登录密码' - ) - - # ============================================================ - # 确认密码 - # ============================================================ - rePassword = StringField( - label='确认密码', - validators=[ - DataRequired(message='确认密码不能为空'), - Length(min=6, max=12, message='确认密码长度为6~12个字符') - ], - description='确认新密码,需与新密码一致' - ) - - -# ============================================================ -# 重置密码表单 -# ============================================================ - -class ResetPwdForm(BaseForm): - """ - 重置密码表单验证类 - - 用于管理员重置用户密码时的数据验证。 - - Attributes: - id: 用户ID(必填,必须大于0) - """ - - # ============================================================ - # 用户ID - # ============================================================ - userId = IntegerField( - label='用户ID', - validators=[ - DataRequired(message='用户ID不能为空'), - NumberRange(min=1, message='用户ID必须大于0') - ], - description='要重置密码的用户ID' - ) +from src.modules.system.user.schema import * # noqa: F401,F403 diff --git a/application/forms/user_role.py b/application/forms/user_role.py index ca61981..a468ff8 100644 --- a/application/forms/user_role.py +++ b/application/forms/user_role.py @@ -1,51 +1,8 @@ """ -用户角色表单验证模块 +兼容 shim(绞杀者迁移期间保留) ============================================================= -提供用户角色相关的表单验证功能,包括: -- 用户角色分配表单验证 +表单已迁移至 src.modules.association.user_role.schema。 +本文件仅作兼容转发,最终在 P7(切尾)阶段删除。 """ - -from wtforms import IntegerField -from wtforms.fields.choices import SelectMultipleField -from wtforms.validators import DataRequired, NumberRange, Optional - -from application.forms.base_form import BaseForm - - -# ============================================================ -# 用户角色表单验证 -# ============================================================ - -class UserRoleForm(BaseForm): - """ - 用户角色表单验证类 - - 用于用户分配角色权限时的数据验证。 - - Attributes: - userId: 用户ID(必填,必须大于0) - roleIds: 角色ID列表(可选,多个角色ID) - """ - - # 用户ID - userId = IntegerField( - label='用户ID', - validators=[ - DataRequired(message='用户ID不能为空'), - NumberRange(min=1, message='用户ID必须大于0') - ], - description='要分配角色的用户ID' - ) - - # 角色ID列表 - roleIds = SelectMultipleField( - label='角色ID列表', - validators=[ - Optional(), - ], - coerce=int, - choices=[], - validate_choice=False, - description='分配的角色ID列表' - ) +from src.modules.association.user_role.schema import * # noqa: F401,F403 diff --git a/src/modules/association/role_menu/schema.py b/src/modules/association/role_menu/schema.py new file mode 100644 index 0000000..7c962c5 --- /dev/null +++ b/src/modules/association/role_menu/schema.py @@ -0,0 +1,96 @@ +# +====================================================================== +# | DjangoAdmin 企业数字化开发平台 [ 赋能开发者,助力企业发展 ] +# +---------------------------------------------------------------------- +# | Copyright (c) 2021-2026 一米阳光团队 版权所有 +# +---------------------------------------------------------------------- +# | 开源协议: Apache-2.0 +# | 重要声明: 未经书面许可,不得移除或修改本框架相关版权标识。 +# +---------------------------------------------------------------------- +# | 官方网站: https://www.djangoadmin.cn +# +---------------------------------------------------------------------- +# | 研发团队: 一米阳光团队 荣誉出品 +# +====================================================================== +# | 版权和免责声明: +# | 一、知识产权声明 +# | 本团队对该软件框架产品(以下简称“本产品”)拥有完整知识产权,包括但不限于商标权、专利权、 +# | 著作权、商业秘密等。前述权利均受中华人民共和国及相关国际法律法规保护。未经本团队书面授权, +# | 任何个人或单位不得基于本产品本身申请任何形式的知识产权。 +# | 二、使用限制与禁止条款 +# | 您理解并同意,禁止将本产品用于以下任何行为: +# | 1. 任何违反中华人民共和国法律法规的用途; +# | 2. 任何侵害他人合法权益(包括但不限于人身权、财产权、知识产权等)的行为; +# | 3. 任何危害国家安全、公共利益及社会道德风尚的行为。 +# | 三、责任豁免 +# | 因使用本产品而产生的任何损失或法律纠纷(包括但不限于直接损失、间接损失、附带损失、衍生损失 +# | 以及因违约、侵权等引发的责任),本团队均不承担任何法律责任。若因违规使用本产品导致任何第三 +# | 方提起索赔或行政机关进行调查,您应独立承担全部责任。 +# | 四、违约与法律责任 +# | 如发现任何违反本声明的行为,本团队有权: +# | 1. 无条件配合公安机关及其他有权机关的调查取证工作; +# | 2. 依法追究相关方的民事责任,并要求赔偿全部损失; +# | 3. 保留进一步采取刑事控告等法律措施的权利。 +# | 五、许可范围说明 +# | 1、被授权方应视本产品源代码为核心机密信息,负有最高标准的保密与保管义务。禁止以任何形式(包 +# | 括但不限于直接或间接的分享、复制、传播、分发、转售、出租、开源、反向工程、反编译、反汇编或通 +# | 过网络服务提供给任何第三方)泄露、披露或处置源代码的全部或部分内容。任何未经授权的复制、使用、 +# | 传播行为均构成对本团队知识产权的严重侵权,本团队有权依法追究其全部法律责任,并要求赔偿因此造 +# | 成的一切经济损失及商誉损害。 +# | 2、本产品仅限于公司或个人在法律允许范围内,用于内部且合规的软件产品研发。具体权利义务以《软件 +# | 许可协议》附件为准。 +# +====================================================================== + +""" +角色菜单表单验证模块 +============================================================= + +提供角色菜单相关的表单验证功能,包括: +- 角色菜单分配表单验证 +""" + +from wtforms import IntegerField +from wtforms.fields.choices import SelectMultipleField +from wtforms.validators import DataRequired, NumberRange, Optional + +from src.common.forms.base_form import BaseForm + + +# ============================================================ +# 角色菜单表单验证 +# ============================================================ + +class RoleMenuForm(BaseForm): + """ + 角色菜单表单验证类 + + 用于角色分配菜单权限时的数据验证。 + + Attributes: + roleId: 角色ID(必填,必须大于0) + menuIds: 菜单ID列表(可选,多个菜单ID用逗号分隔) + """ + + # ============================================================ + # 角色ID + # ============================================================ + roleId = IntegerField( + label='角色ID', + validators=[ + DataRequired(message='角色ID不能为空'), + NumberRange(min=1, message='角色ID必须大于0') + ], + description='要分配菜单权限的角色ID' + ) + + # ============================================================ + # 菜单ID列表 + # ============================================================ + menuIds = SelectMultipleField( + label='菜单ID列表', + validators=[ + Optional(), # 允许为空(清空所有菜单权限) + ], + coerce=int, # 将每个选项值转换为整数 + choices=[], # 动态设置,可在视图层传入 + validate_choice=False, # 关键:禁用选项验证 + description='分配的菜单ID列表' + ) diff --git a/src/modules/association/user_role/schema.py b/src/modules/association/user_role/schema.py new file mode 100644 index 0000000..31afe6d --- /dev/null +++ b/src/modules/association/user_role/schema.py @@ -0,0 +1,51 @@ +""" +用户角色表单验证模块 +============================================================= + +提供用户角色相关的表单验证功能,包括: +- 用户角色分配表单验证 +""" + +from wtforms import IntegerField +from wtforms.fields.choices import SelectMultipleField +from wtforms.validators import DataRequired, NumberRange, Optional + +from src.common.forms.base_form import BaseForm + + +# ============================================================ +# 用户角色表单验证 +# ============================================================ + +class UserRoleForm(BaseForm): + """ + 用户角色表单验证类 + + 用于用户分配角色权限时的数据验证。 + + Attributes: + userId: 用户ID(必填,必须大于0) + roleIds: 角色ID列表(可选,多个角色ID) + """ + + # 用户ID + userId = IntegerField( + label='用户ID', + validators=[ + DataRequired(message='用户ID不能为空'), + NumberRange(min=1, message='用户ID必须大于0') + ], + description='要分配角色的用户ID' + ) + + # 角色ID列表 + roleIds = SelectMultipleField( + label='角色ID列表', + validators=[ + Optional(), + ], + coerce=int, + choices=[], + validate_choice=False, + description='分配的角色ID列表' + ) diff --git a/src/modules/auth/__init__.py b/src/modules/auth/__init__.py new file mode 100644 index 0000000..56ff4f7 --- /dev/null +++ b/src/modules/auth/__init__.py @@ -0,0 +1 @@ +"""模块包。""" diff --git a/src/modules/auth/schema.py b/src/modules/auth/schema.py new file mode 100644 index 0000000..7144dda --- /dev/null +++ b/src/modules/auth/schema.py @@ -0,0 +1,118 @@ +# +====================================================================== +# | DjangoAdmin 企业数字化开发平台 [ 赋能开发者,助力企业发展 ] +# +---------------------------------------------------------------------- +# | Copyright (c) 2021-2026 一米阳光团队 版权所有 +# +---------------------------------------------------------------------- +# | 开源协议: Apache-2.0 +# | 重要声明: 未经书面许可,不得移除或修改本框架相关版权标识。 +# +---------------------------------------------------------------------- +# | 官方网站: https://www.djangoadmin.cn +# +---------------------------------------------------------------------- +# | 研发团队: 一米阳光团队 荣誉出品 +# +====================================================================== +# | 版权和免责声明: +# | 一、知识产权声明 +# | 本团队对该软件框架产品(以下简称“本产品”)拥有完整知识产权,包括但不限于商标权、专利权、 +# | 著作权、商业秘密等。前述权利均受中华人民共和国及相关国际法律法规保护。未经本团队书面授权, +# | 任何个人或单位不得基于本产品本身申请任何形式的知识产权。 +# | 二、使用限制与禁止条款 +# | 您理解并同意,禁止将本产品用于以下任何行为: +# | 1. 任何违反中华人民共和国法律法规的用途; +# | 2. 任何侵害他人合法权益(包括但不限于人身权、财产权、知识产权等)的行为; +# | 3. 任何危害国家安全、公共利益及社会道德风尚的行为。 +# | 三、责任豁免 +# | 因使用本产品而产生的任何损失或法律纠纷(包括但不限于直接损失、间接损失、附带损失、衍生损失 +# | 以及因违约、侵权等引发的责任),本团队均不承担任何法律责任。若因违规使用本产品导致任何第三 +# | 方提起索赔或行政机关进行调查,您应独立承担全部责任。 +# | 四、违约与法律责任 +# | 如发现任何违反本声明的行为,本团队有权: +# | 1. 无条件配合公安机关及其他有权机关的调查取证工作; +# | 2. 依法追究相关方的民事责任,并要求赔偿全部损失; +# | 3. 保留进一步采取刑事控告等法律措施的权利。 +# | 五、许可范围说明 +# | 1、被授权方应视本产品源代码为核心机密信息,负有最高标准的保密与保管义务。禁止以任何形式(包 +# | 括但不限于直接或间接的分享、复制、传播、分发、转售、出租、开源、反向工程、反编译、反汇编或通 +# | 过网络服务提供给任何第三方)泄露、披露或处置源代码的全部或部分内容。任何未经授权的复制、使用、 +# | 传播行为均构成对本团队知识产权的严重侵权,本团队有权依法追究其全部法律责任,并要求赔偿因此造 +# | 成的一切经济损失及商誉损害。 +# | 2、本产品仅限于公司或个人在法律允许范围内,用于内部且合规的软件产品研发。具体权利义务以《软件 +# | 许可协议》附件为准。 +# +====================================================================== + +""" +登录表单验证模块 +============================================================= + +提供登录相关的表单验证功能,包括: +- 用户登录表单验证 +""" + +from wtforms import StringField +from wtforms.validators import DataRequired, Length + +from src.common.forms.base_form import BaseForm + + +# ============================================================ +# 登录表单验证 +# ============================================================ + +class LoginForm(BaseForm): + """ + 登录表单验证类 + + 用于用户登录时的数据验证。 + + Attributes: + username: 登录账号(必填,最长20字符) + password: 登录密码(必填,长度6~12字符) + code: 验证码(必填,长度6字符) + key: KEY值(必填,用于验证码校验) + """ + + # ============================================================ + # 登录账号 + # ============================================================ + username = StringField( + label='登录账号', + validators=[ + DataRequired(message='登录账号不能为空'), + Length(max=20, message='登录账号长度不得超过20个字符') + ], + description='用户登录账号,支持用户名/手机号/邮箱' + ) + + # ============================================================ + # 登录密码 + # ============================================================ + password = StringField( + label='登录密码', + validators=[ + DataRequired(message='登录密码不能为空'), + Length(min=6, max=12, message='登录密码长度在6~12个字符之间') + ], + description='用户登录密码,长度6-12个字符' + ) + + # ============================================================ + # 验证码 + # ============================================================ + code = StringField( + label='验证码', + validators=[ + DataRequired(message='验证码不能为空'), + Length(min=6, max=6, message='验证码长度为6个字符') + ], + description='图片验证码,不区分大小写' + ) + + # ============================================================ + # KEY值 + # ============================================================ + key = StringField( + label='KEY值', + validators=[ + DataRequired(message='KEY值不能为空'), + ], + description='验证码唯一标识KEY,用于从缓存中获取验证码' + ) diff --git a/src/modules/city/schema.py b/src/modules/city/schema.py new file mode 100644 index 0000000..c745b71 --- /dev/null +++ b/src/modules/city/schema.py @@ -0,0 +1,211 @@ +# +====================================================================== +# | DjangoAdmin 企业数字化开发平台 [ 赋能开发者,助力企业发展 ] +# +---------------------------------------------------------------------- +# | Copyright (c) 2021-2026 一米阳光团队 版权所有 +# +---------------------------------------------------------------------- +# | 开源协议: Apache-2.0 +# | 重要声明: 未经书面许可,不得移除或修改本框架相关版权标识。 +# +---------------------------------------------------------------------- +# | 官方网站: https://www.djangoadmin.cn +# +---------------------------------------------------------------------- +# | 研发团队: 一米阳光团队 荣誉出品 +# +====================================================================== +# | 版权和免责声明: +# | 一、知识产权声明 +# | 本团队对该软件框架产品(以下简称“本产品”)拥有完整知识产权,包括但不限于商标权、专利权、 +# | 著作权、商业秘密等。前述权利均受中华人民共和国及相关国际法律法规保护。未经本团队书面授权, +# | 任何个人或单位不得基于本产品本身申请任何形式的知识产权。 +# | 二、使用限制与禁止条款 +# | 您理解并同意,禁止将本产品用于以下任何行为: +# | 1. 任何违反中华人民共和国法律法规的用途; +# | 2. 任何侵害他人合法权益(包括但不限于人身权、财产权、知识产权等)的行为; +# | 3. 任何危害国家安全、公共利益及社会道德风尚的行为。 +# | 三、责任豁免 +# | 因使用本产品而产生的任何损失或法律纠纷(包括但不限于直接损失、间接损失、附带损失、衍生损失 +# | 以及因违约、侵权等引发的责任),本团队均不承担任何法律责任。若因违规使用本产品导致任何第三 +# | 方提起索赔或行政机关进行调查,您应独立承担全部责任。 +# | 四、违约与法律责任 +# | 如发现任何违反本声明的行为,本团队有权: +# | 1. 无条件配合公安机关及其他有权机关的调查取证工作; +# | 2. 依法追究相关方的民事责任,并要求赔偿全部损失; +# | 3. 保留进一步采取刑事控告等法律措施的权利。 +# | 五、许可范围说明 +# | 1、被授权方应视本产品源代码为核心机密信息,负有最高标准的保密与保管义务。禁止以任何形式(包 +# | 括但不限于直接或间接的分享、复制、传播、分发、转售、出租、开源、反向工程、反编译、反汇编或通 +# | 过网络服务提供给任何第三方)泄露、披露或处置源代码的全部或部分内容。任何未经授权的复制、使用、 +# | 传播行为均构成对本团队知识产权的严重侵权,本团队有权依法追究其全部法律责任,并要求赔偿因此造 +# | 成的一切经济损失及商誉损害。 +# | 2、本产品仅限于公司或个人在法律允许范围内,用于内部且合规的软件产品研发。具体权利义务以《软件 +# | 许可协议》附件为准。 +# +====================================================================== + +""" +城市表单验证模块 +============================================================= + +提供城市相关的表单验证功能,包括: +- 城市添加/更新表单验证 +""" + +from wtforms import IntegerField, StringField +from wtforms.validators import NumberRange, DataRequired, Length, Optional + +from src.common.forms.base_form import BaseForm + + +# ============================================================ +# 城市表单验证(添加和更新共用) +# ============================================================ + +class CityForm(BaseForm): + """ + 城市表单验证类 + + 用于添加和更新城市时的数据验证。 + 添加时 id 为 None,更新时 id 必须有值。 + + Attributes: + id: 城市ID(更新时必填,添加时可选) + name: 城市名称(必填,最长150字符,不可重复) + shortName: 城市简称(必填,最长150字符) + pinyin: 城市拼音(必填,最长150字符) + cityCode: 城市区号(必填,最长6字符) + areaCode: 行政编码(必填,最长20字符) + zipCode: 城市邮编(必填,最长6字符) + level: 城市级别(必填,1-省份,2-城市,3-县区,4-街道) + lng: 城市经度(必填,最长150字符) + lat: 城市纬度(必填,最长150字符) + pid: 上级ID(可选) + """ + + # ============================================================ + # 城市ID + # ============================================================ + id = IntegerField( + label='城市ID', + validators=[ + # 允许为空(添加时) + Optional(), # 允许为空(添加时) + NumberRange(min=1, message='城市ID必须大于0') + ], + description='城市唯一标识,更新时必填,添加时自动生成' + ) + + # ============================================================ + # 城市区号 + # ============================================================ + cityCode = StringField( + label='城市区号', + validators=[ + DataRequired(message='城市区号不能为空'), + Length(max=6, message='城市区号长度不得超过6个字符') + ], + description='电话区号,如:010、021' + ) + + # ============================================================ + # 行政编码 + # ============================================================ + areaCode = StringField( + label='行政编码', + validators=[ + DataRequired(message='行政编码不能为空'), + Length(max=20, message='行政编码长度不得超过20个字符') + ], + description='国家行政区域编码' + ) + + # ============================================================ + # 上级编码 + # ============================================================ + parentCode = StringField( + label='上级编码', + validators=[ + DataRequired(message='上级编码不能为空'), + Length(max=20, message='上级编码长度不得超过20个字符') + ], + description='国家行政区域上级编码' + ) + + # ============================================================ + # 城市邮编 + # ============================================================ + zipCode = StringField( + label='城市邮编', + validators=[ + DataRequired(message='城市邮编不能为空'), + Length(max=6, message='城市邮编长度不得超过6个字符') + ], + description='邮政编码' + ) + + # ============================================================ + # 城市级别 + # ============================================================ + level = IntegerField( + label='城市级别', + validators=[ + DataRequired(message='城市级别不能为空'), + NumberRange(min=1, max=4, message='城市级别值在1~4之间') + ], + description='城市级别:1-省份,2-城市,3-县区,4-街道' + ) + + # ============================================================ + # 城市名称 + # ============================================================ + name = StringField( + label='城市名称', + validators=[ + DataRequired(message='城市名称不能为空'), + Length(max=150, message='城市名称长度不得超过150个字符') + ], + description='城市显示名称,如:北京市、上海市' + ) + + # ============================================================ + # 城市简称 + # ============================================================ + shortName = StringField( + label='城市简称', + validators=[ + DataRequired(message='城市简称不能为空'), + Length(max=150, message='城市简称长度不得超过150个字符') + ], + description='城市简称,如:京、沪' + ) + + # ============================================================ + # 上级ID + # ============================================================ + pid = IntegerField( + label='上级ID', + validators=[ + # 可选字段,用于树形结构 + ], + description='上级城市ID,用于构建城市层级关系' + ) + + # ============================================================ + # 城市经度 + # ============================================================ + lng = StringField( + label='城市经度', + validators=[ + DataRequired(message='城市经度不能为空'), + Length(max=150, message='城市经度长度不得超过150个字符') + ], + description='地理经度坐标' + ) + + # ============================================================ + # 城市纬度 + # ============================================================ + lat = StringField( + label='城市纬度', + validators=[ + DataRequired(message='城市纬度不能为空'), + Length(max=150, message='城市纬度长度不得超过150个字符') + ], + description='地理纬度坐标' + ) diff --git a/src/modules/cms/article/schema.py b/src/modules/cms/article/schema.py new file mode 100644 index 0000000..91594c4 --- /dev/null +++ b/src/modules/cms/article/schema.py @@ -0,0 +1,218 @@ +""" +文章表单验证模块 +============================================================= + +提供文章相关的表单验证功能,包括: +- 文章添加/更新表单验证 +- 文章状态设置表单验证 +""" + +from wtforms import IntegerField, StringField, TextAreaField +from wtforms.validators import NumberRange, DataRequired, Length, Optional + +from src.common.forms.base_form import BaseForm + + +# ============================================================ +# 文章表单验证(添加和更新共用) +# ============================================================ + +class ArticleForm(BaseForm): + """ + 文章表单验证类 + + 用于添加和更新文章时的数据验证。 + 添加时 id 为 None,更新时 id 必须有值。 + + Attributes: + id: 文章ID(更新时必填,添加时可选) + categoryId: 分类ID(可选) + title: 文章标题(可选,最长150字符) + cover: 文章封面(可选,最长255字符) + images: 文章图集(可选,JSON格式) + intro: 文章导读(可选,最长255字符) + content: 文章内容(可选) + author: 文章作者(可选,最长100字符) + status: 文章状态(可选,0-正常,1-下架) + sort: 文章排序(可选,0-99999之间的整数) + """ + + # ============================================================ + # 文章ID + # ============================================================ + id = IntegerField( + label='文章ID', + validators=[ + Optional(), + NumberRange(min=1, message='文章ID必须大于0') + ], + description='文章唯一标识,更新时必填,添加时自动生成' + ) + + # ============================================================ + # 分类ID + # ============================================================ + categoryId = IntegerField( + label='分类ID', + validators=[ + Optional(), + NumberRange(min=0, message='分类ID必须大于等于0') + ], + description='文章所属分类ID' + ) + + # ============================================================ + # 文章标题 + # ============================================================ + title = StringField( + label='文章标题', + validators=[ + Optional(), + Length(max=150, message='文章标题长度不得超过150个字符') + ], + description='文章标题' + ) + + # ============================================================ + # 文章封面(逗号分隔的图片路径) + # ============================================================ + cover = StringField( + label='文章封面', + validators=[ + Optional(), + Length(max=255, message='文章封面路径长度不得超过255个字符') + ], + description='文章封面图片URL' + ) + + # ============================================================ + # 文章图集 + # ============================================================ + images = TextAreaField( + label='文章图集', + validators=[ + Optional() + ], + description='文章图集,JSON格式存储多张图片' + ) + + # ============================================================ + # 文章导读 + # ============================================================ + intro = StringField( + label='文章导读', + validators=[ + Optional(), + Length(max=255, message='文章导读长度不得超过255个字符') + ], + description='文章简介/导读' + ) + + # ============================================================ + # 文章内容 + # ============================================================ + content = TextAreaField( + label='文章内容', + validators=[ + Optional() + ], + description='文章正文内容,支持富文本' + ) + + # ============================================================ + # 文章作者 + # ============================================================ + author = StringField( + label='文章作者', + validators=[ + Optional(), + Length(max=100, message='文章作者长度不得超过100个字符') + ], + description='文章作者名称' + ) + + # ============================================================ + # 文章状态 + # ============================================================ + status = IntegerField( + label='文章状态', + validators=[ + Optional(), + NumberRange(min=0, max=1, message='文章状态值在0~1之间') + ], + description='文章状态:0-正常,1-下架' + ) + + # ============================================================ + # 文章排序 + # ============================================================ + sort = IntegerField( + label='文章排序', + validators=[ + Optional(), + NumberRange(min=0, max=99999, message='文章排序值在0~99999之间') + ], + description='排序值,数值越小越靠前' + ) + + # # ============================================================ + # # 自定义验证方法 + # # ============================================================ + # + # def validate_images(self, field): + # """ + # 自定义验证:验证images字段是否为有效的JSON格式 + # + # Args: + # field: images 字段对象 + # + # Raises: + # ValidationError: JSON格式无效时抛出验证错误 + # """ + # if field.data: + # try: + # # 尝试解析JSON + # if isinstance(field.data, str): + # json.loads(field.data) + # except json.JSONDecodeError: + # raise ValidationError("图集格式无效,请传入有效的JSON数组") + + +# ============================================================ +# 文章状态设置表单 +# ============================================================ + +class ArticleStatusForm(BaseForm): + """ + 文章状态设置表单验证类 + + 用于单独修改文章状态时的数据验证。 + + Attributes: + id: 文章ID(必填,必须大于0) + status: 文章状态(必填,0-正常,1-下架) + """ + + # ============================================================ + # 文章ID + # ============================================================ + id = IntegerField( + label='文章ID', + validators=[ + DataRequired(message='文章ID不能为空'), + NumberRange(min=1, message='文章ID必须大于0') + ], + description='要修改状态的文章ID' + ) + + # ============================================================ + # 文章状态 + # ============================================================ + status = IntegerField( + label='文章状态', + validators=[ + DataRequired(message='文章状态不能为空'), + NumberRange(min=0, max=1, message='文章状态值在0~1之间') + ], + description='目标状态:0-正常,1-下架' + ) diff --git a/src/modules/cms/category/schema.py b/src/modules/cms/category/schema.py new file mode 100644 index 0000000..f849a7c --- /dev/null +++ b/src/modules/cms/category/schema.py @@ -0,0 +1,178 @@ +""" +分类表单验证模块 +============================================================= + +提供分类相关的表单验证功能,包括: +- 分类添加/更新表单验证 +""" + +from wtforms import ValidationError, IntegerField, StringField +from wtforms.validators import NumberRange, DataRequired, Length, Optional + +from src.common.forms.base_form import BaseForm +from src.modules.cms.category.models import Category + + +# ============================================================ +# 分类表单验证(添加和更新共用) +# ============================================================ + +class CategoryForm(BaseForm): + """ + 分类表单验证类 + + 用于添加和更新分类时的数据验证。 + 添加时 id 为 None,更新时 id 必须有值。 + + Attributes: + id: 分类ID(更新时必填,添加时可选) + categoryName: 分类名称(必填,最长100字符,不可重复) + categoryCode: 分类编码(可选,最长100字符,不可重复) + parentId: 上级ID(可选,不得小于0) + sort: 分类排序(可选,0-99999之间的整数) + note: 分类备注(可选,最长100字符) + type: 分类类型(必填,1-公司,2-子公司,3-部门,4-小组) + """ + + # ============================================================ + # 分类ID + # ============================================================ + id = IntegerField( + label='分类ID', + validators=[ + Optional(), # 允许为空(添加时) + NumberRange(min=1, message='分类ID必须大于0') + ], + description='分类唯一标识,更新时必填,添加时自动生成' + ) + + # ============================================================ + # 分类名称 + # ============================================================ + categoryName = StringField( + label='分类名称', + validators=[ + DataRequired(message='分类名称不能为空'), + Length(max=100, message='分类名称长度不得超过100个字符') + ], + description='分类显示名称,如:新闻资讯、产品动态' + ) + + # ============================================================ + # 分类编码 + # ============================================================ + categoryCode = StringField( + label='分类编码', + validators=[ + Optional(), + Length(max=100, message='分类编码长度不得超过100个字符') + ], + description='分类唯一标识编码,用于程序调用' + ) + + # ============================================================ + # 上级ID + # ============================================================ + parentId = IntegerField( + label='上级ID', + validators=[ + NumberRange(min=0, message='上级ID不得小于0') + ], + description='上级分类ID,0表示顶级分类' + ) + + # ============================================================ + # 分类排序 + # ============================================================ + sort = IntegerField( + label='分类排序', + validators=[ + Optional(), + NumberRange(min=0, max=99999, message='分类排序值在0~99999之间') + ], + description='排序值,数值越小越靠前' + ) + + # ============================================================ + # 分类备注 + # ============================================================ + note = StringField( + label='分类备注', + validators=[ + Optional(), + Length(max=100, message='分类备注长度不得超过100个字符') + ], + description='分类补充说明' + ) + + # ============================================================ + # 自定义验证方法 + # ============================================================ + + def validate_categoryName(self, field): + """ + 自定义验证:分类名称不能重复 + + 验证逻辑: + 1. 添加时:检查数据库中是否存在同名记录 + 2. 更新时:排除当前记录自身,检查其他记录是否同名 + + Args: + field: categoryName 字段对象 + + Raises: + ValidationError: 分类名称已存在时抛出验证错误 + """ + if not field.data: + return + + # 获取当前记录的ID(更新时存在,添加时为None) + current_id = self.id.data if self.id.data else None + + # 构建查询:查找同名记录 + query = Category.query.filter( + Category.category_name == field.data, + Category.is_delete == 0 + ) + + # 如果是更新操作,排除当前记录自身 + if current_id: + query = query.filter(Category.id != current_id) + + # 如果存在同名记录,抛出验证错误 + if query.first(): + raise ValidationError("分类名称已存在") + + def validate_categoryCode(self, field): + """ + 自定义验证:分类编码不能重复 + + 验证逻辑: + 1. 添加时:检查数据库中是否存在相同编码的记录 + 2. 更新时:排除当前记录自身,检查其他记录是否编码相同 + + Args: + field: categoryCode 字段对象 + + Raises: + ValidationError: 分类编码已存在时抛出验证错误 + """ + if not field.data: + return + + # 获取当前记录的ID(更新时存在,添加时为None) + current_id = self.id.data if self.id.data else None + + # 构建查询:查找相同编码的记录 + query = Category.query.filter( + Category.category_code == field.data, + Category.is_delete == 0 + ) + + # 如果是更新操作,排除当前记录自身 + if current_id: + query = query.filter(Category.id != current_id) + + # 如果存在相同编码的记录,抛出验证错误 + if query.first(): + raise ValidationError("分类编码已存在") diff --git a/src/modules/cms/link/schema.py b/src/modules/cms/link/schema.py new file mode 100644 index 0000000..fc01a94 --- /dev/null +++ b/src/modules/cms/link/schema.py @@ -0,0 +1,261 @@ +# +====================================================================== +# | DjangoAdmin 企业数字化开发平台 [ 赋能开发者,助力企业发展 ] +# +---------------------------------------------------------------------- +# | Copyright (c) 2021-2026 一米阳光团队 版权所有 +# +---------------------------------------------------------------------- +# | 开源协议: Apache-2.0 +# | 重要声明: 未经书面许可,不得移除或修改本框架相关版权标识。 +# +---------------------------------------------------------------------- +# | 官方网站: https://www.djangoadmin.cn +# +---------------------------------------------------------------------- +# | 研发团队: 一米阳光团队 荣誉出品 +# +====================================================================== +# | 版权和免责声明: +# | 一、知识产权声明 +# | 本团队对该软件框架产品(以下简称“本产品”)拥有完整知识产权,包括但不限于商标权、专利权、 +# | 著作权、商业秘密等。前述权利均受中华人民共和国及相关国际法律法规保护。未经本团队书面授权, +# | 任何个人或单位不得基于本产品本身申请任何形式的知识产权。 +# | 二、使用限制与禁止条款 +# | 您理解并同意,禁止将本产品用于以下任何行为: +# | 1. 任何违反中华人民共和国法律法规的用途; +# | 2. 任何侵害他人合法权益(包括但不限于人身权、财产权、知识产权等)的行为; +# | 3. 任何危害国家安全、公共利益及社会道德风尚的行为。 +# | 三、责任豁免 +# | 因使用本产品而产生的任何损失或法律纠纷(包括但不限于直接损失、间接损失、附带损失、衍生损失 +# | 以及因违约、侵权等引发的责任),本团队均不承担任何法律责任。若因违规使用本产品导致任何第三 +# | 方提起索赔或行政机关进行调查,您应独立承担全部责任。 +# | 四、违约与法律责任 +# | 如发现任何违反本声明的行为,本团队有权: +# | 1. 无条件配合公安机关及其他有权机关的调查取证工作; +# | 2. 依法追究相关方的民事责任,并要求赔偿全部损失; +# | 3. 保留进一步采取刑事控告等法律措施的权利。 +# | 五、许可范围说明 +# | 1、被授权方应视本产品源代码为核心机密信息,负有最高标准的保密与保管义务。禁止以任何形式(包 +# | 括但不限于直接或间接的分享、复制、传播、分发、转售、出租、开源、反向工程、反编译、反汇编或通 +# | 过网络服务提供给任何第三方)泄露、披露或处置源代码的全部或部分内容。任何未经授权的复制、使用、 +# | 传播行为均构成对本团队知识产权的严重侵权,本团队有权依法追究其全部法律责任,并要求赔偿因此造 +# | 成的一切经济损失及商誉损害。 +# | 2、本产品仅限于公司或个人在法律允许范围内,用于内部且合规的软件产品研发。具体权利义务以《软件 +# | 许可协议》附件为准。 +# +====================================================================== + +""" +友链表单验证模块 +============================================================= + +提供友链相关的表单验证功能,包括: +- 友链添加/更新表单验证 +- 友链状态设置表单验证 +""" + +from wtforms import ValidationError, IntegerField, StringField +from wtforms.validators import NumberRange, DataRequired, Length, Optional + +from src.common.forms.base_form import BaseForm +from src.modules.cms.link.models import Link + + +# ============================================================ +# 友链表单验证(添加和更新共用) +# ============================================================ + +class LinkForm(BaseForm): + """ + 友链表单验证类 + + 用于添加和更新友链时的数据验证。 + 添加时 id 为 None,更新时 id 必须有值。 + + Attributes: + id: 友链ID(更新时必填,添加时可选) + name: 友链名称(必填,最长255字符,不可重复) + type: 友链类型(必填,1-友情链接,2-合作伙伴) + url: 友链URL(必填,最长255字符) + form: 友链形式(必填,1-文字链接,2-图片链接) + image: 友链图片(必填,最长255字符) + status: 友链状态(必填,1-在用,2-停用) + sort: 友链排序(必填,0-99999之间的整数) + note: 友链备注(可选,最长255字符) + """ + + # ============================================================ + # 友链ID + # ============================================================ + id = IntegerField( + label='友链ID', + validators=[ + Optional(), # 允许为空(添加时) + NumberRange(min=1, message='友链ID必须大于0') + ], + description='友链唯一标识,更新时必填,添加时自动生成' + ) + + # ============================================================ + # 友链名称 + # ============================================================ + name = StringField( + label='友链名称', + validators=[ + DataRequired(message='友链名称不能为空'), + Length(max=255, message='友链名称长度不得超过255个字符') + ], + description='友链显示名称,如:百度、谷歌' + ) + + # ============================================================ + # 友链类型 + # ============================================================ + type = IntegerField( + label='友链类型', + validators=[ + DataRequired(message='友链类型不能为空'), + NumberRange(min=1, max=2, message='友链类型值在1~2之间') + ], + description='友链类型:1-友情链接,2-合作伙伴' + ) + + # ============================================================ + # 友链URL + # ============================================================ + url = StringField( + label='友链URL', + validators=[ + DataRequired(message='友链URL不能为空'), + Length(max=255, message='友链URL长度不得超过255个字符') + ], + description='友链跳转地址,如:https://www.example.com' + ) + + # ============================================================ + # 友链形式 + # ============================================================ + form = IntegerField( + label='友链形式', + validators=[ + DataRequired(message='友链形式不能为空'), + NumberRange(min=1, max=2, message='友链形式的值在1~2之间') + ], + description='友链形式:1-文字链接,2-图片链接' + ) + + # ============================================================ + # 友链图片 + # ============================================================ + image = StringField( + label='友链图片', + validators=[ + DataRequired(message='友链图片不能为空'), + Length(max=255, message='友链图片长度不得超过255个字符') + ], + description='友链图片地址,当友链形式为图片链接时必填' + ) + + # ============================================================ + # 友链状态 + # ============================================================ + status = IntegerField( + label='友链状态', + validators=[ + DataRequired(message='友链状态不能为空'), + NumberRange(min=1, max=2, message='友链状态值在1~2之间') + ], + description='友链状态:1-在用,2-停用' + ) + + # ============================================================ + # 友链排序 + # ============================================================ + sort = IntegerField( + label='友链排序', + validators=[ + Optional(), + NumberRange(min=0, max=99999, message='友链排序值在0~99999之间') + ], + description='排序值,数值越小越靠前' + ) + + # ============================================================ + # 友链备注 + # ============================================================ + note = StringField( + label='友链备注', + validators=[ + Length(max=255, message='友链备注长度不得超过255个字符') + ], + description='友链补充说明' + ) + + # ============================================================ + # 自定义验证方法 + # ============================================================ + + def validate_name(self, field): + """ + 自定义验证:友链名称不能重复 + + 验证逻辑: + 1. 添加时:检查数据库中是否存在同名记录 + 2. 更新时:排除当前记录自身,检查其他记录是否同名 + + Args: + field: name 字段对象 + + Raises: + ValidationError: 友链名称已存在时抛出验证错误 + """ + if not field.data: + return + + # 获取当前记录的ID(更新时存在,添加时为None) + current_id = self.id.data if self.id.data else None + + # 构建查询:查找同名记录 + query = Link.query.filter(Link.name == field.data, Link.is_delete == 0) + + # 如果是更新操作,排除当前记录自身 + if current_id: + query = query.filter(Link.id != current_id) + + # 如果存在同名记录,抛出验证错误 + if query.first(): + raise ValidationError("友链名称已存在") + + +# ============================================================ +# 状态设置表单 +# ============================================================ + +class LinkStatusForm(BaseForm): + """ + 友链状态设置表单验证类 + + 用于单独修改友链状态时的数据验证。 + + Attributes: + id: 友链ID(必填,必须大于0) + status: 友链状态(必填,1-在用,2-停用) + """ + + # ============================================================ + # 友链ID + # ============================================================ + id = IntegerField( + label='友链ID', + validators=[ + DataRequired(message='友链ID不能为空'), + NumberRange(min=1, message='友链ID必须大于0') + ], + description='要修改状态的友链ID' + ) + + # ============================================================ + # 友链状态 + # ============================================================ + status = IntegerField( + label='友链状态', + validators=[ + DataRequired(message='友链状态不能为空'), + NumberRange(min=1, max=2, message='友链状态值在1~2之间') + ], + description='目标状态:1-在用,2-停用' + ) diff --git a/src/modules/configuration/schema.py b/src/modules/configuration/schema.py new file mode 100644 index 0000000..ccf868e --- /dev/null +++ b/src/modules/configuration/schema.py @@ -0,0 +1,451 @@ +# +====================================================================== +# | DjangoAdmin 企业数字化开发平台 [ 赋能开发者,助力企业发展 ] +# +---------------------------------------------------------------------- +# | Copyright (c) 2021-2026 一米阳光团队 版权所有 +# +---------------------------------------------------------------------- +# | 开源协议: Apache-2.0 +# | 重要声明: 未经书面许可,不得移除或修改本框架相关版权标识。 +# +---------------------------------------------------------------------- +# | 官方网站: https://www.djangoadmin.cn +# +---------------------------------------------------------------------- +# | 研发团队: 一米阳光团队 荣誉出品 +# +====================================================================== +# | 版权和免责声明: +# | 一、知识产权声明 +# | 本团队对该软件框架产品(以下简称“本产品”)拥有完整知识产权,包括但不限于商标权、专利权、 +# | 著作权、商业秘密等。前述权利均受中华人民共和国及相关国际法律法规保护。未经本团队书面授权, +# | 任何个人或单位不得基于本产品本身申请任何形式的知识产权。 +# | 二、使用限制与禁止条款 +# | 您理解并同意,禁止将本产品用于以下任何行为: +# | 1. 任何违反中华人民共和国法律法规的用途; +# | 2. 任何侵害他人合法权益(包括但不限于人身权、财产权、知识产权等)的行为; +# | 3. 任何危害国家安全、公共利益及社会道德风尚的行为。 +# | 三、责任豁免 +# | 因使用本产品而产生的任何损失或法律纠纷(包括但不限于直接损失、间接损失、附带损失、衍生损失 +# | 以及因违约、侵权等引发的责任),本团队均不承担任何法律责任。若因违规使用本产品导致任何第三 +# | 方提起索赔或行政机关进行调查,您应独立承担全部责任。 +# | 四、违约与法律责任 +# | 如发现任何违反本声明的行为,本团队有权: +# | 1. 无条件配合公安机关及其他有权机关的调查取证工作; +# | 2. 依法追究相关方的民事责任,并要求赔偿全部损失; +# | 3. 保留进一步采取刑事控告等法律措施的权利。 +# | 五、许可范围说明 +# | 1、被授权方应视本产品源代码为核心机密信息,负有最高标准的保密与保管义务。禁止以任何形式(包 +# | 括但不限于直接或间接的分享、复制、传播、分发、转售、出租、开源、反向工程、反编译、反汇编或通 +# | 过网络服务提供给任何第三方)泄露、披露或处置源代码的全部或部分内容。任何未经授权的复制、使用、 +# | 传播行为均构成对本团队知识产权的严重侵权,本团队有权依法追究其全部法律责任,并要求赔偿因此造 +# | 成的一切经济损失及商誉损害。 +# | 2、本产品仅限于公司或个人在法律允许范围内,用于内部且合规的软件产品研发。具体权利义务以《软件 +# | 许可协议》附件为准。 +# +====================================================================== + +""" +配置表单验证模块 +============================================================= + +提供配置相关的表单验证功能,包括: +- 配置添加/更新表单验证 +- 配置名称唯一性验证 +- 配置编码唯一性验证 + +命名规范: +- 类名使用驼峰命名(如 ConfigForm) +- 字段名使用下划线命名(如 name, code, sort) +- 验证方法使用 validate_字段名 格式 +""" + +from wtforms import IntegerField, StringField +from wtforms.validators import NumberRange, DataRequired, Length, ValidationError, Optional + +from src.common.forms.base_form import BaseForm +from src.modules.configuration.models import Config + + +# ============================================================ +# 配置表单验证(添加和更新共用) +# ============================================================ + +class ConfigForm(BaseForm): + """ + 配置表单验证类 + + 用于添加和更新配置时的数据验证。 + 添加时 id 为 None,更新时 id 必须有值。 + + Attributes: + id: 配置ID(更新时必填,添加时可选) + name: 配置名称(必填,最长100字符,不可重复) + code: 配置编码(必填,最长100字符,不可重复) + sort: 配置排序(必填,0-99999之间的整数) + note: 配置备注(可选,最长255字符) + """ + + # ============================================================ + # 配置ID + # ============================================================ + id = IntegerField( + label='配置ID', + validators=[ + Optional(), # 允许为空(添加时) + NumberRange(min=1, message='配置ID必须大于0') + ], + description='配置唯一标识,更新时必填,添加时自动生成' + ) + + # ============================================================ + # 配置名称 + # ============================================================ + name = StringField( + label='配置名称', + validators=[ + DataRequired(message='配置名称不能为空'), + Length(max=100, message='配置名称长度不得超过100个字符') + ], + description='配置显示名称' + ) + + # ============================================================ + # 配置编码 + # ============================================================ + code = StringField( + label='配置编码', + validators=[ + DataRequired(message='配置编码不能为空'), + Length(max=100, message='配置编码长度不得超过100个字符') + ], + description='配置唯一标识编码,用于程序调用' + ) + + # ============================================================ + # 配置排序 + # ============================================================ + sort = IntegerField( + label='配置排序', + validators=[ + Optional(), + NumberRange(min=0, max=99999, message='配置排序值在0~99999之间') + ], + description='排序值,数值越小越靠前' + ) + + # ============================================================ + # 配置备注 + # ============================================================ + note = StringField( + label='配置备注', + validators=[ + Length(max=255, message='配置备注长度不得超过255个字符') + ], + description='配置补充说明' + ) + + # ============================================================ + # 自定义验证方法 + # ============================================================ + + def validate_name(self, field): + """ + 自定义验证:配置名称不能重复 + + 验证逻辑: + 1. 添加时:检查数据库中是否存在同名记录 + 2. 更新时:排除当前记录自身,检查其他记录是否同名 + + Args: + field: name 字段对象 + + Raises: + ValidationError: 配置名称已存在时抛出验证错误 + """ + if not field.data: + return + + # 获取当前记录的ID(更新时存在,添加时为None) + current_id = self.id.data if self.id.data else None + + # 构建查询:查找同名记录 + query = Config.query.filter(Config.name == field.data, Config.is_delete == 0) + + # 如果是更新操作,排除当前记录自身 + if current_id: + query = query.filter(Config.id != current_id) + + # 如果存在同名记录,抛出验证错误 + if query.first(): + raise ValidationError("配置名称已存在") + + def validate_code(self, field): + """ + 自定义验证:配置编码不能重复 + + 验证逻辑: + 1. 添加时:检查数据库中是否存在相同编码的记录 + 2. 更新时:排除当前记录自身,检查其他记录是否编码相同 + + Args: + field: code 字段对象 + + Raises: + ValidationError: 配置编码已存在时抛出验证错误 + """ + if not field.data: + return + + # 获取当前记录的ID(更新时存在,添加时为None) + current_id = self.id.data if self.id.data else None + + # 构建查询:查找相同编码的记录 + query = Config.query.filter(Config.code == field.data, Config.is_delete == 0) + + # 如果是更新操作,排除当前记录自身 + if current_id: + query = query.filter(Config.id != current_id) + + # 如果存在相同编码的记录,抛出验证错误 + if query.first(): + raise ValidationError("配置编码已存在") + + + +""" +配置项表单验证模块 +============================================================= + +提供配置项相关的表单验证功能,包括: +- 配置项添加/更新表单验证 +- 配置项状态设置表单验证 +""" + +from wtforms import ValidationError, IntegerField, StringField +from wtforms.validators import NumberRange, DataRequired, Length, Optional + +from src.common.forms.base_form import BaseForm +from src.modules.configuration.models import ConfigItem + + +# ============================================================ +# 配置项表单验证(添加和更新共用) +# ============================================================ + +class ConfigItemForm(BaseForm): + """ + 配置项表单验证类 + + 用于添加和更新配置项时的数据验证。 + 添加时 id 为 None,更新时 id 必须有值。 + + Attributes: + id: 配置项ID(更新时必填,添加时可选) + configId: 配置ID(必填,不得小于0) + name: 配置项名称(必填,最长100字符,不可重复) + code: 配置项编码(必填,最长100字符,不可重复) + value: 配置项值(必填,最长1000字符) + options: 配置选项(可选,最长1000字符) + type: 配置类型(必填,最长100字符) + sort: 配置项排序(必填,0-99999之间的整数) + note: 配置项备注(可选,最长255字符) + """ + + # ============================================================ + # 配置项ID + # ============================================================ + id = IntegerField( + label='配置项ID', + validators=[ + Optional(), # 允许为空(添加时) + NumberRange(min=1, message='配置项ID必须大于0') + ], + description='配置项唯一标识,更新时必填,添加时自动生成' + ) + + # ============================================================ + # 配置ID + # ============================================================ + configId = IntegerField( + label='配置ID', + validators=[ + DataRequired(message='配置ID不能为空'), + NumberRange(min=0, message='配置ID不得小于0') + ], + description='配置ID' + ) + + # ============================================================ + # 配置项名称 + # ============================================================ + name = StringField( + label='配置项名称', + validators=[ + DataRequired(message='配置项名称不能为空'), + Length(max=100, message='配置项名称长度不得超过100个字符') + ], + description='配置项显示标题' + ) + + # ============================================================ + # 配置项编码 + # ============================================================ + code = StringField( + label='配置项编码', + validators=[ + DataRequired(message='配置项编码不能为空'), + Length(max=100, message='配置项编码长度不得超过100个字符') + ], + description='配置项唯一标识编码' + ) + + # ============================================================ + # 配置项值 + # ============================================================ + value = StringField( + label='配置项值', + validators=[ + DataRequired(message='配置项值不能为空'), + Length(max=1000, message='配置项值长度不得超过1000个字符') + ], + description='配置项存储值' + ) + + # ============================================================ + # 配置选项 + # ============================================================ + options = StringField( + label='配置选项', + validators=[ + Length(max=1000, message='配置选项长度不得超过1000个字符') + ], + description='配置项可选值列表,用于下拉选择等场景' + ) + + # ============================================================ + # 配置类型 + # ============================================================ + type = StringField( + label='配置类型', + validators=[ + DataRequired(message='配置类型不能为空'), + Length(max=100, message='配置类型长度不得超过100个字符') + ], + description='配置项数据类型,如:text、number、select等' + ) + + # ============================================================ + # 配置项排序 + # ============================================================ + sort = IntegerField( + label='配置项排序', + validators=[ + Optional(), + NumberRange(min=0, max=99999, message='配置项排序值在0~99999之间') + ], + description='排序值,数值越小越靠前' + ) + + # ============================================================ + # 配置项备注 + # ============================================================ + note = StringField( + label='配置项备注', + validators=[ + Length(max=255, message='配置项备注长度不得超过255个字符') + ], + description='配置项补充说明' + ) + + # ============================================================ + # 自定义验证方法 + # ============================================================ + + def validate_name(self, field): + """ + 自定义验证:配置项名称不能重复 + + 验证逻辑: + 1. 添加时:检查数据库中是否存在同名记录 + 2. 更新时:排除当前记录自身,检查其他记录是否同名 + + Args: + field: name 字段对象 + + Raises: + ValidationError: 配置项名称已存在时抛出验证错误 + """ + if not field.data: + return + + current_id = self.id.data if self.id.data else None + + query = ConfigItem.query.filter(ConfigItem.name == field.data, ConfigItem.is_delete == 0) + + if current_id: + query = query.filter(ConfigItem.id != current_id) + + if query.first(): + raise ValidationError("配置项名称已存在") + + def validate_code(self, field): + """ + 自定义验证:配置项编码不能重复 + + 验证逻辑: + 1. 添加时:检查数据库中是否存在相同编码记录 + 2. 更新时:排除当前记录自身,检查其他记录是否相同编码 + + Args: + field: code 字段对象 + + Raises: + ValidationError: 配置项编码已存在时抛出验证错误 + """ + if not field.data: + return + + current_id = self.id.data if self.id.data else None + + query = ConfigItem.query.filter(ConfigItem.code == field.data, ConfigItem.is_delete == 0) + + if current_id: + query = query.filter(ConfigItem.id != current_id) + + if query.first(): + raise ValidationError("配置项编码已存在") + + +# ============================================================ +# 状态设置表单 +# ============================================================ + +class ConfigItemStatusForm(BaseForm): + """ + 配置项状态设置表单验证类 + + 用于单独修改配置项状态时的数据验证。 + + Attributes: + id: 配置项ID(必填,必须大于0) + status: 配置项状态(必填,1-在用,2-停用) + """ + + # ============================================================ + # 配置项ID + # ============================================================ + id = IntegerField( + label='配置项ID', + validators=[ + DataRequired(message='配置项ID不能为空'), + NumberRange(min=1, message='配置项ID必须大于0') + ], + description='要修改状态的配置项ID' + ) + + # ============================================================ + # 配置项状态 + # ============================================================ + status = IntegerField( + label='配置项状态', + validators=[ + DataRequired(message='配置项状态不能为空'), + NumberRange(min=1, max=2, message='配置项状态值在1~2之间') + ], + description='目标状态:1-在用,2-停用' + ) diff --git a/src/modules/dictionary/schema.py b/src/modules/dictionary/schema.py new file mode 100644 index 0000000..5a9cfb9 --- /dev/null +++ b/src/modules/dictionary/schema.py @@ -0,0 +1,383 @@ +# +====================================================================== +# | DjangoAdmin 企业数字化开发平台 [ 赋能开发者,助力企业发展 ] +# +---------------------------------------------------------------------- +# | Copyright (c) 2021-2026 一米阳光团队 版权所有 +# +---------------------------------------------------------------------- +# | 开源协议: Apache-2.0 +# | 重要声明: 未经书面许可,不得移除或修改本框架相关版权标识。 +# +---------------------------------------------------------------------- +# | 官方网站: https://www.djangoadmin.cn +# +---------------------------------------------------------------------- +# | 研发团队: 一米阳光团队 荣誉出品 +# +====================================================================== +# | 版权和免责声明: +# | 一、知识产权声明 +# | 本团队对该软件框架产品(以下简称“本产品”)拥有完整知识产权,包括但不限于商标权、专利权、 +# | 著作权、商业秘密等。前述权利均受中华人民共和国及相关国际法律法规保护。未经本团队书面授权, +# | 任何个人或单位不得基于本产品本身申请任何形式的知识产权。 +# | 二、使用限制与禁止条款 +# | 您理解并同意,禁止将本产品用于以下任何行为: +# | 1. 任何违反中华人民共和国法律法规的用途; +# | 2. 任何侵害他人合法权益(包括但不限于人身权、财产权、知识产权等)的行为; +# | 3. 任何危害国家安全、公共利益及社会道德风尚的行为。 +# | 三、责任豁免 +# | 因使用本产品而产生的任何损失或法律纠纷(包括但不限于直接损失、间接损失、附带损失、衍生损失 +# | 以及因违约、侵权等引发的责任),本团队均不承担任何法律责任。若因违规使用本产品导致任何第三 +# | 方提起索赔或行政机关进行调查,您应独立承担全部责任。 +# | 四、违约与法律责任 +# | 如发现任何违反本声明的行为,本团队有权: +# | 1. 无条件配合公安机关及其他有权机关的调查取证工作; +# | 2. 依法追究相关方的民事责任,并要求赔偿全部损失; +# | 3. 保留进一步采取刑事控告等法律措施的权利。 +# | 五、许可范围说明 +# | 1、被授权方应视本产品源代码为核心机密信息,负有最高标准的保密与保管义务。禁止以任何形式(包 +# | 括但不限于直接或间接的分享、复制、传播、分发、转售、出租、开源、反向工程、反编译、反汇编或通 +# | 过网络服务提供给任何第三方)泄露、披露或处置源代码的全部或部分内容。任何未经授权的复制、使用、 +# | 传播行为均构成对本团队知识产权的严重侵权,本团队有权依法追究其全部法律责任,并要求赔偿因此造 +# | 成的一切经济损失及商誉损害。 +# | 2、本产品仅限于公司或个人在法律允许范围内,用于内部且合规的软件产品研发。具体权利义务以《软件 +# | 许可协议》附件为准。 +# +====================================================================== + +""" +字典表单验证模块 +============================================================= + +提供字典相关的表单验证功能,包括: +- 字典添加/更新表单验证 +""" + +from wtforms import ValidationError, IntegerField, StringField +from wtforms.validators import NumberRange, DataRequired, Length, Optional + +from src.common.forms.base_form import BaseForm +from src.modules.dictionary.models import Dict + + +# ============================================================ +# 字典表单验证(添加和更新共用) +# ============================================================ + +class DictForm(BaseForm): + """ + 字典表单验证类 + + 用于添加和更新字典时的数据验证。 + 添加时 id 为 None,更新时 id 必须有值。 + + Attributes: + id: 字典ID(更新时必填,添加时可选) + name: 字典名称(必填,最长150字符,不可重复) + code: 字典编码(必填,最长150字符,不可重复) + sort: 字典排序(必填,0-99999之间的整数) + note: 字典备注(可选,最长255字符) + """ + + # ============================================================ + # 字典ID + # ============================================================ + id = IntegerField( + label='字典ID', + validators=[ + Optional(), # 允许为空(添加时) + NumberRange(min=1, message='字典ID必须大于0') + ], + description='字典唯一标识,更新时必填,添加时自动生成' + ) + + # ============================================================ + # 字典名称 + # ============================================================ + name = StringField( + label='字典名称', + validators=[ + DataRequired(message='字典名称不能为空'), + Length(max=150, message='字典名称长度不得超过150个字符') + ], + description='字典显示名称,如:性别、状态' + ) + + # ============================================================ + # 字典编码 + # ============================================================ + code = StringField( + label='字典编码', + validators=[ + DataRequired(message='字典编码不能为空'), + Length(max=150, message='字典编码长度不得超过150个字符') + ], + description='字典唯一标识编码,如:gender、status' + ) + + # ============================================================ + # 字典排序 + # ============================================================ + sort = IntegerField( + label='字典排序', + validators=[ + Optional(), + NumberRange(min=0, max=99999, message='字典排序值在0~99999之间') + ], + description='排序值,数值越小越靠前' + ) + + # ============================================================ + # 字典备注 + # ============================================================ + note = StringField( + label='字典备注', + validators=[ + Length(max=255, message='字典备注长度不得超过255个字符') + ], + description='字典补充说明' + ) + + # ============================================================ + # 自定义验证方法 + # ============================================================ + + def validate_name(self, field): + """ + 自定义验证:字典名称不能重复 + + 验证逻辑: + 1. 添加时:检查数据库中是否存在同名记录 + 2. 更新时:排除当前记录自身,检查其他记录是否同名 + + Args: + field: name 字段对象 + + Raises: + ValidationError: 字典名称已存在时抛出验证错误 + """ + if not field.data: + return + + # 获取当前记录的ID(更新时存在,添加时为None) + current_id = self.id.data if self.id.data else None + + # 构建查询:查找同名记录 + query = Dict.query.filter(Dict.name == field.data, Dict.is_delete == 0) + + # 如果是更新操作,排除当前记录自身 + if current_id: + query = query.filter(Dict.id != current_id) + + # 如果存在同名记录,抛出验证错误 + if query.first(): + raise ValidationError("字典名称已存在") + + def validate_code(self, field): + """ + 自定义验证:字典编码不能重复 + + 验证逻辑: + 1. 添加时:检查数据库中是否存在相同编码记录 + 2. 更新时:排除当前记录自身,检查其他记录是否相同编码 + + Args: + field: code 字段对象 + + Raises: + ValidationError: 字典编码已存在时抛出验证错误 + """ + if not field.data: + return + + # 获取当前记录的ID(更新时存在,添加时为None) + current_id = self.id.data if self.id.data else None + + # 构建查询:查找相同编码记录 + query = Dict.query.filter(Dict.code == field.data, Dict.is_delete == 0) + + # 如果是更新操作,排除当前记录自身 + if current_id: + query = query.filter(Dict.id != current_id) + + # 如果存在相同编码记录,抛出验证错误 + if query.first(): + raise ValidationError("字典编码已存在") + + + +""" +字典项表单验证模块 +============================================================= + +提供字典项相关的表单验证功能,包括: +- 字典项添加/更新表单验证 +""" + +from wtforms import ValidationError, IntegerField, StringField +from wtforms.validators import NumberRange, DataRequired, Length, Optional + +from src.common.forms.base_form import BaseForm +from src.modules.dictionary.models import DictItem + + +# ============================================================ +# 字典项表单验证(添加和更新共用) +# ============================================================ + +class DictItemForm(BaseForm): + """ + 字典项表单验证类 + + 用于添加和更新字典项时的数据验证。 + 添加时 id 为 None,更新时 id 必须有值。 + + Attributes: + id: 字典项ID(更新时必填,添加时可选) + name: 字典项名称(必填,最长150字符,不可重复) + value: 字典项值(必填,最长150字符) + dictId: 字典ID(必填,不得小于0) + note: 字典项备注(可选,最长255字符) + sort: 字典项排序(必填,0-99999之间的整数) + """ + + # ============================================================ + # 字典项ID + # ============================================================ + id = IntegerField( + label='字典项ID', + validators=[ + Optional(), # 允许为空(添加时) + NumberRange(min=1, message='字典项ID必须大于0') + ], + description='字典项唯一标识,更新时必填,添加时自动生成' + ) + + # ============================================================ + # 字典项名称 + # ============================================================ + name = StringField( + label='字典项名称', + validators=[ + DataRequired(message='字典项名称不能为空'), + Length(max=150, message='字典项名称长度不得超过150个字符') + ], + description='字典项显示名称,如:男、女' + ) + + # ============================================================ + # 字典项值 + # ============================================================ + value = StringField( + label='字典项值', + validators=[ + DataRequired(message='字典项值不能为空'), + Length(max=150, message='字典项值长度不得超过150个字符') + ], + description='字典项实际存储值,如:1、2' + ) + + # ============================================================ + # 字典ID + # ============================================================ + dictId = IntegerField( + label='字典ID', + validators=[ + DataRequired(message='字典ID不能为空'), + NumberRange(min=0, message='字典ID值不得小于0') + ], + description='所属字典分组ID' + ) + + # ============================================================ + # 字典项备注 + # ============================================================ + note = StringField( + label='字典项备注', + validators=[ + Length(max=255, message='字典项备注长度不得超过255个字符') + ], + description='字典项补充说明' + ) + + # ============================================================ + # 字典项排序 + # ============================================================ + sort = IntegerField( + label='字典项排序', + validators=[ + Optional(), + NumberRange(min=0, max=99999, message='字典项排序值在0~99999之间') + ], + description='排序值,数值越小越靠前' + ) + + # ============================================================ + # 自定义验证方法 + # ============================================================ + + def validate_name(self, field): + """ + 自定义验证:字典项名称不能重复 + + 验证逻辑: + 1. 添加时:检查数据库中是否存在同名记录 + 2. 更新时:排除当前记录自身,检查其他记录是否同名 + + Args: + field: name 字段对象 + + Raises: + ValidationError: 字典项名称已存在时抛出验证错误 + """ + if not field.data: + return + + # 获取当前记录的ID(更新时存在,添加时为None) + current_id = self.id.data if self.id.data else None + + # 构建查询:查找同名记录 + query = DictItem.query.filter(DictItem.name == field.data, DictItem.is_delete == 0) + + # 如果是更新操作,排除当前记录自身 + if current_id: + query = query.filter(DictItem.id != current_id) + + # 如果存在同名记录,抛出验证错误 + if query.first(): + raise ValidationError("字典项名称已存在") + + def validate_value(self, field): + """ + 自定义验证:字典项值在同一字典下不能重复 + + 验证逻辑: + 1. 添加时:检查同一字典下是否存在相同值记录 + 2. 更新时:排除当前记录自身,检查其他记录是否相同值 + + Args: + field: value 字段对象 + + Raises: + ValidationError: 字典项值已存在时抛出验证错误 + """ + if not field.data: + return + + # 获取当前记录的ID(更新时存在,添加时为None) + current_id = self.id.data if self.id.data else None + + # 获取字典ID + dict_id = self.dictId.data if self.dictId.data else None + + if dict_id is None: + return + + # 构建查询:查找同一字典下相同值的记录 + query = DictItem.query.filter( + DictItem.dict_id == dict_id, + DictItem.value == field.data, + DictItem.is_delete == 0 + ) + + # 如果是更新操作,排除当前记录自身 + if current_id: + query = query.filter(DictItem.id != current_id) + + # 如果存在相同值记录,抛出验证错误 + if query.first(): + raise ValidationError("字典项值已存在") diff --git a/src/modules/file_template/schema.py b/src/modules/file_template/schema.py new file mode 100644 index 0000000..257859b --- /dev/null +++ b/src/modules/file_template/schema.py @@ -0,0 +1,156 @@ +""" +文件模板表单验证模块 +============================================================= + +提供文件模板相关的表单验证功能,包括: +- 文件模板添加/更新表单验证 +""" + +from wtforms import ValidationError, StringField, IntegerField +from wtforms.validators import DataRequired, Length, NumberRange, Optional + +from src.common.forms.base_form import BaseForm +from src.modules.file_template.models import FileTemplate + + +# ============================================================ +# 文件模板表单验证(添加和更新共用) +# ============================================================ + +class FileTemplateForm(BaseForm): + """ + 文件模板表单验证类 + + 用于添加和更新文件模板时的数据验证。 + + Attributes: + id: 模板ID(更新时必填,添加时可选) + name: 模板名称(可选,最长100字符) + code: 模板编码(可选,最长50字符,不可重复) + fileName: 文件名称(可选,最长255字符) + filePath: 文件路径(可选,最长255字符) + note: 模板备注(可选,最长255字符) + sort: 模板排序(必填,0-99999之间的整数) + """ + + # ============================================================ + # 模板ID + # ============================================================ + id = IntegerField( + label='模板ID', + validators=[ + Optional(), # 允许为空(添加时) + NumberRange(min=1, message='模板ID必须大于0') + ], + description='模板唯一标识,更新时必填,添加时自动生成' + ) + + # ============================================================ + # 模板名称 + # ============================================================ + name = StringField( + label='模板名称', + validators=[ + Optional(), # 允许为空 + Length(max=100, message='模板名称长度不得超过100个字符') + ], + description='模板显示名称' + ) + + # ============================================================ + # 模板编码 + # ============================================================ + code = StringField( + label='模板编码', + validators=[ + Optional(), # 允许为空 + Length(max=50, message='模板编码长度不得超过50个字符') + ], + description='模板唯一标识编码,用于程序调用' + ) + + # ============================================================ + # 文件名称 + # ============================================================ + fileName = StringField( + label='文件名称', + validators=[ + Optional(), # 允许为空 + Length(max=255, message='文件名称长度不得超过255个字符') + ], + description='文件名称' + ) + + # ============================================================ + # 文件路径 + # ============================================================ + filePath = StringField( + label='文件路径', + validators=[ + Optional(), # 允许为空 + Length(max=255, message='文件路径长度不得超过255个字符') + ], + description='文件存储路径' + ) + + # ============================================================ + # 模板备注 + # ============================================================ + note = StringField( + label='模板备注', + validators=[ + Optional(), # 允许为空 + Length(max=255, message='模板备注长度不得超过255个字符') + ], + description='模板补充说明' + ) + + # ============================================================ + # 模板排序 + # ============================================================ + sort = IntegerField( + label='模板排序', + validators=[ + DataRequired(message='模板排序不能为空'), + NumberRange(min=0, max=99999, message='模板排序值在0~99999之间') + ], + description='排序值,数值越小越靠前' + ) + + # ============================================================ + # 自定义验证方法 + # ============================================================ + + def validate_code(self, field): + """ + 自定义验证:模板编码不能重复 + + 验证逻辑: + 1. 添加时:检查数据库中是否存在相同编码的记录 + 2. 更新时:排除当前记录自身,检查其他记录是否编码相同 + + Args: + field: code 字段对象 + + Raises: + ValidationError: 模板编码已存在时抛出验证错误 + """ + if not field.data: + return + + # 获取当前记录的ID(更新时存在,添加时为None) + current_id = self.id.data if self.id.data else None + + # 构建查询:查找相同编码的记录 + query = FileTemplate.query.filter( + FileTemplate.code == field.data, + FileTemplate.is_delete == 0 + ) + + # 如果是更新操作,排除当前记录自身 + if current_id: + query = query.filter(FileTemplate.id != current_id) + + # 如果存在相同编码的记录,抛出验证错误 + if query.first(): + raise ValidationError("模板编码已存在") diff --git a/src/modules/job/schema.py b/src/modules/job/schema.py new file mode 100644 index 0000000..c5ed0ac --- /dev/null +++ b/src/modules/job/schema.py @@ -0,0 +1,174 @@ +""" +定时任务表单验证模块 +============================================================= + +提供定时任务相关的表单验证功能。 +""" + +from wtforms import ValidationError, IntegerField, StringField +from wtforms.validators import NumberRange, DataRequired, Length, Optional + +from src.common.forms.base_form import BaseForm +from src.modules.job.models import Job + + +# ============================================================ +# 定时任务表单验证 +# ============================================================ + +class JobForm(BaseForm): + """ + 定时任务表单验证类 + + 用于添加和更新定时任务时的数据验证。 + """ + + # 任务ID + id = IntegerField( + label='任务ID', + validators=[ + Optional(), + NumberRange(min=1, message='任务ID必须大于0') + ], + description='任务唯一标识,更新时必填' + ) + + # 任务名称 + jobName = StringField( + label='任务名称', + validators=[ + DataRequired(message='任务名称不能为空'), + Length(max=255, message='任务名称长度不得超过255个字符') + ], + description='任务名称' + ) + + # 任务别名 + jobAlias = StringField( + label='任务别名', + validators=[ + Optional(), + Length(max=255, message='任务别名长度不得超过255个字符') + ], + description='任务别名' + ) + + # 任务分组 + jobGroup = StringField( + label='任务分组', + validators=[ + Optional(), + Length(max=255, message='任务分组长度不得超过255个字符') + ], + description='任务分组,默认DEFAULT' + ) + + # 任务触发器 + jobTrigger = StringField( + label='任务触发器', + validators=[ + Optional(), + Length(max=255, message='任务触发器长度不得超过255个字符') + ], + description='任务触发器标识' + ) + + # 任务状态 + status = IntegerField( + label='任务状态', + validators=[ + DataRequired(message='任务状态不能为空'), + NumberRange(min=0, max=3, message='任务状态值在0~3之间') + ], + description='任务状态:0-未发布 1-运行中 2-暂停 3-删除' + ) + + # Cron表达式 + cronExpression = StringField( + label='Cron表达式', + validators=[ + Optional(), + Length(max=255, message='Cron表达式长度不得超过255个字符') + ], + description='Cron表达式,如:0 2 * * *' + ) + + # 执行策略 + executePolicy = IntegerField( + label='执行策略', + validators=[ + DataRequired(message='执行策略不能为空'), + NumberRange(min=1, max=3, message='执行策略值在1~3之间') + ], + description='执行策略:1-立即执行 2-执行一次 3-放弃执行' + ) + + # 是否同步任务 + isSync = IntegerField( + label='是否同步任务', + validators=[ + DataRequired(message='是否同步任务不能为空'), + NumberRange(min=0, max=1, message='是否同步任务值在0~1之间') + ], + description='是否同步任务:0-异步 1-同步' + ) + + # 任务URL + url = StringField( + label='任务URL', + validators=[ + Optional(), + Length(max=255, message='任务URL长度不得超过255个字符') + ], + description='任务请求URL' + ) + + # 任务备注 + note = StringField( + label='任务备注', + validators=[ + Optional(), + Length(max=255, message='任务备注长度不得超过255个字符') + ], + description='任务备注说明' + ) + + def validate_job_name(self, field): + """验证任务名称不能重复""" + if not field.data: + return + + current_id = self.id.data if self.id.data else None + query = Job.query.filter(Job.job_name == field.data, Job.is_delete == 0) + + if current_id: + query = query.filter(Job.id != current_id) + + if query.first(): + raise ValidationError("任务名称已存在") + + +# ============================================================ +# 任务状态设置表单 +# ============================================================ + +class JobStatusForm(BaseForm): + """任务状态设置表单验证类""" + + id = IntegerField( + label='任务ID', + validators=[ + DataRequired(message='任务ID不能为空'), + NumberRange(min=1, message='任务ID必须大于0') + ], + description='要修改状态的任务ID' + ) + + status = IntegerField( + label='任务状态', + validators=[ + Optional(), + NumberRange(min=0, max=3, message='任务状态值在0~3之间') + ], + description='目标状态:0-未发布 1-运行中 2-暂停 3-删除' + ) diff --git a/src/modules/notice/schema.py b/src/modules/notice/schema.py new file mode 100644 index 0000000..7ab899b --- /dev/null +++ b/src/modules/notice/schema.py @@ -0,0 +1,181 @@ +# +====================================================================== +# | DjangoAdmin 企业数字化开发平台 [ 赋能开发者,助力企业发展 ] +# +---------------------------------------------------------------------- +# | Copyright (c) 2021-2026 一米阳光团队 版权所有 +# +---------------------------------------------------------------------- +# | 开源协议: Apache-2.0 +# | 重要声明: 未经书面许可,不得移除或修改本框架相关版权标识。 +# +---------------------------------------------------------------------- +# | 官方网站: https://www.djangoadmin.cn +# +---------------------------------------------------------------------- +# | 研发团队: 一米阳光团队 荣誉出品 +# +====================================================================== +# | 版权和免责声明: +# | 一、知识产权声明 +# | 本团队对该软件框架产品(以下简称“本产品”)拥有完整知识产权,包括但不限于商标权、专利权、 +# | 著作权、商业秘密等。前述权利均受中华人民共和国及相关国际法律法规保护。未经本团队书面授权, +# | 任何个人或单位不得基于本产品本身申请任何形式的知识产权。 +# | 二、使用限制与禁止条款 +# | 您理解并同意,禁止将本产品用于以下任何行为: +# | 1. 任何违反中华人民共和国法律法规的用途; +# | 2. 任何侵害他人合法权益(包括但不限于人身权、财产权、知识产权等)的行为; +# | 3. 任何危害国家安全、公共利益及社会道德风尚的行为。 +# | 三、责任豁免 +# | 因使用本产品而产生的任何损失或法律纠纷(包括但不限于直接损失、间接损失、附带损失、衍生损失 +# | 以及因违约、侵权等引发的责任),本团队均不承担任何法律责任。若因违规使用本产品导致任何第三 +# | 方提起索赔或行政机关进行调查,您应独立承担全部责任。 +# | 四、违约与法律责任 +# | 如发现任何违反本声明的行为,本团队有权: +# | 1. 无条件配合公安机关及其他有权机关的调查取证工作; +# | 2. 依法追究相关方的民事责任,并要求赔偿全部损失; +# | 3. 保留进一步采取刑事控告等法律措施的权利。 +# | 五、许可范围说明 +# | 1、被授权方应视本产品源代码为核心机密信息,负有最高标准的保密与保管义务。禁止以任何形式(包 +# | 括但不限于直接或间接的分享、复制、传播、分发、转售、出租、开源、反向工程、反编译、反汇编或通 +# | 过网络服务提供给任何第三方)泄露、披露或处置源代码的全部或部分内容。任何未经授权的复制、使用、 +# | 传播行为均构成对本团队知识产权的严重侵权,本团队有权依法追究其全部法律责任,并要求赔偿因此造 +# | 成的一切经济损失及商誉损害。 +# | 2、本产品仅限于公司或个人在法律允许范围内,用于内部且合规的软件产品研发。具体权利义务以《软件 +# | 许可协议》附件为准。 +# +====================================================================== + +""" +通知表单验证模块 +============================================================= + +提供通知相关的表单验证功能,包括: +- 通知添加/更新表单验证 +""" + +from wtforms import ValidationError, IntegerField, StringField +from wtforms.validators import NumberRange, DataRequired, Length, Optional + +from src.common.forms.base_form import BaseForm +from src.modules.notice.models import Notice + + +# ============================================================ +# 通知表单验证(添加和更新共用) +# ============================================================ + +class NoticeForm(BaseForm): + """ + 通知表单验证类 + + 用于添加和更新通知时的数据验证。 + 添加时 id 为 None,更新时 id 必须有值。 + + Attributes: + id: 通知ID(更新时必填,添加时可选) + title: 通知标题(必填,最长150字符,不可重复) + cover: 通知封面(必填,最长255字符) + type: 通知类型(必填,1-通知 2-公告) + status: 通知状态(必填,1-正常,2-停用) + content: 通知内容(可选) + """ + + # ============================================================ + # 通知ID + # ============================================================ + id = IntegerField( + label='通知ID', + validators=[ + Optional(), # 允许为空(添加时) + NumberRange(min=1, message='通知ID必须大于0') + ], + description='通知唯一标识,更新时必填,添加时自动生成' + ) + + # ============================================================ + # 通知标题 + # ============================================================ + title = StringField( + label='通知标题', + validators=[ + DataRequired(message='通知标题不能为空'), + Length(max=150, message='通知标题长度不得超过255个字符') + ], + description='通知标题,如:系统升级公告、节假日安排' + ) + + # ============================================================ + # 通知封面 + # ============================================================ + cover = StringField( + label='通知封面', + validators=[ + DataRequired(message='通知封面不能为空'), + Length(max=255, message='通知封面长度不得超过255个字符') + ], + description='通知封面' + ) + + # ============================================================ + # 通知类型 + # ============================================================ + type = IntegerField( + label='通知类型', + validators=[ + DataRequired(message='通知类型不能为空'), + NumberRange(min=1, max=2, message='通知类型值在1~4之间') + ], + description='通知类型:1-通知 2-公告' + ) + + # ============================================================ + # 通知状态 + # ============================================================ + status = IntegerField( + label='通知状态', + validators=[ + DataRequired(message='通知状态不能为空'), + NumberRange(min=1, max=2, message='通知状态值在1~2之间') + ], + description='通知状态:1-正常,2-停用' + ) + + # ============================================================ + # 通知内容 + # ============================================================ + content = StringField( + label='通知内容', + validators=[ + # 可选字段,支持富文本 + ], + description='通知详细内容,支持HTML格式' + ) + + # ============================================================ + # 自定义验证方法 + # ============================================================ + + def validate_title(self, field): + """ + 自定义验证:通知标题不能重复 + + 验证逻辑: + 1. 添加时:检查数据库中是否存在同名标题记录 + 2. 更新时:排除当前记录自身,检查其他记录是否同名 + + Args: + field: title 字段对象 + + Raises: + ValidationError: 通知标题已存在时抛出验证错误 + """ + if not field.data: + return + + # 获取当前记录的ID(更新时存在,添加时为None) + current_id = self.id.data if self.id.data else None + + # 构建查询:查找同名标题记录 + query = Notice.query.filter(Notice.title == field.data, Notice.is_delete == 0) + + # 如果是更新操作,排除当前记录自身 + if current_id: + query = query.filter(Notice.id != current_id) + + # 如果存在同名记录,抛出验证错误 + if query.first(): + raise ValidationError("通知标题已存在") diff --git a/src/modules/param/schema.py b/src/modules/param/schema.py new file mode 100644 index 0000000..ab29996 --- /dev/null +++ b/src/modules/param/schema.py @@ -0,0 +1,239 @@ +""" +参数表单验证模块 +============================================================= + +提供参数相关的表单验证功能,包括: +- 参数添加/更新表单验证 +- 参数状态设置表单验证 +""" + +from wtforms import ValidationError, StringField, IntegerField +from wtforms.validators import DataRequired, Length, NumberRange, Optional + +from src.common.forms.base_form import BaseForm +from src.modules.param.models import Param + + +# ============================================================ +# 参数表单验证(添加和更新共用) +# ============================================================ + +class ParamForm(BaseForm): + """ + 参数表单验证类 + + 用于添加和更新参数时的数据验证。 + 添加时 id 为 None,更新时 id 必须有值。 + + Attributes: + id: 参数ID(更新时必填,添加时可选) + name: 参数名称(必填,最长100字符,不可重复) + code: 参数编码(必填,最长100字符,不可重复) + value: 参数值(必填,最长255字符) + type: 参数类型(必填,0-系统 1-业务) + status: 参数状态(必填,1-正常 2-禁用) + sort: 参数排序(必填,0-99999之间的整数) + note: 参数备注(可选,最长255字符) + """ + + # ============================================================ + # 参数ID + # ============================================================ + id = IntegerField( + label='参数ID', + validators=[ + Optional(), # 允许为空(添加时) + NumberRange(min=1, message='参数ID必须大于0') + ], + description='参数唯一标识,更新时必填,添加时自动生成' + ) + + # ============================================================ + # 参数名称 + # ============================================================ + name = StringField( + label='参数名称', + validators=[ + DataRequired(message='参数名称不能为空'), + Length(max=100, message='参数名称长度不得超过100个字符') + ], + description='参数显示名称,如:网站名称、系统版本' + ) + + # ============================================================ + # 参数编码 + # ============================================================ + code = StringField( + label='参数编码', + validators=[ + DataRequired(message='参数编码不能为空'), + Length(max=100, message='参数编码长度不得超过100个字符') + ], + description='参数唯一标识编码,用于程序调用,如:site_name、system_version' + ) + + # ============================================================ + # 参数值 + # ============================================================ + value = StringField( + label='参数值', + validators=[ + DataRequired(message='参数值不能为空'), + Length(max=255, message='参数值长度不得超过255个字符') + ], + description='参数的具体值' + ) + + # ============================================================ + # 参数类型 + # ============================================================ + type = IntegerField( + label='参数类型', + validators=[ + Optional(), + NumberRange(min=0, max=1, message='参数类型值在0~1之间') + ], + description='参数类型:0-系统参数,1-业务参数' + ) + + # ============================================================ + # 参数状态 + # ============================================================ + status = IntegerField( + label='参数状态', + validators=[ + DataRequired(message='参数状态不能为空'), + NumberRange(min=1, max=2, message='参数状态值在1~2之间') + ], + description='参数状态:1-正常,2-禁用' + ) + + # ============================================================ + # 参数排序 + # ============================================================ + sort = IntegerField( + label='参数排序', + validators=[ + Optional(), + NumberRange(min=0, max=99999, message='参数排序值在0~99999之间') + ], + description='排序值,数值越小越靠前' + ) + + # ============================================================ + # 参数备注 + # ============================================================ + note = StringField( + label='参数备注', + validators=[ + Optional(), # 允许为空 + Length(max=255, message='参数备注长度不得超过255个字符') + ], + description='参数补充说明' + ) + + # ============================================================ + # 自定义验证方法 + # ============================================================ + + def validate_name(self, field): + """ + 自定义验证:参数名称不能重复 + + 验证逻辑: + 1. 添加时:检查数据库中是否存在同名记录 + 2. 更新时:排除当前记录自身,检查其他记录是否同名 + + Args: + field: name 字段对象 + + Raises: + ValidationError: 参数名称已存在时抛出验证错误 + """ + if not field.data: + return + + # 获取当前记录的ID(更新时存在,添加时为None) + current_id = self.id.data if self.id.data else None + + # 构建查询:查找同名记录 + query = Param.query.filter(Param.name == field.data, Param.is_delete == 0) + + # 如果是更新操作,排除当前记录自身 + if current_id: + query = query.filter(Param.id != current_id) + + # 如果存在同名记录,抛出验证错误 + if query.first(): + raise ValidationError("参数名称已存在") + + def validate_code(self, field): + """ + 自定义验证:参数编码不能重复 + + 验证逻辑: + 1. 添加时:检查数据库中是否存在相同编码的记录 + 2. 更新时:排除当前记录自身,检查其他记录是否编码相同 + + Args: + field: code 字段对象 + + Raises: + ValidationError: 参数编码已存在时抛出验证错误 + """ + if not field.data: + return + + # 获取当前记录的ID(更新时存在,添加时为None) + current_id = self.id.data if self.id.data else None + + # 构建查询:查找相同编码的记录 + query = Param.query.filter(Param.code == field.data, Param.is_delete == 0) + + # 如果是更新操作,排除当前记录自身 + if current_id: + query = query.filter(Param.id != current_id) + + # 如果存在相同编码的记录,抛出验证错误 + if query.first(): + raise ValidationError("参数编码已存在") + + +# ============================================================ +# 状态设置表单 +# ============================================================ + +class ParamStatusForm(BaseForm): + """ + 参数状态设置表单验证类 + + 用于单独修改参数状态时的数据验证。 + + Attributes: + id: 参数ID(必填,必须大于0) + status: 参数状态(必填,1-正常 2-禁用) + """ + + # ============================================================ + # 参数ID + # ============================================================ + id = IntegerField( + label='参数ID', + validators=[ + DataRequired(message='参数ID不能为空'), + NumberRange(min=1, message='参数ID必须大于0') + ], + description='要修改状态的参数ID' + ) + + # ============================================================ + # 参数状态 + # ============================================================ + status = IntegerField( + label='参数状态', + validators=[ + DataRequired(message='参数状态不能为空'), + NumberRange(min=1, max=2, message='参数状态值在1~2之间') + ], + description='目标状态:1-正常,2-禁用' + ) diff --git a/src/modules/system/dept/schema.py b/src/modules/system/dept/schema.py new file mode 100644 index 0000000..f3ed97b --- /dev/null +++ b/src/modules/system/dept/schema.py @@ -0,0 +1,181 @@ +# +====================================================================== +# | DjangoAdmin 企业数字化开发平台 [ 赋能开发者,助力企业发展 ] +# +---------------------------------------------------------------------- +# | Copyright (c) 2021-2026 一米阳光团队 版权所有 +# +---------------------------------------------------------------------- +# | 开源协议: Apache-2.0 +# | 重要声明: 未经书面许可,不得移除或修改本框架相关版权标识。 +# +---------------------------------------------------------------------- +# | 官方网站: https://www.djangoadmin.cn +# +---------------------------------------------------------------------- +# | 研发团队: 一米阳光团队 荣誉出品 +# +====================================================================== +# | 版权和免责声明: +# | 一、知识产权声明 +# | 本团队对该软件框架产品(以下简称“本产品”)拥有完整知识产权,包括但不限于商标权、专利权、 +# | 著作权、商业秘密等。前述权利均受中华人民共和国及相关国际法律法规保护。未经本团队书面授权, +# | 任何个人或单位不得基于本产品本身申请任何形式的知识产权。 +# | 二、使用限制与禁止条款 +# | 您理解并同意,禁止将本产品用于以下任何行为: +# | 1. 任何违反中华人民共和国法律法规的用途; +# | 2. 任何侵害他人合法权益(包括但不限于人身权、财产权、知识产权等)的行为; +# | 3. 任何危害国家安全、公共利益及社会道德风尚的行为。 +# | 三、责任豁免 +# | 因使用本产品而产生的任何损失或法律纠纷(包括但不限于直接损失、间接损失、附带损失、衍生损失 +# | 以及因违约、侵权等引发的责任),本团队均不承担任何法律责任。若因违规使用本产品导致任何第三 +# | 方提起索赔或行政机关进行调查,您应独立承担全部责任。 +# | 四、违约与法律责任 +# | 如发现任何违反本声明的行为,本团队有权: +# | 1. 无条件配合公安机关及其他有权机关的调查取证工作; +# | 2. 依法追究相关方的民事责任,并要求赔偿全部损失; +# | 3. 保留进一步采取刑事控告等法律措施的权利。 +# | 五、许可范围说明 +# | 1、被授权方应视本产品源代码为核心机密信息,负有最高标准的保密与保管义务。禁止以任何形式(包 +# | 括但不限于直接或间接的分享、复制、传播、分发、转售、出租、开源、反向工程、反编译、反汇编或通 +# | 过网络服务提供给任何第三方)泄露、披露或处置源代码的全部或部分内容。任何未经授权的复制、使用、 +# | 传播行为均构成对本团队知识产权的严重侵权,本团队有权依法追究其全部法律责任,并要求赔偿因此造 +# | 成的一切经济损失及商誉损害。 +# | 2、本产品仅限于公司或个人在法律允许范围内,用于内部且合规的软件产品研发。具体权利义务以《软件 +# | 许可协议》附件为准。 +# +====================================================================== + +""" +部门表单验证模块 +============================================================= + +提供部门相关的表单验证功能,包括: +- 部门添加/更新表单验证 +""" + +from wtforms import ValidationError, IntegerField, StringField +from wtforms.validators import NumberRange, DataRequired, Length, Optional + +from src.common.forms.base_form import BaseForm +from src.modules.system.dept.models import Dept + + +# ============================================================ +# 部门表单验证(添加和更新共用) +# ============================================================ + +class DeptForm(BaseForm): + """ + 部门表单验证类 + + 用于添加和更新部门时的数据验证。 + 添加时 id 为 None,更新时 id 必须有值。 + + Attributes: + id: 部门ID(更新时必填,添加时可选) + name: 部门名称(必填,最长150字符,不可重复) + code: 部门编码(必填,最长150字符,不可重复) + type: 部门类型(必填,1-公司,2-子公司,3-部门,4-小组) + parentId: 上级ID(可选,不得小于0) + sort: 部门排序(必填,0-99999之间的整数) + note: 部门备注(可选,最长255字符) + """ + + # ============================================================ + # 部门ID + # ============================================================ + id = IntegerField( + label='部门ID', + validators=[ + Optional(), # 允许为空(添加时) + NumberRange(min=1, message='部门ID必须大于0') + ], + description='部门唯一标识,更新时必填,添加时自动生成' + ) + + # ============================================================ + # 部门名称 + # ============================================================ + name = StringField( + label='部门名称', + validators=[ + DataRequired(message='部门名称不能为空'), + Length(max=150, message='部门名称长度不得超过150个字符') + ], + description='部门显示名称,如:技术部、市场部' + ) + + # ============================================================ + # 部门类型 + # ============================================================ + type = IntegerField( + label='部门类型', + validators=[ + DataRequired(message='部门类型不能为空'), + NumberRange(min=1, max=4, message='部门类型值在1~4之间') + ], + description='部门类型:1-公司,2-子公司,3-部门,4-小组' + ) + + # ============================================================ + # 上级ID + # ============================================================ + parentId = IntegerField( + label='上级ID', + validators=[ + NumberRange(min=0, message='上级ID不得小于0') + ], + description='上级部门ID,0表示顶级部门' + ) + + # ============================================================ + # 部门排序 + # ============================================================ + sort = IntegerField( + label='部门排序', + validators=[ + Optional(), + NumberRange(min=0, max=99999, message='部门排序值在0~99999之间') + ], + description='排序值,数值越小越靠前' + ) + + # ============================================================ + # 部门备注 + # ============================================================ + note = StringField( + label='部门备注', + validators=[ + Length(max=255, message='部门备注长度不得超过255个字符') + ], + description='部门补充说明' + ) + + # ============================================================ + # 自定义验证方法 + # ============================================================ + + def validate_name(self, field): + """ + 自定义验证:部门名称不能重复 + + 验证逻辑: + 1. 添加时:检查数据库中是否存在同名记录 + 2. 更新时:排除当前记录自身,检查其他记录是否同名 + + Args: + field: name 字段对象 + + Raises: + ValidationError: 部门名称已存在时抛出验证错误 + """ + if not field.data: + return + + # 获取当前记录的ID(更新时存在,添加时为None) + current_id = self.id.data if self.id.data else None + + # 构建查询:查找同名记录 + query = Dept.query.filter(Dept.name == field.data, Dept.is_delete == 0) + + # 如果是更新操作,排除当前记录自身 + if current_id: + query = query.filter(Dept.id != current_id) + + # 如果存在同名记录,抛出验证错误 + if query.first(): + raise ValidationError("部门名称已存在") diff --git a/src/modules/system/level/schema.py b/src/modules/system/level/schema.py new file mode 100644 index 0000000..6351770 --- /dev/null +++ b/src/modules/system/level/schema.py @@ -0,0 +1,197 @@ +# +====================================================================== +# | DjangoAdmin 企业数字化开发平台 [ 赋能开发者,助力企业发展 ] +# +---------------------------------------------------------------------- +# | Copyright (c) 2021-2026 一米阳光团队 版权所有 +# +---------------------------------------------------------------------- +# | 开源协议: Apache-2.0 +# | 重要声明: 未经书面许可,不得移除或修改本框架相关版权标识。 +# +---------------------------------------------------------------------- +# | 官方网站: https://www.djangoadmin.cn +# +---------------------------------------------------------------------- +# | 研发团队: 一米阳光团队 荣誉出品 +# +====================================================================== +# | 版权和免责声明: +# | 一、知识产权声明 +# | 本团队对该软件框架产品(以下简称“本产品”)拥有完整知识产权,包括但不限于商标权、专利权、 +# | 著作权、商业秘密等。前述权利均受中华人民共和国及相关国际法律法规保护。未经本团队书面授权, +# | 任何个人或单位不得基于本产品本身申请任何形式的知识产权。 +# | 二、使用限制与禁止条款 +# | 您理解并同意,禁止将本产品用于以下任何行为: +# | 1. 任何违反中华人民共和国法律法规的用途; +# | 2. 任何侵害他人合法权益(包括但不限于人身权、财产权、知识产权等)的行为; +# | 3. 任何危害国家安全、公共利益及社会道德风尚的行为。 +# | 三、责任豁免 +# | 因使用本产品而产生的任何损失或法律纠纷(包括但不限于直接损失、间接损失、附带损失、衍生损失 +# | 以及因违约、侵权等引发的责任),本团队均不承担任何法律责任。若因违规使用本产品导致任何第三 +# | 方提起索赔或行政机关进行调查,您应独立承担全部责任。 +# | 四、违约与法律责任 +# | 如发现任何违反本声明的行为,本团队有权: +# | 1. 无条件配合公安机关及其他有权机关的调查取证工作; +# | 2. 依法追究相关方的民事责任,并要求赔偿全部损失; +# | 3. 保留进一步采取刑事控告等法律措施的权利。 +# | 五、许可范围说明 +# | 1、被授权方应视本产品源代码为核心机密信息,负有最高标准的保密与保管义务。禁止以任何形式(包 +# | 括但不限于直接或间接的分享、复制、传播、分发、转售、出租、开源、反向工程、反编译、反汇编或通 +# | 过网络服务提供给任何第三方)泄露、披露或处置源代码的全部或部分内容。任何未经授权的复制、使用、 +# | 传播行为均构成对本团队知识产权的严重侵权,本团队有权依法追究其全部法律责任,并要求赔偿因此造 +# | 成的一切经济损失及商誉损害。 +# | 2、本产品仅限于公司或个人在法律允许范围内,用于内部且合规的软件产品研发。具体权利义务以《软件 +# | 许可协议》附件为准。 +# +====================================================================== + +""" +职级表单验证模块 +============================================================= + +提供职级相关的表单验证功能,包括: +- 职级添加/更新表单验证 +- 职级状态设置表单验证 +""" + +from wtforms import ValidationError, StringField, IntegerField +from wtforms.validators import DataRequired, Length, NumberRange, Optional + +from src.common.forms.base_form import BaseForm +from src.modules.system.level.models import Level + + +# ============================================================ +# 职级表单验证(添加和更新共用) +# ============================================================ + +class LevelForm(BaseForm): + """ + 职级表单验证类 + + 用于添加和更新职级时的数据验证。 + 添加时 id 为 None,更新时 id 必须有值。 + + Attributes: + id: 职级ID(更新时必填,添加时可选) + name: 职级名称(必填,最长150字符,不可重复) + status: 职级状态(必填,1-在用,2-停用) + sort: 职级排序(必填,0-99999之间的整数) + """ + + # ============================================================ + # 职级ID + # ============================================================ + id = IntegerField( + label='职级ID', + validators=[ + Optional(), # 允许为空(添加时) + NumberRange(min=1, message='职级ID必须大于0') + ], + description='职级唯一标识,更新时必填,添加时自动生成' + ) + + # ============================================================ + # 职级名称 + # ============================================================ + name = StringField( + label='职级名称', + validators=[ + DataRequired(message='职级名称不能为空'), + Length(max=150, message='职级名称长度不得超过150个字符') + ], + description='职级显示名称,如:初级、中级、高级' + ) + + # ============================================================ + # 职级状态 + # ============================================================ + status = IntegerField( + label='职级状态', + validators=[ + DataRequired(message='职级状态不能为空'), + NumberRange(min=1, max=2, message='职级状态值在1~2之间') + ], + description='职级状态:1-在用,2-停用' + ) + + # ============================================================ + # 职级排序 + # ============================================================ + sort = IntegerField( + label='职级排序', + validators=[ + Optional(), + NumberRange(min=0, max=99999, message='职级排序值在0~99999之间') + ], + description='排序值,数值越小越靠前' + ) + + # ============================================================ + # 自定义验证方法 + # ============================================================ + + def validate_name(self, field): + """ + 自定义验证:职级名称不能重复 + + 验证逻辑: + 1. 添加时:检查数据库中是否存在同名记录 + 2. 更新时:排除当前记录自身,检查其他记录是否同名 + + Args: + field: name 字段对象 + + Raises: + ValidationError: 职级名称已存在时抛出验证错误 + """ + if not field.data: + return + + # 获取当前记录的ID(更新时存在,添加时为None) + current_id = self.id.data if self.id.data else None + + # 构建查询:查找同名记录 + query = Level.query.filter(Level.name == field.data, Level.is_delete == 0) + + # 如果是更新操作,排除当前记录自身 + if current_id: + query = query.filter(Level.id != current_id) + + # 如果存在同名记录,抛出验证错误 + if query.first(): + raise ValidationError("职级名称已存在") + + +# ============================================================ +# 状态设置表单 +# ============================================================ + +class LevelStatusForm(BaseForm): + """ + 职级状态设置表单验证类 + + 用于单独修改职级状态时的数据验证。 + + Attributes: + id: 职级ID(必填,必须大于0) + status: 职级状态(必填,1-在用,2-停用) + """ + + # ============================================================ + # 职级ID + # ============================================================ + id = IntegerField( + label='职级ID', + validators=[ + DataRequired(message='职级ID不能为空'), + NumberRange(min=1, message='职级ID必须大于0') + ], + description='要修改状态的职级ID' + ) + + # ============================================================ + # 职级状态 + # ============================================================ + status = IntegerField( + label='职级状态', + validators=[ + DataRequired(message='职级状态不能为空'), + NumberRange(min=1, max=2, message='职级状态值在1~2之间') + ], + description='目标状态:1-在用,2-停用' + ) diff --git a/src/modules/system/menu/schema.py b/src/modules/system/menu/schema.py new file mode 100644 index 0000000..789d5be --- /dev/null +++ b/src/modules/system/menu/schema.py @@ -0,0 +1,272 @@ +# +====================================================================== +# | DjangoAdmin 企业数字化开发平台 [ 赋能开发者,助力企业发展 ] +# +---------------------------------------------------------------------- +# | Copyright (c) 2021-2026 一米阳光团队 版权所有 +# +---------------------------------------------------------------------- +# | 开源协议: Apache-2.0 +# | 重要声明: 未经书面许可,不得移除或修改本框架相关版权标识。 +# +---------------------------------------------------------------------- +# | 官方网站: https://www.djangoadmin.cn +# +---------------------------------------------------------------------- +# | 研发团队: 一米阳光团队 荣誉出品 +# +====================================================================== +# | 版权和免责声明: +# | 一、知识产权声明 +# | 本团队对该软件框架产品(以下简称“本产品”)拥有完整知识产权,包括但不限于商标权、专利权、 +# | 著作权、商业秘密等。前述权利均受中华人民共和国及相关国际法律法规保护。未经本团队书面授权, +# | 任何个人或单位不得基于本产品本身申请任何形式的知识产权。 +# | 二、使用限制与禁止条款 +# | 您理解并同意,禁止将本产品用于以下任何行为: +# | 1. 任何违反中华人民共和国法律法规的用途; +# | 2. 任何侵害他人合法权益(包括但不限于人身权、财产权、知识产权等)的行为; +# | 3. 任何危害国家安全、公共利益及社会道德风尚的行为。 +# | 三、责任豁免 +# | 因使用本产品而产生的任何损失或法律纠纷(包括但不限于直接损失、间接损失、附带损失、衍生损失 +# | 以及因违约、侵权等引发的责任),本团队均不承担任何法律责任。若因违规使用本产品导致任何第三 +# | 方提起索赔或行政机关进行调查,您应独立承担全部责任。 +# | 四、违约与法律责任 +# | 如发现任何违反本声明的行为,本团队有权: +# | 1. 无条件配合公安机关及其他有权机关的调查取证工作; +# | 2. 依法追究相关方的民事责任,并要求赔偿全部损失; +# | 3. 保留进一步采取刑事控告等法律措施的权利。 +# | 五、许可范围说明 +# | 1、被授权方应视本产品源代码为核心机密信息,负有最高标准的保密与保管义务。禁止以任何形式(包 +# | 括但不限于直接或间接的分享、复制、传播、分发、转售、出租、开源、反向工程、反编译、反汇编或通 +# | 过网络服务提供给任何第三方)泄露、披露或处置源代码的全部或部分内容。任何未经授权的复制、使用、 +# | 传播行为均构成对本团队知识产权的严重侵权,本团队有权依法追究其全部法律责任,并要求赔偿因此造 +# | 成的一切经济损失及商誉损害。 +# | 2、本产品仅限于公司或个人在法律允许范围内,用于内部且合规的软件产品研发。具体权利义务以《软件 +# | 许可协议》附件为准。 +# +====================================================================== + +""" +菜单表单验证模块 +============================================================= + +提供菜单相关的表单验证功能,包括: +- 菜单添加/更新表单验证 +""" + +from wtforms import ValidationError, IntegerField, StringField +from wtforms.validators import NumberRange, DataRequired, Length, Optional + +from src.common.forms.base_form import BaseForm +from src.modules.system.menu.models import Menu + + +# ============================================================ +# 菜单表单验证(添加和更新共用) +# ============================================================ + +class MenuForm(BaseForm): + """ + 菜单表单验证类 + + 用于添加和更新菜单时的数据验证。 + 添加时 id 为 None,更新时 id 必须有值。 + + Attributes: + id: 菜单ID(更新时必填,添加时可选) + name: 菜单名称(必填,最长100字符,同级不可重复) + icon: 菜单图标(可选,最长50字符) + path: 路由地址(可选,最长255字符) + component: 组件路径(可选,最长255字符) + parentId: 上级ID(可选) + type: 菜单类型(可选,0-菜单,1-节点) + target: 打开方式(可选,0-内部打开,1-外部打开,最长30字符) + permission: 权限节点(可选,最长100字符) + hide: 是否可见(可选,0-可见,1-不可见) + status: 菜单状态(必填,1-正常,2-禁用) + sort: 菜单排序(必填,0-99999之间的整数) + note: 菜单备注(可选,最长255字符) + checkedList: 权限节点列表(可选,最长500字符) + """ + + # ============================================================ + # 菜单ID + # ============================================================ + id = IntegerField( + label='菜单ID', + validators=[ + Optional(), # 允许为空(添加时) + NumberRange(min=1, message='菜单ID必须大于0') + ], + description='菜单唯一标识,更新时必填,添加时自动生成' + ) + + # ============================================================ + # 菜单名称 + # ============================================================ + name = StringField( + label='菜单名称', + validators=[ + DataRequired(message='菜单名称不能为空'), + Length(max=100, message='菜单名称长度不得超过100个字符') + ], + description='菜单显示标题,如:系统管理、用户管理' + ) + + # ============================================================ + # 菜单图标 + # ============================================================ + icon = StringField( + label='菜单图标', + validators=[ + Length(max=50, message='菜单图标长度不得超过50个字符') + ], + description='菜单图标CSS类名或图标路径' + ) + + # ============================================================ + # 上级ID + # ============================================================ + parentId = IntegerField( + label='上级ID', + validators=[ + Optional(), + NumberRange(min=0, message='上级ID不得小于0') + ], + description='上级菜单ID,0表示顶级菜单' + ) + + # ============================================================ + # 路由地址 + # ============================================================ + path = StringField( + label='路由地址', + validators=[ + Length(max=255, message='路由地址长度不得超过255个字符') + ], + description='前端路由地址,如:/system/user' + ) + + # ============================================================ + # 组件路径 + # ============================================================ + component = StringField( + label='组件路径', + validators=[ + Length(max=255, message='组件路径长度不得超过255个字符') + ], + description='前端组件文件路径,如:system/user/index' + ) + + # ============================================================ + # 权限节点 + # ============================================================ + permission = StringField( + label='权限节点', + validators=[ + Length(max=100, message='权限节点长度不得超过100个字符') + ], + description='权限标识符,如:system:user:list' + ) + + # ============================================================ + # 打开方式 + # ============================================================ + target = IntegerField( + label='打开方式', + validators=[ + NumberRange(min=0, max=1, message='打开方式值在0~1之间'), + ], + description='打开方式:0-内部打开,1-外部打开' + ) + + # ============================================================ + # 菜单类型 + # ============================================================ + type = IntegerField( + label='菜单类型', + validators=[ + NumberRange(min=0, max=1, message='菜单类型值在0~1之间') + ], + description='菜单类型:0-菜单,1-节点(权限点)' + ) + + # ============================================================ + # 菜单状态 + # ============================================================ + status = IntegerField( + label='菜单状态', + validators=[ + NumberRange(min=0, max=1, message='菜单状态值在0~1之间') + ], + description='菜单状态:0-正常,1-禁用' + ) + + # ============================================================ + # 是否可见 + # ============================================================ + hide = IntegerField( + label='是否可见', + validators=[ + NumberRange(min=0, max=1, message='是否可见值在0~1之间') + ], + description='是否可见:0-可见,1-不可见(隐藏)' + ) + + # ============================================================ + # 菜单排序 + # ============================================================ + sort = IntegerField( + label='菜单排序', + validators=[ + Optional(), + NumberRange(min=0, max=99999, message='菜单排序值在0~99999之间') + ], + description='排序值,数值越小越靠前' + ) + + # ============================================================ + # 菜单备注 + # ============================================================ + note = StringField( + label='菜单备注', + validators=[ + Length(max=255, message='菜单备注长度不得超过255个字符') + ], + description='菜单补充说明' + ) + + # ============================================================ + # 自定义验证方法 + # ============================================================ + + def validate_name(self, field): + """ + 自定义验证:同级菜单名称不能重复 + + 验证逻辑: + 1. 添加时:检查同一父级下是否存在同名标题 + 2. 更新时:排除当前记录自身,检查其他记录是否同名 + + Args: + field: name 字段对象 + + Raises: + ValidationError: 菜单名称已存在时抛出验证错误 + """ + if not field.data: + return + + # 获取当前记录的ID(更新时存在,添加时为None) + current_id = self.id.data if self.id.data else None + + # 获取上级ID + parent_id = self.parentId.data if self.parentId.data else 0 + + # 构建查询:查找同级下同名标题记录 + query = Menu.query.filter( + Menu.name == field.data, + Menu.parent_id == parent_id, + Menu.is_delete == 0 + ) + + # 如果是更新操作,排除当前记录自身 + if current_id: + query = query.filter(Menu.id != current_id) + + # 如果存在同名记录,抛出验证错误 + if query.first(): + raise ValidationError("同级菜单下标题已存在") diff --git a/src/modules/system/position/schema.py b/src/modules/system/position/schema.py new file mode 100644 index 0000000..5c78cf9 --- /dev/null +++ b/src/modules/system/position/schema.py @@ -0,0 +1,197 @@ +# +====================================================================== +# | DjangoAdmin 企业数字化开发平台 [ 赋能开发者,助力企业发展 ] +# +---------------------------------------------------------------------- +# | Copyright (c) 2021-2026 一米阳光团队 版权所有 +# +---------------------------------------------------------------------- +# | 开源协议: Apache-2.0 +# | 重要声明: 未经书面许可,不得移除或修改本框架相关版权标识。 +# +---------------------------------------------------------------------- +# | 官方网站: https://www.djangoadmin.cn +# +---------------------------------------------------------------------- +# | 研发团队: 一米阳光团队 荣誉出品 +# +====================================================================== +# | 版权和免责声明: +# | 一、知识产权声明 +# | 本团队对该软件框架产品(以下简称“本产品”)拥有完整知识产权,包括但不限于商标权、专利权、 +# | 著作权、商业秘密等。前述权利均受中华人民共和国及相关国际法律法规保护。未经本团队书面授权, +# | 任何个人或单位不得基于本产品本身申请任何形式的知识产权。 +# | 二、使用限制与禁止条款 +# | 您理解并同意,禁止将本产品用于以下任何行为: +# | 1. 任何违反中华人民共和国法律法规的用途; +# | 2. 任何侵害他人合法权益(包括但不限于人身权、财产权、知识产权等)的行为; +# | 3. 任何危害国家安全、公共利益及社会道德风尚的行为。 +# | 三、责任豁免 +# | 因使用本产品而产生的任何损失或法律纠纷(包括但不限于直接损失、间接损失、附带损失、衍生损失 +# | 以及因违约、侵权等引发的责任),本团队均不承担任何法律责任。若因违规使用本产品导致任何第三 +# | 方提起索赔或行政机关进行调查,您应独立承担全部责任。 +# | 四、违约与法律责任 +# | 如发现任何违反本声明的行为,本团队有权: +# | 1. 无条件配合公安机关及其他有权机关的调查取证工作; +# | 2. 依法追究相关方的民事责任,并要求赔偿全部损失; +# | 3. 保留进一步采取刑事控告等法律措施的权利。 +# | 五、许可范围说明 +# | 1、被授权方应视本产品源代码为核心机密信息,负有最高标准的保密与保管义务。禁止以任何形式(包 +# | 括但不限于直接或间接的分享、复制、传播、分发、转售、出租、开源、反向工程、反编译、反汇编或通 +# | 过网络服务提供给任何第三方)泄露、披露或处置源代码的全部或部分内容。任何未经授权的复制、使用、 +# | 传播行为均构成对本团队知识产权的严重侵权,本团队有权依法追究其全部法律责任,并要求赔偿因此造 +# | 成的一切经济损失及商誉损害。 +# | 2、本产品仅限于公司或个人在法律允许范围内,用于内部且合规的软件产品研发。具体权利义务以《软件 +# | 许可协议》附件为准。 +# +====================================================================== + +""" +岗位表单验证模块 +============================================================= + +提供岗位相关的表单验证功能,包括: +- 岗位添加/更新表单验证 +- 岗位状态设置表单验证 +""" + +from wtforms import ValidationError, StringField, IntegerField +from wtforms.validators import DataRequired, Length, NumberRange, Optional + +from src.common.forms.base_form import BaseForm +from src.modules.system.position.models import Position + + +# ============================================================ +# 岗位表单验证(添加和更新共用) +# ============================================================ + +class PositionForm(BaseForm): + """ + 岗位表单验证类 + + 用于添加和更新岗位时的数据验证。 + 添加时 id 为 None,更新时 id 必须有值。 + + Attributes: + id: 岗位ID(更新时必填,添加时可选) + name: 岗位名称(必填,最长150字符,不可重复) + status: 岗位状态(必填,1-在用,2-停用) + sort: 岗位排序(必填,0-99999之间的整数) + """ + + # ============================================================ + # 岗位ID + # ============================================================ + id = IntegerField( + label='岗位ID', + validators=[ + Optional(), # 允许为空(添加时) + NumberRange(min=1, message='岗位ID必须大于0') + ], + description='岗位唯一标识,更新时必填,添加时自动生成' + ) + + # ============================================================ + # 岗位名称 + # ============================================================ + name = StringField( + label='岗位名称', + validators=[ + DataRequired(message='岗位名称不能为空'), + Length(max=150, message='岗位名称长度不得超过150个字符') + ], + description='岗位显示名称,如:技术总监、产品经理' + ) + + # ============================================================ + # 岗位状态 + # ============================================================ + status = IntegerField( + label='岗位状态', + validators=[ + DataRequired(message='岗位状态不能为空'), + NumberRange(min=1, max=2, message='岗位状态值在1~2之间') + ], + description='岗位状态:1-在用,2-停用' + ) + + # ============================================================ + # 岗位排序 + # ============================================================ + sort = IntegerField( + label='岗位排序', + validators=[ + Optional(), + NumberRange(min=0, max=99999, message='岗位排序值在0~99999之间') + ], + description='排序值,数值越小越靠前' + ) + + # ============================================================ + # 自定义验证方法 + # ============================================================ + + def validate_name(self, field): + """ + 自定义验证:岗位名称不能重复 + + 验证逻辑: + 1. 添加时:检查数据库中是否存在同名记录 + 2. 更新时:排除当前记录自身,检查其他记录是否同名 + + Args: + field: name 字段对象 + + Raises: + ValidationError: 岗位名称已存在时抛出验证错误 + """ + if not field.data: + return + + # 获取当前记录的ID(更新时存在,添加时为None) + current_id = self.id.data if self.id.data else None + + # 构建查询:查找同名记录 + query = Position.query.filter(Position.name == field.data, Position.is_delete == 0) + + # 如果是更新操作,排除当前记录自身 + if current_id: + query = query.filter(Position.id != current_id) + + # 如果存在同名记录,抛出验证错误 + if query.first(): + raise ValidationError("岗位名称已存在") + + +# ============================================================ +# 状态设置表单 +# ============================================================ + +class PositionStatusForm(BaseForm): + """ + 岗位状态设置表单验证类 + + 用于单独修改岗位状态时的数据验证。 + + Attributes: + id: 岗位ID(必填,必须大于0) + status: 岗位状态(必填,1-在用,2-停用) + """ + + # ============================================================ + # 岗位ID + # ============================================================ + id = IntegerField( + label='岗位ID', + validators=[ + DataRequired(message='岗位ID不能为空'), + NumberRange(min=1, message='岗位ID必须大于0') + ], + description='要修改状态的岗位ID' + ) + + # ============================================================ + # 岗位状态 + # ============================================================ + status = IntegerField( + label='岗位状态', + validators=[ + DataRequired(message='岗位状态不能为空'), + NumberRange(min=1, max=2, message='岗位状态值在1~2之间') + ], + description='目标状态:1-在用,2-停用' + ) diff --git a/src/modules/system/role/schema.py b/src/modules/system/role/schema.py new file mode 100644 index 0000000..d2f6e25 --- /dev/null +++ b/src/modules/system/role/schema.py @@ -0,0 +1,201 @@ +# +====================================================================== +# | DjangoAdmin 企业数字化开发平台 [ 赋能开发者,助力企业发展 ] +# +---------------------------------------------------------------------- +# | Copyright (c) 2021-2026 一米阳光团队 版权所有 +# +---------------------------------------------------------------------- +# | 开源协议: Apache-2.0 +# | 重要声明: 未经书面许可,不得移除或修改本框架相关版权标识。 +# +---------------------------------------------------------------------- +# | 官方网站: https://www.djangoadmin.cn +# +---------------------------------------------------------------------- +# | 研发团队: 一米阳光团队 荣誉出品 +# +====================================================================== +# | 版权和免责声明: +# | 一、知识产权声明 +# | 本团队对该软件框架产品(以下简称“本产品”)拥有完整知识产权,包括但不限于商标权、专利权、 +# | 著作权、商业秘密等。前述权利均受中华人民共和国及相关国际法律法规保护。未经本团队书面授权, +# | 任何个人或单位不得基于本产品本身申请任何形式的知识产权。 +# | 二、使用限制与禁止条款 +# | 您理解并同意,禁止将本产品用于以下任何行为: +# | 1. 任何违反中华人民共和国法律法规的用途; +# | 2. 任何侵害他人合法权益(包括但不限于人身权、财产权、知识产权等)的行为; +# | 3. 任何危害国家安全、公共利益及社会道德风尚的行为。 +# | 三、责任豁免 +# | 因使用本产品而产生的任何损失或法律纠纷(包括但不限于直接损失、间接损失、附带损失、衍生损失 +# | 以及因违约、侵权等引发的责任),本团队均不承担任何法律责任。若因违规使用本产品导致任何第三 +# | 方提起索赔或行政机关进行调查,您应独立承担全部责任。 +# | 四、违约与法律责任 +# | 如发现任何违反本声明的行为,本团队有权: +# | 1. 无条件配合公安机关及其他有权机关的调查取证工作; +# | 2. 依法追究相关方的民事责任,并要求赔偿全部损失; +# | 3. 保留进一步采取刑事控告等法律措施的权利。 +# | 五、许可范围说明 +# | 1、被授权方应视本产品源代码为核心机密信息,负有最高标准的保密与保管义务。禁止以任何形式(包 +# | 括但不限于直接或间接的分享、复制、传播、分发、转售、出租、开源、反向工程、反编译、反汇编或通 +# | 过网络服务提供给任何第三方)泄露、披露或处置源代码的全部或部分内容。任何未经授权的复制、使用、 +# | 传播行为均构成对本团队知识产权的严重侵权,本团队有权依法追究其全部法律责任,并要求赔偿因此造 +# | 成的一切经济损失及商誉损害。 +# | 2、本产品仅限于公司或个人在法律允许范围内,用于内部且合规的软件产品研发。具体权利义务以《软件 +# | 许可协议》附件为准。 +# +====================================================================== + +""" +角色表单验证模块 +============================================================= + +提供角色相关的表单验证功能,包括: +- 角色添加/更新表单验证 +- 角色状态设置表单验证 +""" + +from wtforms import ValidationError, IntegerField, StringField +from wtforms.validators import NumberRange, DataRequired, Length, Optional + +from src.common.forms.base_form import BaseForm +from src.modules.system.role.models import Role + + +# ============================================================ +# 角色表单验证(添加和更新共用) +# ============================================================ + +class RoleForm(BaseForm): + """ + 角色表单验证类 + + 用于添加和更新角色时的数据验证。 + 添加时 id 为 None,更新时 id 必须有值。 + + Attributes: + id: 角色ID(更新时必填,添加时可选) + name: 角色名称(必填,最长150字符,不可重复) + code: 角色编码(必填,最长30字符,不可重复) + status: 角色状态(必填,1-在用,2-停用) + sort: 角色排序(必填,0-99999之间的整数) + note: 角色备注(可选,最长255字符) + """ + + # ============================================================ + # 角色ID + # ============================================================ + id = IntegerField( + label='角色ID', + validators=[ + Optional(), # 允许为空(添加时) + NumberRange(min=1, message='角色ID必须大于0') + ], + description='角色唯一标识,更新时必填,添加时自动生成' + ) + + # ============================================================ + # 角色名称 + # ============================================================ + name = StringField( + label='角色名称', + validators=[ + DataRequired(message='角色名称不能为空'), + Length(max=150, message='角色名称长度不得超过150个字符') + ], + description='角色显示名称,如:超级管理员、普通用户' + ) + + # ============================================================ + # 角色编码 + # ============================================================ + code = StringField( + label='角色编码', + validators=[ + DataRequired(message='角色编码不能为空'), + Length(max=30, message='角色编码长度不得超过30个字符') + ], + description='角色唯一标识编码,如:admin、user' + ) + + # ============================================================ + # 角色排序 + # ============================================================ + sort = IntegerField( + label='角色排序', + validators=[ + Optional(), + NumberRange(min=0, max=99999, message='角色排序值在0~99999之间') + ], + description='排序值,数值越小越靠前' + ) + + # ============================================================ + # 角色备注 + # ============================================================ + note = StringField( + label='角色备注', + validators=[ + Length(max=255, message='角色备注长度不得超过255个字符') + ], + description='角色补充说明' + ) + + # ============================================================ + # 自定义验证方法 + # ============================================================ + + def validate_name(self, field): + """ + 自定义验证:角色名称不能重复 + + 验证逻辑: + 1. 添加时:检查数据库中是否存在同名记录 + 2. 更新时:排除当前记录自身,检查其他记录是否同名 + + Args: + field: name 字段对象 + + Raises: + ValidationError: 角色名称已存在时抛出验证错误 + """ + if not field.data: + return + + # 获取当前记录的ID(更新时存在,添加时为None) + current_id = self.id.data if self.id.data else None + + # 构建查询:查找同名记录 + query = Role.query.filter(Role.name == field.data, Role.is_delete == 0) + + # 如果是更新操作,排除当前记录自身 + if current_id: + query = query.filter(Role.id != current_id) + + # 如果存在同名记录,抛出验证错误 + if query.first(): + raise ValidationError("角色名称已存在") + + def validate_code(self, field): + """ + 自定义验证:角色编码不能重复 + + 验证逻辑: + 1. 添加时:检查数据库中是否存在相同编码记录 + 2. 更新时:排除当前记录自身,检查其他记录是否相同编码 + + Args: + field: code 字段对象 + + Raises: + ValidationError: 角色编码已存在时抛出验证错误 + """ + if not field.data: + return + + # 获取当前记录的ID(更新时存在,添加时为None) + current_id = self.id.data if self.id.data else None + + # 构建查询:查找相同编码记录 + query = Role.query.filter(Role.code == field.data, Role.is_delete == 0) + + # 如果是更新操作,排除当前记录自身 + if current_id: + query = query.filter(Role.id != current_id) + + # 如果存在相同编码记录,抛出验证错误 + if query.first(): + raise ValidationError("角色编码已存在") diff --git a/src/modules/system/user/schema.py b/src/modules/system/user/schema.py new file mode 100644 index 0000000..4ff2b14 --- /dev/null +++ b/src/modules/system/user/schema.py @@ -0,0 +1,597 @@ +# +====================================================================== +# | DjangoAdmin 企业数字化开发平台 [ 赋能开发者,助力企业发展 ] +# +---------------------------------------------------------------------- +# | Copyright (c) 2021-2026 一米阳光团队 版权所有 +# +---------------------------------------------------------------------- +# | 开源协议: Apache-2.0 +# | 重要声明: 未经书面许可,不得移除或修改本框架相关版权标识。 +# +---------------------------------------------------------------------- +# | 官方网站: https://www.djangoadmin.cn +# +---------------------------------------------------------------------- +# | 研发团队: 一米阳光团队 荣誉出品 +# +====================================================================== +# | 版权和免责声明: +# | 一、知识产权声明 +# | 本团队对该软件框架产品(以下简称“本产品”)拥有完整知识产权,包括但不限于商标权、专利权、 +# | 著作权、商业秘密等。前述权利均受中华人民共和国及相关国际法律法规保护。未经本团队书面授权, +# | 任何个人或单位不得基于本产品本身申请任何形式的知识产权。 +# | 二、使用限制与禁止条款 +# | 您理解并同意,禁止将本产品用于以下任何行为: +# | 1. 任何违反中华人民共和国法律法规的用途; +# | 2. 任何侵害他人合法权益(包括但不限于人身权、财产权、知识产权等)的行为; +# | 3. 任何危害国家安全、公共利益及社会道德风尚的行为。 +# | 三、责任豁免 +# | 因使用本产品而产生的任何损失或法律纠纷(包括但不限于直接损失、间接损失、附带损失、衍生损失 +# | 以及因违约、侵权等引发的责任),本团队均不承担任何法律责任。若因违规使用本产品导致任何第三 +# | 方提起索赔或行政机关进行调查,您应独立承担全部责任。 +# | 四、违约与法律责任 +# | 如发现任何违反本声明的行为,本团队有权: +# | 1. 无条件配合公安机关及其他有权机关的调查取证工作; +# | 2. 依法追究相关方的民事责任,并要求赔偿全部损失; +# | 3. 保留进一步采取刑事控告等法律措施的权利。 +# | 五、许可范围说明 +# | 1、被授权方应视本产品源代码为核心机密信息,负有最高标准的保密与保管义务。禁止以任何形式(包 +# | 括但不限于直接或间接的分享、复制、传播、分发、转售、出租、开源、反向工程、反编译、反汇编或通 +# | 过网络服务提供给任何第三方)泄露、披露或处置源代码的全部或部分内容。任何未经授权的复制、使用、 +# | 传播行为均构成对本团队知识产权的严重侵权,本团队有权依法追究其全部法律责任,并要求赔偿因此造 +# | 成的一切经济损失及商誉损害。 +# | 2、本产品仅限于公司或个人在法律允许范围内,用于内部且合规的软件产品研发。具体权利义务以《软件 +# | 许可协议》附件为准。 +# +====================================================================== + +""" +用户表单验证模块 +============================================================= + +提供用户相关的表单验证功能,包括: +- 用户添加/更新表单验证 +- 用户状态设置表单验证 +- 修改个人信息表单验证 +- 修改密码表单验证 +- 重置密码表单验证 +""" + +from wtforms import IntegerField, StringField +from wtforms.validators import NumberRange, DataRequired, Length, ValidationError, Optional + +from src.common.forms.fields import ArrayField +from src.common.forms.base_form import BaseForm +from src.modules.system.user.models import User + + +# ============================================================ +# 用户表单验证(添加和更新共用) +# ============================================================ + +class UserForm(BaseForm): + """ + 用户表单验证类 + + 用于添加和更新用户时的数据验证。 + 添加时 id 为 None,更新时 id 必须有值。 + + Attributes: + id: 用户ID(更新时必填,添加时可选) + realname: 用户姓名(必填,最长150字符) + gender: 性别(必填,1-男,2-女,3-保密) + avatar: 头像(必填,最长255字符) + mobile: 手机号(必填,最长30字符) + email: 邮箱(必填,最长30字符) + deptId: 部门ID(必填,不得小于0) + levelId: 职级ID(必填,不得小于0) + positionId: 岗位ID(必填,不得小于0) + city: 行政区划(必填) + provinceCode: 省份编码(可选) + cityCode: 城市编码(可选) + streetCode: 县区编码(可选) + districtCode: 县区编码(可选) + address: 详细地址(必填,最长255字符) + username: 登录账号(必填,最长30字符,不可重复) + password: 登录密码(可选,最长255字符) + intro: 个人简介(可选,最长255字符) + status: 用户状态(必填,1-在用,2-停用) + note: 用户备注(可选,最长255字符) + sort: 用户排序(必填,0-99999之间的整数) + roles: 用户角色(可选) + """ + + # ============================================================ + # 用户ID + # ============================================================ + id = IntegerField( + label='用户ID', + validators=[ + Optional(), # 允许为空(添加时) + NumberRange(min=1, message='用户ID必须大于0') + ], + description='用户唯一标识,更新时必填,添加时自动生成' + ) + + # ============================================================ + # 用户姓名 + # ============================================================ + realname = StringField( + label='用户姓名', + validators=[ + DataRequired(message='用户姓名不能为空'), + Length(max=150, message='用户姓名长度不得超过150个字符') + ], + description='用户真实姓名' + ) + + # ============================================================ + # 性别 + # ============================================================ + gender = IntegerField( + label='性别', + validators=[ + DataRequired(message='性别不能为空'), + NumberRange(min=1, max=3, message='性别值在1~3之间') + ], + description='性别:1-男,2-女,3-保密' + ) + + # ============================================================ + # 头像 + # ============================================================ + avatar = StringField( + label='头像', + validators=[ + DataRequired(message='头像不能为空'), + Length(max=255, message='头像长度不得超过255个字符') + ], + description='用户头像图片地址' + ) + + # ============================================================ + # 手机号 + # ============================================================ + mobile = StringField( + label='手机号', + validators=[ + DataRequired(message='手机号不能为空'), + Length(max=30, message='手机号长度不得超过30个字符') + ], + description='用户手机号码' + ) + + # ============================================================ + # 邮箱 + # ============================================================ + email = StringField( + label='邮箱', + validators=[ + DataRequired(message='邮箱不能为空'), + Length(max=30, message='邮箱长度不得超过30个字符') + ], + description='用户电子邮箱地址' + ) + + # ============================================================ + # 部门ID + # ============================================================ + deptId = IntegerField( + label='部门ID', + validators=[ + DataRequired(message='部门ID不能为空'), + NumberRange(min=0, message='部门ID不得小于0') + ], + description='所属部门ID,0表示无部门' + ) + + # ============================================================ + # 职级ID + # ============================================================ + levelId = IntegerField( + label='职级ID', + validators=[ + DataRequired(message='职级ID不能为空'), + NumberRange(min=0, message='职级ID不得小于0') + ], + description='所属职级ID,0表示无职级' + ) + + # ============================================================ + # 岗位ID + # ============================================================ + positionId = IntegerField( + label='岗位ID', + validators=[ + DataRequired(message='岗位ID不能为空'), + NumberRange(min=0, message='岗位ID不得小于0') + ], + description='所属岗位ID,0表示无岗位' + ) + + # ============================================================ + # 行政区划 + # ============================================================ + city = ArrayField( + label='行政区划', + validators=[ + DataRequired(message='请选择行政区划'), + ], + description='行政区划选择组件数据' + ) + + # ============================================================ + # 省份编码 + # ============================================================ + provinceCode = StringField( + label='省份编码', + validators=[ + Optional(), + ], + description='省份行政编码' + ) + + # ============================================================ + # 城市编码 + # ============================================================ + cityCode = StringField( + label='城市编码', + validators=[ + Optional(), + ], + description='城市行政编码' + ) + + # ============================================================ + # 县区编码 + # ============================================================ + districtCode = StringField( + label='县区编码', + validators=[ + Optional(), + ], + description='县区行政编码' + ) + + # ============================================================ + # 街道编码 + # ============================================================ + streetCode = StringField( + label='街道编码', + validators=[ + Optional(), + ], + description='街道行政编码' + ) + + # ============================================================ + # 详细地址 + # ============================================================ + address = StringField( + label='详细地址', + validators=[ + DataRequired(message='详细地址不能为空'), + Length(max=255, message='详细地址长度不得超过255个字符') + ], + description='详细街道门牌号地址' + ) + + # ============================================================ + # 登录账号 + # ============================================================ + username = StringField( + label='登录账号', + validators=[ + DataRequired(message='登录账号不能为空'), + Length(max=30, message='登录账号长度不得超过30个字符') + ], + description='用户登录账号,唯一标识' + ) + + # ============================================================ + # 登录密码 + # ============================================================ + password = StringField( + label='登录密码', + validators=[ + Length(max=255, message='登录密码长度不得超过255个字符') + ], + description='用户登录密码,添加时必填,更新时可选' + ) + + # ============================================================ + # 个人简介 + # ============================================================ + intro = StringField( + label='个人简介', + validators=[ + Length(max=255, message='个人简介长度不得超过255个字符') + ], + description='用户个人简介或签名' + ) + + # ============================================================ + # 用户状态 + # ============================================================ + status = IntegerField( + label='用户状态', + validators=[ + DataRequired(message='用户状态不能为空'), + NumberRange(min=1, max=2, message='用户状态值在1~2之间') + ], + description='用户状态:1-在用,2-停用' + ) + + # ============================================================ + # 用户备注 + # ============================================================ + note = StringField( + label='用户备注', + validators=[ + Length(max=255, message='用户备注长度不得超过255个字符') + ], + description='用户补充说明' + ) + + # ============================================================ + # 用户排序 + # ============================================================ + sort = IntegerField( + label='用户排序', + validators=[ + Optional(), + NumberRange(min=0, max=99999, message='用户排序值在0~99999之间') + ], + description='排序值,数值越小越靠前' + ) + + # ============================================================ + # 用户角色 + # ============================================================ + roles = ArrayField( + label='用户角色', + validators=[ + Optional(), + ], + description='用户角色ID列表' + ) + + # ============================================================ + # 自定义验证方法 + # ============================================================ + + def validate_username(self, field): + """ + 自定义验证:登录账号不能重复 + + 验证逻辑: + 1. 添加时:检查数据库中是否存在相同账号记录 + 2. 更新时:排除当前记录自身,检查其他记录是否相同账号 + + Args: + field: username 字段对象 + + Raises: + ValidationError: 登录账号已存在时抛出验证错误 + """ + if not field.data: + return + + # 获取当前记录的ID(更新时存在,添加时为None) + current_id = self.id.data if self.id.data else None + + # 构建查询:查找相同账号记录 + query = User.query.filter(User.username == field.data, User.is_delete == 0) + + # 如果是更新操作,排除当前记录自身 + if current_id: + query = query.filter(User.id != current_id) + + # 如果存在相同账号记录,抛出验证错误 + if query.first(): + raise ValidationError("登录账号已存在") + + +# ============================================================ +# 状态设置表单 +# ============================================================ + +class UserStatusForm(BaseForm): + """ + 用户状态设置表单验证类 + + 用于单独修改用户状态时的数据验证。 + + Attributes: + id: 用户ID(必填,必须大于0) + status: 用户状态(必填,1-在用,2-停用) + """ + + # ============================================================ + # 用户ID + # ============================================================ + id = IntegerField( + label='用户ID', + validators=[ + DataRequired(message='用户ID不能为空'), + NumberRange(min=1, message='用户ID必须大于0') + ], + description='要修改状态的用户ID' + ) + + # ============================================================ + # 用户状态 + # ============================================================ + status = IntegerField( + label='用户状态', + validators=[ + DataRequired(message='用户状态不能为空'), + NumberRange(min=1, max=2, message='用户状态值在1~2之间') + ], + description='目标状态:1-在用,2-停用' + ) + + +# ============================================================ +# 修改个人信息表单验证 +# ============================================================ + +class UserInfoForm(BaseForm): + """ + 修改个人信息表单验证类 + + 用于用户修改个人基本信息时的数据验证。 + + Attributes: + realname: 用户姓名(必填,最长150字符) + gender: 性别(必填,1-男,2-女,3-保密) + mobile: 手机号(必填,最长30字符) + email: 邮箱(必填,最长30字符) + address: 详细地址(必填,最长255字符) + intro: 个人简介(可选,最长255字符) + """ + + # ============================================================ + # 用户姓名 + # ============================================================ + realname = StringField( + label='用户姓名', + validators=[ + DataRequired(message='用户姓名不能为空'), + Length(max=150, message='用户姓名长度不得超过150个字符') + ], + description='用户真实姓名' + ) + + # ============================================================ + # 性别 + # ============================================================ + gender = IntegerField( + label='性别', + validators=[ + DataRequired(message='性别不能为空'), + NumberRange(min=1, max=3, message='性别值在1~3之间') + ], + description='性别:1-男,2-女,3-保密' + ) + + # ============================================================ + # 手机号 + # ============================================================ + mobile = StringField( + label='手机号', + validators=[ + DataRequired(message='手机号不能为空'), + Length(max=30, message='手机号长度不得超过30个字符') + ], + description='用户手机号码' + ) + + # ============================================================ + # 邮箱 + # ============================================================ + email = StringField( + label='邮箱', + validators=[ + DataRequired(message='邮箱不能为空'), + Length(max=30, message='邮箱长度不得超过30个字符') + ], + description='用户电子邮箱地址' + ) + + # ============================================================ + # 详细地址 + # ============================================================ + address = StringField( + label='详细地址', + validators=[ + DataRequired(message='详细地址不能为空'), + Length(max=255, message='详细地址长度不得超过255个字符') + ], + description='详细街道门牌号地址' + ) + + # ============================================================ + # 个人简介 + # ============================================================ + intro = StringField( + label='个人简介', + validators=[ + Length(max=255, message='个人简介长度不得超过255个字符') + ], + description='用户个人简介或签名' + ) + + +# ============================================================ +# 修改密码表单验证 +# ============================================================ + +class UpdatePwdForm(BaseForm): + """ + 修改密码表单验证类 + + 用于用户修改登录密码时的数据验证。 + + Attributes: + oldPassword: 原始密码(必填,长度6~12字符) + newPassword: 新密码(必填,长度6~12字符) + rePassword: 确认密码(必填,长度6~12字符,需与新密码一致) + """ + + # ============================================================ + # 原始密码 + # ============================================================ + oldPassword = StringField( + label='原始密码', + validators=[ + DataRequired(message='原始密码不能为空'), + Length(min=6, max=12, message='原始密码长度为6~12个字符') + ], + description='用户当前登录密码' + ) + + # ============================================================ + # 新密码 + # ============================================================ + newPassword = StringField( + label='新密码', + validators=[ + DataRequired(message='新密码不能为空'), + Length(min=6, max=12, message='新密码长度为6~12个字符') + ], + description='新登录密码' + ) + + # ============================================================ + # 确认密码 + # ============================================================ + rePassword = StringField( + label='确认密码', + validators=[ + DataRequired(message='确认密码不能为空'), + Length(min=6, max=12, message='确认密码长度为6~12个字符') + ], + description='确认新密码,需与新密码一致' + ) + + +# ============================================================ +# 重置密码表单 +# ============================================================ + +class ResetPwdForm(BaseForm): + """ + 重置密码表单验证类 + + 用于管理员重置用户密码时的数据验证。 + + Attributes: + id: 用户ID(必填,必须大于0) + """ + + # ============================================================ + # 用户ID + # ============================================================ + userId = IntegerField( + label='用户ID', + validators=[ + DataRequired(message='用户ID不能为空'), + NumberRange(min=1, message='用户ID必须大于0') + ], + description='要重置密码的用户ID' + )