Explorar o código

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

evoxwht %!s(int64=2) %!d(string=hai) anos
pai
achega
f90da8b2cf

+ 51 - 0
template/admin/src/api/crud.js

@@ -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 - 0
template/admin/src/pages/crud/index.vue

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

+ 26 - 43
template/admin/src/pages/system/codeGeneration/components/FoundationFor.vue

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

+ 6 - 3
template/admin/src/pages/system/codeGeneration/index.vue

@@ -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 - 0
template/admin/src/router/modules/crud.js

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

+ 9 - 7
template/admin/src/router/routers.js

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