Comp 1800-简单的全堆栈Web应用程序ð±±±
#javascript #网络开发人员 #初学者 #教程

起动器ð

这篇博客文章探讨了我在Comp 1800的项目体验中。如果您不熟悉我的身份,可以参考我的post介绍。
有关Comp 1800的简要概述,请查看我最近的post
我听说在面试中对自己的项目有深刻的了解可能是有益的。考虑到这一点,我正在推出一个名为“ Projects”的新系列,我将讨论并深入研究我从事的项目的技术组成部分。

comp1800ð±

在Comp 1800中,该项目的主题是解决与极端天气有关的问题。该项目着重于几个考虑因素,包括预防,预测,准备,应对和恢复。我的团队由三名成员组成,选择通过促进环保生活方式来专注于预防。

敏捷方法ð -

Agile process

Comp 1800采用了敏捷软件开发生命周期(SDLC)方法,并将几周分为冲刺。如上图所示,步骤是:(1)计划,(2)设计,(3)开发,(4)测试,(5)部署和(6)审核。

  1. 计划
    在计划阶段,我们为每个冲刺制作了新的用户故事,重点是基于红色路线分析的实现功能。我们为此目的使用了Trello和Figjam等工具。

  2. 设计
    在设计阶段,我们为决定实现的功能创建了线框,与该特定冲刺的用户故事相对应。

  3. 发展
    在开发阶段,我们开始为用户故事进行实际编码。我们的技术堆栈包括HTML5/CSS3,JavaScript,Bootstrap,Node.js,Express.js,Firebase和Google Cloud Cloud API。我将稍后再深入研究。

  4. 测试
    鉴于这个项目是我们的第一个项目,我们的测试是有限的。我们没有实施单元或集成测试。但是,我们确实与同行进行了可用性测试。

  5. 部署
    与典型的敏捷过程不同,我们直到最后才完全部署应用程序。我们使用Glitch.me进行部署。

  6. 评论
    我们的审查在课程中采用了演讲的形式,在此期间,我们收到了反馈并从同龄人那里解决了问题。

代码评论ð

节点和Express

初始化ð

在我们的应用中,我们将Express用作Node.js Web Framework Middleware。

// Initialization
const express = require("express");
const app = express();
// Middleware
app.use(express.json());

CORS标题ð»

我们还设置了交叉原始资源共享(CORS)标题以允许任何来源的请求。

app.use((req, res, next) => {
  res.setHeader('Access-Control-Allow-Origin', '*');
  res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE');
  res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');
  next();
});

静态文件服务和路线ð

使用Express,我们使用静态文件服务。例如,可以通过/js路由访问./public/js目录中的任何文件。

app.use(express.static('app'));
app.use("/js", express.static("./public/js"));
app.use("/css", express.static("./public/css"));
app.use("/img", express.static("./public/img"));

我们还手动为所有页面设置了路线,这有些乏味。一个例子是:

app.get('/', (req, res) => {
  res.sendFile(__dirname + '/app/html/index.html');
});

服务器初始化ð

最后,我们在端口8000上初始化并运行了Express Server。

app.listen(8000, () => {
  console.log('Server started on port 8000');
});

firebase

初始化ð

初始化壁垒相对简单。我们要做的就是去firebase.google.com开始一个项目。设置项目后,我们要做的就是将firebase安装为节点软件包($ npm install firebase)并复制firebase配置。

//----------------------------------------
//  Your web app's Firebase configuration
//----------------------------------------
var firebaseConfig = { //Input firebase API keys
  apiKey: "",
  authDomain: "",
  projectId: "",
  storageBucket: "",
  messagingSenderId: "",
  appId: "",
};

//--------------------------------------------
// initialize the Firebase app
// initialize Firestore database if using it
//--------------------------------------------
const app = firebase.initializeApp(firebaseConfig);
const db = firebase.firestore();
const storage = firebase.storage();

身份验证ð

我们还使用Firebase进行身份验证。我们使用Firebase UI小部件进行身份验证和用户日志。您可以检查here中的身份验证和符号。


JavaScript细节
我们编写的JavaScript代码与文档对象模型(DOM)交易,我将在我专门编写的代码中进行解释。

排行榜ð

首先,建立了一个变量,以检索具有ID“排行榜框架”的DOM元素的引用,该元素涉及排行榜表的tbody元素。

var leaderboardTable = document.getElementById("leaderboard-body");

基于排行榜逻辑,我使用了document.Createelement和附录方法来相应地显示用户。

var user = doc.data();
var points = user.points;

// Increment rank if points are lower than previous user's points
if (points !== previousPoints) {
    rank++;
}

var row = document.createElement("tr");
var rankCell = document.createElement("td");
rankCell.textContent = rank;
row.appendChild(rankCell);

var nameCell = document.createElement("td");
nameCell.appendChild(
    document.createTextNode(user.displayName || user.name)
        );
row.appendChild(nameCell);

var pointsCell = document.createElement("td");
pointsCell.textContent = points;
row.appendChild(pointsCell);

任务ð

对于任务,我使用Firestore数据库的随机种子值随机显示任务。

 const ecoActions = await getEcoActions();
 const randomTasks = [];

 for (let i = 0; i < 3; i++) {
    const randomIndex = Math.floor(Math.random(seed) * ecoActions.length);
    const randomTask = ecoActions[randomIndex];
    randomTasks.push(randomTask);
    ecoActions.splice(randomIndex, 1);
 }

 const taskList = document.getElementById("task-list");
 taskList.innerHTML = "";

基于任务,我实现了函数以选择图像文件上传以调用Google Vision API,以使用标签检测分析图像。

const imageUrl = await fileRef.getDownloadURL();

// Call the Google Vision API to analyze the image
const apiKey = API_KEY;
const url = `https://vision.googleapis.com/v1/images:annotate?key=${apiKey}`;
const data = {
      requests: [
         {
           image: {
           source: {
              imageUri: imageUrl,
           },
         },
           features: [
         {
             type: "LABEL_DETECTION",
           },
          ],
         },
      ],
};

const response = await fetch(url, {
      method: "POST",
      headers: {
         "Content-Type": "application/json",
      },
          body: JSON.stringify(data),
});

const json = await response.json();

如果响应返回为有效,则将任务标记为已完成,添加关联点,并删除完成的任务。


结论â€

这是一个很长的帖子,我感谢您抽出宝贵的时间阅读它。我不确定这是否是进行我的代码审查的正确方法,因此任何建议都非常感谢!

如果您有兴趣深入研究代码,则可以查看存储库。

Github Repository

再次感谢您!请继续关注以后的帖子。 ðρ