edit.vue 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338
  1. <template>
  2. <view>
  3. <up-form labelPosition="left" :model="modelForm" :rules="rulesForm" ref="formRef">
  4. <up-form-item label="姓名" prop="name" borderBottom labelWidth="70">
  5. <up-input v-model="modelForm.name" border="none" placeholder="请输入姓名"></up-input>
  6. </up-form-item>
  7. <up-form-item label="性别" prop="sex" borderBottom @click="() => (sexFlag = true)" labelWidth="70">
  8. <up-input v-model="displaySex" disabled disabledColor="#ffffff" placeholder="请选择性别"
  9. border="none"></up-input>
  10. <template #right>
  11. <up-icon name="arrow-right"></up-icon>
  12. </template>
  13. </up-form-item>
  14. <up-form-item label="关系" prop="label" borderBottom @click="() => labelFlag = true" labelWidth="70">
  15. <up-input v-model="modelForm.label" disabled disabledColor="#ffffff" placeholder="请选择关系"
  16. border="none"></up-input>
  17. <template #right>
  18. <up-icon name="arrow-right"></up-icon>
  19. </template>
  20. </up-form-item>
  21. <up-form-item label="年龄" prop="age" borderBottom labelWidth="70">
  22. <up-input v-model="modelForm.age" border="none" placeholder="请输入年龄"></up-input>
  23. </up-form-item>
  24. <up-form-item label="手机号" prop="telephone" borderBottom
  25. :style="{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }" labelWidth="70">
  26. <up-input v-model="modelForm.telephone" border="none" placeholder="请输入手机号"></up-input>
  27. </up-form-item>
  28. <up-form-item label="是否有传染疾病" prop="isContagion" borderBottom labelWidth="150">
  29. <up-radio-group v-model="modelForm.isContagion" placement="row" @change="handleContagionChange">
  30. <up-radio :customStyle="{marginRight: '16px'}" v-for="(item, index) in isContagionOption"
  31. :key="index" :label="item.name" :name="item.key"></up-radio>
  32. </up-radio-group>
  33. </up-form-item>
  34. <up-form-item v-show="showContagionContent" label="传染病内容" prop="haveContagion" borderBottom
  35. labelWidth="100">
  36. <up-input v-model="modelForm.haveContagion" border="none" placeholder="请输入传染病内容"></up-input>
  37. </up-form-item>
  38. <up-form-item label="地区" prop="area" borderBottom @click="()=> addressShow = true" labelWidth="70">
  39. <pickerAddress @change="addressChange"
  40. :selectValue="[ modelForm.provinceInd, modelForm.cityInd, modelForm.districtInd ]">
  41. <view class="inp"
  42. :class="modelForm.provinceName&&modelForm.cityName&&modelForm.districtName?'':'address-inp'">
  43. {{modelForm.provinceName ? modelForm.provinceName:'省'}} /
  44. {{modelForm.cityName ? modelForm.cityName:'市'}} /
  45. {{modelForm.districtName ? modelForm.districtName:'区'}}
  46. </view>
  47. </pickerAddress>
  48. <template #right>
  49. <up-icon name="arrow-right"></up-icon>
  50. </template>
  51. </up-form-item>
  52. <up-form-item label="地址" prop="address" borderBottom labelWidth="70">
  53. <up-input v-model="modelForm.address" border="none" placeholder="请输入地址"></up-input>
  54. </up-form-item>
  55. </up-form>
  56. <up-action-sheet :show="sexFlag" :actions="sexOptions" @select="sexSelect"
  57. @close="sexFlag = false"></up-action-sheet>
  58. <up-action-sheet :show="labelFlag" :actions="relaTionsHip" @select="sexSelectsHip"
  59. @close="labelFlag = false"></up-action-sheet>
  60. <view class="Wrapper-Btn">
  61. <up-button @click="handleQux" type="error" :plain="true" :hairline="true" text="取消" :customStyle="hadlClickEdit"></up-button>
  62. <up-button type="error" @click="handleSubmit" text="编辑" :customStyle="hadlClickEdit" />
  63. </view>
  64. </view>
  65. </template>
  66. <script setup>
  67. import {
  68. ref,
  69. reactive,
  70. computed,
  71. } from 'vue';
  72. import {
  73. onLoad
  74. } from '@dcloudio/uni-app';
  75. import {
  76. useraDdress,
  77. } from "@/api/userSettings.js"
  78. import pickerAddress from '@/components/pickerAddress/pickerAddress.vue' // 地区选择器组件
  79. const formRef = ref(null)
  80. // 获取页面传递的参数
  81. // 获取页面传递的参数
  82. onLoad((options) => {
  83. if (options) {
  84. options.cityName = decodeURIComponent(decodeURIComponent(options.cityName || ''));
  85. options.districtName = decodeURIComponent(decodeURIComponent(options.districtName || ''));
  86. options.label = decodeURIComponent(decodeURIComponent(options.label || ''));
  87. options.provinceName = decodeURIComponent(decodeURIComponent(options.provinceName || ''));
  88. options.name = decodeURIComponent(decodeURIComponent(options.name || ''));
  89. options.address = decodeURIComponent(decodeURIComponent(options.address || ''));
  90. options.haveContagion = decodeURIComponent(decodeURIComponent(options.haveContagion || ''));
  91. modelForm.value = {
  92. ...modelForm.value,
  93. ...options,
  94. sex: options.sex ? Number(options.sex) : '',
  95. age: options.age ? Number(options.age) : '',
  96. isContagion: options.isContagion ? Number(options.isContagion) : '',
  97. provinceName: options.provinceName || '',
  98. cityName: options.cityName || '',
  99. districtName: options.districtName || '',
  100. };
  101. showContagionContent.value = options.isContagion === 1;
  102. }
  103. });
  104. const modelForm = ref({
  105. name: '',
  106. sex: '',
  107. label: '',
  108. age: '',
  109. telephone: '',
  110. isContagion: '',
  111. haveContagion: '',
  112. provinceName: '', // 省
  113. provinceCode: '',
  114. provinceInd: 0,
  115. cityName: '', // 市
  116. cityCode: '',
  117. cityInd: 0,
  118. districtName: '',
  119. districtCode: '',
  120. districtInd: 0,
  121. address: ''
  122. })
  123. // 回显把provinceName,cityName,districtName字段拼接
  124. const rulesForm = ref({
  125. name: {
  126. type: 'string',
  127. required: true,
  128. message: '请填写姓名',
  129. trigger: ['blur', 'change'],
  130. },
  131. sex: {
  132. type: 'number',
  133. required: true,
  134. message: '请选择性别',
  135. trigger: ['change']
  136. },
  137. label: {
  138. type: 'string',
  139. required: true,
  140. message: '请选择关系',
  141. trigger: ['change'],
  142. },
  143. userInfo: {
  144. type: 'string',
  145. required: true,
  146. message: '请填写年龄',
  147. trigger: ['blur', 'change'],
  148. },
  149. telephone: {
  150. type: 'string',
  151. required: true,
  152. message: '请填写手机号',
  153. trigger: ['blur', 'change'],
  154. },
  155. })
  156. let sexFlag = ref(false)
  157. let labelFlag = ref(false)
  158. let addressShow = ref(false)
  159. let index = ref(0)
  160. // 新增一个响应式变量,控制传染病内容的显示
  161. const showContagionContent = ref(false);
  162. const sexOptions = ref([{
  163. name: '男',
  164. value: 0,
  165. }, {
  166. name: '女',
  167. value: 1,
  168. }, ]);
  169. const isContagionOption = ref([{
  170. name: '是',
  171. key: 1,
  172. disabled: false,
  173. },
  174. {
  175. name: '否',
  176. key: 0,
  177. disabled: false,
  178. }
  179. ])
  180. const relaTionsHip = ref([{
  181. name: '父母'
  182. }, {
  183. name: '子女'
  184. },
  185. {
  186. name: '兄弟'
  187. },
  188. {
  189. name: '朋友'
  190. },
  191. {
  192. name: '同学'
  193. },
  194. {
  195. name: '同事'
  196. },
  197. {
  198. name: '配偶'
  199. }
  200. ]);
  201. const displaySex = computed({
  202. get() {
  203. const option = sexOptions.value.find(item => item.value === modelForm.value.sex)
  204. return option ? option.name : ''
  205. },
  206. set(newValue) {
  207. const option = sexOptions.value.find(item => item.name === newValue)
  208. if (option) {
  209. modelForm.value.sex = option.value
  210. }
  211. }
  212. })
  213. // 性别选择处理
  214. function sexSelect(e) {
  215. modelForm.value.sex = e.value; // 确保是 0 或 1
  216. console.log('Selected sex:', e.value, 'Model sex:', modelForm.value.sex);
  217. sexFlag.value = false;
  218. // 手动触发验证
  219. formRef.value.validateField('sex');
  220. }
  221. function sexSelectsHip(e) {
  222. modelForm.value.label = e.name;
  223. labelFlag.value = false;
  224. }
  225. function addressChange(info) {
  226. console.log(info, '>>>>data');
  227. const {
  228. data,
  229. code,
  230. index
  231. } = info
  232. modelForm.value.provinceName = data[0]
  233. modelForm.value.provinceCode = code[0]
  234. modelForm.value.provinceInd = index[0]
  235. modelForm.value.cityName = data[1]
  236. modelForm.value.cityCode = code[1]
  237. modelForm.value.cityInd = index[1]
  238. modelForm.value.districtName = data[2]
  239. modelForm.value.districtCode = code[2]
  240. modelForm.value.districtInd = index[2]
  241. }
  242. // 提交编辑
  243. async function handleSubmit() {
  244. try {
  245. // 1. 验证表单
  246. await formRef.value.validate();
  247. // 2. 准备提交数据
  248. const submitData = {
  249. ...modelForm.value,
  250. sex: modelForm.value.sex,
  251. isContagion: modelForm.value.isContagion
  252. };
  253. // 3. 显示加载中提示(可选)
  254. uni.showLoading({
  255. title: '提交中...',
  256. mask: true
  257. });
  258. // 4. 调用接口
  259. const response = await useraDdress(submitData);
  260. // 5. 隐藏加载中
  261. uni.hideLoading();
  262. // 6. 处理响应
  263. if (response.code === 200) {
  264. await new Promise((resolve) => {
  265. uni.showToast({
  266. title: '编辑成功',
  267. icon: 'success',
  268. duration: 1500, // 默认1500ms
  269. mask: true,
  270. success: () => {
  271. // 等待Toast显示完成
  272. setTimeout(() => resolve(), 1500);
  273. }
  274. });
  275. });
  276. // 7. 跳转页面
  277. uni.navigateTo({
  278. url:'/pages_mine/pages/selectAddress/index'
  279. });
  280. } else {
  281. uni.showToast({
  282. title: response.msg || '编辑失败',
  283. icon: 'none'
  284. });
  285. }
  286. } catch (error) {
  287. uni.hideLoading();
  288. console.error('编辑失败', error);
  289. uni.showToast({
  290. title: '编辑失败: ' + (error.message || '未知错误'),
  291. icon: 'none'
  292. });
  293. }
  294. }
  295. const handleQux = () =>{
  296. uni.navigateBack({
  297. delta:1
  298. })
  299. }
  300. const hadlClickEdit = {
  301. width: '240rpx',
  302. marginTop: '30rpx'
  303. }
  304. </script>
  305. <style scoped>
  306. .Wrapper-Btn{
  307. display: flex;
  308. justify-content: center;
  309. align-items: center;
  310. }
  311. </style>