整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          使用Node.js和JSON搭建簡單的動態服務器

          、創建html頁面

          創建4個頁面,index.html、register.html、sign_in.html、home.html

          • index.html 默認主頁
          • register.html 用于注冊賬號
          • sign_in.html 用于登錄賬號
          • home.html 用于顯示登錄后的頁面

          主要代碼片段

          register.html

          <form id="registerForm">
              <div>
                  <label for="">用戶名:<input type="text" name="name" id=""></label>
              </div>
              <div>
                  <label for="">密碼:<input type="password" name="password" id=""></label>
              </div>
              <div>
                  <button type="submit">注冊</button>
              </div>
          </form>
          <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
          <script>
          let $form = $('#registerForm')
          $form.on('submit', (e) => {
              e.preventDefault()
              const name = $form.find("input[name=name]").val()
              const password = $form.find('input[name=password').val()
              console.log(name, password)
              // pass AJAX post data
              $.ajax({
                  method: 'post',
                  url: '/register',
                  contentType: 'text/json; charset=UTF-8',
                  data: JSON.stringify({
                      name, // name: name 
                      password // password: password
                  })
              }).then(() => {
                  alert('注冊成功')
                  location.href = '/sign_in.html'
              }, () => {})
          })
          </script>

          sign_in.html

          <form id="signInForm">
              <div>
                  <label for="">用戶名:<input type="text" name="name" id=""></label>
              </div>
              <div>
                  <label for="">密碼:<input type="password" name="password" id=""></label>
              </div>
              <div>
                  <button type="submit">登錄</button>
              </div>
          </form>
          <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
          <script>
              let $form = $('#signInForm')
              $form.on('submit', (e) => {
                  e.preventDefault()
                  // get name password
                  const name = $form.find("input[name=name]").val()
                  const password = $form.find('input[name=password').val()
                  // pass AJAX post data
                  $.ajax({
                      method: 'POST',
                      url: '/sign_in',
                      contentType: 'text/json; charset=UTF-8',
                      data: JSON.stringify({
                          name,
                          password
                      })
                  }).then(() => {
                      alert('登錄成功')
                      location.href = '/home.html'
                  }, () => {})
              })
          </script>

          home.html

          <p>
              {{loginStatus}}
          </p>
          <p>
              你好,{{user.name}}
          </p>
          <p>
              <a href="sign_in.html">登錄</a>
          </p>

          二、Node服務器

          var http = require('http')
          var fs = require('fs')
          var url = require('url')
          var port = process.argv[2]
          
          if (!port) {
              console.log('請輸入指定端口。如:\nnode server.js 8888')
              process.exit(1)
          }
          
          var server = http.createServer(function (request, response) {
              var parsedUrl = url.parse(request.url, true)
              var pathWithQuery = request.url
              var queryString = ''
              if (pathWithQuery.indexOf('?') >= 0) {
                  queryString = pathWithQuery.substring(pathWithQuery.indexOf('?'))
              }
              var path = parsedUrl.pathname
              var query = parsedUrl.query
              var method = request.method
          
              /******** main start ************/
              // 讀取 session 文件,轉化為對象
              const session = JSON.parse(fs.readFileSync('./session.json').toString())
          
              if (path === '/sign_in' && method === 'POST') {
                  // 讀數據庫
                  let userArray = JSON.parse(fs.readFileSync('./database/users.json'))
                  const array = []
                  // 每次接受數據就添加進數組
                  request.on('data', (chunk) => {
                      array.push(chunk)
                  })
                  request.on('end', () => {
                      // 轉化字符串
                      const string = Buffer.concat(array).toString()
                      // 在轉化為對象
                      const obj = JSON.parse(string)
                      // 找到符合的 user
                      const user = userArray.find(user => user.name === obj.name && user.password === obj.password) // 成功返回符合的對象,失敗返回undefined
                      if (user === undefined) { // 失敗
                          response.statusCode = 400
                          response.setHeader('content-Type', 'text/JSON; charset=UTF-8')
                          response.end(`{"errorCode":4001}`)
                      } else { // 成功
                          response.statusCode = 200
                          // 設置 Cookie
                          const random = Math.random()
                          session[random] = {
                              user_id: user.id
                          }
                          // 寫入數據
                          fs.writeFileSync('./session.json', JSON.stringify(session))
                          response.setHeader("Set-Cookie", `'session_id=${random}; HttpOnly'`)
                          response.end()
                      }
                  })
              } else if (path === '/home.html') {
                  // 獲取 Cookie
                  const cookie = request.headers['cookie']
                  let sessionId
                  try { // 讀取 Cookie 中的 id 值
                      sessionId = cookie.split(';').filter(s => s.indexOf('session_id=') >= 0)[0].split('=')[1]
                  } catch (error) {}
                  if (sessionId && session[sessionId]) {
                      // 從 session 中讀取對應的值
                      const userId = session[sessionId].user_id
                      // 讀數據庫
                      let userArray = JSON.parse(fs.readFileSync('./database/users.json'))
                      // 找到符合的 user
                      let user = userArray.find(user => user.id === userId)
                      const homeHtml = fs.readFileSync('./public/home.html').toString()
                      let string
                      if (user) {
                          string = homeHtml.replace('{{loginStatus}}', '已登錄').replace('{{user.name}}', user.name)
                          response.write(string)
                      }
                  } else {
                      // 讀取源文件內容
                      const homeHtml = fs.readFileSync('./public/home.html').toString()
                      // 替換文字
                      const string = homeHtml.replace('{{loginStatus}}', '未登錄').replace('{{user.name}}', '')
                      response.write(string)
                  }
                  response.end()
              } else if (path === '/register' && method === 'POST') {
                  response.setHeader('Content-Type', 'text/html; charset=UTF-8')
                  // read database
                  let userArray = JSON.parse(fs.readFileSync('./database/users.json')) // read database
                  const array = []
                  request.on('data', (chunk) => {
                      array.push(chunk)
                  })
                  request.on('end', () => {
                      // convert string
                      const string = Buffer.concat(array).toString()
                      // convert obj
                      const obj = JSON.parse(string)
                      // last user id
                      const lastUser = userArray[userArray.length - 1]
                      // new user
                      const newUser = {
                          id: lastUser ? lastUser.id + 1 : 1,
                          name: obj.name,
                          password: obj.password
                      }
                      userArray.push(newUser)
                      // write data
                      fs.writeFileSync('./database/users.json', JSON.stringify(userArray))
                  })
                  response.end()
              } else {
                  response.statusCode = 200
                  let content
                  // setting index
                  const filePath = path === '/' ? '/index.html' : path
                  // judge type
                  const index = filePath.lastIndexOf('.')
                  const suffix = filePath.substring(index)
                  const fileType = {
                      '.html': 'text/html',
                      '.css': 'text/css',
                      '.js': 'text/javascript'
                  }
                  response.setHeader('Content-Type', `${fileType[suffix] || "text/html"};charset=utf-8`)
                  try {
                      content = fs.readFileSync(`./public${filePath}`)
                  } catch (error) {
                      content = '文件路徑不存在'
                      response.statusCode = 404
                  }
                  response.write(content)
                  response.end()
              }
          
              /******** main end ************/
          })
          
          server.listen(port)
          console.log('監聽 ' + port + ' 成功!請輸入下列地址訪問\nhttp://localhost:' + port)

          三、主要思路

          register.html

          使用jQuery的ajax將數據發送請求 /register 給后端,成功則跳轉到 sign_in.html

          數據需要使用 JSON.stringify 轉化為字符串在提交

          /register

          讀取 users.json 的數據,創建一個空數組,將傳遞過來的參數 push 進去。將數組轉換為字符串,再轉換為對象。 獲取數據庫中最小的 id 值,將數據組成新的對象,添加進入 數據庫 中。

          sign_in.html

          使用ajax將數據發送請求 /sign_in 給后端,成功則跳轉 home.html

          /sign_in

          讀取 users.json 的數據,創建一個空數組,將傳遞過來的參數 push 進去。將數組轉換為字符串,再轉換為對象。 在讀取后的數據庫中,查找有沒有符合條件的 user,成功返回讀取后的對象,失敗返回 undefined。 如果成功,設置隨機數,將 隨機數的值 與 user的id 綁定。并添加到 session.json 中。然后 setHeader,將cookie發送到瀏覽器。

          /home

          獲取登入成功后 cookie 的值。讀取 session 中對應的隨機數。如果隨機數和session對應的隨機數值存在,就顯示已登錄,否則顯示未登錄

          作者:努力了嗎梁同學
          鏈接:https://juejin.im/post/5ee58c926fb9a047ae454143
          來源:掘金
          著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

          文來源:掘金

          本文作者:古柳_Deserts_X

          github:https://github.com/lidaguang1989/javascript-knowhow

          不知不覺做前端已經五年多了,無論是從最初的jQuery還是現在火熱的Angular,Vue,React等前端框架,甚至是nodejs等服務端的興起,歸根到底,我始終覺著一切的核心還是JavaScript。于是最近就有了一個想法,想要梳理一下這些年學習以及使用JS的心得。

          本系列文章主要是針對JS的相關知識點做一個類似提綱似的提煉,一來可以作為今后溫故知新的參照;二來也是希望能夠幫助大家更加系統清晰的理解JS這門語言。

          本系列文章主要參照了Nicholas C. Zakas 的兩本著作:《JavaScript高級程序設計(第3版)》及《編寫可維護的JavaScript》"

          者:歲歲 來源:博學谷

          好用的JS前端開發框架有哪些?對于一個程序員來說,選擇一款好用的開發工具可以大大提高工作效率,底層前端框架領域中早先jquery稱霸,近年MVVM類型的框架成為主流,Vue、React和Angular三大框架較為常見。今天小編就介紹一些JS前端開發框架供大家選擇。

          一、 Foundation框架

          Foundation框架比Bootstrap略顯高大上一點,但他們倆的設計理念都非常清楚,Bootstrap有引導,嘗試處理你項目中的一切所需。Foundation有基礎、地基及支柱,給項目中強有力的創造與支持。相對于Bootstrap豐富的組件及插件,Foundation僅提供了有限的幾種元素,其目標是即使你使用預定義的UI元素,也不應該與大家的網站長得太像。

          二、 Bootstrap

          Bootstrap在業界非常受歡迎,以至于有很多前端框架都在其基礎上開發,如WeX5就是在Bootstrap源碼基礎上優化而來。Bootstrap是基于HTML、CSS和Javascript的,簡潔靈活使得Web開發更加敏捷。提供優雅的HTML和CSS規范,在jQuery的基礎上進行更加個性化和人性化的完善。兼容大部分jQuery插件,并包含了豐富的Web組件,如下拉菜單、按鈕式下拉菜單、導航條、按鈕組、分頁、縮略圖、進度條和媒體對象等。自帶了13個jQuery插件,其中有模式對話框、標簽頁、滾動條和彈出框等。

          三、Curl

          Curl是一個命令行工具,用于通過HTTP(s)、FTP和數十種其它協議進行請求。使用Curl可以進行文件下載、檢查相應標題和自由訪問遠程數據。在Web開發中Curl經常和RESTfulAPI一起使用用于測試連接。

          四、Tree

          Tree是一個小型的命令行實用程序,將目錄中的文件以可視化的方式進行顯示。它采用遞歸運行的方式,遍歷每個級別的嵌套并繪制所有內容的格式樹。這樣就能快速地瀏覽并查找需要的文件。

          五、Tmux

          根據維基的解釋,Tmux是一個終端復用器。通俗地說,它是一個能將多個終端連接到單個終端會話的工具。Tmux允許用戶在終端中的程序之間切換,添加屏幕窗格,并將多個終端連接到同一個會話,使其保持同步。在遠程服務器上工作時,Tmux特別有用,允許用戶創建新的選項卡而無需再次登錄。

          六、du

          du命令用于生成關于文件和目錄的空間使用情況的報告。du很容易使用,可以遞歸地運行,遍歷每個子目錄并返回每個文件的大小。du常見用例:當某個驅動器的空間不足,用戶不清楚每個存儲器的大小。使用此命令可以快速查看每個文件夾所占用的存儲空間,從而找到占用最大空間的存儲器。

          七、 AUI

          AUI專為APIClound設計的一套框架,解決了許多移動端開發實際中遇到的許多問題是一個純CSS框架。使用容器+布局+模塊的構建方式,JS輔助,更自由更靈活更易于擴展使用。遵循GoogleMaterial設計規范,完美適配各個機型。面向HTML5,使用CSS3實現動畫交互,輕量級高性能。

          八、AmazeUI

          據稱是中國首個開源HTML5跨屏前端框架。妹子UI以移動優先為理念,從小屏逐漸到大屏,實現響應式網頁。AmazeUI包含20+個CSS組件、20+個JS組件,更有多個包含不同主題的Web組件。相比國外框架,UI關注中文排版提供本地化支持。面向HTML5開發,使用CSS3來實現動畫交互,輕量級高性能。

          九、FrozenUI

          FrozenUI是一款開源簡單易用,輕量敏捷的移動端框架?;谑諵樣式規范,目前全面應用于企業手Q增值業務中?;A樣式效果簡單色調清爽,社區活躍,組件自然不少。包括按鈕、列表、表單、通知、提示條、彈出框、選項卡等等常用組件。還包括一個FrozenJs的JS組件庫??梢栽谥髁鞯腁ndroid和IOS上應用。基本樣式使用離線包的方式減少請求提供快速接入方案。

          程序員在不同業務場景下的角色互換,需要掌握多種開發工具,因此多了解一些JS前端開發框架對于工作非常有幫助。


          主站蜘蛛池模板: 成人无码AV一区二区| 日韩精品无码一区二区三区AV| 久久精品一区二区三区AV| 精品视频在线观看你懂的一区 | 麻豆国产在线不卡一区二区| 国产免费一区二区视频| 一区二区三区高清在线| 精品乱子伦一区二区三区高清免费播放| 亚洲AV无码片一区二区三区| 精品国产一区二区三区久久| 精品亚洲一区二区| 日韩在线不卡免费视频一区| 色妞色视频一区二区三区四区| 久久精品国产一区| 香蕉在线精品一区二区| 国产精品美女一区二区视频| 狠狠色婷婷久久一区二区| 国产精品分类视频分类一区| 无码精品人妻一区| 国产一区二区三区在线观看免费| 精品国产日韩亚洲一区在线| 内射女校花一区二区三区| 国产高清在线精品一区| 亚洲AV日韩AV一区二区三曲| 国产日韩精品一区二区在线观看| 国产一区二区三区在线免费观看| 久久国产三级无码一区二区| 少妇激情一区二区三区视频 | 波多野结衣一区二区三区高清在线| 八戒久久精品一区二区三区| 国产一区二区三区在线2021| 九九无码人妻一区二区三区| 中文字幕在线观看一区二区三区| 精品国产福利一区二区| 亚洲国产视频一区| 人成精品视频三区二区一区| 亚洲一区二区三区91| 日韩少妇无码一区二区三区| 国产乱人伦精品一区二区| 亚洲一区二区三区国产精品| 国产福利91精品一区二区三区|