提交 7a9343dc 编写于 作者: xinglee23's avatar xinglee23

feat: update vue3

上级 f07b880a
{
"presets": ["es2015", "stage-2"],
"plugins": ["transform-runtime"],
"comments": false,
"presets": ["@babel/preset-env"],
"plugins": ["@babel/plugin-transform-runtime"]
}
var utils = require('./utils')
module.exports = function (options) {
return {
loaders: utils.cssLoaders({
sourceMap: options.sourceMap
}),
postcss: [
require('autoprefixer')({
browsers: ['last 10 versions']
})
]
}
}
\ No newline at end of file
......@@ -10,7 +10,6 @@ var cssSourceMapDev = (env === 'development' && config.dev.cssSourceMap)
var cssSourceMapProd = (env === 'production' && config.build.productionSourceMap)
var useCssSourceMap = cssSourceMapDev || cssSourceMapProd
module.exports = {
entry: {
app: './src/main.js'
......@@ -21,8 +20,7 @@ module.exports = {
filename: '[name].js'
},
resolve: {
extensions: ['', '.js', '.vue', '.less', '.css', '.scss'],
fallback: [path.join(__dirname, '../node_modules')],
extensions: ['*', '.js', '.vue', '.less', '.css', '.scss'],
alias: {
'vue$': 'vue/dist/vue.common.js',
'src': path.resolve(__dirname, '../src'),
......@@ -31,46 +29,49 @@ module.exports = {
'@': path.resolve('src')
}
},
resolveLoader: {
fallback: [path.join(__dirname, '../node_modules')]
},
module: {
loaders: [{
rules: [{
test: /\.vue$/,
loader: 'vue'
use: {
loader: 'vue-loader',
options: {
postcss: [
require('autoprefixer')({})
]
}
},
}, {
test: /\.js$/,
loader: 'babel',
include: projectRoot,
exclude: /node_modules/
exclude: /node_modules/,
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env']
}
}
}, {
test: /\.json$/,
loader: 'json'
use: 'json-loader'
}, {
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
loader: 'url',
query: {
limit: 10000,
name: utils.assetsPath('img/[name].[ext]')
use: {
loader: 'url-loader',
options: {
limit: 10000,
name: utils.assetsPath('img/[name].[ext]')
}
}
}, {
test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
loader: 'url',
query: {
limit: 5000,
name: utils.assetsPath('fonts/[name].[hash:7].[ext]'),
publicPath: '../../'
use: {
loader: 'url-loader',
options: {
limit: 5000,
name: utils.assetsPath('fonts/[name].[hash:7].[ext]'),
publicPath: '../../'
}
}
}]
},
vue: {
loaders: utils.cssLoaders({
sourceMap: useCssSourceMap
}),
postcss: [
require('autoprefixer')({
browsers: ['last 10 versions']
})
]
}
}
}
\ No newline at end of file
var config = require('../config')
var path = require('path')
var webpack = require('webpack')
var merge = require('webpack-merge')
var utils = require('./utils')
......@@ -11,6 +12,11 @@ Object.keys(baseWebpackConfig.entry).forEach(function(name) {
})
module.exports = merge(baseWebpackConfig, {
resolve: {
alias: {
'@': path.resolve(__dirname, 'src'),
}
},
module: {
loaders: utils.styleLoaders({
sourceMap: config.dev.cssSourceMap
......@@ -23,9 +29,9 @@ module.exports = merge(baseWebpackConfig, {
'process.env': config.dev.env
}),
// https://github.com/glenjamin/webpack-hot-middleware#installation--usage
new webpack.optimize.OccurenceOrderPlugin(),
// new webpack.optimize.OccurenceOrderPlugin(),
new webpack.HotModuleReplacementPlugin(),
new webpack.NoErrorsPlugin(),
new webpack.NoEmitOnErrorsPlugin(),
// https://github.com/ampedandwired/html-webpack-plugin
new HtmlWebpackPlugin({
filename: 'index.html',
......
{
"compilerOptions": {
"baseUrl": ".", // 这是根目录
"paths": {
"@/*": ["src/*"] // @ 指向 src 目录
}
},
"exclude": ["node_modules", "dist", "unpackage"]
}
此差异已折叠。
......@@ -6,7 +6,7 @@
"private": true,
"license": "GPL",
"scripts": {
"dev": "cross-env BUILD_ENV=dev node build/dev-server.js",
"dev": "cross-env BUILD_ENV=test node build/dev-server.js",
"local": "cross-env BUILD_ENV=development node build/dev-server.js",
"build": "node build/build.js",
"build:dev": "cross-env BUILD_ENV=dev node build/build.js",
......@@ -18,8 +18,11 @@
},
"dependencies": {
"@babel/polyfill": "^7.2.5",
"@vue/compat": "^3.4.15",
"autoprefixer": "^10.4.17",
"axios": "0.16.2",
"better-scroll": "^0.1.15",
"core-js": "^3.8.3",
"dayjs": "^1.10.7",
"echarts": "^4.2.0-rc.2",
"element-ui": "^2.11.1",
......@@ -29,7 +32,7 @@
"js-cookie": "^2.2.0",
"js-md5": "^0.7.3",
"jsencrypt": "^3.2.1",
"jspdf": "^1.5.3",
"jspdf": "^2.5.1",
"node-sass": "^4.9.2",
"pdfh5": "^1.3.9",
"qrcode": "^1.3.3",
......@@ -37,25 +40,24 @@
"showdown": "^1.6.4",
"sortablejs": "^1.13.0",
"storejs": "^2.0.1",
"tiny-emitter": "^2.1.0",
"video.js": "^7.8.2",
"vue": "^2.1.0",
"vue": "^3.4.15",
"vue-infinite-scroll": "^2.0.2",
"vue-router": "^2.1.1",
"vue-router": "^4.0.8",
"vue-ueditor-wrap": "^2.4.1",
"vue-video-player": "^5.0.2",
"vuedraggable": "^2.24.3",
"vuex": "^2.0.0"
"vuex": "^4.0.2"
},
"devDependencies": {
"autoprefixer": "^6.4.0",
"autoprefixer-loader": "^3.2.0",
"babel-core": "^6.0.0",
"babel-loader": "^6.0.0",
"@babel/core": "^7.23.7",
"@babel/preset-env": "^7.23.8",
"@vue/cli-plugin-babel": "^5.0.1",
"@vue/cli-service": "^5.0.1",
"@vue/compiler-sfc": "^3.4.15",
"babel-loader": "^8.3.0",
"babel-plugin-transform-runtime": "^6.0.0",
"babel-preset-es2015": "^6.0.0",
"babel-preset-stage-2": "^6.0.0",
"babel-register": "^6.0.0",
"babel-runtime": "^6.23.0",
"chalk": "^1.1.3",
"connect-history-api-fallback": "^1.1.0",
"cropperjs": "^1.5.7",
......@@ -63,7 +65,7 @@
"css-loader": "^0.28.11",
"eventsource-polyfill": "^0.9.6",
"express": "^4.13.3",
"extract-text-webpack-plugin": "^1.0.1",
"extract-text-webpack-plugin": "^3.0.2",
"file-loader": "^0.9.0",
"function-bind": "^1.0.2",
"html-webpack-plugin": "^2.8.1",
......@@ -76,7 +78,7 @@
"opn": "^4.0.2",
"ora": "^0.3.0",
"sass": "^0.5.0",
"sass-loader": "^4.1.1",
"sass-loader": "^10.5.2",
"scss": "^0.2.4",
"scss-loader": "0.0.1",
"semver": "^5.3.0",
......@@ -84,10 +86,9 @@
"style-loader": "^0.13.1",
"url-loader": "^0.5.7",
"vue-lazyload": "^1.2.6",
"vue-loader": "^10.0.0",
"vue-loader": "^16.0.0",
"vue-style-loader": "^2.0.5",
"vue-template-compiler": "^2.1.0",
"webpack": "^1.13.2",
"webpack": "^3.12.0",
"webpack-dev-middleware": "^1.8.3",
"webpack-dev-server": "^1.16.2",
"webpack-hot-middleware": "^2.12.2",
......@@ -96,5 +97,10 @@
"engines": {
"node": ">= 4.0.0",
"npm": ">= 3.0.0"
}
}
\ No newline at end of file
},
"browserslist": [
"> 1%",
"last 2 versions",
"not dead"
]
}
此差异已折叠。
<template>
<div class="bread-crumb">
<el-breadcrumb separator="/">
<el-breadcrumb-item>{{curmbFirst}}</el-breadcrumb-item>
<el-breadcrumb-item v-if="curmbSecond" :to="{ path: jumPathThird }">{{curmbSecond}}</el-breadcrumb-item>
<el-breadcrumb-item v-if="curmbThird" :to="{ path: jumPathFouth }">{{curmbThird}}</el-breadcrumb-item>
<el-breadcrumb-item v-if="curmbFouth">{{curmbFouth}}</el-breadcrumb-item>
</el-breadcrumb>
</div>
<div class="bread-crumb">
<el-breadcrumb separator="/">
<el-breadcrumb-item>{{ curmbFirst }}</el-breadcrumb-item>
<el-breadcrumb-item v-if="curmbSecond" :to="{ path: jumPathThird }">{{
curmbSecond
}}</el-breadcrumb-item>
<el-breadcrumb-item v-if="curmbThird" :to="{ path: jumPathFouth }">{{
curmbThird
}}</el-breadcrumb-item>
<el-breadcrumb-item v-if="curmbFouth">{{
curmbFouth
}}</el-breadcrumb-item>
</el-breadcrumb>
</div>
</template>
<script>
export default {
props: {
curmbFirst: {
type: String
},
curmbSecond: {
type: String
},
curmbThird: {
type: String
},
curmbFouth: {
type: String
},
jumPathThird: {
type: String
},
jumPathFouth: {
type: String
}
}
props: {
curmbFirst: {
type: String,
},
curmbSecond: {
type: String,
},
curmbThird: {
type: String,
},
curmbFouth: {
type: String,
},
jumPathThird: {
type: String,
},
jumPathFouth: {
type: String,
},
},
}
</script>
<style lang="scss">
.bread-crumb {
position: fixed;
left: 255px;
top: 64px;
width: 100%;
background: #fff;
height: 61px;
padding: 20px 20px 30px;
z-index: 99;
border-top: 3px solid #F0F2F5;
.el-breadcrumb__inner {
font-size: 14px;
}
position: fixed;
left: 255px;
top: 64px;
width: 100%;
background: #fff;
height: 61px;
padding: 20px 20px 30px;
z-index: 99;
border-top: 3px solid #f0f2f5;
.el-breadcrumb__inner {
font-size: 14px;
}
}
</style>
<template>
<div class="rc-cropper" v-if="originImg">
<div :class="{'rc-cropper__canvasCrop1': cropOption.uploadType == 1, 'rc-cropper__canvasCrop2': cropOption.uploadType == 2}">
<img :src="originImg" v-if="!cropper">
<canvas :id="originImg" ref="canvas"/>
<div
:class="{
'rc-cropper__canvasCrop1': cropOption.uploadType == 1,
'rc-cropper__canvasCrop2': cropOption.uploadType == 2,
}"
>
<img :src="originImg" v-if="!cropper" />
<canvas :id="originImg" ref="canvas" />
<div class="rc-cropper__iconCrop">
<el-tooltip content="确认裁剪" placement="right" v-if="cropper">
<el-button type="success" size="mini" @click="sureCropper()"><i class="el-icon-check"></i></el-button>
<el-button type="success" size="mini" @click="sureCropper()"
><i class="el-icon-check"></i
></el-button>
</el-tooltip>
</div>
</div>
</div>
</template>
<script>
import { $on, $off, $once, $emit } from '../../../utils/gogocodeTransfer'
import Cropper from 'cropperjs'
import 'cropperjs/dist/cropper.min.css'
export default {
......@@ -20,35 +29,35 @@ export default {
cropOption: {
type: Object,
required: true,
default: () => {}
default: () => {},
},
originImg: {
required: true
required: true,
},
},
data () {
data() {
return {
cropper: null,
croppShow: false
croppShow: false,
}
},
mounted () {
mounted() {
this.drawImg()
},
destroyed() {
this.cropper && this.cropper.destroy();
unmounted() {
this.cropper && this.cropper.destroy()
},
methods: {
// 在canvas上绘制图片
drawImg () {
drawImg() {
const _this = this
this.$nextTick(() => {
let canvas = document.getElementById(this.originImg)
if (canvas) {
// canvas.width = 1000
// canvas.height = 800
canvas.width = _this.cropOption.cvWidth;
canvas.height = _this.cropOption.cvHeight;
canvas.width = _this.cropOption.cvWidth
canvas.height = _this.cropOption.cvHeight
let ctx = canvas.getContext('2d')
ctx.clearRect(0, 0, canvas.width, canvas.height)
let img = new Image()
......@@ -62,7 +71,7 @@ export default {
})
},
// 显示裁剪框
initCropper () {
initCropper() {
this.croppShow = true
this.cropper = new Cropper(this.$refs.canvas, {
checkCrossOrigin: true,
......@@ -86,7 +95,7 @@ export default {
x: this.cropOption.offset_x,
y: this.cropOption.offset_y,
width: this.cropOption.width,
height: this.cropOption.height
height: this.cropOption.height,
})
// this.cropper.zoomTo(1);
},
......@@ -99,50 +108,43 @@ export default {
})
},
// 确认裁剪
sureCropper () {
sureCropper() {
let _this = this
const cropParam = this.cropper.getData()
console.log('cropParam', cropParam);
console.log('cropParam', cropParam)
this.cropper.getCroppedCanvas().toBlob(function (blob) {
let files = new window.File([blob], 'cropper.jpg');
console.log(files);
let files = new window.File([blob], 'cropper.jpg')
console.log(files)
let oFileReader = new FileReader()
oFileReader.onloadend = function (e) {
let base64 = e.target.result
_this.$emit('getCropImg', base64, cropParam, files, _this.cropper)
$emit(_this, 'getCropImg', base64, cropParam, files, _this.cropper)
}
oFileReader.readAsDataURL(blob)
}, 'image/jpeg')
}
}
},
},
emits: ['getCropImg'],
}
</script>
<style scoped lang="scss">
<style lang="scss" scoped>
.rc-cropper__canvasCrop1 {
/* border: 1px solid red; */
width: 800px;
height: 540px;
}
.rc-cropper__canvasCrop2 {
/* border: 1px solid red; */
width: 400px;
height: 300px;
}
.rc-cropper__iconCrop {
position: absolute;
// left: 46%;
position: absolute; /*// left: 46%;*/
right: 13%;
top: 15%;
}
.el-tooltip {
margin: 20px 4px;
display: block;
z-index: 10000;
}
</style>
<template>
<div class="rc-cropper" v-if="originImg">
<div class="rc-cropper__canvasCrop2">
<img :src="originImg" v-if="!cropper">
<canvas :id="originImg" ref="canvas"/>
<img :src="originImg" v-if="!cropper" />
<canvas :id="originImg" ref="canvas" />
<div class="rc-cropper__iconCrop">
<el-tooltip content="确认裁剪" placement="right" v-if="cropper">
<el-button type="success" size="mini" @click="sureCropper()"><i class="el-icon-check"></i></el-button>
<el-button type="success" size="mini" @click="sureCropper()"
><i class="el-icon-check"></i
></el-button>
</el-tooltip>
</div>
</div>
</div>
</template>
<script>
import { $on, $off, $once, $emit } from '../../../utils/gogocodeTransfer'
import Cropper from 'cropperjs'
import 'cropperjs/dist/cropper.min.css'
export default {
......@@ -20,30 +24,30 @@ export default {
cropOption: {
type: Object,
required: true,
default: () => {}
default: () => {},
},
originImg: {
required: true
required: true,
},
previewImg: {
type: String
}
type: String,
},
},
data () {
data() {
return {
cropper: null,
croppShow: false
croppShow: false,
}
},
mounted () {
mounted() {
this.drawImg()
},
destroyed() {
this.cropper && this.cropper.destroy();
unmounted() {
this.cropper && this.cropper.destroy()
},
methods: {
// 在canvas上绘制图片
drawImg () {
drawImg() {
const _this = this
this.$nextTick(() => {
let canvas = document.getElementById(this.originImg)
......@@ -63,7 +67,7 @@ export default {
})
},
// 显示裁剪框
initCropper () {
initCropper() {
this.croppShow = true
this.cropper = new Cropper(this.$refs.canvas, {
checkCrossOrigin: true,
......@@ -87,7 +91,7 @@ export default {
x: this.cropOption.offset_x,
y: this.cropOption.offset_y,
width: this.cropOption.width,
height: this.cropOption.height
height: this.cropOption.height,
})
// this.cropper.zoomTo(1);
},
......@@ -100,63 +104,30 @@ export default {
})
},
// 确认裁剪
sureCropper () {
sureCropper() {
let _this = this
const cropParam = this.cropper.getData()
console.log('cropParam', cropParam);
console.log('cropParam', cropParam)
this.cropper.getCroppedCanvas().toBlob(function (blob) {
let files = new window.File([blob], 'cropper.jpg');
console.log(files);
let files = new window.File([blob], 'cropper.jpg')
console.log(files)
let oFileReader = new FileReader()
oFileReader.onloadend = function (e) {
let base64 = e.target.result
_this.$emit('getCropImg', base64, cropParam, files, _this.cropper)
$emit(_this, 'getCropImg', base64, cropParam, files, _this.cropper)
}
oFileReader.readAsDataURL(blob)
}, 'image/jpeg')
}
}
},
},
emits: ['getCropImg'],
}
</script>
<style scoped lang="scss">
// .rc-cropper {
// position: relative;
// margin-top: 10px;
// img {
<style lang="scss" scoped>
/*// .rc-cropper*/{/*// position: relative;*//*// margin-top: 10px;*//*// img {*/
// width: 100%;
// height: 100%;
// height: 100%;
// }
// }
/* img {
width: 100%;
height: 100%;
} */
.rc-cropper__canvasCrop2 {
/* border: 1px solid red; */
width: 800px;
height: 540px;
}
.rc-cropper__iconCrop {
position: absolute;
/* left: 8%; */
left: 46%;
top: 10%;
}
.el-tooltip {
margin: 20px 4px;
display: block;
z-index: 10000;
}
</style>
margin: 20px 4px;
display: block;
z-index: 10000;
}
//}.rc-cropper__canvasCrop2{width:800px;height:540px}.rc-cropper__iconCrop{position:absolute;left:46%;top:10%}.el-tooltip{margin:20px 4px;display:block;z-index:10000}
</style>
<template>
<div class="rc-cropper" v-if="originImg">
<div :class="{'rc-cropper__canvasCrop1': cropOption.uploadType == 1, 'rc-cropper__canvasCrop2': cropOption.uploadType == 2}">
<img :src="originImg" v-if="!cropper">
<canvas :id="originImg" ref="canvas"/>
<div
:class="{
'rc-cropper__canvasCrop1': cropOption.uploadType == 1,
'rc-cropper__canvasCrop2': cropOption.uploadType == 2,
}"
>
<img :src="originImg" v-if="!cropper" />
<canvas :id="originImg" ref="canvas" />
<div class="rc-cropper__iconCrop">
<el-tooltip content="确认裁剪" placement="right" v-if="cropper">
<el-button type="success" size="mini" @click="sureCropper()"><i class="el-icon-check"></i></el-button>
<el-button type="success" size="mini" @click="sureCropper()"
><i class="el-icon-check"></i
></el-button>
</el-tooltip>
</div>
</div>
</div>
</template>
<script>
import { $on, $off, $once, $emit } from '../../../utils/gogocodeTransfer'
import Cropper from 'cropperjs'
import 'cropperjs/dist/cropper.min.css'
export default {
......@@ -20,35 +29,35 @@ export default {
cropOption: {
type: Object,
required: true,
default: () => {}
default: () => {},
},
originImg: {
required: true
required: true,
},
},
data () {
data() {
return {
cropper: null,
croppShow: false
croppShow: false,
}
},
mounted () {
mounted() {
this.drawImg()
},
destroyed() {
this.cropper && this.cropper.destroy();
unmounted() {
this.cropper && this.cropper.destroy()
},
methods: {
// 在canvas上绘制图片
drawImg () {
drawImg() {
const _this = this
this.$nextTick(() => {
let canvas = document.getElementById(this.originImg)
if (canvas) {
// canvas.width = 1000
// canvas.height = 800
canvas.width = _this.cropOption.cvWidth;
canvas.height = _this.cropOption.cvHeight;
canvas.width = _this.cropOption.cvWidth
canvas.height = _this.cropOption.cvHeight
let ctx = canvas.getContext('2d')
ctx.clearRect(0, 0, canvas.width, canvas.height)
let img = new Image()
......@@ -62,24 +71,26 @@ export default {
})
},
// 显示裁剪框
initCropper () {
initCropper() {
if (!HTMLCanvasElement.prototype.toBlob) {
console.log('HTMLCanvasElement.prototype.toBlob####');
console.log('HTMLCanvasElement.prototype.toBlob####')
Object.defineProperty(HTMLCanvasElement.prototype, 'toBlob', {
value: function (callback, type, quality) {
var canvas = this;
var canvas = this
setTimeout(function () {
var binStr = window.atob(canvas.toDataURL(type, quality).split(',')[1]);
var len = binStr.length;
var arr = new window.Uint8Array(len);
var binStr = window.atob(
canvas.toDataURL(type, quality).split(',')[1]
)
var len = binStr.length
var arr = new window.Uint8Array(len)
for (var i = 0; i < len; i++) {
arr[i] = binStr.charCodeAt(i);
arr[i] = binStr.charCodeAt(i)
}
// callback(new window.Blob([arr], { type: type || 'image/jpeg' }));
callback(new window.Blob([arr], { type: type || 'image/jpeg' }));
});
}
});
callback(new window.Blob([arr], { type: type || 'image/jpeg' }))
})
},
})
}
this.croppShow = true
......@@ -105,7 +116,7 @@ export default {
x: this.cropOption.offset_x,
y: this.cropOption.offset_y,
width: this.cropOption.width,
height: this.cropOption.height
height: this.cropOption.height,
})
// this.cropper.zoomTo(1);
},
......@@ -118,55 +129,51 @@ export default {
})
},
// 确认裁剪
sureCropper () {
sureCropper() {
let _this = this
const cropParam = this.cropper.getData()
console.log('cropParam', cropParam);
console.log('cropParam', cropParam)
this.cropper.getCroppedCanvas().toBlob(function (blob) {
var objecturl = window.URL.createObjectURL(blob);
console.log('objecturl', objecturl);
let files = new window.File([blob], 'cropper.jpg');
console.log('getCroppedCanvas', files);
var objecturl = window.URL.createObjectURL(blob)
console.log('objecturl', objecturl)
let files = new window.File([blob], 'cropper.jpg')
console.log('getCroppedCanvas', files)
let oFileReader = new window.FileReader()
console.log('oFileReader', oFileReader);
console.log('oFileReader', oFileReader)
oFileReader.onloadend = function (e) {
console.log('e.target.result', e, e.target, e.target.result);
let base64 = e.target.result;
_this.$emit('getCropImg', base64, cropParam, files, _this.cropper)
console.log('e.target.result', e, e.target, e.target.result)
let base64 = e.target.result
$emit(_this, 'getCropImg', base64, cropParam, files, _this.cropper)
}
oFileReader.readAsDataURL(blob)
}, 'image/jpeg')
}
}
},
},
emits: ['getCropImg'],
}
</script>
<style scoped lang="scss">
// .rc-cropper {
// margin-left: 20px;
// }
<style lang="scss" scoped>
/*// .rc-cropper*/
{
/*// margin-left: 20px;*/ /*//*/
}
.rc-cropper__canvasCrop1 {
width: 800px;
height: 540px;
}
.rc-cropper__canvasCrop2 {
width: 400px;
height: 300px;
}
.rc-cropper__iconCrop {
position: absolute;
// left: 46%;
position: absolute; /*// left: 46%;*/
right: 13%;
top: 15%;
}
.el-tooltip {
margin: 20px 4px;
display: block;
z-index: 10000;
}
</style>
......@@ -3,24 +3,28 @@
<el-row>
<el-col :span="12">
<div class="rc-cropper__canvasCrop2">
<img :src="originImg" v-if="!cropper">
<canvas :id="originImg" ref="canvas"/>
<img :src="originImg" v-if="!cropper" />
<canvas :id="originImg" ref="canvas" />
<div class="rc-cropper__iconCrop">
<el-tooltip content="确认裁剪" placement="right" v-if="cropper">
<el-button type="success" size="mini" @click="sureCropper()"><i class="el-icon-check"></i></el-button>
<el-button type="success" size="mini" @click="sureCropper()"
><i class="el-icon-check"></i
></el-button>
</el-tooltip>
</div>
</div>
</el-col>
<el-col :span="10">
<div class="rc-cropper__previewImg">
<img :src="previewImg" id="previewImg"/>
<img :src="previewImg" id="previewImg" />
</div>
</el-col>
</el-row>
</div>
</template>
<script>
import { $on, $off, $once, $emit } from '../../../utils/gogocodeTransfer'
import Cropper from 'cropperjs'
import 'cropperjs/dist/cropper.min.css'
export default {
......@@ -29,27 +33,27 @@ export default {
cropOption: {
type: Object,
required: true,
default: () => {}
default: () => {},
},
originImg: {
required: true
required: true,
},
previewImg: {
type: String
}
type: String,
},
},
data () {
data() {
return {
cropper: null,
croppShow: false
croppShow: false,
}
},
mounted () {
mounted() {
this.drawImg()
},
methods: {
// 在canvas上绘制图片
drawImg () {
drawImg() {
const _this = this
this.$nextTick(() => {
let canvas = document.getElementById(this.originImg)
......@@ -69,7 +73,7 @@ export default {
})
},
// 显示裁剪框
initCropper () {
initCropper() {
this.croppShow = true
this.cropper = new Cropper(this.$refs.canvas, {
checkCrossOrigin: true,
......@@ -81,56 +85,45 @@ export default {
x: this.cropOption.offset_x,
y: this.cropOption.offset_y,
width: this.cropOption.width,
height: this.cropOption.height
height: this.cropOption.height,
})
}
},
})
// this.cropper = cropper
},
// 确认裁剪
sureCropper () {
sureCropper() {
let _this = this
const cropParam = this.cropper.getData()
this.cropper.getCroppedCanvas().toBlob(function (blob) {
let oFileReader = new FileReader()
oFileReader.onloadend = function (e) {
let base64 = e.target.result
_this.$emit('getCropImg', base64, cropParam)
$emit(_this, 'getCropImg', base64, cropParam)
}
oFileReader.readAsDataURL(blob)
}, 'image/jpeg')
}
}
},
},
emits: ['getCropImg'],
}
</script>
<style >
/* .rc-cropper {
position: relative;
margin-top: 20px;
} */
/* img {
width: 100%;
height: 100%;
} */
<style>
.rc-cropper__canvasCrop2 {
width: 720px;
height: 480px;
}
.rc-cropper__iconCrop {
position: absolute;
left: 45%;
top: 0%;
}
.el-tooltip {
margin: 20px 4px;
display: block;
z-index: 10000;
}
.rc-cropper__previewImg {
width: 600px;
height: 400px;
......
此差异已折叠。
此差异已折叠。
......@@ -11,24 +11,27 @@
>
<!-- <canvas v-for="page in pages" :id="'the-canvas'+page" :key="page"></canvas> -->
<div id="demo"></div>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="close">确 定</el-button>
</div>
<template v-slot:footer>
<div class="dialog-footer">
<el-button type="primary" @click="close">确 定</el-button>
</div>
</template>
</el-dialog>
</template>
<script>
// import Pdfh5 from "pdfh5";
import { $on, $off, $once, $emit } from '../../../../utils/gogocodeTransfer'
export default {
data() {
return {
pdfh5: null
};
pdfh5: null,
}
},
props: {
dialogVisible: {
type: Boolean,
default: false
}
default: false,
},
},
computed: {},
components: {
......@@ -55,21 +58,16 @@ export default {
},
methods: {
close() {
this.$emit("close");
}
}
};
$emit(this, 'close')
},
},
emits: ['close'],
}
</script>
<style scoped lang="scss">
// @import "pdfh5/css/pdfh5.css";
// * {
// padding: 0;
// margin: 0;
// }
// html,
<style lang="scss" scoped>
/*// @import "pdfh5/css/pdfh5.css";*/
// *{/*// padding: 0;*//*// margin: 0;*//*//*/}/*// html,*/
// body,
// #app {
// width: 100%;
// height: 100%;
// }
// #app{/*// width: 100%;*//*// height: 100%;*//*//*/}
</style>
......@@ -8,70 +8,77 @@
:close-on-click-modal="false"
:close-on-press-escape="false"
width="800px"
>
<div slot="title" style="text-align: left;">
<span style="font-weight: 700;">用户协议</span>
</div>
<div style="margin: 20px 20px;height: 400px;padding: 10px 0;" v-html="protocolContent"></div>
<div slot="footer" class="dialog-footer">
<el-button @click="close(false)">不同意</el-button>
<el-button type="primary" @click="signProtocol">同意</el-button>
</div>
>
<template v-slot:title>
<div style="text-align: left">
<span style="font-weight: 700">用户协议</span>
</div>
</template>
<div
style="margin: 20px 20px; height: 400px; padding: 10px 0"
v-html="protocolContent"
></div>
<template v-slot:footer>
<div class="dialog-footer">
<el-button @click="close(false)">不同意</el-button>
<el-button type="primary" @click="signProtocol">同意</el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script>
import { $on, $off, $once, $emit } from '../../../../utils/gogocodeTransfer'
export default {
data() {
return {
};
return {}
},
props: {
dialogVisible: {
type: Boolean,
default: false
default: false,
},
protocolId: {
type: String | Number,
default: 1
default: 1,
},
protocolContent: {
type: String,
default: ''
}
},
computed: {
default: '',
},
},
computed: {},
mounted() {
// this.getProtocolInfoById();
},
methods: {
// 签署协议
signProtocol() {
let req = {
setEntry: true,
};
this.POST("smartcontract/protocol/sign?type=" + this.protocolId, req).then(res => {
if (res.code == "000000") {
this.close(true);
} else {
vm.$message.info(res.message);
this.close(false);
}
}).catch(err => {
vm.$message.warning("请稍后重试");
this.close(false);
});
}
this.POST('smartcontract/protocol/sign?type=' + this.protocolId, req)
.then((res) => {
if (res.code == '000000') {
this.close(true)
} else {
vm.$message.info(res.message)
this.close(false)
}
})
.catch((err) => {
vm.$message.warning('请稍后重试')
this.close(false)
})
},
close(status) {
this.$emit('close', status);
$emit(this, 'close', status)
},
}
};
},
emits: ['close'],
}
</script>
<style scoped lang="scss">
</style>
<style lang="scss" scoped></style>
......@@ -16,17 +16,22 @@
:options="playerOptions"
@pause="onPlayerPause($event)"
/>
<div slot="title" style="text-align: left;">
<span style="font-weight: 700;">预览课程</span>
</div>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="close">确 定</el-button>
</div>
<template v-slot:title>
<div style="text-align: left">
<span style="font-weight: 700">预览课程</span>
</div>
</template>
<template v-slot:footer>
<div class="dialog-footer">
<el-button type="primary" @click="close">确 定</el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script>
// import video from '@/assets/test.mp4'
import { $on, $off, $once, $emit } from '../../../../utils/gogocodeTransfer'
export default {
data() {
return {
......@@ -35,64 +40,63 @@ export default {
autoplay: false, //如果true,浏览器准备好时开始回放。
muted: false, // 默认情况下将会消除任何音频。
loop: false, // 导致视频一结束就重新开始。
preload: "auto", // 建议浏览器在<video>加载元素后是否应该开始下载视频数据。auto浏览器选择最佳行为,立即开始加载视频(如果浏览器支持)
language: "zh-CN",
aspectRatio: "16:9", // 将播放器置于流畅模式,并在计算播放器的动态大小时使用该值。值应该代表一个比例 - 用冒号分隔的两个数字(例如"16:9"或"4:3")
preload: 'auto', // 建议浏览器在<video>加载元素后是否应该开始下载视频数据。auto浏览器选择最佳行为,立即开始加载视频(如果浏览器支持)
language: 'zh-CN',
aspectRatio: '16:9', // 将播放器置于流畅模式,并在计算播放器的动态大小时使用该值。值应该代表一个比例 - 用冒号分隔的两个数字(例如"16:9"或"4:3")
fluid: true, // 当true时,Video.js player将拥有流体大小。换句话说,它将按比例缩放以适应其容器。
sources: [
{
src: '', // 路径
type: "video/mp4" // 类型
type: 'video/mp4', // 类型
},
// {
// src: "//path/to/video.webm",
// type: "video/webm"
// }
],
poster: "http://10.177.11.169:9000/750*1000-1.png", //你的封面地址
notSupportedMessage: "此视频暂无法播放,请稍后再试", //允许覆盖Video.js无法播放媒体源时显示的默认信息。
poster: 'http://10.177.11.169:9000/750*1000-1.png', //你的封面地址
notSupportedMessage: '此视频暂无法播放,请稍后再试', //允许覆盖Video.js无法播放媒体源时显示的默认信息。
controlBar: {
timeDivider: true,
durationDisplay: true,
remainingTimeDisplay: false,
fullscreenToggle: true //全屏按钮
}
}
};
fullscreenToggle: true, //全屏按钮
},
},
}
},
props: {
dialogVisible: {
type: Boolean,
default: false
default: false,
},
videoUrl: {
type: String,
default: ''
}
default: '',
},
},
watch: {
videoUrl(newVideoUrl) {
this.playerOptions.sources[0].src = newVideoUrl;
}
this.playerOptions.sources[0].src = newVideoUrl
},
},
computed: {
player() {
return this.$refs.videoPlayer.player
}
},
mounted() {
},
},
mounted() {},
methods: {
close() {
this.$emit('close');
this.player.pause();
$emit(this, 'close')
this.player.pause()
},
onPlayerPause(player) {
console.log(player);
}
}
};
console.log(player)
},
},
emits: ['close'],
}
</script>
<style scoped lang="scss">
</style>
<style lang="scss" scoped></style>
<template>
<!-- 拒绝原因 暂时不做 -->
<el-dialog
title="拒绝原因"
:visible="dialogVisible"
@close="hideAuditForm"
width="600px"
center>
<el-form ref="auditForm" :model="auditForm" label-width="120px">
<el-form-item label="拒绝原因:">
<el-radio-group v-model="auditForm.label">
<div v-for="item in refuseReasonList" :key="item">
<div style="padding-top: 12px;">
<el-radio :label="item"></el-radio>
</div>
<!-- 拒绝原因 暂时不做 -->
<el-dialog
title="拒绝原因"
:visible="dialogVisible"
@close="hideAuditForm"
width="600px"
center
>
<el-form ref="auditForm" :model="auditForm" label-width="120px">
<el-form-item label="拒绝原因:">
<el-radio-group v-model:value="auditForm.label">
<div v-for="item in refuseReasonList" :key="item">
<div style="padding-top: 12px">
<el-radio :label="item"></el-radio>
</div>
<!-- <div style="padding-top: 16px;">
<el-radio :label="refuseReasonList[1]"></el-radio>
</div> -->
<div style="padding-top: 16px;">
<el-radio label="其他"></el-radio>
</div>
</el-radio-group>
<div v-if="auditForm.label == '其他'">
<el-input type="textarea" v-model="auditForm.desc" maxlength="25" style="width: 310px;margin-top: 10px;"></el-input>
<span class="word-num">{{(auditForm.desc).replace(/\s+/g,"").length}}/25</span>
</div>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<!-- <div style="padding-top: 16px;">
<el-radio :label="refuseReasonList[1]"></el-radio>
</div> -->
<div style="padding-top: 16px">
<el-radio label="其他"></el-radio>
</div>
</el-radio-group>
<div v-if="auditForm.label == '其他'">
<el-input
type="textarea"
v-model:value="auditForm.desc"
maxlength="25"
style="width: 310px; margin-top: 10px"
></el-input>
<span class="word-num"
>{{ auditForm.desc.replace(/\s+/g, '').length }}/25</span
>
</div>
</el-form-item>
</el-form>
<template v-slot:footer>
<span class="dialog-footer">
<el-button @click="hideAuditForm">取 消</el-button>
<el-button type="primary" @click="submitForm()">确 定</el-button>
</span>
</el-dialog>
</template>
</el-dialog>
</template>
<script>
import { $on, $off, $once, $emit } from '../../../../utils/gogocodeTransfer'
export default {
data() {
return {
auditForm: {
label: '',
desc: ''
}
};
desc: '',
},
}
},
props: {
dialogVisible: {
type: Boolean,
default: false
default: false,
},
refuseReasonList: {
type: Array,
default: () => ['含有政治类、医疗健康、社会事件类不实信息', '含有欺诈,色情,诱导、违法犯罪非法字符']
}
default: () => [
'含有政治类、医疗健康、社会事件类不实信息',
'含有欺诈,色情,诱导、违法犯罪非法字符',
],
},
},
watch: {
dialogVisible(newVal) {
if(newVal) {
this.auditForm.label = '';
this.auditForm.desc = '';
if (newVal) {
this.auditForm.label = ''
this.auditForm.desc = ''
}
}
},
computed: {
},
},
computed: {},
mounted() {
console.log(2222);
console.log(2222)
},
methods: {
hideAuditForm() {
this.$emit('close');
$emit(this, 'close')
},
submitForm() {
let cMsg = this.auditForm.label;
if(cMsg == '其他') {
cMsg = this.auditForm.desc;
let cMsg = this.auditForm.label
if (cMsg == '其他') {
cMsg = this.auditForm.desc
}
// if(!cMsg) {
// this.$message({
......@@ -85,11 +97,12 @@ export default {
// return;
// }
// refuseReasonList
this.hideAuditForm();
this.$emit('checkInfo', cMsg);
}
}
};
this.hideAuditForm()
$emit(this, 'checkInfo', cMsg)
},
},
emits: ['checkInfo', 'close'],
}
</script>
<style scoped lang="scss">
</style>
<style lang="scss" scoped></style>
......@@ -2,45 +2,53 @@
<div class="dialog">
<el-dialog
:title="dialogObj.title"
:show-close=false
:visible.sync="dialogObj.visible"
:show-close="false"
v-model:visible="dialogObj.visible"
:close-on-click-modal="false"
width="600px"
center>
<p style="text-align: center;">{{dialogObj.message}}</p>
<p class="tip" v-if="dialogObj.tip">{{dialogObj.tip}}</p>
<span slot="footer" class="dialog-footer">
<el-button @click="confirm" v-if="dialogObj.confirmMsg">{{dialogObj.confirmMsg}}</el-button>
<el-button type="primary" @click="hide" v-if="dialogObj.hideMsg">{{dialogObj.hideMsg}}</el-button>
</span>
center
>
<p style="text-align: center">{{ dialogObj.message }}</p>
<p class="tip" v-if="dialogObj.tip">{{ dialogObj.tip }}</p>
<template v-slot:footer>
<span class="dialog-footer">
<el-button @click="confirm" v-if="dialogObj.confirmMsg">{{
dialogObj.confirmMsg
}}</el-button>
<el-button type="primary" @click="hide" v-if="dialogObj.hideMsg">{{
dialogObj.hideMsg
}}</el-button>
</span>
</template>
</el-dialog>
</div>
</template>
<script>
import { $on, $off, $once, $emit } from '../../../../utils/gogocodeTransfer'
export default {
props: {
dialogObj: {
type: Object,
default: () => {
return null;
}
}
return null
},
},
},
data() {
return {
}
return {}
},
created() {},
methods: {
confirm() {
this.$emit('confirm');
$emit(this, 'confirm')
},
hide() {
// this.$emit('hide');
this.dialogObj.visible = false;
}
}
this.dialogObj.visible = false
},
},
emits: ['confirm'],
}
</script>
......@@ -48,6 +56,6 @@ export default {
.tip {
margin-top: 20px;
text-align: center;
color: #C0C0C0;
color: #c0c0c0;
}
</style>
<template>
<div class="select-course-wrapper">
<div class="top-line"></div>
<el-tabs v-model="activeName" @tab-click="handleClick">
<el-tabs v-model:value="activeName" @tab-click="handleClick">
<el-tab-pane label="公共课程" name="0">
<CourseSelect></CourseSelect>
</el-tab-pane>
......@@ -9,23 +9,25 @@
<CourseSelectOrg></CourseSelectOrg>
</el-tab-pane>
</el-tabs>
<div class="top-line" style="margin-top: 20px;"></div>
<div class="top-line" style="margin-top: 20px"></div>
<CourseList @showOrgCourse="showOrgCourse"></CourseList>
</div>
</template>
<script>
import CourseSelect from '@/components/education/custom/course-select';
import CourseSelectOrg from '@/components/education/custom/course-select-org';
import CourseList from '@/components/education/custom/course-list';
import { mapActions, mapGetters } from 'vuex';
import { $on, $off, $once, $emit } from '../../../../utils/gogocodeTransfer'
import CourseSelect from '@/components/education/custom/course-select'
import CourseSelectOrg from '@/components/education/custom/course-select-org'
import CourseList from '@/components/education/custom/course-list'
import { mapActions, mapGetters } from 'vuex'
export default {
data() {
return {
activeName: '0'
activeName: '0',
}
},
computed: {
...mapGetters(['kind'])
...mapGetters(['kind']),
},
components: {
CourseSelect,
......@@ -35,22 +37,20 @@ export default {
methods: {
...mapActions(['setKind']),
handleClick() {
this.setKind(this.activeName);
this.setKind(this.activeName)
},
showOrgCourse(courseId) {
this.$emit('showOrgCourse', courseId);
},
$emit(this, 'showOrgCourse', courseId)
},
},
emits: ['showOrgCourse'],
}
</script>
<style lang="less" scoped>
.select-course-wrapper {
// min-width: 1125px;
min-width: 1300px;
.top-line {
.select-course-wrapper{/*// min-width: 1125px;*/min-width:1300px;.top-line {
// width: 120%;
height: 10px;
background: rgb(240, 242, 245);
}
}
}}
</style>
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
......@@ -27,12 +27,12 @@ gLogger.install = function (Vue, options) {
let logger = {
isDev: true,
cLevel: 'debug',
prefix: 'gLogger Says'
prefix: 'gLogger Says',
// levels: ['off', 'fatal', 'error', 'warn', 'info', 'debug', 'all']
}
if (options) {
for (const key of Object.keys(options)) {
logger[key] = options[key]
logger[key] = options[key]
}
}
logger.levels = ['off', 'fatal', 'error', 'warn', 'info', 'debug', 'all']
......@@ -44,13 +44,13 @@ gLogger.install = function (Vue, options) {
if (levelIndex === 0) return
let cLevelIndex = logger.levels.indexOf(logger.cLevel)
// 如果当前级别底,则不输出日志
if(cLevelIndex < levelIndex) return
if (cLevelIndex < levelIndex) return
let args = Array.from(arguments)
args.unshift(`[${this.prefix} :: ${level}]`.toUpperCase())
console.log(...args)
}
}
Vue.prototype.$log = logger
window.$vueApp.config.globalProperties.$log = logger
if (window) window.logger = logger
}
export default gLogger
\ No newline at end of file
export default gLogger
此差异已折叠。
此差异已折叠。
此差异已折叠。
<!-- 圈子router -->
\ No newline at end of file
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册