【javaweb】学习日记Day3 - Ajax 前后端分离开发 入门

news2024/11/16 0:53:02

目录

一、Ajax

1、简介

2、Axios (没懂 暂留)

(1)请求方式别名

(2)发送get请求

(3)发送post请求

(4)案例

二、前端工程化

1、Vue项目-目录结构

2、Vue项目-启动

(1)vscode页面启动

(2)cmd命令框启动

3、配置Vue端口号

4、Vue项目开发流程

三、Vue组件库 - Element 

1、快速入门

(1)在main.js引入ElementUI组件库

(2)根据文档选择想要的皮肤 复制代码 

2、常用组件介绍

(1)Table 表格标签

(2)Pagination 分页标签

(3)Dialog  对话框

(4)Form  表单

(5)案例

四、Vue路由

1、概念

2、案例

① 配置路由路径

② 给侧栏标签添加标签

③ 在APP.vue添加 

五、打包部署


一、Ajax

1、简介

  • 概念:异步的JavaScript和XML
  • 作用:
    • 数据交换:通过Ajax可以给服务器发送请求,并获取服务器响应数据
    • 异步交互:可以在不重新加载整个页面情况下,与服务器交换数据并更新部分网页端技术,如:搜索框联想功能,校验用户名

2、Axios (没懂 暂留)

(1)请求方式别名

  • axios.get(url[,config])
  • axios.delete(url[,config])
  • axios.post(url[,data,config])
  • axios.put(url[,data,config])

(2)发送get请求

axios.get("http://yapi.smart-xwork.cn/mock/169327/emp/list").then(result=>{
        console.log(request.data);
})

(3)发送post请求

axios.post("http://yapi.smart-xwork.cn/mock/169327/emp/list","id=1").then(result=>{
            console.log(request.data);
})
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Ajax-Axios</title>
    <script src="axios-0.18.0.js"></script>
</head>
<body>
    
    <input type="button" value="获取数据GET" onclick="get()">

    <input type="button" value="删除数据POST" onclick="post()">

</body>

<script>
    function get(){
        //通过axios发送异步请求-get

        axios.get("http://yapi.smart-xwork.cn/mock/169327/emp/list").then(result=>{
            console.log(request.data);
        })

        // axios(
        //     {
        //         method:"get",
        //         url:"http://yapi.smart-xwork.cn/mock/169327/emp/list"
        //     }).then(result=>{
        //         console.log(request.data);
        //     })
    }

    function post(){
        //通过axios发送异步请求-post

        axios.post("http://yapi.smart-xwork.cn/mock/169327/emp/list","id=1").then(result=>{
            console.log(request.data);
        })

        // axios(
        //     {
        //         method:post,
        //         url:"http://yapi.smart-xwork.cn/mock/169327/emp/list",
        //         data:"id=1"
        //     }).then(result=>{
        //         console.log(request.data);
        //     })
    }
</script>
</html>

(4)案例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Ajax-Axios-案例</title>

    <script src="js/axios-0.18.0.js"></script>
    <script src="js/vue.js"></script>
    
</head>
<body>
    <div id="app">
        <table border="1" cellspacing="0" width="60%">
            <tr>
                <th>编号</th>
                <th>姓名</th>
                <th>图像</th>
                <th>性别</th>
                <th>职位</th>
                <th>入职日期</th>
                <th>最后操作时间</th>
            </tr>

            <tr align="center" v-for="(emp,index) in emps">
                <td>{{index + 1}}</td>
                <td>{{emp.name}}</td>
                <td>
                    <img :src="emp.image" width="70px" height="50px">
                </td>
                <td>
                    <span v-if="emp.gender == 1">男</span>
                    <span v-if="emp.gender == 2">女</span>
                </td>
                <td>{{emp.job}}</td>
                <td>{{emp.entrydate}}</td>
                <td>{{emp.updatetime}}</td>
            </tr>
        </table>
    </div>
</body>
<script>
    new Vue({
       el: "#app",
       data: {
         emps:[]
       },
       mounted () {
          //发送异步请求,加载数据
          axios.get("http://yapi.smart-xwork.cn/mock/169327/emp/list").then(result => {
            this.emps = result.data.data;
          })
       }
    });
</script>
</html>

二、前端工程化

1、Vue项目-目录结构

2、Vue项目-启动

(1)vscode页面启动

(2)cmd命令框启动

npm run serve

3、配置Vue端口号

4、Vue项目开发流程

 Vue组件文件以.vue结尾,每个组件由三部分组成

  • <template>    模板部分,生成HTML代码
  • <script> 控制模板的数据来源和行为
  • <style> css样式部分
<template>
  <div id="app">
    <h1>{{message}}</h1>
  </div>
</template>

<script>
export default{   //设置导出模块 可以在别处用import导入
  data()
  {
    return {
      message:"坚持不懈哇哇!"
    }
  },
  methods:
  {

  }
}
</script>

<style>
  #app{
    text-align: center;
    color: cadetblue;
  }
</style>

三、Vue组件库 - Element 

Element 是优化版组件库(也就是炫彩ui组件皮肤)

1、快速入门

(1)在main.js引入ElementUI组件库

//引入Element ui组件
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';

Vue.use(ElementUI);

(2)根据文档选择想要的皮肤 复制代码 

Element官方文档入口!Element - The world's most popular Vue UI framework

2、常用组件介绍

Alt+Shift+F 自动格式化!!!

(1)Table 表格标签

表格戳这→Element - The world's most popular Vue UI framework

<template>
  <div>
    <el-table :data="tableData" border style="width: 100%">
      <el-table-column prop="date" label="日期" width="180"> </el-table-column>
      <el-table-column prop="name" label="姓名" width="180"> </el-table-column>
      <el-table-column prop="address" label="地址"> </el-table-column>
    </el-table>
  </div>
</template>

<script>
export default {
  data() {
    return {
      tableData: [
        {
          date: "2016-05-02",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1518 弄",
        },
        {
          date: "2016-05-04",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1517 弄",
        },
        {
          date: "2016-05-01",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1519 弄",
        },
        {
          date: "2016-05-03",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1516 弄",
        },
      ],
    };
  },
};
</script>

<style>
</style>

(2)Pagination 分页标签

分页戳这→Element - The world's most popular Vue UI framework

<template>
  <div>
    <el-pagination layout="sizes,prev, pager, next,jumper,total" 
        @size-change="handleSizeChange"
        @current-change="handleCurrentChange"
    :total="1000"> 
    </el-pagination>
  </div>
</template>

<script>
export default {
  data() {
    return {
      
    };
  },
  methods: {
    handleSizeChange(x){
        alert("每页记录数变化"+x)
    },
    handleCurrentChange(x)
    {
        alert("页码发生变化"+x)
    }
  }
};
</script>

<style>
</style>

(3)Dialog  对话框

对话框戳这→Element - The world's most popular Vue UI framework

<template>
  <div>
    <el-button type="text" @click="dialogTableVisible = true">打开嵌套表格的 Dialog</el-button>

    <el-dialog title="收货地址" :visible.sync="dialogTableVisible">
      <el-table :data="gridData">
        <el-table-column
          property="date"
          label="日期"
          width="150"
        ></el-table-column>
        <el-table-column
          property="name"
          label="姓名"
          width="200"
        ></el-table-column>
        <el-table-column property="address" label="地址"></el-table-column>
      </el-table>
    </el-dialog>
  </div>
</template>

<script>
export default {
  data() {
    return {
      gridData: [
        {
          date: "2016-05-02",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1518 弄",
        },
        {
          date: "2016-05-04",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1518 弄",
        },
        {
          date: "2016-05-01",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1518 弄",
        },
        {
          date: "2016-05-03",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1518 弄",
        },
      ],
      dialogTableVisible: false,
    };
  },
  methods: {
    handleSizeChange(x) {
      alert("每页记录数变化" + x);
    },
    handleCurrentChange(x) {
      alert("页码发生变化" + x);
    },
  },
};
</script>

<style>
</style>

(4)Form  表单

 表单戳这→Element - The world's most popular Vue UI framework

<template>
  <div>
    <el-button type="text" @click="dialogTableVisible = true">打开嵌套表单的Dialog</el-button>

    <el-dialog title="填写详情" :visible.sync="dialogTableVisible">
        <el-form ref="form" :model="form" label-width="80px">

            <el-form-item label="活动名称">
              <el-input v-model="form.name"></el-input>
            </el-form-item>

            <el-form-item label="活动区域">
              <el-select v-model="form.region" placeholder="请选择活动区域">
                <el-option label="区域一" value="shanghai"></el-option>
                <el-option label="区域二" value="beijing"></el-option>
              </el-select>
            </el-form-item>

            <el-form-item label="活动时间">
              <el-col :span="11">
                <el-date-picker type="date" placeholder="选择日期" v-model="form.date1" style="width: 100%;"></el-date-picker>
              </el-col>
              <el-col class="line" :span="2">-</el-col>
              <el-col :span="11">
                <el-time-picker placeholder="选择时间" v-model="form.date2" style="width: 100%;"></el-time-picker>
              </el-col>
            </el-form-item>

            <el-form-item label="即时配送">
              <el-switch v-model="form.delivery"></el-switch>
            </el-form-item>

            <el-form-item label="活动性质">
              <el-checkbox-group v-model="form.type">
                <el-checkbox label="美食/餐厅线上活动" name="type"></el-checkbox>
                <el-checkbox label="地推活动" name="type"></el-checkbox>
                <el-checkbox label="线下主题活动" name="type"></el-checkbox>
                <el-checkbox label="单纯品牌曝光" name="type"></el-checkbox>
              </el-checkbox-group>
            </el-form-item>

            <el-form-item label="特殊资源">
              <el-radio-group v-model="form.resource">
                <el-radio label="线上品牌商赞助"></el-radio>
                <el-radio label="线下场地免费"></el-radio>
              </el-radio-group>
            </el-form-item>

            <el-form-item label="活动形式">
              <el-input type="textarea" v-model="form.desc"></el-input>
            </el-form-item>

            <el-form-item>
              <el-button type="primary" @click="onSubmit">立即创建</el-button>
              <el-button>取消</el-button>
            </el-form-item>

          </el-form>
    </el-dialog>
  </div>
</template>

<script>
export default {
  data() {
    return {
        form: {
          name: '',
          region: '',
          date1: '',
          date2: '',
          delivery: false,
          type: [],
          resource: '',
          desc: ''
        },
        dialogTableVisible:false,
        dialogFormVisible:false,
    };
  },
  methods: {
    onSubmit(){
        alert(JSON.stringify(this.form))
    }
  },
};
</script>

<style>
</style>

(5)案例

<template>
  <div>
    <el-container style="height: 700px; border: 1px solid #f6bcbc">
      <el-header style="font-size: 40px; background-color: #f8d7d7"
        >智能容宝学习辅助系统</el-header
      >
      <el-container>
        <!-- 边框 -->
        <el-aside width="200px">
          <el-menu :default-openeds="['1', '3']">
            <el-submenu index="1">
              <template slot="title"
                ><i class="el-icon-message"></i>学员信息管理</template
              >
              <el-menu-item-group>
                <el-menu-item index="1-1">2020届</el-menu-item>
                <el-menu-item index="1-2">2021届</el-menu-item>
              </el-menu-item-group>
            </el-submenu>
          </el-menu>
        </el-aside>

        <!-- 主页面 -->
        <el-main>
          <el-main>
            <!-- 表单 -->
            <el-form :inline="true" :model="searchForm" class="demo-form-inline">
                <el-form-item label="姓名">
                  <el-input v-model="searchForm.name" placeholder="姓名"></el-input>
                </el-form-item>

                <el-form-item label="性别">
                  <el-select v-model="searchForm.sex" placeholder="性别">
                    <el-option label="男" value="boy"></el-option>
                    <el-option label="女" value="girl"></el-option>
                  </el-select>
                </el-form-item>

                <el-form-item>
                  <el-button type="primary" @click="onSubmit">查询</el-button>
                </el-form-item>

                <!-- 日期选择器 -->
                <el-form-item>
                    <el-date-picker v-model="searchForm.date"
                    type="daterange"
                    range-separator="至"
                    start-placeholder="开始日期"
                    end-placeholder="结束日期">
                  </el-date-picker>                  
                </el-form-item>
              </el-form>
<br>
            <!-- 表格 -->
            <el-table :data="tableData" border>
              <el-table-column prop="name" label="姓名" width="160">
              </el-table-column>
              <el-table-column prop="sex" label="性别" width="120">
              </el-table-column>
              <el-table-column prop="class" label="班级" width="200">
              </el-table-column>
              <el-table-column prop="job" label="职务" width="220">
              </el-table-column>
              <el-table-column prop="school" label="学校" width="250">
              </el-table-column>
              <el-table-column prop="date" label="入学日期" width="220">
            </el-table-column>
              <el-button type="primary" round size="mini">编辑</el-button>
              <el-button type="danger" round size="mini">删除</el-button>
            </el-table>
<br>
            <!-- 分页 -->
            <el-pagination
                @size-change="handleSizeChange"
                @current-change="handleCurrentChange"
                :current-page.sync="currentPage1"
                :page-size="1000"
                layout="sizes,prev, pager, next,jumper,total"
                :total="100">
          </el-pagination>
          </el-main>
        </el-main>
      </el-container>
    </el-container>
  </div>
</template>

<script>
import axios from 'axios';

export default {
  data() {
    return {
      tableData: [],
      searchForm:{
        name:"",
        sex:"",
        data:[]
      }
    };
  },
  methods:{
    onSubmit()
    {
        alert(JSON.stringify(this.searchForm))
    },
    handleSizeChange(x){
        alert("每页记录数变化"+x)
    },
    handleCurrentChange(x)
    {
        alert("页码发生变化"+x)
    }
  },
  mounted()  //发送异步请求,获取数据
  {
    axios.get("").then((result)=>{
        this.tableData=result.data.data;
    });
   }
};
</script>

<style>
</style>

四、Vue路由

1、概念

  • <router-link to>    请求链接组件,浏览器会传递到该链接
  • <router-view>   动态视图组件,渲染展示对应路由路径

2、案例

通过Vue路由完成左侧菜单栏点击切换效果

① 配置路由路径

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

Vue.use(VueRouter)

const routes = [
  {
    path: '/emp',
    name: 'emp',
    component: () => import('../views/item 2/EmpView.vue')  },
  {
    path: '/dept',
    name: 'dept',
    component: () => import('../views/item 2/DeptView.vue')
  }
]

const router = new VueRouter({
  routes
})

export default router

② 给侧栏标签添加<router-link to>标签

<el-aside width="230px" style="border: 1px solid #eee">
   <el-menu :default-openeds="['1', '3']">
        <el-submenu index="1">
            <template slot="title"><i class="el-icon-message"></i>系统信息管理</template>

               <el-menu-item index="1-1">
                    <router-link to="/dept">部门管理</router-link>
               </el-menu-item>

               <el-menu-item index="1-2">
                    <router-link to="/emp">员工管理</router-link>
               </el-menu-item>

        </el-submenu>
    </el-menu>
</el-aside>

③ 在APP.vue添加 <router-view>

<template>
  <div>
    <router-view></router-view>
  </div>
</template>

五、打包部署

Day03-16. 打包部署_哔哩哔哩_bilibili

step1:点击允许build,进行打包

step2:此时目录出现dist文件,右键

step3:将dist文件内容复制,粘贴到nginx安装目录下的html目录下

 step4:双击nginx.exe即可,在页面输入localhost:80(端口号)回车即可

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

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

相关文章

IDEA中使用Docker插件构建镜像并推送至私服Harbor

一、开启Docker服务器的远程访问 1.1 开启2375远程访问 默认的dokcer是不支持远程访问的&#xff0c;需要加点配置&#xff0c;开启Docker的远程访问 # 首先查看docker配置文件所在位置 systemctl status docker# 会输出如下内容&#xff1a; ● docker.service - Docker Ap…

如何使用PHP实现多语言网站功能

如何使用PHP实现多语言网站功能 在全球化的今天&#xff0c;开发多语言网站成为了一个必要的需求。PHP作为一种常用的编程语言&#xff0c;可以很方便地实现多语言网站功能。本文将介绍如何使用PHP实现多语言网站功能&#xff0c;并提供相应的代码示例。 一、创建语言文件 首先…

系统集成项目管理工程师【中级】考证学习资料整理分享——第一章《信息化基础知识》,持续更新中........

系统集成项目管理工程师(中级)考证学习资料整理分享,持续更新中........ 第一章 《信息化基础知识》 一、信息与信息化 在充满前所未有的创新活力的同时,信息化正以更快地速度推进生产力的发展,围绕智能制造、云计算、网络空间、移动互联、工业互联、大数据、信息安全等领…

网络安全—黑客—自学笔记

想自学网络安全&#xff08;黑客技术&#xff09;首先你得了解什么是网络安全&#xff01;什么是黑客&#xff01; 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全…

多线程与高并发编程一

文章目录 一、故事背景二、知识点主要构成1、线程的概念2、启动方式2.1、继承Thread类 重写run方法2.2、实现Runnable接口 重写run方法2.3、实现Callable 重写call方法 配合FuterTask获取线程结果 3、常用方法start()方法&#xff1a;run()方法&#xff1a;sleep(long millis)方…

【HCIP】企业网三层架构实验

题目&#xff1a; 拓扑图 配置 LSW1 //链路聚合 [lsw3]interface Eth-Trunk 1 [lsw3-Eth-Trunk1]trunkport GigabitEthernet 0/0/3 0/0/4 [lsw3-Eth-Trunk1]q [lsw3]vlan batch 1 2 [lsw3]interface Eth-Trunk 1 [lsw3-Eth-Trunk1]port link-type trunk [lsw3-Eth-Trunk1]port…

docker中bridge、host、container、none四种网络模式简介

一.bridge模式 1.简介 2.演示 &#xff08;1&#xff09;运行两个容器&#xff0c;不指定网络模式情况下默认是bridge模式 &#xff08;2&#xff09;在主机中自动生成了两个veth设备 &#xff08;3&#xff09;查看两个容器的IP地址 &#xff08;4&#xff09;可以自定义…

基于图卷积网络的知识嵌入8.21

基于图卷积网络的知识嵌入 摘要介绍 摘要 近年来&#xff0c;围绕图卷积网络&#xff08;GCN&#xff09;这一主题出现了大量的文献。如何有效地利用复杂图中丰富的结构信息&#xff08;例如具有heterogeneous types of entities and relations(异构实体和关系类型) 的知识图谱…

深入理解ForkJoin

任务类型 线程池执行的任务可以分为两种&#xff1a;CPU密集型任务和IO密集型任务。在实际的业务场景中&#xff0c;我们需要根据任务的类型来选择对应的策略&#xff0c;最终达到充分并合理地使用CPU和内存等资源&#xff0c;最大限度地提高程序性能的目的。 CPU密集型任务 …

【快速解决方案】浏览器的安全策略不允许通过 file:// 协议直接加载外部文件(最省事的方法)

目录 问题摘要 解决办法 检验结果 问题摘要 Failed to load resource: net::ERR_FILE_NOT_FOUND&#x1f308; Cute Code Editor &#x1f308;.html:162 Fetch API cannot load file:///D:/%E6%A1%8C%E9%9D%A2/%E4%B8%83%E5%A4%95%E5%BF%AB%E4%B9%90/index.txt. URL scheme …

RK3399平台开发系列讲解(内核调试篇)内核中内存泄漏的调试

🚀返回专栏总目录 文章目录 一、Linux 内核内存泄漏二、如何观测内核内存泄漏?三、kmemleak 工具沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 内核内存泄漏往往都会是很严重的问题,那么,我们该如何判断内存泄漏是否是内核导致的呢? 一、Linux 内核内存泄漏 …

003-Nacos 2.1.x 注册实例源码分析

目录 Nacos 2.1.X注册实例入口接口流程Client 注册 事件处理 服务订阅入口 Nacos 2.1.X 注册实例 入口 com.alibaba.nacos.naming.remote.rpc.handler.InstanceRequestHandler#handleService service Service.newService(request.getNamespace(), request.getGroupName(), r…

计算机网络————IP数据报的首部各字段详解(很重要)

目录 1. IP数据报的介绍2. 首部的固定部分的各字段说明2.1 Version&#xff08;版本&#xff09;2.2 IHL&#xff08;首部长度&#xff09;2.3 Type of service&#xff08;区分服务&#xff09;2.4 Total Length&#xff08;总长度&#xff09;2.5 Identification&#xff08;…

企业级即时通讯协作和移动应用管理平台哪个品牌好?

在竞争激烈的商业环境下&#xff0c;高效的企业通讯和协作变得至关重要。WorkPlus作为领先的品牌&#xff0c;专注于提供企业级即时通讯协作和移动应用管理平台。本文将介绍WorkPlus如何成为企业实现协同工作、高效沟通和流程管理的理想解决方案。 一、全面协作加速工作流程&am…

二、1.保护模式

访问外部硬件有两个方式&#xff1a; 将某个外设的内存映射到一定范围的地址空间中&#xff0c; CPU 通过地址总线访问该内存区域时会落到外设 的内存中&#xff0c;这种映射让 CPU 访问外设的内存就如同访问主板上的物理内存一样外设是通过 IO 接口与 CPU 通信的&#xff0c;…

BDA初级分析——民宿投资决策影响因素分析

实战作业: 民宿投资决策影响因素分析如今&#xff0c;出门旅行住民宿已经不是一个新鲜话题&#xff0c;而且民宿品牌也是层出不穷.作为一名旅行服务业的数据分析师&#xff0c;我们以Airbnb北京的民宿为例&#xff0c;对其进行数据分析&#xff0c;探索什么类型的民宿价格更高?…

Eltima USB Network Gate 10.0 Crack

USB Network Gate -通过网络共享USB 设备 USB Network Gate (前身为以太网USB控制器USB) 轻松的通过网络(Internet/LAN/WAN)分享您的一个或者多个连接到您计算机的USB设备。 无论您身处异国还是近在隔壁办公室&#xff0c;您都可以轻松使用远程扫描仪、打印机、摄像头、调制解…

从零构建深度学习推理框架-9 再探Tensor类,算子输入输出的分配

再探Tensor类&#xff1a; 第二节中我们编写的Tensor类其实并不能满足我们的使用需要&#xff0c;我们将在这一节以代码阅读的方式来看看一个完全版本的Tensor应该具备怎样的要素&#xff0c;同时我们对Tensor类的分析来看看在C中一个设计好的类应该是怎么样的。 Tensor<fl…

K8s学习笔记3

Kubernetes功能&#xff1a; Kubernetes是一个轻便的可扩展的开源平台&#xff0c;用于管理容器化应用和服务。通过Kubernetes能够进行应用的自动化部署和扩缩容。在Kubernetes中&#xff0c;会将组成应用的容器组合成一个逻辑单元以更易管理和发现。Kubernetes积累了作为Goog…

打怪升级之从零开始的网络协议

序言 三个多月过去了&#xff0c;我又来写博客了&#xff0c;这一次从零开始学习网络协议。 总的来说&#xff0c;计算机网络很像现实生活中的快递网络&#xff0c;其最核心的目标&#xff0c;就是把一个包裹&#xff08;信息&#xff09;从A点发送到B点去。下面是一些共同的…