手把手教你如何把系统的前端页面改成vue 脚手架项目,实现前后端分离

news2024/12/23 10:15:28

这篇文章从零开始,介绍怎么把现有的一个商城的页面移动到vue脚手架项目上,实现前后端代码的完全分离。

首先,我们需要新建一个vue的脚手架的项目,在此之前,需要安装node.js

打开IntelliJ IDEA或者win+R,输入cmd,打开dos命令窗口,使用cd命令切换到存放vue项目的根目录,比如:把vue项目放到D盘的program文件夹下的vue-workspace文件夹。当然了,首先我们要创建这个文件夹。

D:/program/vue-workspace

接下来演示在idea里面创建一个名为vue-projec的vue-cli项目


第一步:检查node.js是否安装

npm -v

第二步:配置npm源

配置npm源的命令

npm config set registry https://registry.npm.taobao.org

配置成功后,可通过get命令可查看npm源

npm config get registry

第三步:安装vue-cli

安装vue-cli的命令

npm install -g @vue/cli

安装完成后,检验vue-cli是否安装成功,注意:这里的命令参数是大写字母的V

vue -V

第四步:创建vue项目

使用vue create命令创建,然后按回车注意:只需要按一次回车键

vue create vue-project

接下来,开始配置项目

step1

step2:推荐在列表中选择Babel、Router、Vuex这3项,使用键盘的上下箭头移动,使用空格选中或取消选中,选择完成后按下键盘的Enter键到下一步

 step3:选择vue版本,建议选择2.x版本

step4:接下来的选项是Use history mode for router,表示“是否在路由中选择历史模式”,推荐选择“是”,输入Y后按下键盘的Enter键到下一步

step5:接下来的选项是Where do you prefer placing config for Babel,ESLint,etc.?,表示“你习惯把一些配置信息存放在哪里?”,推荐选择In package.json,即存放在package.json文件中

step6:最后的选项是Save this as a preset for future projects?,表示“是否保存以上配置信息,作为后续将创建的新工程的预设?”,推荐选择“否”,输入N后按下键盘的Enter键 (提示信息中,N是大写的,表示它是默认选项,不输入N而直接按下Enter键是等效的)

stp7:创建vue-cli项目了,只需要等待一段时间

第五步:启动项目

如上图,这时候已经创建完成了,在idea中打开刚刚新建的项目

项目默认通过8080端口启动,如果该端口被占用,则选择8081,以此类推,可以在package.json中指定项目启动的端口号,只需要修改package.json文件里的serve的值为

vue-cli-service serve --port 端口号

 下图就是设置启动端口为8088

点击底部工具栏中的Teminal,输入以下命令

npm run serve

看到下面的内容就是已经启动完成了

点击蓝色的链接就可以访问创建的项目了

当看到以上页面时,恭喜你,你已经成功创建了第一个vue脚手架项目了。

第六步:整合静态资源

首先介绍一下vue脚手架的项目结构

 public目录相当于SpringBoot的静态资源目录,里面的文件可以直接访问,比如访问favicon.ico

/favicon.ico

 asseets一般用来放项目的图片、样式文件、js文件等

components用来放提取出来的组件,其实就是vue文件

router里面放的是整个项目的路由文件

views存放我们写的页面,比如首页可以为IndexView.vue、HomeView.vue

App.vue就是我们的入口页面,打开看到的页面就是它

因为vue是单页面的应用,所有操作都是在一个页面上完成,而单页面是通过vue的路由完成的

我们打开App.vue,删除多余的内容,只留下一个路由

 删除多余的页面

 

 删除之后编译会报错

 因为路由里配置的页面找不到了,暂时不用管,打开我们原来的项目的页面

如上图所示,项目一共有8个HTML文件,也就是8个页面,首先我们看一下这些页面都是什么样的

1、登录页面

2、超市首页

续-超市首页

 3、购物车页面

 用户中心

 看完以上几张图片,估计很多人都会发现,好像除了登录页面,其他页面都有两个相似的部分,也就是页面上最上方和最下方的部分

所以我们把页脚抽出来,作为组件PageFooter.vue,注意:<template>标签内只能又一个div

 页头也抽出来,作为组件PageHeader.vue

 不要以为那么简单就完了,页头要加载用户的数据,根据返回的数据显示不同内容,所以,要把那块js的代码也复制过来,整个页面的代码如下

<template>
  <div class="header_con">
    <div class="header">
      <div class="welcome fl">欢迎来到天天生鲜!</div>

      <div class="fr">
        <div class="login_info fl" v-if="isLogin">
          欢迎您:<em>{{user.nickname}}</em>
          <span>&emsp;|&emsp;</span>
        </div>

        <div class="login_btn fl" v-if="!isLogin">
          <a href="/login">登录</a>

          <span>|</span>

          <a href="/register">注册</a>
        </div>

        <div class="user_link fl" v-else>
          <a href="/shop_cart">我的购物车</a>

          <span>|</span>

          <a href="/user_center">用户中心</a>

          <span>|</span>

          <a href="javascript:void(0)" @click="logout">退出登录</a>
        </div>
      </div>
    </div>
  </div>
</template>

<script>
  import {error, getData} from "@/assets/js/axiosUtis";

  export default {
    data() {
      return {
        isLogin: false, // 当前是否有用户登录
        user: {}, // // 当前登录的用户信息
      }
    },
    created: function () {
      let _this = this;

      // 获取登录的用户信息
      getData("/user/getlogin", {}
        , function (response) {
          _this.user = response.data;
          _this.isLogin = !!response.data;
        }, function (err) {
          error(err);
        }
      );
    },
    methods: {
      logout() {
        getData("/user/logout", {}
          , function (response) {
            if (response.data.code === 200) {
              location.href = "/login";
            } else {
              error(response.data.message);
            }
          }, function (err) {
            error(err);
          }
        );
      }
    },
    name: "PageHeader"
  }
</script>

<style>
  @import "../assets/css/reset.css";
  @import "../assets/css/main.css";
</style>

 接下来,创建8个页面对应的视图,因为都是重复的操作,为了方便,选择购物车页面

把页面的<div id="app"></div>整个快复制到新建的视图`ShopCartView.vue`中

<template>
  <div id="app">
    <div class="header_con">
      <div class="header">
        <div class="welcome fl">欢迎来到天天生鲜!</div>

        <div class="fr">
          <div class="login_info fl" v-if="isLogin">
            欢迎您:<em>{{user.nickname}}</em>
            <span>&emsp;|&emsp;</span>
          </div>

          <div class="login_btn fl" v-if="!isLogin">
            <a href="/login.html">登录</a>
            <span>|</span>
            <a href="/register.html">注册</a>
          </div>

          <div class="user_link fl" v-else>
            <a href="/html/user_center.html">用户中心</a>
            <span>|</span>
            <a href="javascript:void(0)" @click="logout">退出登录</a>
          </div>
        </div>
      </div>
    </div>

    <div class="search_bar clearfix">
      <a href="/" class="logo fl">
        <img src="/images/logo.png" alt="" />
      </a>

      <div class="sub_page_name fl">|购物车</div>

      <div class="search_con fr">
        <input class="input_text fl" v-model="search" placeholder="搜索商品" />
        <input type="button" class="input_btn fr" value="搜索" @click="query" />
      </div>
    </div>

    <div class="total_count">全部商品<em>{{count}}</em>件</div>

    <ul class="cart_list_th clearfix">
      <li class="col01">商品名称</li>
      <li class="col02">商品单位</li>
      <li class="col03">商品价格</li>
      <li class="col04">数量</li>
      <li class="col05">小计</li>
      <li class="col06">操作</li>
    </ul>

    <ul class="cart_list_td clearfix" v-for="cart in carts">
      <li class="col01"><input type="checkbox" checked /></li>
      <li class="col02"><img :src="cart.product.image" alt="" /></li>
      <li class="col03">
        {{cart.product.name}}<br>
        <em>{{cart.product.price}}元/{{cart.product.unit}}</em>
      </li>
      <li class="col04">{{cart.product.unit}}</li>
      <li class="col05">{{cart.product.price}}元</li>
      <li class="col06">
        <div class="num_add">
          <a href="javascript:void(0)" class="add fl">+</a>
          <input class="num_show fl" v-model="cart.quantity" />
          <a href="javascript:void(0)" class="minus fl">-</a>
        </div>
      </li>
      <li class="col07">{{cart.money}}元</li>
      <li class="col08"><a href="javascript:void(0)" @click="del(cart.id)">删除</a></li>
    </ul>

    <ul class="settlements">
      <li class="col01">
        <input type="checkbox" checked />
      </li>
      <li class="col02">全选</li>
      <li class="col03">合计(不含运费):
        <span>¥</span><em>{{total}}</em><br>
        共计<b>{{count}}</b>件商品
      </li>

      <!--购物车数量不为0时显示-->
      <li class="col04" v-if="count !== 0">
        <a href="/html/place_order.html">去结算</a>
      </li>
    </ul>
  </div>

  <div class="footer">
    <div class="foot_link">
      <a href="javascript:void(0)">关于我们</a>
      <span>|</span>
      <a href="javascript:void(0)">联系我们</a>
      <span>|</span>
      <a href="javascript:void(0)">招聘人才</a>
      <span>|</span>
      <a href="javascript:void(0)">友情链接</a>
    </div>

    <p>CopyRight © 2016 北京天天生鲜信息技术有限公司 All Rights Reserved</p>
    <p>电话:010-****888    京ICP备*******8号</p>
  </div>
</template>

<script>
  export default {
    name: "ShopCartView"
  }
</script>

<style scoped>

</style>

复制之后页面内容如上,把页头和页脚替换成刚刚创建的组件PageFooter和PageHeader,组件的使用很简单,直接当初标签用就行了<组件名 />,组件名就是export块里name属性的值

<template>
  <div>
    <PageHeader />

    <div class="search_bar clearfix">
      <a href="/" class="logo fl">
        <img src="/images/logo.png" alt="" />
      </a>

      <div class="sub_page_name fl">|购物车</div>

      <div class="search_con fr">
        <input class="input_text fl" v-model="search" placeholder="搜索商品" />
        <input type="button" class="input_btn fr" value="搜索" @click="query" />
      </div>
    </div>

    <div class="total_count">全部商品<em>{{count}}</em>件</div>

    <ul class="cart_list_th clearfix">
      <li class="col01">商品名称</li>
      <li class="col02">商品单位</li>
      <li class="col03">商品价格</li>
      <li class="col04">数量</li>
      <li class="col05">小计</li>
      <li class="col06">操作</li>
    </ul>

    <ul class="cart_list_td clearfix" v-for="cart in carts">
      <li class="col01"><input type="checkbox" checked /></li>
      <li class="col02"><img :src="cart.product.image" alt="" /></li>
      <li class="col03">
        {{cart.product.name}}<br>
        <em>{{cart.product.price}}元/{{cart.product.unit}}</em>
      </li>
      <li class="col04">{{cart.product.unit}}</li>
      <li class="col05">{{cart.product.price}}元</li>
      <li class="col06">
        <div class="num_add">
          <a href="javascript:void(0)" class="add fl">+</a>
          <input class="num_show fl" v-model="cart.quantity" />
          <a href="javascript:void(0)" class="minus fl">-</a>
        </div>
      </li>
      <li class="col07">{{cart.money}}元</li>
      <li class="col08"><a href="javascript:void(0)" @click="del(cart.id)">删除</a></li>
    </ul>

    <ul class="settlements">
      <li class="col01">
        <input type="checkbox" checked />
      </li>
      <li class="col02">全选</li>
      <li class="col03">合计(不含运费):
        <span>¥</span><em>{{total}}</em><br>
        共计<b>{{count}}</b>件商品
      </li>

      <!--购物车数量不为0时显示-->
      <li class="col04" v-if="count !== 0">
        <a href="/html/place_order.html">去结算</a>
      </li>
    </ul>

    <PageFooter />
  </div> 
</template>

<script>
  export default {
    name: "ShopCartView"
  }
</script>

<style scoped>

</style>

修改之后的页面是上面这样的,但是因为idea并不知道这两个标签是什么意思

<PageHeader />
<PageFooter />

所以我们要通过引入这两个组件告诉它这是两个vue的组件

<script>
  import PageHeader from "@/components/PageHeader";
  import PageFooter from "@/components/PageFooter";

  export default {
    name: "ShopCartView"
  }
</script>

这个时候发现这两条引入的语句是灰色的,提示删除未使用的引入

那是因为少了配置,在export default块里的components属性中声明页面使用了哪些组件

<script>
  import PageHeader from "@/components/PageHeader";
  import PageFooter from "@/components/PageFooter";

  export default {
    name: "ShopCartView",
    components: {
      PageHeader,
      PageFooter
    }
  }
</script>

这样,我们才算使用了自己定义的组件,这时候export块提示没有使用到的默认导出,那是因为没有配置路由

打开router目录下的index.js,在里面配置着呢项目的路由

这个页面内容不多,需要改的是上面的部分,我们照着葫芦画瓢就好了

import Vue from 'vue';
import VueRouter from 'vue-router';

Vue.use(VueRouter);

const routes = [
  {
    path: '/shop_cart',
    name: 'shop_cart',
    component: () => import('../views/ShopCartView.vue')
  }
]

const router = new VueRouter({
  mode: 'history',
  base: process.env.BASE_URL,
  routes
})

export default router

 这样就配置了第一个路由

最后,把我们的js文件也复制过来

<template>
  <div>
    <PageHeader />

    <div class="search_bar clearfix">
      <a href="/" class="logo fl">
        <img src="../assets/images/logo.png" alt="" />
      </a>

      <div class="sub_page_name fl">|购物车</div>

      <div class="search_con fr">
        <input class="input_text fl" v-model="search" placeholder="搜索商品" />
        <input type="button" class="input_btn fr" value="搜索" @click="query" />
      </div>
    </div>

    <div class="total_count">全部商品<em>{{count}}</em>件</div>

    <ul class="cart_list_th clearfix">
      <li class="col01">商品名称</li>
      <li class="col02">商品单位</li>
      <li class="col03">商品价格</li>
      <li class="col04">数量</li>
      <li class="col05">小计</li>
      <li class="col06">操作</li>
    </ul>

    <ul class="cart_list_td clearfix" v-for="cart in carts">
      <li class="col01"><input type="checkbox" checked /></li>
      <li class="col02"><img :src="cart.product.image" alt="" /></li>
      <li class="col03">
        {{cart.product.name}}<br>
        <em>{{cart.product.price}}元/{{cart.product.unit}}</em>
      </li>
      <li class="col04">{{cart.product.unit}}</li>
      <li class="col05">{{cart.product.price}}元</li>
      <li class="col06">
        <div class="num_add">
          <a href="javascript:void(0)" class="add fl">+</a>
          <input class="num_show fl" v-model="cart.quantity" />
          <a href="javascript:void(0)" class="minus fl">-</a>
        </div>
      </li>
      <li class="col07">{{cart.money}}元</li>
      <li class="col08"><a href="javascript:void(0)" @click="del(cart.id)">删除</a></li>
    </ul>

    <ul class="settlements">
      <li class="col01">
        <input type="checkbox" checked />
      </li>
      <li class="col02">全选</li>
      <li class="col03">合计(不含运费):
        <span>¥</span><em>{{total}}</em><br>
        共计<b>{{count}}</b>件商品
      </li>

      <!--购物车数量不为0时显示-->
      <li class="col04" v-if="parseInt(count) !== 0">
        <a href="/place_order">去结算</a>
      </li>
    </ul>

    <PageFooter />
  </div>
</template>

<script>
  import Vue from "vue";
  import ElementUI from "element-ui";
  import "element-ui/lib/theme-chalk/index.css";
  import {error, getData} from "@/assets/js/axiosUtis";
  import PageHeader from "@/components/PageHeader.vue";
  import PageFooter from "@/components/PageFooter.vue";

  Vue.use(ElementUI);

  export default {
    data() {
      return {
        total: 0,
        count: 0,
        search: "",
        carts: [] // 购物车
      }
    },
    created: function () {
      let _this = this;

      // 查询查询用户的购物车
      getData("/shop_cart/select", {}
        , function (response) {
          _this.count = 0;
          _this.total = 0;
          _this.carts = response.data;

          for (let i = 0; i < _this.carts.length; i++) {
            let cart = _this.carts[i];

            _this.count += cart.quantity;
            _this.total += cart.money;
          }
        },function (err) {
          error(err);
        }
      );
    },
    methods: {
      query() { // 查询商品
        location.href = "/list?name=" + this.search;
      },
      del(id) { // 删除购物车
        let bool = confirm("是否确认删除?");

        if (bool) {
          let _this = this;

          getData("/shop_cart/deleteById/" + id, {}, function () {
            // 查询查询用户的购物车
            getData("/shop_cart/select", {}, function (response) {
              _this.count = 0;
              _this.total = 0;
              _this.carts = response.data;

              for (let i = 0; i < _this.carts.length; i++) {
                let cart = _this.carts[i];

                _this.count += cart.quantity;
                _this.total += ((cart.money * 100) * cart.quantity) / 100;
              }
            },function (err) {
              error(err);
            });
          },function (err) {
            error(err);
          });
        }
      }
    },
    name: "ShopcartView",
    components: {
      PageFooter,
      PageHeader
    }
  }
</script>

<style>
  @import "../assets/css/reset.css";
  @import "../assets/css/main.css";
</style>

 因为项目要用到axios和element-ui,安装一下

安装element-ui

npm i element-ui -S

 安装axios

npm i axios -S

最下面的导入css可以写到<script>块里,如图

 好了,文章就分享到这里了,更多细节可以参考项目的源代码,如果文章对你有所帮助,不要忘了点赞+收藏哦~

天天生鲜商城vue前端项目https://gitee.com/he-yunlin/ttsx.git

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

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

相关文章

【Java基础学习打卡03】计算机中数据的表示、存储与处理

目录 前言一、数据的表示1.数据与信息2.计算机中的数据3.计算机中数据的单位 二、数据的存储三、数据的处理1.进位计数值2.进制间转换 四、字符编码总结 前言 本小节主要介绍在计算机中数据的表示、存储与处理。要知道计算机内部使用二进制数据&#xff0c;也就是0和1组成的数…

STM32单片机+机智云AIoT+智能服药箱

摘要:随着我国老龄化进程的日趋加快&#xff0c;越来越多的老年人步入了快乐并充实的晚年生活。但是随着年龄的增长&#xff0c;各种医药用品也成了老年人生活的必需品&#xff0c;有人每天甚至需要在不同时间服用多种不同的药物&#xff0c;如果子女不在身边&#xff0c;老年人…

一款基于RT-Thread操作系统的自动测温+风扇自动调速+加湿+自动启停的智能风扇项目(附源码下载)

基于 RT-Thread 的智能加湿风扇 作品背景 一款基于 RT-Thread 操作系统的自动检测温湿度情况进行风扇转速自动调节&#xff0c;加湿自动启停的桌面风扇。 所用硬件&#xff1a; 主控&#xff1a;CH32V307 开发板。温湿度检测&#xff1a;AHT10 温湿度模块。风扇主体&#x…

企业开源测试项目实战(附全套实战项目教程+视频+源码)

接口测试项目 1. No matching distribution found for itypes1.1.0 Could not find a version that satisfies the requirement itypes1.1.0 (from -r requirements.txt (line 8)) (from versions: ) No matching distribution found for itypes1.1.0 (from -r requirements.…

Deepspeed Chat项目理解

ChatGPT的广泛使用促进大模型火起来了&#xff0c;深度学习人工智能开启了2.0时代&#xff0c;deepspeed chat是微软开源的大模型训练工具&#xff0c;它充分利用了deepspeed的高效训练的特点&#xff0c;能够自动化的进行多种大模型训练。 言归正传&#xff0c;在博客中我将对…

什么是大数据,常见的大数据应用领域?

现在大数据发展的如火如荼&#xff0c;也有不少小伙伴对于什么是大数据比较感兴趣&#xff0c;那么大数据在比较官方的定义是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合&#xff0c;是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力…

ASP.NET Core Web API入门:创建新项目

ASP.NET Core Web API入门&#xff1a;创建新项目 一、引言二、创建新项目三、加入Startup类&#xff0c;并替换Program.cs内容四、编辑Program.cs代码五、修改控制器的路由六、运行项目 一、引言 最近闲着&#xff0c;想着没真正从0-1开发过ASP.NET Core Web API的项目&#…

Navicat for Redis 与 Navicat Premium 16.2 现已正式发布 | 释放 Redis 全部潜能

今天&#xff0c;我们正式发布 Navicat for Redis 与 Navicat Premium 16.2 两款产品。注入 Redis 能力&#xff0c;这对 Navicat 具有里程碑意义。 此次首发的 Navicat for Redis 数据库管理开发工具&#xff0c;将为 Redis 用户的日常工作带来更为便捷、高效的全新体验。同时…

XV-442-57CQB-1-10伊顿触摸屏EATON

​ XV-442-57CQB-1-10伊顿触摸屏EATON XV-442-57CQB-1-10伊顿触摸屏EATON plc的通信模块是用来完成与别的PLC&#xff0c;其他智能控制设备或计算机之间的通信。以下简单介绍FX系列通信用功能扩展板、适配器及通信模块。 &#xff08;1&#xff09;通信扩展板FX2N-232-BD…

第十五章物资需求计划

物料需求计划&#xff08;MRP&#xff09;是物料管理&#xff08;MM&#xff09;和生产计划&#xff08;PP&#xff09;的组成部分。在本章中&#xff0c;您将学习如何使用MRP来优化物流和供应链规划流程。 物料需求计划&#xff08;MRP&#xff09;是一种用途广泛、直观的计划…

44 最佳实践-性能最佳实践-裸设备映射

文章目录 44 最佳实践-性能最佳实践-裸设备映射44.1 概述44.2 配置示例 44 最佳实践-性能最佳实践-裸设备映射 44.1 概述 配置虚拟机存储设备时&#xff0c;除了将文件配置给虚拟机作为虚拟磁盘使用外&#xff0c;还可以将块设备&#xff08;物理LUN、逻辑卷等&#xff09;直…

VXLAN技术应用场景及测试

定义 RFC7348定义了VLAN扩展方案VXLAN&#xff08;Virtual eXtensible Local Area Network&#xff0c;虚拟扩展局域网&#xff09;。 VXLAN采用MAC in UDP&#xff08;User Datagram Protocol&#xff09;封装方式&#xff0c;是NVO3&#xff08;Network Virtualization ove…

设计模式(行为型模式)之:Strategy(策略模式)

文章目录 本质&#xff1a;动机&#xff1a;定义&#xff1a;一个不好的例子策略模式重写总结 本质&#xff1a; 分离算法&#xff0c;选择实现。动机&#xff1a; 在软件构建过程中&#xff0c;某些对象使用的算法可能多种多样&#xff0c;经常改变&#xff0c;如果将这些算…

LeetCode 按摩师 python

目录 1.题目描述 2.普通解法&#xff08;通过部分测试用例&#xff09; ​编辑 3.动态规划解法 3.题目总结 1.题目描述 一个有名的按摩师会收到源源不断的预约请求&#xff0c;每个预约都可以选择接或不接。在每次预约服务之间要有休息时间&#xff0c;因此她不能接受相邻…

(六)CSharp-CSharp图解教程版-委托

一、委托概述 1、什么是委托 委托和类一样&#xff0c;是一种用户定义类型&#xff08;即是一种类&#xff0c;所以也是一个引用类型&#xff09;。在它们组成的结构方面区别是&#xff0c;类表示的是数据和方法的集合&#xff0c;而委托则持有一个或多个方法。 可以把 deleg…

Spring架构篇--2.7.1 远程通信基础--Netty原理--NioEventLoopGroup

前言&#xff1a;在使用Netty 时不管是服务端还是客户端都需要 new NioEventLoopGroup 对象进行工作&#xff0c;NioEventLoopGroup的作用是什么呢&#xff1b; 1 NioEventLoopGroup 类图&#xff1a; 从类名字来看它是一个Nio 流的事件轮询器组&#xff0c;既然是一组顾名思…

使用dataFEED OPC Suite将西门子PLC数据转发至阿里云RDS数据库

一 背景 工业现场级别的各种设备会产生大量的数据&#xff0c;这些数据包含生产过程的各种信息&#xff0c;在经过数据库等IT应用的处理后&#xff0c;可为企业提供全面的生产数据分析和决策支持。以往工厂的数据库通常部署在本地&#xff0c;然而得益于云计算的快速发展以及云…

k8s harbor镜像仓库搭建

1.前言 Harbor 是一个开源的云原生镜像仓库&#xff0c;用于存储和分发 Docker 镜像。它提供了一些安全性和管理方面的功能&#xff0c;使得用户可以更好地管理和共享 Docker 镜像 2.配置harbor搭建环境 harbor的搭建需要用到docker、docker-compose服务 docker搭建参考&am…

Vivado 下 IP核之双端口 RAM 读写

目录 Vivado 下 IP核之双端口 RAM 读写 1、RAM IP 核简介 2、实验任务 3、程序设计 3.1、RAM IP 核配置 3.2、顶层模块设计 &#xff08;1&#xff09;绘制波形图 4、编写代码 4.1、顶层模块 ip_2port_ram 4.2、RAM 写模块设计 4.3、ram_wr 模块代码 4.4、RAM 读模…

基于graalvm和java swing制作一个文件差异对比的原生应用,附源码

文章目录 1、DFDiff介绍2、软件架构3、安装教程3.1、编译为jar包运行3.2、编译为原生应用运行 4、运行效果图5、项目源码地址 1、DFDiff介绍 当前已实现的功能比较两个文件夹内的文件差异&#xff0c;已支持文件差异对比。 2、软件架构 软件架构说明 开发环境是在OpenJDK17&…