index.tsx 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386
  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. placeholder="最小练习小节"
  199. onUpdate:value={() => {
  200. forms.maxScore = null;
  201. }}
  202. clearable
  203. />
  204. </NFormItem>
  205. <div
  206. style={{
  207. '--n-feedback-height': '24px',
  208. display: 'flex',
  209. alignItems: 'center',
  210. margin: '-2px 2% 0 2%',
  211. marginBottom: 'var(--n-feedback-height)'
  212. }}>
  213. -
  214. </div>
  215. <NFormItem
  216. path="maxScore"
  217. rule={[
  218. {
  219. required: true,
  220. message: '请输入最大练习小节',
  221. trigger: ['blur', 'change'],
  222. type: 'number'
  223. }
  224. ]}>
  225. <NInputNumber
  226. v-model:value={forms.maxScore}
  227. showButton={false}
  228. min={forms.minScore || 1}
  229. max={forms.baseMaxScore}
  230. placeholder="最大练习小节"
  231. clearable
  232. />
  233. </NFormItem>
  234. </div>
  235. {forms.type === 'PRACTICE' && (
  236. <>
  237. <NFormItem
  238. label="练习速度"
  239. path="practiceSpeed"
  240. rule={[
  241. {
  242. required: true,
  243. message: '请输入练习速度',
  244. trigger: ['blur', 'change'],
  245. type: 'number'
  246. }
  247. ]}>
  248. <NInputNumber
  249. min={60}
  250. max={270}
  251. showButton={false}
  252. style={{ width: '100%' }}
  253. v-model:value={forms.practiceSpeed}
  254. placeholder="练习速度范围60~270"
  255. clearable
  256. />
  257. </NFormItem>
  258. <NFormItem
  259. label="练习时长"
  260. path="practiceTimes"
  261. rule={[
  262. {
  263. required: true,
  264. message: '请输入练习时长',
  265. trigger: ['blur', 'change'],
  266. type: 'number'
  267. }
  268. ]}>
  269. <NInputGroup>
  270. <NInputNumber
  271. min={0}
  272. max={1000}
  273. showButton={false}
  274. style={{ width: '100%' }}
  275. v-model:value={forms.practiceTimes}
  276. placeholder="请输入练习时长"
  277. clearable
  278. />
  279. <NInputGroupLabel>分钟</NInputGroupLabel>
  280. </NInputGroup>
  281. </NFormItem>
  282. </>
  283. )}
  284. {forms.type === 'EVALUATION' && (
  285. <>
  286. <NFormItem
  287. label="评测难度"
  288. path="type"
  289. rule={[{ required: true, message: '请选择评测难度' }]}>
  290. <NSpace>
  291. <NButton
  292. secondary
  293. class={[
  294. styles.switch,
  295. forms.difficulty === 'BEGINNER' ? styles.active : ''
  296. ]}
  297. onClick={() => (forms.difficulty = 'BEGINNER')}>
  298. 入门级
  299. </NButton>
  300. <NButton
  301. secondary
  302. class={[
  303. styles.switch,
  304. forms.difficulty === 'ADVANCED' ? styles.active : ''
  305. ]}
  306. onClick={() => (forms.difficulty = 'ADVANCED')}>
  307. 进阶级
  308. </NButton>
  309. <NButton
  310. secondary
  311. class={[
  312. styles.switch,
  313. forms.difficulty === 'PERFORMER' ? styles.active : ''
  314. ]}
  315. onClick={() => (forms.difficulty = 'PERFORMER')}>
  316. 大师级
  317. </NButton>
  318. </NSpace>
  319. </NFormItem>
  320. {/* <NFormItem
  321. label="评测速度"
  322. path="evaluationSpeed"
  323. rule={[
  324. {
  325. required: true,
  326. message: '请输入评测速度',
  327. trigger: ['blur', 'change'],
  328. type: 'number'
  329. }
  330. ]}>
  331. <NInputNumber
  332. min={60}
  333. max={270}
  334. showButton={false}
  335. style={{ width: '100%' }}
  336. v-model:value={forms.evaluationSpeed}
  337. placeholder="评测速度范围60~270"
  338. clearable
  339. />
  340. </NFormItem> */}
  341. <NFormItem
  342. label="合格分数"
  343. path="evaluationScore"
  344. rule={[
  345. {
  346. required: true,
  347. message: '请输入合格分数',
  348. trigger: ['blur', 'change'],
  349. type: 'number'
  350. }
  351. ]}>
  352. <NInputGroup>
  353. <NInputNumber
  354. min={0}
  355. max={100}
  356. showButton={false}
  357. style={{ width: '100%' }}
  358. v-model:value={forms.evaluationScore}
  359. placeholder="请输入合格分数"
  360. clearable
  361. />
  362. <NInputGroupLabel>分</NInputGroupLabel>
  363. </NInputGroup>
  364. </NFormItem>
  365. </>
  366. )}
  367. <NSpace class={styles.updateBtnGroup}>
  368. <NButton strong type="default" round onClick={() => emit('close')}>
  369. 取消
  370. </NButton>
  371. <NButton strong type="primary" round onClick={() => onSubmit()}>
  372. 确认
  373. </NButton>
  374. </NSpace>
  375. </NForm>
  376. </div>
  377. );
  378. }
  379. });