时不我待(第十八课)项目环境搭建

news2025/1/11 8:01:53

 后台管理的项目搭建过程(第一课)

1
2

3

 第一部分 认识项目的搭配环境开发

4
5

6

7

 第二部分  项目的创建需要的环境依赖如下

  1. Element - The world's most popular Vue UI framework   ElementUl组件库
  2. Sass世界上最成熟、稳定和强大的CSS扩展语言 | Sass中文网      Sass预处理器
  3. Sass世界上最成熟、稳定和强大的CSS扩展语言 | Sass中文网]    Less预处理器
  4. CSS Tools: Reset CSS  Css样式重置
  5. Font Awesome,一套绝佳的图标字体库和CSS框架     图标库的使用
  6.  npm i -S axios  axiox 网络请求的知识    Vue(第十七课)AXIOS对JSON数据的增删改查_星辰镜的博客-CSDN博客
  7. npm i vue-router -S 路由的安装   Vue3框架中路由的使用和局部刷新的功能(第十一课)_星辰镜的博客-CSDN博客_vue3 路由局部刷新
  8. json-server 的安装   Vue(第十六课)JSON-SERVE和POSTMAN技术中对数据的增删改查_星辰镜的博客-CSDN博客
  9. Vue框架学习(第十三课)Vuex状态管理中的store和state属性_星辰镜的博客-CSDN博客_vue store  状态管理 vuex

本案例的安装不在示范 之前有说到

App.vue

<template>
  <div>首页</div>
  <!-- 路由出口 -->
  <router-view/>
</template>

<style lang="scss">

</style>

Main.js

import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
// 引用elementui组件库
// import ElementPlus from 'element-plus'
// import 'element-plus/dist/index.css'
// 引用elementui组件库
// .use(ElementPlus)
createApp(App).use(store).use(router).mount('#app')

index.ts

 data.json

{
    "students": [
      {
        "name": "我修改的数据",
        "age": "27",
        "id": 1003
      },
      {
        "id": 1004,
        "name": "王者荣耀",
        "sex": "男",
        "height": "190",
        "weight": "67",
        "job": "Web开发工程师"
      },
      {
        "name": "硝酸",
        "sex": "男",
        "height": "178",
        "weight": "58",
        "job": "前端开发工程师",
        "id": 1005
      },
      {
        "name": "小黄入",
        "sex": "男",
        "height": "198",
        "weight": "78",
        "job": "王者",
        "id": 1006
      },
      {
        "name": "小黄",
        "sex": "男",
        "height": "198",
        "weight": "78",
        "job": "王者",
        "id": 1007
      },
      {
        "name": "小黄",
        "sex": "男",
        "height": "198",
        "weight": "78",
        "job": "王者",
        "id": 1008
      },
      {
        "name": "小黄",
        "sex": "男",
        "height": "198",
        "weight": "78",
        "job": "王者",
        "id": 1011
      },
      {
        "id": 1012
      },
      {
        "name": "小黄",
        "sex": "男",
        "height": "198",
        "weight": "78",
        "job": "王者",
        "id": 1013
      },
      {
        "name": "我是增加的数据在studens中",
        "sex": "男",
        "height": "200",
        "weight": "18",
        "job": "吃鸡",
        "id": 1014
      },
      {
        "name": "AAA",
        "sex": "男",
        "height": "198",
        "weight": "78",
        "job": "王者",
        "id": 1015
      }
    ],
    "teachers": [
      {
        "id": 102,
        "name": "王米",
        "sex": "女",
        "subject": "前端开发工程师"
      },
      {
        "id": 104
      },
      {
        "name": "我是数据",
        "sex": "男",
        "subject": "墙隔断",
        "id": 105
      },
      {
        "name": "小明",
        "sex:男": "",
        "subject:随口": "",
        "id": 106
      },
      {
        "name": "我叫立尚三",
        "sex:男": "",
        "subject:王者荣耀": "",
        "id": 107
      },
      {
        "name": "我叫李珊四",
        "sex:男": "",
        "subject:王者荣耀": "",
        "id": 108
      }
    ],
    "profile": {
      "name": "typicode"
    }
    
  
    
  }

store/index.ts

import { createStore } from 'vuex'

export default createStore({
  state: {
  },
  getters: {
  },
  mutations: {
  },
  actions: {
  },
  modules: {
  }
})

<template>
  <el-form
    ref="ruleFormRef"
    :model="ruleForm"
    status-icon
    :rules="rules"
    label-width="120px"
    class="demo-ruleForm"
  >
    <el-form-item label="Password" prop="pass">
      <el-input v-model="ruleForm.pass" type="password" autocomplete="off" />
    </el-form-item>
    <el-form-item label="Confirm" prop="checkPass">
      <el-input
        v-model="ruleForm.checkPass"
        type="password"
        autocomplete="off"
      />
    </el-form-item>
    <el-form-item label="Age" prop="age">
      <el-input v-model.number="ruleForm.age" />
    </el-form-item>
    <el-form-item>
      <el-button type="primary" @click="submitForm(ruleFormRef)"
        >Submit</el-button
      >
      <el-button @click="resetForm(ruleFormRef)">Reset</el-button>
    </el-form-item>
  </el-form>
</template>

<script lang="ts" setup>
import { reactive, ref } from 'vue'
import type { FormInstance } from 'element-plus'

const ruleFormRef = ref<FormInstance>()

const checkAge = (rule: any, value: any, callback: any) => {
  if (!value) {
    return callback(new Error('Please input the age'))
  }
  setTimeout(() => {
    if (!Number.isInteger(value)) {
      callback(new Error('Please input digits'))
    } else {
      if (value < 18) {
        callback(new Error('Age must be greater than 18'))
      } else {
        callback()
      }
    }
  }, 1000)
}

const validatePass = (rule: any, value: any, callback: any) => {
  if (value === '') {
    callback(new Error('Please input the password'))
  } else {
    if (ruleForm.checkPass !== '') {
      if (!ruleFormRef.value) return
      ruleFormRef.value.validateField('checkPass', () => null)
    }
    callback()
  }
}
const validatePass2 = (rule: any, value: any, callback: any) => {
  if (value === '') {
    callback(new Error('Please input the password again'))
  } else if (value !== ruleForm.pass) {
    callback(new Error("Two inputs don't match!"))
  } else {
    callback()
  }
}

const ruleForm = reactive({
  pass: '',
  checkPass: '',
  age: '',
})

const rules = reactive({
  pass: [{ validator: validatePass, trigger: 'blur' }],
  checkPass: [{ validator: validatePass2, trigger: 'blur' }],
  age: [{ validator: checkAge, trigger: 'blur' }],
})

const submitForm = (formEl: FormInstance | undefined) => {
  if (!formEl) return
  formEl.validate((valid) => {
    if (valid) {
      console.log('submit!')
    } else {
      console.log('error submit!')
      return false
    }
  })
}

const resetForm = (formEl: FormInstance | undefined) => {
  if (!formEl) return
  formEl.resetFields()
}
</script>

main.css



/* http://meyerweb.com/eric/tools/css/reset/
   v2.0 | 20110126
   License: none (public domain)
*/
 
html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
b, u, i, center,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td,
article, aside, canvas, details, embed,
figure, figcaption, footer, header, hgroup,
menu, nav, output, ruby, section, summary,
time, mark, audio, video {
	margin: 0;
	padding: 0;
	border: 0;
	font-size: 100%;
	font: inherit;
	vertical-align: baseline;
}
/* HTML5 display-role reset for older browsers */
article, aside, details, figcaption, figure,
footer, header, hgroup, menu, nav, section {
	display: block;
}
body {
	line-height: 1;
}
ol, ul {
	list-style: none;
}
blockquote, q {
	quotes: none;
}
blockquote:before, blockquote:after,
q:before, q:after {
	content: '';
	content: none;
}
table {
	border-collapse: collapse;
	border-spacing: 0;
}
html, body {
  width: 100%;
  height: 100%;
  font-family: 'PingFangSC-Light', 'PingFang SC', 'STHeitiSC-Light', 'Helvetica-Light', 'Arial', 'sans-serif';
}

serviceAxios.js

import axios from 'axios'

// 创建拦截器
const service=axios.create()
// 请求拦截和响应拦截
// 添加请求拦截器
axios.interceptors.request.use(function (config) {
    // 在发送请求之前做些什么
    return config;
  }, function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
  });

// 添加响应拦截器
axios.interceptors.response.use(function (response) {
    // 2xx 范围内的状态码都会触发该函数。
    // 对响应数据做点什么
    return response;
  }, function (error) {
    // 超出 2xx 范围的状态码都会触发该函数。
    // 对响应错误做点什么
    return Promise.reject(error);
  });


  export default service

登录注册的样式

<style lang="scss">
.login-con {
  align-content: center;
  margin: auto;
  display: flex;
}

.menu-tab {
  li {
    display: line-break;
    justify-content: center;
    width: 100px;
    height: 55px;
    font-size: 30px;
    line-height: 55px;
    font-size: 14px;
    text-align: center;
    color: rgb(255, 0, 21);
    border-radius: 12px;
    cursor: pointer;
  }
}
.current {
  
  width: 200px;
  font-size: 16px;
  font-weight: 600;
  color: rgb(0, 255, 72);
  cursor: pointer;
  margin: 20px;
  height: 55px;
  line-height: 55px;
  text-align: center;
  border: none;
  background-size: 300% 100%;
  border-radius: 50px;
  // transition: all 0.4s ease-in-out;
  background-image: linear-gradient(
    to right,
    #25aae1,
    #4481eb,
    #04befe,
    #3f86ed
  );
  box-shadow: 0 4px 15px 0 rgba(65, 132, 234, 0.75);
}
.demo-ruleForm {
  width: 30%;
  margin: 50px auto;
  label {
    display: block;
    margin-bottom: 3px;
    font-size: 14px;
    color: rgb(13, 195, 255);
  }
}
.block {
  display: block;
  width: 100%;
  border-radius: 12px;
}
.login-btn {
  margin-top: 20px;
}
h1 {
  font-weight: 900;
  text-align: center;
  
}
.big {
  width: 100%;
  height: 100px;
  color: black;
}
.big .son {
  margin: auto;
  width: 60%;
  height: 100px;
  color: rgb(9, 1, 1);
}
</style>
<template>
  <div class="big">
    <div class="big son">
      <div class="login">
        <div class="login-con">
          <ul class="menu-tab">
            <li
              v-for="v in MenuData"
              :class="{ current: v.current }"
              :key="v.type"
              @click="clickMenu(v)"
            >
              {{ v.txt }}
            </li>
          </ul>
        </div>
      </div>
    </div>
  </div>
 <!-- 表单部分 -->
  <el-form
    ref="ruleFormRef"
    :model="ruleForm"
    status-icon
    :rules="rules"
    class="demo-ruleForm"
  >
    <h1 v-show="model === 'register'">注册页面</h1>
    <h1 v-show="model === 'login'">登录页面</h1>
    <el-form-item prop="Name" v-show="model === 'register'">
      <label>用户名</label>
      <el-input v-model="ruleForm.Name" type="text" autocomplete="off" />
    </el-form-item>

    <el-form-item prop="Phone" v-show="model === 'register'">
      <label>手机号</label>
      <el-input v-model="ruleForm.Phone" type="text" autocomplete="off" />
    </el-form-item>
    <!--  -->
    <el-form-item prop="username">
      <label>邮箱</label>
      <el-input v-model="ruleForm.username" type="text" autocomplete="off" />
    </el-form-item>
    <el-form-item prop="password">
      <label>密码</label>
      <el-input
        v-model="ruleForm.password"
        type="password"
        autocomplete="off"
      />
    </el-form-item>
    <el-form-item prop="passwords" v-show="model === 'register'">
      <label>重复密码</label>
      <el-input v-model.number="ruleForm.passwords" />
    </el-form-item>

    <el-form-item>
      <el-button
        type="primary"
        class="login-btn block"
        @click="submitForm(ruleFormRef)"
        >{{ model === "login" ? "登录按钮" : "注册按钮" }}</el-button
      >
      <el-button @click="resetForm(ruleFormRef)" class="login-btn block"
        >按钮重置</el-button
      >
    </el-form-item>
  </el-form>
</template>
<script lang="ts" setup>
// 创建复杂数据的类型

import { reactive, ref, onMounted } from "vue";
import type { FormInstance } from "element-plus";
import * as ck from "../../util/verfifcation.js";
import link from "../../api/Link.js";
import apiUrl from "../../api/url.js";
const ruleFormRef = ref<FormInstance>();

onMounted(() => {
  console.log(process.env.VUE_APP_API);
});

const MenuData = reactive([
  { txt: "登录", current: false, type: "login" },
  { txt: "注册", current: false, type: "register" },
]);

let model = ref("login");

let clickMenu = (item: any) => {
  MenuData.forEach((elemt) => {
    elemt.current = false;
  });
  item.current = true;

  // 修改状态
  model.value = item.type;
};

//表单模块

// 用户名正则验证
const checkuserName = (rule: any, value: any, callback: any) => {
  let reg = /^[\w-]{4,16}$/;
  if (!value) {
    return callback(new Error("用户名不能为空!"));
  } else if (!reg.test(value)) {
    return callback(new Error("用户你好你输入的用户名格式步正确"));
  } else {
    callback();
  }
};

//手机号验证
const checkuserPhone = (rule: any, value: any, callback: any) => {
  if (!value) {
    return callback(new Error("手机号的不能为空!"));
  } else if (ck.ckPhone(value)) {
    return callback(new Error("用户你好你输入的手机号格式步正确"));
  } else {
    callback();
  }
};

//邮箱
const checkuser = (rule: any, value: any, callback: any) => {
  if (!value) {
    return callback(new Error("邮箱的不能为空!"));
  } else if (ck.CkEmail(value)) {
    return callback(new Error("用户你好你输入的邮箱格式步正确"));
  } else {
    callback();
  }
};

// 密码的正则表达式
const validatePass = (rule: any, value: any, callback: any) => {
  if (value === "") {
    callback(new Error("密码不能为空"));
  } else if (ck.CkPass(value)) {
    callback(new Error("用户输入的密码格式有误请重新输入"));
  } else {
    callback();
  }
};
const validatePass2 = (rule: any, value: any, callback: any) => {
  // 因为登录的时候没有密码的核对  所以在登录的时候曲线重复的代码核对
  if (model.value === "login") {
    callback();
  }
  if (value === "") {
    callback(new Error("用户重复的密码不能为空"));
  } else if (value !== ruleForm.password) {
    callback(new Error("俩次输入密码必须相同"));
  } else {
    callback();
  }
};

const ruleForm = reactive({
  Name: "",
  Phone: "",
  username: "",
  password: "",
  passwords: "",
  pass: "",
  checkPass: "",
  age: "",
});

// 设置以那种方式发生函数
const rules = reactive({
  password: [{ validator: validatePass, trigger: "blur" }],
  passwords: [{ validator: validatePass2, trigger: "blur" }],
  username: [{ validator: checkuser, trigger: "blur" }],
  Name: [{ validator: checkuserName, trigger: "blur" }],
  Phone: [{ validator: checkuserPhone, trigger: "blur" }],
});

// 注册
const submitForm = (formEl: FormInstance | undefined) => {
  if (!formEl) return;
  formEl.validate((valid) => {
    if (valid) {
      console.log("submit!");

      link(apiUrl).then((ok: any) => {
        console.log(ok);
      });
    } else {
      console.log("error submit!");
      return false;
    }
  });
};

const resetForm = (formEl: FormInstance | undefined) => {
  if (!formEl) return;
  formEl.resetFields();
};
</script>





<style lang="scss">
@import "./src/styles/reset.scss";
</style>

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

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

相关文章

【数据结构】- 数组

数组基础1.1 什么是数组1.2 数组特点无法动态修改容量内存中顺序存储2. 基本操作2.1 结构2.2 添加元素 - add(E element)、add(int index, E element)代码实现2.3 删除元素 - remove(int index)、清空数组 - clear()代码实现2.4 扩容 - ensureCapacity(int capacity)3. 代码基础…

[附源码]Python计算机毕业设计SSM基于移动端的药方收集系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

在Mac系统下搭建Selenium环境并驱动Chrome浏览器

本文带领那些使用Mac的童鞋们实现Selenium驱动Chrome浏览器&#xff0c;虽然会有坑&#xff0c;但是我们可以凭借敏捷的身手躲过。下面就开始吧&#xff1a; 安装selenium 打开终端 ->pip安装&#xff08;安装命令&#xff1a;pip3 install selenium&#xff09; 安装浏览…

windows 安装paddleocr(CPU)

下载anaconda 注意需要下载64位&#xff08;x86_64结尾的版本) https://mirrors.bfsu.edu.cn/anaconda/archive/ conda create -n OCR python3.9成功 conda activate OCR添加环境变量&#xff0c;cmd才可以识别conda 安装paddlepaddle(有独立显卡的才能安装GPU版本&#x…

双十二电容笔啥牌子好?十大电容笔知名品牌

要为ipad配备一款电容笔&#xff0c;如果你觉得苹果原装的电容笔的价格要比你的预算高得多。而平替电容笔&#xff0c;就是最好的选择了。可以想象&#xff0c;一支原版的苹果电脑容&#xff0c;可以买四支平替电容笔&#xff0c;而平替电容笔的性能并不比苹果的电容笔差多少。…

期末前端web大作业:餐饮美食网站设计与实现——HTML+CSS+JavaScript美食餐饮网站 3页面

&#x1f468;‍&#x1f393;静态网站的编写主要是用HTML DIVCSS JS等来完成页面的排版设计&#x1f469;‍&#x1f393;,常用的网页设计软件有Dreamweaver、EditPlus、HBuilderX、VScode 、Webstorm、Animate等等&#xff0c;用的最多的还是DW&#xff0c;当然不同软件写出的…

【考研数据】四.2023年BJTU计算机学院考研录取数据分析(实时更新)

欢迎订阅本专栏:《北交计算机复试经验》 订阅地址:https://blog.csdn.net/m0_38068876/category_12110003.html 【考研数据】一.2020年BJTU计算机学院考研录取数据分析【考研数据】二.2021年BJTU计算机学院考研录取数据分析【考研数据】三.2022年BJTU计算机学院考研录取数据分…

苹果传数据到苹果手机?iPhone怎么数据传输

苹果传数据到苹果手机&#xff1f;很多朋友在换新iPhone的时候都很焦愁&#xff0c;旧手机里面的数据太多&#xff0c;去苹果店让工作人员帮忙迁移&#xff0c;估计要花费很多时间等待&#xff0c;而且没手机的那段时间特别难熬&#xff1b;自己动手弄&#xff0c;不知道简单的…

优秀程序员评判标准“高并发”,竟被一份Github万星笔记讲清楚了

处处需要高并发 ​“为什么Java面试必问高并发&#xff1f;” 这个问题已经让程序员们倍感头疼&#xff0c;尤其是想要跳槽到更大公司的程序员&#xff0c;能否漂亮的回答高并发的问题已经成为求职者是否是一个优秀程序员的评判标准&#xff0c;大厂面试尤为明显。 不得不说&a…

JAVA中数值类型转换

文章目录1 问题引入2 查看问题3 注意事项1 问题引入 经常需要将一种数值类型转换为另一种数值类型&#xff1b; 例如13.72—>整型浮点型。结果为4.72没问题&#xff0c;可是会有一些精度的问题。 2 查看问题 请看以下代码&#xff1a; int n 987654321;float f n;此时…

java计算机毕业设计ssm学生谈话管理系统2j3ws(附源码、数据库)

java计算机毕业设计ssm学生谈话管理系统2j3ws&#xff08;附源码、数据库&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff0…

第十四届蓝桥杯集训——JavaC组——运算符练习题

第十四届蓝桥杯集训——JavaC组——运算符练习题 为了能让大家更好的掌握四则运算、取模运算、关系运算以及逻辑计算&#xff0c;当然还有必不可少的三元运算符&#xff0c;这里准备了几个小题&#xff0c;好好练习一下一定能掌握的不错。 所有的小题都有对照的答案&#xff0…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java红旗家具城管理系统29a0m

做毕业设计一定要选好题目。毕设想简单&#xff0c;其实很简单。这里给几点建议&#xff1a; 1&#xff1a;首先&#xff0c;学会收集整理&#xff0c;年年专业都一样&#xff0c;岁岁毕业人不同。很多人在做毕业设计的时候&#xff0c;都犯了一个错误&#xff0c;那就是不借鉴…

电力预测|基于新型MDPSO-SVR混合模型的电力预测特征选择(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f389;作者研究&#xff1a;&#x1f3c5;&#x1f3c5;&#x1f3c5;主要研究方向是电力系统和智能算法、机器学…

中国能源统计数据1986-2020和省级能源结构(含计算步骤)

1、数据来源&#xff1a;中国能源统计数据 2、时间跨度&#xff1a;中国能源统计数据1986-2020年 、2003-2018年省级能源结构 3、区域范围&#xff1a;全国 4、指标说明&#xff1a; 中国能源统计数据版本说明 Excel&#xff1a;2020、2019、2018、2017、2016、2015、2014…

【我的C/C++语言学习进阶之旅】C++编程常出现错误:Undefined Reference的一些常见情况分析

本教程详细介绍了程序员在 C 中经常遇到的严重错误&#xff0c;如&#xff1a; Undefined referenceSegmentation fault (core dumped)Unresolved external symbol 我们将讨论我们在C 中经常遇到的最重要的错误确实至关重要。除了不时发生的系统以及语义错误和异常外&#xf…

2023最新版网络安全图成长路线图,从零基础到精通

01 什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防两面…

这8个实用office技巧,让你的工作效率快人一步,建议收藏保存

大家平常使用office的时候&#xff0c;有没有发现一些小技巧呢&#xff1f;我整理了8个office技巧分享给大家&#xff0c;总有一个你能用得到&#xff0c;对提高我们的工作效率很有帮助哒。技巧一&#xff1a;合并多个Word文件如果大家需要在收集资料的时候&#xff0c;需要将多…

双功能螯合剂:2374782-03-1,NOTA-FAPI-04 ,NOTA-FAPI-4

NOTA-FAPI-04&#xff0c;NTFAPI-04&#xff0c;NOTA-FAPI-4 产品规格&#xff1a; 1.CAS号&#xff1a;2374782-03-1 2.分子式&#xff1a;C36H47F2N9O8 3.分子量&#xff1a;771.8238 4.包装规格&#xff1a;1g&#xff0c;5g&#xff0c;10g&#xff0c;包装灵活&#xf…

双向链表与DFS的Unix文件储存程序

title: 双向链表与DFS的Unix文件储存程序 date: 2021-11-28 12:39:26 tags: [链表][DFS] categories:[码农日常] 写在前面 这是一篇关于python编写的小型文件储存程序&#xff0c;旨在于模拟Unix下ls、cd等的命令&#xff0c;在整一个中文互联网世界中&#xff0c;很难找到这样…