Add.vue 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  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 labelWidth="70">
  25. <up-input v-model="modelForm.telephone" border="none" placeholder="请输入手机号"></up-input>
  26. </up-form-item>
  27. <up-form-item label="地区" prop="area" borderBottom @click="()=> addressShow = true" labelWidth="70">
  28. <pickerAddress @change="addressChange"
  29. :selectValue="[ modelForm.provinceInd, modelForm.cityInd, modelForm.districtInd ]">
  30. <view class="inp"
  31. :class="modelForm.provinceName&&modelForm.cityName&&modelForm.districtName?'':'address-inp'">
  32. {{modelForm.provinceName ? modelForm.provinceName:'省'}} /
  33. {{modelForm.cityName ? modelForm.cityName:'市'}} /
  34. {{modelForm.districtName ? modelForm.districtName:'区'}}
  35. </view>
  36. </pickerAddress>
  37. <template #right>
  38. <up-icon name="map" size="22" @click="onCityWx"></up-icon>
  39. </template>
  40. </up-form-item>
  41. <up-form-item label="地址" prop="address" borderBottom labelWidth="70">
  42. <up-input v-model="modelForm.address" border="none" placeholder="请输入地址"></up-input>
  43. </up-form-item>
  44. </up-form>
  45. <up-action-sheet :show="sexFlag" :actions="sexOptions" @select="sexSelect"
  46. @close="sexFlag = false"></up-action-sheet>
  47. <up-action-sheet :show="labelFlag" :actions="relaTionsHip" @select="sexSelectsHip"
  48. @close="labelFlag = false"></up-action-sheet>
  49. </view>
  50. </template>
  51. <script setup>
  52. import {
  53. ref,
  54. reactive,
  55. computed
  56. } from 'vue';
  57. import pickerAddress from '@/pages_mine/components/pickerAddress/pickerAddress.vue' // 地区选择器组件
  58. import { splitAddress } from '@/utils/adress'
  59. const formRef = ref(null)
  60. const modelForm = ref({
  61. name: '',
  62. sex: '',
  63. label: '',
  64. age: '',
  65. telephone: '',
  66. provinceName: '', // 省
  67. provinceCode: '',
  68. provinceInd: 0,
  69. cityName: '', // 市
  70. cityCode: '',
  71. cityInd: 0,
  72. districtName: '',
  73. districtCode: '',
  74. districtInd: 0,
  75. address: ''
  76. })
  77. const rulesForm = ref({
  78. name: {
  79. type: 'string',
  80. required: true,
  81. message: '请填写姓名',
  82. trigger: ['blur', 'change'],
  83. },
  84. sex: {
  85. type: 'string',
  86. required: true,
  87. message: '请选择性别',
  88. trigger: ['change']
  89. },
  90. label: {
  91. type: 'string',
  92. required: true,
  93. message: '请选择关系',
  94. trigger: ['change'],
  95. },
  96. userInfo: {
  97. type: 'string',
  98. required: true,
  99. message: '请填写年龄',
  100. trigger: ['blur', 'change'],
  101. },
  102. telephone: {
  103. type: 'string',
  104. required: true,
  105. message: '请填写手机号',
  106. trigger: ['blur', 'change'],
  107. },
  108. })
  109. let sexFlag = ref(false)
  110. let labelFlag = ref(false)
  111. let addressShow = ref(false)
  112. let index = ref(0)
  113. // 新增一个响应式变量,控制传染病内容的显示
  114. const showContagionContent = ref(false);
  115. const sexOptions = ref([{
  116. name: '男',
  117. value: 0,
  118. }, {
  119. name: '女',
  120. value: 1,
  121. }, ]);
  122. const relaTionsHip = ref([{
  123. name: '父母'
  124. }, {
  125. name: '子女'
  126. },
  127. {
  128. name: '兄弟'
  129. },
  130. {
  131. name: '朋友'
  132. },
  133. {
  134. name: '同学'
  135. },
  136. {
  137. name: '同事'
  138. },
  139. {
  140. name: '配偶'
  141. }
  142. ]);
  143. const displaySex = computed({
  144. get() {
  145. const option = sexOptions.value.find(item => item.value === modelForm.value.sex)
  146. return option ? option.name : ''
  147. },
  148. set(newValue) {
  149. const option = sexOptions.value.find(item => item.name === newValue)
  150. if (option) {
  151. modelForm.value.sex = option.value
  152. }
  153. }
  154. })
  155. // 性别选择处理
  156. function sexSelect(e) {
  157. modelForm.value.sex = e.value
  158. sexFlag.value = false
  159. }
  160. function sexSelectsHip(e) {
  161. modelForm.value.label = e.name;
  162. labelFlag.value = false;
  163. }
  164. function addressChange(info) {
  165. console.log(info, '>>>>data');
  166. const {
  167. data,
  168. code,
  169. index
  170. } = info
  171. modelForm.value.provinceName = data[0]
  172. modelForm.value.provinceCode = code[0]
  173. modelForm.value.provinceInd = index[0]
  174. modelForm.value.cityName = data[1]
  175. modelForm.value.cityCode = code[1]
  176. modelForm.value.cityInd = index[1]
  177. modelForm.value.districtName = data[2]
  178. modelForm.value.districtCode = code[2]
  179. modelForm.value.districtInd = index[2]
  180. }
  181. function getAdcodeByCoordinates(latitude, longitude) {
  182. const key = "XIXBZ-KF2KB-AAXUW-NCF42-UDJBJ-H2FAE"; // 替换为你的腾讯地图 API 密钥
  183. const url = `https://apis.map.qq.com/ws/geocoder/v1/?location=${latitude},${longitude}&key=${key}`;
  184. return new Promise((resolve, reject) => {
  185. uni.request({
  186. url: url,
  187. success: (res) => {
  188. if (res.data.status === 0) {
  189. const adInfo = res.data.result.ad_info;
  190. resolve({
  191. provinceName: adInfo.province,
  192. cityName: adInfo.city,
  193. districtName: adInfo.district,
  194. provinceCode: adInfo.adcode.slice(0, 2) + "0000", // 省编码
  195. cityCode: adInfo.adcode.slice(0, 4) + "00", // 市编码
  196. districtCode: adInfo.adcode, // 区编码
  197. });
  198. } else {
  199. reject("Error fetching adcode: " + res.data.message);
  200. }
  201. },
  202. fail: (err) => {
  203. reject(err);
  204. },
  205. });
  206. });
  207. }
  208. function onCityWx(row) {
  209. console.log('地区选点', row);
  210. wx.chooseLocation({
  211. success: async function (res) {
  212. try {
  213. const result = splitAddress(res.address); // 解析地址信息
  214. console.log(result, 'result>>>>>>>>');
  215. console.log(res, result);
  216. // 使用腾讯地图 API 获取编码
  217. const adcodeData = await getAdcodeByCoordinates(res.latitude, res.longitude);
  218. modelForm.value.provinceName = adcodeData.provinceName;
  219. modelForm.value.cityName = adcodeData.cityName;
  220. modelForm.value.districtName = adcodeData.districtName;
  221. modelForm.value.provinceCode = adcodeData.provinceCode; // 设置省编码
  222. modelForm.value.cityCode = adcodeData.cityCode; // 设置市编码
  223. modelForm.value.districtCode = adcodeData.districtCode; // 设置区编码
  224. modelForm.value.address = result.detail;
  225. modelForm.value.longitude = res.longitude;
  226. modelForm.value.latitude = res.latitude;
  227. } catch (err) {
  228. console.error(err);
  229. uni.showToast({
  230. title: '获取地址编码失败',
  231. icon: 'error',
  232. });
  233. }
  234. },
  235. fail: function (err) {
  236. console.log(err);
  237. uni.showToast({
  238. title: '获取地址失败',
  239. icon: 'error',
  240. });
  241. },
  242. });
  243. }
  244. // 预留校验函数
  245. function handleVerify() {
  246. // formRef.value
  247. }
  248. defineExpose({
  249. modelForm: modelForm.value,
  250. handleVerify: handleVerify()
  251. })
  252. </script>
  253. <style>
  254. </style>