DataModel.js 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  1. import { createUUID, deepClone } from '../../../common/uitls'
  2. import { cloneDeep, merge } from "lodash";
  3. import $config from '@client/config'
  4. // 元素配置信息字段
  5. let elementConfig = {
  6. elName: '', // 组件名
  7. animations: [], // 图层的动画,可以支持多个动画
  8. commonStyle: { //公共样式,默认样式
  9. position: 'absolute',
  10. width: $config.canvasH5Width,
  11. height: 30,
  12. top: 200,
  13. left: 0,
  14. rotate: 0,
  15. paddingTop: 0,
  16. paddingLeft: 0,
  17. paddingRight: 0,
  18. paddingBottom: 0,
  19. marginTop: 0,
  20. marginLeft: 0,
  21. marginRight: 0,
  22. marginBottom: 0,
  23. borderWidth: 0,
  24. borderColor: '',
  25. borderStyle: 'solid',
  26. borderRadius: 0,
  27. boxShadow: '',
  28. fontSize: 16,
  29. fontWeight: 500,
  30. lineHeight: 1.4,
  31. letterSpacing: 0,
  32. textAlign: 'center',
  33. color: '#000000',
  34. backgroundColor: '',
  35. backgroundImage: '',
  36. backgroundSize: 'cover',
  37. opacity: 1,
  38. zIndex: 1
  39. },
  40. events: [], // 事件
  41. propsValue: {}, // 属性参数
  42. value: '', // 绑定值
  43. valueType: 'String' // 值类型
  44. }
  45. let pcElementConfig = {
  46. elName: '', // 组件名
  47. animations: [], // 图层的动画,可以支持多个动画
  48. commonStyle: { //公共样式,默认样式
  49. position: 'unset',
  50. width: '100%',
  51. height: 'auto',
  52. top: 0,
  53. left: 0,
  54. rotate: 0,
  55. paddingTop: 0,
  56. paddingLeft: 0,
  57. paddingRight: 0,
  58. paddingBottom: 0,
  59. marginTop: 0,
  60. marginLeft: 0,
  61. marginRight: 0,
  62. marginBottom: 0,
  63. borderWidth: 0,
  64. borderColor: '',
  65. borderStyle: 'solid',
  66. borderRadius: 0,
  67. boxShadow: '',
  68. fontSize: 16,
  69. fontWeight: 500,
  70. lineHeight: 1.4,
  71. letterSpacing: 0,
  72. textAlign: 'center',
  73. color: '#000000',
  74. backgroundColor: '',
  75. backgroundImage: '',
  76. backgroundSize: 'cover',
  77. opacity: 1,
  78. zIndex: 1
  79. },
  80. events: [], // 事件
  81. propsValue: {}, // 属性参数
  82. value: '', // 绑定值
  83. valueType: 'String' // 值类型
  84. }
  85. let longElementConfig = {
  86. elName: '', // 组件名
  87. animations: [], // 图层的动画,可以支持多个动画
  88. commonStyle: { //公共样式,默认样式
  89. position: 'unset',
  90. width: '100%',
  91. height: 'auto',
  92. top: 0,
  93. left: 0,
  94. rotate: 0,
  95. paddingTop: 0,
  96. paddingLeft: 0,
  97. paddingRight: 0,
  98. paddingBottom: 0,
  99. marginTop: 0,
  100. marginLeft: 0,
  101. marginRight: 0,
  102. marginBottom: 0,
  103. borderWidth: 0,
  104. borderColor: '',
  105. borderStyle: 'solid',
  106. borderRadius: 0,
  107. boxShadow: '',
  108. fontSize: 16,
  109. fontWeight: 500,
  110. lineHeight: 1.4,
  111. letterSpacing: 0,
  112. textAlign: 'center',
  113. color: '#000000',
  114. backgroundColor: '',
  115. backgroundImage: '',
  116. backgroundSize: 'cover',
  117. opacity: 1,
  118. zIndex: 1
  119. },
  120. events: [], // 事件
  121. propsValue: {}, // 属性参数
  122. value: '', // 绑定值
  123. valueType: 'String' // 值类型
  124. }
  125. // 页面配置信息字段
  126. let pageConfig = {
  127. name: '',
  128. elements: [], //页面元素
  129. commonStyle: {
  130. backgroundColor: '',
  131. backgroundImage: '',
  132. backgroundSize: 'cover'
  133. },
  134. config: {}
  135. }
  136. // 项目配置信息字段
  137. let projectConfig = {
  138. name: '',
  139. title: '剑鱼标讯',
  140. description: '剑鱼标讯是国内专业的招标大数据服务平台,专注于全国招标采购信息的搜索查询、订阅推送和数据定制化服务。',
  141. keywords: '招标网站,招标信息查询,剑鱼标讯,招标采购信息,招标大数据平台',
  142. coverImage: '',
  143. author: '',
  144. script: '',
  145. width: $config.canvasH5Width,
  146. height: $config.canvasH5Height,
  147. pages: [],
  148. shareConfig: {
  149. "shareWx": false,
  150. "coverImage": "",
  151. "title": "剑鱼标讯",
  152. "description": "剑鱼标讯是国内专业的招标大数据服务平台,专注于全国招标采购信息的搜索查询、订阅推送和数据定制化服务。"
  153. },
  154. }
  155. let getElementConfig = function(element, extendStyle = {}, pageMode) {
  156. let elementData = cloneDeep(element)
  157. let type = elementData.valueType || 'String' // 默认string类型
  158. let dict = {
  159. 'String': '',
  160. 'Array': [],
  161. 'Object': {},
  162. 'Boolean': false,
  163. 'Number': 0
  164. // 待扩展数据类型
  165. }
  166. let modeElementConfig = elementConfig
  167. switch (pageMode) {
  168. case 'pc': {
  169. modeElementConfig = pcElementConfig
  170. break
  171. }
  172. case 'longPage': {
  173. modeElementConfig = longElementConfig
  174. break
  175. }
  176. }
  177. let elementConfigData = cloneDeep(modeElementConfig)
  178. let config = {
  179. uuid: createUUID(),
  180. ...elementConfigData,
  181. elName: elementData.elName,
  182. propsValue: deepClone(elementData.needProps || {})
  183. }
  184. // 样式
  185. config.commonStyle = merge(config.commonStyle, elementData.defaultStyle)
  186. config.commonStyle = merge(config.commonStyle, extendStyle)
  187. config.value = element.defaultValue || dict[type];
  188. config.valueType = type;
  189. return config;
  190. }
  191. let copyElement = function(element, extendStyle = {}) {
  192. element = cloneDeep(element)
  193. element.uuid = createUUID();
  194. element.commonStyle = merge(element.commonStyle, extendStyle)
  195. // 加上一点偏移量,以作区分
  196. element.commonStyle.top = element.commonStyle.top + 10
  197. element.commonStyle.left = element.commonStyle.left + 10
  198. return element
  199. }
  200. let getPageConfig = function() {
  201. return {
  202. uuid: createUUID(),
  203. ...cloneDeep(pageConfig)
  204. }
  205. }
  206. let copyPage = function(data) {
  207. let pageData = cloneDeep(data);
  208. pageData.uuid = createUUID();
  209. pageData.elements = pageData.elements.map(element => {
  210. return copyElement(element)
  211. })
  212. return pageData;
  213. }
  214. let getProjectConfig = function(pageType) {
  215. let project = cloneDeep(projectConfig)
  216. let onePage = getPageConfig()
  217. project.pages.push({
  218. ...onePage
  219. })
  220. switch (pageType) {
  221. case 'longPage': {
  222. project.height = 'auto'
  223. break
  224. }
  225. case 'pc': {
  226. project.width = 1200
  227. project.height = 'auto'
  228. break
  229. }
  230. }
  231. return { ...project }
  232. }
  233. /**
  234. * 获取元素样式
  235. * @param styleObj
  236. * @param scalePoint 缩放比例
  237. */
  238. let getCommonStyle = function(styleObj, scalingRatio = 1) {
  239. let needUnitStr = ['width', 'height', 'top', 'left', 'paddingTop', 'paddingLeft', 'paddingRight', 'paddingBottom', 'marginTop', 'marginLeft', 'marginRight', 'marginBottom', 'borderWidth', 'fontSize', 'borderRadius', 'letterSpacing']
  240. let style = {}
  241. for (let key in styleObj) {
  242. if (needUnitStr.includes(key)) {
  243. style[key] = (styleObj[key] * scalingRatio) + 'px'
  244. } else {
  245. style[key] = styleObj[key]
  246. }
  247. }
  248. style.transform = `rotate(${style.rotate}deg)`
  249. style.backgroundImage = style.backgroundImage ? `url(${style.backgroundImage})` : '';
  250. return style;
  251. }
  252. // function getEleByElName(elName) {
  253. // let list = [];
  254. // eleConfig.forEach(item => {
  255. // list = [...list, ...item.components]
  256. // })
  257. // return list.find(v => {return v.elName === elName})
  258. // }
  259. export default {
  260. elementConfig,
  261. pageConfig,
  262. projectConfig,
  263. getElementConfig,
  264. getPageConfig,
  265. getProjectConfig,
  266. copyPage,
  267. copyElement,
  268. getCommonStyle
  269. }