day(08)列表查詢、詳情獲取、審核與驗證碼登錄全流程
實現(xiàn)了企業(yè)列表分頁查詢、企業(yè)詳情獲取、企業(yè)審核狀態(tài)變更及企業(yè)驗證碼登錄四個核心接口二、接口層實現(xiàn)Router接口層負責定義路由、接收請求參數(shù)、調(diào)用服務(wù)層并返回統(tǒng)一響應(yīng)格式。1. 獲取所有企業(yè)列表python運行enterprise_router.get(path/getenterprises/, summary獲取所有企業(yè)) async def getenterprises( page: int 1, size: int 3, name: str | None None, submit_start: str | None None, submit_end: str | None None ): res await EnterPriseService.getenterprises(page, size, name, submit_start, submit_end) return {code: 200, data: res, msg: 獲取成功}功能支持分頁查詢、企業(yè)名稱模糊搜索、提交時間范圍篩選參數(shù)page頁碼、size每頁條數(shù)、name企業(yè)名、submit_start/end時間范圍響應(yīng)統(tǒng)一返回code/data/msg格式2. 獲取單個企業(yè)信息python運行enterprise_router.get(path/getenterpriseinfo/, summary獲取單個企業(yè)信息) async def getenterpriseinfo(id: int): res await EnterPriseService.getenterpriseinfo(id) return {code: 200, data: res, msg: 獲取成功}功能根據(jù)企業(yè) ID 獲取完整企業(yè)信息基礎(chǔ)信息 詳情 資質(zhì) 審核記錄參數(shù)id企業(yè) ID校驗服務(wù)層會校驗企業(yè)及關(guān)聯(lián)數(shù)據(jù)是否存在3. 企業(yè)審核python運行enterprise_router.post(path/enterprisecheck/, summary企業(yè)審核) async def enterprisecheck(id: int, request: EnterpirseCheck): res await EnterPriseService.enterprisecheck(id, request) return {code: 200, data: res, msg: 操作成功}功能管理員審核企業(yè)資質(zhì)更新企業(yè)狀態(tài)并記錄審核日志參數(shù)id企業(yè) ID、request審核請求體包含審核結(jié)果、原因等事務(wù)服務(wù)層使用事務(wù)保證數(shù)據(jù)一致性4. 企業(yè)驗證碼登錄python運行enterprise_router.post(path/enterpriseloginsms/, summary企業(yè)驗證碼登錄) async def enterpriseloginsms(request: Request): temp await request.json() res await EnterPriseService.enterpriseloginsms(temp) return {code: 200, data: res, msg: 登錄成功}功能企業(yè)用戶通過手機號 驗證碼登錄生成 JWT Token參數(shù)request包含phone和code的 JSON 請求體校驗校驗手機號存在性、驗證碼有效性、企業(yè)審核狀態(tài)三、服務(wù)層實現(xiàn)Service服務(wù)層封裝核心業(yè)務(wù)邏輯與數(shù)據(jù)庫交互處理復雜查詢和事務(wù)。1. 企業(yè)列表查詢getenterprisespython運行staticmethod async def getenterprises(page: int, size: int, name: str, submit_start: str, submit_end: str): query Q() if name: query Q(enterprise_name__icontainsname) # 模糊搜索 if submit_start and submit_end: query Q(submit_time__range(submit_start, submit_end)) # 時間范圍篩選 result [] # 分頁查詢企業(yè)基礎(chǔ)信息 enterprise await Enterprise.filter(query).offset((page - 1)* size).limit(size) for i in enterprise: temp {} temp[enterprise] dict(i) # 關(guān)聯(lián)查詢企業(yè)詳情和資質(zhì)信息 enterprise_info await EnterpriseInfo.get_or_none(enterprise_idi.id) enterprise_qualification await EnterpriseQualification.get_or_none(enterprise_idi.id) temp[enterprise_info] dict(enterprise_info) temp[enterprise_qualification] dict(enterprise_qualification) result.append(temp) # 返回分頁數(shù)據(jù)和總數(shù) return {result: result, total: await Enterprise.filter(query).count()}核心邏輯使用Q()構(gòu)建動態(tài)查詢條件分頁offset((page-1)*size).limit(size)多表關(guān)聯(lián)遍歷企業(yè)數(shù)據(jù)關(guān)聯(lián)查詢EnterpriseInfo和EnterpriseQualification統(tǒng)計總數(shù)用于前端分頁組件2. 企業(yè)詳情查詢getenterpriseinfopython運行staticmethod async def getenterpriseinfo(id: int): enterprise await Enterprise.get_or_none(idid) if not enterprise: raise Exception(企業(yè)不存在) # 預加載行業(yè)信息避免N1查詢 enterprise_info await EnterpriseInfo.get_or_none(enterprise_idid).prefetch_related(industry) if not enterprise_info: raise Exception(企業(yè)信息不存在) enterprise_qualification await EnterpriseQualification.get_or_none(enterprise_idid) if not enterprise_qualification: raise Exception(企業(yè)資質(zhì)不存在) enterprise_record await EnterpriseRecord.filter(enterprise_idid) result { enterprise: dict(enterprise), enterprise_info: dict(enterprise_info), enterprise_qualification: dict(enterprise_qualification), enterprise_record: [dict(i) for i in enterprise_record], industryname: enterprise_info.industry.name # 直接獲取預加載的行業(yè)名稱 } return result核心優(yōu)化使用prefetch_related(industry)預加載關(guān)聯(lián)的行業(yè)數(shù)據(jù)避免循環(huán)查詢多層校驗確保企業(yè)及關(guān)聯(lián)數(shù)據(jù)完整存在結(jié)構(gòu)化返回將多表數(shù)據(jù)整合成統(tǒng)一字典方便前端使用3. 企業(yè)審核enterprisecheckpython運行staticmethod async def enterprisecheck(id: int, request: EnterpirseCheck): enterpriseobj await Enterprise.get_or_none(idid) if not enterpriseobj: raise Exception(企業(yè)不存在) recordobj await EnterpriseReview.get_or_none(enterprise_idid) # 開啟事務(wù)保證數(shù)據(jù)一致性 async with in_transaction() as conn: if request.review_result 1: # 審核通過更新企業(yè)狀態(tài)為啟用 enterpriseobj.account_status 0 await enterpriseobj.save(using_dbconn) # 處理審核記錄新增或更新 if not recordobj: await EnterpriseReview.create( enterprise_idid, review_resultrequest.review_result, review_reasonrequest.review_reason, remarkrequest.remark, review_timetime.strftime(%Y-%m-%d %H:%M:%S, time.localtime()), using_dbconn ) else: request_data request.model_dump(exclude_unsetTrue) request_data[review_time] time.strftime(%Y-%m-%d %H:%M:%S, time.localtime()) await recordobj.update_from_dict(request_data) await recordobj.save(using_dbconn) # 記錄審核操作日志 await EnterpriseRecord.create( enterprise_idid, content審核通過 if request.review_result 1 else 審核未通過, record_timetime.strftime(%Y-%m-%d %H:%M:%S, time.localtime()) ) return True核心特性事務(wù)管理in_transaction()確保審核狀態(tài)變更、審核記錄、操作日志三步操作要么全部成功要么全部回滾狀態(tài)變更審核通過時將企業(yè)account_status設(shè)為 0啟用日志記錄通過EnterpriseRecord記錄審核操作便于追溯4. 企業(yè)驗證碼登錄enterpriseloginsmspython運行staticmethod async def enterpriseloginsms(request: Request): phone request.get(phone) enterprise_info await EnterpriseQualification.get_or_none(contact_phonephone) if not enterprise_info: raise Exception(手機號不存在) # 從Redis獲取驗證碼 key fp4boss:sms_code:enterprise_login:{phone} code_redis r.get(key) if not code_redis: raise Exception(驗證碼已過期) if code_redis ! request.get(code): raise Exception(驗證碼錯誤) # 校驗企業(yè)審核狀態(tài) enterprisereviewobj await EnterpriseReview.get_or_none(enterprise_identerprise_info.enterprise_id) if not enterprisereviewobj: raise Exception(企業(yè)還未審核) if enterprisereviewobj.review_result ! 1: raise Exception(企業(yè)審核未通過) # 生成JWT Token enterpriseobj await EnterpriseInfo.get_or_none(enterprise_identerprise_info.enterprise_id) access_token, refresh_token create_tokens(str(enterpriseobj.enterprise_id), enterpriseobj.enterprise_name) return { enterprise_access_token: access_token, enterprise_refresh_token: refresh_token }核心流程校驗手機號是否存在于企業(yè)資質(zhì)表從 Redis 校驗驗證碼有效性和時效性校驗企業(yè)是否已通過審核生成access_token和refresh_token用于后續(xù)接口鑒權(quán)安全設(shè)計驗證碼存儲在 Redis 并設(shè)置過期時間避免暴力破解四、關(guān)鍵技術(shù)點總結(jié)表格技術(shù)點說明動態(tài)查詢使用Q()對象構(gòu)建多條件組合查詢支持模糊搜索和時間范圍篩選分頁實現(xiàn)Tortoise-ORM 的offset()和limit()方法實現(xiàn)高效分頁預加載優(yōu)化prefetch_related()解決 N1 查詢問題提升多表查詢性能事務(wù)管理in_transaction()保證復雜業(yè)務(wù)操作的數(shù)據(jù)一致性JWT 認證登錄成功后生成雙 Token實現(xiàn)無狀態(tài)鑒權(quán)統(tǒng)一響應(yīng)所有接口返回{code: 200, data: ..., msg: ...}格式便于前端處理五、學習收獲架構(gòu)分層進一步理解了 FastAPI 中接口層與服務(wù)層分離的優(yōu)勢業(yè)務(wù)邏輯復用性更強ORM 高級用法掌握了動態(tài)查詢、分頁、預加載、事務(wù)等 Tortoise-ORM 核心特性安全設(shè)計學習了驗證碼登錄、JWT 鑒權(quán)等安全機制的實現(xiàn)數(shù)據(jù)完整性通過多層校驗和事務(wù)保證企業(yè)數(shù)據(jù)的完整性和一致性

相關(guān)新聞

大模型與小模型的核心差異與應(yīng)用選型指南

大模型與小模型的核心差異與應(yīng)用選型指南

1. 大模型與小模型的本質(zhì)差異:不只是參數(shù)量的較量當我們在討論大模型(LLM)和小模型(SLM)時,很多人第一反應(yīng)就是參數(shù)量的差異。確實,像GPT-3這樣的LLM擁有1750億參數(shù),而典型的SLM可能…

2026/7/29 2:56:00 閱讀更多
工業(yè)溫度監(jiān)測系統(tǒng)Blue HeatBar的技術(shù)實現(xiàn)與應(yīng)用

工業(yè)溫度監(jiān)測系統(tǒng)Blue HeatBar的技術(shù)實現(xiàn)與應(yīng)用

1. Blue HeatBar Solution 項目概述 Blue HeatBar Solution 是一個面向工業(yè)溫度監(jiān)測與控制的創(chuàng)新解決方案。作為一名在工業(yè)自動化領(lǐng)域深耕多年的工程師,我見證了傳統(tǒng)溫度監(jiān)控系統(tǒng)的諸多痛點:響應(yīng)延遲、精度不足、可視化效果差。而 Blue HeatBar 正是針對…

2026/7/29 10:56:25 閱讀更多
Word表格排版技巧:如何讓表格均勻鋪滿整頁

Word表格排版技巧:如何讓表格均勻鋪滿整頁

1. 項目概述:為什么“鋪滿整頁”是個技術(shù)活?剛接手一份報告或者要排版一個手冊,在Word里插了個表格,結(jié)果發(fā)現(xiàn)它要么縮在頁面中間,要么擠在一邊,就是沒法大大方方地占滿整個頁面。這場景,但凡用過…

2026/7/29 10:56:25 閱讀更多
【計算機畢業(yè)設(shè)計】基于SpringBoot的考研志愿采集系統(tǒng)設(shè)計與實現(xiàn)

【計算機畢業(yè)設(shè)計】基于SpringBoot的考研志愿采集系統(tǒng)設(shè)計與實現(xiàn)

1.系統(tǒng)介紹隨著研究生招生規(guī)模持續(xù)擴大,傳統(tǒng)考研志愿采集方式存在數(shù)據(jù)管理分散、填報流程不規(guī)范、信息更新不及時等問題,難以滿足高校研招工作數(shù)字化、精細化管理需求,因此開發(fā)一套高效的考研志愿采集系統(tǒng)具有重要的現(xiàn)實意義。本系統(tǒng)采用 Jav…

2026/7/29 10:56:25 閱讀更多
GeoCat Bridge插件:QGIS到GeoServer的一鍵式地圖服務(wù)發(fā)布指南

GeoCat Bridge插件:QGIS到GeoServer的一鍵式地圖服務(wù)發(fā)布指南

1. 項目概述:從桌面到服務(wù)器的數(shù)據(jù)發(fā)布橋梁如果你和我一樣,長期在QGIS里搗鼓各種矢量數(shù)據(jù),從行政區(qū)劃、道路網(wǎng)絡(luò)到生態(tài)保護區(qū)邊界,那么你肯定遇到過這個經(jīng)典難題:辛辛苦苦在桌面端完成了數(shù)據(jù)的清洗、編輯和符號化&…

2026/7/29 10:56:25 閱讀更多
SAP SOST事務(wù)碼郵件發(fā)送問題排查與解決方案

SAP SOST事務(wù)碼郵件發(fā)送問題排查與解決方案

1. 為什么SOST事務(wù)碼的郵件發(fā)送會出問題?在SAP系統(tǒng)中,SOST事務(wù)碼是ABAP開發(fā)人員最常用的郵件發(fā)送工具之一。但很多新手在使用時經(jīng)常遇到各種"郵件發(fā)不出去"的詭異情況。根據(jù)我多年處理SAP郵件問題的經(jīng)驗,90%的SOST發(fā)送失敗都可以歸…

2026/7/29 10:56:25 閱讀更多
【AI物流優(yōu)化實戰(zhàn)手冊】:20年物流算法專家親授5大落地場景+3個避坑指南

【AI物流優(yōu)化實戰(zhàn)手冊】:20年物流算法專家親授5大落地場景+3個避坑指南

更多請點擊: https://kaifayun.com 第一章:AI物流優(yōu)化的核心價值與演進脈絡(luò) 人工智能正深度重塑全球供應(yīng)鏈的運行邏輯。在物流領(lǐng)域,AI不再僅是效率提升的輔助工具,而是驅(qū)動網(wǎng)絡(luò)協(xié)同、動態(tài)決策與韌性構(gòu)建的戰(zhàn)略中樞。其核心價值體…

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

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

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

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

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

一、應(yīng)用概述 骰子(Dice Roller) 是一款經(jīng)典的休閑娛樂應(yīng)用,模擬了真實擲骰子的過程。應(yīng)用投擲兩個骰子(六面標準骰),使用 Unicode 骰面符號直觀展示每個骰子的點數(shù),并伴有快速滾動的動畫效果。…

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