oss.vue 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323
  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. tip: false,
  69. searchShow: 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. dataType: "number",
  89. slot: true,
  90. prop: "category",
  91. search: true,
  92. rules: [{
  93. required: true,
  94. message: "请选择分类",
  95. trigger: "blur"
  96. }]
  97. },
  98. {
  99. label: "资源地址",
  100. prop: "endpoint",
  101. span: 24,
  102. search: true,
  103. rules: [{
  104. required: true,
  105. message: "请输入资源地址",
  106. trigger: "blur"
  107. }]
  108. },
  109. {
  110. label: "空间名",
  111. prop: "bucketName",
  112. span: 24,
  113. width: 120,
  114. rules: [{
  115. required: true,
  116. message: "请输入空间名",
  117. trigger: "blur"
  118. }]
  119. },
  120. {
  121. label: "accessKey",
  122. prop: "accessKey",
  123. span: 24,
  124. search: true,
  125. width: 200,
  126. overHidden: true,
  127. rules: [{
  128. required: true,
  129. message: "请输入accessKey",
  130. trigger: "blur"
  131. }]
  132. },
  133. {
  134. label: "secretKey",
  135. prop: "secretKey",
  136. span: 24,
  137. width: 200,
  138. overHidden: true,
  139. rules: [{
  140. required: true,
  141. message: "请输入secretKey",
  142. trigger: "blur"
  143. }]
  144. },
  145. {
  146. label: "是否启用",
  147. prop: "status",
  148. span: 24,
  149. width: 80,
  150. slot: true,
  151. addDisplay: false,
  152. editDisplay: false,
  153. viewDisplay: false,
  154. },
  155. {
  156. label: "备注",
  157. prop: "remark",
  158. span: 24,
  159. hide: true,
  160. },
  161. ]
  162. },
  163. data: []
  164. };
  165. },
  166. computed: {
  167. ...mapGetters(["permission"]),
  168. permissionList() {
  169. return {
  170. addBtn: this.vaildData(this.permission.oss_add),
  171. viewBtn: this.vaildData(this.permission.oss_view),
  172. delBtn: this.vaildData(this.permission.oss_delete),
  173. editBtn: this.vaildData(this.permission.oss_edit)
  174. };
  175. },
  176. ids() {
  177. let ids = [];
  178. this.selectionList.forEach(ele => {
  179. ids.push(ele.id);
  180. });
  181. return ids.join(",");
  182. }
  183. },
  184. methods: {
  185. rowSave(row, loading, done) {
  186. add(row).then(() => {
  187. loading();
  188. this.onLoad(this.page);
  189. this.$message({
  190. type: "success",
  191. message: "操作成功!"
  192. });
  193. }, error => {
  194. done();
  195. console.log(error);
  196. });
  197. },
  198. rowUpdate(row, index, loading, done) {
  199. update(row).then(() => {
  200. loading();
  201. this.onLoad(this.page);
  202. this.$message({
  203. type: "success",
  204. message: "操作成功!"
  205. });
  206. }, error => {
  207. done();
  208. console.log(error);
  209. });
  210. },
  211. rowDel(row) {
  212. this.$confirm("确定将选择数据删除?", {
  213. confirmButtonText: "确定",
  214. cancelButtonText: "取消",
  215. type: "warning"
  216. })
  217. .then(() => {
  218. return remove(row.id);
  219. })
  220. .then(() => {
  221. this.onLoad(this.page);
  222. this.$message({
  223. type: "success",
  224. message: "操作成功!"
  225. });
  226. });
  227. },
  228. searchReset() {
  229. this.query = {};
  230. this.onLoad(this.page);
  231. },
  232. searchChange(params, done) {
  233. this.query = params;
  234. this.page.currentPage = 1;
  235. this.onLoad(this.page, params);
  236. done();
  237. },
  238. selectionChange(list) {
  239. this.selectionList = list;
  240. },
  241. selectionClear() {
  242. this.selectionList = [];
  243. this.$refs.crud.toggleSelection();
  244. },
  245. handleEnable(row) {
  246. this.$confirm("是否确定启用这条配置?", {
  247. confirmButtonText: "确定",
  248. cancelButtonText: "取消",
  249. type: "warning"
  250. })
  251. .then(() => {
  252. return enable(row.id);
  253. })
  254. .then(() => {
  255. this.onLoad(this.page);
  256. this.$message({
  257. type: "success",
  258. message: "操作成功!"
  259. });
  260. this.$refs.crud.toggleSelection();
  261. });
  262. },
  263. handleDelete() {
  264. if (this.selectionList.length === 0) {
  265. this.$message.warning("请选择至少一条数据");
  266. return;
  267. }
  268. this.$confirm("确定将选择数据删除?", {
  269. confirmButtonText: "确定",
  270. cancelButtonText: "取消",
  271. type: "warning"
  272. })
  273. .then(() => {
  274. return remove(this.ids);
  275. })
  276. .then(() => {
  277. this.onLoad(this.page);
  278. this.$message({
  279. type: "success",
  280. message: "操作成功!"
  281. });
  282. this.$refs.crud.toggleSelection();
  283. });
  284. },
  285. beforeOpen(done, type) {
  286. if (["edit", "view"].includes(type)) {
  287. getDetail(this.form.id).then(res => {
  288. this.form = res.data.data;
  289. });
  290. }
  291. done();
  292. },
  293. currentChange(currentPage) {
  294. this.page.currentPage = currentPage;
  295. },
  296. sizeChange(pageSize) {
  297. this.page.pageSize = pageSize;
  298. },
  299. refreshChange() {
  300. this.onLoad(this.page, this.query);
  301. },
  302. onLoad(page, params = {}) {
  303. this.loading = true;
  304. getList(page.currentPage, page.pageSize, Object.assign(params, this.query)).then(res => {
  305. const data = res.data.data;
  306. this.page.total = data.total;
  307. this.data = data.records;
  308. this.loading = false;
  309. this.selectionClear();
  310. });
  311. }
  312. }
  313. };
  314. </script>
  315. <style>
  316. .none-border {
  317. border: 0;
  318. background-color: transparent !important;
  319. }
  320. </style>