From 089bf5d2378b3c4a61d795b2a92bede2c193b771 Mon Sep 17 00:00:00 2001
From: admin <344137771@qq.com>
Date: Tue, 06 Jan 2026 11:22:58 +0800
Subject: [PATCH] 1

---
 src/components/chat/TalkCodeBlock.vue |  340 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 340 insertions(+), 0 deletions(-)

diff --git a/src/components/chat/TalkCodeBlock.vue b/src/components/chat/TalkCodeBlock.vue
new file mode 100644
index 0000000..54111d7
--- /dev/null
+++ b/src/components/chat/TalkCodeBlock.vue
@@ -0,0 +1,340 @@
+<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>选择编程语言:&nbsp;&nbsp;</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) {
+        alert('代码块不能为空...')
+        return false
+      }
+
+      if (this.language == '') {
+        alert('请选择语言类型...')
+        return false
+      }
+
+      if (this.code.length > 10000) {
+        alert('代码字数不能超过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;
+  border-radius: 5px;
+
+  .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;
+    }
+  }
+}
+
+.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>

--
Gitblit v1.9.3