256 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			HTML
		
	
	
	
			
		
		
	
	
			256 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			HTML
		
	
	
	
| <!DOCTYPE html>
 | ||
| <html lang="en">
 | ||
| 
 | ||
| <head>
 | ||
|     <meta charset="UTF-8">
 | ||
|     <title>Admin Console</title>
 | ||
|     <link rel="icon" href="/assets/favicon.ico" type="image/x-icon" />
 | ||
|     <link rel="bookmark" href="/assets/favicon.ico" type="image/x-icon" />
 | ||
|     <link href="/assets/vuetify-v2.6.9/vuetify-v2.6.9.min.css" rel="stylesheet" />
 | ||
|     <link href="/assets/vuetify-v2.6.9/materialdesignicons.min.css" rel="stylesheet">
 | ||
|     <link href="/assets/input.css" rel="stylesheet">
 | ||
|     <link href="/assets/editor-md/css/editormd.css" rel="stylesheet" />
 | ||
| 
 | ||
|     <script src="/assets/vue/vue.min.js"></script>
 | ||
|     <script src="/assets/vuetify-v2.6.9/vuetify-v2.6.9.min.js"></script>
 | ||
|     <script src="/assets/axios/axios.min.js"></script>
 | ||
|     <script src="/assets/editor-md/lib/jquery.min.js"></script>
 | ||
|     <script src="/assets/editor-md/editormd.js"></script>
 | ||
|     <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no, minimal-ui">
 | ||
| </head>
 | ||
| 
 | ||
| <body>
 | ||
|     <div id="app"></div>
 | ||
| </body>
 | ||
| <script type="text/x-template" id="app-template">
 | ||
|     <v-app id="inspire">
 | ||
|         #{ render "common/bar-admin.html" . }
 | ||
| 
 | ||
|         <v-main class="grey lighten-3">
 | ||
|             <v-container style="height: 100%">
 | ||
|                 <v-row style="height: 100%">
 | ||
|                     <v-col cols="12" sm="2">
 | ||
|                         <v-sheet min-height="100%">
 | ||
| 
 | ||
|                             <v-textarea outlined label="标题" rows="2" v-model="article.title"></v-textarea>
 | ||
|                             <v-textarea outlined label="子标题" rows="2" v-model="article.subTitle"></v-textarea>
 | ||
|                             <v-textarea outlined label="概要" rows="2" v-model="article.previous"></v-textarea>
 | ||
|                             <!-- <v-textarea outlined label="标签" rows="2" v-model="article.tags"></v-textarea> -->
 | ||
|                             <v-combobox chips clearable multiple solo label="标签" v-model="tags">
 | ||
|                                 <template v-slot:selection="{ attrs, item, select, selected }">
 | ||
|                                     <v-chip v-bind="attrs" :input-value="selected" close @click:close="remove(item)">
 | ||
|                                         <strong>{{ item }}</strong> 
 | ||
|                                     </v-chip>
 | ||
|                                 </template>
 | ||
|                             </v-combobox>
 | ||
|                             <!-- <v-btn color="primary" tile @click="publishArticle">发布</v-btn> -->
 | ||
|                             <v-btn color="primary" tile @click="saveArticle">保存</v-btn>
 | ||
| 
 | ||
|                         </v-sheet>
 | ||
|                     </v-col>
 | ||
|                     <v-col cols="12" sm="10">
 | ||
|                         <v-sheet min-height="100%">
 | ||
|                             <div id="editor"></div>
 | ||
|                         </v-sheet>
 | ||
|                     </v-col>
 | ||
| 
 | ||
| 
 | ||
|                 </v-row>
 | ||
|             </v-container>
 | ||
|         </v-main>
 | ||
|     </v-app>
 | ||
| </script>
 | ||
| 
 | ||
| <script type="text/x-template" id="content">#{.content}</script>
 | ||
| 
 | ||
| <script>
 | ||
|     var markdownEditor;
 | ||
|     new Vue({
 | ||
|         el: '#app',
 | ||
|         template: '#app-template',
 | ||
|         computed: {
 | ||
|             tags: {
 | ||
|                 get() {
 | ||
|                     let result = []
 | ||
|                     if (this.article.tags.length == 0) {
 | ||
|                         return result
 | ||
|                     }
 | ||
|                     return this.article.tags.split(",")
 | ||
|                 },
 | ||
|                 set(val) {
 | ||
|                     // console.log(val);
 | ||
|                     this.article.tags = val.join(",")
 | ||
|                 }
 | ||
|             }
 | ||
| 
 | ||
|         },
 | ||
|         data: {
 | ||
|             group: null,
 | ||
|             drawer: false,
 | ||
|             loading: false,
 | ||
| 
 | ||
|             article: {
 | ||
|                 id: '#{.blogArticle.Id}',
 | ||
|                 title: '#{.blogArticle.Title}',
 | ||
|                 subTitle: '#{.blogArticle.SubTitle}',
 | ||
|                 previous: '#{.blogArticle.Previous}',
 | ||
|                 contentType: 'markdown',
 | ||
|                 tags: '#{.blogArticle.Tags}',
 | ||
|                 content: null,
 | ||
|             },
 | ||
|         },
 | ||
|         methods: {
 | ||
|             remove(item) {
 | ||
|                 let arr = this.article.tags.split(",")
 | ||
|                 let idx = this.tags.indexOf(item)
 | ||
|                 arr.splice(idx, 1)
 | ||
|                 this.tags = arr
 | ||
|             },
 | ||
| 
 | ||
|             saveArticle() {
 | ||
|                 let content = markdownEditor.getMarkdown();       // 获取 Markdown 源码
 | ||
|                 // let src2 = testEditor.getHTML();           // 获取 Textarea 保存的 HTML 源码
 | ||
|                 // let previewed = testEditor.getPreviewedHTML();  // 获取预览窗口里的 HTML,在开启 watch 且没有开启 saveHTMLToTextarea 时使用
 | ||
|                 this.article.content = content
 | ||
| 
 | ||
|                 let url = '/admin/article/submit'
 | ||
|                 // if (this.article.id && this.article.id !== '') {
 | ||
|                 //     url = '/admin/article/update'
 | ||
|                 // }
 | ||
|                 console.log(this.article)
 | ||
| 
 | ||
|                 axios.post(url, this.article).then(function (response) {
 | ||
|                     console.log(response);
 | ||
|                     location.href = '/admin/article'
 | ||
|                 }).catch(function (error) {
 | ||
|                     console.log(error);
 | ||
|                 });
 | ||
|             },
 | ||
|             publishArticle() {
 | ||
|                 let src1 = markdownEditor.getMarkdown();       // 获取 Markdown 源码
 | ||
|                 let src2 = markdownEditor.getHTML();           // 获取 Textarea 保存的 HTML 源码
 | ||
|                 let src3 = markdownEditor.getPreviewedHTML();  // 获取预览窗口里的 HTML,在开启 watch 且没有开启 saveHTMLToTextarea 时使用
 | ||
| 
 | ||
|                 // console.log(src1);
 | ||
|                 // console.log(src2);
 | ||
|                 // console.log(src3);
 | ||
|             },
 | ||
|             getArticle(id) {
 | ||
|                 return axios.get('/admin/article/get/' + id)
 | ||
|             },
 | ||
|             iniEditor(content) {
 | ||
|                 markdownEditor = editormd("editor", {
 | ||
|                     width: "100%",
 | ||
|                     height: 740,
 | ||
|                     path: '/assets/editor-md/lib/',
 | ||
|                     // theme: "dark",
 | ||
|                     // previewTheme: "dark",
 | ||
|                     // editorTheme: "pastel-on-dark",
 | ||
|                     markdown: content ? content : '',
 | ||
|                     codeFold: true,
 | ||
|                     //syncScrolling : false,
 | ||
|                     saveHTMLToTextarea: true,    // 保存 HTML 到 Textarea
 | ||
|                     searchReplace: true,
 | ||
|                     //watch : false,                // 关闭实时预览
 | ||
|                     htmlDecode: "style,script,iframe|on*",            // 开启 HTML 标签解析,为了安全性,默认不开启
 | ||
|                     //toolbar  : false,             //关闭工具栏
 | ||
|                     // previewCodeHighlight : false, // 关闭预览 HTML 的代码块高亮,默认开启
 | ||
|                     emoji: true,
 | ||
|                     taskList: true,
 | ||
|                     tocm: true,         // Using [TOCM]
 | ||
|                     tex: true,                   // 开启科学公式TeX语言支持,默认关闭
 | ||
|                     flowChart: true,             // 开启流程图支持,默认关闭
 | ||
|                     sequenceDiagram: true,       // 开启时序/序列图支持,默认关闭,
 | ||
|                     //dialogLockScreen : false,   // 设置弹出层对话框不锁屏,全局通用,默认为true
 | ||
|                     //dialogShowMask : false,     // 设置弹出层对话框显示透明遮罩层,全局通用,默认为true
 | ||
|                     //dialogDraggable : false,    // 设置弹出层对话框不可拖动,全局通用,默认为true
 | ||
|                     //dialogMaskOpacity : 0.4,    // 设置透明遮罩层的透明度,全局通用,默认值为0.1
 | ||
|                     //dialogMaskBgColor : "#000", // 设置透明遮罩层的背景颜色,全局通用,默认为#fff
 | ||
|                     imageUpload: true,
 | ||
|                     imageFormats: ["jpg", "jpeg", "gif", "png", "bmp", "webp"],
 | ||
|                     imageUploadURL: "/admin/file/upload",
 | ||
|                     // crossDomainUpload:true,
 | ||
|                     // onload : function() {
 | ||
|                     //     console.log('onload', this);
 | ||
|                     //     //this.fullscreen();
 | ||
|                     //     //this.unwatch();
 | ||
|                     //     //this.watch().fullscreen();
 | ||
|                     //
 | ||
|                     //     //this.setMarkdown("#PHP");
 | ||
|                     //     //this.width("100%");
 | ||
|                     //     //this.height(480);
 | ||
|                     //     //this.resize("100%", 640);
 | ||
|                     // }
 | ||
|                 });
 | ||
|                 // $.get('test.md', function(md){
 | ||
|                 //
 | ||
|                 // });
 | ||
| 
 | ||
|                 $("#goto-line-btn").bind("click", function () {
 | ||
|                     markdownEditor.gotoLine(90);
 | ||
|                 });
 | ||
| 
 | ||
|                 $("#show-btn").bind('click', function () {
 | ||
|                     markdownEditor.show();
 | ||
|                 });
 | ||
| 
 | ||
|                 $("#hide-btn").bind('click', function () {
 | ||
|                     markdownEditor.hide();
 | ||
|                 });
 | ||
| 
 | ||
|                 $("#get-md-btn").bind('click', function () {
 | ||
|                     alert(markdownEditor.getMarkdown());
 | ||
|                 });
 | ||
| 
 | ||
|                 $("#get-html-btn").bind('click', function () {
 | ||
|                     alert(markdownEditor.getHTML());
 | ||
|                 });
 | ||
| 
 | ||
|                 $("#watch-btn").bind('click', function () {
 | ||
|                     markdownEditor.watch();
 | ||
|                 });
 | ||
| 
 | ||
|                 $("#unwatch-btn").bind('click', function () {
 | ||
|                     markdownEditor.unwatch();
 | ||
|                 });
 | ||
| 
 | ||
|                 $("#preview-btn").bind('click', function () {
 | ||
|                     markdownEditor.previewing();
 | ||
|                 });
 | ||
| 
 | ||
|                 $("#fullscreen-btn").bind('click', function () {
 | ||
|                     markdownEditor.fullscreen();
 | ||
|                 });
 | ||
| 
 | ||
|                 $("#show-toolbar-btn").bind('click', function () {
 | ||
|                     markdownEditor.showToolbar();
 | ||
|                 });
 | ||
| 
 | ||
|                 $("#close-toolbar-btn").bind('click', function () {
 | ||
|                     markdownEditor.hideToolbar();
 | ||
|                 });
 | ||
| 
 | ||
|                 $("#toc-menu-btn").click(function () {
 | ||
|                     markdownEditor.config({
 | ||
|                         tocDropdown: true,
 | ||
|                         tocTitle: "目录 Table of Contents",
 | ||
|                     });
 | ||
|                 });
 | ||
| 
 | ||
|                 $("#toc-default-btn").click(function () {
 | ||
|                     markdownEditor.config("tocDropdown", false);
 | ||
|                 });
 | ||
|             }
 | ||
| 
 | ||
| 
 | ||
|         },
 | ||
|         mounted() {
 | ||
|             let content = document.getElementById('content')
 | ||
|             this.iniEditor(content.innerText)
 | ||
|         },
 | ||
|         vuetify: new Vuetify(),
 | ||
|     })
 | ||
| 
 | ||
| </script>
 | ||
| 
 | ||
| </html> |