Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
VueElementTemplate
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
JIRA
JIRA
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
黄瑜
VueElementTemplate
Commits
c412d17b
Commit
c412d17b
authored
Jun 14, 2017
by
Pan
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
refine tinymce && tinymce demo
parent
09deec1e
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
11 additions
and
491 deletions
+11
-491
editorAudio.vue
src/components/Tinymce/components/editorAudio.vue
+0
-119
editorImage.vue
src/components/Tinymce/components/editorImage.vue
+0
-88
editorSlide.vue
src/components/Tinymce/components/editorSlide.vue
+0
-82
editorVideo.vue
src/components/Tinymce/components/editorVideo.vue
+0
-167
index.vue
src/components/Tinymce/index.vue
+1
-27
tinymce.vue
src/views/components/tinymce.vue
+10
-8
No files found.
src/components/Tinymce/components/editorAudio.vue
deleted
100644 → 0
View file @
09deec1e
<
template
>
<div
class=
"upload-container"
>
<el-button
:style=
"
{background:color,borderColor:color}" @click=" dialogVisible=true" type="primary">上传音频
</el-button>
<el-dialog
v-model=
"dialogVisible"
>
<el-form
ref=
"form"
:model=
"form"
:rules=
"rules"
label-width=
"100px"
label-position=
"right"
>
<el-upload
class=
"editor-audio-upload"
action=
"https://upload.qbox.me"
:data=
"dataObj"
:show-file-list=
"true"
:file-list=
"audioList"
:on-success=
"handleAudioScucess"
:on-change=
"handleAudioChange"
:before-upload=
"audioBeforeUpload"
>
<el-button
size=
"small"
type=
"primary"
>
上传音频
</el-button>
</el-upload>
<el-form-item
prop=
"url"
label=
"音频URL"
>
<el-input
v-model=
"form.url"
></el-input>
</el-form-item>
<el-form-item
prop=
"title"
label=
"音频标题"
>
<el-input
v-model=
"form.title"
></el-input>
</el-form-item>
<el-form-item
label=
"音频文本"
>
<el-input
type=
"textarea"
:autosize=
"
{ minRows: 2}" v-model="form.text">
</el-input>
</el-form-item>
</el-form>
<el-button
@
click=
"dialogVisible = false"
>
取 消
</el-button>
<el-button
type=
"primary"
@
click=
"handleSubmit"
>
确 定
</el-button>
</el-dialog>
</div>
</
template
>
<
script
>
import
{
getToken
}
from
'api/qiniu'
;
export
default
{
name
:
'editorAudioUpload'
,
props
:
{
color
:
{
type
:
String
,
default
:
'#20a0ff'
}
},
data
()
{
return
{
dialogVisible
:
false
,
dataObj
:
{
token
:
''
,
key
:
''
},
audioList
:
[],
tempAudioUrl
:
''
,
form
:
{
title
:
''
,
url
:
''
,
text
:
''
},
rules
:
{
title
:
[
{
required
:
true
,
trigger
:
'blur'
}
],
url
:
[
{
required
:
true
,
trigger
:
'blur'
}
]
}
};
},
methods
:
{
handleSubmit
()
{
this
.
$refs
.
form
.
validate
(
valid
=>
{
if
(
valid
)
{
this
.
$emit
(
'successCBK'
,
this
.
form
);
this
.
dialogVisible
=
false
;
this
.
form
=
{
title
:
''
,
url
:
''
,
text
:
''
}
}
else
{
this
.
$message
(
'填写有误'
);
return
false
;
}
});
},
handleAudioChange
(
file
,
fileList
)
{
this
.
audioList
=
fileList
.
slice
(
-
1
);
},
handleAudioScucess
()
{
this
.
form
.
url
=
this
.
tempAudioUrl
},
audioBeforeUpload
()
{
const
_self
=
this
;
return
new
Promise
((
resolve
,
reject
)
=>
{
getToken
().
then
(
response
=>
{
const
key
=
response
.
data
.
qiniu_key
;
const
token
=
response
.
data
.
qiniu_token
;
_self
.
_data
.
dataObj
.
token
=
token
;
_self
.
_data
.
dataObj
.
key
=
key
;
this
.
tempAudioUrl
=
response
.
data
.
qiniu_url
;
resolve
(
true
);
}).
catch
(
err
=>
{
console
.
log
(
err
);
reject
(
false
)
});
});
}
}
};
</
script
>
<
style
rel=
"stylesheet/scss"
lang=
"scss"
scoped
>
.upload-container
{
.editor-audio-upload
{
button
{
float
:
left
;
margin-left
:
30px
;
margin-bottom
:
20px
;
}
}
}
</
style
>
src/components/Tinymce/components/editorImage.vue
deleted
100644 → 0
View file @
09deec1e
<
template
>
<div
class=
"upload-container"
>
<el-button
icon=
'upload'
:style=
"
{background:color,borderColor:color}" @click=" dialogVisible=true" type="primary">上传图片
</el-button>
<el-dialog
v-model=
"dialogVisible"
>
<el-upload
class=
"editor-slide-upload"
action=
"https://httpbin.org/post"
:data=
"dataObj"
:multiple=
"true"
:file-list=
"fileList"
:show-file-list=
"true"
list-type=
"picture-card"
:on-remove=
"handleRemove"
:on-success=
"handleImageScucess"
>
<el-button
size=
"small"
type=
"primary"
>
点击上传
</el-button>
</el-upload>
<el-button
@
click=
"dialogVisible = false"
>
取 消
</el-button>
<el-button
type=
"primary"
@
click=
"handleSubmit"
>
确 定
</el-button>
</el-dialog>
</div>
</
template
>
<
script
>
import
{
getToken
}
from
'api/qiniu'
;
export
default
{
name
:
'editorSlideUpload'
,
props
:
{
color
:
{
type
:
String
,
default
:
'#20a0ff'
}
},
data
()
{
return
{
dialogVisible
:
false
,
dataObj
:
{
token
:
''
,
key
:
''
},
list
:
[],
fileList
:
[]
};
},
methods
:
{
handleSubmit
()
{
const
arr
=
this
.
list
.
map
(
v
=>
v
.
url
);
this
.
$emit
(
'successCBK'
,
arr
);
this
.
list
=
[];
this
.
fileList
=
[];
this
.
dialogVisible
=
false
;
},
handleRemove
(
file
)
{
const
key
=
file
.
response
.
key
;
for
(
let
i
=
0
,
len
=
this
.
list
.
length
;
i
<
len
;
i
++
)
{
if
(
this
.
list
[
i
].
key
===
key
)
{
this
.
list
.
splice
(
i
,
1
);
return
}
}
},
handleImageScucess
(
file
)
{
this
.
list
.
push
({
url
:
file
.
files
.
file
});
},
beforeUpload
()
{
const
_self
=
this
;
return
new
Promise
((
resolve
,
reject
)
=>
{
getToken
().
then
(
response
=>
{
const
key
=
response
.
data
.
qiniu_key
;
const
token
=
response
.
data
.
qiniu_token
;
_self
.
_data
.
dataObj
.
token
=
token
;
_self
.
_data
.
dataObj
.
key
=
key
;
this
.
list
.
push
({
key
,
url
:
response
.
data
.
qiniu_url
});
resolve
(
true
);
}).
catch
(
err
=>
{
console
.
log
(
err
);
reject
(
false
)
});
});
}
}
};
</
script
>
<
style
rel=
"stylesheet/scss"
lang=
"scss"
scoped
>
.upload-container
{
.editor-slide-upload
{
margin-bottom
:
20px
;
}
}
</
style
>
src/components/Tinymce/components/editorSlide.vue
deleted
100644 → 0
View file @
09deec1e
<
template
>
<div
class=
"upload-container"
>
<el-button
:style=
"
{background:color,borderColor:color}" @click=" dialogVisible=true" type="primary">上传轮播图
</el-button>
<el-dialog
v-model=
"dialogVisible"
>
<el-upload
class=
"editor-slide-upload"
action=
"https://upload.qbox.me"
:data=
"dataObj"
:multiple=
"true"
:show-file-list=
"true"
list-type=
"picture-card"
:on-remove=
"handleRemove"
:before-upload=
"beforeUpload"
>
<el-button
size=
"small"
type=
"primary"
>
点击上传
</el-button>
</el-upload>
<el-button
@
click=
"dialogVisible = false"
>
取 消
</el-button>
<el-button
type=
"primary"
@
click=
"handleSubmit"
>
确 定
</el-button>
</el-dialog>
</div>
</
template
>
<
script
>
import
{
getToken
}
from
'api/qiniu'
;
export
default
{
name
:
'editorSlideUpload'
,
props
:
{
color
:
{
type
:
String
,
default
:
'#20a0ff'
}
},
data
()
{
return
{
dialogVisible
:
false
,
dataObj
:
{
token
:
''
,
key
:
''
},
list
:
[]
};
},
methods
:
{
handleSubmit
()
{
const
arr
=
this
.
list
.
map
(
v
=>
v
.
url
);
this
.
$emit
(
'successCBK'
,
arr
);
this
.
list
=
[];
this
.
dialogVisible
=
false
;
},
handleRemove
(
file
)
{
const
key
=
file
.
response
.
key
;
for
(
let
i
=
0
,
len
=
this
.
list
.
length
;
i
<
len
;
i
++
)
{
if
(
this
.
list
[
i
].
key
===
key
)
{
this
.
list
.
splice
(
i
,
1
);
return
}
}
},
beforeUpload
()
{
const
_self
=
this
;
return
new
Promise
((
resolve
,
reject
)
=>
{
getToken
().
then
(
response
=>
{
const
key
=
response
.
data
.
qiniu_key
;
const
token
=
response
.
data
.
qiniu_token
;
_self
.
_data
.
dataObj
.
token
=
token
;
_self
.
_data
.
dataObj
.
key
=
key
;
this
.
list
.
push
({
key
,
url
:
response
.
data
.
qiniu_url
});
resolve
(
true
);
}).
catch
(
err
=>
{
console
.
log
(
err
);
reject
(
false
)
});
});
}
}
};
</
script
>
<
style
rel=
"stylesheet/scss"
lang=
"scss"
scoped
>
.upload-container
{
.editor-slide-upload
{
margin-bottom
:
20px
;
}
}
</
style
>
src/components/Tinymce/components/editorVideo.vue
deleted
100644 → 0
View file @
09deec1e
<
template
>
<div
class=
"upload-container"
>
<el-button
:style=
"
{background:color,borderColor:color}" @click=" dialogVisible=true" type="primary">上传视频
</el-button>
<el-dialog
v-model=
"dialogVisible"
>
<el-form
ref=
"form"
:model=
"form"
:rules=
"rules"
label-width=
"140px"
label-position=
"left"
>
<el-upload
class=
"editor-video-upload"
action=
"https://upload.qbox.me"
:data=
"dataObj"
:show-file-list=
"true"
:file-list=
"videoList"
:on-success=
"handleVideoScucess"
:on-change=
"handleVideoChange"
:before-upload=
"videoBeforeUpload"
>
<el-button
size=
"small"
type=
"primary"
>
上传视频
</el-button>
</el-upload>
<el-form-item
prop=
"url"
label=
"视频URL"
>
<el-input
v-model=
"form.url"
></el-input>
</el-form-item>
<el-form-item
prop=
"title"
label=
"视频标题"
>
<el-input
v-model=
"form.title"
></el-input>
</el-form-item>
<el-form-item
label=
"上传视频封面图"
>
</el-form-item>
<el-upload
class=
"image-uploader"
action=
"https://upload.qbox.me"
:show-file-list=
"false"
:data=
"dataObj"
:on-success=
"handleImageScucess"
:before-upload=
"beforeImageUpload"
>
<img
v-if=
"form.image"
:src=
"form.image"
class=
"image-uploader-image"
>
<i
v-else
class=
"el-icon-plus avatar-uploader-icon"
></i>
</el-upload>
</el-form>
<el-button
@
click=
"dialogVisible = false"
>
取 消
</el-button>
<el-button
type=
"primary"
@
click=
"handleSubmit"
>
确 定
</el-button>
</el-dialog>
</div>
</
template
>
<
script
>
import
{
getToken
}
from
'api/qiniu'
;
export
default
{
name
:
'editorVideoUpload'
,
props
:
{
color
:
{
type
:
String
,
default
:
'#20a0ff'
}
},
data
()
{
return
{
dialogVisible
:
false
,
dataObj
:
{
token
:
''
,
key
:
''
},
videoList
:
[],
tempVideoUrl
:
''
,
tempImageUrl
:
''
,
form
:
{
title
:
''
,
url
:
''
,
image
:
''
},
rules
:
{
url
:
[
{
required
:
true
,
trigger
:
'blur'
}
],
title
:
[
{
required
:
true
,
trigger
:
'blur'
}
]
}
};
},
methods
:
{
handleSubmit
()
{
this
.
$refs
.
form
.
validate
(
valid
=>
{
if
(
valid
)
{
if
(
this
.
form
.
image
.
length
>
0
)
{
this
.
$emit
(
'successCBK'
,
this
.
form
);
this
.
dialogVisible
=
false
;
this
.
form
=
{
title
:
''
,
url
:
''
,
image
:
''
}
}
else
{
this
.
$message
(
'请上传图片'
);
}
}
else
{
this
.
$message
(
'填写有误'
);
return
false
;
}
});
},
handleVideoChange
(
file
,
fileList
)
{
this
.
videoList
=
fileList
.
slice
(
-
1
);
},
handleVideoScucess
()
{
this
.
form
.
url
=
this
.
tempVideoUrl
},
videoBeforeUpload
()
{
const
_self
=
this
;
return
new
Promise
((
resolve
,
reject
)
=>
{
getToken
().
then
(
response
=>
{
const
key
=
response
.
data
.
qiniu_key
;
const
token
=
response
.
data
.
qiniu_token
;
_self
.
_data
.
dataObj
.
token
=
token
;
_self
.
_data
.
dataObj
.
key
=
key
;
this
.
tempVideoUrl
=
response
.
data
.
qiniu_url
;
resolve
(
true
);
}).
catch
(
err
=>
{
console
.
log
(
err
);
reject
(
false
)
});
});
},
handleImageScucess
()
{
this
.
form
.
image
=
this
.
tempImageUrl
},
beforeImageUpload
()
{
const
_self
=
this
;
return
new
Promise
((
resolve
,
reject
)
=>
{
getToken
().
then
(
response
=>
{
const
key
=
response
.
data
.
qiniu_key
;
const
token
=
response
.
data
.
qiniu_token
;
_self
.
_data
.
dataObj
.
token
=
token
;
_self
.
_data
.
dataObj
.
key
=
key
;
this
.
tempImageUrl
=
response
.
data
.
qiniu_url
;
resolve
(
true
);
}).
catch
(
err
=>
{
console
.
log
(
err
);
reject
(
false
)
});
});
}
}
};
</
script
>
<
style
rel=
"stylesheet/scss"
lang=
"scss"
scoped
>
.upload-container
{
.editor-video-upload
{
button
{
float
:
left
;
}
}
.image-uploader
{
margin
:
5px
auto
;
width
:
400px
;
height
:
200px
;
border
:
1px
dashed
#d9d9d9
;
border-radius
:
6px
;
cursor
:
pointer
;
position
:
relative
;
overflow
:
hidden
;
line-height
:
200px
;
i
{
font-size
:
28px
;
color
:
#8c939d
;
}
.image-uploader-image
{
height
:
200px
;
}
}
}
</
style
>
src/components/Tinymce/index.vue
View file @
c412d17b
<
template
>
<
template
>
<div
class=
'tinymce-container editor-container'
>
<div
class=
'tinymce-container editor-container'
>
<textarea
class=
'tinymce-textarea'
:id=
"id"
></textarea>
<textarea
class=
'tinymce-textarea'
:id=
"id"
></textarea>
<!--业务需求可删除-->
<div
class=
"editor-custom-btn-container"
>
<editorSlide
v-if=
"customButton.indexOf('editorSlide')>=0"
color=
"#3A71A8"
class=
"editor-upload-btn"
@
successCBK=
"slideSuccessCBK"
></editorSlide>
<editorAudio
v-if=
"customButton.indexOf('editorAudio')>=0"
color=
"#30B08F"
class=
"editor-upload-btn"
@
successCBK=
"aduioSuccessCBK"
></editorAudio>
<editorVideo
v-if=
"customButton.indexOf('editorVideo')>=0"
color=
"#E65D6E"
class=
"editor-upload-btn"
@
successCBK=
"videoSuccessCBK"
></editorVideo>
<editorImage
v-if=
"customButton.indexOf('editorImage')>=0"
color=
"#20a0ff"
class=
"editor-upload-btn"
@
successCBK=
"imageSuccessCBK"
></editorImage>
<!--业务需求可删除-->
</div>
</div>
</div>
</
template
>
</
template
>
<
script
>
<
script
>
// tinymce 在最外层目录static下 ,由index.html直接引入,挂载在window下。不通过impot,不打包
// 业务需求可删除
import
editorAudio
from
'./components/editorAudio'
;
import
editorVideo
from
'./components/editorVideo'
;
import
editorSlide
from
'./components/editorSlide'
;
import
editorImage
from
'./components/editorImage'
;
// import { getToken, upload } from 'api/qiniu'; // 七牛
// import { getToken, upload } from 'api/qiniu'; // 七牛
// 业务需求可删除
export
default
{
export
default
{
name
:
'tinymce'
,
name
:
'tinymce'
,
components
:
{
editorImage
,
editorAudio
,
editorSlide
,
editorVideo
},
// 业务需求可删除
props
:
{
props
:
{
id
:
{
id
:
{
type
:
String
,
type
:
String
,
...
@@ -33,13 +17,6 @@
...
@@ -33,13 +17,6 @@
type
:
String
,
type
:
String
,
default
:
''
default
:
''
},
},
customButton
:
{
type
:
Array
,
required
:
false
,
default
()
{
return
[
'editorAudio'
,
'editorImage'
]
}
},
toolbar
:
{
toolbar
:
{
type
:
Array
,
type
:
Array
,
required
:
false
,
required
:
false
,
...
@@ -92,15 +69,12 @@
...
@@ -92,15 +69,12 @@
imagetools_toolbar
:
'watermark'
,
imagetools_toolbar
:
'watermark'
,
default_link_target
:
'_blank'
,
default_link_target
:
'_blank'
,
link_title
:
false
,
link_title
:
false
,
textcolor_map
:
[
'1482f0'
,
'1482f0'
,
'4595e6'
,
'4595e6'
],
init_instance_callback
:
editor
=>
{
init_instance_callback
:
editor
=>
{
if
(
_this
.
value
)
{
if
(
_this
.
value
)
{
editor
.
setContent
(
_this
.
value
)
editor
.
setContent
(
_this
.
value
)
}
}
_this
.
hasInit
=
true
;
_this
.
hasInit
=
true
;
editor
.
on
(
'
Change
'
,
()
=>
{
editor
.
on
(
'
NodeChange Change KeyUp
'
,
()
=>
{
this
.
hasChange
=
true
;
this
.
hasChange
=
true
;
this
.
$emit
(
'input'
,
editor
.
getContent
({
format
:
'raw'
}));
this
.
$emit
(
'input'
,
editor
.
getContent
({
format
:
'raw'
}));
});
});
...
...
src/views/components/tinymce.vue
View file @
c412d17b
<
template
>
<
template
>
<div
class=
"components-container"
>
<div
class=
"components-container"
>
<code>
公司做的后台主要是一个cms系统,公司也是以自媒体为核心的,所以富文本是后台很核心的功能。在选择富文本的过程中也走了不少的弯路,市面上常见的富文本都基本用过了,最终选择了
tinymce
</code>
<code>
公司做的后台主要是一个cms系统,公司也是以自媒体为核心的,所以富文本是后台很核心的功能。在选择富文本的过程中也走了不少的弯路,市面上常见的富文本都基本用过了,最终选择了
Tinymce
<a
target=
'_blank'
href=
'https://segmentfault.com/a/1190000009762198#articleHeader13'
>
相关文章
</a>
</code>
<div
class=
"editor-container"
>
<div>
<Tinymce
:height=
200
ref=
"editor"
v-model=
"content"
></Tinymce>
<Tinymce
:height=
200
ref=
"editor"
v-model=
"content"
></Tinymce>
</div>
</div>
<!--
<div
class=
'editor-content'
>
<div
class=
'editor-content'
v-html=
'content'
></div>
{{
content
}}
</div>
-->
</div>
</div>
</
template
>
</
template
>
<
script
>
<
script
>
import
Tinymce
from
'components/Tinymce'
;
import
Tinymce
from
'components/Tinymce'
;
...
@@ -18,11 +17,14 @@
...
@@ -18,11 +17,14 @@
return
{
return
{
content
:
'Tinymce'
content
:
'Tinymce'
}
}
},
methods
:
{
}
}
};
};
</
script
>
</
script
>
<
style
scoped
>
.editor-content
{
margin-top
:
20px
;
}
</
style
>
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment