add-project.js 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. import { ref, computed } from 'vue';
  2. import { onLoad } from '@dcloudio/uni-app';
  3. import { addStudentProject, updateStudentProject } from '../../api/studentProject';
  4. export default {
  5. setup() {
  6. const form = ref({
  7. // Note: form fields map to MainStudentProjectBo fields
  8. name: '',
  9. role: '',
  10. startTime: '',
  11. endTime: '',
  12. desc: '',
  13. performance: '',
  14. link: ''
  15. });
  16. // "Wait for complete" logic: mandatory fields
  17. const isComplete = computed(() => {
  18. return !!(form.value.name &&
  19. form.value.role &&
  20. form.value.startTime &&
  21. form.value.desc);
  22. });
  23. const editIndex = ref(-1);
  24. const isEdit = computed(() => editIndex.value !== -1);
  25. onLoad((options) => {
  26. if (options && options.index !== undefined) {
  27. editIndex.value = parseInt(options.index);
  28. const data = uni.getStorageSync('edit_data_project');
  29. if (data) {
  30. // 映射后端字段到表单字段
  31. form.value = {
  32. id: data.id,
  33. name: data.projectName || data.name || '',
  34. role: data.role || '',
  35. startTime: data.startTime || '',
  36. endTime: data.endTime || '',
  37. desc: data.description || data.desc || '',
  38. performance: data.achievement || data.performance || '',
  39. link: data.link || ''
  40. };
  41. }
  42. }
  43. uni.setNavigationBarTitle({ title: isEdit.value ? '修改项目经历' : '添加项目经历' });
  44. });
  45. const goBack = () => {
  46. uni.navigateBack();
  47. };
  48. const yearOptions = [];
  49. const monthOptions = [];
  50. const currentYear = new Date().getFullYear();
  51. for (let i = 1990; i <= currentYear + 10; i++) {
  52. yearOptions.push(i + '年');
  53. }
  54. for (let i = 1; i <= 12; i++) {
  55. monthOptions.push((i < 10 ? '0' + i : i) + '月');
  56. }
  57. const showDatePicker = ref(false);
  58. const datePickerType = ref('start'); // 'start' or 'end'
  59. const datePickerValue = ref([currentYear - 1990, 0]); // 默认当前年 1月
  60. const tempStartTime = ref('');
  61. const tempEndTime = ref('');
  62. const switchDateTab = (type) => {
  63. datePickerType.value = type;
  64. const target = type === 'start' ? tempStartTime.value : tempEndTime.value;
  65. if (target && target !== '至今') {
  66. const parts = target.split('.');
  67. let yIdx = yearOptions.indexOf(parts[0] + '年');
  68. let mIdx = monthOptions.indexOf(parts[1] + '月');
  69. if (yIdx === -1) yIdx = currentYear - 1990;
  70. if (mIdx === -1) mIdx = 0;
  71. datePickerValue.value = [yIdx, mIdx];
  72. } else {
  73. datePickerValue.value = [currentYear - 1990, 0];
  74. if (type === 'start' && !tempStartTime.value) {
  75. tempStartTime.value = `${currentYear}.01`;
  76. }
  77. }
  78. };
  79. const openDatePicker = (type) => {
  80. tempStartTime.value = form.value.startTime;
  81. tempEndTime.value = form.value.endTime;
  82. showDatePicker.value = true;
  83. switchDateTab(type);
  84. };
  85. const closeDatePicker = () => {
  86. showDatePicker.value = false;
  87. };
  88. const onDatePickerChange = (e) => {
  89. datePickerValue.value = e.detail.value;
  90. const yIdx = datePickerValue.value[0] !== undefined ? datePickerValue.value[0] : (currentYear - 1990);
  91. const mIdx = datePickerValue.value[1] !== undefined ? datePickerValue.value[1] : 0;
  92. const yVal = yearOptions[yIdx].replace('年', '');
  93. const mVal = monthOptions[mIdx].replace('月', '');
  94. const formatted = `${yVal}.${mVal}`;
  95. if (datePickerType.value === 'start') {
  96. tempStartTime.value = formatted;
  97. } else {
  98. tempEndTime.value = formatted;
  99. }
  100. };
  101. const confirmDatePicker = () => {
  102. form.value.startTime = tempStartTime.value;
  103. form.value.endTime = tempEndTime.value;
  104. showDatePicker.value = false;
  105. };
  106. const saveForm = async () => {
  107. if (!isComplete.value) return;
  108. uni.showLoading({ title: '保存中...' });
  109. try {
  110. const userInfo = uni.getStorageSync('userInfo');
  111. const studentId = userInfo ? userInfo.studentId : null;
  112. if (!studentId) {
  113. uni.hideLoading();
  114. uni.showToast({ title: '登录失效,请重新登录', icon: 'none' });
  115. return;
  116. }
  117. const reqData = {
  118. studentId: studentId,
  119. projectName: form.value.name,
  120. role: form.value.role,
  121. startTime: form.value.startTime,
  122. endTime: form.value.endTime,
  123. description: form.value.desc,
  124. achievement: form.value.performance,
  125. link: form.value.link
  126. };
  127. if (isEdit.value) {
  128. reqData.id = form.value.id;
  129. const res = await updateStudentProject(reqData);
  130. uni.hideLoading();
  131. if (res.code === 200) {
  132. uni.showToast({ title: '修改成功', icon: 'success' });
  133. uni.removeStorageSync('edit_data_project');
  134. setTimeout(() => {
  135. uni.$emit('refresh_experience');
  136. uni.navigateBack();
  137. }, 1000);
  138. } else {
  139. uni.showToast({ title: res.msg || '修改失败', icon: 'none' });
  140. }
  141. } else {
  142. const res = await addStudentProject(reqData);
  143. uni.hideLoading();
  144. if (res.code === 200) {
  145. uni.showToast({ title: '添加成功', icon: 'success' });
  146. setTimeout(() => {
  147. uni.$emit('refresh_experience');
  148. uni.navigateBack();
  149. }, 1000);
  150. } else {
  151. uni.showToast({ title: res.msg || '添加失败', icon: 'none' });
  152. }
  153. }
  154. } catch (error) {
  155. uni.hideLoading();
  156. uni.showToast({ title: '网络异常,保存失败', icon: 'none' });
  157. console.error(error);
  158. }
  159. };
  160. return {
  161. form,
  162. isComplete,
  163. isEdit,
  164. goBack,
  165. showDatePicker,
  166. datePickerType,
  167. datePickerValue,
  168. yearOptions,
  169. monthOptions,
  170. tempStartTime,
  171. tempEndTime,
  172. openDatePicker,
  173. closeDatePicker,
  174. switchDateTab,
  175. onDatePickerChange,
  176. confirmDatePicker,
  177. saveForm
  178. };
  179. }
  180. }