初始化
14
.editorconfig
Normal file
@@ -0,0 +1,14 @@
|
||||
# http://editorconfig.org
|
||||
root = true
|
||||
|
||||
[*]
|
||||
charset = utf-8
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
end_of_line = lf
|
||||
insert_final_newline = true
|
||||
trim_trailing_whitespace = true
|
||||
|
||||
[*.md]
|
||||
insert_final_newline = false
|
||||
trim_trailing_whitespace = false
|
||||
6
.env
Normal file
@@ -0,0 +1,6 @@
|
||||
# env
|
||||
NODE_ENV = 'dev' // 如果是生产环境,请记得切换为production
|
||||
|
||||
# flag
|
||||
VUE_APP_FLAG='dev'
|
||||
VUE_APP_ADMIN='http://1.0.0.0'
|
||||
6
.env.dev
Normal file
@@ -0,0 +1,6 @@
|
||||
# env
|
||||
NODE_ENV = 'dev' // 如果是生产环境,请记得切换为production
|
||||
|
||||
# flag
|
||||
VUE_APP_FLAG='dev'
|
||||
VUE_APP_ADMIN='http://1.0.0.0'
|
||||
4
.eslintignore
Normal file
@@ -0,0 +1,4 @@
|
||||
build/*.js
|
||||
public
|
||||
dist
|
||||
node_modules
|
||||
17
.eslintrc.js
Normal file
@@ -0,0 +1,17 @@
|
||||
module.exports = {
|
||||
root: true,
|
||||
env: {
|
||||
node: true
|
||||
},
|
||||
extends: ['plugin:vue/essential', '@vue/prettier'], //需要dev依赖里安装eslint-config-prettier
|
||||
rules: {
|
||||
//'off'或'0':关闭 'warn'或'1':警告 "error"或者"2":报错
|
||||
'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'error',
|
||||
'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'error',
|
||||
//下面是重要设置,错误标记
|
||||
'prettier/prettier': 'error'
|
||||
},
|
||||
parserOptions: {
|
||||
parser: 'babel-eslint'
|
||||
}
|
||||
}
|
||||
29
.gitignore
vendored
Normal file
@@ -0,0 +1,29 @@
|
||||
.DS_Store
|
||||
node_modules
|
||||
package-lock.json
|
||||
/dist
|
||||
/target
|
||||
/generate
|
||||
|
||||
# local env files
|
||||
.env.local
|
||||
.env.*.local
|
||||
|
||||
# Log files
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
|
||||
# Editor directories and files
|
||||
.idea
|
||||
.settings
|
||||
.vscode
|
||||
*.suo
|
||||
*.ntvs*
|
||||
*.njsproj
|
||||
*.sln
|
||||
*.sw*
|
||||
*.iml
|
||||
.classpath
|
||||
.project
|
||||
*.log
|
||||
7
.prettierrc
Normal file
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"tabWidth": 2,
|
||||
"semi": false,
|
||||
"singleQuote": true,
|
||||
"printWidth": 160,
|
||||
"endOfLine": "auto"
|
||||
}
|
||||
5
.travis.yml
Normal file
@@ -0,0 +1,5 @@
|
||||
language: node_js
|
||||
node_js: 10
|
||||
script: npm run test
|
||||
notifications:
|
||||
email: false
|
||||
6
Deployfile
Normal file
@@ -0,0 +1,6 @@
|
||||
[ -e /opt/ebiz/webapps/factory-front-end ] || mkdir -p /opt/ebiz/webapps/factory-front-end
|
||||
[ -e /app/deploy/temp ] || mkdir -p /app/deploy/temp
|
||||
|
||||
rm -irf /app/deploy/temp/* && cd /app/deploy/temp && $GET_ARTIFACT_CMD
|
||||
rm -irf /opt/ebiz/webapps/factory-front-end/*
|
||||
unzip -d /opt/ebiz/webapps/factory-front-end /app/deploy/temp/$ARTIFACT_NAME && chmod 777 -R /opt/ebiz/webapps/factory-front-end/*
|
||||
27
Jenkinsfile
vendored
Normal file
@@ -0,0 +1,27 @@
|
||||
pipeline {
|
||||
agent any
|
||||
parameters {
|
||||
string(name: 'ROLLBACK_VERSION', defaultValue: '', description: '')
|
||||
string(name: 'UNLOCK', defaultValue: '', description: '')
|
||||
}
|
||||
stages {
|
||||
stage('pull sourcecode') {
|
||||
steps {
|
||||
git(url: 'http://gitlab.hengansl.com/ebp/ebiz-product-factory-backmanege-h5.git', branch: 'master', credentialsId: 'cicd')
|
||||
}
|
||||
}
|
||||
|
||||
stage('build') {
|
||||
steps {
|
||||
sh '/app/build.sh . 10 "12.22.6"'
|
||||
}
|
||||
}
|
||||
|
||||
stage('deploy') {
|
||||
steps {
|
||||
sh '/app/deploy.sh 2 "10.1.0.192"'
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
5
Projectfile
Normal file
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"groupId":"com.ebiz",
|
||||
"artifactId":"ebiz-product-factory-backmanege-h5",
|
||||
"file":"./dist"
|
||||
}
|
||||
188
README.md
@@ -0,0 +1,188 @@
|
||||
# vue-pc
|
||||
|
||||
## 介绍
|
||||
|
||||
- 基于 [vue-element-admin](https://github.com/PanJiaChen/vue-element-admin) 搭建的后台管理系统基础框架
|
||||
- [文档参考](https://panjiachen.github.io/vue-element-admin-site/)
|
||||
|
||||
### 技术栈
|
||||
|
||||
Vue2 + Vue-Router + Axios + Vuex + Element + Vue-Loader + Vue-Cli3.0 + ...
|
||||
|
||||
### 命名规范
|
||||
|
||||
- 组件名:大驼峰
|
||||
- 方法名:小驼峰
|
||||
- class 类名:连字符(a-b)
|
||||
- 常量(const):全大写
|
||||
- 变量(let):小驼峰
|
||||
- 文件夹命名: 一律小写(只允许小写字母、中横杠-,如:a-b)
|
||||
- Vue 文件命名: 大驼峰式命名法,即每个单词的首字母大写 CamelCase.vue
|
||||
- css,js,image 等文件命名:一律小写(css/js 文件使用中横杆-,image 使用下划线\_)第三方除外
|
||||
- 如条件允许: import 进来的变量名及 export 都采用大驼峰形式命名,如 import VueRouter from 'vue-router' 及 export default Common
|
||||
|
||||
```javascript
|
||||
//什么叫“如条件允许”:比如我们需要
|
||||
import routes from './routers/router'
|
||||
const router = new VueRouter({
|
||||
routes
|
||||
})
|
||||
//这种情况下,routes可以用小写,事实上,上面的范例可以换一种写法:
|
||||
import Routes from './routers/router'
|
||||
const router = new VueRouter({
|
||||
routes: Routes
|
||||
})
|
||||
```
|
||||
|
||||
## wiki 文档
|
||||
|
||||
[wiki 参考文档](http://114.215.252.122:8090/pages/viewpage.action?pageId=13960243)
|
||||
|
||||
## 目录结构
|
||||
|
||||
```
|
||||
.
|
||||
├── build // webpack配置文件
|
||||
├── node_modules // npm/yarn安装的项目依赖模块
|
||||
├── public // 静态资源目录
|
||||
├── src // 源码目录
|
||||
│ ├── api // 网络请求文件
|
||||
│ │ ├── app // 基础工程网络请求文件
|
||||
│ │ │ ├── user.js // 用户模块api请求
|
||||
│ │ ├── example
|
||||
│ │ │ └── table.js // 示例模块api请求
|
||||
│ ├── assets // 资源目录
|
||||
│ │ ├── fonts // 字体文件
|
||||
│ │ ├── images // 图片文件
|
||||
│ │ | ├── app // 基础工程图片
|
||||
│ │ | ├── 404_img // 404图片
|
||||
│ │ ├── js
|
||||
│ │ | ├── utils //工具类js
|
||||
│ │ | | ├── auth.js //token设置
|
||||
│ │ | | ├── get-page-title.js //获取页面title
|
||||
│ │ | | ├── get-url.js //根据设置获取请求url
|
||||
│ │ | | ├── premission.js //权限控制
|
||||
│ │ | | ├── request.js //拦截器
|
||||
│ │ | | ├── settings.js //全局设置
|
||||
│ │ | | ├── validate.js //表单校验
|
||||
│ │ | ├── vendor //第三方js
|
||||
│ │ | ├── common.js //全局js方法
|
||||
│ │ | ├── business-common.js //业务相关全局js方法
|
||||
│ │ ├── sass
|
||||
│ │ | └── common.scss // 样式出口文件
|
||||
│ │ | └── element-ui.scss // element-ui样式
|
||||
│ │ | └── minix.scss // 样式配置
|
||||
│ │ | └── sidebar.scss // 侧边栏样式
|
||||
│ │ | └── transition.scss // 动画样式
|
||||
│ │ | └── utils.scss // 工具样式
|
||||
│ │ | └── variables.scss // 变量文件
|
||||
│ ├── components // 公共组件
|
||||
│ ├── config // 配置文件
|
||||
│ | ├── index.js // 环境配置
|
||||
│ | ├── urlMap.js // api url配置
|
||||
│ ├── filters
|
||||
│ | ├── index.js // 过滤器
|
||||
│ ├── icons // svg icon
|
||||
│ ├── router
|
||||
│ | ├── app // 基础工程路由
|
||||
│ | ├── example // 示例路由
|
||||
│ | ├── index.js // 路由配置
|
||||
│ ├── store
|
||||
│ | ├── modules // 状态模块
|
||||
│ | ├── getters.js // 配置getters
|
||||
│ | ├── index.js // 引用vuex,创建store
|
||||
│ ├── views
|
||||
│ | ├── app // 基础工程页面
|
||||
│ | | ├── layout // layout:导航栏、侧边栏、主窗口等
|
||||
│ | | ├── login // 登录页面
|
||||
│ | | ├── 404.vue // 404页面
|
||||
│ | | ├── home.vue // 首页
|
||||
│ | ├── example // 示例页面,不一一列举
|
||||
│ ├── App.vue // 页面入口文件
|
||||
│ ├── main.js // 程序入口文件,加载各种公共组件
|
||||
├── tests // 测试相关文件
|
||||
├── .env.dev // 开发环境配置
|
||||
├── .env.production // 生产环境配置
|
||||
├── .env.staging // staging环境配置
|
||||
├── .eslintrc.js // eslint配置
|
||||
├── babel.config.js // 转码配置
|
||||
├── jest.config.js // 测试配置
|
||||
├── .prettierrc // prettier配置
|
||||
├── package.json // 安装包列表文件
|
||||
├── postcss.config.js // 样式配置
|
||||
├── vue.config.js // vue工程配置
|
||||
.
|
||||
```
|
||||
|
||||
## 项目运行
|
||||
|
||||
```bash
|
||||
git clone http://112.124.100.131/base/ebiz-base-vue-pc.git
|
||||
|
||||
cd ebiz-base-vue-pc
|
||||
|
||||
yarn install(推荐使用yarn)
|
||||
|
||||
yarn serve(开发环境)
|
||||
|
||||
```
|
||||
|
||||
## 项目打包
|
||||
|
||||
```bash
|
||||
# 测试环境打包
|
||||
yarn run build:envName(测试环境打包)
|
||||
|
||||
# 线上环境打包
|
||||
yarn run build:prd(线上环境打包)
|
||||
```
|
||||
|
||||
## 预发环境打包预览、文件检查等
|
||||
|
||||
```bash
|
||||
# 代码检查
|
||||
yarn run lint
|
||||
|
||||
# 代码检查修复
|
||||
yarn run lint:fix
|
||||
|
||||
#代码格式化
|
||||
yarn run format
|
||||
```
|
||||
|
||||
## 快速开始项目
|
||||
|
||||
1、src>>api 目录下创建项目所需 http 请求文件夹
|
||||
2、src>>assets 目录下创建项目所需的 js image 文件夹,以及 scss 文件
|
||||
3、src>>router 目录下创建所需路由文件夹
|
||||
4、src>>store>>modules 目录下创建所需状态管理文件
|
||||
|
||||
##### [注:项目开始前请先配置 vscode 代码检查、格式化](http://115.29.19.195:8090/pages/viewpage.action?pageId=13960404)
|
||||
|
||||
## 主要功能点介绍
|
||||
|
||||
- http 请求文件
|
||||
- 模块划分:app 为基础工程模块、其他项目需另建文件夹
|
||||
- 拦截器:超时设置、请求头加 token、统一处理异常、token 异常重新登录等
|
||||
- mock 数据
|
||||
- [工具 rap2](http://rap2.taobao.org/) 、[参考链接](http://115.29.19.195:8090/display/VUE/mock)
|
||||
- 通过 config 文件夹下 urlMap.js,配置 mock 接口请求
|
||||
- 环境配置
|
||||
- 在 config 文件夹下 index.js,通过 process.env.NODE_ENV 对环境进行配置
|
||||
- 跨域问题可通过后台解决,也可设置前端代理 proxy
|
||||
- router
|
||||
- 模块划分
|
||||
- 路由拦截
|
||||
- 路由懒加载
|
||||
- 权限控制
|
||||
- 可在 permission.js 里设置黑白名单
|
||||
|
||||
## 浏览器支持
|
||||
|
||||
Modern browsers and Internet Explorer 10+.
|
||||
|
||||
| [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/edge/edge_48x48.png" alt="IE / Edge" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>IE / Edge | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/firefox/firefox_48x48.png" alt="Firefox" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Firefox | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/chrome/chrome_48x48.png" alt="Chrome" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Chrome | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/safari/safari_48x48.png" alt="Safari" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Safari |
|
||||
| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| IE10, IE11, Edge | last 2 versions | last 2 versions | last 2 versions |
|
||||
|
||||
######搭配长附加险 例如:鼎城附加定期寿险 ######长附加险初始化规则挂载 rule041 ######搭配长附加险时如果长附加险有年龄对交费期间(保险期间)的限制规则 挂载规则 rule013 ######搭配规则是 保险期间挂载 rule039 ######限制长附加险的交费期间不能大于保险期间是 rule042 交费期间下挂载 040
|
||||
|
||||
5
babel.config.js
Normal file
@@ -0,0 +1,5 @@
|
||||
module.exports = {
|
||||
presets: [
|
||||
'@vue/app'
|
||||
]
|
||||
}
|
||||
24
jest.config.js
Normal file
@@ -0,0 +1,24 @@
|
||||
module.exports = {
|
||||
moduleFileExtensions: ['js', 'jsx', 'json', 'vue'],
|
||||
transform: {
|
||||
'^.+\\.vue$': 'vue-jest',
|
||||
'.+\\.(css|styl|less|sass|scss|svg|png|jpg|ttf|woff|woff2)$':
|
||||
'jest-transform-stub',
|
||||
'^.+\\.jsx?$': 'babel-jest'
|
||||
},
|
||||
moduleNameMapper: {
|
||||
'^@/(.*)$': '<rootDir>/src/$1'
|
||||
},
|
||||
snapshotSerializers: ['jest-serializer-vue'],
|
||||
testMatch: [
|
||||
'**/tests/unit/**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)'
|
||||
],
|
||||
collectCoverageFrom: ['src/utils/**/*.{js,vue}', '!src/utils/auth.js', '!src/utils/request.js', 'src/components/**/*.{js,vue}'],
|
||||
coverageDirectory: '<rootDir>/tests/unit/coverage',
|
||||
// 'collectCoverage': true,
|
||||
'coverageReporters': [
|
||||
'lcov',
|
||||
'text-summary'
|
||||
],
|
||||
testURL: 'http://localhost/'
|
||||
}
|
||||
77
package.json
Normal file
@@ -0,0 +1,77 @@
|
||||
{
|
||||
"name": "basic-pc",
|
||||
"version": "1.0.0",
|
||||
"description": "A vue admin template with Element UI & axios & iconfont & permission control & lint",
|
||||
"author": "ebiz-digits",
|
||||
"scripts": {
|
||||
"serve": "vue-cli-service serve",
|
||||
"build": "vue-cli-service build",
|
||||
"build:dev": "vue-cli-service build --mode dev",
|
||||
"dev": "vue-cli-service serve --mode dev",
|
||||
"preview": "node build/index.js --preview",
|
||||
"lint": "eslint --ext .js,.vue src",
|
||||
"lint:fix": "eslint --fix --ext .js,.vue src",
|
||||
"format": "prettier --config ./.prettierrc --write \"src/**/*.js\" \"src/**/*.vue\"",
|
||||
"test:unit": "jest --clearCache && vue-cli-service test:unit",
|
||||
"test:ci": "npm run lint && npm run test:unit",
|
||||
"svgo": "svgo -f src/icons/svg --config=src/icons/svgo.yml"
|
||||
},
|
||||
"dependencies": {
|
||||
"axios": "0.18.1",
|
||||
"crypto-js": "^4.2.0",
|
||||
"crypto.js": "^2.0.2",
|
||||
"element-ui": "2.15.4",
|
||||
"exif-js": "^2.3.0",
|
||||
"file-saver": "^2.0.5",
|
||||
"js-cookie": "2.2.0",
|
||||
"mavon-editor": "^2.9.1",
|
||||
"node-gyp": "^8.0.0",
|
||||
"normalize.css": "7.0.0",
|
||||
"nprogress": "0.2.0",
|
||||
"path-to-regexp": "2.4.0",
|
||||
"sortablejs": "^1.15.6",
|
||||
"swiper": "^5.4.5",
|
||||
"vue": "2.6.10",
|
||||
"vue-router": "3.0.6",
|
||||
"vue2-editor": "^2.10.2",
|
||||
"vuex": "3.1.0",
|
||||
"xlsx": "^0.16.9"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "7.0.0",
|
||||
"@babel/register": "7.0.0",
|
||||
"@vue/cli-plugin-babel": "3.6.0",
|
||||
"@vue/cli-plugin-eslint": "^3.9.1",
|
||||
"@vue/cli-plugin-unit-jest": "3.6.3",
|
||||
"@vue/cli-service": "3.6.0",
|
||||
"@vue/eslint-config-prettier": "^4.0.1",
|
||||
"@vue/test-utils": "1.0.0-beta.29",
|
||||
"autoprefixer": "^9.5.1",
|
||||
"babel-core": "7.0.0-bridge.0",
|
||||
"babel-eslint": "10.0.1",
|
||||
"babel-jest": "23.6.0",
|
||||
"chalk": "2.4.2",
|
||||
"connect": "3.6.6",
|
||||
"eslint": "5.15.3",
|
||||
"eslint-plugin-vue": "5.2.2",
|
||||
"html-webpack-plugin": "3.2.0",
|
||||
"mockjs": "1.0.1-beta3",
|
||||
"node-sass": "^4.9.0",
|
||||
"runjs": "^4.3.2",
|
||||
"sass-loader": "^7.1.0",
|
||||
"script-ext-html-webpack-plugin": "2.1.3",
|
||||
"script-loader": "^0.7.2",
|
||||
"serve-static": "^1.16.2",
|
||||
"svg-sprite-loader": "4.1.3",
|
||||
"svgo": "1.2.2",
|
||||
"vue-template-compiler": "2.6.10"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=8.9",
|
||||
"npm": ">= 3.0.0"
|
||||
},
|
||||
"browserslist": [
|
||||
"> 1%",
|
||||
"last 2 versions"
|
||||
]
|
||||
}
|
||||
8
postcss.config.js
Normal file
@@ -0,0 +1,8 @@
|
||||
// https://github.com/michael-ciniawsky/postcss-load-config
|
||||
|
||||
module.exports = {
|
||||
'plugins': {
|
||||
// to edit target browsers: use "browserslist" field in package.json
|
||||
'autoprefixer': {}
|
||||
}
|
||||
}
|
||||
BIN
public/favicon.ico
Normal file
|
After Width: | Height: | Size: 3.1 KiB |
21
public/index.html
Normal file
@@ -0,0 +1,21 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" />
|
||||
<link rel="icon" href="<%= BASE_URL %>favicon.ico" />
|
||||
<title><%= webpackConfig.name %></title>
|
||||
<!--<script src="http://47.96.143.111:8091/validateAuth.js" type="text/javascript"></script>-->
|
||||
</head>
|
||||
<body>
|
||||
<noscript>
|
||||
<strong>We're sorry but <%= webpackConfig.name %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
|
||||
</noscript>
|
||||
<div id="app"></div>
|
||||
<!-- built files will be auto injected -->
|
||||
</body>
|
||||
|
||||
<!-- <script src="https://lib.baomitu.com/vue/2.6.10/vue.min.js"></script> -->
|
||||
<!-- <script src="https://cdn.bootcdn.net/ajax/libs/element-ui/2.13.0/index.js"></script> -->
|
||||
</html>
|
||||
16
src/App.vue
Normal file
@@ -0,0 +1,16 @@
|
||||
<template>
|
||||
<div id="app">
|
||||
<transition name="router-fade" mode="out-in">
|
||||
<router-view />
|
||||
</transition>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name: 'App'
|
||||
}
|
||||
</script>
|
||||
<style lang="scss">
|
||||
@import 'src/assets/sass/common.scss';
|
||||
</style>
|
||||
35
src/api/app/user.js
Normal file
@@ -0,0 +1,35 @@
|
||||
import request from '@/assets/js/utils/request'
|
||||
import getUrl from '@/assets/js/utils/get-url'
|
||||
|
||||
// 登录
|
||||
export function login(data) {
|
||||
return request({
|
||||
url: getUrl('/user/login', 0),
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
// 获取个人信息
|
||||
export function getInfo(token) {
|
||||
return request({
|
||||
url: getUrl('/user/info', 0),
|
||||
method: 'get',
|
||||
params: { token }
|
||||
})
|
||||
}
|
||||
|
||||
// 登出
|
||||
export function logout() {
|
||||
return request({
|
||||
url: getUrl('/user/logout', 0),
|
||||
method: 'post'
|
||||
})
|
||||
}
|
||||
// 测试示例
|
||||
export function indexUser() {
|
||||
return request({
|
||||
url: getUrl('/index/user', 0),
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
4
src/api/generatedApi/index.js
Normal file
@@ -0,0 +1,4 @@
|
||||
import request from '@/assets/js/utils/request'
|
||||
import getUrl from '@/assets/js/utils/get-url'
|
||||
export default {
|
||||
}
|
||||
BIN
src/assets/fonts/awesome/FontAwesome.otf
Normal file
BIN
src/assets/fonts/awesome/fontawesome-webfont.eot
Normal file
2671
src/assets/fonts/awesome/fontawesome-webfont.svg
Normal file
|
After Width: | Height: | Size: 434 KiB |
BIN
src/assets/fonts/awesome/fontawesome-webfont.ttf
Normal file
BIN
src/assets/fonts/awesome/fontawesome-webfont.woff
Normal file
BIN
src/assets/fonts/awesome/fontawesome-webfont.woff2
Normal file
BIN
src/assets/images/404_img/404.png
Normal file
|
After Width: | Height: | Size: 96 KiB |
BIN
src/assets/images/404_img/404_cloud.png
Normal file
|
After Width: | Height: | Size: 4.7 KiB |
BIN
src/assets/images/active.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
src/assets/images/home.png
Normal file
|
After Width: | Height: | Size: 98 KiB |
BIN
src/assets/images/icon/u3.png
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
src/assets/images/new/mascot.png
Normal file
|
After Width: | Height: | Size: 214 KiB |
BIN
src/assets/images/new/qco.png
Normal file
|
After Width: | Height: | Size: 5.9 KiB |
BIN
src/assets/images/new/r-1-desc.png
Normal file
|
After Width: | Height: | Size: 5.8 KiB |
BIN
src/assets/images/new/r-2-desc.png
Normal file
|
After Width: | Height: | Size: 6.4 KiB |
BIN
src/assets/images/new/r-3-desc.png
Normal file
|
After Width: | Height: | Size: 6.3 KiB |
BIN
src/assets/images/new/r-4-desc.png
Normal file
|
After Width: | Height: | Size: 6.3 KiB |
BIN
src/assets/images/new/r-5-desc.png
Normal file
|
After Width: | Height: | Size: 6.9 KiB |
BIN
src/assets/images/new/r1.png
Normal file
|
After Width: | Height: | Size: 51 KiB |
BIN
src/assets/images/new/r2.png
Normal file
|
After Width: | Height: | Size: 48 KiB |
BIN
src/assets/images/new/r3.png
Normal file
|
After Width: | Height: | Size: 46 KiB |
BIN
src/assets/images/new/r4.png
Normal file
|
After Width: | Height: | Size: 47 KiB |
BIN
src/assets/images/new/r5.png
Normal file
|
After Width: | Height: | Size: 46 KiB |
BIN
src/assets/images/new/road-0.png
Normal file
|
After Width: | Height: | Size: 271 KiB |
BIN
src/assets/images/new/t1-desc.png
Normal file
|
After Width: | Height: | Size: 42 KiB |
BIN
src/assets/images/new/t2-desc.png
Normal file
|
After Width: | Height: | Size: 34 KiB |
BIN
src/assets/images/new/t3-desc.png
Normal file
|
After Width: | Height: | Size: 35 KiB |
BIN
src/assets/images/new/t4-desc.png
Normal file
|
After Width: | Height: | Size: 38 KiB |
BIN
src/assets/images/new/t5-desc.png
Normal file
|
After Width: | Height: | Size: 40 KiB |
BIN
src/assets/images/new/text.png
Normal file
|
After Width: | Height: | Size: 37 KiB |
BIN
src/assets/images/pages/back.png
Normal file
|
After Width: | Height: | Size: 181 KiB |
BIN
src/assets/images/pages/btn.png
Normal file
|
After Width: | Height: | Size: 63 KiB |
BIN
src/assets/images/pages/img.png
Normal file
|
After Width: | Height: | Size: 8.9 KiB |
BIN
src/assets/images/pages/img_1.png
Normal file
|
After Width: | Height: | Size: 181 KiB |
BIN
src/assets/images/pages/img_2.jpg
Normal file
|
After Width: | Height: | Size: 265 KiB |
BIN
src/assets/images/pages/img_2.png
Normal file
|
After Width: | Height: | Size: 380 KiB |
BIN
src/assets/images/pages/img_3.png
Normal file
|
After Width: | Height: | Size: 1.1 MiB |
BIN
src/assets/images/pages/img_4.jpg
Normal file
|
After Width: | Height: | Size: 185 KiB |
BIN
src/assets/images/pages/img_4.png
Normal file
|
After Width: | Height: | Size: 280 KiB |
BIN
src/assets/images/pages/qcode.png
Normal file
|
After Width: | Height: | Size: 3.3 KiB |
BIN
src/assets/images/rs/1@2x.png
Normal file
|
After Width: | Height: | Size: 4.8 KiB |
BIN
src/assets/images/rs/2@2x.png
Normal file
|
After Width: | Height: | Size: 4.6 KiB |
BIN
src/assets/images/rs/3@2x.png
Normal file
|
After Width: | Height: | Size: 4.8 KiB |
BIN
src/assets/images/rs/4@2x.png
Normal file
|
After Width: | Height: | Size: 4.4 KiB |
BIN
src/assets/images/rs/5@2x.png
Normal file
|
After Width: | Height: | Size: 4.5 KiB |
BIN
src/assets/images/rs/back.png
Normal file
|
After Width: | Height: | Size: 1.2 MiB |
BIN
src/assets/images/rs/balloon.png
Normal file
|
After Width: | Height: | Size: 46 KiB |
BIN
src/assets/images/rs/cursor.png
Normal file
|
After Width: | Height: | Size: 6.0 KiB |
BIN
src/assets/images/rs/cursor2.png
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
src/assets/images/rs/logo.png
Normal file
|
After Width: | Height: | Size: 5.9 KiB |
BIN
src/assets/images/rs/pointer.png
Normal file
|
After Width: | Height: | Size: 10 KiB |
BIN
src/assets/images/rs/rect.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
src/assets/images/rs/road/img.png
Normal file
|
After Width: | Height: | Size: 5.6 KiB |
BIN
src/assets/images/rs/road/road-1.png
Normal file
|
After Width: | Height: | Size: 9.4 KiB |
BIN
src/assets/images/rs/road/road-2.png
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
src/assets/images/rs/road/road-3.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
src/assets/images/rs/road/road-4.png
Normal file
|
After Width: | Height: | Size: 3.8 KiB |
BIN
src/assets/images/rs/t1-1.png
Normal file
|
After Width: | Height: | Size: 21 KiB |
BIN
src/assets/images/rs/t1.png
Normal file
|
After Width: | Height: | Size: 4.1 KiB |
BIN
src/assets/images/rs/t2-1.png
Normal file
|
After Width: | Height: | Size: 200 KiB |
BIN
src/assets/images/rs/t2.png
Normal file
|
After Width: | Height: | Size: 6.5 KiB |
BIN
src/assets/images/rs/t3-1.png
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
src/assets/images/rs/t3.png
Normal file
|
After Width: | Height: | Size: 3.9 KiB |
BIN
src/assets/images/rs/t4-1.png
Normal file
|
After Width: | Height: | Size: 23 KiB |
BIN
src/assets/images/rs/t4.png
Normal file
|
After Width: | Height: | Size: 6.1 KiB |
BIN
src/assets/images/rs/t5-1.png
Normal file
|
After Width: | Height: | Size: 30 KiB |
BIN
src/assets/images/rs/t5.png
Normal file
|
After Width: | Height: | Size: 8.4 KiB |
461
src/assets/js/business-common.js
Normal file
@@ -0,0 +1,461 @@
|
||||
/**
|
||||
* @desc 扩展对象继承
|
||||
* @param {Object} out 一个或多个对象
|
||||
* @return {Object} 对象
|
||||
*/
|
||||
Object.extend = function(out) {
|
||||
out = out || {}
|
||||
for (var i = 1; i < arguments.length; i++) {
|
||||
if (!arguments[i]) continue
|
||||
|
||||
for (var key in arguments[i]) {
|
||||
if (arguments[i].hasOwnProperty(key)) out[key] = arguments[i][key]
|
||||
}
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
/**
|
||||
* @desc 时间格式转化
|
||||
* @param {String} format 转化格式
|
||||
* @return {String} 已转化的时间
|
||||
*/
|
||||
Date.prototype.format = function(format) {
|
||||
let args = {
|
||||
'M+': this.getMonth() + 1,
|
||||
'd+': this.getDate(),
|
||||
'h+': this.getHours(),
|
||||
'm+': this.getMinutes(),
|
||||
's+': this.getSeconds(),
|
||||
'q+': Math.floor((this.getMonth() + 3) / 3), // quarter
|
||||
S: this.getMilliseconds()
|
||||
}
|
||||
if (/(y+)/.test(format)) format = format.replace(RegExp.$1, (this.getFullYear() + '').substr(4 - RegExp.$1.length))
|
||||
for (var i in args) {
|
||||
var n = args[i]
|
||||
if (new RegExp('(' + i + ')').test(format)) format = format.replace(RegExp.$1, RegExp.$1.length == 1 ? n : ('00' + n).substr(('' + n).length))
|
||||
}
|
||||
return format
|
||||
}
|
||||
|
||||
export default {
|
||||
/**
|
||||
* @desc 判断对象是否为空
|
||||
* @param {Object} o 对象
|
||||
* @return {Boolean}
|
||||
*/
|
||||
isEmptyObject(o = {}) {
|
||||
let flag = true
|
||||
for (let k in o) {
|
||||
if (k) {
|
||||
flag = false
|
||||
break
|
||||
}
|
||||
}
|
||||
return flag
|
||||
},
|
||||
|
||||
/**
|
||||
* @description 去除前后空格
|
||||
* @param {String} 值
|
||||
* @return {String}
|
||||
*/
|
||||
trim(val) {
|
||||
return val.replace(/(^\s*)|(\s*$)/g, '')
|
||||
},
|
||||
|
||||
// 获取query特定参数
|
||||
getQueryParameter() {
|
||||
let activityFromApp = this.getQuery().activityFromApp
|
||||
let appUserToken = this.getQuery().appUserToken
|
||||
let env = this.getQuery().env
|
||||
let query = {}
|
||||
if (activityFromApp) {
|
||||
query.activityFromApp = activityFromApp
|
||||
}
|
||||
if (appUserToken) {
|
||||
query.appUserToken = decodeURIComponent(appUserToken.replace(/%20/g, '+'))
|
||||
}
|
||||
if (env) {
|
||||
query.env = env
|
||||
}
|
||||
return query
|
||||
},
|
||||
|
||||
/**
|
||||
z * @param {String} str 目标字符串
|
||||
* @param {String} char 字符
|
||||
* @param {Number} start 数组开始索引
|
||||
* @param {Number} end 数组结束索引
|
||||
* @return {[type]} [description]
|
||||
*/
|
||||
replaceChar(str = '', char = '*', start = 0, end) {
|
||||
let list = []
|
||||
if (str) {
|
||||
list = str.split('')
|
||||
let len = list.length
|
||||
start = start > 0 ? (start <= len ? start : len) : 0
|
||||
end = end ? (end > start ? end : start) : len
|
||||
for (let i = 0; i < len; i++) {
|
||||
if (i >= start && i < end) {
|
||||
list[i] = char
|
||||
}
|
||||
}
|
||||
}
|
||||
return list.join('')
|
||||
},
|
||||
|
||||
addSpace(value, num = 4) {
|
||||
if (value) {
|
||||
return value.replace(/\s/g, '').replace(/(.{4})/g, '$1 ')
|
||||
}
|
||||
return value
|
||||
},
|
||||
|
||||
// 字符省略
|
||||
ellipsis(value = '', num = -1) {
|
||||
if (value) {
|
||||
let str = ''
|
||||
if (num > 0 && value.length > num) {
|
||||
str = '...'
|
||||
}
|
||||
return value.slice(0, num) + str
|
||||
}
|
||||
return value
|
||||
},
|
||||
|
||||
/**
|
||||
* @desc 获取 cookie
|
||||
* @param {String}
|
||||
* @return {*}
|
||||
*/
|
||||
getCookie(name) {
|
||||
let rs = ''
|
||||
var name = name + '='
|
||||
var ca = document.cookie.split(';')
|
||||
for (var i = 0; i < ca.length; i++) {
|
||||
var c = ca[i]
|
||||
while (c.charAt(0) == ' ') {
|
||||
c = c.substring(1)
|
||||
}
|
||||
if (c.indexOf(name) != -1) {
|
||||
rs = this._string2json(c.substring(name.length, c.length))
|
||||
}
|
||||
}
|
||||
return rs
|
||||
},
|
||||
|
||||
/**
|
||||
* @desc 设置 cookie
|
||||
* @param {String} name 名称
|
||||
* @param {*} value 值
|
||||
* @param {Number} hours 时长
|
||||
*/
|
||||
setCookie(name, value, hours) {
|
||||
let str = name + '=' + this._json2string(value)
|
||||
if (hours && hours > 0) {
|
||||
var date = new Date()
|
||||
date.setTime(date.getTime() + hours * 3600 * 1000)
|
||||
str += '; expires=' + date.toUTCString()
|
||||
}
|
||||
document.cookie = str
|
||||
},
|
||||
|
||||
/**
|
||||
* @desc 清除 cookie
|
||||
* @param {String} 名称
|
||||
*/
|
||||
delCookie(name) {
|
||||
var date = new Date()
|
||||
date.setTime(date.getTime() - 10000)
|
||||
document.cookie = name + '=a; expires=' + date.toGMTString()
|
||||
},
|
||||
|
||||
/**
|
||||
* @desc 获取 localStorage 中指定的变量
|
||||
* @param {String} name 名称
|
||||
* @return {*} rs
|
||||
*/
|
||||
getStorage(name) {
|
||||
return this._string2json(window.sessionStorage[name])
|
||||
},
|
||||
|
||||
/**
|
||||
* @desc 设置或添加 localStorage 中指定的变量
|
||||
* @param {String} name 名称
|
||||
*/
|
||||
setStorage(name, value) {
|
||||
window.sessionStorage[name] = this._json2string(value)
|
||||
},
|
||||
|
||||
/**
|
||||
* @desc 删除 localStorage 中指定的变量
|
||||
* @param {String} name 名称
|
||||
*/
|
||||
delStorage(name) {
|
||||
window.sessionStorage.removeItem(name)
|
||||
},
|
||||
|
||||
/**
|
||||
* @desc json转string
|
||||
* @param {*} value 值
|
||||
* @return {*} value 值
|
||||
*/
|
||||
_json2string(value) {
|
||||
return JSON.stringify(value)
|
||||
},
|
||||
/**
|
||||
* 获取设备类型
|
||||
*/
|
||||
device() {
|
||||
let ua = navigator.userAgent
|
||||
return {
|
||||
isChrome: ua.match(/Chrome\/([\d.]+)/) || ua.match(/CriOS\/([\d.]+)/),
|
||||
isAndroid: ua.match(/(Android);?[\s\/]+([\d.]+)?/),
|
||||
isIphone: ua.indexOf('iPhone') != -1,
|
||||
isWeixin: ua.match(/MicroMessenger/i)
|
||||
}
|
||||
},
|
||||
/**
|
||||
* 设置title
|
||||
*/
|
||||
setTitle(title) {
|
||||
let device = this.device()
|
||||
if (device.isIphone && device.isWeixin) {
|
||||
document.title = title
|
||||
var i = document.createElement('iframe')
|
||||
i.src = '/favicon.ico'
|
||||
i.style.display = 'none'
|
||||
i.onload = function() {
|
||||
setTimeout(function() {
|
||||
i.remove()
|
||||
}, 9)
|
||||
}
|
||||
document.body.appendChild(i)
|
||||
} else {
|
||||
document.title = title
|
||||
}
|
||||
},
|
||||
/**
|
||||
* @desc string转json
|
||||
* @param {*} value 值
|
||||
* @return {*} value 值
|
||||
*/
|
||||
_string2json(value) {
|
||||
try {
|
||||
value = JSON.parse(value)
|
||||
} catch (e) {}
|
||||
return value
|
||||
},
|
||||
/**
|
||||
*@desc 只能输入单词字符
|
||||
*@param { String } value
|
||||
*/
|
||||
character(value) {
|
||||
if (value) {
|
||||
value = value.replace(/[^A-Za-z0-9]/g, '')
|
||||
}
|
||||
return value
|
||||
},
|
||||
|
||||
m2km(value) {
|
||||
if (value < 1000) return value + 'm'
|
||||
else if (value >= 1000 && value <= 20000) return (value / 1000).toFixed(1) + 'km'
|
||||
else if (value >= 2000) return '>20km'
|
||||
return value
|
||||
},
|
||||
|
||||
/**
|
||||
* 除法
|
||||
* @param {Number} dividend 被除数
|
||||
* @param {Number} divisor 除数
|
||||
* @return {Number} 值
|
||||
*/
|
||||
divide(dividend, divisor = 100) {
|
||||
if (dividend && divisor) {
|
||||
dividend = Number(dividend)
|
||||
return this.toFloatFixed(dividend / divisor)
|
||||
}
|
||||
return dividend
|
||||
},
|
||||
|
||||
// 保留小数位,替代Number.toFixed()方法,针对于某些数据(16.455)不能做到四舍五入
|
||||
toFixed(value, num = 0) {
|
||||
let pos = value.toString().indexOf('.')
|
||||
let decimalPlaces = value.toString().length - pos - 1
|
||||
let intValue = value * Math.pow(10, decimalPlaces)
|
||||
let divisor1 = Math.pow(10, decimalPlaces - num)
|
||||
let divisor2 = Math.pow(10, num)
|
||||
return Math.round(intValue / divisor1) / divisor2
|
||||
},
|
||||
|
||||
/**
|
||||
* 获取App信息
|
||||
*/
|
||||
detectApp() {
|
||||
var ua = navigator.userAgent
|
||||
//RegExp.$1; RegExp.$2; RegExp.$3;
|
||||
//var info = ua.match(/(CarmeApp)\s*[v]*(\d+\.\d+\.\d+)\s*\/\s*(IOS|Android)/i)
|
||||
ua.match(/(CarmeApp)\s*[v]*(\d+\.\d+\.\d+)\s*\/\s*(IOS|Android)/i)
|
||||
return {
|
||||
appName: RegExp.$1,
|
||||
appVersion: RegExp.$2,
|
||||
appOS: RegExp.$3
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* 如果是小数则保留小数位,默认两位
|
||||
* @param {[type]} value [description]
|
||||
* @param {Number} num [description]
|
||||
* @return {[type]} [description]
|
||||
*/
|
||||
toFloatFixed(value, num = 2) {
|
||||
let values = Number(value)
|
||||
if (values) {
|
||||
if (/^\d+\.\d+/.test(values)) {
|
||||
return this.toFixed(values, num)
|
||||
} else {
|
||||
return this.toFixed(values)
|
||||
}
|
||||
}
|
||||
return value
|
||||
},
|
||||
|
||||
// 获取周
|
||||
getWeek(str) {
|
||||
let rs = ''
|
||||
switch (str + '') {
|
||||
case '1':
|
||||
rs = '一'
|
||||
break
|
||||
case '2':
|
||||
rs = '二'
|
||||
break
|
||||
case '3':
|
||||
rs = '三'
|
||||
break
|
||||
case '4':
|
||||
rs = '四'
|
||||
break
|
||||
case '5':
|
||||
rs = '五'
|
||||
break
|
||||
case '6':
|
||||
rs = '六'
|
||||
break
|
||||
case '7':
|
||||
case '0':
|
||||
rs = '日'
|
||||
break
|
||||
default:
|
||||
break
|
||||
}
|
||||
return rs
|
||||
},
|
||||
|
||||
// 获取补全的时间
|
||||
getTime(str) {
|
||||
if (str < 10) {
|
||||
return '0' + str
|
||||
}
|
||||
return str
|
||||
},
|
||||
|
||||
// 数组去重
|
||||
unrepeat(arr) {
|
||||
if (arr instanceof Array) {
|
||||
let hash = {}
|
||||
let rsArr = []
|
||||
let len = arr.length
|
||||
let type = ''
|
||||
for (let i = 0; i < len; i++) {
|
||||
if (typeof arr[i] == 'string') {
|
||||
type = 'string'
|
||||
}
|
||||
if (!hash[arr[i]]) {
|
||||
hash[arr[i]] = arr[i]
|
||||
rsArr.push(arr[i])
|
||||
}
|
||||
}
|
||||
return rsArr
|
||||
}
|
||||
},
|
||||
// 一层对象数组去重
|
||||
unrepeatObj(arr, key) {
|
||||
if (arr instanceof Array) {
|
||||
let hash = {}
|
||||
let rsArr = []
|
||||
let len = arr.length
|
||||
let type = ''
|
||||
for (let i = 0; i < len; i++) {
|
||||
if (typeof arr[i] == 'string') {
|
||||
type = 'string'
|
||||
}
|
||||
if (!hash[arr[i][key]]) {
|
||||
hash[arr[i][key]] = arr[i]
|
||||
rsArr.push(arr[i])
|
||||
}
|
||||
}
|
||||
return rsArr
|
||||
}
|
||||
},
|
||||
/**
|
||||
@desc:只能输入整数
|
||||
@param
|
||||
value 操作数值
|
||||
max 最大值
|
||||
**/
|
||||
intOnly(value, max = Infinity, min = 0) {
|
||||
if (value) {
|
||||
let regular0 = /^0{1,}$/
|
||||
if (regular0.test(value)) {
|
||||
// 如果输入1个0以上,去除掉
|
||||
value = value.replace(/^0{1,}$/, '')
|
||||
}
|
||||
if (/[^0-9]*$/.test(value)) {
|
||||
value = value.replace(/\D/g, '')
|
||||
} else {
|
||||
if (value > max) value = value.substr(0, value.length - 1)
|
||||
if (value < min) value = min
|
||||
}
|
||||
}
|
||||
return value
|
||||
},
|
||||
|
||||
//解析url参数
|
||||
getQuery() {
|
||||
var query = []
|
||||
// 当url是通过传参过来的话,我们把第一个参数作为url并进行解析
|
||||
if (arguments[0]) {
|
||||
let lnk = document.createElement('a')
|
||||
lnk.href = arguments[0]
|
||||
query = this.extractQuery(lnk)
|
||||
} else {
|
||||
/*
|
||||
var query = window.location.search.split('?');
|
||||
if(query.length <= 1) query = window.location.hash.split('#');
|
||||
query = query.length > 1 ? query[1].split('&') : []
|
||||
*/
|
||||
query = this.extractQuery(window.location)
|
||||
}
|
||||
|
||||
var json = {}
|
||||
for (var i = 0, len = query.length; i < len; i++) {
|
||||
var key = query[i].split('=')[0],
|
||||
index = query[i].indexOf('='),
|
||||
value = query[i].substr(index + 1)
|
||||
json[key] = value
|
||||
}
|
||||
|
||||
return json
|
||||
},
|
||||
extractQuery(lnk) {
|
||||
var query = lnk.search.split('?')
|
||||
//url/#/repairBooking?activityFromApp=1
|
||||
if (query.length <= 1) query = lnk.hash.split('?')
|
||||
query = query.length > 1 ? query[1].split('&') : []
|
||||
|
||||
return query
|
||||
}
|
||||
}
|
||||
273
src/assets/js/common.js
Normal file
@@ -0,0 +1,273 @@
|
||||
/**
|
||||
* @desc 扩展对象继承
|
||||
* @param {Object} out 一个或多个对象
|
||||
* @return {Object} 对象
|
||||
*/
|
||||
Object.extend = function(out) {
|
||||
out = out || {}
|
||||
for (var i = 1; i < arguments.length; i++) {
|
||||
if (!arguments[i]) continue
|
||||
|
||||
for (var key in arguments[i]) {
|
||||
if (arguments[i].hasOwnProperty(key)) out[key] = arguments[i][key]
|
||||
}
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
export default {
|
||||
/**
|
||||
* @desc 判断对象是否为空
|
||||
* @param {Object} o 对象
|
||||
* @return {Boolean}
|
||||
*/
|
||||
isEmptyObject(o = {}) {
|
||||
let flag = true
|
||||
for (const k in o) {
|
||||
if (k) {
|
||||
flag = false
|
||||
break
|
||||
}
|
||||
}
|
||||
return flag
|
||||
},
|
||||
|
||||
/**
|
||||
* @description 去除前后空格
|
||||
* @param {String} 值
|
||||
* @return {String}
|
||||
*/
|
||||
trim(val) {
|
||||
return val.replace(/(^\s*)|(\s*$)/g, '')
|
||||
},
|
||||
|
||||
/**
|
||||
* @desc 获取 cookie
|
||||
* @param {String}
|
||||
* @return {*}
|
||||
*/
|
||||
getCookie(name1) {
|
||||
let rs = ''
|
||||
var name = name1 + '='
|
||||
var ca = document.cookie.split(';')
|
||||
for (var i = 0; i < ca.length; i++) {
|
||||
var c = ca[i]
|
||||
while (c.charAt(0) == ' ') {
|
||||
c = c.substring(1)
|
||||
}
|
||||
if (c.indexOf(name) != -1) {
|
||||
rs = this._string2json(c.substring(name.length, c.length))
|
||||
}
|
||||
}
|
||||
return rs
|
||||
},
|
||||
|
||||
/**
|
||||
* @desc 设置 cookie
|
||||
* @param {String} name 名称
|
||||
* @param {*} value 值
|
||||
* @param {Number} hours 时长
|
||||
*/
|
||||
setCookie(name, value, hours) {
|
||||
let str = name + '=' + this._json2string(value)
|
||||
if (hours && hours > 0) {
|
||||
var date = new Date()
|
||||
date.setTime(date.getTime() + hours * 3600 * 1000)
|
||||
str += '; expires=' + date.toUTCString()
|
||||
}
|
||||
document.cookie = str
|
||||
},
|
||||
|
||||
/**
|
||||
* @desc 清除 cookie
|
||||
* @param {String} 名称
|
||||
*/
|
||||
delCookie(name) {
|
||||
var date = new Date()
|
||||
date.setTime(date.getTime() - 10000)
|
||||
document.cookie = name + '=a; expires=' + date.toGMTString()
|
||||
},
|
||||
|
||||
/**
|
||||
* @desc 获取 localStorage 中指定的变量
|
||||
* @param {String} name 名称
|
||||
* @return {*} rs
|
||||
*/
|
||||
getStorage(name) {
|
||||
return this._string2json(window.sessionStorage[name])
|
||||
},
|
||||
|
||||
/**
|
||||
* @desc 设置或添加 localStorage 中指定的变量
|
||||
* @param {String} name 名称
|
||||
*/
|
||||
setStorage(name, value) {
|
||||
window.sessionStorage[name] = this._json2string(value)
|
||||
},
|
||||
|
||||
/**
|
||||
* @desc 删除 localStorage 中指定的变量
|
||||
* @param {String} name 名称
|
||||
*/
|
||||
delStorage(name) {
|
||||
window.sessionStorage.removeItem(name)
|
||||
},
|
||||
|
||||
/**
|
||||
* @desc json转string
|
||||
* @param {*} value 值
|
||||
* @return {*} value 值
|
||||
*/
|
||||
_json2string(value) {
|
||||
return JSON.stringify(value)
|
||||
},
|
||||
/**
|
||||
* @desc string转json
|
||||
* @param {*} value 值
|
||||
* @return {*} value 值
|
||||
*/
|
||||
_string2json(value) {
|
||||
try {
|
||||
value = JSON.parse(value)
|
||||
} catch (e) {
|
||||
//
|
||||
}
|
||||
return value
|
||||
},
|
||||
/**
|
||||
*@desc 只能输入单词字符
|
||||
*@param { String } value
|
||||
*/
|
||||
character(value) {
|
||||
if (value) {
|
||||
value = value.replace(/[^A-Za-z0-9]/g, '')
|
||||
}
|
||||
return value
|
||||
},
|
||||
// 保留小数位,替代Number.toFixed()方法,针对于某些数据(16.455)不能做到四舍五入
|
||||
toFixed(value, num = 0) {
|
||||
const pos = value.toString().indexOf('.')
|
||||
const decimalPlaces = value.toString().length - pos - 1
|
||||
const intValue = value * Math.pow(10, decimalPlaces)
|
||||
const divisor1 = Math.pow(10, decimalPlaces - num)
|
||||
const divisor2 = Math.pow(10, num)
|
||||
return Math.round(intValue / divisor1) / divisor2
|
||||
},
|
||||
|
||||
/**
|
||||
* 如果是小数则保留小数位,默认两位
|
||||
* @param {[type]} value [description]
|
||||
* @param {Number} num [description]
|
||||
* @return {[type]} [description]
|
||||
*/
|
||||
toFloatFixed(value, num = 2) {
|
||||
const values = Number(value)
|
||||
if (values) {
|
||||
if (/^\d+\.\d+/.test(values)) {
|
||||
return this.toFixed(values, num)
|
||||
} else {
|
||||
return this.toFixed(values)
|
||||
}
|
||||
}
|
||||
return value
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse the time to string
|
||||
* @param {(Object|string|number)} time
|
||||
* @param {string} cFormat
|
||||
* @returns {string}
|
||||
*/
|
||||
export function parseTime(time, cFormat) {
|
||||
if (arguments.length === 0) {
|
||||
return null
|
||||
}
|
||||
const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}'
|
||||
let date
|
||||
if (typeof time === 'object') {
|
||||
date = time
|
||||
} else {
|
||||
if (typeof time === 'string' && /^[0-9]+$/.test(time)) {
|
||||
time = parseInt(time)
|
||||
}
|
||||
if (typeof time === 'number' && time.toString().length === 10) {
|
||||
time = time * 1000
|
||||
}
|
||||
date = new Date(time)
|
||||
}
|
||||
const formatObj = {
|
||||
y: date.getFullYear(),
|
||||
m: date.getMonth() + 1,
|
||||
d: date.getDate(),
|
||||
h: date.getHours(),
|
||||
i: date.getMinutes(),
|
||||
s: date.getSeconds(),
|
||||
a: date.getDay()
|
||||
}
|
||||
const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
|
||||
let value = formatObj[key]
|
||||
// Note: getDay() returns 0 on Sunday
|
||||
if (key === 'a') {
|
||||
return ['日', '一', '二', '三', '四', '五', '六'][value]
|
||||
}
|
||||
if (result.length > 0 && value < 10) {
|
||||
value = '0' + value
|
||||
}
|
||||
return value || 0
|
||||
})
|
||||
return time_str
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {number} time
|
||||
* @param {string} option
|
||||
* @returns {string}
|
||||
*/
|
||||
export function formatTime(time, option) {
|
||||
if (('' + time).length === 10) {
|
||||
time = parseInt(time) * 1000
|
||||
} else {
|
||||
time = +time
|
||||
}
|
||||
const d = new Date(time)
|
||||
const now = Date.now()
|
||||
|
||||
const diff = (now - d) / 1000
|
||||
|
||||
if (diff < 30) {
|
||||
return '刚刚'
|
||||
} else if (diff < 3600) {
|
||||
// less 1 hour
|
||||
return Math.ceil(diff / 60) + '分钟前'
|
||||
} else if (diff < 3600 * 24) {
|
||||
return Math.ceil(diff / 3600) + '小时前'
|
||||
} else if (diff < 3600 * 24 * 2) {
|
||||
return '1天前'
|
||||
}
|
||||
if (option) {
|
||||
return parseTime(time, option)
|
||||
} else {
|
||||
return d.getMonth() + 1 + '月' + d.getDate() + '日' + d.getHours() + '时' + d.getMinutes() + '分'
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {string} url
|
||||
* @returns {Object}
|
||||
*/
|
||||
export function param2Obj(url) {
|
||||
const search = url.split('?')[1]
|
||||
if (!search) {
|
||||
return {}
|
||||
}
|
||||
return JSON.parse(
|
||||
'{"' +
|
||||
decodeURIComponent(search)
|
||||
.replace(/"/g, '\\"')
|
||||
.replace(/&/g, '","')
|
||||
.replace(/=/g, '":"')
|
||||
.replace(/\+/g, ' ') +
|
||||
'"}'
|
||||
)
|
||||
}
|
||||
32
src/assets/js/generatedFormat/index.js
Normal file
@@ -0,0 +1,32 @@
|
||||
export default {
|
||||
formatLabelFun: (value, dir) => {
|
||||
let arr = eval(`${dir}DataMaps`)
|
||||
let filterData = arr.filter(item => item.value == value)[0]
|
||||
if (filterData) {
|
||||
return filterData.label
|
||||
} else {
|
||||
return value
|
||||
}
|
||||
},
|
||||
|
||||
formatList: (dir) => {
|
||||
let maps = {}
|
||||
return maps[dir];
|
||||
},
|
||||
|
||||
// formatOptionsFun 固定生成
|
||||
// 用于转换list 增加自己想要的字段
|
||||
formatOptionsFun: function (array = [{label: 'name', formatLabel: 'label'}], data) {
|
||||
return data.map(item => {
|
||||
array.map(format => {
|
||||
if (item[format.label]) {
|
||||
item[format.formatLabel ? format.formatLabel : 'label'] = item[format.label]
|
||||
}
|
||||
if (item.children && item.children.length > 0) {
|
||||
item.children = this.formatOptionsFun(array, item.children)
|
||||
}
|
||||
})
|
||||
return item
|
||||
})
|
||||
}
|
||||
}
|
||||
15
src/assets/js/utils/auth.js
Normal file
@@ -0,0 +1,15 @@
|
||||
import Common from '@/assets/js/common'
|
||||
|
||||
const TokenKey = 'token'
|
||||
|
||||
export function getToken() {
|
||||
return Common.getStorage(TokenKey)
|
||||
}
|
||||
|
||||
export function setToken(token) {
|
||||
return Common.setStorage(TokenKey, token)
|
||||
}
|
||||
|
||||
export function removeToken() {
|
||||
return Common.delStorage(TokenKey)
|
||||
}
|
||||
52
src/assets/js/utils/encrypt.js
Normal file
@@ -0,0 +1,52 @@
|
||||
//encrypt.js
|
||||
/**
|
||||
* 通过crypto-js实现 加解密工具
|
||||
* AES
|
||||
* @author: wmz
|
||||
*/
|
||||
import CryptoJS from 'crypto-js'
|
||||
const KP = {
|
||||
key: 'AJDBW8D2zdDq3b5U', // 秘钥 16*n:
|
||||
iv: '' // 偏移量
|
||||
}
|
||||
function getAesString(data, key, iv) {
|
||||
// 加密
|
||||
key = CryptoJS.enc.Utf8.parse(key)
|
||||
iv = CryptoJS.enc.Utf8.parse(iv)
|
||||
let encrypted = CryptoJS.AES.encrypt(data, key, {
|
||||
// iv: iv,
|
||||
mode: CryptoJS.mode.ECB,
|
||||
padding: CryptoJS.pad.Pkcs7
|
||||
})
|
||||
return encrypted.toString() // 返回的是base64格式的密文
|
||||
}
|
||||
function getDAesString(encrypted, key, iv) {
|
||||
// 解密
|
||||
key = CryptoJS.enc.Utf8.parse(key)
|
||||
iv = CryptoJS.enc.Utf8.parse(iv)
|
||||
let decrypted = CryptoJS.AES.decrypt(encrypted, key, {
|
||||
// iv: iv,
|
||||
mode: CryptoJS.mode.ECB,
|
||||
padding: CryptoJS.pad.Pkcs7
|
||||
})
|
||||
return decrypted.toString(CryptoJS.enc.Utf8) //
|
||||
}
|
||||
// AES 对称秘钥加密
|
||||
const aes = {
|
||||
en: data => getAesString(data, KP.key, KP.iv),
|
||||
de: data => getDAesString(data, KP.key, KP.iv)
|
||||
}
|
||||
// BASE64
|
||||
const base64 = {
|
||||
en: data => CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(data)),
|
||||
de: data => CryptoJS.enc.Base64.parse(data).toString(CryptoJS.enc.Utf8)
|
||||
}
|
||||
// SHA256
|
||||
const sha256 = data => {
|
||||
return CryptoJS.SHA256(data).toString()
|
||||
}
|
||||
// MD5
|
||||
const md5 = data => {
|
||||
return CryptoJS.MD5(data).toString()
|
||||
}
|
||||
export { aes, md5, sha256, base64 }
|
||||
10
src/assets/js/utils/get-page-title.js
Normal file
@@ -0,0 +1,10 @@
|
||||
import defaultSettings from '@/assets/js/utils/settings'
|
||||
|
||||
const title = defaultSettings.title || 'Vue Admin Template'
|
||||
|
||||
export default function getPageTitle(pageTitle) {
|
||||
if (pageTitle) {
|
||||
return `${pageTitle} - ${title}`
|
||||
}
|
||||
return `${title}`
|
||||
}
|
||||
9
src/assets/js/utils/get-url.js
Normal file
@@ -0,0 +1,9 @@
|
||||
import config from '@/config'
|
||||
import urlMap from '@/config/urlMap'
|
||||
|
||||
export default function getUrl(url, domainType = 'admin') {
|
||||
let domain = ''
|
||||
if (domainType === 'admin') {
|
||||
domain = config.admin
|
||||
} return domain + url
|
||||
}
|
||||
32
src/assets/js/utils/permission.js
Normal file
@@ -0,0 +1,32 @@
|
||||
import router from '@/router'
|
||||
import store from '@/store'
|
||||
import NProgress from 'nprogress' // progress bar
|
||||
import 'nprogress/nprogress.css' // progress bar style
|
||||
import { getToken } from '@/assets/js/utils/auth' // get token from cookie
|
||||
import getPageTitle from '@/assets/js/utils/get-page-title'
|
||||
NProgress.configure({ showSpinner: false }) // NProgress Configuration
|
||||
const whiteList = ['/authentication', '/home', '/404'] // no redirect whitelist
|
||||
router.beforeEach(async (to, from, next) => {
|
||||
sessionStorage.setItem('token', 'MockToken')
|
||||
document.title = getPageTitle(to.meta.title)
|
||||
const hasToken = getToken()
|
||||
if (hasToken) {
|
||||
next()
|
||||
} else {
|
||||
if (to.path.indexOf('/home') !== -1) {
|
||||
next(`/authentication?redirect=${to.path}`)
|
||||
} else {
|
||||
if (whiteList.indexOf(to.path) !== -1) {
|
||||
next()
|
||||
} else {
|
||||
next()
|
||||
NProgress.done()
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
router.afterEach(() => {
|
||||
// finish progress bar
|
||||
NProgress.done()
|
||||
})
|
||||
102
src/assets/js/utils/request.js
Normal file
@@ -0,0 +1,102 @@
|
||||
import axios from 'axios'
|
||||
import { MessageBox, Message, Loading } from 'element-ui'
|
||||
import store from '@/store'
|
||||
import { getToken } from '@/assets/js/utils/auth'
|
||||
|
||||
// create an axios instance
|
||||
const service = axios.create({
|
||||
baseURL: '', // url = base url + request url
|
||||
timeout: 600000 // request timeout
|
||||
})
|
||||
|
||||
let loading
|
||||
function startLoading() {
|
||||
//使用Element loading-start 方法
|
||||
loading = Loading.service({
|
||||
target: '.main-container'
|
||||
})
|
||||
}
|
||||
function endLoading() {
|
||||
//使用Element loading-close 方法
|
||||
loading.close()
|
||||
}
|
||||
|
||||
// request interceptor
|
||||
service.interceptors.request.use(
|
||||
config => {
|
||||
if (store.getters.token) {
|
||||
// config.headers['sid'] = getToken()
|
||||
config.headers['sysType'] = '3'
|
||||
config.headers['auth'] = getToken()
|
||||
}
|
||||
if (loading) {
|
||||
endLoading()
|
||||
}
|
||||
//linkage 接口
|
||||
// config.type 可以从api的接口地址定义 可以不触发loading
|
||||
if (config.type != false) {
|
||||
startLoading()
|
||||
}
|
||||
return config
|
||||
},
|
||||
error => {
|
||||
return Promise.reject(error)
|
||||
}
|
||||
)
|
||||
// response interceptor
|
||||
service.interceptors.response.use(
|
||||
response => {
|
||||
const res = response.data
|
||||
endLoading()
|
||||
if (response.request.responseType == 'blob' || response.request.responseType == 'Blob') {
|
||||
return response.data
|
||||
}
|
||||
if (res.content.code != '0' && res.content.result != 0) {
|
||||
//500毫秒延迟 显得过度平滑
|
||||
// token过期或失效 根据项目设置其code
|
||||
if (response.headers['content-type'] != 'application/x-zip-compressed') {
|
||||
if (res.content.code === '4001' || res.content.code === '4002') {
|
||||
MessageBox.confirm('你已被登出,可以取消继续留在该页面,或者重新登录', '确认退出', {
|
||||
confirmButtonText: '重新登录',
|
||||
cancelButtonText: '取消',
|
||||
type: 'warning'
|
||||
}).then(() => {
|
||||
store.dispatch('user/resetToken').then(() => {
|
||||
location.reload()
|
||||
})
|
||||
})
|
||||
} else {
|
||||
Message({
|
||||
message: res.content.message || 'Error',
|
||||
type: 'error',
|
||||
duration: 5 * 1000
|
||||
})
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (res.content.code == '1' || res.content.code == '') {
|
||||
Message({
|
||||
message: res.content.resultMessage ? res.content.resultMessage : res.content.message ? res.content.message : '接口错误',
|
||||
type: 'error',
|
||||
duration: 5 * 1000
|
||||
})
|
||||
return false
|
||||
} else {
|
||||
res.content.result = '0'
|
||||
res.result = String(res.result?res.result:0)
|
||||
res.code = String(res.code ? res.code: 0 )
|
||||
return res
|
||||
}
|
||||
}
|
||||
},
|
||||
error => {
|
||||
Message({
|
||||
message: error.message,
|
||||
type: 'error',
|
||||
duration: 5 * 500
|
||||
})
|
||||
return Promise.reject(error)
|
||||
}
|
||||
)
|
||||
|
||||
export default service
|
||||
50
src/assets/js/utils/settings.js
Normal file
@@ -0,0 +1,50 @@
|
||||
module.exports = {
|
||||
/**
|
||||
* @description 网站标题
|
||||
*/
|
||||
title: '幸福人寿',
|
||||
/**
|
||||
* @description 是否显示 tagsView
|
||||
*/
|
||||
tagsView: true,
|
||||
/**
|
||||
* @description 固定头部
|
||||
*/
|
||||
fixedHeader: true,
|
||||
/**
|
||||
* @description 记住密码状态下的token在Cookie中存储的天数,默认1天
|
||||
*/
|
||||
tokenCookieExpires: 1,
|
||||
/**
|
||||
* @description 记住密码状态下的密码在Cookie中存储的天数,默认1天s
|
||||
*/
|
||||
passCookieExpires: 1,
|
||||
/**
|
||||
* @description 是否只保持一个子菜单的展开
|
||||
*/
|
||||
uniqueOpened: true,
|
||||
/**
|
||||
* @description token key
|
||||
*/
|
||||
TokenKey: 'EL-ADMIN-TOEKN',
|
||||
/**
|
||||
* @description 请求超时时间,毫秒(默认2分钟)
|
||||
*/
|
||||
timeout: 1200000,
|
||||
/**
|
||||
* @description 是否显示logo
|
||||
*/
|
||||
sidebarLogo: true,
|
||||
/**
|
||||
* 是否显示设置的底部信息
|
||||
*/
|
||||
showFooter: true,
|
||||
/**
|
||||
* 底部文字,支持html语法
|
||||
*/
|
||||
footerTxt: '© 2020 IO',
|
||||
/**
|
||||
* 备案号
|
||||
*/
|
||||
caseNumber: ''
|
||||
}
|
||||
20
src/assets/js/utils/validate.js
Normal file
@@ -0,0 +1,20 @@
|
||||
/**
|
||||
* Created by PanJiaChen on 16/11/18.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @param {string} path
|
||||
* @returns {Boolean}
|
||||
*/
|
||||
export function isExternal(path) {
|
||||
return /^(https?:|mailto:|tel:)/.test(path)
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {string} str
|
||||
* @returns {Boolean}
|
||||
*/
|
||||
export function validUsername(str) {
|
||||
const valid_map = ['admin', 'editor']
|
||||
return valid_map.indexOf(str.trim()) >= 0
|
||||
}
|
||||