Merge branch 'v5.0.0dev' of https://gitee.com/ZhongBangKeJi/CRMEB into v5.0.0dev

This commit is contained in:
evoxwht 2023-04-21 11:35:52 +08:00
commit f90da8b2cf
6 changed files with 272 additions and 53 deletions

View 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',
});
}

View 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>

View File

@ -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;

View File

@ -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;

View 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'),
},
],
};

View File

@ -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,
];
/**