提交 74286733 编写于 作者: haoguojing's avatar haoguojing

创建项目

上级 ec5770ef
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'
}
}
// 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": {}
}
}
# 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:8181
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
# 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:8181 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
// 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(' Build complete.\n'))
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
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: true
// 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: './',
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: 8181,
autoOpenBrowser: true,
assetsSubDirectory: 'static',
assetsPublicPath: '/',
proxyTable: {
'/api':{
target:'http://localhost:8099',
changeOrigin:true,
pathRewrite:{
'/api':''
}
},
'/ms':{
target: 'http://localhost:8099',
changeOrigin: true
}
},
proxypath: 'http://localhost:8099',
// 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="http://pv.sohu.com/cityjson?ie=utf-8"></script>
<!--oss upload start-->
<script src="http://gosspublic.alicdn.com/aliyun-oss-sdk-4.4.4.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.15.3",
"babel-polyfill": "^6.23.0",
"element-ui": "1.3.1",
"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-xlsx-table": "^1.2.8"
},
"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.0",
"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",
"opn": "^4.0.2",
"ora": "^1.2.0",
"semver": "^5.3.0",
"shelljs": "^0.7.6",
"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"
]
}
<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>
//bus.js
import Vue from 'vue'
export default new Vue();
import {isNotEmptyUtils} from "./utils";
import Vue from 'vue';
/**
* 配置编译环境和线上环境之间的切换
*/
const getTestEnv = (ipAddress) => {
let environments = ["uat", "test3", "test2", "test1"];
for (let i = 0; i < environments.length; i++) {
if (ipAddress.indexOf(environments[i]) > -1) {
return environments[i];
}
}
return null;
};
//获取服务器路径
export const getAddress = () => {
let ipAddress = "http://" + window.location.host;
// let ipAddress = "http://localhost:8099";
let env = getTestEnv(ipAddress);
let resource_url = "";
let locationHost = "";//模板文件路径
let stsUrl = "";//sts服务器//获取OSS客户端
let bucketName = "";
let endpoint = "";
let Url = "";//访问后台的域名
let ossLogin = "";//内部系统登录页面
let template_url = "" //题库模板服务器
//本地
if (ipAddress.indexOf("localhost") > -1 || ipAddress.indexOf("127.0.0.1") > -1 || ipAddress.indexOf("test-kf") > -1) {
ipAddress = "http://localhost:7070";
resource_url = "https://test-file.yunqueyi.com";
locationHost = "http://test-kf.yunqueyi.com";
stsUrl = "http://uat-api.yunqueyi.com/middle/oss/token";//sts服务器
bucketName = "pica-test-huabei2";
endpoint = "oss-cn-beijing.aliyuncs.com";
Url = ipAddress + "/PICA_PL_BE/rest/";
ossLogin = "http://localhost:8090/PICA_SSO_FE/html/pica_login.html";
template_url = ipAddress
} else if (isNotEmptyUtils(env)) {//测试test1 test2 uat
resource_url = "https://test-file.yunqueyi.com";
locationHost = "http://" + env + "-admin-md.yunqueyi.com";
stsUrl = "http://" + env + "-api.yunqueyi.com/middle/oss/token";//sts服务器
bucketName = "pica-test-huabei2";
endpoint = "oss-cn-beijing.aliyuncs.com";
Url = ipAddress + "/api/";
ossLogin = "http://" + env + ".yunqueyi.com";
template_url = "https://" + env + "-project.yunqueyi.com";
} else {//生产环境
resource_url = "https://file.yunqueyi.com";
locationHost = ipAddress;
stsUrl = "http://api.yunqueyi.com/middle/oss/token";//sts服务器
bucketName = "pica-pro";
endpoint = "oss-cn-shanghai.aliyuncs.com";
Url = ipAddress + "/PICA_PL_BE/rest/";
ossLogin = "http://sso.yunqueyi.com";
template_url = "http://project.yunqueyi.com";
}
localStorage.setItem("resource_url", resource_url);
localStorage.setItem("locationHost", locationHost);
localStorage.setItem("Url", 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);
};
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') {
let dataStr = ''; //数据拼接字符串
Object.keys(data).forEach(key => {
dataStr += key + '=' + data[key] + '&';
})
if (dataStr !== '') {
dataStr = dataStr.substr(0, dataStr.lastIndexOf('&'));
url = url + '?' + dataStr;
}
}
if (window.fetch && method == 'fetch') {
let requestConfig = {
credentials: 'include',
method: type,
headers: {
'Accept': '*',
'Content-Type': 'application/json',
},
//mode: "no-cors",
// cache: "force-cache"
}
if (type == 'POST') {
Object.defineProperty(requestConfig, 'body', {
value: JSON.stringify(data)
})
}
try {
console.log("req",requestConfig)
const response = await fetch(url, requestConfig);
const responseJson = await response.json();
console.log("res",responseJson)
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)
}
}
}
})
}
}
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) {
//sts服务器
let stsUrl = localStorage.getItem("stsUrl") + "/" + localStorage.getItem("token");
//获取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 = () => {
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("PICAPositionServiceImpl/getProvinceList",
num,
'POST'
);
return promise;
},
//获取省分(区域权限)
getProvinceByRegionRole(){
let promise = new Promise(function(resolve, reject) {
var num = {token: localStorage.getItem("token")};
let ret = fetch('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("PICAPositionServiceImpl/getCityList", num);
return promise;
},
getCountyListData(city_id,success, error, otherOptions) {
var num = {
city_id : city_id
}
let promise = fetch("PICAPositionServiceImpl/getCountyList",num);
return promise;
},
//获取乡镇
getTownListData(county_id,success) {
var num = {
county_id : county_id
}
let promise = fetch("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("PICAAddressHospitalServiceImpl/postHospitalListByRank", num);
return promise;
}
}
//共通函数
Array.prototype.contains = function (str) {
if (str == null) {
return false;
} else {
for (let i = 0; i < this.length; i++) {
if (str.indexOf(this[i]) != -1) {
return true;
}
}
}
return false;
};
// 时间处理
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) {
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;
}
};
export const ssoLogin = (href, pars) => {
console.log("ssoLogin开始");
if (isNotEmptyUtils(pars)) {
let paramArr = getUrlParams(pars, "&");
if (isNotEmptyUtils(paramArr)) {
for (let i = 0; i < paramArr.length; i++) {
for (let key in paramArr[i]) {
// localStorage.setItem(key, paramArr[i][key]);
if (key == "token") {
localStorage.setItem("token", paramArr[i][key]);
} else if (key == "ssoOrigin") {
localStorage.setItem("ssoOrigin", paramArr[i][key]);
localStorage.setItem("logoutUrl", paramArr[i][key] + "/PICA_SSO_FE/html/pica_login.html");
} else if (key == "system_type") {
localStorage.setItem("system_type", paramArr[i][key]);
}
}
}
}
//获取用户系统信息
initEnvironment();
console.log(localStorage.getItem("token"));
//initFlag 0:获取菜单 1:不获取菜单
localStorage.setItem("initFlag", "0");
console.log("ssoLogin结束");
}
};
//单点登录--end
//退出登录,跳转到登录页面
export const logout = () => {
let url = localStorage.getItem("Url");
let logoutUrl = localStorage.getItem("logoutUrl");
localStorage.clear();
localStorage.setItem("Url", url);
localStorage.setItem("logoutUrl", logoutUrl);
if (isEmptyUtils(logoutUrl) || logoutUrl == 'null') {
window.location.href = localStorage.getItem("ssoLogin");
} else {
window.location.href = logoutUrl;
}
};
/**
* 消息提示 确定或取消
* @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,
type: type,
callback: action => {
// self.$message({
// type: 'info',
// message: `action: ${ action }`
// });
if (confirmFunction instanceof Function) {
confirmFunction();
}
}
});
}
};
/**
*请求失败时判断
*
* @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 num = {
numMap: codeObject
};
self.$axios.post(
localStorage.getItem("Url") + "PICAConstantsServiceImpl/getConstantsListByMap",
JSON.stringify(num)
).then(function (data) {
for (let item in data.data) {
self[item] = data.data[item];
}
});
};
<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">
{{name}}<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>
<!--<span @click="test()">test按钮</span>-->
</div>
</div>
</template>
<script>
import {logout} from "../../common/utils";
import {positionService} from '../../common/position_service.js';
export default {
data() {
return {
name: localStorage.getItem("user_name")
}
},
computed: {},
methods: {
handleCommand(command) {
if (command == 'logout') {
let url = localStorage.getItem("Url") + 'PICALoginAndRegisterServiceImpl/postLogoutAdmin';
let req = {token: localStorage.getItem("token")};
this.$axios.post(url, JSON.stringify(req)).then(function (res) {
console.log("退出登录");
logout();
}).catch(function (error) {
console.log(error);
logout();
});
// this.$router.push('/login');
}
},
test() {
let promise = positionService.getProvinceList();
promise.then(function (success) {
console.log("successData:" + JSON.stringify(success.provinceList));
}, function (fail) {
});
console.log(promise);
}
}
}
</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;
}
</style>
<template>
<div class="wrapper">
<v-head></v-head>
<v-sidebar></v-sidebar>
<div class="content" id="bodyContent">
<transition name="move" mode="out-in">
<router-view></router-view>
</transition>
</div>
</div>
</template>
<script>
import {base64decode,ssoLogin} from "../../common/utils";
import vHead from './Header.vue';
import vSidebar from './Sidebar.vue';
export default {
data: function () {
return {}
},
beforeCreate() {
console.log("beforeCreate方法被执行");
},
created() {
console.log("created方法被执行");
//sso登录时,初始化各种变量
this.initData();
console.log("初始化各种变量完成");
},
methods: {
async initData() {
console.log("initData方法被执行start");
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);
console.log("参数:%s",paramStr);
let pars = base64decode(paramStr);
if (pars.indexOf("token") > -1 && pars.indexOf("ssoOrigin") > -1) {
ssoLogin(href, pars);
}
}
console.log("initData方法被执行end");
// this.$vux.loading.hide()
}
},
components: {
vHead, vSidebar
}
}
</script>
<style>
</style>
<template>
<div class="sidebar">
<el-menu :default-active="onRoutes" default-openeds="['index_0']" 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 {errorResponseCheck, isEmptyUtils} from "../../common/utils";
export default {
data() {
return {items: []}
// return {
// items: [
// {
// icon: 'el-icon-setting',
// index: 'readme',
// title: '自述'
// },
// {
// icon: 'el-icon-menu',
// index: '2',
// title: '表格',
// subs: [
// {
// index: 'basetable',
// title: '基础表格'
// },
// {
// index: 'vuetable',
// title: 'Vue表格组件'
// }
// ]
// },
// {
// icon: 'el-icon-date',
// index: '3',
// title: '表单',
// subs: [
// {
// index: 'baseform',
// title: '基本表单'
// },
// {
// index: 'vueeditor',
// title: '编辑器'
// },
// {
// index: 'markdown',
// title: 'markdown'
// },
// {
// index: 'upload',
// title: '文件上传'
// }
// ]
// },
// {
// icon: 'el-icon-star-on',
// index: 'basecharts',
// title: '图表'
// },
// {
// icon: 'el-icon-upload2',
// index: 'drag',
// title: '拖拽'
// }
// ]
// }
},
created() {
this.getData();
},
methods: {
async getData() {
// if (localStorage.getItem("initFlag") == "0"){
let self = this;
// if(process.env.NODE_ENV === 'development'){
// self.url = 'PICALoginAndRegisterServiceImpl/postMenuVue';
// // self.url = 'http://localhost:9981/PICA_MD_BE/rest/PICALoginAndRegisterServiceImpl/postMenuVue';
// }
//
// var token = "5A8BCFDBF5DDB129C1663E2EE0EC4621";
// var system_type = 12;
// var pro = fetch( self.url,{
// token,
// system_type
// },'POST');
// pro.then(resp =>{
// debugger;
// self.items =resp.picapMenuModels;
// console.log(resp);
// })
//获取菜单
let url = localStorage.getItem("Url") + 'PICALoginAndRegisterServiceImpl/postMenuVue';
let req = {
token: localStorage.getItem("token"),
system_type: localStorage.getItem("system_type"),
device_ip: localStorage.getItem("ipAddress"),
browser_ver: localStorage.getItem("browser")
};
this.$axios.post(url, JSON.stringify(req)).then(function (res) {
console.log("获取菜单成功");
self.items = res.data.picapMenuModels;
let data = JSON.parse(JSON.stringify(res.data));//通过这个实现深拷贝
console.log(data);
localStorage.setItem("privilege_data", JSON.stringify(data.picapMenuModels));
localStorage.setItem("token", data.token);
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
// let firstPage = data.picapMenuModels[0].index;//一级菜单
// if (isEmptyUtils(firstPage)) {
// firstPage = data.picapMenuModels[0].subs[0].index;//二级菜单
// if (isEmptyUtils(firstPage)) {
// firstPage = data.picapMenuModels[0].subs[0].subs[0].index;//三级菜单
// }
// }
// self.$router.push(firstPage);
// console.log("您的首页是:!%s", firstPage);
//window.location.href = url;
// let state = {title: '', url: url};
// history.pushState(state, '', url);
}).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%;
}
</style>
<template>
<div>
<div class="crumbs">
<el-breadcrumb separator="/">
<el-breadcrumb-item><i class="el-icon-date"></i> 图表</el-breadcrumb-item>
<el-breadcrumb-item>基础图表</el-breadcrumb-item>
</el-breadcrumb>
</div>
<div class="plugins-tips">
vue-schart:vue.js封装sChart.js的图表组件。
访问地址:<a href="https://github.com/lin-xin/vue-schart" target="_blank">vue-schart</a>
</div>
<div class="schart">
<div class="content-title">柱状图</div>
<schart canvasId="bar" width="500" height="400" :data="data1" type="bar" :options="options1"></schart>
</div>
<div class="schart">
<div class="content-title">折线图</div>
<schart canvasId="line" width="500" height="400" :data="data1" type="line" :options="options1"></schart>
</div>
<div class="schart">
<div class="content-title">饼状图</div>
<schart canvasId="pie" width="500" height="400" :data="data2" type="pie" :options="options2"></schart>
</div>
<div class="schart">
<div class="content-title">环形图</div>
<schart canvasId="ring" width="500" height="400" :data="data2" type="ring" :options="options2"></schart>
</div>
</div>
</template>
<script>
import Schart from 'vue-schart';
export default {
components: {
Schart
},
data: () => ({
data1:[
{name:'2012',value:1141},
{name:'2013',value:1499},
{name:'2014',value:2260},
{name:'2015',value:1170},
{name:'2016',value:970},
{name:'2017',value:1450}
],
data2 : [
{name:'短袖',value:1200},
{name:'休闲裤',value:1222},
{name:'连衣裙',value:1283},
{name:'外套',value:1314},
{name:'羽绒服',value:2314}
],
options1: {
title: '某商店近年营业总额',
bgColor: '#009688',
titleColor: '#ffffff',
fillColor: '#e0f2f1',
axisColor: '#ffffff',
contentColor: '#999'
},
options2: {
title: '某商店各商品年度销量',
bgColor: '#607d8b',
titleColor: '#ffffff',
legendColor: '#ffffff'
}
})
}
</script>
<style scoped>
.schart{
width: 600px;
display: inline-block;
}
.content-title{
clear: both;
font-weight: 400;
line-height: 50px;
margin: 10px 0;
font-size: 22px;
color: #1f2f3d;
}
</style>
\ No newline at end of file
<template>
<div>
<div class="crumbs">
<el-breadcrumb separator="/">
<el-breadcrumb-item><i class="el-icon-date"></i> 表单</el-breadcrumb-item>
<el-breadcrumb-item>基本表单</el-breadcrumb-item>
</el-breadcrumb>
</div>
<div class="form-box">
<el-form ref="form" :model="form" label-width="80px">
<el-form-item label="表单名称">
<el-input v-model="form.name"></el-input>
</el-form-item>
<el-form-item label="选择器">
<el-select v-model="form.region" placeholder="请选择">
<el-option key="bbk" label="步步高" value="bbk"></el-option>
<el-option key="xtc" label="小天才" value="xtc"></el-option>
<el-option key="imoo" label="imoo" value="imoo"></el-option>
</el-select>
</el-form-item>
<el-form-item label="日期时间">
<el-col :span="11">
<el-date-picker type="date" placeholder="选择日期" v-model="form.date1" style="width: 100%;"></el-date-picker>
</el-col>
<el-col class="line" :span="2">-</el-col>
<el-col :span="11">
<el-time-picker type="fixed-time" placeholder="选择时间" v-model="form.date2" style="width: 100%;"></el-time-picker>
</el-col>
</el-form-item>
<el-form-item label="选择开关">
<el-switch on-text="" off-text="" v-model="form.delivery"></el-switch>
</el-form-item>
<el-form-item label="多选框">
<el-checkbox-group v-model="form.type">
<el-checkbox label="步步高" name="type"></el-checkbox>
<el-checkbox label="小天才" name="type"></el-checkbox>
<el-checkbox label="imoo" name="type"></el-checkbox>
</el-checkbox-group>
</el-form-item>
<el-form-item label="单选框">
<el-radio-group v-model="form.resource">
<el-radio label="步步高"></el-radio>
<el-radio label="小天才"></el-radio>
<el-radio label="imoo"></el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="文本框">
<el-input type="textarea" v-model="form.desc"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmit">提交</el-button>
<el-button>取消</el-button>
</el-form-item>
</el-form>
</div>
</div>
</template>
<script>
export default {
data: function(){
return {
form: {
name: '',
region: '',
date1: '',
date2: '',
delivery: true,
type: ['步步高'],
resource: '小天才',
desc: ''
}
}
},
methods: {
onSubmit() {
this.$message.success('提交成功!');
}
}
}
</script>
\ No newline at end of file
<template>
<div class="question-wrap">
<div class="bind-info" v-if="isUpdate">
<h4 style="padding-bottom: 15px;">已绑定培训考试</h4>
<div class="bind-items">
<div class="bind-item" v-for="(item, i) in bindItems">
{{i + 1 + '. ' + item.responsible_user}}
</div>
<div v-if="!bindItems.length" class="empty">暂无数据</div>
</div>
</div>
<el-row class="search-wrap">
<el-col :span="4" class="name-label">
题库名称
</el-col>
<el-col :span="10">
<el-input v-model="name" placeholder="请输入题库名称"></el-input>
</el-col>
</el-row>
<el-row class="search-wrap" style="padding: 25px 0px 15px 0px;">
<el-col :span="4" class="name-label">
导入题库
</el-col>
<el-col :span="20">
<vue-xlsx-table @on-select-file="handleSelectedFile">选择导入</vue-xlsx-table>
</el-col>
</el-row>
<h4 style="padding-bottom: 15px;">预览题库</h4>
<div class="preview-wrap">
<h4 class="title" v-if="data.length" style="text-align: center">
{{name}} 题库
</h4>
<div class="question-wrap" v-for="(item, index) in data">
<div class="desc">
{{index + 1}}. {{item['title']}}
</div>
<div class="option">
A. {{item['choice_d']}}
</div>
<div class="option">
B. {{item['choice_d']}}
</div>
<div class="option">
C. {{item['choice_c']}}
</div>
<div class="option">
D. {{item['choice_d']}}
</div>
</div>
<div v-if="!data.length" class="empty">暂无数据</div>
</div>
<div class="tool">
<el-button @click="submit" type="primary">确定</el-button>
<el-button @click="cancel">取消</el-button>
</div>
</div>
</template>
<style scoped>
.bind-info {
padding-bottom: 20px;
}
.bind-items {
max-height: 100px;
overflow-y: auto;
border: 1px solid rgba(85, 85, 85, .5);
padding: 20px;
max-width: 1000px;
min-width: 500px;
}
.bind-item {
font-size: 14px;
line-height: 28px;
}
.tool-wrap {
padding: 15px 0;
}
.name-label {
line-height: 2.3;
}
.search {
margin-left: 15px;
}
.search-wrap {
width: 600px;
}
.preview-wrap {
border: 1px solid rgba(85, 85, 85, .5);
padding: 20px;
max-width: 1000px;
min-width: 500px;
max-height: 500px;
overflow-y: auto;
}
.option {
padding-left: 15px;
line-height: 24px;
}
.question-wrap {
margin-top: 20px;
}
.empty {
text-align: center;
}
.desc {
padding-bottom: 10px;
}
.tool {
padding-top: 30px;
padding-left: 353px;
}
</style>
<script>
import fetch from '../../common/fetch';
export default {
data(){
return {
name: '',
data: [],
isUpdate: false,
bindItems: [],
imported: false,
submitted: false
}
},
created() {
this.getDetail()
},
methods: {
getDetail() {
let id = this.$route.query.id
if(id) {
this.isUpdate = true
let para = {
token: localStorage.getItem("token"),
id: id
}
fetch('eagleQuestionCategorys/search', para, 'GET', 'GET').then(data => {
this.bindItems = data.eagleTrainings
this.data = data.eagleSingleSelRepos
this.name = data.eagleQuestionCategoryModel.name
});
}
},
validateFile(head) {
if(head[0].indexOf('题目') == -1) {
return false
}
if(head[1].indexOf('答案') == -1 || head[2].indexOf('答案') == -1 ||head[3].indexOf('答案') == -1
||head[4].indexOf('答案') == -1 ||head[5].indexOf('答案') == -1) {
return false
}
return true
},
handleSelectedFile (convertedData) {
if(!this.validateFile(convertedData.header)) {
this.$message.error('请选择正确的EXCEL文件');
return
}
this.imported = true
let head = convertedData.header
let body = convertedData.body
let data = this.data = []
body.forEach(item => {
data.push({
title: item[head[0]],
choice_a: item[head[1]],
choice_b: item[head[2]],
choice_c: item[head[3]],
choice_d: item[head[4]],
answer: item[head[5]]
})
})
},
cancel() {
this.$router.back()
},
submit() {
if(this.submitted) {
return
} else if(!this.name) {
this.$message.error('请输入题库名称');
return
} else if(!this.data.length) {
this.$message.error('请选择文件');
return
}
let para = {
importQuestion: this.imported,
eagleQuestionCategory: {
id: this.$route.query.id,
name: this.name
},
eagleSingleSelRepos: this.data,
token: localStorage.getItem("token")
}
const loading = this.$loading({
lock: true,
target: '#bodyContent',
text: 'Loading',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.3)'
});
let self = this
fetch('eagleQuestionCategorys/insert', para, 'POST', 'POST').then(data => {
loading.close();
this.submitted = true
this.$message({
message: self.isUpdate ? '编辑成功' : '添加成功',
type: 'success',
duration: 1000,
onClose() {
self.cancel()
}
});
});
}
}
}
</script>
<template>
<section class="main">
<div class="crumbs">
<el-breadcrumb separator="/">
<el-breadcrumb-item><i class="el-icon-upload2"></i> 拖拽排序</el-breadcrumb-item>
</el-breadcrumb>
</div>
<div class="drag-box-left">
<div class="drag-title">拖动排序</div>
<div class="drag-list" draggable="true"
v-for="list in data1"
:data-id="list.id"
@dragstart="dragstartEvent"
@dragend="dragendEvent"
@dragenter="dragenterEvent"
@dragleave="dragleaveEvent"
@dragover="dragoverEvent"
>{{list.title}}</div>
</div>
</section>
</template>
<script>
export default {
data() {
return {
dragElement: null,
lock: true,
data1: [
{id: 1, title: '这里是列表1的标题'},
{id: 2, title: '这里是列表2的标题'},
{id: 3, title: '这里是列表3的标题'},
{id: 4, title: '这里是列表4的标题'},
{id: 5, title: '这里是列表5的标题'},
{id: 6, title: '这里是列表6的标题'},
{id: 7, title: '这里是列表7的标题'}
],
data2: [
{id: 1, title: '这里是列表11的标题'},
{id: 2, title: '这里是列表12的标题'},
{id: 3, title: '这里是列表13的标题'},
{id: 4, title: '这里是列表14的标题'}
]
}
},
methods: {
dragstartEvent(ev) {
const self = this;
self.dragElement = ev.target;
ev.target.style.backgroundColor = '#f8f8f8';
},
dragendEvent(ev) {
ev.target.style.backgroundColor = '#fff';
ev.preventDefault();
},
dragenterEvent(ev) {
const self = this;
if(self.dragElement != ev.target){
ev.target.parentNode.insertBefore(self.dragElement, ev.target);
}
},
dragleaveEvent(ev) {
const self = this;
if(self.dragElement != ev.target){
if(self.lock && (ev.target == ev.target.parentNode.lastElementChild || ev.target == ev.target.parentNode.lastChild)){
ev.target.parentNode.appendChild(self.dragElement);
self.lock = false;
}else{
self.lock = true;
}
}
},
dragoverEvent(ev) {
ev.preventDefault();
}
}
}
</script>
<style scoped>
.drag-box-left{
float: left;
width: 45%;
}
.drag-box-right{
float: right;
width: 45%;
}
.drag-list{
border: 1px solid #ddd;
padding:10px;
margin-bottom: 20px;
transition: border .3s;
}
.drag-list:hover{
border: 1px solid #20a0ff;
}
.drag-title{
font-weight: 400;
line-height: 25px;
margin: 10px 0;
font-size: 22px;
color: #1f2f3d;
}
</style>
\ No newline at end of file
<template>
<div class="question-wrap">
<el-row class="search-wrap">
<el-col :span="4" class="name-label">
题库名称
</el-col>
<el-col :span="10">
<el-input v-model="searchValue" placeholder="单行输入"></el-input>
</el-col>
<el-col :span="4">
<el-button type="primary" @click="search()" class="search"><i class="el-icon-search"></i>&nbsp;搜索</el-button>
</el-col>
</el-row>
<el-row class="tool-wrap">
<el-col :span="12" style="font-size: 14px;line-height: 39px;">
<span style="margin-right: 20px;">下载题库模板</span>
<a href="javascript:" @click="download">雄鹰考试题库.excel</a>
</el-col>
<el-col :span="12" style="text-align: right;">
<el-button type="primary" @click="create">新建</el-button>
</el-col>
</el-row>
<el-table
:data="tableData"
style="width: 100%">
<el-table-column
prop="name"
label="题库名称">
</el-table-column>
<el-table-column
width="200"
prop="upload_time"
label="题库上传时间">
</el-table-column>
<el-table-column
prop="uploader"
label="上传人员">
</el-table-column>
<el-table-column
width="130"
prop="bindDisplay"
label="题库状态">
<template slot-scope="scope">
<el-tag
:type="scope.row.bindDisplay === '未绑定' ? 'primary' : 'success'"
close-transition>{{scope.row.bindDisplay}}</el-tag>
</template>
</el-table-column>
<el-table-column label="操作">
<template slot-scope="scope">
<el-button
size="mini"
@click="update(scope.row)">编辑</el-button>
<el-button
size="mini"
type="danger"
@click="deleteItem(scope.row)">删除</el-button>
</template>
</el-table-column>
</el-table>
<div class="pagination">
<el-pagination
background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="pageNo"
:page-sizes="[15, 30, 50, 100, 200, 500, 700, 1000,1500, 2000]"
:page-size="pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="totalRows">
</el-pagination>
</div>
</div>
</template>
<style scoped>
.binded {
color: #67c23a;
}
.unBinded {
color: #e6a23c;
}
.tool-wrap {
padding: 15px 0;
}
.name-label {
line-height: 2.3;
}
.search {
margin-left: 15px;
}
.search-wrap {
width: 600px;
}
</style>
<script>
import fetch from '../../common/fetch';
export default {
data(){
return {
tableData: [],
pageNo: 1,
pageSize: 15,
totalRows: 0,
searchValue: ''
}
},
created() {
this.search()
},
methods: {
format(data) {
data.forEach( item => {
item.bindDisplay = item.binding_status == 1 ? '已绑定' : '未绑定'
})
return data
},
search(callback) {
const loading = this.$loading({
lock: true,
target: '#bodyContent',
text: 'Loading',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.3)'
});
fetch('eagleQuestionCategorys/list', {
token: localStorage.getItem("token"),
name: this.searchValue,
pageSize: this.pageSize,
pageNo: this.pageNo
}, 'GET', 'GET').then(data => {
loading.close()
this.tableData = this.format(data.pdModelList)
this.totalRows = data.totalRows
callback && callback()
});
},
handleSizeChange(size) {
this.pageSize = size
this.search()
},
handleCurrentChange(no) {
this.pageNo = no
this.search()
},
create() {
this.$router.push({
path: 'create-question'
})
},
update(row) {
this.$router.push({
path: 'create-question',
query: {
id: row.id
}
})
},
deleteItem(row) {
if(row.binding_status == 1) {
this.$message.error('已绑定人员的情况下不允许删除');
return
}
this.$confirm('确定删除此题库', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
const loading = this.$loading({
lock: true,
target: '#bodyContent',
text: 'Loading',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.3)'
});
let para = {
token: localStorage.getItem("token"),
id: row.id
}
fetch('eagleQuestionCategorys/delete', para, 'DELETE', 'DELETE').then(data => {
this.search( () => {
loading.close();
this.$message({
message: '删除成功',
type: 'success',
duration: 1000
});
})
});
})
},
download() {
window.location.href = localStorage.getItem('template_url') + '/File/template/雄鹰考试题库模板.xslx'
}
}
}
</script>
<template>
<div class="table">
<el-row :gutter="10">
<el-col :span="2" class="padding-top-10"><label>活动状态</label></el-col>
<el-col :span="4">
<div class="grid-content bg-purple">
<el-input v-model="eagleTraining.name"></el-input>
</div>
</el-col>
<el-col :span="4">
<div class="grid-content bg-purple"></div>
</el-col>
<el-col :span="4">
<div class="grid-content bg-purple"></div>
</el-col>
<el-col :span="4">
<div class="grid-content bg-purple"></div>
</el-col>
<el-col :span="4">
<div class="grid-content bg-purple"></div>
</el-col>
</el-row>
<el-row :gutter="10" class="row">
<el-col :span="2" :offset="20">
<el-button type="primary" icon="search" @click="search">搜索</el-button>
</el-col>
<el-col :span="2">
<el-button type="primary" icon="edit" @click="addEagleTraining">新增</el-button>
</el-col>
</el-row>
<el-table :data="tableData" stripe border style="width: 100%" ref="multipleTable">
<!--<el-table-column type="selection" width="55"></el-table-column>-->
<el-table-column prop="name" label="培训名称" :show-overflow-tooltip="tooltip" width="130">
</el-table-column>
<el-table-column label="培训时间段" min-width="230">
<template slot-scope="scope">
<span style="margin-left: 10px">{{ scope.row.start_time | dateFormat }} ~ {{ scope.row.end_time | dateFormat }}</span>
</template>
</el-table-column>
<el-table-column prop="test_user" label="考试人员" :show-overflow-tooltip="tooltip" min-width="170">
</el-table-column>
<el-table-column prop="responsible_user" label="负责人" :show-overflow-tooltip="tooltip" min-width="100">
</el-table-column>
<el-table-column prop="created_time" label="生成时间" :show-overflow-tooltip="tooltip" min-width="150">
</el-table-column>
<el-table-column prop="status" label="发布状态" min-width="100">
<template slot-scope="scope">
<span style="margin-left: 10px">{{ scope.row.status | statusFilter }}</span>
<!--<el-select v-model="scope.row.status" class="handle-select mr10">-->
<!--<el-option-->
<!--v-for="item in options"-->
<!--:key="item.value"-->
<!--:label="item.label"-->
<!--:value="item.value">-->
<!--</el-option>-->
<!--</el-select>-->
</template>
</el-table-column>
<el-table-column label="操作" min-width="200">
<template scope="scope">
<el-button size="small" @click="updateEagleTraining(scope.$index, scope.row,'form')">编辑</el-button>
<el-button size="small" v-show="scope.row.status == 1" @click="updateStatus(scope.row)">发布</el-button>
<el-button size="small" v-show="scope.row.status == 2" @click="updateStatus(scope.row)">下架</el-button>
<el-button size="small" type="danger" @click="deleteEagleTraining(scope.row)">删除</el-button>
<!--<el-button size="small" @click="viewActivityResult(scope.row)">查看结果</el-button>-->
<!--<el-button size="small" type="danger"-->
<!--@click="handleDelete(scope.$index, scope.row)">发布</el-button>-->
<!--<el-button size="small" type="danger"-->
<!--@click="handleDelete(scope.$index, scope.row)">关闭</el-button>-->
<!--<el-button size="small" type="danger"-->
<!--<el-button size="small" type="danger" @click="editActive(scope.$index, scope.row)">配置</el-button>-->
<!--<router-link :to="{ path: 'editActive', query: { id: '11' }}">配置活动</router-link>-->
<!--@click="handleDelete(scope.$index, scope.row)">查看活动结果</el-button>-->
</template>
</el-table-column>
</el-table>
<div class="pagination">
<el-pagination
background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="pageNo"
:page-sizes="[15, 30, 50, 100, 200, 500, 700, 1000,1500, 2000]"
:page-size="pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="totalRows">
</el-pagination>
</div>
</div>
</template>
<script>
import fetch from '../../common/fetch';
import {ossUpload, getFilePath} from '../../common/ossUtil';
import {errorResponseCheck, isEmptyUtils, isNotEmptyUtils,openLoading,closeLoading ,messageBox} from '../../common/utils';
import ElInput from "../../../node_modules/element-ui/packages/input/src/input.vue";
export default {
components: {ElInput},
data() {
return {
tooltip: true,//是否省略号显示
options: [{value: 1, label: '未发布'}, {value: 2, label: '已发布'}],
// type_options: [{value: 1, label: '医典活动'}],
tableData: [],
// dialogTableVisible: false,
// dialogFormVisible: false,
// fileList: [],//上传文件列表
// uploadProgress: 0,//上传进度
// uploadStatus: false,
// imageUrl: '',
// personAmt: 0,
// form: {},
// formObj: {
// name: '',
// join_role: 4,
// type: 1,
// start_date: '',
// amount: '',
// avg_max_amount: '',
// max_answer_num: '',
// min_online_num: '',
// count_c: 1,
// image_url: ''
// },
// 校验规则
// rules: {
// name: [
// {required: true, message: '活动名称', trigger: 'blur'},
// {min: 1, max: 15, message: '长度在 1 到 15 个字符', trigger: 'blur'}
// ],
// join_role: [
// {required: true, type: 'number', message: '请输入参与角色', trigger: 'change '},
// ],
// type: [
// {type: 'number', required: true, message: '请输入活动类型', trigger: 'change'},
// ],
// start_date: [
// {type: 'date', required: true, message: '请输入开始时间', trigger: 'change'},
// ],
// amount: [
// {required: true, type: 'number', message: '请输入活动金额', trigger: 'blur'},
//
// ],
// avg_max_amount: [
// {required: true, type: 'number', message: '请输入人均最大金额', trigger: 'blur'},
// ],
// max_answer_num: [
// {required: true, type: 'number', message: '请输入最大提交人数', trigger: 'blur'},
// ],
// min_online_num: [
// {required: true, type: 'number', message: '请输入最小期望在线人数', trigger: 'blur'},
// ],
// image_url: [
// {required: true, message: '请输入背景图片', trigger: 'blur'},
// ]
//
// },
// formLabelWidth: '120px',
totalRows: 0,
pageSize: 15,
pageNo: 1,
eagleTraining: {name: ''}
}
},
created() {
let self = this;
self.getData();
console.log("test_list:" + JSON.stringify(self.test_list));
},
methods: {
handleSizeChange(val) {
this.pageSize = val;
this.search();
},
handleCurrentChange(val) {
this.pageNo = val;
this.search();
},
getData() {
let self = this;
self.search();
},
search() {
this.is_search = true;
let self = this;
let promise = fetch('eagleTraining/getEagleTrainingList', {
token: localStorage.getItem("token"),
name: this.eagleTraining.name,
pageSize: self.pageSize,
pageNo: self.pageNo
}, 'GET', 'GET')
promise.then(function (data) {
self.tableData = data.pdModelList;
self.totalRows = data.totalRows;
}, function (error) {
});
},
deleteEagleTraining(row) {
this.is_search = true;
let self = this;
let system_time = new Date().format("yyyy-MM-dd hh:mm");
if (row.status == 2 && system_time >= new Date(row.start_time).format("yyyy-MM-dd hh:mm")) {
self.$message.warning("计划已开始或已经结束,不能删除!");
return;
}
messageBox(self,"提示","是否删除?","是", function () {
openLoading(self);
let promise = fetch('eagleTraining/deleteEagleTraining', {
token: localStorage.getItem("token"),
id: row.id
}, 'GET', 'GET')
promise.then(function (data) {
closeLoading(self);
self.search();
}, function (error) {
closeLoading(self);
});
},"否", function () {
}, "warning");
},
updateEagleTraining(row) {
let path = {path: 'editActive', query: {item: row}};
this.$router.push(path);
},
addEagleTraining() {
let path = {path: 'editActive'};
this.$router.push(path);
},
updateStatus(row) {
let self = this;
let system_time = new Date().format("yyyy-MM-dd hh:mm");
if (row.status == 2 && system_time >= new Date(row.start_time).format("yyyy-MM-dd hh:mm")) {
self.$message.warning("计划已开始或已经结束,不能下架!");
return;
}
let con = "";
if (row.status == 2) {
con = "是否下架?"
}else{
con = "是否发布?"
}
messageBox(self,"提示",con,"是", function () {
openLoading(self);
let promise = fetch('eagleTraining/updateStatus', {
token: localStorage.getItem("token"),
id: row.id,
status: row.status
}, 'GET', 'GET')
promise.then(function (data) {
closeLoading(self);
self.search();
}, function (error) {
closeLoading(self);
});
},"否", function () {
}, "warning");
},
formatter(row, column) {
return row.address;
},
},
computed: {
onRoutes() {
return this.$route.path.replace('/', '');
}
},
filters: {
sizeFilter: function (value) {
if (!value) return '0M';
return (value / 1000 / 1000).toFixed(2) + 'M';
},
statusFilter: function (value) {
if (!value) return '';
let hash = {
1: '未发布',
2: '已发布'
};
return hash[value];
},
typeFilter: function (value) {
if (!value) return '';
let hash = {
1: '云鹊医典'
};
return hash[value];
},
dateFormat: function (value) {
// debugger
if (!value) return '';
return new Date(value).format("yyyy-MM-dd hh:mm");
}
}
}
</script>
<style scoped>
.avatar-uploader .el-upload {
border: 1px dashed #d9d9d9;
border-radius: 6px;
cursor: pointer;
position: relative;
overflow: hidden;
}
.avatar-uploader .el-upload:hover {
border-color: #409EFF;
}
.avatar-uploader-icon {
font-size: 28px;
color: #8c939d;
width: 178px;
height: 178px;
line-height: 178px;
text-align: center;
}
.avatar {
width: 178px;
height: 178px;
display: block;
}
.row {
margin-top: 20px;
margin-bottom: 20px;
}
.padding-top-10 {
padding-top: 10px;
}
</style>
<template>
<div class="table">
<el-row :gutter="10" class="row" type="flex">
<el-col :span="3">
<h3>创建培训</h3>
</el-col>
</el-row>
<hr>
<el-row :gutter="10" class="row" type="flex">
<el-col :span="14">
<el-row :gutter="0" class="row" type="flex">
<el-form ref="eagleForm" :inline="false" :model="eagle" label-width="110px" label-suffix=":" size="mini" :rules="rules">
<el-form-item label="培训名称" prop="name">
<el-input class="form-input" v-model="eagle.name" placeholder="培训名称"></el-input>
</el-form-item>
<el-form-item label="培训时间" required>
<el-col :span="a">
<el-form-item prop="start_time">
<el-date-picker class="form-input" v-model="eagle.start_time" type="datetime" style="width: 100%;" placeholder="开始时间"></el-date-picker>
</el-form-item>
<div class="el-form-item__error" v-show="start_end_time_flag">培训开始时间应小于结束时间</div>
</el-col>
<el-col class="line" :span="b" style="padding-left: 8px;">~</el-col>
<el-col :span="a">
<el-form-item prop="end_time">
<el-date-picker class="form-input" v-model="eagle.end_time" type="datetime" style="width: 100%;" placeholder="结束时间"></el-date-picker>
</el-form-item>
</el-col>
</el-form-item>
<el-form-item label="参加考试人员" prop="doctors">
<el-upload class="upload-demo" action="#" accept=".xlsx" :before-upload="beforeImport" :limit="1">
<el-button size="small" type="primary">选择导入</el-button>
</el-upload>
</el-form-item>
<el-form-item label="" prop="doctor">
<el-col :span="a">
<el-input class="form-input" v-model="join_doc_name" placeholder="参加考试的人员"></el-input>
</el-col>
<el-col :span="a">
<el-input class="form-input" v-model="join_doc_mobile" placeholder="参加考试的人员手机号" :maxlength = "mxalength"></el-input>
</el-col>
<el-col :span="c">
<el-button size="small" type="primary" @click="addOne(1,join_doc_mobile)">添加</el-button>
</el-col>
</el-form-item>
<el-form-item label="摸底考试时间" required>
<el-row :gutter="10" type="flex">
<el-col :span="a">
<el-form-item prop="base_start_time">
<el-date-picker class="form-input" v-model="eagle.base_start_time" type="datetime" style="width: 100%;" placeholder="开始时间"></el-date-picker>
</el-form-item>
<div class="el-form-item__error" v-show="base_time_flag">摸底开始时间应小于结束时间</div>
<div class="el-form-item__error" v-show="base_start_time_flag">摸底开始、结束时间应在培训期间内</div>
</el-col>
<el-col class="line" :span="b">-</el-col>
<el-col :span="a">
<el-form-item prop="base_end_time">
<el-date-picker class="form-input" v-model="eagle.base_end_time" type="datetime" style="width: 100%;" placeholder="结束时间"></el-date-picker>
</el-form-item>
</el-col>
</el-row>
</el-form-item>
<el-form-item label="摸底考试题库" required>
<el-row :gutter="10" type="flex">
<el-col :span="a">
<el-form-item prop="base_question">
<el-select class="form-input" v-model="base_question" filterable placeholder="请选择" @change="testChange()">
<el-option v-for="item in eagleQuestionCategories" :key="item.id" :label="item.name + '/' + item.question_count" :value="item"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="b"></el-col>
<el-col :span="a">
<el-form-item prop="base_question_num">
<el-input class="form-input" v-model.number="eagle.base_question_num" placeholder="摸底考试题数">
<template slot="prepend">题数</template>
</el-input>
<div class="el-form-item__error" v-show="base_question_flag">摸底题数不能大于题库总数</div>
</el-form-item>
</el-col>
</el-row>
</el-form-item>
<el-form-item label="结业考试时间" required>
<el-row :gutter="10" type="flex">
<el-col :span="a">
<el-form-item prop="certification_start_time">
<el-date-picker class="form-input" v-model="eagle.certification_start_time" type="datetime" style="width: 100%;" placeholder="开始时间"></el-date-picker>
</el-form-item>
<div class="el-form-item__error" v-show="certification_time_flag">结业开始时间应小于结束时间</div>
<div class="el-form-item__error" v-show="certification_start_time_flag">结业开始、结束时间应在培训期间内</div>
<div class="el-form-item__error" v-show="certification_base_time_flag">结业开始时间应在摸底结束时间之后</div>
</el-col>
<el-col :span="b">-</el-col>
<el-col :span="a">
<el-form-item prop="certification_end_time">
<el-date-picker class="form-input" v-model="eagle.certification_end_time" type="datetime" style="width: 100%;" placeholder="结束时间"></el-date-picker>
</el-form-item>
</el-col>
</el-row>
</el-form-item>
<el-form-item label="结业考试题库" required>
<el-row :gutter="10" type="flex">
<el-col :span="a">
<el-form-item prop="certification_question">
<el-select class="form-input" v-model="certification_question" filterable placeholder="请选择" @change="testChange()">
<el-option v-for="item in eagleQuestionCategories" :key="item.id" :label="item.name + '/' + item.question_count" :value="item"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="b">-</el-col>
<el-col :span="a">
<el-form-item prop="certification_question_num">
<el-input class="form-input" v-model.number="eagle.certification_question_num" placeholder="结业考试题数">
<template slot="prepend">题数</template>
</el-input>
<div class="el-form-item__error" v-show="certification_question_flag">结业题数不能大于题库总数</div>
</el-form-item>
</el-col>
</el-row>
</el-form-item>
<el-form-item label="设置结业标准" required>
<el-col :span="d">
<el-form-item prop="certification_excellent_num">
<el-input v-model.number="eagle.certification_excellent_num" placeholder="">
<template slot="prepend">优秀</template>
</el-input>
<div class="el-form-item__error" v-show="certification_question_excellent_flag">优秀数不能大于结业题数总数</div>
</el-form-item>
</el-col>
<el-col :span="b">&nbsp;</el-col>
<el-col :span="d">
<el-form-item prop="certification_well_num">
<el-input v-model.number="eagle.certification_well_num" placeholder="">
<template slot="prepend">良好</template>
</el-input>
<div class="el-form-item__error" v-show="certification_excellent_well_flag">良好数小于优秀数</div>
</el-form-item>
</el-col>
<el-col :span="b">&nbsp;</el-col>
<el-col :span="d">
<el-form-item prop="certification_pass_num">
<el-input v-model.number="eagle.certification_pass_num" placeholder="">
<template slot="prepend">及格</template>
</el-input>
<div class="el-form-item__error" v-show="certification_well_pass_flag">及格数小于优秀数</div>
</el-form-item>
</el-col>
</el-form-item>
<el-form-item label="考试的负责人" prop="charge_mobile">
<el-col :span="a">
<el-input class="form-input" v-model="charge_name" placeholder="负责人姓名"></el-input>
</el-col>
<el-col :span="a">
<el-input class="form-input" v-model="charge_mobile" placeholder="负责人手机号" :maxlength = "mxalength"></el-input>
</el-col>
<el-col :span="c">
<el-button size="small" type="primary" @click="addOne(2,charge_mobile)">添加</el-button>
</el-col>
</el-form-item>
<el-form-item label="摸底考试封面" prop="base_cover_url">
<el-upload action="#" accept="image/*"
:show-file-list="showFileList"
:limit="1"
:before-upload="beforeUpload1"
:on-remove="handleRemove">
<el-button size="small" style="border: 0;padding: 0 0;">
<img v-if="eagle.base_cover_url" :src="resource_url + eagle.base_cover_url" class="avatar">
<i v-else class="el-icon-plus avatar-uploader-icon"></i>
</el-button>
</el-upload>
<div v-if="errFlg&&!eagle.base_cover_url" class="el-form-item__error">请上传摸底考试封面</div>
</el-form-item>
<el-form-item label="结业考试封面" prop="certification_cover_url">
<el-upload action="#" accept="image/*"
:show-file-list="showFileList"
:limit="1"
:before-upload="beforeUpload2"
:on-remove="handleRemove">
<el-button size="small" style="border: 0;padding: 0 0;">
<img v-if="eagle.certification_cover_url" :src="resource_url + eagle.certification_cover_url" class="avatar">
<i v-else class="el-icon-plus avatar-uploader-icon"></i>
</el-button>
</el-upload>
<div v-if="errFlg&&!eagle.certification_cover_url" class="el-form-item__error">请上传结业考试封面</div>
</el-form-item>
<el-form-item label="封面" prop="cover_url">
<el-upload action="#" accept="image/*"
:show-file-list="showFileList"
:limit="1"
:before-upload="beforeUpload3"
:on-remove="handleRemove">
<el-button size="small" style="border: 0;padding: 0 0;">
<img v-if="eagle.cover_url" :src="resource_url + eagle.cover_url" class="avatar">
<i v-else class="el-icon-plus avatar-uploader-icon"></i>
</el-button>
</el-upload>
<div v-if="errFlg&&!eagle.cover_url" class="el-form-item__error">请上传封面</div>
</el-form-item>
</el-form>
</el-row>
</el-col>
<el-col :span="10">
<div>
<el-row :gutter="10" class="box-title" type="flex" v-show="joinDoctorList.length > 0">
<el-col :span="24">
<label>参加考试人员</label>
</el-col>
</el-row>
<el-row :gutter="10" class="box-row" type="flex" v-show="joinDoctorList.length > 0">
<el-col :span="24" class="box">
<el-tag class="tag" v-for="tag in joinDoctorList" :key="tag.mobile_phone" :type="tagType" size="mini" closable>
{{tag.name}}&nbsp;{{tag.mobile_phone}}
</el-tag>
</el-col>
</el-row>
</div>
<div>
<el-row :gutter="10" class="box-title" type="flex" v-show="unregisteredList.length > 0">
<el-col :span="24">
<label>未注册人员</label>
</el-col>
</el-row>
<el-row :gutter="10" class="box-row" type="flex" v-show="unregisteredList.length > 0">
<el-col :span="24" class="box">
<el-tag class="tag" v-for="tag in unregisteredList" :key="tag.mobile_phone" :type="tagType" size="mini" >
{{tag.name}}&nbsp;{{tag.mobile_phone}}
</el-tag>
</el-col>
</el-row>
</div>
<div>
<el-row :gutter="10" class="box-title" type="flex" v-show="noCertifiedList.length > 0">
<el-col :span="24">
<label>未认证人员</label>
</el-col>
</el-row>
<el-row :gutter="10" class="box-row" type="flex" v-show="noCertifiedList.length > 0">
<el-col :span="24" class="box">
<el-tag class="tag" v-for="tag in noCertifiedList" :key="tag.mobile_phone" :type="tagType" size="mini" >
{{tag.name}}&nbsp;{{tag.mobile_phone}}
</el-tag>
</el-col>
</el-row>
</div>
<div>
<el-row :gutter="10" class="box-title" type="flex" v-show="chargeMobileList.length > 0">
<el-col :span="24">
<label>考试负责人</label>
</el-col>
</el-row>
<el-row :gutter="10" class="box-row" type="flex" v-show="chargeMobileList.length > 0">
<el-col :span="24" class="box">
<el-tag class="tag" v-for="tag in chargeMobileList" :key="tag.mobile_phone" :type="tagType" size="mini" closable>
{{tag.name}}&nbsp;{{tag.mobile_phone}}
</el-tag>
</el-col>
</el-row>
</div>
</el-col>
</el-row>
<el-row :gutter="10" class="" type="flex" justify="center">
<el-button type="primary" @click="save('eagleForm')">确 定</el-button>
<el-col :span="1"></el-col>
<el-button @click="back">取 消</el-button>
</el-row>
</div>
</template>
<script>
import {ossUpload, getFilePath} from "../../common/ossUtil";
import fetch from "../../common/fetch";
import {errorResponseCheck, isEmptyUtils, isNotEmptyUtils, isEmptyList, messageBox, stringToArr, openLoading, closeLoading, htmlMessageBox} from "../../common/utils";
export default {
data() {
return {
active: this.$route.query.item//前页面参数
, mxalength: 11
, base_question_flag: false
, certification_question_flag: false
, start_end_time_flag: false
, base_time_flag: false
, certification_time_flag: false
, base_start_time_flag: false
, certification_start_time_flag: false
, certification_base_time_flag: false
, certification_question_excellent_flag: false
, certification_excellent_well_flag: false
, certification_well_pass_flag: false
, resource_url: localStorage.getItem('resource_url')
, eagle: {
name: null//培训名称
, start_time: null//培训开始时间
, end_time: null//培训结束时间
, base_question_num: null//摸底题数
, base_start_time: null//摸底考试开始时间
, base_end_time: null//摸底考试结束时间
, base_duration_time: null//
, base_cover_url: null//摸底考试封面
, certification_question_num: null//结业题数
, certification_start_time: null//结业考试开始时间
, certification_end_time: null//结业考试结束时间
, certification_duration_time: null//
, certification_cover_url: null//结业考试封面
, certification_excellent_num: null//结业考试优秀正确题数
, certification_well_num: null//结业考试良好正确题数
, certification_pass_num: null//结业考试及格正确题数
, status: null//是否发布 1已发布 2未发布
, training_status: null//培训状态 1未开始 3进行中 5已结束
, cover_url: null//app封面url
, delete_flag: null//删除标志
, created_id: null//创建人id
, created_time: null//创建时间
, modified_id: null//修改人id
, modified_time: null//修改时间
}
, join_doc_name: null//手动添加参加考试的人员
, join_doc_mobile: null//手动添加参加考试的人员
, charge_mobile: null//负责考试人员
, charge_name: null//负责考试人员
//负责考试人员list TODO
, chargeMobileList: [
// {name: '王大', mobile: '13849763813'}
]
, base_question: []//摸底考试题库
, certification_question: []//结业考试题库
, showFileList: false //不展示上传list
, eagleQuestionCategories: [
// {no: 1, value: '雄鹰计划初级题库'}, {no: 2, value: '雄鹰计划中级题库'}, {no: 3, value: '雄鹰计划高级题库'}
]//demo //TODO
//参加考试人员 TODO
, joinDoctorList: [
// {name: '王大', mobile: '13849763813'}, {name: '王二', mobile: '13849763845'}, {name: '王小', mobile: '13849763821'},
// {name: '王大', mobile: '13849763823'}, {name: '王二', mobile: '13849763855'}, {name: '王小', mobile: '13849763221'},
// {name: '王大', mobile: '13849763833'}, {name: '王二', mobile: '13849763865'}, {name: '王小', mobile: '13849763121'},
// {name: '李大', mobile: '13849763826'}, {name: '李二', mobile: '13849763824'}, {name: '李小', mobile: '13849763326'}
]
//未注册人员list TODO
, unregisteredList: [
// {name: '王大', mobile: '13849763813'}, {name: '王二', mobile: '13849763845'}, {name: '王小', mobile: '13849763821'},
// {name: '王大', mobile: '13849763823'}, {name: '王二', mobile: '13849763855'}, {name: '王小', mobile: '13849763221'},
// {name: '王大', mobile: '13849763833'}, {name: '王二', mobile: '13849763865'}, {name: '王小', mobile: '13849763121'},
// {name: '李大', mobile: '13849763826'}, {name: '李二', mobile: '13849763824'}, {name: '李小', mobile: '13849763326'}
]
//未认证人员list TODO
, noCertifiedList: [
// {name: '王大', mobile: '13849763813'}, {name: '王二', mobile: '13849763845'}, {name: '王小', mobile: '13849763821'},
// {name: '王大', mobile: '13849763823'}, {name: '王二', mobile: '13849763855'}, {name: '王小', mobile: '13849763221'},
// {name: '王大', mobile: '13849763833'}, {name: '王二', mobile: '13849763865'}, {name: '王小', mobile: '13849763121'},
// {name: '李大', mobile: '13849763826'}, {name: '李二', mobile: '13849763824'}, {name: '李小', mobile: '13849763326'}
]
, tagType: 'success'//tag颜色
//统一控制宽度
, a: 10
, b: 1
, c: 3
, d: 6
//上传
, uploadProgress: 0//上传进度
, uploadStatus: false//是否在上传
//校验
, errFlg: false//点保存时校验标志
, rules: {
name: [
{required: true, message: '请输入培训名称', trigger: 'change'},
],
start_time: [
{type: 'date', required: true, message: '请选择开始时间', trigger: 'change'}
],
end_time: [
{type: 'date', required: true, message: '请选择结束时间', trigger: 'change'}
],
base_question_num: [
{type: 'number', required: true, message: '请输入摸底题数', trigger: 'change'},
],
base_start_time: [
{type: 'date', required: true, message: '请选择开始时间', trigger: 'change'}
],
base_end_time: [
{type: 'date', required: true, message: '请选择结束时间', trigger: 'change'}
],
certification_question_num: [
{type: 'number', required: true, message: '请输入结业考试题数', trigger: 'change'},
],
certification_start_time: [
{type: 'date', required: true, message: '请选择开始时间', trigger: 'change'}
],
certification_end_time: [
{type: 'date', required: true, message: '请选择结束时间', trigger: 'change'}
],
certification_excellent_num: [
{type: 'number', required: true, message: '请输入优秀的正确题数', trigger: 'change'},
],
certification_well_num: [
{type: 'number', required: true, message: '请输入良好的正确题数', trigger: 'change'},
],
certification_pass_num: [
{type: 'number', required: true, message: '请输入及格的正确题数', trigger: 'change'},
],
// base_cover_url: [
// {validator: baseCoverUrlCheck, trigger: 'change'},
// ],
// certification_cover_url: [
// {validator: certificationCoverUrlCheck, trigger: 'change'},
// ],
// cover_url: [
// {validator: coverUrlCheck, trigger: 'change'},
// ]
}
}
},
beforeCreate() {
},
created() {
if (this.active != null) {
this.getTrainingInfo();
}
this.getQuestionCategory();
},
mounted() {
// this.save('eagleForm');
},
methods: {
getQuestionCategory() {
let self = this;
let promise = fetch('eagleQuestionCategorys/searchAll', {
token: localStorage.getItem("token")
}, 'GET', 'GET')
promise.then(function (data) {
self.eagleQuestionCategories = data.eagleQuestionCategories;
}, function (error) {
});
},
getTrainingInfo() {
let self = this;
let promise = fetch('eagleTraining/getEagleTraining', {
token: localStorage.getItem("token"),
name: this.active.id
}, 'GET', 'GET')
promise.then(function (data) {
self.eagle = data.eagleTrainingModel;
self.unregisteredList = data.eagleDoctorUnRegists;
self.noCertifiedList = data.eagleDoctorRegists;
self.joinDoctorList = data.eagleDoctorCertifys;
self.chargeMobileList = data.chargeMobileList;
}, function (error) {
});
},
addOne(type, mobile) {
if (isEmptyUtils(mobile)) {
self.$message.warning("请输入手机号");
return;
}
//手动添加考试人员
let self = this;
if (type === 1) {
let param = {
mobile_phone: mobile,
token: localStorage.getItem("token")
};
let promise = fetch('PICADoctorServiceImpl/getDoctor', param, 'GET', 'GET');
promise.then(function (data) {
let doctor = Object.assign({}, data.picapDoctor);
let doctorTmp = {};
//type 1 为添加考试人员
//未注册人员
if (isEmptyUtils(doctor.status)) {
doctorTmp.name = self.join_doc_name;
doctorTmp.mobile_phone = self.join_doc_mobile;
self.unregisteredList.push(doctorTmp);
}
//参加考试人员
else if (doctor.status === 3) {
doctorTmp.name = doctor.name;
doctorTmp.mobile_phone = doctor.mobile_phone;
self.joinDoctorList.push(doctorTmp);
}
//未认证人员
else if (doctor.status === 1 || doctor.status === 2) {
doctorTmp.name = doctor.name;
doctorTmp.mobile_phone = doctor.mobile_phone;
self.noCertifiedList.push(doctorTmp);
}
self.join_doc_name = "";
self.join_doc_mobile = "";
self.$message.success("考试人员添加成功");
}, function (error) {
errorResponseCheck(error, self);
});
}
//type 2 为添加负责人
else if (type === 2) {
let doctorTmp = {};
doctorTmp.name = self.charge_name;
doctorTmp.mobile_phone = self.charge_mobile;
self.chargeMobileList.push(doctorTmp);
self.$message.success("负责人添加成功");
self.charge_name = "";
self.charge_mobile = "";
}
},
testChange() {
},
beforeUpload1(file) {
this.doUpload(file, 1);//摸底考试封面
},
beforeUpload2(file) {
this.doUpload(file, 2);//结业考试封面
},
beforeUpload3(file) {
this.doUpload(file, 3);//封面
},
doUpload(file, index) {
let self = this;
//如果没有选择文件,返回
if (isEmptyUtils(file)) {
return;
}
self.$message.info('开始上传');
//上传 指定文件名
ossUpload(self, file, getFilePath(file), null, null, null).then(function (path) {
if (index === 1) {
//摸底考试封面
self.eagle.base_cover_url = path;
} else if (index === 2) {
//结业考试封面
self.eagle.certification_cover_url = path;
} else if (index === 3) {
//封面
self.eagle.cover_url = path;
}
self.$message.success('上传成功');
});
return false;
},
handleRemove(file, fileList) {
// console.log(file, fileList);
//重置resource
// this.audioAddress = null;
},
save(formName) {
let self = this;
debugger
self.$refs[formName].validate((valid) => {
if (valid) {
let saveFlag = false;
if (self.eagle.base_question_num > self.base_question.question_count) {
self.base_question_flag = true;
saveFlag = true;
}
// debugger
if (self.eagle.certification_question_num > self.certification_question.question_count) {
self.certification_question_flag = true;
saveFlag = true;
}
if (self.eagle.start_time >= self.eagle.end_time) {
self.start_end_time_flag = true;
saveFlag = true;
}
if (self.eagle.base_start_time >= self.eagle.base_end_time) {
self.base_time_flag = true;
saveFlag = true;
}
if (self.eagle.certification_start_time >= self.eagle.certification_end_time) {
self.certification_time_flag = true;
saveFlag = true;
}
if (self.eagle.base_start_time <= self.eagle.start_time || self.eagle.base_start_time >= self.eagle.end_time
|| self.eagle.base_end_time <= self.eagle.start_time || self.eagle.base_end_time >= self.eagle.end_time) {
self.base_start_time_flag = true;
saveFlag = true;
}
if (self.eagle.certification_start_time <= self.eagle.start_time || self.eagle.certification_start_time >= self.eagle.end_time
|| self.eagle.certification_end_time <= self.eagle.start_time || self.eagle.certification_end_time >= self.eagle.end_time) {
self.certification_start_time_flag = true;
saveFlag = true;
}
if (self.eagle.certification_start_time <= self.eagle.base_end_time ) {
self.certification_base_time_flag = true;
saveFlag = true;
}
if (self.eagle.certification_question_num <= self.eagle.certification_excellent_num ) {
self.certification_question_excellent_flag = true;
saveFlag = true;
}
if (self.eagle.certification_excellent_num <= self.eagle.certification_well_num ) {
self.certification_excellent_well_flag = true;
saveFlag = true;
}
if (self.eagle.certification_well_num <= self.eagle.certification_pass_num ) {
self.certification_well_pass_flag = true;
saveFlag = true;
}
if (saveFlag) {
return;
}
//参加考试人员校验
if (isEmptyList(self.joinDoctorList) || isEmptyList(self.unregisteredList) || isEmptyList(self.noCertifiedList)) {
self.$message.error("请添加参加考试人员");
self.errFlg = true;
return false;
}
//考试负责人校验
if (isEmptyList(self.chargeMobileList)) {
self.$message.error("请添加考试负责人");
self.errFlg = true;
return false;
}
//是否正在上传
if (self.uploadStatus) {
self.$message.error('图片没有上传完成');
self.errFlg = true;
return;
}
//图片校验
if (isEmptyUtils(self.eagle.base_cover_url) || isEmptyUtils(self.eagle.certification_cover_url) || isEmptyUtils(self.eagle.cover_url)) {
self.errFlg = true;
return false;
}
openLoading(self);
let req = {
token: localStorage.getItem("token"),
eagle: self.eagle,
joinDoctorList: self.joinDoctorList,
unregisteredList: self.unregisteredList,
noCertifiedList: self.noCertifiedList,
chargeMobileList: self.chargeMobileList
};
console.log(JSON.stringify(req));
debugger
self.$axios.post(localStorage.getItem("Url") + 'eagleTraining/insert'
, JSON.stringify(req)
).then(function (res) {
closeLoading(self);
this.$message({
message: self.isUpdate ? '编辑成功' : '添加成功',
type: 'success',
duration: 1000,
onClose() {
self.cancel();
}
});
}).catch(function (error) {
self.$message.error('培训创建失败');
errorResponseCheck(error, self);
});
self.$message("save");
} else {
this.$message("error");
return false;
}
});
},
back() {
//返回上一级
// 后退一步记录,等同于 history.back()
this.$router.go(-1);
// let path = {path: 'listActive', query: {}};
// this.$router.push(path);
},
beforeImport(file) {
let self = this;
// self.importFlag = true;
//导入题目
//如果没有选择文件,返回
if (isEmptyUtils(file)) {
return;
}
let arr = file.type.split('/');
let ext = "." + arr[1];
let reader = new FileReader();
// reader.readAsBinaryString(file);
reader.onload = function (e) {
self.$message('开始导入');
let fileJson = {
fileName: file.name,
file: e.target.result.substr(e.target.result.indexOf("base64,") + 7),
ext: ext
};
let fileArray = [{
type: 'ActivityQA',
base64: fileJson
}];
openLoading(self);
let req = {
token: localStorage.getItem("token"),
activity_id: self.active.id,
fileArray: fileArray
};
self.$axios.post(localStorage.getItem("Url") + 'importServiceImpl/importActivityQA'
, JSON.stringify(req)
).then(function (res) {
closeLoading(self);
let data = JSON.parse(JSON.stringify(res.data));//通过这个实现深拷贝
if (data.flag) {
self.$message('导入成功');
self.questionList = self.handleQuestionList(data.list);
} else {
self.$message.error('导入题目失败');
let errorList = data.errorList;
let message = "";
if (isNotEmptyUtils(errorList)) {
for (let i = 0; i < errorList.length; i++) {
message += "第" + errorList[i].index + "行:" + errorList[i].name + '<br>';
}
}
htmlMessageBox(self, "警告", message, "确定", function () {
}, "", null, "warning");
}
}).catch(function (error) {
self.$message.error('导入题目失败');
errorResponseCheck(error, self);
});
};
reader.readAsDataURL(file);
},
},
computed: {
onRoutes() {
return this.$route.path.replace('/', '');
}
},
watch: {},
components: {},
filters: {
typeFilter: function (value) {
if (!value) return '';
if (value == 1) {
return '云鹊医典';
}
return value;
},
userRoleFilter: function (value, enumList) {
if (!value) return '';
// var hash = {
// 'R001': '普通',
// 2: '2016高危',
// 3: '2017高危',
// 10: '青海西藏'
// };
// return hash[value];
let hash = {};
if (enumList != null && enumList.length > 0) {
for (let i = 0; i < enumList.length; i++) {
hash[enumList[i].role_code] = enumList[i].role_name;
}
}
return hash[value];
}
}
}
</script>
<style scoped>
.row {
margin-top: 20px;
margin-bottom: 20px;
}
.form-input {
width: auto;
}
.tag {
margin-bottom: 5px;
margin-right: 1px;
}
.box {
border: 1px solid #000000;
}
.box-title {
margin-top: 10px;
}
.box-row {
margin-bottom: 20px;
}
.avatar-uploader .el-upload {
border: 1px dashed #d9d9d9;
border-radius: 6px;
cursor: pointer;
position: relative;
overflow: hidden;
}
.avatar-uploader-icon {
background-color: #fbfdff;
border: 1px dashed #c0ccda;
border-radius: 6px;
box-sizing: border-box;
width: 148px;
height: 148px;
cursor: pointer;
line-height: 146px;
vertical-align: top;
}
.avatar {
width: 148px;
height: 148px;
display: block;
}
</style>
<template>
<div class="table">
<el-row :gutter="10" class="row" type="flex">
<el-col :span="3">
<span style="font-weight: bold;">{{active.name}}</span>
</el-col>
</el-row>
<el-row :gutter="10" class="row" type="flex">
<el-col :span="3">
<label>类型:</label>
</el-col>
<el-col :span="3">
<span>{{active.type | typeFilter}}</span>
</el-col>
<el-col :span="3">
<label>角色:</label>
</el-col>
<el-col :span="3">
<span>{{active.join_role| userRoleFilter(userRoleList)}}</span>
</el-col>
<el-col :span="3">
<label>活动开始时间:</label>
</el-col>
<el-col :span="6">
<span>{{active.start_date}}</span>
</el-col>
<el-col :span="3">
<el-button size="small" type="primary" @click="exportData()">导出</el-button>
</el-col>
</el-row>
<hr/>
<el-tabs v-model="activeName" @tab-click="handleClick">
<el-tab-pane label="奖金情况" name="tab1">
<el-row :gutter="10" class="row" type="flex">
<el-col :span="3">
<label style="font-weight: bold;">本次奖金:</label>
</el-col>
<el-col :span="3">
<span style="font-weight: bold;">{{active.amount}}</span>
</el-col>
<el-col :span="3">
<label style="font-weight: bold;">人均最大金额:</label>
</el-col>
<el-col :span="3">
<span style="font-weight: bold;">{{active.amount}}</span>
</el-col>
<el-col :span="3">
<label style="font-weight: bold;">获得奖金人数:</label>
</el-col>
<el-col :span="3">
<span style="font-weight: bold;">{{'xxxxxx'}}</span>
</el-col>
<el-col :span="3">
<label style="font-weight: bold;">实际平分奖金:</label>
</el-col>
<el-col :span="3">
<span style="font-weight: bold;">{{'xxxxxx'}}</span>
</el-col>
</el-row>
<el-table :data="tableData" stripe border style="width: 100%" ref="multipleTable" @selection-change="handleSelectionChange('tab1')">
<el-table-column prop="index" label="序号" sortable width="100">
<template slot-scope="scope">
{{scope.$index+1}}
</template>
</el-table-column>
<el-table-column prop="doctor_name" label="姓名" sortable width="150">
</el-table-column>
<el-table-column prop="doctor_mobile" label="用户手机" sortable width="150">
</el-table-column>
<el-table-column prop="doctor_position" label="用户单位" sortable :show-overflow-tooltip="tooltip">
</el-table-column>
</el-table>
<div class="pagination">
<el-pagination
background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="pageNo"
:page-sizes="[15, 30, 50, 100, 200, 500, 700, 1000,1500, 2000]"
:page-size="pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="totalRows">
</el-pagination>
</div>
</el-tab-pane>
<el-tab-pane label="答题详情" name="tab2">
<el-table :data="tableData" stripe border style="width: 100%" ref="multipleTable" @selection-change="handleSelectionChange('tab2')">
<el-table-column prop="index" label="序号" sortable width="100">
<template slot-scope="scope">
{{scope.$index+1}}
</template>
</el-table-column>
<el-table-column prop="doctor_name" label="姓名" sortable width="150">
</el-table-column>
<el-table-column prop="doctor_mobile" label="用户手机" sortable width="150">
</el-table-column>
<el-table-column prop="doctor_position" label="用户单位" sortable :show-overflow-tooltip="tooltip">
</el-table-column>
<el-table-column prop="resurrection_seq_no_str" label="复活题序号" sortable width="130">
</el-table-column>
<el-table-column prop="wrong_seq_no_str" label="答错题序号" sortable width="130">
</el-table-column>
</el-table>
<div class="pagination">
<el-pagination
background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="pageNo"
:page-sizes="[15, 30, 50, 100, 200, 500, 700, 1000,1500, 2000]"
:page-size="pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="totalRows">
</el-pagination>
</div>
</el-tab-pane>
</el-tabs>
</div>
</template>
<script>
import {errorResponseCheck, openLoading, closeLoading} from "../../common/utils";
import fetch from '../../common/fetch';
export default {
data: function () {
return {
userRoleList: [],
active: this.$route.query.item,//前页面参数
activeName: 'tab1',//奖金情况
totalRows: 0,
pageSize: 15,
pageNo: 1,
tableData: [],
tooltip: true,//是否省略号显示
// tableDataAward: [],//奖金情况
// tableDataAnswer: [],//答题情况
// tab:'one'
}
},
created() {
let self = this;
self.search();
//获取用户角色list
self.getUserRole()
},
methods: {
handleSizeChange(val) {
this.pageSize = val;
this.search();
},
handleCurrentChange(val) {
this.pageNo = val;
this.search();
},
search() {
let self = this;
let requestUrl = '';
if (self.activeName === 'tab1') {
//奖金情况
requestUrl = 'activityResult/getActivityBonds';
} else if (self.activeName === 'tab2') {
//答题详情
requestUrl = 'activityResult/getActivityResult';
}
openLoading(self);
let promise = fetch(requestUrl, {
token: localStorage.getItem("token"),
activityId: self.active.id,
pageSize: self.pageSize,
pageNo: self.pageNo
}, 'GET', 'GET');
promise.then(function (data) {
closeLoading(self);
// if (self.activeName = 'tab1') {
// self.tableDataAward = data.list;
// } else if (self.activeName = 'tab2') {
// self.tableDataAward = data.list;
// }
self.tableData = data.list;
self.totalRows = data.totalRows;
}, function (error) {
errorResponseCheck(error, self)
});
},
getUserRole() {
//获取角色权限
let self = this;
let req = {token: localStorage.getItem("token")};
this.$axios.post(localStorage.getItem("Url") + 'activityDeploy/getUserRole'
, JSON.stringify(req)
).then(function (res) {
self.userRoleList = JSON.parse(JSON.stringify(res.data.list));//通过这个实现深拷贝
}).catch(function (error) {
errorResponseCheck(error, self)
});
},
handleSelectionChange(page) {
// let self = this;
// self.tab = page;
},
handleClick(tab, event) {
this.search();
},
exportData() {
//导出
let self = this;
openLoading(self);
let req = {token: localStorage.getItem("token"), activityId: self.active.id};
this.$axios.post(localStorage.getItem("Url") + 'activityResult/exportData'
, JSON.stringify(req)
).then(function (res) {
closeLoading(self);
let data = JSON.parse(JSON.stringify(res.data));
debugger
if (data.errFlag === 1) {
self.$message.error("导出失败");
} else {
window.location.href = data.exportUrl;
}
}).catch(function (error) {
errorResponseCheck(error, self)
});
}
},
filters: {
typeFilter: function (value) {
if (!value) return '';
if (value == 1) {
return '云鹊医典';
}
return value;
},
userRoleFilter: function (value, enumList) {
if (!value) return '';
let hash = {};
if (enumList != null && enumList.length > 0) {
for (let i = 0; i < enumList.length; i++) {
hash[enumList[i].role_code] = enumList[i].role_name;
}
}
return hash[value];
}
}
}
</script>
<style scoped>
</style>
<template>
<div class="table">
<el-row :gutter="10">
<el-col :span="2" class="padding-top-10">新建标签</el-col>
<el-col :span="4">
<el-input v-model="labelForm.label" placeholder="输入标签"></el-input>
</el-col>
<el-col :span="4">
<el-button type="primary" @click="submitForm('labelForm')">添加</el-button>
</el-col>
</el-row>
</br>
</br>
<div>
<el-tag style="width:200px;height: 40px;padding: 10px;margin: 10px;background-color: #13CE66;"
v-for="tag in tableData"
:key="tag.id"
:type="primary"
:gutter="30"
:size="medium"
:color="blue">
{{tag.label}}
</el-tag>
</div>
</div>
</template>
<script>
import fetch from '../../common/fetch';
import {isEmptyUtils} from '../../common/utils';
export default {
data: function(){
return {
labelForm: {},
tableData:[]
}
},
created() {
let self = this;
self.getData();
},
methods: {
submitForm() {
let self = this;
if(isEmptyUtils(self.labelForm) || isEmptyUtils(self.labelForm.label)) {
self.$message.error('标签为空不能添加');
return;
}
fetch('label/addActivityLabel', {
token: localStorage.getItem("token"),
data: self.labelForm
}, 'PUT', 'PUT').then(function (data) {
if(data.code =='ok') {
self.getData();
}else {
self.$message.error(data.msg);
}
});
},
getData() {
let self = this;
let promise = fetch('label/queryLabelList', {
token: localStorage.getItem("token"),
type:1
}, 'GET', 'GET')
promise.then(function (data) {
self.tableData = data.list;
}, function (error) {
});
}
}
}
</script>
<style scoped>
</style>
<template>
<div class="login-wrap">
<div class="ms-title">后台管理系统</div>
<div class="ms-login">
<el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="0px" class="demo-ruleForm">
<el-form-item prop="username">
<el-input v-model="ruleForm.username" placeholder="username"></el-input>
</el-form-item>
<el-form-item prop="password">
<el-input type="password" placeholder="password" v-model="ruleForm.password" @keyup.enter.native="submitForm('ruleForm')"></el-input>
</el-form-item>
<div class="login-btn">
<el-button type="primary" @click="submitForm('ruleForm')">登录</el-button>
</div>
<p style="font-size:12px;line-height:30px;color:#999;">Tips : 用户名和密码随便填。</p>
</el-form>
</div>
</div>
</template>
<script>
export default {
data: function(){
return {
ruleForm: {
username: '',
password: ''
},
rules: {
username: [
{ required: true, message: '请输入用户名', trigger: 'blur' }
],
password: [
{ required: true, message: '请输入密码', trigger: 'blur' }
]
}
}
},
methods: {
submitForm(formName) {
const self = this;
self.$refs[formName].validate((valid) => {
if (valid) {
localStorage.setItem('ms_username',self.ruleForm.username);
self.$router.push('/readme');
} else {
console.log('error submit!!');
return false;
}
});
}
}
}
</script>
<style scoped>
.login-wrap{
position: relative;
width:100%;
height:100%;
}
.ms-title{
position: absolute;
top:50%;
width:100%;
margin-top: -230px;
text-align: center;
font-size:30px;
color: #fff;
}
.ms-login{
position: absolute;
left:50%;
top:50%;
width:300px;
height:160px;
margin:-150px 0 0 -190px;
padding:40px;
border-radius: 5px;
background: #fff;
}
.login-btn{
text-align: center;
}
.login-btn button{
width:100%;
height:36px;
}
</style>
\ No newline at end of file
<template>
<div>
<div class="crumbs">
<el-breadcrumb separator="/">
<el-breadcrumb-item><i class="el-icon-date"></i> 表单</el-breadcrumb-item>
<el-breadcrumb-item>markdown</el-breadcrumb-item>
</el-breadcrumb>
</div>
<div class="plugins-tips">
Vue-SimpleMDE:Vue.js的Markdown Editor组件。
访问地址:<a href="https://github.com/F-loat/vue-simplemde" target="_blank">Vue-SimpleMDE</a>
</div>
<markdown-editor v-model="content" :configs="configs" ref="markdownEditor"></markdown-editor>
<div class="plugins-tips">
<p>既然用了markdown语法了,那么就有一个很实际的问题了。要怎么在前台展示数据呢?</p>
<br>
<p>这个时候就需要解析markdown语法了。可以使用 <a href="https://github.com/miaolz123/vue-markdown" target="_blank">vue-markdown</a>:一个基于vue.js的markdown语法解析插件。(这里不作展开,有需要自行了解)</p>
</div>
</div>
</template>
<script>
import { markdownEditor } from 'vue-simplemde';
export default {
data: function(){
return {
content:'',
configs: {
status: true,
initialValue: 'Hello BBK',
renderingConfig: {
codeSyntaxHighlighting: true,
highlightingTheme: 'atom-one-light'
}
}
}
},
components: {
markdownEditor
}
}
</script>
\ No newline at end of file
<template>
<div>
<div class="crumbs">
<el-breadcrumb separator="/">
<el-breadcrumb-item><i class="el-icon-date"></i> 图表</el-breadcrumb-item>
<el-breadcrumb-item>基础图表</el-breadcrumb-item>
</el-breadcrumb>
</div>
<div class="plugins-tips">
vue-echarts-v3:基于vue2和eCharts.js3的图表组件。
访问地址:<a href="https://github.com/xlsdg/vue-echarts-v3" target="_blank">vue-echarts-v3</a>
</div>
<div class="content-title">基础图表</div>
<div class="echarts">
<IEcharts :option="line" ></IEcharts>
</div>
<div class="echarts">
<IEcharts :option="bar" ></IEcharts>
</div>
<div class="echarts">
<IEcharts :option="pie" ></IEcharts>
</div>
<div class="echarts">
<IEcharts :option="pie_radius" ></IEcharts>
</div>
<div class="content-title">混合图表</div>
<div class="mix-echarts">
<IEcharts :option="mix" ></IEcharts>
</div>
<v-schart canvasId="canvas" width="500" height="400" :data="data" type="bar"></v-schart>
</div>
</template>
<script>
// import IEcharts from 'vue-echarts-v3';
import vSchart from 'vue-schart';
import IEcharts from 'vue-echarts-v3/src/lite.vue';
import 'echarts/lib/chart/bar';
import 'echarts/lib/chart/line';
import 'echarts/lib/chart/pie';
import 'echarts/lib/component/legend';
import 'echarts/lib/component/tooltip';
import 'echarts/lib/component/title';
export default {
components: {
IEcharts,vSchart
},
data: () => ({
data:[
{name:'2012',value:1141},
{name:'2013',value:1499},
{name:'2014',value:2260},
{name:'2015',value:1170},
{name:'2016',value:970},
{name:'2017',value:1450}
],
line: {
color:["#20a0ff","#13CE66","#F7BA2A","#FF4949"],
title: {
text: '曲线图'
},
xAxis: {
data: ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"]
},
yAxis:{},
series: [
{
name: "销量",
type: "line",
data: [5, 20, 36, 10, 10, 20]
}
]
},
bar: {
color:["#20a0ff","#13CE66","#F7BA2A","#FF4949"],
title: {
text: '柱状图'
},
xAxis: {
data: ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"]
},
yAxis:{},
series: [
{
name: "销量",
type: "bar",
data: [5, 20, 36, 10, 10, 20]
}
]
},
pie: {
color:["#20a0ff","#13CE66","#F7BA2A","#FF4949","#61a0a8"],
title : {
text: '饼状图',
x:'center'
},
tooltip : {
trigger: 'item',
formatter: "{a} <br/>{b} : {c} ({d}%)"
},
legend: {
orient: 'vertical',
left: 'left',
data: ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋"]
},
series : [
{
name: '销量',
type: 'pie',
radius : '55%',
center: ['50%', '50%'],
data:[
{value:335, name:'衬衫'},
{value:310, name:'羊毛衫'},
{value:234, name:'雪纺衫'},
{value:135, name:'裤子'},
{value:548, name:'高跟鞋'}
],
itemStyle: {
emphasis: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)'
}
}
}
]
},
pie_radius:{
color:["#20a0ff","#13CE66","#F7BA2A","#FF4949","#61a0a8"],
title : {
text: '环形图',
x:'center'
},
tooltip : {
trigger: 'item',
formatter: "{a} <br/>{b} : {c} ({d}%)"
},
legend: {
orient: 'vertical',
left: 'left',
data: ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋"]
},
series : [
{
name: '销量',
type: 'pie',
radius : ['40%','60%'],
data:[
{value:335, name:'衬衫'},
{value:310, name:'羊毛衫'},
{value:234, name:'雪纺衫'},
{value:135, name:'裤子'},
{value:548, name:'高跟鞋'}
],
itemStyle: {
emphasis: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)'
}
}
}
]
},
mix:{
color:["#20a0ff","#13CE66","#F7BA2A","#FF4949","#61a0a8"],
legend: {
data:['步步高','小天才','imoo']
},
xAxis: {
data: ['周一','周二','周三','周四','周五','周末']
},
yAxis:{},
series: [
{
name: "步步高",
type: "line",
data: [15, 20, 26, 30, 40, 27]
},
{
name: "小天才",
type: "bar",
data: [5, 30, 36, 10, 34, 20]
},
{
name: "imoo",
type: "bar",
data: [35, 40, 30, 50, 60, 40]
}
]
}
})
}
</script>
<style scoped>
.echarts {
float: left;
width: 500px;
height: 400px;
}
.content-title{
clear: both;
font-weight: 400;
line-height: 50px;
margin: 10px 0;
font-size: 22px;
color: #1f2f3d;
}
.mix-echarts{
width:900px;
height:600px;
}
</style>
\ No newline at end of file
<template>
<div class="bonus-wrap">
<!--<div class="title">提现列表</div>-->
<div class="search-wrap">
<el-row class="row">
<el-col :span="3">
<label for="" class="p-label">姓名:</label>
</el-col>
<el-col :span="5">
<el-input
placeholder="请输入姓名"
v-model="doctor_name"
clearable>
</el-input>
</el-col>
<el-col :span="2">
<label for="" class="p-label" style="padding-left: 10px;">手机:</label>
</el-col>
<el-col :span="5">
<el-input
placeholder="请输入手机号"
v-model="doctor_mobile"
clearable>
</el-input>
</el-col>
</el-row>
<el-row class="row">
<el-col :span="3">
<label for="" class="p-label">地区:</label>
</el-col>
<el-col :span="21">
<el-select v-model="province_id" placeholder="省" clearable class="area-item" @change="provinceChange(province_id)">
<el-option
v-for="item in provinceList"
:key="item.province_id"
:label="item.province_name"
:value="item.province_id">
</el-option>
</el-select>
<el-select v-model="city_id" placeholder="市" clearable class="area-item" @change="cityChange(city_id)">
<el-option
v-for="item in cityList"
:key="item.city_id"
:label="item.city_name"
:value="item.city_id">
</el-option>
</el-select>
<el-select v-model="county_id" placeholder="区/县" clearable class="area-item" @change="countyChange(county_id)">
<el-option
v-for="item in countyList"
:key="item.county_id"
:label="item.county_name"
:value="item.county_id">
</el-option>
</el-select>
<el-select v-model="town_id" placeholder="乡/镇/街道" clearable class="area-item" @change="townChange(town_id)">
<el-option
v-for="item in townList"
:key="item.town_id"
:label="item.town_name"
:value="item.town_id">
</el-option>
</el-select>
<el-select v-model="hospital_id" placeholder="医院" clearable class="area-item">
<el-option
v-for="item in hospitalList"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</el-col>
</el-row>
<!--<el-row class="row">-->
<!--<el-col :span="3">-->
<!--<label for="" class="p-label">提现时间:</label>-->
<!--</el-col>-->
<!--<el-col :span="6">-->
<!--<el-date-picker-->
<!--v-model="dateStart"-->
<!--type="date"-->
<!--placeholder="选择日期">-->
<!--</el-date-picker>-->
<!--</el-col>-->
<!--<el-col :span="6">-->
<!--<el-date-picker-->
<!--v-model="dateEnd"-->
<!--type="date"-->
<!--placeholder="选择日期">-->
<!--</el-date-picker>-->
<!--</el-col>-->
<!--</el-row>-->
</div>
<div class="search-tool">
<el-button type="primary" @click="search"><i class="el-icon-search"></i>&nbsp;搜索</el-button>
</div>
<el-table
:data="tableData"
style="width: 100%">
<el-table-column
width="110"
prop="doctor_name"
label="姓名">
</el-table-column>
<el-table-column
prop="idCard"
label="身份证">
</el-table-column>
<el-table-column
width="150"
prop="doctor_mobile"
label="手机号">
</el-table-column>
<el-table-column
prop="doctor_hospital_name"
label="医院">
</el-table-column>
<el-table-column
width="130"
prop="total_award"
label="获得总奖金">
</el-table-column>
<el-table-column
width="110"
prop="total_withdraw"
label="累计提现">
</el-table-column>
<el-table-column label="操作">
<template slot-scope="scope">
<el-button
size="mini"
@click="showDrawDetail(scope.$index, scope.row)">提现明细</el-button>
<el-button
size="mini"
@click="showPrizeDetail(scope.$index, scope.row)">获奖明细</el-button>
</template>
</el-table-column>
</el-table>
<div class="pagination">
<el-pagination
background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="pageNo"
:page-sizes="[15, 30, 50, 100, 200, 500, 700, 1000,1500, 2000]"
:page-size="pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="totalRows">
</el-pagination>
</div>
<el-dialog title="提现明细" :visible.sync="detailTableVisible">
<el-table :data="detailData">
<el-table-column property="index" label="序号" width="150">
<template slot-scope="scope">
<span style="margin-left: 10px">{{ scope.$index+1}}</span>
</template>
</el-table-column>
<el-table-column property="created_time" label="提现日期"></el-table-column>
<el-table-column property="amount" label="提现金额"></el-table-column>
<el-table-column property="red_packet_status" label="状态领取">
<template slot-scope="scope">
<span style="margin-left: 10px">{{ scope.row.red_packet_status |packetStatusFilter }}</span>
</template>
</el-table-column>
</el-table>
</el-dialog>
<el-dialog title="获奖明细" :visible.sync="prizeTableVisible">
<el-table :data="prizeData">
<el-table-column property="index" label="序号" width="150">
<template slot-scope="scope">
<span style="margin-left: 10px">{{ scope.$index +1}}</span>
</template>
</el-table-column>
<el-table-column property="created_time" label="获奖日期"></el-table-column>
<el-table-column property="amount" label="获奖金额(元)"></el-table-column>
</el-table>
</el-dialog>
</div>
</template>
<style scoped>
.search-tool {
padding-left: 100px;
margin-bottom: 20px;
}
.area-item {
width: 109px;
margin-right: 5px;
}
.row {
margin-bottom: 15px;
}
.search-wrap {
width: 800px;
}
.title {
font-size:18px;
padding-bottom: 5px;
margin-bottom: 20px;
color: #303133;
}
.p-label {
color: #606266;
font-size: 14px;
line-height: 38px;
width: 100%;
display: inline-block;
}
</style>
<script>
import fetch from '../../common/fetch';
import {positionService} from '../../common/position_service'
export default {
data(){
return {
pageNo: 1,
pageSize: 15,
totalRows: 0,
doctor_name: '',
doctor_mobile: '',
province_id: '',
city_id: '',
county_id: '',
town_id: '',
hospital_id: '',
provinceList: [],
cityList: [],
countyList: [],
townList: [],
hospitalList: [],
dateStart: '',
dateEnd: '',
tableData: [],
detailTableVisible: false,
prizeTableVisible: false,
detailData: [],
prizeData: []
}
},
created() {
positionService.getProvinceList().then(res => {
this.provinceList = res.provinceList
});
this.search();
},
methods: {
search() {
let para = {
doctor_name: this.doctor_name,
doctor_mobile: this.doctor_mobile,
province_id: this.province_id,
city_id: this.city_id,
county_id: this.county_id,
town_id: this.town_id,
hospital_id: this.hospital_id,
pageSize: this.pageSize,
pageNo: this.pageNo,
token: localStorage.getItem("token")
// dateStart: this.dateStart,
// dateEnd: this.dateEnd
};
fetch('person/getPersonalBonds', para, 'GET', 'GET').then(data => {
this.tableData = data.personalBonds;
this.totalRows = data.totalRows;
});
},
handleSizeChange(size) {
this.pageSize = size
this.search()
},
handleCurrentChange(no) {
this.pageNo = no
this.search()
},
showDrawDetail(index,row) {
let self = this;
this.detailTableVisible = true
let param = {
doctor_id: row.doctor_id,
token: localStorage.getItem("token")
};
let promise = fetch('person/historyCash', param, 'POST', 'POST')
promise.then(function (data) {
self.detailData = data.withdrawCashList;
}, function (error) {
});
},
showPrizeDetail(index,row) {
let self = this;
this.prizeTableVisible = true
let param = {
doctor_id: row.doctor_id,
token: localStorage.getItem("token")
};
let promise = fetch('person/historyBonds', param, 'POST', 'POST')
promise.then(function (data) {
self.prizeData = data.withdrawRecordList;
}, function (error) {
});
},
provinceChange(id) {
if(!id) {
this.cityList = []
this.city_id = ''
return
}
positionService.getCityListData(id).then(res => {
this.cityList = res.cityList
this.city_id = ''
})
},
cityChange(id) {
if(!id) {
this.countyList = []
this.county_id = ''
return
}
positionService.getCountyListData(id).then(res => {
this.countyList = res.countyList
this.county_id = ''
})
},
countyChange(id) {
if(!id) {
this.townList = []
this.town_id = ''
this.getHospital()
return
}
positionService.getTownListData(id).then(res => {
this.townList = res.townList
if(this.town_id) {
this.town_id = ''
} else {
this.getHospital()
}
})
},
townChange() {
this.getHospital()
},
getHospital() {
if(!this.county && !this.town) {
this.hospitalList = []
this.hospital_id = ''
return
}
positionService.getHospitalListData(this.county, this.town).then(res => {
this.hospitalList = res.hospitalList
this.hospital_id = ''
})
}
},
filters: {
packetStatusFilter: function (value) {
let hash = {
0:'未获取状态',
1:'发放中',
2:'已发放待领取',
3:'发放失败',
4: '已领取',
5: '退款中',
6: '已退款'
};
return hash[value];
}
}
}
</script>
<template>
<div class="table">
<el-row :gutter="10" class="row">
<el-col :span="2" :offset="20">
<el-button type="primary" icon="search" @click="search">搜索</el-button>
</el-col>
<el-col :span="2">
<el-button type="primary" icon="edit" @click="dialogFormVisible = true;resource = Object.assign({},form)">新增</el-button>
</el-col>
</el-row>
<el-table :data="tableData" stripe border style="width: 100%" ref="multipleTable">
<el-table-column prop="name" label="音频名称" :show-overflow-tooltip="tooltip" sortable width="150">
</el-table-column>
<el-table-column label="音频大小" sortable min-width="100">
<template slot-scope="scope">
<span style="margin-left: 10px">{{ scope.row.size | sizeFilter }}</span>
</template>
</el-table-column>
<el-table-column prop="created_time" label="上传时间" sortable min-width="170">
</el-table-column>
<el-table-column label="音频状态" sortable min-width="100">
<template slot-scope="scope">
<span style="margin-left: 10px">{{ scope.row.status | statusFilter }}</span>
</template>
</el-table-column>
<el-table-column label="操作">
<template scope="scope">
<el-button size="small" @click="handleDelete(scope.$index, scope.row)">删除</el-button>
</template>
</el-table-column>
</el-table>
<!--新增页面-->
<el-dialog title="新增音频" :visible.sync="dialogFormVisible">
<el-form :model="resource" ref="form" label-suffix=":">
<el-form-item label="上传音频">
<el-upload class="upload-demo" style="max-width: 270px;"
action="#"
accept=".mp3"
:before-upload="beforeUpload"
:on-remove="handleRemove"
:file-list="fileList"
:limit="1"
list-type="text">
<el-button size="small" type="primary">上传音频</el-button>
<!--<el-tag v-show="model.name" type="success" closable>{{model.name}}</el-tag>-->
<!--<div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div>-->
<!--<input type="file" id="imageUpload1" accept=".mp3" @change="handleChange" style="display: none;"/>-->
<!--<div id="preview1">-->
<!--<el-button size="small" @click="uploadClick()">添加</el-button>-->
<!--</div>-->
</el-upload>
<el-progress :text-inside="true" :stroke-width="16" :percentage="uploadProgress" status="success" v-show="uploadProgress>0&&uploadProgress<100"></el-progress>
<audio id="audio" style="max-width: 270px;" controls="" :src="resource.audioAddress" v-show="resource.audioAddress!=null"></audio>
</el-form-item>
<el-form-item label="音频名称" prop="name">
<el-input v-model="resource.name" class="form-input"></el-input>
</el-form-item>
<el-form-item label="音频大小" prop="size">
<!--< v-model="resource.name" class="form-input"></>-->
<label>{{resource.size | sizeFilter}}</label>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer" style="text-align: center">
<el-button type="primary" @click="save();">确 定</el-button>
<el-button @click="dialogFormVisible=false">取 消</el-button>
</div>
</el-dialog>
<div class="pagination">
<el-pagination
background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="pageNo"
:page-sizes="[15, 30, 50, 100, 200, 500, 700, 1000,1500, 2000]"
:page-size="pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="totalRows">
</el-pagination>
</div>
</div>
</template>
<script>
import {ossUpload, getFilePath} from '../../common/ossUtil';
import {errorResponseCheck, isEmptyUtils, isNotEmptyUtils, openLoading, closeLoading, messageBox} from "../../common/utils";
export default {
data() {
return {
tooltip: true,//是否省略号显示
form: {
name: null,
size: null,
url: null,
account_time: 0,
time: 0,
audioAddress: null,//音频全路径
},
resource: {},
dialogFormVisible: false,
tableData: [],//列表数据list
totalRows: 0,
pageSize: 15,
pageNo: 1,
fileList: [],//上传文件列表
uploadProgress: 0,//上传进度
uploadStatus: false//是否在上传
}
},
created() {
//初始化检索
this.search();
},
methods: {
handleSizeChange(val) {
this.pageSize = val;
this.search();
},
handleCurrentChange(val) {
this.pageNo = val;
this.search();
},
search() {
let self = this;
// openLoading(self);
let req = {
token: localStorage.getItem("token"),
pageSize: self.pageSize,
pageNo: self.pageNo
};
self.$axios.post(localStorage.getItem("Url") + 'AudioDeploy/getAudioDeploy'
, JSON.stringify(req)
).then(function (res) {
// closeLoading(self);
let data = JSON.parse(JSON.stringify(res.data));//通过这个实现深拷贝
self.tableData = data.list;
self.totalRows = data.totalRows;
}).catch(function (error) {
errorResponseCheck(error, self);
});
},
beforeUpload(file) {
let self = this;
//如果没有选择文件,返回
if (isEmptyUtils(file)) {
return;
}
//上传 指定文件名
ossUpload(self, file, getFilePath(file), null, null, null).then(function (path) {
//回显的上传文件列表
let list = [{}];
list[0].name = file.name;
list[0].url = localStorage.getItem("resource_url") + path;
self.fileList = list;
self.resource.audioAddress = localStorage.getItem("resource_url") + path;
self.resource.name = file.name;
self.resource.size = file.size;
self.resource.url = path;
// self.$message('上传成功!');
});
return false;
},
handleRemove(file, fileList) {
//重置resource
this.resource.audioAddress = null;
// this.resource.name = null;
this.resource.size = null;
this.resource.url = null;
this.resource.account_time = 0;
this.resource.time = 0;
},
save() {
//添加
let self = this;
if (self.uploadStatus) {
self.$message.warning('正在上传,请稍后...');
return;
}
if (isEmptyUtils(self.resource.name) || isEmptyUtils(self.resource.size)
|| isEmptyUtils(self.resource.url) || isEmptyUtils(self.resource.name)
|| isEmptyUtils(self.resource.account_time) || isEmptyUtils(self.resource.time)) {
self.$message.error('请上传文件');
return;
}
openLoading(self);
let req = {
token: localStorage.getItem("token"),
model: self.resource
};
self.$axios.post(localStorage.getItem("Url") + 'AudioDeploy/saveAudioDeploy'
, JSON.stringify(req)
).then(function (res) {
closeLoading(self);
//隐藏弹出层
self.dialogFormVisible = false;
self.fileList = [];
self.$message.success('保存成功');
self.search();
}).catch(function (error) {
errorResponseCheck(error, self);
});
},
handleDelete(index, row) {
//删除
let self = this;
if (row.status === 2) {
self.$message.warning('解绑后才可以删除');
return;
}
messageBox(self, "提示", "是否删除?", "是", function () {
let req = {
token: localStorage.getItem("token"),
model: row
};
self.$axios.post(localStorage.getItem("Url") + 'AudioDeploy/delAudioDeploy'
, JSON.stringify(req)
).then(function (res) {
let data = JSON.parse(JSON.stringify(res.data));//通过这个实现深拷贝
if (data.flag === 1) {
self.$message.warning("解绑后才可以删除");
} else {
self.$message.info("删除成功");
self.search();
}
}).catch(function (error) {
errorResponseCheck(error, self);
});
}, "否", function () {
}, "info");
},
},
computed: {
onRoutes() {
return this.$route.path.replace('/', '');
}
},
watch: {
uploadStatus: function (val) {
//在此处设置音频时长
let self = this;
//当上传完成时
if (val === false) {
let audio = document.getElementById("audio");
//当音频加载完成可以播放时,获取时长(方法2)
audio.oncanplay = function () {
self.resource.account_time = parseInt(audio.duration)
self.resource.time = parseInt(audio.duration)
};
}
}
},
filters: {
sizeFilter: function (value) {
if (!value) return '0M';
return (value / 1000 / 1000).toFixed(2) + 'M';
},
statusFilter: function (value) {
if (!value) return '';
let hash = {
1: '未绑定',
2: '已绑定'
};
return hash[value];
// let hash = {};
// if (enumList != null && enumList.length > 0) {
// for (let i = 0; i < enumList.length; i++) {
// hash[enumList[i].role_code] = enumList[i].role_name;
// }
// }
//
// return hash[value];
}
}
}
</script>
<style scoped>
.avatar-uploader .el-upload {
border: 1px dashed #d9d9d9;
border-radius: 6px;
cursor: pointer;
position: relative;
overflow: hidden;
}
.avatar-uploader .el-upload:hover {
border-color: #409EFF;
}
.avatar-uploader-icon {
font-size: 28px;
color: #8c939d;
width: 178px;
height: 178px;
line-height: 178px;
text-align: center;
}
.avatar {
width: 178px;
height: 178px;
display: block;
}
.row {
margin-bottom: 20px;
}
.padding-top-10 {
padding-top: 10px;
}
</style>
<template>
<div>
<div>
<h2>欢迎来到医典系统!</h2>
</div>
</div>
</template>
<script>
export default {
data: function(){
return {}
}
}
</script>
<style scoped>
</style>
<template>
<div>
<div class="crumbs">
<el-breadcrumb separator="/">
<el-breadcrumb-item><i class="el-icon-date"></i> 表单</el-breadcrumb-item>
<el-breadcrumb-item>图片上传</el-breadcrumb-item>
</el-breadcrumb>
</div>
<div class="content-title">支持拖拽</div>
<div class="plugins-tips">
Element UI自带上传组件。
访问地址:<a href="http://element.eleme.io/#/zh-CN/component/upload" target="_blank">Element UI Upload</a>
</div>
<el-upload
class="upload-demo"
drag
action="/api/posts/"
multiple>
<i class="el-icon-upload"></i>
<div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
<div class="el-upload__tip" slot="tip">只能上传jpg/png文件,且不超过500kb</div>
</el-upload>
<div class="content-title">支持裁剪</div>
<div class="plugins-tips">
Vue-Core-Image-Upload:一款轻量级的vue上传插件,支持裁剪。
访问地址:<a href="https://github.com/Vanthink-UED/vue-core-image-upload" target="_blank">Vue-Core-Image-Upload</a>
</div>
<img class="pre-img" :src="src" alt="">
<vue-core-image-upload :class="['pure-button','pure-button-primary','js-btn-crop']"
:crop="true"
text="上传图片"
url="/api/posts/"
extensions="png,gif,jpeg,jpg"
@:imageuploaded="imageuploaded"
@:errorhandle="handleError"></vue-core-image-upload>
</div>
</template>
<script>
import VueCoreImageUpload from 'vue-core-image-upload';
export default {
data: function(){
return {
src: './static/img/img.jpg',
fileList: []
}
},
components: {
VueCoreImageUpload
},
methods:{
imageuploaded(res) {
console.log(res)
},
handleError(){
this.$notify.error({
title: '上传失败',
message: '图片上传接口上传失败,可更改为自己的服务器接口'
});
}
}
}
</script>
<style scoped>
.content-title{
font-weight: 400;
line-height: 50px;
margin: 10px 0;
font-size: 22px;
color: #1f2f3d;
}
.pre-img{
width:250px;
height: 250px;
margin-bottom: 20px;
}
</style>
\ No newline at end of file
<template>
<div>
<div class="crumbs">
<el-breadcrumb separator="/">
<el-breadcrumb-item><i class="el-icon-date"></i> 表单</el-breadcrumb-item>
<el-breadcrumb-item>编辑器</el-breadcrumb-item>
</el-breadcrumb>
</div>
<div class="plugins-tips">
Vue-Quill-Editor:基于Quill、适用于Vue2的富文本编辑器。
访问地址:<a href="https://github.com/surmon-china/vue-quill-editor" target="_blank">vue-quill-editor</a>
</div>
<quill-editor ref="myTextEditor" v-model="content" :config="editorOption"></quill-editor>
<el-button class="editor-btn" type="primary" @click="submit">提交</el-button>
</div>
</template>
<script>
import { quillEditor } from 'vue-quill-editor';
export default {
data: function(){
return {
content: '<p>Hello BBK</p>',
editorOption: {
// something config
}
}
},
components: {
quillEditor
},
methods: {
onEditorChange({ editor, html, text }) {
this.content = html;
},
submit(){
console.log(this.content);
this.$message.success('提交成功!');
}
},
computed: {
editor() {
return this.$refs.myTextEditor.quillEditor;
}
}
}
</script>
<style scoped>
.editor-btn{
margin-top: 20px;
}
</style>
\ No newline at end of file
<template>
<div class="table">
<div class="crumbs">
<el-breadcrumb separator="/">
<el-breadcrumb-item><i class="el-icon-menu"></i> 表格</el-breadcrumb-item>
<el-breadcrumb-item>Vue表格组件</el-breadcrumb-item>
</el-breadcrumb>
</div>
<div class="plugins-tips">
vue-datasource:一个用于动态创建表格的vue.js服务端组件。
访问地址:<a href="https://github.com/coderdiaz/vue-datasource" target="_blank">vue-datasource</a>
</div>
<datasource language="en" :table-data="getData" :columns="columns" :pagination="information.pagination"
:actions="actions"
:change="changePage"
:searching="onSearch"></datasource>
<el-upload
class="upload-demo"
action="https://jsonplaceholder.typicode.com/posts/"
:on-preview="handlePreview"
:on-remove="handleRemove"
:before-remove="beforeRemove"
:on-success="handleSuccess"
:on-change="handleChange"
:on-error="handleError"
multiple
:limit="3"
:on-exceed="handleExceed"
:file-list="fileList">
<el-button size="small" type="primary">点击上传</el-button>
<div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div>
</el-upload>
</div>
</template>
<script>
import axios from 'axios';
import Datasource from 'vue-datasource';
export default {
data: function(){
const self = this;
return {
url: './static/datasource.json',
information: {
pagination:{},
data:[],
fileList: [{name: 'food.jpeg', url: 'https://fuss10.elemecdn.com/3/63/4e7f3a15429bfda99bce42a18cdd1jpeg.jpeg?imageMogr2/thumbnail/360x360/format/webp/quality/100'}, {name: 'food2.jpeg', url: 'https://fuss10.elemecdn.com/3/63/4e7f3a15429bfda99bce42a18cdd1jpeg.jpeg?imageMogr2/thumbnail/360x360/format/webp/quality/100'}]
},
columns: [
{
name: 'Id',
key: 'id',
},
{
name: 'Name',
key: 'name',
},
{
name: 'email',
key: 'email',
},
{
name: 'ip',
key: 'ip',
}
],
actions: [
{
text: 'Click',
class: 'btn-primary',
event(e, row) {
self.$message('选中的行数: ' + row.row.id);
}
}
],
query:''
}
},
components: {
Datasource
},
methods: {
changePage(values) {
this.information.pagination.per_page = values.perpage;
this.information.data = this.information.data;
},
onSearch(searchQuery) {
this.query = searchQuery;
},
handleRemove(file, fileList) {
console.log(file, fileList);
},
handlePreview(file) {
console.log(file);
},
handleExceed(files, fileList) {
this.$message.warning(`当前限制选择 3 个文件,本次选择了 ${files.length} 个文件,共选择了 ${files.length + fileList.length} 个文件`);
},
handleSuccess(response, file, fileList) {
debugger
this.$message.warning(`当前限制选择 3 个文件,本次选择了 ${files.length} 个文件,共选择了 ${files.length + fileList.length} 个文件`);
},
handleChange(file, fileList) {
console.log("handleChange");
debugger;
console.log("handleChange");
},
handleError(file, fileList) {
console.log("error");
debugger;
console.log("handleChange");
},
beforeRemove(file, fileList) {
return this.$confirm(`确定移除 ${ file.name }?`);
}
},
computed:{
getData(){
const self = this;
return self.information.data.filter(function (d) {
if(d.name.indexOf(self.query) > -1){
return d;
}
})
}
},
beforeMount(){
if(process.env.NODE_ENV === 'development'){
this.url = '/ms/table/source';
};
axios.get(this.url).then( (res) => {
this.information = res.data;
})
}
}
</script>
<style src="../../../static/css/datasource.css"></style>
<template>
<div class="table">
<!--<div class="title">提现列表</div>-->
<div class="search-wrap">
<el-row class="row">
<el-col :span="3">
<label for="" class="p-label">姓名:</label>
</el-col>
<el-col :span="5">
<el-input
placeholder="请输入姓名"
v-model="name"
clearable>
</el-input>
</el-col>
<el-col :span="2">
<label for="" class="p-label" style="padding-left: 10px;">手机:</label>
</el-col>
<el-col :span="5">
<el-input
placeholder="请输入手机号"
v-model="mobile"
clearable>
</el-input>
</el-col>
</el-row>
<el-row class="row">
<el-col :span="3">
<label for="" class="p-label">地区:</label>
</el-col>
<el-col :span="21">
<el-select v-model="province" placeholder="省" clearable class="area-item" @change="provinceChange(province)">
<el-option
v-for="item in provinceList"
:key="item.province_id"
:label="item.province_name"
:value="item.province_id">
</el-option>
</el-select>
<el-select v-model="city" placeholder="市" clearable class="area-item" @change="cityChange(city)">
<el-option
v-for="item in cityList"
:key="item.city_id"
:label="item.city_name"
:value="item.city_id">
</el-option>
</el-select>
<el-select v-model="county" placeholder="区/县" clearable class="area-item" @change="countyChange(county)">
<el-option
v-for="item in countyList"
:key="item.county_id"
:label="item.county_name"
:value="item.county_id">
</el-option>
</el-select>
<el-select v-model="town" placeholder="乡/镇/街道" clearable class="area-item" @change="townChange(town)">
<el-option
v-for="item in townList"
:key="item.town_id"
:label="item.town_name"
:value="item.town_id">
</el-option>
</el-select>
<el-select v-model="hospital" placeholder="医院" clearable class="area-item">
<el-option
v-for="item in hospitalList"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</el-col>
</el-row>
<el-row class="row">
<el-col :span="3">
<label for="" class="p-label">发放状态:</label>
</el-col>
<el-col :span="6">
<el-select v-model="sendStatus" placeholder="发放状态" clearable class="p-label" @change="sendStatusChange(sendStatus)">
<el-option
v-for="item in sendStatusList"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</el-col>
<el-col :span="3">
<label for="" class="p-label" style="padding-left: 10px;">领取状态:</label>
</el-col>
<el-col :span="6">
<el-select v-model="receiveStatus" placeholder="领取状态" clearable class="p-label" @change="receiveStatusChange(receiveStatus)">
<el-option
v-for="item in receiveStatusList"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</el-col>
</el-row>
<el-row class="row">
<el-col :span="3">
<label for="" class="p-label">提现时间:</label>
</el-col>
<el-col :span="6">
<el-date-picker
v-model="dateStart"
type="date"
placeholder="选择日期">
</el-date-picker>
</el-col>
<el-col :span="6">
<el-date-picker
v-model="dateEnd"
type="date"
placeholder="选择日期">
</el-date-picker>
</el-col>
</el-row>
</div>
<div class="search-tool">
<el-button type="primary" @click="search">搜索</el-button>
</div>
<el-table :data="tableData" stripe border style="width: 100%" ref="multipleTable" @selection-change="handleSelectionChange">
<!--<el-table-column type="selection" width="55"></el-table-column>-->
<el-table-column prop="name" label="姓名" sortable width="150">
</el-table-column>
<el-table-column prop="mobile_phone" label="手机号" width="120">
</el-table-column>
<el-table-column prop="hospital" label="医院" >
</el-table-column>
<el-table-column prop="created_time" label="提现时间" >
</el-table-column>
<el-table-column prop="total_amount" label="提现金额" >
</el-table-column>
<el-table-column prop="isReceived" label="红包领取状态" >
</el-table-column>
</el-table>
<div class="pagination">
<el-pagination
background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="pageNo"
:page-sizes="[15, 30, 50, 100, 200, 500, 700, 1000,1500, 2000]"
:page-size="pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="totalRows">
</el-pagination>
</div>
</div>
</template>
<script>
import fetch from '../../common/fetch';
import {ossUpload, getFilePath} from '../../common/ossUtil';
import {errorResponseCheck, isEmptyUtils, isNotEmptyUtils} from '../../common/utils';
import vQuestionModel from './model/QuestionModel.vue';
import {positionService} from '../../common/position_service'
export default {
data() {
return {
name: '',
mobile: '',
province: '',
city: '',
county: '',
town: '',
hospital: '',
provinceList: [],
cityList: [],
countyList: [],
townList: [],
hospitalList: [],
sendStatus: '',
receiveStatus: '',
sendStatusList: [{
id: '0',
name: '待处理'
}, {
id: '1',
name: '成功'
}, {
id: '2',
name: '失败'
}],
receiveStatusList: [{
id: '0',
name: '未获取'
}, {
id: '1',
name: '发放中'
}, {
id: '2',
name: '已发放待领取'
}, {
id: '3',
name: '发放失败'
}, {
id: '4',
name: '已领取'
}, {
id: '5',
name: '退款中'
}, {
id: '6',
name: '已退款'
}],
dateStart: '',
dateEnd: '',
tableData: [],
dialogTableVisible: false,
dialogFormVisible: false,
personAmt:0,
form:{},
formObj: {
name:'',
join_role:4,
type:1,
start_date:'',
amount:'',
avg_max_amount:'',
max_answer_num:'',
min_online_num:'',
count_c:1,
image_url:''
},
formLabelWidth: '120px',
totalRows:0,
pageSize:15,
pageNo:1,
searchParam:{status:1}
}
},
created() {
let self = this;
self.getData();
positionService.getProvinceList().then(res => {
this.provinceList = res.provinceList
});
/*positionService.getCityList().then(res => {
this.cityList = res.cityList
});
positionService.getProvinceList().then(res => {
this.provinceList = res.provinceList
});
positionService.getProvinceList().then(res => {
this.provinceList = res.provinceList
});*/
},
methods: {
handleSizeChange(val) {
this.pageSize =val;
this.search();
},
handleCurrentChange(val){
this.pageNo = val;
this.search();
},
handleSelectionChange(val) {
this.multipleSelection = val;
},
getData(){
let self = this;
self.search();
// self.searchStatus();
},
search(){
this.is_search = true;
let self = this;
// debugger
let promise = fetch('person/cash/list',{
// token:localStorage.getItem("token"),
token:"25BC19B82ECB26075DFE786B2B84A278",
name:self.name,
mobile:self.mobile,
province:self.province,
city:self.city,
county:self.county,
town:self.town,
hospital:self.hospital,
sendStatus:self.sendStatus,
receiveStatus:self.receiveStatus,
dateStart: self.dateStart,
dateEnd: self.dateEnd,
pageSize:self.pageSize,
pageNo:self.pageNo
},'POST','POST')
promise.then(function (data) {
// alert(11)
self.tableData = data.list;
self.totalRows = data.totalRows;
},function (error) {
});
},
searchStatus(){
this.is_search = true;
let self = this;
// debugger
let promise = fetch('person/cash/status',{
// token:localStorage.getItem("token"),
token:"25BC19B82ECB26075DFE786B2B84A278",
name:self.name,
},'GET','GET')
promise.then(function (data) {
// alert(11)
self.sendStatusList = data.sendStatusList;
self.receiveStatusList = data.receiveStatusList;
},function (error) {
});
},
provinceChange(id) {
if(!id) {
this.cityList = []
this.city = ''
return
}
positionService.getCityListData(id).then(res => {
this.cityList = res.cityList
this.city = ''
})
},
cityChange(id) {
if(!id) {
this.countyList = []
this.county = ''
return
}
positionService.getCountyListData(id).then(res => {
this.countyList = res.countyList
this.county = ''
})
},
countyChange(id) {
if(!id) {
this.townList = []
this.town = ''
this.getHospital()
return
}
positionService.getTownListData(id).then(res => {
this.townList = res.townList
if(this.town) {
this.town = ''
} else {
this.getHospital()
}
})
},
townChange() {
this.getHospital()
},
getHospital() {
if(!this.county && !this.town) {
this.hospitalList = []
this.hospital = ''
return
}
positionService.getHospitalListData(this.county, this.town).then(res => {
this.hospitalList = res.hospitalList
this.hospital = ''
})
},
sendStatusChange(sendStatus){
this.sendStatus = sendStatus;
},
receiveStatusChange(receiveStatus){
this.receiveStatus = receiveStatus;
}
},
computed: {
onRoutes() {
return this.$route.path.replace('/', '');
}
}
}
</script>
<style scoped>
/*.handle-box{*/
/*margin-bottom: 20px;*/
/*}*/
/*.handle-select{*/
/*width: 120px;*/
/*}*/
/*.handle-input{*/
/*width: 300px;*/
/*display: inline-block;*/
/*}*/
.avatar-uploader .el-upload {
border: 1px dashed #d9d9d9;
border-radius: 6px;
cursor: pointer;
position: relative;
overflow: hidden;
}
.avatar-uploader .el-upload:hover {
border-color: #409EFF;
}
.avatar-uploader-icon {
font-size: 28px;
color: #8c939d;
width: 178px;
height: 178px;
line-height: 178px;
text-align: center;
}
.avatar {
width: 178px;
height: 178px;
display: block;
}
.search-tool {
padding-left: 100px;
margin-bottom: 20px;
}
.area-item {
width: 109px;
margin-right: 5px;
}
.row {
margin-bottom: 15px;
}
.search-wrap {
width: 800px;
}
.title {
font-size:18px;
padding-bottom: 5px;
margin-bottom: 20px;
color: #303133;
}
.p-label {
color: #606266;
font-size: 14px;
line-height: 38px;
width: 100%;
display: inline-block;
}
</style>
<template>
<div>
<el-form ref="queAnsForm" :model="queAns" :rules="rules" label-width="150px" label-suffix=":" size="mini">
<el-form-item label="关联模块">
<el-col :span="6">
<el-select v-model="queAns.model_type" filterable placeholder="请选择" @change="modelTypeChange(queAns.model_type)">
<el-option v-for="item in modelTypeList" :key="item.no" :label="item.value" :value="item.no">
<!--<el-option label="未选择" value=""></el-option>-->
</el-option>
</el-select>
</el-col>
<el-col class="line" :span="3">模块子分类</el-col>
<el-col :span="11">
<el-select v-model="queAns.model_sub_id" filterable placeholder="请选择">
<el-option v-for="item in modelSubTypeList" :key="item.no" :label="item.value" :value="item.no">
<!--<el-option label="未选择" value=""></el-option>-->
</el-option>
</el-select>
</el-col>
</el-form-item>
<el-form-item label="答题开始时间" prop="time_node" :rules="[ { required: true, message: '请输入答题开始时间点'}, { type: 'number',min:0, message: '只能输入正整数'}]">
<el-input class="form-input" v-model.number="queAns.time_node" placeholder="单位:秒"></el-input>
</el-form-item>
<el-form-item label="题目标签" prop="label_id_arr">
<el-select v-model.array="queAns.label_id_arr" multiple placeholder="请选择">
<el-option v-for="item in labelIdList" :key="item.id" :label="item.label" :value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="难度系数" prop="difficulty_c">
<el-select v-model="queAns.difficulty_c" placeholder="">
<el-option v-for="item in difficultyList" :label="item.value" :value="item.no" :key="item.no">
<!--<el-option label="未选择" value=""></el-option>-->
</el-option>
</el-select>
</el-form-item>
<el-form-item label="是否可复活" prop="alive_flag">
<el-radio v-model.number="queAns.alive_flag" :label="1"></el-radio>
<el-radio v-model.number="queAns.alive_flag" :label="2">不可</el-radio>
</el-form-item>
<el-form-item label="题干" prop="name">
<el-input class="form-textarea" type="textarea" v-model="queAns.name" placeholder="最多255个文字" style="max-width: 400px" :maxlength="maxLength" :autosize="{minRows: 3, maxRows: 6}"></el-input>
</el-form-item>
<!--<el-radio-group id="picaRadioGroup" v-model="correctAnswer">-->
<!--<div v-for="item in queAns.answerList">-->
<!--<el-form-item :label="item.title" prop="answerList">-->
<!--<el-input class="form-input" v-model="item.answer" placeholder="" :maxlength="maxLength"></el-input>-->
<!--&lt;!&ndash;<input type="radio" :value="item.seq_no" v-model="correctAnswer" @click="changeCorrectAnswer(item.seq_no-1)">&ndash;&gt;-->
<!--<el-radio name="" :label="item.seq_no" :change="changeCorrectAnswer(item.seq_no)"></el-radio>-->
<!--</el-form-item>-->
<!--</div>-->
<el-form-item :label="queAns.title1" prop="answer1">
<el-input class="form-input" v-model="queAns.answer1" placeholder="" :maxlength="maxLength"></el-input>
<!--<el-radio name="" :label="queAns.seq_no1" @click="changeCorrectAnswer(queAns.seq_no1)"></el-radio>-->
<input type="radio" :value="queAns.seq_no1" v-model="queAns.correctAnswer" @click="changeCorrectAnswer(queAns.seq_no1)">
</el-form-item>
<el-form-item :label="queAns.title2" prop="answer2">
<el-input class="form-input" v-model="queAns.answer2" placeholder="" :maxlength="maxLength"></el-input>
<!--<el-radio name="" :label="queAns.seq_no2" @click="changeCorrectAnswer(queAns.seq_no2)"></el-radio>-->
<input type="radio" :value="queAns.seq_no2" v-model="queAns.correctAnswer" @click="changeCorrectAnswer(queAns.seq_no2)">
</el-form-item>
<el-form-item :label="queAns.title3" prop="answer3">
<el-input class="form-input" v-model="queAns.answer3" placeholder="" :maxlength="maxLength"></el-input>
<input type="radio" :value="queAns.seq_no3" v-model="queAns.correctAnswer" @click="changeCorrectAnswer(queAns.seq_no3)">
<!--<el-radio name="" :label="queAns.seq_no3" @click="changeCorrectAnswer(queAns.seq_no3)"></el-radio>-->
</el-form-item>
<!--</el-radio-group>-->
<el-form-item label="解释文本" prop="remark">
<el-input class="form-textarea" type="textarea" v-model="queAns.remark" placeholder="最多255个文字" style="max-width: 400px" :maxlength="maxLength" :autosize="{minRows: 3, maxRows: 6}"></el-input>
</el-form-item>
</el-form>
</div>
</template>
<script>
import {isEmptyUtils, getConstantList} from "../../../common/utils";
export default {
data() {
//标签验证
let labelCheck = (rule, value, callback) => {
if (isEmptyUtils(value) || !(value instanceof Array) || value.length === 0) {
callback(new Error('请选择题目标签'));
} else {
callback();
}
};
return {
maxLength: 255,
correctAnswer: 1,//默认正确答案 选项A
difficultyList: [{no: 1, value: '1'}, {no: 2, value: '2'}, {no: 3, value: '3'}],//难度系数list
courseList: [],//课程list
labelIdList: [],//标签list
modelTypeList: [],//关联模块
modelSubTypeList: [],//子模块
fiveTypeList: [],//五分钟分类
rules: {
label_id_arr: [
{validator: labelCheck, trigger: 'change'},
], difficulty_c: [
{required: true, type: 'number', message: '请选择难度系数', trigger: 'change'},
], alive_flag: [
{required: true, type: 'number', message: '请选择是否可复活', trigger: 'change'},
], name: [
{required: true, message: '请输入题干', trigger: 'change'},
{min: 0, max: 255, message: '长度在 0 到 255 个字符', trigger: 'change'},
], answer1: [
{required: true, message: '请输入选项A的答案', trigger: 'change'},
], answer2: [
{required: true, message: '请输入选项B的答案', trigger: 'change'},
], answer3: [
{required: true, message: '请输入选项C的答案', trigger: 'change'},
], remark: [
{min: 0, max: 255, message: '长度在 0 到 255 个字符', trigger: 'blur'}
]
}
}
},
beforeCreate() {
// console.log(this.$props.queAns)
// debugger
},
created() {
// this.handleAnswer();
let code = {
modelTypeList: 'P101',//关联模块分类
fiveTypeList: 'P094'//五分钟分类
};
getConstantList(this, code);
this.getCourseList();
this.getLabelList();
},
props: {
queAns: Object
},
computed: {},
mounted() {
this.submitForm('queAnsForm');
//初始加载子分类
this.modelTypeChange(this.queAns.model_type);
// // 隐藏单选按钮的值
// let groups = document.querySelectorAll('#picaRadioGroup .el-radio__label');
// for (let i = 0; i < groups.length; i++) {
// groups[i].style.display = 'none';
// }
},
methods: {
// handleAnswer(){
// //处理答案层级问题,表单校验只支持一层属性的校验
// debugger
// this.queAns = JSON.parse(JSON.stringify(this.$props.queAns1));
// // let answerList = JSON.parse(JSON.stringify(this.queAns.answerList))
// // this.queAns.title1 = answerList[0].title;
// // this.queAns.seq_no1 = answerList[0].seq_no;
// // this.queAns.answer1 = answerList[0].answer;
// // this.queAns.status1 = answerList[0].status;
// //
// // this.queAns.title2 = answerList[1].title;
// // this.queAns.seq_no2 = answerList[1].seq_no;
// // this.queAns.answer2 = answerList[1].answer;
// // this.queAns.status2 = answerList[1].status;
// //
// // this.queAns.title3 = answerList[2].title;
// // this.queAns.seq_no3 = answerList[2].seq_no;
// // this.queAns.answer3 = answerList[2].answer;
// // this.queAns.status3 = answerList[2].status;
//
// },
modelTypeChange(val) {
//关联模块联动
if (isEmptyUtils(val)) {
//清除子模块
this.modelSubTypeList = [];
}
//5分钟医学院
else if (val === 1) {
this.modelSubTypeList = Object.assign([], this.fiveTypeList);
}
//名师学堂
else if (val === 2) {
this.modelSubTypeList = Object.assign([], this.courseList);
}
},
getCourseList() {
//获取课程list
let self = this;
//获取课程list
let req = {};
this.$axios.post(localStorage.getItem("Url") + 'course/postCourseList'
, JSON.stringify(req)
).then(function (res) {
self.courseList = JSON.parse(JSON.stringify(res.data.list));//通过这个实现深拷贝
console.log(2222)
}).catch(function (error) {
console.error(error);
});
},
getLabelList() {
//获取标签list
let self = this;
//获取菜单
let req = {
params: {type: 1}
};
this.$axios.get(localStorage.getItem("Url") + 'label/getLabelList'
, req
).then(function (res) {
self.labelIdList = JSON.parse(JSON.stringify(res.data.list));//通过这个实现深拷贝
}).catch(function (error) {
console.error(error);
});
},
changeCorrectAnswer(index) {
//正确答案操作
let self = this;
self.correctAnswer = index;
if (index === 1) {
self.status1 = 1;
self.status2 = 2;
self.status3 = 2;
} else if (index === 2) {
self.status1 = 2;
self.status2 = 1;
self.status3 = 2;
} else if (index === 3) {
self.status1 = 2;
self.status2 = 2;
self.status3 = 1;
}
//
// if (self.correctAnswer == index) {
// self.queAns.answerList[index - 1].status = 1;//正确答案
// } else {
// self.queAns.answerList[index - 1].status = 2;//错误答案
// }
},
submitForm(formName) {
this.$refs[formName].validate((valid) => {
if (valid) {
// alert('submit!');
} else {
// console.log('error submit!!');
return false;
}
});
}
}
}
</script>
<style scoped>
.form-input {
width: 194px;
}
.form-textarea {
width: 400px;
}
</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
}
import Vue from 'vue';
import App from './App';
import router from './router';
import axios from 'axios';
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-default/index.css'; // 默认主题
// import '../static/css/theme-green/index.css'; // 浅绿色主题
import "babel-polyfill";
import {getAddress,loadCommonFilter} from './common/env'
import vueXlsxTable from 'vue-xlsx-table'
//加载环境变量
getAddress();
loadCommonFilter();
//加载elementUi
Vue.use(ElementUI);
Vue.use(vueXlsxTable, {rABS: false})
Vue.prototype.$axios = axios;
new Vue({
router,
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: 'eagle-training'
},
{
path: 'eagle-question',
component: resolve => require(['../components/page/EagleQuestion.vue'], resolve)
},
{
path: 'create-question',
component: resolve => require(['../components/page/CreateQuestion.vue'], resolve)
},
{
path: 'eagle-training',
component: resolve => require(['../components/page/EagleTraining.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);
// });
.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, "microsoft yahei", arial, STHeiTi, 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: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:8181
// 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 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册