Commit b6132646 authored by shangbj's avatar shangbj

update

parent 229f5f33
Pipeline #11 canceled with stages
......@@ -2,22 +2,22 @@
### 前端组相关hosts
```
192.168.155.65 gitlab.dev.daikuan.com
192.168.145.8 wiki.dev.daikuan.com
192.168.145.8 dashboard.dev.daikuan.com
192.168.145.8 mock.dev.daikuan.com
192.168.145.8 placehold.it
192.168.155.149 rap.crm.yxqiche.com
```
### dashboard站点
http://dashboard.dev.daikuan.com
### 相关站点
* easy mock: http://mock.dev.daikuan.com
* wiki: http://wiki.dev.daikuan.com
* dashboard: http://dashboard.dev.daikuan.com
### wiki项目
```bash
git clone http://gitlab.dev.daikuan.com/fe/wiki.git
# clone下来push即更新
git clone ssh://git@git.taoche.com:52000/fe/wiki.git
```
### 使用说明
......
......@@ -7,27 +7,48 @@
* [sync命令](环境/sync命令.md)
* [测试机器](环境/测试机器.md)
* [远端构建机器环境](环境/远端构建机器环境.md)
* [上线脚本](环境/上线脚本.md)
* [Linux目录结构及常用命令](环境/Linux目录结构及常用命令.md)
### 项目相关
* [npm模块管理](项目相关/npm模块管理.md)
* [曝光统计](项目相关/曝光统计.md)
* [上线流程](项目相关/上线流程.md)
* [taoche上线流程](项目相关/上线流程.md)
* [npm依赖版本管理](项目相关/npm依赖版本管理.md)
* [yarn/npm](项目相关/yarn.md)
* [crm项目踩坑](项目相关/crm项目踩坑.md)
* [曝光统计](项目相关/曝光统计.md)
* ant-design-pro踩坑指南
* [1.x踩坑手记(包含react)](项目相关/ant-design-pro踩坑指南/1.x踩坑手记.md)
* [2.x踩坑手记](项目相关/ant-design-pro踩坑指南/2.x踩坑手记.md)
* [gulp/webpack项目区别(deprecated)](项目相关/gulp项目与webpack项目命令区别.md)
* [gulp项目文档(deprecated)](项目相关/gulp项目文档.md)
* H5与App交互
* [C端H5与App交互](项目相关/H5与App交互/C端h5与app交互.md)
* [B端H5与App交互(一)](项目相关/H5与App交互/B端h5与app交互1.md)
* [B端H5与App交互(二)](项目相关/H5与App交互/B端h5与app交互2.md)
* [h5页面在微信中的分享](项目相关/H5页面在微信中的分享.md)
* [淘车活动专题相关处理](项目相关/淘车活动专题相关处理.md)
### 规范
* [分支开发规范](规范/分支开发规范.md)
* [ES6编码规范](规范/es6编码规范.md)
* [vue编码规范](规范/vue编码规范.md)
* [Airbnb-React-JSX编码规范](规范/Airbnb-React-JSX编码规范.md)
* [ES6编码规范](规范/es6编码规范.md)
* [分支开发规范](规范/分支开发规范.md)
### git
* [git基本使用](git/git基本使用.md)
* [git分支管理策略](git/git分支管理策略.md)
### 技术分享
* [yarn vs npm vs cnpm](技术分享/yarn.md)
* [react生命周期](技术分享/react生命周期.md)
### 其它
* [推荐网站](其它/推荐网站.md)
* [文档](其它/文档.md)
\ No newline at end of file
* [文档](其它/文档.md)
### 交接
* [node中间层](交接/node中间层.md)
* [前端测试机](交接/前端测试机.md)
* [仓储系统文档](交接/仓储系统文档.md)
* [堡垒机](交接/堡垒机.md)
* [会员合同系统文档](交接/会员合同系统文档.md)
* [gitlab-ci](交接/gitlab-ci.md)
* [构建机](交接/构建机.md)
\ No newline at end of file
```bash
ssh qirenzhong@10.4.8.2 -p 20001
673.OGmm
```
### 线上机器:
* 10.4.3.27
* 10.4.3.23
\ No newline at end of file
```json
"ldap": {
"server": "ldap://192.168.177.201:389",
"bindDN": "CN=cheinfo,OU=SysAcc,DC=che,DC=tc",
"password": "tw2pR2%W&Vz&^W#j",
"filter": {
"base": "OU=Staff,DC=che,DC=tc",
"attributeName": "username"
}
}
```
\ No newline at end of file
gitlab-ci配置:
以下配置可以给所有antd-pro后端项目用
```yml
stages:
- build
- deploy
# 编译
build:
stage: build
cache:
key: "$CI_PROJECT_NAME"
paths:
- node_modules/
tags:
- manager
artifacts:
name: "$CI_BUILD_REF_NAME"
expire_in: 2 week
paths:
- dist/
before_script:
- yarn config set registry $NPM_REGISTRY
- yarn
script:
- yarn run build
- mv dist $CI_PROJECT_NAME && mkdir dist && mv $CI_PROJECT_NAME dist
only:
- master
# 部署
deploy:
stage: deploy
tags:
- crm
script:
- fe-deploy
- fe-refresh http://$CDN_HOST/$CI_PROJECT_NAME/
only:
- master
```
### 环境变量说明:
* $CI_PROJECT_NAME: 仓库名称
* $CI_BUILD_REF_NAME: 分支名称
* $NPM_REGISTRY/$CDN_HOST都在gitlab管理界面fe组的配置里指定
### tags
指定哪一个runner进程执行ci,gitlab管理界面fe组中配置的runner
### only
一般设置只在master分支执行ci构建
\ No newline at end of file
### 灰度机器:
* pc: 172.28.30.54:8001
* m: 172.28.30.54:8002
### 线上机器:
* pc: 172.28.30.52:8001/172.28.30.53:8001
* m: 172.28.30.52:8002/172.28.30.53:8002
### 自动化发布系统
http://fb.yixin.dk:2001/user/login
发布步骤:
1. 登录
![](../resources/mid/1.png)
2. 右上角选nodejs
3. 选服务更新,填入必要信息
![](../resources/mid/2.png)
4. 其中站点/服务名称为中间层项目名taoche-m-midway/taoche-pc-midway, 文件为gitlab对应项目pipline构建的发布包(中间层项目合并master分支进行构建打包), 部署主机node-web-gray为灰度机器,node-web-prod为生产机器
\ No newline at end of file
### 接口文档
http://intra.taoche.com:8090/pages/viewpage.action?pageId=31523596
### 原型
http://192.168.145.11/%E4%BF%9D%E5%8D%96/%E5%B4%94%E4%BC%9F/DEMO/#g=1&p=1_1%E5%BA%93%E5%AD%98%E8%AF%A6%E6%83%85
#### 仓库
ssh://git@git.taoche.com:52000/fe/caigou.git
\ No newline at end of file
#### 菜单权限
http://intra.taoche.com:8090/pages/viewpage.action?pageId=31064113
#### 原型
http://192.168.145.11/cuiwei/hetong/#g=1&p=1_2_1%E6%9F%A5%E7%9C%8B%E5%9F%BA%E6%9C%AC%E4%BF%A1%E6%81%AF
#### 接口文档
http://192.168.155.56:8080/docs/contract/#api-%E5%90%88%E5%90%8C%E7%AE%A1%E7%90%86%E5%BB%BA%E8%AE%BE%E4%B8%AD-contract_scheduling_info
#### 测试环境地址
http://192.168.155.125:8865/contract-manager-app/index.html
### 进入测试环境之前先调一下登录
http://192.168.155.125:8865/contract-manager-app/v1/contract-manage/login?t=6288
http://localhost:8000/contract-manager-app/v1/contract-manage/login2221122132343?t=2606
#### 仓库
ssh://git@git.taoche.com:52000/fe/contract.git
### 其他说明
会员合同系统未使用docker, 入口页面还在后端web项目中,权限部分通过后端返回的角色来区分,与其他系统使用权限码不同
\ No newline at end of file
### 通用
192.168.145.8
### docker构建
192.168.183.154
### 中间层测试环境
192.168.145.8
/data1/services/taoche-m-midway
/data1/services/taoche-pc-midway
\ No newline at end of file
### 淘车堡垒机
https://172.28.6.4
### 易鑫堡垒机
https://opm.yixin.dk
\ No newline at end of file
root/taoche.com
\ No newline at end of file
## 构建机(145.8)上运行的项目
### dashboard
/home/dashboard
### wiki
/home/wiki
### mock
/home/easy-mock
### placeholder
/home/placeholder
### taoche-pc-midway
/data1/services/taoche-pc-midway
### taoche-m-midway
/data1/services/taoche-m-midway
## 构建机上的可用脚本
* fe-deploy
* fe-refresh
* fe-refresh-huidu
* fe-docker
* /root/fe-scripts/kill_service.sh 关闭所有服务(不包含taoche中间层项目)
* /root/fe-scripts/start_service.sh 启动所有服务(不包含taoche中间层项目)
#### secretId
AKIDGQQOFx2t6CIOL7tAUl197ub7TqBLYEza
#### secretKey
ZzEJDwUwDIDxWxRkspfNvITYYO4Zt206
#### bucket
staticfiles-1253226081
#### region
ap-beijing-1
\ No newline at end of file
......@@ -4,6 +4,8 @@
* 奇舞周刊: https://weekly.75team.com/
* awesome-vue: https://github.com/vuejs/awesome-vue#libraries--plugins
* 阮一峰: http://www.ruanyifeng.com/blog/
* 百度前端研发技术周刊: http://fex.baidu.com/articles/
* React.js 小书: http://huziketang.mangojuice.top/books/react/
### 工具类
* linux命令查询: http://man.linuxde.net/
......
# react生命周期
简版:
![](../resources/simple.png)
全版:
![](../resources/full.png)
\ No newline at end of file
......@@ -26,7 +26,7 @@
将如下代码在命令行中执行(不支持windows cmd)
`curl -s http://gitlab.dev.daikuan.com/npm/install_env/raw/master/install.sh | sh`
`curl -s http://git.taoche.com/npm/install_env/raw/master/install.sh | sh`
### 手动配置淘宝源
yarn:
......
### linux目录结构
![linux目录结构](http://img2.yixinfinance.com/taoche/linux-catalog.png "linux目录结构")
### linux常用命令(命令查询: http://man.linuxde.net/)
#### ssh远程登录:ssh
* 实例
ssh登录(默认22端口)
```
ssh root@192.168.8.168
```
ssh登录指定端口
```
ssh -p 80 root@192.168.8.168
// 80为端口,root为用户
```
#### 新建文件或目录:touch/mkdir
* 实例
创建一个hello.txt文件
```
touch hello.txt
```
创建一个myproject目录
```
mkdir myproject
```
#### 写入文件:echo
* 实例
在hello.txt中写入Thanks
```
echo Thanks > hello.txt
```
#### 查看文件内容:cat
* 实例
查看hello.txt中的内容
```
cat hello.txt
// Thanks
```
#### 复制文件或目录:cp
* 实例
复制文件hello.txt,新文件为new.txt
```
cp hello.txt new.txt
ls
// hello.txt new.txt
```
复制目录myproject,新目录为newproject
```
cp -r myproject newproject
// -r 递归复制目录的内容
```
#### 删除文件或目录:rm
* 实例
删除文件hello.txt
```
cp hello.txt new.txt
ls
// new.txt
```
删除目录myproject
```
rm -r myproject
ls
// newproject
// -r 递归删除目录的内容
rm -rf myproject
// -rf 递归删除目录的内容,不给出提示。
```
#### 移动文件或目录:mv
* 实例
移动目录newproject到home目录下
```
mv -f newproject /home
cd home
ls
// newproject
// -f 强制覆盖已存在的目录或文件
```
#### 查看文件及目录属性:ls
* 实例
查看当前目录下所有文件及目录的属性
```
ls -l
// drwxr-xr-x root root 7 Apr 8 14:39 myproject
// -rw-r--r-- root root 7 Apr 8 14:39 hello.txt
```
#### 修改文件及目录权限:chmod
* 实例
修改当前文件及目录权限
```
chmod 700
// 读对应权限4 写对应权限2 执行对应权限是1 没有权限对应是0
// 700 的百位是属主权限,十位是属组权限,个位是其他用户权限(7表示读、写、执行权限 4+2+1)
```
![权限码说明](http://img2.yixinfinance.com/taoche/quanxian.png "权限码说明")
\ No newline at end of file
### 上线脚本
```bash
# 使用方式:
# fe-deploy [要上线的builds地址]
fe-deploy http://git.taoche.com/fe/taoche/builds/2557
```
### 刷新CDN脚本
```bash
# 使用方式
# fe-refresh [要刷新的url或目录]
# img[1-4]的域名下只提供一个即可,会自动将img[1-4]全部刷新
# 刷新url
# 多个空格隔开
# 需要带着目前线上对应url的时间戳
fe-refresh http://img1.yixinfinance.com/taoche/common/common-tc.css?v=201808021348 http://img1.yixinfinance.com/taoche/common/common.js?v=201808021348
# 刷新目录
# 刷新该目录下所有url, 请谨慎使用
fe-refresh http://img1.yixinfinance.com/taoche/common/
```
\ No newline at end of file
......@@ -2,7 +2,7 @@
使用以下脚本(terminal或git bash):
```bash
curl -s http://gitlab.dev.daikuan.com/npm/install_env/raw/master/install.sh | sh
curl -s http://git.taoche.com/npm/install_env/raw/master/install.sh | sh
```
脚本会执行如下操作:
......
# B端H5与app交互(一)
## 1 页面跳转
#### 1.1 HTML5跳转到原生页面
* 协议: `taoche://gopage?page=页面名称#参数`
* 示例: `taoche://gopage?page=cheliangtiaoxuan#abc=123&cde=345&efg=789`
* 说明:
- 这里的页面名称是名称拼音全拼小写
- 传递的参数格式是标准的URL参数格式
- 参数与页面名称之间用# 号分割
#### 1.2 HTML5跳转到网页
* 协议:`taoche://gourl?url=网页地址?参数`
##### 1.2.1 HTML5跳转到本地网页
* 协议:`taoche://gourl?url=相对.html路径?参数`
* 示例:Html5跳转到评估信息明细页面
`taoche://gourl?url=Html/PurchaseManage/PurchaseWorkOrderDetail.html?fldId=73&sessionid=TaocheUsedCarDealerSAAS_UserToken_Dandre&sessionKey=697c3544888346d6ab3f7f8572c0672e&userid=dandre`
* 说明:
- url相对于Html.bundle文件夹的路径
- 参数为标准URL参数
- 跳转到本地HTML5页面需要传递sessionId、sessionKey、userId,特殊页面可能还需要传递其他信息,具体页面按需求具体对待
##### 1.2.2 HTML5跳转到在线网页
* 示例:跳转到淘车网`taoche://gourl?url=http://www.taoche.com`
* 说明:
- url为完整的http或https协议的URL,可带URL参数
#### 1.3 返回上级页面
* 协议:`taoche://goback`
#### 1.4 导航栏右边自动显示保存按钮
* 协议:`taoche://gourl?url=网页地址#baocun:按钮点击后调用的js方法名`
* 示例:`taoche://gourl?url=Html/CarManage/sss.html?#baocun:save()`
* 说明:
- “#baocun:按钮点击后调用的js方法名”是作为URL的一个参数传递的,所以当有多个URL参数时,#baocun前要加一个&连接符
- 适用于所有网页跳转
- 按钮点击后调用的js方法名默认为save()
#### 1.5 原生组件
* 协议:`taoche://component?component=组件名称#参数`
* 示例:`taoche://component?component=pay#type=1&localorderno=订单号`
* 说明:
- pay: 组件名称;#type为需要的参数部分
- 适应于所有网页调用原生组件
## 2 方法调用
#### 2.1 调用方法
* 协议:`taoche://function?function=方法名#参数`
##### 2.1.1 添加导航条右上角按钮
* 协议:`taoche://function?function=addRightBarButton&title=xxx&callback=xxx`
##### 2.1.2 判断原生导航条是否隐藏
* 协议:`taoche://function?function=isNavigationBarHidden&callback=xxx`
#### 2.2 显示提示语 会自动隐藏
* 协议:`taoche: //showtips?msg=提示内容`
#### 2.3 显示活动指示器
* 协议:`taoche: //showactive?msg=xxx`
#### 2.4 隐藏活动指示器
* 协议:`taoche: //hideactive`
#### 2.5 返回上级页面
* 协议:`taoche: //goback`
#### 2.6 打印日志
* 协议:`taoche: //log?log=xxx`
# B端H5与app交互(二)
### 1 跳转到网页 (包括离线、在线 如果是在线URL,必须包含http或https)
| 平台 | 方法名 | 备注 |
| -------- | -------- | -------- |
| JavaScript | <font color=#0f89d8>taoche://gourl?url=</font>链接地址| 可带标准URL参数 |
| iOS | <font color=#0f89d8>- jsHelper:goURL:</font> | |
| Android | jsHelper.goUrl(String url) | - |
### 2 跳转到原生页面
| 平台 | 方法名 | 备注 |
| -------- | -------- | -------- |
| JavaScript | <font color=#0f89d8>taoche://gopage?page=xxx&abc=xxx</font> | 可带标准URL参数 |
| iOS | <font color=#0f89d8>- jsHelper:goPage:query:</font> | |
| Android | jsHelper.goPage(String url) | - |
### 3 调用组件
| 平台 | 方法名 | 备注 |
| -------- | -------- | -------- |
| JavaScript | <font color=#0f89d8>taoche://component?component=</font>组件名或方法名&参数 | 可带标准URL参数 |
| iOS | <font color=#0f89d8>- jsHelper:goPage:query:</font> | |
| Android | jsHelper.goPage(String url) | - |
### 4 调用方法
| 平台 | 方法名 | 备注 |
| -------- | -------- | -------- |
| JavaScript | <font color=#0f89d8>taoche://function?function=xxx&xxx</font> | 可带标准URL参数 |
| iOS | <font color=#0f89d8>- jsHelper:goPage:query:</font> | |
| Android | 无 | - |
### 5 展示图片幻灯片
| 平台 | 方法名 | 备注 |
| -------- | -------- | -------- |
| JavaScript | <font color=#0f89d8>taoche://component</font>?component=photobrowser&images=&captions=&selectedIndex= | images和captions一一对应,如果有多个用英文&#124;分割 |
| iOS | <font color=#0f89d8>- jsHelper:goPhotoBrowserWithImageUrls:captions:selectedIndex:</font> | |
| Android | jsHelper.goPage(“page=photobrowser”) | - |
### 6 添加导航条右上角按钮
| 平台 | 方法名 | 备注 |
| -------- | -------- | -------- |
| JavaScript | <font color=#0f89d8>taoche://function?function=addRightBarButton&title=xxx&callback=xxx</font> | |
| iOS | <font color=#0f89d8>- jsHelper:addRightBarButtonWithTitle:callback:</font> | |
| Android | 无 | - |
### 7 判断原生导航条是否隐藏
| 平台 | 方法名 | 备注 |
| -------- | -------- | -------- |
| JavaScript | <font color=#0f89d8>taoche://function?function=isNavigationBarHidden&callback=xxx</font> | |
| iOS | <font color=#0f89d8>- jsHelper:addRightBarButtonWithTitle:callback:</font> | |
| Android | 无 | - |
### 8 显示提示语 会自动隐藏
| 平台 | 方法名 | 备注 |
| -------- | -------- | -------- |
| JavaScript | <font color=#0f89d8>taoche://showtips?msg=</font>提示内容 | |
| iOS | <font color=#0f89d8>- jsHelper:showTips: </font> | |
| Android | jsHelper.showTips(String url) | - |
### 9 显示活动指示器
| 平台 | 方法名 | 备注 |
| -------- | -------- | -------- |
| JavaScript | <font color=#0f89d8>taoche://showactive?msg=xxx</font> | |
| iOS | <font color=#0f89d8>- jsHelper:showActive:</font> | |
| Android | jsHelper.showActive (String msg) | - |
### 10 隐藏活动指示器
| 平台 | 方法名 | 备注 |
| -------- | -------- | -------- |
| JavaScript | <font color=#0f89d8>taoche://hideactive</font> | |
| iOS | <font color=#0f89d8>- hiddenActiveForJSHelper:</font> | |
| Android | jsHelper. hideActive () | - |
### 11 警告提示
| 平台 | 方法名 | 备注 |
| -------- | -------- | -------- |
| JavaScript | alert(content); | Js原生alert即可 |
| iOS | Webview自动处理 | |
| Android | jsHelper.alert(String content) | - |
### 12 打印日志
| 平台 | 方法名 | 备注 |
| -------- | -------- | -------- |
| JavaScript | <font color=#0f89d8>taoche://log?log=xxx</font> | |
| iOS | <font color=#0f89d8>- jsHelper:log:</font> | |
| Android | jsHelper.log(String content) | - |
### 13 返回上级页面
| 平台 | 方法名 | 备注 |
| -------- | -------- | -------- |
| JavaScript | <font color=#0f89d8>taoche://goback</font> | |
| iOS | goBackForJSHelper | |
| Android | jsHelper.goBack() | - |
### 14 附1-组件名称及参数
<table>
<tr>
<td>组件名</td>
<td>参数</td>
<td>说明</td>
<td>备注</td>
</tr>
<tr>
<td>voice</td>
<td>callback</td>
<td>回调方法,接收的是语音识别后的文字</td>
<td>语音输入</td>
</tr>
<tr>
<td rowspan="3">photobrowser</td>
<td >images</td>
<td >图片url,多个用|分割</td>
<td rowspan="3">图片浏览器</td>
</tr>
<tr>
<td >captions</td>
<td >图片描述,多个用|分割,与images一一对应</td>
</tr>
<tr>
<td >selectedIndex</td>
<td >当前显示第几张</td>
</tr>
<tr>
<td rowspan="7">pay</td>
<td rowspan="6">type</td>
<td >1:微信</td>
<td rowspan="7">支付体系</td>
</tr>
<tr>
<td>2:支付宝</td>
</tr>
<tr>
<td>3:积分</td>
</tr>
<tr>
<td>4:银联</td>
</tr>
<tr>
<td>5:applePay</td>
</tr>
<tr>
<td>6:其他</td>
</tr>
<tr>
<td>localorderno</td>
<td>订单号</td>
</tr>
</table>
### 15 附2-方法名称及参数
<table>
<tr>
<td>方法名</td>
<td>参数</td>
<td>说明</td>
<td>备注</td>
</tr>
<tr>
<td rowspan="2">addRightBarButton</td>
<td>title</td>
<td>按钮的标题</td>
<td rowspan="2">添加导航条右上角按钮</td>
</tr>
<tr>
<td >callback</td>
<td >按钮点击的回调</td>
</tr>
<tr>
<td >isNavigationBarHidden</td>
<td >callback</td>
<td >回调方法,接收true/false</td>
<td >判断原生导航条是否隐藏</td>
</tr>
</table>
## Cookie规范
##### cookie统一通过key-value的形式组成Map(android)/字典(iOS)的结构,域(.taoche.com),如下:
- **key: taoche-token**
* **value(android):** 与服务器约定的token
* **value(iOS):** 与服务器约定的token
* **说明:** 与服务器约定的token
* **android举例:** 14deb4c9-76b0-425d-bca2-5cf5ab5ab3f6
* **iOS举例:** 14deb4c9-76b0-425d-bca2-5cf5ab5ab3f6
- **key: taoche-device-model**
* **value(android):** Build.BRAND, Build.MODEL, Build.VERSION.SDK_INT, Build.VERSION.RELEASE 通过"/"拼接
* **value(iOS):** [[UIDevice currentDevice] model], [UIDevicecurrentDevice].systemVersion 通过"/"拼接
* **说明:** 设备型号
* **android举例:** "Xiaomi/MIX 2/26/8.0.0"
* **iOS举例:** "iPhone/11.3.1"
- **key: taoche-device-id**
* **value(android):** deviceId
* **value(iOS):** uuid
* **说明:** 设备的唯一标示
* **android举例:** 865736030492469
* **iOS举例:** 89DF3737-5A9F-4EB4-938C-CC714286DF37
- **key: taoche-client**
* **value(android):** android标识
* **value(iOS):** iOS标识
* **说明:** android设备还是iOS设备
* **android举例:** "android"
* **iOS举例:** "iphone"
- **key: taoche-app_version**
* **value(android):** app版本号
* **value(iOS):** app版本号
* **说明:** app版本号
* **android举例:** “1.5.3”
* **iOS举例:** “1.5.3”
- **key: taoche-app-version-code**
* **value(android):** app的versionCode
* **value(iOS):** app的versionCode本号
* **说明:** app的versionCode
* **android举例:** 16
* **iOS举例:** 16
- **key: taoche-app-channel**
* **value(android):** app渠道
* **value(iOS):** iOS渠道
* **说明:** app渠道
* **android举例:** "defult"或"xiaomi"
* **iOS举例:** "appstore"
![](../resources/cookie-guifan.png)
* 最后将所有的key=<font color=red>TCAppIdentification</font>,value =<font color=red>{"key":"value","key":"value"...}</font>的形式拼接起来作为cookie
** 附:客户端设置cookie方法 **
iOS:
```javascript
// 添加 cookie
NSDictionary *contentDict = [NSDictionary dictionaryWithObjectsAndKeys:[CWDeviceManager currentUUID], @"taoche-device-id", [NSString stringWithFormat:@"%@ %@", [UIDevice currentDevice].model, YX_iOSVersion()], @"taoche-device-model", YX_AppVersion(), @"taoche-app_version" , @"iphone", @"taoche-client", [CWUserInfoModel shareUser].sessionId, @"taoche-token", @"appstore", @"taoche-app-channel", nil];
NSData *data = [NSJSONSerialization dataWithJSONObject:contentDict options:0 error:nil];
NSString *json = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSDictionary *cookieDict = [NSDictionary dictionaryWithObjectsAndKeys:json, NSHTTPCookieValue, @"TCAppIdentification", NSHTTPCookieName, @"/", NSHTTPCookiePath, @".taoche.com", NSHTTPCookieDomain, [NSDate dateWithTimeIntervalSinceNow:60 * 60 * 24 * 360], NSHTTPCookieExpires, nil];
NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:cookieDict];
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
[_webView loadRequest:[NSURLRequest requestWithURL:_URL]];
```
Android:
```javascript
public void setCookie(String url,Account account){
CookieSyncManager.createInstance(context);
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
cookieManager.removeAllCookie();
JSONObject jsonObject = new JSONObject();
try {
jsonObject.put("taoche-token",account.getSessionId());
} catch (JSONException e) {
e.printStackTrace();
}
cookieManager.setCookie(url, "TCAppIdentification" + "=" + jsonObject.toString());
//拼接起来的string
String test = cookieManager.getCookie(url);
CookieSyncManager.getInstance().sync();
}
```
# C端H5与app交互
### 判断app
- tools.isWebView()方法判断是否在app中
- 区分淘车app、淘车二手车app,需要读取cookie中BitautoAppInfo的SOURCE值
| app | SOURCE值 |
| ------------- | ------------- |
| 淘车 | 108 |
| 淘车二手车 | 5 |
### 分享
1. app中是否显示分享按钮,
```javascript
<meta name="BitautoCustom" content=ShowShare=0 />
<meta name="BitautoCustom" content="ShowShare=1" />
```
ShowShare=0表示不显示,ShowShare=1显示;
2. 自定义分享内容
```javascript
function customizewebcofig() {
var json = {
hideshare: 0,
shareContent: '分享内容',
shareTitle: '分享标题',
shareurl: '分享链接',
// 分享图片可不传,app有默认图片
shareImg: '分享图片'
};
// 返回需为字符串json
return JSON.stringify(json)
}
```
**注意:**
1.函数只在H5中定义,原生app监测页面加载完成后调用该函数;
2.当分享的内容可配置时,异步获取配置内容后会与app监测页面加载完成存在时间差,可能造成原生app调用函数后获取不到返回值。
**解决办法:** 页面渲染html由后台控制时,需要后台同学把该函数以及配置的参数值放到页面里面。
### js与native(Android/iOS)交互-JSBridge
**注意:**需native端注册(registerHandler)相应方法,进入监听状态,js才能调用该方法
1.调用方式示例:
```javascript
jsBridge('handlerName', data, 'post', function (params) {
// any code
})
```
| 参数 | 解释 | 数据类型 |
| ------------- | ------------- | ------------- |
| handlerName | 与native端约定的调用方法名 | string |
| data | 传给native的数据参数 | any |
| post | post表示发起调用;get表示监听调用; | string |
| function (params) {} | 调用或监听到交互后会调用该方法,params为native传回的数据 | function |
2.JSBridge代码:
```javascript
;window.jsBridge = function (name, params, type, success) { // name:约定监听名字 string; params: 参数 any; type: 'get' iso/android中的事件,type:'post' h5中的事件; success: 成功回调 function;
var u = navigator.userAgent;
var isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端
//注册事件监听
function connectWebViewJavascriptBridge(callback) {
if (window.WebViewJavascriptBridge) {
return callback(WebViewJavascriptBridge)
} else if (isiOS) {
if (window.WVJBCallbacks) { return window.WVJBCallbacks.push(callback); }
window.WVJBCallbacks = [callback];
var WVJBIframe = document.createElement('iframe');
WVJBIframe.style.display = 'none';
WVJBIframe.src = 'https://__bridge_loaded__';
document.documentElement.appendChild(WVJBIframe);
setTimeout(function() { document.documentElement.removeChild(WVJBIframe) }, 0)
} else {
document.addEventListener(
'WebViewJavascriptBridgeReady',
function () {
callback(WebViewJavascriptBridge)
},
false
);
}
}
if (name) {
if (type === 'post') {
connectWebViewJavascriptBridge(function (bridge) {
bridge.callHandler(name, params, function (responseData) {
success && success(responseData);
});
});
} else if (type === 'get') {
connectWebViewJavascriptBridge(function (bridge) {
bridge.registerHandler(name, function (data, responseCallback) {
responseCallback(params);
success && success(data);
});
});
}
}
}
```
**拓展:**可提供给native同事参考
1.Android端
- 注册监听:
```javascript
webView.registerHandler("handlerName", new BridgeHandler() {
@Override
public void handler(String data, CallBackFunction function) {
function.onCallBack("responseData");
}
});
```
| 参数 | 解释 |
| ------------- | ------------- |
| handlerName | 约定的方法名称 |
| data | web传入的数据 |
| responseData | 回传给web的数据 |
- 发起调用:
```javascript
webView.callHandler("handlerName", data , new CallBackFunction() {
@Override
public void onCallBack(String responseData) {
}
});
```
| 参数 | 解释 |
| ------------- | ------------- |
| handlerName | 约定的方法名称 |
| data | 传输给web的数据 |
| responseData | 来自web的回传数据 |
2.iOS端
- 注册监听:
```javascript
[self.bridge registerHandler:@"handlerName" handler:^(id data, WVJBResponseCallback responseCallback) {
}];
```
| 参数 | 解释 |
| ------------- | ------------- |
| handlerName | 约定的方法名称 |
| data | web传入的数据 |
| responseData | 回传给web的数据 |
- 发起调用:
```javascript
[self.bridge callHandler:@"handlerName" data:data responseCallback:^(id responseData) {
}];
```
| 参数 | 解释 |
| ------------- | ------------- |
| handlerName | 约定的方法名称 |
| data | 传输给web的数据 |
| responseData | 来自web的回传数据 |
# H5页面在微信中的分享
### 依赖
```javascript
import wxBridge from 'wx-bridge' // 微信分享
import tools from 'yx-utils';
const weixin = {
config: {
authorizationUrl: `//www.taoche.com/zt/Authorize.aspx?lgurl=${encodeURIComponent(window.location.href)}`,
userInfo: localStorage.getItem('WEIXIN_USER_INFO'),
getSignatureApi: '//zt.taoche.com/zt/api/WXUserInfor/GetSignature',
},
isWeixin: function() {
const ua = window.navigator.userAgent.toLowerCase();
if (ua.match(/MicroMessenger/i) === 'micromessenger') {
return true;
} else {
return false;
}
},
getQueryString: function(name) {
const reg = new RegExp(`(^|&)${name}=([^&]*)(&|$)`, 'i');
const r = window.location.search.substr(1).match(reg);
if (r) {
return decodeURIComponent(r[2]);
}
},
// 微信授权
getUserInfo: function() {
if (this.config.userInfo) {
return this.config.userInfo;
} else {
let user = this.getQueryString('v');
if (user) {
localStorage.setItem('WEIXIN_USER_INFO', user);
return user;
} else {
window.location.href = this.config.authorizationUrl;
}
}
},
// 微信分享
setShare: function(options) {
$.ajax({
url: this.config.getSignatureApi,
type: 'post',
cache: false,
async: false,
data:{
PARAM_weixinAccount: '3359947936',
PARAM_PageUrl: window.location.href.split('#')[0]
},
dataType: 'jsonp',
jsonp: 'PARAM_Jsonpcallback',
success: res => {
if (res.status === 1) {
const signature = res.Data.Signature.split('|');
window.__WX_AUTH__ = {
debug: false,
...options,
appId: 'wx7a2a1b717bdec6cd',
signature: signature[0],
timestamp: signature[1],
nonceStr: 'PbDwGEEc58uPL559',
jsApiList:['onMenuShareTimeline', 'onMenuShareAppMessage', 'onMenuShareQQ', 'onMenuShareWeibo']
};
// console.log(window.__WX_AUTH__);
wxBridge();
}
},
error: function(err) {
console.log(err);
}
});
// taoche系app分享用方法
window.customizewebconfig = function customizewebconfig() {
return JSON.stringify({
shareTitle: options.title,
shareContent: options.desc,
shareImg: options.imgUrl,
shareurl: options.shareUrl,
})
};
if(tools.isWebView()) {
tools.jsNativeBridge("showShare", {
title: options.title,
des: options.desc,
img: options.imgUrl,
url: options.shareUrl
});
}
},
// 获取app分享链接
getAppShareUrl: function(options) {
const appInfo = tools.isWebView();
let baseUrl = '';
switch (appInfo) {
case '5':
// 淘车二手车app
baseUrl = 'bitautousedcar:';
break;
case '108':
case 'yixintcapp':
// 淘车app
baseUrl = 'yixintaoche:';
break;
default:
break;
}
if (baseUrl) {
return encodeURI(`${baseUrl}//?platform=web&action=openShareController&title=${options.title}&content=${options.desc}&shareURL=${options.shareUrl}&imageURL=${options.imgUrl}`);
} else {
return false;
}
}
};
export default weixin;
```
### 调用
```javascript
import weixin from 'weixin.js';
const shareOption = {
title: '首付1万月租666,买车比买包还轻松!',
desc: '淘车新车30款热销车型特惠,总价最高直降2.2万,首付1万就开走!',
imgUrl: 'http://img1.yixinfinance.com/taoche/activity.m/kzbth/images/share.jpg',
shareUrl: window.location.href
};
weixin.setShare(shareOption);
```
### 调试
1.测试环境暂不支持查看该项功能,需灰度环境查看
2.在控制台中查看是否有GetSignature请求,成功发起请求说明调用成功
3.分享还是不成功,查看GetSignature请求参数,根据下图排查,查看1框中是否有更新,2框中的url公众号是否配置;
具体问题需@余波 配合
![](../resources/wxshare.png)
#### 注意
该功能在分享到朋友圈只取到 shareOption.title ;暂不支持title和desc都在朋友圈展示。
[Airbnb React/JSX 编码规范](https://github.com/JasonBoy/javascript/blob/master/react/README.md)
### 踩坑手记 ###
### ant-design-pro 2.x踩坑手记(包含react) ###
- this.setState是异步的,所以在this.setState之后不能立刻得到最新的state,如果想设置完直接去拿修改过的state代码如下:
```javascript
this.state = {foo: 2};
......@@ -11,7 +11,7 @@ this.setState({foo: 123}, ()=> {
```
- antd组件默认属性(例如initialValue、defaultValue、defaultFileList)只会被初始化一次),直接修改不会重新渲染,如果需要重新渲染则需要修改另外的属性值(例如setFieldsValue、value、fileList)
- setState直接修改数组或者对象的某个值是不会导致渲染的(深复制,浅复制的问题)代码入下:
- setState直接修改数组或者对象的某个值是不会导致渲染的代码入下:
```javascript
//❌
//获取父组件的数据
......
### ant-design-pro 2.x踩坑手记 ###
- 编译时控制台报错代码如下:
```javascript
[hardsource:f5ffae14] Could not freeze ./node_modules/css-hot-loader/hotModuleReplacement.js: Cannot read property 'hash' of undefined
[hardsource:f5ffae14] Could not freeze ./node_modules/debug/src/browser.js: Cannot read property 'hash' of undefined
[hardsource:f5ffae14] Could not freeze ./node_modules/debug/src/debug.js: Cannot read property 'hash' of undefined
[hardsource:f5ffae14] Could not freeze ./node_modules/dva-immer/lib/index.js: Cannot read property 'hash' of undefined
[hardsource:f5ffae14] Could not freeze ./node_modules/dva-immer/node_modules/@babel/runtime/helpers/interopRequireDefault.js: Cannot read property 'hash' of undefined
```
**解决方案**: hardSource 的问题,删除 ./node_modules/.cache 后重启。
- 共用模块一定要写入/src/models下,不能放入/pages/XXX/models,hash打包时会有相邻模块打包不到一起问题
### 自定义目录需做以下处理(绕过国际化):
1. src/components/PageHeaderWrapper/index.js
```javascript
key="pageheader"
{...restProps}
linkElement={Link}
- itemRender={item => {
- if (item.locale) {
- return <FormattedMessage id={item.locale} defaultMessage={item.name} />;
- }
- return item.name;
- }}
+ itemRender={item => item.name}
/>
)}
</MenuContext.Consumer>
```
2. src/layouts/BasicLayout.js
```javascript
const result = {
...item,
- name: formatMessage({ id: locale, defaultMessage: item.name }),
+ // name: formatMessage({ id: locale, defaultMessage: item.name }),
locale,
authority: item.authority || parentAuthority,
};
```
\ No newline at end of file
......@@ -2,7 +2,7 @@
### 内部公共依赖地址
> http://gitlab.dev.daikuan.com/groups/npm
> http://git.taoche.com/groups/npm
### semver版本管理
......@@ -44,10 +44,12 @@ npm version patch
### 内部依赖使用(git+http或git+ssh)
```json
"dependencies": {
"href": "git+http://gitlab.dev.daikuan.com/npm/href.git#v1.0.0",
"href": "git+http://git.taoche.com/npm/href.git#v1.0.0",
"tc": "git+ssh://git@git.taoche.com/npm/tc.git#v0.1.14",
...
}
```
务必要加#版本号
### 参考
......
# npm模块管理
### semver规范
```
a.b.c
a: 主版本号, 不兼容的升级
b: 次版本号, 兼容性升级,增加新特性
c: 修订号, 兼容性升级, 修改已有bug
```
### 升级步骤
1. 代码修改,commit && push
2. npm version major|minor|patch(或 yarn version输入新的版本号)
3. git push(将升级版本的提交push到远端)
4. git push --tags(将升级版本的tag push到远端)
5. 调用方修改package.json里该模块版本号
# 上线流程
# taoche及feprogram项目上线流程
### `npm run build` 与 `npm run release`
......@@ -6,16 +6,12 @@
* `npm run release` 供灰度/上线使用,远程构建
### [taoche项目]流程
1. 本地开发完成,将最新master分支合并到当前分支
1. 本地开发完成,将最新master分支合并到当前分支并push
2. 执行`npm run release xxx`远端构建并发布到灰度环境
3. gitlab提merge request(pr), 申请将开发分支合并到master
4. 管理员review代码,之后accept该次pr到master
5. 管理员根据该次pr最后一次release(build)上线
### 其他项目与taoche主项目区别
* 部分项目如crm等项目是全量构建,无需管理员手工上线,pr合并入master即会自动进行远端构建及上线
* 部分敏捷开发项目,如act, 不锁定master权限,开发人员release后即上线
### gitlab中操作pr
......@@ -30,3 +26,9 @@
3.仓库负责人review pr, 确认合并
![](../resources/pr3.png)
### 其他项目与taoche主项目区别
* 部分项目如crm等项目是全量构建,无需管理员手工上线,pr合并入master即会自动进行远端构建及上线
* 部分敏捷开发项目,如act, 不锁定master权限,开发人员release后即上线
# 淘车活动专题相关处理
## 一.获取二手车车源接口
> 二手车车源接口获取ES文档地址:
> http://192.168.156.232:8090/pages/viewpage.action?pageId=5113356
### 1.接口名称
主接口地址:
```javascript
http://zt.taoche.com/zt/api/GetCarList/GetCarData
```
调用地址:
```javascript
http://zt.taoche.com/zt/api/GetCarList/GetCarData?25748231628663465%27%27&PARAM_DealerId={0}&PARAM_PageSize={1}&PARAM_CurrentCityID={2}&PARAM_CommonFlag={3}&PARAM_IsDESC={4}&PARAM_IsNeglect={5}&PARAM_OrderBy={6}&PARAM_PageIndex={7}&PARAM_PictureCount={8}&PARAM_RequestSource={9}&PARAM_UcarStatus={10}&PARAM_ShowColumn={11}
```
### 2.参数介绍
- {0}:经销商ID,多个可用逗号分割。
- {1}:返回条数,当前城市下经销商ID数量<4时,返回9条。>=4时返回4条。
- {2}:城市ID
- {3}:车源检索规则,详见ES文档地址。
- {4}:排序规则
- {5}:审核:1是 0否
- {6}:按哪个字段排序
- {7}:页码
- {8}:是否有车源图片
- {9}:车源来源
- {10}:车源状态
- {11}:返回字段
### 3.调用方式
参数按照上述格式组合后通过GET方式调用。
### 4.返回信息
按照2中的返回字段定义规则返回指定字段信息。
## 二.通用留资接口 ##
### 1.接口名称 ###
/base/SaveActivity
### 2.参数介绍 ###
- 姓名:UserName
- 性别:Sex
- 电话:Telephone (必填)
- 车系:CarSerial (如果有单个手机号每天只能留资一次的验证,此值不能为空。)
- 省份:Province
- 城市:City
- 区县:County
- 经销商名称:Dealer
- 预计购车时间:BookDate
- 地址:Address
- 业务类型:BusinessFlag (必填,特殊逻辑下后端研发提供此值,非特殊逻辑填写:500)
- 拓展字段1:Extend1
- 拓展字段1:Extend2
- 拓展字段1:Extend3
- 拓展字段1:Extend4
- 拓展字段1:Extend5
- 拓展字段1:Extend6
- 拓展字段1:Extend7
- 拓展字段1:Extend8
- 拓展字段1:Extend9
- 拓展字段1:Extend10
> 备注:以上字段为活动专题留资全部字段,不是全必填的。按照具体活动传对应值即可。
### 3.调用方式 ###
POST
### 4.返回信息 ###
{"Result":true,"Message":"保存成功!","Data":"","RowCount":0}
{"Result":false,"Message":"保存失败!","Data":"","RowCount":0}
## 三.通用获取手机验证码接口 ##
### 1. 接口名称 ###
/base/CheckSign
接口说明:
CheckSign(string mobile, string captype, string ticket, int businessid = 1001, int line = 550)
### 2. 参数介绍 ###
mobile电话号,line:550
### 3. 调用方式 ###
POST
### 4. 返回信息 ###
{"Result":false,"Message":"失败","Data":-2,"RowCount":0}
或:
{"Result":true,"Message":"设置成功!","Data":1,"RowCount":0}
只要返回Data>0的,表示成功。<0的表示失败,前端页面弹出Message即可。
## 四. 通用获取当前用户登录态接口 ##
### 1. 接口名称 ###
/base/GetCommonStatus
### 2. 参数介绍 ###
### 3. 调用方式 ###
GET
### 4. 返回信息 ###
{"Result":true,"Message":"","Data":{"IsLogin":true,"UserName":"手机用户8764","Telephone":"13520938764"},"RowCount":0}
{"Result":true,"Message":"","Data":{"IsLogin":false,"UserName":"","Telephone":""},"RowCount":0}
## 五. 通用获取当前服务端时间接口 ##
### 1. 接口名称 ###
/base/GetTime
### 2. 参数介绍 ###
### 3. 调用方式 ###
GET
### 4. 返回信息 ###
{"Result":true,"Message":"","Data":"2018-11-15 11:48:46","RowCount":0}
## 六. 通用登录接口 ##
### 1. 接口名称 ###
通过调用个人中心站点接口实现登录
PC: http://home.taoche.com/user/CreateAccount
M: http://home.m.taoche.com/user/CreateAccount
测试环境:
PC:http://test.home.taoche.com/user/CreateAccount
M:http://test.home.m.taoche.com/user/CreateAccount
### 2. 参数介绍 ###
> 参考URL:http://event.taoche.com/db112018.html(双十一专题)
### 3. 调用方式 ###
> 参考URL:http://event.taoche.com/db112018.html(双十一专题)
### 4. 返回信息 ###
> 参考URL:http://event.taoche.com/db112018.html(双十一专题)
## 七. 发布系统使用 ##
### 1. 发布包处理 ###
前端发布:将静态页面如xxx.html压缩为xxx.zip文件。
后端发布:将发布包如bin文件夹压缩为xxx.zip文件。
### 2. 通过发布站点上传 ###
登录:http://172.31.5.1:2001/ 站点[将为相关人申请发布账号]
选择活动专题站点 PC:event.taoche.com
M:event.m.taoche.com,
对应huidu环境的名称为:
PC:event.huidu.taoche.com
M:event.huidu.m.taoche.com
选择部署主机为:taoche[production],点击“发送”即可,大约3分钟左右可发布完毕。
如下图所示:
![](images/1.png)
![](images/2.png)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment