提交 b1eab78e 编写于 作者: chengxiang.li's avatar chengxiang.li

init project

上级 fa166670
流水线 #55276 已失败 于阶段
{
"presets": [
["es2015", { "modules": false }],
"stage-2"
],
"plugins": ["transform-runtime"],
"comments": false,
"env": {
"test": {
"plugins": [ "istanbul" ]
}
}
}
root = true
[*]
charset = utf-8
indent_style = space
indent_size = 4
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
/build/
/config/
/dist/
/*.js
/test/unit/coverage/
// https://eslint.org/docs/user-guide/configuring
module.exports = {
root: true,
parserOptions: {
parser: 'babel-eslint'
},
env: {
browser: true,
},
extends: [
// https://github.com/vuejs/eslint-plugin-vue#priority-a-essential-error-prevention
// consider switching to `plugin:vue/strongly-recommended` or `plugin:vue/recommended` for stricter rules.
'plugin:vue/essential',
// https://github.com/standard/standard/blob/master/docs/RULES-en.md
'standard'
],
// required to lint *.vue files
plugins: [
'vue'
],
// add your custom rules here
rules: {
// allow async-await
'generator-star-spacing': 'off',
// allow debugger during development
'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off'
}
}
node_modules
/dist
\ No newline at end of file
// https://github.com/michael-ciniawsky/postcss-load-config
module.exports = {
"plugins": {
"postcss-import": {},
"postcss-url": {},
// to edit target browsers: use "browserslist" field in package.json
"autoprefixer": {}
}
}
<?xml version="1.0" encoding="UTF-8"?>
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
<component name="FacetManager">
<facet type="web" name="Web">
<configuration>
<descriptors>
<deploymentDescriptor name="web.xml" url="file://$MODULE_DIR$/src/main/webapp/WEB-INF/web.xml" />
</descriptors>
<webroots>
<root url="file://$MODULE_DIR$/src/main/webapp" relative="/" />
</webroots>
</configuration>
</facet>
</component>
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_5">
<output url="file://$MODULE_DIR$/target/classes" />
<output-test url="file://$MODULE_DIR$/target/test-classes" />
<content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/target" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" scope="TEST" name="Maven: junit:junit:3.8.1" level="project" />
</component>
</module>
\ No newline at end of file
# manage-system #
The web management system solution based on Vue2 and Element-UI。[live demo](http://blog.gdfengshuo.com/example/work/)
## Preface ##
The scheme as a set of multi-function background frame templates, suitable for most of the WEB management system development. Convenient development fast simple good components based on Vue2 and Element-UI. Color separation of color style, support manual switch themes, and it is convenient to use a custom theme color.
## Function ##
- [x] Element-UI
- [x] Login/Logout
- [x] Table
- [x] From
- [x] Chart :bar_chart:
- [x] Editor
- [x] Markdown
- [x] Upload pictures by clipping or dragging
- [x] Support manual switch themes :sparkles:
- [x] List drag sort
## Directory structure ##
|-- build // Webpack configuration file
|-- config // Project package path
|-- src // Source directory
| |-- components // Components
| |-- common // Common component
| |-- Header.vue // Header component
| |-- Home.vue // Home component
| |-- Sidebar.vue // Sidebar component
| |-- page // Router page
| |-- BaseCharts.vue // BaseCharts
| |-- BaseForm.vue // BaseForm
| |-- BaseTable.vue // BaseTable
| |-- Login.vue // Login
| |-- Markdown.vue // Markdown
| |-- MixCharts.vue // MixCharts
| |-- Readme.vue // Readme
| |-- Upload.vue // Upload
| |-- VueEditor.vue // VueEditor
| |-- VueTable.vue // VueTable
| |-- App.vue // Main component
| |-- main.js // Entry file
|-- .babelrc // ES6 syntax compiler configuration
|-- .editorconfig // Code specification
|-- .gitignore // Ignored file
|-- index.html // Entry HTML file
|-- package.json // Dependent configuration file
|-- README.md // Readme
## Installation steps ##
git clone https://github.com/lin-xin/manage-system.git // Clone templates
cd manage-system // Enter template directory
npm install // Installation dependency
## Local development ##
// Open server and access http://localhost:8080 in browser
npm run dev
## Constructing production ##
// Constructing project
npm run build
## Component description and presentation ##
### element-ui ###
A desktop component library based on vue.js2.0 . Github : [element](http://element.eleme.io/#/zh-CN/component/layout)
### vue-datasource ###
A Vue.js server side component to create dynamic tables. Github : [vue-datasource](https://github.com/coderdiaz/vue-datasource)
```JavaScript
<template>
<div>
<datasource language="en" :table-data="information.data"
:columns="columns"
:pagination="information.pagination"
:actions="actions"
v-on:change="changePage"
v-on:searching="onSearch"></datasource>
</div>
</template>
<script>
import Datasource from 'vue-datasource'; // import Datasource component
export default {
data: function(){
return {
information: {
pagination: {...}, // pagination config
data: [...]
},
columns: [...], // col config
actions: [...] // function config
}
},
components: {
Datasource
},
methods: {
changePage(values) {...},
onSearch(searchQuery) {...}
}
}
</script>
```
### Vue-Quill-Editor ###
Quill editor component for Vue2. Github : [vue-quill-editor](https://github.com/surmon-china/vue-quill-editor)
```JavaScript
<template>
<div>
<quill-editor ref="myTextEditor" v-model="content" :config="editorOption"></quill-editor>
</div>
</template>
<script>
import { quillEditor } from 'vue-quill-editor'; // import quillEditor component
export default {
data: function(){
return {
content: '',
editorOption: {
// something config
}
}
},
components: {
quillEditor
}
}
</script>
```
### Vue-SimpleMDE ###
Markdown Editor component for Vue.js. Github : [Vue-SimpleMDE](https://github.com/F-loat/vue-simplemde)
```JavaScript
<template>
<div>
<markdown-editor v-model="content" :configs="configs" ref="markdownEditor"></markdown-editor>
</div>
</template>
<script>
import { markdownEditor } from 'vue-simplemde';
export default {
data: function(){
return {
content:'',
configs: {
status: false,
initialValue: 'Hello BBK',
renderingConfig: {
codeSyntaxHighlighting: true,
highlightingTheme: 'atom-one-light'
}
}
}
},
components: {
markdownEditor
}
}
</script>
```
### Vue-Core-Image-Upload ###
a vue plugin for image upload and crop. Github : [Vue-Core-Image-Upload](https://github.com/Vanthink-UED/vue-core-image-upload)
```JavaScript
<template>
<div>
<img :src="src">
<vue-core-image-upload :class="['pure-button','pure-button-primary','js-btn-crop']"
:crop="true"
text="上传图片"
url=""
extensions="png,gif,jpeg,jpg"
@:imageuploaded="imageuploaded">
</vue-core-image-upload>
</div>
</template>
<script>
import VueCoreImageUpload from 'vue-core-image-upload';
export default {
data: function(){
return {
src:'../img/1.jpg'
}
},
components: {
VueCoreImageUpload
},
methods:{
imageuploaded(res) {
console.log(res)
}
}
}
</script>
```
### vue-schart ###
Vue.js wrapper for sChart.js. Github : [vue-schart](https://github.com/linxin/vue-schart)
```JavaScript
<template>
<div>
<schart :canvasId="canvasId"
:type="type"
:width="width"
:height="height"
:data="data"
:options="options"
></schart>
</div>
</template>
<script>
import Schart from 'vue-schart';
export default {
data: function(){
return {
canvasId: 'myCanvas',
type: 'bar',
width: 500,
height: 400,
data: [
{name: '2014', value: 1342},
{name: '2015', value: 2123},
{name: '2016', value: 1654},
{name: '2017', value: 1795},
],
options: {
title: 'Total sales of stores in recent years'
}
}
},
components: {
Schart
}
}
</script>
```
## Notice ##
### 一、If I don't want to use some components, how can I delete it? ###
For example, I don't want to use the vue-datasource component, I need to take four steps.
The first step to remove the component of the routing. Enter 'src/router/index.js' and delete the code below.
```JavaScript
{
path: '/vuetable',
component: resolve => require(['../components/page/VueTable.vue'], resolve)
},
```
Second,delete the component files. Enter 'src/components/page/' and delete 'VueTable.vue' file.
The third step is to delete the entry. Enter 'src/components/common/Sidebar.vue' and delete the code below.
```HTML
<el-menu-item index="vuetable">Vue表格组件</el-menu-item>
```
Finally, uninstall this component.
npm un vue-datasource -S
Complete!
### 二、How to switch themes? ###
The first step to enter 'src/main.js' and change into green theme.
```javascript
import 'element-ui/lib/theme-default/index.css'; // default theme
// import '../static/css/theme-green/index.css'; // green theme
```
The second step to enter 'src/App.vue' and change into green theme.
```javascript
@import "../static/css/main.css";
@import "../static/css/color-dark.css"; /*深色主题*/
/*@import "../static/css/theme-green/color-green.css"; !*浅绿色主题*!*/
```
Finally,enter 'src/components/common/Sidebar.vue' and find el-menu Tags,delete 'theme="dark"'。
## Screenshot ##
### Default theme ###
![Image text](https://github.com/lin-xin/manage-system/raw/master/screenshots/wms1.png)
### Green theme ###
![Image text](https://github.com/lin-xin/manage-system/raw/master/screenshots/wms2.png)
\ No newline at end of file
# manage-system #
基于Vue.js 2.x系列 + Element UI 的后台管理系统解决方案。[线上地址](http://blog.gdfengshuo.com/example/work/)
[English document](https://github.com/lin-xin/manage-system/blob/master/README_EN.md)
## 捐赠
![微信扫一扫](http://blog.gdfengshuo.com/images/weixin.jpg)
## 前言 ##
之前在公司用了Vue + Element组件库做了个后台管理系统,基本很多组件可以直接引用组件库的,但是也有一些需求无法满足。像图片裁剪上传、富文本编辑器、图表等这些在后台管理系统中很常见的功能,就需要引用其他的组件才能完成。从寻找组件,到使用组件的过程中,遇到了很多问题,也积累了宝贵的经验。所以我就把开发这个后台管理系统的经验,总结成这个后台管理系统解决方案。
该方案作为一套多功能的后台框架模板,适用于绝大部分的后台管理系统(Web Management System)开发。基于vue.js,使用vue-cli脚手架快速生成项目目录,引用Element UI组件库,方便开发快速简洁好看的组件。分离颜色样式,支持手动切换主题色,而且很方便使用自定义主题色。
## 功能 ##
- [x] Element UI
- [x] 登录/注销
- [x] 表格
- [x] 表单
- [x] 图表 :bar_chart:
- [x] 富文本编辑器
- [x] markdown编辑器
- [x] 图片拖拽/裁剪上传
- [x] 支持切换主题色 :sparkles:
- [x] 列表拖拽排序
## 目录结构介绍 ##
|-- build // webpack配置文件
|-- config // 项目打包路径
|-- src // 源码目录
| |-- components // 组件
| |-- common // 公共组件
| |-- Header.vue // 公共头部
| |-- Home.vue // 公共路由入口
| |-- Sidebar.vue // 公共左边栏
| |-- page // 主要路由页面
| |-- BaseCharts.vue // 基础图表
| |-- BaseForm.vue // 基础表单
| |-- BaseTable.vue // 基础表格
| |-- Login.vue // 登录
| |-- Markdown.vue // markdown组件
| |-- Readme.vue // 自述组件
| |-- Upload.vue // 图片上传
| |-- VueEditor.vue // 富文本编辑器
| |-- VueTable.vue // vue表格组件
| |-- App.vue // 页面入口文件
| |-- main.js // 程序入口文件,加载各种公共组件
|-- .babelrc // ES6语法编译配置
|-- .editorconfig // 代码编写规格
|-- .gitignore // 忽略的文件
|-- index.html // 入口html文件
|-- package.json // 项目及工具的依赖配置文件
|-- README.md // 说明
## 安装步骤 ##
git clone https://github.com/lin-xin/manage-system.git // 把模板下载到本地
cd manage-system // 进入模板目录
npm install // 安装项目依赖,等待安装完成之后
## 本地开发 ##
// 开启服务器,浏览器访问 http://localhost:8080
npm run dev
## 构建生产 ##
// 执行构建命令,生成的dist文件夹放在服务器下即可访问
npm run build
## 组件使用说明与演示 ##
### vue-schart ###
vue.js封装sChart.js的图表组件。访问地址:[vue-schart](https://github.com/linxin/vue-schart)
<p><a href="https://www.npmjs.com/package/vue-schart"><img src="https://img.shields.io/npm/dm/vue-schart.svg" alt="Downloads"></a></p>
```JavaScript
<template>
<div>
<schart :canvasId="canvasId"
:type="type"
:width="width"
:height="height"
:data="data"
:options="options"
></schart>
</div>
</template>
<script>
import Schart from 'vue-schart'; // 导入Schart组件
export default {
data: function(){
return {
canvasId: 'myCanvas', // canvas的id
type: 'bar', // 图表类型
width: 500,
height: 400,
data: [
{name: '2014', value: 1342},
{name: '2015', value: 2123},
{name: '2016', value: 1654},
{name: '2017', value: 1795},
],
options: { // 图表可选参数
title: 'Total sales of stores in recent years'
}
}
},
components: {
Schart
}
}
</script>
```
### element-ui ###
一套基于vue.js2.0的桌面组件库。访问地址:[element](http://element.eleme.io/#/zh-CN/component/layout)
### vue-datasource ###
一个用于动态创建表格的vue.js服务端组件。访问地址:[vue-datasource](https://github.com/coderdiaz/vue-datasource)
### Vue-Quill-Editor ###
基于Quill、适用于Vue2的富文本编辑器。访问地址:[vue-quill-editor](https://github.com/surmon-china/vue-quill-editor)
### Vue-SimpleMDE ###
Vue.js的Markdown Editor组件。访问地址:[Vue-SimpleMDE](https://github.com/F-loat/vue-simplemde)
### Vue-Core-Image-Upload ###
一款轻量级的vue上传插件,支持裁剪。访问地址:[Vue-Core-Image-Upload](https://github.com/Vanthink-UED/vue-core-image-upload)
## 其他注意事项 ##
### 一、如果我不想用到上面的某些组件呢,那我怎么在模板中删除掉不影响到其他功能呢? ###
举个栗子,我不想用 vue-datasource 这个组件,那我需要分四步走。
第一步:删除该组件的路由,在目录 src/router/index.js 中,找到引入改组件的路由,删除下面这段代码。
```JavaScript
{
path: '/vuetable',
component: resolve => require(['../components/page/VueTable.vue'], resolve) // vue-datasource组件
},
```
第二步:删除引入该组件的文件。在目录 src/components/page/ 删除 VueTable.vue 文件。
第三步:删除该页面的入口。在目录 src/components/common/Sidebar.vue 中,找到该入口,删除下面这段代码。
```HTML
<el-menu-item index="vuetable">Vue表格组件</el-menu-item>
```
第四步:卸载该组件。执行以下命令:
npm un vue-datasource -S
完成。
### 二、如何切换主题色呢? ###
第一步:打开 src/main.js 文件,找到引入 element 样式的地方,换成浅绿色主题。
```javascript
import 'element-ui/lib/theme-default/index.css'; // 默认主题
// import '../static/css/theme-green/index.css'; // 浅绿色主题
```
第二步:打开 src/App.vue 文件,找到 style 标签引入样式的地方,切换成浅绿色主题。
```javascript
@import "../static/css/main.css";
@import "../static/css/color-dark.css"; /*深色主题*/
/*@import "../static/css/theme-green/color-green.css"; !*浅绿色主题*!*/
```
第三步:打开 src/components/common/Sidebar.vue 文件,找到 el-menu 标签,把 theme="dark" 去掉即可。
## 项目截图 ##
### 默认皮肤 ###
![Image text](https://github.com/lin-xin/manage-system/raw/master/screenshots/wms1.png)
### 浅绿色皮肤 ###
![Image text](https://github.com/lin-xin/manage-system/raw/master/screenshots/wms2.png)
\ No newline at end of file
// https://github.com/shelljs/shelljs
require('./check-versions')();
process.env.NODE_ENV = 'production';
var ora = require('ora');
var path = require('path');
var chalk = require('chalk');
var shell = require('shelljs');
var webpack = require('webpack');
var config = require('../config');
var webpackConfig = require('./webpack.prod.conf');
var spinner = ora('building for production...');
spinner.start();
var assetsPath = path.join(config.build.assetsRoot, config.build.assetsSubDirectory);
shell.rm('-rf', assetsPath);
shell.mkdir('-p', assetsPath);
shell.config.silent = true;
shell.cp('-R', 'static/*', assetsPath);
shell.config.silent = false;
webpack(webpackConfig, function (err, stats) {
spinner.stop();
if (err) throw err;
process.stdout.write(stats.toString({
colors: true,
modules: false,
children: false,
chunks: false,
chunkModules: false
}) + '\n\n');
console.log(chalk.cyan(' ' + new Date().toLocaleString() + ' Build complete.'));
console.log(chalk.yellow(
' Tip: built files are meant to be served over an HTTP server.\n' +
' Opening index.html over file:// won\'t work.\n'
))
});
var chalk = require('chalk')
var semver = require('semver')
var packageConfig = require('../package.json')
function exec (cmd) {
return require('child_process').execSync(cmd).toString().trim()
}
var versionRequirements = [
{
name: 'node',
currentVersion: semver.clean(process.version),
versionRequirement: packageConfig.engines.node
},
{
name: 'npm',
currentVersion: exec('npm --version'),
versionRequirement: packageConfig.engines.npm
}
]
module.exports = function () {
var warnings = []
for (var i = 0; i < versionRequirements.length; i++) {
var mod = versionRequirements[i]
if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) {
warnings.push(mod.name + ': ' +
chalk.red(mod.currentVersion) + ' should be ' +
chalk.green(mod.versionRequirement)
)
}
}
if (warnings.length) {
console.log('')
console.log(chalk.yellow('To use this template, you must update following to modules:'))
console.log()
for (var i = 0; i < warnings.length; i++) {
var warning = warnings[i]
console.log(' ' + warning)
}
console.log()
process.exit(1)
}
}
/* eslint-disable */
require('eventsource-polyfill')
var hotClient = require('webpack-hot-middleware/client?noInfo=true&reload=true')
hotClient.subscribe(function (event) {
if (event.action === 'reload') {
window.location.reload()
}
})
require('./check-versions')()
var config = require('../config')
if (!process.env.NODE_ENV) {
process.env.NODE_ENV = JSON.parse(config.dev.env.NODE_ENV)
}
var opn = require('opn')
var path = require('path')
var express = require('express')
var webpack = require('webpack')
var proxyMiddleware = require('http-proxy-middleware')
var webpackConfig = require('./webpack.dev.conf')
// default port where dev server listens for incoming traffic
var port = process.env.PORT || config.dev.port
// automatically open browser, if not set will be false
var autoOpenBrowser = !!config.dev.autoOpenBrowser
// Define HTTP proxies to your custom API backend
// https://github.com/chimurai/http-proxy-middleware
var proxyTable = config.dev.proxyTable
var app = express()
var compiler = webpack(webpackConfig)
var devMiddleware = require('webpack-dev-middleware')(compiler, {
publicPath: webpackConfig.output.publicPath,
quiet: true
})
var hotMiddleware = require('webpack-hot-middleware')(compiler, {
log: () => {}
})
// force page reload when html-webpack-plugin template changes
compiler.plugin('compilation', function (compilation) {
compilation.plugin('html-webpack-plugin-after-emit', function (data, cb) {
hotMiddleware.publish({ action: 'reload' })
cb()
})
})
// proxy api requests
Object.keys(proxyTable).forEach(function (context) {
var options = proxyTable[context]
if (typeof options === 'string') {
options = { target: options }
}
app.use(proxyMiddleware(options.filter || context, options))
})
// handle fallback for HTML5 history API
app.use(require('connect-history-api-fallback')())
// serve webpack bundle output
app.use(devMiddleware)
// enable hot-reload and state-preserving
// compilation error display
app.use(hotMiddleware)
// serve pure static assets
var staticPath = path.posix.join(config.dev.assetsPublicPath, config.dev.assetsSubDirectory)
app.use(staticPath, express.static('./static'))
var uri = 'http://localhost:' + port + config.dev.assetsPublicPath;
devMiddleware.waitUntilValid(function () {
console.log('> Listening at ' + uri + '\n')
})
module.exports = app.listen(port, function (err) {
if (err) {
console.log(err)
return
}
// when env is testing, don't need open it
if (autoOpenBrowser && process.env.NODE_ENV !== 'testing') {
opn(uri)
}
})
var path = require('path')
var config = require('../config')
var ExtractTextPlugin = require('extract-text-webpack-plugin')
exports.assetsPath = function (_path) {
var assetsSubDirectory = process.env.NODE_ENV === 'production'
? config.build.assetsSubDirectory
: config.dev.assetsSubDirectory
return path.posix.join(assetsSubDirectory, _path)
}
exports.cssLoaders = function (options) {
options = options || {}
// generate loader string to be used with extract text plugin
function generateLoaders (loaders) {
var sourceLoader = loaders.map(function (loader) {
var extraParamChar
if (/\?/.test(loader)) {
loader = loader.replace(/\?/, '-loader?')
extraParamChar = '&'
} else {
loader = loader + '-loader'
extraParamChar = '?'
}
return loader + (options.sourceMap ? extraParamChar + 'sourceMap' : '')
}).join('!')
// Extract CSS when that option is specified
// (which is the case during production build)
if (options.extract) {
return ExtractTextPlugin.extract({
use: sourceLoader,
fallback: 'vue-style-loader'
})
} else {
return ['vue-style-loader', sourceLoader].join('!')
}
}
// http://vuejs.github.io/vue-loader/en/configurations/extract-css.html
return {
css: generateLoaders(['css']),
postcss: generateLoaders(['css']),
less: generateLoaders(['css', 'less']),
sass: generateLoaders(['css', 'sass?indentedSyntax']),
scss: generateLoaders(['css', 'sass']),
stylus: generateLoaders(['css', 'stylus']),
styl: generateLoaders(['css', 'stylus'])
}
}
// Generate loaders for standalone style files (outside of .vue)
exports.styleLoaders = function (options) {
var output = []
var loaders = exports.cssLoaders(options)
for (var extension in loaders) {
var loader = loaders[extension]
output.push({
test: new RegExp('\\.' + extension + '$'),
loader: loader
})
}
return output
}
{"name":"vendor_library","content":{"./node_modules/core-js/modules/_export.js":{"id":0,"meta":{}},"./node_modules/core-js/modules/_an-object.js":{"id":1,"meta":{}},"./node_modules/core-js/modules/_global.js":{"id":2,"meta":{}},"./node_modules/core-js/modules/_fails.js":{"id":3,"meta":{}},"./node_modules/core-js/modules/_is-object.js":{"id":4,"meta":{}},"./node_modules/core-js/modules/_wks.js":{"id":5,"meta":{}},"./node_modules/core-js/modules/_descriptors.js":{"id":6,"meta":{}},"./node_modules/core-js/modules/_object-dp.js":{"id":7,"meta":{}},"./node_modules/core-js/modules/_to-length.js":{"id":8,"meta":{}},"./node_modules/core-js/modules/_to-object.js":{"id":9,"meta":{}},"./node_modules/core-js/modules/_has.js":{"id":10,"meta":{}},"./node_modules/core-js/modules/_a-function.js":{"id":11,"meta":{}},"./node_modules/core-js/modules/_hide.js":{"id":12,"meta":{}},"./node_modules/core-js/modules/_redefine.js":{"id":13,"meta":{}},"./node_modules/core-js/modules/_string-html.js":{"id":14,"meta":{}},"./node_modules/core-js/modules/_to-iobject.js":{"id":15,"meta":{}},"./node_modules/axios/lib/utils.js":{"id":16,"meta":{}},"./node_modules/core-js/modules/_object-gopd.js":{"id":17,"meta":{}},"./node_modules/core-js/modules/_object-gpo.js":{"id":18,"meta":{}},"./node_modules/core-js/modules/_cof.js":{"id":19,"meta":{}},"./node_modules/core-js/modules/_defined.js":{"id":20,"meta":{}},"./node_modules/core-js/modules/_strict-method.js":{"id":21,"meta":{}},"./node_modules/core-js/modules/_array-methods.js":{"id":22,"meta":{}},"./node_modules/core-js/modules/_object-sap.js":{"id":23,"meta":{}},"./node_modules/core-js/modules/_to-primitive.js":{"id":24,"meta":{}},"./node_modules/core-js/modules/_core.js":{"id":25,"meta":{}},"./node_modules/core-js/modules/_ctx.js":{"id":26,"meta":{}},"./node_modules/core-js/modules/_metadata.js":{"id":27,"meta":{}},"./node_modules/core-js/modules/_typed-array.js":{"id":28,"meta":{}},"./node_modules/core-js/modules/_meta.js":{"id":29,"meta":{}},"./node_modules/core-js/modules/_property-desc.js":{"id":30,"meta":{}},"./node_modules/core-js/modules/_to-integer.js":{"id":31,"meta":{}},"./node_modules/core-js/modules/_an-instance.js":{"id":32,"meta":{}},"./node_modules/core-js/modules/_library.js":{"id":33,"meta":{}},"./node_modules/core-js/modules/_object-create.js":{"id":34,"meta":{}},"./node_modules/core-js/modules/_object-gopn.js":{"id":35,"meta":{}},"./node_modules/core-js/modules/_object-keys.js":{"id":36,"meta":{}},"./node_modules/core-js/modules/_redefine-all.js":{"id":37,"meta":{}},"./node_modules/core-js/modules/_set-species.js":{"id":38,"meta":{}},"./node_modules/core-js/modules/_to-index.js":{"id":39,"meta":{}},"./node_modules/core-js/modules/_uid.js":{"id":40,"meta":{}},"./node_modules/core-js/modules/_add-to-unscopables.js":{"id":41,"meta":{}},"./node_modules/core-js/modules/_for-of.js":{"id":42,"meta":{}},"./node_modules/core-js/modules/_iterators.js":{"id":43,"meta":{}},"./node_modules/core-js/modules/_set-to-string-tag.js":{"id":44,"meta":{}},"./node_modules/core-js/modules/_string-trim.js":{"id":45,"meta":{}},"./node_modules/core-js/modules/_classof.js":{"id":46,"meta":{}},"./node_modules/core-js/modules/_iobject.js":{"id":47,"meta":{}},"./node_modules/core-js/modules/_object-pie.js":{"id":48,"meta":{}},"./node_modules/core-js/modules/_array-includes.js":{"id":49,"meta":{}},"./node_modules/core-js/modules/_collection.js":{"id":50,"meta":{}},"./node_modules/core-js/modules/_fix-re-wks.js":{"id":51,"meta":{}},"./node_modules/core-js/modules/_flags.js":{"id":52,"meta":{}},"./node_modules/core-js/modules/_invoke.js":{"id":53,"meta":{}},"./node_modules/core-js/modules/_is-regexp.js":{"id":54,"meta":{}},"./node_modules/core-js/modules/_iter-detect.js":{"id":55,"meta":{}},"./node_modules/core-js/modules/_object-forced-pam.js":{"id":56,"meta":{}},"./node_modules/core-js/modules/_object-gops.js":{"id":57,"meta":{}},"./node_modules/core-js/modules/_shared.js":{"id":58,"meta":{}},"./node_modules/core-js/modules/_typed.js":{"id":59,"meta":{}},"./node_modules/axios/lib/defaults.js":{"id":60,"meta":{}},"./node_modules/core-js/modules/_array-fill.js":{"id":61,"meta":{}},"./node_modules/core-js/modules/_create-property.js":{"id":62,"meta":{}},"./node_modules/core-js/modules/_dom-create.js":{"id":63,"meta":{}},"./node_modules/core-js/modules/_enum-bug-keys.js":{"id":64,"meta":{}},"./node_modules/core-js/modules/_fails-is-regexp.js":{"id":65,"meta":{}},"./node_modules/core-js/modules/_html.js":{"id":66,"meta":{}},"./node_modules/core-js/modules/_inherit-if-required.js":{"id":67,"meta":{}},"./node_modules/core-js/modules/_is-array-iter.js":{"id":68,"meta":{}},"./node_modules/core-js/modules/_is-array.js":{"id":69,"meta":{}},"./node_modules/core-js/modules/_iter-create.js":{"id":70,"meta":{}},"./node_modules/core-js/modules/_iter-define.js":{"id":71,"meta":{}},"./node_modules/core-js/modules/_math-expm1.js":{"id":72,"meta":{}},"./node_modules/core-js/modules/_math-sign.js":{"id":73,"meta":{}},"./node_modules/core-js/modules/_microtask.js":{"id":74,"meta":{}},"./node_modules/core-js/modules/_set-proto.js":{"id":75,"meta":{}},"./node_modules/core-js/modules/_shared-key.js":{"id":76,"meta":{}},"./node_modules/core-js/modules/_species-constructor.js":{"id":77,"meta":{}},"./node_modules/core-js/modules/_string-at.js":{"id":78,"meta":{}},"./node_modules/core-js/modules/_string-context.js":{"id":79,"meta":{}},"./node_modules/core-js/modules/_string-repeat.js":{"id":80,"meta":{}},"./node_modules/core-js/modules/_string-ws.js":{"id":81,"meta":{}},"./node_modules/core-js/modules/_task.js":{"id":82,"meta":{}},"./node_modules/core-js/modules/_typed-buffer.js":{"id":83,"meta":{}},"./node_modules/core-js/modules/_wks-define.js":{"id":84,"meta":{}},"./node_modules/core-js/modules/core.get-iterator-method.js":{"id":85,"meta":{}},"./node_modules/core-js/modules/es6.array.iterator.js":{"id":86,"meta":{}},"./node_modules/webpack/buildin/global.js":{"id":87,"meta":{}},"./node_modules/axios/lib/adapters/xhr.js":{"id":88,"meta":{}},"./node_modules/axios/lib/cancel/Cancel.js":{"id":89,"meta":{}},"./node_modules/axios/lib/cancel/isCancel.js":{"id":90,"meta":{}},"./node_modules/axios/lib/core/createError.js":{"id":91,"meta":{}},"./node_modules/axios/lib/helpers/bind.js":{"id":92,"meta":{}},"./node_modules/core-js/modules/_a-number-value.js":{"id":93,"meta":{}},"./node_modules/core-js/modules/_array-copy-within.js":{"id":94,"meta":{}},"./node_modules/core-js/modules/_array-from-iterable.js":{"id":95,"meta":{}},"./node_modules/core-js/modules/_array-reduce.js":{"id":96,"meta":{}},"./node_modules/core-js/modules/_bind.js":{"id":97,"meta":{}},"./node_modules/core-js/modules/_collection-strong.js":{"id":98,"meta":{}},"./node_modules/core-js/modules/_collection-to-json.js":{"id":99,"meta":{}},"./node_modules/core-js/modules/_collection-weak.js":{"id":100,"meta":{}},"./node_modules/core-js/modules/_ie8-dom-define.js":{"id":101,"meta":{}},"./node_modules/core-js/modules/_is-integer.js":{"id":102,"meta":{}},"./node_modules/core-js/modules/_iter-call.js":{"id":103,"meta":{}},"./node_modules/core-js/modules/_iter-step.js":{"id":104,"meta":{}},"./node_modules/core-js/modules/_math-log1p.js":{"id":105,"meta":{}},"./node_modules/core-js/modules/_object-assign.js":{"id":106,"meta":{}},"./node_modules/core-js/modules/_object-dps.js":{"id":107,"meta":{}},"./node_modules/core-js/modules/_object-gopn-ext.js":{"id":108,"meta":{}},"./node_modules/core-js/modules/_object-keys-internal.js":{"id":109,"meta":{}},"./node_modules/core-js/modules/_object-to-array.js":{"id":110,"meta":{}},"./node_modules/core-js/modules/_own-keys.js":{"id":111,"meta":{}},"./node_modules/core-js/modules/_parse-float.js":{"id":112,"meta":{}},"./node_modules/core-js/modules/_parse-int.js":{"id":113,"meta":{}},"./node_modules/core-js/modules/_same-value.js":{"id":114,"meta":{}},"./node_modules/core-js/modules/_string-pad.js":{"id":115,"meta":{}},"./node_modules/core-js/modules/_wks-ext.js":{"id":116,"meta":{}},"./node_modules/core-js/modules/es6.map.js":{"id":117,"meta":{}},"./node_modules/core-js/modules/es6.regexp.flags.js":{"id":118,"meta":{}},"./node_modules/core-js/modules/es6.set.js":{"id":119,"meta":{}},"./node_modules/core-js/modules/es6.weak-map.js":{"id":120,"meta":{}},"./node_modules/axios/index.js":{"id":121,"meta":{}},"./node_modules/babel-polyfill/lib/index.js":{"id":122,"meta":{}},"./node_modules/vue-router/dist/vue-router.esm.js":{"id":123,"meta":{"harmonyModule":true},"exports":["default"]},"./node_modules/vue/dist/vue.common.js":{"id":124,"meta":{}},"./node_modules/axios/lib/axios.js":{"id":125,"meta":{}},"./node_modules/axios/lib/cancel/CancelToken.js":{"id":126,"meta":{}},"./node_modules/axios/lib/core/Axios.js":{"id":127,"meta":{}},"./node_modules/axios/lib/core/InterceptorManager.js":{"id":128,"meta":{}},"./node_modules/axios/lib/core/dispatchRequest.js":{"id":129,"meta":{}},"./node_modules/axios/lib/core/enhanceError.js":{"id":130,"meta":{}},"./node_modules/axios/lib/core/settle.js":{"id":131,"meta":{}},"./node_modules/axios/lib/core/transformData.js":{"id":132,"meta":{}},"./node_modules/axios/lib/helpers/btoa.js":{"id":133,"meta":{}},"./node_modules/axios/lib/helpers/buildURL.js":{"id":134,"meta":{}},"./node_modules/axios/lib/helpers/combineURLs.js":{"id":135,"meta":{}},"./node_modules/axios/lib/helpers/cookies.js":{"id":136,"meta":{}},"./node_modules/axios/lib/helpers/isAbsoluteURL.js":{"id":137,"meta":{}},"./node_modules/axios/lib/helpers/isURLSameOrigin.js":{"id":138,"meta":{}},"./node_modules/axios/lib/helpers/normalizeHeaderName.js":{"id":139,"meta":{}},"./node_modules/axios/lib/helpers/parseHeaders.js":{"id":140,"meta":{}},"./node_modules/axios/lib/helpers/spread.js":{"id":141,"meta":{}},"./node_modules/core-js/fn/regexp/escape.js":{"id":142,"meta":{}},"./node_modules/core-js/modules/_array-species-constructor.js":{"id":143,"meta":{}},"./node_modules/core-js/modules/_array-species-create.js":{"id":144,"meta":{}},"./node_modules/core-js/modules/_date-to-primitive.js":{"id":145,"meta":{}},"./node_modules/core-js/modules/_enum-keys.js":{"id":146,"meta":{}},"./node_modules/core-js/modules/_keyof.js":{"id":147,"meta":{}},"./node_modules/core-js/modules/_partial.js":{"id":148,"meta":{}},"./node_modules/core-js/modules/_path.js":{"id":149,"meta":{}},"./node_modules/core-js/modules/_replacer.js":{"id":150,"meta":{}},"./node_modules/core-js/modules/core.regexp.escape.js":{"id":151,"meta":{}},"./node_modules/core-js/modules/es6.array.copy-within.js":{"id":152,"meta":{}},"./node_modules/core-js/modules/es6.array.every.js":{"id":153,"meta":{}},"./node_modules/core-js/modules/es6.array.fill.js":{"id":154,"meta":{}},"./node_modules/core-js/modules/es6.array.filter.js":{"id":155,"meta":{}},"./node_modules/core-js/modules/es6.array.find-index.js":{"id":156,"meta":{}},"./node_modules/core-js/modules/es6.array.find.js":{"id":157,"meta":{}},"./node_modules/core-js/modules/es6.array.for-each.js":{"id":158,"meta":{}},"./node_modules/core-js/modules/es6.array.from.js":{"id":159,"meta":{}},"./node_modules/core-js/modules/es6.array.index-of.js":{"id":160,"meta":{}},"./node_modules/core-js/modules/es6.array.is-array.js":{"id":161,"meta":{}},"./node_modules/core-js/modules/es6.array.join.js":{"id":162,"meta":{}},"./node_modules/core-js/modules/es6.array.last-index-of.js":{"id":163,"meta":{}},"./node_modules/core-js/modules/es6.array.map.js":{"id":164,"meta":{}},"./node_modules/core-js/modules/es6.array.of.js":{"id":165,"meta":{}},"./node_modules/core-js/modules/es6.array.reduce-right.js":{"id":166,"meta":{}},"./node_modules/core-js/modules/es6.array.reduce.js":{"id":167,"meta":{}},"./node_modules/core-js/modules/es6.array.slice.js":{"id":168,"meta":{}},"./node_modules/core-js/modules/es6.array.some.js":{"id":169,"meta":{}},"./node_modules/core-js/modules/es6.array.sort.js":{"id":170,"meta":{}},"./node_modules/core-js/modules/es6.array.species.js":{"id":171,"meta":{}},"./node_modules/core-js/modules/es6.date.now.js":{"id":172,"meta":{}},"./node_modules/core-js/modules/es6.date.to-iso-string.js":{"id":173,"meta":{}},"./node_modules/core-js/modules/es6.date.to-json.js":{"id":174,"meta":{}},"./node_modules/core-js/modules/es6.date.to-primitive.js":{"id":175,"meta":{}},"./node_modules/core-js/modules/es6.date.to-string.js":{"id":176,"meta":{}},"./node_modules/core-js/modules/es6.function.bind.js":{"id":177,"meta":{}},"./node_modules/core-js/modules/es6.function.has-instance.js":{"id":178,"meta":{}},"./node_modules/core-js/modules/es6.function.name.js":{"id":179,"meta":{}},"./node_modules/core-js/modules/es6.math.acosh.js":{"id":180,"meta":{}},"./node_modules/core-js/modules/es6.math.asinh.js":{"id":181,"meta":{}},"./node_modules/core-js/modules/es6.math.atanh.js":{"id":182,"meta":{}},"./node_modules/core-js/modules/es6.math.cbrt.js":{"id":183,"meta":{}},"./node_modules/core-js/modules/es6.math.clz32.js":{"id":184,"meta":{}},"./node_modules/core-js/modules/es6.math.cosh.js":{"id":185,"meta":{}},"./node_modules/core-js/modules/es6.math.expm1.js":{"id":186,"meta":{}},"./node_modules/core-js/modules/es6.math.fround.js":{"id":187,"meta":{}},"./node_modules/core-js/modules/es6.math.hypot.js":{"id":188,"meta":{}},"./node_modules/core-js/modules/es6.math.imul.js":{"id":189,"meta":{}},"./node_modules/core-js/modules/es6.math.log10.js":{"id":190,"meta":{}},"./node_modules/core-js/modules/es6.math.log1p.js":{"id":191,"meta":{}},"./node_modules/core-js/modules/es6.math.log2.js":{"id":192,"meta":{}},"./node_modules/core-js/modules/es6.math.sign.js":{"id":193,"meta":{}},"./node_modules/core-js/modules/es6.math.sinh.js":{"id":194,"meta":{}},"./node_modules/core-js/modules/es6.math.tanh.js":{"id":195,"meta":{}},"./node_modules/core-js/modules/es6.math.trunc.js":{"id":196,"meta":{}},"./node_modules/core-js/modules/es6.number.constructor.js":{"id":197,"meta":{}},"./node_modules/core-js/modules/es6.number.epsilon.js":{"id":198,"meta":{}},"./node_modules/core-js/modules/es6.number.is-finite.js":{"id":199,"meta":{}},"./node_modules/core-js/modules/es6.number.is-integer.js":{"id":200,"meta":{}},"./node_modules/core-js/modules/es6.number.is-nan.js":{"id":201,"meta":{}},"./node_modules/core-js/modules/es6.number.is-safe-integer.js":{"id":202,"meta":{}},"./node_modules/core-js/modules/es6.number.max-safe-integer.js":{"id":203,"meta":{}},"./node_modules/core-js/modules/es6.number.min-safe-integer.js":{"id":204,"meta":{}},"./node_modules/core-js/modules/es6.number.parse-float.js":{"id":205,"meta":{}},"./node_modules/core-js/modules/es6.number.parse-int.js":{"id":206,"meta":{}},"./node_modules/core-js/modules/es6.number.to-fixed.js":{"id":207,"meta":{}},"./node_modules/core-js/modules/es6.number.to-precision.js":{"id":208,"meta":{}},"./node_modules/core-js/modules/es6.object.assign.js":{"id":209,"meta":{}},"./node_modules/core-js/modules/es6.object.create.js":{"id":210,"meta":{}},"./node_modules/core-js/modules/es6.object.define-properties.js":{"id":211,"meta":{}},"./node_modules/core-js/modules/es6.object.define-property.js":{"id":212,"meta":{}},"./node_modules/core-js/modules/es6.object.freeze.js":{"id":213,"meta":{}},"./node_modules/core-js/modules/es6.object.get-own-property-descriptor.js":{"id":214,"meta":{}},"./node_modules/core-js/modules/es6.object.get-own-property-names.js":{"id":215,"meta":{}},"./node_modules/core-js/modules/es6.object.get-prototype-of.js":{"id":216,"meta":{}},"./node_modules/core-js/modules/es6.object.is-extensible.js":{"id":217,"meta":{}},"./node_modules/core-js/modules/es6.object.is-frozen.js":{"id":218,"meta":{}},"./node_modules/core-js/modules/es6.object.is-sealed.js":{"id":219,"meta":{}},"./node_modules/core-js/modules/es6.object.is.js":{"id":220,"meta":{}},"./node_modules/core-js/modules/es6.object.keys.js":{"id":221,"meta":{}},"./node_modules/core-js/modules/es6.object.prevent-extensions.js":{"id":222,"meta":{}},"./node_modules/core-js/modules/es6.object.seal.js":{"id":223,"meta":{}},"./node_modules/core-js/modules/es6.object.set-prototype-of.js":{"id":224,"meta":{}},"./node_modules/core-js/modules/es6.object.to-string.js":{"id":225,"meta":{}},"./node_modules/core-js/modules/es6.parse-float.js":{"id":226,"meta":{}},"./node_modules/core-js/modules/es6.parse-int.js":{"id":227,"meta":{}},"./node_modules/core-js/modules/es6.promise.js":{"id":228,"meta":{}},"./node_modules/core-js/modules/es6.reflect.apply.js":{"id":229,"meta":{}},"./node_modules/core-js/modules/es6.reflect.construct.js":{"id":230,"meta":{}},"./node_modules/core-js/modules/es6.reflect.define-property.js":{"id":231,"meta":{}},"./node_modules/core-js/modules/es6.reflect.delete-property.js":{"id":232,"meta":{}},"./node_modules/core-js/modules/es6.reflect.enumerate.js":{"id":233,"meta":{}},"./node_modules/core-js/modules/es6.reflect.get-own-property-descriptor.js":{"id":234,"meta":{}},"./node_modules/core-js/modules/es6.reflect.get-prototype-of.js":{"id":235,"meta":{}},"./node_modules/core-js/modules/es6.reflect.get.js":{"id":236,"meta":{}},"./node_modules/core-js/modules/es6.reflect.has.js":{"id":237,"meta":{}},"./node_modules/core-js/modules/es6.reflect.is-extensible.js":{"id":238,"meta":{}},"./node_modules/core-js/modules/es6.reflect.own-keys.js":{"id":239,"meta":{}},"./node_modules/core-js/modules/es6.reflect.prevent-extensions.js":{"id":240,"meta":{}},"./node_modules/core-js/modules/es6.reflect.set-prototype-of.js":{"id":241,"meta":{}},"./node_modules/core-js/modules/es6.reflect.set.js":{"id":242,"meta":{}},"./node_modules/core-js/modules/es6.regexp.constructor.js":{"id":243,"meta":{}},"./node_modules/core-js/modules/es6.regexp.match.js":{"id":244,"meta":{}},"./node_modules/core-js/modules/es6.regexp.replace.js":{"id":245,"meta":{}},"./node_modules/core-js/modules/es6.regexp.search.js":{"id":246,"meta":{}},"./node_modules/core-js/modules/es6.regexp.split.js":{"id":247,"meta":{}},"./node_modules/core-js/modules/es6.regexp.to-string.js":{"id":248,"meta":{}},"./node_modules/core-js/modules/es6.string.anchor.js":{"id":249,"meta":{}},"./node_modules/core-js/modules/es6.string.big.js":{"id":250,"meta":{}},"./node_modules/core-js/modules/es6.string.blink.js":{"id":251,"meta":{}},"./node_modules/core-js/modules/es6.string.bold.js":{"id":252,"meta":{}},"./node_modules/core-js/modules/es6.string.code-point-at.js":{"id":253,"meta":{}},"./node_modules/core-js/modules/es6.string.ends-with.js":{"id":254,"meta":{}},"./node_modules/core-js/modules/es6.string.fixed.js":{"id":255,"meta":{}},"./node_modules/core-js/modules/es6.string.fontcolor.js":{"id":256,"meta":{}},"./node_modules/core-js/modules/es6.string.fontsize.js":{"id":257,"meta":{}},"./node_modules/core-js/modules/es6.string.from-code-point.js":{"id":258,"meta":{}},"./node_modules/core-js/modules/es6.string.includes.js":{"id":259,"meta":{}},"./node_modules/core-js/modules/es6.string.italics.js":{"id":260,"meta":{}},"./node_modules/core-js/modules/es6.string.iterator.js":{"id":261,"meta":{}},"./node_modules/core-js/modules/es6.string.link.js":{"id":262,"meta":{}},"./node_modules/core-js/modules/es6.string.raw.js":{"id":263,"meta":{}},"./node_modules/core-js/modules/es6.string.repeat.js":{"id":264,"meta":{}},"./node_modules/core-js/modules/es6.string.small.js":{"id":265,"meta":{}},"./node_modules/core-js/modules/es6.string.starts-with.js":{"id":266,"meta":{}},"./node_modules/core-js/modules/es6.string.strike.js":{"id":267,"meta":{}},"./node_modules/core-js/modules/es6.string.sub.js":{"id":268,"meta":{}},"./node_modules/core-js/modules/es6.string.sup.js":{"id":269,"meta":{}},"./node_modules/core-js/modules/es6.string.trim.js":{"id":270,"meta":{}},"./node_modules/core-js/modules/es6.symbol.js":{"id":271,"meta":{}},"./node_modules/core-js/modules/es6.typed.array-buffer.js":{"id":272,"meta":{}},"./node_modules/core-js/modules/es6.typed.data-view.js":{"id":273,"meta":{}},"./node_modules/core-js/modules/es6.typed.float32-array.js":{"id":274,"meta":{}},"./node_modules/core-js/modules/es6.typed.float64-array.js":{"id":275,"meta":{}},"./node_modules/core-js/modules/es6.typed.int16-array.js":{"id":276,"meta":{}},"./node_modules/core-js/modules/es6.typed.int32-array.js":{"id":277,"meta":{}},"./node_modules/core-js/modules/es6.typed.int8-array.js":{"id":278,"meta":{}},"./node_modules/core-js/modules/es6.typed.uint16-array.js":{"id":279,"meta":{}},"./node_modules/core-js/modules/es6.typed.uint32-array.js":{"id":280,"meta":{}},"./node_modules/core-js/modules/es6.typed.uint8-array.js":{"id":281,"meta":{}},"./node_modules/core-js/modules/es6.typed.uint8-clamped-array.js":{"id":282,"meta":{}},"./node_modules/core-js/modules/es6.weak-set.js":{"id":283,"meta":{}},"./node_modules/core-js/modules/es7.array.includes.js":{"id":284,"meta":{}},"./node_modules/core-js/modules/es7.asap.js":{"id":285,"meta":{}},"./node_modules/core-js/modules/es7.error.is-error.js":{"id":286,"meta":{}},"./node_modules/core-js/modules/es7.map.to-json.js":{"id":287,"meta":{}},"./node_modules/core-js/modules/es7.math.iaddh.js":{"id":288,"meta":{}},"./node_modules/core-js/modules/es7.math.imulh.js":{"id":289,"meta":{}},"./node_modules/core-js/modules/es7.math.isubh.js":{"id":290,"meta":{}},"./node_modules/core-js/modules/es7.math.umulh.js":{"id":291,"meta":{}},"./node_modules/core-js/modules/es7.object.define-getter.js":{"id":292,"meta":{}},"./node_modules/core-js/modules/es7.object.define-setter.js":{"id":293,"meta":{}},"./node_modules/core-js/modules/es7.object.entries.js":{"id":294,"meta":{}},"./node_modules/core-js/modules/es7.object.get-own-property-descriptors.js":{"id":295,"meta":{}},"./node_modules/core-js/modules/es7.object.lookup-getter.js":{"id":296,"meta":{}},"./node_modules/core-js/modules/es7.object.lookup-setter.js":{"id":297,"meta":{}},"./node_modules/core-js/modules/es7.object.values.js":{"id":298,"meta":{}},"./node_modules/core-js/modules/es7.observable.js":{"id":299,"meta":{}},"./node_modules/core-js/modules/es7.reflect.define-metadata.js":{"id":300,"meta":{}},"./node_modules/core-js/modules/es7.reflect.delete-metadata.js":{"id":301,"meta":{}},"./node_modules/core-js/modules/es7.reflect.get-metadata-keys.js":{"id":302,"meta":{}},"./node_modules/core-js/modules/es7.reflect.get-metadata.js":{"id":303,"meta":{}},"./node_modules/core-js/modules/es7.reflect.get-own-metadata-keys.js":{"id":304,"meta":{}},"./node_modules/core-js/modules/es7.reflect.get-own-metadata.js":{"id":305,"meta":{}},"./node_modules/core-js/modules/es7.reflect.has-metadata.js":{"id":306,"meta":{}},"./node_modules/core-js/modules/es7.reflect.has-own-metadata.js":{"id":307,"meta":{}},"./node_modules/core-js/modules/es7.reflect.metadata.js":{"id":308,"meta":{}},"./node_modules/core-js/modules/es7.set.to-json.js":{"id":309,"meta":{}},"./node_modules/core-js/modules/es7.string.at.js":{"id":310,"meta":{}},"./node_modules/core-js/modules/es7.string.match-all.js":{"id":311,"meta":{}},"./node_modules/core-js/modules/es7.string.pad-end.js":{"id":312,"meta":{}},"./node_modules/core-js/modules/es7.string.pad-start.js":{"id":313,"meta":{}},"./node_modules/core-js/modules/es7.string.trim-left.js":{"id":314,"meta":{}},"./node_modules/core-js/modules/es7.string.trim-right.js":{"id":315,"meta":{}},"./node_modules/core-js/modules/es7.symbol.async-iterator.js":{"id":316,"meta":{}},"./node_modules/core-js/modules/es7.symbol.observable.js":{"id":317,"meta":{}},"./node_modules/core-js/modules/es7.system.global.js":{"id":318,"meta":{}},"./node_modules/core-js/modules/web.dom.iterable.js":{"id":319,"meta":{}},"./node_modules/core-js/modules/web.immediate.js":{"id":320,"meta":{}},"./node_modules/core-js/modules/web.timers.js":{"id":321,"meta":{}},"./node_modules/core-js/shim.js":{"id":322,"meta":{}},"./node_modules/process/browser.js":{"id":323,"meta":{}},"./node_modules/regenerator-runtime/runtime.js":{"id":324,"meta":{}}}}
\ No newline at end of file
var utils = require('./utils')
var config = require('../config')
var isProduction = process.env.NODE_ENV === 'production'
module.exports = {
loaders: utils.cssLoaders({
sourceMap: isProduction
? config.build.productionSourceMap
: config.dev.cssSourceMap,
extract: isProduction
}),
postcss: [
require('autoprefixer')({
browsers: ['last 2 versions']
})
]
}
var path = require('path')
var utils = require('./utils')
var webpack = require('webpack')
var config = require('../config')
var vueLoaderConfig = require('./vue-loader.conf')
function resolve (dir) {
return path.join(__dirname, '..', dir)
}
module.exports = {
entry: {
app: ['babel-polyfill','./src/main.js']
},
output: {
path: config.build.assetsRoot,
filename: '[name].js',
publicPath: process.env.NODE_ENV === 'production'
? config.build.assetsPublicPath
: config.dev.assetsPublicPath
},
resolve: {
extensions: ['.js', '.vue', '.json'],
modules: [
resolve('src'),
resolve('node_modules')
],
alias: {
'vue$': 'vue/dist/vue.common.js',
'src': resolve('src'),
'assets': resolve('src/assets'),
'components': resolve('src/components')
}
},
module: {
rules: [
{
test: /\.vue$/,
loader: 'vue-loader'
},
{
test: /\.js$/,
loader: 'babel-loader',
include: [resolve('src'), resolve('test')]
},
{
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
loader: 'url-loader',
query: {
limit: 10000,
name: utils.assetsPath('img/[name].[hash:7].[ext]')
}
},
{
test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
loader: 'url-loader',
query: {
limit: 10000,
name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
}
}
]
},
// plugins: [
// new webpack.DllReferencePlugin({
// context: path.resolve(__dirname, '..'),
// manifest: require('./vendor-manifest.json')
// })
// ]
}
var utils = require('./utils')
var webpack = require('webpack')
var config = require('../config')
var merge = require('webpack-merge')
var baseWebpackConfig = require('./webpack.base.conf')
var HtmlWebpackPlugin = require('html-webpack-plugin')
var FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')
// add hot-reload related code to entry chunks
Object.keys(baseWebpackConfig.entry).forEach(function (name) {
baseWebpackConfig.entry[name] = ['./build/dev-client'].concat(baseWebpackConfig.entry[name])
})
module.exports = merge(baseWebpackConfig, {
module: {
rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap })
},
// cheap-module-eval-source-map is faster for development
devtool: '#cheap-module-eval-source-map',
plugins: [
new webpack.DefinePlugin({
'process.env': config.dev.env
}),
// https://github.com/glenjamin/webpack-hot-middleware#installation--usage
new webpack.HotModuleReplacementPlugin(),
new webpack.NoEmitOnErrorsPlugin(),
// https://github.com/ampedandwired/html-webpack-plugin
new HtmlWebpackPlugin({
filename: 'index.html',
template: 'index.html',
inject: true
}),
new FriendlyErrorsPlugin()
]
})
const path = require('path');
const webpack = require('webpack');
module.exports = {
entry: {
vendor: ['vue/dist/vue.common.js','vue-router', 'babel-polyfill','axios']
},
output: {
path: path.join(__dirname, '../static/js'),
filename: '[name].dll.js',
library: '[name]_library'
},
plugins: [
new webpack.DllPlugin({
path: path.join(__dirname, '.', '[name]-manifest.json'),
name: '[name]_library'
}),
new webpack.optimize.UglifyJsPlugin({
compress: {
warnings: false
}
}),
new webpack.DefinePlugin({
'process.env': {
NODE_ENV: '"production"'
}
})
]
};
\ No newline at end of file
var path = require('path')
var utils = require('./utils')
var webpack = require('webpack')
var config = require('../config')
var merge = require('webpack-merge')
var baseWebpackConfig = require('./webpack.base.conf')
var HtmlWebpackPlugin = require('html-webpack-plugin')
var ExtractTextPlugin = require('extract-text-webpack-plugin')
var env = config.build.env
var webpackConfig = merge(baseWebpackConfig, {
module: {
rules: utils.styleLoaders({
sourceMap: config.build.productionSourceMap,
extract: true
})
},
devtool: config.build.productionSourceMap ? '#source-map' : false,
output: {
path: config.build.assetsRoot,
filename: utils.assetsPath('js/[name].[chunkhash].js'),
chunkFilename: utils.assetsPath('js/[id].[chunkhash].js')
},
plugins: [
// http://vuejs.github.io/vue-loader/en/workflow/production.html
new webpack.DefinePlugin({
'process.env': env
}),
new webpack.optimize.UglifyJsPlugin({
compress: {
warnings: false
},
sourceMap: true
}),
// extract css into its own file
new ExtractTextPlugin({
filename: utils.assetsPath('css/[name].[contenthash].css')
}),
// generate dist index.html with correct asset hash for caching.
// you can customize output by editing /index.html
// see https://github.com/ampedandwired/html-webpack-plugin
new HtmlWebpackPlugin({
filename: config.build.index,
template: 'index.html',
inject: true,
minify: {
removeComments: true,
collapseWhitespace: true,
removeAttributeQuotes: false
// more options:
// https://github.com/kangax/html-minifier#options-quick-reference
},
// necessary to consistently work with multiple chunks via CommonsChunkPlugin
chunksSortMode: 'dependency'
}),
// split vendor js into its own file
new webpack.optimize.CommonsChunkPlugin({
name: 'vendor',
minChunks: function (module, count) {
// any required modules inside node_modules are extracted to vendor
return (
module.resource &&
/\.js$/.test(module.resource) &&
module.resource.indexOf(
path.join(__dirname, '../node_modules')
) === 0
)
}
}),
// extract webpack runtime and module manifest to its own file in order to
// prevent vendor hash from being updated whenever app bundle is updated
new webpack.optimize.CommonsChunkPlugin({
name: 'manifest',
chunks: ['vendor']
})
]
})
if (config.build.productionGzip) {
var CompressionWebpackPlugin = require('compression-webpack-plugin')
webpackConfig.plugins.push(
new CompressionWebpackPlugin({
asset: '[path].gz[query]',
algorithm: 'gzip',
test: new RegExp(
'\\.(' +
config.build.productionGzipExtensions.join('|') +
')$'
),
threshold: 10240,
minRatio: 0.8
})
)
}
if (config.build.bundleAnalyzerReport) {
var BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
webpackConfig.plugins.push(new BundleAnalyzerPlugin())
}
module.exports = webpackConfig
var merge = require('webpack-merge')
var prodEnv = require('./prod.env')
module.exports = merge(prodEnv, {
NODE_ENV: '"development"'
})
// see http://vuejs-templates.github.io/webpack for documentation.
var path = require('path')
module.exports = {
build: {
env: require('./prod.env'),
index: path.resolve(__dirname, '../dist/index.html'),
assetsRoot: path.resolve(__dirname, '../dist'),
assetsSubDirectory: 'static',
assetsPublicPath: '/meddic/',
productionSourceMap: false,
// Gzip off by default as many popular static hosts such as
// Surge or Netlify already gzip all static assets for you.
// Before setting to `true`, make sure to:
// npm install --save-dev compression-webpack-plugin
productionGzip: false,
productionGzipExtensions: ['js', 'css'],
// Run the build command with an extra argument to
// View the bundle analyzer report after build finishes:
// `npm run build --report`
// Set to `true` or `false` to always turn it on or off
bundleAnalyzerReport: process.env.npm_config_report
},
dev: {
env: require('./dev.env'),
port: 8100,
autoOpenBrowser: true,
assetsSubDirectory: 'static',
assetsPublicPath: '/',
proxyTable: {
'/api':{
target:'http://localhost:8099',
changeOrigin:true,
pathRewrite:{
'/api':''
}
},
'/ms':{
target: 'http://localhost:8099',
changeOrigin: true
},
'/contents':{
target: 'http://localhost:8101',
changeOrigin: true,
pathRewrite:{
'/contents':''
},
secure: false
}
},
proxypath: 'http://localhost:8101',
// CSS Sourcemaps off by default because relative paths are "buggy"
// with this option, according to the CSS-Loader README
// (https://github.com/webpack/css-loader#sourcemaps)
// In our experience, they generally work as expected,
// just be aware of this issue when enabling this option.
// CSS Sourcemaps off by default because relative paths are "buggy"
// with this option, according to the CSS-Loader README
// (https://github.com/webpack/css-loader#sourcemaps)
// In our experience, they generally work as expected,
// just be aware of this issue when enabling this option.
cssSourceMap: false
}
}
module.exports = {
NODE_ENV: '"production"'
}
'use strict'
const merge = require('webpack-merge')
const devEnv = require('./dev.env')
module.exports = merge(devEnv, {
NODE_ENV: '"testing"'
})
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>敏感数据查看系统</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta content="width=device-width, initial-scale=1.0" name="viewport"/>
<meta content="" name="description"/>
<meta content="" name="author"/>
<link rel="shortcut icon" href="./static/img/index_logoicon.png">
</head>
<body>
<div id="app"></div>
<script src="https://pv.sohu.com/cityjson?ie=utf-8"></script>
<!--oss upload start-->
<script src="https://gosspublic.alicdn.com/aliyun-oss-sdk-5.1.1.min.js"></script>
<script src="https://unpkg.com/qiniu-js@2.2.0/dist/qiniu.min.js"></script>
<!--oss upload end-->
</body>
</html>
因为 它太大了无法显示 源差异 。您可以改为 查看blob
{
"name": "manage-system",
"version": "2.1.0",
"description": "基于Vue.js 2.x系列 + element-ui 内容管理系统解决方案",
"author": "lin-xin <2981207131@qq.com>",
"private": true,
"scripts": {
"dev": "node build/dev-server.js",
"build": "node build/build.js",
"build:dll": "webpack --config build/webpack.dll.conf.js"
},
"dependencies": {
"axios": "^0.18.0",
"babel-polyfill": "^6.23.0",
"element-ui": "^2.7.2",
"vue": "^2.3.2",
"vue-core-image-upload": "2.1.11",
"vue-datasource": "1.0.9",
"vue-quill-editor": "2.1.6",
"vue-router": "^2.3.1",
"vue-schart": "^0.1.2",
"vue-simplemde": "0.3.8",
"vue-table-with-tree-grid": "^0.2.4",
"vue-xlsx-table": "^1.2.8",
"vuedraggable": "^2.16.0",
"vuex": "^3.0.1"
},
"devDependencies": {
"autoprefixer": "^6.7.2",
"babel-core": "^6.22.1",
"babel-loader": "^6.2.10",
"babel-plugin-transform-runtime": "^6.22.0",
"babel-preset-es2015": "^6.22.0",
"babel-preset-stage-2": "^6.22.0",
"babel-register": "^6.22.0",
"chalk": "^1.1.3",
"connect-history-api-fallback": "^1.3.0",
"css-loader": "^0.28.11",
"eventsource-polyfill": "^0.9.6",
"express": "^4.14.1",
"extract-text-webpack-plugin": "^2.0.0",
"file-loader": "^0.11.1",
"friendly-errors-webpack-plugin": "^1.1.3",
"function-bind": "^1.1.0",
"html-webpack-plugin": "^2.28.0",
"http-proxy-middleware": "^0.17.3",
"less": "^3.9.0",
"less-loader": "^5.0.0",
"opn": "^4.0.2",
"ora": "^1.2.0",
"semver": "^5.3.0",
"shelljs": "^0.7.6",
"style-loader": "^0.23.1",
"url-loader": "^0.5.8",
"vue-loader": "^11.3.4",
"vue-style-loader": "^2.0.5",
"vue-template-compiler": "^2.2.6",
"webpack": "^2.3.3",
"webpack-bundle-analyzer": "^2.2.1",
"webpack-dev-middleware": "^1.10.0",
"webpack-hot-middleware": "^2.18.0",
"webpack-merge": "^4.1.0"
},
"engines": {
"node": ">= 4.0.0",
"npm": ">= 3.0.0"
},
"browserslist": [
"> 1%",
"last 2 versions",
"not ie <= 8"
]
}
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.picahealth</groupId>
<artifactId>ADMIN_CMS_FE</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>ADMIN_CMS_FE Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>ADMIN_CMS_FE</finalName>
</build>
</project>
<template>
<div id="app">
<router-view></router-view>
</div>
</template>
<style>
@import "../static/css/main.css";
@import "../static/css/color-dark.css"; /*深色主题*/
/*@import "../static/css/theme-green/color-green.css"; 浅绿色主题*/
@import "../src/css/common.css"; /*公用css*/
</style>
import fetch from '../common/fetch'
import Vue from 'vue';
const menu = {
headList(data,self){
// return fetch(localStorage.getItem("msUrl")+'login/header', data, 'POST','fetch')
// return Vue.$axios.post(localStorage.getItem("msUrl")+'login/header',data)
let headers = {
headers: {
'token': localStorage.getItem('token') || null
// header('Access-Control-Allow-Origin:*')
}
};
return self.$axios.post(localStorage.getItem("msUrl")+'login/header', data, headers)
},
/* menuList(data,self){
return self.$axios.post(localStorage.getItem("msUrl") + 'login/menu/list', data, headers)
},*/
forwardPage(data,self){
// return fetch(localStorage.getItem("msUrl")+'login/forward_page', data, 'POST','fetch')
let headers = {
headers: {
'token': localStorage.getItem('token') || null
// header('Access-Control-Allow-Origin:*')
}
};
return self.$axios.post(localStorage.getItem("msUrl")+'login/forward_page', data, headers)
},
removeToken(data,self){
let headers = {
headers: {
'token': localStorage.getItem('token') || null
// header('Access-Control-Allow-Origin:*')
}
};
return self.$axios.post(localStorage.getItem("msUrl")+'login/log_out', data, headers)
}
}
export default menu
import fetch from '../common/fetch'
let headers = {
headers: {
'token': localStorage.getItem('token') || null
}
};
const resource = {
resourceList(data,self){
// return fetch(localStorage.getItem("msUrl")+'admin/resources/list', data, 'POST','fetch')
return self.$axios.post(localStorage.getItem("msUrl")+'admin/resources/list', data, headers)
},
delResource(id,data,self){
// return fetch(localStorage.getItem("msUrl")+`admin/resources/${id}`, data, 'delete','fetch')
return self.$axios.delete(localStorage.getItem("msUrl")+`admin/resources/${id}`, data)
},
saveResource(data,self){
return self.$axios.post(localStorage.getItem("msUrl")+`admin/resources/upload`, data, headers)
},
savePersistent(data,self){
return self.$axios.post(localStorage.getItem("msUrl")+`admin/qiniu/persistent`, data, headers)
},
checkFileName(data,self){
return self.$axios.post(localStorage.getItem("msUrl")+`admin/resources/filecheck`, data, headers)
},
updateName(data,self){
return self.$axios.post(localStorage.getItem("msUrl")+`admin/resources/updateName`, data, headers)
},
queryList(data,self){
return self.$axios.post(localStorage.getItem("msUrl")+`admin/roster/queryList`, data, headers)
},
selectUser(data,self){
return self.$axios.get(localStorage.getItem("msUrl")+`admin/roster/selectUser`, data, headers)
},
selectRosterById(data,self){
return self.$axios.get(localStorage.getItem("msUrl")+`admin/roster/selectRosterById?id=${data.id}`, data, headers)
},
insertOrUpdate(data,self){
return self.$axios.post(localStorage.getItem("msUrl")+`admin/roster/insertOrUpdate`, data, headers)
},
upperOrLowerShip(data,self){
return self.$axios.get(localStorage.getItem("msUrl")+`admin/roster/upperOrLowerShip?id=${data.id}&status=${data.status}`, data, headers)
},
clearData(data,self){
return self.$axios.get(localStorage.getItem("msUrl")+`admin/roster/clearData?id=${data.id}`, data, headers)
},
}
export default resource
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1558579521535" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1131" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M512 1255.489906" p-id="1132" fill="#8a8a8a"></path><path d="M718.519288 688.227064 543.827304 513.637418l174.180292-174.180292c8.801119-8.801119 8.801119-23.128523 0-31.827304-8.801119-8.801119-23.128523-8.801119-31.827304 0L512 481.810114 337.819708 307.629822c-8.801119-8.801119-23.230861-8.596442-31.929642 0.102339l0.102339-0.102339c-8.801119 8.801119-8.698781 23.026184 0.102339 31.827304l174.180292 174.180292L305.58305 688.227064c-8.801119 8.801119-8.801119 23.128523 0 31.827304 8.801119 8.801119 23.128523 8.801119 31.827304 0L512 545.464721 686.691985 720.054367c8.801119 8.801119 22.923846 8.903458 31.724965 0.102339l0.102339-0.102339C727.218069 711.355587 727.218069 697.028183 718.519288 688.227064z" p-id="1133" fill="#8a8a8a"></path></svg>
\ No newline at end of file
/**
* 微服务返回code定义
* */
const getResponseEnum = () => {
const respMessage = new Map();
respMessage.set("000000", "成功");
respMessage.set("100001", "参数无效");
respMessage.set("100002", "参数为空");
respMessage.set("100003", "参数类型错误");
respMessage.set("100004", "参数缺失");
respMessage.set("200001", "短信发送失败");
respMessage.set("200002", "微信推送失败");
respMessage.set("200003", "APP推送失败");
respMessage.set("200004", "医生信息不存在");
respMessage.set("200005", "定时时间已过!");
respMessage.set("200006", "请先登录");
respMessage.set("200007", "模板编码错误!");
respMessage.set("300000", "token为空!");
respMessage.set("300001", "系统繁忙,请稍后重试");
respMessage.set("300002", "系统错误");
respMessage.set("400001", "数据未找到");
respMessage.set("400002", "数据有误");
respMessage.set("400003", "数据已经存在");
respMessage.set("400004", "数据异常");
respMessage.set("500001", "接口调用异常");
respMessage.set("500002", "接口禁止访问");
respMessage.set("500003", "接口地址无效");
respMessage.set("500004", "接口请求超时");
respMessage.set("600001", "访问权限不足");
respMessage.set("201550", "登录失效,请重新登录!");
respMessage.set("201551", "该资源已被关联使用,无法删除");
return respMessage;
};
export const ResponseEnum = getResponseEnum();
export const RECOMMEND_IMG_UPLOAD_WIDTH = 690;
export const MEDICINE_IMG_UPLOAD_WIDTH = 600;
export const MEDICINE_IMG_UPLOAD_HEIGHT = 138;
import {isNotEmptyUtils} from "./utils";
import Vue from 'vue';
/**
* 配置编译环境和线上环境之间的切换
*/
const getTestEnv = (ipAddress) => {
let environments = ["uat", "test3", "test2", "test1", "dev"];
for (let i = 0; i < environments.length; i++) {
if (ipAddress.indexOf(environments[i]) > -1) {
return environments[i];
}
}
return null;
};
//获取服务器路径
export const getAddress = () => {
let ipAddress = "https://" + window.location.host;
// let ipAddress = "http://localhost:8099";
let env = getTestEnv(ipAddress);
let preViewUrl = ""
let qiniuImgUrl = "";
let qiniuFileUrl = '';
let resource_url = "";
let exam_url = "";
let locationHost = "";//模板文件路径
let stsUrl = "";//sts服务器//获取OSS客户端
let bucketName = "";
let endpoint = "";
let Url = "";//访问后台的域名
let msUrl = "";//Micro service url
let liveUrl = "";//Micro service url
let lectureUrl = '';
let ossLogin = "";//内部系统登录页面
let template_url = "";//题库模板服务器
let kfUrl="";//暂时代替微服务,提供 市区县医院 常量 部门 职称 的服务
let qiniuUrl = "";//qiniu验证服务器
let qiniuResourceUrl = "";//qiniu存储域名
//本地
if (ipAddress.indexOf("localhost") > -1 || ipAddress.indexOf("127.0.0.1") > -1 || ipAddress.indexOf("test-kf") > -1) {
ipAddress = "http://localhost:7070";
preViewUrl = "http://localhost:9090/#/template";
qiniuImgUrl = "https://test1-file.yunqueyi.com";
resource_url = "https://test-file.yunqueyi.com";
exam_url = "https://test1-sc.yunqueyi.com/exams";
locationHost = "http://test-kf.yunqueyi.com";
stsUrl = "http://dev-api.yunqueyi.com/middle/oss/token";//sts服务器
bucketName = "pica-test-huabei2";
endpoint = "oss-cn-beijing.aliyuncs.com";
Url = ipAddress + "/ADMIN_CMS_FE/rest/";
//msUrl = "http://10.177.15.117:10201" + "/contents/";
// msUrl = "http://10.177.15.154:10203" + "/contents/";
msUrl = "http://dev-sc.yunqueyi.com" + "/contents/";
lectureUrl = "https://dev-sc.yunqueyi.com"
liveUrl = "https://dev-sc.yunqueyi.com/campaign/";
kfUrl = "http://test1-kf.yunqueyi.com" + "/api/";
ossLogin = "http://localhost:8090/PICA_SSO_FE/html/pica_login.html";
template_url = ipAddress
// qiniuUrl = "http://10.177.15.154:10203/contents/admin/qiniu/token"; //不再使用middle服务获取七牛token
qiniuUrl = "https://dev-sc.yunqueyi.com/contents/admin/qiniu/token";
// qiniuFileUrl = "http://10.177.15.154:10203/contents/admin/qiniu/token1";
qiniuFileUrl = "http://dev-sc.yunqueyi.com/contents/admin/qiniu/token1";
qiniuResourceUrl = "https://test1-videos.yunqueyi.com";
} else if (isNotEmptyUtils(env)) {//测试test1 test2 uat
preViewUrl = "https://" + env + "-phome.yunqueyi.com" + "/template/#/template"
qiniuFileUrl = "https://" + env + "-sc.yunqueyi.com" + "/contents/admin/qiniu/token1";
qiniuImgUrl = "https://test1-file.yunqueyi.com";
resource_url = "https://test-file.yunqueyi.com";
locationHost = "https://" + env + "-admin-md.yunqueyi.com";
exam_url = "https://" + env + "-sc.yunqueyi.com/exams";
stsUrl = "https://" + env + "-api.yunqueyi.com/middle/oss/token";//sts服务器
bucketName = "pica-test-huabei2";
endpoint = "oss-cn-beijing.aliyuncs.com";
Url = ipAddress + "/api/";
kfUrl = "https://" + env + "-kf.yunqueyi.com" + "/api/";
msUrl = "https://" + env + "-sc.yunqueyi.com" + "/contents/";
liveUrl = "https://" + env + "-sc.yunqueyi.com" + "/campaign/";
lectureUrl = "https://" + env + "-sc.yunqueyi.com"
ossLogin = "https://" + env + ".yunqueyi.com";
template_url = "https://" + env + "-project.yunqueyi.com";
qiniuUrl = "https://" + env + "-sc.yunqueyi.com" + "/contents/admin/qiniu/token";
qiniuResourceUrl = "https://test1-videos.yunqueyi.com";
/*
* uat做特殊处理(图片等文件)
* uat图片使用生产的,因为DB数据从生产同步下来的,web,app端使用的都是生产的图片路径
* 所以admin上传也上传到生产
* */
if (env === "uat") {
// qiniuImgUrl = "https://files.yunqueyi.com";//qiniu存储域名
resource_url = "https://file.yunqueyi.com";
bucketName = "pica-pro";
endpoint = "oss-cn-shanghai.aliyuncs.com";
// qiniuResourceUrl = "https://video.yunqueyi.com";//qiniu存储域名
exam_url = "https://" + env + "-sc.yunqueyi.com/exams";
lectureUrl = "https://" + env + "-sc.yunqueyi.com"
}
} else {//生产环境
preViewUrl = "https://phome.yunqueyi.com" + "/template/#/template"
qiniuFileUrl = "https://sc.yunqueyi.com" + "/contents/admin/qiniu/token1";
qiniuImgUrl = "https://files.yunqueyi.com";//qiniu存储域名
resource_url = "https://file.yunqueyi.com";
locationHost = ipAddress;
stsUrl = "https://api.yunqueyi.com/middle/oss/token";//sts服务器
bucketName = "pica-pro";
endpoint = "oss-cn-shanghai.aliyuncs.com";
Url = ipAddress + "/api/";
msUrl = "https://sc.yunqueyi.com" + "/contents/";
liveUrl = "https://sc.yunqueyi.com" + "/campaign/";
lectureUrl = "https://sc.yunqueyi.com"
kfUrl = "https://kf.yunqueyi.com" + "/api/";
ossLogin = "https://sso.yunqueyi.com";
template_url = "https://project.yunqueyi.com";
qiniuUrl = "https://sc.yunqueyi.com" + "/contents/admin/qiniu/token";
qiniuResourceUrl = "https://video.yunqueyi.com";//qiniu存储域名
exam_url = "https://sc.yunqueyi.com/exams";
}
localStorage.setItem("preViewUrl",preViewUrl);
localStorage.setItem("qiniuFileUrl", qiniuFileUrl);
localStorage.setItem("qiniuImgUrl", qiniuImgUrl);
localStorage.setItem("resource_url", resource_url);
localStorage.setItem("locationHost", locationHost);
localStorage.setItem("Url", Url);
localStorage.setItem("msUrl", msUrl);
localStorage.setItem("liveUrl", liveUrl);
localStorage.setItem("lectureUrl", lectureUrl);
localStorage.setItem("kfUrl", kfUrl);
localStorage.setItem("examUrl", exam_url);
localStorage.setItem("stsUrl", stsUrl);//sts服务器
localStorage.setItem("bucketName", bucketName);//oss
localStorage.setItem("endpoint", endpoint);//oss
localStorage.setItem("ossLogin", ossLogin);//内部系统登录页面
localStorage.setItem("template_url", template_url);
localStorage.setItem("qiniuUrl", qiniuUrl);//qiniu验证服务器
localStorage.setItem("qiniuResourceUrl", qiniuResourceUrl);//qiniu存储域名
localStorage.setItem("sysCode", '3');//admin_cms系统编号
localStorage.setItem("deviceInfo", "{\"app_channel\":\"\",\"app_mac\":\"\",\"app_uuid\":\"\",\"app_version\":\"\",\"device_brand\":\"\",\"device_ip\":\"\",\"device_model\":\"\",\"device_net\":\"\",\"device_ops\":\"\",\"resolution_wh\":\"\",\"system_level\":\"\"}");//deviceInfo
};
export const loadCommonFilter = () => {
/**
* 常量过滤器
* @name constantFilter
* @description:用于将[no:枚举值]转换成[value:枚举名称]
* @param {Number} [input] 要过滤的对象
* @param {Array} [enumList] 常量列表
*/
Vue.filter('constantFilter', function (input, enumList) {
let hash = {};
if (enumList != null && enumList.length > 0) {
for (let i = 0; i < enumList.length; i++) {
hash[enumList[i].no] = enumList[i].value;
}
}
if (!input) {
return '';
} else {
return hash[input];
}
});
};
//api路径
import {isNotEmptyUtils} from "./utils";
export default async(url = '', data = {}, type = 'POST', method = 'fetch',server='CONTENT') => {
type = type.toUpperCase();
// url = (server==='WECHAT'?wechatUrl:baseUrl) + url;
if (url.match("^http") == null){
url = localStorage.getItem("Url") + url;
}
console.log("完整url:",url)
if (type == 'GET' && data) {
let dataStr = ''; //数据拼接字符串
Object.keys(data).forEach(key => {
dataStr += key + '=' + data[key] + '&';
})
if (dataStr !== '') {
dataStr = dataStr.substr(0, dataStr.lastIndexOf('&'));
url = url + '?' + dataStr;
// url = encodeURI(url + '?' + dataStr, true);
}
}
if (window.fetch && method == 'fetch') {
let requestConfig = {
credentials: 'include',
method: type,
// mode: "cors",
headers: {
// 'Access-Control-Allow-Origin': '*',
'Accept': '*',
'Content-Type': 'application/json',
// 'token': localStorage.getItem('token') || null, //固定传header:
// 'system_code': 'todo' //固定传header:系统编号
},
}
if (type == 'POST' || type === 'PUT' || type === 'PATCH' || type === 'DELETE' && data) {
Object.defineProperty(requestConfig, 'body', {
value: JSON.stringify(data)
})
}
try {
const response = await fetch(url, requestConfig);
const responseJson = await response.json();
return responseJson
} catch (error) {
throw new Error(error)
}
} else {
return new Promise((resolve, reject) => {
let requestObj;
if (window.XMLHttpRequest) {
requestObj = new XMLHttpRequest();
} else {
requestObj = new ActiveXObject;
}
let sendData = '';
if (type == 'POST' || type == 'DELETE' || type == 'PUT') {
sendData = JSON.stringify(data);
}
requestObj.open(type, url, true);
requestObj.setRequestHeader("Content-Type", "application/json");
requestObj.send(sendData);
requestObj.onreadystatechange = () => {
if (requestObj.readyState == 4) {
if (requestObj.status == 200) {
let obj = requestObj.response
if (typeof obj !== 'object' && isNotEmptyUtils(obj)) {
obj = JSON.parse(obj);
}
resolve(obj)
} else {
reject(requestObj)
}
}
}
})
}
}
//api路径
import {isNotEmptyUtils} from "./utils";
export default async(url = '', data = {}, type = 'POST', method = 'fetch',server='CONTENT') => {
type = type.toUpperCase();
// url = (server==='WECHAT'?wechatUrl:baseUrl) + url;
if (url.match("^http") == null){
url = localStorage.getItem("Url") + url;
}
console.log("完整url:",url)
if (type == 'GET' && data) {
let dataStr = ''; //数据拼接字符串
Object.keys(data).forEach(key => {
dataStr += key + '=' + data[key] + '&';
})
if (dataStr !== '') {
dataStr = dataStr.substr(0, dataStr.lastIndexOf('&'));
url = url + '?' + dataStr;
// url = encodeURI(url + '?' + dataStr, true);
}
}
if (window.fetch && method == 'fetch') {
let requestConfig = {
credentials: 'include',
method: type,
// mode: "cors",
headers: {
// 'Access-Control-Allow-Origin': '*',
'Accept': '*',
'Content-Type': 'application/json',
'sysCode':'2'
// 'token': localStorage.getItem('token') || null, //固定传header:
// 'system_code': 'todo' //固定传header:系统编号
},
}
if (type == 'POST' || type === 'PUT' || type === 'PATCH' || type === 'DELETE' && data) {
Object.defineProperty(requestConfig, 'body', {
value: JSON.stringify(data)
})
}
try {
const response = await fetch(url, requestConfig);
const responseJson = await response.json();
return responseJson
} catch (error) {
throw new Error(error)
}
} else {
return new Promise((resolve, reject) => {
let requestObj;
if (window.XMLHttpRequest) {
requestObj = new XMLHttpRequest();
} else {
requestObj = new ActiveXObject;
}
let sendData = '';
if (type == 'POST' || type == 'DELETE' || type == 'PUT') {
sendData = JSON.stringify(data);
}
requestObj.open(type, url, true);
requestObj.setRequestHeader("Content-Type", "application/json");
requestObj.send(sendData);
requestObj.onreadystatechange = () => {
if (requestObj.readyState == 4) {
if (requestObj.status == 200) {
let obj = requestObj.response
if (typeof obj !== 'object' && isNotEmptyUtils(obj)) {
obj = JSON.parse(obj);
}
resolve(obj)
} else {
reject(requestObj)
}
}
}
})
}
}
const vueFilter = {
// 直播
liveDateFilter: (value) => {
if (!value) return '';
return new Date(value).format("yyyy-MM-dd hh:mm:ss");
},
liveFilter: (value) => {
if(value.liveStatus == 1){
return '未开始'
} else if(value.liveStatus == 5) {
return '直播中'
}else if(value.liveStatus == 10 && value.lookBackStatus == 2){
return '已结束(不可回看)'
}else if(value.liveStatus == 10 && value.lookBackStatus == 1) {
return '已结束(可回看)'
}
},
liveStatusFilter: (value) => {
if(value == 1) return "隐藏"
else return "发布"
},
liveTeacherType: (value) => {
let doctorName = []
if(value.length > 3) {
for(let i = 0; i < 3; i++) {
doctorName.push(value[i].doctorName)
}
return doctorName.join("、") + '...'
}else{
for(let i = 0; i < value.length; i++) {
doctorName.push(value[i].doctorName)
}
return doctorName.join("、")
}
},
// 积木
controlType: (value) => {
if(value == 1) {
return '分页1'
}else if(value == 2) {
return '分页2'
}else if(value == 3) {
return '图片1'
}else if(value == 4) {
return '图片2'
}else if(value == 6) {
return '视频'
}else if(value == 7) {
return '讨论'
}else if(value == 8) {
return '资格校验'
}else if(value == 11) {
return '活动模板'
}
},
tabControlType: (value) => {
if(value == 3) {
return '图片1'
}else if(value == 4) {
return '图片2'
}else if(value == 6) {
return '视频'
}else if(value == 7) {
return '讨论'
}else if(value == 8) {
return '资格校验'
}else if(value == 11) {
return '活动模板'
}
},
refreshType: (value) => {
if(value == 1) return "支持"
else return "不支持"
},
moudleType: (value) => {
if(value == 1) return "未激活"
else return "激活"
},
dateFilter: (value) => {
if (!value) return '';
return new Date(value).format("yyyy-MM-dd hh:mm");
},
templateFilter: (value) => {
if(value == 1) return '任务';
},
continueTimeFilter: (value) => {
if(value.endTime) {
return value.beginTimeStr + '-' + value.endTimeStr;
}else {
return value.beginTimeStr;
}
},
taskActivityStatus: (value) => {
if(value.isDisabled == 2) {
return '禁用'
}else {
if(value.status == 1) {
return '进行中';
}else {
return '未进行';
}
}
},
// 栏位
appColumnStatusFilter: (value) => {
if(value == 1) return "未提交"
else if(value == 4) return "已提交"
},
appContentStatusFilter: (value) => {
if(value == 1) return "未提交"
else if(value == 2) return "已提交"
},
statusFilter: (value) => {
if(value == 1) return "已创建"
else if(value == 5) return "已发布"
else return "已下架"
},
linkTypeFilter: (value) => { // 跳转类型
if(value == 1) return '链接'
else if(value == 4) return '模块'
else return '无跳转'
},
teacherStatusFilter: (value) => {
if(value == 1) return "已下架"
else return "已发布"
},
moduleTypeFilter: (value,data) => { // 模块类型
for(let key in data) {
if(value == key) {
return data[key]
}
}
},
contentCreatedType: (value,data) => {
let userName = ''
for(let i=0; i < data.length;i++) {
if(value == data[i].id) {
userName = data[i].name
break
}else {
userName = ''
}
}
return userName
},
contentModifiedType: (value,data) => {
let userName = ''
for(let i=0; i < data.length;i++) {
if(value == data[i].id) {
userName = data[i].name
break
}else {
userName = ''
}
}
return userName
},
columnPageType: (value,data) => { // 页面类型
for(let key in data) {
if(value == key) {
return data[key]
}
}
},
columnPositionType: (value,data) => { // 位置
for(let key in data) {
if(value == key) {
return data[key]
}
}
},
columnCreatedType: (value,data) => { // 创建人
// let _index = data.findIndex((_value,index,arr) => {
// return value == _value.id
// })
// return data[_index].name
let userName = ''
for(let i=0; i < data.length;i++) {
if(value == data[i].id) {
userName = data[i].name
break
}else {
userName = ''
}
}
return userName
},
columnSubmitedType: (value,data) => { // 提交人
// let _index = data.findIndex((_value,index,arr) => {
// return value == _value.id
// })
// return data[_index].name
let userName = ''
for(let i=0; i < data.length;i++) {
if(value == data[i].id) {
userName = data[i].name
break
}else {
userName = ''
}
}
return userName
},
liveIdFilter: (value,data) => { // 直播名称
let _index = data.findIndex((_value,index,arr) => {
return value == _value.id
})
return data[_index].name
},
managerFilter: (value) => {
if(value == 1) {
return '普通用户'
}else if(value == 2) {
return '讲师本人'
}else if(value == 3) {
return '管理员'
}else {
return '白名单'
}
},
sortStatuFilter: (value) => {
if(value == true) return '已发布'
else return '未发布'
},
courseTypeFilter: (value) => {
if(value == 1) {
return '入门'
} else if(value == 2) {
return '中级'
} else if(value == 3) {
return '高级'
}
},
nameManageStatus: (value) => {
if(value == 1) {
return '未发布';
}else {
return '已发布'
}
},
dateFormat: (value) => {
if (!value) return '';
return new Date(value).format("yyyy-MM-dd hh:mm:ss");
},
getVersion: (value) => {
let version = value.appVersion;
if(value.range == 1) {
version += '及以上'
} else if(value.range == 2) {
version += '及以下'
}
return version
},
}
export default vueFilter
\ No newline at end of file
import { isEmptyUtils, openLoading, closeLoading } from './utils'
import { doUpload, getFilePath } from "./qiniuUtil"
/**
* 活动模板公共上传图片及其尺寸限制
* @param {*} file
* @param {*} vm
* @param {*} pageWidth
*/
export function commonUploadImg(file,vm,pageWidth) {
return new Promise(function (resolve, reject) {
let isLtSize = ''
if( file.type === 'image/gif') {
isLtSize = file.size / 1024 < 300
}else if( file.type === 'image/jpeg' || file.type === 'image/png'){
isLtSize = file.size / 1024 < 100
}
if(!isLtSize) {
vm.$message.error('上传图片过大')
return;
}
let imgWidth = parseInt(parseInt(pageWidth)/(vm.editTabOrImgForm.length))
var _img = new FileReader()
_img.readAsDataURL(file)
_img.onload = function(theFile) {
let image = new Image()
image.src = theFile.target.result
image.onload = function() {
let _this = this
if(_this.width != imgWidth) {
vm.$message.info('上传图片宽度不合适,请重新上传')
}else {
vm.$message.info('开始上传');
openLoading(vm)
doUpload(vm,file, getFilePath(file,null), 'preview4', 'progress1', 1).then(function (path) {
closeLoading(vm)
resolve(path)
});
}
}
}
})
}
/**
* 栏位上传图片
* @param {*} file
* @param {*} vm
*/
export function columnCommonUploadImg(file,vm) {
if (isEmptyUtils(file)) {
return;
}
const isJPG = file.type === 'image/jpeg'
const isPNG = file.type === 'image/png'
const isGIF = file.type === 'image/gif'
const isLt100kb = file.size / 1024 < 100
if (!isLt100kb) {
vm.$message.error('上传图片大小不能超过 100kb')
return;
}
if (!isJPG && !isPNG && !isGIF) {
vm.$message.error('上传头像图片只能是 JPG、png、gif格式!')
return;
}
for(let i = 0;i < vm.tabContent.length; i++) {
if(vm.imgIndex == i) {
vm.imgWidth = vm.tabContent[i].contentResourceField.width
vm.imgHeight = vm.tabContent[i].contentResourceField.height
var _img = new FileReader()
_img.readAsDataURL(file)
_img.onload = function(theFile) {
let image = new Image()
image.src = theFile.target.result
image.onload = function() {
let _this = this
if(_this.width != vm.imgWidth || _this.height != vm.imgHeight) {
vm.$message.info("上传图片尺寸大小不合适,请重新上传")
}else {
vm.doUpload(file) //上传图片
}
}
}
break
}
}
}
// 字符长度的校验
export function getStrCodeNum(str) {
if(!/^[\u0391-\uFFE5A-Za-z]+$/.test(str)) {
return false
}
let num = 0
for(let i=0;i<str.length;i++) {
if(str.charCodeAt(i) >= 1000) {
num = num + 2
}else{
num = num + 1
}
}
if( num > 30) {
return false
}
return true
}
\ No newline at end of file
import {isEmptyUtils, isNotEmptyUtils, subString} from "./utils";
import fetch from './fetch.js';
/**
* OSS工具类
*/
// let OSS = require('ali-oss');
// 文件扩展名(图片以外的文件如果需要下载,需要在此处添加文件扩展名)
let contentTypeMap = new Map();
contentTypeMap.set("xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-excel");
// PICA_DEV_APP.service('ossUtil', function ($rootScope, $q) {
//获取OSS客户端
let bucketName = localStorage.getItem("bucketName");
let endpoint = localStorage.getItem("endpoint");
// //上传状态
// let status = false;
//
// /**
// * 文件上传状态
// * */
// export const isUpload = () => {
// return status;
// };
/**
* 获取OSS客户端对象
*
* @return {Object} client OSS客户端对象
* */
const doOSSAction = () => {
//sts服务器
let stsUrl = localStorage.getItem("stsUrl") + "/" + localStorage.getItem("token");
return new Promise(function (resolve, reject) {
fetch(stsUrl, {}, 'GET').then(function (result) {
let client = null;
if (isNotEmptyUtils(result) && result.StatusCode == "200") {
//获取client对象
client = new OSS.Wrapper({
accessKeyId: result.AccessKeyId,
accessKeySecret: result.AccessKeySecret,
stsToken: result.SecurityToken,
endpoint: endpoint,
bucket: bucketName
});
resolve(client);
console.log('STS临时授权成功');
} else {
reject(result);
console.error('STS临时授权失败:', result);
}
}).catch(function (error) {
reject();
console.error('STS临时授权失败:', error);
});
});
};
/**
* 获取OSS上的文件路径
*
* @param {String} [filePath] 文件路径
* @return {String} address 网络路径(默认有效时间半个小时)
* */
export const downloadOSSFile = (filePath) => {
let deferred = $q.defer();
if (isEmptyUtils(filePath)) {
return null;
}
let suffix = filePath.substring(filePath.lastIndexOf(".") + 1);
// return client.signatureUrl(filePath);
//默认下载图片
let content_type = "image/png";
if (isNotEmptyUtils(suffix) && contentTypeMap.has(suffix)) {
content_type = contentTypeMap.get(suffix);
}
doOSSAction().then(function (client) {
let address = client.signatureUrl(filePath, {
expires: 1800,
response: {
'content-type': content_type,
'content-disposition': 'attachment'
}
});
deferred.resolve(address);
}
);
return deferred.promise;
};
/**
* 文件重命名
* @param {File} [file] 上传文件对象
* @param {String} [fileName] 指定文件名
* @param {String} [folder] 指定文件夹
* @return {String} fileName
*/
export const getFilePath = (file, fileName, folder) => {
if (isEmptyUtils(file)) {
return null;
}
//文件类型
let ext = file.type;
//后缀名
let suffix = file.name.substring(file.name.lastIndexOf(".") + 1);
//若为空则从name中获取---对wps格式的文件获取不到file.type
if (isEmptyUtils(ext)) {
ext = suffix;
}
//获取当前日期对象
let date = new Date();
if (isEmptyUtils(fileName)) {
//重命名后的文件名
fileName = timeStamp(date) + "-" + subString(guid(), 8) + "." + suffix;
}
//文件全路径(文件路径 + 文件名) 扩展名​/年/月/日/
let filePath = ext + "/" + date.format('yyyy/MM/dd') + "/" + (isEmptyUtils(folder) ? "" : (folder + "/")) + fileName;
console.log(filePath);
return filePath;
};
/**
* oss上传
*
* @param {Vue} [self] vue实例
* @param {File} [file] 上传文件对象
* @param {String} [filePath] 文件全路径(文件路径 + 文件名)
* @param {String} [previewId] 显示图片的元素Id
* @param {String} [progressId] 显示上传进度的进度条id
* @param {Object} [imageAction] 图片操作
* @return {Promise} [dbFilePath] 存到数据库的文件路径
* */
export const ossUpload = (self, file, filePath, previewId, progressId, imageAction) => {
return new Promise(function (resolve, reject) {
if (isEmptyUtils(file) || isEmptyUtils(filePath)) {
console.error('OSS上传失败:非法参数');
reject();
}
//修改状态为上传
self.uploadStatus = true;
doOSSAction().then(function (client) {
//分片上传
client.multipartUpload(filePath, file, {
progress: function* (p) {
//获取百分比进度
self.uploadProgress = getPercentage(p, 2);
if (p == 1) {
//修改状态为非上传
self.uploadStatus = false;
}
console.log('uploadProgress: ' + self.uploadProgress);
},
headers: {
'Access-Control-Allow-Origin': '*'
}
}).then(function (r1) {
resolve('/' + filePath);
//修改状态为非上传
self.uploadStatus = false;
console.log('上传成功', r1);
// let address = getOSSFilePath(filePath, imageAction);
// //显示图片
// if (isNotEmptyUtils(previewId) && isNotEmptyUtils(address)) {
// console.log('图片路径: ' + address);
//
// let $img = $('<img>').attr("src", address);
// let obj = $("#" + previewId);
// obj.empty().append($img);
// obj.css('max-width', '100%');
// }
}).catch(function (err) {
reject(err);
//修改状态为非上传
self.uploadStatus = false;
console.error('OSS上传失败:', err);
// modalClick("提示", "上传失败!", "确定", function () {
// $('#model-modify').modal('hide');
// }, "", null);
});
}
);
});
};
/**
* OSS获取图片的参数模型
*
* @return {Object} [imageAction] 图片的参数模型
* */
export const getImageAction = () => {
return {
'resize': {
'width': null,
'height': null
},
'rotate': {
'angle': null //角度
}
};
};
//OSS获取图片的参数模型,转换为url路径参数
let imageActionParam = function (action) {
//有参数为true
let haveParamFlag = false;
let param = [];
if (isNotEmptyUtils(action)) {
// 缩放
if (isNotEmptyUtils(action.resize)) {
let width = isNotEmptyUtils(action.resize.width) ? ("w_" + action.resize.width) : null;
let height = isNotEmptyUtils(action.resize.height) ? ("h_" + action.resize.height) : null;
if (isNotEmptyUtils(width) || isNotEmptyUtils(height)) {
let resize = [];
if (isNotEmptyUtils(width)) {
resize.push(width);
}
if (isNotEmptyUtils(height)) {
resize.push(height);
}
param.push(['resize', resize]);
haveParamFlag = true;
}
}
//旋转
if (isNotEmptyUtils(action.rotate)) {
if (isNotEmptyUtils(action.rotate.angle)) {
param.push(['rotate', [action.rotate.angle]]);
haveParamFlag = true;
}
}
}
//如果有参数
if (haveParamFlag) {
let ParamStr = "?x-oss-process=image";
let paramMap = new Map(param);
//Map的回调函数参数依次为value、key和map本身:
paramMap.forEach(function (value, key, map) {
ParamStr = ParamStr + '/' + key;
for (let i = 0; i < value.length; i++) {
ParamStr = ParamStr + ',' + value[i];
}
});
return ParamStr;
}
return null;
};
/**
* 获取OSS上的文件路径
*
* @param {String} [filePath] 文件路径
* @param {String} [param] 参数字符串
* @return {String} address 网络路径
* */
export const getOSSFilePath = (filePath, param) => {
if (isEmptyUtils(filePath)) {
return null;
}
let paramStr = imageActionParam(param);
// http://bucket.<endpoint>/object?x-oss-process=image/action,parame_value
let str = "http://" + bucketName + "." + endpoint + "/" + filePath;
return isNotEmptyUtils(paramStr) ? (str + paramStr) : str;
};
// });
/**
* 获取全局唯一标识符(GUID,Globally Unique Identifier)
* @return {String} guid
*/
const guid = () => {
/**
* @return {String}
*/
function S4() {
return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
}
return (S4() + S4() + "-" + S4() + "-" + S4() + "-" + S4() + "-" + S4() + S4() + S4());
};
/**
* 获取时间戳
* @param {Date} [date]日期对象,为空时,返回当前时间戳
* @return {String} timeStamp时间戳 格式:yyyyMMddhhmmssS
*/
const timeStamp = (date) => {
if (isEmptyUtils(date)) {
return new Date().format('yyyyMMddhhmmssS');
}
return date.format('yyyyMMddhhmmssS');
}
/**
* 保留precision位小数(四舍五入)后百分比显示
* @param {Number} [input] 要四舍五入的对象
* @param {Number} [precision] 要保留的小数位(默认2位)
* @return {Number} 例如:98.22
*/
const getPercentage = (input, precision) => {
if (isEmptyUtils(input)) {
return 0;
}
return Number((input * 100).toFixed(isEmptyUtils(precision) ? 2 : precision));
};
/**
* 从dataURL获取文件对象
*
* @param {String} [dataurl] 文件路径
* @param {String} [filename] 参数字符串
* @return {File} file 文件
* */
const dataURLtoFile = (dataurl, filename) => {
let arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
return new File([u8arr], filename, {type: mime});
};
import fetch from './fetch.js';
export const positionService = {
isDirectProvince(province_id){
return province_id == 110 || province_id == 120 || province_id == 310 || province_id == 500;
},
townButtonDisable(province_id){
if(this.isDirectProvince(province_id)) {
return true;
}else {
return false;
}
},
//获取省分
getProvinceList() {
let num = {token: localStorage.getItem("token")};
let promise = fetch(localStorage.getItem("kfUrl") + "PICAPositionServiceImpl/getProvinceList",
num,
'POST'
);
return promise;
},
//获取省分(区域权限)
getProvinceByRegionRole(){
let promise = new Promise(function(resolve, reject) {
var num = {token: localStorage.getItem("token")};
let ret = fetch(localStorage.getItem("kfUrl") + 'PICAPositionServiceImpl/getProvinceList', num);
ret.then(function (data) {
let provinceListTemp = Object.assign({},data.provinceList);
let provinceListData = new Array();
//有区域权限时
if (region_role != null && region_role != "") {
var regionRoles = region_role.split(',');
for (var j = 0; j < regionRoles.length; j++) {
for (var i = 0; i < provinceListTemp.length; i++) {
if (regionRoles[j] == provinceListTemp[i].province_id) {
provinceListData.push(provinceListTemp[i]);
break;
}
}
}
} else {
//没有限制时,放入全部
provinceListData = provinceListTemp;
}
resolve(provinceListData);
},function (fail) {
reject();
})
});
return promise;
},
// 获取市
getCityListData (province_id,success, error, otherOptions) {
var num = {
province_id : province_id
}
let promise = fetch(localStorage.getItem("kfUrl") + "PICAPositionServiceImpl/getCityList", num);
return promise;
},
getCountyListData(city_id,success, error, otherOptions) {
var num = {
city_id : city_id
}
let promise = fetch(localStorage.getItem("kfUrl") + "PICAPositionServiceImpl/getCountyList", num);
return promise;
},
//获取乡镇
getTownListData(county_id,success) {
var num = {
county_id : county_id
}
let promise = fetch(localStorage.getItem("kfUrl") + "PICAPositionServiceImpl/getTownList", num);
return promise;
},
// 获取医生集合 type为3表示3级医院 4表示4级医院 5表示5级医院
getHospitalListData(county_id, town_id, rank) {
var num = {
county_id : county_id,
town_id : town_id,
rank : rank
}
let promise = fetch(localStorage.getItem("kfUrl") + "PICAAddressHospitalServiceImpl/postHospitalListByRank", num);
return promise;
}
}
import {isEmptyUtils, isNotEmptyUtils, subString} from "./utils";
import fetch from './fetch.js';
import fetchQiniu from './fetchQiniu.js';
// let apiUrl = localStorage.getItem("qiniuUrl") + "/" + localStorage.getItem("token");
// let apiUrl = localStorage.getItem("qiniuUrl");
let apiUrl = localStorage.getItem("qiniuUrl");
let fileApiUrl = localStorage.getItem("qiniuFileUrl");
//该对象有一个 unsubscribe 方法取消订阅,同时终止上传行为。
let subscription = null;
//上传返回结果
let result = {
key: null,//文件保存在空间中的资源名
path: null,//保存到db的路径(不带域名)
fullPath: null,//文件网络路径(文件url)
size: null,//资源尺寸,单位为字节
name: null,//原始文件名
ext: null//上传资源的后缀名,通过自动检测的mimeType 或者原文件的后缀来获取
};
//上传状态
// var status = false;
//FIXME 请注意vue里面不要使用全局变量
let domain = localStorage.getItem("qiniuResourceUrl"); // 视频
let domain1 = localStorage.getItem("qiniuImgUrl"); // 图片
let errorCode = new Map([
[298,'部分操作执行成功'],
[400,'请求报文格式错误'],
[401,'认证授权失败'],
[403,'权限不足,拒绝访问。'],
[404,'资源不存在'],
[405,'请求方式错误'],
[406,'上传的数据 CRC32 校验错误'],
[413,'请求资源大小大于指定的最大值'],
[419,'用户账号被冻结'],
[478,'镜像回源失败'],
[502,'错误网关'],
[503,'服务端不可用'],
[504,'服务端操作超时'],
[573,'单个资源访问频率过高'],
[579,'上传成功但是回调失败'],
[599,'服务端操作失败'],
[608,'资源内容被修改'],
[612,'指定资源不存在或已被删除'],
[614,'目标资源已存在'],
[630,'已创建的空间数量达到上限,无法创建新空间。'],
[631,'指定空间不存在'],
[640,'调用列举资源(list)接口时,指定非法的marker参数。'],
[701,'在断点续上传过程中,后续上传接收地址不正确或ctx信息已过期。']
]);
let qiniuErrorCheck = function (code) {
errorCode.forEach(function (value, key, map) {
if (code === key){
console.error(key+':'+value)
}
})
}
//用来限制上传文件类型,为 null 时表示不对文件类型限制;限制类型放到数组里: ["image/png", "image/jpeg", "image/gif"]
let mimeTypeArray = null;
export const createFilePath = (file, fileName) => {
if (isEmptyUtils(file)) {
return null;
}
let arr = fileName.split('_');
if(arr.length != 4){
alert('上传视频文件名格式不正确');
return null;
}
let arr4 = arr[3].split('.');
//文件全路径(文件路径 + 文件名) 扩展名​/年/月/日/
let filePath = arr[0] + "/" + arr[1] + "/" + arr[2] + "_" + arr4[0] + '.'+arr4[1];
console.log(filePath);
return filePath;
};
export const getCreateFilePath = (fileName) => {
let arr = fileName.split('_');
console.log('arr',arr);
let arr4 = arr[3].split('.');
//文件全路径(文件路径 + 文件名) 扩展名​/年/月/日/
let filePath = arr[0] + "/" + arr[1] + "/" + arr[2] + "_" + arr4[0] + '.'+arr4[1];
return filePath;
};
/**
* 获取七牛上传凭证
*
* @return {Promise} token 七牛上传凭证
* */
const doQiniuAction = () => {
console.log('send---'+apiUrl);
return new Promise(function (resolve, reject) {
fetchQiniu(apiUrl,{}, 'GET').then(function (result) {
let token = null;
if (isNotEmptyUtils(result) && result.code == "000000") {
token = result.data.qiniuToken;
resolve(token);
console.log('七牛临时授权成功');
localStorage.setItem('qiniuToken',token);
} else {
reject(result);
console.error('七牛临时授权失败:', result);
}
}).catch(function (error) {
reject();
console.error('七牛临时授权失败:', error);
});
});
};
/**
* 获取七牛上传凭证
*
* @return {Promise} token 七牛上传凭证
* */
const doQiniuAction1 = (fileType) => {
console.log('send---'+fileApiUrl);
return new Promise(function (resolve, reject) {
// if(isEmptyUtils(localStorage.getItem('qiniuToken'))){
fetchQiniu(fileApiUrl, {"fileType": fileType}, 'GET').then(function (result) {
let token = null;
if (isNotEmptyUtils(result) && result.code == "000000") {
token = result.data.qiniuToken;
resolve(token);
console.log('七牛临时授权成功');
localStorage.setItem('qiniuToken',token);
} else {
reject(result);
console.error('七牛临时授权失败:', result);
}
}).catch(function (error) {
reject();
console.error('七牛临时授权失败:', error);
});
// }else{
// console.log('从localStorage获取token:'+localStorage.getItem('qiniuToken'))
// resolve(localStorage.getItem('qiniuToken'));
// }
});
};
/**
*
* @param self
* @param file
* @param filePath
* @param previewId
* @param progressId
* @returns {Promise}
*/
export const qiniuUpload = (self, file, filePath, previewId, progressId) => {
// var deferred = $q.defer();
return new Promise(function (resolve, reject) {
if (isEmptyUtils(file) || isEmptyUtils(filePath)) {
console.error('七牛上传失败:非法参数');
reject();
}
let key = filePath ? filePath : getFilePath(file);
//修改状态为上传
self.qiniuUploadStatus = true;
// let token = "BRVB4TpxVFA5Wo6lIpfltmWKOltzGar46tvC3BlR:UHn0LDElwjP4jEZTXdq_1qV6_hw=:eyJzY29wZSI6InBpY2EtdGVzdCIsInJldHVybkJvZHkiOiJ7XCJrZXlcIjpcIiQoa2V5KVwiLFwiaGFzaFwiOlwiJChldGFnKVwiLFwiYnVja2V0XCI6XCIkKGJ1Y2tldClcIixcImZzaXplXCI6JChmc2l6ZSksXCJmbmFtZVwiOiQoZm5hbWUpLFwiZXh0XCI6JChleHQpfSIsImRlYWRsaW5lIjoxNTI5NDk0MTc1fQ==";
doQiniuAction().then(function (token) {
let putExtra = {
fname: file.name, //原文件名
params: {}, //用来放置自定义变量
mimeType: mimeTypeArray || null //null || array,用来限制上传文件类型,为 null 时表示不对文件类型限制;限制类型放到数组里: ["image/png", "image/jpeg", "image/gif"]
};
let config = {
useCdnDomain: true, //表示是否使用 cdn 加速域名,为布尔值,true 表示使用,默认为 false。
region: null //选择上传域名区域;当为 null 或 undefined 时,自动分析上传域名区域
};
/*
* qiniu.upload 返回一个 observable 对象用来控制上传行为,observable 对像通过 subscribe 方法可以被 observer 所订阅,
* 订阅同时会开始触发上传,同时返回一个 subscription 对象,该对象有一个 unsubscribe 方法取消订阅,同时终止上传行为。
* */
let observable = qiniu.upload(file, key, token, putExtra, config);
/**
* 接收上传进度信息,res 参数是一个带有 total 字段的 object,包含loaded、total、percent三个属性,提供上传进
* total.loaded: number,已上传大小,单位为字节。
* total.total: number,本次上传的总量控制信息,单位为字节,注意这里的 total 跟文件大小并不一致。
* total.percent: number,当前上传进度,范围:0~100
* */
let next = function (res) {
//res值{"total":{"loaded":18184,"size":18185,"percent":99.99450096233159}}
//获取百分比进度
let progress = res.total.percent.toFixed(2);
self.uploadProgress = Number(progress);
console.log('Progress: ' + progress);
//如果有进度条
/*if (isNotEmptyUtils(progressId)) {
let obj = $("#" + progressId);
//开始上传时,显示进度条
if (isNotEmptyUtils(obj.parent())) {
//修改状态为上传
// status = true;
self.qiniuUploadStatus = true;
obj.parent().removeClass("hidden");
obj.fadeIn("fast");
}
obj.css("width", progress + '%');
obj.text(progress + '%');
//上传完成,2秒后淡出进度条
if (progress === "100.00") {
//修改状态为非上传
// status = false;
self.qiniuUploadStatus = true;
obj.fadeOut(2000);
}
}*/
};
/**
* 接收上传完成后的后端返回信息,res 参数为一个 object, 为上传成功后后端返回的信息
* ,具体返回结构取决于后端sdk的配置,可参考上传策略(https://developer.qiniu.com/kodo/manual/1206/put-policy)
* */
let complete = function (res) {
console.log("七牛上传完成");
setTimeout(function(){
result.key = res.key;
result.path = '/' + res.key;
result.fullPath = domain + '/' + res.key + '?v=' + new Date().getTime();
result.size = res.fsize;
result.name = res.fname ;
result.ext = res.ext;
// deferred.resolve(result);
resolve(result);
// self.model.qCloudUrl = result.fullPath;
// $("#introVideoLecture").attr("src", self.model.qCloudUrl);
//修改状态为非上传
// status = false;
self.qiniuUploadStatus = false;
if (isNotEmptyUtils(previewId)) {
let address = domain + result.path;
console.log('文件路径: ' + address);
//显示图片
let $img = $('<img>').attr("src", address);
let obj = $("#" + previewId);
obj.empty().append($img);
obj.css('max-width', '100%');
}
},2000);
};
/**
* 上传错误后触发,当不是 xhr 请求错误时,会把当前错误产生原因直接抛出,诸如 JSON 解析异常等;当产生 xhr 请求错误时,参数 err 为一个包含 code、message、isRequestError 三个属性的 object:
* err.isRequestError: 用于区分是否 xhr 请求错误;当 xhr 请求出现错误并且后端通过 HTTP 状态码返回了错误信息时,该参数为 true;否则为 undefined 。
* err.reqId: string,xhr请求错误的 X-Reqid。
* err.code: number,请求错误状态码,只有在 err.isRequestError 为 true 的时候才有效,可查阅码值对应说明。
* err.message: string,错误信息,包含错误码,当后端返回提示信息时也会有相应的错误信息。
* */
let error = function (err) {
//修改状态为非上传
// status = false;
self.qiniuUploadStatus = false
localStorage.removeItem('qiniuToken');
console.log("七牛上传失败,详细信息请参考:https://developer.qiniu.com/kodo/api/3928/error-responses");
//输出简略错误信息
if (err.isRequestError){
qiniuErrorCheck(err.code)
}else {
console.error(err);
}
/*modalClick("提示", "上传失败!", "确定", function () {
$('#model-modify').modal('hide');
}, "", null);*/
// deferred.reject(new Error('七牛上传失败'));
// return deferred.promise;
return reject(new Error('七牛上传失败'));
};
// 上传开始
subscription = observable.subscribe(next, error, complete);
});
// return deferred.promise;
});
};
/**
* 获取时间戳
* @param {Date} [date]日期对象,为空时,返回当前时间戳
* @return {String} timeStamp时间戳 格式:yyyyMMddhhmmssS
*/
const timeStamp = (date) => {
if (isEmptyUtils(date)) {
return new Date().format('yyyyMMddhhmmssS');
}
return date.format('yyyyMMddhhmmssS');
}
/**
* 获取全局唯一标识符(GUID,Globally Unique Identifier)
* @return {String} guid
*/
const guid = () => {
/**
* @return {String}
*/
function S4() {
return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
}
return (S4() + S4() + "-" + S4() + "-" + S4() + "-" + S4() + "-" + S4() + S4() + S4());
};
/**
* 文件重命名--七牛图片 2018 11
* @param {File} [file] 上传文件对象
* @param {String} [fileName] 指定文件名
* @param {String} [folder] 指定文件夹
* @return {String} fileName
*/
export const getFilePath = (file,fileName,folder) => {
if (isEmptyUtils(file)) {
return null;
}
//文件类型
var ext = file.type;
//后缀名
var suffix = file.name.substring(file.name.lastIndexOf(".") + 1);
//若为空则从name中获取---对wps格式的文件获取不到file.type
if (isEmptyUtils(ext)) {
ext = suffix;
}
//获取当前日期对象
var date = new Date();
if (isEmptyUtils(fileName)) {
//重命名后的文件名
fileName = timeStamp(date) + "-" + subString(guid(), 8) + "." + suffix;
}
//文件全路径(文件路径 + 文件名) 扩展名​/年/月/日/
// var filePath = ext + "/" + date.format('yyyy/MM/dd') + "/" + (isEmptyUtils(folder) ? "" : (folder + "/")) + fileName;
//var filePath = ext + "/" + "common/" + file.name.split('.')[0] + '-' + timeStamp(date) + "." + suffix;
var filePath = ext + "/" + "common/" + timeStamp(date) + "." + suffix;
console.log('filePath==============',filePath);
return filePath;
}
/**
*七牛上传图片、视频、文件 2018 11 hws
* @param self
* @param file
* @param filePath
* @param previewId
* @param progressId
* @param fileType 1--图片和文件 空为视频
* @returns {Promise}
*/
export const doUpload = (self,file, filePath, previewId,progressId, fileType) => {
// var deferred = $q.defer();
return new Promise(function (resolve, reject) {
if (isEmptyUtils(file) || isEmptyUtils(filePath)) {
console.error('七牛上传失败:非法参数');
reject();
}
let key = filePath ? filePath : getFilePath(file);
//修改状态为上传
self.qiniuUploadStatus = true;
// let token = "BRVB4TpxVFA5Wo6lIpfltmWKOltzGar46tvC3BlR:UHn0LDElwjP4jEZTXdq_1qV6_hw=:eyJzY29wZSI6InBpY2EtdGVzdCIsInJldHVybkJvZHkiOiJ7XCJrZXlcIjpcIiQoa2V5KVwiLFwiaGFzaFwiOlwiJChldGFnKVwiLFwiYnVja2V0XCI6XCIkKGJ1Y2tldClcIixcImZzaXplXCI6JChmc2l6ZSksXCJmbmFtZVwiOiQoZm5hbWUpLFwiZXh0XCI6JChleHQpfSIsImRlYWRsaW5lIjoxNTI5NDk0MTc1fQ==";
doQiniuAction1(fileType).then(function (token) {
let putExtra = {
fname: file.name, //原文件名
params: {}, //用来放置自定义变量
mimeType: mimeTypeArray || null //null || array,用来限制上传文件类型,为 null 时表示不对文件类型限制;限制类型放到数组里: ["image/png", "image/jpeg", "image/gif"]
};
let config = {
useCdnDomain: true, //表示是否使用 cdn 加速域名,为布尔值,true 表示使用,默认为 false。
region: null //选择上传域名区域;当为 null 或 undefined 时,自动分析上传域名区域
};
/*
* qiniu.upload 返回一个 observable 对象用来控制上传行为,observable 对像通过 subscribe 方法可以被 observer 所订阅,
* 订阅同时会开始触发上传,同时返回一个 subscription 对象,该对象有一个 unsubscribe 方法取消订阅,同时终止上传行为。
* */
let observable = qiniu.upload(file, key, token, putExtra, config);
/**
* 接收上传进度信息,res 参数是一个带有 total 字段的 object,包含loaded、total、percent三个属性,提供上传进
* total.loaded: number,已上传大小,单位为字节。
* total.total: number,本次上传的总量控制信息,单位为字节,注意这里的 total 跟文件大小并不一致。
* total.percent: number,当前上传进度,范围:0~100
* */
let next = function (res) {
//res值{"total":{"loaded":18184,"size":18185,"percent":99.99450096233159}}
//获取百分比进度
let progress = res.total.percent.toFixed(2);
self.uploadProgress = Number(progress);
if(progressId == 'uploadProgress1') {
self.uploadProgress1 = Number(progress);
}
if(progressId == 'uploadProgress2') {
self.uploadProgress2 = Number(progress);
}
console.log('Progress: ' + progress);
//如果有进度条
/*if (isNotEmptyUtils(progressId)) {
let obj = $("#" + progressId);
//开始上传时,显示进度条
if (isNotEmptyUtils(obj.parent())) {
//修改状态为上传
// status = true;
self.qiniuUploadStatus = true;
obj.parent().removeClass("hidden");
obj.fadeIn("fast");
}
obj.css("width", progress + '%');
obj.text(progress + '%');
//上传完成,2秒后淡出进度条
if (progress === "100.00") {
//修改状态为非上传
// status = false;
self.qiniuUploadStatus = true;
obj.fadeOut(2000);
}
}*/
};
/**
* 接收上传完成后的后端返回信息,res 参数为一个 object, 为上传成功后后端返回的信息
* ,具体返回结构取决于后端sdk的配置,可参考上传策略(https://developer.qiniu.com/kodo/manual/1206/put-policy)
* */
let complete = function (res) {
console.log("七牛上传完成");
setTimeout(function(){
result.key = res.key;
result.path = '/' + res.key;
// result.fullPath = domain + '/' + res.key + '_' + new Date().getTime();
if(!fileType) { // 图片 文件
result.fullPath = domain + '/' + res.key;
}else{ // 视频
result.fullPath = domain1 + '/' + res.key;
}
result.size = res.fsize;
result.name = res.fname ;
result.ext = res.ext;
// deferred.resolve(result);
resolve(result);
// self.model.qCloudUrl = result.fullPath;
// $("#introVideoLecture").attr("src", self.model.qCloudUrl);
//修改状态为非上传
// status = false;
self.qiniuUploadStatus = false;
// if (isNotEmptyUtils(previewId)) {
// let address = domain + result.path;
// console.log('文件路径: ' + address);
// //显示图片
// let uplodImg = $('<img>').attr("src", address);
// let obj = $("#" + previewId);
// obj.empty().append(uplodImg);
// obj.css('max-width', '100%');
// }
},500);
};
/**
* 上传错误后触发,当不是 xhr 请求错误时,会把当前错误产生原因直接抛出,诸如 JSON 解析异常等;当产生 xhr 请求错误时,参数 err 为一个包含 code、message、isRequestError 三个属性的 object:
* err.isRequestError: 用于区分是否 xhr 请求错误;当 xhr 请求出现错误并且后端通过 HTTP 状态码返回了错误信息时,该参数为 true;否则为 undefined 。
* err.reqId: string,xhr请求错误的 X-Reqid。
* err.code: number,请求错误状态码,只有在 err.isRequestError 为 true 的时候才有效,可查阅码值对应说明。
* err.message: string,错误信息,包含错误码,当后端返回提示信息时也会有相应的错误信息。
* */
let error = function (err) {
//修改状态为非上传
// status = false;
self.qiniuUploadStatus = false
localStorage.removeItem('qiniuToken');
console.log("七牛上传失败,详细信息请参考:https://developer.qiniu.com/kodo/api/3928/error-responses");
//输出简略错误信息
if (err.isRequestError){
qiniuErrorCheck(err.code)
}else {
console.error(err);
}
/*modalClick("提示", "上传失败!", "确定", function () {
$('#model-modify').modal('hide');
}, "", null);*/
// deferred.reject(new Error('七牛上传失败'));
// return deferred.promise;
return reject(new Error('七牛上传失败'));
};
// 上传开始
subscription = observable.subscribe(next, error, complete);
});
// return deferred.promise;
});
};
import {ResponseEnum} from "./constants";
import axios from 'axios';
//共通函数
Array.prototype.contains = function (obj) {
if (this.length > 0) {
for (let i = 0; i < this.length; i++) {
if (obj === this[i]) {
return true;
}
}
}
return false;
};
Array.prototype.remove = function (obj) {
if (this.contains(obj)) {
for (let i = 0; i < this.length; i++) {
if (obj === this[i]) {
this.splice(i, 1);
break;
}
}
}
return this;
};
// 时间处理
Date.prototype.format = function (fmt) { // author: meizz
let o = {
"M+": this.getMonth() + 1, // 月份
"d+": this.getDate(), // 日
"h+": this.getHours(), // 小时
"m+": this.getMinutes(), // 分
"s+": this.getSeconds(), // 秒
"q+": Math.floor((this.getMonth() + 3) / 3), // 季度
"S": this.getMilliseconds()
// 毫秒
};
if (/(y+)/.test(fmt))
fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "")
.substr(4 - RegExp.$1.length));
for (let k in o)
if (new RegExp("(" + k + ")").test(fmt))
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
return fmt;
};
/**
* base64编码
* @param {Object} str
*/
export const base64encode = (str) => {
let base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
let out, i, len;
let c1, c2, c3;
len = str.length;
i = 0;
out = "";
while (i < len) {
c1 = str.charCodeAt(i++) & 0xff;
if (i == len) {
out += base64EncodeChars.charAt(c1 >> 2);
out += base64EncodeChars.charAt((c1 & 0x3) << 4);
out += "==";
break;
}
c2 = str.charCodeAt(i++);
if (i == len) {
out += base64EncodeChars.charAt(c1 >> 2);
out += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));
out += base64EncodeChars.charAt((c2 & 0xF) << 2);
out += "=";
break;
}
c3 = str.charCodeAt(i++);
out += base64EncodeChars.charAt(c1 >> 2);
out += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));
out += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >> 6));
out += base64EncodeChars.charAt(c3 & 0x3F);
}
return out;
};
/**
* base64解码
* @param {Object} str
*/
export const base64decode = (str) => {
let base64DecodeChars = new Array(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1);
let c1, c2, c3, c4;
let i, len, out;
len = str.length;
i = 0;
out = "";
while (i < len) {
/* c1 */
do {
c1 = base64DecodeChars[str.charCodeAt(i++) & 0xff];
}
while (i < len && c1 == -1);
if (c1 == -1)
break;
/* c2 */
do {
c2 = base64DecodeChars[str.charCodeAt(i++) & 0xff];
}
while (i < len && c2 == -1);
if (c2 == -1)
break;
out += String.fromCharCode((c1 << 2) | ((c2 & 0x30) >> 4));
/* c3 */
do {
c3 = str.charCodeAt(i++) & 0xff;
if (c3 == 61)
return out;
c3 = base64DecodeChars[c3];
}
while (i < len && c3 == -1);
if (c3 == -1)
break;
out += String.fromCharCode(((c2 & 0XF) << 4) | ((c3 & 0x3C) >> 2));
/* c4 */
do {
c4 = str.charCodeAt(i++) & 0xff;
if (c4 == 61)
return out;
c4 = base64DecodeChars[c4];
}
while (i < len && c4 == -1);
if (c4 == -1)
break;
out += String.fromCharCode(((c3 & 0x03) << 6) | c4);
}
return out;
};
/**
* 时间秒数格式化
* @param s 时间戳(单位:秒)
* @returns {*} 格式化后的时分秒
*/
export const secToTime = (s) => {
let t = "";
if (s > -1) {
// let hour = Math.floor(s/3600);
let min = Math.floor(s / 60) % 60;
let sec = s % 60;
// if(hour < 10) {
// t = '0'+ hour + ":";
// } else {
// t = hour + ":";
// }
if (min < 10) {
t += "0";
}
t += min + ":";
if (sec < 10) {
t += "0";
}
t += sec.toFixed(0);
}
return t;
};
/**
* 校验对象是否为空
* */
export const isNotEmptyUtils = (obj) => {
if ("" == obj || null == obj || undefined == obj || "null" == obj) {
return false;
}
return true;
};
/**
* 校验对象是否为空
* */
export const isEmptyUtils = (obj) => {
return !isNotEmptyUtils(obj);
};
/**
* 校验数组是否为空
* */
export const isEmptyList = (list) => {
return (isEmptyUtils(list) || !(list instanceof Array) || list.length === 0);
};
/**
* 校验数组是否为空
* */
export const isNotEmptyList = (list) => {
return !isEmptyList(list);
};
/**
* 校验对象是否只包含数字0~9
* * @param {String} [obj] 校验对象
* */
export const isNumber = (obj) => {
return (obj != null && obj.toString().match('^[0-9]*$') != null);
};
// 获取用户系统信息start
const detectOS = () => {
let sUserAgent = navigator.userAgent;
let isWin = (navigator.platform == "Win32")
|| (navigator.platform == "Windows");
let isMac = (navigator.platform == "Mac68K")
|| (navigator.platform == "MacPPC")
|| (navigator.platform == "Macintosh")
|| (navigator.platform == "MacIntel");
if (isMac)
return "Mac";
let isUnix = (navigator.platform == "X11") && !isWin && !isMac;
if (isUnix)
return "Unix";
let isLinux = (String(navigator.platform).indexOf("Linux") > -1);
if (isLinux)
return "Linux";
let isIos = (sUserAgent.indexOf("Mac OS X") > -1);
if (isIos)
return "Mac";
if (isWin) {
let isWinXP = sUserAgent.indexOf("Windows NT 5.1") > -1
|| sUserAgent.indexOf("Windows XP") > -1;
if (isWinXP)
return "WinXP";
let isWinVista = sUserAgent.indexOf("Windows NT 6.0") > -1
|| sUserAgent.indexOf("Windows Vista") > -1;
if (isWinVista)
return "WinVista";
let isWin7 = sUserAgent.indexOf("Windows NT 6.1") > -1
|| sUserAgent.indexOf("Windows 7") > -1;
if (isWin7)
return "Win7";
let isWin8_1 = sUserAgent.indexOf("Windows NT 6.2") > -1
|| sUserAgent.indexOf("Windows 8") > -1;
let isWin8_2 = sUserAgent.indexOf("Windows NT 6.3") > -1
|| sUserAgent.indexOf("Windows 8.1") > -1;
if (isWin8_1 || isWin8_2)
return "Win8";
let isWin10_1 = sUserAgent.indexOf("Windows NT 6.4") > -1
|| sUserAgent.indexOf("Windows 10") > -1;
let isWin10_2 = sUserAgent.indexOf("Windows NT 10.0") > -1
|| sUserAgent.indexOf("Windows 10") > -1;
if (isWin10_1 || isWin10_2)
return "Win10";
}
return "other";
};
// 获取用户浏览器信息
const getBrowser = () => {
// let OsObject = "未知";
// if (navigator.userAgent.indexOf("MSIE") > 0) {
// return "IE";
// }
// if (navigator.userAgent.indexOf("Firefox") > 0) {
// return "Firefox";
// }
// if (navigator.userAgent.indexOf("Chrome") > 0) {
// return "Chrome";
// }
// if (navigator.userAgent.indexOf("Safari") > 0) {
// return "Safari";
// }
// if (navigator.userAgent.indexOf("Gecko") > 0) {
// return "Gecko";
// }
return navigator.userAgent;
};
const GetLocalIPAddress = () => {
// let url ='http://counter.sina.com.cn/ip/';
// let url ='http://chaxun.1616.net/s.php?type=ip&output=json&callback=?&_='+Math.random();
// let ip = "";
// $.getJSON(url, function(data){
// localStorage.setItem("ipAddress",data.Ip);
// // check();
// });
// $.getScript('http://pv.sohu.com/cityjson?ie=utf-8', function () {
return returnCitySN["cip"];
// });
// return ip;
};
// 获取用户终端信息
const getTerminalType = () => {
let brow = "未知";
// alert(navigator.userAgent);
if (navigator.userAgent.indexOf('iPad') > -1) {
// alert("iPad");
return brow = "iPad";
}
if (navigator.userAgent.indexOf('Android') > -1
|| navigator.userAgent.indexOf('Linux') > -1) {
// alert("Android");
return brow = "android手机";
}
if (navigator.userAgent.indexOf('iPhone') > -1
// || navigator.userAgent.indexOf('Mac') > -1
) {
// alert("iPhone");
return brow = "iPhone手机";
}
if (navigator.userAgent.indexOf('Trident') > -1) {
// alert("Trident");
return brow = "电脑";
}
if (navigator.userAgent.indexOf('Presto') > -1) {
// alert("Presto");
return brow = "电脑";
}
if (navigator.userAgent.indexOf('Chrome') > -1) {
// alert("Chrome");
return brow = "电脑";
}
if (navigator.userAgent.indexOf('AppleWebKit') > -1) {
// alert("AppleWebKit");
return brow = "iPad";
}
if (navigator.userAgent.indexOf('Gecko') > -1
&& navigator.userAgent.indexOf('KHTML') == -1) {
// alert("Gecko");
return brow = "电脑";
}
if (navigator.userAgent.indexOf("Mac OS X") > -1) {
// alert("ios");
return brow = "ios";
}
if (navigator.userAgent.indexOf('Safari') == -1) {
// alert("Safari");
return brow = "电脑";
}
return brow;
};
const initEnvironment = () => {
let OS = detectOS();
let browser = getBrowser();
let ip = GetLocalIPAddress();
let terminalType = getTerminalType();
localStorage.setItem("OS", OS);
localStorage.setItem("browser", browser);
localStorage.setItem("ipAddress", ip);
localStorage.setItem("terminalType", terminalType);
};
/**
* str数据字符串,split分隔符
* @param {String} [str] 当前vue对象
* @param {String} [split] 当前vue对象
* @return{Array} [array]
* */
export const stringToArr = (str, split) => {
if (isEmptyUtils(str) || isEmptyUtils(split) || str.indexOf(split) === -1) {
return [str];
} else {
return str.split(split);
}
};
//单点登录--start
/**
* str数据字符串,split分隔符
* @param {String} [str] url参数部分
* @param {String} [split] 分隔符
* @return{Array} [parArr] 返回键值对list
* */
const getUrlParams = (str, split) => {
let parArr = [];
if (isEmptyUtils(str) || isEmptyUtils(split) || str.indexOf(split) === -1) {
return parArr;
} else {
let parMapArray = str.split(split);
if (parMapArray.length > 0) {
for (let i = 0; i < parMapArray.length; i++) {
if (parMapArray[i].indexOf("=") > -1) {
let item = parMapArray[i].split("=");
let par = {};
par[item[0]] = item[1];
parArr.push(par);
}
}
}
return parArr;
}
};
/**
* str数据字符串,split分隔符
* @param {String} [str] url参数部分
* @param {String} [split] 分隔符
* @return{Map} [parMap] 返回键值对Map
* */
export const getUrlParamsMap = (str, split) => {
let parMap = new Map();
if (isEmptyUtils(str) || isEmptyUtils(split) || str.indexOf(split) === -1) {
return parMap;
} else {
let parMapArray = str.split(split);
if (parMapArray.length > 0) {
for (let i = 0; i < parMapArray.length; i++) {
if (parMapArray[i].indexOf("=") > -1) {
let item = parMapArray[i].split("=");
parMap[item[0]] = item[1];
}
}
}
return parMap;
}
};
export const ssoLogin = (href, paramMap) => {
console.log("ssoLogin开始");
if (isNotEmptyUtils(paramMap)) {
if (isNotEmptyUtils(paramMap)) {
for (var param in paramMap) {
localStorage.setItem(param, paramMap[param]);
}
}
//获取用户系统信息
initEnvironment();
}
};
//单点登录--end
//退出登录,跳转到登录页面
export const logout = () => {
let url = localStorage.getItem("Url");
let logoutUrl = localStorage.getItem("logoutUrl");
let ssoLoginUrl = localStorage.getItem("ssoLogin");
let ssoOriginUrl = localStorage.getItem("ssoOrigin");
console.log('logoutUrl:'+logoutUrl)
/* alert("ssoLogin Url:"+ ssoLoginUrl)
alert("logOut url:" + logoutUrl)
alert("ssoOrigin url:" + ssoOriginUrl);*/
localStorage.clear();
localStorage.setItem("Url", url);
localStorage.setItem("logoutUrl", logoutUrl);
localStorage.setItem("ssoLogin", ssoLoginUrl);
localStorage.setItem("ssoOrigin", ssoOriginUrl);
if (isEmptyUtils(logoutUrl)) {
if(isEmptyUtils(ssoLoginUrl)){
window.location.href = localStorage.getItem("ssoOrigin")
+ "/PICA_SSO_FE/html/pica_login.html";
}else{
window.location.href = localStorage.getItem("ssoLogin");
}
} else {
// window.location.href = logoutUrl;
window.location.href = localStorage.getItem("ssoOrigin")
+ "/PICA_SSO_FE/html/pica_login.html";
}
};
/**
* 消息提示 确定或取消
* @param {Object} [self] 当前vue对象
* @param {String} [title] 标题
* @param {String} [content] 内容
* @param {String} [confirmButton] 确认按钮文字
* @param {Function} [confirmFunction] 按下确按钮认时,执行的函数
* @param {String} [cancelButton] 取消按钮文字
* @param {Function} [cancelFunction] 按取消按钮认时,执行的函数
* @param {String} [messageType] 消息类型 success,info,warning,error
* */
export const messageBox = (self, title, content, confirmButton, confirmFunction, cancelButton, cancelFunction, messageType) => {
let titleText = title ? title : '提示';
let contentText = content ? content : '';
let confirmButtonText = confirmButton ? confirmButton : '确定';
let type = messageType ? messageType : 'info';
let typeArray = ["error", "warning", "info", "success"];
if (!typeArray.contains(type)) {
type = "info";
}
if (isNotEmptyUtils(cancelButton)) {
self.$confirm(contentText, titleText, {
confirmButtonText: confirmButtonText,
cancelButtonText: cancelButton,
type: type
}).then(() => {
// self.$message({
// type: 'success',
// message: '删除成功!'
// });
if (confirmFunction instanceof Function) {
confirmFunction();
}
}).catch(() => {
// self.$message({
// type: 'info',
// message: '已取消删除'
// });
if (cancelFunction instanceof Function) {
cancelFunction();
}
});
} else {
self.$alert(contentText, titleText, {
confirmButtonText: confirmButtonText,
type: type,
callback: action => {
// self.$message({
// type: 'info',
// message: `action: ${ action }`
// });
if (confirmFunction instanceof Function) {
confirmFunction();
}
}
});
}
};
/**
* 消息提示(支持html内容) 确定或取消
* @param {Object} [self] 当前vue对象
* @param {String} [title] 标题
* @param {String} [content] 内容
* @param {String} [confirmButton] 确认按钮文字
* @param {Function} [confirmFunction] 按下确按钮认时,执行的函数
* @param {String} [cancelButton] 取消按钮文字
* @param {Function} [cancelFunction] 按取消按钮认时,执行的函数
* @param {String} [messageType] 消息类型 success,info,warning,error
* */
export const htmlMessageBox = (self, title, content, confirmButton, confirmFunction, cancelButton, cancelFunction, messageType) => {
let titleText = title ? title : '提示';
let contentText = content ? content : '';
let confirmButtonText = confirmButton ? confirmButton : '确定';
let type = messageType ? messageType : 'info';
let typeArray = ["error", "warning", "info", "success"];
if (!typeArray.contains(type)) {
type = "info";
}
// debugger
if (isNotEmptyUtils(cancelButton)) {
self.$confirm(contentText, titleText, {
confirmButtonText: confirmButtonText,
cancelButtonText: cancelButton,
dangerouslyUseHTMLString: true,//是否将 message 属性作为 HTML 片段处理
type: type
}).then(() => {
if (confirmFunction instanceof Function) {
confirmFunction();
}
}).catch(() => {
if (cancelFunction instanceof Function) {
cancelFunction();
}
});
} else {
self.$alert(contentText, titleText, {
confirmButtonText: confirmButtonText,
dangerouslyUseHTMLString: true,//是否将 message 属性作为 HTML 片段处理
type: type,
callback: action => {
// self.$message({
// type: 'info',
// message: `action: ${ action }`
// });
if (confirmFunction instanceof Function) {
confirmFunction();
}
}
});
}
};
/**
*请求失败时判断
*
* @param {Object} [res] 后台返回的信息
* @param {Object} [self] 当前vue对象
* */
export const responseCheck = (res, self) => {
closeLoading(self);
console.log(res.data);
// setTimeout(function () {
let code = res.data ? res.data.code : 0;
if (code === "000000" || code === '200') {
//成功不作任何处理
return true;
} else if (ResponseEnum.has(code)) {
messageBox(self, "提示", ResponseEnum.get(code), "是", function () {
// logout();
}, "", null);
// setTimeout(function () {
// logout();
// }, 2000);
} else {
//预期之外的失败
self.$message.error("操作失败");
console.error(res);
}
// }, 100)
return false;
};
/**
*请求失败时判断
*
* @param {Object} [error] 后台返回的信息
* @param {Object} [self] 当前vue对象
* */
export const errorResponseCheck = (error, self) => {
closeLoading(self);
console.log(error);
setTimeout(function () {
let code = error ? (error.response ? error.response.data : 0) : 0;
// console.log("请求失败:%s", code);
if (code == '40011') {
messageBox(self, "登录", "登录失效,请重新登录!", "是", function () {
logout();
}, "", null);
setTimeout(function () {
logout();
}, 2000);
} else if (code == '40013') {
messageBox(self, "提示", "刷新太过频繁,休息一下!", "是", function () {
}, "", null);
// setTimeout(function () {
//
// }, 2000);
} else {
//sendErrorReport(code);
// messageBox(self, "提示", "操作失败!", "确定", function () {
//
// }, "", null, "error");
self.$message.error("操作失败");
}
}, 100)
};
//截位
export const subString = (obj, int) => {
if (isEmptyUtils(obj) || isEmptyUtils(int)) {
return "";
}
if (obj.length <= int) {
return obj;
} else {
obj = obj.substring(0, int);
}
return obj;
};
/**
* 打开loading
* @param {Object} [self] 当前this对象
* @return 当前loading对象
* */
export const openLoading = (self) => {
const options = {
lock: true,
text: 'Loading',
// target:'#bodyContent',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
};
self.elLoadingId = self.$loading(options);
return self.elLoadingId;
};
/**
* 关闭loading
* @param {Object} [self] 当前this对象
* @return 当前loading对象
* */
export const closeLoading = (self) => {
if (self.elLoadingId) {
self.elLoadingId.close();
}
};
/**
* 获取常量集合
*
*
* @param {Object} [self] 当前this对象
* @param {Object} [codeObject] 例如:codeObject={list1:"P097",list2:"P097"}
* */
export const getConstantList = (self, codeObject) => {
if (!codeObject instanceof Object) {
return;
}
let req = {
params: {
numMap: JSON.stringify(codeObject)
}
};
self.$axios.get(
localStorage.getItem("msUrl") + "constants"
, req
).then(function (res) {
let map = JSON.parse(JSON.stringify(res.data.data));//通过这个实现深拷贝
for (let key in map) {
self[key] = map[key];
}
});
};
export const initDepartment = (self, obj, type) => {
if (!obj instanceof Object) {
return;
}
var num = {
id: obj,
type: type
}
axios.create().post(
localStorage.getItem("kfUrl") + "PICAAddressHospitalServiceImpl/postDepartmentList",
num
).then(function (res) {
let list = JSON.parse(JSON.stringify(res.data.departmentList));//通过这个实现深拷贝
if (obj == -1) {
self.departmentListP = list;
} else {
self.departmentList = list;
}
if (type == 'childGetChildList') {
self.departmentPid = getPdepartmentId(self,'model','departmentId');
}
});
};
export const getPdepartmentId = (self) =>{
if(isNotEmptyList(self.model.departmentId)
|| !self.departmentList instanceof Array) {
return null;
}
if(self.departmentList.length>0) {
return self.departmentList[0].parent_id;
}else{
return -1;
}
};
export const getObjectIdsStr = (list, key) => {
if (isEmptyUtils(list)) {
return ''
}
let strRet = '';
for (let temp of list) {
strRet = strRet + temp[key] + ',';
}
return strRet;
}
export const getPositionList = (provinceId,cityId,countyId,townId) => {
return new Promise(function (resolve, reject) {
var num = {
provinceId,
cityId,
countyId,
townId
}
axios.create().post(
localStorage.getItem("kfUrl") + "combineHospital/getPositionList",
num
).then(function (res) {
resolve(res);
}).then(function (res) {
reject(res);
});
});
};
export const setOptionLabel = (self,selfModel,selfEId,selfEName,list,listEId,listEName) => {
if (isEmptyList(list) || isEmptyUtils(listEId) || isEmptyUtils(listEName)) {
return ;
}
for (let i = 0; i < list.length; i++) {
if(list[i][listEId] == self[selfModel][selfEId]){
self[selfModel][selfEName] = list[i][listEName];
break;
}
}
return;
};
<template>
<div class="header">
<div class="logo">敏感数据查看系统</div>
<div class="user-info">
<el-dropdown trigger="click" @command="handleCommand">
<span class="el-dropdown-link">
<img class="user-logo" src="../../../static/img/img.jpg">
<span id="headName">{{name}}</span><i class="el-icon-arrow-down el-icon--right"></i>
</span>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item command="logout">退出</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</div>
<!--导航-->
<div class="user-info">
<el-dropdown trigger="click" @command="handleCommand">
<span class="el-dropdown-link">
{{'系统切换'}}<i class="el-icon-arrow-down el-icon--right"></i>
</span>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item v-for="item in systemInfoList" :key="item.id">
<span class="menu-item" @click="forward(item)">{{item.systemName}}</span>
<!--<el-tag type="warning" @click="forward(item)">{{item.system_name}}</el-tag>-->
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</div>
</div>
</template>
<script>
import {base64encode,isEmptyUtils,logout, isNotEmptyUtils, errorResponseCheck, responseCheck, openLoading, closeLoading, messageBox, getConstantList, isNotEmptyList} from '../../common/utils';
import menuApi from '../../api/menu'
export default {
data() {
return {
name: localStorage.getItem("user_name"),
systemInfoList: []
}
},
created() {
//获取导航项目
this.getSystemType();
},
computed: {},
methods: {
handleCommand(command) {
if (command === 'logout') {
let req = {token: localStorage.getItem("token")};
let logOutPromise = menuApi.removeToken(req,this);
logOutPromise.then(function (res) {
logout();
}).catch(function (error) {
console.log('登出失败:'+error);
logout();
});
}
},
async getSystemType() {
let self = this;
//请求参数
let req = {
system_type: localStorage.getItem("system_type")
};
let headers = {
headers: {
'token': localStorage.getItem('token') || null
}
};
// let headData = menuApi.headList(req,self);
// headData.then(function (data) {
self.$axios.post(localStorage.getItem("msUrl")+'login/header', req, headers).then(function (data) {
responseCheck(data, self);
let sysData = JSON.parse(JSON.stringify(data.data));//通过这个实现深拷贝
if(sysData.code === '201550'){
/*messageBox(self, "登录", "登录失效,请重新登录!", "是", function () {
logout();
}, "", null);*/
}else{
self.systemInfoList = sysData.data.systemInfoList;
localStorage.setItem("user_name", sysData.data.userName);
if(document.getElementById('headName').innerText == undefined ||
document.getElementById('headName').innerText == ''){
document.getElementById('headName').innerText =localStorage.getItem("user_name")
}
}
}, function (error) {
errorResponseCheck(error, self);
});
},
forward(obj) {
let self = this;
if (obj.systemNameAbbreviation.toLowerCase() === "sso") {
window.location.href = obj.domainName + "pica_index.html";
} else {
// let apiUrl = localStorage.getItem("msUrl") + 'PICALoginAndRegisterServiceImpl/getHomePageUrl.validate';
//请求参数
let req = {
// token: localStorage.getItem("token"),
system_type: obj.id
};
openLoading(self);
let promise = menuApi.forwardPage(req,self)
promise.then(function (data) {
closeLoading(self);
let forwardData = JSON.parse(JSON.stringify(data.data));//通过这个实现深拷贝
let url = forwardData.data.picapMenuModels[0].url;
if (url.length > 1) {
// window.location.href = url;
} else {
url = forwardData.data.picapMenuModels[0].picapSecondMenus[0].url;
if (url.length > 1) {
// window.location.href = url;
} else {
url = forwardData.data.picapMenuModels[0].picapSecondMenus[0].picapThirdMenus[0].url;
}
}
let param = "token=" + localStorage.getItem("token") + "&ssoOrigin=" + localStorage.getItem("ssoOrigin") + "&system_type=" + obj.id;
window.location.href = obj.domainName + url + "?" + base64encode(param);
}, function (error) {
errorResponseCheck(error, self);
});
}
}
}
}
</script>
<style scoped>
.header {
position: relative;
box-sizing: border-box;
width: 100%;
height: 70px;
font-size: 22px;
line-height: 70px;
color: #fff;
}
.header .logo {
float: left;
width: 250px;
text-align: center;
}
.user-info {
float: right;
padding-right: 50px;
font-size: 16px;
color: #fff;
}
.user-info .el-dropdown-link {
position: relative;
display: inline-block;
padding-left: 50px;
color: #fff;
cursor: pointer;
vertical-align: middle;
}
.user-info .user-logo {
position: absolute;
left: 0;
top: 15px;
width: 40px;
height: 40px;
border-radius: 50%;
}
.el-dropdown-menu__item {
text-align: center;
}
.menu-item {
font-size: 14px;
font-weight: 300;
color: #606266;
}
</style>
<template>
<div class="wrapper">
<v-head></v-head>
<v-sidebar></v-sidebar>
<div class="content" id="bodyContent">
<transition name="move" mode="out-in">
<keep-alive>
<router-view v-if="$route.meta.keepAlive"></router-view>
</keep-alive>
</transition>
<transition name="move" mode="out-in">
<router-view v-if="!$route.meta.keepAlive"></router-view>
</transition>
</div>
</div>
</template>
<script>
import Vue from 'vue';
import {isNotEmptyUtils, getUrlParamsMap, base64decode, ssoLogin} from "../../common/utils";
import vHead from './Header.vue';
import vSidebar from './Sidebar.vue';
import Axios from 'axios';
export default {
data: function () {
return {}
},
beforeCreate() {
},
created() {
//sso登录时,初始化各种变量
this.initData();
console.log("初始化各种变量完成");
},
methods: {
async initData() {
// let self = this;
let href = window.location.href;
let offset = href.indexOf("?");
// console.log(window.location.search);
console.log(href);
if (offset !== -1) {
let paramStr = href.substring(offset + 1, href.length);
let pars = base64decode(paramStr);
let paramMap = getUrlParamsMap(pars, "&");
if (isNotEmptyUtils(paramMap["token"]) && isNotEmptyUtils(paramMap["ssoOrigin"])) {
Vue.prototype.$axios = Axios.create({
headers: {
'token': paramMap["token"],
'sysCode': localStorage.getItem("sysCode"),
'deviceInfo': localStorage.getItem("deviceInfo"),
}
});
ssoLogin(href, paramMap);
}
}
// else if (localStorage.getItem("token")) {
// debugger
// Vue.prototype.$axios = self.$axios.create({
// headers: {'token': localStorage.getItem("token")}
// });
// }
}
},
components: {
vHead, vSidebar
}
}
</script>
<style>
</style>
<template>
<div class="sidebar">
<el-menu :default-active="onRoutes" class="el-menu-vertical-demo" theme="dark" unique-opened router>
<template v-for="(item, index) in items">
<template v-if="item.subs">
<el-submenu :index="'index_' + index">
<template slot="title"><i :class="item.icon"></i>{{ item.title }}</template>
<el-menu-item v-for="(subItem,i) in item.subs" :key="i" :index="subItem.index">{{ subItem.title}}
</el-menu-item>
</el-submenu>
</template>
<template v-else>
<el-menu-item :index="item.index">
<i :class="item.icon"></i>{{ item.title }}
</el-menu-item>
</template>
</template>
</el-menu>
</div>
</template>
<script>
import {isEmptyUtils, isNotEmptyUtils, errorResponseCheck, responseCheck, openLoading, closeLoading, messageBox, getConstantList, isNotEmptyList} from '../../common/utils';
import menuApi from '../../api/menu'
export default {
data() {
return {items: []}
},
created() {
this.getData();
},
methods: {
async getData() {
let self = this;
//获取菜单
let url = localStorage.getItem("msUrl") + 'login/menu/list';
let req = {
token: localStorage.getItem("token"),
system_type: localStorage.getItem("system_type"),
device_ip: localStorage.getItem("ipAddress"),
browser_ver: localStorage.getItem("browser")
};
// let menuListPromise = menuApi.menuList(req,self);
let headers = {
headers: {
'token': localStorage.getItem('token') || null
}
};
self.$axios.post(localStorage.getItem("msUrl") + 'login/menu/list', req, headers).then(function (res) {
// menuListPromise.then(function (res) {
responseCheck(res, self);
// console.log("获取菜单成功===========",res);
self.items = res.data.data.picapMenuModels;
// 敏感数据查看系统 测试 Start <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 开发前期写死的,后续改成接口获取
self.items = [{
icon: null,
index: "#",
subs: [
{icon: null, index: "data-in", title: "数据导入", subs: []},
{icon: null, index: "data-view", title: "数据查看", subs: []},
],
title: "敏感数据",
},{
icon: null,
index: "#",
subs: [
{icon: null, index: "code-library", title: "后台编码库", subs: []},
{icon: null, index: "diagnose-manage", title: "诊断管理", subs: []},
],
title: "居民诊断",
}]
// 敏感数据查看系统 测试 End <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
let data = JSON.parse(JSON.stringify(res.data.data));//通过这个实现深拷贝
localStorage.setItem("privilege_data", JSON.stringify(data.picapMenuModels));
localStorage.setItem("user_name", data.user_name);
localStorage.setItem("function_role", data.function_role);
// localStorage.setItem("region_role", data.region_role);
localStorage.setItem("initFlag", "1");
// debugger
}).catch(function (error) {
console.log("获取菜单失败!%s", error);
errorResponseCheck(error, self);
});
}
},
computed: {
onRoutes() {
return this.$route.path.replace('/', '');
}
}
}
</script>
<style scoped>
.sidebar {
display: block;
position: absolute;
width: 250px;
left: 0;
top: 70px;
bottom: 0;
background: #2E363F;
}
.sidebar > ul {
height: 100%;
overflow-y: auto;
}
/* 滚动条样式 */
.sidebar > ul::-webkit-scrollbar {
width: 5px;
}
.sidebar > ul::-webkit-scrollbar-thumb {
border-radius: 5px;
-webkit-box-shadow: inset 0 0 5px rgba(0,0,0,0.2);
background: rgba(0,0,0,0.2);
}
</style>
/*右浮动*/
.float-right {
float: right;
}
/*el-row样式*/
.row {
/*margin-top: 20px;*/
margin-bottom: 20px;
}
/*form input输入框样式*/
.form-input {
width: auto;
}
/*文本不换行*/
.text-nowrap {
white-space: nowrap
}
.el-table__header thead tr th {
background: #fafafa !important;
}
.el-table th>.cell {
color: #000;
}
import Vue from 'vue';
import App from './App';
import router from './router';
import store from './vuex/store'
import axios from 'axios';
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css'; // 默认主题
import "babel-polyfill";
import {getAddress, loadCommonFilter} from './common/env'
import vueFilter from './common/filter'
//加载环境变量
getAddress();
loadCommonFilter();
//加载elementUi
Vue.use(ElementUI);
// Vue.use(vueXlsxTable, {rABS: false})
if (localStorage.getItem("token")) {
Vue.prototype.$axios = axios.create({
headers: {
'token': localStorage.getItem("token"),
'sysCode': localStorage.getItem("sysCode"),
'deviceInfo': localStorage.getItem("deviceInfo"),
}
});
} else {
Vue.prototype.$axios = axios;
}
// 全局过滤器
for (const filter in vueFilter) {
Vue.filter(filter, vueFilter[filter])
}
new Vue({
router,
store,
render: h => h(App)
}).$mount('#app');
import Vue from 'vue';
import Router from 'vue-router';
Vue.use(Router);
export default new Router({
/*
* 在创建的 router 对象中,如果不配置 mode,就会使用默认的 hash 模式,该模式下会将路径格式化为 #! 开头。
* 添加 mode: 'history' 之后将使用 HTML5 history 模式,该模式下没有 # 前缀,而且可以使用 pushState 和 replaceState 来管理记录。
* 关于 HTML5 history 模式的更多内容,可以参考官方文档:https://router.vuejs.org/zh-cn/essentials/history-mode.html
*/
// mode: 'history',
routes: [
{
path: '/',
component: resolve => require(['../components/common/Home.vue'], resolve),
children: [
{
path: '/',
redirect: '/data-in'
},{ // 后台编码库
path: '/code-library',
component: resolve => require(['../views/code-library/code-library.vue'], resolve),
},{ // 常见诊断管理
path: '/diagnose-manage',
component: resolve => require(['../views/diagnose-manage/diagnose-manage.vue'], resolve)
},{ // 后台编码库
path: '/data-in',
component: resolve => require(['../views/sensitive-control/data-in.vue'], resolve),
},{ // 常见诊断管理
path: '/data-view',
component: resolve => require(['../views/sensitive-control/data-view.vue'], resolve)
}
]
}
]
})
import fetch from '../common/fetch'
/**
* 获取内容列表
* @param {*} pageNo
* @param {*} pageSize
*/
// export const getContentsList = (pageNo, pageSize) => fetch( '/fiveMinutes/contents', {pageNo,pageSize}, 'GET')
/**
* 获取内容详情
*/
// export const getContent = () => fetch('PICALoginAndRegisterServiceImpl/postMe.validate/1031F75D3A90EDB1A721948D98077EFC', {}, 'GET');
export const getContent = () => fetch('PICALoginAndRegisterServiceImpl/postMenuVue', {token:"0CF19A58240AA77993925191E4303AD6"}, 'POST');
// export const getContent = () => fetch('PICALoginAndRegisterServiceImpl/postMe.validate?token=1031F75D3A90EDB1A721948D98077EFC', {}, 'POST');
// export const getContent = () => this.$axios.post('PICALoginAndRegisterServiceImpl/postMe.validate', {
// token: '1031F75D3A90EDB1A721948D98077EFC'
// })
// .then(function (response) {
// console.log(response);
// })
// .catch(function (error) {
// console.log(error);
// });
<template>
<div class="code-library-wrap">
<h2 class="top-title">后台编码库</h2>
<!-- 多个搜索框 -->
<el-row style="margin-top: 20px;">
<el-col :span="19">
<el-form :inline="true" ref="codeForm" :model="searchParams" >
<el-form-item label="名称:">
<el-input v-model="searchParams.diseaseName" size="small" class="input"></el-input>
</el-form-item>
<el-form-item label="别名:">
<el-input v-model="searchParams.alias" size="small" class="input"></el-input>
</el-form-item>
<el-form-item label="ICD编码:">
<el-input v-model="searchParams.icdCode" size="small" class="input"></el-input>
</el-form-item>
<el-form-item label="别名是否为空:">
<el-select v-model="searchParams.aliasType" size="small" placeholder="请选择">
<el-option
v-for="item in aliasTypeOptions"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
</el-form>
</el-col>
<el-col :span="5" style="text-align: right;">
<el-button type="primary" @click="handleGoSearch">搜索</el-button>
<el-button type="primary" @click="handleNewAdd">新增</el-button>
</el-col>
</el-row>
<!-- 表格 -->
<el-table
:data="tableData"
border
style="width: 100%">
<el-table-column
align="center"
prop="icdCode"
label="ICD11编码"
width="180">
</el-table-column>
<el-table-column
align="center"
prop="diseaseName"
label="名称"
width="180">
</el-table-column>
<el-table-column
align="center"
prop="alias"
label="别名">
</el-table-column>
<el-table-column
align="center"
prop="modifiedName"
label="操作人">
</el-table-column>
<el-table-column
align="center"
prop="icdTypeValue"
label="类型">
</el-table-column>
<el-table-column
align="center"
prop="modifiedTime"
label="最近更新">
</el-table-column>
<el-table-column
align="center"
prop="address"
label="操作">
<template slot-scope="scope">
<el-button @click="handleEdit(scope.row)" type="text" >编辑</el-button>
<el-button type="text" @click="handleChangeStop(scope.row)">{{scope.row.status == 1 ? '停用' : '启用'}}</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<el-pagination
v-if="tableData && tableData.length > 0"
class="pagination-style"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:total="totalRows"
:current-page="searchParams.page"
:page-sizes="[15, 30, 50, 100]"
:page-size="searchParams.pageSize"
layout="total, sizes, prev, pager, next, jumper">
</el-pagination>
<!-- 新增 弹窗 -->
<el-dialog
v-if="addSubmitForm"
:close-on-click-modal="false"
:visible.sync="newVisible"
width="700px"
center>
<!-- <span>需要注意的是内容是默认不居中的</span> -->
<el-form :inline="true" :rules="rules" ref="addSubmitForm" :model="addSubmitForm" label-width="100px">
<el-form-item label="名称:" prop="diseaseName">
<el-input v-model="addSubmitForm.diseaseName" size="small" class="input"></el-input>
</el-form-item>
<el-form-item label="ICD编码:" prop="icdCode">
<el-input v-model="addSubmitForm.icdCode" size="small" class="input"></el-input>
</el-form-item>
<el-form-item label="类型:" prop="icdType">
<el-select v-model="addSubmitForm.icdType" placeholder="请选择" size="small" style="width: 200px;" >
<el-option
v-for="item in icdTypeList"
:key="item.no"
:label="item.value"
:value="item.no">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="别名:" prop="alias">
<el-input v-model="addSubmitForm.alias" size="small" class="input"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button type="primary" @click="handleSubmit">提 交</el-button>
</span>
</el-dialog>
<!-- 提交确认 弹窗 -->
<el-dialog
class="confirm-add"
:close-on-click-modal="false"
:visible.sync="confirmAddVisible"
width="700px"
center>
<div class="info">
<p class="title">名称:</p>
<p class="value">{{addSubmitForm.diseaseName}}</p>
</div>
<div class="info name-repeat" v-if="isDiseaseNameRepeat">
名称存在重复,请仔细核验!
</div>
<div class="info">
<p class="title">ICD编码:</p>
<p class="value">{{addSubmitForm.icdCode}}</p>
</div>
<div class="info">
<p class="title">类型:</p>
<p class="value">{{returnICDType(addSubmitForm.icdType)}}</p>
</div>
<div class="info">
<p class="title">别名:</p>
<p class="value">{{addSubmitForm.alias}}</p>
</div>
<div class="tips">名称与编码生效后不可修改,请仔细核对</div>
<span slot="footer" class="dialog-footer">
<el-button @click="handleBack">上一步</el-button>
<el-button type="primary" @click="handleSubmitConfirm">确 认</el-button>
</span>
</el-dialog>
<!-- edit 弹窗 -->
<el-dialog
v-if="rowData"
class="edit-dialog-wrap"
:close-on-click-modal="false"
:visible.sync="editVisible"
width="700px"
center>
<el-form :inline="true" :model="rowData" label-width="100px">
<el-form-item label="名称:" class="red-star">
<el-input :disabled="true" v-model="rowData.diseaseName" size="small" class="input"></el-input>
</el-form-item>
<el-form-item label="ICD编码:" class="red-star">
<el-input :disabled="true" v-model="rowData.icdCode" size="small" class="input"></el-input>
</el-form-item>
<el-form-item label="类型:" class="red-star">
<el-input :disabled="true" :value="rowData.icdTypeValue" size="small" class="input"></el-input>
</el-form-item>
<el-form-item label="别名:">
<el-input v-model="rowData.alias" size="small" class="input"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button type="primary" @click="handleConfirmEdit">确 认</el-button>
</span>
</el-dialog>
<!-- 停用 启用 弹窗 -->
<el-dialog
:visible.sync="showStopOrActiveModal"
width="300px"
center>
<span style="letter-spacing: 1px;">请确认是否切换停用/启用状态?</span>
<span slot="footer" class="dialog-footer">
<el-button @click="showStopOrActiveModal = false">取 消</el-button>
<el-button type="primary" @click="handleFinalConfirmStop">确 定</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import { openLoading, closeLoading, } from '../../common/utils';
export default {
data() {
return {
icdTypeList: [],
searchParams: {
diseaseName: '',
alias: '',
icdCode: '',
aliasType: 1,
page: 1,
pageSize: 15,
},
aliasTypeOptions: [{
label: '全部',
value: 1,
},{
label: '非空',
value: 2,
}],
totalRows: 0,
currentRowData: null,
showStopOrActiveModal: false, // 启用停用弹窗
tableData: [],
newVisible: false, // 新增 窗口
editVisible: false,
confirmAddVisible: false, // 新增的确认 窗口
rowData: null,
addSubmitForm: {
diseaseName: '',
icdCode: '',
icdType: 1,
alias: '',
},
rules: {
diseaseName: [
{ required: true, message: '请输入名称', trigger: 'blur' },
{ max: 100, message: '名称长度限制100个字符以内', trigger: 'blur' },
],
icdCode: [
{ required: true, message: '请输入ICD编码', trigger: 'blur' },
{ max: 20, message: '编码长度限制20个字符以内', trigger: 'blur' },
],
icdType: [
{ required: true, message: '请选择类型', trigger: 'blur' },
],
alias: [
{ max: 20, message: '别名长度限制20个字符以内', trigger: 'blur' },
]
},
isDiseaseNameRepeat: false,
}
},
created() {
this.getList();
this.getIcdType();
},
methods: {
handleSizeChange(val) {
// 每页多少条 切换
this.searchParams.pageSize = val;
this.getList();
},
handleCurrentChange(val) {
// 当前第几页 切换
this.searchParams.page = val;
this.getList();
},
handleGoSearch() {
this.searchParams.page = 1;
this.getList();
},
getList() {
let params = this.searchParams;
openLoading(this);
this.$axios.get(localStorage.getItem("lectureUrl") + '/medicineDictionary/icdContents/list', { params } )
.then((res) => {
closeLoading(this);
// console.log('list @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ', res.data)
let data = res.data;
if(data.code == "000000") {
if (data.data.icdContentsList && data.data.icdContentsList.length > 0) {
this.tableData = data.data.icdContentsList;
// this.tableData.map((item) => {
// item.isEdit = false;
// });
}else {
this.tableData = [];
}
this.totalRows = data.data.total;
}else {
this.$message.error(data.message);
}
}).catch((error) => {
this.$message.error('网络出现点问题')
})
},
getIcdType() {
// http://dev-sc.yunqueyi.com/basic-data/constants?typeCode=P227
openLoading(this);
this.$axios.get(localStorage.getItem("lectureUrl") + '/basic-data/constants?typeCode=P227', {} )
.then((res) => {
closeLoading(this);
// console.log('类型》》》》》》》》》》》》》》》》》》 ', res.data)
let data = res.data;
if(data.code == "000000") {
if (data.data && data.data.length > 0) {
this.icdTypeList = data.data;
}else {
this.icdTypeList = [];
}
}else {
this.$message.error(data.message);
}
}).catch((error) => {
this.$message.error('网络出现点问题')
})
},
returnICDType(type) {
let list = this.icdTypeList;
if(list && list.length > 0){
for(let i=0; i<list.length; i++){
if( list[i].no == type ){
return list[i].value;
}
}
}else{
return '';
}
},
handleNewAdd() {
this.newVisible = true;
this.$refs['addSubmitForm'] && this.$refs['addSubmitForm'].resetFields();
},
handleSubmit() {
this.$refs['addSubmitForm'].validate((valid) => {
if (valid) { // 验证 pass
// 请求 编码是否重复、名称是否重复接口,
// this.checkRepeat();
openLoading(this);
this.$axios.get(localStorage.getItem("lectureUrl") + `/medicineDictionary/icdContents/check/${this.addSubmitForm.icdCode}/${this.addSubmitForm.diseaseName}`, {} )
.then((res) => {
closeLoading(this);
// console.log('校验是否重复 ', res.data)
let data = res.data;
if(data.code == "216003") { // ICD 编码重复
this.$message({
showClose: true,
message: 'ICD编码与现有编码重复!请修改后再提交~',
type: 'error',
customClass: 'icd-code-repeat'
});
return;
}else if(data.code == "216005"){ // ICD 名称重复
this.isDiseaseNameRepeat = true;
this.confirmAddVisible = true;
}else if(data.code == "000000"){
this.isDiseaseNameRepeat = false;
this.confirmAddVisible = true;
}else{
this.isDiseaseNameRepeat = false;
this.$message.error(data.message);
}
}).catch((error) => {
this.$message.error('网络出现点问题')
})
} else {
console.log('error submit!!');
return false;
}
});
},
handleBack() {
this.confirmAddVisible = false;
},
// 新增 最终确认
handleSubmitConfirm() {
let data = this.addSubmitForm;
let cb = () => {
this.confirmAddVisible = false;
this.newVisible = false;
this.getList();
};
this.addOrEdit(data, cb);
},
handleEdit(row) {
// console.log('row... ', row)
this.editVisible = true;
const { diseaseName, icdCode, icdType, alias, id, icdTypeValue } = row;
let data = {
diseaseName,
icdCode,
icdType,
alias,
id,
icdTypeValue,
};
this.rowData = data;
},
handleConfirmEdit() {
const { diseaseName, icdCode, icdType, alias, id } = this.rowData;
let data = {
diseaseName,
icdCode,
icdType,
alias,
id,
};
let cb = () => {
this.editVisible = false;
this.getList();
}
this.addOrEdit(data, cb);
},
// 新增或编辑
addOrEdit(data, cb){
openLoading(this);
this.$axios.post(localStorage.getItem("lectureUrl") + '/medicineDictionary/icdContents', data )
.then((res) => {
closeLoading(this);
// console.log('新增最终结果:', res);
cb && cb();
}).catch((error) => {
this.$message.error('网络出现点问题')
})
},
handleChangeStop(row) {
this.showStopOrActiveModal = true;
this.currentRowData = row;
},
handleFinalConfirmStop() {
let row = this.currentRowData;
let data = {
id: row.id,
status: row.status == 1 ? 2 : 1,
}
openLoading(this);
this.$axios.post(localStorage.getItem("lectureUrl") + '/medicineDictionary/icdContents/update/status', data )
.then((res) => {
this.showStopOrActiveModal = false;
closeLoading(this);
// console.log('res>>> ', res.data)
if(res.data.code == '000000'){
this.getList(); // 重新拉去列表
}
}).catch((error) => {
this.$message.error('网络出现点问题')
})
},
}
}
</script>
<style lang="less">
.code-library-wrap{
.top-title{
color: #333333;
}
.pagination-style{
margin-top: 30px;
float: right;
}
.input{ width: 200px; }
.confirm-add{
.el-dialog__body{
padding: 25px 100px 30px;
.info{
overflow: hidden;
&.name-repeat{
line-height: 30px;
color: red;
}
p{
float: left;
line-height: 30px;
}
.title{ width: 70px; }
.value{
width: 400px;
// overflow: hidden;
// text-overflow: ellipsis;
// white-space: nowrap;
}
}
.tips{
text-align: center; color: red; margin-top: 30px;
}
}
}
.edit-dialog-wrap{
.red-star .el-form-item__label::before{
content: '*';
color: #F56C6C;
margin-right: 4px;
}
}
}
.icd-code-repeat{
z-index: 9999 !important;
}
</style>
<template>
<div class="diagnose-manage-wrap">
<h2> 常见诊断</h2>
<el-row :gutter="30" style="margin-top: 20px;">
<el-form
:inline="true"
ref="searchParam"
:model="searchParam"
label-width="100px">
<el-col :span="12">
<el-form-item label="别名:">
<el-input
v-model="searchParam.alias"
size="small"
class="input"
clearable>
</el-input>
</el-form-item>
</el-col>
<el-col :span="12" style="text-align: right">
<el-button type="primary" size="small" @click="searchHandle">搜索</el-button>
<el-button type="success" size="small" @click="addHandle">新增</el-button>
</el-col>
</el-form>
</el-row>
<el-table
:data="tableData"
border
style="width: 100%">
<el-table-column
prop="icdCode"
label="ICD11编码"
min-width="150"
align="center"
></el-table-column>
<el-table-column
prop="diseaseName"
label="名称"
min-width="150"
align="center"
></el-table-column>
<el-table-column
label="别名"
prop="alias"
min-width="150"
align="center"
></el-table-column>
<el-table-column
prop="seqNo"
label="排序"
min-width="220"
align="center">
<template slot-scope="scope">
<div>
<span style="margin-right:15px;">{{ scope.row.seqNo}}</span>
<el-button icon="el-icon-edit" size="mini" @click.prevent="toEidtSort(scope.row)"></el-button>
</div>
<!-- <div v-if="!scope.row.isEdit">
<span style="margin-right:15px;">{{ scope.row.seqNo}}</span>
<el-button icon="el-icon-edit" size="mini" @click.prevent="toEidtSort(scope.row)"></el-button>
</div>
<div v-else>
<el-input
type="text"
size="small"
v-model="scope.row.sortNoEdit"
minlength="1"
maxlength="3"
@keyup.native="validateNumber(scope.row.sortNoEdit,scope.row)"
style="width: 80px">
</el-input>
<el-button size="mini" style="margin-left:10px;" @click.prevent="cancelHandle(scope.row)">取消</el-button>
<el-button type="primary" size="mini" @click.prevent="saveHandle(scope.row)">保存</el-button>
</div>-->
</template>
</el-table-column>
<el-table-column
label="最近更新"
min-width="150"
align="center">
<template slot-scope="scope">
<span>{{ formatDate(scope.row.modifiedTime)}} {{scope.row.modifiedName}}</span>
</template>
</el-table-column>
<el-table-column
label="操作"
fixed="right"
align="center"
min-width="130">
<template slot-scope="scope">
<el-button type="danger" size="small" @click="deleteLayout(scope.row)">移除</el-button>
</template>
</el-table-column>
</el-table>
<el-row type="flex" justify="end" style="margin-top: 20px;">
<el-pagination
background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="searchParam.page"
:page-sizes="[15, 30, 50, 100]"
:page-size="searchParam.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="totalRows">
</el-pagination>
</el-row>
<el-dialog
title="新增"
:visible.sync="dialogVisible"
width="30%"
:close-on-click-modal="false"
:close-on-press-escape="false"
@close="addCancel"
center>
<el-form ref="addForm" :model="addForm" label-width="70px" :rules="rules">
<el-form-item label="别名" prop="alias">
<el-select
v-model="addForm.alias"
filterable
clearable
style="width:80%"
placeholder="请选择ICD11编码别名">
<el-option
v-for="item in aliasList"
:key="item.icdCode"
:label="item.alias"
:value="item.alias"
style="max-width: 600px;">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="排序">
<el-input
v-model="addForm.seqNo"
type="text"
class="input"
minlength="1"
maxlength="3"
@keyup.native="validateNumber(addForm.seqNo,2)"
clearable
style="width:80%"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="addCancel">取 消</el-button>
<el-button type="primary" @click="addConfirm">确 定</el-button>
</span>
</el-dialog>
<el-dialog
title="编辑排序"
:visible.sync="dialogVisibleEdit"
width="450px"
:close-on-click-modal="false"
:close-on-press-escape="false"
@close="editCancel"
center>
<el-form ref="editForm" :model="editForm" label-width="120px" :rules="editRules" label-suffix=":">
<el-form-item label="别名" prop="alias">
<p>{{editForm.alias}}</p>
</el-form-item>
<el-form-item label="当前排序">
<p>{{editForm.seqNo}}</p>
</el-form-item>
<el-form-item label="修改排序">
<el-input
v-model="editForm.seqNoNew"
type="text"
class="input"
minlength="1"
maxlength="3"
@keyup.native="validateNumber(editForm.seqNoNew,1)"
clearable
style="width:80%"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="editCancel">取 消</el-button>
<el-button type="primary" @click="editConfirm">确 定</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import { openLoading, closeLoading, } from '../../common/utils';
export default {
components: {},
data() {
return {
searchParam: {
alias: '',
page: 1,
pageSize: 15,
},
addForm: {
alias: '',
seqNo: null,
},
tableData: [],
totalRows: 1,
dialogVisible: false,
aliasList: [],
dialogVisibleEdit: false,
editForm: {
seqNoNew: '',
},
rules: {
alias: [{ required: true, message: '请选择别名', trigger: 'change' }],
},
editRules : {},
}
},
created() {
this.getCommonList();
this.getAliasList();
},
methods: {
getCommonList() {
let params = {
...this.searchParam,
};
openLoading(this);
this.$axios.get(localStorage.getItem("lectureUrl") + '/medicineDictionary/icdCommonDiagnosis/list',
{ params }
).then((res) => {
closeLoading(this);
let data = res.data;
if(data.code == "000000") {
if (data.data.icdContentsList && data.data.icdContentsList.length > 0) {
this.tableData = data.data.icdContentsList;
this.tableData.map((item) => {
item.isEdit = false;
});
}else {
this.tableData = [];
}
this.totalRows = data.data.total;
}else {
this.$message.error(data.message);
}
}).catch((error) => {
this.$message.error('网络出现点问题')
})
},
getAliasList() {
openLoading(this);
this.$axios.get(localStorage.getItem("lectureUrl") + '/medicineDictionary/icdContents/alias',
).then((res) => {
closeLoading(this);
let data = res.data;
if(data.code == "000000") {
this.aliasList = data.data;
}else {
this.$message.error(data.message);
}
}).catch((error) => {
this.$message.error('网络出现点问题')
})
},
searchHandle() {
this.searchParam.page = 1;
this.getCommonList();
},
addHandle() {
this.dialogVisible = true;
},
deleteLayout(row) {
let params = {
id: row.id
}
this.$confirm('此操作将移除该常用诊断, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
openLoading(this);
this.$axios.delete(localStorage.getItem("lectureUrl") + '/medicineDictionary/icdCommonDiagnosis/',
{data: params}
).then((res) => {
let data = res.data;
if(data.code == "000000") {
this.$message.success('移除成功')
this.searchParam.page = 1;
this.getCommonList();
}else {
this.$message.error(data.message);
}
}).catch((error) => {
this.$message.error('网络出现点问题')
})
}).catch(() => {
this.$message({
type: 'info',
message: '已取消移除'
});
});
},
handleSizeChange(pageSize) {
this.searchParam.pageSize = pageSize;
this.searchParam.page = 1;
this.getCommonList();
},
handleCurrentChange(page) {
this.searchParam.page = page;
this.getCommonList();
},
toEidtSort(row) {
// row.isEdit = true;
this.dialogVisibleEdit = true;
this.editForm = row;
},
cancelHandle(row) {
row.isEdit = false;
row.sortNoEdit = null;
},
saveHandle(row) {
let params = {
seqNo: row.sortNoEdit,
id: row.id,
};
//请求更新排序接口
openLoading(this);
this.$axios.post(localStorage.getItem("lectureUrl") + `/medicineDictionary/icdCommonDiagnosis/update/seqNo`,
params
).then((res) => {
closeLoading(this);
let data = res.data;
if(data.code == "000000") {
row.isEdit = false;
row.sortNoEdit = null;
this.searchParam.page = 1;
this.getCommonList();
}else {
this.$message.error(data.message);
}
}).catch((error) => {
row.isEdit = false;
row.sortNoEdit = null;
this.$message.error('网络出现点问题')
})
//接口请求成功后
// row.seqNo = row.sortNoEdit;
},
addCancel() {
this.dialogVisible = false
this.$refs.addForm.resetFields();
this.addForm.seqNo = null;
},
addConfirm() {
this.$refs['addForm'].validate((valid) => {
if (valid) {
let icdCode;
this.aliasList.map((item) => {
if (item.alias == this.addForm.alias) {
icdCode = item.icdCode;
}
})
let params = {
...this.addForm,
icdCode: icdCode,
};
//请求接口
openLoading(this);
this.$axios.post(localStorage.getItem("lectureUrl") + '/medicineDictionary/icdCommonDiagnosis',
params
).then((res) => {
closeLoading(this);
let data = res.data;
if(data.code == "000000") {
this.$refs.addForm.resetFields();
this.addForm.seqNo = null;
this.dialogVisible = false
this.$message.success('新增成功')
this.searchParam.page = 1;
this.getCommonList();
}else {
this.$message.error(data.message);
}
}).catch((error) => {
this.$message.error('网络出现点问题')
})
} else {
// this.$refs.addForm.resetFields()
return false;
}
});
},
editCancel() {
this.dialogVisibleEdit = false;
},
editConfirm() {
let params = {
seqNo: this.editForm.seqNoNew,
id: this.editForm.id,
};
//请求更新排序接口
openLoading(this);
this.$axios.post(localStorage.getItem("lectureUrl") + `/medicineDictionary/icdCommonDiagnosis/update/seqNo`,
params
).then((res) => {
closeLoading(this);
let data = res.data;
if(data.code == "000000") {
this.dialogVisibleEdit = false;
this.$message.success('修改成功')
this.searchParam.page = 1;
this.getCommonList();
}else {
this.$message.error(data.message);
}
}).catch((error) => {
this.$message.error('网络出现点问题')
})
},
validateNumber(num, pra) {
num = num.replace(/[^\.\d]/g,'');
num = num.replace('.','');
if (num == 0) {
num = null;
}
if (pra === 1) {
this.editForm.seqNoNew = num;
} else if (pra === 2) {
this.addForm.seqNo = num;
} else {
pra.sortNoEdit = num;
}
},
formatDate(now) {
let d = new Date(now);
let year = d.getFullYear();
let month = d.getMonth()+1;
let date = d.getDate();
month = (month < 10) ? `0${month}` : month;
date = (date < 10) ? `0${date}` : date;
return year+"-"+month+"-"+date;
}
}
}
</script>
<style lang="less" scoped>
.diagnose-manage-wrap{
color: #333333;
.el-button--mini, .el-button--mini.is-round{
padding: 5px;
}
}
</style>
<template>
<div class="data-in-wrap">
<h2 class="top-title">数据导入</h2>
</div>
</template>
<script>
import { openLoading, closeLoading, } from '../../common/utils';
export default {
data() {
return {
}
},
created() {
},
methods: {
},
}
</script>
<style lang="less">
.data-in-wrap{
.top-title{
color: #333333;
}
}
</style>
\ No newline at end of file
<template>
<div class="data-view-wrap">
<h2 class="top-title">数据查看</h2>
</div>
</template>
<script>
import { openLoading, closeLoading, } from '../../common/utils';
export default {
data() {
return {
}
},
created() {
},
methods: {
},
}
</script>
<style lang="less">
.data-view-wrap{
.top-title{
color: #333333;
}
}
</style>
\ No newline at end of file
<template>
<div class="layout-const-wrap">
<el-collapse v-model="activeNames" @change="handleChange">
<el-collapse-item name="1">
<template slot="title">
查询条件<span style="float:right;">{{collapseFlag}}</span>
</template>
<el-row :gutter="30" class="row" type="flex" style="margin-bottom:0;">
<el-form ref="form" :model="searchParam" label-suffix=":" label-width="130px" style="width:100%;">
<el-col :span="10">
<el-form-item label="楼层code">
<el-input v-model="searchParam.floorCode" placeholder="请输入楼层code" style="width:288px;"></el-input>
</el-form-item>
</el-col>
<el-col :span="11">
<el-form-item label="楼层名称">
<el-input v-model="searchParam.floorName" placeholder="请输入楼层名称" style="width:288px;"></el-input>
</el-form-item>
</el-col>
<el-col :span="3" style="padding:0;text-align:right;padding-right:15px;">
<el-button type="primary" size="small" @click="search">查询</el-button>
<el-button type="default" size="small" @click="reset" style="margin-left:0;">重置</el-button>
</el-col>
</el-form>
</el-row>
</el-collapse-item>
</el-collapse>
<el-row :gutter="10" class="row create-button" style="margin-right:0;">
<el-button type="primary" size="small" @click="create">新建楼层常量</el-button>
</el-row>
<!-- 表格 -->
<el-table
:data="tableData"
style="width: 100%">
<el-table-column prop="seqNo" label="楼层常量排序" min-width="150" align="center"></el-table-column>
<el-table-column prop="floorCode" label="楼层code" min-width="140" align="center"></el-table-column>
<el-table-column label="楼层名称" prop="floorName" min-width="200" align="center"></el-table-column>
<el-table-column prop="floorDesc" label="楼层描述" min-width="200" align="center"></el-table-column>
<el-table-column label="操作" fixed="right" align="center" min-width="200">
<template slot-scope="scope">
<el-button type="primary" size="small" @click="editColumn(scope.row)">编辑</el-button>
<el-button type="danger" size="small" @click="deleteLayout(scope.row)">删除</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<div class="pagination">
<el-pagination
background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="searchParam.pageNo"
:page-sizes="[15, 30, 50, 100, 200, 500, 700, 1000, 1500, 2000]"
:page-size="searchParam.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="totalRows">
</el-pagination>
</div>
<!-- 新建活动 -->
<el-dialog class="img-edit" :title="dialogTitle" :visible.sync="createActivityVisible" :close-on-click-modal="false">
<el-form ref="form" :model="contentTemplate" label-suffix=":" :rules="rules" label-width="130px" style="width:100%;">
<el-form-item label="楼层code" prop="floorCode">
<el-input v-model="contentTemplate.floorCode" placeholder="请输入楼层code" style="width:288px;"></el-input>
</el-form-item>
<el-form-item label="楼层名称" prop="floorName">
<el-input v-model="contentTemplate.floorName" placeholder="请输入楼层名称" style="width:288px;"></el-input>
</el-form-item>
<el-form-item label="楼层常量排序" prop="seqNo">
<el-input v-model="contentTemplate.seqNo" placeholder="请输入楼层常量排序" style="width:288px;"></el-input>
</el-form-item>
<el-form-item label="楼层描述" prop="floorDesc">
<el-input v-model="contentTemplate.floorDesc" placeholder="请输入楼层描述" style="width:288px;"></el-input>
</el-form-item>
<el-form-item label="楼层关系" prop="relationCode">
<el-input v-model="contentTemplate.relationCode" placeholder="请输入楼层关系" style="width:288px;"></el-input>
</el-form-item>
<el-form-item label="楼层图片" prop="imageUrl">
<el-upload
v-model="contentTemplate.imageUrl"
class="bg-uploader"
action="#"
:show-file-list="false"
:before-upload="layoutImgUrl">
<img v-show="contentTemplate.imageUrl" :src="contentTemplate.imageUrl" class="bg-img">
<img v-show="!contentTemplate.imageUrl" class="bg-img" src="../../../static/img/small.png">
</el-upload>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="createSave">保存</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { doUpload, getFilePath } from "../../common/qiniuUtil";
import {setOptionLabel,
initDepartment,
isEmptyUtils,
errorResponseCheck,
openLoading,
closeLoading,
messageBox,
getConstantList,getPositionList, isNotEmptyList} from '../../common/utils'
let vm = null
export default {
data() {
return {
collapseFlag: '收起',
dialogTitle: '新增楼层',
activeNames: ['1'],
createActivityVisible: false,
escPressFlg: false,//弹出层是否可以按ESC关闭
totalRows: 0,
searchParam: {
floorCode: '',
floorName: '',
pageNo: 1,
pageSize: 15
},
tableData: [],
contentTemplate: {
id: '',
floorCode: '',
floorName: '',
floorDesc: '',
seqNo: '',
relationCode: '',
imageUrl: ''
},
rules: {
"floorCode": [
{ required: true, message: '请输入楼层code', trigger: 'blur' }
],
"floorName": [
{ required: true, message: '请输入楼层名称', trigger: 'blur' }
],
"imageUrl": [
{ required: true, message: '请输入楼层图片', trigger: 'blur' }
]
}
}
},
created() {
vm = this
vm.search()
},
methods: {
//展开 收起
handleChange(arr) {
vm.collapseFlag = arr.length > 0 ? "收起" : "展开"
},
// 查询按钮
search() {
openLoading(vm);
let req = {
params: {
floorCode: vm.searchParam.floorCode,
floorName: vm.searchParam.floorName,
pageNo: vm.searchParam.pageNo,
pageSize: vm.searchParam.pageSize
},
};
vm.$axios.get(localStorage.getItem("msUrl") + 'homeFloorConstants/queryConstants'
, req).then(function (res) {
closeLoading(vm);
let data = JSON.parse(JSON.stringify(res.data.data));//通过这个实现深拷贝
vm.tableData = data.ConstantsList;
vm.totalRows = data.totalRows;
}).catch(function (error) {
errorResponseCheck(error, vm);
});
},
// 重置按钮
reset() {
vm.searchParam.floorCode = ''
vm.searchParam.floorName = ''
vm.searchParam.id = ''
vm.search()
},
// 新建楼层常量
create() {
vm.dialogTitle = '新增楼层常量'
vm.createActivityVisible = true
vm.contentTemplate.id = ''
vm.contentTemplate.floorCode = ''
vm.contentTemplate.floorName = ''
vm.contentTemplate.floorDesc = ''
vm.contentTemplate.seqNo = ''
vm.contentTemplate.relationCode = ''
vm.contentTemplate.imageUrl = ''
},
// 编辑楼层常量
editColumn(row) {
vm.$nextTick(() => {
vm.$refs.form.resetFields()
})
vm.dialogTitle = '编辑楼层常量'
vm.createActivityVisible = true
vm.contentTemplate = Object.assign({},row)
},
// 新增(修改)楼层常量信息
createSave() {
vm.$refs.form.validate((valid) => {
if (valid) {
vm.$axios.post(localStorage.getItem("msUrl") + 'homeFloorConstants/insertOrUpdate'
, vm.contentTemplate).then(function (res) {
if(res.data.code == "000000") {
vm.createActivityVisible = false
vm.$message({
type: 'success',
message: '保存成功!'
})
vm.search()
}
}).catch(function (error) {
vm.$message.error('保存失败')
})
} else {
return false;
}
});
},
// 删除楼层
deleteLayout(row) {
let req = {
params: {
id: row.id
}
}
vm.$axios.get(localStorage.getItem("msUrl") + 'homeFloorConstants/deleteById',req).then((res)=> {
if(res.data.code == "000000") {
vm.$message({
type: 'success',
message: '删除成功!'
})
vm.search()
}
}).catch((error) => {
vm.$message.error('删除失败')
})
},
// 上传楼层图片
layoutImgUrl(file) {
if (isEmptyUtils(file)) {
return;
}
vm.$message.info('开始上传');
doUpload(vm,file, getFilePath(file,null), 'preview4', 'progress1', 1).then(function (path) {
vm.contentTemplate.imageUrl = path.fullPath
vm.$message.success('上传成功')
});
// return false;
},
// 修改分页
handleSizeChange(value) {
vm.searchParam.pageSize = value
vm.search()
},
handleCurrentChange(value) {
vm.searchParam.pageNo = value
vm.search()
}
}
}
</script>
<style>
.layout-const-wrap .el-collapse {
border-top: 0;
}
.layout-const-wrap .el-collapse-item__wrap {
border-bottom: 0;
}
.layout-const-wrap .el-collapse-item__content {
padding-bottom: 0;
}
.acilayout-consttvity-wrap .el-collapse-item__header {
color: #409EFF;
}
.layout-const-wrap .el-collapse-item__wrap {
border-top: 1px solid #dcdfe6;
}
.layout-const-wrap .row {
margin-top: 20px;
margin-bottom:20px;
}
.layout-const-wrap .item-label {
white-space: nowrap;
}
.layout-const-wrap .label-row {
padding-top: 10px;
}
.layout-const-wrap .search-button {
text-align: right;
margin-top:20px;
}
.layout-const-wrap .create-button {
padding-top: 20px;
margin-top: 0 !important;
border-top: 1px solid #dcdfe6;
text-align: right;
}
.layout-const-wrap .el-table__header thead tr th {
background: #fafafa !important;
}
.layout-const-wrap .creat-form {
height: 550px;
overflow-y: auto;
overflow-x: hidden;
}
.layout-const-wrap .dialog-footer {
text-align: center;
}
.layout-const-wrap .dialog-footer button {
width: 150px;
height: 30px;
line-height: 8px;
}
.layout-const-wrap .el-table th>.cell{
color: #000;
}
.layout-const-wrap .el-form {
overflow: hidden;
}
.layout-const-wrap .bg-img {
width:80px;
height:80px;
}
</style>
<template>
<div class="layout-wrap">
<el-row :gutter="30" class="content-title" type="flex">
<el-col :span="4" class="name-label">
<h5>楼层管理</h5>
</el-col>
</el-row>
<el-row :gutter="30" class="row" type="flex" style="margin-bottom:0;display:none">
<el-form ref="form" :model="searchParam" label-suffix=":" label-width="130px" style="width:100%;">
<el-col :span="10">
<el-form-item label="" prop="shareFlag">
<el-radio-group v-model="webAndnativeLable" @change="webAndnative">
<el-radio label="native"></el-radio>
<el-radio label="h5"></el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-form>
</el-row>
<el-row :gutter="10" class="row create-button" style="margin-right:0;">
<el-button type="primary" size="small" @click="createLayout">新建楼层</el-button>
</el-row>
<!-- 表格 -->
<el-table :data="tableData" style="width: 100%">
<el-table-column label="楼层排序" width="200">
<template slot-scope="scope">
<input type="text" v-model="scope.row.seqNo" size="small">
</template>
</el-table-column>
<el-table-column prop="floorName" label="楼层名称" min-width="200" align="center"></el-table-column>
<el-table-column label="支持版本" min-width="200" align="center">
<template slot-scope="scope">
<span>{{ scope.row | getVersion }}</span>
</template>
</el-table-column>
<el-table-column prop="createdTime" label="最后修改时间" min-width="200" align="center"></el-table-column>
<el-table-column label="是否支持下拉刷新" min-width="120" align="center">
<template slot-scope="scope">
<span>{{ scope.row.freshFlag | refreshType}}</span>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" align="left" min-width="200">
<template slot-scope="scope">
<el-button type="primary" size="small" @click="editColumn(scope.row)">编辑</el-button>
<el-button type="danger" size="small" @click="deleteControl(scope.row)">删除</el-button>
</template>
</el-table-column>
</el-table>
<div class="save-btn">
<el-button size="small" type="primary" @click="editTabSave">保 存</el-button>
</div>
<!-- 新建楼层 -->
<el-dialog class="img-edit" :title="dialogTitle" :visible.sync="createActivityVisible" :close-on-click-modal="false">
<el-form ref="form" :model="submitLayout" label-suffix=":" label-width="130px" style="width:100%;">
<el-form-item prop="shareFlag" v-if="addLayout">
<el-radio-group v-model="shareLable" @change="isSelect">
<div class="layout-content" v-for="(item,index) in allLayoutList" :key="index">
<el-radio :label="item.floorCode + '&' + item.floorName">
<div class="layout-text">{{item.floorDesc}}</div>
<img class="bg-img" :src="item.imageUrl">
</el-radio>
</div>
</el-radio-group>
</el-form-item>
<el-form-item label="是否支持下拉刷新" prop="shareFlag">
<el-radio-group v-model="isResearchLable" @change="refleshSelect">
<el-radio label="支持"></el-radio>
<el-radio label="不支持"></el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="支持版本">
<el-col :span="5">
<el-select v-model="submitLayout.appVersion" placeholder="请选择">
<el-option
v-for="item in versionList"
:key="item"
:label="item"
:value="item">
</el-option>
</el-select>
</el-col>
<el-col :span="1"> &nbsp </el-col>
<el-col :span="12">
<el-radio-group v-model="submitLayout.range">
<el-radio :label=1>向上支持</el-radio>
<el-radio :label=2>向下支持</el-radio>
</el-radio-group>
</el-col>
</el-form-item>
<el-form-item label="是否显示图片" >
<el-radio-group v-model="submitLayout.isShow" @change="refleshSelect">
<el-radio :label='1'>显示</el-radio>
<el-radio :label='2'>不显示</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item v-if="submitLayout.isShow == 1" label="图片" >
<el-upload
v-model="submitLayout.imgUrl"
class="bg-uploader"
action="#"
accept="image/jpeg,image/jpg,image/png"
:show-file-list="false"
:before-upload="layoutImgUrl">
<img v-show="submitLayout.imgUrl" :src="submitLayout.imgUrl" class="bg-img">
<img v-show="!submitLayout.imgUrl" class="bg-img" src="../../../static/img/small.png">
</el-upload>
<div class="img-p">
<p>高度36px</p>
</div>
</el-form-item>
<el-form-item label="链接" prop="linkUrl" v-if="isWebLayout">
<el-input v-model="submitLayout.linkUrl" placeholder="" style="width:84%"></el-input>
</el-form-item>
<div v-if="submitLayout.isShow == 1">
<el-form-item label="“更多”文案">
<el-input v-model="submitLayout.content" placeholder="" style="width:84%"></el-input>
</el-form-item>
<el-form-item label="更多跳转">
</el-form-item>
<el-form-item label="链接类型">
<el-select v-model="submitLayout.linkType" placeholder="请选择" @change="linkChange" style="width:84%">
<el-option
v-for="item in linkSelect"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="选择模块" v-if="submitLayout.linkType == 4">
<el-select v-model="submitLayout.name" placeholder="请选择" @change="moduleChange" style="width:84%">
<el-option
v-for="item in modelList"
:key="item.id"
:label="item.name"
:value="item.name">
</el-option>
</el-select>
</el-form-item>
<div v-for="(i,j) in paramList2" :key="j" >
<el-form-item label="选择参数" v-if="submitLayout.linkType == 4 && paramFlagStatus == 1">
<el-select v-model="submitLayout.parameter[j]" filterable placeholder="请选择参数" style="width:84%">
<el-option
v-for="(item3,index3) in i"
:key="index3"
:label="item3.name"
:value="item3.id + '&'+ item3.name">
</el-option>
</el-select>
</el-form-item>
</div>
</div>
<el-form-item label="资源关联" >
<el-select v-model="submitLayout.templateCode" placeholder="请选择" style="width:84%">
<el-option
v-for="item in templateList"
:key="item.templateCode"
:label="item.name"
:value="item.templateCode">
</el-option>
</el-select>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="createSave">提交</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { doUpload, getFilePath } from "../../common/qiniuUtil";
import {setOptionLabel,
initDepartment,
isEmptyUtils,
errorResponseCheck,
openLoading,
closeLoading,
messageBox,
getConstantList,getPositionList, isNotEmptyList} from '../../common/utils'
let vm = null
export default {
data() {
return {
dialogTitle: '新增楼层',
editLayout: '编辑楼层',
createActivityVisible: false,
addLayout: false,
isWebLayout: false,
showType: '',
searchParam: {},
tableData: [],
allLayoutList: [],
webAndnativeLable: '',
isResearchLable: '',
shareLable: '',
isNativeorH5: '',
listId: '',
submitLayout: {
id: '',
floorCode: '',
floorName: '',
freshFlag: '',
seqNo: '',
linkUrl: '',
imgUrl: '',
isShow: 1,
appVersion: '',
range: 1,
content: '',
linkType: 8,
name: '',
parameter: [],
templateCode: '',
},
versionList: [],
linkSelect: [],
modelList: [],
paramList2: [],
chooseModel: {
code: null,
type: null,
paramFlag: 1,
},
selectParamData: {},
floorModel: {},
templateList: [],
paramFlagStatus: '',
optionStatus: '',
}
},
created() {
vm = this
vm.search()
vm.getAppVersion()
vm.getLinkType()
vm.getModuleData()
vm.queryResourceList()
},
methods: {
// 查询楼层信息
search() {
openLoading(vm);
vm.$axios.get(localStorage.getItem("msUrl") + 'homeFloor/queryList').then(function (res) {
closeLoading(vm);
let data = JSON.parse(JSON.stringify(res.data.data));//通过这个实现深拷贝
if(data.typeConfig) {
vm.isNativeorH5 = data.typeConfig.showType
vm.listId = data.typeConfig.id
if(vm.isNativeorH5 == 1) {
vm.webAndnativeLable = "native"
vm.showType = 1
}else{
vm.webAndnativeLable = "h5"
vm.showType = 2
}
}else{
vm.webAndnativeLable = ''
}
vm.tableData = data.floorList
}).catch(function (error) {
errorResponseCheck(error, vm);
});
},
// 上传楼层图片
layoutImgUrl(file) {
if (isEmptyUtils(file)) {
return;
}
var _img = new FileReader()
_img.readAsDataURL(file)
_img.onload = function(theFile) {
let image = new Image()
image.src = theFile.target.result
image.onload = function() {
let _this = this
if(_this.height != 36) {
vm.$message.info("上传图片尺寸大小不合适,请重新上传")
}else {
vm.$message.info('开始上传');
openLoading(vm)
doUpload(vm,file, getFilePath(file,null), 'preview4', 'progress1', 1).then(function (path) {
closeLoading(vm)
vm.submitLayout.imgUrl = path.fullPath
vm.$message.success('上传成功')
});
}
}
}
// return false;
},
// 选择native or h5
webAndnative(value) {
if(value == 'native') {
vm.showType = 1
}else if(value == 'h5') {
vm.showType = 2
}
},
//查询所有楼层常量信息
getAllLayout() {
vm.$axios.get(localStorage.getItem("msUrl") + 'homeFloorConstants/queryAllConstants').then(function (res) {
closeLoading(vm);
let data = JSON.parse(JSON.stringify(res.data.data));//通过这个实现深拷贝
vm.allLayoutList = data
}).catch(function (error) {
errorResponseCheck(error, vm);
});
},
// 新建楼层
createLayout() {
vm.dialogTitle = '新增楼层'
vm.optionStatus = 'create'
vm.createActivityVisible = true
vm.addLayout = true
vm.submitLayout.seqNo = vm.tableData.length
vm.submitLayout.floorCode = ''
vm.submitLayout.floorName = ''
vm.submitLayout.freshFlag = 1
vm.submitLayout.isShow = 1
vm.submitLayout.imgUrl = ''
// vm.submitLayout.appVersion = vm.versionList[0]
vm.submitLayout.appVersion = '3.0.4'
vm.submitLayout.range = 1
vm.submitLayout.content = ''
vm.submitLayout.linkType = 8
vm.submitLayout.name = ''
vm.submitLayout.parameter = [],
vm.submitLayout.templateCode = '',
vm.isResearchLable = '支持'
// vm.linkSelect = [];
vm.getAllLayout()
// vm.getLinkType()
// vm.getModuleData();
},
// 编辑模板内容
editColumn(row) {
vm.dialogTitle = '编辑楼层'
vm.optionStatus = 'edit'
vm.createActivityVisible = true
vm.addLayout = false
vm.submitLayout.id = row.id
vm.submitLayout.seqNo = row.seqNo
vm.submitLayout.floorCode = row.floorCode
vm.submitLayout.floorName = row.floorName
vm.submitLayout.freshFlag = row.freshFlag
vm.submitLayout.isShow = row.isShow
vm.submitLayout.imgUrl = row.imgUrl
if(row.freshFlag == 1) {
vm.isResearchLable = '支持'
}else{
vm.isResearchLable = '不支持'
}
if(row.floorCode == 'H000') {
vm.isWebLayout = true
vm.submitLayout.linkUrl = row.linkUrl
}else{
vm.isWebLayout = false
}
// vm.linkSelect = [];
this.selectFloorById(row.id);
// vm.getLinkType()
// vm.getModuleData();
},
// 选中楼层
isSelect(value) {
let floorInfo = value.split('&')
vm.submitLayout.floorCode = floorInfo[0]
vm.submitLayout.floorName = floorInfo[1]
if(floorInfo[0] == 'H000') {
vm.isWebLayout = true
}else{
vm.isWebLayout = false
}
},
// 是否支持下拉刷新
refleshSelect(value) {
if(value == '支持') {
vm.submitLayout.freshFlag = 1
}else if(value == '不支持') {
vm.submitLayout.freshFlag = 2
}
},
// 提交新增楼层
createSave() {
if(vm.addLayout){
if(!vm.submitLayout.floorCode) {
vm.$message.info("请选择楼层")
return
}
if(!vm.submitLayout.freshFlag) {
vm.$message.info("请选择是否支持下拉刷新")
return
}
if(vm.isWebLayout) {
if(!vm.submitLayout.linkUrl) {
vm.$message.info("请输入链接")
return
}
}
}else{
if(!vm.submitLayout.freshFlag) {
vm.$message.info("请选择是否支持下拉刷新")
return
}
if(vm.isWebLayout) {
if(!vm.submitLayout.linkUrl) {
vm.$message.info("请输入链接")
return
}
}
}
if(vm.submitLayout.isShow == 1) {
if(vm.submitLayout.imgUrl == '' || vm.submitLayout.imgUrl == null) {
vm.$message.info("请上传图片")
return
}
}
if(vm.submitLayout.isShow == 2) {
vm.submitLayout.imgUrl = '';
}
if(vm.submitLayout.content.length > 0) {
if(vm.submitLayout.content.length > 6) {
vm.$message.info("“更多”文案 限6字")
return
}
if(vm.submitLayout.linkType != 4) {
vm.$message.info("填写“更多”文案后,必须选择模块")
return
}
}
if(vm.submitLayout.linkType == 4) {
if(vm.submitLayout.content.length == 0) {
vm.$message.info("选择模块后,必须填写“更多”文案")
return
}
}
let submitData = this.setSubmitData();
// console.log('submitData:',submitData);
openLoading(vm);
vm.$axios.post(localStorage.getItem("msUrl") + 'homeFloor/insertOrUpdateFloorDetail'
, submitData).then(function (res) {
closeLoading(vm);
if(res.data.code == "000000") {
vm.createActivityVisible = false
vm.$message({
type: 'success',
message: '保存成功!'
})
vm.search()
}
}).catch(function (error) {
vm.$message.error('保存失败')
})
},
// 下线(删除)
deleteControl(row) {
this.$confirm('此操作将删除该楼层, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
let req = {
params: {
id: row.id
}
}
vm.$axios.get(localStorage.getItem("msUrl") + 'homeFloor/deleteFloorById'
, req).then(function (res) {
if(res.data.code == '000000') {
vm.$message({
type: 'success',
message: '删除成功!'
})
vm.search()
}
}).catch(function (error) {
errorResponseCheck(error, vm);
});
}).catch(() => {
this.$message({
type: 'info',
message: '已取消删除'
})
})
},
// 保存
editTabSave() {
let data = {
typeConfig: {
showType: vm.showType,
id: vm.listId
},
detailConfig: vm.tableData
}
if(!data.typeConfig.showType) {
vm.$message.info("请选择native或者h5")
return
}
// 楼层不可重复判断
let seqNoArray = []
let nary = []
for(let i=0;i<data.detailConfig.length;i++) {
seqNoArray.push(parseInt(data.detailConfig[i].seqNo))
}
nary = seqNoArray.slice().sort();
for(let i=0;i<seqNoArray.length;i++){
if (nary[i]==nary[i+1]){
vm.$message.info("楼层排序重复内容:"+nary[i])
return
}
}
openLoading(vm);
vm.$axios.post(localStorage.getItem("msUrl") + 'homeFloor/deploy'
, data).then(function (res) {
closeLoading(vm);
if(res.data.code == "000000") {
vm.$message({
type: 'success',
message: '保存成功!'
})
vm.search()
}
}).catch(function (error) {
vm.$message.error('保存失败')
})
},
// 新增功能
setSubmitData() {
let submitData = {};
vm.submitParam();
// console.log('提交表单optionStatus:',vm.optionStatus)
if(vm.optionStatus == 'edit') {
submitData = {
model:{
tHomeFloorDetailConfig:{
id: vm.submitLayout.id,
floorCode: vm.submitLayout.floorCode,
floorName: vm.submitLayout.floorName,
freshFlag: vm.submitLayout.freshFlag,
seqNo: vm.submitLayout.seqNo,
linkUrl: vm.submitLayout.linkUrl,
status: 1,
imgUrl: vm.submitLayout.imgUrl,
isShow: vm.submitLayout.isShow,
appVersion: vm.submitLayout.appVersion,
range: vm.submitLayout.range,
content: vm.submitLayout.content,
templateCode: vm.submitLayout.templateCode,
},
contentAppModule:{
code: vm.chooseModel.code,//
type: vm.chooseModel.type,//
name: vm.submitLayout.name,
linkType: vm.submitLayout.linkType,
paramFlag: vm.chooseModel.paramFlag,
status: vm.floorModel.tHomeFloorDetailConfig.status,//
deleteFlag: vm.floorModel.tHomeFloorDetailConfig.deleteFlag,
createdId: vm.floorModel.tHomeFloorDetailConfig.createdId,
createdTime: vm.floorModel.tHomeFloorDetailConfig.createdTime,
modifiedId: vm.floorModel.tHomeFloorDetailConfig.modifiedId,
modifiedTime: vm.floorModel.tHomeFloorDetailConfig.modifiedTime
},
paramList:[]
}
}
let configData = vm.selectParamData.config;
for(let j=0;j<vm.submitLayout.parameter.length;j++) {
submitData.model.paramList[j] = {};
submitData.model.paramList[j].id = configData[j].id;
submitData.model.paramList[j].moduleId = configData[j].moduleId;
submitData.model.paramList[j].key = configData[j].paramKey;
submitData.model.paramList[j].value = vm.submitLayout.parameter[j];
submitData.model.paramList[j].type = configData[j].type;
submitData.model.paramList[j].seqNo = configData[j].seqNo;
submitData.model.paramList[j].status = configData[j].status;
submitData.model.paramList[j].deleteFlag = vm.floorModel.tHomeFloorDetailConfig.deleteFlag;
submitData.model.paramList[j].createdId = configData[j].createdId;
submitData.model.paramList[j].createdTime = configData[j].createdTime;
submitData.model.paramList[j].modifiedId = configData[j].modifiedId;
submitData.model.paramList[j].modifiedTime = configData[j].modifiedTime;
}
} else {
submitData = {
model:{
tHomeFloorDetailConfig:{
floorCode: vm.submitLayout.floorCode,
floorName: vm.submitLayout.floorName,
freshFlag: vm.submitLayout.freshFlag,
seqNo: vm.submitLayout.seqNo,
linkUrl: vm.submitLayout.linkUrl,
status: 1,
imgUrl: vm.submitLayout.imgUrl,
isShow: vm.submitLayout.isShow,
appVersion: vm.submitLayout.appVersion,
range: vm.submitLayout.range,
content: vm.submitLayout.content,
templateCode: vm.submitLayout.templateCode,
},
contentAppModule:{
code: vm.chooseModel.code,//
type: vm.chooseModel.type,//
name: vm.submitLayout.name,
linkType: vm.submitLayout.linkType,
paramFlag: vm.chooseModel.paramFlag,
status: '',
deleteFlag: 1,
createdId: '',
createdTime: '',
modifiedId: '',
modifiedTime: '',
},
paramList:[]
}
}
let configData = vm.selectParamData.config;
for(let j=0;j<vm.submitLayout.parameter.length;j++) {
submitData.model.paramList[j] = {};
submitData.model.paramList[j].id = configData[j].id;
submitData.model.paramList[j].moduleId = configData[j].moduleId;
submitData.model.paramList[j].key = configData[j].paramKey;
submitData.model.paramList[j].value = vm.submitLayout.parameter[j];
submitData.model.paramList[j].type = configData[j].type;
submitData.model.paramList[j].seqNo = configData[j].seqNo;
submitData.model.paramList[j].status = configData[j].status;
submitData.model.paramList[j].deleteFlag = 1;
submitData.model.paramList[j].createdId = configData[j].createdId;
submitData.model.paramList[j].createdTime = configData[j].createdTime;
submitData.model.paramList[j].modifiedId = configData[j].modifiedId;
submitData.model.paramList[j].modifiedTime = configData[j].modifiedTime;
}
}
return submitData;
},
setFloor(data) {
// console.log(data);
this.submitLayout.appVersion = data.tHomeFloorDetailConfig.appVersion;
this.submitLayout.range = data.tHomeFloorDetailConfig.range;
this.submitLayout.content = data.tHomeFloorDetailConfig.content;
this.submitLayout.linkType = data.contentAppModule.linkType;
this.submitLayout.name = data.contentAppModule.name;
this.submitLayout.templateCode = data.tHomeFloorDetailConfig.templateCode;
this.initParam();
vm.submitLayout.parameter = [];
for(let j=0;j<vm.floorModel.paramList.length;j++) {
vm.submitLayout.parameter[j] = vm.floorModel.paramList[j].value;
}
//编辑时候linkType为空赋值8(无跳转)
if(vm.submitLayout.linkType == null) {
vm.submitLayout.linkType = 8;
}
},
// new-根据ID查询楼层信息
selectFloorById(id) {
vm.$axios.get(localStorage.getItem("msUrl") + 'homeFloor/selectFloorById?id='+id).then(function (res) {
if(res.data.code == "000000") {
vm.floorModel = res.data.data.model;
vm.setFloor(res.data.data.model);
vm.initParamFlag();
}
}).catch(function (error) {
vm.$message.error(error);
});
},
// 获取APP版本号
getAppVersion() {
vm.$axios.get(localStorage.getItem("msUrl") + 'version/versionList').then(function (res) {
if(res.data.code == "000000") {
vm.versionList = res.data.data.versionName
}
}).catch(function (error) {
vm.$message.error(error);
});
},
// 获取链接类型下拉数据
getLinkType() {
let req = {
params: {
code: 'C005'
},
};
vm.$axios.get(localStorage.getItem("msUrl") + 'commonComstant/selectByTypeCode'
, req).then(function (res) {
if(res.data.code == "000000") {
let linkObject = JSON.parse(JSON.stringify(res.data.data));//通过这个实现深拷贝
let keys = Object.keys(linkObject);
for(var i=0;i<keys.length;i++) {
vm.linkSelect.push({
label: linkObject[keys[i]],
value: keys[i] - 0
})
}
}
}).catch(function (error) {
vm.$message.error(error);
});
},
// 获取模块下拉数据
getModuleData() {
vm.$axios.get(localStorage.getItem("msUrl") + 'moduleConfig/selectName').then(function (res) {
if(res.data.code == "000000") {
let moduleArray = JSON.parse(JSON.stringify(res.data.data))
vm.modelList = moduleArray.nameList;
}
}).catch(function (error) {
vm.$message.error(error);
});
},
// change链接类型
linkChange(value) {
this.submitLayout.name = '';
},
initParamFlag() {
for(let i = 0; i < vm.modelList.length; i++) {
if(vm.submitLayout.name == vm.modelList[i].name) {
// console.log('initParamFlag:',vm.modelList[i])
vm.paramFlagStatus = vm.modelList[i].paramFlag;
}
}
},
// change模块选择数据
moduleChange(value) {
for(let z=0;z<vm.submitLayout.parameter.length;z++) {
vm.submitLayout.parameter[z] = '';
}
for(let i = 0; i < vm.modelList.length; i++) {
if(value == vm.modelList[i].name) {
console.log('moduleChange',vm.modelList[i])
vm.paramFlagStatus = vm.modelList[i].paramFlag
vm.getParamData(vm.modelList[i].id,vm.modelList[i].paramFlag,2)
break
}
}
},
initParam() {
if(vm.modelList.length == 0) {
return;
}
for(let i=0;i<vm.modelList.length;i++) {
if(vm.modelList[i].name == vm.submitLayout.name) {
console.log('modelList:',vm.modelList[i]);
vm.chooseModel = vm.modelList[i];
vm.getParamData(vm.modelList[i].id,vm.modelList[i].paramFlag,1)
}
}
},
submitParam() {
for(let i=0;i<vm.modelList.length;i++) {
if(vm.modelList[i].name == vm.submitLayout.name) {
console.log('submitParam:',vm.modelList[i]);
vm.chooseModel = vm.modelList[i];
}
}
},
getParamData(id,flag,enter) {
console.log('flag值:',flag);
if(flag == 1) { // 是否有参数
let req = {
params: { id: id }
}
vm.$axios.get(localStorage.getItem("msUrl") + 'moduleConfig/selectParam'
, req).then(function (res) {
if(res.data.code == "000000") {
vm.paramList2 = res.data.data.paramList;
if(enter == 2) {
vm.submitLayout.parameter = [];
for(let j=0;j<vm.paramList2.length;j++) {
vm.submitLayout.parameter[j] = '';
}
}
vm.selectParamData = res.data.data;
}
}).catch(function (error) {
vm.$message.error(error);
})
}else{
return false
}
},
//查询资源名称和templateCode
queryResourceList() {
vm.$axios.get(localStorage.getItem("msUrl") + 'contentResourceField/queryResourceList').then(function (res) {
if(res.data.code == "000000") {
vm.templateList = res.data.data;
}
}).catch(function (error) {
vm.$message.error(error);
});
},
}
}
</script>
<style>
.layout-wrap .row {
margin-top: 20px;
margin-bottom:20px;
}
.layout-wrap .item-label {
white-space: nowrap;
}
.layout-wrap .label-row {
padding-top: 10px;
}
.layout-wrap .search-button {
text-align: right;
margin-top:20px;
}
.layout-wrap .create-button {
padding-top: 20px;
margin-top: 0 !important;
/* border-top: 1px solid #dcdfe6; */
text-align: right;
}
.layout-wrap .el-table__header thead tr th {
background: #fafafa !important;
}
.layout-wrap .creat-form {
height: 550px;
overflow-y: auto;
overflow-x: hidden;
}
.layout-wrap .course .el-upload{
border: 1px solid #71AEED;
border-radius: 2px;
}
.layout-wrap .bg-uploader {
float: left;
}
.layout-wrap .bg-img {
width:80px;
height:80px;
}
.layout-wrap .el-upload {
position: relative;
}
.layout-wrap .el-upload .info-img{
width: 73px;
position: absolute;
left: 2px;
top: -5px;
opacity: 0;
}
.layout-wrap .el-upload .info-img:hover{
opacity: 1;
}
.layout-wrap .img-size p{
font-size: 12px;
}
.layout-wrap .img-size p:nth-child(1){
margin-top: 45px;
}
.layout-wrap .dialog-footer {
text-align: center;
}
.layout-wrap .dialog-footer button {
width: 150px;
height: 30px;
line-height: 8px;
}
.layout-wrap .el-table th>.cell{
color: #000;
}
.layout-wrap .el-upload-list--text li {
min-width: 250px;
max-width: 60%;
}
.layout-wrap .el-form {
overflow: hidden;
}
.layout-wrap .save-btn {
text-align: center;
margin-top: 20px;
}
.layout-wrap .layout-content {
display: inline-block;
width: 33%;
margin-bottom: 20px;
}
.layout-wrap .el-table__row input {
border: none;
}
/* .layout-wrap .img-edit .el-radio__label {
display: block;
} */
.layout-wrap .layout-text {
width:150px;
padding: 10px 0;
}
.layout-wrap .img-p {
margin: 30px 0 0 20px;
float:left;
}
</style>
const state = {
userInfo: {},
token: '',
initFileType: [ // 资源类型
{ id: 1, name: '视频' },
{ id: 2, name: '音频' },
{ id: 3, name: '文档' },
{ id: 4, name: '图片' }
]
}
export default state
import Vue from "vue";
import Vuex from "vuex";
import state from "./state";
Vue.use(Vuex)
export default new Vuex.Store({
state
})
.header{
background-color: #242f42;
}
.login-wrap{
background: #324157;
}
.plugins-tips{
background: #eef1f6;
}
.plugins-tips a{
color: #20a0ff;
}
.el-upload--text em {
color: #20a0ff;
}
.pure-button{
background: #20a0ff;
}
\ No newline at end of file
.vue-datasource *{
box-sizing: border-box;
font-size: 14px;
}
.vue-datasource .panel {
margin-bottom: 22px;
background-color: #fff;
border: 1px solid transparent;
border-radius: 4px;
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);
}
.vue-datasource .panel-default {
border-color: #d3e0e9;
}
.vue-datasource .panel-heading {
padding: 10px 15px;
border-bottom: 1px solid transparent;
border-top-right-radius: 3px;
border-top-left-radius: 3px;
}
.vue-datasource .panel-default > .panel-heading {
height:56px;
color: #333333;
background-color: #fff;
border-color: #d3e0e9;
}
.vue-datasource .pull-left {
float: left !important;
}
.vue-datasource .pull-right {
float: right !important;
}
.vue-datasource .form-group {
margin-bottom: 15px;
}
.vue-datasource label {
display: inline-block;
max-width: 100%;
margin-bottom: 5px;
font-weight: bold;
}
.vue-datasource .form-control {
display: block;
width: 100%;
height: 36px;
padding: 6px 12px;
font-size: 14px;
line-height: 1.6;
color: #555555;
background-color: #fff;
background-image: none;
border: 1px solid #ccd0d2;
border-radius: 4px;
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;
transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;
}
.vue-datasource .btn {
display: inline-block;
margin-bottom: 0;
font-weight: normal;
text-align: center;
vertical-align: middle;
touch-action: manipulation;
cursor: pointer;
background-image: none;
border: 1px solid transparent;
white-space: nowrap;
padding: 6px 12px;
font-size: 14px;
line-height: 1.6;
border-radius: 4px;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.vue-datasource .btn-primary {
color: #fff;
background-color: #3097D1;
border-color: #2a88bd;
}
.vue-datasource .table {
width: 100%;
max-width: 100%;
margin-bottom: 22px;
border-collapse: collapse;
border-spacing: 0;
text-align: center;
}
.vue-datasource .table > thead > tr > th {
vertical-align: bottom;
border-bottom: 2px solid #ddd;
}
.vue-datasource .table th ,.vue-datasource .table td {
padding: 8px;
line-height: 1.6;
vertical-align: top;
border-top: 1px solid #ddd;
}
.vue-datasource .table-striped > tbody > tr:nth-of-type(odd) {
background-color: #f9f9f9;
}
.vue-datasource .success th ,.vue-datasource .success td{
background-color: #dff0d8;
}
.vue-datasource .pagination {
display: inline-block;
padding-left: 0;
margin: 22px 0;
border-radius: 4px;
}
.vue-datasource .pagination > li {
display: inline;
}
.pagination > li > a,.pagination > li > span {
position: relative;
float: left;
padding: 6px 12px;
line-height: 1.6;
text-decoration: none;
color: #3097D1;
background-color: #fff;
border: 1px solid #ddd;
margin-left: -1px;
}
.pagination > .disabled > span, .pagination > .disabled > span:hover, .pagination > .disabled > span:focus, .pagination > .disabled > a, .pagination > .disabled > a:hover, .pagination > .disabled > a:focus {
color: #777777;
background-color: #fff;
border-color: #ddd;
cursor: not-allowed;
}
.pagination > .active > a, .pagination > .active > a:hover, .pagination > .active > a:focus, .pagination > .active > span, .pagination > .active > span:hover, .pagination > .active > span:focus {
z-index: 3;
color: #fff;
background-color: #3097D1;
border-color: #3097D1;
cursor: default;
}
.vue-datasource .pagination > li:first-child > a, .vue-datasource .pagination > li:first-child > span {
margin-left: 0;
border-bottom-left-radius: 4px;
border-top-left-radius: 4px;
}
.vue-datasource .text-center {
text-align: center;
}
@media (min-width: 768px){
.form-inline .form-group {
display: inline-block;
margin-bottom: 0;
vertical-align: middle;
}
.form-inline .control-label {
margin-bottom: 0;
vertical-align: middle;
}
.form-inline .form-control {
display: inline-block;
width: auto;
vertical-align: middle;
}
}
*{margin:0;padding:0;}
html,body,#app,.wrapper{
width:100%;
height:100%;
overflow: hidden;
}
body{
font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB,Microsoft YaHei, SimSun, sans-serif;
}
a{text-decoration: none}
.content{
background: none repeat scroll 0 0 #fff;
position: absolute;
left: 250px;
right: 0;
top: 70px;
bottom:0;
width: auto;
padding:20px 40px;
box-sizing: border-box;
overflow-y: scroll;
}
.crumbs{
margin-bottom: 20px;
}
.pagination{
margin: 20px 0;
text-align: right;
}
.plugins-tips{
padding:20px 10px;
margin-bottom: 20px;
}
.el-button+.el-tooltip {
margin-left: 10px;
}
.el-table tr:hover{
background: #f6faff;
}
.mgb20{
margin-bottom: 20px;
}
.move-enter-active,.move-leave-active{
transition: opacity .5s;
}
.move-enter,.move-leave{
opacity: 0;
}
/*BaseForm*/
.form-box{
width:600px;
}
.form-box .line{
text-align: center;
}
.el-time-panel__content::after, .el-time-panel__content::before {
margin-top: -7px;
}
/*Readme*/
.ms-doc .el-checkbox__input.is-disabled+.el-checkbox__label{
color: #333;
cursor: pointer;
}
/*Upload*/
.pure-button{
width:150px;
height:40px;
line-height: 40px;
text-align: center;
color: #fff;
border-radius: 3px;
}
.g-core-image-corp-container .info-aside{
height:45px;
}
.el-upload--text {
/*background-color: #fff;*/
/*border: 1px dashed #d9d9d9;*/
border-radius: 6px;
box-sizing: border-box;
/*width: 360px;*/
/*height: 180px;*/
text-align: center;
cursor: pointer;
position: relative;
overflow: hidden;
}
.el-upload--text .el-icon-upload {
font-size: 67px;
color: #97a8be;
margin: 40px 0 16px;
line-height: 50px;
}
.el-upload--text {
color: #97a8be;
font-size: 14px;
text-align: center;
}
.el-upload--text em {
font-style: normal;
}
/*VueEditor*/
.ql-container{
min-height: 400px;
}
.ql-snow .ql-tooltip{
transform: translateX(117.5px) translateY(10px) !important;
}
.editor-btn{
margin-top: 20px;
}
.header{
background-color: #00d1b2;
}
.login-wrap{
background: rgba(56, 157, 170, 0.82);;
}
.plugins-tips{
background: #f2f2f2;
}
.plugins-tips a{
color: #00d1b2;
}
.el-upload--text em {
color: #00d1b2;
}
.pure-button{
background: #00d1b2;
}
.vue-datasource .btn-primary {
color: #fff;
background-color: #00d1b2 !important;
border-color: #00d1b2 !important;
}
.pagination > .active > a, .pagination > .active > a:hover, .pagination > .active > a:focus, .pagination > .active > span, .pagination > .active > span:hover, .pagination > .active > span:focus {
background-color: #00d1b2 !important;
border-color: #00d1b2 !important;
}
\ No newline at end of file
因为 它太大了无法显示 源差异 。您可以改为 查看blob
{
"pagination": {
"total": 15,
"per_page": 15,
"current_page": 1,
"last_page": 1,
"from": 1,
"to": 15
},
"data": [
{
"id": 1,
"name": "Jaylen Schmidt",
"email": "aheaney@example.org",
"city": "Conroyburgh",
"company": "Kunde, Gerhold and Runte",
"job": "Soil Scientist",
"created_at": "2017-01-13 19:17:16",
"updated_at": "2017-01-13 19:17:16"
},
{
"id": 2,
"name": "Ms. Desiree Franecki III",
"email": "pweissnat@example.net",
"city": "New Mathew",
"company": "Davis Ltd",
"job": "Customer Service Representative",
"created_at": "2017-01-13 19:17:16",
"updated_at": "2017-01-13 19:17:16"
},
{
"id": 3,
"name": "Clyde Corwin",
"email": "rolfson.lexus@example.com",
"city": "East Ron",
"company": "Zieme and Sons",
"job": "Claims Taker",
"created_at": "2017-01-13 19:17:16",
"updated_at": "2017-01-13 19:17:16"
},
{
"id": 4,
"name": "Mr. Tyrese Kuphal",
"email": "libby.heaney@example.com",
"city": "Cristianland",
"company": "Abernathy LLC",
"job": "Occupational Health Safety Technician",
"created_at": "2017-01-13 19:17:16",
"updated_at": "2017-01-13 19:17:16"
},
{
"id": 5,
"name": "Ms. Amya West PhD",
"email": "uheller@example.org",
"city": "Treutelmouth",
"company": "Mraz-Effertz",
"job": "Hazardous Materials Removal Worker",
"created_at": "2017-01-13 19:17:16",
"updated_at": "2017-01-13 19:17:16"
},
{
"id": 6,
"name": "Murphy Stamm IV",
"email": "ckautzer@example.com",
"city": "Myleneshire",
"company": "Sporer-Wolf",
"job": "Pipelaying Fitter",
"created_at": "2017-01-13 19:17:16",
"updated_at": "2017-01-13 19:17:16"
},
{
"id": 7,
"name": "Elsa Jast",
"email": "kaitlyn.lang@example.net",
"city": "Mariahstad",
"company": "Hackett LLC",
"job": "Record Clerk",
"created_at": "2017-01-13 19:17:16",
"updated_at": "2017-01-13 19:17:16"
},
{
"id": 8,
"name": "Hardy Mosciski DVM",
"email": "soledad44@example.net",
"city": "Jasminborough",
"company": "Haley Ltd",
"job": "Kindergarten Teacher",
"created_at": "2017-01-13 19:17:16",
"updated_at": "2017-01-13 19:17:16"
},
{
"id": 9,
"name": "Demarcus Littel",
"email": "americo84@example.com",
"city": "New Lilaton",
"company": "Satterfield Group",
"job": "Plant Scientist",
"created_at": "2017-01-13 19:17:16",
"updated_at": "2017-01-13 19:17:16"
},
{
"id": 10,
"name": "Dr. Shad Gleichner",
"email": "eleanora23@example.com",
"city": "Lake Whitneyberg",
"company": "Fay Group",
"job": "Rotary Drill Operator",
"created_at": "2017-01-13 19:17:16",
"updated_at": "2017-01-13 19:17:16"
},
{
"id": 11,
"name": "Milford Mann",
"email": "shartmann@example.net",
"city": "Lake Austinport",
"company": "Sporer-Langosh",
"job": "Social and Human Service Assistant",
"created_at": "2017-01-13 19:17:16",
"updated_at": "2017-01-13 19:17:16"
},
{
"id": 12,
"name": "Prof. Mustafa Lindgren Sr.",
"email": "lizeth.morissette@example.net",
"city": "Roweborough",
"company": "Mitchell-Ratke",
"job": "Shoe Machine Operators",
"created_at": "2017-01-13 19:17:16",
"updated_at": "2017-01-13 19:17:16"
},
{
"id": 13,
"name": "Mrs. Brittany Bode Sr.",
"email": "wiegand.mozelle@example.org",
"city": "South Maxwellville",
"company": "Reilly Inc",
"job": "Bridge Tender OR Lock Tender",
"created_at": "2017-01-13 19:17:16",
"updated_at": "2017-01-13 19:17:16"
},
{
"id": 14,
"name": "Dariana Bauch",
"email": "dessie.schamberger@example.net",
"city": "East Linnie",
"company": "Wuckert PLC",
"job": "Elementary and Secondary School Administrators",
"created_at": "2017-01-13 19:17:16",
"updated_at": "2017-01-13 19:17:16"
},
{
"id": 15,
"name": "Jalon Renner",
"email": "lulu45@example.net",
"city": "New Rashad",
"company": "Muller-Kuhn",
"job": "Manufactured Building Installer",
"created_at": "2017-01-13 19:17:16",
"updated_at": "2017-01-13 19:17:16"
}
]
}
\ No newline at end of file
{
"data": [{
"id": 1,
"name": "段娜",
"email": "g.rgiuory@kctbut.mw",
"ip": "68.28.4.232"
},
{
"id": 2,
"name": "蔡洋",
"email": "y.mwjjoje@lpkshev.tg",
"ip": "22.126.12.189"
},
{
"id": 3,
"name": "陈敏",
"email": "e.voaiiuo@mvng.sn",
"ip": "227.89.13.37"
},
{
"id": 4,
"name": "朱平",
"email": "e.lduuf@nkfypn.az",
"ip": "9.39.240.243"
},
{
"id": 5,
"name": "侯平",
"email": "t.czqjyndts@jmwenklns.md",
"ip": "178.162.29.113"
},
{
"id": 6,
"name": "常超",
"email": "d.dhysgem@uxpcutmlk.tt",
"ip": "192.50.103.170"
},
{
"id": 7,
"name": "许平",
"email": "g.fiqdonvbc@wanepptw.tv",
"ip": "73.20.99.60"
},
{
"id": 8,
"name": "毛超",
"email": "w.unyyejh@qus.gt",
"ip": "10.88.135.123"
},
{
"id": 9,
"name": "周磊",
"email": "e.qbejguqqg@ejpxhltoak.gw",
"ip": "244.221.237.210"
},
{
"id": 10,
"name": "胡秀英",
"email": "s.dszo@uxaojtj.sy",
"ip": "86.199.17.210"
}
],
"pagination": {
"total": 15,
"per_page": 15,
"current_page": 1,
"last_page": 1,
"from": 1,
"to": 15
}
}
\ No newline at end of file
因为 它太大了无法显示 源差异 。您可以改为 查看blob
{
"list": [{
"date": "1997-11-11",
"name": "林丽",
"address": "吉林省 辽源市 龙山区"
}, {
"date": "1987-09-24",
"name": "文敏",
"address": "江西省 萍乡市 芦溪县"
}, {
"date": "1996-08-08",
"name": "杨秀兰",
"address": "黑龙江省 黑河市 五大连池市"
}, {
"date": "1978-06-18",
"name": "魏强",
"address": "广东省 韶关市 始兴县"
}, {
"date": "1977-07-09",
"name": "石秀兰",
"address": "江苏省 宿迁市 宿豫区"
}, {
"date": "1994-09-20",
"name": "朱洋",
"address": "海外 海外 -"
}, {
"date": "1980-01-22",
"name": "傅敏",
"address": "海外 海外 -"
}, {
"date": "1985-10-10",
"name": "毛明",
"address": "内蒙古自治区 包头市 九原区"
}, {
"date": "1975-09-08",
"name": "何静",
"address": "西藏自治区 阿里地区 普兰县"
}, {
"date": "1970-06-07",
"name": "郭秀英",
"address": "四川省 巴中市 恩阳区"
}]
}
\ No newline at end of file
// A custom Nightwatch assertion.
// The assertion name is the filename.
// Example usage:
//
// browser.assert.elementCount(selector, count)
//
// For more information on custom assertions see:
// http://nightwatchjs.org/guide#writing-custom-assertions
exports.assertion = function (selector, count) {
this.message = 'Testing if element <' + selector + '> has count: ' + count
this.expected = count
this.pass = function (val) {
return val === this.expected
}
this.value = function (res) {
return res.value
}
this.command = function (cb) {
var self = this
return this.api.execute(function (selector) {
return document.querySelectorAll(selector).length
}, [selector], function (res) {
cb.call(self, res)
})
}
}
require('babel-register')
var config = require('../../config')
// http://nightwatchjs.org/gettingstarted#settings-file
module.exports = {
src_folders: ['test/e2e/specs'],
output_folder: 'test/e2e/reports',
custom_assertions_path: ['test/e2e/custom-assertions'],
selenium: {
start_process: true,
server_path: require('selenium-server').path,
host: '127.0.0.1',
port: 4444,
cli_args: {
'webdriver.chrome.driver': require('chromedriver').path
}
},
test_settings: {
default: {
selenium_port: 4444,
selenium_host: 'localhost',
silent: true,
globals: {
devServerURL: 'http://localhost:' + (process.env.PORT || config.dev.port)
}
},
chrome: {
desiredCapabilities: {
browserName: 'chrome',
javascriptEnabled: true,
acceptSslCerts: true
}
},
firefox: {
desiredCapabilities: {
browserName: 'firefox',
javascriptEnabled: true,
acceptSslCerts: true
}
}
}
}
// 1. start the dev server using production config
process.env.NODE_ENV = 'testing'
const webpack = require('webpack')
const DevServer = require('webpack-dev-server')
const webpackConfig = require('../../build/webpack.prod.conf')
const devConfigPromise = require('../../build/webpack.dev.conf')
let server
devConfigPromise.then(devConfig => {
const devServerOptions = devConfig.devServer
const compiler = webpack(webpackConfig)
server = new DevServer(compiler, devServerOptions)
const port = devServerOptions.port
const host = devServerOptions.host
return server.listen(port, host)
})
.then(() => {
// 2. run the nightwatch test suite against it
// to run in additional browsers:
// 1. add an entry in test/e2e/nightwatch.conf.js under "test_settings"
// 2. add it to the --env flag below
// or override the environment flag, for example: `npm run e2e -- --env chrome,firefox`
// For more information on Nightwatch's config file, see
// http://nightwatchjs.org/guide#settings-file
let opts = process.argv.slice(2)
if (opts.indexOf('--config') === -1) {
opts = opts.concat(['--config', 'test/e2e/nightwatch.conf.js'])
}
if (opts.indexOf('--env') === -1) {
opts = opts.concat(['--env', 'chrome'])
}
const spawn = require('cross-spawn')
const runner = spawn('./node_modules/.bin/nightwatch', opts, { stdio: 'inherit' })
runner.on('exit', function (code) {
server.close()
process.exit(code)
})
runner.on('error', function (err) {
server.close()
throw err
})
})
// For authoring Nightwatch tests, see
// http://nightwatchjs.org/guide#usage
module.exports = {
'default e2e tests': function (browser) {
// automatically uses dev Server port from /config.index.js
// default: http://localhost:8080
// see nightwatch.conf.js
const devServer = browser.globals.devServerURL
browser
.url(devServer)
.waitForElementVisible('#app', 5000)
.assert.elementPresent('.hello')
.assert.containsText('h1', 'Welcome to Your Vue.js App')
.assert.elementCount('img', 1)
.end()
}
}
{
"env": {
"jest": true
},
"globals": {
}
}
const path = require('path')
module.exports = {
rootDir: path.resolve(__dirname, '../../'),
moduleFileExtensions: [
'js',
'json',
'vue'
],
moduleNameMapper: {
'^@/(.*)$': '<rootDir>/src/$1'
},
transform: {
'^.+\\.js$': '<rootDir>/node_modules/babel-jest',
'.*\\.(vue)$': '<rootDir>/node_modules/vue-jest'
},
testPathIgnorePatterns: [
'<rootDir>/test/e2e'
],
snapshotSerializers: ['<rootDir>/node_modules/jest-serializer-vue'],
setupFiles: ['<rootDir>/test/unit/setup'],
mapCoverage: true,
coverageDirectory: '<rootDir>/test/unit/coverage',
collectCoverageFrom: [
'src/**/*.{js,vue}',
'!src/main.js',
'!src/router/index.js',
'!**/node_modules/**'
]
}
import Vue from 'vue'
Vue.config.productionTip = false
import Vue from 'vue'
import HelloWorld from '@/components/HelloWorld'
describe('HelloWorld.vue', () => {
it('should render correct contents', () => {
const Constructor = Vue.extend(HelloWorld)
const vm = new Constructor().$mount()
expect(vm.$el.querySelector('.hello h1').textContent)
.toEqual('Welcome to Your Vue.js App')
})
})
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册