主頁 > 企業開發 > 03 開源任務管理系統:創建一個任務

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

2022-08-24 07:47:09 企業開發

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

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

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

互動設計

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

后來經過同事的建議,對比了 tower,teambition,worktile 這些成熟產品的互動設計,

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 的優勢,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/502594.html

標籤:其他

上一篇:ts的介面和泛型的基本語法

下一篇:【Telerik和Kendo UI組件】上海道寧與progress為您提供Web、移動和桌面構建功能更豐富的現代體驗

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • IEEE1588PTP在數字化變電站時鐘同步方面的應用

    IEEE1588ptp在數字化變電站時鐘同步方面的應用 京準電子科技官微——ahjzsz 一、電力系統時間同步基本概況 隨著對IEC 61850標準研究的不斷深入,國內外學者提出基于IEC61850通信標準體系建設數字化變電站的發展思路。數字化變電站與常規變電站的顯著區別在于程序層傳統的電流/電壓互 ......

    uj5u.com 2020-09-10 03:51:52 more
  • HTTP request smuggling CL.TE

    CL.TE 簡介 前端通過Content-Length處理請求,通過反向代理或者負載均衡將請求轉發到后端,后端Transfer-Encoding優先級較高,以TE處理請求造成安全問題。 檢測 發送如下資料包 POST / HTTP/1.1 Host: ac391f7e1e9af821806e890 ......

    uj5u.com 2020-09-10 03:52:11 more
  • 網路滲透資料大全單——漏洞庫篇

    網路滲透資料大全單——漏洞庫篇漏洞庫 NVD ——美國國家漏洞庫 →http://nvd.nist.gov/。 CERT ——美國國家應急回應中心 →https://www.us-cert.gov/ OSVDB ——開源漏洞庫 →http://osvdb.org Bugtraq ——賽門鐵克 →ht ......

    uj5u.com 2020-09-10 03:52:15 more
  • 京準講述NTP時鐘服務器應用及原理

    京準講述NTP時鐘服務器應用及原理京準講述NTP時鐘服務器應用及原理 安徽京準電子科技官微——ahjzsz 北斗授時原理 授時是指接識訓通過某種方式獲得本地時間與北斗標準時間的鐘差,然后調整本地時鐘使時差控制在一定的精度范圍內。 衛星導航系統通常由三部分組成:導航授時衛星、地面檢測校正維護系統和用戶 ......

    uj5u.com 2020-09-10 03:52:25 more
  • 利用北斗衛星系統設計NTP網路時間服務器

    利用北斗衛星系統設計NTP網路時間服務器 利用北斗衛星系統設計NTP網路時間服務器 安徽京準電子科技官微——ahjzsz 概述 NTP網路時間服務器是一款支持NTP和SNTP網路時間同步協議,高精度、大容量、高品質的高科技時鐘產品。 NTP網路時間服務器設備采用冗余架構設計,高精度時鐘直接來源于北斗 ......

    uj5u.com 2020-09-10 03:52:35 more
  • 詳細解讀電力系統各種對時方式

    詳細解讀電力系統各種對時方式 詳細解讀電力系統各種對時方式 安徽京準電子科技官微——ahjzsz,更多資料請添加VX 衛星同步時鐘是我京準公司開發研制的應用衛星授時時技術的標準時間顯示和發送的裝置,該裝置以M國全球定位系統(GLOBAL POSITIONING SYSTEM,縮寫為GPS)或者我國北 ......

    uj5u.com 2020-09-10 03:52:45 more
  • 如何保證外包團隊接入企業內網安全

    不管企業規模的大小,只要企業想省錢,那么企業的某些服務就一定會采用外包的形式,然而看似美好又經濟的策略,其實也有不好的一面。下面我通過安全的角度來聊聊使用外包團的安全隱患問題。 先看看什么服務會使用外包的,最常見的就是話務/客服這種需要大量重復性、無技術性的服務,或者是一些銷售外包、特殊的職能外包等 ......

    uj5u.com 2020-09-10 03:52:57 more
  • PHP漏洞之【整型數字型SQL注入】

    0x01 什么是SQL注入 SQL是一種注入攻擊,通過前端帶入后端資料庫進行惡意的SQL陳述句查詢。 0x02 SQL整型注入原理 SQL注入一般發生在動態網站URL地址里,當然也會發生在其它地發,如登錄框等等也會存在注入,只要是和資料庫打交道的地方都有可能存在。 如這里http://192.168. ......

    uj5u.com 2020-09-10 03:55:40 more
  • [GXYCTF2019]禁止套娃

    git泄露獲取原始碼 使用GET傳參,引數為exp 經過三層過濾執行 第一層過濾偽協議,第二層過濾帶引數的函式,第三層過濾一些函式 preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'] (?R)參考當前正則運算式,相當于匹配函式里的引數 因此傳遞 ......

    uj5u.com 2020-09-10 03:56:07 more
  • 等保2.0實施流程

    流程 結論 ......

    uj5u.com 2020-09-10 03:56:16 more
最新发布
  • 使用Django Rest framework搭建Blog

    在前面的Blog例子中我們使用的是GraphQL, 雖然GraphQL的使用處于上升趨勢,但是Rest API還是使用的更廣泛一些. 所以還是決定回到傳統的rest api framework上來, Django rest framework的官網上給了一個很好用的QuickStart, 我參考Qu ......

    uj5u.com 2023-04-20 08:17:54 more
  • 記錄-new Date() 我忍你很久了!

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 大家平時在開發的時候有沒被new Date()折磨過?就是它的諸多怪異的設定讓你每每用的時候,都可能不小心踩坑。造成程式意外出錯,卻一下子找不到問題出處,那叫一個煩透了…… 下面,我就列舉它的“四宗罪”及應用思考 可惡的四宗罪 1. Sa ......

    uj5u.com 2023-04-20 08:17:47 more
  • 使用Vue.js實作文字跑馬燈效果

    實作文字跑馬燈效果,首先用到 substring()截取 和 setInterval計時器 clearInterval()清除計時器 效果如下: 實作代碼如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta ......

    uj5u.com 2023-04-20 08:12:31 more
  • JavaScript 運算子

    JavaScript 運算子/運算子 在 JavaScript 中,有一些運算子可以使代碼更簡潔、易讀和高效。以下是一些常見的運算子: 1、可選鏈運算子(optional chaining operator) ?.是可選鏈運算子(optional chaining operator)。?. 可選鏈操 ......

    uj5u.com 2023-04-20 08:02:25 more
  • CSS—相對單位rem

    一、概述 rem是一個相對長度單位,它的單位長度取決于根標簽html的字體尺寸。rem即root em的意思,中文翻譯為根em。瀏覽器的文本尺寸一般默認為16px,即默認情況下: 1rem = 16px rem布局原理:根據CSS媒體查詢功能,更改根標簽的字體尺寸,實作rem單位隨螢屏尺寸的變化,如 ......

    uj5u.com 2023-04-20 08:02:21 more
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 08:01:50 more
  • 如何在 vue3 中使用 jsx/tsx?

    我們都知道,通常情況下我們使用 vue 大多都是用的 SFC(Signle File Component)單檔案組件模式,即一個組件就是一個檔案,但其實 Vue 也是支持使用 JSX 來撰寫組件的。這里不討論 SFC 和 JSX 的好壞,這個仁者見仁智者見智。本篇文章旨在帶領大家快速了解和使用 Vu ......

    uj5u.com 2023-04-20 08:01:37 more
  • 【Vue2.x原始碼系列06】計算屬性computed原理

    本章目標:計算屬性是如何實作的?計算屬性快取原理以及洋蔥模型的應用?在初始化Vue實體時,我們會給每個計算屬性都創建一個對應watcher,我們稱之為計算屬性watcher ......

    uj5u.com 2023-04-20 08:01:31 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:01:10 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:00:32 more