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. </el-form-item>
  321. <el-form-item label="虚拟点赞数:" prop="virtual_likes_num">
  322. <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>
  323. </el-form-item>
  324. <el-form-item label="分享标题" prop="hidden_search">
  325. <el-radio v-model="ruleForm.share_title_type" :label="0">文章标题</el-radio>
  326. <el-radio v-model="ruleForm.share_title_type" :label="1">自定义</el-radio>
  327. <div v-if="ruleForm.share_title_type==1">
  328. <el-input placeholder="请输入搜索标题名称" style="width: 400px;" maxlength="200"
  329. v-model="ruleForm.share_title"></el-input>
  330. </div>
  331. </el-form-item>
  332. </el-row>
  333. </div>
  334. </el-card>
  335. <el-card class="card-model" v-if="link_note_type == 2 || link_note_type == 1" shadow="never">
  336. <div slot="header">
  337. <div>
  338. <span>浏览设置</span>
  339. </div>
  340. </div>
  341. <div>
  342. <el-row>
  343. <el-form-item label="浏览类型" prop="view_limit_content">
  344. <el-col :span="24">
  345. <el-radio-group v-model="ruleForm.view_limit" @change="updateViewLimit">
  346. <el-radio :label="0">浏览权限</el-radio>
  347. <el-radio :label="1">积分付费</el-radio>
  348. <el-radio :label="2">金额付费</el-radio>
  349. </el-radio-group>
  350. <div v-if="ruleForm.view_limit==0">
  351. <el-checkbox class="check-all" :indeterminate="isIndeterminate" v-model="checkAll"
  352. @change="handleCheckAllChange">全选
  353. </el-checkbox>
  354. <el-checkbox-group class="checkbox-item" v-model="checkedCities"
  355. @change="handleCheckedCitiesChange">
  356. <el-checkbox v-for="item in userLevelList" :label="item.level + ''"
  357. :key="item.id + ''">
  358. {{item.name}}
  359. </el-checkbox>
  360. </el-checkbox-group>
  361. </div>
  362. <div v-if="ruleForm.view_limit == 1">
  363. <el-input maxLength="8" v-model="ruleForm.view_limit_content" onInput="value=toNumber(value,2)">
  364. <template slot="append">积分
  365. </template>
  366. </el-input>
  367. </div>
  368. <div v-if="ruleForm.view_limit == 2">
  369. <el-input maxLength="8" v-model="ruleForm.view_limit_content" onInput="value=toNumber(value,2)">
  370. <template slot="append">余额
  371. </template>
  372. </el-input>
  373. </div>
  374. </el-col>
  375. </el-form-item>
  376. </el-row>
  377. </div>
  378. </el-card>
  379. <el-card class="card-model" shadow="never">
  380. <div slot="header">
  381. <div>
  382. <span>奖励设置</span>
  383. </div>
  384. </div>
  385. <div>
  386. <el-row>
  387. <el-col :span="24">
  388. <el-form-item v-if="link_note_type == 2 || link_note_type == 1" label="分享奖励" prop="share_reward">
  389. <el-switch v-model="ruleForm.share_reward" :active-value="1" :inactive-value="0">
  390. </el-switch>
  391. <div v-if="ruleForm.share_reward == 1">
  392. <el-form-item label="奖励类型" prop="share_reward_type">
  393. <el-radio-group v-model="ruleForm.share_reward_type">
  394. <el-radio :label="0">积分</el-radio>
  395. <el-radio :label="1">余额</el-radio>
  396. <el-radio :label="2">红包</el-radio>
  397. </el-radio-group>
  398. </el-form-item>
  399. <el-form-item label="每分享一次获得" prop="share_reward_content"
  400. >
  401. <el-input style="width: 200px;" v-model="ruleForm.share_reward_content"
  402. onInput="value=toNumber(value,2)">
  403. <template slot="append" v-if="ruleForm.share_reward_type == 0">积分</template>
  404. <template slot="append" v-if="ruleForm.share_reward_type == 1">余额</template>
  405. <template slot="append" v-if="ruleForm.share_reward_type == 2">红包</template>
  406. </el-input>
  407. </el-form-item>
  408. <el-form-item label="每人最多获得" prop="share_reward_max_time">
  409. <el-input style="width: 215px;" v-model.number="ruleForm.share_reward_max_time"
  410. onInput="value=toNumber(value,0)">
  411. <template slot="append">次奖励</template>
  412. </el-input>
  413. </el-form-item>
  414. </div>
  415. </el-form-item>
  416. <el-form-item label="浏览奖励" prop="view_reward">
  417. <el-switch v-model="ruleForm.view_reward" :active-value="1" :inactive-value="0">
  418. </el-switch>
  419. <div v-if="ruleForm.view_reward == 1">
  420. <el-form-item label="奖励类型" prop="view_reward_type">
  421. <el-radio-group v-model="ruleForm.view_reward_type">
  422. <el-radio :label="0">积分</el-radio>
  423. <el-radio :label="1">余额</el-radio>
  424. <el-radio :label="2">红包</el-radio>
  425. </el-radio-group>
  426. </el-form-item>
  427. <el-form-item label="每浏览一次获得" prop="view_reward_content"
  428. >
  429. <el-input style="width: 200px;" v-model="ruleForm.view_reward_content"
  430. onInput="value=toNumber(value,2)">
  431. <template slot="append" v-if="ruleForm.view_reward_type == 0">积分</template>
  432. <template slot="append" v-if="ruleForm.view_reward_type == 1">余额</template>
  433. <template slot="append" v-if="ruleForm.view_reward_type == 2">红包</template>
  434. </el-input>
  435. </el-form-item>
  436. <el-form-item label="每人最多获得" prop="view_reward_max_time">
  437. <el-input style="width: 215px;" v-model.number="ruleForm.view_reward_max_time"
  438. onInput="value=toNumber(value,0)">
  439. <template slot="append">次奖励</template>
  440. </el-input>
  441. </el-form-item>
  442. </div>
  443. </el-form-item>
  444. </el-col>
  445. </el-row>
  446. </div>
  447. </el-card>
  448. </el-col>
  449. </el-row>
  450. <!-- 弹框添加分类开始-->
  451. <el-dialog :title="addFormTitle" width="30%" :visible.sync="dialogAddgsVisible" @close="closeDialogAddgsVisible" :modal-append-to-body="false">
  452. <el-form :model="addForm" ref="addForm" :rules="addRule" :inline="true" @submit.native.prevent label-width="100px">
  453. <el-form-item label="分类名称" prop="name">
  454. <el-input v-model="addForm.name" placeholder="请填写标题"></el-input>
  455. </el-form-item>
  456. </el-form>
  457. <span slot="footer" class="dialog-footer">
  458. <el-button @click="dialogAddgsVisible = false">取 消</el-button>
  459. <el-button type="primary" :loading="btnLoading" @click="saveAddForm('addForm')">确 定</el-button>
  460. </span>
  461. </el-dialog>
  462. <!-- 弹框添加分类结束-->
  463. </el-form>
  464. </div>
  465. <div style="text-align: center;">
  466. <el-button class="button-item" :loading="btnLoading" type="primary" @click="store('ruleForm')" size="small">保存</el-button>
  467. </div>
  468. </el-card>
  469. </div>
  470. <script src="/resources/wangeditor/wangEditor.min.js"></script>
  471. <script>
  472. const app = new Vue({
  473. el: '#app',
  474. data() {
  475. var validatePass = (rule, value, callback) => {
  476. var reg = /^[\u4e00-\u9fa5\w]+$/;
  477. if (reg.test(value)) {
  478. callback();
  479. }else{
  480. callback(new Error('不能含有特殊字符'));
  481. }
  482. };
  483. return {
  484. btnLoading: false,
  485. cardLoading: false,
  486. editTitle: '创建素材',
  487. userLevelList: [{
  488. level: 0,
  489. name: "普通会员"
  490. }],
  491. checkAll: false,//是否全选
  492. isIndeterminate: false,//未全选样式
  493. checkedCities: [],//已勾选的
  494. link_note_type:1,
  495. ruleForm: {
  496. goods_list:[],
  497. share_reward:0,
  498. share_reward_max_time:1,
  499. share_reward_content: '',
  500. share_reward_type: 0,
  501. view_reward:0,
  502. view_reward_max_time:1,
  503. view_reward_content: 1,
  504. view_reward_type: 0,
  505. view_limit_content:'',
  506. view_limit:0,
  507. share_title_type:0,
  508. share_title:'',
  509. sort:0,
  510. cover_img: [],
  511. title: '',
  512. content: '',
  513. user_id: 0,
  514. check_status: 1,
  515. show_type:[],
  516. content_href:'',
  517. thumb_url:'',
  518. cate_id: '',
  519. cover_type: 1
  520. },
  521. rules: {
  522. cate_id: [{
  523. required: true,
  524. message: '请你选择分类',
  525. trigger: 'change'
  526. }, ],
  527. title: [
  528. {
  529. required: true,
  530. message: '请输入标题',
  531. trigger: 'change'
  532. },
  533. {
  534. validator: (rule, value, callback) => {
  535. if(value.length>30||value.length<0){
  536. callback('最大长度在1-30个字内');
  537. }
  538. callback();
  539. },
  540. trigger: 'blur'
  541. },
  542. ],
  543. view_limit_content : [
  544. {
  545. trigger: 'blur',
  546. validator: (rule, value, callback) => {
  547. console.log(value,'value');
  548. let typeStr = this.ruleForm.view_limit == 1?'积分':'金额';
  549. if(this.ruleForm.view_limit != 0 && !String(value).length){
  550. callback('请输入' + typeStr);
  551. } else if(this.ruleForm.view_limit != 0 && value<=0){
  552. callback(typeStr + '不能小于等于0');
  553. }
  554. callback();
  555. },
  556. },
  557. ],
  558. textContent: [
  559. {
  560. validator: (rule, value, callback) => {
  561. if(this.link_note_type == 1 && this.ruleForm.content.length == 0){
  562. callback('文章内容不能为空');
  563. }
  564. callback();
  565. },
  566. trigger: 'blur'
  567. },
  568. ],
  569. content: [
  570. {
  571. validator: (rule, value, callback) => {
  572. if(this.link_note_type == 2 && value.length==0){
  573. callback('请上传视频内容');
  574. }
  575. callback();
  576. },
  577. trigger: 'blur'
  578. },
  579. ],
  580. contentHref: [
  581. {
  582. validator: (rule, value, callback) => {
  583. console.info("视频");
  584. if(this.link_note_type == 2 && this.ruleForm.content_href.length==0){
  585. callback('请选择视频');
  586. }
  587. callback();
  588. },
  589. trigger: 'change'
  590. },
  591. ],
  592. cover_img: [
  593. {
  594. validator: (rule, value, callback) => {
  595. console.info(value,"封面");
  596. if(value.length<=0){
  597. callback('请上传封面');
  598. }
  599. callback();
  600. },
  601. trigger: 'change'
  602. }
  603. ],
  604. share_reward:[
  605. {
  606. validator: (rule, value, callback) => {
  607. if(this.ruleForm.share_reward == 1 ){
  608. console.log('this.ruleForm.share_reward_content='+this.ruleForm.share_reward_content)
  609. if(this.ruleForm.share_reward_content < 0 || !this.ruleForm.share_reward_content){
  610. callback('请填写分享奖励');
  611. }
  612. if(this.ruleForm.share_reward_max_time < 0 || !this.ruleForm.share_reward_max_time){
  613. callback('请填写分享奖励');
  614. }
  615. }
  616. callback();
  617. },
  618. trigger: 'blur'
  619. },
  620. ],
  621. view_reward: [
  622. {
  623. validator: (rule, value, callback) => {
  624. if (this.ruleForm.view_reward == 1) {
  625. console.log('this.ruleForm.view_reward_reward_content=' + this.ruleForm.view_reward_content)
  626. if (this.ruleForm.view_reward_content < 0 || !this.ruleForm.view_reward_content) {
  627. callback('请填写浏览奖励');
  628. }
  629. if (this.ruleForm.view_reward_max_time < 0 || !this.ruleForm.view_reward_max_time) {
  630. callback('请填写浏览奖励');
  631. }
  632. }
  633. callback();
  634. },
  635. trigger: 'blur'
  636. },
  637. ],
  638. },
  639. materilCateList:[],
  640. //弹框配置
  641. addForm: {
  642. id: '',
  643. name: '',
  644. // status: 1,
  645. },
  646. addRule: {
  647. name: [{
  648. required: true,
  649. message: '请填写分类名称',
  650. trigger: 'change'
  651. },
  652. {
  653. max: 8,
  654. message: '最大长度为8个字符',
  655. trigger: 'blur'
  656. }
  657. ],
  658. },
  659. ptypeList: [{
  660. key: "0",
  661. value: "成功"
  662. },
  663. {
  664. key: "1",
  665. value: "失败"
  666. },
  667. ],
  668. addFormTitle: "",
  669. dialogAddgsVisible: false,
  670. dataList: [],
  671. // 对话框显示与否
  672. dialogVisible: false,
  673. dataloading: false,
  674. addGroupVisible: false,
  675. fields: {
  676. upload_type: 'images'
  677. },
  678. urlStr: '',
  679. userContent: '', //用户发布的文本内容
  680. showTypeArr: [
  681. {
  682. label: 1,
  683. text: '阅读数'
  684. },
  685. {
  686. label: 2,
  687. text: '点赞数'
  688. },
  689. {
  690. label: 3,
  691. text: '发布时间'
  692. },
  693. {
  694. label: 4,
  695. text: '发布者'
  696. },
  697. ]
  698. };
  699. },
  700. methods: {
  701. initEdit() {
  702. const vm = this
  703. const E = window.wangEditor
  704. const editor = new E(document.getElementById('rich-text-center'))
  705. this.editor = editor
  706. // 默认情况下,显示所有菜单
  707. editor.config.menus = [
  708. 'head',
  709. 'bold',
  710. 'fontSize',
  711. 'fontName',
  712. 'italic',
  713. 'underline',
  714. 'strikeThrough',
  715. 'indent',
  716. 'lineHeight',
  717. 'foreColor',
  718. 'backColor',
  719. // 'link',
  720. 'list',
  721. // 'todo',
  722. 'justify',
  723. 'quote',
  724. 'emoticon',
  725. 'image',
  726. 'video',
  727. 'table',
  728. 'splitLine',
  729. 'undo',
  730. 'redo',
  731. ]
  732. editor.config.uploadImgMaxSize = 10 * 1024 * 1024 // 10M
  733. editor.config.zIndex = 99
  734. // 配置 server 接口地址
  735. editor.config.customUploadImg = function(resultFiles, insertImgFn) {
  736. // resultFiles 是 input 中选中的文件列表
  737. // insertImgFn 是获取图片 url 后,插入到编辑器的方法
  738. vm.uploadFiles(resultFiles,'images').then(res => {
  739. if (res.data.code === 1) {
  740. return false
  741. }
  742. insertImgFn(res.data.data.url)
  743. })
  744. // 上传图片,返回结果,将图片插入到编辑器中
  745. }
  746. editor.config.customUploadVideo = function (resultFiles, insertVideoFn) {
  747. // resultFiles 是 input 中选中的文件列表
  748. // insertVideoFn 是获取视频 url 后,插入到编辑器的方法
  749. vm.uploadFiles(resultFiles,'videos').then(function (res) {
  750. // 上传视频,返回结果,将视频插入到编辑器中
  751. insertVideoFn(res.data.data.url)
  752. })
  753. /* client.put('myVideo', resultFiles[0]).then(function (res) {
  754. // 上传视频,返回结果,将视频插入到编辑器中
  755. insertVideoFn(res.url)
  756. }).catch(function (err) {
  757. console.log(err)
  758. }) */
  759. }
  760. // 设置文字和回调
  761. editor.config.onchange = this.textChange;
  762. editor.create()
  763. },
  764. // 上传图片
  765. uploadFiles(rawFiles,type) {
  766. this.files = [];
  767. for (let i = 0; i < rawFiles.length; i++) {
  768. const file = {
  769. _complete: false,
  770. response: null,
  771. rawFile: rawFiles[i],
  772. };
  773. this.files.push(file);
  774. }
  775. console.log(this.files[0],"=====> this.files[0]");
  776. return this.upload(this.files[0],type);
  777. // 循环上传文件
  778. // for (let i in this.files) {
  779. // this.upload(this.files[i]);
  780. // }
  781. },
  782. upload(file,type) {
  783. let formData = new FormData();
  784. const params = {
  785. upload_type: type
  786. };
  787. params['r'] = 'common/file/upload';
  788. if(type == 'videos'){
  789. this.fields.upload_type = 'videos';
  790. } else {
  791. this.fields.upload_type = 'images';
  792. }
  793. for (let i in this.fields) {
  794. formData.append(i, this.fields[i]);
  795. }
  796. formData.append('file', file.rawFile, file.rawFile.name);
  797. return new Promise(successCallback => {
  798. this.$request({
  799. headers: {
  800. 'Content-Type': 'multipart/form-data'
  801. },
  802. params: params,
  803. method: 'post',
  804. data: formData,
  805. }).then(e => {
  806. if (e.data.code === 1) {
  807. this.$message.error(e.data.msg);
  808. }
  809. successCallback(e)
  810. }).catch(e => {
  811. file._complete = true;
  812. });
  813. })
  814. },
  815. textChange(html) {
  816. this.ruleForm.content = html
  817. },
  818. store(formName) {
  819. this.$refs[formName].validate((valid,errObj) => {
  820. let self = this;
  821. let subData = JSON.parse(JSON.stringify(this.ruleForm))
  822. if(subData.view_limit == 0){
  823. subData.view_limit_content = JSON.stringify(self.checkedCities);
  824. }
  825. if(subData.user_id > 0){
  826. subData.content = self.userContent;
  827. }
  828. if (Array.isArray(subData.cover_img) && subData.cover_img.length != this.cover_max_count) {
  829. this.$message.error("请上传"+ this.cover_max_count +"张封面图片");
  830. return false;
  831. }
  832. subData.cover_img = Array.isArray(subData.cover_img)?JSON.stringify(subData.cover_img):subData.cover_img;
  833. subData.note_type = getQuery('link_note_type')
  834. subData.show_type = JSON.stringify(subData.show_type);
  835. subData.content_href = typeof subData.content_href != 'string'?JSON.stringify(subData.content_href):subData.content_href;
  836. console.log(subData)
  837. if (valid) {
  838. self.btnLoading = true;
  839. request({
  840. params: {
  841. r: 'operating-note/notes/edit',
  842. },
  843. method: 'post',
  844. data: subData,
  845. }).then(e => {
  846. self.btnLoading = false;
  847. if (e.data.code == 0) {
  848. navigateTo({
  849. r: 'operating-note/notes/index',
  850. })
  851. } else {
  852. console.log(e,888);
  853. self.$message.error(e.data.msg);
  854. }
  855. }).catch(e => {
  856. console.log(e.data,e.data.msg,888);
  857. self.$message.error(e.data.msg);
  858. self.btnLoading = false;
  859. });
  860. } else {
  861. this.ruleForm.view_limit_content = ''
  862. this.ruleForm.checkedCities = []
  863. console.log(valid,errObj)
  864. for (const key in errObj) {
  865. self.$message.error(errObj[key][0].message);
  866. break;
  867. }
  868. // console.log('error submit!!');
  869. return false;
  870. }
  871. });
  872. },
  873. // 导航链接选择
  874. selectNavUrl(e) {
  875. let self = this;
  876. console.info(e);
  877. self.ruleForm.content_href = e[0];
  878. let type = self.ruleForm.content_href.open_type;
  879. let text = '';
  880. if(type == 'call'){
  881. text = self.ruleForm.content_href.params.telphone;
  882. } else if(type == 'web'){
  883. text = self.ruleForm.content_href.params.link;
  884. } else if(type == 'applet'){
  885. text = '小程序'
  886. } else {
  887. text = self.ruleForm.content_href.title;
  888. }
  889. this.$set(self.ruleForm.content_href,'text',text);
  890. /* e.forEach(function (item) {
  891. self.ruleForm.content_href = item.route;
  892. // self.dialogRuleForm.open_type = item.params.open_type;
  893. // self.dialogRuleForm.params = item.params;
  894. }); */
  895. },
  896. getDetail() {
  897. let self = this;
  898. //self.cardLoading = true;
  899. request({
  900. params: {
  901. r: 'operating-note/notes/edit',
  902. id: getQuery('id'),
  903. link_note_type: getQuery('link_note_type')
  904. },
  905. method: 'get',
  906. }).then(e => {
  907. self.cardLoading = false;
  908. if (e.data.code == 0) {
  909. var detailData = e.data.data.detail;
  910. this.materilCateList = e.data.data.cate_list;
  911. this.userLevelList.push(...e.data.data.user_level_list);
  912. if(!getQuery('id') || detailData.view_limit_content == 'all'){
  913. this.handleCheckAllChange(true)
  914. }
  915. if(JSON.stringify(detailData) !== '[]'){
  916. self.ruleForm = detailData;
  917. self.$set(self.ruleForm,'goods_list',[]);
  918. self.userContent = self.ruleForm.content;
  919. if(self.ruleForm.note_type == 1){
  920. self.editor.txt.html(String(self.ruleForm.content)) // 重新设置编辑器内容
  921. // 强制刷新编辑器DOM,确保样式应用
  922. setTimeout(() => {
  923. const editorContainer = document.querySelector('#rich-text-center');
  924. if(editorContainer) {
  925. // 触发重绘
  926. editorContainer.style.display = 'none';
  927. editorContainer.offsetHeight; // 触发重排
  928. editorContainer.style.display = '';
  929. }
  930. }, 0);
  931. }
  932. if(self.ruleForm.view_limit == 0 && self.ruleForm.view_limit_content != 'all' && self.ruleForm.view_limit_content.length){
  933. self.checkedCities = JSON.parse(self.ruleForm.view_limit_content)
  934. this.ruleForm.view_limit_content = JSON.stringify(self.checkedCities);
  935. }
  936. if (self.ruleForm.goods_id) {
  937. self.ruleForm.goods_list.push({
  938. id: self.ruleForm['goods_id'],
  939. name: self.ruleForm['goods_name'],
  940. price: self.ruleForm['price'],
  941. cover_pic: self.ruleForm['cover_pic'],
  942. });
  943. } else {
  944. self.ruleForm.goods_id = '';
  945. }
  946. if(self.ruleForm.show_type == 'all'){
  947. self.ruleForm.show_type = [];
  948. self.showTypeArr.forEach(v => {
  949. self.ruleForm.show_type.push(v.label);
  950. })
  951. } else if(self.ruleForm.show_type.length){
  952. this.ruleForm.show_type = JSON.parse(self.ruleForm.show_type);
  953. } else {
  954. this.ruleForm.show_type = [];
  955. }
  956. if(self.checkedCities.length == this.userLevelList.length){
  957. self.checkAll = true;
  958. } else if(self.checkedCities.length > 0){
  959. self.isIndeterminate = true;
  960. }
  961. if(self.ruleForm.content_href.length){
  962. try {
  963. self.ruleForm.content_href = JSON.parse(self.ruleForm.content_href);
  964. } catch {
  965. }
  966. }
  967. if(self.ruleForm.user_id > 0){
  968. self.editor.disable()
  969. }
  970. try {
  971. self.ruleForm.cover_img = JSON.parse(self.ruleForm.cover_img);
  972. } catch {
  973. self.ruleForm.cover_img = [self.ruleForm.cover_img];
  974. }
  975. }
  976. if(!self.ruleForm.cate_id){
  977. self.ruleForm.cate_id = self.materilCateList.length?self.materilCateList[0].id:0;
  978. }
  979. // self.ruleForm.cate_id = self.materilCateList.length?self.materilCateList[0].id:0;
  980. } else {
  981. self.$message.error(e.data.msg);
  982. }
  983. }).catch(e => {
  984. console.log(e);
  985. });
  986. },
  987. goodsSelect(param) {
  988. let that = this;
  989. this.ruleForm.goods_id = param.id;
  990. that.ruleForm.goods_list = [];
  991. that.ruleForm.goods_list.push({
  992. id: param.id,
  993. name: param.goods_name,
  994. price: param.price,
  995. cover_pic: param.cover_pic,
  996. });
  997. console.log(that.ruleForm.goods_id,that.ruleForm.goods_list,999999999999);
  998. },
  999. deleteGoods(index) {
  1000. this.ruleForm.goods_list.splice(index, 1);
  1001. this.ruleForm.goods_id = '';
  1002. },
  1003. // 全选事件
  1004. handleCheckAllChange(val) {
  1005. let self = this;
  1006. self.checkedCities = [];
  1007. if (val) {
  1008. this.userLevelList.forEach(function (item, index) {
  1009. self.checkedCities.push(item.level + '')
  1010. });
  1011. }
  1012. this.checkAll = val
  1013. self.isIndeterminate = false;
  1014. },
  1015. // 单选事件
  1016. handleCheckedCitiesChange(value) {
  1017. let checkedCount = value.length;
  1018. this.checkAll = checkedCount == this.userLevelList.length;
  1019. this.isIndeterminate = checkedCount > 0 && checkedCount < this.userLevelList.length;
  1020. },
  1021. // 商品视频
  1022. videoUrl(e) {
  1023. if (e.length) {
  1024. this.ruleForm.content_href = e[0].url;
  1025. this.ruleForm.thumb_url = e[0].thumb_url;
  1026. }
  1027. console.log('视频');
  1028. console.log(e[0]);
  1029. console.log(this.ruleForm);
  1030. this.$forceUpdate();
  1031. },
  1032. /**
  1033. *点击新增按钮,弹出新增模态框
  1034. * @param
  1035. */
  1036. addgsForm() {
  1037. this.dialogAddgsVisible = true;
  1038. this.title = "新增分类"
  1039. },
  1040. /**
  1041. *关闭或取消模态框,清空值
  1042. * @param
  1043. */
  1044. closeDialogAddgsVisible() {
  1045. this.$refs.addForm.resetFields(); //element封装的方法,清空模态框的值
  1046. this.addFormTitle = "" //初始化title的值
  1047. this.addForm = { //初始化addForm中的值
  1048. name: "",
  1049. }
  1050. },
  1051. /**
  1052. *更新新数据
  1053. * @param
  1054. */
  1055. saveAddForm(formName) {
  1056. this.$refs[formName].validate((valid) => {
  1057. let self = this;
  1058. if (valid) {
  1059. this.postData({name : self.addForm.name});
  1060. } else {
  1061. console.log('error submit!!');
  1062. return false;
  1063. }
  1064. });
  1065. },
  1066. postData(data){
  1067. let self = this;
  1068. self.btnLoading = true;
  1069. request({
  1070. params: {
  1071. r: 'operating-note/cate/edit',
  1072. },
  1073. method: 'post',
  1074. data:data,
  1075. }).then(e => {
  1076. this.dialogAddgsVisible = false;
  1077. this.btnLoading = false;
  1078. if (e.data.code == 0) {
  1079. this.getDetail();
  1080. } else {
  1081. self.$message.error(e.data.msg);
  1082. }
  1083. }).catch(e => {
  1084. console.log(e);
  1085. });
  1086. },
  1087. getSelImg(val){
  1088. console.info(val);
  1089. if(this.link_note_type == 1){
  1090. for(let i = 0;i<val.length;i++){
  1091. if(this.ruleForm.cover_img.length == 9){
  1092. this.$message.warning("最多上传9张图片");
  1093. return;
  1094. }
  1095. this.ruleForm.cover_img.push(val[i]);
  1096. }
  1097. } else {
  1098. this.ruleForm.cover_img.splice(0,1,val[0]);
  1099. }
  1100. },
  1101. delSelImg(index){
  1102. this.ruleForm.cover_img.splice(index,1);
  1103. },
  1104. verifyImgCount(e){
  1105. console.info(this.ruleForm.cover_img.length);
  1106. if(this.ruleForm.cover_img.length >= 9){
  1107. this.$message.warning("最多上传9张图片");
  1108. e.stopPropagation();
  1109. }
  1110. },
  1111. urlGetDom(){
  1112. let that = this;
  1113. request({
  1114. params: {
  1115. r: 'operating-note/notes/url-content',
  1116. },
  1117. method: 'post',
  1118. data:{
  1119. url: this.urlStr,
  1120. },
  1121. }).then(res => {
  1122. if(res.data.code == 0){
  1123. that.ruleForm.content = res.data.data.content;
  1124. that.editor.txt.html(that.ruleForm.content) // 重新设置编辑器内容
  1125. that.ruleForm.title = res.data.data.title;
  1126. }
  1127. }).catch(e => {
  1128. console.log(e);
  1129. });
  1130. },
  1131. updateViewLimit(val){
  1132. this.$refs.ruleForm.validateField('view_limit_content')
  1133. if(val == 0){
  1134. this.ruleForm.view_limit_content = self.checkedCities
  1135. } else {
  1136. this.ruleForm.view_limit_content = '';
  1137. }
  1138. },
  1139. },
  1140. mounted: function() {
  1141. this.link_note_type = getQuery('link_note_type');
  1142. if (this.link_note_type == 1) {
  1143. this.editTitle = '编辑文章';
  1144. this.ruleForm.cover_type = 1;
  1145. }
  1146. if (this.link_note_type == 2) {
  1147. this.editTitle = '编辑视频';
  1148. this.ruleForm.cover_type = 5;
  1149. }
  1150. if (this.link_note_type == 3) {
  1151. this.editTitle = '编辑广告';
  1152. }
  1153. this.initEdit();
  1154. this.getDetail();
  1155. },
  1156. computed: {
  1157. cover_type_option() {
  1158. let image_text = [
  1159. {
  1160. type: 1,
  1161. name: '小单图'
  1162. },
  1163. {
  1164. type: 2,
  1165. name: '大单图'
  1166. },
  1167. {
  1168. type: 3,
  1169. name: '二图'
  1170. },
  1171. {
  1172. type: 4,
  1173. name: '三图'
  1174. },
  1175. ];
  1176. let video = [
  1177. {
  1178. type: 5,
  1179. name: '竖屏'
  1180. },
  1181. {
  1182. type: 6,
  1183. name: '横屏'
  1184. },
  1185. ];
  1186. return this.link_note_type == 1 ? image_text : video;
  1187. },
  1188. cover_max_count() {
  1189. let val = this.ruleForm.cover_type;
  1190. let one = [1, 2, 5, 6]; // 一张的类型
  1191. let two = [3];
  1192. let three = [4];
  1193. let coverMaxCount = 1;
  1194. if (this.link_note_type > 2) {
  1195. coverMaxCount = 1;
  1196. } else if (one.indexOf(val) > -1) {
  1197. coverMaxCount = 1;
  1198. } else if (two.indexOf(val) > -1) {
  1199. coverMaxCount = 2;
  1200. } else if (three.indexOf(val) > -1) {
  1201. coverMaxCount = 3;
  1202. } else {
  1203. coverMaxCount = 1;
  1204. }
  1205. return coverMaxCount;
  1206. }
  1207. }
  1208. });
  1209. </script>