solution_manage.vue 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248
  1. <template>
  2. <div>
  3. <el-tabs v-model="activeName">
  4. <!-- classify manage-->
  5. <el-tab-pane name="classify_page">
  6. <span slot="label"><i class="el-icon-document-remove"></i> 顶级分类管理</span>
  7. <el-button type="primary" @click="addClassify"><i class="el-icon-plus"></i>新增分类</el-button>
  8. <!-- 标签表格数据 start -->
  9. <el-table :data="classifyData">
  10. <el-table-column
  11. prop="name"
  12. label="分类名称" >
  13. </el-table-column>
  14. <el-table-column
  15. label="是否显示" width="150">
  16. <template slot-scope="scope">
  17. <p v-if="scope.row['is_show'] == 1">是</p>
  18. <p v-else>否</p>
  19. </template>
  20. </el-table-column>
  21. <el-table-column
  22. prop="sort"
  23. label="排序" width="50">
  24. </el-table-column>
  25. <el-table-column
  26. prop="created_at"
  27. label="创建时间" >
  28. </el-table-column>
  29. <el-table-column
  30. prop="updated_at"
  31. label="更新时间" >
  32. </el-table-column>
  33. <el-table-column
  34. label="关联领域" >
  35. <template slot-scope="scope">
  36. <el-tag v-for="(item, id) in scope.row['cats']" v-if="id < 8">{{item['name']}}</el-tag>
  37. <p v-if="scope.row['cats']" >总共有{{scope.row['cats'].length}}个</p>
  38. </template>
  39. </el-table-column>
  40. <el-table-column
  41. label="操作">
  42. <template slot-scope="scope">
  43. <el-button
  44. type="text"
  45. @click="editClassify(scope.row)"
  46. ><i class="el-icon-edit"></i></el-button>
  47. <el-button
  48. type="text"
  49. @click="delClassify(scope.row['id'])"
  50. ><i class="el-icon-delete"></i></el-button>
  51. </template>
  52. </el-table-column>
  53. </el-table>
  54. <el-pagination
  55. class="order-footer"
  56. background
  57. layout="prev, pager, next"
  58. :page-size="20"
  59. :total="Number(totals.classify_total)"
  60. @current-change="handleCurrentChange"
  61. />
  62. <!-- 标签表格数据 end -->
  63. <!-- 新增弹出层 start -->
  64. <el-dialog
  65. :title="ClassifyTitle"
  66. :visible.sync="ClassifyDialog"
  67. width="45%">
  68. <el-form ref="form" :model="classifyForm" label-width="100px">
  69. <el-form-item>
  70. <p slot="label">分类名<span style="color:#ff0000;">*</span></p>
  71. <el-input v-model="classifyForm.name" v-bind:readonly="isReadOnly" placeholder="请输入分类名"></el-input>
  72. </el-form-item>
  73. <el-form-item>
  74. <p slot="label">是否显示</p>
  75. <el-switch
  76. v-model="classifyForm.is_show">
  77. </el-switch>
  78. </el-form-item>
  79. <el-form-item>
  80. <p slot="label">排序<span style="color:red;">*</span></p>
  81. <el-input v-model="classifyForm.sorts" placeholder="请输入数字"></el-input>
  82. </el-form-item>
  83. <el-form-item>
  84. <template>
  85. <el-row :gutter="24">
  86. <el-col :span="8">
  87. <div class="grid-content bg-purple">领域</div>
  88. </el-col>
  89. <el-col :span="8">
  90. <div class="grid-content bg-purple">别名</div>
  91. </el-col>
  92. <!-- <el-col :span="6"><div class="grid-content bg-purple"></div></el-col>-->
  93. </el-row>
  94. <template v-for="(item,index) in classifyForm.cats">
  95. <el-row :gutter="24" style="margin-top: 5px">
  96. <el-col :span="8">
  97. <div class="grid-content bg-purple">
  98. <el-select v-model="classifyForm.cats[index].hash_id" placeholder="请选择领域">
  99. <el-option
  100. v-for="item in categoryData"
  101. :key="item.id"
  102. :label="item.name"
  103. :value="item.id">
  104. </el-option>
  105. </el-select>
  106. </div>
  107. </el-col>
  108. <el-col :span="8">
  109. <div class="grid-content bg-purple">
  110. <el-input v-model="classifyForm.cats[index].alias" placeholder="请输入别名"></el-input>
  111. </div>
  112. </el-col>
  113. <el-col :span="8">
  114. <div class="grid-content bg-purple">
  115. <el-button
  116. @click="deleteChannleRow(index)"
  117. type="text"W
  118. size="small" v-if="index != 0">
  119. 移除
  120. </el-button>
  121. <el-button
  122. @click="addChannleRow()"
  123. type="text"
  124. size="small">
  125. 添加
  126. </el-button>
  127. </div>
  128. </el-col>
  129. </el-row>
  130. </template>
  131. </template>
  132. </el-form-item>
  133. <el-form-item>
  134. <el-button type="primary" @click="classifySub">提交</el-button>
  135. </el-form-item>
  136. </el-form>
  137. </el-dialog>
  138. <!-- 新增弹出层 end -->
  139. </el-tab-pane>
  140. <!-- serviceType manage-->
  141. <el-tab-pane name="serviceType_page">
  142. <span slot="label"><i class="el-icon-document-remove"></i> 服务方式管理</span>
  143. <el-button type="primary" @click="addServiceType"><i class="el-icon-plus"></i>服务方式分类</el-button>
  144. <!-- 标签表格数据 start -->
  145. <el-table :data="serviceTypeData">
  146. <el-table-column
  147. prop="name"
  148. label="名称" >
  149. </el-table-column>
  150. <el-table-column
  151. prop="alias"
  152. label="别名" >
  153. </el-table-column>
  154. <el-table-column
  155. prop="sort"
  156. label="排序" width="50">
  157. </el-table-column>
  158. <el-table-column
  159. label="是否显示" width="150">
  160. <template slot-scope="scope">
  161. <p v-if="scope.row['is_show'] == 1">是</p>
  162. <p v-else>否</p>
  163. </template>
  164. </el-table-column>
  165. <el-table-column
  166. prop="created_at"
  167. label="创建时间" >
  168. </el-table-column>
  169. <el-table-column
  170. prop="updated_at"
  171. label="更新时间" >
  172. </el-table-column>
  173. <el-table-column
  174. label="操作">
  175. <template slot-scope="scope">
  176. <el-button
  177. type="text"
  178. @click="editServiceType(scope.row)"
  179. ><i class="el-icon-edit"></i></el-button>
  180. <el-button
  181. type="text"
  182. @click="delServiceType(scope.row['hash_id'])"
  183. ><i class="el-icon-delete"></i></el-button>
  184. </template>
  185. </el-table-column>
  186. </el-table>
  187. <el-pagination
  188. class="order-footer"
  189. background
  190. layout="prev, pager, next"
  191. :page-size="20"
  192. :total="Number(totals.serviceType_total)"
  193. @current-change="handleCurrentChange"
  194. />
  195. <!-- 标签表格数据 end -->
  196. <!-- 新增弹出层 start -->
  197. <el-dialog
  198. :title="serviceTypeTitle"
  199. :visible.sync="serviceTypeDialog"
  200. width="30%">
  201. <el-form ref="form" :model="serviceTypeForm" label-width="100px">
  202. <el-form-item>
  203. <p slot="label">服务领域<span style="color:red;">*</span></p>
  204. <el-select v-model="serviceTypeForm.hash_id" filterable placeholder="请选择">
  205. <el-option
  206. v-for="item in categoryData"
  207. :key="item.id"
  208. :label="item.name"
  209. :value="item.id">
  210. </el-option>
  211. </el-select>
  212. </el-form-item>
  213. <el-form-item>
  214. <p slot="label">别名</p>
  215. <el-input v-model="serviceTypeForm.alias" placeholder="请输入别名"></el-input>
  216. </el-form-item>
  217. <el-form-item>
  218. <p slot="label">排序<span style="color:red;">*</span></p>
  219. <el-input v-model="serviceTypeForm.sort" placeholder="请输入数字"></el-input>
  220. </el-form-item>
  221. <el-form-item>
  222. <el-button type="primary" @click="serviceTypeSub">提交</el-button>
  223. </el-form-item>
  224. </el-form>
  225. </el-dialog>
  226. <!-- 新增弹出层 end -->
  227. <!-- 新增弹出层 start -->
  228. <el-dialog
  229. :title="serviceTypeTitle"
  230. :visible.sync="editServiceTypeDialog"
  231. width="30%">
  232. <el-form ref="form" :model="serviceTypeForm" label-width="100px">
  233. <el-form-item>
  234. <p slot="label">服务名称</p>
  235. <el-input v-model="serviceTypeForm.name" v-bind:readonly="true" placeholder="请输入分类名"></el-input>
  236. </el-form-item>
  237. <el-form-item>
  238. <p slot="label">别名</p>
  239. <el-input v-model="serviceTypeForm.alias" placeholder="请输入别名"></el-input>
  240. </el-form-item>
  241. <el-form-item>
  242. <p slot="label">排序</p>
  243. <el-input v-model="serviceTypeForm.sort" placeholder="请输入数字"></el-input>
  244. </el-form-item>
  245. <el-form-item>
  246. <p slot="label">是否显示</p>
  247. <el-switch
  248. v-model="serviceTypeForm.is_show">
  249. </el-switch>
  250. </el-form-item>
  251. <el-form-item>
  252. <el-button type="primary" @click="editServiceTypeSub">提交</el-button>
  253. </el-form-item>
  254. </el-form>
  255. </el-dialog>
  256. <!-- 新增弹出层 end -->
  257. </el-tab-pane>
  258. <!-- keyword manage-->
  259. <el-tab-pane name="keyword_page">
  260. <span slot="label"><i class="el-icon-document-remove"></i> 热词管理</span>
  261. <el-button type="primary" @click="addKeyWord"><i class="el-icon-plus"></i>新增热词</el-button>
  262. <!-- 标签表格数据 start -->
  263. <el-table :data="keywordData">
  264. <el-table-column
  265. prop="word"
  266. label="热词" >
  267. </el-table-column>
  268. <el-table-column
  269. prop="alias"
  270. label="别名" >
  271. </el-table-column>
  272. <el-table-column
  273. prop="sort"
  274. label="排序" width="50">
  275. </el-table-column>
  276. <el-table-column
  277. label="是否显示" width="150">
  278. <template slot-scope="scope">
  279. <p v-if="scope.row['is_show'] == 1">是</p>
  280. <p v-else>否</p>
  281. </template>
  282. </el-table-column>
  283. <el-table-column
  284. prop="online_at"
  285. label="上线时间" >
  286. </el-table-column>
  287. <el-table-column
  288. prop="offline_at"
  289. label="下线时间" >
  290. </el-table-column>
  291. <el-table-column
  292. prop="created_at"
  293. label="创建时间" >
  294. </el-table-column>
  295. <el-table-column
  296. prop="updated_at"
  297. label="更新时间" >
  298. </el-table-column>
  299. <el-table-column
  300. label="操作">
  301. <template slot-scope="scope">
  302. <el-button
  303. type="text"
  304. @click="editKeyWord(scope.row)"
  305. ><i class="el-icon-edit"></i></el-button>
  306. <el-button
  307. type="text"
  308. @click="delKeyWord(scope.row['id'])"
  309. ><i class="el-icon-delete"></i></el-button>
  310. </template>
  311. </el-table-column>
  312. </el-table>
  313. <el-pagination
  314. class="order-footer"
  315. background
  316. layout="prev, pager, next"
  317. :page-size="20"
  318. :total="Number(totals.keyword_total)"
  319. @current-change="handleCurrentChange"
  320. />
  321. <!-- 标签表格数据 end -->
  322. <!-- 新增弹出层 start -->
  323. <el-dialog
  324. :title="keywordTitle"
  325. :visible.sync="keywordDialog"
  326. width="30%">
  327. <el-form ref="form" :model="keyWordForm" label-width="100px">
  328. <el-form-item>
  329. <p slot="label">热词<span style="color:red;">*</span></p>
  330. <el-input v-model="keyWordForm.word" placeholder="请输入热词"></el-input>
  331. </el-form-item>
  332. <el-form-item>
  333. <p slot="label">热词别名</p>
  334. <el-input v-model="keyWordForm.alias" placeholder="请输入别名"></el-input>
  335. </el-form-item>
  336. <el-form-item>
  337. <p slot="label">是否显示</p>
  338. <el-switch
  339. v-model="keyWordForm.is_show">
  340. </el-switch>
  341. </el-form-item>
  342. <el-form-item>
  343. <p slot="label">上线时间</p>
  344. <el-date-picker
  345. v-model="keyWordForm.online_at"
  346. type="datetime"
  347. placeholder="选择日期时间">
  348. </el-date-picker>
  349. </el-form-item>
  350. <el-form-item>
  351. <p slot="label">下线时间</p>
  352. <el-date-picker
  353. v-model="keyWordForm.offline_at"
  354. type="datetime"
  355. placeholder="选择日期时间">
  356. </el-date-picker>
  357. </el-form-item>
  358. <el-form-item>
  359. <p slot="label">排序<span style="color:red;">*</span></p>
  360. <el-input v-model="keyWordForm.sort" placeholder="请输入数字"></el-input>
  361. </el-form-item>
  362. <el-form-item>
  363. <el-button type="primary" @click="keyWordSub">提交</el-button>
  364. </el-form-item>
  365. </el-form>
  366. </el-dialog>
  367. <!-- 新增弹出层 end -->
  368. </el-tab-pane>
  369. <!-- banner manage-->
  370. <el-tab-pane name="banner_page">
  371. <span slot="label"><i class="el-icon-document-remove"></i> 轮播图管理</span>
  372. <el-button type="primary" @click="addBanner"><i class="el-icon-plus"></i>新增轮播图</el-button>
  373. <!-- 标签表格数据 start -->
  374. <el-table :data="bannerData">
  375. <el-table-column
  376. prop="theme_color"
  377. label="背景色"
  378. width="80">
  379. </el-table-column>
  380. <el-table-column
  381. label="图片"
  382. width="180">
  383. <template slot-scope="scope">
  384. <img :src="scope.row['image_url']" alt="banner 图" style="height:50px;">
  385. </template>
  386. </el-table-column>
  387. <el-table-column
  388. prop="jump_type"
  389. label="跳转目标类型"
  390. width="130">
  391. </el-table-column>
  392. <el-table-column
  393. prop="jump_target"
  394. label="跳转目标标识"
  395. width="180">
  396. </el-table-column>
  397. <el-table-column
  398. prop="online_at"
  399. label="上线时间"
  400. width="180">
  401. </el-table-column>
  402. <el-table-column
  403. prop="offline_at"
  404. label="下线时间"
  405. width="180">
  406. </el-table-column>
  407. <el-table-column
  408. label="是否显示" width="150">
  409. <template slot-scope="scope">
  410. <p v-if="scope.row['is_show'] == 1">是</p>
  411. <p v-else>否</p>
  412. </template>
  413. </el-table-column>
  414. <el-table-column
  415. prop="sort"
  416. label="排序" width="50">
  417. </el-table-column>
  418. <el-table-column
  419. label="所属端"
  420. width="80">
  421. <template slot-scope="scope">
  422. <p v-if="scope.row['type'] == 1">
  423. web端
  424. </p>
  425. <p v-else>
  426. 移动端
  427. </p>
  428. </template>
  429. </el-table-column>
  430. <el-table-column
  431. prop="created_at"
  432. label="创建时间"
  433. width="180">
  434. </el-table-column>
  435. <el-table-column
  436. prop="updated_at"
  437. label="更新时间"
  438. width="180">
  439. </el-table-column>
  440. <el-table-column
  441. label="操作">
  442. <template slot-scope="scope">
  443. <el-button
  444. type="text"
  445. @click="editBanner(scope.row)"
  446. ><i class="el-icon-edit"></i></el-button>
  447. <el-button
  448. type="text"
  449. @click="delBanner(scope.row['id'])"
  450. ><i class="el-icon-delete"></i></el-button>
  451. </template>
  452. </el-table-column>
  453. </el-table>
  454. <el-pagination
  455. class="order-footer"
  456. background
  457. layout="prev, pager, next"
  458. :page-size="20"
  459. :total="Number(totals.banner_total)"
  460. @current-change="handleCurrentChange"
  461. />
  462. <!-- 标签表格数据 end -->
  463. <!-- 新增弹出层 start -->
  464. <el-dialog
  465. :title="bannerTitle"
  466. :visible.sync="bannerDialog"
  467. width="40%">
  468. <el-form ref="form" :model="bannerForm" label-width="100px">
  469. <el-form-item>
  470. <el-upload
  471. class="avatar-uploader"
  472. action="/api/admin/developer/uploadImg"
  473. :show-file-list="false"
  474. :on-success="handleAvatarSuccess"
  475. :before-upload="beforeAvatarUpload">
  476. <img v-if="bannerForm.image_url" :src="bannerForm.image_url" class="avatar">
  477. <i v-else class="el-icon-plus avatar-uploader-icon"></i>
  478. </el-upload>
  479. </el-form-item>
  480. <el-form-item>
  481. <p slot="label">是否显示</p>
  482. <el-switch
  483. v-model="bannerForm.is_show">
  484. </el-switch>
  485. </el-form-item>
  486. <el-form-item>
  487. <p slot="label">背景色</p>
  488. <el-input v-model="bannerForm.theme_color" placeholder="请输入背景色"></el-input>
  489. </el-form-item>
  490. <el-form-item>
  491. <p slot="label">跳转类型<span style="color:red;">*</span></p>
  492. <el-select v-model="bannerForm.jump_type" placeholder="请选择">
  493. <el-option
  494. v-for="item in jumpType"
  495. :key="item.value"
  496. :label="item.label"
  497. :value="item.value">
  498. </el-option>
  499. </el-select>
  500. </el-form-item>
  501. <el-form-item>
  502. <p slot="label">跳转标识<span style="color:red;">*</span></p>
  503. <el-input v-model="bannerForm.jump_target" placeholder="请输入跳转标识"></el-input>
  504. </el-form-item>
  505. <el-form-item>
  506. <p slot="label">上线时间</p>
  507. <el-date-picker
  508. v-model="bannerForm.online_at"
  509. type="datetime"
  510. placeholder="选择日期时间">
  511. </el-date-picker>
  512. </el-form-item>
  513. <el-form-item>
  514. <p slot="label">下线时间</p>
  515. <el-date-picker
  516. v-model="bannerForm.offline_at"
  517. type="datetime"
  518. placeholder="选择日期时间">
  519. </el-date-picker>
  520. </el-form-item>
  521. <el-form-item>
  522. <p slot="label">排序</p>
  523. <el-input v-model="bannerForm.sort" placeholder="请输入数字"></el-input>
  524. </el-form-item>
  525. <el-form-item>
  526. <p slot="label">web/移动端</p>
  527. <el-select v-model="bannerForm.type" placeholder="请选择">
  528. <el-option
  529. v-for="item in clientType"
  530. :key="item.value"
  531. :label="item.label"
  532. :value="item.value">
  533. </el-option>
  534. </el-select>
  535. </el-form-item>
  536. <el-form-item>
  537. <el-button type="primary" @click="bannerSub">提交</el-button>
  538. </el-form-item>
  539. </el-form>
  540. </el-dialog>
  541. <!-- 新增弹出层 end -->
  542. </el-tab-pane>
  543. </el-tabs>
  544. </div>
  545. </template>
  546. <script>
  547. const genDefBannerForm = () => {
  548. return {
  549. sort: 1,
  550. theme_color: '',
  551. image_url: '',
  552. jump_type: '',
  553. jump_target: '',
  554. online_at: null,
  555. offline_at: null,
  556. type: 1,
  557. is_show: 0
  558. }
  559. }
  560. const genDefClassifyForm = () => {
  561. return {
  562. id: '',
  563. name: '',
  564. sorts: 1,
  565. cats: [{hash_id:'',name:'',alias:''}],
  566. is_show: ''
  567. }
  568. };
  569. const genDefServiceTypeForm = () => {
  570. return {
  571. id: '',
  572. hash_id: '',
  573. name: '',
  574. alias: '',
  575. sort:1,
  576. is_show:1
  577. }
  578. };
  579. const genDefKeyWordForm = () => {
  580. return {
  581. id: '',
  582. word: '',
  583. alias: '',
  584. online_at: null,
  585. offline_at: null,
  586. sort: 1,
  587. is_show: 1
  588. }
  589. };
  590. export default {
  591. data() {
  592. return {
  593. activeName:'classify_page',
  594. ClassifyTitle: '',
  595. ClassifyDialog: false,
  596. serviceTypeTitle: '',
  597. serviceTypeDialog: false,
  598. editServiceTypeDialog: false,
  599. keywordTitle: '',
  600. keywordDialog: false,
  601. bannerTitle: '',
  602. bannerDialog: false,
  603. isReadOnly: false,
  604. jumpType:[
  605. {
  606. value:'url',
  607. label:'url',
  608. }
  609. ],
  610. clientType:[
  611. {
  612. value:1,
  613. label:'web端',
  614. },
  615. {
  616. value:2,
  617. label:'移动端',
  618. }
  619. ],
  620. classifyData: [],
  621. keywordData: [],
  622. bannerData: [],
  623. serviceTypeData: [],
  624. categoryData: [],
  625. classifyForm: genDefClassifyForm(),
  626. serviceTypeForm: genDefServiceTypeForm(),
  627. keyWordForm: genDefKeyWordForm(),
  628. bannerForm: genDefBannerForm(),
  629. totals: {
  630. banner_total: 0,
  631. keyword_total: 0,
  632. classify_total: 0,
  633. serviceType_total: 0,
  634. }
  635. }
  636. },
  637. created: function () {
  638. this.getTableData()
  639. .catch(e => {
  640. this.$message({
  641. type: "error",
  642. message: e.message
  643. })
  644. });
  645. },
  646. methods: {
  647. // 获取列表数据
  648. async getTableData() {
  649. let data = {
  650. page: 1,
  651. pageSize: 20
  652. }
  653. //获取顶级分类
  654. let classify_res = await this.$post("/api/admin/kaifain/findClassify", data);
  655. if(classify_res.status == 1){
  656. this.classifyData = classify_res.data.list;
  657. this.totals.classify_total = classify_res.data.total;
  658. }
  659. //获取顶级分类
  660. let serviceType_res = await this.$post("/api/admin/kaifain/findServiceType", data);
  661. if(serviceType_res.status == 1){
  662. this.serviceTypeData = serviceType_res.data.list;
  663. this.totals.serviceType_total = serviceType_res.data.total;
  664. }
  665. //获取热词
  666. let word_res = await this.$post("/api/admin/kaifain/findServiceWord", data);
  667. if(word_res.status == 1){
  668. this.keywordData = word_res.data.list;
  669. this.totals.keyword_total = word_res.data.total;
  670. }
  671. //获取bannner
  672. let banner_res = await this.$post("/api/admin/kaifain/findBanner", data);
  673. if(banner_res.status == 1){
  674. this.bannerData = banner_res.data.list;
  675. this.totals.banner_total = banner_res.data.total;
  676. }
  677. //获取领域
  678. let cat_res = await this.$post("/api/admin/CpsManage/listCategories", {});
  679. if(cat_res.status == 1){
  680. if(cat_res.data){
  681. this.categoryData = cat_res.data;
  682. }
  683. }
  684. },
  685. deleteChannleRow(index) {
  686. this.classifyForm.cats.splice(index, 1);
  687. },
  688. addChannleRow() {
  689. this.classifyForm.cats.push({hash_id:'',name:'',alias:''})
  690. },
  691. handleCurrentChange(val) {
  692. this.page = val;
  693. this.getList();
  694. },
  695. //顶级分类管理
  696. addClassify(){
  697. this.classifyForm = genDefClassifyForm();
  698. this.ClassifyTitle='新增顶级分类';
  699. this.ClassifyDialog = true;
  700. },
  701. editClassify(row){
  702. this.classifyForm = {};
  703. let cats = new Array();
  704. if(row.cats){
  705. for(let i = 0; i < row.cats.length; i++){
  706. cats.push({hash_id:row.cats[i]['cat_id'],name:row.cats[i]['name'],alias:row.cats[i]['alias']});
  707. }
  708. }else{
  709. cats.push({hash_id:'',name:'',alias:''});
  710. }
  711. this.ClassifyTitle = '修改顶级分类';
  712. this.classifyForm = {
  713. id: row.id,
  714. name: row.name,
  715. sorts: row.sort,
  716. cats: cats,
  717. is_show: row.is_show == 1?true:false
  718. };
  719. this.ClassifyDialog = true;
  720. },
  721. async classifySub() {
  722. if(this.classifyForm.name.length < 1){
  723. this.$message({
  724. type: "error",
  725. message: "名称不能为空!"
  726. });
  727. return false;
  728. }
  729. if(this.classifyForm.cats.length < 1){
  730. this.$message({
  731. type: "error",
  732. message: "领域不能为空!"
  733. });
  734. return false;
  735. }
  736. let cats = new Array();
  737. let cat_data = this.categoryData;
  738. let cats_value = this.classifyForm.cats;
  739. for(let i = 0; i < cat_data.length; i++){
  740. for(let x= 0; x < cats_value.length; x++){
  741. if(cat_data[i]['id'] == cats_value[x]['hash_id']){
  742. cats.push({'id':cat_data[i]['id'], 'name':cat_data[i]['name'], alias: cats_value[x]['alias']});
  743. }
  744. }
  745. }
  746. let temp_cats = new Array();
  747. for(let k= 0; k < cats_value.length; k++){
  748. for(let j= 0; j < cats.length; j++){
  749. if(cats_value[k]['hash_id'] == cats[j]['id']){
  750. temp_cats.push(cats[j]);
  751. }
  752. }
  753. }
  754. if(this.classifyForm.id){
  755. let data = {
  756. id: this.classifyForm.id,
  757. name: this.classifyForm.name,
  758. sort: this.classifyForm.sorts,
  759. cats: JSON.stringify(temp_cats),
  760. is_show: this.classifyForm.is_show?1:0
  761. }
  762. let classify_res = await this.$post("/api/admin/kaifain/editClassify", data);
  763. if(classify_res.status == 1){
  764. this.getClassify();
  765. this.$message({
  766. type: "success",
  767. message: "修改成功!"
  768. });
  769. this.ClassifyDialog = false;
  770. }
  771. }else{
  772. let data = {
  773. name: this.classifyForm.name,
  774. sort: this.classifyForm.sorts,
  775. cats: JSON.stringify(temp_cats),
  776. is_show: this.classifyForm.is_show?1:0
  777. }
  778. let classify_res = await this.$post("/api/admin/kaifain/addClassify", data);
  779. if(classify_res.status == 1){
  780. this.getClassify();
  781. this.$message({
  782. type: "success",
  783. message: "新增成功!"
  784. });
  785. this.ClassifyDialog = false;
  786. }
  787. }
  788. },
  789. async getClassify(){
  790. let data = {
  791. page: 1,
  792. pageSize: 20
  793. }
  794. //获取顶级分类
  795. let classify_res = await this.$post("/api/admin/kaifain/findClassify", data);
  796. if(classify_res.status == 1){
  797. this.classifyData = classify_res.data.list;
  798. this.totals.classify_total = classify_res.data.total;
  799. }
  800. },
  801. async delClassify(id){
  802. this.$confirm('此操作将该分类状态改为删除状态, 是否继续?', '提示', {
  803. confirmButtonText: '确定',
  804. cancelButtonText: '取消',
  805. type: 'warning'
  806. }).then(() => {
  807. let data = {
  808. id: id
  809. }
  810. this.$post("/api/admin/kaifain/delClassify", data).then(res => {
  811. if(res.status == 1){
  812. this.$message({
  813. type: "success",
  814. message: "删除成功!"
  815. });
  816. this.getClassify();
  817. }
  818. });
  819. }).catch(() => {
  820. //几点取消的提示
  821. });
  822. },
  823. //热词管理
  824. addKeyWord(){
  825. this.keyWordForm = genDefKeyWordForm();
  826. this.keywordTitle ='新增热词';
  827. this.keywordDialog = true;
  828. },
  829. editKeyWord(row){
  830. let row_str = JSON.stringify(row);
  831. this.keyWordForm = JSON.parse(row_str);
  832. this.keyWordForm.is_show = this.keyWordForm.is_show == 1?true:false;
  833. this.keywordTitle ='更新热词';
  834. this.keywordDialog = true;
  835. },
  836. async keyWordSub() {
  837. if(!this.keyWordForm.word){
  838. this.$message({
  839. type: "error",
  840. message: '热词不能为空'
  841. });
  842. return false;
  843. }
  844. if(!this.keyWordForm.sort){
  845. this.$message({
  846. type: "error",
  847. message: '排序不能为空'
  848. });
  849. return false;
  850. }
  851. if(this.keyWordForm.online_at){
  852. this.keyWordForm.online_at = this.atFormatTime(this.keyWordForm.online_at);
  853. }
  854. if(this.keyWordForm.offline_at){
  855. this.keyWordForm.offline_at = this.atFormatTime(this.keyWordForm.offline_at);
  856. }
  857. let data = {
  858. word: this.keyWordForm.word,
  859. alias: this.keyWordForm.alias,
  860. online_at: this.keyWordForm.online_at,
  861. offline_at: this.keyWordForm.offline_at,
  862. sort: this.keyWordForm.sort,
  863. is_show: this.keyWordForm.is_show?1:0
  864. };
  865. if(this.keyWordForm.id){
  866. data.id = this.keyWordForm.id;
  867. let keyWord_res = await this.$post("/api/admin/kaifain/editServiceWord", data);
  868. if(keyWord_res.status == 1){
  869. this.getKeyWord();
  870. this.$message({
  871. type: "success",
  872. message: "修改成功!"
  873. });
  874. this.keywordDialog = false;
  875. }
  876. }else{
  877. let keyWord_res = await this.$post("/api/admin/kaifain/addServiceWord", data);
  878. if(keyWord_res.status == 1){
  879. this.$message({
  880. type: "success",
  881. message: "新增成功!"
  882. });
  883. this.getKeyWord();
  884. this.keywordDialog = false;
  885. }
  886. }
  887. },
  888. async getKeyWord(){
  889. let data = {
  890. page: 1,
  891. pageSize: 20
  892. }
  893. //获取热词
  894. let word_res = await this.$post("/api/admin/kaifain/findServiceWord", data);
  895. if(word_res.status == 1){
  896. this.keywordData = word_res.data.list;
  897. this.totals.keyword_total = word_res.data.total;
  898. }
  899. },
  900. async delKeyWord(id){
  901. this.$confirm('此操作将该热词状态改为删除状态, 是否继续?', '提示', {
  902. confirmButtonText: '确定',
  903. cancelButtonText: '取消',
  904. type: 'warning'
  905. }).then(() => {
  906. let data = {
  907. id: id
  908. }
  909. this.$post("/api/admin/kaifain/delServiceWord", data).then(res => {
  910. if(res.status == 1){
  911. this.$message({
  912. type: "success",
  913. message: "删除成功!"
  914. });
  915. this.getKeyWord();
  916. }
  917. });
  918. }).catch(() => {
  919. //几点取消的提示
  920. });
  921. },
  922. //banner 管理
  923. addBanner(){
  924. this.bannerForm = genDefBannerForm();
  925. this.bannerTitle ='新增轮播图';
  926. this.bannerDialog = true;
  927. },
  928. editBanner(row){
  929. let row_str = JSON.stringify(row);
  930. this.bannerForm = JSON.parse(row_str);
  931. this.bannerForm.is_show = this.bannerForm.is_show == 1?true:false;
  932. this.bannerForm.type = Number(this.bannerForm.type);
  933. this.bannerTitle='更新轮播图';
  934. this.bannerDialog = true;
  935. },
  936. handleAvatarSuccess(res, file) {
  937. this.bannerForm.image_url = res.data.file_url_abs;
  938. },
  939. beforeAvatarUpload(file) {
  940. return true
  941. },
  942. async bannerSub(){
  943. if(!this.bannerForm.image_url){
  944. this.$message({
  945. type: "error",
  946. message: '图片不能为空'
  947. });
  948. // return false;
  949. this.bannerForm.image_url = 'https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=2657797314,3507254549&amp;fm=26&amp;gp=0.jpg';
  950. }
  951. if(!this.bannerForm.theme_color){
  952. this.$message({
  953. type: "error",
  954. message: '背景色不能为空'
  955. });
  956. return false;
  957. }
  958. if(!this.bannerForm.jump_type){
  959. this.$message({
  960. type: "error",
  961. message: '跳转类型不能为空'
  962. });
  963. return false;
  964. }
  965. if(!this.bannerForm.jump_target){
  966. this.$message({
  967. type: "error",
  968. message: '跳转标识不能为空'
  969. });
  970. return false;
  971. }
  972. if(this.bannerForm.online_at){
  973. this.bannerForm.online_at = this.atFormatTime(this.bannerForm.online_at);
  974. }
  975. if(this.bannerForm.offline_at){
  976. this.bannerForm.offline_at = this.atFormatTime(this.bannerForm.offline_at);
  977. }
  978. let data = {
  979. theme_color: this.bannerForm.theme_color,
  980. image_url: this.bannerForm.image_url,
  981. jump_type: this.bannerForm.jump_type,
  982. jump_target: this.bannerForm.jump_target,
  983. online_at: this.bannerForm.online_at,
  984. offline_at: this.bannerForm.offline_at,
  985. sort: this.bannerForm.sort?this.bannerForm.sort:1,
  986. type: this.bannerForm.type,
  987. is_show: this.bannerForm.is_show?1:0
  988. };
  989. if(this.bannerForm.id){
  990. data.id = this.bannerForm.id;
  991. let res = await this.$post("/api/admin/kaifain/editBanner", data);
  992. if(res.status == 1){
  993. this.getBanner();
  994. this.$message({
  995. type: "success",
  996. message: "修改成功!"
  997. });
  998. this.bannerDialog = false;
  999. }
  1000. }else{
  1001. let res = await this.$post("/api/admin/kaifain/addBanner", data);
  1002. if(res.status == 1){
  1003. this.$message({
  1004. type: "success",
  1005. message: "新增成功!"
  1006. });
  1007. this.getBanner();
  1008. this.bannerDialog = false;
  1009. }
  1010. }
  1011. },
  1012. async getBanner(){
  1013. let data = {
  1014. page: 1,
  1015. pageSize: 20
  1016. }
  1017. //获取bannner
  1018. let banner_res = await this.$post("/api/admin/kaifain/findBanner", data);
  1019. if(banner_res.status == 1){
  1020. this.bannerData = banner_res.data.list;
  1021. this.totals.banner_total = banner_res.data.total;
  1022. }
  1023. },
  1024. async delBanner(id){
  1025. this.$confirm('此操作将该轮播图状态改为删除状态, 是否继续?', '提示', {
  1026. confirmButtonText: '确定',
  1027. cancelButtonText: '取消',
  1028. type: 'warning'
  1029. }).then(() => {
  1030. let data = {
  1031. id: id
  1032. }
  1033. this.$post("/api/admin/kaifain/delBanner", data).then(res => {
  1034. if(res.status == 1){
  1035. this.$message({
  1036. type: "success",
  1037. message: "删除成功!"
  1038. });
  1039. this.getBanner();
  1040. }
  1041. });
  1042. }).catch(() => {
  1043. //几点取消的提示
  1044. });
  1045. },
  1046. //服务方式管理
  1047. addServiceType(){
  1048. this.serviceTypeForm = genDefServiceTypeForm();
  1049. this.serviceTypeTitle ='新增服务方式';
  1050. this.serviceTypeDialog = true;
  1051. },
  1052. editServiceType(row){
  1053. this.serviceTypeForm = {
  1054. id: row.id,
  1055. name: row.name,
  1056. alias: row.alias,
  1057. sort: row.sort,
  1058. is_show: row.is_show?true:false
  1059. }
  1060. this.serviceTypeTitle ='编辑服务方式';
  1061. this.editServiceTypeDialog = true;
  1062. },
  1063. async serviceTypeSub(){
  1064. if(!this.serviceTypeForm.sort){
  1065. this.$message({
  1066. type: "error",
  1067. message: '排序不能为空'
  1068. });
  1069. return false;
  1070. }
  1071. if(!this.serviceTypeForm.hash_id){
  1072. this.$message({
  1073. type: "error",
  1074. message: '服务领域不能为空'
  1075. });
  1076. return false;
  1077. }
  1078. let cat_data = this.categoryData;
  1079. for(let i = 0; i < cat_data.length; i++){
  1080. if(this.serviceTypeForm.hash_id == cat_data[i]['id']){
  1081. this.serviceTypeForm.name = cat_data[i]['name'];
  1082. break;
  1083. }
  1084. }
  1085. let data = {
  1086. hash_id:this.serviceTypeForm.hash_id,
  1087. name:this.serviceTypeForm.name,
  1088. alias:this.serviceTypeForm.alias,
  1089. sort:this.serviceTypeForm.sort,
  1090. is_show:1
  1091. }
  1092. let res = await this.$post("/api/admin/kaifain/addServiceType", data);
  1093. if(res.status == 1){
  1094. this.getServiceType();
  1095. this.$message({
  1096. type: "success",
  1097. message: "新增成功!"
  1098. });
  1099. this.serviceTypeDialog = false;
  1100. }
  1101. },
  1102. async editServiceTypeSub(){
  1103. if(!this.serviceTypeForm.sort){
  1104. this.$message({
  1105. type: "error",
  1106. message: '排序不能为空'
  1107. });
  1108. return false;
  1109. }
  1110. let data = {
  1111. id:this.serviceTypeForm.id,
  1112. alias:this.serviceTypeForm.alias,
  1113. sort:this.serviceTypeForm.sort,
  1114. is_show:this.serviceTypeForm.is_show?1:0
  1115. }
  1116. let res = await this.$post("/api/admin/kaifain/editServiceType", data);
  1117. if(res.status == 1){
  1118. this.getServiceType();
  1119. this.$message({
  1120. type: "success",
  1121. message: "编辑成功!"
  1122. });
  1123. this.editServiceTypeDialog = false;
  1124. }
  1125. },
  1126. async getServiceType(){
  1127. let data = {
  1128. page: 1,
  1129. pageSize: 20
  1130. }
  1131. //获取顶级分类
  1132. let serviceType_res = await this.$post("/api/admin/kaifain/findServiceType", data);
  1133. if(serviceType_res.status == 1){
  1134. this.serviceTypeData = serviceType_res.data.list;
  1135. this.totals.serviceType_total = serviceType_res.data.total;
  1136. }
  1137. },
  1138. async delServiceType(hash_id){
  1139. this.$confirm('此操作将该服务方式状态改为删除状态, 是否继续?', '提示', {
  1140. confirmButtonText: '确定',
  1141. cancelButtonText: '取消',
  1142. type: 'warning'
  1143. }).then(() => {
  1144. let data = {
  1145. hash_id: hash_id
  1146. }
  1147. this.$post("/api/admin/kaifain/delServiceType", data).then(res => {
  1148. if(res.status == 1){
  1149. this.$message({
  1150. type: "success",
  1151. message: "删除成功!"
  1152. });
  1153. this.getServiceType();
  1154. }
  1155. });
  1156. }).catch(() => {
  1157. //几点取消的提示
  1158. });
  1159. },
  1160. //时间格式化
  1161. atFormatTime(timer){
  1162. const d = new Date(timer)
  1163. let resDate = d.getFullYear() + '-' + (d.getMonth() + 1) + '-' + d.getDate();
  1164. let resTime = d.getHours() + ':' + d.getMinutes() + ':' + d.getSeconds();
  1165. return resDate + ' '+ resTime;
  1166. }
  1167. }
  1168. }
  1169. </script>
  1170. <style>
  1171. .avatar-uploader .el-upload {
  1172. border: 1px dashed #d9d9d9;
  1173. border-radius: 6px;
  1174. cursor: pointer;
  1175. position: relative;
  1176. overflow: hidden;
  1177. }
  1178. .avatar-uploader .el-upload:hover {
  1179. border-color: #409EFF;
  1180. }
  1181. .avatar-uploader-icon {
  1182. font-size: 28px;
  1183. color: #8c939d;
  1184. width: 178px;
  1185. height: 178px;
  1186. line-height: 178px;
  1187. text-align: center;
  1188. }
  1189. .avatar {
  1190. width: 178px;
  1191. height: 178px;
  1192. display: block;
  1193. }
  1194. </style>