jirengu-inc / jrg-project-5

一个在线简历编辑器教程。
102 stars 14 forks source link

My Project #7

Open FrankFang opened 7 years ago

FrankFang commented 7 years ago

需求分析

你首先得知道你要做什么,你才能开始做。

项目目标

做一个工具,用户可以用这个工具来写简历

功能列表

  1. 添加简历内容,包括个人信息、工作经历、学习经历、获奖情况、项目经历和联系方式。
  2. 更新简历内容
  3. 选择简历模板
  4. 预览简历
  5. 发布简历

原型图

我们需要画出一个基本的图片,来描述我们的页面是什么样子:

分模块/分区

我们大概将页面分为几个模块,化整为零,分别开发:

每一个区块的内容都不太复杂:

  1. 顶栏。包含 logo 和一些按钮。
  2. 编辑区。包含一组按钮和一些表单。
  3. 预览区。展示 HTML,可切换模板。

然后你大概看一下每个按钮的功能,就可以开始干了!

初始化项目

我们之前了解过 webpack,但是我们的项目使用 vue-cli 这个工具。由于 vue-cli 其实也是用了 webpack,所以我们用起来不会特别陌生。

> mkdir resumer
> cd resumer
> npm init # 使用 npm init 来生成一个 package.json,方便我们添加依赖
...
Press ^C at any time to quit.
name: (resumer)
version: (1.0.0) 0.1.0
description: 简历制作工具
entry point: (index.js)
test command:
git repository:
keywords:
author: frankfang
license: (ISC)
...

然后全局安装 vue-cli(安装在当前目录也可以),并用 vue-cli 来初始化一个 vue 项目

> npm install -g vue-cli
> vue init webpack .   # 注意这里的 . 字符

? Generate project in current directory? Yes
  This will install Vue 2.x version of the template.

  For Vue 1.x use: vue init webpack#1.0

? Project name resumer
? Project description A Vue.js project
? Author frankfang <frankfang1990@gmail.com>
? Vue build standalone
? Install vue-router? Yes
? Use ESLint to lint your code? Yes
? Pick an ESLint preset Standard
? Setup unit tests with Karma + Mocha? Yes
? Setup e2e tests with Nightwatch? No

   vue-cli · Generated "resumer".

> npm i
> npm run dev

运行完 npm run dev 你就会发现浏览器自动弹出,并访问了 http://localhost:8080/#/ 。

webpack 已经在命令行持续运行着,不要关掉它,你用你最喜欢的编辑器打开 resumer 目录即可,我们来看看 vue-cli 生成了些什么。

目录结构

.
├── README.md
├── build                    # build 目录用于存放构建脚本,比如 webpack 配置文件
├── config                  # config 目录用于存放一些配置信息,比如配置打包后的 bundle 文件存放在哪里
├── index.html           # 首页
├── node_modules    
├── package.json    
├── src                       # 除了首页,其他的源代码都在 src 目录里
├── static                   # static 目录用于放置静态资源,比如 favicon.ico 文件等
└── test                     # 单元测试等代码放在 test 目录里

你只要搞清楚源代码在 src 里就行了。

index.html

打开 index.html,里面就一个 div#app,很简单嘛。

想一想,是不是缺点儿什么。

居然没有引用 bundle.js! 但是,如果你去看看 http://localhost:8080/#/ 的源代码,会发现是这样的:

居然多了一行

<script type="text/javascript" src="/app.js"></script></body>

好吧,我们先接受这个设定,肯定是 vue-cli 在背后做了什么事情。

src/

src 目录的结构如下:

src
├── App.vue              # App.vue 是主组件,后面讲什么是组件
├── assets                 # assets 用于放置代码之外的资源,比如图片、字体等
├── components       # components 用于放置主组件之外的组件,vue 组件的后缀都是 .vue
├── main.js                # JS 入口文件,浏览器执行的第一行代码在这里,所以我们先看这里
└── router                 # 路由,目前用不到

src/main.js

import Vue from 'vue'
import App from './App'
import router from './router'

/* eslint-disable no-new */
new Vue({
  el: '#app',
  router,
  template: '<App/>',
  components: { App }
})

main.js 只是把 #app 替换成了 <App/>,那么 <App/> 是什么呢? components 属性定义了 App:components: { App },这是 ES 6 语法,换成 ES 5 语法就是 components: { App: App }。那么 App 到底长什么样子呢? 看 import App from './App',说明 ./App.vue 定义了 App 的样子:

<template>
  <div id="app">
    <img src="./assets/logo.png">
    <router-view></router-view>
  </div>
</template>

<script>
export default {
  name: 'app'
}
</script>

<style>
#app {
  font-family: 'Avenir', Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>

这是 Vue 单文件组件,你自己看看文档。 一个单文件组件包含三个根标签:<template> <script><style>,三者分别用来表示内容、行为和样式(正交原则)。 使用单文件组件有几个注意事项:

  1. <template> 有且仅有一个儿子标签:
    示例一
    <template> <div></div> </template> 正确
    示例二
    <template> <div></div>  <div></div> </template> 会报错
    示例三
    <template> 你好 </template> 会报错
  2. <script> 里面必须包含 export default {}, 也就是说必须默认导出一个对象,对象的属性见文档。
  3. <style> 默认只支持 CSS,想要支持 SCSS 请看 vue-cli webpack 模板的文档

copy 了, run 了,接下来我们 modify

我们来改一改 App.vue。webpack 已经在 watch 文件了,所以改完代码,你直接切到浏览器就可以看到效果了(连刷新都不用)。

改 template 和 style

//App.vue
<template>
  <div>
    <p>你好</p>
  </div>
</template>

<script>
export default {
  name: 'app'
}
</script>

<style>
  p{color: red;}
</style>

结果我们看到一个红色的你好。

加个 data

<template>
  <div>
    <p>{{text}}</p>
  </div>
</template>

<script>
export default {
  name: 'app',
  data: {
    text: '你好'
  }
}
</script>

<style>
  p{color: red;}
</style>

再看页面,居然没有「你好」两个字。出错了?

这个时候你该干什么?

  1. 看看命令行有没有报错
  2. 看看浏览器有没有报错

命令行没报错,浏览器呢:

> [Vue warn]: The "data" option should be a function that returns a per-instance value in component definitions. 

他说 data 应该是一个 function。看看单文件组件的文档,知道应该改成这样:

<template>
  <div>
    <p>{{text}}</p>
  </div>
</template>

<script>
export default {
  name: 'app',
  data: function(){
    return {
      text: '你好'
    }
  }
}
</script>

<style>
  p{color: red;}
</style>

喝,报错更奇怪了:

原来这是 ESLint 插件认为我们写的代码不符合规范,它说

  1. 花括号前面要加一个空格
  2. 函数的圆括号前面要加一个空格

你有两个选择

  1. 按照它说的,修改源代码
  2. 禁用 ESLint

如果你想折腾,就选 1, 把代码改成

<script>
export default {
  name: 'app',
  data: function () {  // 👈 注意空格
    return {
      text: '你好'
    }
  }
}
</script>

如果你不想折腾,就去 build/webpack.base.conf.js 里,把 ESLint 给注释掉,然后重新运行 npm run dev。 我就偷懒,选择后者吧。

// 第35行
  module: {
    rules: [
      //{
        //test: /\.(js|vue)$/,
        //loader: 'eslint-loader',
        //enforce: "pre",
        //include: [resolve('src'), resolve('test')],
        //options: {
          //formatter: eslintFriendlyFormatter
        //}
      //},
      {

然后关闭之前的 npm run dev,重新运行。

现在,我爱怎么写就怎么写。

commit: copy - run - modify

现在,我们基本知道了一个组件要怎么写。

三分天下

我们的应用(App)含有三个部分:顶栏、编辑区和预览。

所以我们新建三个组件。下面是组件结构图:

新建三个 vue 文件:

commit: add Topbar, ResumePreview, and ResumeEditor

看代码的过程中有哪里不懂,就在群里问一下,或者在 vue 文档/ ES 6 新特性列表里搜索下。

补充 HTML & CSS

UI 预览在这里:https://jirengu-inc.github.io/jrg-project-5/resumer_mockups/index.html

点击左侧的「编辑」页面,就可以看到页面标注了:

有了标注我们就开始把大体的 HTML 和 CSS 写好。

设计稿的总宽度是 1440px,并没有说明如果页面宽度小于 1440px 会怎样。

这个时候你应该问设计师,「页面宽度如果不足 1440px 我要怎么显示页面?」

目前设计师就是我了。我会说:「按比例缩小吧,最小缩小到 1024px。」

「手机宽度只有不到 400px 怎么办?」

「我们的网站不兼容手机」

「这是你说的哈」

这样我们与设计师的愉快的沟通就结束了,然后你才能开始写代码。

在与设计师交流之前,不要写样式代码。

下面是添加样式的过程:

commit: add reset.css commit: add normalize.css commit: 将 normalize.css 和 reset.css 移到最前面 commit: 使用 flex 布局

如果你不会 Flex,这里有我的直播课:Flex 到目前为止,效果如下:

继续

commit: 调节位置、背景色等 commit: add styles for topbar

然后,当我把分辨率调到 1440px 以上之后,发现 main 并没有居中。(如果你的屏幕不足 1440px,可以缩放一下网页)

commit: fix: main is not centered commit: 对齐文字,调节内外边距,都改为 16px 的距离

现在好看多了:

致饥人谷学员

搞定上面的所有代码,做到和最后一张图基本一致。

  1. 截图放到评论里,推荐一个图片上传工具:https://yotuku.cn/#/
  2. 预览链接也放到评论里

如何生成预览链接呢?

首先需要将 config/index.js 中的 assetsPublicPath 改为 '/jrg-project-5/resumer/dist'

commit: 修改 assetsPublicPath

然后运行

npm run build

就会生成一个 dist 目录,dist/index.html 就是可以直接预览的页面(不过必须是 http 协议)

我的预览链接:https://jirengu-inc.github.io/jrg-project-5/resumer/dist/

不知道为什么,dist/index.html 不行 dist/ 就可以。

预告

两天后出下一次任务,内容是完善三个组件。

WangXiaoyugg commented 7 years ago

电脑没有1440*1440的分辨率,在1368*768下就是截图是这样,我也没办法. 预览链接

FrankFang commented 7 years ago

@WangXiaoyugg
我看了是 OK,你只要不把宽度写死就行了。 你按 ctrl + - 试试

hungryYang commented 7 years ago

YCR resume 预览 @FrankFang 已经修改

lzm320856 commented 7 years ago

预览

LisaLi85 commented 7 years ago

预览 LLL @FrankFang 已修改

Hunter-Gu commented 7 years ago

2017-02-06 6 29 10 不知道为什么生成的链接不正确

Rice-F commented 7 years ago

截图 预览 SJ

wuhanjun commented 7 years ago

预览 WHJ

zhangjiuyi commented 7 years ago

预览

ZJY

Zegendary commented 7 years ago

page code image

─=≡Σ(((つ•̀ω•́)つ

ZXW

@FrankFang

TerenYeung commented 7 years ago

yjl for vue-resume-generator-01 source demo

xiayujlu commented 7 years ago

预览

JaeJiang commented 7 years ago

姜杭轩 预览 代码

yukui630 commented 7 years ago

预览 代码 截图

raszxcv commented 7 years ago

仓库 预览

starlikerain commented 7 years ago

fixed

Preview img

source preview

source code

ReedSun commented 7 years ago

预览页面

方方老师的页面好像有一个问题,如果页面宽度太小的话,页面样式会错乱,main元素里面的东西会往左移动到浏览器窗口外,我在最外层元素上加了min-width:1024px页面就正常了。

SHZ

FrankFang commented 7 years ago

@ReedSun 👍 我没考虑小于 1024px 的情况。

wlf1112 commented 7 years ago

代码 预览WLF

Hsyneve commented 7 years ago

预览 源码

batman-1 commented 7 years ago

预览

xiaokunxu commented 7 years ago

预览 代码

muxi7 commented 7 years ago

预览地址 代码地址 ZW

have-not-BUG commented 7 years ago

截图

代码地址 代码预览地址

LC

code-zhangrui commented 7 years ago

预览 代码

chaocool commented 7 years ago

预览 代码

CJC 后面继续完善

baixiaoji commented 7 years ago

预览

ab690257072 commented 7 years ago

预览 ZLQ

Anticlimax commented 7 years ago

预览

JeromeYangtao commented 7 years ago

_4r b c arcyuf66jro l 预览

superDCF commented 7 years ago

demo

n313893254 commented 7 years ago

预览 预览

13hoop commented 7 years ago

预览

MasterGaoJin commented 7 years ago

预览 链接

success-cg commented 7 years ago

预览1.png 链接 demo

kumabearplus commented 7 years ago

image 效果 demo

Honohonoho commented 7 years ago

预览 代码

boloog commented 7 years ago

resumer.png 预览 源码

komolei commented 7 years ago

default

预览 demo

swhzzz commented 7 years ago

预览 代码

robbchan commented 7 years ago

image 预览链接 代码地址

selectyang commented 7 years ago

image 预览 代码

zhaipanyu commented 7 years ago

预览地址 代码

imgwho commented 7 years ago

TIM截图20170720113719.png 预览 仓库

forsuccess commented 7 years ago

image

预览 仓库

HuangHongRui commented 7 years ago

GitShow :100: Code image

andreaxiang commented 7 years ago
2017-07-30 20 14 04

预览地址

tcitds1 commented 7 years ago

预览 预览

zhuyutrisla commented 7 years ago

image

预览

huoguozhang commented 7 years ago

1.png