addressManagement.vue 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  1. <template>
  2. <div class="address-management">
  3. <div class="header">
  4. <div class="num">已保存<span>{{addressList.length}}</span>/100条,最多还可以添加<span>{{100-addressList.length}}</span>条</div>
  5. <el-button class="btn" @click="showAddress(false)" size="small" type="primary" plain>添加</el-button>
  6. </div>
  7. <el-table :data="addressList" stripe style="width: 100%">
  8. <el-table-column prop="contact" label="姓名">
  9. </el-table-column>
  10. <el-table-column prop="phone" label="电话">
  11. </el-table-column>
  12. <el-table-column prop="address" label="地址">
  13. </el-table-column>
  14. <el-table-column label="操作" width="100">
  15. <template slot-scope="scope">
  16. <el-button type="text" size="small" @click="showAddress(true,scope.row)">编辑</el-button>
  17. <el-button @click="deleteAddress(scope.row)" type="text" size="small">删除</el-button>
  18. </template>
  19. </el-table-column>
  20. </el-table>
  21. <!-- //新增编辑地址 -->
  22. <el-dialog :title="isEdit ? '编辑地址': '新增地址'" :visible.sync="centerDialogVisible" width="600px" center append-to-body>
  23. <el-form ref="form" :model="form" label-width="100px" label-position="left" size="small">
  24. <el-form-item label="位置" required>
  25. <el-input v-model="form.address" placeholder="请选择位置!" disabled>
  26. <img @click="showMap" slot="append" class="map" src="../../static/image/icon_map.png" />
  27. </el-input>
  28. </el-form-item>
  29. <el-form-item label="门牌号">
  30. <el-input v-model="form.street" placeholder="请填写楼层、单元、门牌号!"></el-input>
  31. </el-form-item>
  32. <el-form-item label="联系人姓名" required>
  33. <el-input v-model="form.contact" placeholder="请填写联系人姓名!"></el-input>
  34. </el-form-item>
  35. <el-form-item label="联系人电话" required>
  36. <el-input v-model="form.phone" placeholder="请填写联系人电话!"></el-input>
  37. </el-form-item>
  38. <el-form-item label="设为默认地址">
  39. <el-switch v-model="form.isDefault" :active-value="1" :inactive-value="0" active-color="#FC7200" inactive-color="#999"></el-switch>
  40. </el-form-item>
  41. </el-form>
  42. <span slot="footer" class="dialog-footer">
  43. <el-button size="small" @click="cancel">取 消</el-button>
  44. <el-button size="small" type="primary" @click="addAddress">确 定</el-button>
  45. </span>
  46. </el-dialog>
  47. <!-- 通过地图选择地理位置 -->
  48. <order-map @getAddressDetail="getAddressDetail" ref="orderMap"></order-map>
  49. </div>
  50. </template>
  51. <script>
  52. import orderMap from "./orderComponents/orderAMap.vue";
  53. import {
  54. getAddressList,
  55. deleteAddress,
  56. addAddress,
  57. updateAddress,
  58. getAddressDetail,
  59. defaultAddress,
  60. } from "../api/setting.js";
  61. export default {
  62. name: "addressManagement",
  63. data() {
  64. return {
  65. addressList: [],
  66. centerDialogVisible: false,
  67. isEdit: false,
  68. form: {
  69. id: "",
  70. address: "",
  71. cityCode: "",
  72. cityName: "",
  73. contact: "",
  74. districtName: "",
  75. isDefault: 0,
  76. lat: "",
  77. lng: "",
  78. phone: "",
  79. provinceName: "",
  80. street: "",
  81. },
  82. };
  83. },
  84. components: {
  85. orderMap,
  86. },
  87. // 监听属性 类似于data概念
  88. computed: {},
  89. // 监控data中的数据变化
  90. watch: {},
  91. // 生命周期 - 创建完成(可以访问当前this实例)
  92. created() {
  93. this.getAddressList();
  94. },
  95. mounted() {},
  96. // 方法集合
  97. methods: {
  98. cancel() {
  99. this.centerDialogVisible = false;
  100. this.getAddressList();
  101. },
  102. changeDefault() {
  103. defaultAddress({ addressId: this.form.id }).then((res) => {
  104. if (res.code === 200) {
  105. this.getAddressList();
  106. } else {
  107. this.$message({
  108. type: "error",
  109. message: res.msg,
  110. });
  111. }
  112. });
  113. },
  114. addAddress() {
  115. if (!this.form.address) {
  116. return this.$message({
  117. type: "error",
  118. message: "请选择地址的位置!",
  119. });
  120. }
  121. if (!this.form.contact.trim()) {
  122. return this.$message({
  123. type: "error",
  124. message: "请输入联系人姓名!",
  125. });
  126. }
  127. this.form.phone = this.form.phone.replace(/\s/g, "");
  128. if (!this.form.phone.trim()) {
  129. return this.$message({
  130. type: "error",
  131. message: "请输入联系人电话!",
  132. });
  133. }
  134. let reg2 = new RegExp(/^1[3456789]\d{9}$/);
  135. if (!reg2.test(this.form.phone)) {
  136. return this.$message({
  137. type: "error",
  138. message: "联系人电话格式不正确!",
  139. });
  140. }
  141. if (this.isEdit) {
  142. updateAddress(this.form).then((res) => {
  143. if (res.code === 200) {
  144. this.response();
  145. } else {
  146. this.$message({
  147. type: "success",
  148. message: res.msg,
  149. });
  150. }
  151. });
  152. } else {
  153. addAddress(this.form).then((res) => {
  154. if (res.code === 200) {
  155. this.response();
  156. } else {
  157. this.$message({
  158. type: "success",
  159. message: res.msg,
  160. });
  161. }
  162. });
  163. }
  164. },
  165. response() {
  166. this.$message({
  167. type: "success",
  168. message: `${this.isEdit ? "编辑" : "新增"}地址成功!`,
  169. });
  170. this.centerDialogVisible = false;
  171. this.getAddressList();
  172. },
  173. deleteAddress(row) {
  174. this.$confirm("此操作将删除该地址, 是否继续?", "提示", {
  175. confirmButtonText: "确定",
  176. cancelButtonText: "取消",
  177. center: true,
  178. type: "warning",
  179. }).then(() => {
  180. deleteAddress({ addressId: row.id }).then((res) => {
  181. if (res.code === 200) {
  182. this.$message({
  183. type: "success",
  184. message: "删除成功!",
  185. });
  186. this.getAddressList();
  187. } else {
  188. this.$message({
  189. type: "error",
  190. message: res.msg,
  191. });
  192. }
  193. });
  194. });
  195. },
  196. showMap() {
  197. this.$refs.orderMap.chooseLocation();
  198. },
  199. getAddressDetail(v, lng, lat) {
  200. this.form.address = v.address;
  201. this.form.provinceName = v.province;
  202. this.form.cityName = v.city;
  203. this.form.cityCode = v.citycode;
  204. this.form.districtName = v.district;
  205. this.form.lng = lng;
  206. this.form.lat = lat;
  207. },
  208. showAddress(flag, row) {
  209. this.isEdit = flag;
  210. if (flag) {
  211. this.form = row;
  212. } else {
  213. this.form = {
  214. id: "",
  215. address: "",
  216. cityCode: "",
  217. cityName: "",
  218. contact: "",
  219. districtName: "",
  220. isDefault: 0,
  221. lat: "",
  222. lng: "",
  223. phone: "",
  224. provinceName: "",
  225. street: "",
  226. };
  227. }
  228. this.centerDialogVisible = true;
  229. },
  230. getAddressList() {
  231. getAddressList().then((res) => {
  232. if (res.code === 200) {
  233. this.addressList = res.data.personal;
  234. } else {
  235. this.$message({
  236. type: "error",
  237. message: res.msg,
  238. });
  239. }
  240. });
  241. },
  242. },
  243. };
  244. </script>
  245. <style lang="scss" scoped type="text/css">
  246. .btn {
  247. background: #fc7200;
  248. color: #fff;
  249. border: #fc7200;
  250. }
  251. /deep/ .el-button--text {
  252. color: #fc7200;
  253. }
  254. .map {
  255. width: 20px;
  256. height: 20px;
  257. cursor: pointer;
  258. }
  259. .address-management {
  260. .header {
  261. display: flex;
  262. justify-content: space-between;
  263. align-items: center;
  264. margin-bottom: 10px;
  265. .num {
  266. font-size: 14px;
  267. span {
  268. color: #fc7200;
  269. }
  270. }
  271. }
  272. }
  273. </style>