regionInfo-detail.vue 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  1. <style scoped>
  2. .user-panel {
  3. margin: 10px auto;
  4. }
  5. </style>
  6. <template>
  7. <el-dialog
  8. :visible.sync="showDialog"
  9. :title="title"
  10. :modal-append-to-body="false"
  11. style="text-align: left"
  12. @close="closeDialog"
  13. :close-on-click-modal="false"
  14. >
  15. <div class="user-panel" v-loading="loading">
  16. <el-form
  17. ref="form"
  18. :model="formModel"
  19. :rules="ruleValidate"
  20. :label-width="'100px'"
  21. >
  22. <el-form-item label="地区名称" prop="name">
  23. <el-input
  24. v-model="formModel.name"
  25. placeholder="请输入地区名称"
  26. style="width: 300px"
  27. ></el-input>
  28. </el-form-item>
  29. <el-form-item label="全称" prop="fullName">
  30. <el-input
  31. v-model="formModel.fullName"
  32. placeholder="请输入全称"
  33. style="width: 300px"
  34. ></el-input>
  35. </el-form-item>
  36. <el-form-item label="上级" prop="parentId">
  37. <el-select-tree
  38. :props="props"
  39. :options="regionData"
  40. v-model="formModel.parentId"
  41. size="mediumn"
  42. width="300px"
  43. ></el-select-tree>
  44. </el-form-item>
  45. <el-form-item label="经纬度" prop="location">
  46. <el-input
  47. v-model="formModel.location"
  48. placeholder="请输入经纬度"
  49. style="width: 300px"
  50. ></el-input>
  51. <i class="el-icon-map-location my-font" @click="handleLocation()"></i>
  52. </el-form-item>
  53. <el-form-item label="备注" prop="remark">
  54. <el-input
  55. v-model="formModel.remark"
  56. placeholder="请输入备注"
  57. style="width: 300px"
  58. ></el-input>
  59. </el-form-item>
  60. <el-form-item label="排序" prop="sortNo">
  61. <el-input-number
  62. v-model="formModel.sortNo"
  63. placeholder="请输入排序"
  64. style="width: 200px"
  65. :min="0"
  66. ></el-input-number>
  67. </el-form-item>
  68. </el-form>
  69. <el-dialog
  70. :visible.sync="showMapDialog"
  71. title="地图选点"
  72. :modal-append-to-body="true"
  73. :append-to-body="true"
  74. style="text-align: left"
  75. :close-on-click-modal="false"
  76. >
  77. <el-amap
  78. ref="stationMap"
  79. vid="stationMap"
  80. :amap-manager="amapManager"
  81. :center="pointPosition"
  82. :zoom="zoom"
  83. :events="events"
  84. class="amap-demo"
  85. >
  86. <el-amap-marker
  87. vid="amapDemo"
  88. :position="pointPosition"
  89. ></el-amap-marker>
  90. </el-amap>
  91. <span slot="footer" class="dialog-footer">
  92. <div style="position: absolute; left: 20px; bottom: 20px">
  93. <el-input
  94. placeholder="当前经纬度"
  95. v-model="formModel.location"
  96. style="width: 400px"
  97. >
  98. <template slot="prepend">经纬度</template>
  99. <el-button
  100. slot="append"
  101. icon="el-icon-search"
  102. @click="handleRegeo"
  103. >定位</el-button
  104. >
  105. </el-input>
  106. </div>
  107. <el-button @click="showMapDialog = false">取 消</el-button>
  108. <el-button type="primary" @click="handleSelectPoint()"
  109. >确 定</el-button
  110. >
  111. </span>
  112. </el-dialog>
  113. </div>
  114. <span slot="footer" class="dialog-footer">
  115. <el-button @click="closeDialog">取 消</el-button>
  116. <el-button type="primary" @click="handleSubmit" :loading="submitting"
  117. >确 定</el-button
  118. >
  119. </span>
  120. </el-dialog>
  121. </template>
  122. <script>
  123. import Constant from "@/constant";
  124. import regionInfoApi from "@/api/base/regionInfo";
  125. import SelectTree from "@/components/SelectTree";
  126. import AMap from "vue-amap";
  127. let amapManager = new AMap.AMapManager();
  128. export default {
  129. props: ["businessKey", "title"],
  130. data() {
  131. return {
  132. formModel: {},
  133. ruleValidate: {
  134. name: [
  135. { required: true, message: "地区名称不能为空", trigger: "blur" },
  136. ],
  137. fullName: [
  138. { required: true, message: "全称不能为空", trigger: "blur" },
  139. ],
  140. },
  141. showDialog: true,
  142. loading: false,
  143. submitting: false,
  144. regionData: [],
  145. props: {
  146. // 配置项(必选)
  147. value: "id",
  148. label: "name",
  149. children: "children",
  150. },
  151. pointPosition: [112.240222, 30.337053],
  152. showMapDialog: false,
  153. amapManager,
  154. zoom: 12,
  155. events: {
  156. click: (e) => {
  157. var pt = e.lnglat; //点击选择新地址为中心点
  158. console.log(pt);
  159. this.pointPosition = [pt.lng, pt.lat];
  160. this.formModel.location = pt.lng + "," + pt.lat;
  161. this.formModel.longitude = pt.lng;
  162. this.formModel.latitude = pt.lat;
  163. },
  164. },
  165. };
  166. },
  167. created() {
  168. regionInfoApi.list().then((response) => {
  169. var jsonData = response.data;
  170. this.regionData = jsonData.data;
  171. });
  172. },
  173. methods: {
  174. closeDialog() {
  175. this.$emit("close", false);
  176. },
  177. handleSubmit() {
  178. var self = this;
  179. this.$refs["form"].validate((valid) => {
  180. if (valid) {
  181. (function () {
  182. var id = self.formModel.id;
  183. if (id == null || id.length == 0) {
  184. return regionInfoApi.add(self.formModel);
  185. } else {
  186. return regionInfoApi.update(self.formModel);
  187. }
  188. })().then(function (response) {
  189. var jsonData = response.data;
  190. if (jsonData.result) {
  191. self.$message({
  192. message: "保存成功!",
  193. type: "success",
  194. });
  195. self.$emit("close", true);
  196. } else {
  197. self.$message({
  198. message: jsonData.message + "",
  199. type: "warning",
  200. });
  201. self.$emit("close", false);
  202. }
  203. });
  204. }
  205. });
  206. },
  207. handleLocation() {
  208. this.showMapDialog = true;
  209. if (this.formModel.longitude != null && this.formModel.latitude != null) {
  210. var arr = [this.formModel.longitude, this.formModel.latitude];
  211. this.pointPosition = arr;
  212. }
  213. },
  214. handleRegeo() {
  215. if (this.formModel.longitude != null && this.formModel.latitude != null) {
  216. var arr = [this.formModel.longitude, this.formModel.latitude];
  217. this.pointPosition = arr;
  218. }
  219. },
  220. handleSelectPoint() {
  221. this.formModel.location =
  222. this.pointPosition[0] + "," + this.pointPosition[1];
  223. this.formModel.longitude = this.pointPosition[0];
  224. this.formModel.latitude = this.pointPosition[1];
  225. this.showMapDialog = false;
  226. },
  227. },
  228. mounted: function () {
  229. var self = this;
  230. (function () {
  231. if (self.businessKey.length == 0) {
  232. return regionInfoApi.create();
  233. } else {
  234. return regionInfoApi.edit(self.businessKey);
  235. }
  236. })()
  237. .then((response) => {
  238. var jsonData = response.data;
  239. self.loading = false;
  240. if (jsonData.result) {
  241. self.formModel = jsonData.data;
  242. if (self.formModel.sortNo == null) {
  243. self.formModel.sortNo = 0;
  244. }
  245. if (
  246. self.formModel.longitude != null &&
  247. self.formModel.latitude != null
  248. ) {
  249. self.formModel.location =
  250. self.formModel.longitude + "," + self.formModel.latitude;
  251. }
  252. } else {
  253. self.$message.error(jsonData.message + "");
  254. }
  255. })
  256. .catch((error) => {
  257. self.$message.error(error + "");
  258. });
  259. },
  260. components: {
  261. "el-select-tree": SelectTree,
  262. },
  263. };
  264. </script>
  265. <style scoped>
  266. .user-panel {
  267. margin: 10px auto;
  268. }
  269. .amap-demo {
  270. width: 100%;
  271. height: 400px;
  272. }
  273. .my-font {
  274. font-size: 20px;
  275. cursor: pointer;
  276. margin-right: 10px;
  277. }
  278. </style>