websiteColumn.vue 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569
  1. <template>
  2. <div class="mainBox">
  3. <!--搜索功能 start------------------------------------------------------------>
  4. <div class="layerBox_search">
  5. <el-row>
  6. <el-col :span="8">
  7. <div class="searchBox">
  8. <div class="searchTitle">网站名称:</div>
  9. <el-input placeholder="请输入网站名称" autocomplete="off" v-model="getApiData.keyword"/>
  10. </div>
  11. </el-col>
  12. <!-- <el-col :span="8">
  13. <div class="searchBox">
  14. <div class="searchTitle">网系名称:</div>
  15. <el-cascader v-model="getApiData.website_column_id" :props="{checkStrictly:true}" :options="website_column_arr" clearable></el-cascader>
  16. </div>
  17. </el-col> -->
  18. </el-row>
  19. </div>
  20. <div class="layerBoxNoBg">
  21. <div>
  22. <el-button type="primary" @click="openWindow">关联导航池</el-button>
  23. </div>
  24. <div>
  25. <el-button @click="clearSearch">重置</el-button>
  26. <el-button type="primary" style="margin-right:20px" @click="getData('search')">搜索</el-button>
  27. </div>
  28. </div>
  29. <!--搜索功能 end------------------------------------------------------------>
  30. <!--表格内容 start------------------------------------------------------------>
  31. <div class="layerBox">
  32. <tableTitle :name="tableDivTitle"/>
  33. <el-row>
  34. <template>
  35. <el-table :data="tableData" style="width: 100%">
  36. <el-table-column fixed prop="id" label="编号" width="50"></el-table-column>
  37. <el-table-column prop="website_category" label="导航池名称"></el-table-column>
  38. <el-table-column prop="website_name" label="网站名称"></el-table-column>
  39. <el-table-column prop="website_nav" label="导航名称"></el-table-column>
  40. <el-table-column prop="created_at" label="创建时间"></el-table-column>
  41. <el-table-column prop="updated_at" label="修改时间"></el-table-column>
  42. <el-table-column fixed="right" label="操作" width="280" header-align="center">
  43. <template slot-scope="scope">
  44. <div class="listBtnBox">
  45. <div class="listDeleteBtn" @click="deleteRow(scope.row.id, tableData)"><i class="el-icon-delete"></i>移除</div>
  46. <div class="listEditBtn" @click="editRow(scope.row.id, scope.row.website_name)"><i class="el-icon-edit-outline"></i>编辑</div>
  47. <div class="listMainBtn" @click="manageRow(scope.row.id, tableData)"><i class="el-icon-edit-outline"></i>详情</div>
  48. </div>
  49. <!-- <el-button @click.native.prevent="deleteRow(scope.row.id, tableData)" type="text" size="small">移除</el-button>
  50. <el-button @click.native.prevent="editRow(scope.row.id, scope.row.website_name)" type="text" size="small">编辑</el-button>
  51. <el-button @click.native.prevent="manageRow(scope.row.id)" type="text" size="small">详情</el-button> -->
  52. </template>
  53. </el-table-column>
  54. </el-table>
  55. </template>
  56. </el-row>
  57. </div>
  58. <!--分页 start------------------------------------------------------------>
  59. <div class="alignBox">
  60. <el-row>
  61. <el-col :span="24">
  62. <el-pagination :current-page="getApiData.page" @size-change="handleSizeChange" @current-change="handleCurrentChange" :page-size="10" layout="total, prev, pager, next, jumper" :total="allCount"></el-pagination>
  63. </el-col>
  64. </el-row>
  65. </div>
  66. <!--分页 end------------------------------------------------------------>
  67. <!--表格内容 end------------------------------------------------------------>
  68. <!--弹出框 start------------------------------------------------------------>
  69. <el-dialog :title="editId ? '关联导航池' : '编辑关联导航池'" :visible.sync="windowStatus" :close-on-click-modal="false">
  70. <el-form :model="form" ref="form" :rules="formRules" label-position="left">
  71. <div class="formDiv">
  72. <el-form-item label="关联网站名称:" :label-width="formLabelWidth" prop="webSiteName" class="custom-align-right">
  73. <el-select v-model="form.webSiteName" :multiple="false" :multiple-limit="1" filterable remote reserve-keyword placeholder="请输入网站关键词"
  74. :remote-method="getWebNavList" :loading="webSiteLoading" @change="detectionWebSite">
  75. <el-option
  76. v-for="item in webSiteList"
  77. :key="item.value"
  78. :label="item.label"
  79. :value="item.value">
  80. </el-option>
  81. </el-select>
  82. </el-form-item>
  83. <el-form-item label="导航名称:" :label-width="formLabelWidth" prop="navNames" class="custom-align-right">
  84. <el-select v-model="form.navNames" multiple filterable remote reserve-keyword placeholder="请输入导航关键词"
  85. :remote-method="getWebsiteList" :loading="navNamesLoading">
  86. <el-option
  87. v-for="item in navList"
  88. :key="item.value"
  89. :label="item.label"
  90. :value="item.value">
  91. </el-option>
  92. </el-select>
  93. </el-form-item>
  94. </div>
  95. </el-form>
  96. <div slot="footer" class="dialog-footer">
  97. <div>
  98. <el-button @click="closeWindow">取 消</el-button>
  99. <el-button type="warning" @click="editToServe" v-if="editBtn==true" :loading="editLoading" :disabled="editLoading">编辑</el-button>
  100. <el-button type="primary" @click="addToServe" v-else>提交</el-button>
  101. </div>
  102. </div>
  103. </el-dialog>
  104. <!--弹出框 end------------------------------------------------------------>
  105. </div>
  106. </template>
  107. <script>
  108. //引入公用样式
  109. import '@/styles/global.less';
  110. //表格标题
  111. import tableTitle from './components/tableTitle';
  112. export default {
  113. components: {
  114. tableTitle,//表格标题
  115. },
  116. data() {
  117. //0.全局操作 start ------------------------------------------------------------>
  118. const validateWebSiteName = (rule,value,callback) => {
  119. if (value.length == 0) {
  120. callback(new Error('该项不能为空!'))
  121. } else {
  122. callback()
  123. }
  124. }
  125. const validateNavNames = (rule,value,callback) => {
  126. if (value.length == 0) {
  127. callback(new Error('该项不能为空!'))
  128. } else {
  129. callback()
  130. }
  131. }
  132. //0.全局操作 end ------------------------------------------------------------>
  133. return {
  134. //1.列表和分页相关 start ------------------------------------------------------------>
  135. tableDivTitle:"网站导航列表",
  136. tableData: [],//列表
  137. allCount:0,//总条数
  138. editId:0,//要修改的网站id
  139. getApiData:{
  140. keyword:"",//网站名称
  141. website_column_id:"",//网系
  142. page:1,//当前是第几页
  143. pageSize:10,//一共多少条
  144. },
  145. website_column_arr:[],//获得的网系
  146. //分页相关 end ------------------------------------------------------------>
  147. //2.弹出框设置 start ------------------------------------------------------------>
  148. //是否显示弹出窗口
  149. windowStatus:false,
  150. formLabelWidth: '120px',
  151. editBtn:false,//当显示编辑按钮的时候,就不显示提交
  152. editLoading:false,//编辑按钮的加载中
  153. //弹出框设置 end ------------------------------------------------------------>
  154. //3.弹出框中的表单设置 start ------------------------------------------------------------>
  155. form: {
  156. webSiteName:"",//关联网站名称
  157. navNames:[]//导航名称
  158. },
  159. webSiteLoading:false,//获取关联网站列表的加载中
  160. webSiteList:[],//获取关联网站列表
  161. navNamesLoading: false, //获取网站导航的加载中
  162. navList:[],//获取的网站导航列表
  163. ordArr:[],//老导航
  164. //3.2 表单验证规则
  165. formRules: {
  166. webSiteName: [{type:'array',required:true,trigger:'change',message:'关联网站不能为空!',validator:validateWebSiteName}],
  167. navNames: [{type:'array',required:true,trigger:'change',message:'导航名称不能为空!',validator:validateNavNames}],
  168. },
  169. //弹出框中的表单设置 end ------------------------------------------------------------>
  170. }
  171. },
  172. methods: {
  173. //1.列表和分页相关 start ------------------------------------------------------------>
  174. //1.1 获取内容
  175. getData(type){
  176. //判断一下网系里面有没有值,如果有只取最后一位
  177. //搜索条件 - 网系和城市id只提交最后一个
  178. if(this.getApiData.website_column_id.length>0){
  179. this.getApiData.website_column_id = this.getApiData.website_column_id[this.getApiData.website_column_id.length - 1];
  180. }
  181. if(type=="search"){
  182. this.getApiData.page = 1;
  183. }
  184. this.$store.dispatch('pool/getWebsiteCategoryList',this.getApiData).then(res=> {
  185. let data = res.data.rows;
  186. //给数据得
  187. for(let item of res.data.rows){
  188. item.website_nav = "";
  189. }
  190. //显示导航名称
  191. data.forEach(item => {
  192. if (item.website_category && item.website_category.length > 0) {
  193. // 如果 website_category 有值,提取 name 并用逗号隔开
  194. const categoryNames = item.website_category.map(category => category.alias);
  195. // 将结果存储在一个新的属性上,去掉两端的方括号
  196. item.website_nav = categoryNames.join(', ');
  197. } else {
  198. // 如果没有值,可以设置为空数组或其他处理
  199. item.website_nav = '';
  200. }
  201. });
  202. //显示导航池名称
  203. data.forEach(item => {
  204. if (item.website_category && item.website_category.length > 0) {
  205. // 如果 website_category 有值,提取 name 并用逗号隔开
  206. const categoryNames = item.website_category.map(category => category.name);
  207. // 将结果存储在一个新的属性上,去掉两端的方括号
  208. item.website_category = categoryNames.join(', ');
  209. } else {
  210. // 如果没有值,可以设置为空数组或其他处理
  211. item.website_category = '';
  212. }
  213. });
  214. console.log(data)
  215. this.tableData = data;//放入数据
  216. this.allCount = res.data.count;//放入总条数
  217. })
  218. },
  219. //1.2 删除内容
  220. deleteRow(id){
  221. this.$confirm('此操作将永久删除该条数据, 是否继续?', '提示', {
  222. confirmButtonText: '确定',
  223. cancelButtonText: '取消',
  224. type: 'warning'
  225. }).then(() => {
  226. console.log("当前删除:" + id)
  227. this.$store.dispatch('pool/delWebsiteCategory',{id:id}).then(res=> {
  228. this.getData();
  229. this.$message({
  230. type: 'success',
  231. message: '删除成功!'
  232. });
  233. }).catch(() => {
  234. this.$message({
  235. type: 'warning',
  236. message: '网络错误,请重试!'
  237. });
  238. })
  239. }).catch(() => {
  240. this.$message({
  241. type: 'warning',
  242. message: '已取消删除'
  243. });
  244. });
  245. },
  246. //1.3 列表内容分页
  247. //直接跳转
  248. handleSizeChange(val) {
  249. this.getApiData.page = val;
  250. this.getData();
  251. },
  252. //1.4 点击分页
  253. handleCurrentChange(val) {
  254. this.getApiData.page = val;
  255. this.getData();
  256. },
  257. //1.5 清理搜索框
  258. clearSearch(){
  259. this.getApiData.keyword = "";
  260. this.getApiData.website_column_id = "";
  261. this.getApiData.page = 1;
  262. this.getApiData.pageSize = 10;
  263. this.getData();
  264. },
  265. //列表和分页相关 end ------------------------------------------------------------>
  266. //2.搜索 start ------------------------------------------------------------>
  267. //2.1 获得所有网系
  268. getwebsiteColumn(){
  269. let that = this;
  270. this.$store.dispatch('pool/getwebsiteColumn').then(res=> {
  271. let arrData = this.transformData(res.data)
  272. this.website_column_arr = arrData;
  273. })
  274. },
  275. //2.2对网系进行格式化
  276. transformData(arrData) {
  277. let that = this;
  278. return arrData.map(item => {
  279. // 创建一个新的对象,替换键名
  280. let newItem = {
  281. label: item.column_name,
  282. value: item.id,
  283. // 保留其他不需要改动的字段
  284. pid: item.pid,
  285. sort: item.sort,
  286. remark: item.remark,
  287. column_arr_id: item.column_arr_id,
  288. updated_at: item.updated_at,
  289. created_at: item.created_at,
  290. };
  291. // 如果有 children,则递归处理 children 数组
  292. if (item.children && item.children.length > 0) {
  293. newItem.children = that.transformData(item.children);
  294. }
  295. return newItem;
  296. });
  297. },
  298. //搜索 end ------------------------------------------------------------>
  299. //3.弹出框设置 start ------------------------------------------------------------>
  300. //3.1 打开弹出框
  301. openWindow() {
  302. this.windowStatus = true;
  303. this.clearToServe();
  304. //显示添加按钮
  305. this.editBtn = false;
  306. },
  307. //2.2 关闭弹出框
  308. closeWindow(){
  309. this.windowStatus = false;
  310. this.clearToServe();
  311. },
  312. //3.3 清理弹出框
  313. clearToServe(){
  314. this.form.webSiteName = "";
  315. this.form.navNames = [];
  316. this.webSiteList = [];
  317. this.navList = [];
  318. this.ordArr = [];
  319. },
  320. //弹出框设置 end ------------------------------------------------------------>
  321. //4.添加网站导航 start ------------------------------------------------------------>
  322. //4.1 获得网站列表
  323. getWebNavList(query){
  324. if (query !== '') {
  325. this.webSiteLoading = true;
  326. let data = {keyword:query}
  327. let dataArr = [];
  328. this.$store.dispatch('pool/getNavWebList',data).then(res=> {
  329. console.log(res.data)
  330. for(let item of res.data){
  331. let data = {};
  332. data.key = item.id;
  333. data.value = item.id;
  334. data.label = item.website_name;
  335. dataArr.push(data)
  336. }
  337. this.webSiteList = dataArr;
  338. this.webSiteLoading = false;
  339. }).catch(() => {
  340. this.$message({
  341. type: 'info',
  342. message: '网络错误,请重试!'
  343. });
  344. })
  345. } else {
  346. this.navList = [];
  347. }
  348. },
  349. //4.2 获得导航列表
  350. getWebsiteList(query){
  351. if (query !== '') {
  352. this.navNamesLoading = true;
  353. let data = {
  354. pid:0,//默认只有第一级
  355. name:query,
  356. }
  357. let dataArr = [];
  358. this.$store.dispatch('pool/categoryList',data).then(res=> {
  359. console.log(res.data)
  360. for(let item of res.data){
  361. let data = {};
  362. data.key = item.category_id;
  363. data.value = item.category_id;
  364. data.label = item.name;
  365. dataArr.push(data)
  366. }
  367. this.navList = dataArr;
  368. this.navNamesLoading = false;
  369. }).catch(() => {
  370. this.$message({
  371. type: 'info',
  372. message: '网络错误,请重试!'
  373. });
  374. })
  375. } else {
  376. this.navList = [];
  377. }
  378. },
  379. //4.3添加导航
  380. addToServe(){
  381. console.log(this.form.webSiteName) //关联网站id
  382. console.log(this.form.navNames) //导航名称
  383. let data = {
  384. website_id:this.form.webSiteName,//只能关联1个网站
  385. category_arr_id:this.form.navNames//可以关联多个导航
  386. }
  387. //console.log(data)
  388. this.$refs.form.validate(valid => {
  389. if (valid) {
  390. this.$store.dispatch('pool/addWebsiteCategory',data).then(res=> {
  391. console.log(res.data)
  392. if(res.code==200){
  393. this.$message({
  394. type: 'success',
  395. message: '添加成功!'
  396. });
  397. //关闭并重置窗口
  398. this.closeWindow();
  399. //重新请求页面
  400. this.getData();
  401. }else{
  402. this.$message({
  403. type: 'info',
  404. message: '添加失败,请重试!'
  405. });
  406. }
  407. }).catch(() => {
  408. this.$message({
  409. type: 'info',
  410. message: '网络错误,请重试!'
  411. });
  412. })
  413. }
  414. })
  415. },
  416. //添加网站导航 end ------------------------------------------------------------>
  417. //5.编辑网站 start ------------------------------------------------------------>
  418. //打开弹出窗口
  419. editRow(id,name){
  420. //清理并且打开弹窗
  421. this.openWindow();
  422. this.getWebsiteCategory(id,name);
  423. //显示编辑按钮
  424. this.editBtn = true;
  425. },
  426. //编辑导航
  427. getWebsiteCategory(id,name){
  428. //把id放到待编辑的id中
  429. this.editId = id;
  430. //查询这个站点下面关联的导航有哪些
  431. let data = {website_id:id}
  432. this.$store.dispatch('pool/getAdminWebsiteCategory',data).then(res=> {
  433. //先回显站点信息
  434. this.form.webSiteName = name;
  435. //把查询出来的导航回显到编辑窗口中
  436. let categories = res.data;
  437. // 将返回的数据处理成 {label:'',value:''} 格式,用于 el-select
  438. this.navList = categories.map(item => {
  439. return {
  440. label: item.name,// 显示的名称
  441. value: item.category_id// 选项的唯一标识符
  442. };
  443. });
  444. //将选中的导航 ID 列表设置到 form.navNames 中
  445. this.form.navNames = categories.map(item => item.category_id);
  446. //把老的导航存起来
  447. if(res.data.length>0){
  448. for(let item of res.data){
  449. this.ordArr.push(item.category_id) //之前拿的是id 现在改为category_id
  450. }
  451. }
  452. }).catch(() => {
  453. this.$message({
  454. type: 'info',
  455. message: '网络错误,请重试!'
  456. });
  457. })
  458. },
  459. //更新网站导航
  460. editToServe() {
  461. this.editLoading = true;
  462. //把老数组和新数组都提交过去
  463. console.log(this.ordArr)
  464. const olddata = this.ordArr.filter(id => !this.form.navNames.includes(id));
  465. this.ordArr = olddata;
  466. console.log("老数组为:"+ olddata)
  467. console.log("新数组为:"+ this.form.navNames)
  468. let data = {
  469. //old_category_arr_id:this.ordArr,
  470. old_category_arr_id:[],
  471. new_category_arr_id:this.form.navNames,
  472. website_id:this.editId
  473. }
  474. console.log(data)
  475. this.$refs.form.validate(valid => {
  476. if (valid) {
  477. this.$store.dispatch('pool/upWebsiteCategory',data).then(res=> {
  478. if(res.code==200){
  479. this.$message({
  480. type: 'success',
  481. message: '导航修改成功!'
  482. });
  483. }
  484. //关闭并重置窗口
  485. this.closeWindow();
  486. //重新请求页面
  487. this.getData();
  488. this.editLoading = false;
  489. }).catch(() => {
  490. this.$message({
  491. type: 'info',
  492. message: '网络错误,请重试!'
  493. });
  494. this.editLoading = false;
  495. })
  496. }
  497. })
  498. },
  499. //编辑网站 end ------------------------------------------------------------>
  500. //6.管理网站 start ------------------------------------------------------------>
  501. manageRow(website_id){
  502. let data = {
  503. website_id:website_id,//网站id
  504. page:1,// 页码
  505. pageSize:10//每页条数
  506. }
  507. //console.log(data)
  508. //跳转到关联页面
  509. this.$router.push({
  510. path: '/editNavigation',
  511. query: data
  512. });
  513. },
  514. //判断是否已经关联了网站
  515. detectionWebSite(value){
  516. let data = {
  517. website_id:value
  518. }
  519. //验证一下是不是存在了关联网站名称
  520. this.$store.dispatch('pool/getAdminWebsiteCategory',data).then(res=> {
  521. if(res.data.length>0){
  522. this.form.webSiteName = "";
  523. this.$message({
  524. type: 'warning',
  525. message: '该网站已经关联了导航,请重新选择!'
  526. });
  527. }
  528. })
  529. }
  530. //编辑网站 end ------------------------------------------------------------>
  531. },
  532. mounted(){
  533. //1.获得初始数据
  534. this.getData();
  535. //2.获取所有网系
  536. this.getwebsiteColumn();
  537. }
  538. }
  539. </script>
  540. <style scoped lang="less">
  541. //表单微调 start------------------------------------------------------------>*/
  542. ::v-deep .custom-form-item > .el-form-item__label {
  543. line-height: 140px !important;
  544. }
  545. ::v-deep .custom-textarea .el-textarea__inner {
  546. resize: none; /* 禁止用拖拽调整大小 */
  547. }
  548. ::v-deep .custom-align-right .el-form-item__label {
  549. text-align: right; /* 设置标签文字右对齐 */
  550. }
  551. .formDiv .el-select {
  552. width: 100%;
  553. }
  554. </style>