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

init project

上级 fa166670
{
"presets": [
["es2015", { "modules": false }],
"stage-2"
],
"plugins": ["transform-runtime"],
"comments": false,
"env": {
"test": {
"plugins": [ "istanbul" ]
}
}
}
root = true
[*]
charset = utf-8
indent_style = space
indent_size = 4
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
/build/
/config/
/dist/
/*.js
/test/unit/coverage/
// https://eslint.org/docs/user-guide/configuring
module.exports = {
root: true,
parserOptions: {
parser: 'babel-eslint'
},
env: {
browser: true,
},
extends: [
// https://github.com/vuejs/eslint-plugin-vue#priority-a-essential-error-prevention
// consider switching to `plugin:vue/strongly-recommended` or `plugin:vue/recommended` for stricter rules.
'plugin:vue/essential',
// https://github.com/standard/standard/blob/master/docs/RULES-en.md
'standard'
],
// required to lint *.vue files
plugins: [
'vue'
],
// add your custom rules here
rules: {
// allow async-await
'generator-star-spacing': 'off',
// allow debugger during development
'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off'
}
}
node_modules
/dist
\ No newline at end of file
// https://github.com/michael-ciniawsky/postcss-load-config
module.exports = {
"plugins": {
"postcss-import": {},
"postcss-url": {},
// to edit target browsers: use "browserslist" field in package.json
"autoprefixer": {}
}
}
<?xml version="1.0" encoding="UTF-8"?>
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
<component name="FacetManager">
<facet type="web" name="Web">
<configuration>
<descriptors>
<deploymentDescriptor name="web.xml" url="file://$MODULE_DIR$/src/main/webapp/WEB-INF/web.xml" />
</descriptors>
<webroots>
<root url="file://$MODULE_DIR$/src/main/webapp" relative="/" />
</webroots>
</configuration>
</facet>
</component>
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_5">
<output url="file://$MODULE_DIR$/target/classes" />
<output-test url="file://$MODULE_DIR$/target/test-classes" />
<content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/target" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" scope="TEST" name="Maven: junit:junit:3.8.1" level="project" />
</component>
</module>
\ No newline at end of file
# manage-system #
The web management system solution based on Vue2 and Element-UI。[live demo](http://blog.gdfengshuo.com/example/work/)
## Preface ##
The scheme as a set of multi-function background frame templates, suitable for most of the WEB management system development. Convenient development fast simple good components based on Vue2 and Element-UI. Color separation of color style, support manual switch themes, and it is convenient to use a custom theme color.
## Function ##
- [x] Element-UI
- [x] Login/Logout
- [x] Table
- [x] From
- [x] Chart :bar_chart:
- [x] Editor
- [x] Markdown
- [x] Upload pictures by clipping or dragging
- [x] Support manual switch themes :sparkles:
- [x] List drag sort
## Directory structure ##
|-- build // Webpack configuration file
|-- config // Project package path
|-- src // Source directory
| |-- components // Components
| |-- common // Common component
| |-- Header.vue // Header component
| |-- Home.vue // Home component
| |-- Sidebar.vue // Sidebar component
| |-- page // Router page
| |-- BaseCharts.vue // BaseCharts
| |-- BaseForm.vue // BaseForm
| |-- BaseTable.vue // BaseTable
| |-- Login.vue // Login
| |-- Markdown.vue // Markdown
| |-- MixCharts.vue // MixCharts
| |-- Readme.vue // Readme
| |-- Upload.vue // Upload
| |-- VueEditor.vue // VueEditor
| |-- VueTable.vue // VueTable
| |-- App.vue // Main component
| |-- main.js // Entry file
|-- .babelrc // ES6 syntax compiler configuration
|-- .editorconfig // Code specification
|-- .gitignore // Ignored file
|-- index.html // Entry HTML file
|-- package.json // Dependent configuration file
|-- README.md // Readme
## Installation steps ##
git clone https://github.com/lin-xin/manage-system.git // Clone templates
cd manage-system // Enter template directory
npm install // Installation dependency
## Local development ##
// Open server and access http://localhost:8080 in browser
npm run dev
## Constructing production ##
// Constructing project
npm run build
## Component description and presentation ##
### element-ui ###
A desktop component library based on vue.js2.0 . Github : [element](http://element.eleme.io/#/zh-CN/component/layout)
### vue-datasource ###
A Vue.js server side component to create dynamic tables. Github : [vue-datasource](https://github.com/coderdiaz/vue-datasource)
```JavaScript
<template>
<div>
<datasource language="en" :table-data="information.data"
:columns="columns"
:pagination="information.pagination"
:actions="actions"
v-on:change="changePage"
v-on:searching="onSearch"></datasource>
</div>
</template>
<script>
import Datasource from 'vue-datasource'; // import Datasource component
export default {
data: function(){
return {
information: {
pagination: {...}, // pagination config
data: [...]
},
columns: [...], // col config
actions: [...] // function config
}
},
components: {
Datasource
},
methods: {
changePage(values) {...},
onSearch(searchQuery) {...}
}
}
</script>
```
### Vue-Quill-Editor ###
Quill editor component for Vue2. Github : [vue-quill-editor](https://github.com/surmon-china/vue-quill-editor)
```JavaScript
<template>
<div>
<quill-editor ref="myTextEditor" v-model="content" :config="editorOption"></quill-editor>
</div>
</template>
<script>
import { quillEditor } from 'vue-quill-editor'; // import quillEditor component
export default {
data: function(){
return {
content: '',
editorOption: {
// something config
}
}
},
components: {
quillEditor
}
}
</script>
```
### Vue-SimpleMDE ###
Markdown Editor component for Vue.js. Github : [Vue-SimpleMDE](https://github.com/F-loat/vue-simplemde)
```JavaScript
<template>
<div>
<markdown-editor v-model="content" :configs="configs" ref="markdownEditor"></markdown-editor>
</div>
</template>
<script>
import { markdownEditor } from 'vue-simplemde';
export default {
data: function(){
return {
content:'',
configs: {
status: false,
initialValue: 'Hello BBK',
renderingConfig: {
codeSyntaxHighlighting: true,
highlightingTheme: 'atom-one-light'
}
}
}
},
components: {
markdownEditor
}
}
</script>
```
### Vue-Core-Image-Upload ###
a vue plugin for image upload and crop. Github : [Vue-Core-Image-Upload](https://github.com/Vanthink-UED/vue-core-image-upload)
```JavaScript
<template>
<div>
<img :src="src">
<vue-core-image-upload :class="['pure-button','pure-button-primary','js-btn-crop']"
:crop="true"
text="上传图片"
url=""
extensions="png,gif,jpeg,jpg"
@:imageuploaded="imageuploaded">
</vue-core-image-upload>
</div>
</template>
<script>
import VueCoreImageUpload from 'vue-core-image-upload';
export default {
data: function(){
return {
src:'../img/1.jpg'
}
},
components: {
VueCoreImageUpload
},
methods:{
imageuploaded(res) {
console.log(res)
}
}
}
</script>
```
### vue-schart ###
Vue.js wrapper for sChart.js. Github : [vue-schart](https://github.com/linxin/vue-schart)
```JavaScript
<template>
<div>
<schart :canvasId="canvasId"
:type="type"
:width="width"
:height="height"
:data="data"
:options="options"
></schart>
</div>
</template>
<script>
import Schart from 'vue-schart';
export default {
data: function(){
return {
canvasId: 'myCanvas',
type: 'bar',
width: 500,
height: 400,
data: [
{name: '2014', value: 1342},
{name: '2015', value: 2123},
{name: '2016', value: 1654},
{name: '2017', value: 1795},
],
options: {
title: 'Total sales of stores in recent years'
}
}
},
components: {
Schart
}
}
</script>
```
## Notice ##
### 一、If I don't want to use some components, how can I delete it? ###
For example, I don't want to use the vue-datasource component, I need to take four steps.
The first step to remove the component of the routing. Enter 'src/router/index.js' and delete the code below.
```JavaScript
{
path: '/vuetable',
component: resolve => require(['../components/page/VueTable.vue'], resolve)
},
```
Second,delete the component files. Enter 'src/components/page/' and delete 'VueTable.vue' file.
The third step is to delete the entry. Enter 'src/components/common/Sidebar.vue' and delete the code below.
```HTML
<el-menu-item index="vuetable">Vue表格组件</el-menu-item>
```
Finally, uninstall this component.
npm un vue-datasource -S
Complete!
### 二、How to switch themes? ###
The first step to enter 'src/main.js' and change into green theme.
```javascript
import 'element-ui/lib/theme-default/index.css'; // default theme
// import '../static/css/theme-green/index.css'; // green theme
```
The second step to enter 'src/App.vue' and change into green theme.
```javascript
@import "../static/css/main.css";
@import "../static/css/color-dark.css"; /*深色主题*/
/*@import "../static/css/theme-green/color-green.css"; !*浅绿色主题*!*/
```
Finally,enter 'src/components/common/Sidebar.vue' and find el-menu Tags,delete 'theme="dark"'。
## Screenshot ##
### Default theme ###
![Image text](https://github.com/lin-xin/manage-system/raw/master/screenshots/wms1.png)
### Green theme ###
![Image text](https://github.com/lin-xin/manage-system/raw/master/screenshots/wms2.png)
\ No newline at end of file
# manage-system #
基于Vue.js 2.x系列 + Element UI 的后台管理系统解决方案。[线上地址](http://blog.gdfengshuo.com/example/work/)
[English document](https://github.com/lin-xin/manage-system/blob/master/README_EN.md)
## 捐赠
![微信扫一扫](http://blog.gdfengshuo.com/images/weixin.jpg)
## 前言 ##
之前在公司用了Vue + Element组件库做了个后台管理系统,基本很多组件可以直接引用组件库的,但是也有一些需求无法满足。像图片裁剪上传、富文本编辑器、图表等这些在后台管理系统中很常见的功能,就需要引用其他的组件才能完成。从寻找组件,到使用组件的过程中,遇到了很多问题,也积累了宝贵的经验。所以我就把开发这个后台管理系统的经验,总结成这个后台管理系统解决方案。
该方案作为一套多功能的后台框架模板,适用于绝大部分的后台管理系统(Web Management System)开发。基于vue.js,使用vue-cli脚手架快速生成项目目录,引用Element UI组件库,方便开发快速简洁好看的组件。分离颜色样式,支持手动切换主题色,而且很方便使用自定义主题色。
## 功能 ##
- [x] Element UI
- [x] 登录/注销
- [x] 表格
- [x] 表单
- [x] 图表 :bar_chart:
- [x] 富文本编辑器
- [x] markdown编辑器
- [x] 图片拖拽/裁剪上传
- [x] 支持切换主题色 :sparkles:
- [x] 列表拖拽排序
## 目录结构介绍 ##
|-- build // webpack配置文件
|-- config // 项目打包路径
|-- src // 源码目录
| |-- components // 组件
| |-- common // 公共组件
| |-- Header.vue // 公共头部
| |-- Home.vue // 公共路由入口
| |-- Sidebar.vue // 公共左边栏
| |-- page // 主要路由页面
| |-- BaseCharts.vue // 基础图表
| |-- BaseForm.vue // 基础表单
| |-- BaseTable.vue // 基础表格
| |-- Login.vue // 登录
| |-- Markdown.vue // markdown组件
| |-- Readme.vue // 自述组件
| |-- Upload.vue // 图片上传
| |-- VueEditor.vue // 富文本编辑器
| |-- VueTable.vue // vue表格组件
| |-- App.vue // 页面入口文件
| |-- main.js // 程序入口文件,加载各种公共组件
|-- .babelrc // ES6语法编译配置
|-- .editorconfig // 代码编写规格
|-- .gitignore // 忽略的文件
|-- index.html // 入口html文件
|-- package.json // 项目及工具的依赖配置文件
|-- README.md // 说明
## 安装步骤 ##
git clone https://github.com/lin-xin/manage-system.git // 把模板下载到本地
cd manage-system // 进入模板目录
npm install // 安装项目依赖,等待安装完成之后
## 本地开发 ##
// 开启服务器,浏览器访问 http://localhost:8080
npm run dev
## 构建生产 ##
// 执行构建命令,生成的dist文件夹放在服务器下即可访问
npm run build
## 组件使用说明与演示 ##
### vue-schart ###
vue.js封装sChart.js的图表组件。访问地址:[vue-schart](https://github.com/linxin/vue-schart)
<p><a href="https://www.npmjs.com/package/vue-schart"><img src="https://img.shields.io/npm/dm/vue-schart.svg" alt="Downloads"></a></p>
```JavaScript
<template>
<div>
<schart :canvasId="canvasId"
:type="type"
:width="width"
:height="height"
:data="data"
:options="options"
></schart>
</div>
</template>
<script>
import Schart from 'vue-schart'; // 导入Schart组件
export default {
data: function(){
return {
canvasId: 'myCanvas', // canvas的id
type: 'bar', // 图表类型
width: 500,
height: 400,
data: [
{name: '2014', value: 1342},
{name: '2015', value: 2123},
{name: '2016', value: 1654},
{name: '2017', value: 1795},
],
options: { // 图表可选参数
title: 'Total sales of stores in recent years'
}
}
},
components: {
Schart
}
}
</script>
```
### element-ui ###
一套基于vue.js2.0的桌面组件库。访问地址:[element](http://element.eleme.io/#/zh-CN/component/layout)
### vue-datasource ###
一个用于动态创建表格的vue.js服务端组件。访问地址:[vue-datasource](https://github.com/coderdiaz/vue-datasource)
### Vue-Quill-Editor ###
基于Quill、适用于Vue2的富文本编辑器。访问地址:[vue-quill-editor](https://github.com/surmon-china/vue-quill-editor)
### Vue-SimpleMDE ###
Vue.js的Markdown Editor组件。访问地址:[Vue-SimpleMDE](https://github.com/F-loat/vue-simplemde)
### Vue-Core-Image-Upload ###
一款轻量级的vue上传插件,支持裁剪。访问地址:[Vue-Core-Image-Upload](https://github.com/Vanthink-UED/vue-core-image-upload)
## 其他注意事项 ##
### 一、如果我不想用到上面的某些组件呢,那我怎么在模板中删除掉不影响到其他功能呢? ###
举个栗子,我不想用 vue-datasource 这个组件,那我需要分四步走。
第一步:删除该组件的路由,在目录 src/router/index.js 中,找到引入改组件的路由,删除下面这段代码。
```JavaScript
{
path: '/vuetable',
component: resolve => require(['../components/page/VueTable.vue'], resolve) // vue-datasource组件
},
```
第二步:删除引入该组件的文件。在目录 src/components/page/ 删除 VueTable.vue 文件。
第三步:删除该页面的入口。在目录 src/components/common/Sidebar.vue 中,找到该入口,删除下面这段代码。
```HTML
<el-menu-item index="vuetable">Vue表格组件</el-menu-item>
```
第四步:卸载该组件。执行以下命令:
npm un vue-datasource -S
完成。
### 二、如何切换主题色呢? ###
第一步:打开 src/main.js 文件,找到引入 element 样式的地方,换成浅绿色主题。
```javascript
import 'element-ui/lib/theme-default/index.css'; // 默认主题
// import '../static/css/theme-green/index.css'; // 浅绿色主题
```
第二步:打开 src/App.vue 文件,找到 style 标签引入样式的地方,切换成浅绿色主题。
```javascript
@import "../static/css/main.css";
@import "../static/css/color-dark.css"; /*深色主题*/
/*@import "../static/css/theme-green/color-green.css"; !*浅绿色主题*!*/
```
第三步:打开 src/components/common/Sidebar.vue 文件,找到 el-menu 标签,把 theme="dark" 去掉即可。
## 项目截图 ##
### 默认皮肤 ###
![Image text](https://github.com/lin-xin/manage-system/raw/master/screenshots/wms1.png)
### 浅绿色皮肤 ###
![Image text](https://github.com/lin-xin/manage-system/raw/master/screenshots/wms2.png)
\ No newline at end of file
// https://github.com/shelljs/shelljs
require('./check-versions')();
process.env.NODE_ENV = 'production';
var ora = require('ora');
var path = require('path');
var chalk = require('chalk');
var shell = require('shelljs');
var webpack = require('webpack');
var config = require('../config');
var webpackConfig = require('./webpack.prod.conf');
var spinner = ora('building for production...');
spinner.start();
var assetsPath = path.join(config.build.assetsRoot, config.build.assetsSubDirectory);
shell.rm('-rf', assetsPath);
shell.mkdir('-p', assetsPath);
shell.config.silent = true;
shell.cp('-R', 'static/*', assetsPath);
shell.config.silent = false;
webpack(webpackConfig, function (err, stats) {
spinner.stop();
if (err) throw err;
process.stdout.write(stats.toString({
colors: true,
modules: false,
children: false,
chunks: false,
chunkModules: false
}) + '\n\n');
console.log(chalk.cyan(' ' + new Date().toLocaleString() + ' Build complete.'));
console.log(chalk.yellow(
' Tip: built files are meant to be served over an HTTP server.\n' +
' Opening index.html over file:// won\'t work.\n'
))
});
var chalk = require('chalk')
var semver = require('semver')
var packageConfig = require('../package.json')
function exec (cmd) {
return require('child_process').execSync(cmd).toString().trim()
}
var versionRequirements = [
{
name: 'node',
currentVersion: semver.clean(process.version),
versionRequirement: packageConfig.engines.node
},
{
name: 'npm',
currentVersion: exec('npm --version'),
versionRequirement: packageConfig.engines.npm
}
]
module.exports = function () {
var warnings = []
for (var i = 0; i < versionRequirements.length; i++) {
var mod = versionRequirements[i]
if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) {
warnings.push(mod.name + ': ' +
chalk.red(mod.currentVersion) + ' should be ' +
chalk.green(mod.versionRequirement)
)
}
}
if (warnings.length) {
console.log('')
console.log(chalk.yellow('To use this template, you must update following to modules:'))
console.log()
for (var i = 0; i < warnings.length; i++) {
var warning = warnings[i]
console.log(' ' + warning)
}
console.log()
process.exit(1)
}
}
/* eslint-disable */
require('eventsource-polyfill')
var hotClient = require('webpack-hot-middleware/client?noInfo=true&reload=true')
hotClient.subscribe(function (event) {
if (event.action === 'reload') {
window.location.reload()
}
})
require('./check-versions')()
var config = require('../config')
if (!process.env.NODE_ENV) {
process.env.NODE_ENV = JSON.parse(config.dev.env.NODE_ENV)
}
var opn = require('opn')
var path = require('path')
var express = require('express')
var webpack = require('webpack')
var proxyMiddleware = require('http-proxy-middleware')
var webpackConfig = require('./webpack.dev.conf')
// default port where dev server listens for incoming traffic
var port = process.env.PORT || config.dev.port
// automatically open browser, if not set will be false
var autoOpenBrowser = !!config.dev.autoOpenBrowser
// Define HTTP proxies to your custom API backend
// https://github.com/chimurai/http-proxy-middleware
var proxyTable = config.dev.proxyTable
var app = express()
var compiler = webpack(webpackConfig)
var devMiddleware = require('webpack-dev-middleware')(compiler, {
publicPath: webpackConfig.output.publicPath,
quiet: true
})
var hotMiddleware = require('webpack-hot-middleware')(compiler, {
log: () => {}
})
// force page reload when html-webpack-plugin template changes
compiler.plugin('compilation', function (compilation) {
compilation.plugin('html-webpack-plugin-after-emit', function (data, cb) {
hotMiddleware.publish({ action: 'reload' })
cb()
})
})
// proxy api requests
Object.keys(proxyTable).forEach(function (context) {
var options = proxyTable[context]
if (typeof options === 'string') {
options = { target: options }
}
app.use(proxyMiddleware(options.filter || context, options))
})
// handle fallback for HTML5 history API
app.use(require('connect-history-api-fallback')())
// serve webpack bundle output
app.use(devMiddleware)
// enable hot-reload and state-preserving
// compilation error display
app.use(hotMiddleware)
// serve pure static assets
var staticPath = path.posix.join(config.dev.assetsPublicPath, config.dev.assetsSubDirectory)
app.use(staticPath, express.static('./static'))
var uri = 'http://localhost:' + port + config.dev.assetsPublicPath;
devMiddleware.waitUntilValid(function () {
console.log('> Listening at ' + uri + '\n')
})
module.exports = app.listen(port, function (err) {
if (err) {
console.log(err)
return
}
// when env is testing, don't need open it
if (autoOpenBrowser && process.env.NODE_ENV !== 'testing') {
opn(uri)
}
})
var path = require('path')
var config = require('../config')
var ExtractTextPlugin = require('extract-text-webpack-plugin')
exports.assetsPath = function (_path) {
var assetsSubDirectory = process.env.NODE_ENV === 'production'
? config.build.assetsSubDirectory
: config.dev.assetsSubDirectory
return path.posix.join(assetsSubDirectory, _path)
}
exports.cssLoaders = function (options) {
options = options || {}
// generate loader string to be used with extract text plugin
function generateLoaders (loaders) {
var sourceLoader = loaders.map(function (loader) {
var extraParamChar
if (/\?/.test(loader)) {
loader = loader.replace(/\?/, '-loader?')
extraParamChar = '&'
} else {
loader = loader + '-loader'
extraParamChar = '?'
}
return loader + (options.sourceMap ? extraParamChar + 'sourceMap' : '')
}).join('!')
// Extract CSS when that option is specified
// (which is the case during production build)
if (options.extract) {
return ExtractTextPlugin.extract({
use: sourceLoader,
fallback: 'vue-style-loader'
})
} else {
return ['vue-style-loader', sourceLoader].join('!')
}
}
// http://vuejs.github.io/vue-loader/en/configurations/extract-css.html
return {
css: generateLoaders(['css']),
postcss: generateLoaders(['css']),
less: generateLoaders(['css', 'less']),
sass: generateLoaders(['css', 'sass?indentedSyntax']),
scss: generateLoaders(['css', 'sass']),
stylus: generateLoaders(['css', 'stylus']),
styl: generateLoaders(['css', 'stylus'])
}
}
// Generate loaders for standalone style files (outside of .vue)
exports.styleLoaders = function (options) {
var output = []
var loaders = exports.cssLoaders(options)
for (var extension in loaders) {
var loader = loaders[extension]
output.push({
test: new RegExp('\\.' + extension + '$'),
loader: loader
})
}
return output
}
此差异已折叠。
var utils = require('./utils')
var config = require('../config')
var isProduction = process.env.NODE_ENV === 'production'
module.exports = {
loaders: utils.cssLoaders({
sourceMap: isProduction
? config.build.productionSourceMap
: config.dev.cssSourceMap,
extract: isProduction
}),
postcss: [
require('autoprefixer')({
browsers: ['last 2 versions']
})
]
}
var path = require('path')
var utils = require('./utils')
var webpack = require('webpack')
var config = require('../config')
var vueLoaderConfig = require('./vue-loader.conf')
function resolve (dir) {
return path.join(__dirname, '..', dir)
}
module.exports = {
entry: {
app: ['babel-polyfill','./src/main.js']
},
output: {
path: config.build.assetsRoot,
filename: '[name].js',
publicPath: process.env.NODE_ENV === 'production'
? config.build.assetsPublicPath
: config.dev.assetsPublicPath
},
resolve: {
extensions: ['.js', '.vue', '.json'],
modules: [
resolve('src'),
resolve('node_modules')
],
alias: {
'vue$': 'vue/dist/vue.common.js',
'src': resolve('src'),
'assets': resolve('src/assets'),
'components': resolve('src/components')
}
},
module: {
rules: [
{
test: /\.vue$/,
loader: 'vue-loader'
},
{
test: /\.js$/,
loader: 'babel-loader',
include: [resolve('src'), resolve('test')]
},
{
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
loader: 'url-loader',
query: {
limit: 10000,
name: utils.assetsPath('img/[name].[hash:7].[ext]')
}
},
{
test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
loader: 'url-loader',
query: {
limit: 10000,
name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
}
}
]
},
// plugins: [
// new webpack.DllReferencePlugin({
// context: path.resolve(__dirname, '..'),
// manifest: require('./vendor-manifest.json')
// })
// ]
}
var utils = require('./utils')
var webpack = require('webpack')
var config = require('../config')
var merge = require('webpack-merge')
var baseWebpackConfig = require('./webpack.base.conf')
var HtmlWebpackPlugin = require('html-webpack-plugin')
var FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')
// add hot-reload related code to entry chunks
Object.keys(baseWebpackConfig.entry).forEach(function (name) {
baseWebpackConfig.entry[name] = ['./build/dev-client'].concat(baseWebpackConfig.entry[name])
})
module.exports = merge(baseWebpackConfig, {
module: {
rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap })
},
// cheap-module-eval-source-map is faster for development
devtool: '#cheap-module-eval-source-map',
plugins: [
new webpack.DefinePlugin({
'process.env': config.dev.env
}),
// https://github.com/glenjamin/webpack-hot-middleware#installation--usage
new webpack.HotModuleReplacementPlugin(),
new webpack.NoEmitOnErrorsPlugin(),
// https://github.com/ampedandwired/html-webpack-plugin
new HtmlWebpackPlugin({
filename: 'index.html',
template: 'index.html',
inject: true
}),
new FriendlyErrorsPlugin()
]
})
const path = require('path');
const webpack = require('webpack');
module.exports = {
entry: {
vendor: ['vue/dist/vue.common.js','vue-router', 'babel-polyfill','axios']
},
output: {
path: path.join(__dirname, '../static/js'),
filename: '[name].dll.js',
library: '[name]_library'
},
plugins: [
new webpack.DllPlugin({
path: path.join(__dirname, '.', '[name]-manifest.json'),
name: '[name]_library'
}),
new webpack.optimize.UglifyJsPlugin({
compress: {
warnings: false
}
}),
new webpack.DefinePlugin({
'process.env': {
NODE_ENV: '"production"'
}
})
]
};
\ No newline at end of file
var path = require('path')
var utils = require('./utils')
var webpack = require('webpack')
var config = require('../config')
var merge = require('webpack-merge')
var baseWebpackConfig = require('./webpack.base.conf')
var HtmlWebpackPlugin = require('html-webpack-plugin')
var ExtractTextPlugin = require('extract-text-webpack-plugin')
var env = config.build.env
var webpackConfig = merge(baseWebpackConfig, {
module: {
rules: utils.styleLoaders({
sourceMap: config.build.productionSourceMap,
extract: true
})
},
devtool: config.build.productionSourceMap ? '#source-map' : false,
output: {
path: config.build.assetsRoot,
filename: utils.assetsPath('js/[name].[chunkhash].js'),
chunkFilename: utils.assetsPath('js/[id].[chunkhash].js')
},
plugins: [
// http://vuejs.github.io/vue-loader/en/workflow/production.html
new webpack.DefinePlugin({
'process.env': env
}),
new webpack.optimize.UglifyJsPlugin({
compress: {
warnings: false
},
sourceMap: true
}),
// extract css into its own file
new ExtractTextPlugin({
filename: utils.assetsPath('css/[name].[contenthash].css')
}),
// generate dist index.html with correct asset hash for caching.
// you can customize output by editing /index.html
// see https://github.com/ampedandwired/html-webpack-plugin
new HtmlWebpackPlugin({
filename: config.build.index,
template: 'index.html',
inject: true,
minify: {
removeComments: true,
collapseWhitespace: true,
removeAttributeQuotes: false
// more options:
// https://github.com/kangax/html-minifier#options-quick-reference
},
// necessary to consistently work with multiple chunks via CommonsChunkPlugin
chunksSortMode: 'dependency'
}),
// split vendor js into its own file
new webpack.optimize.CommonsChunkPlugin({
name: 'vendor',
minChunks: function (module, count) {
// any required modules inside node_modules are extracted to vendor
return (
module.resource &&
/\.js$/.test(module.resource) &&
module.resource.indexOf(
path.join(__dirname, '../node_modules')
) === 0
)
}
}),
// extract webpack runtime and module manifest to its own file in order to
// prevent vendor hash from being updated whenever app bundle is updated
new webpack.optimize.CommonsChunkPlugin({
name: 'manifest',
chunks: ['vendor']
})
]
})
if (config.build.productionGzip) {
var CompressionWebpackPlugin = require('compression-webpack-plugin')
webpackConfig.plugins.push(
new CompressionWebpackPlugin({
asset: '[path].gz[query]',
algorithm: 'gzip',
test: new RegExp(
'\\.(' +
config.build.productionGzipExtensions.join('|') +
')$'
),
threshold: 10240,
minRatio: 0.8
})
)
}
if (config.build.bundleAnalyzerReport) {
var BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
webpackConfig.plugins.push(new BundleAnalyzerPlugin())
}
module.exports = webpackConfig
var merge = require('webpack-merge')
var prodEnv = require('./prod.env')
module.exports = merge(prodEnv, {
NODE_ENV: '"development"'
})
// see http://vuejs-templates.github.io/webpack for documentation.
var path = require('path')
module.exports = {
build: {
env: require('./prod.env'),
index: path.resolve(__dirname, '../dist/index.html'),
assetsRoot: path.resolve(__dirname, '../dist'),
assetsSubDirectory: 'static',
assetsPublicPath: '/meddic/',
productionSourceMap: false,
// Gzip off by default as many popular static hosts such as
// Surge or Netlify already gzip all static assets for you.
// Before setting to `true`, make sure to:
// npm install --save-dev compression-webpack-plugin
productionGzip: false,
productionGzipExtensions: ['js', 'css'],
// Run the build command with an extra argument to
// View the bundle analyzer report after build finishes:
// `npm run build --report`
// Set to `true` or `false` to always turn it on or off
bundleAnalyzerReport: process.env.npm_config_report
},
dev: {
env: require('./dev.env'),
port: 8100,
autoOpenBrowser: true,
assetsSubDirectory: 'static',
assetsPublicPath: '/',
proxyTable: {
'/api':{
target:'http://localhost:8099',
changeOrigin:true,
pathRewrite:{
'/api':''
}
},
'/ms':{
target: 'http://localhost:8099',
changeOrigin: true
},
'/contents':{
target: 'http://localhost:8101',
changeOrigin: true,
pathRewrite:{
'/contents':''
},
secure: false
}
},
proxypath: 'http://localhost:8101',
// CSS Sourcemaps off by default because relative paths are "buggy"
// with this option, according to the CSS-Loader README
// (https://github.com/webpack/css-loader#sourcemaps)
// In our experience, they generally work as expected,
// just be aware of this issue when enabling this option.
// CSS Sourcemaps off by default because relative paths are "buggy"
// with this option, according to the CSS-Loader README
// (https://github.com/webpack/css-loader#sourcemaps)
// In our experience, they generally work as expected,
// just be aware of this issue when enabling this option.
cssSourceMap: false
}
}
module.exports = {
NODE_ENV: '"production"'
}
'use strict'
const merge = require('webpack-merge')
const devEnv = require('./dev.env')
module.exports = merge(devEnv, {
NODE_ENV: '"testing"'
})
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>敏感数据查看系统</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta content="width=device-width, initial-scale=1.0" name="viewport"/>
<meta content="" name="description"/>
<meta content="" name="author"/>
<link rel="shortcut icon" href="./static/img/index_logoicon.png">
</head>
<body>
<div id="app"></div>
<script src="https://pv.sohu.com/cityjson?ie=utf-8"></script>
<!--oss upload start-->
<script src="https://gosspublic.alicdn.com/aliyun-oss-sdk-5.1.1.min.js"></script>
<script src="https://unpkg.com/qiniu-js@2.2.0/dist/qiniu.min.js"></script>
<!--oss upload end-->
</body>
</html>
此差异已折叠。
{
"name": "manage-system",
"version": "2.1.0",
"description": "基于Vue.js 2.x系列 + element-ui 内容管理系统解决方案",
"author": "lin-xin <2981207131@qq.com>",
"private": true,
"scripts": {
"dev": "node build/dev-server.js",
"build": "node build/build.js",
"build:dll": "webpack --config build/webpack.dll.conf.js"
},
"dependencies": {
"axios": "^0.18.0",
"babel-polyfill": "^6.23.0",
"element-ui": "^2.7.2",
"vue": "^2.3.2",
"vue-core-image-upload": "2.1.11",
"vue-datasource": "1.0.9",
"vue-quill-editor": "2.1.6",
"vue-router": "^2.3.1",
"vue-schart": "^0.1.2",
"vue-simplemde": "0.3.8",
"vue-table-with-tree-grid": "^0.2.4",
"vue-xlsx-table": "^1.2.8",
"vuedraggable": "^2.16.0",
"vuex": "^3.0.1"
},
"devDependencies": {
"autoprefixer": "^6.7.2",
"babel-core": "^6.22.1",
"babel-loader": "^6.2.10",
"babel-plugin-transform-runtime": "^6.22.0",
"babel-preset-es2015": "^6.22.0",
"babel-preset-stage-2": "^6.22.0",
"babel-register": "^6.22.0",
"chalk": "^1.1.3",
"connect-history-api-fallback": "^1.3.0",
"css-loader": "^0.28.11",
"eventsource-polyfill": "^0.9.6",
"express": "^4.14.1",
"extract-text-webpack-plugin": "^2.0.0",
"file-loader": "^0.11.1",
"friendly-errors-webpack-plugin": "^1.1.3",
"function-bind": "^1.1.0",
"html-webpack-plugin": "^2.28.0",
"http-proxy-middleware": "^0.17.3",
"less": "^3.9.0",
"less-loader": "^5.0.0",
"opn": "^4.0.2",
"ora": "^1.2.0",
"semver": "^5.3.0",
"shelljs": "^0.7.6",
"style-loader": "^0.23.1",
"url-loader": "^0.5.8",
"vue-loader": "^11.3.4",
"vue-style-loader": "^2.0.5",
"vue-template-compiler": "^2.2.6",
"webpack": "^2.3.3",
"webpack-bundle-analyzer": "^2.2.1",
"webpack-dev-middleware": "^1.10.0",
"webpack-hot-middleware": "^2.18.0",
"webpack-merge": "^4.1.0"
},
"engines": {
"node": ">= 4.0.0",
"npm": ">= 3.0.0"
},
"browserslist": [
"> 1%",
"last 2 versions",
"not ie <= 8"
]
}
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.picahealth</groupId>
<artifactId>ADMIN_CMS_FE</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>ADMIN_CMS_FE Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>ADMIN_CMS_FE</finalName>
</build>
</project>
<template>
<div id="app">
<router-view></router-view>
</div>
</template>
<style>
@import "../static/css/main.css";
@import "../static/css/color-dark.css"; /*深色主题*/
/*@import "../static/css/theme-green/color-green.css"; 浅绿色主题*/
@import "../src/css/common.css"; /*公用css*/
</style>
import fetch from '../common/fetch'
import Vue from 'vue';
const menu = {
headList(data,self){
// return fetch(localStorage.getItem("msUrl")+'login/header', data, 'POST','fetch')
// return Vue.$axios.post(localStorage.getItem("msUrl")+'login/header',data)
let headers = {
headers: {
'token': localStorage.getItem('token') || null
// header('Access-Control-Allow-Origin:*')
}
};
return self.$axios.post(localStorage.getItem("msUrl")+'login/header', data, headers)
},
/* menuList(data,self){
return self.$axios.post(localStorage.getItem("msUrl") + 'login/menu/list', data, headers)
},*/
forwardPage(data,self){
// return fetch(localStorage.getItem("msUrl")+'login/forward_page', data, 'POST','fetch')
let headers = {
headers: {
'token': localStorage.getItem('token') || null
// header('Access-Control-Allow-Origin:*')
}
};
return self.$axios.post(localStorage.getItem("msUrl")+'login/forward_page', data, headers)
},
removeToken(data,self){
let headers = {
headers: {
'token': localStorage.getItem('token') || null
// header('Access-Control-Allow-Origin:*')
}
};
return self.$axios.post(localStorage.getItem("msUrl")+'login/log_out', data, headers)
}
}
export default menu
import fetch from '../common/fetch'
let headers = {
headers: {
'token': localStorage.getItem('token') || null
}
};
const resource = {
resourceList(data,self){
// return fetch(localStorage.getItem("msUrl")+'admin/resources/list', data, 'POST','fetch')
return self.$axios.post(localStorage.getItem("msUrl")+'admin/resources/list', data, headers)
},
delResource(id,data,self){
// return fetch(localStorage.getItem("msUrl")+`admin/resources/${id}`, data, 'delete','fetch')
return self.$axios.delete(localStorage.getItem("msUrl")+`admin/resources/${id}`, data)
},
saveResource(data,self){
return self.$axios.post(localStorage.getItem("msUrl")+`admin/resources/upload`, data, headers)
},
savePersistent(data,self){
return self.$axios.post(localStorage.getItem("msUrl")+`admin/qiniu/persistent`, data, headers)
},
checkFileName(data,self){
return self.$axios.post(localStorage.getItem("msUrl")+`admin/resources/filecheck`, data, headers)
},
updateName(data,self){
return self.$axios.post(localStorage.getItem("msUrl")+`admin/resources/updateName`, data, headers)
},
queryList(data,self){
return self.$axios.post(localStorage.getItem("msUrl")+`admin/roster/queryList`, data, headers)
},
selectUser(data,self){
return self.$axios.get(localStorage.getItem("msUrl")+`admin/roster/selectUser`, data, headers)
},
selectRosterById(data,self){
return self.$axios.get(localStorage.getItem("msUrl")+`admin/roster/selectRosterById?id=${data.id}`, data, headers)
},
insertOrUpdate(data,self){
return self.$axios.post(localStorage.getItem("msUrl")+`admin/roster/insertOrUpdate`, data, headers)
},
upperOrLowerShip(data,self){
return self.$axios.get(localStorage.getItem("msUrl")+`admin/roster/upperOrLowerShip?id=${data.id}&status=${data.status}`, data, headers)
},
clearData(data,self){
return self.$axios.get(localStorage.getItem("msUrl")+`admin/roster/clearData?id=${data.id}`, data, headers)
},
}
export default resource
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1558579521535" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1131" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M512 1255.489906" p-id="1132" fill="#8a8a8a"></path><path d="M718.519288 688.227064 543.827304 513.637418l174.180292-174.180292c8.801119-8.801119 8.801119-23.128523 0-31.827304-8.801119-8.801119-23.128523-8.801119-31.827304 0L512 481.810114 337.819708 307.629822c-8.801119-8.801119-23.230861-8.596442-31.929642 0.102339l0.102339-0.102339c-8.801119 8.801119-8.698781 23.026184 0.102339 31.827304l174.180292 174.180292L305.58305 688.227064c-8.801119 8.801119-8.801119 23.128523 0 31.827304 8.801119 8.801119 23.128523 8.801119 31.827304 0L512 545.464721 686.691985 720.054367c8.801119 8.801119 22.923846 8.903458 31.724965 0.102339l0.102339-0.102339C727.218069 711.355587 727.218069 697.028183 718.519288 688.227064z" p-id="1133" fill="#8a8a8a"></path></svg>
\ No newline at end of file
/**
* 微服务返回code定义
* */
const getResponseEnum = () => {
const respMessage = new Map();
respMessage.set("000000", "成功");
respMessage.set("100001", "参数无效");
respMessage.set("100002", "参数为空");
respMessage.set("100003", "参数类型错误");
respMessage.set("100004", "参数缺失");
respMessage.set("200001", "短信发送失败");
respMessage.set("200002", "微信推送失败");
respMessage.set("200003", "APP推送失败");
respMessage.set("200004", "医生信息不存在");
respMessage.set("200005", "定时时间已过!");
respMessage.set("200006", "请先登录");
respMessage.set("200007", "模板编码错误!");
respMessage.set("300000", "token为空!");
respMessage.set("300001", "系统繁忙,请稍后重试");
respMessage.set("300002", "系统错误");
respMessage.set("400001", "数据未找到");
respMessage.set("400002", "数据有误");
respMessage.set("400003", "数据已经存在");
respMessage.set("400004", "数据异常");
respMessage.set("500001", "接口调用异常");
respMessage.set("500002", "接口禁止访问");
respMessage.set("500003", "接口地址无效");
respMessage.set("500004", "接口请求超时");
respMessage.set("600001", "访问权限不足");
respMessage.set("201550", "登录失效,请重新登录!");
respMessage.set("201551", "该资源已被关联使用,无法删除");
return respMessage;
};
export const ResponseEnum = getResponseEnum();
export const RECOMMEND_IMG_UPLOAD_WIDTH = 690;
export const MEDICINE_IMG_UPLOAD_WIDTH = 600;
export const MEDICINE_IMG_UPLOAD_HEIGHT = 138;
import {isNotEmptyUtils} from "./utils";
import Vue from 'vue';
/**
* 配置编译环境和线上环境之间的切换
*/
const getTestEnv = (ipAddress) => {
let environments = ["uat", "test3", "test2", "test1", "dev"];
for (let i = 0; i < environments.length; i++) {
if (ipAddress.indexOf(environments[i]) > -1) {
return environments[i];
}
}
return null;
};
//获取服务器路径
export const getAddress = () => {
let ipAddress = "https://" + window.location.host;
// let ipAddress = "http://localhost:8099";
let env = getTestEnv(ipAddress);
let preViewUrl = ""
let qiniuImgUrl = "";
let qiniuFileUrl = '';
let resource_url = "";
let exam_url = "";
let locationHost = "";//模板文件路径
let stsUrl = "";//sts服务器//获取OSS客户端
let bucketName = "";
let endpoint = "";
let Url = "";//访问后台的域名
let msUrl = "";//Micro service url
let liveUrl = "";//Micro service url
let lectureUrl = '';
let ossLogin = "";//内部系统登录页面
let template_url = "";//题库模板服务器
let kfUrl="";//暂时代替微服务,提供 市区县医院 常量 部门 职称 的服务
let qiniuUrl = "";//qiniu验证服务器
let qiniuResourceUrl = "";//qiniu存储域名
//本地
if (ipAddress.indexOf("localhost") > -1 || ipAddress.indexOf("127.0.0.1") > -1 || ipAddress.indexOf("test-kf") > -1) {
ipAddress = "http://localhost:7070";
preViewUrl = "http://localhost:9090/#/template";
qiniuImgUrl = "https://test1-file.yunqueyi.com";
resource_url = "https://test-file.yunqueyi.com";
exam_url = "https://test1-sc.yunqueyi.com/exams";
locationHost = "http://test-kf.yunqueyi.com";
stsUrl = "http://dev-api.yunqueyi.com/middle/oss/token";//sts服务器
bucketName = "pica-test-huabei2";
endpoint = "oss-cn-beijing.aliyuncs.com";
Url = ipAddress + "/ADMIN_CMS_FE/rest/";
//msUrl = "http://10.177.15.117:10201" + "/contents/";
// msUrl = "http://10.177.15.154:10203" + "/contents/";
msUrl = "http://dev-sc.yunqueyi.com" + "/contents/";
lectureUrl = "https://dev-sc.yunqueyi.com"
liveUrl = "https://dev-sc.yunqueyi.com/campaign/";
kfUrl = "http://test1-kf.yunqueyi.com" + "/api/";
ossLogin = "http://localhost:8090/PICA_SSO_FE/html/pica_login.html";
template_url = ipAddress
// qiniuUrl = "http://10.177.15.154:10203/contents/admin/qiniu/token"; //不再使用middle服务获取七牛token
qiniuUrl = "https://dev-sc.yunqueyi.com/contents/admin/qiniu/token";
// qiniuFileUrl = "http://10.177.15.154:10203/contents/admin/qiniu/token1";
qiniuFileUrl = "http://dev-sc.yunqueyi.com/contents/admin/qiniu/token1";
qiniuResourceUrl = "https://test1-videos.yunqueyi.com";
} else if (isNotEmptyUtils(env)) {//测试test1 test2 uat
preViewUrl = "https://" + env + "-phome.yunqueyi.com" + "/template/#/template"
qiniuFileUrl = "https://" + env + "-sc.yunqueyi.com" + "/contents/admin/qiniu/token1";
qiniuImgUrl = "https://test1-file.yunqueyi.com";
resource_url = "https://test-file.yunqueyi.com";
locationHost = "https://" + env + "-admin-md.yunqueyi.com";
exam_url = "https://" + env + "-sc.yunqueyi.com/exams";
stsUrl = "https://" + env + "-api.yunqueyi.com/middle/oss/token";//sts服务器
bucketName = "pica-test-huabei2";
endpoint = "oss-cn-beijing.aliyuncs.com";
Url = ipAddress + "/api/";
kfUrl = "https://" + env + "-kf.yunqueyi.com" + "/api/";
msUrl = "https://" + env + "-sc.yunqueyi.com" + "/contents/";
liveUrl = "https://" + env + "-sc.yunqueyi.com" + "/campaign/";
lectureUrl = "https://" + env + "-sc.yunqueyi.com"
ossLogin = "https://" + env + ".yunqueyi.com";
template_url = "https://" + env + "-project.yunqueyi.com";
qiniuUrl = "https://" + env + "-sc.yunqueyi.com" + "/contents/admin/qiniu/token";
qiniuResourceUrl = "https://test1-videos.yunqueyi.com";
/*
* uat做特殊处理(图片等文件)
* uat图片使用生产的,因为DB数据从生产同步下来的,web,app端使用的都是生产的图片路径
* 所以admin上传也上传到生产
* */
if (env === "uat") {
// qiniuImgUrl = "https://files.yunqueyi.com";//qiniu存储域名
resource_url = "https://file.yunqueyi.com";
bucketName = "pica-pro";
endpoint = "oss-cn-shanghai.aliyuncs.com";
// qiniuResourceUrl = "https://video.yunqueyi.com";//qiniu存储域名
exam_url = "https://" + env + "-sc.yunqueyi.com/exams";
lectureUrl = "https://" + env + "-sc.yunqueyi.com"
}
} else {//生产环境
preViewUrl = "https://phome.yunqueyi.com" + "/template/#/template"
qiniuFileUrl = "https://sc.yunqueyi.com" + "/contents/admin/qiniu/token1";
qiniuImgUrl = "https://files.yunqueyi.com";//qiniu存储域名
resource_url = "https://file.yunqueyi.com";
locationHost = ipAddress;
stsUrl = "https://api.yunqueyi.com/middle/oss/token";//sts服务器
bucketName = "pica-pro";
endpoint = "oss-cn-shanghai.aliyuncs.com";
Url = ipAddress + "/api/";
msUrl = "https://sc.yunqueyi.com" + "/contents/";
liveUrl = "https://sc.yunqueyi.com" + "/campaign/";
lectureUrl = "https://sc.yunqueyi.com"
kfUrl = "https://kf.yunqueyi.com" + "/api/";
ossLogin = "https://sso.yunqueyi.com";
template_url = "https://project.yunqueyi.com";
qiniuUrl = "https://sc.yunqueyi.com" + "/contents/admin/qiniu/token";
qiniuResourceUrl = "https://video.yunqueyi.com";//qiniu存储域名
exam_url = "https://sc.yunqueyi.com/exams";
}
localStorage.setItem("preViewUrl",preViewUrl);
localStorage.setItem("qiniuFileUrl", qiniuFileUrl);
localStorage.setItem("qiniuImgUrl", qiniuImgUrl);
localStorage.setItem("resource_url", resource_url);
localStorage.setItem("locationHost", locationHost);
localStorage.setItem("Url", Url);
localStorage.setItem("msUrl", msUrl);
localStorage.setItem("liveUrl", liveUrl);
localStorage.setItem("lectureUrl", lectureUrl);
localStorage.setItem("kfUrl", kfUrl);
localStorage.setItem("examUrl", exam_url);
localStorage.setItem("stsUrl", stsUrl);//sts服务器
localStorage.setItem("bucketName", bucketName);//oss
localStorage.setItem("endpoint", endpoint);//oss
localStorage.setItem("ossLogin", ossLogin);//内部系统登录页面
localStorage.setItem("template_url", template_url);
localStorage.setItem("qiniuUrl", qiniuUrl);//qiniu验证服务器
localStorage.setItem("qiniuResourceUrl", qiniuResourceUrl);//qiniu存储域名
localStorage.setItem("sysCode", '3');//admin_cms系统编号
localStorage.setItem("deviceInfo", "{\"app_channel\":\"\",\"app_mac\":\"\",\"app_uuid\":\"\",\"app_version\":\"\",\"device_brand\":\"\",\"device_ip\":\"\",\"device_model\":\"\",\"device_net\":\"\",\"device_ops\":\"\",\"resolution_wh\":\"\",\"system_level\":\"\"}");//deviceInfo
};
export const loadCommonFilter = () => {
/**
* 常量过滤器
* @name constantFilter
* @description:用于将[no:枚举值]转换成[value:枚举名称]
* @param {Number} [input] 要过滤的对象
* @param {Array} [enumList] 常量列表
*/
Vue.filter('constantFilter', function (input, enumList) {
let hash = {};
if (enumList != null && enumList.length > 0) {
for (let i = 0; i < enumList.length; i++) {
hash[enumList[i].no] = enumList[i].value;
}
}
if (!input) {
return '';
} else {
return hash[input];
}
});
};
//api路径
import {isNotEmptyUtils} from "./utils";
export default async(url = '', data = {}, type = 'POST', method = 'fetch',server='CONTENT') => {
type = type.toUpperCase();
// url = (server==='WECHAT'?wechatUrl:baseUrl) + url;
if (url.match("^http") == null){
url = localStorage.getItem("Url") + url;
}
console.log("完整url:",url)
if (type == 'GET' && data) {
let dataStr = ''; //数据拼接字符串
Object.keys(data).forEach(key => {
dataStr += key + '=' + data[key] + '&';
})
if (dataStr !== '') {
dataStr = dataStr.substr(0, dataStr.lastIndexOf('&'));
url = url + '?' + dataStr;
// url = encodeURI(url + '?' + dataStr, true);
}
}
if (window.fetch && method == 'fetch') {
let requestConfig = {
credentials: 'include',
method: type,
// mode: "cors",
headers: {
// 'Access-Control-Allow-Origin': '*',
'Accept': '*',
'Content-Type': 'application/json',
// 'token': localStorage.getItem('token') || null, //固定传header:
// 'system_code': 'todo' //固定传header:系统编号
},
}
if (type == 'POST' || type === 'PUT' || type === 'PATCH' || type === 'DELETE' && data) {
Object.defineProperty(requestConfig, 'body', {
value: JSON.stringify(data)
})
}
try {
const response = await fetch(url, requestConfig);
const responseJson = await response.json();
return responseJson
} catch (error) {
throw new Error(error)
}
} else {
return new Promise((resolve, reject) => {
let requestObj;
if (window.XMLHttpRequest) {
requestObj = new XMLHttpRequest();
} else {
requestObj = new ActiveXObject;
}
let sendData = '';
if (type == 'POST' || type == 'DELETE' || type == 'PUT') {
sendData = JSON.stringify(data);
}
requestObj.open(type, url, true);
requestObj.setRequestHeader("Content-Type", "application/json");
requestObj.send(sendData);
requestObj.onreadystatechange = () => {
if (requestObj.readyState == 4) {
if (requestObj.status == 200) {
let obj = requestObj.response
if (typeof obj !== 'object' && isNotEmptyUtils(obj)) {
obj = JSON.parse(obj);
}
resolve(obj)
} else {
reject(requestObj)
}
}
}
})
}
}
//api路径
import {isNotEmptyUtils} from "./utils";
export default async(url = '', data = {}, type = 'POST', method = 'fetch',server='CONTENT') => {
type = type.toUpperCase();
// url = (server==='WECHAT'?wechatUrl:baseUrl) + url;
if (url.match("^http") == null){
url = localStorage.getItem("Url") + url;
}
console.log("完整url:",url)
if (type == 'GET' && data) {
let dataStr = ''; //数据拼接字符串
Object.keys(data).forEach(key => {
dataStr += key + '=' + data[key] + '&';
})
if (dataStr !== '') {
dataStr = dataStr.substr(0, dataStr.lastIndexOf('&'));
url = url + '?' + dataStr;
// url = encodeURI(url + '?' + dataStr, true);
}
}
if (window.fetch && method == 'fetch') {
let requestConfig = {
credentials: 'include',
method: type,
// mode: "cors",
headers: {
// 'Access-Control-Allow-Origin': '*',
'Accept': '*',
'Content-Type': 'application/json',
'sysCode':'2'
// 'token': localStorage.getItem('token') || null, //固定传header:
// 'system_code': 'todo' //固定传header:系统编号
},
}
if (type == 'POST' || type === 'PUT' || type === 'PATCH' || type === 'DELETE' && data) {
Object.defineProperty(requestConfig, 'body', {
value: JSON.stringify(data)
})
}
try {
const response = await fetch(url, requestConfig);
const responseJson = await response.json();
return responseJson
} catch (error) {
throw new Error(error)
}
} else {
return new Promise((resolve, reject) => {
let requestObj;
if (window.XMLHttpRequest) {
requestObj = new XMLHttpRequest();
} else {
requestObj = new ActiveXObject;
}
let sendData = '';
if (type == 'POST' || type == 'DELETE' || type == 'PUT') {
sendData = JSON.stringify(data);
}
requestObj.open(type, url, true);
requestObj.setRequestHeader("Content-Type", "application/json");
requestObj.send(sendData);
requestObj.onreadystatechange = () => {
if (requestObj.readyState == 4) {
if (requestObj.status == 200) {
let obj = requestObj.response
if (typeof obj !== 'object' && isNotEmptyUtils(obj)) {
obj = JSON.parse(obj);
}
resolve(obj)
} else {
reject(requestObj)
}
}
}
})
}
}
const vueFilter = {
// 直播
liveDateFilter: (value) => {
if (!value) return '';
return new Date(value).format("yyyy-MM-dd hh:mm:ss");
},
liveFilter: (value) => {
if(value.liveStatus == 1){
return '未开始'
} else if(value.liveStatus == 5) {
return '直播中'
}else if(value.liveStatus == 10 && value.lookBackStatus == 2){
return '已结束(不可回看)'
}else if(value.liveStatus == 10 && value.lookBackStatus == 1) {
return '已结束(可回看)'
}
},
liveStatusFilter: (value) => {
if(value == 1) return "隐藏"
else return "发布"
},
liveTeacherType: (value) => {
let doctorName = []
if(value.length > 3) {
for(let i = 0; i < 3; i++) {
doctorName.push(value[i].doctorName)
}
return doctorName.join("、") + '...'
}else{
for(let i = 0; i < value.length; i++) {
doctorName.push(value[i].doctorName)
}
return doctorName.join("、")
}
},
// 积木
controlType: (value) => {
if(value == 1) {
return '分页1'
}else if(value == 2) {
return '分页2'
}else if(value == 3) {
return '图片1'
}else if(value == 4) {
return '图片2'
}else if(value == 6) {
return '视频'
}else if(value == 7) {
return '讨论'
}else if(value == 8) {
return '资格校验'
}else if(value == 11) {
return '活动模板'
}
},
tabControlType: (value) => {
if(value == 3) {
return '图片1'
}else if(value == 4) {
return '图片2'
}else if(value == 6) {
return '视频'
}else if(value == 7) {
return '讨论'
}else if(value == 8) {
return '资格校验'
}else if(value == 11) {
return '活动模板'
}
},
refreshType: (value) => {
if(value == 1) return "支持"
else return "不支持"
},
moudleType: (value) => {
if(value == 1) return "未激活"
else return "激活"
},
dateFilter: (value) => {
if (!value) return '';
return new Date(value).format("yyyy-MM-dd hh:mm");
},
templateFilter: (value) => {
if(value == 1) return '任务';
},
continueTimeFilter: (value) => {
if(value.endTime) {
return value.beginTimeStr + '-' + value.endTimeStr;
}else {
return value.beginTimeStr;
}
},
taskActivityStatus: (value) => {
if(value.isDisabled == 2) {
return '禁用'
}else {
if(value.status == 1) {
return '进行中';
}else {
return '未进行';
}
}
},
// 栏位
appColumnStatusFilter: (value) => {
if(value == 1) return "未提交"
else if(value == 4) return "已提交"
},
appContentStatusFilter: (value) => {
if(value == 1) return "未提交"
else if(value == 2) return "已提交"
},
statusFilter: (value) => {
if(value == 1) return "已创建"
else if(value == 5) return "已发布"
else return "已下架"
},
linkTypeFilter: (value) => { // 跳转类型
if(value == 1) return '链接'
else if(value == 4) return '模块'
else return '无跳转'
},
teacherStatusFilter: (value) => {
if(value == 1) return "已下架"
else return "已发布"
},
moduleTypeFilter: (value,data) => { // 模块类型
for(let key in data) {
if(value == key) {
return data[key]
}
}
},
contentCreatedType: (value,data) => {
let userName = ''
for(let i=0; i < data.length;i++) {
if(value == data[i].id) {
userName = data[i].name
break
}else {
userName = ''
}
}
return userName
},
contentModifiedType: (value,data) => {
let userName = ''
for(let i=0; i < data.length;i++) {
if(value == data[i].id) {
userName = data[i].name
break
}else {
userName = ''
}
}
return userName
},
columnPageType: (value,data) => { // 页面类型
for(let key in data) {
if(value == key) {
return data[key]
}
}
},
columnPositionType: (value,data) => { // 位置
for(let key in data) {
if(value == key) {
return data[key]
}
}
},
columnCreatedType: (value,data) => { // 创建人
// let _index = data.findIndex((_value,index,arr) => {
// return value == _value.id
// })
// return data[_index].name
let userName = ''
for(let i=0; i < data.length;i++) {
if(value == data[i].id) {
userName = data[i].name
break
}else {
userName = ''
}
}
return userName
},
columnSubmitedType: (value,data) => { // 提交人
// let _index = data.findIndex((_value,index,arr) => {
// return value == _value.id
// })
// return data[_index].name
let userName = ''
for(let i=0; i < data.length;i++) {
if(value == data[i].id) {
userName = data[i].name
break
}else {
userName = ''
}
}
return userName
},
liveIdFilter: (value,data) => { // 直播名称
let _index = data.findIndex((_value,index,arr) => {
return value == _value.id
})
return data[_index].name
},
managerFilter: (value) => {
if(value == 1) {
return '普通用户'
}else if(value == 2) {
return '讲师本人'
}else if(value == 3) {
return '管理员'
}else {
return '白名单'
}
},
sortStatuFilter: (value) => {
if(value == true) return '已发布'
else return '未发布'
},
courseTypeFilter: (value) => {
if(value == 1) {
return '入门'
} else if(value == 2) {
return '中级'
} else if(value == 3) {
return '高级'
}
},
nameManageStatus: (value) => {
if(value == 1) {
return '未发布';
}else {
return '已发布'
}
},
dateFormat: (value) => {
if (!value) return '';
return new Date(value).format("yyyy-MM-dd hh:mm:ss");
},
getVersion: (value) => {
let version = value.appVersion;
if(value.range == 1) {
version += '及以上'
} else if(value.range == 2) {
version += '及以下'
}
return version
},
}
export default vueFilter
\ No newline at end of file
import { isEmptyUtils, openLoading, closeLoading } from './utils'
import { doUpload, getFilePath } from "./qiniuUtil"
/**
* 活动模板公共上传图片及其尺寸限制
* @param {*} file
* @param {*} vm
* @param {*} pageWidth
*/
export function commonUploadImg(file,vm,pageWidth) {
return new Promise(function (resolve, reject) {
let isLtSize = ''
if( file.type === 'image/gif') {
isLtSize = file.size / 1024 < 300
}else if( file.type === 'image/jpeg' || file.type === 'image/png'){
isLtSize = file.size / 1024 < 100
}
if(!isLtSize) {
vm.$message.error('上传图片过大')
return;
}
let imgWidth = parseInt(parseInt(pageWidth)/(vm.editTabOrImgForm.length))
var _img = new FileReader()
_img.readAsDataURL(file)
_img.onload = function(theFile) {
let image = new Image()
image.src = theFile.target.result
image.onload = function() {
let _this = this
if(_this.width != imgWidth) {
vm.$message.info('上传图片宽度不合适,请重新上传')
}else {
vm.$message.info('开始上传');
openLoading(vm)
doUpload(vm,file, getFilePath(file,null), 'preview4', 'progress1', 1).then(function (path) {
closeLoading(vm)
resolve(path)
});
}
}
}
})
}
/**
* 栏位上传图片
* @param {*} file
* @param {*} vm
*/
export function columnCommonUploadImg(file,vm) {
if (isEmptyUtils(file)) {
return;
}
const isJPG = file.type === 'image/jpeg'
const isPNG = file.type === 'image/png'
const isGIF = file.type === 'image/gif'
const isLt100kb = file.size / 1024 < 100
if (!isLt100kb) {
vm.$message.error('上传图片大小不能超过 100kb')
return;
}
if (!isJPG && !isPNG && !isGIF) {
vm.$message.error('上传头像图片只能是 JPG、png、gif格式!')
return;
}
for(let i = 0;i < vm.tabContent.length; i++) {
if(vm.imgIndex == i) {
vm.imgWidth = vm.tabContent[i].contentResourceField.width
vm.imgHeight = vm.tabContent[i].contentResourceField.height
var _img = new FileReader()
_img.readAsDataURL(file)
_img.onload = function(theFile) {
let image = new Image()
image.src = theFile.target.result
image.onload = function() {
let _this = this
if(_this.width != vm.imgWidth || _this.height != vm.imgHeight) {
vm.$message.info("上传图片尺寸大小不合适,请重新上传")
}else {
vm.doUpload(file) //上传图片
}
}
}
break
}
}
}
// 字符长度的校验
export function getStrCodeNum(str) {
if(!/^[\u0391-\uFFE5A-Za-z]+$/.test(str)) {
return false
}
let num = 0
for(let i=0;i<str.length;i++) {
if(str.charCodeAt(i) >= 1000) {
num = num + 2
}else{
num = num + 1
}
}
if( num > 30) {
return false
}
return true
}
\ No newline at end of file
此差异已折叠。
import fetch from './fetch.js';
export const positionService = {
isDirectProvince(province_id){
return province_id == 110 || province_id == 120 || province_id == 310 || province_id == 500;
},
townButtonDisable(province_id){
if(this.isDirectProvince(province_id)) {
return true;
}else {
return false;
}
},
//获取省分
getProvinceList() {
let num = {token: localStorage.getItem("token")};
let promise = fetch(localStorage.getItem("kfUrl") + "PICAPositionServiceImpl/getProvinceList",
num,
'POST'
);
return promise;
},
//获取省分(区域权限)
getProvinceByRegionRole(){
let promise = new Promise(function(resolve, reject) {
var num = {token: localStorage.getItem("token")};
let ret = fetch(localStorage.getItem("kfUrl") + 'PICAPositionServiceImpl/getProvinceList', num);
ret.then(function (data) {
let provinceListTemp = Object.assign({},data.provinceList);
let provinceListData = new Array();
//有区域权限时
if (region_role != null && region_role != "") {
var regionRoles = region_role.split(',');
for (var j = 0; j < regionRoles.length; j++) {
for (var i = 0; i < provinceListTemp.length; i++) {
if (regionRoles[j] == provinceListTemp[i].province_id) {
provinceListData.push(provinceListTemp[i]);
break;
}
}
}
} else {
//没有限制时,放入全部
provinceListData = provinceListTemp;
}
resolve(provinceListData);
},function (fail) {
reject();
})
});
return promise;
},
// 获取市
getCityListData (province_id,success, error, otherOptions) {
var num = {
province_id : province_id
}
let promise = fetch(localStorage.getItem("kfUrl") + "PICAPositionServiceImpl/getCityList", num);
return promise;
},
getCountyListData(city_id,success, error, otherOptions) {
var num = {
city_id : city_id
}
let promise = fetch(localStorage.getItem("kfUrl") + "PICAPositionServiceImpl/getCountyList", num);
return promise;
},
//获取乡镇
getTownListData(county_id,success) {
var num = {
county_id : county_id
}
let promise = fetch(localStorage.getItem("kfUrl") + "PICAPositionServiceImpl/getTownList", num);
return promise;
},
// 获取医生集合 type为3表示3级医院 4表示4级医院 5表示5级医院
getHospitalListData(county_id, town_id, rank) {
var num = {
county_id : county_id,
town_id : town_id,
rank : rank
}
let promise = fetch(localStorage.getItem("kfUrl") + "PICAAddressHospitalServiceImpl/postHospitalListByRank", num);
return promise;
}
}
此差异已折叠。
此差异已折叠。
<template>
<div class="header">
<div class="logo">敏感数据查看系统</div>
<div class="user-info">
<el-dropdown trigger="click" @command="handleCommand">
<span class="el-dropdown-link">
<img class="user-logo" src="../../../static/img/img.jpg">
<span id="headName">{{name}}</span><i class="el-icon-arrow-down el-icon--right"></i>
</span>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item command="logout">退出</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</div>
<!--导航-->
<div class="user-info">
<el-dropdown trigger="click" @command="handleCommand">
<span class="el-dropdown-link">
{{'系统切换'}}<i class="el-icon-arrow-down el-icon--right"></i>
</span>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item v-for="item in systemInfoList" :key="item.id">
<span class="menu-item" @click="forward(item)">{{item.systemName}}</span>
<!--<el-tag type="warning" @click="forward(item)">{{item.system_name}}</el-tag>-->
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</div>
</div>
</template>
<script>
import {base64encode,isEmptyUtils,logout, isNotEmptyUtils, errorResponseCheck, responseCheck, openLoading, closeLoading, messageBox, getConstantList, isNotEmptyList} from '../../common/utils';
import menuApi from '../../api/menu'
export default {
data() {
return {
name: localStorage.getItem("user_name"),
systemInfoList: []
}
},
created() {
//获取导航项目
this.getSystemType();
},
computed: {},
methods: {
handleCommand(command) {
if (command === 'logout') {
let req = {token: localStorage.getItem("token")};
let logOutPromise = menuApi.removeToken(req,this);
logOutPromise.then(function (res) {
logout();
}).catch(function (error) {
console.log('登出失败:'+error);
logout();
});
}
},
async getSystemType() {
let self = this;
//请求参数
let req = {
system_type: localStorage.getItem("system_type")
};
let headers = {
headers: {
'token': localStorage.getItem('token') || null
}
};
// let headData = menuApi.headList(req,self);
// headData.then(function (data) {
self.$axios.post(localStorage.getItem("msUrl")+'login/header', req, headers).then(function (data) {
responseCheck(data, self);
let sysData = JSON.parse(JSON.stringify(data.data));//通过这个实现深拷贝
if(sysData.code === '201550'){
/*messageBox(self, "登录", "登录失效,请重新登录!", "是", function () {
logout();
}, "", null);*/
}else{
self.systemInfoList = sysData.data.systemInfoList;
localStorage.setItem("user_name", sysData.data.userName);
if(document.getElementById('headName').innerText == undefined ||
document.getElementById('headName').innerText == ''){
document.getElementById('headName').innerText =localStorage.getItem("user_name")
}
}
}, function (error) {
errorResponseCheck(error, self);
});
},
forward(obj) {
let self = this;
if (obj.systemNameAbbreviation.toLowerCase() === "sso") {
window.location.href = obj.domainName + "pica_index.html";
} else {
// let apiUrl = localStorage.getItem("msUrl") + 'PICALoginAndRegisterServiceImpl/getHomePageUrl.validate';
//请求参数
let req = {
// token: localStorage.getItem("token"),
system_type: obj.id
};
openLoading(self);
let promise = menuApi.forwardPage(req,self)
promise.then(function (data) {
closeLoading(self);
let forwardData = JSON.parse(JSON.stringify(data.data));//通过这个实现深拷贝
let url = forwardData.data.picapMenuModels[0].url;
if (url.length > 1) {
// window.location.href = url;
} else {
url = forwardData.data.picapMenuModels[0].picapSecondMenus[0].url;
if (url.length > 1) {
// window.location.href = url;
} else {
url = forwardData.data.picapMenuModels[0].picapSecondMenus[0].picapThirdMenus[0].url;
}
}
let param = "token=" + localStorage.getItem("token") + "&ssoOrigin=" + localStorage.getItem("ssoOrigin") + "&system_type=" + obj.id;
window.location.href = obj.domainName + url + "?" + base64encode(param);
}, function (error) {
errorResponseCheck(error, self);
});
}
}
}
}
</script>
<style scoped>
.header {
position: relative;
box-sizing: border-box;
width: 100%;
height: 70px;
font-size: 22px;
line-height: 70px;
color: #fff;
}
.header .logo {
float: left;
width: 250px;
text-align: center;
}
.user-info {
float: right;
padding-right: 50px;
font-size: 16px;
color: #fff;
}
.user-info .el-dropdown-link {
position: relative;
display: inline-block;
padding-left: 50px;
color: #fff;
cursor: pointer;
vertical-align: middle;
}
.user-info .user-logo {
position: absolute;
left: 0;
top: 15px;
width: 40px;
height: 40px;
border-radius: 50%;
}
.el-dropdown-menu__item {
text-align: center;
}
.menu-item {
font-size: 14px;
font-weight: 300;
color: #606266;
}
</style>
<template>
<div class="wrapper">
<v-head></v-head>
<v-sidebar></v-sidebar>
<div class="content" id="bodyContent">
<transition name="move" mode="out-in">
<keep-alive>
<router-view v-if="$route.meta.keepAlive"></router-view>
</keep-alive>
</transition>
<transition name="move" mode="out-in">
<router-view v-if="!$route.meta.keepAlive"></router-view>
</transition>
</div>
</div>
</template>
<script>
import Vue from 'vue';
import {isNotEmptyUtils, getUrlParamsMap, base64decode, ssoLogin} from "../../common/utils";
import vHead from './Header.vue';
import vSidebar from './Sidebar.vue';
import Axios from 'axios';
export default {
data: function () {
return {}
},
beforeCreate() {
},
created() {
//sso登录时,初始化各种变量
this.initData();
console.log("初始化各种变量完成");
},
methods: {
async initData() {
// let self = this;
let href = window.location.href;
let offset = href.indexOf("?");
// console.log(window.location.search);
console.log(href);
if (offset !== -1) {
let paramStr = href.substring(offset + 1, href.length);
let pars = base64decode(paramStr);
let paramMap = getUrlParamsMap(pars, "&");
if (isNotEmptyUtils(paramMap["token"]) && isNotEmptyUtils(paramMap["ssoOrigin"])) {
Vue.prototype.$axios = Axios.create({
headers: {
'token': paramMap["token"],
'sysCode': localStorage.getItem("sysCode"),
'deviceInfo': localStorage.getItem("deviceInfo"),
}
});
ssoLogin(href, paramMap);
}
}
// else if (localStorage.getItem("token")) {
// debugger
// Vue.prototype.$axios = self.$axios.create({
// headers: {'token': localStorage.getItem("token")}
// });
// }
}
},
components: {
vHead, vSidebar
}
}
</script>
<style>
</style>
<template>
<div class="sidebar">
<el-menu :default-active="onRoutes" class="el-menu-vertical-demo" theme="dark" unique-opened router>
<template v-for="(item, index) in items">
<template v-if="item.subs">
<el-submenu :index="'index_' + index">
<template slot="title"><i :class="item.icon"></i>{{ item.title }}</template>
<el-menu-item v-for="(subItem,i) in item.subs" :key="i" :index="subItem.index">{{ subItem.title}}
</el-menu-item>
</el-submenu>
</template>
<template v-else>
<el-menu-item :index="item.index">
<i :class="item.icon"></i>{{ item.title }}
</el-menu-item>
</template>
</template>
</el-menu>
</div>
</template>
<script>
import {isEmptyUtils, isNotEmptyUtils, errorResponseCheck, responseCheck, openLoading, closeLoading, messageBox, getConstantList, isNotEmptyList} from '../../common/utils';
import menuApi from '../../api/menu'
export default {
data() {
return {items: []}
},
created() {
this.getData();
},
methods: {
async getData() {
let self = this;
//获取菜单
let url = localStorage.getItem("msUrl") + 'login/menu/list';
let req = {
token: localStorage.getItem("token"),
system_type: localStorage.getItem("system_type"),
device_ip: localStorage.getItem("ipAddress"),
browser_ver: localStorage.getItem("browser")
};
// let menuListPromise = menuApi.menuList(req,self);
let headers = {
headers: {
'token': localStorage.getItem('token') || null
}
};
self.$axios.post(localStorage.getItem("msUrl") + 'login/menu/list', req, headers).then(function (res) {
// menuListPromise.then(function (res) {
responseCheck(res, self);
// console.log("获取菜单成功===========",res);
self.items = res.data.data.picapMenuModels;
// 敏感数据查看系统 测试 Start <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 开发前期写死的,后续改成接口获取
self.items = [{
icon: null,
index: "#",
subs: [
{icon: null, index: "data-in", title: "数据导入", subs: []},
{icon: null, index: "data-view", title: "数据查看", subs: []},
],
title: "敏感数据",
},{
icon: null,
index: "#",
subs: [
{icon: null, index: "code-library", title: "后台编码库", subs: []},
{icon: null, index: "diagnose-manage", title: "诊断管理", subs: []},
],
title: "居民诊断",
}]
// 敏感数据查看系统 测试 End <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
let data = JSON.parse(JSON.stringify(res.data.data));//通过这个实现深拷贝
localStorage.setItem("privilege_data", JSON.stringify(data.picapMenuModels));
localStorage.setItem("user_name", data.user_name);
localStorage.setItem("function_role", data.function_role);
// localStorage.setItem("region_role", data.region_role);
localStorage.setItem("initFlag", "1");
// debugger
}).catch(function (error) {
console.log("获取菜单失败!%s", error);
errorResponseCheck(error, self);
});
}
},
computed: {
onRoutes() {
return this.$route.path.replace('/', '');
}
}
}
</script>
<style scoped>
.sidebar {
display: block;
position: absolute;
width: 250px;
left: 0;
top: 70px;
bottom: 0;
background: #2E363F;
}
.sidebar > ul {
height: 100%;
overflow-y: auto;
}
/* 滚动条样式 */
.sidebar > ul::-webkit-scrollbar {
width: 5px;
}
.sidebar > ul::-webkit-scrollbar-thumb {
border-radius: 5px;
-webkit-box-shadow: inset 0 0 5px rgba(0,0,0,0.2);
background: rgba(0,0,0,0.2);
}
</style>
/*右浮动*/
.float-right {
float: right;
}
/*el-row样式*/
.row {
/*margin-top: 20px;*/
margin-bottom: 20px;
}
/*form input输入框样式*/
.form-input {
width: auto;
}
/*文本不换行*/
.text-nowrap {
white-space: nowrap
}
.el-table__header thead tr th {
background: #fafafa !important;
}
.el-table th>.cell {
color: #000;
}
import Vue from 'vue';
import App from './App';
import router from './router';
import store from './vuex/store'
import axios from 'axios';
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css'; // 默认主题
import "babel-polyfill";
import {getAddress, loadCommonFilter} from './common/env'
import vueFilter from './common/filter'
//加载环境变量
getAddress();
loadCommonFilter();
//加载elementUi
Vue.use(ElementUI);
// Vue.use(vueXlsxTable, {rABS: false})
if (localStorage.getItem("token")) {
Vue.prototype.$axios = axios.create({
headers: {
'token': localStorage.getItem("token"),
'sysCode': localStorage.getItem("sysCode"),
'deviceInfo': localStorage.getItem("deviceInfo"),
}
});
} else {
Vue.prototype.$axios = axios;
}
// 全局过滤器
for (const filter in vueFilter) {
Vue.filter(filter, vueFilter[filter])
}
new Vue({
router,
store,
render: h => h(App)
}).$mount('#app');
import Vue from 'vue';
import Router from 'vue-router';
Vue.use(Router);
export default new Router({
/*
* 在创建的 router 对象中,如果不配置 mode,就会使用默认的 hash 模式,该模式下会将路径格式化为 #! 开头。
* 添加 mode: 'history' 之后将使用 HTML5 history 模式,该模式下没有 # 前缀,而且可以使用 pushState 和 replaceState 来管理记录。
* 关于 HTML5 history 模式的更多内容,可以参考官方文档:https://router.vuejs.org/zh-cn/essentials/history-mode.html
*/
// mode: 'history',
routes: [
{
path: '/',
component: resolve => require(['../components/common/Home.vue'], resolve),
children: [
{
path: '/',
redirect: '/data-in'
},{ // 后台编码库
path: '/code-library',
component: resolve => require(['../views/code-library/code-library.vue'], resolve),
},{ // 常见诊断管理
path: '/diagnose-manage',
component: resolve => require(['../views/diagnose-manage/diagnose-manage.vue'], resolve)
},{ // 后台编码库
path: '/data-in',
component: resolve => require(['../views/sensitive-control/data-in.vue'], resolve),
},{ // 常见诊断管理
path: '/data-view',
component: resolve => require(['../views/sensitive-control/data-view.vue'], resolve)
}
]
}
]
})
import fetch from '../common/fetch'
/**
* 获取内容列表
* @param {*} pageNo
* @param {*} pageSize
*/
// export const getContentsList = (pageNo, pageSize) => fetch( '/fiveMinutes/contents', {pageNo,pageSize}, 'GET')
/**
* 获取内容详情
*/
// export const getContent = () => fetch('PICALoginAndRegisterServiceImpl/postMe.validate/1031F75D3A90EDB1A721948D98077EFC', {}, 'GET');
export const getContent = () => fetch('PICALoginAndRegisterServiceImpl/postMenuVue', {token:"0CF19A58240AA77993925191E4303AD6"}, 'POST');
// export const getContent = () => fetch('PICALoginAndRegisterServiceImpl/postMe.validate?token=1031F75D3A90EDB1A721948D98077EFC', {}, 'POST');
// export const getContent = () => this.$axios.post('PICALoginAndRegisterServiceImpl/postMe.validate', {
// token: '1031F75D3A90EDB1A721948D98077EFC'
// })
// .then(function (response) {
// console.log(response);
// })
// .catch(function (error) {
// console.log(error);
// });
此差异已折叠。
此差异已折叠。
<template>
<div class="data-in-wrap">
<h2 class="top-title">数据导入</h2>
</div>
</template>
<script>
import { openLoading, closeLoading, } from '../../common/utils';
export default {
data() {
return {
}
},
created() {
},
methods: {
},
}
</script>
<style lang="less">
.data-in-wrap{
.top-title{
color: #333333;
}
}
</style>
\ No newline at end of file
<template>
<div class="data-view-wrap">
<h2 class="top-title">数据查看</h2>
</div>
</template>
<script>
import { openLoading, closeLoading, } from '../../common/utils';
export default {
data() {
return {
}
},
created() {
},
methods: {
},
}
</script>
<style lang="less">
.data-view-wrap{
.top-title{
color: #333333;
}
}
</style>
\ No newline at end of file
此差异已折叠。
此差异已折叠。
此差异已折叠。
import Vue from "vue";
import Vuex from "vuex";
import state from "./state";
Vue.use(Vuex)
export default new Vuex.Store({
state
})
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册