classifylist.vue 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925
  1. <template>
  2. <div id="classifylist">
  3. <el-card class="box-card">
  4. <div slot="header" class="header">
  5. <div class="type-box">
  6. <span class="act">中文分类</span>
  7. <span @click="$emit('typeChange','2')">英文分类</span>
  8. </div>
  9. <el-form :inline="true" :model="searchform" @submit.native.prevent>
  10. <el-form-item label="">
  11. <el-button type="primary" size="small" @click="aeDialogTrue">添加分类</el-button>
  12. </el-form-item>
  13. <el-form-item>
  14. <el-input placeholder="分类名称" @change="search" v-model="searchform.key_word" clearable size="small">
  15. <i class="el-icon-search" slot="prefix" @click="search"></i>
  16. </el-input>
  17. </el-form-item>
  18. </el-form>
  19. </div>
  20. <template>
  21. <el-table style="border:1px solid #eaeaea;" :data="tableData" v-loading="listLoading" :row-class-name="tableRowClassName" element-loading-text="数据加载中..." :default-expand-all='isexpand' row-key="Id" :tree-props="{children:'children',hasChildren:'hasChildren'}">
  22. <!-- <el-table-column prop="id" label="序号" width="100px" align="left">
  23. <template slot-scope="scope">
  24. <span>{{scope.row.ischild?'':scope.row.id}}</span>
  25. </template>
  26. </el-table-column> -->
  27. <el-table-column prop="classify_name" label="一级分类">
  28. <template slot-scope="scope">
  29. <span>{{scope.row.ischild?'':scope.row.ClassifyName}}</span>
  30. <img style="width:16px;position: relative;top:3px" src="../../assets/img/icons/ppt-icon.png" alt="" v-if="!scope.row.ischild&&scope.row.HasTeleconference">
  31. </template>
  32. </el-table-column>
  33. <el-table-column prop="classify_name" label="二级分类">
  34. <template slot-scope="scope">
  35. <span>{{scope.row.ischild?scope.row.ClassifyName:''}}</span>
  36. <img style="width:16px;position: relative;top:3px" src="../../assets/img/icons/ppt-icon.png" alt="" v-if="scope.row.ischild&&scope.row.HasTeleconference">
  37. </template>
  38. </el-table-column>
  39. <el-table-column label="操作" align="center">
  40. <template slot-scope="scope">
  41. <div style="color:#4099ef; font-size:24px;">
  42. <span class="editsty" v-if="scope.row.ClassifyName=='晨报' || scope.row.ClassifyName=='周报'" @click="chapterSetting(scope.row)">章节设置</span>
  43. <span class="editsty" :class="{'editedsty' : editedItems.includes(scope.row.Id)}" v-if="scope.row.ischild" @click="configitem(scope.row)">权限配置</span>
  44. &nbsp;&nbsp;
  45. <!-- <i class="el-icon-edit-outline" @click="edititem(scope.row)"></i> -->
  46. <span class="editsty" @click="edititem(scope.row)">编辑</span>
  47. &nbsp;&nbsp;
  48. <!-- <i class="el-icon-delete" @click="checkdeleteitem(scope.row)"></i> -->
  49. <span class="deletesty" @click="checkdeleteitem(scope.row)">删除</span>
  50. </div>
  51. </template>
  52. </el-table-column>
  53. </el-table>
  54. </template>
  55. <el-col :span="24" class="toolbar">
  56. <el-pagination v-if="ispage" layout="total,prev,pager,next,jumper" background @current-change="handleCurrentChange" :page-size="pageSize" @size-change="handleSizeChange" :total="total" style="float:right;"></el-pagination>
  57. </el-col>
  58. </el-card>
  59. <!-- 添加分类弹框 -->
  60. <el-dialog :modal-append-to-body='false' :title="isadd?'添加分类':'编辑分类'" :visible.sync="aeDialog" :close-on-click-modal="false" :center="true" v-dialogDrag custom-class="dialogclassLog" width="700px">
  61. <div slot="title" style="display:flex;alignItems:center;">
  62. <img :src="isadd?$icons.add:$icons.edit" style="color:#fff;width:16px;height:16px;marginRight:5px;">
  63. <span style="fontSize:16px;">{{isadd?'添加分类':'编辑分类'}}</span>
  64. </div>
  65. <el-form :model="aeForm" :rules="aerules" ref="aeForm" label-position="right" label-width="140px" class="demo-aeForm" id="login-container" @submit.native.prevent>
  66. <el-form-item prop="classify_name" label="分类名称">
  67. <el-input type="text" v-model="aeForm.classify_name" placeholder="请输入" size="small" style="width:400px;"></el-input>
  68. </el-form-item>
  69. <el-form-item prop="parent_id" label="上级分类">
  70. <el-select v-model="aeForm.parent_id" placeholder="请选择" size="small" style="width:400px;" @change="parentSelectChange(aeForm.parent_id)">
  71. <el-option label="无" :value="0"></el-option>
  72. <el-option v-for="(item,index) in classifyparentArr" :key="index" :label="item.ClassifyName" :value="item.Id"></el-option>
  73. </el-select>
  74. </el-form-item>
  75. <!-- 子目录 -->
  76. <el-form-item label="子目录" v-if="aeForm.parent_id==0&&aeForm.showType==1">
  77. <draggable v-model="ClassifyMenuList" animation="300">
  78. <div style="display:inline-block;margin-right:5px" v-for="(item,index) in ClassifyMenuList" :key="item">
  79. <el-input
  80. v-if="item.inputVisible"
  81. v-model="item.MenuName"
  82. ref="itemINput"
  83. size="small"
  84. style="width: 90px;"
  85. :autofocus="true"
  86. @keyup.enter.native="item.inputVisible=false"
  87. @blur="item.inputVisible=false"
  88. ></el-input>
  89. <el-tag
  90. v-else
  91. closable
  92. :disable-transitions="false"
  93. @click="showInput(index)"
  94. @close="handleClose(index)">
  95. {{item.MenuName}}
  96. </el-tag>
  97. </div>
  98. </draggable>
  99. <div>
  100. <el-input
  101. v-if="inputVisible"
  102. v-model="inputValue"
  103. ref="saveTagInput"
  104. size="small"
  105. @keyup.enter.native="handleInputConfirm"
  106. @blur="handleInputConfirm"
  107. style="width: 90px;"
  108. >
  109. </el-input>
  110. <el-button v-else size="small" @click="showInput(-1)">+ 点击新增</el-button>
  111. </div>
  112. </el-form-item>
  113. <el-form-item label="子目录" v-if="aeForm.parent_id!=0">
  114. <el-select v-model="aeForm.ClassifyMenuId" clearable placeholder="请选择" style="width:400px;">
  115. <el-option
  116. :label="item.MenuName"
  117. :value="item.MenuId"
  118. v-for="item in selectMenuOpt"
  119. :key="item.MenuId"
  120. ></el-option>
  121. </el-select>
  122. </el-form-item>
  123. <el-form-item prop="label" label="分类标签" v-if="aeForm.parent_id!=0">
  124. <el-input type="textarea" autosize v-model="aeForm.label" placeholder="请输入" size="small" style="width:400px;font-size:14px;"></el-input>
  125. </el-form-item>
  126. <el-form-item label="展示形式" prop="showType" v-if="aeForm.parent_id==0">
  127. <el-select v-model="aeForm.showType" placeholder="请选择" style="width:400px;">
  128. <el-option label="列表" :value="1"></el-option>
  129. <el-option label="专栏" :value="2"></el-option>
  130. <el-option label="品种" :value="3"></el-option>
  131. </el-select>
  132. </el-form-item>
  133. <el-form-item label="后台排序" prop="Sort" v-if="aeForm.parent_id==0">
  134. <el-input-number v-model="aeForm.Sort" placeholder="请输入数字"></el-input-number>
  135. <!-- <el-input type="number" v-model="aeForm.Sort" placeholder="请输入数字" size="small" ></el-input> -->
  136. </el-form-item>
  137. <el-form-item label="FICC页排序" prop="YbFiccSort" v-if="aeForm.parent_id==0">
  138. <el-input-number v-model="aeForm.YbFiccSort" placeholder="请输入数字"></el-input-number>
  139. <!-- <el-input type="number" v-model="aeForm.YbFiccSort" placeholder="请输入数字" size="small" style="width:400px;"></el-input> -->
  140. </el-form-item>
  141. <el-form-item label="FICC页icon" v-if="aeForm.parent_id==0" prop="YbFiccIcon">
  142. <input type="file" size="small" name="file" @change="fileSelected(6)" id="file6" class="true-file" style="display:none;">
  143. <el-input readonly type="text" v-model="aeForm.YbFiccIcon" placeholder="上传FICC页icon" size="medium" style="width:400px;">
  144. <el-button slot="append" type="primary" size="mini" @click.native="clickinput(6)">选择图片</el-button>
  145. </el-input>
  146. </el-form-item>
  147. <el-form-item label="报告合集配图" v-if="aeForm.parent_id==0&&aeForm.showType!==2" prop="YbRightBanner">
  148. <input type="file" size="small" name="file" @change="fileSelected(11)" id="file11" class="true-file" style="display:none;">
  149. <el-input readonly type="text" v-model="aeForm.YbRightBanner" placeholder="上传报告合集配图" size="medium" style="width:400px;">
  150. <el-button slot="append" type="primary" size="mini" @click.native="clickinput(11)">选择图片</el-button>
  151. </el-input>
  152. </el-form-item>
  153. <!-- <el-form-item label="已购icon" v-if="aeForm.parent_id==0" prop="YbIconUrl">
  154. <input type="file" size="small" name="file" @change="fileSelected(7)" id="file7" class="true-file" style="display:none;">
  155. <el-input readonly type="text" v-model="aeForm.YbIconUrl" placeholder="上传已购icon" size="medium" style="width:400px;">
  156. <el-button slot="append" type="primary" size="mini" @click.native="clickinput(7)">选择图片</el-button>
  157. </el-input>
  158. </el-form-item>
  159. <el-form-item label="已购详情配图" v-if="aeForm.parent_id==0" prop="YbBgUrl">
  160. <input type="file" size="small" name="file" @change="fileSelected(8)" id="file8" class="true-file" style="display:none;">
  161. <el-input readonly type="text" v-model="aeForm.YbBgUrl" placeholder="上传已购详情配图" size="medium" style="width:400px;">
  162. <el-button slot="append" type="primary" size="mini" @click.native="clickinput(8)">选择图片</el-button>
  163. </el-input>
  164. </el-form-item> -->
  165. <!-- 一级分类 展示分享链接配图 -->
  166. <el-form-item label="分享链接配图" prop="YbShareBgImg" v-if="aeForm.parent_id==0">
  167. <input type="file" size="small" name="file" @change="fileSelected(10)" id="file10" class="true-file" style="display:none;">
  168. <el-input readonly type="text" v-model="aeForm.YbShareBgImg" placeholder="上传分享链接配图" size="medium" style="width:400px;">
  169. <el-button slot="append" type="primary" size="mini" @click.native="clickinput(10)">选择图片</el-button>
  170. </el-input>
  171. </el-form-item>
  172. <el-form-item label="PC端背景颜色" prop="YbFiccPcIcon" v-if="aeForm.parent_id==0">
  173. <el-select v-model="aeForm.YbFiccPcIcon" placeholder="选择背景颜色" style="width:400px;">
  174. <el-option :label="item.label" :value="item.val" v-for="item in YbFiccPcIconList" :key="item.label"></el-option>
  175. </el-select>
  176. </el-form-item>
  177. <el-form-item label="小程序端隐藏" prop="IsShow" v-if="aeForm.parent_id==0">
  178. <el-switch v-model="aeForm.IsShow" inactive-color="#ededed"></el-switch>
  179. <!-- <span>{{aeForm.IsShow?'开':'关'}}</span> -->
  180. </el-form-item>
  181. <el-form-item label="PPT转报告" prop="hasTel" v-if="aeForm.parent_id!=0">
  182. <el-select v-model="aeForm.hasTel" placeholder="请选择" style="width:400px;">
  183. <el-option label="无" :value="0"></el-option>
  184. <el-option label="有" :value="1"></el-option>
  185. </el-select>
  186. </el-form-item>
  187. <el-form-item label="关联设置" prop="relate" v-if="!['晨报','周报'].includes(aeForm.classify_name)">
  188. <el-select v-model="aeForm.relate" multiple placeholder="请选择" style="width:400px;">
  189. <el-option label="报告电话会" :value="1"></el-option>
  190. <el-option label="视频关联报告" :value="2"></el-option>
  191. </el-select>
  192. </el-form-item>
  193. <!-- <el-form-item prop="abstract" label="分类简介" v-if="aeForm.parent_id!=0">
  194. <el-input type="textarea" v-model="aeForm.abstract" placeholder="请输入" size="small" style="width:400px;"></el-input>
  195. </el-form-item> -->
  196. <el-form-item label="分享描述" v-if="aeForm.parent_id!=0">
  197. <el-input type="textarea" autosize v-model="aeForm.descript" placeholder="请输入" size="small" style="width:400px;font-size:14px;"></el-input>
  198. </el-form-item>
  199. <el-form-item label="栏目作者" v-if="aeForm.parent_id!=0&&!parentIsList&&!parentIsVariety" prop="author">
  200. <el-input type="text" v-model="aeForm.author" placeholder="请输入" size="small" style="width:400px;"></el-input>
  201. </el-form-item>
  202. <el-form-item label="作者简介" v-if="aeForm.parent_id!=0&&!parentIsList&&!parentIsVariety" prop="authorDsec">
  203. <el-input type="text" v-model="aeForm.authorDsec" placeholder="请输入" size="small" style="width:400px;"></el-input>
  204. </el-form-item>
  205. <el-form-item label="作者头衔" v-if="aeForm.parent_id!=0&&!parentIsList&&!parentIsVariety" prop="authorTag">
  206. <el-input type="text" v-model="aeForm.authorTag" placeholder="请输入" size="small" style="width:400px;"></el-input>
  207. </el-form-item>
  208. <el-form-item label="栏目简介" v-if="aeForm.parent_id!=0&&!parentIsList&&!parentIsVariety" prop="classifyDsec">
  209. <el-input type="textarea" v-model="aeForm.classifyDsec" placeholder="请输入" size="small" style="width:400px;font-size:14px;" autosize></el-input>
  210. </el-form-item>
  211. <el-form-item label="分享链接配图" v-if="aeForm.parent_id!=0&&!parentIsList&&!parentIsVariety" prop="YbShareBgImg">
  212. <input type="file" size="small" name="file" @change="fileSelected(10)" id="file10" class="true-file" style="display:none;">
  213. <el-input readonly type="text" v-model="aeForm.YbShareBgImg" placeholder="上传分享链接配图" size="medium" style="width:400px;">
  214. <el-button slot="append" type="primary" size="mini" @click.native="clickinput(10)">选择图片</el-button>
  215. </el-input>
  216. </el-form-item>
  217. <el-form-item label="首页配图" v-if="aeForm.parent_id!=0&&!parentIsList&&!parentIsVariety" prop="classifyImg">
  218. <input type="file" size="small" name="file" @change="fileSelected(1)" id="file1" class="true-file" style="display:none;">
  219. <el-input type="text" v-model="aeForm.classifyImg" placeholder="上传首页配图" size="medium" style="width:400px;">
  220. <el-button slot="append" type="primary" size="mini" @click.native="clickinput(1)">选择图片</el-button>
  221. </el-input>
  222. </el-form-item>
  223. <el-form-item label="研报配图" v-if="aeForm.parent_id!=0&&!parentIsList&&!parentIsVariety" prop="reportImg">
  224. <input type="file" size="small" name="file" @change="fileSelected(5)" id="file5" class="true-file" style="display:none;">
  225. <el-input type="text" v-model="aeForm.reportImg" placeholder="上传研报配图" size="medium" style="width:400px;">
  226. <el-button slot="append" type="primary" size="mini" @click.native="clickinput(5)">选择图片</el-button>
  227. </el-input>
  228. </el-form-item>
  229. <el-form-item label="专栏配图" v-if="aeForm.parent_id!=0&&!parentIsList&&!parentIsVariety" prop="columImg">
  230. <input type="file" size="small" name="file" @change="fileSelected(4)" id="file4" class="true-file" style="display:none;">
  231. <el-input type="text" v-model="aeForm.columImg" placeholder="上传专栏配图" size="medium" style="width:400px;">
  232. <el-button slot="append" type="primary" size="mini" @click.native="clickinput(4)">选择图片</el-button>
  233. </el-input>
  234. </el-form-item>
  235. <el-form-item label="头部banner" v-if="aeForm.parent_id!=0&&!parentIsList&&!parentIsVariety" prop="bannerImg">
  236. <input type="file" size="small" name="file" @change="fileSelected(2)" id="file2" class="true-file" style="display:none;">
  237. <el-input type="text" v-model="aeForm.bannerImg" placeholder="上传头部banner" size="medium" style="width:400px;">
  238. <el-button slot="append" type="primary" size="mini" @click.native="clickinput(2)">选择图片</el-button>
  239. </el-input>
  240. </el-form-item>
  241. <el-form-item label="头像" v-if="aeForm.parent_id!=0&&!parentIsList&&!parentIsVariety" prop="avatar">
  242. <input type="file" size="small" name="file" @change="fileSelected(3)" id="file3" class="true-file" style="display:none;">
  243. <el-input type="text" v-model="aeForm.avatar" placeholder="上传头像" size="medium" style="width:400px;">
  244. <el-button slot="append" type="primary" size="mini" @click.native="clickinput(3)">选择图片</el-button>
  245. </el-input>
  246. </el-form-item>
  247. <el-form-item label="列表背景图" v-if="aeForm.parent_id!=0&&(parentIsList||parentIsVariety)" prop="YbListImg">
  248. <input type="file" size="small" name="file" @change="fileSelected(9)" id="file9" class="true-file" style="display:none;">
  249. <el-input readonly type="text" v-model="aeForm.YbListImg" placeholder="上传列表背景图" size="medium" style="width:400px;">
  250. <el-button slot="append" type="primary" size="mini" @click.native="clickinput(9)">选择图片</el-button>
  251. </el-input>
  252. </el-form-item>
  253. <!-- 列表、品种的二级分类 展示分享链接配图 但是不是必填的 -->
  254. <el-form-item label="分享链接配图" prop="YbShareBgImg_" v-if="aeForm.parent_id!=0&&(parentIsList||parentIsVariety)">
  255. <input type="file" size="small" name="file" @change="fileSelected(12)" id="file12" class="true-file" style="display:none;">
  256. <el-input readonly type="text" v-model="aeForm.YbShareBgImg_" placeholder="上传分享链接配图" size="medium" style="width:400px;">
  257. <el-button slot="append" type="primary" size="mini" @click.native="clickinput(12)">选择图片</el-button>
  258. </el-input>
  259. </el-form-item>
  260. </el-form>
  261. <div slot="footer" class="dialog-footer" style="text-align:right;">
  262. <el-button type="primary" plain size="small" @click.native="aeDialog=false">取 消</el-button>
  263. <el-button type="primary" size="small" @click.native="saveDialog">保 存</el-button>
  264. </div>
  265. </el-dialog>
  266. <!-- 权限配置弹窗 -->
  267. <PermissionDialog :isShow.sync="isShowPermissionDia" :id="classifyPermissionId" @saveConfig="saveConfig"/>
  268. </div>
  269. </template>
  270. <script>
  271. import { classifylist,classifyparent,classifyadd,classifydelete,classifyedit,checkDeleteClassify,bannerupload } from 'api/api.js';
  272. import PermissionDialog from './components/PermissionDialog.vue'
  273. import draggable from 'vuedraggable';
  274. export default{
  275. computed:{
  276. parentIsList(){
  277. //当前上级分类是否为列表
  278. let flag=false
  279. if(this.aeDialog){
  280. this.classifyparentArr.forEach(item=>{
  281. if(item.Id==this.aeForm.parent_id){
  282. if(item.ShowType==1){
  283. flag=true
  284. }
  285. }
  286. })
  287. }
  288. return flag
  289. },
  290. parentIsVariety(){
  291. //当前上级分类是否为品种
  292. let flag=false
  293. if(this.aeDialog){
  294. this.classifyparentArr.forEach(item=>{
  295. if(item.Id==this.aeForm.parent_id){
  296. if(item.ShowType==3){
  297. flag=true
  298. }
  299. }
  300. })
  301. }
  302. return flag
  303. },
  304. selectMenuOpt(){
  305. let arr=[]
  306. if(this.aeDialog){
  307. this.classifyparentArr.forEach(item=>{
  308. if(item.Id==this.aeForm.parent_id){
  309. arr=item.ClassifyMenuList||[]
  310. }
  311. })
  312. }
  313. return arr
  314. },
  315. },
  316. data(){
  317. return {
  318. PageIndex:0,
  319. total:0,
  320. pageSize:15,
  321. ispage:true,
  322. listLoading:false,
  323. tableData:[],
  324. searchform:{
  325. key_word:'',
  326. },
  327. aeDialog:false,
  328. aeForm:{
  329. classify_name:'',
  330. parent_id:0,
  331. abstract:'',
  332. descript:'',
  333. author:'',
  334. authorDsec:'',
  335. classifyDsec:'',
  336. authorTag:'',
  337. classifyImg:'',
  338. reportImg:'',
  339. columImg:'',
  340. bannerImg:'',
  341. avatar:'',
  342. label:"",
  343. hasTel:0,//是否有电话会:0-否 1-是
  344. showType:1,//展示形式 1-列表 2-专栏 3-品种
  345. Sort:'',
  346. YbFiccSort:'',
  347. YbFiccIcon:'',
  348. YbIconUrl:'',
  349. YbBgUrl:'',
  350. YbFiccPcIcon:'',
  351. IsShow:false,//是否在小程序端展示:0-隐藏 1-显示
  352. YbListImg:'',//小程序研报列表封面图
  353. YbShareBgImg:'',
  354. ClassifyMenuId:'',
  355. YbRightBanner:'',//报告合集配图
  356. relate:[],
  357. },
  358. aerules:{
  359. classify_name:[{
  360. required:true,
  361. message:'请输入分类名称',
  362. trigger:'blur'
  363. }],
  364. parent_id:[{
  365. required:true,
  366. message:'请选择父级分类',
  367. trigger:'change'
  368. }],
  369. abstract:[{
  370. required:true,
  371. message:'请输入分类简介',
  372. trigger:'blur'
  373. }],
  374. descript:[{
  375. required:true,
  376. message:'请输入分类描述',
  377. trigger:'blur'
  378. }],
  379. author:[{
  380. required:true,
  381. message:'请输入栏目作者',
  382. trigger:'blur'
  383. }],
  384. authorDsec:[{
  385. required:true,
  386. message:'请输入作者简介',
  387. trigger:'blur'
  388. }],
  389. classifyDsec:[{
  390. required:true,
  391. message:'请输入栏目简介',
  392. trigger:'blur'
  393. }],
  394. classifyImg:[{
  395. required:true,
  396. message:'请上传首页配图',
  397. trigger:'blur'
  398. }],
  399. reportImg:[{
  400. required:true,
  401. message:'请上传研报配图',
  402. trigger:'blur'
  403. }],
  404. bannerImg:[{
  405. required:true,
  406. message:'请上传头部banner',
  407. trigger:'blur'
  408. }],
  409. avatar:[{
  410. required:true,
  411. message:'请上传作者头像',
  412. trigger:'blur'
  413. }],
  414. columImg:[{
  415. required:true,
  416. message:'请上传专栏配图',
  417. trigger:'blur'
  418. }],
  419. label:[{
  420. required:true,
  421. message:'请输入分类标签',
  422. trigger:'blur'
  423. }],
  424. hasTel:[{
  425. required:true,
  426. message:'请选择',
  427. trigger:'change'
  428. }],
  429. showType:[{
  430. required:true,
  431. message:'请选择展示形式',
  432. trigger:'change'
  433. }],
  434. Sort:[{
  435. required:true,
  436. message:'请输入数字',
  437. trigger:'blur'
  438. }],
  439. YbFiccSort:[{
  440. required:true,
  441. message:'请输入数字',
  442. trigger:'blur'
  443. }],
  444. YbFiccIcon:[{
  445. required:true,
  446. message:'上传FICC页icon',
  447. trigger:'change'
  448. }],
  449. YbRightBanner:[{
  450. required:true,
  451. message:'上传报告合集配图',
  452. trigger:'change'
  453. }],
  454. YbFiccPcIcon:[{
  455. required:true,
  456. message:'选择背景颜色',
  457. trigger:'change'
  458. }],
  459. IsShow:[{
  460. required:true,
  461. message:'小程序端隐藏',
  462. trigger:'change'
  463. }],
  464. YbListImg:[{
  465. required:true,
  466. message:'上传列表背景图',
  467. trigger:'change'
  468. }],
  469. YbShareBgImg:[{
  470. required:true,
  471. message:'上传列表背景图',
  472. trigger:'change'
  473. }],
  474. },
  475. isadd:true,
  476. classifyparentArr:[],
  477. isexpand:false,
  478. isShowPermissionDia: false, //是否显示权限管理弹窗
  479. classifyPermissionId: 0, //进行权限管理的分类id
  480. editedItems:[], //修改过权限的分类
  481. YbFiccPcIconList:[
  482. {
  483. label:'蓝色',
  484. val:'https://hzstatic.hzinsights.com/static/yb_wx/ficc_classify_bg_blue.png'
  485. },
  486. {
  487. label:'绿色',
  488. val:'https://hzstatic.hzinsights.com/static/yb_wx/ficc_classify_bg_green.png'
  489. },
  490. {
  491. label:'红色',
  492. val:'https://hzstatic.hzinsights.com/static/yb_wx/ficc_classify_bg_orange.png'
  493. },
  494. ],
  495. inputVisible:false,
  496. inputValue:'',
  497. ClassifyMenuList:[],
  498. }
  499. },
  500. components: {
  501. PermissionDialog,
  502. draggable
  503. },
  504. mounted(){
  505. this.getlist();
  506. // document.onkeydown=e=>{
  507. // let keyval=window.event.keyCode;
  508. // if( keyval===13 && this.$route.path === '/classifylist'){
  509. // this.getlist();
  510. // }
  511. // }
  512. },
  513. methods:{
  514. showInput(index){
  515. if(index!=-1){
  516. this.ClassifyMenuList[index].inputVisible=true
  517. this.$nextTick(_ => {
  518. this.$refs.itemINput[0].$refs.input.focus();
  519. })
  520. return
  521. }
  522. this.inputVisible = true;
  523. this.$nextTick(_ => {
  524. this.$refs.saveTagInput.$refs.input.focus();
  525. });
  526. },
  527. handleInputConfirm() {
  528. let inputValue = this.inputValue;
  529. if (inputValue) {
  530. this.ClassifyMenuList.push({MenuId:0,MenuName:inputValue,inputVisible:false});
  531. }
  532. this.inputVisible = false;
  533. this.inputValue = '';
  534. },
  535. handleClose(index){
  536. this.ClassifyMenuList.splice(index,1)
  537. },
  538. tableRowClassName({row,rowIndex}) {
  539. if( row.ischild ){
  540. return 'success-row';
  541. }else{
  542. return '';
  543. }
  544. },
  545. edititem(item){ //去编辑
  546. classifyparent({}).then((res) => {
  547. if( res.Ret==200 ){
  548. this.classifyparentArr=[];
  549. res.Data.forEach((child,i)=>{
  550. // if(child.ClassifyName!=item.ClassifyName){
  551. child.Id=parseInt(child.Id);
  552. //如果没有子项
  553. if(!item.Child){
  554. this.classifyparentArr.push(child);
  555. }
  556. // }
  557. });
  558. }
  559. });
  560. console.log(item);
  561. // this.aeForm={classify_id:parseInt(item.id),classify_name:item.classify_name,parent_id:parseInt(item.parent_id),abstract:item.abstract,descript:item.descript};
  562. this.aeForm={
  563. classify_id:parseInt(item.Id),
  564. classify_name:item.ClassifyName,
  565. parent_id:item.ParentId,
  566. descript:item.Descript,
  567. author:item.ReportAuthor,
  568. authorDsec:item.AuthorDescript,
  569. classifyDsec:item.Abstract,
  570. authorTag:item.VipTitle,
  571. classifyImg:item.ReportImgUrl,
  572. reportImg:item.HomeImgUrl,
  573. columImg:item.ColumnImgUrl,
  574. bannerImg:item.HeadImgUrl,
  575. avatar:item.AvatarImgUrl,
  576. label:item.ClassifyLabel,
  577. hasTel:item.HasTeleconference,
  578. showType:item.ShowType,
  579. Sort:item.Sort,
  580. YbFiccSort:item.YbFiccSort,
  581. YbFiccIcon:item.YbFiccIcon,
  582. YbIconUrl:item.YbIconUrl,
  583. YbBgUrl:item.YbBgUrl,
  584. YbFiccPcIcon:item.YbFiccPcIcon,
  585. IsShow:item.IsShow==0?true:false,//是否在小程序端展示:0-隐藏 1-显示
  586. YbListImg:item.YbListImg,
  587. YbShareBgImg:item.YbShareBgImg,
  588. ClassifyMenuId:item.ClassifyMenuId||'',
  589. YbRightBanner:item.YbRightBanner||'',
  590. relate:[item.RelateTel==1?1:null,item.RelateVideo==1?2:null],
  591. };
  592. this.ClassifyMenuList=item.ClassifyMenuList?item.ClassifyMenuList.map(item=>{
  593. return {
  594. MenuId:item.MenuId,
  595. MenuName:item.MenuName,
  596. inputVisible:false
  597. }
  598. }):[]
  599. //若编辑的为列表、品种下的二级分类 需要计算YbShareBgImg_
  600. //已填写则获取已填写内容
  601. if(item.YbShareBgImg){
  602. this.aeForm.YbShareBgImg_ = item.YbShareBgImg
  603. }
  604. //若未填写则取一级分类的YbShareBgImg
  605. else{
  606. this.aeForm.YbShareBgImg_ = this.getParentYbShareBgImg(item.ParentId)
  607. }
  608. this.isadd=false;
  609. this.aeDialog=true;
  610. this.$nextTick(()=>{
  611. this.$refs.aeForm.clearValidate();
  612. })
  613. },
  614. checkdeleteitem(item){ //删除前检测
  615. checkDeleteClassify({ClassifyId:parseInt(item.Id)}).then(res =>{
  616. if(res.Ret==200){
  617. if(res.Data.Code==0){
  618. this.deleteitem(item);
  619. }else{
  620. this.$message.error( res.Data.Msg );
  621. }
  622. }
  623. });
  624. },
  625. deleteitem(item){
  626. this.$confirm('确认删除吗?','提示',{type:'warning'}).then(() => {
  627. classifydelete({ClassifyId:parseInt(item.Id)}).then(res =>{
  628. if( res.Ret==200 ){
  629. this.$message.success( res.Msg );
  630. this.getlist();
  631. }
  632. });
  633. }).catch(() => {});
  634. },
  635. configitem(item){
  636. this.classifyPermissionId=item.Id
  637. this.isShowPermissionDia=true
  638. },
  639. saveDialog(){ //保存
  640. this.$refs.aeForm.validate((valid)=>{
  641. if( valid ){
  642. // let params={classify_name:this.aeForm.classify_name,parent_id:parseInt(this.aeForm.parent_id),abstract:this.aeForm.abstract,descript:this.aeForm.descript};
  643. let params={
  644. ClassifyName:this.aeForm.classify_name,
  645. ParentId:parseInt(this.aeForm.parent_id),
  646. Descript:this.aeForm.descript,
  647. ReportAuthor:this.aeForm.author,
  648. AuthorDescript:this.aeForm.authorDsec,
  649. VipTitle:this.aeForm.authorTag,
  650. Abstract:this.aeForm.classifyDsec,
  651. ColumnImgUrl:this.aeForm.columImg,
  652. ReportImgUrl:this.aeForm.classifyImg,
  653. HomeImgUrl:this.aeForm.reportImg,
  654. HeadImgUrl:this.aeForm.bannerImg,
  655. AvatarImgUrl:this.aeForm.avatar,
  656. ClassifyLabel:this.aeForm.label,
  657. ShowType:this.aeForm.showType,
  658. HasTeleconference:this.aeForm.hasTel,
  659. Sort:this.aeForm.Sort?Number(this.aeForm.Sort):0,
  660. YbFiccSort:this.aeForm.YbFiccSort?Number(this.aeForm.YbFiccSort):0,
  661. YbFiccIcon:this.aeForm.YbFiccIcon,
  662. YbIconUrl:this.aeForm.YbIconUrl,
  663. YbBgUrl:this.aeForm.YbBgUrl,
  664. YbFiccPcIcon:this.aeForm.YbFiccPcIcon,
  665. IsShow:this.aeForm.IsShow?0:1,//是否在小程序端展示:0-隐藏 1-显示
  666. YbListImg:this.aeForm.YbListImg,
  667. /* 一级分类为列表、品种的报告,二级分类的分享链接图*/
  668. YbShareBgImg:this.aeForm.parent_id!=0&&(this.parentIsList||this.parentIsVariety)?this.aeForm.YbShareBgImg_:this.aeForm.YbShareBgImg,
  669. ClassifyMenuId:this.aeForm.ClassifyMenuId||0,
  670. YbRightBanner:this.aeForm.YbRightBanner||'',
  671. RelateTel:this.aeForm.relate.includes(1)?1:0,
  672. RelateVideo:this.aeForm.relate.includes(2)?1:0,
  673. };
  674. params.MenuList=this.ClassifyMenuList.map(item=>{
  675. return {
  676. MenuId:item.MenuId,
  677. MenuName:item.MenuName
  678. }
  679. })
  680. if( this.isadd ){
  681. classifyadd(params).then(res =>{
  682. if( res.Ret==200 ){
  683. this.$message.success( res.Msg );
  684. this.getlist();
  685. this.aeDialog=false;
  686. }
  687. });
  688. }else{
  689. params.ClassifyId=this.aeForm.classify_id;
  690. classifyedit(params).then(res =>{
  691. if( res.Ret==200 ){
  692. this.$message.success( res.Msg );
  693. this.getlist();
  694. this.aeDialog=false;
  695. }
  696. });
  697. }
  698. // this.isexpand=true;
  699. }
  700. });
  701. },
  702. aeDialogTrue(){ //去新增
  703. classifyparent({}).then((res) => {
  704. if( res.Ret==200 ){
  705. this.classifyparentArr=res.Data || [];
  706. this.aeForm={
  707. classify_name:'',
  708. parent_id:0,
  709. abstract:'',
  710. descript:'',
  711. author:'',
  712. authorDsec:'',
  713. authorTag:'',
  714. classifyDsec:'',
  715. classifyImg:'',
  716. reportImg:'',
  717. columImg:'',
  718. bannerImg:'',
  719. avatar:'',
  720. label:'',
  721. hasTel:0,
  722. showType:1,
  723. Sort:'',
  724. YbFiccSort:'',
  725. YbFiccIcon:'',
  726. YbIconUrl:'',
  727. YbBgUrl:'',
  728. YbFiccPcIcon:'',
  729. IsShow:false,//是否在小程序端展示:0-隐藏 1-显示
  730. YbListImg:'',
  731. YbShareBgImg:'',
  732. ClassifyMenuId:'',
  733. YbRightBanner:'',
  734. relate:[]
  735. };
  736. this.ClassifyMenuList=[]
  737. this.isadd=true;
  738. this.aeDialog=true;
  739. this.$nextTick(()=>{
  740. this.$refs.aeForm.clearValidate();
  741. })
  742. }
  743. });
  744. },
  745. getlist(){ //获取列表
  746. let params={CurrentIndex:this.PageIndex,PageSize:this.pageSize,KeyWord:this.searchform.key_word};
  747. this.listLoading = true;
  748. classifylist(params).then((res) => {
  749. if( res.Ret==200 ){
  750. this.tableData = res.Data.List || [];
  751. this.total=parseInt(res.Data.Paging.Totals);
  752. this.tableData.forEach((item,index)=>{
  753. if( item.Child ){
  754. // item.hasChildren=true;
  755. let childnode=JSON.parse(JSON.stringify(item.Child));
  756. childnode.forEach((itemchild,i)=>{
  757. itemchild.ischild=true;
  758. });
  759. item.children=childnode;
  760. }
  761. });
  762. // this.$nextTick(function(){
  763. // this.isexpand=true;
  764. // });
  765. }
  766. this.listLoading = false;
  767. });
  768. },
  769. search(){ //搜索
  770. this.ispage = false;
  771. this.$nextTick(() => {
  772. this.PageIndex = 0;
  773. this.getlist();
  774. this.ispage = true;
  775. });
  776. },
  777. handleCurrentChange(current){ //分页页码跳转
  778. this.PageIndex = current;
  779. this.getlist();
  780. },
  781. handleSizeChange(val){ //分页页码改变
  782. this.pageSize=val;
  783. this.getlist();
  784. },
  785. clickinput(type){ //上传模拟点击
  786. $(`#file${type}`).click();
  787. },
  788. fileSelected(type){ //选择文件上传
  789. const that = this;
  790. if( document.getElementById('file'+type).files[0] ){
  791. let hostfile = document.getElementById('file'+type).files[0];
  792. let size = Math.floor(hostfile.size / 1024 / 1024);
  793. if( size>200 ){
  794. that.$message.error('上传文件大小不能大于200M!');
  795. hostfile = {};
  796. return false
  797. }
  798. if( hostfile.name.toLowerCase().includes('.png') || hostfile.name.toLowerCase().includes('.jpg') || hostfile.name.toLowerCase().includes('.jpeg') ){
  799. let form = new FormData();
  800. form.append('file',hostfile); //hostfile.name
  801. that.uploadloading=true;
  802. bannerupload(form).then((res) => {
  803. if( res.Ret === 200 ){
  804. if(type == 1) {
  805. that.aeForm.classifyImg=res.Data.ResourceUrl;
  806. }else if(type == 2) {
  807. that.aeForm.bannerImg=res.Data.ResourceUrl;
  808. }else if(type == 3) {
  809. that.aeForm.avatar=res.Data.ResourceUrl
  810. }else if(type == 4) {
  811. that.aeForm.columImg=res.Data.ResourceUrl
  812. }else if(type == 5) {
  813. that.aeForm.reportImg=res.Data.ResourceUrl
  814. }else if(type == 6){
  815. that.aeForm.YbFiccIcon=res.Data.ResourceUrl
  816. }else if(type == 7){
  817. that.aeForm.YbIconUrl=res.Data.ResourceUrl
  818. }else if(type == 8){
  819. that.aeForm.YbBgUrl=res.Data.ResourceUrl
  820. }else if(type == 9){
  821. this.aeForm.YbListImg=res.Data.ResourceUrl
  822. }else if(type == 10){
  823. this.aeForm.YbShareBgImg=res.Data.ResourceUrl
  824. }else if(type == 11){
  825. this.aeForm.YbRightBanner=res.Data.ResourceUrl
  826. }else if(type==12){
  827. this.aeForm.YbShareBgImg_=res.Data.ResourceUrl
  828. }
  829. }
  830. $("#file"+type).val('');
  831. hostfile = {};
  832. });
  833. }else{
  834. that.$message.error('上传文件格式不正确!');
  835. }
  836. }
  837. },
  838. // 保存
  839. saveConfig(classifyId){
  840. if(!this.editedItems.includes(classifyId)) this.editedItems.push(classifyId)
  841. this.isShowPermissionDia=false
  842. },
  843. // 晨报周报 去设置章节
  844. chapterSetting(row){
  845. let reportType;
  846. if(row.ClassifyName=='周报'){
  847. reportType='week'
  848. }else{
  849. reportType='day'
  850. }
  851. this.$router.push({path:'chapterSetting',query:{reportType}})
  852. },
  853. //改变上级分类触发
  854. parentSelectChange(item){
  855. if(!item) return
  856. let YbShareBgImg = this.getParentYbShareBgImg(item)
  857. if(!this.aeForm.YbShareBgImg){
  858. this.$set(this.aeForm,'YbShareBgImg_',YbShareBgImg)
  859. }
  860. },
  861. //根据上级分类id获取YbShareBgImg
  862. getParentYbShareBgImg(id){
  863. let YbShareBgImg = ''
  864. let parent = this.classifyparentArr.find((item)=>{return item.Id===id})
  865. if(!parent) return
  866. YbShareBgImg = parent.YbShareBgImg||''
  867. return YbShareBgImg
  868. }
  869. }
  870. }
  871. </script>
  872. <style lang="scss">
  873. #classifylist{
  874. .header{
  875. display: flex;
  876. align-items: center;
  877. justify-content: space-between;
  878. .type-box{
  879. span{
  880. cursor: pointer;
  881. display: inline-block;
  882. margin-right: 50px;
  883. font-size: 18px;
  884. padding-bottom: 10px;
  885. }
  886. .act{
  887. color: #409EFF;
  888. border-bottom: 2px solid #409EFF;
  889. }
  890. }
  891. }
  892. }
  893. #classifylist{ overflow:hidden;
  894. .dialogclassLog {
  895. position:absolute;
  896. top: 50%;
  897. left: 50%;
  898. transform: translate(-50%,-50%);
  899. margin-top: 0 !important;
  900. .el-dialog__body {
  901. max-height: 600px;
  902. overflow-y: auto;
  903. }
  904. }
  905. .el-input{
  906. width: 100%;
  907. }
  908. .el-form-item__label {
  909. width: 130px !important;
  910. }
  911. .editedsty{
  912. color: #0030a9;
  913. }
  914. .header .el-form-item{ margin-bottom:0; }
  915. }
  916. </style>