<!doctype html> <html lang="en" class="no-js"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"/> <meta name="description" content="码农随笔,个人随笔是一个面向IT技术人员,提供个人平时工作总结和在线记录学习笔记,个人技术博客,在线云笔记,码农笔录,最新的技术博客,www.aiprose.com"> <meta name="keywords" content="码农随笔,个人随笔,博客,个人博客,个人笔记,技术博客,免费云笔记,云笔记,随笔,IT博客,谷歌地图,码农笔录,aiprose"> <title>我的笔记 - 码农随笔</title> <script type="text/javascript" src="/static/js/vue.min.js"></script> <link rel="stylesheet" href="/static/css/iview.css"> <script src="/static/js/iview.min.js"></script> <script type="text/javascript" src="https://cdn.bootcss.com/jquery/3.4.0/jquery.min.js"></script> <link rel="stylesheet" href="/static/editor/css/index.css"> <script src="/static/editor/mavon-editor.js"></script> <script src="https://cdn.bootcdn.net/ajax/libs/axios/0.19.2/axios.js"></script> <style> html, body { height: 100%; min-height: 100%; } main { margin-top: 0 !important; margin-bottom: 0 !important; background-color: #f5f4e9; } #vue-app { height: 100%; } .v-note-wrapper { height: 100%; z-index: 99 !important; } .v-note-wrapper .v-note-op { padding-left: 40px !important; } .ivu-menu-png { z-index: 1000; position: fixed; left: 10px; top: 5px; } .ivu-drawer-body { scrollbar-width: none; /* firefox */ -ms-overflow-style: none; /* IE 10+ */ overflow-x: hidden; overflow-y: auto; } ::-webkit-scrollbar { display: none; /* Chrome Safari */ } </style> </head> <body> <div id="vue-app"> <div class="ivu-menu-png" @click="drawer = true"> <img src="/static/img/imenu.png" alt="" width="30" height="30"> </div> <Modal v-model="modal1" title="笔记信息" :mask-closable="false" @on-ok="okHandler" @on-cancel="cancelHandler"> <i-form :label-width="100"> <form-item label="文件夹名称"> <i-select v-model="currentNote.Pid"> <i-option v-for="item in noteCols" :value="item.id" :key="item.id">${ item.title }</i-option> </i-select> </form-item> <form-item label="笔记名称"> <i-input type="text" v-model="currentNote.Title" placeholder="请输入笔记名称"/> </form-item> </i-form> </Modal> <Modal v-model="modal2" title="新增文件夹" :mask-closable="false" @on-ok="okColHandler"> <i-form :label-width="100"> <form-item label="文件夹名称"> <i-input type="text" v-model="colTitle" placeholder="请输入文件夹名称"/> </form-item> </i-form> </Modal> <mavon-editor :externalLink="externalLink" :toolbars="toolbars" v-model="meval" @imgAdd="$imgAdd" @save="saveHandler" @change="changeHandler" ref=md></mavon-editor> <Drawer title="目录选择" placement="left" :closable="false" v-model="drawer" width="400"> <i-button type="primary" ghost long @click="newNoteColHandler">新建文件夹</i-button> <i-button type="success" ghost long style="margin-top: 5px" @click="newNoteHandler">新建笔记</i-button> <i-menu theme="light" accordion="true" width="380" @on-select="noteSelectHandler"> <Submenu :name="item.Id" v-for="(item,key) in notes" :key="key"> <template slot="title"> <i class="ivu-icon ivu-icon-ios-paper"></i> ${item.Title} </template> <menu-item :name="note.Id" v-for="(note,nkey) in item.Notes" :key="nkey">${note.Title} <Icon type="md-trash" style="float: right" @click="delHandler(note.Id)"/> </menu-item> </Submenu> </i-menu> </Drawer> </div> </body> <script> var app = new Vue({ delimiters: ['${', '}'], el: '#vue-app', components: { 'mavon-editor': MavonEditor.mavonEditor }, data: { modal2: false, modal1: false, drawer: false, colTitle: '', externalLink: { // markdown_css: function() { // // 这是你的markdown css文件路径 // return '/markdown/github-markdown.min.css'; // }, katex_css: function () { // 这是你的katex配色方案路径路径 return '/katex/katex.min.css'; }, katex_js: function () { // 这是你的katex.js路径 return '/katex/katex.min.js'; }, }, toolbars: { bold: true, // 粗体 italic: true, // 斜体 header: true, // 标题 underline: true, // 下划线 strikethrough: true, // 中划线 mark: true, // 标记 superscript: true, // 上角标 subscript: true, // 下角标 quote: true, // 引用 ol: true, // 有序列表 ul: true, // 无序列表 link: true, // 链接 imagelink: true, // 图片链接 code: true, // code table: true, // 表格 //fullscreen: true, // 全屏编辑 readmodel: true, // 沉浸式阅读 htmlcode: true, // 展示html源码 help: true, // 帮助 /* 1.3.5 */ undo: true, // 上一步 //redo: true, // 下一步 trash: true, // 清空 save: true, // 保存(触发events中的save事件) /* 1.4.2 */ navigation: true, // 导航目录 /* 2.1.8 */ alignleft: true, // 左对齐 aligncenter: true, // 居中 alignright: true, // 右对齐 /* 2.2.1 */ subfield: true, // 单双栏模式 preview: true, // 预览 menu: true, // 预览 }, notes: [], currentNote: {}, meval: '', noteCols: [] }, mounted: function () { var _this = this var noteCahche = window.localStorage.getItem("note") if (noteCahche) { this.currentNote = JSON.parse(noteCahche) this.meval = this.currentNote.NoteVal } this.getData() // $vm.$emit('imgAdd', pos, $file); this.$refs.md.$on("imgAdd",(pos, $file)=>{ _this.$imgAdd(pos, $file) }) }, methods: { $imgAdd(pos, $file){ debugger var _this = this // 第一步.将图片上传到服务器. var formdata = new FormData(); formdata.append('image', $file); axios({ url: '/file/upload', method: 'post', data: formdata, headers: { 'Content-Type': 'multipart/form-data' }, }).then((resp) => { _this.$refs.md.$img2Url(pos, resp.data.Data); }) }, delHandler (id){ var _this = this if(!id){ return } $.post('/api/note/del/' + id, function (data) { if (data.Status == 0) { this.currentNote = {} this.meval = '' _this.getData() _this.$Notice.success({ title: '删除成功', desc: '' }) } else if (data.Status == 401) { window.location.href = "/login" } else if (data.Status == 403) { this.$Notice.warning({ title: '暂无权限', desc: '' }) } else { _this.$Notice.error({ title: '删除失败', desc: '' }) } }, 'json') }, newNoteColHandler(){ this.modal2 = true }, getData(){ var _this = this $.get("/api/note", function (data, status) { _this.notes = data data.forEach((el) => { _this.noteCols.push({title: el.Title, id: el.Id}) }) }) }, okColHandler() { var _this = this if(!this.colTitle){ return } $.post('/api/notecoll/save', { title: this.colTitle }, function (data) { if (data.Status == 500) { _this.$Notice.error({ title: '保存失败', desc: '' }) } else if (data.Status == 401) { window.location.href = "/login" } else { _this.getData() _this.$Notice.success({ title: '保存成功', desc: '' }) } }, 'json') }, changeHandler: function (value, render) { this.currentNote.NoteVal = value this.currentNote.NoteHtml = render var jsonStr = JSON.stringify(this.currentNote); window.localStorage.setItem("note", jsonStr) }, newNoteHandler() { this.currentNote = {} this.meval = '' }, okHandler() { var _this = this if (!this.currentNote.Pid) { this.$Notice.warning({ title: '请选择文件夹后重新保存', desc: '' }) return } if (!this.currentNote.Title) { this.$Notice.warning({ title: '请输入笔记名称后重新保存', desc: '' }) return } $.post('/api/note/save/', { pid: this.currentNote.Pid, title: this.currentNote.Title, noteHtml: this.currentNote.NoteHtml, noteVal: this.currentNote.NoteVal }, function (data) { if (data.Status == 500) { _this.$Notice.error({ title: '保存失败', desc: '' }) } else if (data.Status == 401) { window.location.href = "/login" } else { _this.currentNote.Id = data.Id _this.$Notice.success({ title: '保存成功', desc: '' }) } }, 'json') }, cancelHandler() { this.$Notice.warning({ title: '笔记没有被保存!!!', desc: '' }) }, noteSelectHandler(id) { var _this = this this.notes.forEach((item) => { item.Notes.forEach((note) => { if (id == note.Id) { _this.currentNote = note _this.meval = note.NoteVal ? note.NoteVal : note.NoteHtml } }) }) }, saveHandler(value, render) { this.currentNote.NoteVal = value this.currentNote.NoteHtml = render if (!this.currentNote.Id) { this.modal1 = true } else { this.editHandler(value, render) } }, editHandler(value, render) { var _this = this $.post('/api/note/edit/' + this.currentNote.Id, { noteHtml: render, noteVal: value }, function (data) { if (data.Status == 0) { _this.$Notice.success({ title: '保存成功', desc: '' }) } else if (data.Status == 401) { window.location.href = "/login" } else { _this.$Notice.error({ title: '保存失败', desc: '' }) } }, 'json') } } }) </script> </html>