Add.vue 8.8 KB

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