提交 f102a05e authored 作者: songchuancai's avatar songchuancai

first commit

上级
# http://editorconfig.org
root = true
[*] # 表示所有文件适用
charset = utf-8 # 设置文件字符集为 utf-8
indent_style = space # 缩进风格(tab | space)
indent_size = 2 # 缩进大小
end_of_line = lf # 控制换行类型(lf | cr | crlf)
trim_trailing_whitespace = true # 去除行首的任意空白字符
insert_final_newline = true # 始终在文件末尾插入一个新行
[*.md] # 表示仅 md 文件适用以下规则
max_line_length = off
trim_trailing_whitespace = false
\ No newline at end of file
NODE_ENV=development
VUE_APP_BASE_API=https://pdms.apps.iytcloud.com
VUE_APP_PDMS_PATH=http://localhost:8081/
VUE_APP_CMSS_PATH=http://localhost:8082/
VUE_APP_CHILD_PATH3=http://localhost:8083/
VUE_APP_CHILD_PATH4=http://localhost:8084/
VUE_APP_CHILD_PATH5=http://localhost:8085/
VUE_APP_CHILD_PATH6=http://localhost:8086/
VUE_APP_COPYRIGHT= "版权所有© 2020 赛轮集团股份有限公司 鲁ICP备09064072号-19"
VUE_APP_ABOUT_US="https://www.sailuntyre.com/portal/about/index"
VUE_APP_JOIN_US= "http://zhaopin.sailuntire.com/"
VUE_APP_CONTAC_US= "https://www.sailuntyre.com/portal/index/cut?name=联系我们&fetch=about"
VUE_APP_SERVICE_TEL= "400-156-8277"
\ No newline at end of file
NODE_ENV=production
VUE_APP_BASE_API=127.0.0.1
VUE_APP_COMPANY_NAME=""
VUE_APP_COPYRIGHT=""
VUE_APP_ABOUT_US=""
VUE_APP_JOIN_US=""
VUE_APP_CONTAC_US=""
VUE_APP_SERVICE_TEL= ""
\ No newline at end of file
/node_modules
/dist
/package-lock.json
/yarn.lock
.DS_Store
fis-conf.js
/static
/conf
/README.md
/release
module.exports = {
root: true,
env: {
node: true
},
extends: ["plugin:vue/essential", "eslint:recommended", "plugin:prettier/recommended"],
parserOptions: {
parser: "@babel/eslint-parser"
},
rules: {
"no-cond-assign": 2, // 禁止条件表达式中出现模棱两可的赋值操作符
"no-console": 2, // 禁用console
"no-constant-condition": 2, // 禁止在条件中使用常量表达式
"no-debugger": 2, // 禁用 debugger
"no-dupe-args": 2, // 禁止 function 定义中出现重名参数
"no-dupe-keys": 2, // 禁止对象字面量中出现重复的 key
"no-duplicate-case": 2, // 禁止出现重复的 case 标签
"no-empty": 2, // 禁止出现空语句块
"no-ex-assign": 2, // 禁止对 catch 子句的参数重新赋值
"no-extra-boolean-cast": 2, // 禁止不必要的布尔转换
"no-extra-parens": 2, // 禁止不必要的括号
"no-extra-semi": 2, // 禁止不必要的分号
"no-func-assign": 2, // 禁止对 function 声明重新赋值
"no-inner-declarations": 2, // 禁止在嵌套的块中出现变量声明或 function 声明
"no-irregular-whitespace": 2, // 禁止在字符串和注释之外不规则的空白
"no-obj-calls": 2, // 禁止把全局对象作为函数调用
"no-sparse-arrays": 2, // 禁用稀疏数组
"no-prototype-builtins": 2, // 禁止直接使用Object.prototypes 的内置属性
"no-unexpected-multiline": 2, // 禁止出现令人困惑的多行表达式
"no-unreachable": 2, // 禁止在return、throw、continue 和 break语句之后出现不可达代码
"use-isnan": 2, // 要求使用 isNaN() 检查 NaN
"valid-typeof": 2, // 强制 typeof 表达式与有效的字符串进行比较
"array-callback-return": 2, // 强制数组方法的回调函数中有 return 语句
"block-scoped-var": 2, // 强制把变量的使用限制在其定义的作用域范围内
complexity: 2, // 指定程序中允许的最大环路复杂度
"consistent-return": 2, // 要求 return 语句要么总是指定返回的值,要么不指定
curly: 2, // 强制所有控制语句使用一致的括号风格
"default-case": 2, // 要求 switch 语句中有 default 分支
//"dot-location": 2, // 强制在点号之前和之后一致的换行
"dot-notation": 0, // 强制在任何允许的时候使用点号
eqeqeq: 2, // 要求使用 === 和 !==
//"guard-for-in": 2, // 要求 for-in 循环中有一个 if 语句
"no-alert": 2, // 禁用 alert、confirm 和 prompt
"no-case-declarations": 2, // 不允许在 case 子句中使用词法声明
//"no-else-return": 2, // 禁止 if 语句中有 return 之后有 else
"no-empty-function": 2, // 禁止出现空函数
"no-eq-null": 2, // 禁止在没有类型检查操作符的情况下与 null 进行比较
"no-eval": 2, // 禁用 eval()
"no-extra-bind": 2, // 禁止不必要的 .bind() 调用
"no-fallthrough": 2, // 禁止 case 语句落空
"no-floating-decimal": 2, // 禁止数字字面量中使用前导和末尾小数点
"no-implicit-coercion": 2, // 禁止使用短符号进行类型转换
"no-implicit-globals": 2, // 禁止在全局范围内使用 var 和命名的 function 声明
"no-invalid-this": 2, // 禁止 this 关键字出现在类和类对象之外
"no-lone-blocks": 2, // 禁用不必要的嵌套块
"no-loop-func": 2, // 禁止在循环中出现 function 声明和表达式
"no-multi-spaces": 2, // 禁止使用多个空格
"no-multi-str": 2, // 禁止使用多行字符串
"no-new": 2, // 禁止在非赋值或条件语句中使用 new 操作符
"no-new-func": 2, // 禁止对 Function 对象使用 new 操作符
"no-new-wrappers": 2, // 禁止对 String,Number 和 Boolean 使用 new 操作符
"no-param-reassign": 2, // 不允许对 function 的参数进行重新赋值
"no-redeclare": 2, // 禁止使用 var 多次声明同一变量
"no-return-assign": 2, // 禁止在 return 语句中使用赋值语句
"no-script-url": 2, // 禁止使用 javascript: url
"no-self-assign": 2, // 禁止自我赋值
"no-self-compare": 2, // 禁止自身比较
"no-sequences": 2, // 禁用逗号操作符
"no-unmodified-loop-condition": 2, // 禁用一成不变的循环条件
"no-unused-expressions": 2, // 禁止出现未使用过的表达式
"no-useless-call": 2, // 禁止不必要的 .call() 和 .apply()
"no-useless-concat": 2, // 禁止不必要的字符串字面量或模板字面量的连接
"vars-on-top": 2 // 要求所有的 var 声明出现在它们所在的作用域顶部
}
}
.DS_Store
node_modules
/dist
package-lock.json
# local env files
.env.local
.env.*.local
# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
# Editor directories and files
.idea
.vscode
.history
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
/dist/*
.local
.output.js
/node_modules/**
/package-lock.json
yarn.lock
paas-portal.yml
/static
/README.md
**/*.svg
**/*.png
**/*.jpg
**/*.sh
/public/*
/conf
module.exports = {
tabWidth: 2,
useTabs: true, // 使用tab(制表符)缩进而非空格
singleQuote: false, // 单引号
printWidth: 140, // 一行超过175个字符就换行
semi: false, // 是否在行尾加分号
trailingComma: "none", // 数组、对象最后一个元素的尾逗号
bracketSpacing: true, // 花括号前后空格
jsxBracketSameLine: false, // 使多行JSX元素最后一行末尾的 > 单独一行
arrowParens: "avoid", //只有一个参数的箭头函数的参数是否带圆括号(默认avoid不带)
htmlWhitespaceSensitivity: "ignore" // HTML 文件空格敏感度
}
FROM nginx
COPY conf/portal.conf /etc/nginx/conf.d/default.conf
COPY dist/ /usr/app/portal/dist/
RUN chmod 777 /var/cache -R && mkdir /var/cache/nginx/client_temp
CMD ["/bin/bash", "-c", "sed -i \"s@<html@<html data-promise-base-url=\"$API_BASE_URL\"@\" /usr/app/portal/dist/*.html;mkdir /var/cache/nginx/client_temp -p;nginx -g \"daemon off;\""]`
# cd ~/work/dev/front/portal;rm dist -rfv;npm run build
# docker build -t registry.notemap.net:5000/hip-paas/portal:0.1 .
### 项目介绍:
##### vue-cli 4.5.10
##### vue 2.6.14
##### element-ui 2.15.6(本项目基于element-ui库)
##### eslint 6.7.2
##### axios 0.21.1
##### sass 1.26.5 使用dart-sass
##### node 10.0以上
##### 项目启动:yarn install yarn serve 或者 npm install npm run serve 推荐使用yarn
### 目录结构:
##### public 静态文件夹:html,favicon
##### src 源码目录
##### static 静态文件目录:font(iconfont图标https://www.iconfont.cn/),reset(重置样式表)
##### .env.development 本地环境变量
​ VUE_APP_CHILD_PATH:平台管理
​ VUE_APP_CHILD_PATH2:容器管理
​ VUE_APP_CHILD_PATH3:DevOps
​ VUE_APP_CHILD_PATH4:交付中心
​ VUE_APP_CHILD_PATH5:微服务治理
​ VUE_APP_CHILD_PATH6:API网关
##### .env.production 线上环境变量
##### .gitignore git排除文件描述
##### babel.config.js babel语法编译
##### package.json 项目的配置信息
##### README.md 项目描述文件
##### vue.config.js webpack配置文件
##### yarn.lock yarn锁
### 源码目录详细介绍:
##### asssets 静态资源
​ image-------> 图片
​ styles-------> element-variables.scss:element-ui框架默认颜色覆盖;encapsulation.scss:对于css的封装
##### router 路由
​ index-------> 页面主体框架
##### store vuex目录
​ index-------> 暂时为空
##### utils 工具目录
​ request.js-------> axios封装
​ api
​ api.js
​ index.js 对于接口的二次封装
​ app.js 镜像部署环境变量文件
##### views 页面主体
###### Home.vue ------>主界面
###### login.vue
​ -------> 登录页面
###### 404.vue
​ -------> 404页面
module.exports = {
presets: ["@vue/cli-plugin-babel/preset"]
}
# hip portal nginx configuration file, you can include this file with
# "include" directive in nginx.conf file.
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
# 开启gzip
gzip on;
gzip_vary on;
gzip_min_length 1000;
gzip_comp_level 2;
gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/xml image/jpeg image/gif image/png application/javascript;
listen 9527;
index index.html;
location ~.*\.(jpg|png|gif|jpeg|bmp|css|js|woff|ttf|ico|html)?$ {
root /usr/app/portal/dist;
access_log off;
log_not_found off;
if (-f $request_filename) {
expires -1;
break;
}
}
location / {
root /usr/app/portal/dist;
try_files $uri /index.html;
}
location /api/v2/pdms/ {
proxy_pass http://pdms.hip-paas.svc:8080;
}
location /api/v2/cmss/ {
proxy_pass http://cmss.hip-paas.svc:8080;
}
location = /favicon.ico {
log_not_found off;
access_log off;
}
}
\ No newline at end of file
{
"compilerOptions": {
"baseUrl": "./",
"paths": {
"@/*": ["src/*"]
}
},
"exclude": ["node_modules", "dist"]
}
This source diff could not be displayed because it is too large. You can view the blob instead.
{
"name": "pass",
"version": "0.1.0",
"private": true,
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build --modern",
"lint": "vue-cli-service lint",
"clean-mac": "rm -rf node_modules",
"clean-win": "rmdir /s /q node_modules",
"install-all": "npm install --registry=https://registry.npm.taobao.org",
"release:all": "node ./release/all",
"release:devops": "node ./release/devops",
"release:platform": "node ./release/platform",
"release:portal": "node ./release/portal",
"prettier": "prettier --write ."
},
"dependencies": {
"axios": "^0.21.1",
"core-js": "^3.9.0",
"element-ui": "^2.15.6",
"js-cookie": "^2.2.1",
"vue": "2.6.14",
"vue-router": "^3.5.1"
},
"devDependencies": {
"@babel/core": "^7.12.16",
"@babel/eslint-parser": "^7.12.16",
"@vue/cli-plugin-babel": "~5.0.0",
"@vue/cli-plugin-eslint": "~5.0.0",
"@vue/cli-plugin-router": "~5.0.0",
"@vue/cli-plugin-vuex": "~5.0.0",
"@vue/cli-service": "~5.0.0",
"babel-eslint": "^10.1.0",
"cross-env": "^7.0.3",
"eslint": "^8.11.0",
"eslint-config-prettier": "^8.3.0",
"eslint-plugin-prettier": "^4.0.0",
"eslint-plugin-vue": "^8.0.3",
"prettier": "^2.5.1",
"sass": "^1.26.5",
"sass-loader": "^8.0.2",
"scp2": "^0.5.0",
"vue-template-compiler": "^2.6.14"
},
"browserslist": [
"> 1%",
"IE 11"
]
}
module.exports = {
plugins: {
autoprefixer: {}
}
}
/**
* @description 雪花屏代码,基于ant-design修改
**/
.first-loading-wrp {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
height: 90vh;
min-height: 90vh;
}
.first-loading-wrp > h1 {
font-size: 30px;
font-weight: bolder;
}
.first-loading-wrp .loading-wrp {
display: flex;
align-items: center;
justify-content: center;
padding: 98px;
}
.dot {
position: relative;
box-sizing: border-box;
display: inline-block;
width: 64px;
height: 64px;
font-size: 64px;
transform: rotate(45deg);
animation: antRotate 1.2s infinite linear;
}
.dot i {
position: absolute;
display: block;
width: 28px;
height: 28px;
background-color: #1890ff;
border-radius: 100%;
opacity: 0.3;
transform: scale(0.75);
transform-origin: 50% 50%;
animation: antSpinMove 1s infinite linear alternate;
}
.dot i:nth-child(1) {
top: 0;
left: 0;
}
.dot i:nth-child(2) {
top: 0;
right: 0;
-webkit-animation-delay: 0.4s;
animation-delay: 0.4s;
}
.dot i:nth-child(3) {
right: 0;
bottom: 0;
-webkit-animation-delay: 0.8s;
animation-delay: 0.8s;
}
.dot i:nth-child(4) {
bottom: 0;
left: 0;
-webkit-animation-delay: 1.2s;
animation-delay: 1.2s;
}
@keyframes antRotate {
to {
-webkit-transform: rotate(405deg);
transform: rotate(405deg);
}
}
@-webkit-keyframes antRotate {
to {
-webkit-transform: rotate(405deg);
transform: rotate(405deg);
}
}
@keyframes antSpinMove {
to {
opacity: 1;
}
}
@-webkit-keyframes antSpinMove {
to {
opacity: 1;
}
}
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon"
href="https://sailuns3.s3.cn-northwest-1.amazonaws.com.cn/public/themes/brand_zh/public/assets/img/favicon.ico">
<meta http-equiv="pragram" content="no-cache">
<link rel="stylesheet" href="<%= BASE_URL %>css/loading.css" />
<meta http-equiv="cache-control" content="no-cache, no-store, must-revalidate">
<title>橡链云</title>
</head>
<body>
<noscript>
<strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled.
Please enable it to continue.</strong>
</noscript>
<div id="app">
<div class="first-loading-wrp">
<div class="loading-wrp">
<span class="dot dot-spin">
<i></i>
<i></i>
<i></i>
<i></i>
</span>
</div>
<h1>
<%= VUE_APP_TITLE %>
</h1>
</div>
</div>
<!-- built files will be auto injected -->
</body>
</html>
\ No newline at end of file
const { Client } = require("ssh2")
const chalk = require("chalk")
const conn = new Client()
conn
.on("ready", () => {
conn.exec("cd /home/yanyalin/ \n./hip a", (err, stream) => {
if (err) {
console.log(chalk.red("发布失败.\n"))
throw err
} else {
stream
.on("close", (code, signal) => {
console.log(chalk.green("Success! 成功发布到测试服务器! \n"))
conn.end()
})
.on("data", data => {
console.log("STDOUT: " + data)
})
}
})
})
.connect({
host: "10.0.90.29",
port: 22,
username: "wangzhao",
password: "b7c7f4eb668185e7f2e33bf62b59ba3b"
})
const { Client } = require("ssh2")
const chalk = require("chalk")
const conn = new Client()
conn
.on("ready", () => {
conn.exec("cd /home/yanyalin/ \n./hip r devops", (err, stream) => {
if (err) {
console.log(chalk.red("发布失败.\n"))
throw err
} else {
stream
.on("close", (code, signal) => {
console.log(chalk.green("Success! 成功发布到测试服务器! \n"))
conn.end()
})
.on("data", data => {
console.log("STDOUT: " + data)
})
}
})
})
.connect({
host: "10.0.90.29",
port: 22,
username: "wangzhao",
password: "b7c7f4eb668185e7f2e33bf62b59ba3b"
})
const { Client } = require("ssh2")
const chalk = require("chalk")
const conn = new Client()
conn
.on("ready", () => {
conn.exec("cd /home/yanyalin/ \n./hip r platform", (err, stream) => {
if (err) {
console.log(chalk.red("发布失败.\n"))
throw err
} else {
stream
.on("close", (code, signal) => {
console.log(chalk.green("Success! 成功发布到测试服务器! \n"))
conn.end()
})
.on("data", data => {
console.log("STDOUT: " + data)
})
}
})
})
.connect({
host: "10.0.90.29",
port: 22,
username: "wangzhao",
password: "b7c7f4eb668185e7f2e33bf62b59ba3b"
})
const { Client } = require("ssh2")
const chalk = require("chalk")
const conn = new Client()
conn
.on("ready", () => {
conn.exec("cd /home/yanyalin/ \n./hip r portal", (err, stream) => {
if (err) {
console.log(chalk.red("发布失败.\n"))
throw err
} else {
stream
.on("close", (code, signal) => {
console.log(chalk.green("Success! 成功发布到测试服务器! \n"))
conn.end()
})
.on("data", data => {
console.log("STDOUT: " + data)
})
}
})
})
.connect({
host: "10.0.90.29",
port: 22,
username: "wangzhao",
password: "b7c7f4eb668185e7f2e33bf62b59ba3b"
})
<template>
<div id="app" v-cloak>
<router-view />
</div>
</template>
<style type="text/css">
#app {
height: 100%;
}
[v-cloak] {
display: none !important;
}
</style>
差异被折叠。
@import "encapsulation";
::selection {
color: #ffffff;
background-color: $primary-color;
}
/* 改变主题色变量 */
$--color-primary: $primary-color;
/* 改变 icon 字体路径变量,必需 */
$--font-path: "~element-ui/lib/theme-chalk/fonts";
@import "~element-ui/packages/theme-chalk/src/index";
$primary-color: #125fa3;
$primary-color-opt2: #125fa320;
$primary-color-opt8: #125fa380;
$transparent-color8: rgba(255, 255, 255, 0.8);
$transparent-color6: rgba(255, 255, 255, 0.6);
$transparent-color2: rgba(255, 255, 255, 0.4);
$Success: #67c23a;
$Warning: #e6a23c;
$Danger: #f56c6c;
$Info: #909399;
$themeColor: #409eff;
%text_overflow {
/*溢出添加省略号*/
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
%user_select_none {
/*文字无法选中*/
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
%title_info {
//文字信息
color: #1a7db6;
font-size: 12px;
background-color: #d9edf6;
border: 1px dashed #85d7fd;
padding: 10px 14px;
border-radius: 2px;
margin-bottom: 20px;
}
%reload {
//蓝色刷新按钮
cursor: pointer;
@extend %user_select_none;
color: #2db7f5;
margin-left: 10px;
}
%primary-click {
//主题色点击按钮样式
color: $primary-color;
cursor: pointer;
}
const setting = {
//标题 (包括初次加载雪花屏的标题 页面的标题 浏览器的标题)
title: "橡链云",
companyNmae: "赛轮集团股份有限公司", // 公司名称
copyright: "版权所有© 2020", // 版权时间
InternetContentProvider: "鲁ICP备09064072号-19", // 备案号
AboutUs: "https://www.sailuntyre.com/portal/about/index", // 关于我们链接
talentRecruitment: "http://zhaopin.sailuntire.com/", // 人才招聘链接
ContactUs: "https://www.sailuntyre.com/portal/index/cut?name=联系我们&fetch=about" // 联系我们链接
}
module.exports = setting
import Vue from "vue"
import App from "./App.vue"
import router from "./router"
import "../static/reset.css"
import "../static/font/iconfont.css"
import "./public/element"
Vue.config.productionTip = false
new Vue({
router,
render: h => h(App)
}).$mount("#app")
import Vue from "vue"
import "@/assets/styles/element-variables.scss"
import { Button, Form, FormItem, Row, Col, Progress, Carousel, CarouselItem, Message, Input } from "element-ui"
Vue.prototype.$ELEMENT = { size: "small" }
Input.props.autocomplete.default = "new-password"
Vue.use(Button)
Vue.use(Carousel)
Vue.use(CarouselItem)
Vue.use(Row)
Vue.use(Col)
Vue.use(Form)
Vue.use(FormItem)
Vue.use(Progress)
Vue.use(Input)
Vue.prototype.$message = Message
import Vue from "vue"
import VueRouter from "vue-router"
const Home = () => import("../views/Home.vue") //PASS首页
const login = () => import("../views/login.vue") //登录页面
const no_find = () => import("../views/404") //404页面
Vue.use(VueRouter)
const routes = [
{
path: "/",
name: "Home",
component: Home
},
{
path: "/replacement",
name: "replacement",
component: () => import("../views/replacement/replacement.vue")
},
{
path: "/login",
name: "login",
component: login
},
{
path: "*",
name: "no_find",
component: no_find
}
]
const router = new VueRouter({
mode: "history",
base: process.env.BASE_URL,
routes
})
export default router
import axios from "../request"
import { SVC_API_PDMS } from "../app"
//获取登录方式
export const getLoginType = () => {
return axios.get(`${SVC_API_PDMS}/api/v2/pdms/common/loginType`)
}
// 图片验证码
export const captchaImageReq = () => {
return axios.get(`${SVC_API_PDMS}/api/v2/pdms/captcha/captchaImage`)
}
//登录
export const postLogin = params => {
return axios.post(`${SVC_API_PDMS}/api/v2/pdms/common/login`, params)
}
// 验证验证码
export const VcaptchaImageReq = params => {
return axios.post(`${SVC_API_PDMS}/api/v2/pdms/captcha/captchaImage`, params)
}
import * as api from "./api"
export default api
let baseURL = {
VUE_APP_PDMS_PATH: "http://localhost:8081/",
VUE_APP_CMSS_PATH: "http://localhost:8082/",
VUE_APP_DEVOPS_PATH: "http://localhost:8084/",
SVC_API_PDMS: "",
SVC_API_CMSS: "",
DomainName: "localhost",
VUE_APP_COPYRIGHT: "版权所有 2020 赛轮集团股份有限公司 鲁ICP备09064072号-19", // 公司名称
VUE_APP_ABOUT_US: "https://www.sailuntyre.com/portal/about/index", // 关于我们链接
VUE_APP_JOIN_US: "http://zhaopin.sailuntire.com/", // 招聘链接
VUE_APP_CONTAC_US: "https://www.sailuntyre.com/portal/index/cut?name=联系我们&fetch=about", // 联系我们链接
VUE_APP_SERVICE_TEL: "400-888888", // 联系电话
VUE_APP_QR_CODE: "https://www.ecorubbercloud.com/image/QRCode.png", // 二维码链接
VUE_APP_IAAS_PATH: "" // iaas平台链接
}
if (process.env.NODE_ENV === "production" && document.querySelector("html").dataset.promiseBaseUrl) {
const arr = document.querySelector("html").dataset.promiseBaseUrl.split(";")
arr.forEach(item => {
const path = item.split("|")
baseURL[path[0]] = path[1]
})
}
//****************/
module.exports = baseURL
import Cookies from "js-cookie"
import baseURL from "./app"
let AccessToken = "vue_admin_template_token_"
const uid = "vue_admin_template_load_uid_"
const name = "vue_admin_template_name_"
let role = "vue_admin_template_role_"
let email = "vue_admin_template_email_"
//token
export function getToken() {
return Cookies.get(AccessToken)
}
export function setToken(data) {
return Cookies.set(AccessToken, data, {
path: "/",
domain: baseURL.DomainName
})
}
export function CreateTenant(data) {
return Cookies.set("isCreateTenant", data, {
path: "/",
domain: baseURL.DomainName
})
}
export function removeToken() {
return Cookies.remove(AccessToken, { path: "/", domain: baseURL.DomainName })
}
//uid
export function getUid() {
return Cookies.get(uid)
}
export function setUid(data) {
return Cookies.set(uid, data, { path: "/", domain: baseURL.DomainName })
}
export function removeUid() {
return Cookies.remove(uid, { path: "/", domain: baseURL.DomainName })
}
//name
export function getName() {
return Cookies.get(name)
}
export function setName(data) {
return Cookies.set(name, data, { path: "/", domain: baseURL.DomainName })
}
export function removeName() {
return Cookies.remove(name, { path: "/", domain: baseURL.DomainName })
}
//tenantId
export function getTenantId() {
return Cookies.get("tenantId")
}
export function setTenantId(data) {
return Cookies.set("tenantId", data, {
path: "/",
domain: baseURL.DomainName
})
}
export function removeTenantId() {
return Cookies.remove("tenantId", { path: "/", domain: baseURL.DomainName })
}
//role角色
export function getRole() {
return Cookies.get(role)
}
export function setRole(data) {
return Cookies.set(role, data, { path: "/", domain: baseURL.DomainName })
}
export function removeRole() {
return Cookies.remove(role, { path: "/", domain: baseURL.DomainName })
}
//email
export function getEmail() {
return Cookies.get(email)
}
export function setEmail(data) {
return Cookies.set(email, data, { path: "/", domain: baseURL.DomainName })
}
export function removeEmail() {
return Cookies.remove(email, { path: "/", domain: baseURL.DomainName })
}
import axios from "axios"
import baseURL from "../utils/app"
import { Message, Notification } from "element-ui"
axios.defaults.timeout = 10000
// axios.defaults.baseURL = baseURL.SVC_API_PDMS + "/api/v2";
import { getToken } from "../utils/auth"
//请求拦截器
axios.interceptors.request.use(
config => {
const token = getToken()
//配置token
if (token) {
config.headers["Authorization"] = token
}
return config
},
error => {
return Promise.reject(error)
}
)
//响应拦截器即异常处理
axios.interceptors.response.use(
response => {
// 根据后端接口code执行操作
if (response.data.code !== 200) {
Message.warning(response.data.message)
}
return response.data
},
error => {
if (error && error.response) {
switch (error.response.status) {
case 400:
Notification.error({
title: "通知",
message: "错误请求",
duration: 2000
})
break
case 401:
break
case 403:
Notification.error({
title: "通知",
message: "拒绝访问",
duration: 2000
})
break
case 404:
Notification.error({
title: "通知",
message: "请求错误,地址不存在",
duration: 2000
})
break
case 405:
Notification.error({
title: "通知",
message: "请求方法未允许",
duration: 2000
})
break
case 408:
Notification.error({
title: "通知",
message: "请求超时",
duration: 2000
})
break
case 500:
if (error.response.data.code === 1000 || error.response.data.code === 401) {
Notification.error({
title: "通知",
message: "无效token,请重新登录",
duration: 2000
})
setTimeout(() => {
window.location.href = baseURL.VUE_APP_PORTAL_PATH + "/login"
}, 1000)
} else {
Notification.error({
title: "通知",
message: "服务器端出错",
duration: 2000
})
}
break
case 501:
Notification.error({
title: "通知",
message: "网络未实现",
duration: 2000
})
break
case 502:
Notification.error({
title: "服务异常",
message: "服务重启中..."
})
break
case 503:
Notification.error({
title: "服务异常",
message: "服务重启中..."
})
break
case 504:
Notification.error({
title: "通知",
message: "网络超时",
duration: 2000
})
break
case 505:
Notification.error({
title: "通知",
message: "http版本不支持该请求",
duration: 2000
})
break
default:
Notification.error({
title: "通知",
message: `连接错误`,
duration: 2000
})
}
} else {
Notification.error({
title: "通知",
message: "连接到服务器失败",
duration: 2000
})
}
return Promise.resolve(error.response)
}
)
export default {
// get请求
get(url, params = {}, headers = {}) {
return new Promise((resolve, reject) => {
axios
.get(url, {
params,
headers
})
.then(
res => {
resolve(res)
},
err => {
reject(err)
}
)
})
},
// post请求
post(url, params = {}, headers = {}) {
console.log("debug log --> ", headers)
return new Promise((resolve, reject) => {
axios
.post(url, params, {
headers
})
.then(
res => {
resolve(res)
},
err => {
reject(err)
}
)
})
},
// put请求
put(url, params = {}, headers = {}) {
return new Promise((resolve, reject) => {
axios
.put(url, params, {
headers
})
.then(
response => {
resolve(response)
},
err => {
reject(err)
}
)
})
},
// patch请求
patch(url, params = {}, headers = {}) {
return new Promise((resolve, reject) => {
axios
.patch(url, params, {
headers
})
.then(
response => {
resolve(response)
},
err => {
reject(err)
}
)
})
},
// delete
delete(url, params = {}, headers = {}) {
return new Promise((resolve, reject) => {
axios
.delete(url, {
params,
headers
})
.then(
response => {
resolve(response)
},
err => {
reject(err)
}
)
})
},
// petch请求
petch(url, params = {}) {
return new Promise((resolve, reject) => {
axios.petch(url, params).then(
response => {
resolve(response)
},
err => {
reject(err)
}
)
})
},
//FormData请求
postFile(url, params = {}) {
return new Promise((resolve, reject) => {
let form = new FormData()
if (Object.keys(params).length > 0) {
for (const key in params) {
form.append(key, params[key])
}
}
axios
.post(url, form, {
headers: {
"Content-Type": "multipart/form-data"
}
})
.then(
res => {
resolve(res)
},
err => {
reject(err)
}
)
})
}
}
<template>
<div class="wscn-http404-container">
<div class="box">
<div class="left">
<img src="@/assets/image/default/Oval 1.png" alt="" />
<img src="@/assets/image/default/404.png" alt="" />
</div>
<div class="right">
<p>404</p>
<p>LOOKS LIKE YOU‘RE LOST</p>
<p>The page you are looking for not availblel</p>
<p @click="$router.push({ path: '/login' })">
GO TO HOME
<span></span>
</p>
</div>
</div>
</div>
</template>
<script>
export default {
name: "Page404"
}
</script>
<style lang="scss" scoped>
.wscn-http404-container {
height: 100%;
width: 100%;
overflow: hidden;
.box {
width: 800px;
height: 600px;
margin: 15% auto 0;
.left {
width: 280px;
height: 280px;
float: left;
position: relative;
img:nth-child(1) {
position: absolute;
top: 0;
left: 0;
width: 100%;
}
img:nth-child(2) {
position: absolute;
top: 16px;
left: 50px;
width: 84%;
}
}
.right {
float: left;
margin-left: 62px;
line-height: 1;
position: relative;
top: -4px;
p:nth-child(1) {
font-size: 140px;
color: #247dd3;
padding-bottom: 32px;
font-weight: bold;
}
p:nth-child(2) {
font-size: 20px;
font-weight: bold;
}
p:nth-child(3) {
font-size: 16px;
padding-top: 16px;
color: #999999;
}
p:nth-child(4) {
color: #247dd3;
font-size: 24px;
margin-top: 66px;
font-weight: bold;
float: left;
cursor: pointer;
span {
font-size: 30px;
padding-left: 10px;
}
}
}
}
}
</style>
差异被折叠。
<template>
<div id="login">
<div class="header">
<div class="header-img">
<img @click="goHome" src="@/assets/image/sailunLogo.png" alt="" />
<img src="../assets/image/loginsailun.png" class="bamnar" alt="" />
</div>
<!-- <div>产品与服务</div>
<div>项目案例</div> -->
<div>帮助文档</div>
</div>
<div class="login-content">
<div class="login-module">
<div class="title">橡链云统一登录</div>
<el-form :model="numberValidateForm" ref="numberValidateForm" label-width="80px" class="demo-ruleForm">
<el-form-item label="账号" prop="number" :rules="[{ required: true, message: '账号不能为空' }]">
<el-input v-model.trim="numberValidateForm.number" :spellcheck="false" autocomplete="off"></el-input>
</el-form-item>
<el-form-item label="密码" prop="pass" :rules="[{ required: true, message: '密码不能为空' }]">
<el-input
type="password"
v-model.trim="numberValidateForm.pass"
v-on:keyup.enter.native="submitForm('numberValidateForm')"
></el-input>
</el-form-item>
<el-form-item prop="code" :rules="[{ required: true, message: '请输入图片验证码' }]">
<div :style="{ display: 'flex', width: '200px', height: '42px', fontSize: '14px' }">
<el-input
placeholder="请输入验证码"
v-model.trim="numberValidateForm.code"
v-on:keyup.enter.native="submitForm('numberValidateForm')"
></el-input>
<img
style="cursor: pointer; width: 80px; height: 32px; margin-left: 10px"
@click="getCaptchaImage"
:src="`data:image/jpg;base64,${img}`"
alt=""
/>
</div>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="submitForm('numberValidateForm')" :loading="loading">登录</el-button>
</el-form-item>
</el-form>
</div>
</div>
<div class="custom-shape-divider-bottom">
<svg data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 120" preserveAspectRatio="none">
<path
d="M0,0V46.29c47.79,22.2,103.59,32.17,158,28,70.36-5.37,136.33-33.31,206.8-37.5C438.64,32.43,512.34,53.67,583,72.05c69.27,18,138.3,24.88,209.4,13.08,36.15-6,69.85-17.84,104.45-29.34C989.49,25,1113-14.29,1200,52.47V0Z"
opacity=".25"
class="shape-fill"
></path>
<path
d="M0,0V15.81C13,36.92,27.64,56.86,47.69,72.05,99.41,111.27,165,111,224.58,91.58c31.15-10.15,60.09-26.07,89.67-39.8,40.92-19,84.73-46,130.83-49.67,36.26-2.85,70.9,9.42,98.6,31.56,31.77,25.39,62.32,62,103.63,73,40.44,10.79,81.35-6.69,119.13-24.28s75.16-39,116.92-43.05c59.73-5.85,113.28,22.88,168.9,38.84,30.2,8.66,59,6.17,87.09-7.5,22.43-10.89,48-26.93,60.65-49.24V0Z"
opacity=".5"
class="shape-fill"
></path>
<path
d="M0,0V5.63C149.93,59,314.09,71.32,475.83,42.57c43-7.64,84.23-20.12,127.61-26.46,59-8.63,112.48,12.24,165.56,35.4C827.93,77.22,886,95.24,951.2,90c86.53-7,172.46-45.71,248.8-84.81V0Z"
class="shape-fill"
></path>
</svg>
</div>
</div>
</template>
<script>
import cookie from "js-cookie"
import { postLogin, captchaImageReq, VcaptchaImageReq } from "@/utils/api/api"
import { setUid, setToken, CreateTenant, setName, setRole, setEmail } from "@/utils/auth"
import baseURL from "@/utils/app"
export default {
name: "login",
data() {
return {
numberValidateForm: {
number: "",
pass: "",
code: ""
},
uuid: "",
img: null,
loading: false
}
},
created() {
sessionStorage.clear("replacement_token")
// this.getVerifyCode();
let cookies = cookie.get()
for (const key in cookies) {
cookie.remove(key, { path: "/", domain: baseURL.DomainName })
}
this.getCaptchaImage()
},
methods: {
getCaptchaImage() {
captchaImageReq()
.then(result => {
if (result.code === 200) {
this.img = result.data.image
this.uuid = result.data.uuid
}
})
.catch(err => {
console.log(err)
})
},
submitForm(formName) {
this.$refs[formName].validate(valid => {
if (valid) {
let data = {
uuid: this.uuid,
code: this.numberValidateForm.code
}
VcaptchaImageReq(data).then(result => {
if (result.code === 200 && result.data) {
this.login()
} else {
this.$message.warning(result.message)
this.getCaptchaImage()
this.numberValidateForm.code = ""
}
})
} else {
return false
}
})
},
resetForm(formName) {
this.$refs[formName].resetFields()
},
// 登录
login() {
let data = {
password: this.numberValidateForm.pass,
ssoCode: "",
userName: this.numberValidateForm.number
}
this.loading = true
postLogin(data)
.then(res => {
this.loading = false
if (res.code === 2004) {
sessionStorage.setItem("replacement_token", res.message)
this.$router.push({ name: "replacement" })
return
}
if (res.code !== 200) {
return
}
CreateTenant(res.data.isCreateTenant)
setUid(res.data.userInfo.uid)
setToken(res.data.jwtToken)
setName(res.data.userInfo.name)
setRole(res.data.userInfo.role)
setEmail(res.data.userInfo.email)
window.location.href = baseURL.VUE_APP_PDMS_PATH
})
.catch(() => {
this.loading = false
})
},
goHome() {
this.$router.push({ path: "/" })
}
// 获取验证码
// getVerifyCode() {
// getVerify().then((res) => {
// this.img=res;
// });
// },
}
}
</script>
<style scoped lang="scss">
@import "src/assets/styles/encapsulation";
#login {
width: 100%;
min-height: 800px;
height: 100%;
background: $primary-color;
background-size: cover;
position: relative;
padding-top: 0.02px;
.bamnar {
position: absolute;
top: 50%;
margin-top: 320px;
left: 100px;
width: 660px;
height: 320px !important;
}
.header {
display: flex;
height: 70px;
align-items: center;
position: absolute;
font-size: 14px;
background-color: rgba(0, 0, 0, 0);
width: 100%;
color: #fff;
.header-img img {
height: 40px;
}
div {
margin-left: 50px;
cursor: pointer;
}
}
.login-content {
align-items: center;
height: calc(100% - 70px);
padding-top: 220px;
.loginImage {
width: 500px;
margin-left: 30px;
}
.login-module {
padding: 30px;
padding-right: 50px;
width: 350px;
background-color: rgba(255, 255, 255, 0.55);
float: right;
border-radius: 5px;
display: flex;
box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.18);
padding-top: 120px;
position: relative;
margin-right: 100px;
.el-button--small {
width: 100%;
}
.el-form-item--small.el-form-item {
margin-bottom: 25px;
}
.title {
position: absolute;
top: 50px;
left: calc(50% - 60px);
font-size: 22px;
color: #fff;
font-weight: bold;
}
}
}
.custom-shape-divider-bottom {
position: absolute;
bottom: 0;
left: 0;
width: 100%;
overflow: hidden;
line-height: 0;
transform: rotate(180deg);
}
.custom-shape-divider-bottom svg {
position: relative;
display: block;
width: calc(100% + 1.3px);
height: 73px;
}
.custom-shape-divider-bottom .shape-fill {
fill: #ffffff21;
}
}
</style>
<template>
<div id="container">
<el-row>
<el-col :span="6" :offset="1">
<el-progress :percentage="onePercentage" :color="oneCustomColors" :format="oneFormat" :stroke-width="3"></el-progress>
</el-col>
<el-col :span="6" :offset="1">
<el-progress :percentage="twoPercentage" :color="twoCustomColors" :format="twoFormat" :stroke-width="3"></el-progress>
</el-col>
<el-col :span="6" :offset="1">
<el-progress :percentage="ThreePercentage" :color="ThreeCustomColors" :format="ThreeFormat" :stroke-width="3"></el-progress>
</el-col>
<el-col :span="2" :offset="1" style="line-height: 15px">
{{ content }}
</el-col>
</el-row>
</div>
</template>
<script>
export default {
name: "PasswordStrength",
model: {
event: "change",
prop: "password"
},
props: {
//密码
password: {
type: [String, Boolean, Number, Object],
required: true,
default: ""
}
},
watch: {
password(newValue) {
const mode = this.checkPasswordStrength(newValue)
//逻辑处理
switch (mode) {
//初始化状态
case 0:
this.content = ""
this.onePercentage = 0
this.twoPercentage = 0
this.ThreePercentage = 0
break
case 1:
this.content = "弱"
this.onePercentage = 100
this.twoPercentage = 0
this.ThreePercentage = 0
break
case 2:
this.content = "中"
this.onePercentage = 100
this.twoPercentage = 100
this.ThreePercentage = 0
break
case 3:
this.content = "中"
this.onePercentage = 100
this.twoPercentage = 100
this.ThreePercentage = 0
break
default:
this.content = "高"
this.onePercentage = 100
this.twoPercentage = 100
this.ThreePercentage = 100
break
}
}
},
data() {
return {
content: "",
onePercentage: 0,
twoPercentage: 0,
ThreePercentage: 0,
oneCustomColors: [{ color: "#f56c6c", percentage: 100 }],
twoCustomColors: [{ color: "#e6a23c", percentage: 100 }],
ThreeCustomColors: [{ color: "#67c23a", percentage: 100 }]
}
},
methods: {
oneFormat() {
return ""
},
twoFormat() {
return ""
},
ThreeFormat() {
return ""
},
//密码强度验证
checkPasswordStrength(value) {
let mode = 0
//正则表达式验证符合要求的
if (value.length < 1) return mode
if (/\d/.test(value)) mode++ //数字
if (/[a-z]/.test(value)) mode++ //小写
if (/[A-Z]/.test(value)) mode++ //大写
if (/\W/.test(value)) mode++ //特殊字符
return mode
}
}
}
</script>
<style>
.el-progress__text {
display: none;
}
.el-progress-bar {
padding-right: 0;
margin: 0;
}
</style>
import axios from "@/utils/request"
import baseURL from "@/utils/app"
// 更换密码
export const changePasswordReq = params => {
return axios.post(baseURL.SVC_API_PDMS + `/api/v2/pdms/user/changePassword`, params, {
Authorization: sessionStorage.getItem("replacement_token")
})
}
<template>
<div class="replacement">
<div class="content">
<div class="title">新账号重置密码</div>
<el-form :model="resetForm" :rules="resetFormRules" ref="resetForm" status-icon label-width="100px">
<el-form-item label="旧密码:" prop="oldPaasword">
<el-input clearable type="password" v-model="resetForm.oldPaasword" auto-complete="off"></el-input>
</el-form-item>
<el-form-item label="新密码:" prop="newPassword1">
<el-input clearable type="password" v-model="resetForm.newPassword1" auto-complete="off"></el-input>
<PasswordStrength v-model="resetForm.newPassword1" style="padding-top: 10px"></PasswordStrength>
</el-form-item>
<el-form-item label="确认密码:" prop="newPaasword2">
<el-input clearable type="password" v-model="resetForm.newPaasword2" auto-complete="off"></el-input>
</el-form-item>
<el-form-item>
<el-button style="width: 100%" type="primary" @click.native.prevent="toAmend">确认修改</el-button>
</el-form-item>
</el-form>
</div>
</div>
</template>
<script>
import PasswordStrength from "./PasswordStrength.vue"
import { changePasswordReq } from "./api"
export default {
components: { PasswordStrength },
data() {
var validatePass = (rule, value, callback) => {
if (!value) {
callback(new Error("请输入新密码"))
} else if (value.toString().length < 6 || value.toString().length > 18) {
callback(new Error("密码长度为6-18位"))
} else {
callback()
}
}
var validatePass2 = (rule, value, callback) => {
if (value === "") {
callback(new Error("请再次输入密码"))
} else if (value !== this.resetForm.newPassword1) {
callback(new Error("两次输入密码不一致!"))
} else {
callback()
}
}
return {
resetForm: {
//传给后台所需要的参数
newPaasword2: "",
oldPaasword: "",
newPassword1: ""
},
resetFormRules: {
oldPaasword: [
{
required: true,
message: "请输入旧密码",
trigger: ["blur", "change"]
}
],
newPassword1: [
{
required: true,
validator: validatePass,
trigger: ["blur", "change"]
}
],
newPaasword2: [
{
required: true,
validator: validatePass2,
trigger: ["blur", "change"]
}
]
}
}
},
methods: {
toAmend() {
this.$refs.resetForm.validate(valid => {
if (valid) {
changePasswordReq(this.resetForm).then(result => {
if (result.code === 200) {
this.$message.success("修改成功,3秒后跳转到登录页!")
setTimeout(() => {
this.logout() //调用跳转到登陆页的方法
}, 3000)
}
})
}
})
},
//这是修改成功后重新返回登陆页的方法,看个人需要自行调整
async logout() {
this.$router.push(`/login`)
}
}
}
</script>
<style lang="scss" scoped>
.replacement {
height: 100%;
padding-top: 100px;
.content {
margin: 0 auto;
width: 450px;
.title {
text-align: center;
font-family: "微软雅黑 Bold", "微软雅黑 Regular", "微软雅黑", sans-serif;
font-weight: 700;
font-size: 28px;
line-height: 100px;
}
}
}
</style>
/* Logo 字体 */
@font-face {
font-family: "iconfont logo";
src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834');
src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'),
url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'),
url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'),
url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg');
}
.logo {
font-family: "iconfont logo";
font-size: 160px;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
/* tabs */
.nav-tabs {
position: relative;
}
.nav-tabs .nav-more {
position: absolute;
right: 0;
bottom: 0;
height: 42px;
line-height: 42px;
color: #666;
}
#tabs {
border-bottom: 1px solid #eee;
}
#tabs li {
cursor: pointer;
width: 100px;
height: 40px;
line-height: 40px;
text-align: center;
font-size: 16px;
border-bottom: 2px solid transparent;
position: relative;
z-index: 1;
margin-bottom: -1px;
color: #666;
}
#tabs .active {
border-bottom-color: #f00;
color: #222;
}
.tab-container .content {
display: none;
}
/* 页面布局 */
.main {
padding: 30px 100px;
width: 960px;
margin: 0 auto;
}
.main .logo {
color: #333;
text-align: left;
margin-bottom: 30px;
line-height: 1;
height: 110px;
margin-top: -50px;
overflow: hidden;
*zoom: 1;
}
.main .logo a {
font-size: 160px;
color: #333;
}
.helps {
margin-top: 40px;
}
.helps pre {
padding: 20px;
margin: 10px 0;
border: solid 1px #e7e1cd;
background-color: #fffdef;
overflow: auto;
}
.icon_lists {
width: 100% !important;
overflow: hidden;
*zoom: 1;
}
.icon_lists li {
width: 100px;
margin-bottom: 10px;
margin-right: 20px;
text-align: center;
list-style: none !important;
cursor: default;
}
.icon_lists li .code-name {
line-height: 1.2;
}
.icon_lists .icon {
display: block;
height: 100px;
line-height: 100px;
font-size: 42px;
margin: 10px auto;
color: #333;
-webkit-transition: font-size 0.25s linear, width 0.25s linear;
-moz-transition: font-size 0.25s linear, width 0.25s linear;
transition: font-size 0.25s linear, width 0.25s linear;
}
.icon_lists .icon:hover {
font-size: 100px;
}
.icon_lists .svg-icon {
/* 通过设置 font-size 来改变图标大小 */
width: 1em;
/* 图标和文字相邻时,垂直对齐 */
vertical-align: -0.15em;
/* 通过设置 color 来改变 SVG 的颜色/fill */
fill: currentColor;
/* path 和 stroke 溢出 viewBox 部分在 IE 下会显示
normalize.css 中也包含这行 */
overflow: hidden;
}
.icon_lists li .name,
.icon_lists li .code-name {
color: #666;
}
/* markdown 样式 */
.markdown {
color: #666;
font-size: 14px;
line-height: 1.8;
}
.highlight {
line-height: 1.5;
}
.markdown img {
vertical-align: middle;
max-width: 100%;
}
.markdown h1 {
color: #404040;
font-weight: 500;
line-height: 40px;
margin-bottom: 24px;
}
.markdown h2,
.markdown h3,
.markdown h4,
.markdown h5,
.markdown h6 {
color: #404040;
margin: 1.6em 0 0.6em 0;
font-weight: 500;
clear: both;
}
.markdown h1 {
font-size: 28px;
}
.markdown h2 {
font-size: 22px;
}
.markdown h3 {
font-size: 16px;
}
.markdown h4 {
font-size: 14px;
}
.markdown h5 {
font-size: 12px;
}
.markdown h6 {
font-size: 12px;
}
.markdown hr {
height: 1px;
border: 0;
background: #e9e9e9;
margin: 16px 0;
clear: both;
}
.markdown p {
margin: 1em 0;
}
.markdown>p,
.markdown>blockquote,
.markdown>.highlight,
.markdown>ol,
.markdown>ul {
width: 80%;
}
.markdown ul>li {
list-style: circle;
}
.markdown>ul li,
.markdown blockquote ul>li {
margin-left: 20px;
padding-left: 4px;
}
.markdown>ul li p,
.markdown>ol li p {
margin: 0.6em 0;
}
.markdown ol>li {
list-style: decimal;
}
.markdown>ol li,
.markdown blockquote ol>li {
margin-left: 20px;
padding-left: 4px;
}
.markdown code {
margin: 0 3px;
padding: 0 5px;
background: #eee;
border-radius: 3px;
}
.markdown strong,
.markdown b {
font-weight: 600;
}
.markdown>table {
border-collapse: collapse;
border-spacing: 0px;
empty-cells: show;
border: 1px solid #e9e9e9;
width: 95%;
margin-bottom: 24px;
}
.markdown>table th {
white-space: nowrap;
color: #333;
font-weight: 600;
}
.markdown>table th,
.markdown>table td {
border: 1px solid #e9e9e9;
padding: 8px 16px;
text-align: left;
}
.markdown>table th {
background: #F7F7F7;
}
.markdown blockquote {
font-size: 90%;
color: #999;
border-left: 4px solid #e9e9e9;
padding-left: 0.8em;
margin: 1em 0;
}
.markdown blockquote p {
margin: 0;
}
.markdown .anchor {
opacity: 0;
transition: opacity 0.3s ease;
margin-left: 8px;
}
.markdown .waiting {
color: #ccc;
}
.markdown h1:hover .anchor,
.markdown h2:hover .anchor,
.markdown h3:hover .anchor,
.markdown h4:hover .anchor,
.markdown h5:hover .anchor,
.markdown h6:hover .anchor {
opacity: 1;
display: inline-block;
}
.markdown>br,
.markdown>p>br {
clear: both;
}
.hljs {
display: block;
background: white;
padding: 0.5em;
color: #333333;
overflow-x: auto;
}
.hljs-comment,
.hljs-meta {
color: #969896;
}
.hljs-string,
.hljs-variable,
.hljs-template-variable,
.hljs-strong,
.hljs-emphasis,
.hljs-quote {
color: #df5000;
}
.hljs-keyword,
.hljs-selector-tag,
.hljs-type {
color: #a71d5d;
}
.hljs-literal,
.hljs-symbol,
.hljs-bullet,
.hljs-attribute {
color: #0086b3;
}
.hljs-section,
.hljs-name {
color: #63a35c;
}
.hljs-tag {
color: #333333;
}
.hljs-title,
.hljs-attr,
.hljs-selector-id,
.hljs-selector-class,
.hljs-selector-attr,
.hljs-selector-pseudo {
color: #795da3;
}
.hljs-addition {
color: #55a532;
background-color: #eaffea;
}
.hljs-deletion {
color: #bd2c00;
background-color: #ffecec;
}
.hljs-link {
text-decoration: underline;
}
/* 代码高亮 */
/* PrismJS 1.15.0
https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */
/**
* prism.js default theme for JavaScript, CSS and HTML
* Based on dabblet (http://dabblet.com)
* @author Lea Verou
*/
code[class*="language-"],
pre[class*="language-"] {
color: black;
background: none;
text-shadow: 0 1px white;
font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
text-align: left;
white-space: pre;
word-spacing: normal;
word-break: normal;
word-wrap: normal;
line-height: 1.5;
-moz-tab-size: 4;
-o-tab-size: 4;
tab-size: 4;
-webkit-hyphens: none;
-moz-hyphens: none;
-ms-hyphens: none;
hyphens: none;
}
pre[class*="language-"]::-moz-selection,
pre[class*="language-"] ::-moz-selection,
code[class*="language-"]::-moz-selection,
code[class*="language-"] ::-moz-selection {
text-shadow: none;
background: #b3d4fc;
}
pre[class*="language-"]::selection,
pre[class*="language-"] ::selection,
code[class*="language-"]::selection,
code[class*="language-"] ::selection {
text-shadow: none;
background: #b3d4fc;
}
@media print {
code[class*="language-"],
pre[class*="language-"] {
text-shadow: none;
}
}
/* Code blocks */
pre[class*="language-"] {
padding: 1em;
margin: .5em 0;
overflow: auto;
}
:not(pre)>code[class*="language-"],
pre[class*="language-"] {
background: #f5f2f0;
}
/* Inline code */
:not(pre)>code[class*="language-"] {
padding: .1em;
border-radius: .3em;
white-space: normal;
}
.token.comment,
.token.prolog,
.token.doctype,
.token.cdata {
color: slategray;
}
.token.punctuation {
color: #999;
}
.namespace {
opacity: .7;
}
.token.property,
.token.tag,
.token.boolean,
.token.number,
.token.constant,
.token.symbol,
.token.deleted {
color: #905;
}
.token.selector,
.token.attr-name,
.token.string,
.token.char,
.token.builtin,
.token.inserted {
color: #690;
}
.token.operator,
.token.entity,
.token.url,
.language-css .token.string,
.style .token.string {
color: #9a6e3a;
background: hsla(0, 0%, 100%, .5);
}
.token.atrule,
.token.attr-value,
.token.keyword {
color: #07a;
}
.token.function,
.token.class-name {
color: #DD4A68;
}
.token.regex,
.token.important,
.token.variable {
color: #e90;
}
.token.important,
.token.bold {
font-weight: bold;
}
.token.italic {
font-style: italic;
}
.token.entity {
cursor: help;
}
This source diff could not be displayed because it is too large. You can view the blob instead.
@font-face {
font-family: "iconfont"; /* Project id 2314246 */
src: url('iconfont.woff2?t=1632623232474') format('woff2'),
url('iconfont.woff?t=1632623232474') format('woff'),
url('iconfont.ttf?t=1632623232474') format('truetype');
}
.iconfont {
font-family: "iconfont" !important;
font-size: 16px;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.icon-quan:before {
content: "\e743";
}
.icon-templateId-26:before {
content: "\e7a6";
}
.icon-templateId-25:before {
content: "\e67f";
}
.icon-templateId-24:before {
content: "\e67d";
}
.icon-volume-bind:before {
content: "\e676";
}
.icon-collected:before {
content: "\f1db";
}
.icon-collect:before {
content: "\e679";
}
.icon-app-3:before {
content: "\e664";
}
.icon-app-2:before {
content: "\e673";
}
.icon-app-4:before {
content: "\e674";
}
.icon-app-6:before {
content: "\e675";
}
.icon-app-8:before {
content: "\e677";
}
.icon-gaojingguanli:before {
content: "\e65a";
}
.icon-nodata:before {
content: "\e66c";
}
.icon-zanwushuju3:before {
content: "\e66d";
}
.icon-right:before {
content: "\e69d";
}
.icon-parallel:before {
content: "\e65f";
}
.icon-serial:before {
content: "\e660";
}
.icon-add-stage:before {
content: "\e661";
}
.icon-arrow-right:before {
content: "\e663";
}
.icon-2em:before {
content: "\e649";
}
.icon-git:before {
content: "\e657";
}
.icon-gogs:before {
content: "\e658";
}
.icon-gitlab:before {
content: "\e659";
}
.icon-SVN:before {
content: "\e65d";
}
.icon-gogs1:before {
content: "\e65e";
}
.icon-gitlab-fill1:before {
content: "\e76c";
}
.icon-templateId-2:before {
content: "\e654";
}
.icon-templateId-10:before {
content: "\e655";
}
.icon-templateId-7:before {
content: "\e653";
}
.icon-templateId-12:before {
content: "\e651";
}
.icon-templateId-6:before {
content: "\e652";
}
.icon-templateId-1:before {
content: "\e644";
}
.icon-templateId-15:before {
content: "\e646";
}
.icon-python1:before {
content: "\e9aa";
}
.icon-templateId-14:before {
content: "\e647";
}
.icon-templateId-16:before {
content: "\e64f";
}
.icon-app-1:before {
content: "\f1da";
}
.icon-templateId-4:before {
content: "\f1d9";
}
.icon-templateId-13:before {
content: "\e63a";
}
.icon-templateId-17:before {
content: "\e63d";
}
.icon-templateId-18:before {
content: "\e63e";
}
.icon-templateId-8:before {
content: "\e678";
}
.icon-templateId-11:before {
content: "\e671";
}
.icon-templateId-23:before {
content: "\e64e";
}
.icon-templateId-5:before {
content: "\e69e";
}
.icon-templateId-211:before {
content: "\e703";
}
.icon-Python1:before {
content: "\e640";
}
.icon-templateId-9:before {
content: "\e641";
}
.icon-zidingyipeizhi:before {
content: "\e642";
}
.icon-templateId-20:before {
content: "\e6b2";
}
.icon-templateId-19:before {
content: "\e643";
}
.icon-templateId-3:before {
content: "\e6b5";
}
.icon-ceshiguanli:before {
content: "\e634";
}
.icon-jiaofuguanli:before {
content: "\e635";
}
.icon-banben:before {
content: "\e636";
}
.icon-xuqiuguanli:before {
content: "\e71e";
}
.icon-yanfa:before {
content: "\e638";
}
.icon-jicheng:before {
content: "\e648";
}
.icon-ziyuan439:before {
content: "\e68c";
}
.icon-instance:before {
content: "\e62d";
}
.icon-anquan:before {
content: "\e62e";
}
.icon-Group-:before {
content: "\e6a2";
}
.icon-jichuxinxi:before {
content: "\e62f";
}
.icon-shezhi:before {
content: "\e631";
}
.icon-version:before {
content: "\e633";
}
.icon-ffanhui-:before {
content: "\e6b1";
}
.icon-shangdian:before {
content: "\e67c";
}
.icon-moban:before {
content: "\e62c";
}
.icon-fuwu:before {
content: "\e694";
}
.icon-jiankong1:before {
content: "\e7bd";
}
.icon-shenji:before {
content: "\e629";
}
.icon-gaojing:before {
content: "\e62a";
}
.icon-record:before {
content: "\e69b";
}
.icon-rizhi:before {
content: "\e62b";
}
.icon-zhanghu2:before {
content: "\e668";
}
.icon-application:before {
content: "\e88a";
}
.icon-feiyong:before {
content: "\e672";
}
.icon-yunwei:before {
content: "\e64b";
}
.icon-pingtai1:before {
content: "\e752";
}
.icon-shouquan:before {
content: "\e66f";
}
.icon-guanli:before {
content: "\e625";
}
.icon-peie:before {
content: "\e626";
}
.icon-guanli1:before {
content: "\e627";
}
.icon-shenpi:before {
content: "\e686";
}
.icon-_xiangmushenpi:before {
content: "\e622";
}
.icon-ziyuan1:before {
content: "\ef0c";
}
.icon-shenqing1:before {
content: "\e692";
}
.icon-jiqun:before {
content: "\e67b";
}
.icon-yingyongguanli:before {
content: "\e767";
}
.icon-gongzuofuzai:before {
content: "\e61b";
}
.icon-wangluoguanli:before {
content: "\e65c";
}
.icon-gailan1:before {
content: "\e61c";
}
.icon-cunchuguanli:before {
content: "\e6df";
}
.icon-16pxruanjian:before {
content: "\e65b";
}
.icon-weifuwu:before {
content: "\e670";
}
.icon-yunziyuan:before {
content: "\e805";
}
.icon-OCP:before {
content: "\e618";
}
.icon-zuhu:before {
content: "\e60a";
}
.icon-API:before {
content: "\e619";
}
.icon-CI-CD:before {
content: "\e61a";
}
.icon-pingtai:before {
content: "\e7e8";
}
.icon-xitong2:before {
content: "\e84f";
}
.icon-wangguan:before {
content: "\e621";
}
.icon-jiaofu:before {
content: "\ef5d";
}
.icon-shujuku:before {
content: "\e71a";
}
.icon-jiankong:before {
content: "\e700";
}
.icon-rongqi:before {
content: "\e60b";
}
.icon-liushuixian1:before {
content: "\e67a";
}
.icon-fuwuqi1:before {
content: "\e6a4";
}
.icon-APIceshi:before {
content: "\e66b";
}
.icon-fangda:before {
content: "\e685";
}
.icon-tool:before {
content: "\e64d";
}
.icon-daoru:before {
content: "\e623";
}
.icon-baocun:before {
content: "\e64a";
}
.icon-fangda1:before {
content: "\e6a7";
}
.icon-yunfuwuqi:before {
content: "\e620";
}
.icon-cunchu-copy:before {
content: "\e605";
}
.icon-luyouqi:before {
content: "\e66e";
}
.icon-yan:before {
content: "\e63f";
}
.icon-zhengque:before {
content: "\e617";
}
.icon-gerenLDAP:before {
content: "\e616";
}
.icon-duowenjianjia:before {
content: "\e615";
}
.icon-changjiantou:before {
content: "\e645";
}
.icon-chengyuan:before {
content: "\e6f7";
}
.icon-image:before {
content: "\e604";
}
.icon-kaishi:before {
content: "\e609";
}
.icon-zantingtingzhi:before {
content: "\e64c";
}
.icon-yindao:before {
content: "\e60f";
}
.icon-gearmore-full:before {
content: "\e978";
}
.icon-fuwuqi:before {
content: "\e602";
}
.icon-biaoqian:before {
content: "\e603";
}
.icon-yun:before {
content: "\e60c";
}
.icon-T:before {
content: "\e662";
}
.icon-duiyingguanxi:before {
content: "\e613";
}
.icon-shanchu:before {
content: "\e614";
}
.icon-xiangxia1:before {
content: "\e684";
}
.icon-shuqian:before {
content: "\e637";
}
.icon-shixinyuan:before {
content: "\e669";
}
.icon-shengpi:before {
content: "\e63c";
}
.icon-bingzhuangtu:before {
content: "\e656";
}
.icon-shenqing:before {
content: "\e666";
}
.icon-xiangmu:before {
content: "\e628";
}
.icon-mubiaoguanxitu:before {
content: "\e650";
}
.icon-quanxian:before {
content: "\e68e";
}
.icon-renyuan:before {
content: "\e7e6";
}
.icon-renyuan-05:before {
content: "\e630";
}
.icon-shangxiayidongjiantou:before {
content: "\e66a";
}
.icon-xiangxia:before {
content: "\e741";
}
.icon-jia:before {
content: "\e61d";
}
.icon-zengjia:before {
content: "\e77e";
}
.icon-checkbox-minus:before {
content: "\ea6d";
}
.icon-checkbox-plus:before {
content: "\ea6e";
}
.icon-dianji:before {
content: "\e601";
}
.icon-biao:before {
content: "\e608";
}
.icon-rili:before {
content: "\e742";
}
.icon-gantanhao1:before {
content: "\e607";
}
.icon-jilu:before {
content: "\e624";
}
.icon-84:before {
content: "\e67e";
}
.icon-code-branch:before {
content: "\e993";
}
.icon-dian:before {
content: "\e6d3";
}
.icon-iconfontxiaogantanhao:before {
content: "\e60d";
}
.icon-gantanhao:before {
content: "\e60e";
}
.icon-wenhao:before {
content: "\e665";
}
.icon-wenhao-tianchong:before {
content: "\e639";
}
.icon-tuichu:before {
content: "\e606";
}
.icon-bianji:before {
content: "\e63b";
}
.icon-gitlab-fill:before {
content: "\e761";
}
.icon-map-finger:before {
content: "\ea04";
}
.icon-zhihang:before {
content: "\e667";
}
.icon-huancun:before {
content: "\e6a6";
}
.icon-wenjian:before {
content: "\e69c";
}
.icon-gailan:before {
content: "\e61f";
}
.icon-cangku:before {
content: "\e612";
}
.icon-liushuixian:before {
content: "\e611";
}
.icon-lingdang:before {
content: "\e600";
}
.icon-cedaohang-gongdan:before {
content: "\e710";
}
.icon-fangzi:before {
content: "\e61e";
}
.icon-jiesuo:before {
content: "\e632";
}
.icon-ziyuan:before {
content: "\e610";
}
This source diff could not be displayed because it is too large. You can view the blob instead.
差异被折叠。
@charset "utf-8";
html,
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, Helvetica, STHeiti, SimSun, sans-serif;
font-size: 12px;
line-height: 1.5;
color: rgba(0, 0, 0, 0.65);
width: 100%;
height: 100%;
}
html,
body,
div,
span,
applet,
object,
iframe,
h1,
h2,
h3,
h4,
h5,
h6,
p,
blockquote,
pre,
a,
abbr,
acronym,
address,
big,
cite,
code,
del,
dfn,
em,
img,
ins,
kbd,
q,
s,
samp,
small,
strike,
strong,
sub,
sup,
tt,
var,
b,
u,
i,
center,
dl,
dt,
dd,
ol,
ul,
li,
fieldset,
form,
label,
legend,
table,
caption,
tbody,
tfoot,
thead,
tr,
th,
td,
article,
aside,
canvas,
details,
embed,
figure,
figcaption,
footer,
header,
hgroup,
menu,
nav,
output,
ruby,
section,
summary,
time,
mark,
audio,
video {
margin: 0;
padding: 0;
border: 0;
vertical-align: baseline;
}
article,
aside,
details,
figcaption,
figure,
footer,
header,
hgroup,
menu,
nav,
section {
display: block
}
ol,
ul {
list-style: none
}
blockquote,
q {
quotes: none
}
blockquote:before,
blockquote:after,
q:before,
q:after {
content: ''
}
table {
border-collapse: collapse;
border-spacing: 0
}
.clearfix::after {
display: block;
content: " ";
clear: both
}
#app {
min-width: 1350px
}
*,
:after,
:before {
box-sizing: border-box
}
button,
input {
border: 0;
background: 0;
outline: 0;
padding: 0;
margin: 0
}
button {
cursor: pointer
}
::-webkit-scrollbar {
width: 6px;
height: 6px
}
::-webkit-scrollbar-track {
background: #cdcdcd;
border-radius: 6px
}
::-webkit-scrollbar-thumb {
background: #8e8e8e;
border-radius: 5px
}
::-webkit-scrollbar-thumb:hover {
background: #898787
}
a {
margin: 0;
padding: 0;
font-size: 100%;
vertical-align: baseline;
background: transparent
}
pre {
white-space: pre;
white-space: pre-wrap;
white-space: pre-line;
word-wrap: break-word
}
input[type="radio"] {
vertical-align: text-bottom
}
input[type="checkbox"] {
vertical-align: bottom
}
.ie7 input[type="checkbox"] {
vertical-align: baseline
}
.ie6 input {
vertical-align: text-bottom
}
select,
input,
textarea {
font: 99% sans-serif
}
table {
font-size: inherit;
font: 100%
}
small {
font-size: 85%
}
strong {
font-weight: bold
}
td,
td img {
vertical-align: top
}
sub,
sup {
font-size: 75%;
line-height: 0;
position: relative
}
sup {
top: -0.5em
}
sub {
bottom: -0.25em
}
pre,
code,
kbd,
samp {
font-family: monospace, sans-serif
}
.clickable,
label,
input[type="button"],
input[type="submit"],
input[type="file"],
button {
cursor: pointer
}
button,
input,
select,
textarea {
margin: 0
}
button,
input[type="button"] {
width: auto;
overflow: visible
}
.ie7 img {
-ms-interpolation-mode: bicubic
}
\ No newline at end of file
const { defineConfig } = require("@vue/cli-service")
const Version = new Date().getTime()
const { title } = require("./src/config")
process.env.VUE_APP_TITLE = title || "快益通"
// 是否为生产环境
const isProduction = process.env.NODE_ENV !== "development"
module.exports = defineConfig({
transpileDependencies: false,
lintOnSave: !isProduction, // eslint设置
productionSourceMap: false, // 生产环境下css 分离文件
devServer: {
port: 8080,
proxy: {
"/api/v2/pdms": {
target: process.env.VUE_APP_BASE_API,
ws: true,
changeOrigin: true,
secure: false,
headers: {
Referer: process.env.VUE_APP_BASE_API
}
}
}
},
css: {
// 是否使用css分离插件 ExtractTextPlugin
extract: {
// 修改打包后css文件名
filename: `static/css/[name].${Version}.css`,
chunkFilename: `static/css/[name].${Version}.css`
}
},
configureWebpack: {
output: {
filename: `static/js/[name].${Version}.js`,
chunkFilename: `static/js/[name].${Version}.js`
}
}
/*chainWebpack(config) {
// img的文件名修改
config.module
.rule("images")
.use("url-loader")
.tap(options => {
options.name = `static/img/[name].${Version}.[ext]`
options.fallback = {
loader: "file-loader",
options: {
name: `static/img/[name].${Version}.[ext]`
}
}
return options
})
}*/
})
This source diff could not be displayed because it is too large. You can view the blob instead.
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论