【Flask】測試平臺開發,新增說明書編寫和展示功能 第二十三篇

概述:

本篇是接著上一篇,細分出說明書的編寫部分,實現這個功能的需求,是內部很多同事反饋,需要有個地方存工具,并且可以寫說明書,如果需要的人,那么可以在界面上直接下載工具和查看工具的說明,這樣就不用每次都找人發文檔,各種本地找,很浪費時間,故此需要實現這樣的一個功能

新建說明書表

CREATE TABLE IF NOT EXISTS `manual` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵ID',`tool_id` int(11) NOT NULL COMMENT '關聯的工具ID',`version` varchar(20) NOT NULL DEFAULT '1.0' COMMENT '版本號',`title` varchar(255) NOT NULL COMMENT '說明書標題',`content` text COMMENT '富文本內容',`file_path` varchar(255) DEFAULT NULL COMMENT '附件存儲路徑',`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',`updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間',PRIMARY KEY (`id`),UNIQUE KEY `idx_tool_version` (`tool_id`, `version`) COMMENT '工具ID和版本號的唯一索引',KEY `idx_tool_id` (`tool_id`) COMMENT '工具ID索引'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='工具說明書表';
驗證數據表
-- 給 manual 表添加缺失的 version 和 file_path 字段
ALTER TABLE manual
ADD COLUMN version VARCHAR(20) NOT NULL DEFAULT '1.0' COMMENT '版本號',
ADD COLUMN file_path VARCHAR(255) NULL COMMENT '文件路徑';-- 驗證字段是否添加成功
DESCRIBE manual;  -- 應顯示所有字段:id, tool_id, title, content, version, file_path, created_at

建立數據表模型

# app/models.py(Manual 模型定義)
from datetime import datetime
from extensions import dbclass Manual(db.Model):__tablename__ = 'manual'  # 表名必須與數據庫一致id = db.Column(db.Integer, primary_key=True)tool_id = db.Column(db.Integer, nullable=False, comment='工具ID')title = db.Column(db.String(255), nullable=False, comment='標題')  # 確保表中有 title 字段content = db.Column(db.Text, comment='富文本內容')version = db.Column(db.String(20), default='1.0', comment='版本號')  # 新增字段file_path = db.Column(db.String(255), nullable=True, comment='文件路徑')  # 新增字段created_at = db.Column(db.DateTime, default=datetime.now, comment='創建時間')# 確保沒有其他多余字段(如 updated_at 若表中不存在需刪除)__table_args__ = (db.Index('idx_tool_id', 'tool_id'),  # 添加索引)

新增保存說明書的接口和獲取說明書的接口

保存說明書的接口開發

@tool_bp.post('/manual/save')
def save_manual():try:data = request.get_json()if not data:return jsonify({"code": 40000,"message": "請求數據不能為空","data": None,"total": 0})# 強制校驗字段required = ['tool_id', 'title', 'content']if not all(k in data for k in required):return jsonify({"code": 40000,"message": f"缺少必填字段: {', '.join(required)}","data": None,"total": 0})# 類型檢查try:tool_id = int(data['tool_id'])except ValueError:return jsonify({"code": 40000,"message": "tool_id必須為整數","data": None,"total": 0})# 數據庫操作manual = Manual.query.filter_by(tool_id=tool_id).first()if manual:manual.title = data['title']manual.content = data['content']else:manual = Manual(tool_id=tool_id,title=data['title'],content=data['content'])db.session.add(manual)db.session.commit()return jsonify({"code": 20000,"message": "保存成功","data": {"id": manual.id},"total": 1})except Exception as e:db.session.rollback()current_app.logger.error(f"保存失敗: {str(e)}")  # 記錄詳細錯誤return jsonify({"code": 40000,"message": f"保存失敗: {str(e)}",  # 返回具體錯誤信息"data": None,"total": 0})

驗證接口是不是可以保存數據成功,接口成功,至于前端界面的集成編輯器功能,我們在前面的文章中有提到,如何在vue2.x中集成編輯器,可以往上看上一篇文章;

另外這里的說明書我在此基礎上增加了一個PDF導出的功能,說明書如果想發送給別人,那么這里可以直接導出,這樣就可以在本地看到一個文件,也可以發送給其他人員

目前我們說明書部分可以保存了,接下來需要實現一個接口,從數據庫中讀取我們的數據展示,這樣每次點擊查看說明書時,默認展示存儲的說明書數據

開發接口

@tool_bp.route('/info/<int:tool_id>', methods=['GET']) 
def get_tool_info(tool_id):"""獲取工具基本信息(原接口,包含 toolId、toolName 等)"""tool = Tool.query.get(tool_id)  return jsonify({"code": 20000,"data": {"toolId": tool.id,"toolName": tool.name,"manuals": []  }})

獲取指定工具說明書,點擊后自動獲取工具關聯的說明書數據

@tool_bp.route('/manual/<int:tool_id>', methods=['GET'])  # 說明書回顯接口(專屬)
def get_manual(tool_id):"""獲取指定工具的說明書(僅返回 title 和 content)"""manual = Manual.query.filter_by(tool_id=tool_id).first()return jsonify({"code": 20000,"data": {"title": manual.title if manual else "","content": manual.content if manual else ""}})

驗證下效果,點擊查看說明書后跳轉如下

至此,說明書關聯部分開發完成,完整前端代碼如下

<template><div class="manual-edit-container"><el-card><!-- 標題區域 --><div slot="header" class="card-header"><el-breadcrumb separator="/"><el-breadcrumb-item>工具管理</el-breadcrumb-item><el-breadcrumb-item>編輯說明書</el-breadcrumb-item></el-breadcrumb></div><!-- 表單內容 --><el-form ref="form" :model="form" label-width="120px"><!-- 說明書標題 --><el-form-item label="說明書標題" required><el-inputv-model="form.title"placeholder="請輸入標題"maxlength="200"show-word-limitstyle="width: 600px"/></el-form-item><!-- 富文本編輯器 --><el-form-item label="說明書內容" required><TinymceEditorv-model="form.content":height="500":disabled="loading"/></el-form-item><!-- 操作按鈕 --><el-form-item><el-buttontype="primary"@click="handleSave":loading="loading"><i class="el-icon-check"></i> 保存</el-button><el-buttontype="success"@click="handleExportPDF":disabled="!form.content.trim()"><i class="el-icon-download"></i> 導出PDF</el-button><el-button @click="handleCancel">取消</el-button></el-form-item></el-form></el-card></div>
</template><script>
import TinymceEditor from '@/components/TinymceEditor.vue' // 富文本編輯器組件
import axios from 'axios' // HTTP請求庫
import html2pdf from 'html2pdf.js' // PDF導出庫export default {name: 'ManualEdit',components: { TinymceEditor },data() {return {form: {tool_id: this.$route.params.id, // 從路由獲取工具ID(例如31)title: '', // 存儲數據庫中的標題content: '' // 存儲數據庫中的富文本內容},loading: false // 保存按鈕加載狀態}},created() {// 頁面加載時立即從數據庫獲取數據this.loadManualFromDatabase()},methods: {/*** 從數據庫加載說明書數據(核心方法)*/async loadManualFromDatabase() {// 1. 顯示加載提示this.$message.info('正在加載說明書數據...')try {// 2. 調用后端回顯接口(已驗證返回正確數據)const response = await axios.get(`http://172.16.60.60:5000/api/tool/manual/${this.form.tool_id}`)// 3. 驗證接口響應格式if (response.data.code === 20000) {const manualData = response.data.data || {}// 4. 賦值到表單(覆蓋默認空值)this.form.title = manualData.title || '未命名說明書'this.form.content = manualData.content || '<p>請輸入說明書內容...</p>'this.$message.success('加載成功!')} else {this.$message.warning('未找到說明書數據')}} catch (error) {// 5. 捕獲網絡錯誤this.$message.error(`加載失敗: ${error.message || '網絡異常'}`)}},/*** 保存數據到數據庫*/async handleSave() {// 1. 基礎校驗if (!this.form.title.trim()) {this.$message.warning('請輸入說明書標題')return}if (!this.form.content.trim()) {this.$message.warning('請輸入說明書內容')return}this.loading = truetry {// 2. 調用保存接口(確保后端保存接口路徑正確)const response = await axios.post('http://172.16.60.60:5000/api/tool/manual/save', this.form)// 3. 處理響應if (response.data.code === 20000) {this.$message.success('保存成功!')} else {this.$message.error(`保存失敗: ${response.data.message || '未知錯誤'}`)}} catch (error) {this.$message.error(`請求失敗: ${error.message}`)} finally {this.loading = false}},/*** 導出PDF(保留功能)*/handleExportPDF() {const opt = {margin: 15,filename: `${this.form.title || '說明書'}.pdf`,image: { type: 'jpeg', quality: 0.98 },html2canvas: { scale: 2, useCORS: true },jsPDF: { unit: 'mm', format: 'a4', orientation: 'portrait' }}// 導出當前編輯器內容html2pdf().from(document.querySelector('.tox-edit-area__iframe').contentDocument.body).set(opt).save()},/*** 取消編輯返回上一頁*/handleCancel() {this.$router.go(-1)}}
}
</script><style scoped>
.card-header {background-color: #f5f7fa;padding: 10px 20px;
}
.manual-edit-container {padding: 20px;
}
</style>

?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/95914.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/95914.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/95914.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Mac設置中的安全性缺少“任何來源”

問題&#xff1a;用Mac安裝軟件&#xff0c;隱私性與安全性&#xff0c;想切換“任何來源”用來下載網站的app&#xff0c;但是菜單欄找不到“任何來源”選項&#xff0c;無法安裝dmg的文件終端中一行代碼設置出來&#xff1a;sudo spctl --global-disable &#xff08;禁用Mac…

uniapp開發小程序,列表 點擊后加載更多數據

一、需求 1.初始顯示限制:將每頁條數limit改為5,確保初始只顯示5條數據 2.查看更多功能:添加了loadMore方法,點擊"查看更多"時加載下一頁數據 3.實現查看更多功能,點擊后加載更多數據 4.添加loading狀態防止重復請求 添加hasMore狀態判斷是否還有更多數據 …

Windows 部署 Gerrit 與 Apache24 配置

Windows 部署 Gerrit 與 Apache24 并配置反向代理 準備工作 下載并安裝 Java JDK 確保配置 JAVA_HOME 環境變量博主這里安裝openjdk21 https://jdk.java.net/archive/下載所需軟件 Apache24&#xff1a;https://httpd.apache.org/download.cgi Gerrit&#xff1a;https://www.g…

從 Excel 趨勢線到機器學習:拆解 AI 背后的核心框架?

引言&#xff1a;你其實早就 “玩轉” 過機器學習&#xff1f;提到 “機器學習”&#xff0c;你是不是第一時間聯想到復雜的代碼、密密麻麻的公式&#xff0c;還有那些讓人頭暈的 “算法”“模型”“訓練” 術語&#xff1f;仿佛它是高高在上的技術&#xff0c;離我們的日常無比…

Lenovo聯想YOGA Pro 16 IAH10 2025款筆記本電腦(83L0)開箱狀態預裝OEM原廠Win11系統

適用機型(MTM)&#xff1a;【83L0】 鏈接&#xff1a;https://pan.baidu.com/s/1tDpeBb93t1u0XIgqAZ3edg?pwdqy2r 提取碼&#xff1a;qy2r 聯想原裝系統自帶所有驅動、出廠主題壁紙、系統屬性聯機支持標志、系統屬性專屬LOGO標志、Office辦公軟件、聯想瀏覽器、電腦管家、…

Android 開發 - 一些畫板第三方庫(DrawBoard、FingerPaintView、PaletteLib)

一、DrawBoard 1、Dependencies 模塊級 build.gradle implementation com.github.jenly1314:drawboard:1.1.02、Test &#xff08;1&#xff09;Activity Layout activity_draw_board.xml <?xml version"1.0" encoding"utf-8"?> <LinearLayout …

捷多邦揭秘超厚銅板:從制造工藝到設計關鍵環節?

一、超厚銅板制造工藝要點超厚銅板&#xff08;3oz 及以上&#xff09;的制造工藝對精度和穩定性要求嚴苛&#xff0c;核心環節需突破多重技術壁壘。蝕刻工藝中&#xff0c;因銅箔厚度達 105μm 以上&#xff0c;需采用高濃度酸性蝕刻液&#xff08;氯化銅濃度控制在 180-220g/…

【MYSQL | 高級篇 MyCat實現分庫分表】

摘要&#xff1a;本文圍繞分庫分表展開&#xff0c;先分析單庫性能瓶頸&#xff0c;介紹垂直與水平拆分策略及實現技術&#xff0c;再詳述 MyCat 中間件的概述、環境準備、目錄結構&#xff0c;講解其入門配置與測試&#xff0c;深入說明核心配置文件&#xff0c;最后演示垂直和…

Docker部署Drawnix開源白板工具

Drawnix簡介 Drawnix 是一款開源的在線白板工具&#xff08;SaaS&#xff09;&#xff0c;集思維導圖、流程圖繪制、自由畫圖等多種功能于一體&#xff0c;支持協作與插件擴展&#xff0c;適用于個人創作、團隊協作和遠程辦公場景。它完全免費且開源&#xff0c;提供豐富的編輯…

Griffin|增強現實數據集|無人機數據集

Griffin|增強現實數據集|無人機數據集 數據來源&#xff1a;huggingface 百度網盤 構建方式 Griffin數據集的構建采用了模塊化架構&#xff0c;結合了CARLA和AirSim平臺&#xff0c;通過模擬真實世界中的無人駕駛環境和無人機動態&#xff0c;收集了超過30,000幀圖像數據&am…

力扣.1054距離相等的條形碼力扣767.重構字符串力扣47.全排列II力扣980.不同路徑III力扣509.斐波那契數列(記憶化搜索)

目錄 力扣.1054距離相等的條形碼 力扣767.重構字符串 力扣47.全排列II 力扣980.不同路徑III 力扣509.斐波那契數列&#xff08;記憶化搜索) 力扣.1054距離相等的條形碼 是否策略正確 但是假如 1 2 2 此時 1_2 此時中間只能填寫2&#xff0c;但是就不對了&#xff0c;所…

「docker」二、3分鐘快速理解docker核心要素

上一節中我們知道docker的作用&#xff0c;這節我們介紹一下docker的要素。 鏡像 docker的核心要素里面有個叫鏡像&#xff08;images&#xff09;的概念&#xff0c;鏡像的作用就類似我們安裝虛擬機用到的iso鏡像文件。鏡像里包含了我們要運行的應用&#xff0c;如&#xff…

搭建基于 Solon AI 的 Streamable MCP 服務并部署至阿里云百煉

一、快速搭建 Solon 項目&#xff0c;引入 Solon AI 1. 開發環境準備 JDK 8 或以上版本。Maven 3.8.6 或以上版本。通義千問 API Key&#xff08;用于模型調用&#xff09;。 2. 創建名為 mcp-server-demo 的項目 創建時選擇 Archetype 為 Solon AI&#xff08;可以減少些活&am…

免費的SSL和付費SSL 證書差異

免費的 SSL 和付費的 SSL&#xff08;TLS 證書&#xff09;本質上提供的加密能力是一樣的&#xff0c;因為 SSL/TLS 協議本身是開放標準&#xff0c;核心加密算法不會因為是否收費而不同。主要區別在于以下幾個方面&#xff1a;&#x1f511; 1. 加密強度免費 SSL&#xff1a;一…

代碼隨想錄算法訓練營第六天 -- 字符串1 || 344.反轉字符串I / 541.反轉字符串II / kamacoder54.替換數字--第八期模擬筆試

代碼隨想錄算法訓練營第六天 -- 字符串1 || 344.反轉字符串I / 541.反轉字符串II / kamacoder54.替換數字--第八期模擬筆試344.反轉字符串I思路541.反轉字符串II題目理解解題思路邊界細節reverse()函數的實現[kamacoder54.替換數字 -- 第八期模擬筆試](https://kamacoder.com/p…

計算機視覺——光流法

系列文章目錄 本系列開篇文章&#xff0c;暫時沒有目錄啦&#xff5e; 文章目錄系列文章目錄前言一、問題假設二、方程推導三、計算Ix,Iy,ItI_x,I_y,I_tIx?,Iy?,It?四、計算光流u,vu,vu,v4.1 傳統算法Lucas-Kanade算法五、孔徑問題5.1 直觀理解5.2 數學角度5.3 解決方法總結…

前端安全攻防:XSS, CSRF 等防范與檢測

前端安全攻防&#xff1a;XSS, CSRF 等防范與檢測在Web應用日益普及的今天&#xff0c;前端安全已經成為一個不容忽視的重要環節。隨著攻擊技術的不斷演進&#xff0c;各種前端安全漏洞&#xff08;如跨站腳本攻擊 XSS、跨站請求偽造 CSRF 等&#xff09;層出不窮&#xff0c;它…

03OpenCV圖像處理

參考課程&#xff1a; 【黑馬程序員 OpenCV入門教程】 [https://www.bilibili.com/video/BV1Fo4y1d7JL] ZZHow(ZZHow1024) 1.1幾何變換 圖像縮放 對圖像的大小進行調整&#xff0c;即使圖像放大或縮小 cv2.resize(src, dsize, fx0, fy0, interpolationcv2.INTER_LINEAR)參數…

UE5 C++ 第三方動態庫的使用

一. 首先要拷貝對應的 第三方庫 bin里有dll動態庫&#xff0c;include里有動態庫需要的頭文件。 二.在Target.cs里&#xff0c;進行設置 頭文件前面的路徑為公共路徑 設置需要一起打包的三方庫文件 三.加載這個庫 FPlatformProcess::GetDllHandle將他解析為 任意類型&#x…

C++進階——多態

? ? ? ? ? づ?ど &#x1f389; 歡迎點贊支持&#x1f389; 個人主頁&#xff1a;勵志不掉頭發的內向程序員&#xff1b; 專欄主頁&#xff1a;C語言&#xff1b; 文章目錄 前言 一、多態的概念 二、多態的定義及實現 2.1、多態的構成條件 &#xff08;1&#xff09;虛函…