diy-util.js 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  1. function getRandomId(list = []) {
  2. var initArr = [] // getInitArr(); // 拿到已有的id -- 一般不会冲突
  3. // 随机id不能和以前编辑冲突
  4. function generateId() {
  5. const s = [];
  6. const hexDigits = '0123456789abcdef';
  7. for (let i = 0; i < 36; i++) {
  8. s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);
  9. }
  10. s[14] = '4';
  11. s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1);
  12. s[8] = s[13] = s[18] = s[23] = '-';
  13. const uuid = s.join('');
  14. if (initArr.some(str => (str === uuid))) { // 存在已有数据
  15. return generateId()
  16. }
  17. return uuid;
  18. }
  19. function getInitArr() {
  20. return list.map(item => {
  21. return item.id
  22. })
  23. }
  24. var id = generateId()
  25. return id
  26. }
  27. function deepClone(obj) {
  28. var o, i, j, k;
  29. if (typeof(obj) != "object" || obj === null) return obj;
  30. if (obj instanceof(Array)) {
  31. o = [];
  32. i = 0;
  33. j = obj.length;
  34. for (; i < j; i++) {
  35. if (typeof(obj[i]) == "object" && obj[i] != null) {
  36. o[i] = arguments.callee(obj[i]);
  37. } else {
  38. o[i] = obj[i];
  39. }
  40. }
  41. } else {
  42. o = {};
  43. for (i in obj) {
  44. if (typeof(obj[i]) == "object" && obj[i] != null) {
  45. o[i] = arguments.callee(obj[i]);
  46. } else {
  47. o[i] = obj[i];
  48. }
  49. }
  50. }
  51. return o;
  52. }
  53. function getObjValue(target = {}, keys = [], def) {
  54. let obj = deepClone(target)
  55. try {
  56. value = keys.reduce((prev, key) => {
  57. return prev[key]
  58. }, target)
  59. } catch (error) {
  60. value = def
  61. }
  62. return value || def
  63. }
  64. function deepEqual(x, y) {
  65. // 指向同一内存时
  66. if (x === y) {
  67. return true;
  68. } else if ((typeof x == "object" && x != null) && (typeof y == "object" && y != null)) {
  69. if (Object.keys(x).length !== Object.keys(y).length) {
  70. return false;
  71. }
  72. for (var prop in x) {
  73. if (y.hasOwnProperty(prop)) {
  74. if (!deepEqual(x[prop], y[prop])) return false;
  75. } else {
  76. return false;
  77. }
  78. }
  79. return true;
  80. } else {
  81. return false;
  82. }
  83. }
  84. //16进制颜色转化为RGB颜色
  85. function colorRgb(str) {
  86. var reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/;
  87. var sColor = str.toLowerCase();
  88. if (sColor && reg.test(sColor)) {
  89. if (sColor.length === 4) {
  90. var sColorNew = "#";
  91. for (var i = 1; i < 4; i += 1) {
  92. sColorNew += sColor.slice(i, i + 1).concat(sColor.slice(i, i + 1));
  93. }
  94. sColor = sColorNew;
  95. }
  96. //处理六位的颜色值
  97. var sColorChange = [];
  98. for (var i = 1; i < 7; i += 2) {
  99. sColorChange.push(parseInt("0x" + sColor.slice(i, i + 2)));
  100. }
  101. return "rgb(" + sColorChange.join(",") + ")";
  102. } else {
  103. return sColor;
  104. }
  105. }
  106. //判断是否为亮色
  107. function getContrastYIQ(hexcolor) {
  108. var colorrgb = colorRgb(hexcolor);
  109. var colors = colorrgb.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/);
  110. var red = colors[1];
  111. var green = colors[2];
  112. var blue = colors[3];
  113. var brightness;
  114. brightness = (red * 299) + (green * 587) + (blue * 114);
  115. brightness = brightness / 255000;
  116. if (brightness >= 0.5) {
  117. return "light";
  118. } else {
  119. return "dark";
  120. }
  121. }
  122. // 获取链接选择其他链接类型中文
  123. function getOtherUrlName(type) {
  124. let text = "";
  125. if (type == "call") {
  126. text = "拨打电话"
  127. } else if (type == "web") {
  128. text = "自定义链接"
  129. } else if (type == "applet") {
  130. text = "小程序"
  131. }
  132. return text;
  133. }
  134. var basicMixins = {
  135. data() {
  136. return {
  137. defaultForm: {
  138. default_color: "transparer",
  139. colorInfos: ['底部背景'],
  140. sizeInfos: ['上边距', '下边距', '左右边距'],
  141. radiusInfos: ['上圆角', '下圆角'],
  142. defColor: "transparent",
  143. tabItem: null
  144. },
  145. result: {},
  146. searchIpts: {},
  147. // diy_img_prefix: _diy_img_prefix,
  148. }
  149. },
  150. created() {
  151. this.init()
  152. },
  153. // 这里是基础的修改 - 需要其他自行添加对应方法-数据
  154. methods: {
  155. init() {
  156. // 设置默认值
  157. this.result = deepClone(this.activeItem)
  158. this.searchIpts = this.result.computedStyle.searchIpts || {}
  159. // 描边颜色默认值
  160. let arr = ['computedStyle', 'tabItem']
  161. this.defaultForm.tabItem = getObjValue(this.result, arr, this.defaultForm.tabItem)
  162. // 选择颜色样式
  163. let arr1 = ['computedStyle', 'searchBox']
  164. var colorArr = [{
  165. name: '底部背景', //名字
  166. color: getObjValue(this.result, arr1, "transparent"), //颜色
  167. showAlpha: false, //是否开启透明度
  168. }, ]
  169. this.defaultForm.colorInfos = colorArr
  170. // 边距
  171. let arr2 = ['computedStyle', 'searchIpts', 'marginBottom']
  172. let arr3 = ['computedStyle', 'searchIpts', 'marginLeft']
  173. let arr4 = ['computedStyle', 'searchIpts', 'marginTop']
  174. var marginArr = [{
  175. name: '上边距', //名字
  176. value: parseFloat(getObjValue(this.result, arr4, 0)), //值
  177. unit: "px", //单位
  178. disabled: false, //是否禁用
  179. maxValue: 50,
  180. }, {
  181. name: '下边距', //名字
  182. value: parseFloat(getObjValue(this.result, arr2, 0)), //值
  183. unit: "px", //单位
  184. disabled: false, //是否禁用
  185. maxValue: 50,
  186. }, {
  187. name: '左右边距', //名字
  188. value: parseFloat(getObjValue(this.result, arr3, 0)), //值
  189. unit: "px", //单位
  190. disabled: false, //是否禁用
  191. maxValue: 20,
  192. }]
  193. this.defaultForm.sizeInfos = marginArr
  194. // 圆角
  195. let arr5 = ['computedStyle', 'searchIpts', 'border-top-left-radius']
  196. let arr6 = ['computedStyle', 'searchIpts', 'border-bottom-right-radius']
  197. var radiusArr = [{
  198. name: '上圆角', //名字
  199. value: parseFloat(getObjValue(this.result, arr5, 0)), //值
  200. unit: "px", //单位
  201. disabled: false, //是否禁用
  202. maxValue: 20,
  203. }, {
  204. name: '下圆角', //名字
  205. value: parseFloat(getObjValue(this.result, arr6, 0)), //值
  206. unit: "px", //单位
  207. disabled: false, //是否禁用
  208. maxValue: 20,
  209. }]
  210. this.defaultForm.radiusInfos = radiusArr
  211. },
  212. // 基础逻辑
  213. colorSelect(e) { // 样式
  214. console.log(e)
  215. let tabItem = this.defaultForm.tabItem || {}
  216. this.defaultForm.tabItem = Object.assign(tabItem, e.item)
  217. console.log(this.defaultForm.tabItem);
  218. this.updataResult(this.defaultForm.tabItem, 'tabItem')
  219. },
  220. sliderChange(arr, type, showUnit = true) { // 边距
  221. let top = arr[0] && (showUnit ? (arr[0].value + arr[0].unit) : arr[0].value)
  222. let bottom = arr[1] && (showUnit ? (arr[1].value + arr[1].unit) : arr[1].value)
  223. let lr = arr[2] && (showUnit ? (arr[2].value + arr[2].unit) : arr[2].value)
  224. const style = {
  225. marginTop: top,
  226. marginBottom: bottom,
  227. marginLeft: lr,
  228. marginRight: lr
  229. }
  230. this.searchIpts = Object.assign(this.searchIpts, style)
  231. this.updataResult(this.searchIpts, 'searchIpts')
  232. },
  233. RadiusChange(arr) {
  234. let top = arr[0].value + arr[0].unit
  235. let bottom = arr[1].value + arr[1].unit
  236. const style = {
  237. 'border-top-left-radius': top,
  238. 'border-top-right-radius': top,
  239. 'border-bottom-right-radius': bottom,
  240. 'border-bottom-left-radius': bottom
  241. }
  242. this.searchIpts = Object.assign(this.searchIpts, style)
  243. this.updataResult(this.searchIpts, 'searchIpts')
  244. },
  245. updateColor(e) { // 选择颜色
  246. this.result.computedStyle.searchBox = e[0].color
  247. this.$emit("update", this.result)
  248. },
  249. updataResult(style, name) {
  250. var result = deepClone(style)
  251. this.result.computedStyle[name] = result
  252. this.$emit("update", this.result)
  253. },
  254. iptSelect(e) {
  255. e.currentTarget.select();
  256. },
  257. }
  258. }
  259. // dom生成canvas
  260. function domToCanvas(contain) {
  261. var canvas2 = document.createElement("canvas");
  262. var w = $(contain).outerWidth();
  263. var h = $(contain).outerHeight();
  264. //先放大2倍,后期缩小,处理模糊问题
  265. canvas2.width = w * 2;
  266. canvas2.height = h * 2;
  267. canvas2.style.width = w + "px";
  268. canvas2.style.height = h + "px";
  269. var context = canvas2.getContext("2d");
  270. // 进行缩放
  271. context.scale(2, 2);
  272. return new Promise((resolve, reject) => {
  273. html2canvas(document.querySelector(contain), {
  274. canvas: canvas2,
  275. allowTaint: true, //允许污染
  276. taintTest: true, //在渲染前测试图片
  277. useCORS: true //使用跨域
  278. }).then(function(canvas) {
  279. resolve(canvas)
  280. });
  281. })
  282. }
  283. function debounce(func, wait) {
  284. let timer;
  285. return function() {
  286. let context = this; // 注意 this 指向
  287. let args = arguments; // arguments中存着e
  288. if (timer) clearTimeout(timer);
  289. timer = setTimeout(() => {
  290. func.apply(this, args)
  291. }, wait)
  292. }
  293. }