index.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340
  1. <template>
  2. <div class="admin-YouQingLianJie">
  3. <!-- 搜索 -->
  4. <div class="yqlj-search">
  5. <div>
  6. <el-input
  7. class="search-name"
  8. placeholder="请输入友情链接名称"
  9. v-model="searchData"
  10. clearable>
  11. </el-input>
  12. <el-button size="mini" type="primary" @click="handleSearch">查询</el-button>
  13. </div>
  14. <div>
  15. <el-button size="mini" plain @click="handleDelete">删除</el-button>
  16. <el-button size="mini" type="primary" @click="handleOpenAdd">新增</el-button>
  17. </div>
  18. </div>
  19. <!-- table -->
  20. <myTable
  21. class="yqlj-table"
  22. @editor="handleOpenEditor"
  23. @delete="handleDelete"
  24. @select-change="handleSelectChange" />
  25. <!-- 分页 -->
  26. <myPagination
  27. class="yqlj-pagination"
  28. :pageSizes="defaultPageSizes"
  29. @size-change="handleSizeChange"
  30. @current-page="handleCurrentPage" />
  31. <!-- 弹窗 新增 -->
  32. <el-dialog
  33. title="新增友情链接"
  34. :visible.sync="addDialogVisit"
  35. width="30%"
  36. @close="handleResetLinks('addForm')"
  37. center>
  38. <div class="add-dialog-content">
  39. <el-form :model="addForm" :rules="addRules" ref="addForm" label-width="80px" class="demo-ruleForm">
  40. <el-form-item label="名称:" prop="name">
  41. <el-input v-model="addForm.name"></el-input>
  42. </el-form-item>
  43. <el-form-item label="链接:" prop="url">
  44. <el-input v-model="addForm.url"></el-input>
  45. </el-form-item>
  46. </el-form>
  47. </div>
  48. <span slot="footer" class="dialog-footer">
  49. <el-button size="mini" @click="addDialogVisit = false">取 消</el-button>
  50. <el-button size="mini" type="primary" @click="handleAddLinks('addForm')">确 定</el-button>
  51. </span>
  52. </el-dialog>
  53. <!-- 弹窗 编辑 -->
  54. <el-dialog
  55. title="编辑友情链接"
  56. :visible.sync="editorDialogVisit"
  57. width="30%"
  58. @close="handleEditorReset('editorForm')"
  59. @open="handleGetLinksInfo"
  60. center>
  61. <div class="add-dialog-content">
  62. <el-form :model="editorForm" :rules="editorRules" ref="editorForm" label-width="80px"
  63. class="demo-ruleForm">
  64. <el-form-item label="名称:" prop="name">
  65. <el-input v-model="editorForm.name"></el-input>
  66. </el-form-item>
  67. <el-form-item label="链接:" prop="url">
  68. <el-input v-model="editorForm.url"></el-input>
  69. </el-form-item>
  70. </el-form>
  71. </div>
  72. <span slot="footer" class="dialog-footer">
  73. <el-button size="mini" @click="editorDialogVisit = false">取 消</el-button>
  74. <el-button size="mini" type="primary" @click="handleEditorLinks('editorForm')">确 定</el-button>
  75. </span>
  76. </el-dialog>
  77. </div>
  78. </template>
  79. <script>
  80. import myPagination from './components/Pagination';
  81. import myTable from './components/Table';
  82. import * as YQLJService from '@/api/youqinglianjie';
  83. import * as comminUtil from '@/utils/admin/tools';
  84. import Vue from 'vue';
  85. const tableData = {
  86. myData: [],
  87. };
  88. const pagination = {
  89. page: 1,
  90. size: 10,
  91. total: 0,
  92. };
  93. const defaultPageSizes = [10, 20, 30, 40];
  94. const paginationServiceData = Vue.observable(pagination);
  95. const tableServiceData = Vue.observable(tableData);
  96. export default {
  97. name: 'YouQingLianJie',
  98. provide: {
  99. defaultPageSizes,
  100. tableServiceData,
  101. paginationServiceData,
  102. },
  103. components: {
  104. myPagination,
  105. myTable,
  106. },
  107. data() {
  108. return {
  109. defaultPageSizes: defaultPageSizes,
  110. addDialogVisit: false,
  111. editorDialogVisit: false,
  112. searchData: '',
  113. tableSelectData: [],
  114. addForm: {
  115. name: '',
  116. url: '',
  117. },
  118. addRules: {
  119. name: [
  120. { required: true, message: '友情链接名称不能为空', trigger: 'blur' },
  121. ],
  122. url: [
  123. { required: true, message: '友情链接不能为空', trigger: 'blur' },
  124. ],
  125. },
  126. editorForm: {
  127. name: '',
  128. url: '',
  129. },
  130. editorRules: {
  131. name: [
  132. { required: true, message: '友情链接名称不能为空', trigger: 'blur' },
  133. ],
  134. url: [
  135. { required: true, message: '友情链接不能为空', trigger: 'blur' },
  136. ],
  137. },
  138. userId: null,
  139. selectRow: null,
  140. };
  141. },
  142. computed: {
  143. myPage() {
  144. return paginationServiceData.page;
  145. },
  146. mySize() {
  147. return paginationServiceData.size;
  148. },
  149. myTotal() {
  150. return paginationServiceData.total;
  151. },
  152. },
  153. methods: {
  154. handleResetLinks(formName) {
  155. this.$refs[formName].resetFields();
  156. this.addDialogVisit = false;
  157. },
  158. handleAddLinks(formName) {
  159. this.$refs[formName].validate((valid) => {
  160. if (valid) {
  161. this.addLinksFun();
  162. } else {
  163. return false;
  164. }
  165. });
  166. },
  167. async addLinksFun() {
  168. const loading = this.$loading({ background: 'rgba(0, 0, 0, 0.7)' });
  169. try {
  170. const opt = Object.assign({}, this.addForm, { userId: this.userId });
  171. const res = await YQLJService.getLinksAdd(opt);
  172. if (res.code === 0) {
  173. this.addDialogVisit = false;
  174. const opt = this.getOption();
  175. const myData = await YQLJService.getLinksList(opt);
  176. this.initPageData(myData.data);
  177. loading.close();
  178. }
  179. } catch (e) {
  180. loading.close();
  181. }
  182. this.addDialogVisit = false;
  183. },
  184. handleGetLinksInfo() {
  185. const opt = { hlId: this.selectRow.hlId };
  186. const loading = this.$loading({ background: 'rgba(0, 0, 0, 0.7)' });
  187. YQLJService.getLinksInfo(opt)
  188. .then(res => {
  189. const { name, url } = res.data;
  190. this.editorForm.name = name;
  191. this.editorForm.url = url;
  192. loading.close();
  193. })
  194. .catch(err => {
  195. loading.close();
  196. });
  197. },
  198. handleEditorReset(formName) {
  199. this.$refs[formName].resetFields();
  200. this.addDialogVisit = false;
  201. },
  202. handleEditorLinks(formName) {
  203. this.$refs[formName].validate((valid) => {
  204. if (valid) {
  205. this.editorLinksFun();
  206. } else {
  207. return false;
  208. }
  209. });
  210. },
  211. async editorLinksFun() {
  212. const loading = this.$loading({ background: 'rgba(0, 0, 0, 0.7)' });
  213. try {
  214. const opt = Object.assign({}, this.editorForm, { userId: this.userId, hlId: this.selectRow.hlId });
  215. const res = await YQLJService.getLinksUpdate(opt);
  216. if (res.code === 0) {
  217. this.editorDialogVisit = false;
  218. const opt = this.getOption();
  219. const myData = await YQLJService.getLinksList(opt);
  220. this.initPageData(myData.data);
  221. loading.close();
  222. }
  223. loading.close();
  224. } catch (e) {
  225. loading.close();
  226. }
  227. this.addDialogVisit = false;
  228. },
  229. getOption() {
  230. const opt = {
  231. page: this.myPage,
  232. size: this.mySize,
  233. name: this.searchData,
  234. };
  235. return opt;
  236. },
  237. handleSearch() {
  238. paginationServiceData.page = 1;
  239. this.searchYouQingData();
  240. },
  241. handleOpenAdd() {
  242. this.addDialogVisit = true;
  243. },
  244. handleOpenEditor(data) {
  245. this.selectRow = data;
  246. this.editorDialogVisit = true;
  247. },
  248. async handleDelete() {
  249. if (!this.tableSelectData.length) {
  250. this.$message.warning('请选择至少一条需要删除的数据');
  251. return;
  252. }
  253. const opt = {
  254. hlIds: [...this.tableSelectData],
  255. };
  256. const loading = this.$loading({ background: 'rgba(0, 0, 0, 0.7)' });
  257. try {
  258. const res = await YQLJService.getLinksDelete(opt);
  259. loading.close();
  260. if (res.code === 0 && res.data) {
  261. // 删除成功重置选择状态
  262. this.tableSelectData = [];
  263. // 刷新页面
  264. const newOpt = this.getOption();
  265. const res = await YQLJService.getLinksList(newOpt);
  266. if (res.code === 0) {
  267. this.initPageData(res.data);
  268. }
  269. loading.close();
  270. }
  271. } catch (err) {
  272. loading.close();
  273. }
  274. },
  275. searchYouQingData() {
  276. const opt = this.getOption();
  277. const loading = this.$loading({ background: 'rgba(0, 0, 0, 0.7)' });
  278. YQLJService.getLinksList(opt)
  279. .then(res => {
  280. this.initPageData(res.data);
  281. loading.close();
  282. })
  283. .catch(err => {
  284. loading.close();
  285. });
  286. },
  287. handleSizeChange(size) {
  288. paginationServiceData.size = size;
  289. this.searchYouQingData();
  290. },
  291. handleCurrentPage(page) {
  292. paginationServiceData.page = page;
  293. this.searchYouQingData();
  294. },
  295. handleSelectChange(data) {
  296. this.tableSelectData = data;
  297. },
  298. initPageData(listData) {
  299. tableServiceData.myData = listData.data;
  300. paginationServiceData.total = listData.total;
  301. },
  302. },
  303. created() {
  304. const userAuth = comminUtil.getUserAuth();
  305. this.userId = userAuth && userAuth.userId ? userAuth.userId : null;
  306. },
  307. mounted() {
  308. this.searchYouQingData();
  309. },
  310. };
  311. </script>
  312. <style lang="scss" scoped>
  313. .admin-YouQingLianJie {
  314. padding: 20px;
  315. .yqlj-search {
  316. display: flex;
  317. justify-content: space-between;
  318. margin-bottom: 20px;
  319. .search-name {
  320. width: 220px;
  321. margin-right: 10px;
  322. }
  323. }
  324. .yqlj-pagination {
  325. margin-top: 20px;
  326. }
  327. }
  328. </style>