2018-05-07


title: 前端規(guī)范手冊
tags: 前端,MARKDOWN,幫助
grammar_abbr: true
grammar_table: true
grammar_defList: true
grammar_emoji: true
grammar_footnote: true
grammar_ins: true
grammar_mark: true
grammar_sub: true
grammar_sup: true
grammar_checkbox: true
grammar_mathjax: true
grammar_flow: true
grammar_sequence: true
grammar_plot: true
grammar_code: true
grammar_highlight: true
grammar_html: true
grammar_linkify: true
grammar_typographer: true
grammar_video: true
grammar_audio: true
grammar_attachment: true
grammar_mermaid: true
grammar_classy: true
grammar_cjkEmphasis: true
grammar_cjkRuby: true
grammar_center: true
grammar_align: true
grammar_tableExtra: true


<div class="title-w">
<h1>姚明集團(tuán)信息技術(shù)部</h1>
<h2 style="border:0">前端學(xué)習(xí)路線與規(guī)范(附組件)</h2>
</div>

[TOC]

前端項(xiàng)目SVN地址:

https://192.168.1.188/svn/dev-team/project/YmWeb

一、學(xué)習(xí)路線

公司目前所用的前端框架主要是Angular2+,因此學(xué)習(xí)路線是基于整套Angular2+的體系二制定的(無須按順序寝受,建議學(xué)習(xí)之前,有牢固的html5+js+css3基礎(chǔ),然后先從Angular官網(wǎng)examples看起)罕偎。

1.Angular 學(xué)習(xí)參考地址
2.Typescript 學(xué)習(xí)參考地址
3.Npm 學(xué)習(xí)參考地址
4.Sass 學(xué)習(xí)參考地址
5.ng-zorro 學(xué)習(xí)參考地址
6.ionic3 學(xué)習(xí)參考地址

二颜及、規(guī)范

HTML規(guī)范

1.文檔類型聲明及編碼

統(tǒng)一為html5聲明類型; 編碼統(tǒng)一為UTF-8, 書寫時利用IDE實(shí)現(xiàn)層次分明的縮進(jìn),若有節(jié)點(diǎn)格式相似,應(yīng)添加相應(yīng)的注釋

<!--刷新窗口-->
<span class='span-h' (click)="simulationRefresh()"><i  class="anticon anticon-sync i-fontSize"></i></span>
<!--關(guān)閉窗口-->
<span class='span-h' (click)="closeWindow()"><i class="anticon anticon-close"></i></span>
<!--最大化-->
<span class='span-h' (click)="maxImize()">
  <i *ngIf="!isMaxImize" style="font-size: 17px;" class="anticon anticon-arrows-alt i-fontSize"></i>
  <i *ngIf="isMaxImize" style="font-size: 17px;" class="anticon anticon-shrink i-fontSize"></i>
</span>
<!--最小化-->
<span class='span-h' (click)="miniMize(1)"><i class="anticon anticon-minus"></i></span>

2.css俏站、js文件的引用位置

css文件若無特殊情況,需放在head標(biāo)簽內(nèi),script標(biāo)簽則放在body下

<head>
  <link href="build/main.css" rel="stylesheet">
</head>
<body>
  <!--第三方j(luò)s請優(yōu)先加載-->
  <script src="assets/js/jquery-3.2.1.min.js"></script>
  <script src="https://im.yunzhijia.com/pub/js/qingjs.js"></script>

3.style盡量不直接寫在html文件內(nèi),用class或者id定義樣式

4.盡可能減少div嵌套,若無必要,inline元素不要包含block元素

5.語義化(因公司業(yè)務(wù)不需要SEO,所以重要性不高,但是可以提高可讀性和規(guī)范)

CSS規(guī)范

1.公司默認(rèn)使用css的擴(kuò)展語言Sass

2.公用樣式文件為base.scss 和 common.scss

3.每個模塊需要有獨(dú)立的樣式表,比如task模塊,模塊頁面私有的樣式應(yīng)該放置在新建的task.scss中

4.書寫順序: 位置屬性肄扎、大小屬性反浓、字體屬性赞哗、背景屬性肪笋、其他屬性

5.連字符CSS選擇器命名規(guī)范: 盡量使用中橫線,區(qū)分開與js的命名

6.背景圖片過多考慮使用Css Sprite技術(shù)(由于集團(tuán)沒有專職PS切圖,這一塊的標(biāo)準(zhǔn)化暫未實(shí)現(xiàn))

7.樣式的書寫盡量少使用 " > " 和 " * " , 多使用class選擇器

JS(TS)規(guī)范

代碼風(fēng)格不強(qiáng)求,通俗易懂藤乙、簡約易讀即可

三、組件

具體代碼請根據(jù)路徑找到文件查看
移動端使用的框架為ionic3+angular4(微信頁面則只使用angular4)而姐,PC端則只使用angular4

1.時間格式轉(zhuǎn)換

路徑app\providers\Utils.ts
dateFormat

public dateFormat(date: Date, sFormat:string = 'yyyy-MM-dd'): string {
...
}

example
需要展示時間格式為xxxx年x月xx日xx時xx分 星期一

//這邊傳入的參數(shù)是中文字符,所以需要自定義該方法
  .replace('年', String(time.Year)+'年')
  .replace('月', String(time.Month)+'月')
  .replace('日', String(time.TDay)+'日')
  .replace('時', String(time.THour)+'時')
  .replace('分', String(time.TMinute)+'分')
//dateFormat方法第二個參數(shù)也可是ABCDE,只需要修改replace的第一個參數(shù)即可
let date = this.utils.dateFormat(new Date(),'年月日時分');    // 2018年5月07日12時03分
let week ="星期"+"日一二三四五六".charAt(new Date().getDay());   // 星期一

2.alert框和confirm框

路徑app\providers\Utils.ts
分PC端和移動端

alert.jpg

pc端:
Alert:
public pcAlert(title,str,fun = ()=>{}){
   ..... 
}

example:
this.utils.pcAlert('溫馨提示', '這是彈出框',()=>{
  console.log('click func')
});

Confirm:
public pcConfirm(title,str,fun = ()=>{},fun2 = ()=>{}){  
 .....  
}

example:
this.utils.pcConfirm('溫馨提示', '是否確認(rèn)刪除?', () => {
  console.log('click comfirm')
},()=>{
   console.log('click cancel')
})

PC配置參數(shù)

config-alert.jpg

移動端
Alert
public iosAlert(title,str,fun = ()=>{}){
    ...
  }


Confirm
public iosConfirm(title,str,fun = ()=>{},fun2 = ()=>{}){
  ...
}



<p id="jump">移動端配置參數(shù)</p>

alert-app-config.jpg

3.loading

路徑app\providers\Utils.ts
分PC端和移動端

PC端:
public showSpin(){
      let target = document.getElementById('load');
      let spinner = new Spinner();
      spinner.spin(target);
      return spinner;
    };

public  hideSpin(spinner){
    spinner.spin();
  }

**/ 需要引用spin.js 路徑在 assets/js下
修改樣式需要在源碼的
target.className更改類名即可

example:
let loading = this.utils.showSpin();  // show
this.utils.showSpin(loading );       //  hidden

移動端
參考ionic3文檔中的LoadingController API
public loadingCreate(){
    ...
}

example:
let loading = this.utils.loadingCreate(); // show
loading.dismiss();     //  hidden

4.圖片上傳

市場部任務(wù)單項(xiàng)目 app\shared\upload-img.component.ts

example:
task-add頁面上傳圖片

task-add.module.ts

import { SharedModule} from '../../shared/shared.module';
imports: [
    SharedModule,
  ]

task-add.html

<uploadImg  (returnImgData)="getReturnImgData($event)"></uploadImg>

task-add.component.ts

 //獲取圖片上傳返回值
  getReturnImgData(event){
    console.log(event)   // event = 圖片url
  };

upload-img.component.ts

 <input  name="file" (change)="previewPic($event)" id="{{'upload'+i}}" class="upload-img" type="file" accept="image/*"/>

使用trigger方法,從而使得點(diǎn)擊圖片時觸發(fā)input,選擇完圖片或者拍照后,會觸發(fā)change方法
(因?yàn)槭莄hange事件,所以加入兩次上傳的圖片一致,則不會觸發(fā))
觸發(fā)后將圖片文件傳到后臺,后臺返回url地址即可.

// 將文件轉(zhuǎn)換為base64字節(jié)流
 let reader = new FileReader();
 reader.readAsDataURL(file);   // file文件對象
 reader.onload = function(result){
        // result base64字節(jié)流
 };

5.移動端查看圖片

市場部任務(wù)單項(xiàng)目 app\shared\image-viewer.directive.ts
//目前只展示一張圖片,但是已經(jīng)預(yù)留拓展,傳入指令的圖片為數(shù)組,值同節(jié)點(diǎn)下的所有圖片

example:
在圖片上添加c-image-viewer即可
 <img  class="img-wh" [src]="item.url" c-image-viewer >

6. http

app\providers\httpService

獲取數(shù)據(jù)

public getData(params){
    return this.http.request(new Request(params))
      .toPromise()
      .then(this.extractData)
      .catch(this.handleError)
  }

params 參數(shù)

url: 后端接口api地址
method: 瀏覽器請求方法

example:
let param = {
      url: Project + '/alertrule/get?id=' + this.saveParams.id,
      method: 'get'
    }
//如用的是Promise,  方法的返回值需要用then去接收
this.httpCtrl.getData(param).then(result=>{
  console.log('請求成功')
},error=>{
  console.log('請求失敗')
}
)
//如用的是Observable,  方法的返回值需要用subscribe去接收
this.httpCtrl.getData(param).subscribe(result=>{
  console.log('請求成功')
},error=>{
  console.log('請求失敗')
}
)

保存數(shù)據(jù)(增 刪 改)

public setData(params,fun = function(){}) {
    params.headers = new Headers({ 'Content-Type': 'application/json' })
    let option = new Request(params)
    return this.http.request(option)
      .toPromise()
      .then(this.extractData)
      .catch(this.handleError)
  }

params參數(shù)
同上
新增body:請求頭數(shù)據(jù),相當(dāng)于ajax的data和formdata的數(shù)據(jù);
headers:添加請求上下文類型

example:
let params = {
        url: Project + '/dictionary/edit',
        method: 'post',
        body: this.saveParams
      }
    }
    this.httpCtrl.setData(params).then(
      result => {
          console.log('請求成功')
      },
      error => {
          console.log('請求失敗')
      }
    )

7.項(xiàng)目常量放置位置

項(xiàng)目中的常量,比如URL和projectName統(tǒng)一放在app\providers\Constants
Constants.ts

export const URL = 'http://192.168.1.117:8080'; //本地測試地址1
export const Project = '/signin'; //項(xiàng)目名

8.文件導(dǎo)出

app\providers\fileExport

//目前只做了導(dǎo)出csv文件
public tableExport(data,name,type){

}
data:導(dǎo)出的數(shù)據(jù)
name:文件名
type:導(dǎo)出文件類型

example:
this.dataSetExport.length = 0;
let tableHeader  =
{
    name:'姓名',title:'入會級別',mobilePhone:'電話',companyName:'公司',
    position:'職位',address:'地址',wechatId:'微信',email:'郵箱',purpose:'需求'
};

this.dataSetExport.push(tableHeader);
this.downCtrl.tableExport(this.dataSetExport,'','csv');

9.本地存儲

storage:
app\providers\sessionStorage.service;
app\providers\localStorage.service;

cookie:
app\providers\Utils

10.權(quán)限管理模塊樹形 ztree

app\rightsmanagement\user-list.component.ts;
ztree版本為3.5.24,目前API文檔可能有變化,可自行百度文檔查看.

ztreeInit(id,config,data){
  
}
id:渲染樹的dom
config:樹參數(shù)配置
data:數(shù)據(jù)

主要介紹config,其他則自行參照文檔查看代碼
config.view = {
  addDiyDom:func()   ;  // 樹節(jié)點(diǎn)初始化方法
}
config.data = {
    key: {
        name: "text",   // 樹節(jié)點(diǎn)的展示名,和數(shù)據(jù)顯示的值掛鉤
      },
}
config.callback:{
  beforeClick: (treeId, treeNode)=>{
        ...   //點(diǎn)擊樹節(jié)點(diǎn)回調(diào)方法
      }
}

11.表單驗(yàn)證

signin/app/shared/formvalidate.component.ts

目前只支持input的驗(yàn)證.依賴ng-zorro

example:
A.html

<formV-w  [formObj]='validateAllData'></formV-w>
<button (click)="parentClick()">觸發(fā)驗(yàn)證</button>

A.ts

import { Component, OnInit, ElementRef, ViewChild } from '@angular/core';
import { FormVailDateComponent } from "../shared/formValidate.component";
import { Validators } from '@angular/forms';

@ViewChild(FormVailDateComponent) child: FormVailDateComponent;
public validateAllData = {
    formError: {
      category: '類別',
      code: '編碼',
      name: '名稱',
      order: '排序'
    },
    validationMessage: {
      'category': { 'required': '類別不能為空' },
      'code': { 'required': '編碼不能為空', 'ValidateNumber': '請輸入數(shù)字' },
      'name': { 'required': '名稱不能為空','maxlength':'長度不能超過15個字' },
      'order': { 'required': '排序不能為空' },
    },
    groups: {},
  }

constructor() {
    this.validateAllData.groups = {
      category: ['', [Validators.required]],
      code: [null, [Validators.required,this.checkNumber]],
      name: [null, [Validators.required,Validators.maxLength(15)]],
      order: [null, [Validators.required]]
    }
  }

  parentClick() {
    this.child.submitData();
    console.log(this.child.saveParams)  //返回的輸入框值
  }

  validateAllData內(nèi)的key不可改動
  
  formError:需要渲染的輸入框組

  validationMessage:驗(yàn)證提示信息

  groups:驗(yàn)證器,Validators.required為基礎(chǔ)的非空驗(yàn)證,angular還有一些其他的驗(yàn)證,如maxLength,minLength
還可以自定義驗(yàn)證,驗(yàn)證體可以為方法,例如this.checkNumber
 
  checkNumber(data) {
    // let value = parseInt(data.value)
    let NUMBER_REGEXP = /^[0-9]*$/
    return NUMBER_REGEXP.test(data.value)? null : {
      ValidateNumber: {
        valid: false
      }
    }
  }

formError,validationMessage,groups三個屬性的輸入屬性名(key)值需要一致,否則無效

12.H5原生打印功能

pc-mxangel/app/providers/Utils
printDown();

    html
    <div class="print">
        ....
    </div>
    
    <iframe id="printf"  width="0" height="0" frameborder="0"></iframe>

    Utils.ts:
     printDown(dom){

    let bdhtml = document.querySelector(dom).innerHTML;
    var f = document.getElementById('printf') as HTMLIFrameElement;
    f.contentDocument.write(bdhtml);
    f.contentDocument.write('<link rel="stylesheet" type="text/css" href="./assets/print/print.css">')
    f.contentDocument.close();
    setTimeout(()=>{
      f.contentWindow.print();
    },500)

  }
  
  use.ts:
  this.utils.printDown('.print')
  
  主要應(yīng)用了iframe框,需要自定義打印的樣式.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市瞬雹,隨后出現(xiàn)的幾起案子刽虹,更是在濱河造成了極大的恐慌状婶,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件草姻,死亡現(xiàn)場離奇詭異稍刀,居然都是意外死亡账月,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門剧劝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來讥此,“玉大人谣妻,你說我怎么就攤上這事∷蓿” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵匪傍,是天一觀的道長役衡。 經(jīng)常有香客問我薪棒,道長,這世上最難降的妖魔是什么棵介? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任邮辽,我火速辦了婚禮贸营,結(jié)果婚禮上钞脂,老公的妹妹穿的比我還像新娘。我一直安慰自己邓夕,他們只是感情好阎毅,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布扇调。 她就那樣靜靜地躺著,像睡著了一般痴腌。 火紅的嫁衣襯著肌膚如雪燃领。 梳的紋絲不亂的頭發(fā)上猛蔽,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天曼库,我揣著相機(jī)與錄音,去河邊找鬼慈缔。 笑死种玛,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的娱节。 我是一名探鬼主播祭示,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼质涛,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了轧抗?” 一聲冷哼從身側(cè)響起瞬测,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤月趟,失蹤者是張志新(化名)和其女友劉穎孝宗,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體问潭,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡狡忙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年址芯,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片北专。...
    茶點(diǎn)故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡禀挫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出拓颓,到底是詐尸還是另有隱情语婴,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布驶睦,位于F島的核電站腻格,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏啥繁。R本人自食惡果不足惜菜职,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望酬核。 院中可真熱鬧,春花似錦适室、人聲如沸嫡意。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蔬螟。三九已至,卻和暖如春汽畴,著一層夾襖步出監(jiān)牢的瞬間旧巾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工忍些, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鲁猩,地道東北人。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓罢坝,卻偏偏與公主長得像廓握,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子嘁酿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容