nav.js 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591
  1. import { connect } from 'dva/index';
  2. import React, { Component, Fragment } from 'react';
  3. import { Form, Spin, Switch } from 'antd';
  4. import {
  5. sldIconBtn,
  6. failTip,
  7. sucTip,
  8. sldPopConfirmDiy,
  9. sldSearchValClear,
  10. list_com_page_size_10,
  11. dragSldTableColumn,
  12. sldHandlePaginationData,
  13. formItemLayoutModal,
  14. getTableNum,
  15. sldComLanguage,
  16. sldtbaleOpeBtnText,
  17. validatorNumbe,
  18. } from '@/utils/utils';
  19. import { diy_link_type } from '@/utils/util_data';
  20. import global from '@/global.less';
  21. import StandardTable from '@/components/StandardTable';
  22. import SldModal from '@/components/SldModal/SldModal';
  23. import SldSelGoodsSingleDiy from '@/components/SldSelGoodsSingleDiy';
  24. import SldComHeader from '@/components/SldComHeader';
  25. let pageSize = list_com_page_size_10;
  26. @connect(({ pc_home }) => ({
  27. pc_home,
  28. }))
  29. @Form.create()
  30. export default class Nav extends Component {
  31. constructor(props) {
  32. super(props);
  33. this.state = {
  34. link_type: '',
  35. search_con: '',
  36. initLoading: false,
  37. submiting: false,
  38. data: {},//列表数据
  39. selectedRows: [],
  40. selectedRowKeys: [],//selectedRows的key
  41. title: '',
  42. type: 'add',//'add'新增 'edit'编辑
  43. params: { pageSize: pageSize },//搜索条件
  44. operateData: [],//sldmodal操作数据
  45. addData: [{
  46. type: 'input',
  47. label: `${sldComLanguage('导航名称')}`,
  48. name: 'navName',
  49. extra: `${sldComLanguage('最多30个字')}`,
  50. placeholder: `${sldComLanguage('请输入')}${sldComLanguage('导航名称')}`,
  51. initialValue: '',
  52. maxLength: 30,
  53. rules: [{
  54. required: true,
  55. whitespace: true,
  56. message: `${sldComLanguage('请输入')}${sldComLanguage('导航名称')}`,
  57. }],
  58. }, {
  59. type: 'inputnum',
  60. label: `${sldComLanguage('排序')}`,
  61. name: 'sort',
  62. extra: `${sldComLanguage('请输入0~255的数字,值越小,显示越靠前')}`,
  63. placeholder: `${sldComLanguage('请输入排序')}`,
  64. initialValue: '',
  65. min: 0,
  66. max: 255,
  67. rules: [{
  68. required: true,
  69. message: `${sldComLanguage('请输入排序')}`,
  70. }, { validator: (rule, value, callback) => validatorNumbe(rule, value, callback) }],
  71. },
  72. {
  73. type: 'radio_select',
  74. label: `${sldComLanguage('是否显示')}`,
  75. name: 'isShow',
  76. data: [{
  77. key: 1,
  78. value: `${sldComLanguage('是')}`,
  79. }, {
  80. key: 0,
  81. value: `${sldComLanguage('否')}`,
  82. }],
  83. initialValue: 1,
  84. }, {
  85. type: 'select',
  86. label: `${sldComLanguage('链接类型')}`,
  87. name: 'linkData',
  88. placeholder: `${sldComLanguage('请选择')}${sldComLanguage('链接类型')}`,//请选择操作类型
  89. initialValue: '',
  90. sel_data: diy_link_type(),
  91. sldChange: this.handleSeleLinkType,
  92. },
  93. ],//modal框的数据
  94. formValues: {},//搜索条件、
  95. columns: [
  96. {
  97. title: '序号',
  98. dataIndex: 'navId',
  99. align: 'center',
  100. width: 55,
  101. render: (text, record, index) => getTableNum(this.state.params, pageSize, index),
  102. },
  103. {
  104. title: `${sldComLanguage('导航名称')}`,
  105. dataIndex: 'navName',
  106. align: 'center',
  107. width: 150,
  108. },
  109. {
  110. title: `${sldComLanguage('排序')}`,
  111. dataIndex: 'sort',
  112. align: 'center',
  113. width: 100,
  114. },
  115. {
  116. title: `${sldComLanguage('链接类型')}`,
  117. dataIndex: 'link_type',
  118. align: 'center',
  119. width: 150,
  120. render: (text, record) => {
  121. let tmp_data = JSON.parse(record.data.replace(/"/g,"\""));
  122. let data = diy_link_type().filter(item => item.key == tmp_data.link_type)[0];
  123. return data != undefined ? data.name : '--';
  124. },
  125. }, {
  126. title: `${sldComLanguage('跳转目标')}`,
  127. dataIndex: 'link_value',
  128. align: 'center',
  129. width: 150,
  130. render: (text, record) => {
  131. let tmp_data = JSON.parse(record.data.replace(/"/g,"\""));
  132. return tmp_data.link_value?tmp_data.link_value:'--';
  133. },
  134. }, {
  135. title: `${sldComLanguage('启用状态')}`,
  136. dataIndex: 'isShow',
  137. align: 'center',
  138. width: 100,
  139. render: (text, record) => {
  140. return <Switch checked={text == 1 ? true : false}
  141. onChange={(val) => this.handleSetEnable(val, record.navId)}/>;
  142. },
  143. },
  144. {
  145. title: `${sldComLanguage('创建时间')}`,
  146. dataIndex: 'createTime',
  147. align: 'center',
  148. width: 160,
  149. },
  150. {
  151. title: `${sldComLanguage('操作')}`,
  152. align: 'center',
  153. width: 100,
  154. render: (text, record) => (
  155. <Fragment>
  156. {sldtbaleOpeBtnText('编辑', () => this.editNav(record))}{/*编辑*/}
  157. <span className={global.splitLine}></span>
  158. {/*删除后不可恢复,是否确定删除?*/}
  159. {sldPopConfirmDiy('leftBottom', `${sldComLanguage('删除后不可恢复,是否确定删除')}`, () => this.operateNav(record.navId, 'del'), `${sldComLanguage('确定')}`, `${sldComLanguage('取消')}`,
  160. sldtbaleOpeBtnText(`${sldComLanguage('删除')}`, () => null))}
  161. </Fragment>
  162. ),
  163. },
  164. ],
  165. };
  166. }
  167. cur_edit_id = '';//当前操作数据id
  168. sele_info = {};//当前选中的数据
  169. componentDidMount() {
  170. this.get_list({ pageSize: pageSize });
  171. }
  172. handleSeleLinkType = (val) => {
  173. let { operateData } = this.state;
  174. operateData = operateData.filter(item => item.name != 'link_value');
  175. for (let i = 0; i < operateData.length; i++) {
  176. if (operateData[i].name == 'linkData') {
  177. operateData[i].initialValue = val;
  178. if (val == 'url') {
  179. operateData.splice(i + 1, 0, {
  180. type: 'input',
  181. label: `${sldComLanguage('链接地址')}`,
  182. name: 'link_value',
  183. placeholder: `${sldComLanguage('请输入')}${sldComLanguage('链接地址')}`,
  184. initialValue: '',
  185. rules: [{
  186. required: true,
  187. whitespace: true,
  188. message: `${sldComLanguage('请输入')}${sldComLanguage('链接地址')}`,
  189. }],
  190. });
  191. } else if (val == 'keyword') {
  192. operateData.splice(i + 1, 0, {
  193. type: 'input',
  194. label: `${sldComLanguage('关键字')}`,//关键字
  195. name: 'link_value',
  196. placeholder: `${sldComLanguage('请输入')}${sldComLanguage('关键字')}`,
  197. initialValue: '',
  198. rules: [{
  199. required: true,
  200. whitespace: true,
  201. message: `${sldComLanguage('请输入')}${sldComLanguage('关键字')}`,
  202. }],
  203. });
  204. } else if (val == 'goods') {
  205. operateData.splice(i + 1, 0, {
  206. type: 'input',
  207. label: `${sldComLanguage('商品名称')}`,
  208. name: 'link_value',
  209. placeholder: `${sldComLanguage('请输入')}${sldComLanguage('商品名称')}`,
  210. initialValue: '',
  211. disable: true,
  212. });
  213. } else if (val == 'category') {
  214. operateData.splice(i + 1, 0, {
  215. type: 'input',
  216. label: `${sldComLanguage('分类名称')}`,
  217. name: 'link_value',
  218. placeholder: `${sldComLanguage('请输入')}${sldComLanguage('分类名称')}`,
  219. initialValue: '',
  220. disable: true,
  221. });
  222. } else if (val == 'topic') {
  223. operateData.splice(i + 1, 0, {
  224. type: 'input',
  225. label: `${sldComLanguage('专题名称')}`,
  226. name: 'link_value',
  227. placeholder: `${sldComLanguage('请输入')}${sldComLanguage('专题名称')}`,
  228. initialValue: '',
  229. disable: true,
  230. });
  231. }
  232. }
  233. }
  234. this.setState({ operateData, link_type: val });
  235. };
  236. //是否启用
  237. handleSetEnable = (val, id) => {
  238. this.operateNav({ navId: id, isShow: val ? 1 : 0 }, 'enable');
  239. };
  240. //编辑导航
  241. editNav = (val) => {
  242. let { operateData, addData } = this.state;
  243. operateData = JSON.parse(JSON.stringify(addData));
  244. for (let i = 0; i < operateData.length; i++) {
  245. if (operateData[i].name == 'linkData') {
  246. let data = JSON.parse(val.data.replace(/&quot;/g,"\""));
  247. operateData[i].initialValue = data.link_type;
  248. this.sele_info = data.info;
  249. if (data.link_type == 'url') {
  250. operateData.splice(i + 1, 0, {
  251. type: 'input',
  252. label: `${sldComLanguage('链接地址')}`,//链接地址
  253. name: 'link_value',
  254. placeholder: `${sldComLanguage('请输入链接地址')}`,
  255. initialValue: data.link_value,
  256. rules: [{
  257. required: true,
  258. whitespace: true,
  259. message: `${sldComLanguage('请输入链接地址')}`,
  260. }],
  261. });
  262. } else if (data.link_type == 'keyword') {
  263. operateData.splice(i + 1, 0, {
  264. type: 'input',
  265. label: `${sldComLanguage('关键字')}`,//关键字
  266. name: 'link_value',
  267. placeholder: `${sldComLanguage('请输入关键字')}`,
  268. initialValue: data.link_value,
  269. rules: [{
  270. required: true,
  271. whitespace: true,
  272. message: `${sldComLanguage('请输入关键字')}`,
  273. }],
  274. });
  275. } else if (data.link_type == 'goods') {
  276. operateData.splice(i + 1, 0, {
  277. type: 'input',
  278. label: `${sldComLanguage('商品名称')}`,//商品名称
  279. name: 'link_value',
  280. placeholder: `${sldComLanguage('请输入商品名称')}`,
  281. initialValue: data.link_value,
  282. disable: true,
  283. });
  284. } else if (data.link_type == 'category') {
  285. operateData.splice(i + 1, 0, {
  286. type: 'input',
  287. label: `${sldComLanguage('分类名称')}`,//分类名称
  288. name: 'link_value',
  289. placeholder: `${sldComLanguage('请输入分类名称')}`,
  290. initialValue: data.link_value,
  291. disable: true,
  292. });
  293. } else if (data.link_type == 'topic') {
  294. operateData.splice(i + 1, 0, {
  295. type: 'input',
  296. label: `${sldComLanguage('专题名称')}`,//专题名称
  297. name: 'link_value',
  298. placeholder: `${sldComLanguage('请输入专题名称')}`,
  299. initialValue: data.link_value,
  300. disable: true,
  301. });
  302. }
  303. operateData[i].sldChange = this.handleSeleLinkType;
  304. } else if (operateData[i].name != 'link_value') {
  305. operateData[i].initialValue = val[operateData[i].name];
  306. if (operateData[i].name == 'sort'){
  307. operateData[i].rules = [{
  308. required: true,
  309. message: `${sldComLanguage('请输入排序')}`,
  310. }, { validator: (rule, value, callback) => validatorNumbe(rule, value, callback) }];
  311. }
  312. }
  313. }
  314. this.cur_edit_id = val.navId;//当前操作数据id
  315. this.setState({
  316. type: 'edit',
  317. title: `${sldComLanguage('编辑导航')}`,
  318. operateData,
  319. modalVisible: true,
  320. });//编辑导航
  321. };
  322. //导航操作 del:删除 edit: 编辑 enable:是否启用
  323. operateNav = (id, type) => {
  324. this.setState({ submiting: true });
  325. const { params } = this.state;
  326. const { dispatch } = this.props;
  327. let dis_type = '';
  328. let param_data = {};
  329. if (type == 'del') {
  330. dis_type = 'pc_home/del_home_nav';
  331. param_data = { navId: id };
  332. } else if (type == 'edit') {
  333. dis_type = 'pc_home/edit_home_nav';
  334. param_data = id;
  335. } else if (type == 'enable') {
  336. dis_type = 'pc_home/switch_home_nav';
  337. param_data = id;
  338. }
  339. dispatch({
  340. type: dis_type,
  341. payload: param_data,
  342. callback: (res) => {
  343. if (res.state == 200) {
  344. sucTip(res.msg);
  345. this.setState({
  346. modalVisible: false,
  347. });
  348. this.sele_info = {};
  349. this.get_list(params);
  350. } else {
  351. failTip(res.msg);
  352. }
  353. this.setState({ submiting: false });
  354. },
  355. });
  356. };
  357. //添加导航
  358. addNav = () => {
  359. let { addData, operateData } = this.state;
  360. operateData = JSON.parse(JSON.stringify(addData));
  361. for (let i in operateData) {
  362. if (operateData[i].name == 'sort') {
  363. operateData[i].rules = [{
  364. required: true,
  365. message: `${sldComLanguage('排序必填')}`,//排序必填
  366. }, { validator: (rule, value, callback) => validatorNumbe(rule, value, callback) }];
  367. } else if (operateData[i].name == 'linkData') {
  368. operateData[i].sldChange = this.handleSeleLinkType;
  369. }
  370. }
  371. this.setState({
  372. modalVisible: true,
  373. type: 'add',
  374. title: `${sldComLanguage('添加导航')}`,
  375. operateData,
  376. });//添加导航
  377. };
  378. //获取数据列表
  379. get_list = (params) => {
  380. this.setState({ initLoading: true });
  381. const { dispatch } = this.props;
  382. dispatch({
  383. type: 'pc_home/get_home_nav_list',
  384. payload: {
  385. ...params,
  386. isShow: 1
  387. },
  388. callback: (res) => {
  389. this.setState({ initLoading: false });
  390. if (res.state == 200) {
  391. if (res.data.list.length == 0 && this.state.params.currentPage > 1) {
  392. params.currentPage = params.currentPage - 1;
  393. this.get_list(params);
  394. } else {
  395. this.setState({
  396. data: res.data,
  397. });
  398. }
  399. }
  400. },
  401. });
  402. };
  403. handleSelectRows = (rows, rowkeys) => {
  404. this.setState({
  405. selectedRows: rows,
  406. selectedRowKeys: rowkeys,
  407. });
  408. };
  409. handleTablePagination = (pagination, filtersArg, sorter, type = 'main') => {
  410. const { formValues } = this.state;
  411. if (type == 'main') {
  412. const params = sldHandlePaginationData(pagination, filtersArg, sorter, formValues);
  413. pageSize = params.pageSize;
  414. this.setState({ params });
  415. this.get_list(params);
  416. }
  417. };
  418. //表格拖动
  419. resizeTable = (index, size, type, data) => {
  420. let datas = dragSldTableColumn(index, size, data);
  421. this.setState({ [type]: datas });
  422. };
  423. sldHandleCancle = () => {
  424. this.setState({ modalVisible: false });
  425. };
  426. sldHandleConfirm = (val) => {
  427. const { type } = this.state;
  428. const { dispatch } = this.props;
  429. this.setState({ submiting: true });
  430. val.data = JSON.stringify({
  431. link_type: val.linkData,
  432. link_value: val.link_value,
  433. info: this.sele_info,
  434. });
  435. delete val.link_type;
  436. delete val.link_value;
  437. delete val.linkData;
  438. if (type == 'edit') {
  439. val.navId = this.cur_edit_id;
  440. this.operateNav(val, 'edit');
  441. } else {
  442. dispatch({
  443. type: 'pc_home/add_home_nav',
  444. payload: val,
  445. callback: (res) => {
  446. if (res.state == 200) {
  447. sucTip(res.msg);
  448. this.get_list({ pageSize: pageSize });
  449. this.sele_info = {};
  450. this.setState({
  451. modalVisible: false,
  452. });
  453. } else {
  454. failTip(res.msg);
  455. }
  456. this.setState({ submiting: false });
  457. },
  458. });
  459. }
  460. };
  461. //搜索
  462. sldSearch = (val) => {
  463. this.setState({
  464. formValues: { navName: val },
  465. params: { pageSize: pageSize }
  466. });
  467. this.get_list({ pageSize: pageSize, navName: val });
  468. };
  469. //搜索框内容的变化
  470. sldSearChange = (val) => {
  471. this.setState({
  472. search_con: val.target.value,
  473. });
  474. };
  475. //清空搜索内容
  476. sldSearClear = () => {
  477. this.setState({
  478. search_con: '',
  479. });
  480. this.sldSearch('');
  481. };
  482. //商品/分类/专题选中事件
  483. seleSku = (val) => {
  484. let { operateData, link_type } = this.state;
  485. for (let i in operateData) {
  486. if (operateData[i].name == 'link_value') {
  487. if (link_type == 'goods') {
  488. operateData[i].initialValue = val.goodsName;
  489. this.sele_info.id = val.goodsId;
  490. this.sele_info.gid = val.defaultProductId;
  491. this.sele_info.defaultProductId = val.defaultProductId;
  492. } else if (link_type == 'category') {
  493. operateData[i].initialValue = val.categoryName;
  494. this.sele_info.id = val.categoryId;
  495. this.sele_info.categoryId = val.categoryId;
  496. this.sele_info.grade = val.grade;
  497. } else if (link_type == 'topic') {
  498. operateData[i].initialValue = val.decoName;
  499. this.sele_info.id = val.decoId;
  500. this.sele_info.decoId = val.decoId;
  501. }
  502. break;
  503. }
  504. }
  505. this.setState({ operateData, link_type: '' });
  506. };
  507. //商品/分类/专题取消事件
  508. sldHandleLinkCancle = () => {
  509. let { operateData } = this.state;
  510. operateData = operateData.filter(item => item.name != 'link_value');
  511. for (let i in operateData) {
  512. if (operateData[i].name == 'link_type') {
  513. operateData[i].initialValue = 'topic';
  514. break;
  515. }
  516. }
  517. this.sele_info = {};
  518. this.setState({ operateData, link_type: '' });
  519. };
  520. render() {
  521. const { selectedRows, columns, initLoading, data, submiting, operateData, modalVisible, title, search_con, link_type } = this.state;
  522. return (
  523. <div className={global.common_page} style={{ flex: 1 }}>
  524. <SldComHeader
  525. type={2}
  526. title={sldComLanguage('首页导航设置')}//首页导航设置
  527. tip_title={sldComLanguage('操作提示')}
  528. tip_data={[`${sldComLanguage('排序越小,显示越靠前;排序相同,最新创建的在前。')}`, `${sldComLanguage('PC商城首页展示一行,超出部分不展示,需要根据页面效果调整展示的数据')}`]}
  529. />
  530. <div className={global.operate_bg}>
  531. {sldIconBtn(() => this.addNav(), `${sldComLanguage('添加导航')}`, 7, 7)}{/*添加导航*/}
  532. {/*请输入导航名称 搜索*/}
  533. {sldSearchValClear(`${sldComLanguage('请输入')}${sldComLanguage('导航名称')}`, 291, this.sldSearch, `${sldComLanguage('搜索')}`, search_con, this.sldSearChange, this.sldSearClear, 65)}
  534. </div>
  535. <Spin spinning={initLoading}>
  536. {/*标准表格-start*/}
  537. <StandardTable
  538. selectedRows={selectedRows}
  539. data={data}
  540. rowKey={'navId'}
  541. isCheck={false}
  542. columns={columns}
  543. onSelectRow={this.handleSelectRows}
  544. onChange={(pagination, filtersArg, sorter) => this.handleTablePagination(pagination, filtersArg, sorter, 'main')}
  545. onSldHandleSeleRow={this.onSldHandleSeleRow}
  546. resizeTable={(index, size) => this.resizeTable(index, size, 'columns', columns)}
  547. isColumnResize={true}
  548. />
  549. {/*标准表格-end*/}
  550. </Spin>
  551. {/*新增/编辑对话框-start*/}
  552. <SldModal
  553. title={title}
  554. submiting={submiting}
  555. width={500}
  556. modalVisible={modalVisible}
  557. sldHandleConfirm={(val) => this.sldHandleConfirm(val)}
  558. sldHandleCancle={this.sldHandleCancle}
  559. formItemLayoutModal={formItemLayoutModal}
  560. content={operateData}
  561. />
  562. {/*新增/编辑对话框-end*/}
  563. <SldSelGoodsSingleDiy link_type={link_type} seleSku={this.seleSku} sldHandleCancle={this.sldHandleLinkCancle}/>
  564. </div>
  565. );
  566. }
  567. }