Przeglądaj źródła

Merge branch 'new-feature-tianyong' into ktyq-online

TIANYONG 1 rok temu
rodzic
commit
7c255c585c

+ 1 - 2
instrument.html

@@ -28,8 +28,7 @@
         instance.postMessage(JSON.stringify(data))
       }
     }
-    console.info(location.href)
-    if (!location.href.includes('iscurseplay=play')) {
+    if (!location.href.includes('iscurseplay=play') && !location.href.includes('isPreView=true')) {
       _postMessage({
         api: 'cloudLoading',
         content: {

+ 1 - 0
public/flexible.js

@@ -7,6 +7,7 @@
     b / i < 375 && (b = 375 * i);
     var c = b / 10;
     f.style.fontSize = c + "px", k.rem = a.rem = c
+    window.fontSize = c
   }
   var d, e = a.document,
     f = e.documentElement,

+ 1 - 0
src/constant/instruments.ts

@@ -155,6 +155,7 @@ const instruments: any = {
 	"Drum Set": "架子鼓",
 	"Hulusi flute": "葫芦丝",
 	Melodica: "口风琴",
+	Nai: "口风琴",
 	"Snare Drum": "小军鼓",
 	Cymbal: "镲",
 	Cymbals: "镲",

+ 6 - 1
src/helpers/formateMusic.ts

@@ -830,8 +830,13 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
 			}
 
 			let relativeTime = usetime;
+			let beatSpeed = 0;
 			// 速度不能为0 此处的速度应该是按照设置的速度而不是校准后的速度,否则mp3速度不对
-			let beatSpeed = (state.isSpecialBookCategory ? measureSpeed : baseSpeed) || 1;
+			if (measureSpeed !== baseSpeed) {
+				beatSpeed = baseSpeed || measureSpeed || 100
+			} else {
+				beatSpeed = (state.isSpecialBookCategory ? measureSpeed : baseSpeed) || 1;
+			}
 			// let beatSpeed = measureSpeed || baseSpeed
 			// 如果有节拍器,需要将节拍器的时间算出来
 			if (i === 0) {

+ 2 - 2
src/helpers/metronome.ts

@@ -170,13 +170,13 @@ class Metronome {
 		return new Howl({
 			src: tockAndTick.tick,
 			// 如果是ios手机,需要强制使用audio,不然部分系统版本第一次播放没有声音
-			html5: browserInfo.ios,
+			// html5: browserInfo.ios,
 		});
 	};
 	loadAudio2 = () => {
 		return new Howl({
 			src: tockAndTick.tock,
-			html5: browserInfo.ios,
+			// html5: browserInfo.ios,
 		});
 	};
 	getStep(time: number) {

+ 1 - 1
src/page-instrument/component/the-music-list/list.tsx

@@ -18,7 +18,7 @@ export default defineComponent({
 		const forms = reactive({
 			page: 1,
 			rows: 20,
-			musicSheetCategoriesId: state.musicSheetCategoriesId,
+			musicSheetCategoriesId: state.bizMusicCategoryId,
 			recentFlag: props.recentFlag ? true : null,
 			excludeMusicId: props.recentFlag ? null : state.examSongId,
 		});

+ 5 - 0
src/page-instrument/view-detail/index.module.less

@@ -136,10 +136,15 @@
 .preViewDetail {
     .container {
         height: 100%;
+        padding-bottom: 0 !important;
+        padding-right: 0 !important;
     }
     :global {
         #osmdCanvasPage1 {
             padding-bottom: 0 !important;
         }
+        #cursorImg-0 {
+            opacity: 0 !important;
+        }
     }
 }

+ 1 - 1
src/page-instrument/view-detail/index.tsx

@@ -142,7 +142,7 @@ export default defineComponent({
       if (state.originSpeed === 0) {
         state.originSpeed = state.speed = (osmd as any).bpm || osmd.Sheet.userStartTempoInBPM || 100;
       }
-      const saveSpeed = (store.get("speeds") || {})[state.examSongId] || (osmd as any).bpm || osmd.Sheet.userStartTempoInBPM;
+      const saveSpeed = (store.get("speeds") || {})[state.examSongId] || state.speed || (osmd as any).bpm || osmd.Sheet.userStartTempoInBPM;
       // 加载本地缓存的速度
       if (saveSpeed) {
         handleSetSpeed(saveSpeed);

+ 2 - 2
src/page-instrument/view-evaluat-report/index.tsx

@@ -201,9 +201,9 @@ export default defineComponent({
 		const getOffsetPosition = (type: keyof typeof colorsClass): string => {
 			switch (type) {
 			  case 'EARLY':
-				return 'translateX(-2px)'
+				return 'translateX(-3px)'
 			  case 'LATE':
-				return 'translateX(2px)'
+				return 'translateX(3px)'
 			  case 'HIGH':
 				return 'translateY(-2px)'
 			  case 'LOW':

+ 14 - 6
src/state.ts

@@ -43,7 +43,7 @@ export enum IPlatform {
 /**
  * 特殊教材分类id
  */
-const classids = [1, 2, 6, 7, 8, 9, 3, 10, 11, 12, 13, 4, 14, 15, 16, 17, 30, 31, 35, 36, 46, 108]; // 大雅金唐, 竖笛教程, 声部训练展开的分类ID
+const classids = [1,2,3,4,6,7,8,9,10,11,12,13,14,15,16,17,30,31,35,36,38,108,150,151,152,153,154,155,156,157,158,178,179,180,181,182]; // 大雅金唐, 竖笛教程, 声部训练展开的分类ID
 
 // 乐器code码
 export const musicalInstrumentCodeInfo = [
@@ -287,6 +287,8 @@ const state = reactive({
   parentCategoriesId: 0,
   /** 分类ID */
   musicSheetCategoriesId: 0,
+  /** 各产品端的分类ID,(管乐迷、管乐团、酷乐秀、课堂乐器) */
+  bizMusicCategoryId: 0,  
   /** 资源类型: mp3 | midi */
   playMode: "MP3" as "MP3" | "MIDI",
   /** 设置的速度 */
@@ -451,7 +453,8 @@ const setStep = () => {
 export const onPlay = () => {
   console.log("开始播放");
   state.playEnd = false;
-  offset_duration = browserInfo.xiaomi ? 0.2 : 0.08;
+  // offset_duration = browserInfo.xiaomi ? 0.2 : 0.08;
+  offset_duration = 0.2;
   setStep();
 };
 
@@ -528,7 +531,8 @@ const handlePlaying = () => {
         }
       }
 
-      if (Math.abs(selectEndItem.endtime - currentTime) < offset_duration) {
+      // if (Math.abs(selectEndItem.endtime - currentTime) < offset_duration) {
+        if (currentTime - selectEndItem.endtime > offset_duration) {
         console.log("选段播放结束");
         // 如果为选段评测模式
         if (state.modeType === "evaluating" && state.isSelectMeasureMode) {
@@ -549,9 +553,10 @@ const handlePlaying = () => {
   }
 
   // 评测不播放叮咚节拍器
-  if (state.modeType !== "evaluating") {
-    metronomeData.metro?.sound(currentTime);
-  }
+  // if (state.modeType !== "evaluating") {
+  //   metronomeData.metro?.sound(currentTime);
+  // }
+  metronomeData.metro?.sound(currentTime);
 };
 /** 跳转到指定音符开始播放 */
 export const skipNotePlay = (itemIndex: number, isStart = false) => {
@@ -979,6 +984,7 @@ const setState = (data: any, index: number) => {
   state.midiUrl = data.midiFileUrl;
   state.parentCategoriesId = data.musicTag;
   state.musicSheetCategoriesId = data.musicCategoryId;
+  state.bizMusicCategoryId = data.bizMusicCategoryId
   state.playMode = data.playMode === "MP3" ? "MP3" : "MIDI";
   state.originSpeed = state.speed = data.playSpeed;
   // state.playIngSpeed = data.playSpeed;
@@ -1017,6 +1023,8 @@ const setState = (data: any, index: number) => {
   state.musicalCodeId = state.fingeringInfo?.id || 0
   state.musicalCode = musicalInstrumentCodeInfo.find(item => item.id === state.musicalCodeId)?.code || state.trackId
   ;(window as any).DYSubjectId = state.musicalCodeId
+  // 开启自定义每行显示的小节数
+  ;(window as any).customSectionAmount = true
   // 如果切换的声轨没有指法,择指法开关置灰并且不可点击
   if (!state.fingeringInfo.name && state.setting.displayFingering) {
     state.setting.displayFingering = false

+ 2 - 2
src/utils/index.ts

@@ -128,8 +128,8 @@ export const matchProductApiUrl = () => {
 			'dev': 'https://dev.kt.colexiu.com',
 			'test': 'https://test.kt.colexiu.com',
 			'test2': 'https://test.lexiaoya.cn',
-			// 'online': 'https://kt.colexiu.com',
-			'online': 'https://resource.colexiu.com'
+			'online': 'https://kt.colexiu.com',
+			// 'online': 'https://resource.colexiu.com'
 		}
 	}
 	let environment: 'dev' | 'test' | 'test2' | 'online' = location.origin.includes('//dev') ? 'dev' : location.origin.includes('//test') ? 'test' : (location.origin.includes('//online') || location.origin.includes('//mec')) ? 'online' : 'dev'

+ 3 - 0
src/view/audio-list/index.tsx

@@ -10,6 +10,7 @@ import {
 } from "./midiPlayer";
 import state, { IPlayState, onEnded, onPlay } from "/src/state";
 import { api_playProgress } from "/src/helpers/communication";
+import { evaluatingData } from "/src/view/evaluating";
 
 const audioData = reactive({
 	songEle: null as unknown as HTMLAudioElement,
@@ -159,6 +160,8 @@ export default defineComponent({
 				res?.content?.totalDuration > 1000 &&
 				currentTime >= total
 			) {
+				if (evaluatingData.isAudioPlayEnd) return
+				evaluatingData.isAudioPlayEnd = true
 				onEnded();
 			}
 		};

+ 6 - 1
src/view/evaluating/index.tsx

@@ -98,6 +98,8 @@ export const evaluatingData = reactive({
 	isErrorState: false,
 	/** accompanyError,错误类型 */
 	accompanyErrorType: '',	
+	/** app播放结束状态,重新评测需要重置为 */
+	isAudioPlayEnd: false,
 });
 
 /** 点击开始评测按钮 */
@@ -292,7 +294,9 @@ const handleScoreResult = (res?: IPostMessage) => {
 			console.log("🚀 ~ 评测返回:", res);
 			// console.log("评测结束", body);
 			state.isHideEvaluatReportSaveBtn = false;
-			evaluatingData.resulstMode = true;
+			setTimeout(() => {
+				evaluatingData.resulstMode = evaluatingData.isErrorState ? false : true
+			}, 200);
 			evaluatingData.resultData = {
 				...body,
 				...getLeveByScore(body.score),
@@ -310,6 +314,7 @@ export const handleStartBegin = async (preTimes?: number) => {
 	evaluatingData.resultData = {};
 	evaluatingData.backtime = 0;
 	resetPlaybackToStart();
+	evaluatingData.isAudioPlayEnd = false;
 	const res = await startEvaluating(evaluatingData.contentData);
 	if (res?.api !== "startEvaluating") {
 		Snackbar.error("请在APP端进行评测");

+ 10 - 2
src/view/fingering/fingering-config.ts

@@ -315,11 +315,19 @@ export const matchVoicePart = (id: number | string, type: "SINGLE" | "CONCERT"):
       ocarina: "ocarina",
       nai: "melodica",
 	    BaroqueRecorder: 'baroque-recorder',
+      'Drum Set': 24,
+      'Marimba': 26,
+      'Vibraphone': 27,
+      'Tubular Bells': 30,
+      'Mallets': 32,
     };
     let _track;
     if (typeof code === "string") {
+      code = code.toLocaleLowerCase().replace(/ /g, "");
       for (let sKey in subject) {
-        if (sKey === code) {
+        let pitchKey = sKey
+        if (typeof sKey === "string") pitchKey = pitchKey.toLocaleLowerCase().replace(/ /g, "");
+        if (pitchKey === code) {
           _track = subject[sKey];
           break;
         }
@@ -472,7 +480,7 @@ export const subjectFingering = (subjectId: number | string): IFingering => {
         id: 38,
       };	  
     default:
-      return {};
+      return typeof subjectId === 'number' ? { id: subjectId } : {};
   }
 };
 

+ 2 - 1
src/view/music-score/index.module.less

@@ -5,6 +5,7 @@
         overflow-y: auto;
         height: 100%;
         max-height: 100vh;
+        transform: translateY(-5%);
         &::-webkit-scrollbar {
             width: 0;
             display: none;
@@ -26,7 +27,7 @@
 .inGradualRange{
    :global{
         #cursorImg-0{
-            opacity: 0;
+            opacity: 0 !important;
         }
    } 
 }

+ 17 - 1
src/view/music-score/index.tsx

@@ -8,6 +8,7 @@ import styles from "./index.module.less";
 import queryString from "query-string";
 import { getGradualLengthByXml } from "/src/helpers/calcSpeed";
 import { resetFormate, resetGivenFormate, setGlobalMusicSheet } from "/src/helpers/customMusicScore"
+import { setGlobalData } from "/src/utils";
 
 export const musicRenderTypeKey = "musicRenderType";
 let osmd: any = null;
@@ -22,6 +23,20 @@ const musicData = reactive({
 export const resetMusicScore = () => {
 	const contaienrWidth = document.getElementById("musicAndSelection")?.offsetWidth || 625;
 	state.musicZoom = contaienrWidth / musicData.containerWidth;
+	// if (state.fingeringInfo?.name && state.fingeringInfo?.direction === 'vertical') {
+	// 	if (contaienrWidth > musicData.containerWidth) {
+	// 		setGlobalData('wrapNum', 8)
+	// 	} else {
+	// 		setGlobalData('wrapNum', 6)
+	// 	}
+	// 	musicData.showSelection = false
+	// 	osmd.zoom = state.zoom;
+	// 	osmd.render();
+	// 	setTimeout(() => {
+	// 		musicData.showSelection = true
+	// 	}, 100);
+	// }
+	
 };
 
 /** 重新渲染曲谱 */
@@ -125,6 +140,7 @@ export default defineComponent({
 			const activeMeasureIndex = state.times[state.activeNoteIndex]?.measureListIndex || -1;
 			for (const [first, last] of state.gradual) {
 				if (first && last) {
+					// console.log('小节',first.measureIndex,last.measureIndex,activeMeasureIndex)
 					result = first.measureIndex <= activeMeasureIndex && activeMeasureIndex < last.measureIndex;
 					if (result) {
 						break;
@@ -142,7 +158,7 @@ export default defineComponent({
 					state.musicRenderType == EnumMusicRenderType.staff ? "staff" : "jianpuTone",
 				]}
 			>
-				{props.showSelection && musicData.showSelection && <Selection />}
+				{props.showSelection && musicData.showSelection && !state.isPreView && <Selection />}
 			</div>
 		);
 	},

BIN
src/view/plugins/move-music-score/image/right_hide_icon.png


+ 16 - 0
src/view/plugins/move-music-score/index.module.less

@@ -38,4 +38,20 @@
     .noteMove{
         display: none;
     }
+}
+
+.hideTool {
+    transform: translateX(-120%);
+} 
+
+.rightHideIcon {
+    width: 15px;
+    height: 30px;
+    position: absolute;
+    left: 0;
+    top: 50%;
+    z-index: 10;
+    cursor: pointer;
+    transition: all 0.5s;
+    transform: rotate(180deg);
 }

+ 77 - 48
src/view/plugins/move-music-score/index.tsx

@@ -1,5 +1,5 @@
 import { Row, showToast } from "vant";
-import { defineComponent, onMounted, reactive } from "vue";
+import { defineComponent, onMounted, reactive, nextTick, ref } from "vue";
 import state from "/src/state";
 import request from "/src/utils/request";
 import { getQuery } from "/src/utils/queryString";
@@ -8,8 +8,13 @@ import { Button, ButtonGroup, Icon, Switch, Tooltip } from "@varlet/ui";
 import "@varlet/ui/es/tooltip/style";
 import "@varlet/ui/es/button-group/style";
 import "@varlet/ui/es/switch/style";
+import { storeData } from "/src/store";
+import rightHideIcon from './image/right_hide_icon.png';
 
 let extStyleConfigJson: any = {};
+const clientWidth = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
+const showToolBox = ref(true);
+
 export const moveData = reactive({
 	/** 开启移动 */
 	open: false,
@@ -123,6 +128,7 @@ function getBox(ele: SVGAElement) {
 export const filterMoveData = async () => {
 	const examSongId = state.examSongId;
 	if (examSongId) {
+		const fontSize =  (window as any).fontSize
 		const list = moveData.modelList
 			.filter((n) => n.isMove)
 			.map((n) => {
@@ -132,6 +138,8 @@ export const filterMoveData = async () => {
 					isDelete: n.isDelete,
 					x: n.x,
 					y: n.y,
+					xRem: Math.abs(n.x / fontSize),
+					yRem: Math.abs(n.y / fontSize),
 					zoom: n.zoom,
 					w: moveData.sw,
 					type: n.type,
@@ -141,10 +149,10 @@ export const filterMoveData = async () => {
 				}
 				return item;
 			});
-		if (!list.length) {
-			showToast("请移动元素后再保存");
-			return
-		}
+		// if (!list.length) {
+		// 	showToast("请移动元素后再保存");
+		// 	return
+		// }
 		extStyleConfigJson[moveData.partIndex] = list;
 		console.log("🚀 ~ extStyleConfigJson", extStyleConfigJson)
 		const res = await request.post("/musicSheet/img", {
@@ -240,6 +248,7 @@ const renderSvgItem = (item: any) => {
 
 /** 设置元素位置 */
 function setModelPostion(item: any, x: number, y: number) {
+	// console.log(item)
 	if (item) {
 		const g = document.querySelector("#" + item.id)!;
 		const el: HTMLElement = document.querySelector(`[data-id=${item.id}]`)!;
@@ -247,8 +256,14 @@ function setModelPostion(item: any, x: number, y: number) {
 			g && g.removeAttribute("transform");
 			el && (el.style.transform = "");
 		} else {
-			g && g.setAttribute("transform", `translate(${x / moveData.zoom}, ${y / moveData.zoom})`);
-			el && (el.style.transform = `translate(${x}px, ${y}px)`);
+			/** 如果是app内嵌打开,需要通过rem转换 */
+			let tsX = x, tsY = y;
+			if (storeData.isApp && (item.xRem || item.yRem)) {
+				tsX = item.xRem * clientWidth/10
+				tsY = item.yRem * clientWidth/10
+			}
+			g && g.setAttribute("transform", `translate(${tsX / moveData.zoom}, ${tsY / moveData.zoom})`);
+			el && (el.style.transform = `translate(${tsX}px, ${tsY}px)`);
 		}
 	}
 }
@@ -394,19 +409,21 @@ export const renderForMoveData = () => {
 	}
 	const list = extStyleConfigJson?.[moveData.partIndex];
 	if (list && Array.isArray(list)) {
-		console.log("🚀 ~ list", list);
-		list.forEach((item: any) => {
-			const index = moveData.modelList.findIndex((n: any) => n.id === item.id);
-			if (index > -1) {
-				moveData.modelList[index] = {
-					...moveData.modelList[index],
-					...item
-				};
-				renderSvgItem(moveData.modelList[index]);
-				if (item.type === "vf-lineGroup") {
-					renderLineGroup(moveData.modelList[index]);
+		nextTick(() => {
+			console.log("🚀 ~ list", list);
+			list.forEach((item: any) => {
+				const index = moveData.modelList.findIndex((n: any) => n.id === item.id);
+				if (index > -1) {
+					moveData.modelList[index] = {
+						...moveData.modelList[index],
+						...item
+					};
+					renderSvgItem(moveData.modelList[index]);
+					if (item.type === "vf-lineGroup") {
+						renderLineGroup(moveData.modelList[index]);
+					}
 				}
-			}
+			});
 		});
 	}
 };
@@ -427,37 +444,49 @@ export default defineComponent({
 		});
 		return () => (
 			<div class={[moveData.open ? "" : styles.moveDisabled]}>
-				<div class={styles.toolBox} id="toolBox">
-					<Switch v-model={moveData.open} />
-					{moveData.open && (
-						<>
-							{moveData.tool.isAddAndSub && (
-								<ButtonGroup size="small" elevation={false}>
-									<Button onClick={() => handleAddAndSub('add')}>加</Button>
-									<Button onClick={() => handleAddAndSub('sub')}>减</Button>
-								</ButtonGroup>
-							)}
-							{/* <ButtonGroup size="small">
-								
-								<Button>
-									<Icon name="arrow-down" style={{ transform: "rotate(-90deg)" }} />
+				<div id="toolBox">
+					<div class={[styles.toolBox, !showToolBox.value && styles.hideTool]} >
+						<Switch v-model={moveData.open} />
+						{moveData.open && (
+							<>
+								{moveData.tool.isAddAndSub && (
+									<ButtonGroup size="small" elevation={false}>
+										<Button onClick={() => handleAddAndSub('add')}>加</Button>
+										<Button onClick={() => handleAddAndSub('sub')}>减</Button>
+									</ButtonGroup>
+								)}
+								{/* <ButtonGroup size="small">
+									
+									<Button>
+										<Icon name="arrow-down" style={{ transform: "rotate(-90deg)" }} />
+									</Button>
+								</ButtonGroup> */}
+								<Button size="small" onClick={handleUndo} disabled={undoData.undoList.length ? false : true}>
+									<Icon name="arrow-down" style={{ transform: "rotate(90deg)" }} />
 								</Button>
-							</ButtonGroup> */}
-							<Button size="small" onClick={handleUndo} disabled={undoData.undoList.length ? false : true}>
-								<Icon name="arrow-down" style={{ transform: "rotate(90deg)" }} />
-							</Button>
 
-							<Button size="small" onClick={handleDeleteMoveNote} disabled={moveData.activeIndex > -1 ? false : true}>
-								{moveData.modelList[moveData.activeIndex]?.isDelete ? '显示元素' : '删除元素'}
-							</Button>
-							<Button size="small" onClick={resetMoveNote}>
-								重置数据
-							</Button>
-							<Button size="small" type="primary" onClick={filterMoveData}>
-								保存数据
-							</Button>
-						</>
-					)}
+								<Button size="small" onClick={handleDeleteMoveNote} disabled={moveData.activeIndex > -1 ? false : true}>
+									{moveData.modelList[moveData.activeIndex]?.isDelete ? '显示元素' : '删除元素'}
+								</Button>
+								<Button size="small" onClick={resetMoveNote}>
+									重置数据
+								</Button>
+								<Button size="small" type="primary" onClick={filterMoveData}>
+									保存数据
+								</Button>
+								<Button size="small" type="primary" onClick={() => showToolBox.value = false}>
+									收起
+								</Button>
+							</>
+						)}
+					</div>
+					{
+					!showToolBox.value && 
+						<img 
+							class={[styles.rightHideIcon, !showToolBox.value ? styles.rightIconShow : '']} 
+							src={rightHideIcon}
+							onClick={() => showToolBox.value = true } />
+					}  
 				</div>
 				{moveData.modelList.map((item: any, index: number) => {
 					return (

+ 8 - 0
src/view/plugins/toggleMusicSheet/choosePartName/index.module.less

@@ -30,6 +30,14 @@
   .picker {
     flex: 1;
     height: 100px;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    :global {
+      .van-picker__columns {
+        //height: 80% !important;
+      }
+    }
   }
 
   .button {

+ 2 - 1
src/view/plugins/toggleMusicSheet/index.tsx

@@ -21,6 +21,7 @@ export default defineComponent({
 
     const partListNames = computed(() => {
       let partList = state.partListNames || []
+      console.log(777777,state.partListNames)
       partList = partList.filter((item: any) => !item?.toLocaleUpperCase()?.includes('COMMON'))
       const arr =  partList.map((item: any, index: number) => {
         // 该声轨能否被选
@@ -41,7 +42,7 @@ export default defineComponent({
     const trackIdx: any = computed(() => {
       if (partListNames && partListNames.value.length) {
         
-        const idx = partListNames.value.find((item: any) => item.value == state.partIndex).value
+        const idx = partListNames.value.find((item: any) => item.value == state.partIndex)?.value || 0
         console.log(3333,idx)
         return idx
       } else {

+ 1 - 1
vite.config.ts

@@ -67,7 +67,7 @@ export default defineConfig({
 				// target: "https://kt.colexiu.com",
 				// target: "https://test.lexiaoya.cn",
 				// target: "https://dev.kt.colexiu.com",
-				// target: "https://dev.resource.colexiu.com", // 内容平台开发环境
+				// target: "https://test.resource.colexiu.com", // 内容平台开发环境,内容平台开发,需在url链接上加上isCbs=true
 				// target: "https://test.resource.colexiu.com",
 				target: "https://test.kt.colexiu.com",
 				changeOrigin: true,