SpringBoot + Vue前后端分离项目实战 || 一:Vue前端设计

news2024/10/5 12:42:02

文章目录

    • 环境配置
    • 开发工具
    • 下载Vue前端模板
    • 前端项目启动
    • 前端说明及修改
      • 修改导航栏
      • 自定义菜单与子菜单
      • 增加导航标签功能
    • 前端数据格式

B站视频讲解:2023全网最简单但实用的SpringBoot+Vue前后端分离项目实战

不想看视频可浏览此文章笔记,比较详细

环境配置

Nodejs: 8.17.0
Vue: 3.11.0
Maven: 3.6.0
Java版本: 1.8.0_371
MySQL: 5.5_56
Redis: 5.0.14

一般推荐使用低版本,因为高版本兼容低版本,反之不行

开发工具

IDEA 2021(后端)
VScode(前端)

下载Vue前端模板

https://panjiachen.gitee.io/vue-element-admin-site/zh/guide/
在这里插入图片描述
此处建议下载1和2,项目主要基于2开发,但是会拓展一个前端功能需要用到1里面的代码

选择2后,可下载其他版本,此处我下载的是v3.0.0
在这里插入图片描述
在这里插入图片描述

下载完成后将第2个基础模版解压到任意能找到的目录(不推荐目录中包含中文字符)
在这里插入图片描述

打开VScode,选择 文件 -> 打开文件夹
在这里插入图片描述
在这里插入图片描述

如下图 打开成功
在这里插入图片描述

前端项目启动

打开集成终端,一定要定位到package.json级别的目录
在这里插入图片描述

然后终端输入命令 npm install
在这里插入图片描述

会自动下载项目的依赖
在这里插入图片描述

依赖下载完毕后 启动项目,运行命令npm run dev
在这里插入图片描述

出现以下信息表示成功
在这里插入图片描述
打开链接即可
在这里插入图片描述

前端说明及修改

前端的总体配置在文件vue.config.js
在这里插入图片描述

第16行 是端口号,可修改,此处我修改为8888
在这里插入图片描述

第34行 为是否启动项目就默认打开浏览器,因为vue支持热修改,并不用每次改完前端就需要重新启动,改完保存后前端页面就自动修改,所以此处设为false
在这里插入图片描述

所有的页面保存在src/views文件夹中,此处的view文件夹被我修改过,稍后说明修改流程
在这里插入图片描述

先修改登录页面src/views/login/index.vue
在这里插入图片描述

定位到第6行,修改title
在这里插入图片描述

定位到 187行,修改背景图,此时你需要找到一张背景图片,放在src/assets文件夹中

background-image: url(../../assets/bg.png); //背景图
background-size: 100%;

在这里插入图片描述

保存后页面会同步修改
在这里插入图片描述

为什么要在此处才能修改背景图?
在这里插入图片描述

我们在浏览器中按F12打开开发者模式,选择1,然后鼠标移动到整个页面都被选择,此时左下角出现了一个类名.login.container,记住该名称
在这里插入图片描述

打开VScode搜索.login-container ,注意页面显示的.login.container中第二个.替换为-变为.login-container,此处就是我们需要修改的样式的地方
在这里插入图片描述
其他的修改:

  1. 将英文变中文,其实就是找到对应的英文修改为中文,可在页面记住英文单词,然后进代码查找对应的英文在哪儿,然后打上中文即可
    在这里插入图片描述
  2. 修改登录表单为半透明,同样查找元素然后搜索login-form
    在这里插入图片描述
    在这里插入图片描述
    .login-form {
        position: relative;
        width: 520px;
        max-width: 100%;
        padding: 30px 35px 0;
        margin: 0 auto;
        overflow: hidden;
        background-color: #2d3a4b;  // 背景颜色
        border-radius: 5px;             // 表单圆角
        opacity: 0.85;                  // 透明度,值越小越越透明,取值为[0,1]
    }
    
  3. 附上我的src\views\login\inde.vue文件的全部代码
    <template>
      <div class="login-container">
        <el-form ref="loginForm" :model="loginForm" :rules="loginRules" class="login-form" auto-complete="on" label-position="left">
    
          <div class="title-container">
            <h3 class="title">神盾局管理系统</h3>
          </div>
    
          <el-form-item prop="username">
            <span class="svg-container">
              <svg-icon icon-class="user" />
            </span>
            <el-input
              ref="username"
              v-model="loginForm.username"
              placeholder="用户名"  
              name="username"
              type="text"
              tabindex="1"
              auto-complete="on"
            />
          </el-form-item>
    
          <el-form-item prop="password">
            <span class="svg-container">
              <svg-icon icon-class="password" />
            </span>
            <el-input
              :key="passwordType"
              ref="password"
              v-model="loginForm.password"
              :type="passwordType"
              placeholder="密码"
              name="password"
              tabindex="2"
              auto-complete="on"
              @keyup.enter.native="handleLogin"
            />
            <span class="show-pwd" @click="showPwd">
              <svg-icon :icon-class="passwordType === 'password' ? 'eye' : 'eye-open'" />
            </span>
          </el-form-item>
    
          <el-button :loading="loading" type="primary" style="width:100%;margin-bottom:30px;" @click.native.prevent="handleLogin">登录</el-button>
    
          <!-- <div class="tips">
            <span style="margin-right:20px;">username: admin</span>
            <span> password: any</span>
          </div> -->
    
        </el-form>
      </div>
    </template>
    
    <script>
    
    import { validUsername } from '@/utils/validate'
    
    export default {
      name: 'Login',
      data() {
        const validateUsername = (rule, value, callback) => {
          if (!validUsername(value)) {
            callback(new Error('请输入正确的用户名'))
          } else {
            callback()
          }
        }
        const validatePassword = (rule, value, callback) => {
          if (value.length < 6) {
            callback(new Error('密码不能少于6位'))
          } else {
            callback()
          }
        }
        return {
          loginForm: {
            username: 'admin',
            password: '123456'
          },
          loginRules: {
            username: [{ required: true, trigger: 'blur', validator: validateUsername }],
            password: [{ required: true, trigger: 'blur', validator: validatePassword }]
          },
          loading: false,
          passwordType: 'password',
          redirect: undefined
        }
      },
      watch: {
        $route: {
          handler: function(route) {
            this.redirect = route.query && route.query.redirect
          },
          immediate: true
        }
      },
      methods: {
        showPwd() {
          if (this.passwordType === 'password') {
            this.passwordType = ''
          } else {
            this.passwordType = 'password'
          }
          this.$nextTick(() => {
            this.$refs.password.focus()
          })
        },
        handleLogin() {
          this.$refs.loginForm.validate(valid => {
            if (valid) {
              this.loading = true
              this.$store.dispatch('user/login', this.loginForm).then(() => {
                this.$router.push({ path: this.redirect || '/' })
                this.loading = false
              }).catch(() => {
                this.loading = false
              })
            } else {
              console.log('error submit!!')
              return false
            }
          })
        }
      }
    }
    </script>
    
    <style lang="scss">
    /* 修复input 背景不协调 和光标变色 */
    /* Detail see https://github.com/PanJiaChen/vue-element-admin/pull/927 */
    
    $bg:#283443;
    $light_gray:#fff;
    $cursor: #fff;
    
    @supports (-webkit-mask: none) and (not (cater-color: $cursor)) {
      .login-container .el-input input {
        color: $cursor;
      }
    }
    
    /* reset element-ui css */
    .login-container {
      .el-input {
        display: inline-block;
        height: 47px;
        width: 85%;
    
        input {
          background: transparent;
          border: 0px;
          -webkit-appearance: none;
          border-radius: 0px;
          padding: 12px 5px 12px 15px;
          color: $light_gray;
          height: 47px;
          caret-color: $cursor;
    
          &:-webkit-autofill {
            box-shadow: 0 0 0px 1000px $bg inset !important;
            -webkit-text-fill-color: $cursor !important;
          }
        }
      }
    
      .el-form-item {
        border: 1px solid rgba(255, 255, 255, 0.1);
        background: rgba(0, 0, 0, 0.1);
        border-radius: 5px;
        color: #454545;
      }
    }
    </style>
    
    <style lang="scss" scoped>
    $bg:#2d3a4b;
    $dark_gray:#889aa4;
    $light_gray:#eee;
    
    .login-container {
      min-height: 100%;
      width: 100%;
      background-color: $bg;
      overflow: hidden;
    
      background-image: url(../../assets/bg.png); //背景图
      background-size: 100%;
    
    
      display: flex;
      align-items: center;
    
    
      .login-form {
        position: relative;
        width: 520px;
        max-width: 100%;
        padding: 30px 35px 0;
        margin: 0 auto;
        overflow: hidden;
        background-color: #2d3a4b;  // 背景颜色
        border-radius: 5px;             // 表单圆角
        opacity: 0.85;                  // 透明度,值越小越越透明,取值为[0,1]
      }
    
      .tips {
        font-size: 14px;
        color: #fff;
        margin-bottom: 10px;
    
        span {
          &:first-of-type {
            margin-right: 16px;
          }
        }
      }
    
      .svg-container {
        padding: 6px 5px 6px 15px;
        color: $dark_gray;
        vertical-align: middle;
        width: 30px;
        display: inline-block;
      }
    
      .title-container {
        position: relative;
    
        .title {
          font-size: 26px;
          color: $light_gray;
          margin: 0px auto 40px auto;
          text-align: center;
          font-weight: bold;
        }
      }
    
      .show-pwd {
        position: absolute;
        right: 10px;
        top: 7px;
        font-size: 16px;
        color: $dark_gray;
        cursor: pointer;
        user-select: none;
      }
    }
    </style>
    
    复制代码后注意背景图的链接地址下要有文件存在

修改 页面标签 找到src\settings.js文件,然后修改第3行title

在这里插入图片描述

修改完毕后浏览器标签会改变
在这里插入图片描述

修改导航栏

点击此处会有导航窗口
在这里插入图片描述

可自定义修改,找到scr\layout\components\Navbar.vue文件,修改红框处的代码
在这里插入图片描述
在这里插入图片描述

<el-dropdown-menu slot="dropdown" class="user-dropdown">
  <router-link to="/">
     <el-dropdown-item>
       个人信息
     </el-dropdown-item>
   </router-link>

   <a target="_blank" href="https://www.chinaums.com/">
     <el-dropdown-item>公司主页</el-dropdown-item>
   </a>
   <a target="_blank" href="https://www.hhu.edu.cn/">
     <el-dropdown-item>学校主页</el-dropdown-item>
   </a>
   <el-dropdown-item divided @click.native="logout">
     <span style="display:block;">退出登录</span>
   </el-dropdown-item>
 </el-dropdown-menu>

自定义菜单与子菜单

在这里插入图片描述

首先,在src\views\下新建文件夹systest,然后再分别在这两个文件夹中新建role.vueuser.vuetest1.vuetest2.vuetest3.vue文件,如下图所示
在这里插入图片描述

进入role.vue写代码
VScode中输入vue会自动代码提示(需在VScode中安装vue插件),回车即可
在这里插入图片描述

会自动生成模板
在这里插入图片描述

此时写上一些代码
在这里插入图片描述

其他新建的vue文件如法炮制

然后我们在src\router\index.js中路由链接这些新建的vue文件
在这里插入图片描述
在这里插入图片描述

新增代码及注释

{
    path: '/sys',       // 浏览器访问路径
    component: Layout,
    redirect: '/sys',   // 本地views下的sys文件夹
    name: 'sysManage',  // 名字,唯一标识
    meta: { title: '系统管理', icon: '1' },   // 标题和图标
    children: [       // 子菜单   
      {
        path: 'user',   // 子菜单的浏览器访问路径,与父菜单结合 /sys/user 最终形成http://localhost:8888/#/sys/user
        name: 'user',   // 名字,唯一标识
        component: () => import('@/views/sys/user'),   // 新建views下的user.vue文件,该文件一定要存在
        meta: { title: '用户管理', icon: '个人中心'}    // 标题和图标
      },
      {
        path: 'role',   // 子菜单的浏览器访问路径,与父菜单结合 /sys/role
        name: 'role',
        component: () => import('@/views/sys/role'),  // 新建view下的user.vue界面,必须存在
        meta: { title: '角色管理', icon: '新增组织' }
      }
    ]
 },

注意该代码中的icon:'1',这是自定义的图标,可在阿里巴巴矢量图标库中下载自己喜欢的图标

在这里插入图片描述

找到喜欢的图标后点击SVG下载
在这里插入图片描述

下好的图标重命名后保存在src\icons\svg文件夹中
在这里插入图片描述

然后就可以在代码中用上该图标了,不用写路径后缀名
在这里插入图片描述

图标效果如下
在这里插入图片描述

我的src\router\index.js全部代码

import Vue from 'vue'
import Router from 'vue-router'

Vue.use(Router)

/* Layout */
import Layout from '@/layout'

/**
 * Note: sub-menu only appear when route children.length >= 1
 * Detail see: https://panjiachen.github.io/vue-element-admin-site/guide/essentials/router-and-nav.html
 *
 * hidden: true                   if set true, item will not show in the sidebar(default is false)
 * alwaysShow: true               if set true, will always show the root menu
 *                                if not set alwaysShow, when item has more than one children route,
 *                                it will becomes nested mode, otherwise not show the root menu
 * redirect: noRedirect           if set noRedirect will no redirect in the breadcrumb
 * name:'router-name'             the name is used by <keep-alive> (must set!!!)
 * meta : {
    roles: ['admin','editor']    control the page roles (you can set multiple roles)
    title: 'title'               the name show in sidebar and breadcrumb (recommend set)
    icon: 'svg-name'/'el-icon-x' the icon show in the sidebar
    breadcrumb: false            if set false, the item will hidden in breadcrumb(default is true)
    activeMenu: '/example/list'  if set path, the sidebar will highlight the path you set
  }
 */

/**
 * constantRoutes
 * a base page that does not have permission requirements
 * all roles can be accessed
 */
export const constantRoutes = [
  {
    path: '/login',
    component: () => import('@/views/login/index'),
    hidden: true
  },

  {
    path: '/404',
    component: () => import('@/views/404'),
    hidden: true
  },

  {
    path: '/',
    component: Layout,
    redirect: '/dashboard',
    children: [{
      path: 'dashboard',
      name: 'Dashboard',
      component: () => import('@/views/dashboard/index'),
      meta: { title: '首页', icon: 'dashboard' , affix:true}
    }]
  },

  {
    path: '/sys',       // 浏览器访问路径
    component: Layout,
    redirect: '/sys',   // 本地views下的sys文件夹
    name: 'sysManage',  // 名字,唯一标识
    meta: { title: '系统管理', icon: '1' },   // 标题和图标
    children: [       // 子菜单,此子菜单   
      {
        path: 'user',   // 子菜单的浏览器访问路径,与父菜单结合 /sys/user 最终形成http://localhost:8888/#/sys/user
        name: 'user',   // 名字,唯一标识
        component: () => import('@/views/sys/user'),   // 新建views下的user.vue文件,该文件一定要存在
        meta: { title: '用户管理', icon: '个人中心'}    // 标题和图标
      },
      {
        path: 'role',   // 子菜单的浏览器访问路径,与父菜单结合 /sys/role
        name: 'role',
        component: () => import('@/views/sys/role'),  // 新建view下的user.vue界面,必须存在
        meta: { title: '角色管理', icon: '新增组织' }
      }
    ]
  },

  {
    path: '/test',
    component: Layout,
    redirect: '/test',
    name: 'test',
    meta: { title: '功能模块', icon: 'tree' },
    children: [   //子菜单
      {
        path: 'test1',
        name: 'test1',
        component: () => import('@/views/test/test1'),   // 新建view下的user.vue界面
        meta: { title: '功能1', icon: '维护管理' }
      },
      {
        path: 'test2',
        name: 'test2',
        component: () => import('@/views/test/test2'),  // 新建view下的user.vue界面,必须存在
        meta: { title: '功能2', icon: '维护管理' }
      },
      {
        path: 'test3',
        name: 'test3',
        component: () => import('@/views/test/test3'),  // 新建view下的user.vue界面,必须存在
        meta: { title: '功能3', icon: '维护管理' }
      }
    ]
  },



  // 404 page must be placed at the end !!!
  { path: '*', redirect: '/404', hidden: true }
]

const createRouter = () => new Router({
  // mode: 'history', // require service support
  scrollBehavior: () => ({ y: 0 }),
  routes: constantRoutes
})

const router = createRouter()

// Detail see: https://github.com/vuejs/vue-router/issues/1234#issuecomment-357941465
export function resetRouter() {
  const newRouter = createRouter()
  router.matcher = newRouter.matcher // reset router
}

export default router

注意复制代码时,确认好自己的icon图标文件

增加导航标签功能

如下图所示需要新增一个功能
在这里插入图片描述

此功能的代码在之前介绍的第一个项目中,现在需要将代码copy过来
在这里插入图片描述

下载好最新的一个压缩包后,解压缩,找到以下三个文件,注意这些文件复制到正在开发的项目中对应的路径中去,两个项目的路径设置是一样的
src/layout/components/TagsView
src/store/modules/tagsView.js
src/store/modules/permission.js

在这里插入图片描述
在这里插入图片描述

然后进入VScode中添加代码:

  1. 进入src/layout/components/AppMain.vue文件修改红框代码
    在这里插入图片描述

    <keep-alive :include="cachedViews">
        <router-view :key="key" />
    </keep-alive>
    
    
    export default {
      name: 'AppMain',
      computed: {
        key() {
          return this.$route.path
        },
        cachedViews() {
            return this.$store.state.tagsView.cachedViews
        }
      }
    }
    
  2. 修改文件src/store/getters.js
    在这里插入图片描述

      visitedViews: state => state.tagsView.visitedViews,
      cachedViews: state => state.tagsView.cachedViews,   
      permission_routes: state => state.permission.routes
    
  3. 修改文件src/store/index.js
    在这里插入图片描述

    import Vue from 'vue'
    import Vuex from 'vuex'
    import getters from './getters'
    import app from './modules/app'
    import settings from './modules/settings'
    import user from './modules/user'
    import tagsView from './modules/tagsView'
    
    Vue.use(Vuex)
    
    const store = new Vuex.Store({
      modules: {
        app,
        settings,
        user,
        tagsView
      },
      getters
    })
    
    export default store
    
  4. 修改文件src\layout\index.vue
    在这里插入图片描述

  5. 修改文件src\layout\components\index.js
    在这里插入图片描述

    export { default as TagsView } from './TagsView'
    

大功告成!重新启动项目npm run dev

如果我们想要设置某个标签不可关闭,如下图中首页标签,此时需要在src\router\index.js文件中找到首页然后添加属性affix:true
在这里插入图片描述

在这里插入图片描述

另外,标签导航是可以右击的,此处我将英文修改为了中文
在这里插入图片描述

大家可以在VScode中全局搜索浏览器弹出来的英文,然后查找,再将其修改为对应中文即可,此处修改路径为src\layout\components\TagsView\index.vue中第20
在这里插入图片描述

此时前端页面修改就大差不差了

前端数据格式

前后端对接需要知道前端登录的json数据传递格式

打开浏览器界面,按F12选择网络
在这里插入图片描述

然后点击登录,此时浏览器会记录状态
在这里插入图片描述

单击login会出现数据响应格式,如红框所示,这个格式后端写代码会用到
在这里插入图片描述

{"code":20000,"data":{"token":"admin-token"}}

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

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

相关文章

民族工业领军企业:大族激光全流程数字化增长路径揭秘

1.关于大族激光 大族激光科技产业集团&#xff08;简称“大族激光”&#xff0c;股票代码 002008&#xff09;于 1996 年创立、2004 年上市&#xff0c;是亚洲最大、世界排名前三的工业激光加工及自动化整体解决方案服务商&#xff0c;专业从事工业激光加工设备与自动化等配套…

Python面向对象编程2-面向过程的银行账号模拟程序 项目2.2 取款与查看余额

项目总目标&#xff1a;用面向过程思想设计一个简单的银行账号模拟程序。本次将迭代多个程序版本&#xff0c;每个版本都将添加更多功能。虽然这些程序没有达到发布的质量标准&#xff0c;但整个项目的目的是关注于代码如何与一个或多个银行账户的数据进行交互。 分析项目的必要…

MySQL8漏洞处理之小版本升级至8.0.33

MySQL低版本经常会出现一些漏洞&#xff0c;有些高危漏洞就得处理&#xff0c;以防未知风险。 一、漏洞描述 MySQL 安全漏洞(CVE-2023-21912)(CVE-2023-21980): Oracle MySQL 5.7.41 版本及之前版本和 8.0.32 版本及之前版本的 Client programs 组件存在安全漏洞。低权限攻击…

使用Channel的一些业务场景

使用Channel的一些业务场景 首先需要明确的就是&#xff0c;发送方才知道什么时候关闭 channel &#xff0c;这个是比较符合逻辑的。 我们需要知道哪些情况会使 channel 发生 panic 关闭一个 nil 值会引发关闭一个已经关闭的 channel 会引发向一个已经关闭的 channel 发送数据…

职场人的AI私塾,帮你打造得力的AI助手

你有没有想过&#xff0c;为什么有一些周围的小伙伴&#xff0c;工作量看着也不少&#xff0c;但事务处理速度特别快&#xff0c;质量也不差&#xff1b;一些看起来难度比较大或者生疏的工作&#xff0c;也能轻松应付得来&#xff0c;难道他们都是天生的工作能力出众&#xff1…

小白速看!带你轻松解决Java的空指针异常

关注“Java架构栈”微信公众号&#xff0c;回复暗号【Java面试题】即可获取大厂面试题 异常案例 对很多Java初学者来说&#xff0c;在学习的初期是很容易遇到各种异常的&#xff0c;就比如咱们今天要讲的这个空指针异常。所谓“授之以鱼&#xff0c;不如授之以渔”&#xff0c;…

Q-Vision+Kvaser CAN/CAN FD/LIN总线解决方案

智能联网技术在国内的发展势头迅猛&#xff0c;随着汽车智能化、网联化发展大潮的到来&#xff0c;智能网联汽车逐步成为汽车发展的主要趋势。越来越多整车厂诉求&#xff0c;希望可以提供本土的测量软件&#xff0c;特别是关于ADAS测试。对此&#xff0c;Softing中国推出的Q-V…

CppUnit——【由JUnit移植过来的】C++单元测试框架——的下载安装

C单元测试框架CppUnit的下载与安装 简介下载地址导入到Virtual Studio准备条件根据VS版本选择导入对应的.sln文件 简介 CppUnit是【由JUnit移植过来的】C测试框架。 下载地址 从我使用的CppUtest框架中的文档/readme/ReadmePart1_VisualStudio.rtf文件中看到了官网的地址cpp…

前端性能优化:高在性能,大在范围,必要前置知识一网打尽!(下)

前言 在上一篇 前端性能优化&#xff1a;高在性能&#xff0c;大在范围&#xff0c;必要前置知识一网打尽&#xff01;&#xff08;上&#xff09; 一文中介绍了和前端性能优化相关的一些前置知识&#xff0c;那么本篇就针对优化方案进行总结&#xff0c;核心的方向还是上篇文…

C++基础(6)——类和对象(4)

前言 本文主要介绍了C中运算符重载的基本知识。 4.5.1&#xff1a;加号运算符重载&#xff08;成员函数和全局函数都可实现&#xff09; 运算符重载&#xff1a;对已有的运算符重新进行定义&#xff0c;赋予其另一种功能&#xff0c;以适应不同的数据类型 1&#xff1a;成员…

管理类联考——写作——素材篇——论说文——写作素材03——志篇:逆境·考验04——志篇:初心

管理类专业学位联考 (写作能力) 论说文素材 03——志篇&#xff1a;逆境考验 论文说材料: 逆境是天才的进身之阶&#xff1b;信徒的洗礼之水&#xff1b;能人的无价之宝&#xff1b; 弱者的无底之渊。 ——巴尔扎克 一&#xff1a;道理论据 不是一番寒彻骨&#xff0c;怎得…

【Azure】微软 Azure 基础解析(九)Azure 标识、身份管理、Azure AD 的功能与用途

本系列博文还在更新中&#xff0c;收录在专栏&#xff1a;「Azure探秘&#xff1a;构建云计算世界」 专栏中。 本系列文章列表如下&#xff1a; 【Azure】微软 Azure 基础解析&#xff08;三&#xff09;云计算运营中的 CapEx 与 OpEx&#xff0c;如何区分 CapEx 与 OpEx 【A…

测量设备频宽范围选择要素—系统响应速度

系统响应速度是输入信号经过电压/电流驱动系统输出响应的幅值升到终值过程的斜率&#xff0c;而上升时间是系统响应速度的一种度量&#xff0c;上升时间越短&#xff0c;响应速度越快。 由一阶系统响应定义中&#xff0c;稳定的一阶系统上升时间 定义是响应从终值10%上升到终值…

git常用命令合集(建议收藏)

1、git init将本文件夹初始化成一个本地git仓库 2、git clone&#xff07;xxx&#xff07;将github上的远程克隆到本地 3、git add [file1] [file2] 添加文件到暂存区&#xff0c;包括修改的文件、新增的文件 4、git add [dir] 添加目录到暂存区&#xff0c;包括子目录 5、…

java 类之间相互引用实例探索

本文记录一下自己对类之间相互引用的探索&#xff0c;如有错误&#xff0c;希望不吝赐教 问题一&#xff1a;类之间相互引用依赖会不会引用死循环 不会&#xff0c;例如&#xff1a;A类中声明一个B类的引用&#xff0c;B类中也声明一个A类的引用&#xff0c;因为类之间的引用相…

TCP为什么要三次握手与四次分手?

概要 TCP协议是五层协议中运输层的协议&#xff0c;下面依赖网络层、链路层、物理层&#xff0c;对于一个报文想发到另一台机器(假设是服务器)上对等层&#xff0c;每一个所依赖的层都会对报文进行包装&#xff0c;例如TCP协议就依赖网络层的IP协议&#xff0c;所以发送的报文会…

【数据库数据恢复】SQL Server数据表结构损坏的数据恢复案例

数据库故障&分析&#xff1a; SQL server数据库数据无法读取。 经过初检&#xff0c;发现SQL server数据库文件无法被读取的原因是因为底层File Record被截断为0&#xff0c;无法找到文件开头&#xff0c;数据表结构损坏。镜像文件的前面几十M空间和中间一部分空间被覆盖掉…

大专毕业,干了 3 年外包,废了····

如果不是女朋友和我提分手&#xff0c;我估计到现在还是外包公司呆着 大专生&#xff0c;19年通过校招进入湖南某软件公司&#xff0c;干了接近3年的点点点&#xff08;功能测试&#xff09;&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在…

VSCode借助Remote-SSH扩展,远程调试linux系统的机器人

本文主要介绍使用VSCode借助Remote-SSH扩展&#xff0c;远程调试linux系统的机器人的方法 在我之前的文章&#xff1a; ROS主机搭建NFS服务器&#xff0c;虚拟机通过挂载访问及修改主机文件 中介绍了采用挂载到的方式进行远程调试的方法&#xff0c;本文将介绍另一种方法&#…

汽车三高试验离不开的远程试验管理平台——TFM

一 背景 众所周知&#xff0c;车辆在量产之前都要经过长时间的耐久性试验和多种汽车适应性或法规试验。道路试验就是在汽车上装设测试仪表和施加模拟载荷&#xff0c;并按实际使用条件来进行测试。此外&#xff0c;在实际试验场地和试验时间上也是有一定规定的。企业根据不同的…