mirror of
https://github.com/crmeb/CRMEB.git
synced 2026-10-29 22:10:49 +00:00
Merge branch 'v5.0.0dev' of https://gitee.com/ZhongBangKeJi/CRMEB into v5.0.0dev
This commit is contained in:
commit
f90da8b2cf
51
template/admin/src/api/crud.js
Normal file
51
template/admin/src/api/crud.js
Normal file
@ -0,0 +1,51 @@
|
||||
// +----------------------------------------------------------------------
|
||||
// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
|
||||
// +----------------------------------------------------------------------
|
||||
// | Copyright (c) 2016~2023 https://www.crmeb.com All rights reserved.
|
||||
// +----------------------------------------------------------------------
|
||||
// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
|
||||
// +----------------------------------------------------------------------
|
||||
// | Author: CRMEB Team <admin@crmeb.com>
|
||||
// +----------------------------------------------------------------------
|
||||
|
||||
import request from '@/libs/request';
|
||||
|
||||
/**
|
||||
* @description 获取接口配置
|
||||
* @param {Object} param data {Object} 传值参数
|
||||
*/
|
||||
export function crudApi(table_name) {
|
||||
return request({
|
||||
url: `system/crud/config/${table_name}`,
|
||||
method: 'get',
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 列表接口
|
||||
*/
|
||||
export function getList(url, params) {
|
||||
return request({
|
||||
url: url,
|
||||
method: 'get',
|
||||
params,
|
||||
});
|
||||
}
|
||||
/**
|
||||
* @description 创建接口
|
||||
*/
|
||||
export function getCreateApi(url) {
|
||||
return request({
|
||||
url: url,
|
||||
method: 'get',
|
||||
});
|
||||
}
|
||||
/**
|
||||
* @description 创建接口
|
||||
*/
|
||||
export function getEditApi(url) {
|
||||
return request({
|
||||
url: url,
|
||||
method: 'get',
|
||||
});
|
||||
}
|
||||
141
template/admin/src/pages/crud/index.vue
Normal file
141
template/admin/src/pages/crud/index.vue
Normal file
@ -0,0 +1,141 @@
|
||||
<template>
|
||||
<div>
|
||||
<Card :bordered="false" dis-hover class="ivu-mt">
|
||||
<Row type="flex">
|
||||
<Col v-bind="grid">
|
||||
<Button type="primary" icon="md-add" @click="add">添加</Button>
|
||||
</Col>
|
||||
</Row>
|
||||
<Table
|
||||
:columns="columns"
|
||||
:data="dataList"
|
||||
ref="table"
|
||||
class="mt25"
|
||||
:loading="loading"
|
||||
highlight-row
|
||||
no-userFrom-text="暂无数据"
|
||||
no-filtered-userFrom-text="暂无筛选结果"
|
||||
>
|
||||
<template slot-scope="{ row, index }" slot="action">
|
||||
<a @click="edit(row)">修改</a>
|
||||
<Divider type="vertical" />
|
||||
<a @click="del(row, '删除', index)">删除</a>
|
||||
</template>
|
||||
</Table>
|
||||
<div class="acea-row row-right page">
|
||||
<Page :total="total" show-elevator show-total @on-change="pageChange" :page-size="from.limit" />
|
||||
</div>
|
||||
</Card>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { mapState } from 'vuex';
|
||||
import { crudApi, getList, getCreateApi, getEditApi } from '@/api/crud.js';
|
||||
|
||||
export default {
|
||||
name: 'user_recharge',
|
||||
data() {
|
||||
return {
|
||||
grid: {
|
||||
xl: 7,
|
||||
lg: 7,
|
||||
md: 12,
|
||||
sm: 24,
|
||||
xs: 24,
|
||||
},
|
||||
loading: false,
|
||||
columns: [],
|
||||
from: {
|
||||
page: 1,
|
||||
limit: 15,
|
||||
},
|
||||
dataList: [],
|
||||
total: 0,
|
||||
methodApi: {},
|
||||
curdKey: '',
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
...mapState('media', ['isMobile']),
|
||||
labelWidth() {
|
||||
return this.isMobile ? undefined : 75;
|
||||
},
|
||||
labelPosition() {
|
||||
return this.isMobile ? 'top' : 'left';
|
||||
},
|
||||
},
|
||||
created() {
|
||||
this.getCrudApi(this.$route.params.table_name);
|
||||
},
|
||||
methods: {
|
||||
getCrudApi(tableName) {
|
||||
crudApi(tableName).then((res) => {
|
||||
this.methodApi = res.data.route;
|
||||
this.curdKey = res.data.key;
|
||||
res.data.columns.push({
|
||||
title: '操作',
|
||||
slot: 'action',
|
||||
fixed: 'right',
|
||||
width: 100,
|
||||
align: 'center',
|
||||
});
|
||||
this.columns = res.data.columns;
|
||||
this.getList();
|
||||
});
|
||||
},
|
||||
// 添加
|
||||
add() {
|
||||
let url = this.methodApi.create;
|
||||
this.$modalForm(getCreateApi(url)).then(() => this.getList());
|
||||
},
|
||||
//列表
|
||||
getList() {
|
||||
this.loading = true;
|
||||
let url = this.methodApi.index;
|
||||
getList(url, this.from)
|
||||
.then(async (res) => {
|
||||
let data = res.data;
|
||||
this.dataList = data.list;
|
||||
this.total = data.count;
|
||||
this.loading = false;
|
||||
})
|
||||
.catch((res) => {
|
||||
this.loading = false;
|
||||
this.$Message.error(res.msg);
|
||||
});
|
||||
},
|
||||
//分页
|
||||
pageChange(index) {
|
||||
this.from.page = index;
|
||||
this.getList();
|
||||
},
|
||||
// 修改
|
||||
edit(row) {
|
||||
let url = this.methodApi.edit.replace('<id>', row[this.curdKey]);
|
||||
this.$modalForm(getEditApi(url)).then(() => this.getList());
|
||||
},
|
||||
// 删除
|
||||
del(row, tit, num) {
|
||||
let url = this.methodApi.delete.replace('<id>', row[this.curdKey]);
|
||||
let delfromData = {
|
||||
title: tit,
|
||||
num: num,
|
||||
url: url,
|
||||
method: 'DELETE',
|
||||
ids: '',
|
||||
};
|
||||
this.$modalSure(delfromData)
|
||||
.then((res) => {
|
||||
this.$Message.success(res.msg);
|
||||
this.getList();
|
||||
})
|
||||
.catch((res) => {
|
||||
this.$Message.error(res.msg);
|
||||
});
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped lang="stylus"></style>
|
||||
@ -3,10 +3,16 @@
|
||||
<Alert closable>
|
||||
crud生成说明
|
||||
<template #desc>
|
||||
<p>1、字段配置中表存在生成的字段为表内列的信息,并且主键、伪删除字段不允许设置为列,主键默认展示在列表中,伪删除字段不允许展示</p>
|
||||
<p>
|
||||
1、字段配置中表存在生成的字段为表内列的信息,并且主键、伪删除字段不允许设置为列,主键默认展示在列表中,伪删除字段不允许展示
|
||||
</p>
|
||||
<p>2、在字段配置中新建表时,主键不需要增加列,会在生成的时候默认自带主键id</p>
|
||||
<p>3、在字段配置中新建表时,字段类型为addTimestamps会自动创建create_time、update_time字段,字段类型为:timestamp</p>
|
||||
<p>4、在字段配置中新建表时,字段类型为addSoftDelete会字段创建delete_time字段,字段类型为:timestamp,作用是伪删除</p>
|
||||
<p>
|
||||
3、在字段配置中新建表时,字段类型为addTimestamps会自动创建create_time、update_time字段,字段类型为:timestamp
|
||||
</p>
|
||||
<p>
|
||||
4、在字段配置中新建表时,字段类型为addSoftDelete会字段创建delete_time字段,字段类型为:timestamp,作用是伪删除
|
||||
</p>
|
||||
<p>5、在字段配置中,表单类型为frameImageOne时属于图片单选,frameImages时为图片多选</p>
|
||||
<p>6、在字段配置中,表单类型为不生成时创建后不会生成对应的表单项</p>
|
||||
</template>
|
||||
@ -29,11 +35,15 @@
|
||||
<div class="tip">选项,选择的菜单成功后会自动写入到此菜单下</div>
|
||||
</FormItem>
|
||||
<FormItem label="菜单名称">
|
||||
<Input class="form-width" v-model="foundation.menuName" placeholder="请输入表名"></Input>
|
||||
<Input class="form-width" v-model="foundation.menuName" placeholder="请输入菜单名称"></Input>
|
||||
<div class="tip">
|
||||
生成菜单为可选项,不填写默认生成的菜单名称将为表名;生成后会把自动生成的权限默认加入该菜单下
|
||||
</div>
|
||||
</FormItem>
|
||||
<FormItem label="模块名" prop="modelName">
|
||||
<Input class="form-width" v-model="foundation.modelName" placeholder="请输入模块名"></Input>
|
||||
<div class="tip">用于生成模块名称</div>
|
||||
</FormItem>
|
||||
<FormItem label="表名" prop="tableName">
|
||||
<Input class="form-width" v-model="foundation.tableName" placeholder="请输入表名" @on-blur="initfield"></Input>
|
||||
<div class="tip">
|
||||
@ -65,11 +75,7 @@
|
||||
>
|
||||
<template slot-scope="{ row, index }" slot="field">
|
||||
<span v-if="foundation.isTable">{{ row.field }}</span>
|
||||
<Input
|
||||
v-else
|
||||
:disabled="disabledInput(index)"
|
||||
v-model="tableField[index].field"
|
||||
></Input>
|
||||
<Input v-else :disabled="disabledInput(index)" v-model="tableField[index].field"></Input>
|
||||
</template>
|
||||
<template slot-scope="{ row, index }" slot="field_type">
|
||||
<span v-if="foundation.isTable">{{ row.field_type }}</span>
|
||||
@ -79,51 +85,27 @@
|
||||
</template>
|
||||
<template slot-scope="{ row, index }" slot="limit">
|
||||
<span v-if="foundation.isTable">{{ row.limit }}</span>
|
||||
<Input
|
||||
v-else
|
||||
v-model="tableField[index].limit"
|
||||
:disabled="disabledInput(index)"
|
||||
></Input>
|
||||
<Input v-else v-model="tableField[index].limit" :disabled="disabledInput(index)"></Input>
|
||||
</template>
|
||||
<template slot-scope="{ row, index }" slot="default">
|
||||
<span v-if="foundation.isTable">{{ row.default }}</span>
|
||||
<Input
|
||||
v-else
|
||||
v-model="tableField[index].default"
|
||||
:disabled="disabledInput(index)"
|
||||
></Input>
|
||||
<Input v-else v-model="tableField[index].default" :disabled="disabledInput(index)"></Input>
|
||||
</template>
|
||||
<template slot-scope="{ row, index }" slot="comment">
|
||||
<span v-if="foundation.isTable">{{ row.comment }}</span>
|
||||
<Input
|
||||
v-else
|
||||
v-model="tableField[index].comment"
|
||||
:disabled="disabledInput(index)"
|
||||
></Input>
|
||||
<Input v-else v-model="tableField[index].comment" :disabled="disabledInput(index)"></Input>
|
||||
</template>
|
||||
<template slot-scope="{ row, index }" slot="required">
|
||||
<Checkbox
|
||||
v-model="tableField[index].required"
|
||||
:disabled="disabledInput(index)"
|
||||
></Checkbox>
|
||||
<Checkbox v-model="tableField[index].required" :disabled="disabledInput(index)"></Checkbox>
|
||||
</template>
|
||||
<template slot-scope="{ row, index }" slot="is_table">
|
||||
<Checkbox
|
||||
v-model="tableField[index].is_table"
|
||||
:disabled="disabledInput(index)"
|
||||
></Checkbox>
|
||||
<Checkbox v-model="tableField[index].is_table" :disabled="disabledInput(index)"></Checkbox>
|
||||
</template>
|
||||
<template slot-scope="{ row, index }" slot="table_name">
|
||||
<Input
|
||||
v-model="tableField[index].table_name"
|
||||
:disabled="disabledInput(index)"
|
||||
></Input>
|
||||
<Input v-model="tableField[index].table_name" :disabled="disabledInput(index)"></Input>
|
||||
</template>
|
||||
<template slot-scope="{ row, index }" slot="from_type">
|
||||
<Select
|
||||
v-model="tableField[index].from_type"
|
||||
:disabled="disabledInput(index)"
|
||||
>
|
||||
<Select v-model="tableField[index].from_type" :disabled="disabledInput(index)">
|
||||
<Option v-for="item in fromTypeList" :value="item.value" :key="item.value">{{ item.label }}</Option>
|
||||
</Select>
|
||||
</template>
|
||||
@ -156,6 +138,7 @@ export default {
|
||||
foundationRules: {
|
||||
// pid: [{ required: true, message: '请输入菜单', trigger: 'blur' }],
|
||||
tableName: [{ required: true, message: '请输入表名', trigger: 'blur' }],
|
||||
modelName: [{ required: true, message: '请输入模块名', trigger: 'blur' }],
|
||||
},
|
||||
menusList: [],
|
||||
columnTypeList: [],
|
||||
@ -258,13 +241,13 @@ export default {
|
||||
},
|
||||
mounted() {},
|
||||
methods: {
|
||||
disabledInput(index){
|
||||
disabledInput(index) {
|
||||
let fieldInfo = this.tableField[index];
|
||||
let res = ['addTimestamps', 'addSoftDelete'].includes(this.tableField[index].field_type)
|
||||
let res = ['addTimestamps', 'addSoftDelete'].includes(this.tableField[index].field_type);
|
||||
if (fieldInfo.primaryKey) {
|
||||
res = true;
|
||||
}
|
||||
if (fieldInfo.field==='delete_time' && fieldInfo.field_type === 'timestamp') {
|
||||
if (fieldInfo.field === 'delete_time' && fieldInfo.field_type === 'timestamp') {
|
||||
res = true;
|
||||
}
|
||||
return res;
|
||||
|
||||
@ -59,6 +59,7 @@ export default {
|
||||
foundation: {
|
||||
pid: '',
|
||||
tableName: '',
|
||||
modelName: '',
|
||||
isTable: 1,
|
||||
menuName: '',
|
||||
},
|
||||
@ -87,6 +88,7 @@ export default {
|
||||
if (this.currentTab == 0) {
|
||||
// if (!this.formItem.foundation.pid) return this.$Message.warning('请选择菜单');
|
||||
if (!this.formItem.foundation.tableName) return this.$Message.warning('请输入表名');
|
||||
if (!this.formItem.foundation.modelName) return this.$Message.warning('请输入模块名');
|
||||
if (!this.formItem.foundation.isTable) {
|
||||
if (!this.$refs.Foundation.tableField.length) return this.$Message.warning('请先添加表数据');
|
||||
if (this.$refs.Foundation.tableField.length)
|
||||
@ -109,8 +111,6 @@ export default {
|
||||
...this.formItem.foundation,
|
||||
filePath: this.formItem.storage,
|
||||
tableField: this.$refs.Foundation.tableField,
|
||||
// columnField: this.$refs.Field.dataList,
|
||||
// fromField: this.$refs.FormItem.dataList,
|
||||
};
|
||||
this.reqloading = true;
|
||||
codeCrud(data)
|
||||
@ -168,7 +168,10 @@ export default {
|
||||
padding-left: 7px;
|
||||
}
|
||||
/deep/ .ivu-form-item {
|
||||
margin-bottom: 15px;
|
||||
margin-bottom: 17px;
|
||||
}
|
||||
/deep/ .ivu-form-item-error-tip {
|
||||
padding-top: 2px;
|
||||
}
|
||||
/deep/ .tip {
|
||||
color: #bbb;
|
||||
|
||||
39
template/admin/src/router/modules/crud.js
Normal file
39
template/admin/src/router/modules/crud.js
Normal file
@ -0,0 +1,39 @@
|
||||
// +---------------------------------------------------------------------
|
||||
// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
|
||||
// +---------------------------------------------------------------------
|
||||
// | Copyright (c) 2016~2023 https://www.crmeb.com All rights reserved.
|
||||
// +---------------------------------------------------------------------
|
||||
// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
|
||||
// +---------------------------------------------------------------------
|
||||
// | Author: CRMEB Team <admin@crmeb.com>
|
||||
// +---------------------------------------------------------------------
|
||||
|
||||
import LayoutMain from '@/layout';
|
||||
import setting from '@/setting';
|
||||
let routePre = setting.routePre;
|
||||
|
||||
const pre = 'crud_';
|
||||
|
||||
export default {
|
||||
path: routePre + '/crud',
|
||||
name: 'crud',
|
||||
header: 'crud',
|
||||
redirect: {
|
||||
name: `${pre}crud`,
|
||||
},
|
||||
meta: {
|
||||
auth: ['admin-crud'],
|
||||
},
|
||||
component: LayoutMain,
|
||||
children: [
|
||||
{
|
||||
path: ':table_name',
|
||||
name: `${pre}crud`,
|
||||
meta: {
|
||||
auth: ['admin-crund-index'],
|
||||
title: '增删改查',
|
||||
},
|
||||
component: () => import('@/pages/crud/index'),
|
||||
},
|
||||
],
|
||||
};
|
||||
@ -25,15 +25,16 @@ import statistic from './modules/statistic';
|
||||
import frameOut from './modules/frameOut';
|
||||
import division from './modules/division';
|
||||
import settings from '@/setting';
|
||||
import crud from './modules/crud';
|
||||
|
||||
const modulesFiles = require.context('./modules/crud', true, /\.js$/)
|
||||
const modulesFiles = require.context('./modules/crud', true, /\.js$/);
|
||||
|
||||
const routers = []
|
||||
const routers = [];
|
||||
// 将扫描到的路由信息加入路由数组中
|
||||
modulesFiles.keys().forEach(modulePath => {
|
||||
const value = modulesFiles(modulePath)
|
||||
routers.push(value.default)
|
||||
})
|
||||
modulesFiles.keys().forEach((modulePath) => {
|
||||
const value = modulesFiles(modulePath);
|
||||
routers.push(value.default);
|
||||
});
|
||||
|
||||
let routePre = settings.routePre;
|
||||
/**
|
||||
@ -169,7 +170,8 @@ const frameIn = [
|
||||
app,
|
||||
statistic,
|
||||
division,
|
||||
...routers
|
||||
...routers,
|
||||
crud,
|
||||
];
|
||||
|
||||
/**
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user