websiteColumn.vue 20 KB

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