create.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. <?php
  2. use common\helpers\ComponentHelper;
  3. ComponentHelper::loadComponentView('com-attachment');
  4. ComponentHelper::loadComponentView('com-image');
  5. ComponentHelper::loadComponentView('com-rich-text');
  6. ?>
  7. <div id="app" v-cloak>
  8. <el-card shadow="never" style="border:0" class="box-card" body-style="background-color: #f3f3f3;padding: 10px 0 0;" class="box-card" v-loading="cardLoading">
  9. <div slot="header">
  10. <span>应用添加</span>
  11. </div>
  12. <div class="form-body">
  13. <el-form :model="formData" :rules="rules" size="small" ref="ruleForm" v-loading="loading" label-width="80px">
  14. <el-form-item label="插件名称" prop="title">
  15. <el-input placeholder="请输入插件名称" v-model="formData.title" type="text"></el-input>
  16. <p class="tips-text">显示在用户的插件列表中. 长度不要超过20个字符</p>
  17. </el-form-item>
  18. <el-form-item label="插件标识" prop="name">
  19. <el-input placeholder="请输入插件名称" v-model="formData.name" type="text"></el-input>
  20. <p class="tips-text">应对应插件文件夹的名称, 系统按照此标识符查找插件定义, 只能英文和下划线组成,建议大写驼峰,例如:TestAddons</p>
  21. </el-form-item>
  22. <el-form-item label="插件图标" prop="cover">
  23. <com-attachment v-model="formData.cover" :multiple="false" :max="1">
  24. <el-tooltip class="item" effect="dark" content="建议尺寸:50 * 50"
  25. placement="top">
  26. <el-button size="mini">选择图片</el-button>
  27. </el-tooltip>
  28. </com-attachment>
  29. <div class="customize-share-title">
  30. <com-image mode="aspectFill" width='80px' height='80px'
  31. :src="formData.cover ? formData.cover : ''"></com-image>
  32. <el-button v-if="formData.cover" class="del-btn" size="mini"
  33. type="danger" icon="el-icon-close" circle
  34. @click="formData.cover = ''"></el-button>
  35. </div>
  36. </el-form-item>
  37. <el-form-item label="插件分组" prop="addons_group">
  38. <el-select v-model="formData.group" class="select">
  39. <el-option v-for="item,key in addons_group" :key="item.name" :label="item.title" :value="item.name"></el-option>
  40. </el-select>
  41. </el-form-item>
  42. <el-form-item label="作者" prop="author">
  43. <el-input placeholder="请输入作者名称" v-model="formData.author" type="text"></el-input>
  44. </el-form-item>
  45. <el-form-item label="版本" prop="version">
  46. <el-input placeholder="请输入应用版本" v-model="formData.version" type="text"></el-input>
  47. <p class="tips-text">此版本号用于插件的版本更新,如:1.2.4</p>
  48. </el-form-item>
  49. <el-form-item label="插件简介" prop="brief_introduction">
  50. <el-input type="textarea" :rows="5" placeholder="请输入插件简介,最多140个字符" v-model="formData.brief_introduction" type="text"></el-input>
  51. </el-form-item>
  52. <el-form-item label="插件描述" prop="description">
  53. <com-rich-text v-model="formData.description" ></com-rich-text>
  54. <p class="tips-text">详细介绍插件的功能和使用方法</p>
  55. </el-form-item>
  56. <el-form-item label="后台菜单">
  57. <el-col :span="24">
  58. <el-table :data="formData.addons_menu.backend" border>
  59. <el-table-column label="名称" style="text-align: center;">
  60. <template slot-scope="scope">
  61. <el-input v-model="scope.row.title" placeholder="首页管理"></el-input>
  62. </template>
  63. </el-table-column>
  64. <el-table-column label="路由">
  65. <template slot-scope="scope">
  66. <el-input v-model="scope.row.route" placeholder="test/index"></el-input>
  67. </template>
  68. </el-table-column>
  69. <el-table-column label="图标">
  70. <template slot-scope="scope">
  71. <el-input v-model="scope.row.icon" placeholder="el-icon-chat-dot-round"></el-input>
  72. </template>
  73. </el-table-column>
  74. <el-table-column label="参数">
  75. <template slot-scope="scope">
  76. <el-input v-model="scope.row.params" placeholder=""></el-input>
  77. </template>
  78. </el-table-column>
  79. <el-table-column label="操作" width="100">
  80. <template slot-scope="scope">
  81. <el-button type="danger" @click="deleteItem(scope.row,scope.$index)" icon="el-icon-delete" size="mini" circle></el-button>
  82. </template>
  83. </el-table-column>
  84. </el-table>
  85. <el-button type="primary" icon="el-icon-circle-plus-outline" @click="addItem()">添加菜单</el-button>
  86. </el-col>
  87. </el-form-item>
  88. <el-form-item label="安装文件" prop="install">
  89. <el-input placeholder="请输入安装文件" v-model="formData.install" type="text"></el-input>
  90. <p class="tips-text">当前插件全新安装时所执行的脚本, 指定为单个的php脚本文件, 如: Install.php</p>
  91. </el-form-item>
  92. <el-form-item label="卸载文件" prop="uninstall">
  93. <el-input placeholder="请输入卸载文件" v-model="formData.uninstall" type="text"></el-input>
  94. <p class="tips-text">当前插件卸载时所执行的脚本, 指定为单个的php脚本文件, 如: UnInstall.php</p>
  95. </el-form-item>
  96. <el-form-item label="更新文件" prop="upgrade">
  97. <el-input placeholder="请输入更新文件" v-model="formData.upgrade" type="text"></el-input>
  98. <p class="tips-text">当前插件更新时所执行的脚本, 指定为单个的php脚本文件, 如: Upgrade.php</p>
  99. </el-form-item>
  100. </el-form>
  101. <el-button :loading="btnLoading" class="button-item" type="primary" style="margin-top: 24px;" @click="save('ruleForm')" size="small">保存
  102. </el-button>
  103. </div>
  104. </el-card>
  105. </div>
  106. <script>
  107. const app = new Vue({
  108. el: '#app',
  109. data() {
  110. return {
  111. formData: {
  112. title: '',
  113. name: '',
  114. cover: '',
  115. group: [],
  116. author: '',
  117. version: '',
  118. brief_introduction:'',
  119. description:'',
  120. addons_menu: {
  121. backend: [
  122. {
  123. title:'',
  124. route:'',
  125. icon:'',
  126. params:''
  127. }
  128. ]
  129. },
  130. install:'Install',
  131. uninstall:'Uninstall',
  132. upgrade:'Upgrade',
  133. },
  134. addons_group: {},
  135. loading: false,
  136. btnLoading: false,
  137. rules: {
  138. title: [
  139. { required: true, message: '请输入活动标题', trigger: 'blur' },
  140. { min: 2, max: 20, message: '长度在 2 到 20 个字符', trigger: 'blur' }
  141. ],
  142. name: [{ required: true, message: '请输入插件标识', trigger: 'blur' }],
  143. group: [{ required: true, message: '请选择插件分组', trigger: 'blur' }],
  144. author: [{ required: true, message: '请输入作者名称', trigger: 'blur' }],
  145. version: [{ required: true, message: '请输入版本号', trigger: 'blur' }],
  146. install: [{ required: true, message: '请输入安装文件名称', trigger: 'blur' }],
  147. uninstall: [{ required: true, message: '请输入卸载文件名称', trigger: 'blur' }],
  148. upgrade: [{ required: true, message: '请输入更新文件名称', trigger: 'blur' }]
  149. },
  150. cardLoading: false
  151. }
  152. },
  153. watch: {
  154. },
  155. mounted: function() {
  156. this.loadData();
  157. },
  158. methods: {
  159. loadData() {
  160. this.loading = true;
  161. request({
  162. params: {
  163. r: 'admin/addons/create',
  164. },
  165. method: 'get',
  166. data: {}
  167. }).then(e => {
  168. this.loading = false;
  169. if (e.data.code === 0) {
  170. this.addons_group = e.data.data.addons_group;
  171. } else {
  172. this.$message.error(e.data.msg);
  173. }
  174. }).catch(e => {
  175. });
  176. },
  177. getSpanArr(data) {
  178. this.spanArr = [];
  179. for (var i = 0; i < data.length; i++) {
  180. if (i === 0) {
  181. this.spanArr.push(1);
  182. this.pos = 0
  183. } else {
  184. // 判断当前元素与上一个元素是否相同
  185. if (data[i].level === data[i - 1].level) {
  186. this.spanArr[this.pos] += 1;
  187. this.spanArr.push(0);
  188. } else {
  189. this.spanArr.push(1);
  190. this.pos = i;
  191. }
  192. }
  193. }
  194. },
  195. // 1.0.1 新增item
  196. addItem(row) {
  197. let leverItem = {
  198. title:'',
  199. route:'',
  200. icon:'',
  201. params:''
  202. }
  203. let addons_menu = JSON.parse(JSON.stringify(this.formData.addons_menu.backend))
  204. addons_menu.push(leverItem);
  205. this.formData.addons_menu.backend = addons_menu;
  206. },
  207. // 1.0.2 删除item
  208. deleteItem(row, index) {
  209. let addons_menu = JSON.parse(JSON.stringify(this.formData.addons_menu.backend));
  210. let leverCount = 0; //计一下被删除lever的同等级个数
  211. addons_menu.forEach((item, index) => {
  212. leverCount = item.level == row.level ? leverCount + 1 : leverCount;
  213. })
  214. if (leverCount == 1) { //只出现一次就初始化
  215. addons_menu[index].times = 0;
  216. addons_menu[index].money = 0;
  217. } else { //否则删除当前item
  218. addons_menu.splice(index, 1);
  219. }
  220. this.getSpanArr(addons_menu);
  221. this.formData.addons_menu.backend = addons_menu;
  222. },
  223. save(formName) {
  224. //保存
  225. this.$refs[formName].validate((valid) => {
  226. if (valid) {
  227. this.submitConfirm()
  228. } else {
  229. this.$message({
  230. showClose: true,
  231. message: '必填信息不能为空',
  232. type: 'error'
  233. });
  234. }
  235. });
  236. },
  237. submitConfirm() {
  238. console.log(this.formData)
  239. this.$request({
  240. params: {
  241. r: 'admin/addons/create'
  242. },
  243. data: this.formData,
  244. method: 'post'
  245. }).then(res => {
  246. if (res.data.code == 0) {
  247. this.$message({
  248. message: '保存成功!',
  249. type: 'success'
  250. });
  251. localStorage.setItem('open_menu_2_id', localStorage.getItem('admin_addons_menu_id'));// 为了菜单准确跳回列表
  252. navigateTo({r: 'admin/addons/index'});
  253. } else {
  254. this.$message.error(res.data.msg);
  255. }
  256. }).catch(err => {
  257. console.log(err, 'error')
  258. })
  259. },
  260. },
  261. });
  262. </script>