index.tsx 13 KB

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