master
xy 3 years ago
parent e7368ed818
commit 8b12ab06d9

@ -2,5 +2,5 @@
ENV = 'development'
# base api
VUE_APP_BASE_API =http://weiyuan-test.ali251.langye.net
VUE_APP_BASE_API = http://weiyuan-test.ali251.langye.net
VUE_APP_UPLOAD_API = http://weiyuan-test.ali251.langye.net/api/admin/upload-file

@ -0,0 +1,36 @@
import request from "@/utils/request";
export function index(isLoading = true,params){
return request({
url:"/api/admin/province/index",
method:"get",
isLoading,
params
})
}
export function show(isLoading = true,params){
return request({
url:"/api/admin/province/show",
method:"get",
isLoading,
params
})
}
export function save(data){
return request({
url:"/api/admin/province/save",
method:"post",
data
})
}
export function destroy(params){
return request({
url:"/api/admin/province/destroy",
method:"get",
params
})
}

@ -0,0 +1,36 @@
import request from "@/utils/request";
export function index(isLoading = true,params){
return request({
url:"/api/admin/specialize/index",
method:"get",
isLoading,
params
})
}
export function show(isLoading = true,params){
return request({
url:"/api/admin/specialize/show",
method:"get",
isLoading,
params
})
}
export function save(data){
return request({
url:"/api/admin/specialize/save",
method:"post",
data
})
}
export function destroy(params){
return request({
url:"/api/admin/specialize/destroy",
method:"get",
params
})
}

@ -0,0 +1,44 @@
import request from "@/utils/request";
export function index(isLoading = true,params){
return request({
url:"/api/admin/progress/index",
method:"get",
isLoading,
params
})
}
export function show(isLoading = true,params){
return request({
url:"/api/admin/progress/show",
method:"get",
isLoading,
params
})
}
export function save(data){
return request({
url:"/api/admin/progress/save",
method:"post",
data
})
}
export function destroy(params){
return request({
url:"/api/admin/progress/destroy",
method:"get",
params
})
}
export function init(isLoading = true,data){
return request({
url:"/api/admin/progress/init",
method:"post",
isLoading,
data
})
}

@ -0,0 +1,63 @@
<script>
export default {
props:{
auths:{
type:Array,
default:()=>[]
}
},
data() {
return {}
},
methods: {
},
render(){
let _this = this
//()
let temp = JSON.parse(JSON.stringify(this.auths))
if(temp.indexOf('search') !== -1){
console.log(temp.indexOf('search'))
temp.splice(temp.indexOf('search'),1)
temp.unshift('search')
}
console.log(temp)
return (
<div style={
{
'display':'flex',
'flex-warp':'wrap'
}
}>
<div style={
{
'margin-right':'10px'
}
}>
{ _this.$scopedSlots.default ? _this.$scopedSlots.default() : '' }
</div>
{
temp.map((item,index) => {
if(_this.$scopedSlots[item]){
return (
<div style={
{
'margin-right':'10px'
}
}>
{ _this.$scopedSlots[item](item,index) }
</div>
)
}
})
}
</div>
)
}
}
</script>
<style scoped lang="scss">
</style>

@ -91,7 +91,7 @@ export default {
}
this.$refs['elForm'].validate().then(res=>{
if(res)this.$emit('submit')
}).catch(err=>{
}).catch(err => {
this.$Message.warning({
content:'请填写完整信息',
duration:1

File diff suppressed because it is too large Load Diff

@ -0,0 +1,32 @@
const progressStatus = [
{
id: 1,
value: "待投档",
},
{
id: 2,
value: "录取中",
},
{
id: 3,
value: "录取结束",
},
{
id: 4,
value: "已邮寄通知书",
},
];
function getProgressStatus(type = "array") {
if (type === "array") {
return progressStatus;
}
if (type === "map") {
let map = new Map();
progressStatus.forEach((item) => {
map.set(item.id, item.value);
});
return map;
}
}
export { getProgressStatus };

@ -44,9 +44,9 @@ Vue.use(VueParticles)
Vue.config.productionTip = false
import avue from '@smallwei/avue'
import '@smallwei/avue/lib/index.css';
Vue.use(avue)
// import avue from '@smallwei/avue'
// import '@smallwei/avue/lib/index.css';
// Vue.use(avue)
Vue.directive('loadMore', {
bind(el, binding) {
const selectWrap = el.querySelector('.el-scrollbar__wrap')
@ -64,6 +64,8 @@ import LxHeader from "@/components/LxHeader"
Vue.component('lx-header',LxHeader)
import XyTable from '@/components/XyTable'
Vue.component('xy-table',XyTable)
import XyContent from '@/components/LxHeader/XyContent'
Vue.component('header-content',XyContent)
import XyDialog from '@/components/XyDialog'
Vue.component('xy-dialog',XyDialog)
import XySelectors from '@/components/XySelectors'

@ -0,0 +1,13 @@
export const authMixin = {
data(){
return {
auths_auth_mixin:[],
}
},
created() {
if(this.$route.meta.auths.length > 0 && this.$route.meta.auths[0]){
this.auths_auth_mixin = this.$route.meta.auths
}
console.log(this.auths_auth_mixin)
}
}

@ -61,6 +61,9 @@ const state = {
* @param routes
*/
const pathHandler = (path,id) => {
if(path.includes('$')){
return path.replace(/\$+/g,"")
}
if(path.includes('#') || path == ''){
return id + '_key'
}
@ -74,72 +77,48 @@ const componentHandler = (path) => {
if(path.includes('#') && path !== '#'){
return ()=>import('@/layout/noLayout')
}
if(path.includes('$')){
return loadView(path.replace(/\$+/g,""))
}
return loadView(path)
}
/**
* 后台查询的菜单数据拼装成路由格式的数据
* @param routes
*/
export function generaMenu(routes, data) {
data.forEach(item => {
if (item.url === "/") {
routes.push({
path: '/',
component: Layout,
redirect: '/dashboard',
children: [{
path: 'dashboard',
name: '系统首页',
component: () => import('@/views/dashboard/index'),
meta: {
title: '系统首页',
icon: 'dashboard'
}
}]
})
} else if (item.url === "##") {
routes.push({
path: item.path,
component: Layout,
children: [{
path: item.path,
name: item.name,
component: item.url === '#' ? Layout : loadView(item.path),
meta: {
title: item.name,
id: item.id,
roles: ['admin'],
icon: item.icon
}
}]
})
} else {
var path = item.url;
if (item.path != "null" && item.path != null && item.path != "") {
path = item.path
}
const menu = {
path: (path === '#' ? item.id + '_key' : path),
redirect: (item.children.length > 0 ? "noRedirect" : ""),
component: item.url === '#' ? Layout : loadView(item.url),
// hidden: true,
children: [],
name: 'menu_' + item.id,
meta: {
title: item.name,
id: item.id,
roles: ['admin'],
icon: item.icon
}
}
if (item.children) {
generaMenu(menu.children, item.children)
}
routes.push(menu)
}
})
export function generaMenu(routes, data) {
data.forEach(item => {
if (item.url === "/") {
} else {
const menu = {
path: pathHandler(item.url,item.id),
//(item.path === '#'||item.path == '' ? item.id + '_key' : item.path),
component: componentHandler(item.url),
//(item.path === '#'||item.path == '' ? Layout : loadView(item.path)),
// hidden: true,
children: [],
name: 'menu_' + item.id,
meta: {
title: item.name,
id: item.id,
roles: ['admin'],
auths:item.has_auth_node_tags,
icon: item.icon
}
}
if(item.url.includes("$")){
menu.hidden = true
}
if (item.children) {
generaMenu(menu.children, item.children)
}
routes.push(menu)
}
})
routes.push({
path: '*',
redirect: '/404',
hidden: true
})
}
const mutations = {

@ -0,0 +1,140 @@
<template>
<div>
<xy-dialog ref="dialog" :is-show.sync="isShow" type="form" :title="type === 'add' ? '新增省份' : '编辑省份'" :form="form" :rules="rules" @submit="submit">
<template v-slot:name>
<div class="xy-table-item">
<div class="xy-table-item-label">
<span style="color: red;font-weight: 600;padding-right: 4px;">*</span>
名称
</div>
<div class="xy-table-item-content">
<el-input v-model="form.name " clearable placeholder="请输入名称 " style="width: 300px;" />
</div>
</div>
</template>
<template v-slot:english>
<div class="xy-table-item">
<div class="xy-table-item-label">
<span style="color: red;font-weight: 600;padding-right: 4px;">*</span>
拼音或英文
</div>
<div class="xy-table-item-content">
<el-input v-model="form.english " clearable placeholder="请输入拼音或英文 " style="width: 300px;" />
</div>
</div>
</template>
<template v-slot:code>
<div class="xy-table-item">
<div class="xy-table-item-label">
<span style="color: red;font-weight: 600;padding-right: 4px;">*</span>
编码
</div>
<div class="xy-table-item-content">
<el-input v-model="form.code " clearable placeholder="请输入编码 " style="width: 300px;" />
</div>
</div>
</template>
<template v-slot:remark>
<div class="xy-table-item">
<div class="xy-table-item-label">
备注
</div>
<div class="xy-table-item-content">
<el-input type="textarea" :autosize="{minRows:2}" v-model="form.remark " clearable placeholder="请输入备注 " style="width: 300px;" />
</div>
</div>
</template>
</xy-dialog>
</div>
</template>
<script>
import {
show,
save
} from '@/api/manage/province';
export default {
props:{
},
data() {
return {
isShow: false,
id: '',
type: '',
form: {
name: "",
english: "",
code: "",
remark: "",
},
rules: {
name: [{
required: true,
message: "请填写名称"
}],
english: [{
required: true,
message: "请填写拼音或英文"
}],
code: [{
required: true,
message: "请填写编码"
}],
}
}
},
methods: {
async getDetail() {
const res = await show(this.id)
this.$integrateData(this.form, res)
},
submit() {
if(this.type === 'add'){
if(this.form.hasOwnProperty('id')){
delete this.form.id
}
}
if (this.type === 'editor') {
Object.defineProperty(this.form, 'id', {
value: this.id,
enumerable: true,
configurable: true,
writable: true
})
}
save(this.form).then(res => {
this.$successMessage(this.type, '')
this.isShow = false
this.$emit('refresh')
})
}
},
watch: {
isShow(val) {
if (val) {
if (this.type === 'editor') {
this.getDetail()
}
} else {
this.id = ''
this.type = ''
this.$refs['dialog'].reset()
delete this.form.id
}
}
}
}
</script>
<style scoped lang="scss">
::v-deep .el-input__inner {
text-align: left;
}
.xy-table-item-label{
width: 150px;
}
</style>

@ -0,0 +1,124 @@
<template>
<div>
<xy-dialog ref="dialog" :is-show.sync="isShow" type="form" :title="type === 'add' ? '新增专业' : '编辑专业'" :form="form" :rules="rules" @submit="submit">
<template v-slot:name>
<div class="xy-table-item">
<div class="xy-table-item-label">
<span style="color: red;font-weight: 600;padding-right: 4px;">*</span>
专业名称
</div>
<div class="xy-table-item-content">
<el-input v-model="form.name " clearable placeholder="请输入专业名称 " style="width: 300px;" />
</div>
</div>
</template>
<template v-slot:code>
<div class="xy-table-item">
<div class="xy-table-item-label">
<span style="color: red;font-weight: 600;padding-right: 4px;">*</span>
专业编码
</div>
<div class="xy-table-item-content">
<el-input v-model="form.code " clearable placeholder="请输入专业编码 " style="width: 300px;" />
</div>
</div>
</template>
<template v-slot:remark>
<div class="xy-table-item">
<div class="xy-table-item-label">
备注
</div>
<div class="xy-table-item-content">
<el-input type="textarea" :autosize="{minRows:2}" v-model="form.remark " clearable placeholder="请输入备注 " style="width: 300px;" />
</div>
</div>
</template>
</xy-dialog>
</div>
</template>
<script>
import {
show,
save
} from '@/api/manage/specialize';
export default {
props:{
},
data() {
return {
isShow: false,
id: '',
type: '',
form: {
name: "",
code: "",
remark: "",
},
rules: {
name: [{
required: true,
message: "请填写专业名称"
}],
code: [{
required: true,
message: "请填写专业编码"
}],
}
}
},
methods: {
async getDetail() {
const res = await show(false,{
id:this.id
})
this.$integrateData(this.form, res)
},
submit() {
if(this.type === 'add'){
if(this.form.hasOwnProperty('id')){
delete this.form.id
}
}
if (this.type === 'editor') {
Object.defineProperty(this.form, 'id', {
value: this.id,
enumerable: true,
configurable: true,
writable: true
})
}
save(this.form).then(res => {
this.$successMessage(this.type, '')
this.isShow = false
this.$emit('refresh')
})
}
},
watch: {
isShow(val) {
if (val) {
if (this.type === 'editor') {
this.getDetail()
}
} else {
this.id = ''
this.type = ''
this.$refs['dialog'].reset()
delete this.form.id
}
}
}
}
</script>
<style scoped lang="scss">
::v-deep .el-input__inner {
text-align: left;
}
</style>

@ -0,0 +1,101 @@
<template>
<div>
<div ref="lxHeader">
<lx-header
icon="md-apps"
style="margin-bottom: 10px; border: 0px; margin-top: 15px"
text="省份管理"
>
<div slot="content"></div>
<slot>
<header-content :auths="auths_auth_mixin">
<template v-slot:create>
<Button type="primary" @click="$refs['addProvince'].isShow = true"
>新建</Button
>
</template>
</header-content>
</slot>
</lx-header>
</div>
<xy-table
ref="xyTable"
:table-item="table"
:action="index"
:auths="auths_auth_mixin"
@editor="row => {
$refs['addProvince'].id = row.id;
$refs['addProvince'].type = 'editor';
$refs['addProvince'].isShow = true
}"
@delete="row => {
destroy({
id:row.id
}).then(res => {
$successMessage('destroy','省份')
$refs['xyTable'].getTableData()
})
}"
></xy-table>
<addProvince
ref="addProvince"
@refresh="$refs['xyTable'].getTableData(true)"
></addProvince>
</div>
</template>
<script>
import { index,destroy } from "@/api/manage/province";
import { authMixin } from "@/mixin/authMixin";
import addProvince from "@/views/manage/component/addProvince.vue";
export default {
mixins: [authMixin],
components: {
addProvince,
},
data() {
return {
table: [
{
prop: "id",
label: "序号",
width: 78,
sortable: "custom"
},
{
prop: "name",
label: "名称",
width: 120,
},
{
prop: "english",
label: "拼音/英文",
width: 140,
},
{
prop: "code",
label: "编码",
width: 120,
sortable: "custom"
},
{
prop: "remark",
label: "备注",
minWth: 220,
align: "left",
},
],
};
},
methods: {
index,
destroy,
},
computed: {},
};
</script>
<style scoped lang="scss"></style>

@ -0,0 +1,101 @@
<template>
<div>
<div ref="lxHeader">
<lx-header
icon="md-apps"
style="margin-bottom: 10px; border: 0px; margin-top: 15px"
text="专业管理"
>
<div slot="content"></div>
<slot>
<header-content :auths="auths_auth_mixin">
<template v-slot:create>
<Button
type="primary"
@click="
($refs['addSpecialize'].type = 'add'),
($refs['addSpecialize'].isShow = true)
"
>新建</Button
>
</template>
</header-content>
</slot>
</lx-header>
</div>
<xy-table
ref="xyTable"
:action="index"
:table-item="table"
:auths="auths_auth_mixin"
@editor="row => {
$refs['addSpecialize'].id = row.id;
$refs['addSpecialize'].type = 'editor';
$refs['addSpecialize'].isShow = true
}"
@delete="row => {
destroy({
id:row.id
}).then(res => {
$successMessage('destroy','专业')
$refs['xyTable'].getTableData()
})
}"
></xy-table>
<add-specialize
ref="addSpecialize"
@refresh="$refs['xyTable'].getTableData(true)"
></add-specialize>
</div>
</template>
<script>
import { authMixin } from "@/mixin/authMixin";
import { index,destroy } from "@/api/manage/specialize";
import addSpecialize from "./component/addSpecialize.vue";
export default {
mixins: [authMixin],
components: {
addSpecialize,
},
data() {
return {
table: [
{
prop: "id",
label: "序号",
width: 78,
sortable: "custom",
},
{
prop: "name",
label: "专业名称",
width: 200,
},
{
prop: "code",
label: "专业编码",
sortable: "custom",
width: 140,
},
{
prop: "remark",
label: "备注",
align: "left",
minWidth: 220,
},
],
};
},
methods: {
index,
destroy,
},
computed: {},
};
</script>
<style scoped lang="scss"></style>

@ -0,0 +1,175 @@
<template>
<div>
<xy-dialog ref="dialog" :is-show.sync="isShow" type="form" :title="type === 'add' ? '新增统招进度' : '编辑统招进度'" :form="form" :rules="rules" @submit="submit">
<template v-slot:year>
<div class="xy-table-item">
<div class="xy-table-item-label">
<span style="color: red;font-weight: 600;padding-right: 4px;">*</span>
年份
</div>
<div class="xy-table-item-content">
<el-date-picker v-model="form.year" type="year" placeholder="请选择年份" style="width: 300px;" value-format="yyyy"></el-date-picker>
</div>
</div>
</template>
<template v-slot:province_id>
<div class="xy-table-item">
<div class="xy-table-item-label">
<span style="color: red;font-weight: 600;padding-right: 4px;">*</span>
省份
</div>
<div class="xy-table-item-content">
<el-select v-model="form.province_id" clearable placeholder="请选择省份 " style="width: 300px;">
<el-option v-for="item in province_ids" :key="item.id" :label="item.name" :value="item.id"></el-option>
</el-select>
</div>
</div>
</template>
<template v-slot:status_id>
<div class="xy-table-item">
<div class="xy-table-item-label">
<span style="color: red;font-weight: 600;padding-right: 4px;">*</span>
进度
</div>
<div class="xy-table-item-content">
<el-select v-model="form.status_id" clearable placeholder="请选择进度 " style="width: 300px;">
<el-option v-for="item in getProgressStatus('array')" :key="item.id" :label="item.value" :value="item.id"></el-option>
</el-select>
</div>
</div>
</template>
<template v-slot:start_date>
<div class="xy-table-item">
<div class="xy-table-item-label">
开始时间
</div>
<div class="xy-table-item-content">
<el-date-picker v-model="form.start_date" placeholder="请选择开始时间" style="width: 300px;" value-format="yyyy-MM-dd"></el-date-picker>
</div>
</div>
</template>
<template v-slot:end_date>
<div class="xy-table-item">
<div class="xy-table-item-label">
结束时间
</div>
<div class="xy-table-item-content">
<el-date-picker v-model="form.end_date" placeholder="请选择结束时间" style="width: 300px;" value-format="yyyy-MM-dd"></el-date-picker>
</div>
</div>
</template>
<template v-slot:remark>
<div class="xy-table-item">
<div class="xy-table-item-label">
备注
</div>
<div class="xy-table-item-content">
<el-input type="textarea" :autosize="{minRows:2}" v-model="form.remark " clearable placeholder="请输入备注 " style="width: 300px;" />
</div>
</div>
</template>
</xy-dialog>
</div>
</template>
<script>
import {
show,
save
} from '@/api/unifiedRecruitment/progress';
import { getProgressStatus } from "@/const"
export default {
props:{
province_ids: {
type:Array,
default:()=>[]
},
},
data() {
return {
isShow: false,
id: '',
type: '',
form: {
year: "",
province_id: "",
status_id: "",
start_date: "",
end_date: "",
remark: "",
},
rules: {
year: [{
required: true,
message: "请填写年份"
}],
province_id: [{
required: true,
message: "请填写省份"
}],
status_id: [{
required: true,
message: "请填写进度"
}],
}
}
},
methods: {
getProgressStatus,
async getDetail() {
const res = await show(true,{
id:this.id
})
this.$integrateData(this.form, res)
},
submit() {
if(this.type === 'add'){
if(this.form.hasOwnProperty('id')){
delete this.form.id
}
}
if (this.type === 'editor') {
Object.defineProperty(this.form, 'id', {
value: this.id,
enumerable: true,
configurable: true,
writable: true
})
}
save(this.form).then(res => {
this.$successMessage(this.type, '')
this.isShow = false
this.$emit('refresh')
})
}
},
watch: {
isShow(val) {
if (val) {
if (this.type === 'editor') {
this.getDetail()
}
} else {
this.id = ''
this.type = ''
this.$refs['dialog'].reset()
delete this.form.id
}
},
"form.year"(val){
this.form.year = "" + val
}
}
}
</script>
<style scoped lang="scss">
::v-deep .el-input__inner {
text-align: left;
}
</style>

@ -0,0 +1,89 @@
<template>
<div>
<Modal width="52" :value="isShow" @on-visible-change="e => $emit('update:isShow',e)">
<div>
<el-date-picker
size="small"
type="year"
placement="bottom"
placeholder="年份选择"
style="width: 160px"
value-format="yyyy"
v-model="select.year"
@change="$refs['xyTable'].getTableData()"
></el-date-picker>
</div>
<div>
<xy-table ref="xyTable" :action="index" :req-opt="select" :is-page="false" :table-item="table">
<template v-slot:btns></template>
</xy-table>
</div>
</Modal>
</div>
</template>
<script>
import { index } from "@/api/unifiedRecruitment/progress"
import {getProgressStatus} from "@/const";
export default {
props:{
isShow:{
type:Boolean,
default:false
},
provinces: {
type:Array,
default:() => []
}
},
data() {
return {
select:{
year:"",
page_size:9999
},
table:[
{
width:60,
align:'center',
headerAlign:'center',
type:"selection"
},
{
prop: "province_id",
label: "省份",
width: 140,
formatter: (cell, data, val) => {
return (
this.provinces.filter((item) => {
return val === item.id;
})[0]?.name || val
);
},
},
{
prop: "start_date",
label: "开始时间",
minWidth: 160,
sortable: "custom",
},
{
prop: "end_date",
label: "结束时间",
minWidth: 160,
sortable: "custom",
}
],
}
},
methods: {
index,
},
computed: {},
}
</script>
<style scoped lang="scss">
</style>

@ -0,0 +1,153 @@
<template>
<div>
<div ref="lxHeader">
<lx-header
icon="md-apps"
style="margin-bottom: 10px; border: 0px; margin-top: 15px"
text="统招进度"
>
<div slot="content"></div>
<slot>
<header-content :auths="auths_auth_mixin">
<template v-slot:search>
<el-date-picker
size="small"
type="year"
placement="bottom"
placeholder="年份选择"
style="width: 160px"
value-format="yyyy"
v-model="select.year"
@change="$refs['xyTable'].getTableData()"
></el-date-picker>
</template>
<template v-slot:init>
<Button style="margin-left: 10px" type="primary" @click="isShowInit = true">初始化</Button>
</template>
<template v-slot:create>
<Button
type="primary"
@click="
($refs['addProgress'].type = 'add'),
($refs['addProgress'].isShow = true)
"
>新建</Button
>
</template>
</header-content>
</slot>
</lx-header>
</div>
<xy-table
ref="xyTable"
:req-opt="select"
:action="index"
:table-item="table"
:auths="auths_auth_mixin"
@editor="
(row) => {
$refs['addProgress'].id = row.id;
$refs['addProgress'].type = 'editor';
$refs['addProgress'].isShow = true;
}
"
></xy-table>
<addProgress
ref="addProgress"
:province_ids="provinces"
@refresh="$refs['xyTable'].getTableData(true)"
></addProgress>
<init :is-show.sync="isShowInit" :provinces="provinces"></init>
</div>
</template>
<script>
import { authMixin } from "@/mixin/authMixin";
import { index as provinceIndex } from "@/api/manage/province";
import { index } from "@/api/unifiedRecruitment/progress";
import { getProgressStatus } from "@/const";
import addProgress from "./component/addProgress.vue";
import init from "./component/init.vue"
export default {
mixins: [authMixin],
components: {
addProgress,
init
},
data() {
return {
provinces: [],
isShowInit:false,
select:{
year:''
},
table: [
{
prop: "year",
label: "年份",
width: 140,
sortable: "custom",
},
{
prop: "province_id",
label: "省份",
width: 140,
formatter: (cell, data, val) => {
return (
this.provinces.filter((item) => {
return val === item.id;
})[0]?.name || val
);
},
},
{
prop: "status_id",
label: "进度",
width: 140,
formatter: (cell, data, val) => {
let map = getProgressStatus("map");
return map.get(val);
},
},
{
prop: "start_date",
label: "开始时间",
width: 160,
sortable: "custom",
},
{
prop: "end_date",
label: "结束时间",
width: 160,
sortable: "custom",
},
{
prop: "remark",
label: "其他说明",
align: "left",
minWidth: 220,
},
],
};
},
methods: {
index,
async getProvinces() {
const res = await provinceIndex(false, {
page: 1,
page_size: 9999,
});
this.provinces = res.data;
},
},
created() {
this.getProvinces();
},
};
</script>
<style scoped></style>
Loading…
Cancel
Save