合伙人运营小程序
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

index.js 6.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. const api = require('../../api/index.js');
  2. Page({
  3. data: {
  4. // 表单数据
  5. formData: {
  6. projectName: '', // 项目名称
  7. companyName: '', // 公司名称
  8. contactName: '', // 联系人
  9. contactPhone: '', // 联系电话
  10. addressDetails: '', // 地址
  11. longitude: '', // 经度
  12. latitude: '', // 纬度
  13. detail: '', // 详情
  14. images: [] // 上传图片列表
  15. },
  16. // 提交状态
  17. submitting: false
  18. },
  19. onLoad(options) {
  20. // 若从地图页跳转,自动填充经纬度
  21. if (options.lng && options.lat) {
  22. this.setData({
  23. 'formData.longitude': options.lng,
  24. 'formData.latitude': options.lat
  25. });
  26. }
  27. },
  28. /**
  29. * 输入框内容变化处理
  30. */
  31. handleInput(e) {
  32. const key = e.currentTarget.dataset.key;
  33. const value = e.detail.value;
  34. this.setData({
  35. [`formData.${key}`]: value
  36. });
  37. },
  38. /**
  39. * 选择定位(自动填充地址和经纬度)
  40. */
  41. chooseLocation() {
  42. wx.chooseLocation({
  43. success: (res) => {
  44. this.setData({
  45. 'formData.addressDetails': res.addressDetails,
  46. 'formData.longitude': res.longitude.toString(),
  47. 'formData.latitude': res.latitude.toString()
  48. });
  49. wx.showToast({
  50. title: '定位成功',
  51. icon: 'success',
  52. duration: 1000
  53. });
  54. },
  55. fail: (err) => {
  56. // 用户取消定位或授权失败
  57. if (err.errMsg !== 'chooseLocation:fail cancel') {
  58. wx.showToast({
  59. title: '定位失败,请手动输入',
  60. icon: 'none'
  61. });
  62. // 引导用户开启定位权限
  63. wx.openSetting({
  64. success: (res) => {
  65. if (!res.authSetting['scope.userLocation']) {
  66. wx.showToast({
  67. title: '请开启定位权限',
  68. icon: 'none'
  69. });
  70. }
  71. }
  72. });
  73. }
  74. }
  75. });
  76. },
  77. /**
  78. * 选择图片上传
  79. */
  80. chooseImage() {
  81. const { images } = this.data.formData;
  82. if (images.length >= 9) {
  83. wx.showToast({
  84. title: '最多上传9张图片',
  85. icon: 'none'
  86. });
  87. return;
  88. }
  89. wx.chooseMedia({
  90. count: 9 - images.length, // 剩余可上传数量
  91. mediaType: ['image'],
  92. sourceType: ['album', 'camera'], // 相册/相机
  93. sizeType: ['original', 'compressed'], // 原图/压缩
  94. success: (res) => {
  95. // 临时文件路径列表
  96. const tempFiles = res.tempFiles.map(item => item.tempFilePath);
  97. // 合并图片列表
  98. this.setData({
  99. 'formData.images': [...images, ...tempFiles]
  100. });
  101. // 实际项目中:上传图片到服务器,替换临时路径
  102. this.uploadImagesToServer(tempFiles);
  103. },
  104. fail: (err) => {
  105. wx.showToast({
  106. title: '图片选择失败',
  107. icon: 'none'
  108. });
  109. }
  110. });
  111. },
  112. /**
  113. * 删除已上传图片
  114. */
  115. deleteImage(e) {
  116. const index = e.currentTarget.dataset.index;
  117. const { images } = this.data.formData;
  118. images.splice(index, 1);
  119. this.setData({
  120. 'formData.images': images
  121. });
  122. },
  123. /**
  124. * 表单提交验证
  125. */
  126. validateForm() {
  127. const { formData } = this.data;
  128. // 1. 项目名称
  129. if (!formData.projectName.trim()) {
  130. wx.showToast({ title: '请输入项目名称', icon: 'none' });
  131. return false;
  132. }
  133. // 2. 公司名称
  134. if (!formData.companyName.trim()) {
  135. wx.showToast({ title: '请输入公司名称', icon: 'none' });
  136. return false;
  137. }
  138. // 3. 联系人
  139. if (!formData.contactName.trim()) {
  140. wx.showToast({ title: '请输入联系人', icon: 'none' });
  141. return false;
  142. }
  143. // 4. 联系电话(手机号验证)
  144. const phoneReg = /^1[3-9]\d{9}$/;
  145. if (!formData.contactPhone || !phoneReg.test(formData.contactPhone)) {
  146. wx.showToast({ title: '请输入正确的手机号码', icon: 'none' });
  147. return false;
  148. }
  149. // 5. 地址
  150. if (!formData.addressDetails.trim()) {
  151. wx.showToast({ title: '请输入地址或选择定位', icon: 'none' });
  152. return false;
  153. }
  154. // 6. 经纬度(数字验证)
  155. const lng = Number(formData.longitude);
  156. const lat = Number(formData.latitude);
  157. if (isNaN(lng) || isNaN(lat) || lng < 73 || lng > 135 || lat < 3 || lat > 54) {
  158. wx.showToast({ title: '请输入正确的经纬度(中国境内)', icon: 'none' });
  159. return false;
  160. }
  161. // 7. 图片
  162. if (formData.images.length === 0) {
  163. wx.showToast({ title: '请至少上传一张图片', icon: 'none' });
  164. return false;
  165. }
  166. return true;
  167. },
  168. /**
  169. * 表单提交
  170. */
  171. formSubmit(e) {
  172. // 防止重复提交
  173. if (this.data.submitting) return;
  174. // 表单验证
  175. if (!this.validateForm()) return;
  176. this.setData({ submitting: true });
  177. // 构造提交数据
  178. const submitData = {
  179. ...this.data.formData,
  180. longitude: Number(this.data.formData.longitude),
  181. latitude: Number(this.data.formData.latitude),
  182. createTime: new Date().toLocaleString() // 创建时间
  183. };
  184. // 实际项目中:调用接口提交数据
  185. this.submitFormToServer(submitData);
  186. },
  187. /**
  188. * 提交表单到服务器(实际项目替换为真实接口)
  189. */
  190. submitFormToServer(data) {
  191. // 重置提交状态
  192. this.setData({ submitting: false });
  193. console.log(data);
  194. api.request(`/sysproject/insertproject`, 'post',data ,{ isPublic: false })
  195. .then((data) => {
  196. console.log(data.data);
  197. if (data.code==200) {
  198. wx.showToast({ title: '提交成功', icon: 'success' });
  199. setTimeout(() => wx.navigateBack({ delta: 1 }), 1500);
  200. }else{
  201. wx.showToast({ title: res.data.msg || '提交失败', icon: 'none' });
  202. }
  203. })
  204. .catch((err) => {
  205. console.error('请求失败:', err);
  206. });
  207. },
  208. /**
  209. * 上传图片到服务器(实际项目使用
  210. */
  211. uploadImagesToServer(tempFiles) {
  212. tempFiles.forEach((filePath, index) => {
  213. wx.uploadFile({
  214. url: 'https://esos-iot.com:9442/sysproject/insertminio',
  215. filePath: filePath,
  216. name: 'file',
  217. formData: {
  218. 'fileType': 'project'
  219. },
  220. success: (res) => {
  221. const result = JSON.parse(res.data);
  222. if (result.code === 200) {
  223. // 替换临时路径为服务器路径
  224. const { images } = this.data.formData;
  225. images[index] = result.data.url;
  226. this.setData({
  227. 'formData.images': images
  228. });
  229. }
  230. },
  231. fail: () => {
  232. wx.showToast({ title: '图片上传失败', icon: 'none' });
  233. }
  234. });
  235. });
  236. }
  237. });