index.vue 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. <template>
  2. <view v-if="detaile">
  3. <view class="user dflex">
  4. <image src="../../static/images/userimg.png" mode="aspectFill" class="userimg"></image>
  5. <view class="flex">
  6. <view class="username">欧衡</view>
  7. <view class="time">{{getDateTimeStamp(detaile.createDate)}}</view>
  8. </view>
  9. </view>
  10. <view class="title" v-if="detaile.title">{{ detaile.title }}</view>
  11. <block v-if="rootCode == 'hair_circle' || rootCode == 'marketing_script'" >
  12. <view class="brief">
  13. <rich-text :nodes="detaile.brief"></rich-text>
  14. </view>
  15. <view class="imabox dflex"v-if="detaile.params.imageList&&detaile.params.imageList.length>0">
  16. <image :src="item.url" v-for="(item,index) in detaile.params.imageList" :key="index" class="img" @click="previewImg(index)"></image>
  17. </view>
  18. </block>
  19. <view class="content" v-if="detaile.text">
  20. <view :class="'viewMore' + (viewMoress?' con-vheight':'')" :style="'max-height:' + height">
  21. <mp-html :content="detaile.text" :lazy-load="true" @imgtap="choose"></mp-html>
  22. </view>
  23. <view class="view-more" @tap="viewMores()" v-if="viewMoress">查看全文</view>
  24. <!-- <view :class="'viewMore' + (viewMore?'':' con-vheight')">
  25. <mp-html :content="detaile.text" :lazy-load="true" @imgtap="choose"></mp-html>
  26. </view>
  27. <view class="view-more" @tap="viewMores()" v-if="!viewMore">查看全文</view> -->
  28. </view>
  29. <view class="operate ddflex">
  30. <view class="flex dflex">
  31. <view class="zan ddflex"><image src="../static/images/view.png"></image>{{detaile.browseCount}}</view>
  32. <view class="zan ddflex" @click="thumbs()"><image :src="'../../static/images/' + (detaile.isThumbs ? 'like1_h.png' : 'like1.png')"></image>{{detaile.thumbsCount}}</view>
  33. </view>
  34. <button class="share ddflex" hover-class="none" open-type="share"><image src="../static/images/share.png"></image>分享</button>
  35. </view>
  36. <view class="box" v-if="contentList && contentList.length > 0">
  37. <view class="tit ddflex">为您推荐</view>
  38. <view class="rec">
  39. <navigator :url="'/other/content/index?code=' + item.code + '&rootCode=' + rootCode" hover-class="none" class="li ddflex" v-for="(item,index) in contentList" :key="index" v-if="index < 3">
  40. <view class="fflex">
  41. <view class="rec-tit tovers">{{item.title}}</view>
  42. <view class="ddflex">
  43. <!-- <view class="author ddflex"><image src="../../static/pages/images/zbgw.png" mode="aspectFill"></image>欧衡</view> -->
  44. <view class="rec-time">{{item.createDate}}</view>
  45. </view>
  46. </view>
  47. <image :src="item.pic" mode="aspectFill" class="rec-img"></image>
  48. </navigator>
  49. </view>
  50. </view>
  51. </view>
  52. </template>
  53. <script>
  54. const app = getApp();
  55. const req = require('../../utils/request.js');
  56. const api = require('../../utils/api.js');
  57. const util = require('../../utils/util.js');
  58. import mpHtml from "../../components/mp-html/components/mp-html/mp-html";
  59. export default {
  60. components: {
  61. mpHtml,
  62. },
  63. data() {
  64. return {
  65. code: '',
  66. rootCode: '',
  67. detaile: '',
  68. type: 2, //详情类型:1 普通内容 2 自定义页面内容
  69. form: {
  70. page: 1,
  71. limit: 4,
  72. },
  73. contentList: [],
  74. height: 'initial',
  75. viewMoress: false,
  76. productList: [],
  77. merchant: {},
  78. bannerList: [],
  79. swiperCurrent: 0,
  80. sceneId: '',//分享码传入id
  81. };
  82. },
  83. onLoad: async function(options) {
  84. if(options.detail){
  85. let params = JSON.parse(decodeURIComponent(options.detail));
  86. console.log('params==',params)
  87. this.code = params.code;
  88. this.shareCode = params.shareCode
  89. this.rootCode = params.rootCode
  90. if(params.appId){
  91. req.setStorage('appId',params.appId)
  92. }
  93. // if(params.userId){
  94. // req.setStorage('pidCode', params.userId);
  95. // }
  96. }
  97. if(options.x_code_id){
  98. console.log('options==',options)
  99. this.sceneId = options.x_code_id
  100. }
  101. await this.loadCodeParams()
  102. await this.getDetail();
  103. this.getContentList();
  104. if(this.detaile.text){
  105. setTimeout(async res=>{
  106. await this.monitor();
  107. },500)
  108. }
  109. },
  110. onShow(){
  111. },
  112. methods: {
  113. monitor() {
  114. let that = this;
  115. let system = uni.getSystemInfoSync();
  116. let query = uni.createSelectorQuery();
  117. query.select('.viewMore').boundingClientRect(data=>{
  118. if(data){
  119. let height = data.height;
  120. if(height > system.windowHeight*2) {
  121. that.height = system.windowHeight *1.8 + 'px';
  122. that.viewMoress = true
  123. }
  124. }
  125. }).exec();
  126. },
  127. viewMores(){
  128. this.height = 'initial';
  129. this.viewMoress = false;
  130. },
  131. choose: function () {
  132. let freshen = false;
  133. this.$emit('freshen', {
  134. detail: freshen
  135. });
  136. },
  137. getDateTimeStamp(dateStr){
  138. return util.getDateDiff(Date.parse(dateStr.replace(/-/gi,"/")));
  139. },
  140. loadCodeParams() {
  141. let _ts = this;
  142. return new Promise((resolve, reject) => {
  143. let form = {
  144. scene: _ts.sceneId
  145. };
  146. if (!_ts.sceneId) {
  147. resolve();
  148. return false;
  149. }
  150. req.getRequest(api.api_code_params, form, data => {
  151. let res = JSON.parse(data.scene);
  152. this.code = res.code;
  153. this.shareCode = res.shareCode
  154. this.rootCode = res.rootCode
  155. if(res.appId){
  156. req.setStorage('appId',res.appId)
  157. }
  158. resolve();
  159. });
  160. });
  161. },
  162. getDetail() {
  163. let that = this;
  164. let apiUrl = api.api_material_detail;
  165. return new Promise((resolve,reject)=>{
  166. req.getRequest(apiUrl,{ code: that.code,shareCode: that.shareCode }, res => {
  167. console.log('that.detaile==',that.detaile)
  168. if(res.brief){
  169. res.brief = res.brief.replace(/\r\n/g,"<br>")
  170. res.brief = res.brief.replace(/\n/g,"<br>");
  171. res.brief = res.brief.replace(/↵/g,"<br>");
  172. }
  173. that.detaile = res;
  174. resolve();
  175. },true);
  176. })
  177. },
  178. getContentList() {
  179. let form = this.form;
  180. form.rootCode = this.rootCode;
  181. req.getRequest(api.api_material_library,form,res => {
  182. this.contentList = res.list;
  183. for (var i = 0; i < this.contentList.length; i++) {
  184. if (this.contentList[i].code == this.code){
  185. this.contentList.splice(i,1);
  186. }
  187. }
  188. });
  189. },
  190. //预览图片
  191. previewImg(index) {
  192. //预览合同图片
  193. var src = this.detaile.params.imageList[index].url;
  194. let imgs = [];
  195. this.detaile.params.imageList.map(it=>{
  196. imgs.push(it.url)
  197. })
  198. uni.previewImage({
  199. current: src, // 当前显示图片的http链接
  200. urls: imgs
  201. });
  202. },
  203. thumbs(){
  204. req.postRequest(api.api_material_thumbs,{code: this.code,shareCode: this.shareCode},data=>{
  205. if(this.detaile.isThumbs){
  206. this.detaile.isThumbs = false
  207. this.detaile.thumbsCount--
  208. }else{
  209. this.detaile.isThumbs = true
  210. this.detaile.thumbsCount++
  211. }
  212. })
  213. }
  214. },
  215. filters: {
  216. /**
  217. * 处理富文本里的图片宽度自适应
  218. * 1.去掉img标签里的style、width、height属性
  219. * 2.img标签添加style属性:max-width:100%;height:auto
  220. * 3.修改所有style里的width属性为max-width:100%
  221. * 4.去掉<br/>标签
  222. * @param html
  223. * @returns {void|string|*}
  224. */
  225. formatRichText(html) {
  226. //控制小程序中图片大小
  227. let newContent = html.replace(/<img[^>]*>/gi, function(match, capture) {
  228. match = match.replace(/style="[^"]+"/gi, '').replace(/style='[^']+'/gi, '');
  229. match = match.replace(/width="[^"]+"/gi, '').replace(/width='[^']+'/gi, '');
  230. match = match.replace(/height="[^"]+"/gi, '').replace(/height='[^']+'/gi, '');
  231. return match;
  232. });
  233. newContent = newContent.replace(/style="[^"]+"/gi, function(match, capture) {
  234. match = match.replace(/width:[^;]+;/gi, 'max-width:100%;').replace(/width:[^;]+;/gi, 'max-width:100%;');
  235. return match;
  236. });
  237. // newContent = newContent.replace(/<br[^>]*\/>/gi, '');
  238. newContent = newContent.replace(/<br[^>]*\/>/gi, '<p style="margin: 10px 0;"></p>');
  239. newContent = newContent.replace(/<br[^>]*\>/gi, '<p style="margin: 10px 0;"></p>');
  240. newContent = newContent.replace(/font-size:[^;]+;?/g,'');
  241. newContent = newContent.replace(/\<img/gi, '<img style="max-width:100%;height:auto;display:inline-block;margin:12rpx auto;"');
  242. return newContent;
  243. }
  244. }
  245. };
  246. </script>
  247. <style>
  248. @import './index.css';
  249. </style>