Bläddra i källkod

复制cread copy

gcj 2 år sedan
förälder
incheckning
60211957c9
1 ändrade filer med 1107 tillägg och 0 borttagningar
  1. 1107 0
      src/views/CalligraphyMaster/cread copy.vue

+ 1107 - 0
src/views/CalligraphyMaster/cread copy.vue

@@ -0,0 +1,1107 @@
+<template>
+  <div class="CalligraphyMaster-cread">
+    <Header />
+    <div class="bg_main">
+      <div class="main">
+        <div class="main-top">
+          <div class="left">
+            <span>画布设置:</span>
+            <div>
+              <span>长度</span>
+              <el-input
+                :readonly="true"
+                v-model="form.heightText"
+                style="width: 60px"
+              ></el-input>
+              <div class="add_remove">
+                <img
+                  @click="addCanvasWH('H')"
+                  src="../../assets/teacherdev/sfds-canvas-add.png"
+                  alt=""
+                />
+                <img
+                  @click="removeCanvasWH('H')"
+                  src="../../assets/teacherdev/sfds-canvas-remove.png"
+                  alt=""
+                />
+              </div>
+            </div>
+            <div>
+              <img src="../../assets/teacherdev/sfds-canvas-line.png" alt="" />
+              <span>宽度</span>
+              <el-input
+                :readonly="true"
+                v-model="form.widthText"
+                style="width: 60px"
+              ></el-input>
+              <div class="add_remove">
+                <img
+                  @click="addCanvasWH('W')"
+                  src="../../assets/teacherdev/sfds-canvas-add.png"
+                  alt=""
+                />
+                <img
+                  @click="removeCanvasWH('W')"
+                  src="../../assets/teacherdev/sfds-canvas-remove.png"
+                  alt=""
+                />
+              </div>
+            </div>
+            <div>
+              <span>背景颜色</span>
+              <el-color-picker v-model="form.bg_color"></el-color-picker>
+            </div>
+          </div>
+          <div class="right">
+            <div>
+              <img src="../../assets/teacherdev/word-save.png" alt="" />
+              保存
+            </div>
+            <div>
+              <img src="../../assets/teacherdev/sfds-fb.png" alt="" />
+              发布
+            </div>
+            <div>
+              <img src="../../assets/teacherdev/word-download.png" alt="" />
+              下载
+            </div>
+          </div>
+        </div>
+        <div
+          class="operation"
+          v-if="changeType == 'text' || changeType == 'luminance'"
+        >
+          <template v-if="changeType == 'text'">
+            <div class="text-operation">
+              <div class="font_sele">
+                <div
+                  class="font_sele_input"
+                  @click="FontFamilySele = !FontFamilySele"
+                >
+                  <span>{{ fontForm.fontFamily }}</span>
+                  <img
+                    src="../../assets/teacherdev/font-sele-down.png"
+                    alt=""
+                  />
+                </div>
+                <div v-show="FontFamilySele" class="fontFamily_list">
+                  <div class="Boutque_font">
+                    <span class="one">精品字体</span>
+                    <span
+                      v-for="(item, index) in BoutiqueFontList"
+                      :key="index + 'BoutiqueFon'"
+                      >{{ item }}</span
+                    >
+                    <span class="more">更多...</span>
+                  </div>
+                  <div
+                    class="fontFamily_one"
+                    v-for="(item, index) in fontList"
+                    :key="index + 'font'"
+                    :value="item.fontFamily"
+                  >
+                    <div class="use" v-if="item.RecentUse">
+                      <span>最近使用</span>
+                    </div>
+                    <div class="fontFamily">{{ item.fontFamily }}</div>
+                    <div class="content">
+                      <span>{{ item.content }}</span>
+                      <img
+                        v-if="item.collect"
+                        src="../../assets/teacherdev/font-collect-sele.png"
+                        alt=""
+                      />
+                      <img
+                        v-else
+                        src="../../assets/teacherdev/font-collect.png"
+                        alt=""
+                      />
+                    </div>
+                  </div>
+                </div>
+              </div>
+              <el-select
+                v-model="fontForm.fontSize"
+                style="width: 60px; margin-left: 8px"
+              >
+                <el-option
+                  v-for="(item, i) in fontSizeList"
+                  :key="i + 'fontsize'"
+                  :value="item.value"
+                  :label="item.name"
+                >
+                </el-option>
+              </el-select>
+              <el-select
+                v-model="fontForm.percent"
+                style="width: 68px; height: 32px; margin-left: 8px"
+              >
+                <el-option
+                  v-for="i in 100"
+                  :key="i + 'fontsize'"
+                  :value="i"
+                  :label="i + '%'"
+                >
+                </el-option>
+              </el-select>
+              <div class="img_dv">
+                <img src="../../assets/teacherdev/font-add.png" alt="" />
+                <img src="../../assets/teacherdev/font-remove.png" alt="" />
+                <img src="../../assets/teacherdev/font-blod.png" alt="" />
+                <img src="../../assets/teacherdev/font-red.png" alt="" />
+              </div>
+              <el-color-picker
+                v-model="fontForm.fontColor"
+                style="margin-left: 8px; width: 60px"
+              ></el-color-picker>
+              <div class="img_dv" style="margin-left: 8px">
+                <img src="../../assets/teacherdev/font-left.png" alt="" />
+                <img src="../../assets/teacherdev/font-center.png" alt="" />
+                <img src="../../assets/teacherdev/font-right.png" alt="" />
+              </div>
+              <div class="img_dv" style="margin-left: 8px">
+                <img
+                  src="../../assets/teacherdev/font-line-left-right.png"
+                  alt=""
+                />
+                <img
+                  src="../../assets/teacherdev/font-line-top-bottom.png"
+                  alt=""
+                />
+              </div>
+              <div class="img_dv" style="margin-left: 8px">
+                <img src="../../assets/teacherdev/font-italic.png" alt="" />
+                <img src="../../assets/teacherdev/font-blod2.png" alt="" />
+              </div>
+            </div>
+          </template>
+          <template v-else-if="changeType == 'luminance'">
+            <div class="luminance-operation">
+              <img
+                :style="{ filter: `brightness(${changeluminanceNumber()})` }"
+                src="../../assets/teacherdev/sun.png"
+                alt=""
+              />
+              <div class="line-text">
+                <div class="DragLine">
+                  <DragLine :min="-100" :max="100" v-model="luminanceNumber" />
+                </div>
+                <div class="text">
+                  <span>-100</span>
+                  <span>0</span>
+                  <span>+100</span>
+                </div>
+              </div>
+            </div>
+          </template>
+        </div>
+        <div
+          class="canvas"
+          :style="{
+            marginTop:
+              changeType == 'text' || changeType == 'luminance' ? 0 : '32px',
+          }"
+        >
+          <div
+            id="imgCanvas"
+            ref="imgCanvas"
+            :style="{
+              width: form.width + 'px',
+              height: form.height + 'px',
+              background: form.bg_color,
+            }"
+          ></div>
+        </div>
+        <div class="bottom">
+          <div>
+            <img src="../../assets/teacherdev/sfds-tailoring.png" alt="" />
+          </div>
+          <el-upload
+            :accept="'.png,.jpg'"
+            class="upload-demo"
+            :show-file-list="false"
+            :action="url"
+            :on-preview="handlePreview"
+            :on-remove="handleRemove"
+            :multiple="true"
+            :on-exceed="handleExceed"
+            :on-success="handleSuccess"
+            :file-list="fileList"
+            :before-remove="beforeRemove"
+            :limit="1"
+            :before-upload="handlebeforeUplaod"
+          >
+            <div>
+              <img src="../../assets/teacherdev/sfds-image.png" alt="" />
+            </div>
+          </el-upload>
+
+          <div @click="addText">
+            <img src="../../assets/teacherdev/sfds-text.png" alt="" />
+          </div>
+          <div @click="deleteImage">
+            <img src="../../assets/teacherdev/sfds-delete.png" alt="" />
+          </div>
+          <div @click="changeluminance">
+            <img src="../../assets/teacherdev/sfds-sun.png" alt="" />
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+//这里可以导入其它文件(比如:组件,工具js,第三方插件js,json文件,图片文件等等)
+//例如:import 《组件名称》from ‘《组件路径》';
+import Header from "@/components/Header";
+import DragLine from "@/components/DragLine";
+import { getToken, removeToken } from "@/utils/auth";
+import { WebFileDownload } from "@/api/api";
+
+import "tui-image-editor/dist/tui-image-editor.css";
+import "tui-color-picker/dist/tui-color-picker.css";
+import ImageEditor from "tui-image-editor";
+
+const locale_zh = {
+  ZoomIn: "放大",
+  ZoomOut: "缩小",
+  Hand: "手掌",
+  History: "历史",
+  Resize: "调整宽高",
+  Crop: "裁剪",
+  DeleteAll: "全部删除",
+  Delete: "删除",
+  Undo: "撤销",
+  Redo: "反撤销",
+  Reset: "重置",
+  Flip: "镜像",
+  Rotate: "旋转",
+  Draw: "画",
+  Shape: "形状标注",
+  Icon: "图标标注",
+  Text: "文字标注",
+  Mask: "遮罩",
+  Filter: "滤镜",
+  Bold: "加粗",
+  Italic: "斜体",
+  Underline: "下划线",
+  Left: "左对齐",
+  Center: "居中",
+  Right: "右对齐",
+  Color: "颜色",
+  "Text size": "字体大小",
+  Custom: "自定义",
+  Square: "正方形",
+  Apply: "应用",
+  Cancel: "取消",
+  "Flip X": "X 轴",
+  "Flip Y": "Y 轴",
+  Range: "区间",
+  Stroke: "描边",
+  Fill: "填充",
+  Circle: "圆",
+  Triangle: "三角",
+  Rectangle: "矩形",
+  Free: "曲线",
+  Straight: "直线",
+  Arrow: "箭头",
+  "Arrow-2": "箭头2",
+  "Arrow-3": "箭头3",
+  "Star-1": "星星1",
+  "Star-2": "星星2",
+  Polygon: "多边形",
+  Location: "定位",
+  Heart: "心形",
+  Bubble: "气泡",
+  "Custom icon": "自定义图标",
+  "Load Mask Image": "加载蒙层图片",
+  Grayscale: "灰度",
+  Blur: "模糊",
+  Sharpen: "锐化",
+  Emboss: "浮雕",
+  "Remove White": "除去白色",
+  Distance: "距离",
+  Brightness: "亮度",
+  Noise: "噪音",
+  "Color Filter": "彩色滤镜",
+  Sepia: "棕色",
+  Sepia2: "棕色2",
+  Invert: "负片",
+  Pixelate: "像素化",
+  Threshold: "阈值",
+  Tint: "色调",
+  Multiply: "正片叠底",
+  Blend: "混合色",
+  Width: "宽度",
+  Height: "高度",
+  "Lock Aspect Ratio": "锁定宽高比例",
+};
+
+const customTheme = {
+  "common.bi.image": "", // 左上角logo图片
+  "common.bisize.width": "0px",
+  "common.bisize.height": "0px",
+  "common.backgroundImage": "none",
+  "common.backgroundColor": "#f3f4f6",
+  "common.border": "1px solid #333",
+
+  // header
+  "header.backgroundImage": "none",
+  "header.backgroundColor": "#f3f4f6",
+  "header.border": "0px",
+
+  // load button
+  "loadButton.backgroundColor": "#fff",
+  "loadButton.border": "1px solid #ddd",
+  "loadButton.color": "#222",
+  "loadButton.fontFamily": "NotoSans, sans-serif",
+  "loadButton.fontSize": "12px",
+  "loadButton.display": "none", // 隐藏
+
+  // download button
+  "downloadButton.backgroundColor": "#fdba3b",
+  "downloadButton.border": "1px solid #fdba3b",
+  "downloadButton.color": "#fff",
+  "downloadButton.fontFamily": "NotoSans, sans-serif",
+  "downloadButton.fontSize": "12px",
+  "downloadButton.display": "none", // 隐藏
+
+  // icons default
+  "menu.normalIcon.color": "#8a8a8a",
+  "menu.activeIcon.color": "#555555",
+  "menu.disabledIcon.color": "#ccc",
+  "menu.hoverIcon.color": "#e9e9e9",
+  "submenu.normalIcon.color": "#8a8a8a",
+  "submenu.activeIcon.color": "#e9e9e9",
+
+  "menu.iconSize.width": "24px",
+  "menu.iconSize.height": "24px",
+  "submenu.iconSize.width": "32px",
+  "submenu.iconSize.height": "32px",
+
+  // submenu primary color
+  "submenu.backgroundColor": "#1e1e1e",
+  "submenu.partition.color": "#858585",
+
+  // submenu labels
+  "submenu.normalLabel.color": "#858585",
+  "submenu.normalLabel.fontWeight": "lighter",
+  "submenu.activeLabel.color": "#fff",
+  "submenu.activeLabel.fontWeight": "lighter",
+
+  // checkbox style
+  "checkbox.border": "1px solid #ccc",
+  "checkbox.backgroundColor": "#fff",
+
+  // rango style
+  "range.pointer.color": "#fff",
+  "range.bar.color": "#666",
+  "range.subbar.color": "#d1d1d1",
+
+  "range.disabledPointer.color": "#414141",
+  "range.disabledBar.color": "#282828",
+  "range.disabledSubbar.color": "#414141",
+
+  "range.value.color": "#fff",
+  "range.value.fontWeight": "lighter",
+  "range.value.fontSize": "11px",
+  "range.value.border": "1px solid #353535",
+  "range.value.backgroundColor": "#151515",
+  "range.title.color": "#fff",
+  "range.title.fontWeight": "lighter",
+
+  // colorpicker style
+  "colorpicker.button.border": "1px solid #1e1e1e",
+  "colorpicker.title.color": "#fff",
+};
+
+export default {
+  //import引入的组件需要注入到对象中才能使用
+  components: {
+    Header,
+    DragLine,
+  },
+  props: {},
+  data() {
+    //这里存放数据
+    return {
+      form: {
+        width: 500,
+        widthText: "500mm",
+        height: 500,
+        heightText: "500mm",
+        bg_color: "#FF3F3F",
+      },
+      BoutiqueFontList: [
+        "水墨字体",
+        "古风字体",
+        "中国风字体",
+        "书协专家字体",
+        "电影海报字体",
+        "国潮字体",
+      ],
+      fontSizeList: [
+        {
+          name: "5号",
+          value: 5,
+        },
+      ],
+      fontList: [
+        {
+          fontFamily: "方正颜真卿楷书",
+          content: "忽如一夜春风来",
+          collect: true,
+          RecentUse: true,
+        },
+        {
+          fontFamily: "方正颜真卿楷书",
+          content: "忽如一夜春风来",
+          collect: false,
+          RecentUse: false,
+        },
+        {
+          fontFamily: "方正颜真卿楷书",
+          content: "忽如一夜春风来",
+          collect: true,
+          RecentUse: true,
+        },
+        {
+          fontFamily: "方正颜真卿楷书",
+          content: "忽如一夜春风来",
+          collect: false,
+          RecentUse: false,
+        },
+        {
+          fontFamily: "方正颜真卿楷书",
+          content: "忽如一夜春风来",
+          collect: true,
+          RecentUse: true,
+        },
+        {
+          fontFamily: "方正颜真卿楷书",
+          content: "忽如一夜春风来",
+          collect: false,
+          RecentUse: false,
+        },
+        {
+          fontFamily: "方正颜真卿楷书",
+          content: "忽如一夜春风来",
+          collect: true,
+          RecentUse: true,
+        },
+        {
+          fontFamily: "方正颜真卿楷书",
+          content: "忽如一夜春风来",
+          collect: false,
+          RecentUse: false,
+        },
+        {
+          fontFamily: "方正颜真卿楷书",
+          content: "忽如一夜春风来",
+          collect: true,
+          RecentUse: true,
+        },
+        {
+          fontFamily: "方正颜真卿楷书",
+          content: "忽如一夜春风来",
+          collect: false,
+          RecentUse: false,
+        },
+      ],
+      luminanceNumber: 0,
+      changeType: "",
+      fontForm: {
+        fontFamily: "方正颜真卿楷书",
+        fontSize: 5,
+        percent: 100,
+        fontColor: "#FFFFFF",
+      },
+      FontFamilySele: false,
+      loading: false,
+      fileList: [],
+      imgCtx: null,
+      TUI_selectedItem: null,
+      TUI_selectedFont: "",
+    };
+  },
+  //计算属性 类似于data概念
+  computed: {
+    url() {
+      let userInfor = JSON.parse(getToken());
+      let UserCode = "",
+        UserType = "",
+        SessionID = "";
+      if (userInfor) {
+        UserCode = userInfor.user_code;
+        UserType = userInfor.user_type;
+        SessionID = userInfor.session_id;
+      }
+      return (
+        process.env.VUE_APP_BASE_API +
+        `/GCLSFileServer/WebFileUpload?UserCode=${UserCode}&UserType=${UserType}&SessionID=${SessionID}&SecurityLevel=Mid"`
+      );
+    },
+  },
+  //监控data中数据变化
+  watch: {},
+  //方法集合
+  methods: {
+    // 增加画布宽或高
+    addCanvasWH(type) {
+      if (type == "W") {
+        if (this.form.width == 500) {
+          this.$message.warning("已达到上限");
+          return;
+        }
+        this.form.width++;
+        this.form.widthText = this.form.width + "mm";
+      } else {
+        if (this.form.height == 500) {
+          this.$message.warning("已达到上限");
+          return;
+        }
+        this.form.height++;
+        this.form.heightText = this.form.height + "mm";
+      }
+    },
+    // 减少画布宽或高
+    removeCanvasWH(type) {
+      if (type == "W") {
+        if (this.form.width == 0) {
+          return;
+        }
+        this.form.width--;
+        this.form.widthText = this.form.width + "mm";
+      } else {
+        if (this.form.height == 0) {
+          return;
+        }
+        this.form.height--;
+        this.form.heightText = this.form.height + "mm";
+      }
+    },
+    // 添加文字
+    addText() {
+      this.changeType = "text";
+    },
+    // 修改亮度
+    changeluminance() {
+      this.changeType = "luminance";
+    },
+    // 计算css所需亮度
+    changeluminanceNumber() {
+      if (this.luminanceNumber == 0) {
+        return 1;
+      }
+      if (this.luminanceNumber > 0) {
+        return 1 + (this.luminanceNumber / 100) * 2;
+      } else {
+        return Math.abs(Math.abs(this.luminanceNumber) - 100) / 100;
+      }
+    },
+    initCanvasImage() {
+      this.loading = this.$loading({
+        lock: true,
+        text: "Loading",
+        spinner: "el-icon-loading",
+        background: "rgba(0, 0, 0, 0.7)",
+      });
+      // 直接使用跨域  请求文件流转url 再使用
+      WebFileDownload({
+        FileID: this.fileList[0].file_id,
+      }).then((res) => {
+        const objectUrl = window.URL.createObjectURL(res);
+        this.instance = new ImageEditor(document.querySelector("#imgCanvas"), {
+          includeUI: {
+            loadImage: {
+              path: objectUrl,
+              name: "image",
+            },
+            menu: [
+              "resize",
+              "crop",
+              "rotate",
+              "draw",
+              "shape",
+              "icon",
+              "text",
+              "filter",
+            ], // 底部菜单按钮列表 隐藏镜像flip和遮罩mask
+            initMenu: "draw", // 默认打开的菜单项
+            menuBarPosition: "bottom", // 菜单所在的位置
+            locale: locale_zh, // 本地化语言为中文
+            theme: customTheme, // 自定义样式
+          },
+          cssMaxWidth: this.form.width, // canvas 最大宽度
+          cssMaxHeight: this.form.heigt, // canvas 最大高度
+        });
+        let fontArray = [
+          "Arial",
+          "Arial Black",
+          "Caveat",
+          "Comic Sans MS",
+          "Courier New",
+          "Georgia1",
+          "Impact",
+          "Lobster Two",
+          "Lucida Console",
+          "Luckiest Guy",
+          "Open Sans",
+          "Pacifico",
+          "Palatino Linotype",
+          "Press Start 2P",
+          "Roboto",
+          "Tahoma",
+          "Tangerine",
+          "Times New Roman",
+          "Tourney",
+          "Ultra",
+          "Verdana",
+          "Symbol",
+          "Webdings",
+          "Wingdings",
+        ];
+
+        let fontSelectHTML =
+          '<select #fontselect class="form-select font-selector">';
+        for (let i = 0; i < fontArray.length; i++) {
+          let selected = "";
+          if (i == 0) {
+            selected = "selected";
+          }
+          fontSelectHTML +=
+            '<option style="font-family:' +
+            fontArray[i] +
+            ' !important;" value="' +
+            fontArray[i] +
+            '" ' +
+            selected +
+            ">" +
+            fontArray[i] +
+            "</option>";
+        }
+        fontSelectHTML += "</select>";
+
+        let textMenuAlign = document.querySelector(
+          ".tui-image-editor-menu-text .tie-text-align-button"
+        );
+        textMenuAlign.insertAdjacentHTML("afterbegin", fontSelectHTML);
+
+        document
+          .querySelector(".font-selector")
+          .addEventListener("change", () =>
+            this.TUI_updateFontOnText($(".font-selector option:selected").val())
+          );
+        this.instance.on("objectActivated", (props) => {
+          this.TUI_selectedItem = props;
+          this.TUI_updateFontSelected(props);
+          console.log("TUI_selectedItem", props);
+        });
+
+        this.loading.close();
+      });
+    },
+    TUI_updateFontOnText(font) {
+      console.log("TUI_updateFontOnText", font, this.TUI_selectedItem.id);
+
+      if (font) {
+        this.TUI_selectedFont = font;
+      }
+
+      if (font && this.TUI_selectedItem) {
+        this.instance.changeTextStyle(this.TUI_selectedItem.id, {
+          fontFamily: font,
+        });
+      }
+    },
+    TUI_updateFontSelected(layer) {
+      console.log("TUI_updateFontSelected", layer);
+
+      if (layer.fontFamily) {
+        document.querySelector(".font-selector").value = layer.fontFamily;
+        this.TUI_selectedFont = layer.fontFamily;
+      }
+    },
+    // 删除上传的图片
+    deleteImage() {
+      this.fileList = [];
+    },
+    handlebeforeUplaod(file) {
+      if (file.size > 20 * 1024 * 1024) {
+        this.$message.warning("上传文件大小不能超过20M");
+        return false; //必须返回false
+      }
+      this.loading = this.$loading({
+        lock: true,
+        text: "Loading",
+        spinner: "el-icon-loading",
+        background: "rgba(0, 0, 0, 0.7)",
+      });
+    },
+    handleSuccess(response, file, fileList) {
+      if (response.status == 1) {
+        this.fileList = response.file_info_list;
+        this.loading.close();
+        this.initCanvasImage();
+      } else if (response.status == -1) {
+        this.loading.close();
+        removeToken();
+        this.$message.warning(response.error);
+        this.$router.push("/login");
+      } else {
+        this.loading.close();
+      }
+    },
+    handleRemove(file, fileList) {},
+    handlePreview(file) {},
+    handleExceed(files, fileList) {
+      this.$message.warning(
+        `当前限制选择 1 个文件,本次选择了 ${files.length} 个文件,共选择了 ${
+          files.length + fileList.length
+        } 个文件`
+      );
+    },
+    beforeRemove(file, filleList) {},
+  },
+  //生命周期 - 创建完成(可以访问当前this实例)
+  created() {},
+  //生命周期 - 挂载完成(可以访问DOM元素)
+  mounted() {},
+  //生命周期-创建之前
+  beforeCreated() {},
+  //生命周期-挂载之前
+  beforeMount() {},
+  //生命周期-更新之前
+  beforUpdate() {},
+  //生命周期-更新之后
+  updated() {},
+  //生命周期-销毁之前
+  beforeDestory() {},
+  //生命周期-销毁完成
+  destoryed() {},
+  //如果页面有keep-alive缓存功能,这个函数会触发
+  activated() {},
+};
+</script>
+<style lang="scss" scoped>
+/* @import url(); 引入css类 */
+.CalligraphyMaster-cread {
+  height: 100%;
+  position: relative;
+  .bg_main {
+    background: #f7f7f7;
+    min-height: 100%;
+    padding-top: 24px;
+    padding-bottom: 70px;
+    .main {
+      width: 1168px;
+      margin: 0 auto;
+      padding: 16px;
+      background: #ffffff;
+      .main-top {
+        display: flex;
+        justify-content: space-between;
+        .left {
+          display: flex;
+          align-items: center;
+          font-weight: 400;
+          font-size: 14px;
+          color: #000000;
+          > div {
+            display: flex;
+            align-items: center;
+            margin-right: 8px;
+            > img {
+              width: 16px;
+              height: 16px;
+              margin-right: 8px;
+            }
+            .add_remove {
+              display: flex;
+              flex-wrap: wrap;
+              align-items: center;
+              width: 10px;
+              margin-left: 8px;
+              img {
+                width: 10px;
+                height: 10px;
+                cursor: pointer;
+              }
+              > :nth-child(1) {
+                margin-bottom: 1px;
+              }
+            }
+          }
+          span {
+            margin-right: 8px;
+          }
+        }
+        .right {
+          display: flex;
+          div {
+            margin-left: 16px;
+            width: 96px;
+            height: 40px;
+            background: #ffffff;
+            border: 1px solid rgba(0, 0, 0, 0.08);
+            border-radius: 4px;
+            display: flex;
+            align-items: center;
+            justify-content: center;
+            cursor: pointer;
+            img {
+              width: 24px;
+              height: 24px;
+              margin-right: 8px;
+            }
+          }
+        }
+      }
+      .operation {
+        margin-top: 33px;
+      }
+      .text-operation {
+        height: 48px;
+        border: 1px solid rgba(0, 0, 0, 0.08);
+        border-radius: 8px 8px 0px 0px;
+        border-bottom: none;
+        display: flex;
+        align-items: center;
+        padding: 0 16px;
+        .font_sele {
+          position: relative;
+          .font_sele_input {
+            width: 193px;
+            height: 32px;
+            padding: 0 6px;
+            background: #ffffff;
+            border: 1px solid rgba(0, 0, 0, 0.08);
+            border-radius: 4px;
+            display: flex;
+            align-items: center;
+            justify-content: space-between;
+            cursor: pointer;
+            > span {
+              font-weight: 400;
+              font-size: 14px;
+              line-height: 20px;
+              color: #000000;
+            }
+            > img {
+              width: 16px;
+              height: 16px;
+            }
+          }
+
+          .fontFamily_list {
+            position: absolute;
+            top: 39px;
+            left: 0;
+            width: 468px;
+            background: #ffffff;
+            border-width: 0px 1px 1px 1px;
+            border-style: solid;
+            border-color: #dbdbdb;
+            height: 520px;
+            overflow: auto;
+            .fontFamily_one {
+              padding: 12px 24px 16px 32px;
+              border-bottom: 1px solid rgba(0, 0, 0, 0.08);
+              position: relative;
+              .use {
+                width: 80px;
+                height: 80px;
+                background: url("../../assets/teacherdev/font-use.png");
+                background-size: cover;
+                position: absolute;
+                left: -20px;
+                top: -20px;
+                -webkit-transform: scale(0.5);
+
+                span {
+                  color: #ffffff;
+                  font-weight: 400;
+                  font-size: 16px;
+                  position: absolute;
+                  transform: translateX(-3px) translateY(20px) rotate(-45deg);
+                }
+              }
+              .fontFamily {
+                font-weight: 400;
+                font-size: 14px;
+                line-height: 20px;
+                color: rgba(0, 0, 0, 0.5);
+              }
+              .content {
+                margin-top: 8px;
+                display: flex;
+                justify-content: space-between;
+                span {
+                  font-weight: 400;
+                  font-size: 32px;
+                  line-height: 150%;
+                  color: #000000;
+                }
+                img {
+                  width: 24px;
+                  height: 24px;
+                  cursor: pointer;
+                }
+              }
+            }
+          }
+        }
+        .Boutque_font {
+          padding: 16px 12px 0 12px;
+          background: #f0f0f0;
+          font-weight: 400;
+          font-size: 14px;
+          line-height: 20px;
+          color: rgba(0, 0, 0, 0.6);
+          cursor: default;
+          span {
+            display: inline-block;
+            margin: 0 12px 12px 12px;
+          }
+          .one {
+            color: #000000;
+          }
+          .more {
+            color: rgba(0, 0, 0, 0.35);
+            cursor: pointer;
+          }
+        }
+        .img_dv {
+          img {
+            width: 26px;
+            height: 26px;
+            cursor: pointer;
+            margin-left: 8px;
+          }
+        }
+      }
+      .luminance-operation {
+        width: 440px;
+        margin: 0 auto;
+        display: flex;
+        > img {
+          width: 24px;
+          height: 24px;
+        }
+        .line-text {
+          margin-left: 17px;
+          .DragLine {
+            margin-top: 7px;
+          }
+          .text {
+            margin-top: 8px;
+            display: flex;
+            justify-content: space-between;
+            font-weight: 400;
+            font-size: 12px;
+            line-height: 20px;
+            color: #919c9e;
+          }
+        }
+      }
+      .canvas {
+        height: 500px;
+        border: 1px solid rgba(0, 0, 0, 0.1);
+        display: flex;
+        justify-content: center;
+        align-items: center;
+      }
+      .bottom {
+        margin-top: 40px;
+        display: flex;
+        justify-content: center;
+        div {
+          width: 48px;
+          height: 40px;
+          background: #ffffff;
+          border: 1px solid rgba(0, 0, 0, 0.08);
+          border-radius: 4px;
+          display: flex;
+          align-items: center;
+          justify-content: center;
+          cursor: pointer;
+          margin: 0 16px;
+          img {
+            width: 32px;
+            height: 32px;
+          }
+        }
+      }
+    }
+  }
+}
+</style>
+<style lang="scss">
+.CalligraphyMaster-cread {
+  .main-top {
+    .left {
+      .el-input__inner {
+        padding: 0 5px;
+      }
+      .el-color-picker__color {
+        border: none;
+      }
+      .el-icon-close:before {
+        content: "";
+      }
+      .el-icon-arrow-down:before {
+        content: "";
+      }
+      .el-color-picker__color-inner {
+        position: absolute;
+        left: 3px;
+        top: 3px;
+        right: 0;
+        bottom: 0;
+        width: 24px;
+        height: 24px;
+      }
+    }
+  }
+
+  .text-operation {
+    .el-color-picker__trigger {
+      width: 60px;
+      height: 32px;
+    }
+    .el-color-picker__empty,
+    .el-color-picker__icon {
+      left: 72%;
+    }
+    .el-color-picker__color {
+      width: 28px;
+    }
+    .el-icon-close:before,
+    .el-icon-arrow-down:before {
+      color: gray;
+    }
+    .el-color-picker__color-inner {
+      position: absolute;
+      left: -1px;
+      top: -1px;
+      right: 0;
+      bottom: 0;
+      width: 100%;
+      height: 100%;
+      border: 1px solid rgba(0, 0, 0, 0.08);
+      border-radius: 2px;
+    }
+    .el-input__inner {
+      padding: 0 8px;
+    }
+    .el-input__inner,
+    .el-input__suffix {
+      height: 32px;
+    }
+    .el-input__icon {
+      line-height: 32px;
+    }
+  }
+}
+</style>