一、分析业务需要完成哪些需求通过以上界面分析可知我们需要创建以下模型from enum import IntEnum from tortoise import fields from tortoise.models import Model # 枚举定义 class AccountStatus(IntEnum): 账号状态 NORMAL 0 # 正常 PENDING_AUDIT 1 # 待审核 BANNED 2 # 封禁 class AuthType(IntEnum): 认证类型 NO_AUTH 0 # 0:无认证 ENTERPRISE_AUTH 1 # 1:企业认证 LICENSE_AUTH 2 # 2:营业执照认证 ENTERPRISE_LICENSE_AUTH 3 # 3:企业认证营业执照认证 class RiskLevel(IntEnum): 风险等级 LOW 1 # 低风险 MID 2 # 中风险 HIGH 3 # 高风险 class BlackListStatus(IntEnum): 黑名单状态 NOT_BANNED 0 # 未封禁 BANNED 1 # 封禁 class AuditType(IntEnum): 审核类型 NEW_ENTERPRISE_AUTH 1 # 新企业认证 QUALITY_UPDATE 2 # 资质更新 INFO_CHANGE 3 # 信息变更 # 企业模型 class Enterprise(Model): 企业表 id fields.IntField(pkTrue, description主键ID) enterprise_name fields.CharField(max_length255, description企业名称) enterprise_code fields.CharField(max_length100, uniqueTrue, description企业Code) # 外键城市ID关联城市表自行创建City模型 city fields.ForeignKeyField( nullTrue, tomodels.City, related_nameenterprises, on_deletefields.RESTRICT, description城市ID ) account_status fields.IntEnumField( enum_typeAccountStatus, description账号状态0正常,1待审核,2封禁 ) create_time fields.DatetimeField(auto_now_addTrue, description创建时间) auth_time fields.DatetimeField(nullTrue, description认证时间) auth_type fields.IntEnumField(nullTrue,enum_typeAuthType, description认证类型) risk_level fields.IntEnumField(nullTrue,enum_typeRiskLevel, description风险等级) blacklist_status fields.IntEnumField(enum_typeBlackListStatus, description黑名单状态) complaint_count fields.IntField(default0, description投诉次数) company_website fields.CharField(max_length512, nullTrue, description公司网站) email fields.CharField(max_length128, nullTrue, description电子邮箱) audit_type fields.IntEnumField(enum_typeAuditType, description审核类型) submit_time fields.DatetimeField(nullTrue, description提交时间) class Meta: table t_enterprise table_description 企业表 def __str__(self): return fEnterprise {self.enterprise_name} from enum import IntEnum from tortoise import fields from tortoise.models import Model # -------------------------- 枚举定义 -------------------------- class RegisterStatus(IntEnum): 登记状态 CONTINUE 1 # 存续 IN_BUSINESS 2 # 在业 OPEN 3 # 开业 SUSPENDED 4 # 停业 LIQUIDATION 5 # 清算 REVOKED 6 # 吊销 CANCELLED 7 # 注销 class CompanyScale(IntEnum): 公司规模 SCALE_0_20 1 # 0-20人 SCALE_20_99 2 # 20-99人 SCALE_100_499 3 # 100-499人 SCALE_500_999 4 # 500-999人 SCALE_1000_9999 5 # 1000-9999人 SCALE_10000_PLUS 6 # 10000人以上 class FinancingStage(IntEnum): 融资阶段允许为空 ANGEL 1 # 天使轮 A_ROUND 2 # A轮 B_ROUND 3 # B轮 C_ROUND 4 # C轮 D_PLUS 5 # D轮及以上 LISTED 6 # 已上市 NO_NEED_FUND 7 # 不需要融资 # -------------------------- 企业信息表模型 -------------------------- class EnterpriseInfo(Model): 企业信息表关联主企业表 id fields.IntField(pkTrue, description主键ID) enterprise_name fields.CharField(max_length255, description企业名称) unified_social_credit_code fields.CharField(max_length50, uniqueTrue, description统一社会信用代码) legal_representative fields.CharField(max_length100, description法人代表) registered_capital fields.CharField(max_length100, description注册资本) establish_date fields.DateField(nullTrue, description成立日期) register_status fields.IntEnumField(enum_typeRegisterStatus, description登记状态) # 所属行业 外键行业字典表 Industry industry fields.ForeignKeyField( tomodels.IndustryPosition, related_nameenterprise_info_list, on_deletefields.RESTRICT, description所属行业ID ) company_scale fields.IntEnumField(enum_typeCompanyScale, description公司规模) financing_stage fields.IntEnumField(enum_typeFinancingStage, nullTrue, description融资阶段(可为空)) headquarters_address fields.CharField(max_length512, description总部地址) business_scope fields.TextField(description经营范围) # # 关联【企业表】外键对上一张图的 Enterprise 模型 # enterprise fields.ForeignKeyField( # model_namemodels.Enterprise, # related_nameenterprise_info, # on_deletefields.CASCADE, # uniqueTrue, # description企业表ID一对一关联 # ) enterprise_id fields.IntField(nullTrue, description企业ID) class Meta: table t_enterprise_info table_description 企业信息表 def __str__(self): return fEnterpriseInfo {self.enterprise_name} from tortoise import fields from tortoise.models import Model class EnterpriseQualification(Model): 资质材料表 id fields.IntField(pkTrue, description主键ID) contact_name fields.CharField(max_length100, description联系人姓名) contact_phone fields.CharField(max_length32, description联系电话) contact_email fields.CharField(max_length128, description联系邮箱) business_license_url fields.CharField(max_length512, nullTrue, description营业执照图片url) legal_id_front_url fields.CharField(max_length512, nullTrue, description法人身份证正面图片url) legal_id_back_url fields.CharField(max_length512, nullTrue, description法人身份证反面图片url) org_code_cert fields.CharField(max_length256, nullTrue, description组织机构代码证) # 关联企业主表 Enterprise一对一关系 # enterprise fields.ForeignKeyField( # model_namemodels.Enterprise, # related_namequalification, # on_deletefields.CASCADE, # uniqueTrue, # description企业表ID # ) enterprise_id fields.IntField(nullTrue, description企业ID) class Meta: table t_enterprise_qualification table_description 资质材料表 def __str__(self): return fEnterpriseQualification contact:{self.contact_name}二、完成业务分析与逻辑设计可知我们需要完成图片上传以及完成注册逻辑。通过分析可知我们需要进行三表创建。通过以下逻辑进行完成import uuid from fastapi import UploadFile from tortoise.timezone import now from tortoise.transactions import in_transaction from app.models import Enterprise from app.models.enterprise import AuditType, AccountStatus, BlackListStatus, EnterpriseInfo, EnterpriseQualification from app.schemas.enterprise import EnterpriseCreateRequest from app.utils.oss_util import AliyunOSSTool class EnterpriseService: staticmethod async def save_enterprisr_info(form:EnterpriseCreateRequest, business_license_file :UploadFile , legal_id_front_file: UploadFile , legal_id_back_file: UploadFile): async with in_transaction() as conn: enterprise await Enterprise.create( enterprise_nameform.enterprise_name, enterprise_codestr(uuid.uuid4()), account_statusAccountStatus.PENDING_AUDIT, blacklist_statusBlackListStatus.NOT_BANNED, audit_typeAuditType.NEW_ENTERPRISE_AUTH, submit_time now(), using_dbconn ) await EnterpriseInfo.create( enterprise_name form.enterprise_name, unified_social_credit_code form.unified_social_credit_code, legal_representative form.legal_representative, registered_capital form.registered_capital, establish_date form.establish_date, register_status form.register_status, industry_id form.industry_id, company_scale form.company_scale, financing_stage form.financing_stage, headquarters_address form.headquarters_address, business_scope form.business_scope, enterprise_id enterprise.id, using_dbconn ) business_license_file_content await business_license_file.read() business_license_file_filename business_license_file.filename oss AliyunOSSTool() is_success,success_res oss.upload_single_file( business_license_file_content, business_license_file_filename, oss_pathenterprise/ ) if not is_success: raise Exception(上传营业执照图片失败) legal_id_front_file_content await legal_id_front_file.read() legal_id_front_file_filename legal_id_front_file.filename is_success2,success_res2 oss.upload_single_file( legal_id_front_file_content, legal_id_front_file_filename, oss_pathenterprise/ ) if not is_success2: raise Exception(上传法人身份证正面图片失败) legal_id_back_file_content await legal_id_back_file.read() legal_id_back_file_filename legal_id_back_file.filename is_success3,success_res3 oss.upload_single_file( legal_id_back_file_content, legal_id_back_file_filename, oss_pathenterprise/ ) if not is_success3: raise Exception(上传法人身份证反面图片失败) await EnterpriseQualification.create( contact_name form.contact_name, contact_phone form.contact_phone, contact_email form.contact_email, business_license_url success_res[access_url], legal_id_front_url success_res2[access_url], legal_id_back_url success_res3[access_url], org_code_cert form.org_code_cert, enterprise_id enterprise.id, using_dbconn )我们创建了一个依赖来进行插值方便后续代码的调用async def get_enterprise_form( enterprise_nameForm(..., description企业名称), unified_social_credit_codeForm(..., description统一社会信用代码), legal_representativeForm(..., description法人代表), registered_capitalForm(..., description注册资本), establish_dateForm(None, description成立日期), register_statusForm(..., description登记状态), industry_idForm(..., description所属行业), company_scaleForm(..., description公司规模), financing_stageForm(None, description融资阶段(可为空)), headquarters_addressForm(..., description总部地址), business_scopeForm(..., description经营范围), # enterprise_id Form(None, description企业ID) contact_nameForm(..., description联系人姓名), contact_phoneForm(..., description联系电话), contact_emailForm(..., description联系邮箱), org_code_cert Form(None, description组织机构代码证) ): return EnterpriseCreateRequest( enterprise_nameenterprise_name, unified_social_credit_codeunified_social_credit_code, legal_representativelegal_representative, registered_capitalregistered_capital, establish_dateestablish_date, register_statusregister_status, industry_idindustry_id, company_scalecompany_scale, financing_stagefinancing_stage, headquarters_addressheadquarters_address, business_scopebusiness_scope, # enterprise_identerprise_id, contact_namecontact_name, contact_phonecontact_phone, contact_emailcontact_email, org_code_certorg_code_cert, )书写接口代码from fastapi import Depends, UploadFile, File, APIRouter, Query from app.core.depends import get_enterprise_form from app.schemas.enterprise import EnterpriseCreateRequest from app.services.enterprise_service import EnterpriseService enterprise_router APIRouter( prefix/enterprise, tags[企业管理], ) enterprise_router.post(/save, summary保存企业信息) async def save_enterprisr_info(form:EnterpriseCreateRequestDepends(get_enterprise_form), business_license_file :UploadFile File(None,description营业执照图片), legal_id_front_file: UploadFile File(None, description法人身份证正面图片url), legal_id_back_file: UploadFile File(None, description法人身份证反面图片)): res await EnterpriseService.save_enterprisr_info(form,business_license_file,legal_id_front_file,legal_id_back_file) return {code:1,msg:保存成功}三、总结通过以上业务的书写我们完成企业的注册让企业处于待审核状态。