utils.ts 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530
  1. import numeral from 'numeral';
  2. import dayjs from 'dayjs';
  3. import qs from 'query-string';
  4. export function vaildMusicScoreUrl() {
  5. const url: string = window.location.href;
  6. let returnUrl = '';
  7. if (/192/.test(url) || /localhost/.test(url)) {
  8. //本地环境
  9. returnUrl = 'https://test.kt.colexiu.com';
  10. } else if (/test/.test(url)) {
  11. // dev 环境
  12. returnUrl = 'https://test.kt.colexiu.com';
  13. } else if (/dev/.test(url)) {
  14. returnUrl = 'https://dev.kt.colexiu.com';
  15. } else {
  16. // 默认dev环境
  17. returnUrl = 'https://mec.colexiu.com';
  18. }
  19. return returnUrl;
  20. }
  21. export const browser = () => {
  22. // https://blog.csdn.net/qq_19309473/article/details/124138954
  23. const u = navigator.userAgent;
  24. const isAndroid = /(?:Android)/.test(u);
  25. const isFireFox = /(?:Firefox)/.test(u);
  26. function isIpadFun() {
  27. const ua = window.navigator.userAgent;
  28. let IsIPad = false;
  29. if (/ipad/i.test(ua)) {
  30. IsIPad = true;
  31. }
  32. // iPad from IOS13
  33. const macApp = ua.match(/Macintosh/i) != null;
  34. if (macApp) {
  35. // need to distinguish between Macbook and iPad
  36. const canvas = document.createElement('canvas');
  37. if (canvas != null) {
  38. const context: any =
  39. canvas.getContext('webgl') || canvas.getContext('experimental-webgl');
  40. if (context) {
  41. const info = context.getExtension('WEBGL_debug_renderer_info');
  42. if (info) {
  43. const renderer = context.getParameter(info.UNMASKED_RENDERER_WEBGL);
  44. if (renderer.indexOf('Apple') != -1) IsIPad = true;
  45. }
  46. }
  47. }
  48. }
  49. return IsIPad;
  50. }
  51. return {
  52. trident: u.indexOf('Trident') > -1, //IE内核
  53. presto: u.indexOf('Presto') > -1, //opera内核
  54. webKit: u.indexOf('AppleWebKit') > -1, //苹果、谷歌内核
  55. gecko: u.indexOf('Gecko') > -1 && u.indexOf('KHTML') == -1, //火狐内核
  56. mobile: !!u.match(/AppleWebKit.*Mobile.*/), //是否为移动终端
  57. ios: !!u.match(/Mac OS X/), //ios终端
  58. // ios: !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/), //ios终端
  59. android: u.indexOf('COLEXIUSTUDENT') > -1 || u.indexOf('Adr') > -1, //android终端
  60. iPhone: u.indexOf('COLEXIUAPPI') > -1, //是否为iPhone或者QQHD浏览器
  61. isApp:
  62. u.indexOf('COLEXIUAPPI') > -1 ||
  63. u.indexOf('COLEXIUAPPA') > -1 ||
  64. u.indexOf('Adr') > -1,
  65. isTablet:
  66. /(?:iPad|PlayBook)/.test(u) ||
  67. (isAndroid && !/(?:Mobile)/.test(u)) ||
  68. (isFireFox && /(?:Tablet)/.test(u)) ||
  69. isIpadFun(),
  70. iPad: u.indexOf('iPad') > -1, //是否iPad
  71. webApp: u.indexOf('Safari') == -1, //是否web应该程序,没有头部与底部
  72. weixin: u.indexOf('MicroMessenger') > -1, //是否微信 (2015-01-22新增)
  73. alipay: u.indexOf('AlipayClient') > -1, //是否支付宝
  74. huawei: !!u.match(/huawei/i) || !!u.match(/honor/i),
  75. xiaomi: !!u.match(/mi\s/i) || !!u.match(/redmi/i) || !!u.match(/mix/i)
  76. };
  77. };
  78. // 获取授权的code码
  79. export const getUrlCode = (name = 'code') => {
  80. // 截取url中的code方法
  81. // const url = location.search;
  82. // const theRequest: any = new Object();
  83. // if (url.indexOf('?') != -1) {
  84. // const str = url.substr(1);
  85. // const strs = str.split('&');
  86. // for (let i = 0; i < strs.length; i++) {
  87. // theRequest[strs[i].split('=')[0]] = strs[i].split('=')[1];
  88. // }
  89. // }
  90. // console.log(theRequest, 'theRequest');
  91. // return theRequest[name];
  92. let search: any = {};
  93. try {
  94. search = {
  95. ...qs.parse(location.search),
  96. ...qs.parse(location.hash.split('?')[1])
  97. };
  98. } catch (error) {
  99. //
  100. }
  101. return search[name];
  102. };
  103. export const getRandomKey = () => {
  104. const key = '' + new Date().getTime() + Math.floor(Math.random() * 1000000);
  105. return key;
  106. };
  107. export function checkPhone(phone: string) {
  108. const phoneRule =
  109. /^((13[0-9])|(14(0|[5-7]|9))|(15([0-3]|[5-9]))|(16(2|[5-7]))|(17[0-8])|(18[0-9])|(19([0-3]|[5-9])))\d{8}$/;
  110. return phoneRule.test(phone);
  111. }
  112. /**
  113. * @description 格式化日期控件显示内容
  114. * @param type
  115. * @param option
  116. * @returns OBJECT
  117. */
  118. export const formatterDatePicker = (type: any, option: any) => {
  119. if (type === 'year') {
  120. option.text += '年';
  121. }
  122. if (type === 'month') {
  123. option.text += '月';
  124. }
  125. if (type === 'day') {
  126. option.text += '日';
  127. }
  128. return option;
  129. };
  130. /**
  131. * 数字转成汉字
  132. * @params num === 要转换的数字
  133. * @return 汉字
  134. * */
  135. export const toChinesNum = (num: any) => {
  136. const changeNum = [
  137. '零',
  138. '一',
  139. '二',
  140. '三',
  141. '四',
  142. '五',
  143. '六',
  144. '七',
  145. '八',
  146. '九'
  147. ];
  148. const unit = ['', '十', '百', '千', '万'];
  149. num = parseInt(num);
  150. const getWan = (temp: any) => {
  151. const strArr = temp.toString().split('').reverse();
  152. let newNum = '';
  153. const newArr: string[] = [];
  154. strArr.forEach((item: any, index: any) => {
  155. newArr.unshift(
  156. item === '0' ? changeNum[item] : changeNum[item] + unit[index]
  157. );
  158. });
  159. const numArr: number[] = [];
  160. newArr.forEach((m, n) => {
  161. if (m !== '零') numArr.push(n);
  162. });
  163. if (newArr.length > 1) {
  164. newArr.forEach((m, n) => {
  165. if (newArr[newArr.length - 1] === '零') {
  166. if (n <= numArr[numArr.length - 1]) {
  167. newNum += m;
  168. }
  169. } else {
  170. newNum += m;
  171. }
  172. });
  173. } else {
  174. newNum = newArr[0];
  175. }
  176. return newNum;
  177. };
  178. const overWan = Math.floor(num / 10000);
  179. let noWan: any = num % 10000;
  180. if (noWan.toString().length < 4) {
  181. noWan = '0' + noWan;
  182. }
  183. return overWan ? getWan(overWan) + '万' + getWan(noWan) : getWan(num);
  184. };
  185. // 秒转分
  186. export const getSecondRPM = (second: number, type?: string) => {
  187. if (isNaN(second)) return '00:00';
  188. const mm = Math.floor(second / 60)
  189. .toString()
  190. .padStart(2, '0');
  191. const dd = Math.floor(second % 60)
  192. .toString()
  193. .padStart(2, '0');
  194. if (type === 'cn') {
  195. return mm + '分' + dd + '秒';
  196. } else {
  197. return mm + ':' + dd;
  198. }
  199. };
  200. export const getWeekCh = (week: number, type = 0) => {
  201. const template = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'];
  202. const template2 = [
  203. '星期天',
  204. '星期一',
  205. '星期二',
  206. '星期三',
  207. '星期四',
  208. '星期五',
  209. '星期六'
  210. ];
  211. return type ? template2[week] : template[week];
  212. };
  213. export const getGradeCh = (grade: number) => {
  214. const template = [
  215. '一年级',
  216. '二年级',
  217. '三年级',
  218. '四年级',
  219. '五年级',
  220. '六年级',
  221. '七年级',
  222. '八年级',
  223. '九年级'
  224. ];
  225. return template[grade];
  226. };
  227. export const numberFormat = (num: number, type?: string) => {
  228. if (type === 'percent') {
  229. return numeral(num).format('0.0%');
  230. }
  231. return numeral(num).format('0,0');
  232. };
  233. export const moneyFormat = (value: number, format = '0,0.00') => {
  234. return numeral(value).format(format);
  235. };
  236. export const dateFormat = (
  237. value: string | Date,
  238. format = 'YYYY-MM-DD HH:mm:ss'
  239. ) => {
  240. return dayjs(value).format(format);
  241. };
  242. const instruments: any = {
  243. 'Acoustic Grand Piano': '大钢琴',
  244. 'Bright Acoustic Piano': '明亮的钢琴',
  245. 'Electric Grand Piano': '电钢琴',
  246. 'Rhodes Piano': '柔和的电钢琴',
  247. 'Chorused Piano': '加合唱效果的电钢琴',
  248. Harpsichord: '羽管键琴',
  249. Clavichord: '科拉维科特琴',
  250. Celesta: '钢片琴',
  251. Glockenspiel: '钢片琴',
  252. 'Music box': '八音盒',
  253. Vibraphone: '颤音琴',
  254. Marimba: '马林巴',
  255. Xylophone: '木琴',
  256. 'Tubular Bells': '管钟',
  257. Dulcimer: '大扬琴',
  258. 'Hammond Organ': '击杆风琴',
  259. 'Percussive Organ': '打击式风琴',
  260. 'Rock Organ': '摇滚风琴',
  261. 'Church Organ': '教堂风琴',
  262. 'Reed Organ': '簧管风琴',
  263. Accordian: '手风琴',
  264. Harmonica: '口琴',
  265. 'Tango Accordian': '探戈手风琴',
  266. 'Acoustic Guitar': '钢弦吉他',
  267. 'Electric Guitar': '闷音电吉他',
  268. 'Overdriven Guitar': '加驱动效果的电吉他',
  269. 'Distortion Guitar': '加失真效果的电吉他',
  270. 'Guitar Harmonics': '吉他和音',
  271. 'Acoustic Bass': '大贝司',
  272. 'Electric Bass': '电贝司',
  273. 'Fretless Bass': '无品贝司',
  274. 'Slap Bass': '掌击',
  275. 'Synth Bass': '电子合成',
  276. Violin: '小提琴',
  277. Viola: '中提琴',
  278. Cello: '大提琴',
  279. Contrabass: '低音大提琴',
  280. 'Tremolo Strings': '弦乐群颤音音色',
  281. 'Pizzicato Strings': '弦乐群拨弦音色',
  282. 'Orchestral Harp': '竖琴',
  283. Timpani: '定音鼓',
  284. 'String Ensemble': '弦乐合奏音色',
  285. 'Synth Strings': '合成弦乐合奏音色',
  286. 'Choir Aahs': '人声合唱',
  287. 'Voice Oohs': '人声',
  288. 'Synth Voice': '合成人声',
  289. 'Orchestra Hit': '管弦乐敲击齐奏',
  290. Trumpet: '小号',
  291. Trombone: '长号',
  292. Tuba: '大号',
  293. 'Muted Trumpet': '加弱音器小号',
  294. 'French Horn': '法国号',
  295. 'Brass Section': '铜管组',
  296. 'Synth Brass': '合成铜管音色',
  297. 'Soprano Sax': '高音萨克斯管',
  298. 'Alto Sax': '中音萨克斯管',
  299. 'Tenor Sax': '次中音萨克斯管',
  300. 'Baritone Sax': '低音萨克斯管',
  301. Oboe: '双簧管',
  302. 'English Horn': '英国管',
  303. Bassoon: '巴松',
  304. Clarinet: '单簧管',
  305. 'Soprano Saxophone': '高音萨克斯管',
  306. 'Alto Saxophone': '中音萨克斯管',
  307. 'Tenor Saxophone': '次中音萨克斯管',
  308. 'Baritone Saxophone': '低音萨克斯管',
  309. Piccolo: '短笛',
  310. Flute: '长笛',
  311. Recorder: '竖笛',
  312. 'Soprano Recorder': '高音竖笛',
  313. 'Pan Flute': '排箫',
  314. 'Bottle Blow': '瓶木管',
  315. Whistle: '口哨声',
  316. Ocarina: '陶笛',
  317. Lead: '合成主音',
  318. 'Lead lead': '合成主音',
  319. 'Pad age': '合成音色',
  320. Pad: '合成音色',
  321. FX: '合成效果 科幻',
  322. Sitar: '西塔尔',
  323. Banjo: '班卓琴',
  324. Shamisen: '三昧线',
  325. Koto: '十三弦筝',
  326. Kalimba: '卡林巴',
  327. Bagpipe: '风笛',
  328. Fiddle: '民族提琴',
  329. Shanai: '山奈',
  330. 'Tinkle Bell': '叮当铃',
  331. Agogos: '阿戈戈铃',
  332. 'Steel Drums': '钢鼓',
  333. 'Taiko Drum': '太鼓',
  334. 'Melodic Toms': '嗵嗵鼓',
  335. 'Synth Drums': '合成鼓',
  336. 'Reverse Cymbals': '反向镲',
  337. 'Agogo Bells': '阿戈戈铃',
  338. 'Taiko Drums': '太鼓',
  339. Bongos: '邦戈鼓',
  340. 'Bongo Bell': '邦戈铃',
  341. Congas: '康加鼓',
  342. Guiro: '刮壶',
  343. 'Guitar Fret Noise': '吉他换把杂音',
  344. 'Breath Noise': '呼吸声',
  345. Seashore: '海浪声',
  346. 'Bird Tweet': '鸟鸣',
  347. 'Telephone Ring': '电话铃',
  348. Helicopter: '直升机',
  349. Applause: '鼓掌声',
  350. Gunshot: '枪声',
  351. 'Acoustic Bass Drum': '大鼓',
  352. 'Bass Drum': '大鼓',
  353. 'Side Drum': '小鼓鼓边',
  354. 'Acoustic Snare': '小鼓',
  355. 'Hand Claps': '拍手',
  356. 'Electric Snare': '小鼓',
  357. 'Low Floor Tom': '低音嗵鼓',
  358. 'Closed Hi-Hat': '闭合踩镲',
  359. 'High Floor Tom': '高音落地嗵鼓',
  360. 'Pedal Hi-Hat': '脚踏踩镲',
  361. 'Low Tom': '低音嗵鼓',
  362. 'Open Hi-Hat': '开音踩镲',
  363. 'Low-Mid Tom': '中低音嗵鼓',
  364. 'Hi Mid Tom': '高音鼓',
  365. 'Crash Cymbals': '对镲',
  366. 'High Tom': '高音嗵鼓',
  367. 'Ride Cymbals': '叮叮镲',
  368. 'Chinese Cymbals': '中国镲',
  369. 'Ride Bell': '圆铃',
  370. Tambourine: '铃鼓',
  371. 'Splash Cymbal': '溅音镲',
  372. Cowbell: '牛铃',
  373. 'Crash Cymbal': '强音钹',
  374. 'Vibra-Slap': '颤音器',
  375. 'Ride Cymbal': '打点钹',
  376. 'Hi Bongo': '高音邦戈鼓',
  377. 'Low Bongo': '低音邦戈鼓',
  378. 'Mute Hi Conga': '弱音高音康加鼓',
  379. 'Open Hi Conga': '强音高音康加鼓',
  380. 'Low Conga': '低音康加鼓',
  381. 'High Timbale': '高音天巴鼓',
  382. 'Low Timbale': '低音天巴鼓',
  383. 'High Agogo': '高音阿戈戈铃',
  384. 'Low Agogo': '低音阿戈戈铃',
  385. Cabasa: '卡巴萨',
  386. Maracas: '沙锤',
  387. 'Short Whistle': '短口哨',
  388. 'Long Whistle': '长口哨',
  389. 'Short Guiro': '短刮壶',
  390. 'Long Guiro': '长刮壶',
  391. Claves: '响棒',
  392. 'Hi Wood Block': '高音木鱼',
  393. 'Low Wood Block': '低音木鱼',
  394. 'Mute Triangle': '弱音三角铁',
  395. 'Open Triangle': '强音三角铁',
  396. 'Drum Set': '架子鼓',
  397. 'Hulusi flute': '葫芦丝',
  398. Melodica: '口风琴',
  399. Nai: '口风琴',
  400. 'Snare Drum': '小军鼓',
  401. Cymbal: '镲',
  402. Cymbals: '镲',
  403. 'Horn in F': '圆号',
  404. Triangle: '三角铁',
  405. Vibrato: '颤音琴',
  406. 'Suspend Cymbals': '吊镲',
  407. 'Suspended Cymbals': '吊镲',
  408. 'Tom-Toms': '嗵嗵鼓',
  409. Bell: '铃铛',
  410. Bells: '铃铛',
  411. 'Alto Clarinet': '中音单簧管',
  412. 'Bass Clarinet': '低音单簧管',
  413. Cornet: '短号',
  414. Euphonium: '上低音号',
  415. 'crash cymbals': '对镲',
  416. Castanets: '响板',
  417. Shaker: '沙锤',
  418. 'Mark tree': '音树',
  419. Chimes: '管钟',
  420. 'Mark Tree': '音树',
  421. 'Tom-toms': '嗵嗵鼓',
  422. 'Hi-Hat': '踩镲',
  423. 'Sleigh Bells': '雪橇铃',
  424. Flexatone: '弹音器',
  425. 'Brake drum': '闸鼓',
  426. Gong: '锣',
  427. 'concert tom': '音乐会嗵嗵鼓',
  428. 'brake drum': '车轮鼓',
  429. 'finger cymbal': '指钹',
  430. 'ride cymbal': '叮叮镲',
  431. 'Concert Toms': '音乐会嗵嗵鼓',
  432. Vibraslap: '弹音器',
  433. 'Wood Blocks': '木鱼',
  434. 'Temple Blocks': '木鱼',
  435. 'Wood Block': '木鱼',
  436. 'Field Drum': '军鼓',
  437. 'Quad-Toms': '筒鼓',
  438. Quads: '筒鼓',
  439. 'Drums set': '架子鼓',
  440. 'High Bongo': '邦戈',
  441. Timbales: '天巴鼓'
  442. };
  443. /** 获取分轨名称 */
  444. export const getInstrumentName = (name = '') => {
  445. name = name.toLocaleLowerCase().replace(/ /g, '');
  446. if (!name) return '';
  447. for (let key in instruments) {
  448. const _key = key.toLocaleLowerCase().replace(/ /g, '');
  449. if (_key.includes(name)) {
  450. return instruments[key];
  451. }
  452. }
  453. for (let key in instruments) {
  454. const _key = key.toLocaleLowerCase().replace(/ /g, '');
  455. if (name.includes(_key)) {
  456. return instruments[key];
  457. }
  458. }
  459. return '';
  460. };
  461. /**
  462. * 乐器排序
  463. * 排序顺序:长笛、单簧管、中音单簧管、低音单簧管、高音萨克斯风、中音萨克斯风、次中音萨克斯风、低音萨克斯风、小号、长号、圆号、大号、上低音号
  464. * */
  465. export const sortMusical = (name: string, index: number) => {
  466. let sortId = 0;
  467. switch (name) {
  468. case '长笛':
  469. sortId = 1;
  470. break;
  471. case '单簧管':
  472. sortId = 2;
  473. break;
  474. case '中音单簧管':
  475. sortId = 3;
  476. break;
  477. case '低音单簧管':
  478. sortId = 4;
  479. break;
  480. case '高音萨克斯风':
  481. sortId = 5;
  482. break;
  483. case '中音萨克斯风':
  484. sortId = 6;
  485. break;
  486. case '次中音萨克斯风':
  487. sortId = 7;
  488. break;
  489. case '低音萨克斯风':
  490. sortId = 8;
  491. break;
  492. case '小号':
  493. sortId = 9;
  494. break;
  495. case '长号':
  496. sortId = 10;
  497. break;
  498. case '圆号':
  499. sortId = 11;
  500. break;
  501. case '大号':
  502. sortId = 12;
  503. break;
  504. case '上低音号':
  505. sortId = 13;
  506. break;
  507. default:
  508. sortId = index + 14;
  509. break;
  510. }
  511. return sortId;
  512. };