bussiness.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415
  1. <template>
  2. <basic-container>
  3. <avue-crud :option="option" :table-loading="loading" :data="data" :page.sync="page" :permission="permissionList"
  4. :before-open="beforeOpen" v-model="form" ref="crud" @row-update="rowUpdate" @row-save="rowSave" @row-del="rowDel"
  5. @search-change="searchChange" @search-reset="searchReset" @selection-change="selectionChange" @current-change="currentChange"
  6. @size-change="sizeChange" @refresh-change="refreshChange" @on-load="onLoad">
  7. <template slot="menuLeft">
  8. <el-button type="danger" size="small" icon="el-icon-delete" plain v-if="permission.bussiness_delete" @click="handleDelete">删
  9. </el-button>
  10. <el-button type="success" size="small" icon="el-icon-upload" plain v-if="permission.bussiness_generateapi" @click="generateDoc">
  11. 生成api文档
  12. </el-button>
  13. </template>
  14. <template slot="maxLimitForm" slot-scope="scope">
  15. <avue-input-number v-model="scope.row.maxLimit" precision="2" controls-position></avue-input-number>
  16. </template>
  17. <template slot="apiFilePath" slot-scope="scope">
  18. <el-tab v-if="scope.row.apiFilePath == null">无</el-tab>
  19. <el-tab v-if="scope.row.apiFilePath != null&&scope.row.apiFilePath != ''">有</el-tab>
  20. </template>
  21. <template slot="enable" slot-scope="scope">
  22. <el-tag type="primary" v-if="scope.row.enable == 0">启用</el-tag>
  23. <el-tag type="danger" v-if="scope.row.enable == 1">禁用</el-tag>
  24. </template>
  25. <template slot="menu" slot-scope="scope">
  26. <el-button
  27. type ="text"
  28. size="mini"
  29. plain
  30. v-if="scope.row.enable == 1 && permission.bussiness_enable"
  31. @click="handleEnable(scope.row.id, 0)">启用
  32. </el-button>
  33. <el-button
  34. type ="text"
  35. size="mini"
  36. plain
  37. v-if="scope.row.enable == 0 && permission.bussiness_enable"
  38. @click="handleEnable(scope.row.id, 1)">禁用
  39. </el-button>
  40. </template>
  41. </avue-crud>
  42. </basic-container>
  43. </template>
  44. <script>
  45. import {
  46. getList,
  47. getDetail,
  48. add,
  49. update,
  50. remove,
  51. generateApi,
  52. enableBussiness
  53. } from "@/api/guosen/bussiness";
  54. import {
  55. mapGetters
  56. } from "vuex";
  57. import md5 from 'js-md5'
  58. import error from "../monitor/log/error";
  59. export default {
  60. data() {
  61. return {
  62. form: {},
  63. query: {},
  64. loading: true,
  65. page: {
  66. pageSize: 10,
  67. currentPage: 1,
  68. total: 0
  69. },
  70. selectionList: [],
  71. option: {
  72. height: 'auto',
  73. calcHeight: 30,
  74. tip: false,
  75. searchShow: true,
  76. searchMenuSpan: 6,
  77. border: true,
  78. index: true,
  79. viewBtn: true,
  80. selection: true,
  81. dialogClickModal: false,
  82. dialogWidth: "30%",
  83. column: [{
  84. label: "商户号名称",
  85. labelWidth: 130,
  86. prop: "name",
  87. span: 24,
  88. rules: [{
  89. required: true,
  90. message: "请输入商户号名称",
  91. trigger: "blur"
  92. }]
  93. },
  94. {
  95. label: "每日提现上限",
  96. labelWidth: 130,
  97. span: 24,
  98. prop: "maxLimit",
  99. formslot: true,
  100. rules: [{
  101. required: true,
  102. message: "请输入每日提现上限",
  103. trigger: "blur"
  104. }]
  105. },
  106. {
  107. label: "服务费率(千分比)",
  108. prop: "serviceRate",
  109. labelWidth: 130,
  110. width: 300,
  111. span: 24,
  112. rules: [{
  113. required: true,
  114. message: "请输入关联账号的名称",
  115. trigger: "blur"
  116. }]
  117. },
  118. {
  119. label: "账号",
  120. prop: "userName",
  121. labelWidth: 130,
  122. display: true,
  123. span: 24,
  124. rules: [{
  125. required: true,
  126. message: "请输入关联账号的名称",
  127. trigger: "blur"
  128. }]
  129. },
  130. {
  131. label: "密码",
  132. prop: "userPassword",
  133. labelWidth: 130,
  134. span: 24,
  135. display: true,
  136. hide: true,
  137. rules: [{
  138. required: true,
  139. message: "请输入关联账号的密码",
  140. trigger: "blur"
  141. }]
  142. },
  143. {
  144. label: "最低充值金额",
  145. prop: "leastPrice",
  146. labelWidth: 130,
  147. span: 24,
  148. hide: true,
  149. rules: [{
  150. required: true,
  151. message: "请输入最低充值金额",
  152. trigger: "blur"
  153. }]
  154. },
  155. {
  156. label: "api文档",
  157. prop: "apiFilePath",
  158. slot: true,
  159. display: false,
  160. hide: true
  161. },
  162. {
  163. label: "回调地址",
  164. prop: "recallUrl",
  165. labelWidth: 130,
  166. span: 24,
  167. hide: true,
  168. addDisplay: false,
  169. editDisplay: false,
  170. rules: [{
  171. required: false,
  172. message: "请输入回调地址,比如:http://xxx.xxx.xxx.xxx/xxx",
  173. trigger: "blur"
  174. }]
  175. },
  176. // {
  177. // label: "关联账号的id",
  178. // prop: "accountId",
  179. // hide: true,
  180. // display: false,
  181. // rules: [{
  182. // required: true,
  183. // message: "请输入关联账号的id",
  184. // trigger: "blur"
  185. // }]
  186. // },
  187. {
  188. label: "余额(元)",
  189. prop: "remain",
  190. display: false,
  191. rules: [{
  192. required: true,
  193. message: "请输入关联账号的id",
  194. trigger: "blur"
  195. }]
  196. },
  197. {
  198. label: "状态",
  199. prop: "enable",
  200. type: "select",
  201. slot: true,
  202. display: false,
  203. dicData: [
  204. {
  205. label: "禁用",
  206. value: 1
  207. },
  208. {
  209. label: "启用",
  210. value: 0
  211. },
  212. ],
  213. },
  214. ]
  215. },
  216. data: []
  217. };
  218. },
  219. computed: {
  220. ...mapGetters(["permission"]),
  221. permissionList() {
  222. return {
  223. addBtn: this.vaildData(this.permission.bussiness_add, false),
  224. viewBtn: this.vaildData(this.permission.bussiness_view, false),
  225. delBtn: this.vaildData(this.permission.bussiness_delete, false),
  226. editBtn: this.vaildData(this.permission.bussiness_edit, false)
  227. };
  228. },
  229. ids() {
  230. let ids = [];
  231. this.selectionList.forEach(ele => {
  232. ids.push(ele.id);
  233. });
  234. return ids.join(",");
  235. }
  236. },
  237. methods: {
  238. handleEnable(bussinessId, enable){
  239. if(enable == 1){
  240. this.$confirm("确定要禁用吗?", {
  241. confirmButtonText: "确定",
  242. cancelButtonText: "取消",
  243. type: "warning"
  244. }).then(() => {
  245. let params = {"bussinessId": bussinessId, "enable": enable}
  246. enableBussiness(params).then(() => {
  247. this.onLoad(this.page);
  248. this.$message({
  249. type: "success",
  250. message: "操作成功!"
  251. });
  252. })
  253. })
  254. }else{
  255. let params = {"bussinessId": bussinessId, "enable": enable}
  256. enableBussiness(params).then(() => {
  257. this.onLoad(this.page);
  258. this.$message({
  259. type: "success",
  260. message: "操作成功!"
  261. });
  262. })
  263. }
  264. },
  265. rowSave(row, done, loading) {
  266. row.userPassword = md5(row.userPassword)
  267. add(row).then(() => {
  268. this.onLoad(this.page);
  269. this.$message({
  270. type: "success",
  271. message: "操作成功!"
  272. });
  273. done();
  274. }, error => {
  275. loading();
  276. window.console.log(error);
  277. });
  278. },
  279. rowUpdate(row, index, done, loading) {
  280. if(row.userPassword){
  281. row.userPassword = md5(row.userPassword)
  282. }
  283. update(row).then(() => {
  284. this.onLoad(this.page);
  285. this.$message({
  286. type: "success",
  287. message: "操作成功!"
  288. });
  289. done();
  290. }, error => {
  291. loading();
  292. console.log(error);
  293. });
  294. },
  295. rowDel(row) {
  296. this.$confirm("确定将选择数据删除?", {
  297. confirmButtonText: "确定",
  298. cancelButtonText: "取消",
  299. type: "warning"
  300. })
  301. .then(() => {
  302. return remove(row.id);
  303. })
  304. .then(() => {
  305. this.onLoad(this.page);
  306. this.$message({
  307. type: "success",
  308. message: "操作成功!"
  309. });
  310. });
  311. },
  312. generateDoc(){
  313. if (this.selectionList.length === 0) {
  314. this.$message.warning("请选择至少一条数据");
  315. return;
  316. }
  317. this.$confirm("确定重新生成api文档吗?", {
  318. confirmButtonText: "确定",
  319. cancelButtonText: "取消",
  320. type: "warning"
  321. })
  322. .then(() => {
  323. return generateApi(this.ids);
  324. })
  325. .then(() => {
  326. this.onLoad(this.page);
  327. this.$message({
  328. type: "success",
  329. message: "操作成功!"
  330. });
  331. this.$refs.crud.toggleSelection();
  332. });
  333. },
  334. handleDelete() {
  335. if (this.selectionList.length === 0) {
  336. this.$message.warning("请选择至少一条数据");
  337. return;
  338. }
  339. this.$confirm("确定将选择数据删除?", {
  340. confirmButtonText: "确定",
  341. cancelButtonText: "取消",
  342. type: "warning"
  343. })
  344. .then(() => {
  345. return remove(this.ids);
  346. })
  347. .then(() => {
  348. this.onLoad(this.page);
  349. this.$message({
  350. type: "success",
  351. message: "操作成功!"
  352. });
  353. this.$refs.crud.toggleSelection();
  354. });
  355. },
  356. beforeOpen(done, type) {
  357. if (["edit", "view"].includes(type)) {
  358. let userPasswordProp = this.findObject(this.option.column, "userPassword");
  359. if(type == 'edit'){
  360. userPasswordProp.rules[0].required = false;
  361. }else{
  362. userPasswordProp.rules[0].required = true;
  363. }
  364. getDetail(this.form.id).then(res => {
  365. this.form = res.data.data;
  366. });
  367. }
  368. done();
  369. },
  370. searchReset() {
  371. this.query = {};
  372. this.onLoad(this.page);
  373. },
  374. searchChange(params, done) {
  375. this.query = params;
  376. this.page.currentPage = 1;
  377. this.onLoad(this.page, params);
  378. done();
  379. },
  380. selectionChange(list) {
  381. this.selectionList = list;
  382. },
  383. selectionClear() {
  384. this.selectionList = [];
  385. this.$refs.crud.toggleSelection();
  386. },
  387. currentChange(currentPage) {
  388. this.page.currentPage = currentPage;
  389. },
  390. sizeChange(pageSize) {
  391. this.page.pageSize = pageSize;
  392. },
  393. refreshChange() {
  394. this.onLoad(this.page, this.query);
  395. },
  396. onLoad(page, params = {}) {
  397. this.loading = true;
  398. getList(page.currentPage, page.pageSize, Object.assign(params, this.query)).then(res => {
  399. const data = res.data.data;
  400. this.page.total = data.total;
  401. this.data = data.records;
  402. this.loading = false;
  403. this.selectionClear();
  404. });
  405. }
  406. }
  407. };
  408. </script>
  409. <style>
  410. </style>