uniApi.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428
  1. // +----------------------------------------------------------------------
  2. // | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
  3. // +----------------------------------------------------------------------
  4. // | Copyright (c) 2016~2024 https://www.crmeb.com All rights reserved.
  5. // +----------------------------------------------------------------------
  6. // | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
  7. // +----------------------------------------------------------------------
  8. // | Author: CRMEB Team <admin@crmeb.com>
  9. // +----------------------------------------------------------------------
  10. // import uniCopy from '@/js_sdk/xb-copy/uni-copy.js'; // 拷贝功能插件
  11. // import compressImage from './compressImage.js'; // 解决图片旋转90°问题
  12. // const device = uni.getSystemInfoSync();
  13. // console.log("device:======================== " + JSON.stringify(device));
  14. /*
  15. 参数说明
  16. @url
  17. 要跳转的目标地址
  18. @opt
  19. 要传给目标地址的参数
  20. 可在目标页面的onLoad生命周期函数的第一个参数中获取
  21. */
  22. // 压栈跳转页面
  23. export function navigateTo(type, url, opt) {
  24. // H5端页面跳转目前不支持动画 (浏览器性能限制)
  25. let toUrl = url;
  26. let api = 'navigateTo';
  27. toUrl = opt ? toUrl + '?' + convertObj(opt) : toUrl;
  28. switch (type) {
  29. case 1:
  30. api = 'navigateTo';
  31. break;
  32. case 2:
  33. api = 'redirectTo'; // 关闭当前页,跳转应用内某个页面
  34. break;
  35. case 3:
  36. api = 'reLaunch'; // 关闭所有页面,打开到应用内某个页面
  37. break;
  38. case 4:
  39. api = 'switchTab'; //跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面。
  40. break;
  41. default:
  42. api = 'navigateTo'
  43. break;
  44. }
  45. uni[api]({
  46. url: toUrl,
  47. animationType: 'slide-in-right',
  48. animationDuration: 200
  49. });
  50. }
  51. // 关闭当前页面并返回上一页面 delta 标识返回几层
  52. export function navigateBack(delta) {
  53. uni.navigateBack({
  54. delta: delta
  55. });
  56. }
  57. // setStorage 将数据存入缓存
  58. export function setStorage(key, val) {
  59. if (typeof val == 'string') {
  60. uni.setStorageSync(key, val);
  61. return val
  62. }
  63. uni.setStorageSync(key, JSON.stringify(val));
  64. }
  65. // getStorage 从缓存中读取数据
  66. export function getStorage(key) {
  67. let uu = uni.getStorageSync(key);
  68. try {
  69. if (typeof JSON.parse(uu) != 'number') {
  70. uu = JSON.parse(uu);
  71. }
  72. } catch (e) {}
  73. return uu;
  74. }
  75. // 删除缓存中的数据
  76. export function removeStorage(key) {
  77. if (key) {
  78. uni.removeStorageSync(key);
  79. }
  80. }
  81. // 将缓存中的数据清空
  82. export function clearStorage() {
  83. try {
  84. uni.clearStorageSync();
  85. } catch (e) {
  86. throw new Error('处理失败');
  87. }
  88. }
  89. // 显示Toast
  90. /*
  91. @title 最多汉字数量7个
  92. @icon success loading none
  93. */
  94. export function Toast(title, icon = 'none', obj = {}, duration = 800) {
  95. let toastData = {
  96. title: title,
  97. duration: duration,
  98. position: 'center',
  99. mask: true,
  100. icon: icon ? icon : 'none',
  101. ...obj
  102. };
  103. uni.showToast(toastData);
  104. }
  105. /*
  106. 显示loading提示框,需要手动隐藏
  107. */
  108. export function Loading(title = '正在加载...', obj = {}) {
  109. uni.showLoading({
  110. title: title,
  111. mask: true,
  112. ...obj
  113. });
  114. }
  115. // 隐藏loading
  116. export function hideLoading() {
  117. try {
  118. uni.hideLoading();
  119. } catch (e) {
  120. //TODO handle the exception
  121. throw new Error('处理失败');
  122. }
  123. }
  124. // 模态框
  125. /*
  126. 确定取消按钮的文字颜色可修改
  127. obj 对象中传入 cancelColor : rgb 即可修改取消按钮颜色
  128. obj 对象中传入 confirmColor : rgb 即可修改确认按钮颜色
  129. */
  130. export function Modal(title = '提示', content = '这是一个模态弹窗!', obj = {
  131. showCancel: true,
  132. cancelText: '取消',
  133. confirmText: '确定'
  134. }) {
  135. return new Promise((reslove, reject) => {
  136. uni.showModal({
  137. title: title,
  138. content: content,
  139. success: (res) => {
  140. if (res.confirm) {
  141. reslove()
  142. }
  143. if (res.cancel) {
  144. reject()
  145. }
  146. }
  147. });
  148. })
  149. }
  150. /*
  151. 显示操作菜单
  152. @itemList 操作菜单数组
  153. @itemColor 文字颜色
  154. */
  155. export function ActionSheet(itemList, itemColor = "#000000") {
  156. return new Promise((reslove, reject) => {
  157. uni.showActionSheet({
  158. itemList: itemList,
  159. itemColor: itemColor,
  160. success: (res) => {
  161. reslove(res.tapIndex);
  162. },
  163. fail: function(res) {
  164. reject(res.errMsg);
  165. }
  166. });
  167. })
  168. }
  169. //将页面滚动到目标位置。
  170. export function ScrollTo(ScrollTop) {
  171. uni.pageScrollTo({
  172. scrollTop: ScrollTop,
  173. duration: 300
  174. })
  175. }
  176. // 获取用户信息
  177. export function GetUserInfo() {
  178. return new Promise((reslove, reject) => {
  179. uni.getUserInfo({
  180. success(res) {
  181. console.log(res);
  182. reslove(res);
  183. },
  184. fail(rej) {
  185. reject(rej);
  186. }
  187. })
  188. })
  189. }
  190. // 获取用户授权信息
  191. export function Authorize(scoped = 'scope.userInfo') {
  192. return new Promise((reslove, reject) => {
  193. uni.authorize({
  194. scope: scoped,
  195. success(res) {
  196. reslove(res);
  197. },
  198. fail(rej) {
  199. reject(rej);
  200. }
  201. })
  202. })
  203. }
  204. // 将对象转换成使用 & 连接的字符串
  205. export function convertObj(opt) {
  206. let str = '';
  207. let arr = [];
  208. Object.keys(opt).forEach(item => {
  209. arr.push(`${item}=${opt[item]}`);
  210. })
  211. str = arr.join('&');
  212. return str;
  213. }
  214. // 节流函数
  215. // 节流函数
  216. export function throttle(fn, delay) {
  217. var lastArgs;
  218. var timer;
  219. var delay = delay || 200;
  220. return function(...args) {
  221. lastArgs = args;
  222. if(!timer){
  223. timer = setTimeout(()=>{
  224. timer = null;
  225. fn.apply(this, lastArgs);
  226. }, delay);
  227. }
  228. }
  229. }
  230. // 调起相机
  231. export function chooseImage(count) {
  232. return new Promise((reslove, reject) => {
  233. uni.chooseImage({
  234. count: count, //默认9
  235. sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有
  236. sourceType: ['album', 'camera'], //从相册选择
  237. success: (res) => {
  238. reslove(res);
  239. },
  240. fail: (rej) => {
  241. reject(rej);
  242. }
  243. });
  244. })
  245. }
  246. //序列化对象和数组
  247. export function serialize(data) {
  248. if (data != null && data != '') {
  249. try {
  250. return JSON.parse(JSON.stringify(data));
  251. } catch (e) {
  252. if (data instanceof Array) {
  253. return [];
  254. }
  255. return {};
  256. }
  257. }
  258. return data;
  259. }
  260. Date.prototype.format = function(fmt) {
  261. let o = {
  262. 'M+': this.getMonth() + 1, //月份
  263. 'd+': this.getDate(), //日
  264. 'h+': this.getHours(), //小时
  265. 'm+': this.getMinutes(), //分
  266. 's+': this.getSeconds(), //秒
  267. 'q+': Math.floor((this.getMonth() + 3) / 3), //季度
  268. S: this.getMilliseconds() //毫秒
  269. };
  270. if (/(y+)/.test(fmt)) {
  271. fmt = fmt.replace(RegExp.$1, String(this.getFullYear()).substr(4 - RegExp.$1.length));
  272. }
  273. for (let k in o) {
  274. if (new RegExp('(' + k + ')').test(fmt)) {
  275. fmt = fmt.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : ('00' + o[k]).substr(String(o[k]).length));
  276. }
  277. }
  278. return fmt;
  279. };
  280. //格式化日期
  281. export function formatDate(nS, format) {
  282. //日期格式化
  283. if (!nS) {
  284. return '';
  285. }
  286. format = format || 'yyyy-MM-dd hh:mm:ss';
  287. return new Date(nS).format(format);
  288. }
  289. // 图片转base64
  290. export function pathToBase64(path) {
  291. return new Promise(function(resolve, reject) {
  292. if (typeof window === 'object' && 'document' in window) {
  293. if (typeof FileReader === 'function') {
  294. var xhr = new XMLHttpRequest()
  295. xhr.open('GET', path, true)
  296. xhr.responseType = 'blob'
  297. xhr.onload = function() {
  298. if (this.status === 200) {
  299. let fileReader = new FileReader()
  300. fileReader.onload = function(e) {
  301. resolve(e.target.result)
  302. }
  303. fileReader.onerror = reject
  304. fileReader.readAsDataURL(this.response)
  305. }
  306. }
  307. xhr.onerror = reject
  308. xhr.send()
  309. return
  310. }
  311. var canvas = document.createElement('canvas')
  312. var c2x = canvas.getContext('2d')
  313. var img = new Image
  314. img.onload = function() {
  315. canvas.width = img.width
  316. canvas.height = img.height
  317. c2x.drawImage(img, 0, 0)
  318. resolve(canvas.toDataURL())
  319. canvas.height = canvas.width = 0
  320. }
  321. img.onerror = reject
  322. img.src = path
  323. return
  324. }
  325. if (typeof plus === 'object') {
  326. plus.io.resolveLocalFileSystemURL(getLocalFilePath(path), function(entry) {
  327. entry.file(function(file) {
  328. var fileReader = new plus.io.FileReader()
  329. fileReader.onload = function(data) {
  330. resolve(data.target.result)
  331. }
  332. fileReader.onerror = function(error) {
  333. reject(error)
  334. }
  335. fileReader.readAsDataURL(file)
  336. }, function(error) {
  337. reject(error)
  338. })
  339. }, function(error) {
  340. reject(error)
  341. })
  342. return
  343. }
  344. if (typeof wx === 'object' && wx.canIUse('getFileSystemManager')) {
  345. wx.getFileSystemManager().readFile({
  346. filePath: path,
  347. encoding: 'base64',
  348. success: function(res) {
  349. resolve('data:image/png;base64,' + res.data)
  350. },
  351. fail: function(error) {
  352. reject(error)
  353. }
  354. })
  355. return
  356. }
  357. reject(new Error('not support'))
  358. })
  359. }
  360. // 获取本周的第一天
  361. export function showWeekFirstDay() {
  362. var date = new Date();
  363. var weekday = date.getDay() || 7; //获取星期几,getDay()返回值是 0(周日) 到 6(周六) 之间的一个整数。0||7为7,即weekday的值为1-7
  364. date.setDate(date.getDate() - weekday + 1); //往前算(weekday-1)天,年份、月份会自动变化
  365. return formatDate(date, 'yyyy-MM-dd');
  366. }
  367. // 获取本月第一天
  368. export function showMonthFirstDay() {
  369. var MonthFirstDay = new Date().setDate(1);
  370. return formatDate(new Date(MonthFirstDay).getTime(), 'yyyy-MM-dd');
  371. }
  372. var now = new Date(); //当前日期
  373. var nowMonth = now.getMonth(); //当前月
  374. var nowYear = now.getYear(); //当前年
  375. nowYear += (nowYear < 2000) ? 1900 : 0; //
  376. //获得本季度的开始月份
  377. function getQuarterStartMonth() {
  378. var quarterStartMonth = 0;
  379. if(nowMonth < 3) {
  380. quarterStartMonth = 0;
  381. }
  382. if(2 < nowMonth && nowMonth < 6) {
  383. quarterStartMonth = 3;
  384. }
  385. if(5 < nowMonth && nowMonth < 9) {
  386. quarterStartMonth = 6;
  387. }
  388. if(nowMonth > 8) {
  389. quarterStartMonth = 9;
  390. }
  391. return quarterStartMonth;
  392. }
  393. //或的本季度的结束日期
  394. //获得本季度的开始日期
  395. export function getQuarterStartDate() {
  396. var quarterStartDate = new Date(nowYear, getQuarterStartMonth(), 1);
  397. return formatDate(quarterStartDate, 'yyyy-MM-dd');
  398. }
  399. // 删除数组中重复数据
  400. export function unique(data) {
  401. data = data || [];
  402. var n = {};//存放新的数据
  403. for(var i = 0; i < data.length; i++) {
  404. var v = JSON.stringify(data[i]);
  405. if(typeof (v) == "undefined") {
  406. n[v] = 1;
  407. }
  408. }
  409. data.length = 0;
  410. for(var i in n) {
  411. data[data.length] = i;
  412. }
  413. return data;
  414. }