腾讯云 Cloud Studio 实战训练营——快速构建React完成点餐H5页面

news2024/11/19 23:30:35

目录

​编辑

一、前言

1、什么是腾讯云 Cloud Studio

2、本文实验介绍

二、前期准备工作

1、注册 Cloud Studio

 2、初始化工作空间

三、开发一个简版的点餐系统页面

1、安装依赖

1.1、安装 antd-mobile

1.2、安装 less 和 less-loader

1.3、暴露 webpack 配置文件

1.4、安装 normalize

 1.5、上传项目需要的素材

1.6、替换App.js主文件

2、、发布到仓库

四、开发空间管理

五、总结


一、前言

1、什么是腾讯云 Cloud Studio

Cloud Studio 是基于“浏览器”的集成式开发环境(IDE),为开发者提供稳定的云端工作站,在使用 Cloud Studio 时无需安装,打开浏览器即可快速启动和开发项目,底层资源可以自动弹性扩缩,极大地节省成本,低代码开发省时又省力。

  • 基于 Web 端的代码编辑器,包含代码高亮、自动补全、Git 集成、终端等 IDE 的基础功能,同时支持实时调试、插件扩展等,提升开发、编译与部署工作效率 ;

  • 支持远程访问云服务器,为腾讯云 SCF 行业用户提供开发-测试-部署完整闭环的云原生开发体验 ;

2、本文实验介绍

我们经常会遇到远程办公的场景,下面用云 IDE Cloud Studio 快速搭建,并开发还原一个移动端 React H5 的简版点餐系统页面,从 0 到 1 体验云 IDE 给我们带来的优势,不需要装各种环境,简单易用,开箱即可上手。

点餐界面

二、前期准备工作

1、注册 Cloud Studio

准备好素材图(如首页的banner、食物图片等),然后点击链接跳转到官网,并点击“注册/登录”。

 其中 Cloud Studio 非常方便,提供了三种注册方式:

1、使用 CODING 账号授权注册/登录

2、使用微信授权注册/登录

3、使用 GitHub 授权注册/登录

 我选的是 CODING ,需要输入对应的团队域名前缀

输入域名之后,会出现以下界面 ,选择你的 CODING 账号方式,进行扫码登录。 

 2、初始化工作空间

进入之后,会出现以下界面,Cloud Studio 提供了许多模版,例如框架模版、云原生模版、建站模版等,同时 Cloud Studio 也对所有新老用户每月赠送 3000 分钟的工作空间免费时长。

找到 React 框架模板点击进去,即可开始初始化一个 React 的工作空间,等待云 IDE 初始化完毕。

在初始化的过程中,可以看到左侧代码后,控制台会安装依赖及启动一个 React 简单的模板项目。

初始化完毕之后,在我们的右侧,可以看到一个实时预览的预览界面,然后在下面的控制台输入以下指令。

// 进入当前目录
cd ./ && 
// 设置port的环境变量
set port=3000 &&
// 导出port的环境变量
export PORT=3000 &&
// 相当于 yarn install,安装相关依赖
yarn &&
// 启动开发环境
yarn start --port=3000

到此,我们发现如果用一台新主机,只要有浏览器,就不需要准备任何环境,不需要安装任何软件,只需要能够联网,就能在几分种内初始化一个 React 项目,这个效率是非常高的。

三、开发一个简版的点餐系统页面

标题是为了开发一个 React H5 的页面,为了快速开发,通常会使用到UI组件库,这里我们使用的是 antd-mobile UI库(antd-mobile 是 Ant Design 的移动规范的 React 实现)。

1、安装依赖

1.1、安装 antd-mobile

yarn add antd-mobile@^5.32.0

# 或者

npm install --save antd-mobile@^5.32.0

1.2、安装 less 和 less-loader

yarn add -D less@^3.12.2 less-loader@^7.0.1

注意:这里不要安装为高版本,项目会启动失败

1.3、暴露 webpack 配置文件

注意:在webpack.config.js中进行配置,这样进行配置需要暴露出React的config配置文件,警告该操作不可逆

npm run eject

输入 'y' 后,项目会自动进行解构操作。

完成命令之后,项目根目录会出现一个config文件夹,找到 config/webpack.config.js 文件,按Ctrl + F 查找关键字  “style files” 

 将上图的70行到73行代码改成less

// style files regexes
const cssRegex = /\.css$/;
const cssModuleRegex = /\.module\.css$/;
const sassRegex = /\.(scss|sass)$/;
const sassModuleRegex = /\.module\.(scss|sass)$/;
// 新增加 Less 代码
const lessRegex = /\.(less)$/;
const lessModuleRegex = /\.module\.(less)$/;

在查找框中输入 “sassRegex”  能够找到以下代码。

 和之前配置一样,仿照sass的配置,进行less的配置。

// less
{
  test: lessRegex,  // 有改动
  exclude: lessModuleRegex,  // 有改动
  use: getStyleLoaders(
    {
      importLoaders: 3,
      sourceMap: isEnvProduction
        ? shouldUseSourceMap
        : isEnvDevelopment,
    },
    'less-loader'  // 有改动
  ),
  sideEffects: true,
},
{
  test: lessModuleRegex,  // 有改动
  use: getStyleLoaders(
    {
      importLoaders: 3,
      sourceMap: isEnvProduction
        ? shouldUseSourceMap
        : isEnvDevelopment,
      modules: {
        getLocalIdent: getCSSModuleLocalIdent,
      },
    },
    'less-loader'  // 有改动
  ),
},

 这样就完成了webpack.config.js配置less,可以在项目中使用less样式了。

1.4、安装 normalize

yarn add -D normalize.css@^8.0.1

 1.5、上传项目需要的素材

以前上传服务器代码,需要使用 Scp 命令或者装 Remote SSH 插件支持,Cloud Studio 可以很方便默认支持文件上传与下载等常规的操作,与本地 IDE 体验一致

 1、可以直接拖动文件到 IDE 编辑区域

2、右击 IDE 编辑区域"上传"

直接将 img 文件夹拖动到src目录下即可。

1.6、替换App.js主文件

打开src/App.js 文件,以下是点餐系统的主要业务代码,直接CV替换即可。

import './App.css';
import React, { useState } from 'react'
import { NavBar, Toast, Swiper, SideBar, TabBar, Badge } from 'antd-mobile'
import {
  AppOutline,
  ExclamationShieldOutline,
  UnorderedListOutline,
  UserOutline,
} from 'antd-mobile-icons'
import BannerImg from './img/banner.png'
import HotImg from './img/hot.png'
import Food1Img from './img/food1.png'
import Food2Img from './img/food2.png'
import CartImg from './img/cart.png'
import './index.less'
import "normalize.css"

function App() {
  const [activeKey, setActiveKey] = useState('1')

  const tabbars = [
    {
      key: 'home',
      title: '点餐',
      icon: <AppOutline />,
    },
    {
      key: 'todo',
      title: '购物车',
      icon: <UnorderedListOutline />,
      badge: '5',
    },
    {
      key: 'sale',
      title: '餐牌预告',
      icon: <ExclamationShieldOutline />,
    },
    {
      key: '我的',
      title: '我的',
      icon: <UserOutline />,
      badge: Badge.dot,
    },
  ]

  const back = () =>
    Toast.show({
      content: '欢迎进入点餐系统',
      duration: 1000,
    })


  const items = ['', '', '', ''].map((color, index) => (
    <Swiper.Item key={index}>
      <img style={{
        width: '100%'
      }} src={ BannerImg }></img>
    </Swiper.Item>
  ))

  const tabs =  [
    { key: '1', title: '热销' },
    { key: '2', title: '套餐' },
    { key: '3', title: '米饭' },
    { key: '4', title: '烧菜' },
    { key: '5', title: '汤' },
    { key: '6', title: '主食' },
    { key: '7', title: '饮料' },
  ]

  const productName = [
    '小炒黄牛肉',
    '芹菜肉丝炒香干',
    '番茄炒鸡蛋',
    '鸡汤',
    '酸菜鱼',
    '水煮肉片',
    '土豆炒肉片',
    '孜然肉片',
    '宫保鸡丁',
    '麻辣豆腐',
    '香椿炒鸡蛋',
    '豆角炒肉'
  ]
  const productList = productName.map((item, key) => {
    return {
      name: item,
      img: key % 2 === 1 ? Food1Img : Food2Img
    }
  })

  return (
    <div className="App">
      <NavBar onBack={back} style={{
        background: '#F0F0F0',
        fontWeight: 'bold'
      }}>点餐</NavBar>

      <div className='head-card'>
        <Swiper
          style={{
            '--border-radius': '8px',
          }}
          autoplay
          defaultIndex={1}
        >
          {items}
        </Swiper>
      </div>

      <div className='product-box'>
        <SideBar activeKey={activeKey} onChange={setActiveKey}>
          {tabs.map(item => (
            <SideBar.Item key={item.key} title={
              item.key === '1' ? <div>
              <div className='flex-center'>
                <img style={{
                  display: 'block',
                  width: '16px',
                  marginRight: '5px'
                }} src={ HotImg }></img>
                <div>{ item.title }</div>
              </div>
            </div> : item.title
            } />
          ))}
        </SideBar>
        <div className='product-right'>
          <div className='product-title'>热销</div>
          <div className='product-list'>
            {
              productList.map((item, key) => {
                return (
                  <div className='product-item'>
                    <div className='product-item-left'>
                      <img style={{
                        display: 'block',
                        width: '76px',
                        marginRight: '5px'
                      }} src={ item.img }></img>
                      <div className='product-item-left-info'>
                        <div>
                          <div className='product-item-left-info-name'>{ item.name }</div>
                          <div className='product-item-left-info-number'>月售{key + 1}0 赞{key * 5}</div>
                        </div>
                        <div className='product-item-left-info-price'>¥10</div>
                      </div>
                    </div>
                    <div className="cart">
                      <img style={{
                        display: 'block',
                        width: '30px',
                        marginRight: '5px'
                      }} src={ CartImg } onClick = { () =>
                        Toast.show({
                          content: '添加购物车成功'
                        }) }></img>
                    </div>
                  </div>
                )
              })
            }
          </div>
        </div>
      </div>

      <TabBar>
        {tabbars.map(item => (
          <TabBar.Item
            key={item.key}
            icon={item.icon}
            title={item.title}
            badge={item.badge}
          />
        ))}
      </TabBar>
    </div>
  );
}

export default App;

在 src 目录下,创建一个 index.less 文件,将以下 less 相关的代码复制到该文件中即可。

.head-card {
  padding: 10px 20px;
  box-sizing: border-box;
}

.flex-center {
  display: flex;
  align-items: center;
}

.product-box {
  display: flex;
  align-items: center;
  width: 100%;
  height: calc(100vh - 45px - 130px - 50px);
}

.product-right {
  flex: 1;
  height: 100%;
}

.product-title {
  font-family: PingFangSC-Regular;
  font-size: 14px;
  color: #000000;
  text-align: left;
  padding-bottom: 10px;
}

.product-list {
  height: calc(100% - 24px);
  overflow-y: auto;
}

.product-item {
  position: relative;
  width: 100%;
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding-left: 10px;
  box-sizing: border-box;
  margin-bottom: 10px;
  &-left {
    display: flex;
    &-info {
      padding-left: 3px;
      box-sizing: border-box;
      display: flex;
      flex-direction: column;
      justify-content: space-between;
      &-name {
        font-family: PingFangSC-Regular;
        font-size: 14px;
        color: #000000;
        text-align: left;
      }
      &-number {
        padding-top: 3px;
        font-family: PingFangSC-Regular;
        font-size: 11px;
        color: #787878;
        text-align: left;
      }
      &-price {
        font-family: PingFangSC-Regular;
        font-size: 18px;
        color: #FF1800;
        text-align: left;
      }
    }
  }
}

.cart {
  position: absolute;
  right: 10px;
  bottom: 0;
}

复制完成后,在控制台中输入 yarn start 即可启动该项目。

2、、发布到仓库

发布前,我们需要填写README.md文件。

# 项目说明

这是一个用 IDE [Cloud Studio](https://www.cloudstudio.net/?utm=csdn) 快速搭建,并开发还原一个移动端 React H5 的简版点餐系统页面,从 0 到 1 体验云 IDE 给我们带来的优势,不需要装各种环境,简单易用,开箱即可上手。

## 相关技术栈

React + less + webpack

## 项目运行

yarn install
yarn start

在左边功能菜单区找到“源代码管理”,使用 git init 进行仓库初始化。

输入需要提交的 message 信息,再点击"Commit"进行仓库提交。

四、开发空间管理

在我们的控制台这里可以管理所有使用的工作空间,其中右侧的按钮可以进行升级配置、设置、删除、开始\停止操作。

五、总结

Cloud Studio特点

  • 基于 Web 端的代码编辑器,包含代码高亮、自动补全、Git 集成、终端等 IDE 的基础功能,同时支持实时调试、插件扩展等,提升开发、编译与部署工作效率 。
  • 支持远程访问云服务器,为腾讯云 SCF 行业用户提供开发-测试-部署完整闭环的云原生开发体验 。
  • 自研多款插件以满足开发需求,例如协作插件、自定义模板插件、预览插件、部署插件等,助力施展编程潜能。

本篇文章主要是引导大家如何使用 Cloud Studio 进行云编程,并且动手使用云 IDE Cloud Studio 快速搭建,并开发还原一个移动端 React H5 的简版点餐系统页面。也欢迎大家一起探索 Cloud Studio 更多的功能,为工作中进行赋能!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/790557.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux JDK 安装详解

安装JDK 1.1 下载jdk压缩包 下载地址&#xff1a; Java Downloads | Oracle Java Downloads | Oracle 下载完成之后上传到服务器 # 1.将JDK解压缩到指定目录 tar -zxvf jdk-8u171-linux-x64.tar.gz -C /usr/ 注意:-C参数是将JDK解压之后文件放入usr目录中 # 2.进入jdk解压缩目录…

前端Vue仿支付宝自定义可滑动轮播分页宫格菜单组件,可支持九宫格 十二宫格 十五宫格

背景介绍 随着技术的不断发展&#xff0c;传统的开发方式使得系统的复杂度越来越高。在传统开发过程中&#xff0c;一个小小的改动或者一个小功能的增加可能会导致整体逻辑的修改&#xff0c;造成牵一发而动全身的情况。为了解决这个问题&#xff0c;我们采用了组件化的开发模…

SpringBoot+Prometheus+Grafana实现系统可视化监控

场景 SpringBoot中集成Actuator实现监控系统运行状态&#xff1a; SpringBoot中集成Actuator实现监控系统运行状态_springboot actuator 获取系统运行时长_霸道流氓气质的博客-CSDN博客 基于以上Actuator实现系统监控&#xff0c;还可采用如下方案。 Prometheus Prometheu…

EC200U-CN学习(一)

EC200U系列内置丰富的网络协议&#xff0c;集成多个工业标准接口&#xff0c;并支持多种驱动和软件功能&#xff08;适用于Windows 7/8/8.1/10、Linux和Android等操作系统下的USB驱动&#xff09;&#xff0c;极大地拓展了其在M2M领域的应用范围&#xff0c;如POS、POC、ETC、共…

PMP项目成本管理-控制成本-挣值分析

适用于控制成本过程的数据分析技术包括: 挣值分析 (EVA Earned value analysis) 挣值分析将实际进度和成本绩效与绩效测量基准进行比较。EVM(Earned value Management)把范围基准、成本基准和进度基准整合起来&#xff0c;形成绩效测量基准。它针对每个工作包和控制账户&…

MPAS跨尺度、可变分辨率模式

跨尺度预测模式&#xff08;The Model for Prediction Across Scales - MPAS&#xff09;是由洛斯阿拉莫斯实验室和美国国家大气研究中心(NCAR)共同开发&#xff0c;其由3个部分组成&#xff0c;分别称为 MPAS-A&#xff08;大气模型&#xff09;、MPAS-O&#xff08;海洋模型&…

【LeetCode】19.删除链表的倒数第N个结点

题目 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5]示例 2&#xff1a; 输入&#xff1a;head [1], n 1 输出&#xff1a;[]示例 3&…

Stable Diffusion - 扩展 SegmentAnything 和 GroundingDINO 实例分割算法 插件的配置与使用

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/131918652 Paper and GitHub&#xff1a; Segment Anything: SAM - Segment Anything GitHub: https://github.com/facebookresearch/s…

HCIA 第二课总结

配置网络设备的明文密钥实验组网 实验拓扑 将一个路由器使用配置口进行连接 sys #进入系统视图模式 sysname RTA #给设备命名 user-interface console 0 #进入用户接口配置界面 authentication-mode password #配置认证模式为密钥认证 set authentication password ciphe…

【优选算法题练习】day8

文章目录 一、974. 和可被 K 整除的子数组1.题目简介2.解题思路3.代码4.运行结果 二、525. 连续数组1.题目简介2.解题思路3.代码4.运行结果 三、560. 和为 K 的子数组1.题目简介2.解题思路3.代码4.运行结果 总结 一、974. 和可被 K 整除的子数组 1.题目简介 974. 和可被 K 整…

Vue3+ElementPlus实际项目快速开发模板Pure Admin

发现了一个超好用的模板项目&#xff0c;不仅有很全面的完整版&#xff0c;还有精简的可以直接拿来用的后台管理框架。文档很全面&#xff0c;甚至有B站配套视频! PureAdmin保姆级文档 vue-pure-admin快速开发教程&#xff08;使用Vue3、Vite、Element-Plus、TypeScript、Tail…

基于nodejs+vue微信小程序加油站服务管理系统

开发语言 node.js 框架&#xff1a;Express 前端:Vue.js 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat 开发软件&#xff1a;VScode 基于微信小程序加油站服务 系统分为用户和管理员两个角色 用户微信端的主要功能有&#xff1a; 1.用户注册和登陆小程序 2.用户…

【C#】微软的Roslyn 是个啥?

一、说明 Roslyn 是微软重写的C#编译器并开源。 Roslyn 是 C# 和 Visual Basic.NET 开源编译器的代号。以下是它如何在过去十年企业Microsoft的最黑暗中开始&#xff0c;并成为所有C#&#xff08;和VB&#xff09;的开源&#xff0c;跨平台&#xff0c;公共语言引擎&#xff0c…

LiveGBS流媒体平台GB/T28181功能-设备树自定义分组自定义组织机构选择通道共享给上级国标平台配置权限给指定用户

LiveGBS流媒体平设备树自定义分组自定义组织机构选择通道共享给上级国标平台权限给指定用户 1、背景2、分组2.1、新建分组2.2、选择通道2.3、导入设备2.4、编辑名称2.5、删除分组2.6、移除分组 3、国标级联3.1、分组共享节点3.1.1、共享给上级平台3.1.2、分配权限给用户 3.2、级…

智能制造RFID设备包括哪些?

智能制造是现代制造业的重要发展方向&#xff0c;其核心是数字化、网络化和智能化。而在智能制造中&#xff0c;RFID设备是一种不可或缺的技术手段&#xff0c;主要用于实现物品的识别、追踪和化管理。以下是智能制造中常用的RFID设备及其功能&#xff1a; 1、 RFID读写器 RFID…

环境搭建和HelloWorld

文章目录 环境搭建和HelloWorld计算机基础知识计算机诞生计算机发展历程计算机硬件计算机软件 DOS命令概述打开命令提示符窗口常用DOS命令 Java概述和环境搭建诞生和发展Java平台版本和作用Java语言特点Win64系统搭建Java8开发环境 第一行代码--HelloWorld创建Java文件编写Java…

PGembedding 代码分析

pgembedding 存储结构 pg embedding 数据是存在共享内存中的&#xff0c;pg down 之后索引数据就没了&#xff0c;但索引对象本身还在&#xff0c;第一次访问时会重新创建。 数据以 plain 的形式存储&#xff0c;其中每个点是这样的结构&#xff1a; idx_size&#xff1a; 表…

Stephen Wolfram:概率从何而来?

Where Do the Probabilities Come From? 概率从何而来&#xff1f; OK, so ChatGPT always picks its next word based on probabilities. But where do those probabilities come from? Let’s start with a simpler problem. Let’s consider generating English text one …

Palo Alto Networks 智能网络安全保护任何地方的用户、应用和数据

Palo Alto Networks 不仅能够为数字企业提供当下所需的网络安全服务&#xff0c;还能为日后的工作打好安全基础&#xff0c;让企业无需在二者间权衡和纠结&#xff0c;这样的网络安全合作伙伴仅此一家。我们承诺将双管齐下&#xff0c;在保障数字企业的安全方面绝不妥协退让。下…

linux barrier 栅栏屏障,让多任务在栅栏处集合,全部到齐后同时出发

​专栏内容&#xff1a; postgresql内核源码分析 手写数据库toadb 并发编程 个人主页&#xff1a;我的主页 座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物. 概述 pthread_barrier_t 这是posix定义线程同步方法&#xff0…