解决协同开发冲突与前台首页组件编写

协同开发

1.在企业中工作时,都是多人共同开发同一个项目
1.1写完底层代码后,提交到远程仓库
1.2将代码clone到本地
1.3在pycharm中找一个位置:git bash here(cmd)
git clone 远程地址
-本地能运行起项目来,没跑起来可能是依赖没装好,或者数据库链接不对
1.4写代码,提交到本地版本库,推到远端即可(推之前先pull一下)

2.多人协同开发项目
-项目创建者:本地搞好,远端搞好,推上去,把别人加为开发者
-协同开发者:远程账号、密码,登录进去就能看到这个项目

线下分支冲突解决

多人同一分支开发出现冲突

1.冲突原因
1.1别人跟你改了同样的代码,但他先提交到远程仓库
-你要提交时,提交不上去,要先拉取下来,因为改了相同的代码冲突
1.2冲突的样式
<<<<<<< HEAD
print('lqz') 
=======  # 上面是你的代码,下面是别人代码
print('lqz is handsome')
>>>>>>> f67f73948d175b186cd5f1319d7602fe004e285c  # 版本号

2.解决冲突
2.1修改代码到不报错
-代码没有关联时,就都留着
-代码有关联时,删掉自己的或别人的代码,尽量删掉自己的,如果要删掉别人的,要和别人说
2.2重新提交到版本库,推到远端

分支合并出现冲突

1.冲突原因
-开发分支在开发的时候,主分支又提交了版本,而你之后提交的开发分支代码又与其相冲突

2.制造冲突
1.1新建dev分支,切换过去,在将dev提交到版本库
git branch dev
git checkout dev
git commit -m '创建了dev.py'
1.2dev分支修改home/views.py 最后一行
# 在views.py最后一行加入注释
git add .
git commit -m '最后一行加入注释'
1.3切回到master分支,修改dev.py 第一行和home/views.py 最后一行,提交到版本库
git checkout master
# 在views.py最后一行加入注释
git add .
git commit -m 'master修改内容'
1.4合并代码时,就会出冲突
git merge dev

3.解决冲突
3.1修改代码到不报错
-代码没有关联时,就都留着
-代码有关联时,删掉自己的或别人的代码,尽量删掉自己的,如果要删掉别人的,要和别人说
3.2重新提交到版本库,推到远端
git add .
git commit -m '解决冲突'

线上分支合并(pr,mr)

1.建立远程分支
gitee上点击操作

2.把远程分支拉倒本地
git pull origin dev  # 执行完后,已经拉下来了,但是看不到
git checkout dev  # 切换到dev分支

3.本地dev分支增加代码
git add .
git commit -m '本地dev提交'

4.本地dev提交到远端
git push origin dev

5.远程分支合并(把dev合并到master)
-提交pull request的申请(pr,mr),之后跟你没关系了(合进去了,没有合进去)
-你的上级就可以看到这个pr,他审核通过,点合并,dev分支就合并到master分支了

pycharm操作git

-命令行操作git,编辑器pycharm可以在图形化界面操作操作git
-前面的git命令都可以在pycharm中点击实现

为开源项目贡献代码

1.看到开源项目,点击fork,你的仓库中就会有这个开源项目
2.在本地拉取你仓库中的fork的代码
3.在进行修改、增加,在提交到自己远程仓库
4.提交pr合并,如果作者同意,你的代码就会合并进去

git面试题

1.那么公司分支方案是什么样的?
-master、dev、bug三条分支
1.1master:主要用来发布版本,写好了某个版本的代码合并进去,不直接在master上面开发
1.2dev:开发分支,项目开发者都在dev分支上开发
1.3bug:bug分支,用来修改bug,发布小版本

2.使用fit开发,遇到过冲突吗?
-大部分在dev分支开发,会出现冲突
-分支合并也会冲突
-把拜吗拉下来,直接解决冲突,保留我代码或保留同事的代码

3.你知道git变基?
-分支合并:dev合并到master分支
-meege或rebase合并
-rebase会把多次提交合并成一个

4.git pull和git fetch的区别
-pull和fetch都是拉取代码
-pull = fetch + 合并

5.你知道git flow吗?
-git flow是git工作流,它是一个被人提出的分支方案
-我们用的就是master+dev+bug分支方案

6.使用git的操作流程
-普通开发者:git clone下来,写代码,git add .,git commit,git pull,git push

7.什么是gitee,github:pr,gitlab:mr?
-pr、mr只是不同叫法,是提交分支合并的请求

面试题补充

1 cgi fastcig WSGI uwsgi uWSGI  
1.cgi:通用网关接口(Common Gateway Interface/CGI)是一种重要的互联网技术,可以让一个客户端,从网页浏览器向执行在网络服务器上的程序请求数据。CGI描述了服务器和请求处理程序之间传输数据的一种标准。
-总结:一个标准,定义了客户端服务器之间如何传数据

2.fastcig:快速通用网关接口(Fast Common Gateway Interface/FastCGI)是一种让交互程序与Web服务器通信的协议。FastCGI是早期通用网关接口(CGI)的增强版本
-总结:CGI的升级版
-常用的fastcgi软件: 
Apache HTTP Server (部分)		常见项目架构LNMP

3.Nginx(主流):nginx是一个符合fastcgi协议的软件,处于浏览器和web程序之间,主要做请求转发和负载均衡,也可以称之为服务器中间件
Microsoft IIS:windows server


4.WSGI:Web服务器网关接口(Python Web Server Gateway Interface,缩写为WSGI)是为Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口。自从WSGI被开发出来以后,许多其它语言中也出现了类似接口
-总结:为Python定义的web服务器和web框架之间的接口标准
-wsgiref:性能很低,python实现的,django内置了,测试阶段用,上线不用
-uWSIG:性能高,c实现的
-gunicorn:python实现的
    
# uWSGI:符合wsgi协议的web服务器,上面标准的具体实现
# uwsgi:uWSGI服务器,自有协议
    
    

3 Apache
-Apache 公司
-Apache  web服务器
-Apache  开源协议
	-Kafka:apache顶级开源项目
	-echars:原来是百度开发的,交给了apache孵化

前台首页组件编写

HomeView.vue 页面组件
Header.vue   头部组件
Banner.vue   轮播图组件
Footer.vue   尾部组件

HomeView.vue

<template>
  <div class="home">
    <Header></Header>
    <Banner></Banner>
    <br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
    <Footer></Footer>
  </div>
</template>

<script>
import Header from '@/components/Header'
import Banner from '@/components/Banner'
import Footer from '@/components/Footer'

export default {
  name: 'HomeView',
  data() {
    return {}
  },
  components: {
    Header, Banner, Footer
  }
}
</script>

Header.vue

<template>
  <div class="header">
    <div class="slogan">
      <p>老男孩IT教育 | 帮助有志向的年轻人通过努力学习获得体面的工作和生活</p>
    </div>
    <div class="nav">
      <ul class="left-part">
        <li class="logo">
          <router-link to="/">
            <img src="../assets/img/head-logo.svg" alt="">
          </router-link>
        </li>
        <li class="ele">
          <span @click="goPage('/free-course')" :class="{active: url_path === '/free-course'}">免费课</span>
        </li>
        <li class="ele">
          <span @click="goPage('/actual-course')" :class="{active: url_path === '/actual-course'}">实战课</span>
        </li>
        <li class="ele">
          <span @click="goPage('/light-course')" :class="{active: url_path === '/light-course'}">轻课</span>
        </li>
      </ul>
      <div class="right-part">
        <div>
          <span>登录</span>
          <span class="line">|</span>
          <span>注册</span>
        </div>
      </div>
    </div>
  </div>
</template>

<script>
export default {
  name: "Header",
  data() {
    return {
      url_path: sessionStorage.url_path || '/',
    }
  },
  methods: {
    goPage(url_path) {
      // 已经是当前路由就没有必要重新跳转
      if (this.url_path !== url_path) {
        // 传入的参数如果不等于当前路径,就跳转
        this.$router.push(url_path)
      }
      sessionStorage.url_path = url_path
    },
  },
  created() {
    sessionStorage.url_path = this.$route.path
    this.url_path = this.$route.path
  }
}
</script>

<style scoped>
.header {
  background-color: white;
  box-shadow: 0 0 5px 0 #aaa;
}

.header:after {
  content: "";
  display: block;
  clear: both;
}

.slogan {
  background-color: #eee;
  height: 40px;
}

.slogan p {
  width: 1200px;
  margin: 0 auto;
  color: #aaa;
  font-size: 13px;
  line-height: 40px;
}

.nav {
  background-color: white;
  user-select: none;
  width: 1200px;
  margin: 0 auto;

}

.nav ul {
  padding: 15px 0;
  float: left;
}

.nav ul:after {
  clear: both;
  content: '';
  display: block;
}

.nav ul li {
  float: left;
}

.logo {
  margin-right: 20px;
}

.ele {
  margin: 0 20px;
}

.ele span {
  display: block;
  font: 15px/36px '微软雅黑';
  border-bottom: 2px solid transparent;
  cursor: pointer;
}

.ele span:hover {
  border-bottom-color: orange;
}

.ele span.active {
  color: orange;
  border-bottom-color: orange;
}

.right-part {
  float: right;
}

.right-part .line {
  margin: 0 10px;
}

.right-part span {
  line-height: 68px;
  cursor: pointer;
}
</style>

Banner.vue

<template>
  <div class="banner">
    <el-carousel :interval="5000" arrow="always" height="400px">
      <el-carousel-item v-for="item in bannerList" :key="item.title">
        <div v-if="item.image.indexOf('http')==-1">
          <router-link :to="item.link"><img :src="item.image" alt=""></router-link>
        </div>
        <div v-else>
          <a :href="item.link"><img :src="item.image" alt=""></a>
        </div>

      </el-carousel-item>
    </el-carousel>

  </div>

</template>

<script>
export default {
  name: "Banner",
  data() {
    return {
      bannerList: []
    }
  },
  created() {
    this.$axios.get(this.$settings.BASE_URL + 'home/banner/').then(res => {
      this.bannerList = res.data.result

    })
  }
}
</script>

<style scoped>
.el-carousel__item {
  height: 400px;
  min-width: 1200px;
}

.el-carousel__item img {
  height: 400px;
  margin-left: calc(50% - 1920px / 2);
}

.el-carousel__item h3 {
  color: #475669;
  font-size: 18px;
  opacity: 0.75;
  line-height: 300px;
  margin: 0;
}

.el-carousel__item:nth-child(2n) {
  background-color: #99a9bf;
}

.el-carousel__item:nth-child(2n+1) {
  background-color: #d3dce6;
}
</style>

Footer.vue

<template>
  <div class="footer">
    <ul>
      <li>关于我们</li>
      <li>联系我们</li>
      <li>商务合作</li>
      <li>帮助中心</li>
      <li>意见反馈</li>
      <li>新手指南</li>
    </ul>
    <p>Copyright © luffycity.com版权所有 | 京ICP备17072161号-1</p>
  </div>
</template>

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

<style scoped>
.footer {
        width: 100%;
        height: 128px;
        background: #25292e;
        color: #fff;
    }

    .footer ul {
        margin: 0 auto 16px;
        padding-top: 38px;
        width: 810px;
    }

    .footer ul li {
        float: left;
        width: 112px;
        margin: 0 10px;
        text-align: center;
        font-size: 14px;
    }

    .footer ul::after {
        content: "";
        display: block;
        clear: both;
    }

    .footer p {
        text-align: center;
        font-size: 12px;
    }
</style>

登录注册功能设计

1.账号/手机号/邮箱 + 密码登录接口
2.手机号 + 验证码登录接口
3.发送手机验证码接口(需要借助第三方发送短信)
4.注册接口(手机号,验证码,密码)
5.判断手机号是否存在接口
posted @ 2022-11-09 22:34  无言以对啊  阅读(55)  评论(0)    收藏  举报