49 | ```
50 | ```C++
51 | int main(){
52 | int a = 10, b = 20;
53 | int sum( int a , int b){
54 | return a+b;
55 | }
56 | return sum( a, b );
57 | }
58 | ```
59 | ```js
60 | angular.module('app', [])
61 | .controller('main', ['$scope', function ($scope) {
62 |
63 | $scope.gesture = function (event) {
64 |
65 | switch (event.type) {
66 |
67 | case 'touchstart':
68 | //在这里书写 touchstart 要做的事
69 | break;
70 |
71 | case 'touchmove':
72 | //在这里书写 touchmove 要做的事
73 | break;
74 |
75 | case 'touchend':
76 | //在这里书写 touchend 要做的事
77 | break;
78 |
79 | }
80 |
81 | }
82 |
83 | }])
84 | ```
85 |
--------------------------------------------------------------------------------
/1-git/8.如何搭建git服务端.md:
--------------------------------------------------------------------------------
1 | # Git 服务器搭建
2 |
3 | 搭建 git 服务端需要拥有一台私人服务器,最好还有一个域名。
4 |
5 | 如果没有域名也不要紧用 ip 地址代替即可。
6 |
7 | ## step1 在服务端下载 git
8 |
9 | 以 CentOS 为例
10 |
11 | ```bash
12 | # 远程链接服服务器 用账号密码登录 或者用 ssh 免密登陆
13 | yum install git
14 | ```
15 |
16 | 使用 yum install git 命令安装 git
17 |
18 | 没有 yum 的朋友需要自行安装 yum
19 |
20 | [如何免密登录服务器](https://github.com/PsChina/utility/blob/master/Mac/%E5%A6%82%E4%BD%95%E5%85%8D%E5%AF%86%E7%99%BB%E9%99%86%E6%9C%8D%E5%8A%A1%E5%99%A8.md)
21 |
22 | 接下来我们 创建一个git用户组和用户,用来运行git服务:
23 |
24 | ```bash
25 | groupadd git
26 | useradd git -g git
27 | ```
28 |
29 | ## step2 创建证书登录
30 |
31 | 收集所有需要登录的用户的公钥,公钥位于id_rsa.pub文件中,把我们的公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个。
32 |
33 | 如果没有该文件那么需要在本地的个人电脑上创建它(不是在服务器上创建):
34 |
35 | [创建ssh公钥私钥](https://github.com/PsChina/angularJS/blob/master/1-git/1.git%E7%9A%84%E9%85%8D%E7%BD%AE%E5%92%8C%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4.md#2%E8%BF%9E%E6%8E%A5github)
36 |
37 | ```bash
38 | cd ../
39 | cd ../
40 | cd ../
41 | cd /home/git/
42 | mkdir .ssh
43 | touch .ssh/authorized_keys
44 | cd .ssh
45 | vi authorized_keys
46 | ```
47 |
48 | __注意:必须在服务器/home/git/目录下新建.ssh和服务端仓库目录要不然无效__。
49 |
50 | 把我们的公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个。
51 |
52 | 按 o 键进入编辑模式
53 |
54 | 编辑完毕后
55 |
56 | 按 esc
57 |
58 | :wq 回车 保存并退出
59 |
60 | ## step3
61 |
62 | 初始化仓库
63 |
64 | ```bash
65 | cd ../
66 | cd ../
67 | cd ../
68 | cd /home
69 | mikdir gitrepo # 创建存放远端仓库的文件夹
70 | cd /gitrepo # 进入文件夹
71 | git init --bare project.git # 创建一个裸仓库
72 | ```
73 |
74 | 然后,把仓库所属用户改为git:
75 |
76 | ```bash
77 | chown -R git:git project.git
78 | ```
79 |
80 | ## 克隆仓库
81 |
82 | 在含有服务端 authorized_keys 公钥的本地机器操作
83 |
84 | ```bash
85 | git clone git@47.107.154.169:/home/gitrepo/project.git
86 | # 因为我的ip绑定了域名所以我的是下面的写法
87 | # git clone git@pschina.work:/home/gitrepo/project.git
88 | ```
89 |
90 | 然后机器上会出现 你克隆了一个空仓库的提示
91 |
92 | ```bash
93 | warning: You appear to have cloned an empty repository.
94 | ```
95 |
96 | 接下来的 操作就简单了
97 |
98 | ```bash
99 | git add .
100 | git commit -m 'xxx'
101 | git push
102 | # 等等
103 | ```
104 |
105 | (完)
--------------------------------------------------------------------------------
/3-angularJS-part1/3.angularJS-自定义过滤器.md:
--------------------------------------------------------------------------------
1 | # 自定义过滤器
2 |
3 | ## api filter
4 |
5 | 怎样获取这个api
6 | ```javascript
7 | angular.module('app',[]).filter
8 | ```
9 | 或者
10 | ```javascript
11 | var app = angular.module('app',[])
12 |
13 | app.filter
14 | ```
15 | ## 如何使用
16 | ```javascript
17 | var app = angular.module('app',[])
18 |
19 | app.filter('yourFilterName',function(){ // 第一个参数是 自定义过滤器的名字
20 | // 第二个参数 是实现 该过滤器的回调函数
21 |
22 | // 注意事项 需要在回调函数里面再次return 一个 function
23 |
24 | return function(input,parma1,parma2){ //第一个参数是 你要过滤的数据
25 | //第二个及其以后的参数 都是 在外面调用的时候通过 : 传递进来的值
26 |
27 | }
28 | })
29 | ```
30 | ## demo1
31 | ```javascript
32 | app.filter('upperCaseLetterOfRange',function(){ //
33 |
34 | return function(input,parma1,parma2){
35 |
36 | /*拿到 通过传经来索引截取的字符串*/
37 | var str = input.substring(parma1,parma2*1+1); //
38 |
39 | var output = input.replace(str/*通过传经来索引截取的字符串*/,str.toUpperCase()/*通过传经来索引截取的字符串.toUpperCase()*/)
40 |
41 | return output;
42 |
43 | }
44 | })
45 | ```
46 | ## demo2
47 | ```javascript
48 | app.filter('lowerCaseLetterOfRange',function(){ //
49 |
50 | return function(input,parma1,parma2){
51 |
52 | /*拿到 通过传经来索引截取的字符串*/
53 | var str = input.substring(parma1,parma2*1+1);
54 |
55 | var output = input.replace(str/*通过传经来索引截取的字符串*/,str.toLowerCase()/*通过传经来索引截取的字符串.toLowerCase()*/)
56 |
57 | return output;
58 |
59 | }
60 | })
61 | ```
62 | ## demo3
63 | ```javascript
64 | app.filter('remove',['$rootScope',function($rootScope){
65 |
66 | return function(input,parma){
67 |
68 | var exp = new RegExp(parma,'g');
69 |
70 | var output = input.replace(exp,'')
71 |
72 | return output;
73 |
74 | }
75 |
76 | }])
77 | ```
78 | ## demo4
79 | ```javascript
80 | app.filter('formatSentence',['$rootScope',function($rootScope){
81 |
82 | return function(input){
83 |
84 | var output = input.split(/'.'|'。'/).map(function(value,index,array){
85 | return value.replace(value.charAt(0),value.charAt(0).toUpperCase())
86 | }).join('')
87 |
88 | return output;
89 |
90 | }
91 |
92 | }])
93 | ```
--------------------------------------------------------------------------------
/2-gulp/3.模块化.md:
--------------------------------------------------------------------------------
1 | ## 用gulp做模块化 并且用md5生成文件指纹 自动替换不同指纹的 js文件
2 |
3 | ### index.html
4 |
5 | 在 index.html 引入一个名为 bundle.js 的js
6 |
7 |
8 | ### entry.js
9 | ```javascript
10 | var module1 = require('./module1.js');
11 |
12 | var module2 = require('./module2.js');
13 | ```
14 | ### module1.js
15 | ```javascript
16 | console.log('我是模块一');
17 | ```
18 | ### module2.js
19 | ```javascript
20 | console.log('我是模块二');
21 | ```
22 | ### gulpfile.js
23 | ```javascript
24 | var gulp = require('gulp')
25 |
26 | var browserify = require('browserify') /*注意他不是以 gulp- 开头的包 说明他是一个node 的包 需要将node的流转成gulp的流*/
27 |
28 | // browserify 是获取入口文件的
29 |
30 | var source = require('vinyl-source-stream'); //合并js 的
31 |
32 | var buffer = require('vinyl-buffer'); // 把node 的流转为 gulp的流的
33 |
34 | var connect = require('gulp-connect') // 启动前端服务的
35 |
36 | var rev = require('gulp-rev') //生成md5后缀的
37 |
38 | var collector = require('gulp-rev-collector'); //自动替换
39 |
40 | var watch = require('gulp-watch'); //检测文件变化的
41 |
42 | gulp.task('module',function(callback){ // 定义模块化任务
43 |
44 | browserify({ //获取入口 文件
45 | entries:['./entry.js']
46 | }).bundle() //进行打包工作
47 | .pipe(source('bundle.js')) //进行合并工作 给合并好的文件取一个名字
48 | .pipe(buffer()) //将node流转为gulp流以便将文件流交给gulp的包以后能正常工作
49 | .pipe(rev()) //生成md5后缀
50 | .pipe(gulp.dest('./')) //将有md5后缀的bundle.js文件输出到同级目录
51 | .pipe(rev.manifest()) //生成对应关系
52 | .pipe(gulp.dest('./')) //将记录对应关系的json 输出到同级目录
53 | .on('end',callback)
54 |
55 | })
56 |
57 | gulp.task('reloadSrc',['module'],function(){ //定义自动替换src的任务
58 | // ['module'] 是为了将reloadSrc 这个任务 当作一个回调函数注入module任务中 达到异步转同步的效果。
59 | gulp.src(['./index.html','rev-manifest.json']) /*拿到主页 和 含有对应关系的json文件*/
60 | .pipe(collector({ //调用自动替换的包
61 | replaceReved:true //开启自动替换
62 | }))
63 | .pipe(gulp.dest('./'))//将替换好src 的主页输出到同级目录(httpServer根目录)
64 | })
65 |
66 | gulp.task('reloadPage',function(){ //定义自动刷新浏览器的任务
67 | gulp.src('.')
68 | .pipe(connect.reload())
69 | })
70 |
71 | gulp.task('watch',function(){ //定义监听任务
72 | gulp.watch(['./module1.js','./module2.js'],['module','reloadSrc']) /*当任意子模块有变化将重新运行模块化任务 和 替换src 的任务*/
73 | gulp.watch('./index.html',['reloadPage']) // 主页有更新将重新刷新浏览器
74 | })
75 |
76 | gulp.task('httpServer',function(){ //启动前端服务器i
77 | connect.server({
78 | port:8000, //端口号为8000
79 | livereload:true //打开自动刷新
80 | })
81 | })
82 |
83 |
84 | gulp.task('default',['httpServer','module','watch']) /*依次启动 前端服务器 模块化任务 和 监听任务*/
85 | ```
--------------------------------------------------------------------------------
/4-angularJS-part2/7.$style和移动端点击事件的封装.md:
--------------------------------------------------------------------------------
1 | ```js
2 | .factory('$style', function () {
3 |
4 | function fn(dom, attributeName) {
5 |
6 | var value = window.getComputedStyle ? window.getComputedStyle(dom, null)[attributeName] : dom.currentStyle[attributeName];
7 |
8 | return value
9 | }
10 |
11 | return fn
12 | })
13 |
14 | .directive("ngTouchstart", function () {
15 | return {
16 | controller: ["$scope", "$element", function ($scope, $element) {
17 | $element.bind("touchstart", onTouchStart);
18 | function onTouchStart(event) {
19 | $scope.$event = event;
20 | var method = $element.attr("ng-touchstart");
21 | $scope.$apply(method);
22 | }
23 | }]
24 | }
25 | })
26 | .directive("ngTouchmove", function () {
27 |
28 | return {
29 | controller: ["$scope", "$element", function ($scope, $element) {
30 |
31 | $element.bind("touchstart", onTouchStart);
32 | function onTouchStart(event) {
33 | $scope.$event = event;
34 | $scope.$$firstTarget = event.target;
35 | event.preventDefault();
36 | $element.bind("touchmove", onTouchMove);
37 | $element.bind("touchend", onTouchEnd);
38 | }
39 | function onTouchMove(event) {
40 | $scope.$$lastTarget = document.elementFromPoint(event.touches[0].pageX, event.touches[0].pageY);
41 | $scope.$event = event;
42 | var method = $element.attr("ng-touchmove");
43 | $scope.$apply(method);
44 | }
45 | function onTouchEnd(event) {
46 | $scope.$event = event;
47 | event.preventDefault();
48 | $element.unbind("touchmove", onTouchMove);
49 | $element.unbind("touchend", onTouchEnd);
50 | }
51 |
52 | }]
53 | }
54 | })
55 | .directive("ngTouchend", function () {
56 | return {
57 | controller: ["$scope", "$element", function ($scope, $element) {
58 |
59 | $element.bind("touchend", onTouchEnd);
60 |
61 | function onTouchEnd(event) {
62 | $scope.$event = event;
63 | if ($scope.$$firstTarget == $scope.$$lastTarget) {
64 | var method = $element.attr("ng-touchend");
65 | $scope.$apply(method);
66 | } else {
67 | var method = $element.attr("ng-touchend");
68 | if(method.indexOf('()')==-1){
69 | method = method.replace(')', ',"different")')
70 | }else{
71 | method = method.replace(')', '"different")')
72 | }
73 | $scope.$apply(method);
74 | }
75 | }
76 |
77 | }]
78 | }
79 | })
80 |
81 | ```
--------------------------------------------------------------------------------
/2-gulp/demo/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
Document
8 |
9 |
10 |
11 |
用户存在
12 |
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/3-angularJS-part1/A.angularJS-ngroute-Events.md:
--------------------------------------------------------------------------------
1 | # angularJS ngRoute Events
2 |
3 | # Let's start
4 |
5 | ```js
6 | angular.module('app',[]).run(['$rootScope',function($rootScope){
7 |
8 | $rootScope.$on('$routeChangeStart',function(event,currentRoute,previousRoute){
9 | // 第一个参数是 事件对象
10 | // 第二个参数是 当前路由
11 | // 第三个参数是 上一个路由
12 | })
13 |
14 | $rootScope.$on('$routeChangeSuccess',function(event,currentRoute,previousRoute){
15 | $rootScope.path = currentRoute.$$route.originalPath //在路由跳转成功以后获取路由路径 存储在$rootScope.path 里
16 | })
17 |
18 | $rootScope.$on('$routeChangeError',function(event,currentRoute,previousRoute,error){
19 | //第四个参数是 错误信息
20 | })
21 |
22 | $rootScope.$on('$routeUpdate',function(event,currentRoute){
23 | // 触发条件
24 | // 1、将 路由内 reloadOnSearch 属性设置为 false
25 | // 2、改变路由参数 也就是hash 中 ? 以后的 内容.
26 | })
27 | }])
28 | ```
29 |
30 | # demo (这是一个ngRoute路由自动替换选中样式的demo)
31 |
32 | ```html
33 |
34 |
35 |
36 |
37 |
38 |
39 |
Document
40 |
45 |
46 |
47 |
home
48 |
about
49 |
me
50 |
51 |
52 |
53 |
54 |
55 |
94 | ```
95 |
--------------------------------------------------------------------------------
/3-angularJS-part1/B.angularJS-ui-router.md:
--------------------------------------------------------------------------------
1 | # angularJS ui.router
2 |
3 | ## ui.router 与 ngRoute 的功能相似
4 |
5 | 区别是ui.router 能进行路由嵌套 ngRoute不行
6 |
7 | ## 如何使用
8 |
9 | 1. 下载angular-ui-router.js
10 |
11 | 2. 引入
12 |
13 | 3. 依赖注入 angular.module('app',['ui.router']);
14 |
15 | ## demo
16 |
17 | ```html
18 |
19 |
20 |
21 |
22 |
23 |
24 |
Document
25 |
37 |
38 |
39 |
40 |
41 |
42 |
home
43 |
about
44 |
me
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
105 | ```
106 |
--------------------------------------------------------------------------------
/3-angularJS-part1/2.angularJS-内置过滤器.md:
--------------------------------------------------------------------------------
1 | # 过滤器
2 | 它是用来格式化 或者 过滤 我们的数据的
3 |
4 | | 告诉 angularJS 你要开始过滤数据了
5 |
6 | : 告诉 angularJS 你要对过滤器传参了
7 |
8 | ## 1. currency
9 |
10 | 功能 格式化 数字 将他变为 货币格式
11 |
12 | 用法
13 |
14 | 1. 无参用法 {{1000 | currency}} 效果 $1,000.00
15 |
16 | 2. 有参用法1 {{1000 | currency :'¥'}} 效果 ¥1,000.00 (alt+0165)
17 |
18 | 3. 有参用法2 {{1000 | currency : char}} $scope.char='¥' 效果 ¥1,000.00
19 |
20 | ## 2. date
21 |
22 | 功能 格式化 时间 (时间戳)
23 |
24 | 用法
25 |
26 | 1. 无参用法 {{1504525453449 | date}} 效果 Sep 4, 2017
27 |
28 | 2. 有参用法1 {{1504525453449 | date : 'EEE-dd-ss'}}
29 | {{1504525453449 | date : 'yyyy-MM-dd hh mm ss EEEE'}}
30 |
31 | 解析 yyyy 表示获取年份 2017 yy 17
32 |
33 | MM 获取月份
34 |
35 | dd 获取天
36 |
37 | hh 获取小时
38 |
39 | mm 获取分钟
40 |
41 | ss 获取秒
42 |
43 | EEEE 获取星期 EEE Mon.
44 |
45 | 你可以自由组合他们
46 |
47 | 3. 有参用法2 {{1504525453449 | date : fromatStr}} $scope.fromatStr = 'yyyy/MM/dd'
48 |
49 | ## 3. filter
50 |
51 | 功能 筛选我们的数据 会使我们的数据变少或者不变 但是 数据的格式不变
52 |
53 | 用法
54 |
55 | $scope.array= [
56 | {name:'kimi',age:3},
57 | {name:'cindy',age:4},
58 | {name:'anglar',age:4},
59 | {name:'shitou',age:6},
60 | {name:'tiantian',age:5}
61 | ]
62 |
63 | 1. 无参用法 {{array | filter }} 效果 全部显示
64 |
65 | 2. 有参用法1 {{array | filter :3 }} 显示含有属性 3 的对象 {{array | filter :'i' }} 显示含有i的属性的对象
66 |
67 | 有参用法2 {{array | filter :value }} $scope.value = 'i'
68 |
69 | 有参用法3 {{array | filter :fn }} $scope.fn = function(data){ return data.age>4 }
70 |
71 | ## 4. json
72 |
73 | $scope.jsonObj = {name:'zangsan',age:18}
74 |
75 | 用法 {{ jsonObj | json }} 就这一个用法
76 |
77 | 效果 将 js 对象 格式化为 json 对象
78 |
79 | ## 5. limitTo
80 |
81 | 他是用来限制 string 或者 array 这两种数据类型的 显示的长度 {{有效的那一部分}}
82 |
83 | 用法
84 |
85 | 无参用法 会全部显示 {{ 'nihao' | limitTo }} 效果 nihao
86 |
87 | string {{ 'nihao' | limitTo :2 }} 效果 ni
88 |
89 | array {{ [1,2,3,4] | limitTo :3 }} 效果 [1,2,3]
90 |
91 | tip: array 里面可以放任何东西
92 |
93 | ## 6. lowercase
94 |
95 | 功能 小写全部字母 string
96 |
97 | 用法 仅有无参 用法 {{ 'Hello World' | lowercase }} => hello world
98 |
99 | ## 7. uppercase
100 |
101 | 功能 大写全部字母 string
102 |
103 | 用法 仅有无参 用法 {{ 'Hello World' | uppercase }} => HELLO WORLD
104 |
105 | ## 8. number
106 |
107 | 无参用法
108 |
109 | {{1000 | number}} 效果 1,000
110 |
111 | 注意 默认精确到小数点后三位。
112 |
113 | 有参数用法
114 |
115 | {{1000 | number :2 }} 效果 1,000.00
116 |
117 | {{3.141592653 | number :3 }} 效果 3.142
118 |
119 | ## 9. orderBy
120 |
121 | demo
122 | ```javascript
123 | $scope.array= [
124 | {name:'kimi',age:3},
125 | {name:'cindy',age:4},
126 | {name:'anglar',age:4},
127 | {name:'shitou',age:6},
128 | {name:'tiantian',age:5}
129 | ];
130 | ```
131 | ```html
132 |
133 |
134 | |
135 | {{item.name}}
136 | |
137 |
138 | {{item.age}}
139 | |
140 |
141 |
142 | ```
143 |
144 | 用法 1 orderBy :'-name' 这是通过 属性name里面值 来进行降序排列
145 |
146 | 2 orderBy :'age' 这是通过 属性age里面值 来进行升序排列
147 |
148 | 3 orderBy : value 这是通过 $scope下的value 属性里面值来进行排序 也就是 动态排序
149 |
150 | ## 如何通过ng-bind使用过滤器
151 |
152 | ```html
153 |
154 | ```
155 |
--------------------------------------------------------------------------------
/1-git/2.合作开发及其冲突.md:
--------------------------------------------------------------------------------
1 | # 多人合作开发
2 |
3 | ## 新建分支
4 |
5 | ### git branch
6 |
7 | 语法 :
8 | git branch branchName
9 |
10 | 例子 :
11 | git branch shanshan
12 |
13 | ## 查看分支 / 查看远端分支
14 |
15 | ### git branch / git branch -a
16 |
17 | 语法 :
18 | git branch / git branch -a
19 |
20 | 例子 :
21 | git branch / git branch -a
22 |
23 |
24 | ## 切换分支
25 |
26 | ### git checkout
27 |
28 | 语法 :
29 | git checkout branchName
30 |
31 | 例子 :
32 | git checkout shanshan
33 |
34 | ## 创建并切换分支
35 |
36 | ### git chekout -b
37 |
38 | 语法 :
39 | git checkout -b branchName
40 |
41 | 例子 :
42 | git checkout -b shanshan
43 |
44 | ## 同步分支
45 |
46 | ### git fetch
47 |
48 | 语法 :
49 | git fetch origin branchName
50 |
51 | 例子 :
52 | git fetch origin ds/feature1
53 |
54 |
55 | ## 创建并切换分支并且同步另一个远端分支
56 |
57 | ### git checkout -b branchA origin/branchB
58 |
59 | 语法 :
60 | git checkout -b branchA origin/branchB
61 |
62 | 例子 :
63 | git checkout -b ds/feature1 origin/ds/feature1
64 |
65 |
66 | ## 发布分支
67 |
68 | ### git push origin (将本地分支发布到远端)
69 |
70 | 语法 :
71 | git push origin branchName
72 |
73 | 例子 :
74 | git push origin shanshan
75 |
76 | ### git push origin branchA:branchB (将分支branchA发布到远端新的分支branchB)
77 |
78 | 语法 :
79 | git push origin branchName:newBranch
80 |
81 | 例子 :
82 | git push origin shanshan:dev
83 |
84 | ## 拉取远端分支
85 |
86 | 语法 :
87 | git pull origin branchName
88 |
89 | 例子 :
90 | git pull origin shanshan
91 |
92 | ## 删除本地分支
93 |
94 | ### git branch -d/-D (大写是强制删除)
95 |
96 | 语法 :
97 | git branch -d branchName
98 |
99 | 例子 :
100 | git branch -d shanshan
101 |
102 | ## 删除远端分支
103 |
104 | ### git push origin :
105 |
106 | 语法 :
107 | git push origin :branchName
108 |
109 | 例子 :
110 | git push origin :shanshan
111 |
112 | ## 合并分支
113 |
114 | ### git merge
115 |
116 | 语法 :
117 | git merge branchName
118 |
119 | 例子 :
120 | git merge shanshan (need git checkout master)
121 |
122 | ### git cherry-pick
123 |
124 | 语法 :
125 | git cherry-pick commitId
126 |
127 | 例子 :
128 |
129 | 假设你在 dev01 分支开发了2个新功能(A,B),对应2个 commitA, commitB, 但是上线前被告知只能上线功能 A,此时可以:
130 |
131 | git cherry-pick f1c1e03d
132 |
133 | f1c1e03d 是 dev01 上 commitA 的 commitId
134 | ## 终止合并
135 |
136 | 在 git merge 的过程中,我们可能遇到冲突,需要手动合并,在这期间如果出现了无法合并的情况我们就需要用到终止合并了。
137 |
138 | ```bash
139 | git merge --abort
140 | ```
141 |
142 | 这行命令可以帮助我们终止正在进行的合并。
143 | ### git merge --abort
144 | 语法:
145 | git merge --abort
146 | 例子:
147 | git merge --abort
148 |
149 | ## 删除本地存在但远端不存在的分支
150 |
151 | ### git remote prune origin
152 |
153 | 语法 :
154 | git remote prune origin
155 |
156 | 例子 :
157 | git remote prune origin
158 |
159 |
160 | # 冲突的解决
161 |
162 | ## push失败
163 |
164 | 1.可能是
165 | 本地仓库不是最新的需要pull一下去拉取远端的更新
166 |
167 | 2.还可能是
168 |
169 | 你和你的同事修改了同一个文件夹的同一行代码 机器不知道 选择谁的保存下来需要人工合并。
170 |
171 | git pull 然后找到起冲突的文件修改合并
172 |
173 | git add .
174 |
175 | git commit -m "合并"
176 |
177 | git push
178 |
179 | # 不使用分支的多人合作
180 |
181 | 利用master 进行多人合作开发 也是可以的
182 | 分别新建或者修改不同的文件或者文件夹来进行多人合作开发
183 | 流程是
184 | git add .
185 | git commit -m ''
186 | git push ------如果失败先pull 一下
187 |
188 | :wq 是保存并退出的意思(在输入:的时候记得要用英文 不然没有效果)
189 |
190 | # git 的三个区
191 |
192 | 工作区
193 | 暂存区
194 | 版本库(本地版本库 远端版本库)
195 |
196 | ·新建一个文件默认就是在工作区
197 |
198 | ·通过git add 命令 将文件添加到暂存区
199 |
200 | 例子: git add index.html
201 |
202 | ·通过git commit -m "" 命令将文件添加到本地版本库
203 |
204 | 例子: git commit -m "我新建了一个主页"
205 |
206 | ·通过git push 命令将文件上传到远端仓库也就是远端版本库
207 |
208 | 例子: git push
209 |
210 | 注意:
211 | 如果你的文件特别多 不需要一个一个的 git add
212 | 可以通过 git add . 来一次性添加 . 就是匹配所有的意思
213 |
--------------------------------------------------------------------------------
/demos/多级联动筛选demo/selectfunc.js:
--------------------------------------------------------------------------------
1 | const serverMessage = {
2 | "success":true,
3 | "code":"0",
4 | "data": {
5 | "list": [
6 | {
7 | "name":"检修电工",
8 | "select":false,
9 | "list": [
10 | {
11 | "name":"检修班组一",
12 | "select":false,
13 | "list":[
14 | {
15 | "id":"1",
16 | "name":"检修-赵工",
17 | "role":"E",
18 | "select":false,
19 | },
20 | {
21 | "id":"2",
22 | "name":"检修-钱工",
23 | "role":"E",
24 | "select":false,
25 | }
26 | ]
27 | },
28 | {
29 | name:"检修班组二",
30 | "select":false,
31 | "list":[
32 | {
33 | "id":"3",
34 | "name":"检修-孙工",
35 | "role":"E",
36 | "select":false,
37 | },
38 | {
39 | "id":"4",
40 | "name":"检修-李工",
41 | "role":"E",
42 | "select":false,
43 | }
44 | ]
45 | }
46 |
47 | ]
48 | },
49 | {
50 | "name":"运行电工",
51 | "select":false,
52 | "list": [
53 | {
54 | "id":"5",
55 | "name":"运行电工NO1",
56 | "role":"E",
57 | "select":false,
58 | },
59 | {
60 | "id":"6",
61 | "name":"运行-张工",
62 | "role":"E",
63 | "select":false,
64 | }
65 | ]
66 | }
67 | ]
68 | }
69 | }
70 |
71 |
72 | function addSelectAttr(list){
73 | if(Array.isArray(list)){
74 | for(const item of list){
75 | item.select = false;
76 | if(item['list']){
77 | addSelectAttr(item.list)
78 | }
79 | }
80 | }
81 | }
82 |
83 | function changeSelectStatus(selectVal,item){
84 | item.select = !item.select; //改变select状态
85 | if(item['list']){
86 | if(Array.isArray(item.list)){
87 | for(const subItem of item.list){
88 | changeSelectStatus(item.select,subItem);
89 | }
90 | }
91 | }
92 | return item
93 | }
94 |
95 | function findId (item,selectedItemArr=[]) {
96 | if(item['id']){
97 | selectedItemArr.push(item)
98 | }else{
99 | if(item['list']){
100 | for(const subItem of item.list){
101 | findId(subItem,selectedItemArr);
102 | }
103 | }
104 | }
105 | return selectedItemArr
106 | }
107 |
108 | function filterDidSelect (list) {
109 | let resultList = [];
110 | for(const item of list){
111 | if(item.select){ // select为true 表示已经选择
112 | resultList = resultList.concat( findId(item,resultList) )
113 | }else{ // 查看子元素是被选择
114 | resultList = resultList.concat( filterDidSelect(item['list']?item.list:[]) )
115 | }
116 | }
117 | let finallyItemArr = []
118 | resultList.forEach((item)=>{ // 数组去重
119 | let ok = true;
120 | finallyItemArr.forEach((finallyItem)=>{
121 | if(finallyItem.id === item.id){
122 | ok = false;
123 | }
124 | })
125 | if(ok){
126 | delete item.select;
127 | finallyItemArr.push(item)
128 | }
129 | })
130 | return finallyItemArr;
131 | }
132 |
133 | changeSelectStatus(true,serverMessage.data.list[Math.floor(Math.random()*2)]) // 测试 选择函数
134 |
135 | console.log(JSON.stringify(serverMessage))
136 |
137 | const result = filterDidSelect(serverMessage.data.list) // 测试筛选函数
138 |
139 | console.log(result); // 输出结果
140 |
--------------------------------------------------------------------------------
/angularJS-tab切换/gulpfile.js:
--------------------------------------------------------------------------------
1 | var obj = [{
2 | name:'热菜',
3 | value:[{
4 | name:'西红柿炒鸡蛋',
5 | price:.1
6 | },{
7 | name:'红烧肉',
8 | price:.2
9 | },{
10 | name:'醋溜排骨',
11 | price:.3
12 | }
13 | ]
14 | },{
15 | name:'凉菜',
16 | value:[{
17 | name:'拍黄瓜',
18 | price:.4
19 | },{
20 | name:'老醋花生',
21 | price:.5
22 | },{
23 | name:'雪盖火焰山',
24 | price:.6
25 | }]
26 | },{
27 | name:'甜点',
28 | value:[{
29 | name:'拔丝香蕉',
30 | price:.7
31 | },{
32 | name:'蛋挞',
33 | price:.8
34 | },{
35 | name:'慕斯蛋糕',
36 | price:.9
37 | }]
38 | },{
39 | name:'饮料',
40 | value:[{
41 | name:'北冰洋',
42 | price:1
43 | },{
44 | name:'橙汁',
45 | price:1.1
46 | },{
47 | name:'青岛啤酒',
48 | price:1.2
49 | }]
50 | }]
51 |
52 | var gulp = require('gulp')
53 |
54 | var webserver = require('gulp-webserver') //这个启动后端服务器的 包
55 |
56 | var connect = require('gulp-connect') //这个是启动前端服务器的 包
57 |
58 | var urlTool = require('url');
59 |
60 | var qs = require('qs');
61 |
62 | gulp.task('mockServer',function(){
63 | gulp.src('.')
64 | .pipe(webserver({
65 | port:3000,
66 | middleware:function(req,res,next){
67 |
68 | var method = req.method;
69 |
70 | var urlObj = urlTool.parse(req.url)
71 |
72 | var pathname = urlObj.pathname;
73 |
74 | res.setHeader('Access-Control-Allow-Origin','*')
75 |
76 | if(method == 'GET'){
77 |
78 | switch (pathname) {
79 | case '/goodslist':
80 | res.setHeader('content-type','application/json;charset=utf-8')
81 | res.write(JSON.stringify(obj));
82 | res.end();
83 | break;
84 |
85 | default:
86 | break;
87 | }
88 |
89 | }else if(method == 'POST'){
90 |
91 | var postParamsStr = '';
92 |
93 | req.on('data',function(chunk){
94 | postParamsStr +=chunk;
95 | })
96 |
97 | req.on('end',function(){
98 |
99 |
100 | var postParamsJson =
101 |
102 | postParamsStr.indexOf('{')!=-1&&postParamsStr.indexOf('}')!=-1
103 |
104 | ?
105 |
106 | JSON.parse(postParamsStr)
107 |
108 | :
109 |
110 | qs.parse(postParamsStr)
111 |
112 |
113 |
114 |
115 | switch (pathname) {
116 | case '/login':
117 | if(postParamsJson.userName == '张三' && postParamsJson.password==123456) {
118 |
119 | }
120 | break;
121 | case '/register':
122 |
123 | break;
124 | default:
125 | break;
126 | }
127 | })
128 |
129 |
130 |
131 |
132 | }
133 |
134 | }
135 | }))
136 | })
137 |
138 |
139 | gulp.task('httpServer',function(){
140 | connect.server({
141 | port:8080,
142 | livereload:true
143 | })
144 | })
145 |
146 | gulp.task('default',['mockServer','httpServer'])
147 |
148 |
--------------------------------------------------------------------------------
/3-angularJS-part1/5.angularJS-自定义服务.md:
--------------------------------------------------------------------------------
1 | # angularJS 五大服务
2 |
3 | angularJS 除了内置服务还 提供了我们自定义服务的接口
4 |
5 | ## 什么是服务
6 |
7 | 服务是 一个 对象 object 或者是 一个函数 function/Function。 (可以是构造函数)
8 |
9 | ## 1. constant
10 |
11 | 功能 : 定义一个全局常量
12 |
13 | ### 用法 :
14 |
15 | 全局多次需要复用的 常量需要提取到 constant 里面
16 | ```javascript
17 | angular.module('app',[])
18 | .constant('yourServiceName',{ //第一个参数 是你的服务的名称 类型 string
19 | key1:'value', //第二个参数 是你服务的具体实现 类型 object
20 | key2:0,
21 | key3:true,
22 | key4:function(){},
23 | key5:{},
24 | key6:[]
25 | })
26 | ```
27 | ## 2. value
28 |
29 | 功能 : 定义一个全局变量
30 |
31 | ### 用法 :
32 |
33 | 全局多次需要复用的 变量需要提取到 value 里面
34 | ```javascript
35 | angular.module('app',[])
36 | .value('yourServiceName',{ //第一个参数 是你的服务的名称 类型 string
37 | key1:'value', //第二个参数 是你服务的具体实现 类型 object
38 | key2:0,
39 | key3:true,
40 | key4:function(){},
41 | key5:{},
42 | key6:[]
43 | })
44 | ```
45 | 与 constant的区别
46 |
47 | 1. constant 能在 config 里面注入 value不能
48 |
49 | 2. constant 一般用来定义全局常量 value 一般用来定义全局变量 当然你不这样做也是可以的
50 |
51 | ## 3. service
52 |
53 | 功能: 他是一个构造函数
54 |
55 | ### 用法:
56 | ```javascript
57 | angular.module('app',[])
58 | .service('yourSeriveName',['$http',function($http){
59 | //第一个参函数是服务名称 string
60 | //第二个参数是服务的具体实现 function
61 |
62 | this.attributeName = string/boolean/function/object/number;
63 |
64 | }])
65 | ```
66 | 场合: 需要多次调用的构造函数 可以提取成 service //高复用 低耦合
67 |
68 | ## 4. factory
69 |
70 | 功能: 他是一个普通函数
71 |
72 | ### 用法:
73 | ```javascript
74 | angular.module('app',[])
75 | .factory('yourServiceName',[function(){ //工厂函数
76 | return{
77 | name:'zhangsan',
78 | age:18,
79 | work:function(){
80 | console.log('go to work')
81 | },
82 | certificate:[],
83 | isAdult:true
84 | }
85 | }])
86 | ```
87 | ## 5. provider
88 |
89 | 他是一个 供应商服务
90 |
91 | 他是一个 高阶函数 -> 高阶函数 就是 根据不同的参数返回不同的函数的函数
92 |
93 | 他能够返回 value factory service 能够代替他们的功能
94 |
95 |
96 | ### 用法 1
97 | ```javascript
98 | angular.module('app',[])
99 | .provider('yourServiceName',function(){
100 | return {
101 | $get:function(){
102 | return { //返回 factory
103 | key:'value',
104 | fn:function(){
105 |
106 | }
107 | }
108 | }
109 | }
110 | })
111 | ```
112 | ### 用法 2
113 | ```javascript
114 | angular.module('app',[])
115 | .provider('yourServiceName',function(){
116 | return {
117 | $get:function(){
118 | return new function(){ //返回 service
119 | this.attributeName = string/boolean/function/object/number;
120 | }
121 | }
122 | }
123 | })
124 | ```
125 |
126 | ### 用法 3
127 | ```javascript
128 | angular.module('app',[])
129 | .provider('yourServiceName',function(){
130 | this.$get=function(){
131 | return { //返回 factory
132 | key:'value',
133 | fn:function(){
134 |
135 | }
136 | }
137 | }
138 | })
139 | ```
140 |
141 | ### 用法 4
142 | ```javascript
143 | angular.module('app',[])
144 | .provider('yourServiceName',function(){
145 | this.$get=function(){
146 | return new function(){ //返回 service
147 | this.attributeName = string/boolean/function/object/number;
148 | }
149 | }
150 | })
151 | ```
152 |
153 |
154 |
155 |
--------------------------------------------------------------------------------
/2-gulp/demo/gulpfile.js:
--------------------------------------------------------------------------------
1 | var gulp = require('gulp');
2 | var webserver = require('gulp-webserver');
3 | var qs = require('qs')
4 | var url = require('url');
5 |
6 | var fs = require('fs');
7 |
8 | var buffer = fs.readFileSync('./dataBase.json');
9 |
10 | var dataBase = {};
11 |
12 | if(buffer.length){
13 | dataBase=JSON.parse(buffer.toString());
14 | }else{
15 | dataBase = {
16 | users:[]
17 | }
18 | }
19 |
20 | gulp.task('mockServer', function () {
21 | gulp.src('.')
22 | .pipe(webserver({
23 | port: 3000,
24 | middleware: function (req, res, next) {
25 | res.setHeader('Access-Control-Allow-Origin', '*');
26 | var method = req.method,
27 | urlObj = url.parse(req.url),
28 | pathname = urlObj.pathname;
29 |
30 | if (method == 'POST') {
31 | var postDataStr = '';
32 | req.on('data', function (chunk) {
33 | postDataStr += chunk;
34 | })
35 |
36 | req.on('end', function () {
37 |
38 | //1 JSON
39 | //2 qs
40 | var postDataJson;
41 |
42 | if (postDataStr.indexOf('{') !== -1 && postDataStr.indexOf('}') !== -1) {//判断是否是json数据还是表单数据
43 | postDataJson = JSON.parse(postDataStr) //处理json str
44 | } else {
45 | postDataJson = qs.parse(postDataStr) //处理表单 str
46 | }
47 | //得到一个对象 那么就方便了
48 |
49 | switch(pathname){
50 | case '/register':
51 | console.log(dataBase)
52 | var users = dataBase['users'];
53 | res.setHeader('content-type','application/json;charset=utf-8')
54 | var exist = false;
55 | var newUser = {
56 | user: postDataJson.user,
57 | password:postDataJson.password
58 | }
59 | for( var i = 0, length = users.length; i < length; i++ ){
60 | if(users[i].user === postDataJson.user){
61 | exist = true;
62 | break;
63 | }
64 | }
65 |
66 | if(!exist){
67 | users.push(newUser);
68 | var ok = fs.writeFileSync('./dataBase.json',JSON.stringify(dataBase));
69 | if(!ok){
70 | res.write('{"status":"1"}') // 1代表 注册成功
71 | }else{
72 | res.write('{"status":"0"}') // 0代表 服务器内部错误 注册失败
73 | }
74 | }else{
75 | res.write('{"status":"-1"}') // -1代表用户存在
76 | }
77 |
78 |
79 | res.end();
80 | break;
81 | case '/detectionUser':
82 |
83 | var users = dataBase['users'];
84 | var exist = 0;
85 | if(users){
86 | for(var i = 0,length=users.length; i
home'
20 | })
21 | .when('/about',{
22 | template:'
'
23 | })
24 | .when('/me',{
25 | template:'
'
26 | })
27 | .otherwise('/home')
28 | }])
29 | ```
30 | ```html
31 |
32 |
33 |
34 |