design.html 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. <nc-component :data="data[index]" class="graphic-navigation">
  2. <!-- 预览 -->
  3. <template slot="preview">
  4. <template v-if="nc.lazyLoad">
  5. <div :class="['graphic-nav',nc.showStyle] " :style="{
  6. backgroundColor: nc.componentBgColor,
  7. borderTopLeftRadius: (nc.componentAngle == 'round' ? nc.topAroundRadius + 'px' : 0),
  8. borderTopRightRadius: (nc.componentAngle == 'round' ? nc.topAroundRadius + 'px' : 0),
  9. borderBottomLeftRadius: (nc.componentAngle == 'round' ? nc.bottomAroundRadius + 'px' : 0),
  10. borderBottomRightRadius: (nc.componentAngle == 'round' ? nc.bottomAroundRadius + 'px' : 0),
  11. boxShadow: nc.ornament.type == 'shadow' ? ('0 0 5px ' + nc.ornament.color) : '',
  12. border: nc.ornament.type == 'stroke' ? '1px solid ' + nc.ornament.color : ''
  13. }">
  14. <template v-if="nc.showStyle == 'pageSlide'">
  15. <div class="graphic-nav-wrap" v-for="(numItem,numIndex) in Math.ceil(nc.list.length / (nc.pageCount * nc.rowCount))">
  16. <div :class="['graphic-nav-item',{'layui-hide': nc.tempData.carouselIndex != numIndex}]"
  17. v-for="(item,previewIndex) in nc.list" :key="previewIndex"
  18. v-if="previewIndex >= [(numItem-1) * (nc.pageCount * nc.rowCount)] && previewIndex < [numItem * (nc.pageCount * nc.rowCount)]"
  19. :style="{width: (100 / nc.rowCount + '%')}"
  20. >
  21. <div class="graphic-img" v-show="nc.mode != 'text'" :style="{'font-size' : nc.imageSize + 'px'}">
  22. <img v-if="item.iconType == 'img' && item.imageUrl" :src="changeImgUrl(item.imageUrl)" alt="" :style="{maxWidth: nc.imageSize + 'px', maxHeight: nc.imageSize + 'px', borderRadius: nc.aroundRadius + 'px'}">
  23. <iconfont v-if="item.iconType == 'icon' && item.icon" :icon="item.icon" :value="(item.style ? item.style : null)" :style="{maxWidth: nc.imageSize + 'px', maxHeight: nc.imageSize + 'px'}"></iconfont>
  24. <img v-if="!item.icon && !item.imageUrl" :src="changeImgUrl('public/static/img/default_img/square.png')" alt="" :style="{maxWidth: nc.imageSize + 'px', maxHeight: nc.imageSize + 'px', borderRadius: nc.aroundRadius + 'px'}">
  25. <span class="tag" v-if="item.label.control" :style="{color: item.label.textColor,backgroundImage: 'linear-gradient(' + item.label.bgColorStart + ',' + item.label.bgColorEnd + ')'}">{{item.label.text}}</span>
  26. </div>
  27. <span v-show="nc.mode != 'img'" class="graphic-text" :style="{fontSize: nc.font.size + 'px',fontWeight: nc.font.weight, color: nc.font.color}">{{item.title}}</span>
  28. </div>
  29. </div>
  30. <div class="carousel-btn" v-if="Math.ceil(nc.list.length / (nc.pageCount * nc.rowCount)) -1">
  31. <div class="arrows">
  32. <i class="iconfont iconback_light" @click="nc.tempData.carouselIndex = (nc.tempData.carouselIndex ? nc.tempData.carouselIndex-1 : nc.tempData.carouselIndex)"></i>
  33. <i class="iconfont iconyoujiantou" @click="nc.tempData.carouselIndex = [nc.tempData.carouselIndex < Math.ceil(nc.list.length / (nc.pageCount * nc.rowCount))-1 ? + nc.tempData.carouselIndex + 1 : Math.ceil(nc.list.length / (nc.pageCount * nc.rowCount))-1]"></i>
  34. </div>
  35. <div :class="['dot-wrap',nc.carousel.type]">
  36. <i v-for="(numItem,numIndex) in Math.ceil(nc.list.length / (nc.pageCount * nc.rowCount))" :class="{'active': nc.tempData.carouselIndex == numIndex}" @click="nc.tempData.carouselIndex = numIndex"></i>
  37. </div>
  38. </div>
  39. </template>
  40. <div v-else class="graphic-nav-item" v-for="(item) in nc.list" :key="item.id" :style="{width: (100 / nc.rowCount + '%')}">
  41. <div class="graphic-img" v-show="nc.mode != 'text'" :style="{'font-size' : nc.imageSize + 'px', width: nc.imageSize + 'px', height: nc.imageSize + 'px'}">
  42. <img v-if="item.iconType == 'img' && item.imageUrl" :src="changeImgUrl(item.imageUrl)" alt="" :style="{maxWidth: nc.imageSize + 'px', maxHeight: nc.imageSize + 'px', borderRadius: nc.aroundRadius + 'px'}">
  43. <iconfont v-if="item.iconType == 'icon' && item.icon" :icon="item.icon" :value="(item.style ? item.style : null)" :style="{maxWidth: nc.imageSize + 'px', maxHeight: nc.imageSize + 'px'}"></iconfont>
  44. <img v-if="!item.icon && !item.imageUrl" :src="changeImgUrl('public/static/img/default_img/square.png')" alt="" :style="{maxWidth: nc.imageSize + 'px', maxHeight: nc.imageSize + 'px', borderRadius: nc.aroundRadius + 'px'}">
  45. <span class="tag" v-if="item.label.control" :style="{color: item.label.textColor,backgroundImage: 'linear-gradient(' + item.label.bgColorStart + ',' + item.label.bgColorEnd + ')'}">{{item.label.text}}</span>
  46. </div>
  47. <span v-show="nc.mode != 'img'" class="graphic-text" :style="{fontSize: nc.font.size+'px',fontWeight: nc.font.weight, color: nc.font.color}">{{item.title}}</span>
  48. </div>
  49. </div>
  50. </template>
  51. </template>
  52. <!-- 内容编辑 -->
  53. <template slot="edit-content">
  54. <template v-if="nc.lazyLoad">
  55. <graphic-nav-list></graphic-nav-list>
  56. <div class="template-edit-title">
  57. <h3>导航模式</h3>
  58. <div class="layui-form-item icon-radio">
  59. <label class="layui-form-label sm">选择模式</label>
  60. <div class="layui-input-block">
  61. <span v-for="item in nc.tempData.modeList" :class="[item.value == nc.mode ? '' : 'layui-hide']">{{item.name}}</span>
  62. <ul class="icon-wrap">
  63. <li v-for="item in nc.tempData.modeList" :class="[item.value == nc.mode ? 'text-color border-color' : '']" @click="nc.mode = item.value">
  64. <i :class="['iconfont',item.src]"></i>
  65. </li>
  66. </ul>
  67. </div>
  68. </div>
  69. <div class="layui-form-item icon-radio">
  70. <label class="layui-form-label sm">展示风格</label>
  71. <div class="layui-input-block">
  72. <span v-for="item in nc.tempData.showStyleList" :class="[item.value == nc.showStyle ? '' : 'layui-hide']">{{item.name}}</span>
  73. <ul class="icon-wrap">
  74. <li v-for="item in nc.tempData.showStyleList" :class="[item.value == nc.showStyle ? 'text-color border-color' : '']" @click="nc.showStyle = item.value">
  75. <i :class="['iconfont',item.src]"></i>
  76. </li>
  77. </ul>
  78. </div>
  79. </div>
  80. <div class="layui-form-item icon-radio">
  81. <label class="layui-form-label sm">每行数量</label>
  82. <div class="layui-input-block">
  83. <span v-for="item in nc.tempData.rowCountList" :class="[{'layui-hide': item.value != nc.rowCount}]">{{item.name}}</span>
  84. <ul class="icon-wrap">
  85. <li v-for="item in nc.tempData.rowCountList" :class="[item.value == nc.rowCount ? 'text-color border-color' : '']" @click="nc.rowCount = item.value">
  86. <i :class="['iconfont',item.src]"></i>
  87. </li>
  88. </ul>
  89. </div>
  90. </div>
  91. <div class="layui-form-item icon-radio" v-show="nc.showStyle == 'pageSlide'">
  92. <label class="layui-form-label sm">每页行数</label>
  93. <div class="layui-input-block">
  94. <span v-for="item in nc.tempData.pageCountList" :class="[item.value == nc.pageCount ? '' : 'layui-hide']">{{item.name}}</span>
  95. <ul class="icon-wrap">
  96. <li v-for="item in nc.tempData.pageCountList" :class="[item.value == nc.pageCount ? 'text-color border-color' : '']" @click="nc.pageCount = item.value">
  97. <i :class="['iconfont',item.src]"></i>
  98. </li>
  99. </ul>
  100. </div>
  101. </div>
  102. </div>
  103. <div class="template-edit-title">
  104. <h3>图文导航项</h3>
  105. <div class="graphic-nav-list">
  106. <p class="hint">建议上传尺寸相同的图片(60px * 60px)</p>
  107. <ul class="navigation-set-list">
  108. <li v-for="(item,previewIndex) in nc.list" :key="item.id" class="content-block">
  109. <template v-if="['graphic','img'].includes(nc.mode)">
  110. <div class="layui-form-item">
  111. <label class="layui-form-label sm">图片</label>
  112. <div class="layui-input-block">
  113. <image-upload :data="{ data : item }" :condition="['graphic','img'].includes(nc.mode)" data-disabled="1"></image-upload>
  114. </div>
  115. </div>
  116. </template>
  117. <div class="layui-form-item" v-if="['graphic','text'].includes(nc.mode)">
  118. <label class="layui-form-label sm">标题</label>
  119. <div class="layui-input-block">
  120. <input type="text" name='title' v-model="item.title" maxlength="20" class="layui-input" autocomplete="off" />
  121. </div>
  122. </div>
  123. <nc-link :data="{ field : item.link, label:'链接' }"></nc-link>
  124. <i class="del" @click="nc.list.splice(previewIndex,1)" data-disabled="1">x</i>
  125. <div class="error-msg"></div>
  126. <div class="iconfont icontuodong"></div>
  127. </li>
  128. <div class="add-item text-color" @click="nc.tempData.methods.addNav()">
  129. <i>+</i>
  130. <span>添加一个图文导航</span>
  131. </div>
  132. </ul>
  133. </div>
  134. </div>
  135. </template>
  136. </template>
  137. <!-- 样式编辑 -->
  138. <template slot="edit-style">
  139. <template v-if="nc.lazyLoad">
  140. <div class="template-edit-title">
  141. <h3>图文导航</h3>
  142. <div class="layui-form-item tag-wrap">
  143. <label class="layui-form-label sm">样式</label>
  144. <div class="layui-input-block">
  145. <div v-for="(item,ornamentIndex) in nc.tempData.ornamentList" :key="ornamentIndex" @click="nc.ornament.type=item.type" :class="{ 'layui-unselect layui-form-radio' : true,'layui-form-radioed' : (nc.ornament.type==item.type) }">
  146. <i class="layui-anim layui-icon">{{ nc.ornament.type == item.type ? "&#xe643;" : "&#xe63f;" }}</i>
  147. <div>{{item.text}}</div>
  148. </div>
  149. </div>
  150. </div>
  151. <color v-if="nc.ornament.type != 'default'" :data="{ field : 'color', 'label' : '边框颜色', parent : 'ornament', defaultColor : '#EDEDED' }"></color>
  152. <div class="layui-form-item icon-radio" v-show="nc.showStyle == 'pageSlide'">
  153. <label class="layui-form-label sm">轮播点样式</label>
  154. <div class="layui-input-block">
  155. <span v-for="item in nc.tempData.carouselList" :class="[{'layui-hide': item.value != nc.carousel.type}]">{{item.name}}</span>
  156. <ul class="icon-wrap">
  157. <li v-for="item in nc.tempData.carouselList" :class="[item.value == nc.carousel.type ? 'text-color border-color' : '']" @click="nc.carousel.type = item.value">
  158. <i :class="['iconfont',item.src]"></i>
  159. </li>
  160. </ul>
  161. </div>
  162. </div>
  163. </div>
  164. <div class="template-edit-title" v-show="['graphic','img'].includes(nc.mode) && nc.type == 'img'">
  165. <h3>图片设置</h3>
  166. <template v-if="nc.type == 'img'">
  167. <slide :data="{ field : 'aroundRadius', label : '图片圆角', max : 50 }"></slide>
  168. <slide :data="{ field : 'imageSize', label : '图片大小', min: 30, max : 60 }"></slide>
  169. </template>
  170. </div>
  171. <div class="template-edit-title" v-if="['graphic','text'].includes(nc.mode)">
  172. <h3>文字设置</h3>
  173. <slide :data="{ field : 'size',parent:'font', label : '文字大小', min: 12, max : 16 }"></slide>
  174. <div class="layui-form-item icon-radio">
  175. <label class="layui-form-label sm">文字粗细</label>
  176. <div class="layui-input-block">
  177. <span v-for="item in nc.tempData.thicknessList" :class="[item.value == nc.font.weight ? '' : 'layui-hide']">{{item.name}}</span>
  178. <ul class="icon-wrap">
  179. <li v-for="(item, index) in nc.tempData.thicknessList" :class="[item.value == nc.font.weight ? 'text-color border-color' : '']" @click="nc.font.weight = item.value">
  180. <i class="iconfont" :class="[{'text-color': item.value == nc.font.weight}, item.src]"></i>
  181. </li>
  182. </ul>
  183. </div>
  184. </div>
  185. <color :data="{ field : 'color', label : '文字颜色',parent:'font',defaultColor: '#303133' }"></color>
  186. </div>
  187. </template>
  188. </template>
  189. <!-- 资源 -->
  190. <template slot="resource">
  191. <js>
  192. var graphicNavResourcePath = "{$resource_path}"; // http路径
  193. var graphicNavRelativePath = "{$relative_path}"; // 相对路径
  194. </js>
  195. <css src="{$resource_path}/css/design.css"></css>
  196. <js src="{$resource_path}/js/design.js"></js>
  197. </template>
  198. </nc-component>