314 lines
6.5 KiB
Vue
314 lines
6.5 KiB
Vue
![]() |
<template>
|
|||
|
<div class="lum-dialog-mask">
|
|||
|
<div class="container animated bounceInDown" :class="{ 'full-screen': isFullScreen }">
|
|||
|
<el-container class="full-height">
|
|||
|
<el-header class="header no-padding" height="50px">
|
|||
|
<div class="tools">
|
|||
|
<span>选择编程语言: </span>
|
|||
|
<el-select v-model="language" size="mini" filterable placeholder="语言类型" :disabled="!editMode">
|
|||
|
<el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" />
|
|||
|
</el-select>
|
|||
|
</div>
|
|||
|
<i class="el-icon-close close-btn" @click="close" />
|
|||
|
<i class="iconfont icon-full-screen" :class="{
|
|||
|
'icon-tuichuquanping': isFullScreen,
|
|||
|
'icon-quanping ': !isFullScreen,
|
|||
|
}" :title="isFullScreen ? '关闭全屏模式' : '打开全屏模式'" @click="isFullScreen = !isFullScreen" />
|
|||
|
</el-header>
|
|||
|
|
|||
|
<el-main class="main no-padding">
|
|||
|
<PrismEditor class="peditor" style="border-radius: 0" :code="code" :language="language" :line-numbers="true"
|
|||
|
@change="codeChanged" />
|
|||
|
</el-main>
|
|||
|
|
|||
|
<el-footer class="footer no-padding" height="50px">
|
|||
|
<div class="code-num">
|
|||
|
<span>代码字数:{{ code.length }}字</span>
|
|||
|
<span v-show="code.length > 10000 && editMode" class="code-warning">
|
|||
|
(字数不能超过10000字)
|
|||
|
</span>
|
|||
|
</div>
|
|||
|
|
|||
|
<div class="buttom-group">
|
|||
|
<el-button size="small" plain @click="close">
|
|||
|
{{ editMode ? '取消编辑' : '关闭预览' }}
|
|||
|
</el-button>
|
|||
|
|
|||
|
<el-button v-show="editMode" type="primary" size="small" @click="submit">发送代码
|
|||
|
</el-button>
|
|||
|
</div>
|
|||
|
</el-footer>
|
|||
|
</el-container>
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
</template>
|
|||
|
<script>
|
|||
|
import PrismEditor from "vue-prism-editor";
|
|||
|
import "vue-prism-editor/dist/VuePrismEditor.css";
|
|||
|
import "prismjs/themes/prism-okaidia.css";
|
|||
|
import Vue from "vue";
|
|||
|
import { Select, Option } from "element-ui";
|
|||
|
Vue.use(Select);
|
|||
|
Vue.use(Option);
|
|||
|
|
|||
|
export default {
|
|||
|
name: "TalkCodeBlock",
|
|||
|
components: {
|
|||
|
PrismEditor,
|
|||
|
},
|
|||
|
props: {
|
|||
|
loadCode: {
|
|||
|
type: String,
|
|||
|
default: "",
|
|||
|
},
|
|||
|
loadLang: {
|
|||
|
type: String,
|
|||
|
default: "",
|
|||
|
},
|
|||
|
editMode: {
|
|||
|
type: Boolean,
|
|||
|
default: false,
|
|||
|
},
|
|||
|
},
|
|||
|
data() {
|
|||
|
return {
|
|||
|
language: "",
|
|||
|
code: "",
|
|||
|
options: [
|
|||
|
{
|
|||
|
value: "css",
|
|||
|
label: "css",
|
|||
|
},
|
|||
|
{
|
|||
|
value: "less",
|
|||
|
label: "less",
|
|||
|
},
|
|||
|
{
|
|||
|
value: "javascript",
|
|||
|
label: "javascript",
|
|||
|
},
|
|||
|
{
|
|||
|
value: "json",
|
|||
|
label: "json",
|
|||
|
},
|
|||
|
{
|
|||
|
value: "bash",
|
|||
|
label: "bash",
|
|||
|
},
|
|||
|
{
|
|||
|
value: "c",
|
|||
|
label: "c",
|
|||
|
},
|
|||
|
{
|
|||
|
value: "cil",
|
|||
|
label: "cil",
|
|||
|
},
|
|||
|
{
|
|||
|
value: "docker",
|
|||
|
label: "docker",
|
|||
|
},
|
|||
|
{
|
|||
|
value: "git",
|
|||
|
label: "git",
|
|||
|
},
|
|||
|
{
|
|||
|
value: "go",
|
|||
|
label: "go",
|
|||
|
},
|
|||
|
{
|
|||
|
value: "java",
|
|||
|
label: "java",
|
|||
|
},
|
|||
|
{
|
|||
|
value: "lua",
|
|||
|
label: "lua",
|
|||
|
},
|
|||
|
{
|
|||
|
value: "nginx",
|
|||
|
label: "nginx",
|
|||
|
},
|
|||
|
{
|
|||
|
value: "objectivec",
|
|||
|
label: "objectivec",
|
|||
|
},
|
|||
|
{
|
|||
|
value: "php",
|
|||
|
label: "php",
|
|||
|
},
|
|||
|
{
|
|||
|
value: "python",
|
|||
|
label: "python",
|
|||
|
},
|
|||
|
{
|
|||
|
value: "ruby",
|
|||
|
label: "ruby",
|
|||
|
},
|
|||
|
{
|
|||
|
value: "rust",
|
|||
|
label: "rust",
|
|||
|
},
|
|||
|
{
|
|||
|
value: "sql",
|
|||
|
label: "sql",
|
|||
|
},
|
|||
|
{
|
|||
|
value: "swift",
|
|||
|
label: "swift",
|
|||
|
},
|
|||
|
{
|
|||
|
value: "vim",
|
|||
|
label: "vim",
|
|||
|
},
|
|||
|
{
|
|||
|
value: "visual-basic",
|
|||
|
label: "visual-basic",
|
|||
|
},
|
|||
|
{
|
|||
|
value: "shell",
|
|||
|
label: "shell",
|
|||
|
},
|
|||
|
],
|
|||
|
isFullScreen: false,
|
|||
|
};
|
|||
|
},
|
|||
|
watch: {
|
|||
|
loadCode(value) {
|
|||
|
this.code = value;
|
|||
|
},
|
|||
|
loadLang(value) {
|
|||
|
this.language = value;
|
|||
|
},
|
|||
|
},
|
|||
|
created() {
|
|||
|
this.code = this.loadCode;
|
|||
|
this.language = this.loadLang;
|
|||
|
},
|
|||
|
methods: {
|
|||
|
submit() {
|
|||
|
if (!this.code) {
|
|||
|
this.$message.error("代码块不能为空...");
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (this.language == "") {
|
|||
|
this.$message.error("请选择语言");
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (this.code.length > 10000) {
|
|||
|
this.$message.error("代码字数不能超过10000字!!!");
|
|||
|
return false;
|
|||
|
}
|
|||
|
this.$emit("confirm", {
|
|||
|
language: this.language,
|
|||
|
code: this.code,
|
|||
|
});
|
|||
|
},
|
|||
|
close() {
|
|||
|
this.$emit("close");
|
|||
|
},
|
|||
|
codeChanged(code) {
|
|||
|
this.code = code;
|
|||
|
},
|
|||
|
},
|
|||
|
};
|
|||
|
</script>
|
|||
|
<style lang="less" scoped>
|
|||
|
.container {
|
|||
|
width: 80%;
|
|||
|
max-width: 800px;
|
|||
|
height: 600px;
|
|||
|
overflow: hidden;
|
|||
|
box-shadow: 0 2px 8px 0 rgba(31, 35, 41, 0.2);
|
|||
|
transition: 0.5s ease;
|
|||
|
background: #2d2d2d;
|
|||
|
|
|||
|
.header {
|
|||
|
position: relative;
|
|||
|
background-color: white;
|
|||
|
|
|||
|
.close-btn {
|
|||
|
position: absolute;
|
|||
|
right: 12px;
|
|||
|
top: 13px;
|
|||
|
font-size: 24px;
|
|||
|
cursor: pointer;
|
|||
|
}
|
|||
|
|
|||
|
.icon-full-screen {
|
|||
|
position: absolute;
|
|||
|
right: 45px;
|
|||
|
top: 13px;
|
|||
|
font-size: 20px;
|
|||
|
cursor: pointer;
|
|||
|
}
|
|||
|
|
|||
|
.tools {
|
|||
|
line-height: 50px;
|
|||
|
padding-left: 10px;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
.footer {
|
|||
|
background-color: #3c3c3c;
|
|||
|
padding-right: 20px;
|
|||
|
line-height: 50px;
|
|||
|
|
|||
|
.code-num {
|
|||
|
float: left;
|
|||
|
color: white;
|
|||
|
padding-left: 10px;
|
|||
|
font-size: 14px;
|
|||
|
}
|
|||
|
|
|||
|
.code-warning {
|
|||
|
color: red;
|
|||
|
}
|
|||
|
|
|||
|
.buttom-group {
|
|||
|
float: right;
|
|||
|
height: 100%;
|
|||
|
line-height: 50px;
|
|||
|
text-align: right;
|
|||
|
|
|||
|
button {
|
|||
|
border-radius: 0;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
.full-screen {
|
|||
|
width: 100%;
|
|||
|
height: 100%;
|
|||
|
max-width: 100%;
|
|||
|
}
|
|||
|
|
|||
|
/deep/ .el-input__inner {
|
|||
|
border-radius: 0;
|
|||
|
width: 130px;
|
|||
|
}
|
|||
|
|
|||
|
/deep/ pre {
|
|||
|
border-radius: 0;
|
|||
|
}
|
|||
|
|
|||
|
/deep/ .prism-editor-wrapper pre::-webkit-scrollbar {
|
|||
|
background-color: #272822;
|
|||
|
}
|
|||
|
|
|||
|
/deep/ .prism-editor-wrapper pre::-webkit-scrollbar-thumb {
|
|||
|
background-color: #41413f;
|
|||
|
cursor: pointer;
|
|||
|
}
|
|||
|
|
|||
|
/deep/ .prism-editor-wrapper::-webkit-scrollbar {
|
|||
|
background-color: #272822;
|
|||
|
}
|
|||
|
|
|||
|
/deep/ .prism-editor-wrapper::-webkit-scrollbar-thumb {
|
|||
|
background-color: rgb(114, 112, 112);
|
|||
|
cursor: pointer;
|
|||
|
}
|
|||
|
</style>
|