edit.vue 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. <template>
  2. <div class="app-container">
  3. <el-backtop />
  4. <el-row :gutter="20">
  5. <el-col :span="16">
  6. <el-form
  7. ref="dialogForm"
  8. :rules="formRules"
  9. :model="formData"
  10. size="mini"
  11. label-position="top"
  12. >
  13. <el-form-item prop="groupId" label="组名称">
  14. <el-select
  15. v-model="formData.groupId"
  16. placeholder="选择模板所在组"
  17. >
  18. <el-option
  19. v-for="item in groupData"
  20. :key="item.id"
  21. :label="item.groupName"
  22. :value="item.id"
  23. >
  24. {{ item.groupName }}
  25. </el-option>
  26. </el-select>
  27. </el-form-item>
  28. <el-form-item prop="name" label="模板名称">
  29. <el-input v-model="formData.name" show-word-limit maxlength="64" />
  30. </el-form-item>
  31. <el-form-item prop="fileName" label="文件名称">
  32. <el-input v-model="formData.fileName" placeholder="可使用velocity变量" show-word-limit maxlength="100" />
  33. </el-form-item>
  34. <el-form-item prop="content" label="模板内容">
  35. <el-link type="primary" :underline="false" href="https://www.cnblogs.com/codingsilence/archive/2011/03/29/2146580.html" target="_blank">Velocity语法</el-link>
  36. <codemirror
  37. ref="editor"
  38. v-model="formData.content"
  39. :options="cmOptions"
  40. />
  41. </el-form-item>
  42. </el-form>
  43. <el-button type="primary" @click="onSave">保 存</el-button>
  44. <el-button @click="goRoute('/template/list')">返 回</el-button>
  45. </el-col>
  46. <el-col :span="8">
  47. <h3>Velocity变量</h3>
  48. <p class="velocity-tip">
  49. 点击变量直接插入
  50. </p>
  51. <el-tabs v-model="activeName" type="card" @tab-click="onTabClick">
  52. <el-tab-pane v-for="item in velocityConfig" :key="item.name" :label="item.label" :name="item.name" :content="item" />
  53. </el-tabs>
  54. <div v-for="item in treeData" :key="item.expression" class="velocity-var">
  55. <div v-if="!item.children">
  56. <li>
  57. <a @click="onExpressionClick(item.expression)">{{ item.expression }}</a>:{{ item.text }}
  58. </li>
  59. </div>
  60. <div v-else>
  61. <h4>{{ item.expression }}</h4>
  62. <li v-for="child in item.children" :key="child.expression">
  63. <a @click="onExpressionClick(child.expression)">{{ child.expression }}</a>:{{ child.text }}
  64. </li>
  65. </div>
  66. </div>
  67. </el-col>
  68. </el-row>
  69. </div>
  70. </template>
  71. <style>
  72. .el-form-item--mini .el-form-item__content,
  73. .el-form-item--mini .el-form-item__label,
  74. .el-form-item__content {
  75. line-height: 20px;
  76. }
  77. .velocity-tip {
  78. color: #606266;
  79. font-size: 13px;
  80. }
  81. .velocity-var {}
  82. .velocity-var li {
  83. font-size: 14px;
  84. color: #606266;
  85. line-height: 26px;
  86. }
  87. .velocity-var a {
  88. color: #409EFF;
  89. font-weight: 500;
  90. }
  91. .velocity-var a:hover {
  92. color: rgba(64, 158, 255, 0.75);
  93. }
  94. </style>
  95. <script>
  96. import { codemirror } from 'vue-codemirror'
  97. import 'codemirror/theme/neat.css'
  98. require('codemirror/mode/velocity/velocity')
  99. export default {
  100. components: { codemirror },
  101. data() {
  102. return {
  103. groupData: {},
  104. formData: {
  105. id: 0,
  106. groupId: '',
  107. groupName: '',
  108. name: '',
  109. fileName: '',
  110. content: ''
  111. },
  112. formRules: {
  113. groupId: [
  114. { required: true, message: '不能为空', trigger: 'blur' }
  115. ],
  116. name: [
  117. { required: true, message: '不能为空', trigger: 'blur' }
  118. ],
  119. fileName: [
  120. { required: true, message: '不能为空', trigger: 'blur' }
  121. ],
  122. content: [
  123. { required: true, message: '不能为空', trigger: 'blur' }
  124. ]
  125. },
  126. cmOptions: {
  127. value: '',
  128. mode: 'text/velocity',
  129. theme: 'neat',
  130. lineNumbers: true,
  131. readOnly: false
  132. },
  133. isVelocityBarFixed: false,
  134. // tree
  135. activeName: 'java',
  136. treeData: [],
  137. velocityConfig: [],
  138. defaultProps: {
  139. children: 'children',
  140. label: 'text'
  141. }
  142. }
  143. },
  144. created() {
  145. const id = this.$route.params.id || 0
  146. if (id > 0) {
  147. this.post(`/template/get/${id}`, {}, function(resp) {
  148. this.formData = resp.data
  149. })
  150. }
  151. this.loadVelocityVar()
  152. this.loadGroups(this.$route.query.groupId)
  153. },
  154. methods: {
  155. loadVelocityVar() {
  156. this.getFile(`velocity/java.json?q=${new Date().getTime()}`, content => {
  157. this.velocityConfig.push({
  158. name: 'java',
  159. label: 'Java变量',
  160. data: content.data
  161. })
  162. this.treeData = content.data
  163. })
  164. this.getFile(`velocity/csharp.json?q=${new Date().getTime()}`, content => {
  165. this.velocityConfig.push({
  166. name: 'csharp',
  167. label: 'C#变量',
  168. data: content.data
  169. })
  170. })
  171. },
  172. loadGroups(groupId) {
  173. this.post(`/group/list/`, {}, function(resp) {
  174. this.groupData = resp.data
  175. if (!groupId && this.groupData.length > 0) {
  176. groupId = this.groupData[0].id
  177. }
  178. if (groupId) {
  179. this.formData.groupId = parseInt(groupId);
  180. }
  181. })
  182. },
  183. onExpressionClick(exp) {
  184. const codemirror = this.$refs.editor.codemirror
  185. // 插入表达式
  186. codemirror.replaceSelection(exp)
  187. // 重新获得光标
  188. codemirror.focus()
  189. },
  190. onSave() {
  191. this.$refs.dialogForm.validate((valid) => {
  192. if (valid) {
  193. const opt = this.formData.id ? 'update' : 'add'
  194. const uri = `/template/${opt}`
  195. this.post(uri, this.formData, resp => {
  196. if (opt === 'add') {
  197. this.formData.id = resp.data.id
  198. }
  199. this.tip('保存成功')
  200. })
  201. }
  202. })
  203. },
  204. onTabClick(tab) {
  205. const item = tab.$attrs.content
  206. this.treeData = item.data
  207. }
  208. }
  209. }
  210. </script>