oss.vue 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321
  1. <template>
  2. <basic-container>
  3. <avue-crud :option="option"
  4. :table-loading="loading"
  5. :data="data"
  6. :page="page"
  7. :permission="permissionList"
  8. v-model="form"
  9. ref="crud"
  10. @row-update="rowUpdate"
  11. @row-save="rowSave"
  12. @row-del="rowDel"
  13. :before-open="beforeOpen"
  14. @search-change="searchChange"
  15. @search-reset="searchReset"
  16. @selection-change="selectionChange"
  17. @current-change="currentChange"
  18. @size-change="sizeChange"
  19. @refresh-change="refreshChange"
  20. @on-load="onLoad">
  21. <template slot="menuLeft">
  22. <el-button type="danger"
  23. size="small"
  24. icon="el-icon-delete"
  25. plain
  26. v-if="permission.oss_delete"
  27. @click="handleDelete">删 除
  28. </el-button>
  29. </template>
  30. <template slot-scope="scope" slot="menu">
  31. <el-button type="text"
  32. icon="el-icon-check"
  33. size="small"
  34. v-if="permission.oss_enable"
  35. plain
  36. class="none-border"
  37. @click.stop="handleEnable(scope.row)">启用
  38. </el-button>
  39. </template>
  40. <template slot-scope="{row}"
  41. slot="status">
  42. <el-tag>{{row.statusName}}</el-tag>
  43. </template>
  44. <template slot-scope="{row}"
  45. slot="category">
  46. <el-tag>{{row.categoryName}}</el-tag>
  47. </template>
  48. </avue-crud>
  49. </basic-container>
  50. </template>
  51. <script>
  52. import {getList, getDetail, add, update, remove, enable} from "@/api/resource/oss";
  53. import {mapGetters} from "vuex";
  54. export default {
  55. data() {
  56. return {
  57. form: {},
  58. query: {},
  59. loading: true,
  60. page: {
  61. pageSize: 10,
  62. currentPage: 1,
  63. total: 0
  64. },
  65. selectionList: [],
  66. option: {
  67. height: 'auto',
  68. calcHeight: 350,
  69. tip: false,
  70. border: true,
  71. index: true,
  72. viewBtn: true,
  73. selection: true,
  74. labelWidth: 100,
  75. column: [
  76. {
  77. label: "分类",
  78. type: "select",
  79. span: 24,
  80. width: 100,
  81. searchLabelWidth: 50,
  82. row: true,
  83. dicUrl: "/api/blade-system/dict/dictionary?code=oss",
  84. props: {
  85. label: "dictValue",
  86. value: "dictKey"
  87. },
  88. slot: true,
  89. prop: "category",
  90. search: true,
  91. rules: [{
  92. required: true,
  93. message: "请选择分类",
  94. trigger: "blur"
  95. }]
  96. },
  97. {
  98. label: "资源地址",
  99. prop: "endpoint",
  100. span: 24,
  101. search: true,
  102. rules: [{
  103. required: true,
  104. message: "请输入资源地址",
  105. trigger: "blur"
  106. }]
  107. },
  108. {
  109. label: "空间名",
  110. prop: "bucketName",
  111. span: 24,
  112. width: 120,
  113. rules: [{
  114. required: true,
  115. message: "请输入空间名",
  116. trigger: "blur"
  117. }]
  118. },
  119. {
  120. label: "accessKey",
  121. prop: "accessKey",
  122. span: 24,
  123. search: true,
  124. width: 200,
  125. overHidden: true,
  126. rules: [{
  127. required: true,
  128. message: "请输入accessKey",
  129. trigger: "blur"
  130. }]
  131. },
  132. {
  133. label: "secretKey",
  134. prop: "secretKey",
  135. span: 24,
  136. width: 200,
  137. overHidden: true,
  138. rules: [{
  139. required: true,
  140. message: "请输入secretKey",
  141. trigger: "blur"
  142. }]
  143. },
  144. {
  145. label: "是否启用",
  146. prop: "status",
  147. span: 24,
  148. width: 80,
  149. slot: true,
  150. addDisplay: false,
  151. editDisplay: false,
  152. viewDisplay: false,
  153. },
  154. {
  155. label: "备注",
  156. prop: "remark",
  157. span: 24,
  158. hide: true,
  159. },
  160. ]
  161. },
  162. data: []
  163. };
  164. },
  165. computed: {
  166. ...mapGetters(["permission"]),
  167. permissionList() {
  168. return {
  169. addBtn: this.vaildData(this.permission.oss_add),
  170. viewBtn: this.vaildData(this.permission.oss_view),
  171. delBtn: this.vaildData(this.permission.oss_delete),
  172. editBtn: this.vaildData(this.permission.oss_edit)
  173. };
  174. },
  175. ids() {
  176. let ids = [];
  177. this.selectionList.forEach(ele => {
  178. ids.push(ele.id);
  179. });
  180. return ids.join(",");
  181. }
  182. },
  183. methods: {
  184. rowSave(row, loading, done) {
  185. add(row).then(() => {
  186. loading();
  187. this.onLoad(this.page);
  188. this.$message({
  189. type: "success",
  190. message: "操作成功!"
  191. });
  192. }, error => {
  193. done();
  194. console.log(error);
  195. });
  196. },
  197. rowUpdate(row, index, loading, done) {
  198. update(row).then(() => {
  199. loading();
  200. this.onLoad(this.page);
  201. this.$message({
  202. type: "success",
  203. message: "操作成功!"
  204. });
  205. }, error => {
  206. done();
  207. console.log(error);
  208. });
  209. },
  210. rowDel(row) {
  211. this.$confirm("确定将选择数据删除?", {
  212. confirmButtonText: "确定",
  213. cancelButtonText: "取消",
  214. type: "warning"
  215. })
  216. .then(() => {
  217. return remove(row.id);
  218. })
  219. .then(() => {
  220. this.onLoad(this.page);
  221. this.$message({
  222. type: "success",
  223. message: "操作成功!"
  224. });
  225. });
  226. },
  227. searchReset() {
  228. this.query = {};
  229. this.onLoad(this.page);
  230. },
  231. searchChange(params) {
  232. this.query = params;
  233. this.page.currentPage = 1;
  234. this.onLoad(this.page, params);
  235. },
  236. selectionChange(list) {
  237. this.selectionList = list;
  238. },
  239. selectionClear() {
  240. this.selectionList = [];
  241. this.$refs.crud.toggleSelection();
  242. },
  243. handleEnable(row) {
  244. this.$confirm("是否确定启用这条配置?", {
  245. confirmButtonText: "确定",
  246. cancelButtonText: "取消",
  247. type: "warning"
  248. })
  249. .then(() => {
  250. return enable(row.id);
  251. })
  252. .then(() => {
  253. this.onLoad(this.page);
  254. this.$message({
  255. type: "success",
  256. message: "操作成功!"
  257. });
  258. this.$refs.crud.toggleSelection();
  259. });
  260. },
  261. handleDelete() {
  262. if (this.selectionList.length === 0) {
  263. this.$message.warning("请选择至少一条数据");
  264. return;
  265. }
  266. this.$confirm("确定将选择数据删除?", {
  267. confirmButtonText: "确定",
  268. cancelButtonText: "取消",
  269. type: "warning"
  270. })
  271. .then(() => {
  272. return remove(this.ids);
  273. })
  274. .then(() => {
  275. this.onLoad(this.page);
  276. this.$message({
  277. type: "success",
  278. message: "操作成功!"
  279. });
  280. this.$refs.crud.toggleSelection();
  281. });
  282. },
  283. beforeOpen(done, type) {
  284. if (["edit", "view"].includes(type)) {
  285. getDetail(this.form.id).then(res => {
  286. this.form = res.data.data;
  287. });
  288. }
  289. done();
  290. },
  291. currentChange(currentPage) {
  292. this.page.currentPage = currentPage;
  293. },
  294. sizeChange(pageSize) {
  295. this.page.pageSize = pageSize;
  296. },
  297. refreshChange() {
  298. this.onLoad(this.page, this.query);
  299. },
  300. onLoad(page, params = {}) {
  301. this.loading = true;
  302. getList(page.currentPage, page.pageSize, Object.assign(params, this.query)).then(res => {
  303. const data = res.data.data;
  304. this.page.total = data.total;
  305. this.data = data.records;
  306. this.loading = false;
  307. this.selectionClear();
  308. });
  309. }
  310. }
  311. };
  312. </script>
  313. <style>
  314. .none-border {
  315. border: 0;
  316. background-color: transparent !important;
  317. }
  318. </style>