menu-detail.vue 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. <style scoped>
  2. .user-panel {
  3. margin: 10px auto;
  4. }
  5. </style>
  6. <template>
  7. <el-dialog
  8. :visible.sync="showDialog"
  9. :title="modalTitle"
  10. :modal-append-to-body="false"
  11. style="text-align:left;"
  12. @close="closeDialog"
  13. >
  14. <div class="user-panel" v-loading="loading">
  15. <el-form ref="form" :model="formModel" :rules="ruleValidate" :label-width="'100px'">
  16. <el-form-item label="菜单名称" prop="menuName">
  17. <el-input v-model="formModel.menuName" placeholder="请输入菜单名称" style="width:300px"></el-input>
  18. </el-form-item>
  19. <el-form-item label="上级菜单" prop="parentId">
  20. <el-select
  21. v-model="formModel.parentId"
  22. filterable
  23. remote
  24. clearable
  25. placeholder="请输入关键词"
  26. :remote-method="queryMenu"
  27. style="width:300px"
  28. >
  29. <!-- <template v-if="formModel.parentId!=null">
  30. <el-option
  31. :key="formModel.parentId"
  32. :label="formModel.parentName"
  33. :value="formModel.parentId"
  34. ></el-option>
  35. </template> -->
  36. <el-option
  37. v-for="menu in menuListFilter"
  38. :key="menu.id"
  39. :label="menu.menuName"
  40. :value="menu.id"
  41. ></el-option>
  42. </el-select>
  43. </el-form-item>
  44. <el-form-item label="排序号" prop="sortNo">
  45. <el-input v-model="formModel.sortNo" placeholder="请输入排序号" style="width:300px"></el-input>
  46. </el-form-item>
  47. <el-form-item label="菜单地址" prop="menuUrl">
  48. <el-input v-model="formModel.menuUrl" placeholder="请输入菜单地址" style="width:300px"></el-input>
  49. </el-form-item>
  50. <el-form-item label="图标样式" prop="icon">
  51. <el-input v-model="formModel.icon" placeholder="请输入图标样式" style="width:300px"></el-input>
  52. </el-form-item>
  53. <el-form-item label="菜单类型" prop="menuType">
  54. <el-select v-model="formModel.menuType">
  55. <el-option label="后端接口" value="1"></el-option>
  56. <el-option label="前端页面" value="2"></el-option>
  57. </el-select>
  58. </el-form-item>
  59. </el-form>
  60. </div>
  61. <span slot="footer" class="dialog-footer">
  62. <el-button @click="closeDialog">取 消</el-button>
  63. <el-button type="primary" @click="handleSubmit" :loading="submitting">确 定</el-button>
  64. </span>
  65. <el-dialog
  66. width="30%"
  67. title="内层 Dialog"
  68. :visible.sync="innerVisible"
  69. append-to-body>
  70. </el-dialog>
  71. </el-dialog>
  72. </template>
  73. <script>
  74. import Constant from "@/constant";
  75. import menuApi from "@/api/sys/menu";
  76. export default {
  77. props: ["menuId","modalTitle","parentMenu"],
  78. data() {
  79. return {
  80. formModel : {},
  81. innerVisible: false,
  82. ruleValidate: {
  83. menuName: [
  84. { required: true, message: "菜单名称不能为空", trigger: "blur" }
  85. ],
  86. sortNo: [
  87. { required: true, message: "排序号不能为空", trigger: "blur" }
  88. ],
  89. menuUrl: [
  90. { required: true, message: "菜单地址不能为空", trigger: "blur" }
  91. ],
  92. menuType: [
  93. {
  94. required: true,
  95. message: "菜单类型不能为空",
  96. trigger: "blur"
  97. }
  98. ]
  99. },
  100. menuList:[],
  101. loading: false,
  102. submitting: false,
  103. showDialog: true
  104. };
  105. },
  106. computed: {
  107. menuListFilter () {
  108. var self = this;
  109. var list = [];
  110. var menuMap = {};
  111. self.menuList.forEach((menu)=>{
  112. menuMap[menu.id] = menu;
  113. });
  114. for(var key in menuMap){
  115. list.push(menuMap[key]);
  116. }
  117. return list;
  118. }
  119. },
  120. methods: {
  121. closeDialog() {
  122. this.$emit("close",false);
  123. },
  124. handleSubmit() {
  125. var self = this;
  126. this.$refs["form"].validate(valid => {
  127. if (valid) {
  128. (function() {
  129. var id = self.formModel.id;
  130. if (id == null || id.length == 0) {
  131. return menuApi.add(self.formModel);
  132. } else {
  133. return menuApi.update(self.formModel);
  134. }
  135. })().then(function(response) {
  136. var jsonData = response.data;
  137. if (jsonData.result) {
  138. self.$message({
  139. message: "保存成功!",
  140. type: "success"
  141. });
  142. self.$emit("close",true);
  143. } else {
  144. self.$message({
  145. message: jsonData.message + "",
  146. type: "warning"
  147. });
  148. self.$emit("close",false);
  149. }
  150. });
  151. } else {
  152. this.$emit("error");
  153. }
  154. });
  155. },
  156. queryMenu(keywords) {
  157. var formData = new FormData();
  158. formData.append("keywords",keywords);
  159. formData.append("excludeId",this.formModel.id);
  160. formData.append("limit",10);
  161. return menuApi.query(formData).then(response=>{
  162. var jsonData = response.data;
  163. if(jsonData.result){
  164. this.menuList = jsonData.data;
  165. }
  166. else{
  167. this.$message.error(jsonData.message + "");
  168. }
  169. });
  170. }
  171. },
  172. async mounted() {
  173. var self = this;
  174. self.loading = true;
  175. await this.queryMenu('');
  176. (function(){
  177. if(self.menuId.length==0){
  178. return menuApi.create()
  179. }
  180. else{
  181. return menuApi.edit(self.menuId)
  182. }
  183. })().then(response => {
  184. var jsonData = response.data;
  185. self.loading = false;
  186. if (jsonData.result) {
  187. self.formModel = jsonData.data;
  188. // 增加初始值
  189. if(jsonData.data.parentId!=null){
  190. self.menuList.push({
  191. id: jsonData.data.parentId,
  192. menuName: jsonData.data.parentName
  193. });
  194. }
  195. else if(this.parentMenu!=null && this.parentMenu.id!=null){
  196. self.formModel.parentId = this.parentMenu.id;
  197. self.menuList.push({
  198. id: this.parentMenu.id,
  199. menuName: this.parentMenu.menuName
  200. });
  201. }
  202. } else {
  203. self.$message.error(jsonData.message + "");
  204. }
  205. }).catch(error => {
  206. self.$message.error(error + "");
  207. });
  208. }
  209. };
  210. </script>