03 開源任務管理系統:創建一個任務

来源:https://www.cnblogs.com/iovec/archive/2022/08/23/16615630.html
-Advertisement-
Play Games

雖說是一個任務管理系統,但簡單地講,其實就是任務的增刪改查(CRUD)。 其中最重要的又當屬增,即創建任務,此為數據之源,刪改查都依賴於它所產生的數據。接下來就從交互設計到前端,服務端,資料庫一步步去實現任務的創建。 ...


GitHub 地址:https://github.com/dom-bro/task-manager

雖說是一個任務管理系統,但簡單地講,其實就是任務的增刪改查(CRUD)

其中最重要的又當屬,即創建任務,此為數據之源,刪改查都依賴於它所產生的數據。

交互設計

憑著程式員的直覺,最初做成了一個表單如下圖,表單項也對應了資料庫中的表的欄位,簡單直接。

後來經過同事的建議,對比了 towerteambitionworktile 這些成熟產品的交互設計。

tower 看板如下圖所示

teambition 看板如下圖所示

worktile 看板如下圖所示

發現看板形式確實是比較適合任務的展現的。於是最終改版為如下任務卡片看板

任務的創建和展現全部放在一塊看板上。交互路徑更短,更易用。

資料庫表結構設計

作為一個地地道道的前端,資料庫知識依然來源於大學時期的殘存。為了最小化學習成本,自然而然選擇了 MongoDB。使用 MongoDB
可以簡單地理解為操作 json 對象,寫資料庫也只是把一堆 json 對象存到了資料庫里。

MongoDB 為每個主流編程語言都提供了相應的 driver,直接給 node 提供了一個 npm 包。

npm i mongodb

接下來就開始設計資料庫里的第一張表,任務表。任務表的數據結構完全由一個任務的組成因素去映射。

想一想實際工作中的任務是怎樣的

  • 任務標題

    顯然必不可少,除了這個欄位必選,其他都是可選項

  • 任務排期

    至關重要,是之後彙總周報,季報的依據。想必在座的各位都被催過排期吧

  • 需求文檔

    鏈接也好,文字描述也好,凡是需求相關的通通放進來,好記性不如爛筆頭。什麼!沒有需求文檔!全靠嘴說腦記!珍惜生命,趁早放手吧。然鵝這隻是輔助記錄而已,對頻繁需求變更這個老大難問題著實是無能為力哈哈

  • 相關人員

    產品,UI,後端,測試,各個崗位的對接人得清楚。

  • 項目分支

    項目再多,分支再亂,也別搞錯哦。分支搞不對,加班兩行淚。

好了,為了簡單起見,先暫定這幾個欄位吧。其他欄位可根據需要再增加。

目前任務的數據結構大致如下

{
  title: String, // 任務標題
  schedule: [String, String], // 任務排期,[開始時間,結束時間]
  doc: { // 相關文檔
    pm: String, // 需求文檔
    ui: String, // 設計文檔
    api: String, // 介面文檔
  },
  workmate: { // 相關人員
    pm: Object, // 產品
    ui: Object, // UI
    api: Object, // 後端
    qa: Object, // 測試
  },
  repos: [ // 項目分支
    {
      name: String, // 項目名稱
      branch: String, // 分支名稱
    }
  ],
  status: String, // 任務狀態 未開始|開發中|已提測|已完成
}

後端實現

這裡只需要一個創建的介面即可

在開發介面的過程中可能需要頻繁重啟服務來測試介面,所以在開始開發介面之前,隆重引入一個新輪子 nodemon,服務端進程就由它來守護,實現文件變更時重啟伺服器。

可以在根目錄給 nodemon 一個配置文件 nodemon.json,簡單配置下

{
  "watch": [
    "server.js"
  ]
}

這樣在改變 server.js 的時候伺服器就會自動重啟

好了,接下來就開始寫創建介面

由於是資料庫寫入,這顯然是一個 POST 請求,koa 需要一個中間件來解析 post 請求出入的參數。

npm i koa-bodyparser

使用起來也極其簡單,koa 中間件使用方式都一樣

import bodyparser from 'koa-bodyparser'
app.use(bodyparser())

萬事俱備,只欠寫入資料庫了

import { MongoClient, ObjectId } from 'mongodb'
// 連接資料庫
const client = new MongoClient('mongodb://localhost:27017')

router.post('/task/upsert', async (ctx, next) => {
  // 要操作的資料庫
  const db = client.db('task-manager')
  // 要操作的表,mongodb 中叫做集合
  const collection = db.collection('task')
  // post 請求的參數經 bodyparser 後放在 ctx.request.body 里
  const doc = ctx.request.body
  const { _id } = doc
  const result = await collection.updateOne(
    // _id 是 mongodb 預設主鍵名,ObjectId 可用於生成一個唯一 id
    { _id: _id || ObjectId() },
    { $set: doc },
    // upsert 表示存在則更新,不存在則插入
    { upsert: true }
  )
  // 介面返回
  ctx.body = {
    doc,
    result,
  }
})

這裡只需要關註一個 api,mongodb 的 db.collection.updateOne(),用於數據的插入或更新。

前端實現

根據交互設計,任務的查看和創建都在同一個頁面,即看板視圖。

在 components 目錄新建一個組件 NewTaskCard.vue

關鍵代碼就是請求創建任務介面

// src/components/NewTaskCard.vue
async submitNewTask () {
  await axios.post('/task/upsert', this.task)
},

由於伺服器功能變數名稱和開發伺服器功能變數名稱不一致,所以需要在 main.js 里設置一下服務端的功能變數名稱

// main.js
axios.defaults.baseURL = `${location.protocol}//${location.hostname}:${SERVER_PORT}`

為了簡單起見,看板暫時先放在 src/pages/Home.vue

關鍵代碼就是定義任務的狀態

// src/pages/Home.vue
taskStatus: {
  draft: '未開始',
  dev: '開發中',
  qa: '已提測',
  done: '已完成',
},

最後

實現效果如下

正文結束。點擊查看代碼變更

閑言碎語

mongodb or mongoose

mongodb 包是 MongoDB 官方給 node.js 出的 driver,通過它就可以直接調用資料庫的 api,就像直接在 shell 中使用資料庫一樣方便。

mongodb 相對傳統 MySQL 這種資料庫,最重要的區別就是沒有了表的概念,取而代之使用集合,集合中的每一條數據甚至不需要結構相同。

例如 mongodb 的集合中可能存的是這樣子的數據

[
  { a: 1, b: true },
  { a: 'DOM', c: [ { d: null } ]}
]

一句話,自由,隨便存,只要是 json 就能往裡存。

mongoose 則是為了重現表的概念,核心概念是 Schema 和 Model,Schema 用來定義數據結構,Model 用來定義表。這樣使得集合中的數據結構嚴整統一,少有冗餘,像一張 excel 表格一樣。當然 mongoose 還提供了其它高級特性,但我還不太熟悉,這裡不再贅述。

為了減少 mongoose 的概念和知識產生的額外學習成本,這裡就選擇直接自由自在的操作 mongodb 吧

有對 mongoose 瞭解的同學歡迎評論區補充相對 mongodb 的優勢。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 總體來說 性能提升 重寫了虛擬DOM的實現(跳過靜態節點,只處理動態節點) update性能提高1.3~2倍 服務端渲染速度提高了2~3倍 樹搖(Tree shaking) 可以將無用模塊“剪輯”掉,僅打包需要的 原理: ES6 Module引入進行靜態分析,故而編譯的時候正確判斷到底載入了那些模塊 ...
  • 5 基本語句 5.1 if 語句 if 語句常用語法如下所示: if (condition) { statement1; } else { statement2; } 或 if (condition) { statement1; } else if { statement2; } else if { ...
  • @(目錄) 點擊打開視頻講解面試技巧+面試全過程 一、HTML 1、語義話的目的是什麼? 語義化的主要目的可以概括為用正確的標簽做正確的事 HTMl語義化可以讓頁面的內容結構化,以便於瀏覽器解析和搜索引擎解析, 並且提高了代碼的可讀性便於代碼維護, 2、HTML5新增元素 Canvas繪圖以及SVG ...
  • 本文是深入淺出 ahooks 源碼系列文章的第十二篇,該系列已整理成文檔-地址。覺得還不錯,給個 star 支持一下哈,Thanks。 今天我們來聊聊 ahooks 中那些可以幫助我們更優雅管理我們 state(狀態)的那些 hook。一些比較特殊的,比如 cookie/localStorage/s ...
  • js 中 操作元素樣式 通過js修改元素內聯樣式(設置和讀取的都是內聯樣式) 獲取當前元素顯示的樣式 <html> <head> <meta charset="utf-8"> <title></title> </head> <style type="text/css"> #box1 { width: ...
  • 1:UEditor-plus富文本編輯器如何在vue項目中使用 備註:UEditor是由百度web前端研發部開發的所見即所得的開源富文本編輯器,由於該項目不在維護;程式員自發對其進行了維護,詳見 https://gitee.com/modstart-lib/ueditor-plus?_from=gi ...
  • 中文姓名 /^(?:[\u4e00-\u9fa5·]{2,16})$/ 英文姓名 /(^[a-zA-Z][a-zA-Z\s]{0,20}[a-zA-Z]$)/ 手機號(mobile phone)中國(嚴謹), 根據工信部2019年最新公佈的手機號段 /^(?:(?:\+|00)86)?1(?:(?: ...
  • DevCraft適用於所有.NET和JavaScript框架的功能豐富的UI組件。通過專業設計的組件和主題,構建更加美觀且現代的應用程式。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...