add.html 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. {include file="/shopro/common/script" /}
  2. <style>
  3. .menu-left {
  4. width: 100%;
  5. max-width: 268px;
  6. height: 420px;
  7. border: 1px solid var(--sa-border);
  8. margin-right: 30px;
  9. padding-top: 382px;
  10. font-size: 12px;
  11. position: relative;
  12. }
  13. .menu-left .title {
  14. position: absolute;
  15. top: 0;
  16. width: 100%;
  17. height: 36px;
  18. line-height: 36px;
  19. text-align: center;
  20. background: var(--sa-table-header-bg);
  21. }
  22. .menu-left .menu-left-bottom {
  23. position: relative;
  24. height: 36px;
  25. border-top: 1px solid var(--sa-border);
  26. }
  27. .menu-left .menu-left-bottom .left-icon {
  28. width: 36px;
  29. font-size: 20px;
  30. }
  31. .menu-left .menu-left-bottom .left-add {
  32. height: 36px;
  33. flex: 1;
  34. color: var(--sa-font);
  35. border-left: 1px solid var(--sa-border);
  36. }
  37. .menu-left .menu-left-bottom .menu-item {
  38. width: 100%;
  39. height: 36px;
  40. padding: 0 4px;
  41. border: 1px solid var(--sa-border);
  42. border-bottom: none;
  43. line-height: 36px;
  44. text-align: center;
  45. color: var(--sa-font);
  46. }
  47. .menu-left .menu-left-bottom .menu-item.is-active {
  48. border: 1px solid var(--el-color-primary);
  49. color: var(--el-color-primary);
  50. }
  51. .menu-left .menu-left-bottom .draggable-item {
  52. position: relative;
  53. border: none;
  54. border-left: 1px solid var(--sa-border);
  55. flex: 1;
  56. }
  57. .menu-left .menu-left-bottom .draggable-item .menu-level2-body {
  58. display: none;
  59. position: absolute;
  60. bottom: 48px;
  61. width: calc(100% + 2px);
  62. }
  63. .menu-left .menu-left-bottom .draggable-item .menu-level2-body .menu-level2-add {
  64. width: 100%;
  65. border: 1px solid var(--sa-border);
  66. position: relative;
  67. }
  68. .menu-left .menu-left-bottom .draggable-item .menu-level2-body .menu-level2-add::before {
  69. content: '';
  70. width: 0;
  71. height: 0;
  72. border: 8px solid;
  73. position: absolute;
  74. bottom: -16px;
  75. border-color: var(--sa-border) transparent transparent;
  76. z-index: 1;
  77. }
  78. .menu-left .menu-left-bottom .draggable-item .menu-level2-body .menu-level2-add::after {
  79. content: '';
  80. width: 0;
  81. height: 0;
  82. border: 7px solid;
  83. position: absolute;
  84. bottom: -14px;
  85. left: 50%;
  86. margin-left: -5px;
  87. border-color: var(--sa-background-assist) transparent transparent;
  88. z-index: 2;
  89. }
  90. .menu-left .menu-left-bottom .draggable-item .menu-level2-body.menu-level2-body-show {
  91. display: block;
  92. }
  93. .menu-left .menu-left-tip {
  94. text-align: center;
  95. height: 12px;
  96. line-height: 12px;
  97. font-size: 12px;
  98. margin: 8px 0 0 0;
  99. color: var(--el-color-warning);
  100. }
  101. .menu-right-tip {
  102. width: 100%;
  103. height: 420px;
  104. }
  105. .menu-right {
  106. width: 100%;
  107. max-width: 858px;
  108. min-height: 320px;
  109. padding: 20px;
  110. border: 1px solid var(--sa-border);
  111. border-radius: 8px;
  112. background: var(--sa-table-header-bg);
  113. }
  114. .menu-right .title {
  115. font-size: 14px;
  116. color: var(--sa-title);
  117. }
  118. </style>
  119. <div id="addEdit" class="menu-form" v-cloak>
  120. <el-container class="panel-block">
  121. <el-main>
  122. <el-scrollbar height="100%">
  123. <el-form class="mb-4" :model="form.model" :rules="form.rules" ref="formRef" label-width="90px">
  124. <el-form-item label="菜单名称" prop="name">
  125. <el-input v-model="form.model.name" placeholder="请输入菜单名称"></el-input>
  126. </el-form-item>
  127. </el-form>
  128. <div class="menu-content sa-flex sa-col-top">
  129. <div class="menu-left">
  130. <div class="title">公众号菜单</div>
  131. <div class="menu-left-bottom sa-flex">
  132. <div class="left-icon sa-flex sa-row-center">
  133. <i class="iconfont iconkeyboard"></i>
  134. </div>
  135. <draggable :list="form.model.rules" class="sa-flex sa-flex-1" animation="100"
  136. item-key="event">
  137. <template #item="{ element, index }">
  138. <div class="draggable-item menu-item sa-flex sa-row-center cursor-pointer"
  139. :class="element.selected ? 'is-active' : ''"
  140. @click.stop="onEditMenu(index, null)">
  141. <span v-if="element.sub_button && element.sub_button.length > 0"
  142. class="mr-1">≡</span>
  143. <span class="sa-line-1">{{ element.name }}</span>
  144. <div v-if="element.sub_button" class="menu-level2-body"
  145. :class="element.show ? 'menu-level2-body-show' : ''" :style="{
  146. 'border-bottom':
  147. element.sub_button.length >= 5 ? '1px solid #E7E7EB' : 'none',
  148. }">
  149. <draggable :list="element.sub_button" animation="500" item-key="event">
  150. <template #item="scope">
  151. <div>
  152. <div class="menu-item sa-line-1"
  153. :class="scope.element.selected ? 'is-active' : ''"
  154. @click.stop="onEditMenu(index, scope.index)">
  155. {{scope.element.name }}</div>
  156. </div>
  157. </template>
  158. </draggable>
  159. <div class="menu-item menu-level2-add cursor-pointer"
  160. v-if="element.sub_button.length < 5" @click.stop="onAddMenu(index, 2)">
  161. <el-icon>
  162. <Plus />
  163. </el-icon>
  164. </div>
  165. </div>
  166. </div>
  167. </template>
  168. <template #footer>
  169. <div class="left-add sa-flex sa-row-center cursor-pointer"
  170. v-if="form.model.rules.length < 3" @click.stop="onAddMenu(null, 1)">
  171. <el-icon>
  172. <Plus />
  173. </el-icon>
  174. </div>
  175. </template>
  176. </draggable>
  177. </div>
  178. <div class="menu-left-tip mt-2">可直接拖动菜单排序</div>
  179. </div>
  180. <div class="menu-right-tip sa-flex sa-row-center" v-if="!state.rightShow">您尚未添加自定义菜单</div>
  181. <div class="menu-right" v-if="state.rightShow">
  182. <div class="sa-flex sa-row-between mb-4">
  183. <div class="title">菜单名称</div>
  184. <el-button type="danger" link @click="onDeleteMenu">删除菜单</el-button>
  185. </div>
  186. <el-form :model="state.right" label-width="86px">
  187. <el-form-item :label="state.selectLevel == 2 ? '子菜单名称' : '菜单名称'" prop="name">
  188. <el-input v-model="state.right.name"></el-input>
  189. <div class="tip">菜单名称字数不多于4个汉字或8个字母</div>
  190. </el-form-item>
  191. <el-form-item v-if="
  192. (state.selectLevel == 1 &&
  193. (!state.right.sub_button || state.right.sub_button.length == 0)) ||
  194. state.selectLevel == 2
  195. " :label="state.selectLevel == 2 ? '子页面内容' : '页面内容'">
  196. <el-radio-group v-model="state.right.type" @change="onChangeType">
  197. <el-radio label="view">跳转网页</el-radio>
  198. <el-radio label="miniprogram">跳转小程序</el-radio>
  199. <el-radio label="click">回复素材</el-radio>
  200. </el-radio-group>
  201. <!-- <div class="tip">点击该菜单会跳到页面链接</div> -->
  202. </el-form-item>
  203. <template v-if="!state.right.sub_button || state.right.sub_button.length == 0">
  204. <template v-if="state.right.type == 'miniprogram'">
  205. <el-form-item label="AppId">
  206. <el-input v-model="state.right.appid"></el-input>
  207. </el-form-item>
  208. <el-form-item label="小程序路径">
  209. <el-input v-model="state.right.pagepath"></el-input>
  210. </el-form-item>
  211. <el-form-item style="margin-top: -20px">
  212. <div class="tip" v-if="state.right.type == 'view'">点击该菜单会跳到页面链接</div>
  213. <div class="tip" v-if="state.right.type == 'miniprogram'">小程序路径不可用时将跳转备用页面链接
  214. </div>
  215. </el-form-item>
  216. </template>
  217. <template v-if="state.right.type == 'view' || state.right.type == 'miniprogram'">
  218. <el-form-item label="备用页面链接">
  219. <el-input v-model="state.right.url"></el-input>
  220. </el-form-item>
  221. <el-form-item>
  222. <el-button @click.stop="onSelectUrl">选择路径</el-button>
  223. </el-form-item>
  224. </template>
  225. <!-- 回复素材 -->
  226. <template v-if="state.right.type == 'click'">
  227. <el-form-item label="消息类型">
  228. <el-radio-group v-model="state.right.media_type" @change="onChangeMediaType">
  229. <el-radio label="news">图文消息</el-radio>
  230. <el-radio label="image">图片</el-radio>
  231. <el-radio label="video">视频</el-radio>
  232. <el-radio label="voice">语音</el-radio>
  233. <el-radio label="text">文本</el-radio>
  234. <el-radio label="link">链接</el-radio>
  235. </el-radio-group>
  236. </el-form-item>
  237. <el-form-item v-if="state.right.media_type" label="消息内容">
  238. <el-select popper-class="material-select" v-model="state.right.media_id">
  239. <el-option v-for="item in material.select" :key="item.media_id"
  240. :label="item.title" :value="item.media_id + ''">
  241. <div class="sa-flex">
  242. <sa-image v-if="
  243. item.type == 'news' ||
  244. item.type == 'image' ||
  245. item.type == 'video' ||
  246. item.type == 'link'
  247. " :url="item.thumb_url" size="30"></sa-image>
  248. <div class="title ml-2 sa-line-1">
  249. {{ item.title }}
  250. </div>
  251. <div class="media_id ml-2 sa-line-1">
  252. {{ item.media_id }}
  253. </div>
  254. </div>
  255. </el-option>
  256. <sa-pagination class="is-ellipsis" v-model="material.pagination"
  257. @pagination-change="getMaterialSelect">
  258. </sa-pagination>
  259. </el-select>
  260. </el-form-item>
  261. </template>
  262. </template>
  263. </el-form>
  264. </div>
  265. </div>
  266. </el-scrollbar>
  267. </el-main>
  268. <el-footer class="sa-footer--submit sa-flex sa-row-right">
  269. <el-button type="primary" plain @click="onConfirm">确定</el-button>
  270. {if $auth->check('shopro/wechat/menu/publish')}
  271. <el-button type="primary" @click="onPublish">确定&发布</el-button>
  272. {/if}
  273. </el-footer>
  274. </el-container>
  275. </div>