edit.html 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470
  1. <meta name="referrer" content="never">
  2. <link rel="stylesheet" href="__CDN__/assets/addons/shopro/libs/element/element.css">
  3. <style>
  4. #wechat-menu {
  5. height: 640px;
  6. background: #fff;
  7. border-radius: 6px;
  8. font-size: 14px;
  9. padding: 0 20px 20px;
  10. color: #444;
  11. }
  12. .menu-title {
  13. height: 50px;
  14. line-height: 50px;
  15. font-weight: 600;
  16. display: flex;
  17. align-items: center;
  18. justify-content: space-between;
  19. }
  20. .menu-body {
  21. height: 570px;
  22. background: #F2F2F6;
  23. border-radius: 6px;
  24. padding: 26px 20px;
  25. display: flex;
  26. }
  27. .body-left {
  28. width: 284px;
  29. height: 494px;
  30. background: #fff;
  31. border: 1px solid #E7E7EB;
  32. margin-right: 30px;
  33. padding-top: 444px;
  34. }
  35. .left-bottom {
  36. position: relative;
  37. height: 48px;
  38. display: flex;
  39. border-top: 1px solid #E7E7EB;
  40. }
  41. .left-tip {
  42. color: #999;
  43. height: 40px;
  44. line-height: 40px;
  45. text-align: center;
  46. }
  47. .menu-icon {
  48. width: 40px;
  49. border-right: 1px solid #E7E7EB;
  50. }
  51. .menu-item {
  52. flex: 1;
  53. display: flex;
  54. }
  55. .menu-item-add {
  56. flex: 1;
  57. }
  58. .menu-add-body {
  59. display: none;
  60. position: absolute;
  61. bottom: 60px;
  62. }
  63. .menu-item-add-2 {
  64. width: 82px;
  65. height: 44px;
  66. border: 1px solid #E7E7EB;
  67. border-bottom: none;
  68. line-height: 42px;
  69. text-align: center;
  70. color: #666;
  71. }
  72. .menu-item-add-2s {
  73. border-left: none;
  74. border-right: none;
  75. border-top: none;
  76. background: url('/assets/addons/shopro/img/wechat/add-btn.png');
  77. }
  78. .body-right {
  79. flex: 1;
  80. border-radius: 6px;
  81. }
  82. .body-right-content {
  83. background: #fff;
  84. height: 494px;
  85. }
  86. .right-title {
  87. height: 50px;
  88. line-height: 50px;
  89. border-bottom: #E7E7EB 1px solid;
  90. padding: 0 20px;
  91. display: flex;
  92. justify-content: space-between;
  93. }
  94. .frist-show {
  95. height: 100%;
  96. display: flex;
  97. justify-content: center;
  98. align-items: center;
  99. background: #fff;
  100. height: 494px;
  101. }
  102. .delete-btn {
  103. color: #E74C3C;
  104. }
  105. .select-body {
  106. padding: 20px 26px;
  107. }
  108. .display-flex {
  109. display: flex;
  110. justify-content: center;
  111. align-items: center;
  112. }
  113. .draggable-item {
  114. width: 82px;
  115. border-right: #E7E7EB 1px solid;
  116. }
  117. .menu-active {
  118. border: 1px solid #7438D5;
  119. color: #7438D5;
  120. }
  121. .menu-add-show {
  122. display: block;
  123. }
  124. i {
  125. font-size: 18px;
  126. }
  127. .el-form-item {
  128. margin-bottom: 20px;
  129. }
  130. .el-form-item__content {
  131. line-height: 34px;
  132. }
  133. .el-form-item__label {
  134. color: #444;
  135. padding-right: 30px;
  136. line-height: 34px;
  137. font-weight: 500;
  138. }
  139. .el-input__inner {
  140. height: 34px;
  141. line-height: 34px;
  142. flex: 1;
  143. }
  144. /* radio */
  145. .el-radio__inner:hover,
  146. .el-input__inner:hover,
  147. .el-radio__inner:focus,
  148. .el-input__inner:focus {
  149. border-color: #7438D5;
  150. }
  151. .el-radio__input.is-checked+.el-radio__label {
  152. color: #7438D5;
  153. }
  154. .el-radio__input.is-checked .el-radio__inner {
  155. border-color: #7438D5;
  156. background: #7438D5;
  157. }
  158. .cursor-pointer {
  159. cursor: pointer;
  160. }
  161. .save-item {
  162. display: flex;
  163. justify-content: flex-end;
  164. height: 50px;
  165. align-items: center;
  166. }
  167. .public-btn {
  168. width: 88px;
  169. height: 36px;
  170. line-height: 36px;
  171. text-align: center;
  172. color: #fff;
  173. background: #7438D5;
  174. border-radius: 18px;
  175. }
  176. .seve-btn {
  177. border: 1px solid #7438D5;
  178. margin-right: 30px;
  179. background: #F2F2F6;
  180. color: #7438D5;
  181. }
  182. .el-input {
  183. /* width: 400px; */
  184. flex: 1;
  185. }
  186. .select-tip {
  187. display: flex;
  188. align-items: center;
  189. }
  190. .tip {
  191. color: #999;
  192. font-size: 12px;
  193. }
  194. .select-url {
  195. width: 98px;
  196. height: 32px;
  197. line-height: 32px;
  198. text-align: center;
  199. background: #EAE4F5;
  200. border: 1px solid #B092E1;
  201. border-radius: 4px;
  202. margin-right: 30px;
  203. color: #7438D5;
  204. }
  205. .left-tip i {
  206. font-size: 8px !important;
  207. }
  208. .one-ellipsis {
  209. display: block;
  210. /* width: 130px; */
  211. overflow: hidden;
  212. text-overflow: ellipsis;
  213. white-space: nowrap;
  214. padding: 0 5px;
  215. }
  216. .el-select {
  217. width: 100%;
  218. }
  219. .el-select-dropdown__item.selected {
  220. color: #7438D5;
  221. }
  222. .ellipsis-item {
  223. overflow: hidden;
  224. text-overflow: ellipsis;
  225. white-space: nowrap;
  226. }
  227. [v-cloak] {
  228. display: none
  229. }
  230. </style>
  231. <script src="__CDN__/assets/addons/shopro/libs/vue.js"></script>
  232. <script src="__CDN__/assets/addons/shopro/libs/element/element.js"></script>
  233. <script src="__CDN__/assets/addons/shopro/libs/Sortable.min.js"></script>
  234. <script src="__CDN__/assets/addons/shopro/libs/vuedraggable.js"></script>
  235. <script src="__CDN__/assets/addons/shopro/libs/moment.js"></script>
  236. <div id="wechatMenu" v-cloak @click.stop="menuHide">
  237. <div class="menu-title">
  238. <div style="margin-right: 20px;">菜单名称</div>
  239. <el-input v-model="menuTitle" size="small" placeholder="请输入菜单名称"></el-input>
  240. </div>
  241. <div class="menu-body">
  242. <div class="body-left">
  243. <div class="left-bottom">
  244. <div class="menu-icon display-flex">
  245. <img src="/assets/addons/shopro/img/wechat/code.png">
  246. </div>
  247. <!-- 拖动组件 -->
  248. <draggable :list="menuData" v-bind="$attrs" class="menu-item" :options="{animation:100}">
  249. <div v-for="(item,index) in menuData" :key="index"
  250. class="draggable-item display-flex cursor-pointer" @click.stop="menuSelect(index,null)"
  251. :class="item.selected?'menu-active':''">
  252. <span v-if="item.sub_button.length>0" style="margin-right: 6px;">≡</span>{{item.name}}
  253. <div v-if="item.sub_button" class="menu-add-body" :class="item.show?'menu-add-show':''"
  254. :style="{'border-bottom':item.sub_button.length>=5?'1px solid #E7E7EB':'none'}">
  255. <div>
  256. <draggable :list="item.sub_button" v-bind="$attrs" :options="{animation:500}">
  257. <div class="menu-item-add-2 one-ellipsis" v-for="(it,idx) in item.sub_button"
  258. :key="idx" @click.stop="menuSelect(index,idx)"
  259. :class="it.selected?'menu-active':''">
  260. {{it.name}}
  261. </div>
  262. </draggable>
  263. <div class="menu-item-add-2 menu-item-add-2s cursor-pointer"
  264. v-if="item.sub_button.length<5" @click.stop="addMenu(index,2)">
  265. <i class="el-icon-plus"></i>
  266. </div>
  267. </div>
  268. </div>
  269. </div>
  270. <div class="menu-item-add display-flex cursor-pointer" v-if="menuData.length<3"
  271. @click.stop="addMenu(null,1)">
  272. <i class="el-icon-plus"></i>
  273. </div>
  274. </draggable>
  275. </div>
  276. <div class="left-tip">
  277. <i class="el-icon-rank margin-right-5" style="font-size: 8px;"></i>
  278. 可直接拖动菜单排序
  279. </div>
  280. </div>
  281. <div class="body-right">
  282. <div class="body-right-content" v-if="rightShow" @click.stop="menuShow">
  283. <div class="right-title">
  284. <div class="cursor-pointer">添加<span v-if="selectLevel==2">子</span>菜单</div>
  285. <div class="delete-btn cursor-pointer" @click.stop="delMenu()">
  286. 删除菜单
  287. </div>
  288. </div>
  289. <div class="select-body">
  290. <el-form ref="rightData" :model="rightData" label-width="106px">
  291. <el-form-item :label="selectLevel==2?'子菜单名称':'菜单名称'">
  292. <div class="select-tip">
  293. <el-input v-model="rightData.name" @keyup="limitLength()"></el-input>
  294. </div>
  295. </el-form-item>
  296. <el-form-item style="margin-top:-20px">
  297. <div class="select-tip">
  298. <div class="tip" v-if="selectLevel==1">菜单名称字数不多于4个汉字或8个字母</div>
  299. <div class="tip" v-if="selectLevel==2">菜单名称字数不多于8个汉字或16个字母</div>
  300. </div>
  301. </el-form-item>
  302. <div v-if="(selectLevel==1 && rightData.sub_button==0) || selectLevel==2">
  303. <el-form-item :label="selectLevel==2?'子页面内容':'页面内容'">
  304. <el-radio-group v-model="rightData.type" @change="changeRadio">
  305. <el-radio label="view">跳转网页</el-radio>
  306. <el-radio label="miniprogram">跳转小程序</el-radio>
  307. <el-radio label="click">回复素材</el-radio>
  308. </el-radio-group>
  309. </el-form-item>
  310. <div v-if="rightData.type=='click'">
  311. <el-form-item label="消息类型">
  312. <el-radio-group v-model="rightData.media_type" @change="typeChange">
  313. <el-radio label="news">图文消息</el-radio>
  314. <el-radio label="image">图片</el-radio>
  315. <el-radio label="video">视频</el-radio>
  316. <el-radio label="voice">音频</el-radio>
  317. <el-radio label="text">文本</el-radio>
  318. <el-radio label="link">链接</el-radio>
  319. </el-radio-group>
  320. </el-form-item>
  321. <el-form-item label="消息内容:" prop="media_id" v-if="rightData.media_type">
  322. <div class="display-flex">
  323. <div style="flex: 1;">
  324. <el-select style="position: relative;" v-model="rightData.media_id"
  325. @change="selectChange">
  326. <el-option v-for="item in options" :key="item.media_id"
  327. :label="item.title" :value="item.media_id+''">
  328. <div class="display-flex">
  329. <img style="width: 30px;
  330. height: 30px;margin-right:20px"
  331. :src="Fast.api.cdnurl(item.thumb_url)"
  332. v-if="rightData.media_type!='voice' && rightData.media_type!='text' && rightData.media_type!='link'">
  333. <img style="width: 30px;
  334. height: 30px;margin-right:20px" :src="Fast.api.cdnurl(item.image)"
  335. v-if="rightData.media_type=='link'">
  336. <div class="ellipsis-item" style="width: 60px;"
  337. v-if="rightData.media_type=='text' || rightData.media_type=='link'">
  338. {{ item.media_id }}</div>
  339. <div class="ellipsis-item" style="width: 100px;">
  340. {{ item.title }}
  341. </div>
  342. <div class="ellipsis-item" style="flex: 1;"
  343. v-if="rightData.media_type!='text' && rightData.media_type!='link'">
  344. {{ item.media_id }}</div>
  345. <div class="ellipsis-item" style="flex: 1;"
  346. v-if="rightData.media_type=='text'">
  347. {{ item.thumb_url }}</div>
  348. </div>
  349. </el-option>
  350. <div class="text-center display-flex"
  351. style="position: sticky;background: #fff;height:32px;top:0;z-index:1;justify-content: center;">
  352. <el-pagination class="pagination" :page-sizes="[20]"
  353. :current-page="selectCurrentPage" :total="selectTotalPage"
  354. layout="total, prev, pager,next, jumper" pager-count="20"
  355. @size-change.stop="selectSizeChange"
  356. @current-change="selectCurrentChange" />
  357. </el-pagination>
  358. <div class="theme-color cursor-pointer" style="margin-left: 8px;"
  359. @click="getoptions">
  360. 跳转
  361. </div>
  362. </div>
  363. </el-select>
  364. </div>
  365. <div style="margin-left: 10px;cursor: pointer;color: #7438D5;"
  366. @click="createTemplate"
  367. v-if="rightData.media_type=='text' || rightData.media_type=='link'">创建</div>
  368. </div>
  369. </el-form-item>
  370. <el-form-item label=""
  371. v-if="rightData.media_type && rightData.media_type!='text' && rightData.media_type!='link'">
  372. <div style="color: #666;">如果没有数据,请去公众号添加</div>
  373. </el-form-item>
  374. </div>
  375. <div v-if="rightData.type=='miniprogram'">
  376. <el-form-item label="AppId">
  377. <el-input v-model="rightData.appid" @input="()=>{this.$forceUpdate();}"></el-input>
  378. </el-form-item>
  379. <el-form-item label="小程序路径">
  380. <div class="select-tip">
  381. <el-input v-model="rightData.pagepath" @input="()=>{this.$forceUpdate();}"></el-input>
  382. </div>
  383. </el-form-item>
  384. <el-form-item style="margin-top:-20px">
  385. <div class="select-tip">
  386. <div class="tip" v-if="rightData.type=='view'">点击该菜单会跳到页面链接</div>
  387. <div class="tip" v-if="rightData.type=='miniprogram'">小程序路径不可用时跳转页面链接</div>
  388. </div>
  389. </el-form-item>
  390. </div>
  391. <el-form-item style="margin-top:-20px" v-if="rightData.type=='view'">
  392. <div class="select-tip">
  393. <div class="tip" v-if="rightData.type=='view'">点击该菜单会跳到页面链接</div>
  394. <div class="tip" v-if="rightData.type=='miniprogram'">小程序路径不可用时跳转页面链接</div>
  395. </div>
  396. </el-form-item>
  397. <div v-if="rightData.type=='view' || rightData.type=='miniprogram'">
  398. <el-form-item label="页面链接">
  399. <div class="select-tip">
  400. <input type="text" class="hidden" v-model="rightData.url">
  401. <el-input v-model="rightData.url" @input="()=>{this.$forceUpdate();}"></el-input>
  402. </div>
  403. </el-form-item>
  404. <el-form-item>
  405. <div class="select-tip">
  406. <div class="select-url cursor-pointer" @click.stop="choosePath">选择路径</div>
  407. <div>{{rightData.url_name}}</div>
  408. </div>
  409. </el-form-item>
  410. </div>
  411. </div>
  412. </el-form>
  413. </div>
  414. </div>
  415. <div v-else class="frist-show">
  416. 点击左侧菜单进行编辑操作
  417. </div>
  418. <div class="save-item">
  419. <div class="public-btn seve-btn cursor-pointer" @click.stop="subData('save')">保存</div>
  420. <div class="public-btn cursor-pointer" @click.stop="subData('publish')">保存&发布</div>
  421. </div>
  422. </div>
  423. </div>
  424. </div>