Add.vue 8.7 KB

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