# BOSS直聘企業(yè)管理系統(tǒng)后端實(shí)現(xiàn)詳解:從注冊到審核的完整流程
一、前言在BOSS直聘這類招聘平臺(tái)中企業(yè)管理是核心功能之一。企業(yè)用戶從注冊到審核通過需要經(jīng)過一系列完整的流程。本文將詳細(xì)介紹如何使用FastAPI Tortoise ORM Redis技術(shù)棧實(shí)現(xiàn)企業(yè)管理系統(tǒng)的后端核心功能包括企業(yè)注冊與認(rèn)證企業(yè)列表查詢與分頁企業(yè)詳情查看企業(yè)審核通過/拒絕企業(yè)登錄驗(yàn)證碼方式數(shù)據(jù)扁平化處理技巧二、數(shù)據(jù)庫模型設(shè)計(jì)2.1 核心數(shù)據(jù)表結(jié)構(gòu)企業(yè)管理涉及多張關(guān)聯(lián)表主要包括表名說明t_enterprise企業(yè)主表存儲(chǔ)企業(yè)基本狀態(tài)t_enterprise_info企業(yè)詳細(xì)信息表t_enterprise_qualification企業(yè)資質(zhì)信息表t_enterprise_review企業(yè)審核記錄表2.2 關(guān)鍵枚舉類型class AccountStatus(str, Enum): NORMAL normal # 正常狀態(tài) PENDING_AUDIT pending # 待審核 FROZEN frozen # 已凍結(jié) class BlackListStatus(int, Enum): NOT_BANNED 0 # 未被拉黑 BANNED 1 # 已被拉黑 class AuditType(str, Enum): NEW_ENTERPRISE_AUTH new # 新企業(yè)認(rèn)證 ANNUAL_REVIEW annual # 年度審核 class AuthType(str, Enum): ENTERPRISE_LICENSE_AUTH license # 營業(yè)執(zhí)照認(rèn)證三、企業(yè)注冊與認(rèn)證流程3.1 企業(yè)注冊接口企業(yè)注冊是整個(gè)流程的起點(diǎn)用戶提交企業(yè)信息和相關(guān)資質(zhì)文件后系統(tǒng)會(huì)自動(dòng)創(chuàng)建審核記錄。接口定義enterprise_router.post(/save, summary保存企業(yè)信息) async def saveEnterpriseInfo( form: EnterpriseCreateRequest Depends(get_enterprise_form), business_license_file: UploadFile File(None), legal_id_front_file: UploadFile File(None), legal_id_back_file: UploadFile File(None), ): await EnterpriseService.saveEnterpriseInfo( form, business_license_file, legal_id_front_file, legal_id_back_file ) return {code: 1, message: 保存成功}3.2 核心注冊邏輯staticmethod async def saveEnterpriseInfo( form: EnterpriseCreateRequest, business_license_file: UploadFile, legal_id_front_file: UploadFile, legal_id_back_file: UploadFile, ): async with in_transaction() as conn: # 1. 創(chuàng)建企業(yè)主記錄 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_timenow(), auth_typeAuthType.ENTERPRISE_LICENSE_AUTH ) # 2. 創(chuàng)建企業(yè)詳細(xì)信息 await EnterpriseInfo.create( enterprise_nameform.enterprise_name, unified_social_credit_codeform.unified_social_credit_code, legal_representativeform.legal_representative, enterprise_identerprise.id, # ... 其他字段 ) # 3. 上傳并保存資質(zhì)文件 success_res await AliyunOSSTool.upload_file(business_license_file) success_res2 await AliyunOSSTool.upload_file(legal_id_front_file) success_res3 await AliyunOSSTool.upload_file(legal_id_back_file) # 4. 創(chuàng)建企業(yè)資質(zhì)記錄 await EnterpriseQualification.create( enterprise_identerprise.id, business_license_urlsuccess_res[access_url], legal_id_front_urlsuccess_res2[access_url], legal_id_back_urlsuccess_res3[access_url], # ... 其他字段 ) # 5. 自動(dòng)創(chuàng)建審核記錄 ? 關(guān)鍵點(diǎn) await EnterpriseReview.create( enterprise_identerprise.id, review_resultNone, remark企業(yè)注冊提交認(rèn)證申請等待審核 )3.3 流程說明用戶提交注冊 → 開啟數(shù)據(jù)庫事務(wù) ├── 創(chuàng)建企業(yè)主記錄狀態(tài)待審核 ├── 創(chuàng)建企業(yè)詳細(xì)信息 ├── 上傳資質(zhì)文件到OSS ├── 創(chuàng)建企業(yè)資質(zhì)記錄 └── 創(chuàng)建審核記錄review_result None → 提交事務(wù)四、企業(yè)列表查詢與分頁4.1 列表接口實(shí)現(xiàn)enterprise_router.get(/list, summary查詢企業(yè)列表) async def select_enterprise_list( page: int Query(1, ge1), page_size: int Query(10, ge10, le50), enterprise_name: str Query(None), submit_time_start: str Query(None), submit_time_end: str Query(None), ): res await EnterpriseService.select_enterprise_list( page, page_size, enterprise_name, submit_time_start, submit_time_end ) return {code: 1, message: 查詢成功, data: res}4.2 列表查詢核心邏輯關(guān)鍵點(diǎn)數(shù)據(jù)扁平化處理staticmethod async def select_enterprise_list(page, page_size, enterprise_name, submit_time_start, submit_time_end): # 1. 構(gòu)建查詢條件 query_enterprise Enterprise.all() if enterprise_name: query_enterprise query_enterprise.filter( enterprise_name__icontainsenterprise_name ) if submit_time_start: query_enterprise query_enterprise.filter( submit_time__gtesubmit_time_start ) if submit_time_end: query_enterprise query_enterprise.filter( submit_time__ltesubmit_time_end ) # 2. 分頁計(jì)算 total_count await query_enterprise.count() total_page math.ceil(total_count / page_size) offset (page - 1) * page_size # 3. 執(zhí)行分頁查詢 query_enterprise await query_enterprise.offset(offset).limit(page_size) # 4. 數(shù)據(jù)扁平化處理 ? 關(guān)鍵技巧 enterprise_list [] for enterprise in query_enterprise: enterprise_id enterprise.id # 查詢關(guān)聯(lián)數(shù)據(jù) enterpriseinfo await EnterpriseInfo.get_or_none( enterprise_identerprise_id ).prefetch_related(industry) enterprise_qualification await EnterpriseQualification.get_or_none( enterprise_identerprise_id ) enterprise_review await EnterpriseReview.get_or_none( enterprise_identerprise_id ) # 處理審核狀態(tài) audit_status 0 reject_reason None if enterprise_review: audit_status enterprise_review.review_result if enterprise_review.review_result else 0 reject_reason enterprise_review.review_reason # 獲取行業(yè)名稱 industry_name if enterpriseinfo and enterpriseinfo.industry: industry_name enterpriseinfo.industry.name # 構(gòu)建扁平數(shù)據(jù)結(jié)構(gòu) item { id: enterprise.id, enterprise_name: enterprise.enterprise_name, legal_representative: enterpriseinfo.legal_representative if enterpriseinfo else , contact_name: enterprise_qualification.contact_name if enterprise_qualification else , contact_phone: enterprise_qualification.contact_phone if enterprise_qualification else , industry: industry_name, submit_time: enterprise.submit_time.isoformat() if enterprise.submit_time else , audit_status: audit_status, reject_reason: reject_reason, business_license_url: enterprise_qualification.business_license_url if enterprise_qualification else , } enterprise_list.append(item) return { list: enterprise_list, total: total_count, total_page: total_page, page: page, page_size: page_size }4.3 數(shù)據(jù)扁平化技巧為什么需要扁平化原始數(shù)據(jù)結(jié)構(gòu)是嵌套對(duì)象{ enterprise: {...}, enterprise_info: {...}, enterprise_qualification: {...}, enterprise_review: {...} }前端表格組件el-table需要扁平結(jié)構(gòu){ id: 1, enterprise_name: 示例科技, legal_representative: 張三, audit_status: 0 }扁平化的好處簡化前端模板代碼減少前端渲染計(jì)算便于數(shù)據(jù)導(dǎo)出五、企業(yè)詳情查看5.1 詳情接口enterprise_router.get(/detail/{enterprise_id}, summary查詢企業(yè)詳情) async def select_enterprise_by_id(enterprise_id: int): res await EnterpriseService.select_enterprise_by_id(enterprise_id) return {code: 1, message: 查詢成功, data: res}5.2 詳情查詢實(shí)現(xiàn)staticmethod async def select_enterprise_by_id(enterprise_id: int): # 查詢企業(yè)主表 enterprise await Enterprise.get_or_none(identerprise_id) # 查詢詳細(xì)信息預(yù)加載行業(yè)關(guān)聯(lián) enterpriseinfo await EnterpriseInfo.get_or_none( enterprise_identerprise_id ).prefetch_related(industry) # 查詢資質(zhì)信息 enterprise_qualification await EnterpriseQualification.get_or_none( enterprise_identerprise_id ) # 查詢審核記錄 enterprise_review await EnterpriseReview.get_or_none( enterprise_identerprise_id ) # 組裝扁平數(shù)據(jù) return { id: enterprise.id if enterprise else None, enterprise_name: enterprise.enterprise_name if enterprise else , unified_social_credit_code: enterpriseinfo.unified_social_credit_code if enterpriseinfo else , legal_representative: enterpriseinfo.legal_representative if enterpriseinfo else , registered_capital: enterpriseinfo.registered_capital if enterpriseinfo else , establish_date: str(enterpriseinfo.establish_date) if enterpriseinfo else , industry: enterpriseinfo.industry.name if enterpriseinfo and enterpriseinfo.industry else , contact_name: enterprise_qualification.contact_name if enterprise_qualification else , contact_phone: enterprise_qualification.contact_phone if enterprise_qualification else , audit_status: enterprise_review.review_result if enterprise_review and enterprise_review.review_result else 0, reject_reason: enterprise_review.review_reason if enterprise_review else None, business_license_url: enterprise_qualification.business_license_url if enterprise_qualification else , }六、企業(yè)審核流程6.1 審核接口enterprise_router.post(/review, summary企業(yè)審核) async def enterprise_review(enterpriseReviewCreateRequest: EnterpriseReviewCreateRequest): await EnterpriseService.enterprise_review(enterpriseReviewCreateRequest) return {code: 1, message: 審核完成}6.2 審核邏輯實(shí)現(xiàn)staticmethod async def enterprise_review(enterpriseReviewCreateRequest: EnterpriseReviewCreateRequest): enterprise_id enterpriseReviewCreateRequest.enterprise_id review_result enterpriseReviewCreateRequest.review_result review_reason enterpriseReviewCreateRequest.review_reason # 1. 查詢或創(chuàng)建審核記錄 enterprise_review await EnterpriseReview.get_or_none( enterprise_identerprise_id ) if enterprise_review is None: # 新建審核記錄 await EnterpriseReview.create( enterprise_identerprise_id, review_resultreview_result, review_reasonreview_reason, review_timenow() ) else: # 更新已有審核記錄 enterprise_review.review_result review_result enterprise_review.review_reason review_reason enterprise_review.review_time now() await enterprise_review.save() # 2. 審核通過時(shí)更新企業(yè)狀態(tài) if review_result 1: # 通過 enterprise await Enterprise.get_or_none(identerprise_id) enterprise.account_status AccountStatus.NORMAL await enterprise.save() elif review_result 2: # 拒絕 # 可選添加拒絕處理邏輯 pass # TODO: 發(fā)送短信/郵件通知企業(yè)用戶6.3 審核狀態(tài)流轉(zhuǎn)企業(yè)注冊 → 待審核 (review_result None) │ ├── 審核通過 → review_result 1 → account_status NORMAL │ └── 審核拒絕 → review_result 2 → account_status 保持 PENDING 記錄拒絕原因 review_reason七、企業(yè)登錄驗(yàn)證碼方式7.1 驗(yàn)證碼發(fā)送enterprise_router.post(/send_sms_code/{mobile}, summary發(fā)送驗(yàn)證碼) async def send_sms_code(mobile: str): res await EnterpriseService.send_sms_code(mobile) return {code: 1, message: 發(fā)送成功, data: res}7.2 驗(yàn)證碼登錄enterprise_router.post(/login, summary企業(yè)登錄) async def login(loginMobileRequest: LoginMobileRequest): res await EnterpriseService.login(loginMobileRequest) return {code: 1, message: 登錄成功, data: res}7.3 登錄邏輯實(shí)現(xiàn)staticmethod async def login(loginMobileRequest: LoginMobileRequest): mobile loginMobileRequest.mobile code loginMobileRequest.code # 1. 通過手機(jī)號(hào)查找企業(yè) enterprise_qualifications await EnterpriseQualification.filter( contact_phonemobile ) if not enterprise_qualifications: raise Exception(手機(jī)號(hào)不存在) for qualification in enterprise_qualifications: enterprise_id qualification.enterprise_id # 2. 檢查審核記錄 enterprise_review await EnterpriseReview.get_or_none( enterprise_identerprise_id ) # 處理沒有審核記錄的情況兼容老數(shù)據(jù) if enterprise_review is None: await EnterpriseReview.create( enterprise_identerprise_id, review_resultNone, remark自動(dòng)創(chuàng)建審核記錄 ) raise Exception(賬號(hào)未審核通過請等待審核) # 審核拒絕 if enterprise_review.review_result 2: raise Exception(f賬號(hào)審核未通過: {enterprise_review.review_reason}) # 審核通過驗(yàn)證驗(yàn)證碼 if enterprise_review.review_result

相關(guān)新聞

植物冠層參數(shù)全解析:從LAI測量到遙感反演的技術(shù)實(shí)踐

植物冠層參數(shù)全解析:從LAI測量到遙感反演的技術(shù)實(shí)踐

1. 項(xiàng)目概述:從“綠蓋子”到精準(zhǔn)數(shù)據(jù)每次路過一片農(nóng)田、一片果園,或者一片人工林,我們第一眼看到的往往是那一片郁郁蔥蔥的“綠蓋子”,這就是植物的冠層。對(duì)于大多數(shù)人來說,冠層就是植物的“頭發(fā)”和“衣服”&#xff…

2026/7/29 3:06:00 閱讀更多
Unlock Music:打破音樂平臺(tái)枷鎖的終極解決方案

Unlock Music:打破音樂平臺(tái)枷鎖的終極解決方案

Unlock Music:打破音樂平臺(tái)枷鎖的終極解決方案 【免費(fèi)下載鏈接】unlock-music 在瀏覽器中解鎖加密的音樂文件。原倉庫: 1. https://github.com/unlock-music/unlock-music ;2. https://git.unlock-music.dev/um/web 項(xiàng)目地址: https://gitc…

2026/7/29 3:06:00 閱讀更多
基于金稅四期的財(cái)稅風(fēng)控規(guī)則引擎與業(yè)財(cái)一體化架構(gòu)實(shí)戰(zhàn)

基于金稅四期的財(cái)稅風(fēng)控規(guī)則引擎與業(yè)財(cái)一體化架構(gòu)實(shí)戰(zhàn)

隨著金稅四期全面上線,傳統(tǒng)財(cái)稅系統(tǒng)在面對(duì)海量高頻風(fēng)險(xiǎn)預(yù)警指標(biāo)時(shí),常因數(shù)據(jù)孤島和規(guī)則硬編碼導(dǎo)致合規(guī)響應(yīng)滯后。企業(yè)在進(jìn)行IPO財(cái)務(wù)規(guī)范或高企申報(bào)時(shí),業(yè)財(cái)數(shù)據(jù)不一致往往成為致命瓶頸。本文將結(jié)合高頓咨詢在B端財(cái)稅數(shù)字化領(lǐng)域的工程實(shí)踐&#…

2026/7/29 9:26:11 閱讀更多
Flexx桌面應(yīng)用安全加固實(shí)戰(zhàn):從代碼到部署的全面防護(hù)指南

Flexx桌面應(yīng)用安全加固實(shí)戰(zhàn):從代碼到部署的全面防護(hù)指南

1. 項(xiàng)目概述:為什么Flexx應(yīng)用需要特別的安全關(guān)注? 最近在社區(qū)里看到不少朋友開始用Flexx來開發(fā)桌面應(yīng)用,尤其是那些想把Web應(yīng)用打包成獨(dú)立桌面程序的項(xiàng)目。Flexx這個(gè)框架確實(shí)挺有意思,它讓你能用純Python寫前端界面,然…

2026/7/29 9:26:11 閱讀更多
Go與C語言面向?qū)ο缶幊虒?duì)比:結(jié)構(gòu)體、方法接收者與函數(shù)指針模擬類

Go與C語言面向?qū)ο缶幊虒?duì)比:結(jié)構(gòu)體、方法接收者與函數(shù)指針模擬類

1. 項(xiàng)目概述:當(dāng)Go遇上C,兩種“類”思維的碰撞在編程語言的演進(jìn)長河中,面向?qū)ο缶幊?amp;#xff08;OOP)無疑是一座重要的里程碑。當(dāng)我們談?wù)摗邦悺睍r(shí),腦海中首先浮現(xiàn)的可能是Java、C這類以類為第一公民的語言。但今天&…

2026/7/29 9:26:11 閱讀更多
Arduino模擬信號(hào)與PWM控制:從電位器到LED亮度調(diào)節(jié)的完整實(shí)現(xiàn)

Arduino模擬信號(hào)與PWM控制:從電位器到LED亮度調(diào)節(jié)的完整實(shí)現(xiàn)

1. 從旋鈕到光暈:一個(gè)燈光調(diào)節(jié)器的誕生 最近在整理工作室的舊物,翻出來一塊吃灰已久的Arduino Edison開發(fā)板??粗?amp;#xff0c;我忽然想起很多朋友,包括當(dāng)年的我自己,在入門嵌入式開發(fā)時(shí),常常會(huì)卡在一個(gè)看似簡單卻至…

2026/7/29 9:26:11 閱讀更多
國內(nèi)專業(yè)網(wǎng)站建設(shè)公司盤點(diǎn),2026 精選十家高口碑網(wǎng)站設(shè)計(jì)公司全方位梳理

國內(nèi)專業(yè)網(wǎng)站建設(shè)公司盤點(diǎn),2026 精選十家高口碑網(wǎng)站設(shè)計(jì)公司全方位梳理

一、2026 網(wǎng)站建設(shè)行業(yè)現(xiàn)狀深度解析生成式 AI、GEO 搜索優(yōu)化、llms 協(xié)議規(guī)范、多系統(tǒng)數(shù)據(jù)互通等新技術(shù)落地,市場對(duì)網(wǎng)站建設(shè)服務(wù)商的能力要求發(fā)生根本性分層。中大型企業(yè)、上市公司、出海品牌更青睞兼具行業(yè)深耕、定制開發(fā)、AI 營銷配套、長期運(yùn)維迭代能力的綜合服務(wù)…

2026/7/29 9:26:11 閱讀更多
Agent 平臺(tái)化思考:從定制化開發(fā)到通用 Agent 平臺(tái)的架構(gòu)演進(jìn)

Agent 平臺(tái)化思考:從定制化開發(fā)到通用 Agent 平臺(tái)的架構(gòu)演進(jìn)

Agent 平臺(tái)化思考:從定制化開發(fā)到通用 Agent 平臺(tái)的架構(gòu)演進(jìn) 一、從"一個(gè) Agent 一個(gè)項(xiàng)目"到"Agent 平臺(tái)":工程化必經(jīng)之路 2026 年初,某 SaaS 公司面臨一個(gè)困境:過去一年,他們?yōu)椴煌蛻粜枨箝_發(fā)了…

2026/7/29 9:16:11 閱讀更多
面試官大笑:“一個(gè)任務(wù)拆給 5 個(gè) Subagent 并行跑,不比 1 個(gè)快 5 倍?“我搖頭:“快不了,還可能更慢“

面試官大笑:“一個(gè)任務(wù)拆給 5 個(gè) Subagent 并行跑,不比 1 個(gè)快 5 倍?“我搖頭:“快不了,還可能更慢“

前兩個(gè)月,我在重構(gòu) AlgoMooc 網(wǎng)站過程中,發(fā)現(xiàn)一個(gè)問題:在 Claude Code 里把一個(gè)任務(wù)拆給 5 個(gè) Subagent 并行跑,結(jié)果可能比 1 個(gè) agent 從頭干到尾還慢? 大多數(shù)人的第一反應(yīng)是反過來的:活是并行干的&#…

2026/7/29 0:15:24 閱讀更多
# 鴻蒙 HarmonyOS 應(yīng)用開發(fā)實(shí)戰(zhàn)(第25期)|骰子(Dice Roller)— Unicode 符號(hào)與動(dòng)畫渲染精講

# 鴻蒙 HarmonyOS 應(yīng)用開發(fā)實(shí)戰(zhàn)(第25期)|骰子(Dice Roller)— Unicode 符號(hào)與動(dòng)畫渲染精講

一、應(yīng)用概述 骰子(Dice Roller) 是一款經(jīng)典的休閑娛樂應(yīng)用,模擬了真實(shí)擲骰子的過程。應(yīng)用投擲兩個(gè)骰子(六面標(biāo)準(zhǔn)骰),使用 Unicode 骰面符號(hào)直觀展示每個(gè)骰子的點(diǎn)數(shù),并伴有快速滾動(dòng)的動(dòng)畫效果?!?/p>

2026/7/29 0:15:24 閱讀更多