index.tsx 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394
  1. import {
  2. PropType,
  3. computed,
  4. defineComponent,
  5. onMounted,
  6. reactive,
  7. ref
  8. } from 'vue';
  9. import styles from './index.module.less';
  10. import {
  11. NButton,
  12. NForm,
  13. NFormItem,
  14. NInputGroup,
  15. NInputGroupLabel,
  16. NInputNumber,
  17. NSpace,
  18. NTooltip,
  19. useMessage
  20. } from 'naive-ui';
  21. import {
  22. lessonPreTrainingAdd,
  23. lessonPreTrainingUpdate
  24. } from '/src/views/prepare-lessons/api';
  25. export default defineComponent({
  26. name: 'train-update',
  27. props: {
  28. /** 初始数据 */
  29. item: {
  30. type: Object,
  31. default: () => ({})
  32. },
  33. /** 操作类型 */
  34. type: {
  35. type: String as PropType<'train' | 'homework'>,
  36. default: 'train'
  37. }
  38. },
  39. emits: ['close', 'confirm'],
  40. setup(props, { emit }) {
  41. // 'practice' | 'evaluation'
  42. const message = useMessage();
  43. const forms = reactive({
  44. id: null as any,
  45. uploading: false,
  46. baseMaxScore: 99,
  47. type: 'PRACTICE',
  48. musicId: '',
  49. musicName: '',
  50. coursewareKnowledgeDetailId: '', // 章节编号
  51. minScore: null as any,
  52. maxScore: null as any,
  53. subjectId: '',
  54. coverImg: '',
  55. audioPlayTypeArray: [] as any,
  56. practiceSpeed: null as any, // 练习速度
  57. practiceTimes: null as any, // 练习时长
  58. difficulty: 'BEGINNER', // 评测难度
  59. evaluationSpeed: null as any, // 评测速度
  60. evaluationScore: null as any // 评测分数
  61. });
  62. const formsRef = ref();
  63. const onSubmit = async () => {
  64. formsRef.value?.validate(async (err: any) => {
  65. if (err) {
  66. return;
  67. }
  68. forms.uploading = true;
  69. try {
  70. const params = {
  71. trainingType: forms.type,
  72. musicId: forms.musicId,
  73. musicName: forms.musicName,
  74. audioPlayTypeArray: forms.audioPlayTypeArray,
  75. coursewareKnowledgeDetailId: forms.coursewareKnowledgeDetailId,
  76. subjectId: forms.subjectId,
  77. id: forms.id,
  78. coverImg: forms.coverImg,
  79. trainingConfigJson: ''
  80. };
  81. const configJson: any = {};
  82. configJson.practiceChapterBegin = forms.minScore;
  83. configJson.practiceChapterEnd = forms.maxScore;
  84. if (forms.type === 'PRACTICE') {
  85. configJson.practiceSpeed = forms.practiceSpeed;
  86. configJson.trainingTimes = forms.practiceTimes;
  87. } else {
  88. configJson.evaluateDifficult = forms.difficulty;
  89. configJson.evaluateSpeed = forms.evaluationSpeed;
  90. configJson.trainingTimes = forms.evaluationScore;
  91. }
  92. configJson.practiceChapterMax = forms.baseMaxScore;
  93. params.trainingConfigJson = configJson;
  94. // if (props.type === 'train') {
  95. // if (forms.id) {
  96. // await lessonPreTrainingUpdate(params);
  97. // message.success('修改成功');
  98. // } else {
  99. // await lessonPreTrainingAdd(params);
  100. // message.success('添加成功');
  101. // }
  102. // }
  103. emit('close');
  104. emit('confirm', params);
  105. } catch {
  106. //
  107. }
  108. forms.uploading = false;
  109. });
  110. };
  111. onMounted(() => {
  112. const item = props.item;
  113. if (item.trainId) {
  114. forms.id = item.trainId;
  115. forms.practiceSpeed = Number(item.practiceSpeed);
  116. forms.type = item.trainingType;
  117. forms.minScore = item.practiceChapterBegin;
  118. forms.maxScore = item.practiceChapterEnd;
  119. if (item.trainingType === 'PRACTICE') {
  120. forms.practiceTimes = item.trainingTimes;
  121. } else {
  122. forms.evaluationScore = item.trainingTimes;
  123. }
  124. forms.difficulty = item.evaluateDifficult || 'BEGINNER';
  125. forms.evaluationSpeed = item.evaluateSpeed;
  126. } else {
  127. forms.minScore = 1;
  128. forms.maxScore = item.practiceChapterMax ? item.practiceChapterMax : 1;
  129. }
  130. forms.audioPlayTypeArray = item.audioPlayTypeArray || [];
  131. forms.baseMaxScore = item.practiceChapterMax || 99;
  132. forms.musicId = item.id;
  133. forms.musicName = item.musicName;
  134. forms.coursewareKnowledgeDetailId = item.coursewareKnowledgeDetailId;
  135. forms.subjectId = item.subjectId;
  136. forms.coverImg = item.coverImg;
  137. });
  138. return () => (
  139. <div class={styles.trainUpdate}>
  140. <NForm
  141. ref={formsRef}
  142. model={forms}
  143. labelAlign="right"
  144. labelPlacement="left">
  145. <NFormItem
  146. label="训练方式"
  147. path="type"
  148. rule={[{ required: true, message: '请选择训练方式' }]}>
  149. <NSpace>
  150. <NButton
  151. secondary
  152. class={[
  153. styles.switch,
  154. forms.type === 'PRACTICE' ? styles.active : ''
  155. ]}
  156. onClick={() => (forms.type = 'PRACTICE')}>
  157. 练习
  158. </NButton>
  159. {!props.item.containAccompaniment ? (
  160. <NTooltip showArrow={false}>
  161. {{
  162. trigger: () => (
  163. <NButton disabled secondary class={[styles.switch]}>
  164. 评测
  165. </NButton>
  166. ),
  167. default: () => '该曲目暂不支持评测'
  168. }}
  169. </NTooltip>
  170. ) : (
  171. <NButton
  172. secondary
  173. class={[
  174. styles.switch,
  175. forms.type === 'EVALUATION' ? styles.active : ''
  176. ]}
  177. onClick={() => (forms.type = 'EVALUATION')}>
  178. 评测
  179. </NButton>
  180. )}
  181. </NSpace>
  182. </NFormItem>
  183. <div class={styles.scoreGroup}>
  184. <NFormItem
  185. label={forms.type === 'PRACTICE' ? '练习小节' : '评测小节'}
  186. path="minScore"
  187. rule={[
  188. {
  189. required: true,
  190. message: '请输入最小练习小节',
  191. trigger: ['blur', 'change'],
  192. type: 'number'
  193. }
  194. ]}>
  195. <NInputNumber
  196. v-model:value={forms.minScore}
  197. showButton={false}
  198. min={1}
  199. max={forms.baseMaxScore}
  200. precision={0}
  201. placeholder="最小练习小节"
  202. onUpdate:value={() => {
  203. forms.maxScore = null;
  204. }}
  205. clearable
  206. />
  207. </NFormItem>
  208. <div
  209. style={{
  210. '--n-feedback-height': '24px',
  211. display: 'flex',
  212. alignItems: 'center',
  213. margin: '-2px 2% 0 2%',
  214. marginBottom: 'var(--n-feedback-height)'
  215. }}>
  216. -
  217. </div>
  218. <NFormItem
  219. path="maxScore"
  220. rule={[
  221. {
  222. required: true,
  223. message: '请输入最大练习小节',
  224. trigger: ['blur', 'change'],
  225. type: 'number'
  226. }
  227. ]}>
  228. <NInputNumber
  229. v-model:value={forms.maxScore}
  230. showButton={false}
  231. precision={0}
  232. min={forms.minScore || 1}
  233. max={forms.baseMaxScore}
  234. placeholder="最大练习小节"
  235. clearable
  236. />
  237. </NFormItem>
  238. </div>
  239. {forms.type === 'PRACTICE' && (
  240. <>
  241. <NFormItem
  242. label="练习速度"
  243. path="practiceSpeed"
  244. rule={[
  245. {
  246. required: true,
  247. message: '请输入练习速度',
  248. trigger: ['blur', 'change'],
  249. type: 'number'
  250. }
  251. ]}>
  252. <NInputNumber
  253. min={60}
  254. max={270}
  255. precision={0}
  256. showButton={false}
  257. style={{ width: '100%' }}
  258. v-model:value={forms.practiceSpeed}
  259. placeholder="练习速度范围60~270"
  260. clearable
  261. />
  262. </NFormItem>
  263. <NFormItem
  264. label="练习时长"
  265. path="practiceTimes"
  266. rule={[
  267. {
  268. required: true,
  269. message: '请输入练习时长',
  270. trigger: ['blur', 'change'],
  271. type: 'number'
  272. }
  273. ]}>
  274. <NInputGroup>
  275. <NInputNumber
  276. min={0}
  277. max={1000}
  278. showButton={false}
  279. precision={0}
  280. style={{ width: '100%' }}
  281. v-model:value={forms.practiceTimes}
  282. placeholder="请输入练习时长"
  283. clearable
  284. />
  285. <NInputGroupLabel>分钟</NInputGroupLabel>
  286. </NInputGroup>
  287. </NFormItem>
  288. </>
  289. )}
  290. {forms.type === 'EVALUATION' && (
  291. <>
  292. <NFormItem
  293. label="评测难度"
  294. path="type"
  295. rule={[{ required: true, message: '请选择评测难度' }]}>
  296. <NSpace class={styles.difficultySpace}>
  297. <NButton
  298. secondary
  299. class={[
  300. styles.switch,
  301. forms.difficulty === 'BEGINNER' ? styles.active : ''
  302. ]}
  303. onClick={() => (forms.difficulty = 'BEGINNER')}>
  304. 入门级
  305. </NButton>
  306. <NButton
  307. secondary
  308. class={[
  309. styles.switch,
  310. forms.difficulty === 'ADVANCED' ? styles.active : ''
  311. ]}
  312. onClick={() => (forms.difficulty = 'ADVANCED')}>
  313. 进阶级
  314. </NButton>
  315. <NButton
  316. secondary
  317. class={[
  318. styles.switch,
  319. forms.difficulty === 'PERFORMER' ? styles.active : ''
  320. ]}
  321. onClick={() => (forms.difficulty = 'PERFORMER')}>
  322. 大师级
  323. </NButton>
  324. </NSpace>
  325. </NFormItem>
  326. {/* <NFormItem
  327. label="评测速度"
  328. path="evaluationSpeed"
  329. rule={[
  330. {
  331. required: true,
  332. message: '请输入评测速度',
  333. trigger: ['blur', 'change'],
  334. type: 'number'
  335. }
  336. ]}>
  337. <NInputNumber
  338. min={60}
  339. max={270}
  340. showButton={false}
  341. style={{ width: '100%' }}
  342. v-model:value={forms.evaluationSpeed}
  343. placeholder="评测速度范围60~270"
  344. clearable
  345. />
  346. </NFormItem> */}
  347. <NFormItem
  348. label="合格分数"
  349. path="evaluationScore"
  350. rule={[
  351. {
  352. required: true,
  353. message: '请输入合格分数',
  354. trigger: ['blur', 'change'],
  355. type: 'number'
  356. }
  357. ]}>
  358. <NInputGroup>
  359. <NInputNumber
  360. min={0}
  361. max={100}
  362. precision={0}
  363. showButton={false}
  364. style={{ width: '100%' }}
  365. v-model:value={forms.evaluationScore}
  366. placeholder="请输入合格分数"
  367. clearable
  368. />
  369. <NInputGroupLabel>分</NInputGroupLabel>
  370. </NInputGroup>
  371. </NFormItem>
  372. </>
  373. )}
  374. <NSpace class={styles.updateBtnGroup}>
  375. <NButton strong type="default" round onClick={() => emit('close')}>
  376. 取消
  377. </NButton>
  378. <NButton strong type="primary" round onClick={() => onSubmit()}>
  379. 确认
  380. </NButton>
  381. </NSpace>
  382. </NForm>
  383. </div>
  384. );
  385. }
  386. });