edit.php 58 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268
  1. <?php
  2. use common\helpers\ComponentHelper;
  3. ComponentHelper::loadComponentView('com-dialog-select');
  4. ComponentHelper::loadComponentView('com-image');
  5. ?>
  6. <style>
  7. .form-body {
  8. padding: 0;
  9. background-color: transparent;
  10. margin-bottom: 20px;
  11. }
  12. .check-all {
  13. float: left;
  14. margin-right: 25px!important;
  15. }
  16. .form-body .el-form-item {
  17. min-width: 850px;
  18. }
  19. .form-button {
  20. margin: 0;
  21. }
  22. .form-button .el-form-item__content {
  23. margin-left: 0 !important;
  24. }
  25. .button-item {
  26. padding: 9px 25px;
  27. }
  28. /*批量上传图片*/
  29. .pic-url-remark {
  30. font-size: 13px;
  31. color: #c9c9c9;
  32. margin-bottom: 12px;
  33. }
  34. .add-image-btn {
  35. width: 100px;
  36. height: 100px;
  37. color: #419EFB;
  38. border: 1px solid #e2e2e2;
  39. cursor: pointer;
  40. }
  41. .del-btn-pro{
  42. position: absolute;
  43. top: 28%;
  44. left: 57px;
  45. }
  46. .del-btn{
  47. position: absolute;
  48. top: -10%;
  49. right: -12%;
  50. z-index: 10;
  51. }
  52. .el-button--mini.is-circle{
  53. padding: 4px;
  54. }
  55. .priview-title{
  56. margin-bottom: 16px;
  57. font-size: 20px;
  58. font-weight: bold;
  59. color: #000000;
  60. }
  61. .priview-center{
  62. margin: 16px 11px;
  63. height: 86%;
  64. overflow-y: auto;
  65. }
  66. .preview-model{
  67. margin-right: 15px;
  68. background: #FFF;
  69. min-width: 375px;
  70. max-width: 375px;
  71. height: 78vh;
  72. overflow-wrap: anywhere;
  73. border-radius: 5px;
  74. }
  75. .form-right{
  76. flex: 1;
  77. overflow: auto;
  78. height: 78vh;
  79. }
  80. .card-model{
  81. border: 0;
  82. margin-bottom: 10px;
  83. }
  84. .customize-share-title{
  85. position: relative;
  86. display: inline-block;
  87. margin: 10px 10px 0 0;
  88. }
  89. .dp-header-placeholder {
  90. width: 100%;
  91. height: 44px;
  92. background-size: 100% 100%;
  93. z-index: 99;
  94. background: url("resources/img/decorate/nav/light1.png") no-repeat;
  95. }
  96. .preview-top-title{
  97. width: 100%;
  98. height: 24px;
  99. text-align: center;
  100. line-height: 24px;
  101. font-size: 16px;
  102. font-weight: 600;
  103. }
  104. /* 富文本表格样式增强 */
  105. .rich-text .note-app table {
  106. border-collapse: collapse;
  107. width: 100%;
  108. margin: 10px 0;
  109. }
  110. .rich-text .note-app table th,
  111. .rich-text .note-app table td {
  112. border: 1px solid #ccc;
  113. padding: 8px 12px;
  114. text-align: center;
  115. min-height: 30px;
  116. height: auto;
  117. }
  118. .rich-text .note-app table th {
  119. background-color: #f1f1f1;
  120. font-weight: bold;
  121. }
  122. /* 预览区表格样式同步 */
  123. .priview-center table {
  124. border-collapse: collapse;
  125. width: 100%;
  126. margin: 10px 0;
  127. }
  128. .priview-center table th,
  129. .priview-center table td {
  130. border: 1px solid #ccc;
  131. padding: 8px 12px;
  132. text-align: center;
  133. min-height: 30px;
  134. height: auto;
  135. }
  136. .priview-center table th {
  137. background-color: #f1f1f1;
  138. font-weight: bold;
  139. }
  140. .form-right::-webkit-scrollbar-thumb,.priview-center::-webkit-scrollbar-thumb{
  141. width: 4px;
  142. }
  143. </style>
  144. <div id="app" class="note-app" v-cloak>
  145. <el-card v-loading="cardLoading" shadow="never" style="border:0;min-width: 1000px;" body-style="background-color: #f3f3f3;padding: 10px 0 0;">
  146. <div slot="header">
  147. <el-breadcrumb separator="/">
  148. <el-breadcrumb-item><span style="color: #409EFF;cursor: pointer" @click="$navigate({r:'operating-note/notes/index'})">笔记管理</span>
  149. </el-breadcrumb-item>
  150. <el-breadcrumb-item>{{editTitle}}</el-breadcrumb-item>
  151. </el-breadcrumb>
  152. </div>
  153. <div class="form-body" flex>
  154. <div class="preview-model" v-if="link_note_type != 3">
  155. <div class="dp-header-placeholder"></div>
  156. <div class="preview-top-title" flex="cross:center">
  157. <div class="el-icon-arrow-left" style="font-size: 17px;color: #000;margin-left: 11px;font-weight: bold;"></div>
  158. <div style="flex: 1;margin-right: 28px;" >文章笔记</div>
  159. </div>
  160. <div class="priview-center" v-if="link_note_type == 1">
  161. <div class="priview-title">
  162. {{ruleForm.title}}
  163. </div>
  164. <div class="rich-text-preview" v-html="ruleForm.content"></div>
  165. <template v-if="ruleForm.content_href">
  166. <el-image v-for="(item,index) in ruleForm.content_href" :key="index" :src="item" fit="cover"></el-image>
  167. </template>
  168. </div>
  169. <div class="priview-center" style="background: #000;" v-if="link_note_type == 2 && ruleForm.content_href" flex>
  170. <video style="width: 100%;" :src="ruleForm.content_href" controls="controls"></video>
  171. </div>
  172. </div>
  173. <el-form class="form-right" :model="ruleForm" :rules="rules" size="small" ref="ruleForm" label-width="150px">
  174. <el-card class="card-model" shadow="never">
  175. <div>
  176. <el-row>
  177. <el-col :span="24">
  178. <el-form-item label="文章链接" v-if="link_note_type == 1">
  179. <el-input type="input" placeholder="请输入公众号文章链接" style="width: 400px;" v-model="urlStr"></el-input>
  180. <el-button style="padding: 9px 15px!important;margin-left: 10px;" type="primary"
  181. @click="urlGetDom" size="small">获取文章
  182. </el-button>
  183. </el-form-item>
  184. <el-form-item label="选择分类" prop="cate_id">
  185. <el-select style="width: 400px;"
  186. v-model="ruleForm.cate_id" placeholder="请选择">
  187. <el-option v-for="item in materilCateList" :key="item.id" :label="item.name"
  188. :value="item.id">
  189. </el-option>
  190. </el-select>
  191. <el-button class="el-button--primary2"
  192. style="padding: 9px 15px!important; margin-left: 10px" type="primary"
  193. @click="addgsForm()" size="small">新增分类
  194. </el-button>
  195. </el-form-item>
  196. <el-form-item label="排序" prop="sort">
  197. <el-input type="input" placeholder="排序" style="width: 400px;" maxlength="200"
  198. v-model="ruleForm.sort"></el-input>
  199. </el-form-item>
  200. <el-form-item v-show="link_note_type == 2 || link_note_type == 3" label="标题" prop="title">
  201. <el-input type="input" placeholder="标题" style="width: 400px;" maxlength="200"
  202. v-model="ruleForm.title"></el-input>
  203. </el-form-item>
  204. <el-form-item v-show="link_note_type == 2" label="视频内容" prop="content">
  205. <el-input type="input" placeholder="视频内容" style="width: 400px;" maxlength="200"
  206. v-model="ruleForm.content"></el-input>
  207. </el-form-item>
  208. <el-form-item v-show="link_note_type == 2" label="视频" prop="contentHref">
  209. <com-attachment :multiple="false" :max="1" @selected="videoUrl" type="videos">
  210. <el-tooltip class="item" effect="dark" content="支持格式mp4;支持编码H.264;" placement="top">
  211. <el-button size="mini">选择视频</el-button>
  212. </el-tooltip>
  213. </com-attachment>
  214. <a class="box-grow-0" type="primary" style="font-size:12px" title="播放视频" v-if="ruleForm.thumb_url" :underline="false" target="_blank" :href="ruleForm.content_href">
  215. <com-image v-model="ruleForm.thumb_url" mode="aspectFill" width='80px' height='80px' style="margin-top: 10px;" :src="ruleForm.thumb_url"></com-image>
  216. </a>
  217. </el-form-item>
  218. <el-form-item label="封面类型" prop="hidden_search" v-if="link_note_type <= 2">
  219. <el-radio v-model="ruleForm.cover_type" :label="ct.type" v-for="(ct, ci) in cover_type_option">{{ct.name}}</el-radio>
  220. </el-form-item>
  221. <el-form-item prop="cover_img">
  222. <label slot="label">
  223. <span>封面图片</span>
  224. <el-tooltip effect="dark" content="展示封面" placement="top">
  225. <i class="el-icon-info"></i>
  226. </el-tooltip>
  227. </label>
  228. <com-attachment @input="getSelImg" :multiple="true" :max="cover_max_count">
  229. <el-button size="mini" @click="verifyImgCount">选择图片</el-button>
  230. </com-attachment>
  231. <div class="customize-share-title" v-for="(item,index) in ruleForm.cover_img" :key="index">
  232. <com-image mode="aspectFill" width='80px' height='80px' :src="item"></com-image>
  233. <el-button v-if="item" class="del-btn" size="mini" type="danger" icon="el-icon-close" circle @click="delSelImg(index)"></el-button>
  234. </div>
  235. </el-form-item>
  236. <el-form-item v-if="link_note_type == 3" label="导航链接" prop="content_href">
  237. <div flex="box:last" style="width: 400px;">
  238. <el-input disabled v-model="ruleForm.content_href.text" style="margin-right: 10px;"></el-input>
  239. <com-pick-link @selected="selectNavUrl">
  240. <el-button>选择链接</el-button>
  241. </com-pick-link>
  242. </div>
  243. </el-form-item>
  244. </el-col>
  245. </el-row>
  246. </div>
  247. </el-card>
  248. <el-card class="card-model" v-if="link_note_type == 1" shadow="never">
  249. <div>
  250. <el-row>
  251. <el-col :span="24">
  252. <el-form-item label="文章标题" prop="title">
  253. <el-input type="input" placeholder="请输入文章标题" style="width: 400px;" maxlength="200"
  254. v-model="ruleForm.title"></el-input>
  255. </el-form-item>
  256. <el-form-item class="rich-text" label="文章内容" prop="textContent">
  257. <div style="width: 500px;" id="rich-text-center"></div>
  258. </el-form-item>
  259. </el-col>
  260. </el-row>
  261. </div>
  262. </el-card>
  263. <el-card class="card-model" v-if="link_note_type == 2 || link_note_type == 1" shadow="never">
  264. <div slot="header">
  265. <div>
  266. <span>其他设置</span>
  267. </div>
  268. </div>
  269. <div>
  270. <el-row>
  271. <el-form-item label="商品">
  272. <el-radio-group v-model="ruleForm.associated_good">
  273. <com-dialog-select :multiple="false" @selected="goodsSelect" title="添加商品">
  274. <el-button type="text">添加商品</el-button>
  275. </com-dialog-select>
  276. </el-radio-group>
  277. </el-form-item>
  278. <el-form-item v-if="ruleForm.goods_list.length" prop="goods_id">
  279. <template>
  280. <div style="color: #ff4544;">最多可关联1个商品</div>
  281. <div style="max-height: 300px;overflow-y: auto">
  282. <el-table :data="ruleForm.goods_list" style="width: 500px;" stripe>
  283. <el-table-column label="商品">
  284. <template slot-scope="scope">
  285. <div flex>
  286. <div style="padding-right: 10px;flex-grow: 0">
  287. <com-image mode="aspectFill" :src="scope.row.cover_pic"></com-image>
  288. </div>
  289. <div>
  290. <com-ellipsis :line="2">{{scope.row.name}}</com-ellipsis>
  291. <p style="color: red;">¥ {{scope.row.price}}</p>
  292. </div>
  293. </div>
  294. </template>
  295. </el-table-column>
  296. <el-table-column label="操作" width="100px">
  297. <template slot-scope="scope">
  298. <el-button @click="deleteGoods(scope.$index)" type="text" circle size="mini">
  299. 删除
  300. </el-button>
  301. </template>
  302. </el-table-column>
  303. </el-table>
  304. </div>
  305. </template>
  306. </el-form-item>
  307. <el-col :span="24">
  308. </el-col>
  309. <el-form-item label="评价" prop="hidden_comment">
  310. <el-switch v-model="ruleForm.hidden_comment" :active-value="1" :inactive-value="0">
  311. </el-switch>
  312. </el-form-item>
  313. <el-form-item label="展示内容" prop="show_type">
  314. <el-checkbox-group class="checkbox-item" v-model="ruleForm.show_type">
  315. <el-checkbox v-for="(type,tIndex) in showTypeArr" v-if="type.label != 4 || (type.label == 4 && link_note_type == 1)" :label="type.label" :key="type.label">{{type.text}}</el-checkbox>
  316. </el-checkbox-group>
  317. </el-form-item>
  318. <el-form-item v-if="link_note_type == 1" label="虚拟阅读数:" prop="virtual_views_num">
  319. <el-input type="nember" v-model.number="ruleForm.virtual_views_num" maxlength="6" oninput="value=value.replace(/^\.+|[^\d.]/g,'')" style="width: 160px;" placeholder="虚拟阅读数"></el-input>
  320. 次
  321. </el-form-item>
  322. <el-form-item label="虚拟点赞数:" prop="virtual_likes_num">
  323. <el-input type="nember" v-model.number="ruleForm.virtual_likes_num" maxlength="6" oninput="value=value.replace(/^\.+|[^\d.]/g,'')" style="width: 160px;" placeholder="虚拟点赞数"></el-input>
  324. 次
  325. </el-form-item>
  326. <el-form-item label="分享标题" prop="hidden_search">
  327. <el-radio v-model="ruleForm.share_title_type" :label="0">文章标题</el-radio>
  328. <el-radio v-model="ruleForm.share_title_type" :label="1">自定义</el-radio>
  329. <div v-if="ruleForm.share_title_type==1">
  330. <el-input placeholder="请输入搜索标题名称" style="width: 400px;" maxlength="200"
  331. v-model="ruleForm.share_title"></el-input>
  332. </div>
  333. </el-form-item>
  334. </el-row>
  335. </div>
  336. </el-card>
  337. <el-card class="card-model" v-if="link_note_type == 2 || link_note_type == 1" shadow="never">
  338. <div slot="header">
  339. <div>
  340. <span>浏览设置</span>
  341. </div>
  342. </div>
  343. <div>
  344. <el-row>
  345. <el-form-item label="浏览类型" prop="view_limit_content">
  346. <el-col :span="24">
  347. <el-radio-group v-model="ruleForm.view_limit" @change="updateViewLimit">
  348. <el-radio :label="0">浏览权限</el-radio>
  349. <el-radio :label="1">积分付费</el-radio>
  350. <el-radio :label="2">金额付费</el-radio>
  351. </el-radio-group>
  352. <div v-if="ruleForm.view_limit==0">
  353. <el-checkbox class="check-all" :indeterminate="isIndeterminate" v-model="checkAll"
  354. @change="handleCheckAllChange">全选
  355. </el-checkbox>
  356. <el-checkbox-group class="checkbox-item" v-model="checkedCities"
  357. @change="handleCheckedCitiesChange">
  358. <el-checkbox v-for="item in userLevelList" :label="item.level + ''"
  359. :key="item.id + ''">
  360. {{item.name}}
  361. </el-checkbox>
  362. </el-checkbox-group>
  363. </div>
  364. <div v-if="ruleForm.view_limit == 1">
  365. <el-input maxLength="8" v-model="ruleForm.view_limit_content" onInput="value=toNumber(value,2)">
  366. <template slot="append">积分
  367. </template>
  368. </el-input>
  369. </div>
  370. <div v-if="ruleForm.view_limit == 2">
  371. <el-input maxLength="8" v-model="ruleForm.view_limit_content" onInput="value=toNumber(value,2)">
  372. <template slot="append">余额
  373. </template>
  374. </el-input>
  375. </div>
  376. </el-col>
  377. </el-form-item>
  378. </el-row>
  379. </div>
  380. </el-card>
  381. <el-card class="card-model" shadow="never">
  382. <div slot="header">
  383. <div>
  384. <span>奖励设置</span>
  385. </div>
  386. </div>
  387. <div>
  388. <el-row>
  389. <el-col :span="24">
  390. <el-form-item v-if="link_note_type == 2 || link_note_type == 1" label="分享奖励" prop="share_reward">
  391. <el-switch v-model="ruleForm.share_reward" :active-value="1" :inactive-value="0">
  392. </el-switch>
  393. <div v-if="ruleForm.share_reward == 1">
  394. <el-form-item label="奖励类型" prop="share_reward_type">
  395. <el-radio-group v-model="ruleForm.share_reward_type">
  396. <el-radio :label="0">积分</el-radio>
  397. <el-radio :label="1">余额</el-radio>
  398. <el-radio :label="2">红包</el-radio>
  399. </el-radio-group>
  400. </el-form-item>
  401. <el-form-item label="每分享一次获得" prop="share_reward_content"
  402. >
  403. <el-input style="width: 200px;" v-model="ruleForm.share_reward_content"
  404. onInput="value=toNumber(value,2)">
  405. <template slot="append" v-if="ruleForm.share_reward_type == 0">积分</template>
  406. <template slot="append" v-if="ruleForm.share_reward_type == 1">余额</template>
  407. <template slot="append" v-if="ruleForm.share_reward_type == 2">红包</template>
  408. </el-input>
  409. </el-form-item>
  410. <el-form-item label="每人最多获得" prop="share_reward_max_time">
  411. <el-input style="width: 215px;" v-model.number="ruleForm.share_reward_max_time"
  412. onInput="value=toNumber(value,0)">
  413. <template slot="append">次奖励</template>
  414. </el-input>
  415. </el-form-item>
  416. </div>
  417. </el-form-item>
  418. <el-form-item label="浏览奖励" prop="view_reward">
  419. <el-switch v-model="ruleForm.view_reward" :active-value="1" :inactive-value="0">
  420. </el-switch>
  421. <div v-if="ruleForm.view_reward == 1">
  422. <el-form-item label="奖励类型" prop="view_reward_type">
  423. <el-radio-group v-model="ruleForm.view_reward_type">
  424. <el-radio :label="0">积分</el-radio>
  425. <el-radio :label="1">余额</el-radio>
  426. <el-radio :label="2">红包</el-radio>
  427. </el-radio-group>
  428. </el-form-item>
  429. <el-form-item label="每浏览一次获得" prop="view_reward_content"
  430. >
  431. <el-input style="width: 200px;" v-model="ruleForm.view_reward_content"
  432. onInput="value=toNumber(value,2)">
  433. <template slot="append" v-if="ruleForm.view_reward_type == 0">积分</template>
  434. <template slot="append" v-if="ruleForm.view_reward_type == 1">余额</template>
  435. <template slot="append" v-if="ruleForm.view_reward_type == 2">红包</template>
  436. </el-input>
  437. </el-form-item>
  438. <el-form-item label="每人最多获得" prop="view_reward_max_time">
  439. <el-input style="width: 215px;" v-model.number="ruleForm.view_reward_max_time"
  440. onInput="value=toNumber(value,0)">
  441. <template slot="append">次奖励</template>
  442. </el-input>
  443. </el-form-item>
  444. </div>
  445. </el-form-item>
  446. </el-col>
  447. </el-row>
  448. </div>
  449. </el-card>
  450. </el-col>
  451. </el-row>
  452. <!-- 弹框添加分类开始-->
  453. <el-dialog :title="addFormTitle" width="30%" :visible.sync="dialogAddgsVisible" @close="closeDialogAddgsVisible" :modal-append-to-body="false">
  454. <el-form :model="addForm" ref="addForm" :rules="addRule" :inline="true" @submit.native.prevent label-width="100px">
  455. <el-form-item label="分类名称" prop="name">
  456. <el-input v-model="addForm.name" placeholder="请填写标题"></el-input>
  457. </el-form-item>
  458. </el-form>
  459. <span slot="footer" class="dialog-footer">
  460. <el-button @click="dialogAddgsVisible = false">取 消</el-button>
  461. <el-button type="primary" :loading="btnLoading" @click="saveAddForm('addForm')">确 定</el-button>
  462. </span>
  463. </el-dialog>
  464. <!-- 弹框添加分类结束-->
  465. </el-form>
  466. </div>
  467. <div style="text-align: center;">
  468. <el-button class="button-item" :loading="btnLoading" type="primary" @click="store('ruleForm')" size="small">保存</el-button>
  469. </div>
  470. </el-card>
  471. </div>
  472. <script src="/resources/wangeditor/wangEditor.min.js"></script>
  473. <script>
  474. const app = new Vue({
  475. el: '#app',
  476. data() {
  477. var validatePass = (rule, value, callback) => {
  478. var reg = /^[\u4e00-\u9fa5\w]+$/;
  479. if (reg.test(value)) {
  480. callback();
  481. }else{
  482. callback(new Error('不能含有特殊字符'));
  483. }
  484. };
  485. return {
  486. btnLoading: false,
  487. cardLoading: false,
  488. editTitle: '创建素材',
  489. userLevelList: [{
  490. level: 0,
  491. name: "普通会员"
  492. }],
  493. checkAll: false,//是否全选
  494. isIndeterminate: false,//未全选样式
  495. checkedCities: [],//已勾选的
  496. link_note_type:1,
  497. ruleForm: {
  498. goods_list:[],
  499. share_reward:0,
  500. share_reward_max_time:1,
  501. share_reward_content: '',
  502. share_reward_type: 0,
  503. view_reward:0,
  504. view_reward_max_time:1,
  505. view_reward_content: 1,
  506. view_reward_type: 0,
  507. view_limit_content:'',
  508. view_limit:0,
  509. share_title_type:0,
  510. share_title:'',
  511. sort:0,
  512. cover_img: [],
  513. title: '',
  514. content: '',
  515. user_id: 0,
  516. check_status: 1,
  517. show_type:[],
  518. content_href:'',
  519. thumb_url:'',
  520. cate_id: '',
  521. cover_type: 1
  522. },
  523. rules: {
  524. cate_id: [{
  525. required: true,
  526. message: '请你选择分类',
  527. trigger: 'change'
  528. }, ],
  529. title: [
  530. {
  531. required: true,
  532. message: '请输入标题',
  533. trigger: 'change'
  534. },
  535. {
  536. validator: (rule, value, callback) => {
  537. if(value.length>30||value.length<0){
  538. callback('最大长度在1-30个字内');
  539. }
  540. callback();
  541. },
  542. trigger: 'blur'
  543. },
  544. ],
  545. view_limit_content : [
  546. {
  547. trigger: 'blur',
  548. validator: (rule, value, callback) => {
  549. console.log(value,'value');
  550. let typeStr = this.ruleForm.view_limit == 1?'积分':'金额';
  551. if(this.ruleForm.view_limit != 0 && !String(value).length){
  552. callback('请输入' + typeStr);
  553. } else if(this.ruleForm.view_limit != 0 && value<=0){
  554. callback(typeStr + '不能小于等于0');
  555. }
  556. callback();
  557. },
  558. },
  559. ],
  560. textContent: [
  561. {
  562. validator: (rule, value, callback) => {
  563. if(this.link_note_type == 1 && this.ruleForm.content.length == 0){
  564. callback('文章内容不能为空');
  565. }
  566. callback();
  567. },
  568. trigger: 'blur'
  569. },
  570. ],
  571. content: [
  572. {
  573. validator: (rule, value, callback) => {
  574. if(this.link_note_type == 2 && value.length==0){
  575. callback('请上传视频内容');
  576. }
  577. callback();
  578. },
  579. trigger: 'blur'
  580. },
  581. ],
  582. contentHref: [
  583. {
  584. validator: (rule, value, callback) => {
  585. console.info("视频");
  586. if(this.link_note_type == 2 && this.ruleForm.content_href.length==0){
  587. callback('请选择视频');
  588. }
  589. callback();
  590. },
  591. trigger: 'change'
  592. },
  593. ],
  594. cover_img: [
  595. {
  596. validator: (rule, value, callback) => {
  597. console.info(value,"封面");
  598. if(value.length<=0){
  599. callback('请上传封面');
  600. }
  601. callback();
  602. },
  603. trigger: 'change'
  604. }
  605. ],
  606. share_reward:[
  607. {
  608. validator: (rule, value, callback) => {
  609. if(this.ruleForm.share_reward == 1 ){
  610. console.log('this.ruleForm.share_reward_content='+this.ruleForm.share_reward_content)
  611. if(this.ruleForm.share_reward_content < 0 || !this.ruleForm.share_reward_content){
  612. callback('请填写分享奖励');
  613. }
  614. if(this.ruleForm.share_reward_max_time < 0 || !this.ruleForm.share_reward_max_time){
  615. callback('请填写分享奖励');
  616. }
  617. }
  618. callback();
  619. },
  620. trigger: 'blur'
  621. },
  622. ],
  623. view_reward: [
  624. {
  625. validator: (rule, value, callback) => {
  626. if (this.ruleForm.view_reward == 1) {
  627. console.log('this.ruleForm.view_reward_reward_content=' + this.ruleForm.view_reward_content)
  628. if (this.ruleForm.view_reward_content < 0 || !this.ruleForm.view_reward_content) {
  629. callback('请填写浏览奖励');
  630. }
  631. if (this.ruleForm.view_reward_max_time < 0 || !this.ruleForm.view_reward_max_time) {
  632. callback('请填写浏览奖励');
  633. }
  634. }
  635. callback();
  636. },
  637. trigger: 'blur'
  638. },
  639. ],
  640. },
  641. materilCateList:[],
  642. //弹框配置
  643. addForm: {
  644. id: '',
  645. name: '',
  646. // status: 1,
  647. },
  648. addRule: {
  649. name: [{
  650. required: true,
  651. message: '请填写分类名称',
  652. trigger: 'change'
  653. },
  654. {
  655. max: 8,
  656. message: '最大长度为8个字符',
  657. trigger: 'blur'
  658. }
  659. ],
  660. },
  661. ptypeList: [{
  662. key: "0",
  663. value: "成功"
  664. },
  665. {
  666. key: "1",
  667. value: "失败"
  668. },
  669. ],
  670. addFormTitle: "",
  671. dialogAddgsVisible: false,
  672. dataList: [],
  673. // 对话框显示与否
  674. dialogVisible: false,
  675. dataloading: false,
  676. addGroupVisible: false,
  677. fields: {
  678. upload_type: 'images'
  679. },
  680. urlStr: '',
  681. userContent: '', //用户发布的文本内容
  682. showTypeArr: [
  683. {
  684. label: 1,
  685. text: '阅读数'
  686. },
  687. {
  688. label: 2,
  689. text: '点赞数'
  690. },
  691. {
  692. label: 3,
  693. text: '发布时间'
  694. },
  695. {
  696. label: 4,
  697. text: '发布者'
  698. },
  699. ]
  700. };
  701. },
  702. methods: {
  703. initEdit() {
  704. const vm = this
  705. const E = window.wangEditor
  706. const editor = new E(document.getElementById('rich-text-center'))
  707. this.editor = editor
  708. // 默认情况下,显示所有菜单
  709. editor.config.menus = [
  710. 'head',
  711. 'bold',
  712. 'fontSize',
  713. 'fontName',
  714. 'italic',
  715. 'underline',
  716. 'strikeThrough',
  717. 'indent',
  718. 'lineHeight',
  719. 'foreColor',
  720. 'backColor',
  721. // 'link',
  722. 'list',
  723. // 'todo',
  724. 'justify',
  725. 'quote',
  726. 'emoticon',
  727. 'image',
  728. 'video',
  729. 'table',
  730. 'splitLine',
  731. 'undo',
  732. 'redo',
  733. ]
  734. editor.config.uploadImgMaxSize = 10 * 1024 * 1024 // 10M
  735. editor.config.zIndex = 99
  736. // 配置 server 接口地址
  737. editor.config.customUploadImg = function(resultFiles, insertImgFn) {
  738. // resultFiles 是 input 中选中的文件列表
  739. // insertImgFn 是获取图片 url 后,插入到编辑器的方法
  740. vm.uploadFiles(resultFiles,'images').then(res => {
  741. if (res.data.code === 1) {
  742. return false
  743. }
  744. insertImgFn(res.data.data.url)
  745. })
  746. // 上传图片,返回结果,将图片插入到编辑器中
  747. }
  748. editor.config.customUploadVideo = function (resultFiles, insertVideoFn) {
  749. // resultFiles 是 input 中选中的文件列表
  750. // insertVideoFn 是获取视频 url 后,插入到编辑器的方法
  751. vm.uploadFiles(resultFiles,'videos').then(function (res) {
  752. // 上传视频,返回结果,将视频插入到编辑器中
  753. insertVideoFn(res.data.data.url)
  754. })
  755. /* client.put('myVideo', resultFiles[0]).then(function (res) {
  756. // 上传视频,返回结果,将视频插入到编辑器中
  757. insertVideoFn(res.url)
  758. }).catch(function (err) {
  759. console.log(err)
  760. }) */
  761. }
  762. // 设置文字和回调
  763. editor.config.onchange = this.textChange;
  764. editor.create()
  765. },
  766. // 上传图片
  767. uploadFiles(rawFiles,type) {
  768. this.files = [];
  769. for (let i = 0; i < rawFiles.length; i++) {
  770. const file = {
  771. _complete: false,
  772. response: null,
  773. rawFile: rawFiles[i],
  774. };
  775. this.files.push(file);
  776. }
  777. console.log(this.files[0],"=====> this.files[0]");
  778. return this.upload(this.files[0],type);
  779. // 循环上传文件
  780. // for (let i in this.files) {
  781. // this.upload(this.files[i]);
  782. // }
  783. },
  784. upload(file,type) {
  785. let formData = new FormData();
  786. const params = {
  787. upload_type: type
  788. };
  789. params['r'] = 'common/file/upload';
  790. if(type == 'videos'){
  791. this.fields.upload_type = 'videos';
  792. } else {
  793. this.fields.upload_type = 'images';
  794. }
  795. for (let i in this.fields) {
  796. formData.append(i, this.fields[i]);
  797. }
  798. formData.append('file', file.rawFile, file.rawFile.name);
  799. return new Promise(successCallback => {
  800. this.$request({
  801. headers: {
  802. 'Content-Type': 'multipart/form-data'
  803. },
  804. params: params,
  805. method: 'post',
  806. data: formData,
  807. }).then(e => {
  808. if (e.data.code === 1) {
  809. this.$message.error(e.data.msg);
  810. }
  811. successCallback(e)
  812. }).catch(e => {
  813. file._complete = true;
  814. });
  815. })
  816. },
  817. textChange(html) {
  818. this.ruleForm.content = html
  819. },
  820. store(formName) {
  821. this.$refs[formName].validate((valid,errObj) => {
  822. let self = this;
  823. let subData = JSON.parse(JSON.stringify(this.ruleForm))
  824. if(subData.view_limit == 0){
  825. subData.view_limit_content = JSON.stringify(self.checkedCities);
  826. }
  827. if(subData.user_id > 0){
  828. subData.content = self.userContent;
  829. }
  830. if (Array.isArray(subData.cover_img) && subData.cover_img.length != this.cover_max_count) {
  831. this.$message.error("请上传"+ this.cover_max_count +"张封面图片");
  832. return false;
  833. }
  834. subData.cover_img = Array.isArray(subData.cover_img)?JSON.stringify(subData.cover_img):subData.cover_img;
  835. subData.note_type = getQuery('link_note_type')
  836. subData.show_type = JSON.stringify(subData.show_type);
  837. subData.content_href = typeof subData.content_href != 'string'?JSON.stringify(subData.content_href):subData.content_href;
  838. console.log(subData)
  839. if (valid) {
  840. self.btnLoading = true;
  841. request({
  842. params: {
  843. r: 'operating-note/notes/edit',
  844. },
  845. method: 'post',
  846. data: subData,
  847. }).then(e => {
  848. self.btnLoading = false;
  849. if (e.data.code == 0) {
  850. navigateTo({
  851. r: 'operating-note/notes/index',
  852. })
  853. } else {
  854. console.log(e,888);
  855. self.$message.error(e.data.msg);
  856. }
  857. }).catch(e => {
  858. console.log(e.data,e.data.msg,888);
  859. self.$message.error(e.data.msg);
  860. self.btnLoading = false;
  861. });
  862. } else {
  863. this.ruleForm.view_limit_content = ''
  864. this.ruleForm.checkedCities = []
  865. console.log(valid,errObj)
  866. for (const key in errObj) {
  867. self.$message.error(errObj[key][0].message);
  868. break;
  869. }
  870. // console.log('error submit!!');
  871. return false;
  872. }
  873. });
  874. },
  875. // 导航链接选择
  876. selectNavUrl(e) {
  877. let self = this;
  878. console.info(e);
  879. self.ruleForm.content_href = e[0];
  880. let type = self.ruleForm.content_href.open_type;
  881. let text = '';
  882. if(type == 'call'){
  883. text = self.ruleForm.content_href.params.telphone;
  884. } else if(type == 'web'){
  885. text = self.ruleForm.content_href.params.link;
  886. } else if(type == 'applet'){
  887. text = '小程序'
  888. } else {
  889. text = self.ruleForm.content_href.title;
  890. }
  891. this.$set(self.ruleForm.content_href,'text',text);
  892. /* e.forEach(function (item) {
  893. self.ruleForm.content_href = item.route;
  894. // self.dialogRuleForm.open_type = item.params.open_type;
  895. // self.dialogRuleForm.params = item.params;
  896. }); */
  897. },
  898. getDetail() {
  899. let self = this;
  900. //self.cardLoading = true;
  901. request({
  902. params: {
  903. r: 'operating-note/notes/edit',
  904. id: getQuery('id'),
  905. link_note_type: getQuery('link_note_type')
  906. },
  907. method: 'get',
  908. }).then(e => {
  909. self.cardLoading = false;
  910. if (e.data.code == 0) {
  911. var detailData = e.data.data.detail;
  912. this.materilCateList = e.data.data.cate_list;
  913. this.userLevelList.push(...e.data.data.user_level_list);
  914. if(!getQuery('id') || detailData.view_limit_content == 'all'){
  915. this.handleCheckAllChange(true)
  916. }
  917. if(JSON.stringify(detailData) !== '[]'){
  918. self.ruleForm = detailData;
  919. self.$set(self.ruleForm,'goods_list',[]);
  920. self.userContent = self.ruleForm.content;
  921. if(self.ruleForm.note_type == 1){
  922. self.editor.txt.html(String(self.ruleForm.content)) // 重新设置编辑器内容
  923. // 强制刷新编辑器DOM,确保样式应用
  924. setTimeout(() => {
  925. const editorContainer = document.querySelector('#rich-text-center');
  926. if(editorContainer) {
  927. // 触发重绘
  928. editorContainer.style.display = 'none';
  929. editorContainer.offsetHeight; // 触发重排
  930. editorContainer.style.display = '';
  931. }
  932. }, 0);
  933. }
  934. if(self.ruleForm.view_limit == 0 && self.ruleForm.view_limit_content != 'all' && self.ruleForm.view_limit_content.length){
  935. self.checkedCities = JSON.parse(self.ruleForm.view_limit_content)
  936. this.ruleForm.view_limit_content = JSON.stringify(self.checkedCities);
  937. }
  938. if (self.ruleForm.goods_id) {
  939. self.ruleForm.goods_list.push({
  940. id: self.ruleForm['goods_id'],
  941. name: self.ruleForm['goods_name'],
  942. price: self.ruleForm['price'],
  943. cover_pic: self.ruleForm['cover_pic'],
  944. });
  945. } else {
  946. self.ruleForm.goods_id = '';
  947. }
  948. if(self.ruleForm.show_type == 'all'){
  949. self.ruleForm.show_type = [];
  950. self.showTypeArr.forEach(v => {
  951. self.ruleForm.show_type.push(v.label);
  952. })
  953. } else if(self.ruleForm.show_type.length){
  954. this.ruleForm.show_type = JSON.parse(self.ruleForm.show_type);
  955. } else {
  956. this.ruleForm.show_type = [];
  957. }
  958. if(self.checkedCities.length == this.userLevelList.length){
  959. self.checkAll = true;
  960. } else if(self.checkedCities.length > 0){
  961. self.isIndeterminate = true;
  962. }
  963. if(self.ruleForm.content_href.length){
  964. try {
  965. self.ruleForm.content_href = JSON.parse(self.ruleForm.content_href);
  966. } catch {
  967. }
  968. }
  969. if(self.ruleForm.user_id > 0){
  970. self.editor.disable()
  971. }
  972. try {
  973. self.ruleForm.cover_img = JSON.parse(self.ruleForm.cover_img);
  974. } catch {
  975. self.ruleForm.cover_img = [self.ruleForm.cover_img];
  976. }
  977. }
  978. if(!self.ruleForm.cate_id){
  979. self.ruleForm.cate_id = self.materilCateList.length?self.materilCateList[0].id:0;
  980. }
  981. // self.ruleForm.cate_id = self.materilCateList.length?self.materilCateList[0].id:0;
  982. } else {
  983. self.$message.error(e.data.msg);
  984. }
  985. }).catch(e => {
  986. console.log(e);
  987. });
  988. },
  989. goodsSelect(param) {
  990. let that = this;
  991. this.ruleForm.goods_id = param.id;
  992. that.ruleForm.goods_list = [];
  993. that.ruleForm.goods_list.push({
  994. id: param.id,
  995. name: param.goods_name,
  996. price: param.price,
  997. cover_pic: param.cover_pic,
  998. });
  999. console.log(that.ruleForm.goods_id,that.ruleForm.goods_list,999999999999);
  1000. },
  1001. deleteGoods(index) {
  1002. this.ruleForm.goods_list.splice(index, 1);
  1003. this.ruleForm.goods_id = '';
  1004. },
  1005. // 全选事件
  1006. handleCheckAllChange(val) {
  1007. let self = this;
  1008. self.checkedCities = [];
  1009. if (val) {
  1010. this.userLevelList.forEach(function (item, index) {
  1011. self.checkedCities.push(item.level + '')
  1012. });
  1013. }
  1014. this.checkAll = val
  1015. self.isIndeterminate = false;
  1016. },
  1017. // 单选事件
  1018. handleCheckedCitiesChange(value) {
  1019. let checkedCount = value.length;
  1020. this.checkAll = checkedCount == this.userLevelList.length;
  1021. this.isIndeterminate = checkedCount > 0 && checkedCount < this.userLevelList.length;
  1022. },
  1023. // 商品视频
  1024. videoUrl(e) {
  1025. if (e.length) {
  1026. this.ruleForm.content_href = e[0].url;
  1027. this.ruleForm.thumb_url = e[0].thumb_url;
  1028. }
  1029. console.log('视频');
  1030. console.log(e[0]);
  1031. console.log(this.ruleForm);
  1032. this.$forceUpdate();
  1033. },
  1034. /**
  1035. *点击新增按钮,弹出新增模态框
  1036. * @param
  1037. */
  1038. addgsForm() {
  1039. this.dialogAddgsVisible = true;
  1040. this.title = "新增分类"
  1041. },
  1042. /**
  1043. *关闭或取消模态框,清空值
  1044. * @param
  1045. */
  1046. closeDialogAddgsVisible() {
  1047. this.$refs.addForm.resetFields(); //element封装的方法,清空模态框的值
  1048. this.addFormTitle = "" //初始化title的值
  1049. this.addForm = { //初始化addForm中的值
  1050. name: "",
  1051. }
  1052. },
  1053. /**
  1054. *更新新数据
  1055. * @param
  1056. */
  1057. saveAddForm(formName) {
  1058. this.$refs[formName].validate((valid) => {
  1059. let self = this;
  1060. if (valid) {
  1061. this.postData({name : self.addForm.name});
  1062. } else {
  1063. console.log('error submit!!');
  1064. return false;
  1065. }
  1066. });
  1067. },
  1068. postData(data){
  1069. let self = this;
  1070. self.btnLoading = true;
  1071. request({
  1072. params: {
  1073. r: 'operating-note/cate/edit',
  1074. },
  1075. method: 'post',
  1076. data:data,
  1077. }).then(e => {
  1078. this.dialogAddgsVisible = false;
  1079. this.btnLoading = false;
  1080. if (e.data.code == 0) {
  1081. this.getDetail();
  1082. } else {
  1083. self.$message.error(e.data.msg);
  1084. }
  1085. }).catch(e => {
  1086. console.log(e);
  1087. });
  1088. },
  1089. getSelImg(val){
  1090. console.info(val);
  1091. if(this.link_note_type == 1){
  1092. for(let i = 0;i<val.length;i++){
  1093. if(this.ruleForm.cover_img.length == 9){
  1094. this.$message.warning("最多上传9张图片");
  1095. return;
  1096. }
  1097. this.ruleForm.cover_img.push(val[i]);
  1098. }
  1099. } else {
  1100. this.ruleForm.cover_img.splice(0,1,val[0]);
  1101. }
  1102. },
  1103. delSelImg(index){
  1104. this.ruleForm.cover_img.splice(index,1);
  1105. },
  1106. verifyImgCount(e){
  1107. console.info(this.ruleForm.cover_img.length);
  1108. if(this.ruleForm.cover_img.length >= 9){
  1109. this.$message.warning("最多上传9张图片");
  1110. e.stopPropagation();
  1111. }
  1112. },
  1113. urlGetDom(){
  1114. let that = this;
  1115. request({
  1116. params: {
  1117. r: 'operating-note/notes/url-content',
  1118. },
  1119. method: 'post',
  1120. data:{
  1121. url: this.urlStr,
  1122. },
  1123. }).then(res => {
  1124. if(res.data.code == 0){
  1125. that.ruleForm.content = res.data.data.content;
  1126. that.editor.txt.html(that.ruleForm.content) // 重新设置编辑器内容
  1127. that.ruleForm.title = res.data.data.title;
  1128. }
  1129. }).catch(e => {
  1130. console.log(e);
  1131. });
  1132. },
  1133. updateViewLimit(val){
  1134. this.$refs.ruleForm.validateField('view_limit_content')
  1135. if(val == 0){
  1136. this.ruleForm.view_limit_content = self.checkedCities
  1137. } else {
  1138. this.ruleForm.view_limit_content = '';
  1139. }
  1140. },
  1141. },
  1142. mounted: function() {
  1143. this.link_note_type = getQuery('link_note_type');
  1144. if (this.link_note_type == 1) {
  1145. this.editTitle = '编辑文章';
  1146. this.ruleForm.cover_type = 1;
  1147. }
  1148. if (this.link_note_type == 2) {
  1149. this.editTitle = '编辑视频';
  1150. this.ruleForm.cover_type = 5;
  1151. }
  1152. if (this.link_note_type == 3) {
  1153. this.editTitle = '编辑广告';
  1154. }
  1155. this.initEdit();
  1156. this.getDetail();
  1157. },
  1158. computed: {
  1159. cover_type_option() {
  1160. let image_text = [
  1161. {
  1162. type: 1,
  1163. name: '小单图'
  1164. },
  1165. {
  1166. type: 2,
  1167. name: '大单图'
  1168. },
  1169. {
  1170. type: 3,
  1171. name: '二图'
  1172. },
  1173. {
  1174. type: 4,
  1175. name: '三图'
  1176. },
  1177. ];
  1178. let video = [
  1179. {
  1180. type: 5,
  1181. name: '竖屏'
  1182. },
  1183. {
  1184. type: 6,
  1185. name: '横屏'
  1186. },
  1187. ];
  1188. return this.link_note_type == 1 ? image_text : video;
  1189. },
  1190. cover_max_count() {
  1191. let val = this.ruleForm.cover_type;
  1192. let one = [1, 2, 5, 6]; // 一张的类型
  1193. let two = [3];
  1194. let three = [4];
  1195. let coverMaxCount = 1;
  1196. if (this.link_note_type > 2) {
  1197. coverMaxCount = 1;
  1198. } else if (one.indexOf(val) > -1) {
  1199. coverMaxCount = 1;
  1200. } else if (two.indexOf(val) > -1) {
  1201. coverMaxCount = 2;
  1202. } else if (three.indexOf(val) > -1) {
  1203. coverMaxCount = 3;
  1204. } else {
  1205. coverMaxCount = 1;
  1206. }
  1207. return coverMaxCount;
  1208. }
  1209. }
  1210. });
  1211. </script>