add.vue 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. <template>
  2. <view class="teacher">
  3. <view class="one">
  4. <up-form :model="form" ref="uFormRef" :rules="rules" labelPosition="top">
  5. <up-form-item label="课程名称" labelWidth="80" prop="name" :required="true">
  6. <up-input v-model="form.name" placeholder="请输入课程名称" />
  7. </up-form-item>
  8. <up-form-item label="学科" prop="subject" :required="true">
  9. <picker @change="subjectChange" :range="subjectList" range-key='label'>
  10. <view class="picker">{{form.subject_name||'请选择学科'}}</view>
  11. </picker>
  12. </up-form-item>
  13. <up-form-item label="年级" prop="grade" :required="true">
  14. <picker @change="gradeChange" :range="gradeList" range-key='label'>
  15. <view class="picker">{{form.grade_name||'请选择年级'}}</view>
  16. </picker>
  17. </up-form-item>
  18. <up-form-item label="类型" prop="type" :required="true">
  19. <picker @change="typeChange" :range="typeList" range-key='label'>
  20. <view class="picker">{{form.type_name||'请选择年级'}}</view>
  21. </picker>
  22. </up-form-item>
  23. <up-form-item label="金额(元)" prop="money" labelWidth="80" :required="true">
  24. <up-input v-model="form.money" placeholder="请输入金额(元)" />
  25. </up-form-item>
  26. <up-form-item label="开始时间" labelWidth="80" prop="start_time" :required="true"
  27. @click="showStart = true; hideKeyboard()">
  28. <up-input v-model="form.start_time" disabled disabledColor="#ffffff"
  29. placeholder="请选择开始时间"></up-input>
  30. <up-icon slot="right" name="arrow-right"></up-icon>
  31. </up-form-item>
  32. <up-form-item label="结束时间" labelWidth="80" prop="end_time" @click="showEnd = true; hideKeyboard()"
  33. :required="true">
  34. <up-input v-model="form.end_time" disabled disabledColor="#ffffff" placeholder="请选择结束时间"></up-input>
  35. <up-icon slot="right" name="arrow-right"></up-icon>
  36. </up-form-item>
  37. <up-form-item label="简介" prop="brief">
  38. <up-textarea placeholder="请输入简介" v-model="form.brief" count></up-textarea>
  39. </up-form-item>
  40. <up-form-item label="是否公开" labelWidth="80" prop="is_show" :required="true">
  41. <up-radio-group v-model="form.is_show" placement="row">
  42. <up-radio :customStyle="{marginRight: '16px'}" v-for="(item, index) in showList" :key="index"
  43. :label="item.label" :name="item.value">
  44. </up-radio>
  45. </up-radio-group>
  46. </up-form-item>
  47. </up-form>
  48. <view class="bottom">
  49. <button class="button" type="default" size="mini" @click="submit">保存</button>
  50. </view>
  51. <up-datetime-picker :show="showStart" :value="form.start_time" mode="datetime" closeOnClickOverlay
  52. @confirm="StartConfirm" @cancel="StartClose" @close="StartClose"
  53. :minDate="Number(new Date())"></up-datetime-picker>
  54. <up-datetime-picker :show="showEnd" :value="form.end_time" mode="datetime" closeOnClickOverlay
  55. @confirm="EndConfirm" @cancel="EndClose" @close="EndClose"
  56. :minDate="Number(new Date())"></up-datetime-picker>
  57. </view>
  58. </view>
  59. </template>
  60. <script setup lang="ts">
  61. import moment from 'moment';
  62. import { inject, computed, ref } from 'vue';
  63. //该依赖已内置不需要单独安装
  64. import { onLoad, onReady } from "@dcloudio/uni-app";
  65. // 请求接口
  66. const $api = inject('$api');
  67. // user
  68. const user = computed(() => {
  69. return uni.getStorageSync('user');
  70. })
  71. const id = ref('');
  72. // 响应式表单数据
  73. const form = ref({ name: '', subject: '', grade: '', type: '', money: '', start_time: '', end_time: '', is_show: '' });
  74. const rules = ref({
  75. name: [{ required: true, message: '请输入姓名', trigger: ['blur', 'change'] }],
  76. subject: [{ required: true, message: '请选择学科', trigger: ['blur', 'change'] }],
  77. grade: [{ required: true, message: '请选择年级', trigger: ['blur', 'change'] }],
  78. type: [{ required: true, message: '请选择类型', trigger: ['blur', 'change'] }],
  79. money: [{ required: true, message: '请输入金额', trigger: ['blur', 'change'] }],
  80. start_time: [{ required: true, message: '请选择开始时间', trigger: ['blur', 'change'] }],
  81. end_time: [
  82. { required: true, message: '请选择结束时间', trigger: ['blur', 'change'] },
  83. { validator: (rule, value, callback) => { return moment(form.value.start_time).isBefore(form.value.end_time) }, message: '开始时间必须大于结束时间!' }
  84. ],
  85. is_show: [{ required: true, message: '请选择是否公开', trigger: ['blur', 'change'] }],
  86. });
  87. // 表单引用
  88. const uFormRef = ref(null);
  89. // 字典表
  90. const subjectList = ref([])
  91. const gradeList = ref([])
  92. const showList = ref([])
  93. const typeList = ref([])
  94. const showStart = ref(false)
  95. const showEnd = ref(false)
  96. onLoad(async (options) => {
  97. id.value = options && options.id
  98. await searchOther();
  99. await search();
  100. });
  101. onReady(() => {
  102. uFormRef.value.setRules(rules.value)
  103. })
  104. // 其他查询信息
  105. const searchOther = async () => {
  106. let res;
  107. // 学科
  108. res = await $api(`dictData`, 'GET', { code: 'subject', is_use: '0' });
  109. if (res.errcode === 0) subjectList.value = res.data;
  110. // 年级
  111. res = await $api(`dictData`, 'GET', { code: 'grade', is_use: '0' });
  112. if (res.errcode === 0) gradeList.value = res.data;
  113. // 类型
  114. res = await $api(`dictData`, 'GET', { code: 'courseType', is_use: '0' });
  115. if (res.errcode === 0) typeList.value = res.data;
  116. // 是否公开
  117. res = await $api(`dictData`, 'GET', { code: 'show', is_use: '0' });
  118. if (res.errcode === 0) showList.value = res.data;
  119. };
  120. // 查询
  121. const search = async () => {
  122. if (id.value) {
  123. const res = await $api(`course/${id.value}`, 'GET', {});
  124. if (res.errcode === 0) {
  125. if (res.data.subject) {
  126. const data = subjectList.value.find(i => i.value === res.data.subject)
  127. if (data) res.data.subject_name = data.label
  128. }
  129. if (res.data.grade) {
  130. const data = gradeList.value.find(i => i.value === res.data.grade)
  131. if (data) res.data.grade_name = data.label
  132. }
  133. if (res.data.type) {
  134. const data = typeList.value.find(i => i.value === res.data.type)
  135. if (data) res.data.type_name = data.label
  136. }
  137. form.value = res.data
  138. } else {
  139. uni.showToast({
  140. title: res.errmsg || '',
  141. icon: 'error',
  142. });
  143. }
  144. }
  145. };
  146. // 类型选择
  147. const typeChange = (e) => {
  148. const data = typeList.value[e.detail.value]
  149. if (data) {
  150. form.value.type = data.value
  151. form.value.type_name = data.label
  152. }
  153. };
  154. // 学科选择
  155. const subjectChange = (e) => {
  156. const data = subjectList.value[e.detail.value]
  157. if (data) {
  158. form.value.subject = data.value
  159. form.value.subject_name = data.label
  160. }
  161. };
  162. // 年级选择
  163. const gradeChange = (e) => {
  164. const data = gradeList.value[e.detail.value]
  165. if (data) {
  166. form.value.grade = data.value
  167. form.value.grade_name = data.label
  168. }
  169. };
  170. const StartClose = async () => {
  171. showStart.value = false
  172. uFormRef.value.validateField('start_time')
  173. }
  174. const StartConfirm = async (e) => {
  175. showStart.value = false
  176. form.value.start_time = uni.$u.timeFormat(e.value, 'yyyy-mm-dd hh:MM')
  177. uFormRef.value.validateField('start_time')
  178. }
  179. const EndClose = async () => {
  180. showEnd.value = false
  181. uFormRef.value.validateField('end_time')
  182. }
  183. const EndConfirm = async (e) => {
  184. showEnd.value = false
  185. form.value.end_time = uni.$u.timeFormat(e.value, 'yyyy-mm-dd hh:MM')
  186. uFormRef.value.validateField('end_time')
  187. }
  188. // 提交方法
  189. const submit = async () => {
  190. uFormRef.value.validate().then(async valid => {
  191. if (valid) {
  192. const data = JSON.parse(JSON.stringify(form.value))
  193. data.teacher = user.value._id
  194. delete data.subject_name
  195. delete data.grade_name
  196. delete data.type_name
  197. let res;
  198. if (id.value) res = await $api(`course/${id.value}`, 'POST', data)
  199. else res = await $api(`course`, 'POST', data);
  200. if (res.errcode == '0') {
  201. uni.showToast({
  202. title: '维护信息成功',
  203. icon: 'none'
  204. })
  205. uni.navigateBack({
  206. delta: 1
  207. })
  208. } else {
  209. uni.showToast({
  210. title: res.errmsg,
  211. icon: 'none'
  212. })
  213. }
  214. } else {
  215. uni.$u.toast('校验失败')
  216. }
  217. }).catch(() => {
  218. // 处理验证错误
  219. uni.$u.toast('校验失败')
  220. });
  221. }
  222. const hideKeyboard = () => {
  223. uni.hideKeyboard()
  224. }
  225. </script>
  226. <style lang="scss" scoped>
  227. .teacher {
  228. display: flex;
  229. flex-direction: column;
  230. min-height: 100vh;
  231. background-color: var(--footColor);
  232. .one {
  233. margin: 2vw;
  234. padding: 2vw;
  235. border-radius: 5px;
  236. background-color: var(--mainColor);
  237. .picker {
  238. padding: 9px;
  239. border: 0.5px solid #dadbde;
  240. color: #303133;
  241. font-size: 15px;
  242. text-align: left;
  243. border-radius: 4px;
  244. }
  245. .bottom {
  246. text-align: center;
  247. .button {
  248. margin: 2vw 0 0 0;
  249. color: var(--mainColor);
  250. background-color: var(--3c9Color);
  251. font-size: var(--font14Size);
  252. border-radius: 2vw;
  253. }
  254. }
  255. :deep(.u-form-item__body__left__content) {
  256. padding: 5rpx 10rpx !important;
  257. }
  258. :deep(.u-form-item__body) {
  259. padding: 5rpx 0 !important;
  260. }
  261. }
  262. }
  263. </style>