优化代码生成

This commit is contained in:
不做码农 2022-04-27 17:57:47 +08:00
commit a8891c299c
22 changed files with 744 additions and 93 deletions

View File

@ -11,7 +11,7 @@
* 本项目适合有一定NetCore和 vue基础的开发人员 * 本项目适合有一定NetCore和 vue基础的开发人员
* 基于.NET5/.NET6实现的通用权限管理平台RBAC模式。整合最新技术高效快速开发前后端分离模式开箱即用。 * 基于.NET5/.NET6实现的通用权限管理平台RBAC模式。整合最新技术高效快速开发前后端分离模式开箱即用。
* 代码量少、学习简单、通俗易懂、功能强大、易扩展、轻量级让web开发更快速、简单高效从此告别996解决70%的重复工作,专注您的业务,轻松开发从现在开始! * 代码量少、学习简单、通俗易懂、功能强大、易扩展、轻量级让web开发更快速、简单高效从此告别996解决70%的重复工作,专注您的业务,轻松开发从现在开始!
* 前端采用vue2.x/vue3.x、Element UI/Element-UI plus、vite。 * 前端采用vue2.x/vue3.x、Element UI、vite。
* 后端采用Net5/Net6、Sqlsugar、MySQL等可以自动分库分表。 * 后端采用Net5/Net6、Sqlsugar、MySQL等可以自动分库分表。
* 权限认证使用Jwt支持多终端认证系统。 * 权限认证使用Jwt支持多终端认证系统。
* 支持加载动态权限菜单,多方式轻松权限控制 * 支持加载动态权限菜单,多方式轻松权限控制
@ -41,10 +41,10 @@
- [【Gitee】vue3地址](https://gitee.com/izory/ZRAdmin-vue) - [【Gitee】vue3地址](https://gitee.com/izory/ZRAdmin-vue)
## 🍁前端技术 ## 🍁前端技术
Vue版前端技术栈 基于vue2.x/vue3.x、vuex、vue-router 、vue-cli 、axios 和 element-ui/element-ui-plus前端采用vscode工具开发 Vue版前端技术栈 基于vue2.x/vue3.x、vuex、vue-router 、vue-cli 、axios 和 element-ui/element plus前端采用vscode工具开发
## 🍀后端技术 ## 🍀后端技术
核心框架:.Net5.0/.Net6 + Web API + sqlsugar + swagger + signalR + IpRateLimit 核心框架:.Net5.0/.Net6.0 + Web API + sqlsugar + swagger + signalR + IpRateLimit
定时计划任务Quartz.Net组件支持执行程序集或者http网络请求 定时计划任务Quartz.Net组件支持执行程序集或者http网络请求
@ -52,7 +52,15 @@ Vue版前端技术栈 基于vue2.x/vue3.x、vuex、vue-router 、vue-cli 、a
日志管理NLog、登录日志、操作日志、定时任务日志 日志管理NLog、登录日志、操作日志、定时任务日志
工具类:验证码、丰富公共功能、代码生成 工具类:验证码、丰富公共功能
接口限流:支持接口限流,避免恶意请求导致服务层压力过大
代码生成:高效率开发,代码生成器可以一键生成所有代码
数据字典:支持数据字典,可以方便对一些状态进行管理
## 🍖内置功能 ## 🍖内置功能

View File

@ -221,13 +221,15 @@ namespace ZR.Admin.WebApi.Controllers
/// 预览代码 /// 预览代码
/// </summary> /// </summary>
/// <param name="tableId"></param> /// <param name="tableId"></param>
/// <param name="VueVersion"></param>
/// <returns></returns> /// <returns></returns>
[HttpPost("preview/{tableId}")] [HttpPost("preview/{tableId}")]
[ActionPermissionFilter(Permission = "tool:gen:preview")] [ActionPermissionFilter(Permission = "tool:gen:preview")]
public IActionResult Preview(long tableId = 0) public IActionResult Preview(long tableId = 0, int VueVersion = 0)
{ {
GenerateDto dto = new(); GenerateDto dto = new();
dto.TableId = tableId; dto.TableId = tableId;
dto.VueVersion = VueVersion;
if (dto == null || dto.TableId <= 0) if (dto == null || dto.TableId <= 0)
{ {
throw new CustomException(ResultCode.CUSTOM_ERROR, "请求参数为空"); throw new CustomException(ResultCode.CUSTOM_ERROR, "请求参数为空");

View File

@ -172,13 +172,19 @@ namespace ZR.Admin.WebApi.Controllers.System
/// <summary> /// <summary>
/// 保存排序 /// 保存排序
/// </summary> /// </summary>
/// <param name="MenuDto"></param> /// <param name="id"></param>
/// <param name="value"></param>
/// <returns></returns> /// <returns></returns>
[ActionPermissionFilter(Permission = "system:menu:update")] [ActionPermissionFilter(Permission = "system:menu:update")]
[HttpPost("ChangeSort")] [HttpGet("ChangeSort")]
[Log(Title = "保存排序", BusinessType = BusinessType.UPDATE)] [Log(Title = "保存排序", BusinessType = BusinessType.UPDATE)]
public IActionResult ChangeSort([FromBody] MenuDto MenuDto) public IActionResult ChangeSort(int id = 0, int value = 0)
{ {
MenuDto MenuDto = new()
{
MenuId = id,
orderNum = value
};
if (MenuDto == null) { return ToResponse(ApiResult.Error(101, "请求参数错误")); } if (MenuDto == null) { return ToResponse(ApiResult.Error(101, "请求参数错误")); }
int result = sysMenuService.ChangeSortMenu(MenuDto); int result = sysMenuService.ChangeSortMenu(MenuDto);

View File

@ -16,7 +16,7 @@
"launchUrl": "swagger", "launchUrl": "swagger",
"applicationUrl": "http://localhost:8888", "applicationUrl": "http://localhost:8888",
"environmentVariables": { "environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development" "ASPNETCORE_ENVIRONMENT": ""
} }
} }
} }

View File

@ -1,4 +1,6 @@
-- 菜单 use ZrAdmin;
-- 菜单
INSERT INTO sys_menu(menuName, parentId, orderNum, path, component, isFrame, isCache, menuType, visible, status, perms, icon, create_by, create_time) INSERT INTO sys_menu(menuName, parentId, orderNum, path, component, isFrame, isCache, menuType, visible, status, perms, icon, create_by, create_time)
VALUES ('${genTable.functionName}', ${parentId}, 999, '${genTable.BusinessName}', '${tool.FirstLowerCase(genTable.ModuleName)}/${genTable.BusinessName}', 0, 0, 'C', '0', '0', '${replaceDto.PermissionPrefix}:list', '', 'system', sysdate()); VALUES ('${genTable.functionName}', ${parentId}, 999, '${genTable.BusinessName}', '${tool.FirstLowerCase(genTable.ModuleName)}/${genTable.BusinessName}', 0, 0, 'C', '0', '0', '${replaceDto.PermissionPrefix}:list', '', 'system', sysdate());

View File

@ -1,4 +1,6 @@
-- ${genTable.functionName}菜单 use ZrAdmin;
-- ${genTable.functionName}菜单
INSERT INTO sys_menu(menuName, parentId, orderNum, path, component, isFrame, isCache, menuType, visible, status, perms, icon, create_by, create_time) INSERT INTO sys_menu(menuName, parentId, orderNum, path, component, isFrame, isCache, menuType, visible, status, perms, icon, create_by, create_time)
VALUES ('${genTable.functionName}', ${parentId}, 999, '${genTable.BusinessName}', '${tool.FirstLowerCase(genTable.ModuleName)}/${genTable.BusinessName}', 0, 0, 'C', '0', '0', '${replaceDto.PermissionPrefix}:list', '', 'system', GETDATE()); VALUES ('${genTable.functionName}', ${parentId}, 999, '${genTable.BusinessName}', '${tool.FirstLowerCase(genTable.ModuleName)}/${genTable.BusinessName}', 0, 0, 'C', '0', '0', '${replaceDto.PermissionPrefix}:list', '', 'system', GETDATE());

View File

@ -1,4 +1,12 @@
<template> <!--
* @Descripttion: (${genTable.functionName}/${genTable.remark})
* @version: (1.0)
* @Author: (${replaceDto.Author})
* @Date: (${replaceDto.AddTime})
* @LastEditors: (最后更新作者)
* @LastEditTime: (最后更新时间)
-->
<template>
<div class="app-container"> <div class="app-container">
<!-- :model属性用于表单验证使用 比如下面的el-form-item 的 prop属性用于对表单值进行验证操作 --> <!-- :model属性用于表单验证使用 比如下面的el-form-item 的 prop属性用于对表单值进行验证操作 -->
<el-form :model="queryParams" size="small" label-position="right" inline ref="queryForm" :label-width="labelWidth" v-show="showSearch" <el-form :model="queryParams" size="small" label-position="right" inline ref="queryForm" :label-width="labelWidth" v-show="showSearch"
@ -35,7 +43,7 @@ $end
${VueViewListContent} ${VueViewListContent}
<el-table-column label="操作" align="center" width="140"> <el-table-column label="操作" align="center" width="140">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button size="mini" v-hasPermi="['${replaceDto.PermissionPrefix}:update']" type="success" icon="el-icon-edit" title="编辑" <el-button size="mini" v-hasPermi="['${replaceDto.PermissionPrefix}:edit']" type="success" icon="el-icon-edit" title="编辑"
@click="handleUpdate(scope.row)"></el-button> @click="handleUpdate(scope.row)"></el-button>
<el-button size="mini" v-hasPermi="['${replaceDto.PermissionPrefix}:delete']" type="danger" icon="el-icon-delete" title="删除" <el-button size="mini" v-hasPermi="['${replaceDto.PermissionPrefix}:delete']" type="danger" icon="el-icon-delete" title="删除"
@click="handleDelete(scope.row)"></el-button> @click="handleDelete(scope.row)"></el-button>

View File

@ -1,4 +1,12 @@
<template> <!--
* @Descripttion: (${genTable.functionName}/${genTable.remark})
* @version: (1.0)
* @Author: (${replaceDto.Author})
* @Date: (${replaceDto.AddTime})
* @LastEditors: (最后更新作者)
* @LastEditTime: (最后更新时间)
-->
<template>
<div class="app-container"> <div class="app-container">
<!-- :model属性用于表单验证使用 比如下面的el-form-item 的 prop属性用于对表单值进行验证操作 --> <!-- :model属性用于表单验证使用 比如下面的el-form-item 的 prop属性用于对表单值进行验证操作 -->
<el-form :model="queryParams" size="small" label-position="right" inline ref="queryForm" :label-width="labelWidth" v-show="showSearch" <el-form :model="queryParams" size="small" label-position="right" inline ref="queryForm" :label-width="labelWidth" v-show="showSearch"

View File

@ -1,4 +1,12 @@
<template> <!--
* @Descripttion: (${genTable.functionName}/${genTable.remark})
* @version: (1.0)
* @Author: (${replaceDto.Author})
* @Date: (${replaceDto.AddTime})
* @LastEditors: (最后更新作者)
* @LastEditTime: (最后更新时间)
-->
<template>
<div class="app-container"> <div class="app-container">
<!-- :model属性用于表单验证使用 比如下面的el-form-item 的 prop属性用于对表单值进行验证操作 --> <!-- :model属性用于表单验证使用 比如下面的el-form-item 的 prop属性用于对表单值进行验证操作 -->
<el-form :model="queryParams" size="small" label-position="right" inline ref="queryForm" :label-width="labelWidth" v-show="showSearch" <el-form :model="queryParams" size="small" label-position="right" inline ref="queryForm" :label-width="labelWidth" v-show="showSearch"

View File

@ -0,0 +1,559 @@
<!--
* @Descripttion: (${genTable.functionName}/${genTable.remark})
* @version: (1.0)
* @Author: (${replaceDto.Author})
* @Date: (${replaceDto.AddTime})
* @LastEditors: (最后更新作者)
* @LastEditTime: (最后更新时间)
-->
<template>
<div class="app-container">
<!-- :model属性用于表单验证使用 比如下面的el-form-item 的 prop属性用于对表单值进行验证操作 -->
<el-form :model="queryParams" label-position="right" inline ref="queryRef" v-show="showSearch"
@submit.prevent>
$foreach(column in genTable.Columns)
$set(labelName = "")
$set(columnName = "")
$set(numLabel = "")
$if(column.IsQuery == true)
$set(columnName = column.CsharpFieldFl)
$if(column.ColumnComment != "")
$set(labelName = column.ColumnComment)
$else
$set(labelName = column.CsharpFieldFl)
$end
$if(column.CsharpType == "int" || column.CsharpType == "long")
$set(numLabel = ".number")
$end
$if(column.HtmlType == "datetime")
<el-form-item label="$labelName">
<el-date-picker v-model="dateRange${column.CsharpField}" style="width: 240px" type="daterange" range-separator="-"
start-placeholder="开始日期" end-placeholder="结束日期" placeholder="请选择$labelName" :picker-options="{ firstDayOfWeek: 1}"></el-date-picker>
</el-form-item>
$elseif(column.HtmlType == "select" || column.HtmlType == "radio")
<el-form-item label="${labelName}" prop="${columnName}">
<el-select v-model="queryParams.${columnName}" placeholder="请选择${labelName}">
<el-option v-for="item in ${column.DictType}" :key="item.dictValue" :label="item.dictLabel" :value="item.dictValue"></el-option>
</el-select>
</el-form-item>
$else
<el-form-item label="${labelName}" prop="${columnName}">
<el-input v-model${numLabel}="queryParams.${columnName}" placeholder="请输入${labelName}" />
</el-form-item>
$end
$end
$end
<el-form-item>
<el-button icon="search" type="primary" @click="handleQuery">搜索</el-button>
<el-button icon="refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<!-- 工具区域 -->
<el-row :gutter="10" class="mb8">
$if(replaceDto.ShowBtnAdd)
<el-col :span="1.5">
<el-button type="primary" v-hasPermi="['${replaceDto.PermissionPrefix}:add']" plain icon="plus" @click="handleAdd">新增</el-button>
</el-col>
$end
<el-col :span="1.5">
<el-button type="info" plain icon="sort" @click="toggleExpandAll">展开/折叠</el-button>
</el-col>
$if(replaceDto.ShowBtnDelete)
<el-col :span="1.5">
<el-button type="danger" :disabled="multiple" v-hasPermi="['${replaceDto.PermissionPrefix}:delete']" plain icon="delete" @click="handleDelete">删除</el-button>
</el-col>
$end
$if(replaceDto.ShowBtnExport)
<el-col :span="1.5">
<el-button type="warning" plain icon="download" @click="handleExport" v-hasPermi="['${replaceDto.PermissionPrefix}:export']">导出</el-button>
</el-col>
$end
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<!-- 数据区域 -->
<el-table
v-if="refreshTable"
:data="dataList"
v-loading="loading"
ref="tableRef"
border
highlight-current-row
@selection-change="handleSelectionChange"
:default-expand-all="isExpandAll"
row-key="${tool.FirstLowerCase(genTable.TreeCode)}"
:tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
>
<el-table-column type="selection" width="50" align="center"/>
$foreach(column in genTable.Columns)
$set(labelName = "")
$set(checkboxHtml = "")
$set(showToolTipHtml = "")
$set(columnName = column.CsharpFieldFl)
$if(column.CsharpType == "string" || column.HtmlType == "datetime")
$set(showToolTipHtml = " :show-overflow-tooltip=\"true\"")
$end
$if(column.ColumnComment != "")
$set(labelName = column.ColumnComment)
$else
$set(labelName = column.CsharpFieldFl)
$end
$if(column.IsList == true)
$if(column.HtmlType == "customInput" && column.IsPk == false)
<el-table-column prop="${columnName}" label="${labelName}" width="90" sortable align="center">
<template #default="scope">
<span v-show="editIndex != scope.$${index}index" @click="editCurrRow(scope.$${index}index)">{{scope.row.${columnName}}}</span>
<el-input :id="scope.$${index}index" v-show="(editIndex == scope.$${index}index)" v-model="scope.row.${columnName}" @blur="handleChangeSort(scope.row)"></el-input>
</template>
</el-table-column>
$elseif(column.HtmlType == "imageUpload")
<el-table-column prop="${columnName}" label="${labelName}" align="center">
<template #default="scope">
<el-image preview-teleported :hide-on-click-modal="true" lazy class="table-td-thumb" fit="contain" :src="scope.row.${columnName}" :preview-src-list="[scope.row.${columnName}]">
<div><el-icon :size="15"><document /></el-icon></div>
</el-image>
</template>
</el-table-column>
$elseif(column.HtmlType == "checkbox" || column.HtmlType == "select" || column.HtmlType == "radio")
<el-table-column prop="${columnName}" label="${labelName}" align="center">
<template #default="scope">
$if(column.HtmlType == "checkbox")
<dict-tag :options="${column.DictType}" :value="scope.row.${columnName} ? scope.row.${columnName}.split(',') : []" />
$else
<dict-tag :options="${column.DictType}" :value="scope.row.${columnName}" />
$end
</template>
</el-table-column>
$else
<el-table-column prop="${columnName}" label="${labelName}" align="center"${showToolTipHtml} />
$end
$end
$end
<el-table-column label="操作" align="center" width="140">
<template #default="scope">
$if(replaceDto.ShowBtnEdit)
<el-button v-hasPermi="['${replaceDto.PermissionPrefix}:edit']" type="success" icon="edit" title="编辑"
@click="handleUpdate(scope.row)"></el-button>
$end
$if(replaceDto.ShowBtnDelete)
<el-button v-hasPermi="['${replaceDto.PermissionPrefix}:delete']" type="danger" icon="delete" title="删除"
@click="handleDelete(scope.row)"></el-button>
$end
</template>
</el-table-column>
</el-table>
<!-- 添加或修改${genTable.functionName}对话框 -->
<el-dialog :title="title" :lock-scroll="false" v-model="open" >
<el-form ref="formRef" :model="form" :rules="rules" label-width="100px">
<el-row :gutter="20">
$foreach(column in genTable.Columns)
$set(labelName = "")
$set(labelDisabled = "")
$set(columnName = column.CsharpFieldFl)
$set(value = "item.dictValue")
$if(column.ColumnComment != "")
$set(labelName = column.ColumnComment)
$else
$set(labelName = column.CsharpFieldFl)
$end
$if(column.IsPk == true)
$set(labelDisabled = ":disabled=true")
$end
$if(column.CsharpType == "int" || column.CsharpType == "long")
$set(value = "parseInt(item.dictValue)")
$end
$if(column.IsInsert == false && column.IsEdit == false)
<el-col :lg="12" v-if="opertype == 2">
<el-form-item label="${labelName}">{{form.${columnName}}}</el-form-item>
</el-col>
$elseif(tool.CheckTree(genTable ,column.CsharpField))
<el-col :lg="24">
<el-form-item label="父级id" prop="${columnName}">
<el-cascader
class="w100"
:options="dataList"
:props="{ checkStrictly: true, value: '${treeCode}', label: '${treeName}', emitPath: false }"
placeholder="请选择上级菜单"
clearable
v-model="form.${columnName}"
>
<template #default="{ node, data }">
<span>{{ data.${treeName} }}</span>
<span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
</template>
</el-cascader>
</el-form-item>
</el-col>
$elseif(column.IsPK || column.IsIncrement)
<el-col :lg="12">
<el-form-item label="${labelName}" prop="${columnName}">
$if(column.IsIncrement == false)
<el-input-number v-model.number="form.${columnName}" controls-position="right" placeholder="请输入${labelName}" :disabled="title=='修改数据'"/>
$else
<span v-html="form.${columnName}"/>
$end
</el-form-item>
</el-col>
$else
$if(column.HtmlType == "inputNumber")
<el-col :lg="12">
<el-form-item label="${labelName}" prop="${columnName}">
<el-input-number v-model.number="form.${columnName}" controls-position="right" placeholder="请输入${labelName}" ${labelDisabled}/>
</el-form-item>
</el-col>
$elseif(column.HtmlType == "datetime")
<el-col :lg="12">
<el-form-item label="${labelName}" prop="${columnName}">
<el-date-picker v-model="form.${columnName}" type="datetime" placeholder="选择日期时间"></el-date-picker>
</el-form-item>
</el-col>
$elseif(column.HtmlType == "imageUpload")
<el-col :lg="24">
<el-form-item label="${labelName}" prop="${columnName}">
<UploadImage v-model="form.${columnName}" :data="{ uploadType: 1 }" />
</el-form-item>
</el-col>
$elseif(column.HtmlType == "fileUpload")
<el-col :lg="24">
<el-form-item label="${labelName}" prop="${columnName}">
<UploadFile v-model="form.${columnName}" :data="{ uploadType: 1 }" />
</el-form-item>
</el-col>
$elseif(column.HtmlType == "radio")
<el-col :lg="12">
<el-form-item label="${labelName}" prop="${columnName}">
<el-radio-group v-model="form.${columnName}">
<el-radio v-for="item in ${column.DictType}" :key="item.dictValue" :label="${value}">{{item.dictLabel}}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
$elseif(column.HtmlType == "textarea")
<el-col :lg="24">
<el-form-item label="${labelName}" prop="${columnName}">
<el-input type="textarea" v-model="form.${columnName}" placeholder="请输入${labelName}"/>
</el-form-item>
</el-col>
$elseif(column.HtmlType == "editor")
<el-col :lg="24">
<el-form-item label="${labelName}" prop="${columnName}">
<editor v-model="form.${columnName}" :min-height="200" />
</el-form-item>
</el-col>
$elseif(column.HtmlType == "select")
<el-col :lg="12">
<el-form-item label="${labelName}" prop="${columnName}">
<el-select v-model="form.${columnName}" placeholder="请选择${labelName}">
<el-option v-for="item in ${column.DictType}" :key="item.dictValue" :label="item.dictLabel" :value="${value}"></el-option>
</el-select>
</el-form-item>
</el-col>
$elseif(column.HtmlType == "checkbox")
<el-col :lg="24">
<el-form-item label="${labelName}" prop="${columnName}">
<el-checkbox-group v-model="form.${columnName}Checked">
<el-checkbox v-for="item in ${column.DictType}" :key="item.dictValue" :label="item.dictValue">{{item.dictLabel}}</el-checkbox>
</el-checkbox-group>
</el-form-item>
</el-col>
$else
<el-col :lg="12">
<el-form-item label="${labelName}" prop="${columnName}">
<el-input v-model="form.${columnName}" placeholder="请输入${labelName}" ${labelDisabled}/>
</el-form-item>
</el-col>
$end
$end
$end
</el-row>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="text" @click="cancel">取 消</el-button>
<el-button type="primary" @click="submitForm">确 定</el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup name="${genTable.BusinessName.ToLower()}">
import { treelist${genTable.BusinessName}, list${genTable.BusinessName}, add${genTable.BusinessName}, del${genTable.BusinessName}, update${genTable.BusinessName}, get${genTable.BusinessName},
$if(replaceDto.ShowBtnExport) export${genTable.BusinessName}, $end $if(showCustomInput) changeSort $end } from '@/api/${tool.FirstLowerCase(genTable.ModuleName)}/${genTable.BusinessName.ToLower()}.js'
const { proxy } = getCurrentInstance()
// 是否展开,默认全部折叠
const isExpandAll = ref(false)
const refreshTable = ref(true)
//展开/折叠操作
function toggleExpandAll() {
refreshTable.value = false
isExpandAll.value = !isExpandAll.value
nextTick(() => {
refreshTable.value = true
})
}
// 选中${replaceDto.FistLowerPk}数组数组
const ids = ref([])
// 非单选禁用
const single = ref(true)
// 非多个禁用
const multiple = ref(true)
// 遮罩层
const loading = ref(false)
// 显示搜索条件
const showSearch = ref(true)
// 查询参数
const queryParams = reactive({
pageNum: 1,
pageSize: 10,
sort: undefined,
sortType: undefined,
$foreach(item in genTable.Columns)
$if(item.IsQuery == true)
${item.CsharpFieldFl}: undefined,
$end
$end
})
// 弹出层标题
const title = ref("")
// 操作类型 1、add 2、edit
const opertype = ref(0)
// 是否显示弹出层
const open = ref(false)
// 表单参数
const state = reactive({
form: {},
rules: {
$foreach(column in genTable.Columns)
$if(column.IsRequired && column.IsIncrement == false)
${column.CsharpFieldFl}: [
{ required: true, message: "${column.ColumnComment}不能为空", trigger: $if(column.htmlType == "select")"change"$else"blur"$end
$if(column.CsharpType == "int" || column.CsharpType == "long"), type: "number"$end }
],
$end
$end
}
})
const { form, rules } = toRefs(state)
// 总记录数
const total = ref(0)
const dataList = ref([])
const queryRef = ref()
const formRef = ref()
$foreach(item in genTable.Columns)
$if((item.HtmlType == "radio" || item.HtmlType == "select" || item.HtmlType == "checkbox"))
// ${item.ColumnComment}选项列表 格式 eg:{ dictLabel: '标签', dictValue: '0'}
const ${item.DictType} = ref([])
$elseif(item.HtmlType == "datetime" && item.IsQuery == true)
// ${item.ColumnComment}时间范围
const dateRange${item.CsharpField} = ref([])
$elseif(item.HtmlType == "customInput")
// ******************自定义编辑 start **********************
const editIndex = ref(-1)
// 显示编辑排序
function editCurrRow(rowId) {
editIndex.value = rowId
setTimeout(() => {
document.getElementById(rowId).focus()
}, 100)
}
// 保存排序
function handleChangeSort(info) {
editIndex.value = -1
proxy
.${confirm}confirm('是否保存数据?')
.then(function () {
return changeSort({ value: info.${item.CsharpFieldFl}, id: info.${replaceDto.FistLowerPk} })
})
.then(() => {
handleQuery()
proxy.${modal}modal.msgSuccess('修改成功')
})
}
// ******************自定义编辑 end **********************
$end
$end
$set(index = 0)
var dictParams = [
$foreach(item in genTable.Columns)
$if((item.HtmlType == "radio" || item.HtmlType == "select" || item.HtmlType == "checkbox") && item.DictType != "")
{ dictType: "${item.DictType}" },
$set(index = index + 1)
$end
$end
]
$if(index > 0)
proxy.getDicts(dictParams).then((response) => {
response.data.forEach((element) => {
proxy[element.dictType] = element.list
})
})
$end
function getList(){
$foreach(item in genTable.Columns)
$if(item.HtmlType == "datetime" && item.IsQuery == true)
proxy.addDateRange(queryParams, proxy.dateRange${item.CsharpField}, '${item.CsharpField}');
$end
$end
loading.value = true
treelist${genTable.BusinessName}(queryParams).then(res => {
if (res.code == 200) {
//dataList.value = res.data.result
//total.value = res.data.totalNum
dataList.value = res.data
loading.value = false
}
})
}
// 关闭dialog
function cancel(){
open.value = false
reset()
}
// 重置表单
function reset() {
proxy.resetForm("formRef")
}
// 查询
function handleQuery() {
queryParams.pageNum = 1
getList()
}
// 添加
function handleAdd() {
reset();
open.value = true
title.value = '添加'
opertype.value = 1
}
// 删除按钮操作
function handleDelete(row) {
const Ids = row.${replaceDto.FistLowerPk} || ids.value
proxy.${confirm}confirm('是否确认删除参数编号为"' + Ids + '"的数据项?')
.then(function () {
return del${genTable.BusinessName}(Ids)
})
.then(() => {
handleQuery()
proxy.${modal}modal.msgSuccess("删除成功")
})
.catch(() => {})
}
// 修改按钮操作
function handleUpdate(row) {
reset()
const id = row.${replaceDto.FistLowerPk} || ids.value
get${genTable.BusinessName}(id).then((res) => {
const { code, data } = res
if (code == 200) {
open.value = true
title.value = "修改数据"
opertype.value = 2
form.value = {
...data,
$foreach(item in genTable.Columns)
$if(item.HtmlType == "checkbox")
${item.CsharpFieldFl}Checked: data.${item.CsharpFieldFl} ? data.${item.CsharpFieldFl}.split(',') : [],
$end
$end
}
}
})
}
// 表单提交
function submitForm() {
proxy.${refs}refs["formRef"].validate((valid) => {
if (valid) {
if (form.value.${replaceDto.FistLowerPk} != undefined && opertype.value === 2) {
update${genTable.BusinessName}(form.value).then((res) => {
proxy.${modal}modal.msgSuccess("修改成功")
open.value = false
getList()
})
.catch(() => {})
} else {
add${genTable.BusinessName}(form.value).then((res) => {
proxy.${modal}modal.msgSuccess("新增成功")
open.value = false
getList()
})
.catch((err) => {
//TODO 错误逻辑
})
}
}
})
}
// 重置查询操作
function resetQuery(){
$foreach(item in genTable.Columns)
$if(item.HtmlType == "datetime" && item.IsQuery == true)
// ${item.ColumnComment}时间范围
dateRange${item.CsharpField}.value = []
$end
$end
proxy.resetForm("queryRef")
handleQuery()
}
$if(replaceDto.ShowBtnExport)
// 导出按钮操作
function handleExport() {
proxy
.${confirm}confirm("是否确认导出所有${genTable.functionName}数据项?", "警告", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
})
.then(function () {
return export${genTable.BusinessName}(queryParams)
})
.then((response) => {
proxy.download(response.data.path)
})
}
$end
// 多选框选中数据
function handleSelectionChange(selection) {
ids.value = selection.map((item) => item.${replaceDto.FistLowerPk});
single.value = selection.length != 1
multiple.value = !selection.length;
}
// 自定义排序
function sortChange(column) {
if (column.prop == null || column.order == null) {
queryParams.sort = undefined
queryParams.sortType = undefined
} else {
queryParams.sort = column.prop
queryParams.sortType = column.order
}
handleQuery()
}
handleQuery()
</script>

View File

@ -1,4 +1,12 @@
<template> <!--
* @Descripttion: (${genTable.functionName}/${genTable.remark})
* @version: (1.0)
* @Author: (${replaceDto.Author})
* @Date: (${replaceDto.AddTime})
* @LastEditors: (最后更新作者)
* @LastEditTime: (最后更新时间)
-->
<template>
<div class="app-container"> <div class="app-container">
<!-- :model属性用于表单验证使用 比如下面的el-form-item 的 prop属性用于对表单值进行验证操作 --> <!-- :model属性用于表单验证使用 比如下面的el-form-item 的 prop属性用于对表单值进行验证操作 -->
<el-form :model="queryParams" label-position="right" inline ref="queryRef" v-show="showSearch" <el-form :model="queryParams" label-position="right" inline ref="queryRef" v-show="showSearch"
@ -26,7 +34,7 @@ $if(column.HtmlType == "datetime")
$elseif(column.HtmlType == "select" || column.HtmlType == "radio") $elseif(column.HtmlType == "select" || column.HtmlType == "radio")
<el-form-item label="${labelName}" prop="${columnName}"> <el-form-item label="${labelName}" prop="${columnName}">
<el-select v-model="queryParams.${columnName}" placeholder="请选择${labelName}"> <el-select v-model="queryParams.${columnName}" placeholder="请选择${labelName}">
<el-option v-for="item in ${columnName}Options" :key="item.dictValue" :label="item.dictLabel" :value="item.dictValue"></el-option> <el-option v-for="item in ${column.DictType}" :key="item.dictValue" :label="item.dictLabel" :value="item.dictValue"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
$else $else
@ -95,7 +103,7 @@ $if(column.HtmlType == "customInput" && column.IsPk == false)
$elseif(column.HtmlType == "imageUpload") $elseif(column.HtmlType == "imageUpload")
<el-table-column prop="${columnName}" label="${labelName}" align="center"> <el-table-column prop="${columnName}" label="${labelName}" align="center">
<template #default="scope"> <template #default="scope">
<el-image class="table-td-thumb" fit="contain" :src="scope.row.${columnName}" :preview-src-list="[scope.row.${columnName}]"> <el-image preview-teleported :hide-on-click-modal="true" lazy class="table-td-thumb" fit="contain" :src="scope.row.${columnName}" :preview-src-list="[scope.row.${columnName}]">
<div><el-icon :size="15"><document /></el-icon></div> <div><el-icon :size="15"><document /></el-icon></div>
</el-image> </el-image>
</template> </template>
@ -104,9 +112,9 @@ $elseif(column.HtmlType == "checkbox" || column.HtmlType == "select" || column.H
<el-table-column prop="${columnName}" label="${labelName}" align="center"> <el-table-column prop="${columnName}" label="${labelName}" align="center">
<template #default="scope"> <template #default="scope">
$if(column.HtmlType == "checkbox") $if(column.HtmlType == "checkbox")
<dict-tag :options="${columnName}Options" :value="scope.row.${columnName} ? scope.row.${columnName}.split(',') : []" /> <dict-tag :options="${column.DictType}" :value="scope.row.${columnName} ? scope.row.${columnName}.split(',') : []" />
$else $else
<dict-tag :options="${columnName}Options" :value="scope.row.${columnName}" /> <dict-tag :options="${column.DictType}" :value="scope.row.${columnName}" />
$end $end
</template> </template>
</el-table-column> </el-table-column>
@ -135,13 +143,11 @@ $end
<el-dialog :title="title" :lock-scroll="false" v-model="open" > <el-dialog :title="title" :lock-scroll="false" v-model="open" >
<el-form ref="formRef" :model="form" :rules="rules" label-width="100px"> <el-form ref="formRef" :model="form" :rules="rules" label-width="100px">
<el-row :gutter="20"> <el-row :gutter="20">
$foreach(column in genTable.Columns) $foreach(column in genTable.Columns)
$set(labelName = "") $set(labelName = "")
$set(labelDisabled = "") $set(labelDisabled = "")
$set(columnName = column.CsharpFieldFl) $set(columnName = column.CsharpFieldFl)
$set(value = "item.dictValue") $set(value = "item.dictValue")
$if(column.ColumnComment != "") $if(column.ColumnComment != "")
$set(labelName = column.ColumnComment) $set(labelName = column.ColumnComment)
$else $else
@ -197,7 +203,7 @@ $elseif(column.HtmlType == "radio")
<el-col :lg="12"> <el-col :lg="12">
<el-form-item label="${labelName}" prop="${columnName}"> <el-form-item label="${labelName}" prop="${columnName}">
<el-radio-group v-model="form.${columnName}"> <el-radio-group v-model="form.${columnName}">
<el-radio v-for="item in ${columnName}Options" :key="item.dictValue" :label="${value}">{{item.dictLabel}}</el-radio> <el-radio v-for="item in ${column.DictType}" :key="item.dictValue" :label="${value}">{{item.dictLabel}}</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
</el-col> </el-col>
@ -217,7 +223,7 @@ $elseif(column.HtmlType == "select")
<el-col :lg="12"> <el-col :lg="12">
<el-form-item label="${labelName}" prop="${columnName}"> <el-form-item label="${labelName}" prop="${columnName}">
<el-select v-model="form.${columnName}" placeholder="请选择${labelName}"> <el-select v-model="form.${columnName}" placeholder="请选择${labelName}">
<el-option v-for="item in ${columnName}Options" :key="item.dictValue" :label="item.dictLabel" :value="${value}"></el-option> <el-option v-for="item in ${column.DictType}" :key="item.dictValue" :label="item.dictLabel" :value="${value}"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
@ -225,7 +231,7 @@ $elseif(column.HtmlType == "checkbox")
<el-col :lg="24"> <el-col :lg="24">
<el-form-item label="${labelName}" prop="${columnName}"> <el-form-item label="${labelName}" prop="${columnName}">
<el-checkbox-group v-model="form.${columnName}Checked"> <el-checkbox-group v-model="form.${columnName}Checked">
<el-checkbox v-for="item in ${columnName}Options" :key="item.dictValue" :label="item.dictValue">{{item.dictLabel}}</el-checkbox> <el-checkbox v-for="item in ${column.DictType}" :key="item.dictValue" :label="item.dictValue">{{item.dictLabel}}</el-checkbox>
</el-checkbox-group> </el-checkbox-group>
</el-form-item> </el-form-item>
</el-col> </el-col>
@ -254,13 +260,7 @@ $end
<script setup name="${genTable.BusinessName.ToLower()}"> <script setup name="${genTable.BusinessName.ToLower()}">
import { list${genTable.BusinessName}, add${genTable.BusinessName}, del${genTable.BusinessName}, update${genTable.BusinessName}, get${genTable.BusinessName}, import { list${genTable.BusinessName}, add${genTable.BusinessName}, del${genTable.BusinessName}, update${genTable.BusinessName}, get${genTable.BusinessName},
$if(replaceDto.ShowBtnExport) $if(replaceDto.ShowBtnExport) export${genTable.BusinessName}, $end $if(showCustomInput) changeSort $end } from '@/api/${tool.FirstLowerCase(genTable.ModuleName)}/${genTable.BusinessName.ToLower()}.js'
export${genTable.BusinessName},
$end
$if(showCustomInput)
changeSort
$end
} from '@/api/${tool.FirstLowerCase(genTable.ModuleName)}/${genTable.BusinessName.ToLower()}.js'
const { proxy } = getCurrentInstance() const { proxy } = getCurrentInstance()
// 选中${replaceDto.FistLowerPk}数组数组 // 选中${replaceDto.FistLowerPk}数组数组
@ -315,7 +315,7 @@ const formRef = ref()
$foreach(item in genTable.Columns) $foreach(item in genTable.Columns)
$if((item.HtmlType == "radio" || item.HtmlType == "select" || item.HtmlType == "checkbox")) $if((item.HtmlType == "radio" || item.HtmlType == "select" || item.HtmlType == "checkbox"))
// ${item.ColumnComment}选项列表 格式 eg:{ dictLabel: '标签', dictValue: '0'} // ${item.ColumnComment}选项列表 格式 eg:{ dictLabel: '标签', dictValue: '0'}
const ${item.CsharpFieldFl}Options = ref([]) const ${item.DictType} = ref([])
$elseif(item.HtmlType == "datetime" && item.IsQuery == true) $elseif(item.HtmlType == "datetime" && item.IsQuery == true)
// ${item.ColumnComment}时间范围 // ${item.ColumnComment}时间范围
const dateRange${item.CsharpField} = ref([]) const dateRange${item.CsharpField} = ref([])
@ -353,15 +353,16 @@ $set(index = 0)
var dictParams = [ var dictParams = [
$foreach(item in genTable.Columns) $foreach(item in genTable.Columns)
$if((item.HtmlType == "radio" || item.HtmlType == "select" || item.HtmlType == "checkbox") && item.DictType != "") $if((item.HtmlType == "radio" || item.HtmlType == "select" || item.HtmlType == "checkbox") && item.DictType != "")
{ dictType: "${item.DictType}", columnName: "${item.CsharpFieldFl}Options" }, { dictType: "${item.DictType}" },
$set(index = index + 1) $set(index = index + 1)
$end $end
$end $end
] ]
$if(index > 0) $if(index > 0)
proxy.getDicts(dictParams).then((response) => { proxy.getDicts(dictParams).then((response) => {
response.data.forEach((element) => { response.data.forEach((element) => {
proxy[element.columnName] = element.list proxy[element.dictType] = element.list
}) })
}) })
$end $end

View File

@ -1,10 +1,4 @@
using System; namespace ZR.CodeGenerator
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ZR.CodeGenerator
{ {
public class CodeGenerateOption public class CodeGenerateOption
{ {

View File

@ -38,6 +38,8 @@ namespace ZR.CodeGenerator
_option.ServicesNamespace = _option.BaseNamespace + "Service"; _option.ServicesNamespace = _option.BaseNamespace + "Service";
_option.ApiControllerNamespace = _option.BaseNamespace + "Admin.WebApi"; _option.ApiControllerNamespace = _option.BaseNamespace + "Admin.WebApi";
dto.VueParentPath = dto.VueVersion == 3 ? "ZRAdmin-vue" : "ZR.Vue";
dto.GenOptions = _option; dto.GenOptions = _option;
string PKName = "Id"; string PKName = "Id";
@ -71,16 +73,23 @@ namespace ZR.CodeGenerator
replaceDto.PKType = PKType; replaceDto.PKType = PKType;
replaceDto.FistLowerPk = PKName.FirstLowerCase(); replaceDto.FistLowerPk = PKName.FirstLowerCase();
InitJntTemplate(dto, replaceDto); InitJntTemplate(dto, replaceDto);
replaceDto.VueViewListHtml = GenerateVueTableList();
replaceDto.VueQueryFormHtml = GenerateVueQueryForm();
replaceDto.VueViewFormHtml = GenerateCurdForm();
GenerateModels(replaceDto, dto); GenerateModels(replaceDto, dto);
GenerateRepository(replaceDto, dto); GenerateRepository(replaceDto, dto);
GenerateService(replaceDto, dto); GenerateService(replaceDto, dto);
GenerateControllers(replaceDto, dto); GenerateControllers(replaceDto, dto);
GenerateVueViews(replaceDto, dto); if (dto.VueVersion == 3)
GenerateVue3Views(replaceDto, dto); {
GenerateVue3Views(replaceDto, dto);
}
else
{
replaceDto.VueViewListHtml = GenerateVueTableList();
replaceDto.VueQueryFormHtml = GenerateVueQueryForm();
replaceDto.VueViewFormHtml = GenerateCurdForm();
GenerateVueViews(replaceDto, dto);
}
GenerateVueJs(replaceDto, dto); GenerateVueJs(replaceDto, dto);
GenerateSql(replaceDto, dto); GenerateSql(replaceDto, dto);
@ -88,6 +97,7 @@ namespace ZR.CodeGenerator
foreach (var item in dto.GenCodes) foreach (var item in dto.GenCodes)
{ {
item.Path = Path.Combine(dto.GenCodePath, item.Path);
FileHelper.WriteAndSave(item.Path, item.Content); FileHelper.WriteAndSave(item.Path, item.Content);
} }
} }
@ -104,8 +114,8 @@ namespace ZR.CodeGenerator
var tpl = FileHelper.ReadJtTemplate("TplModel.txt"); var tpl = FileHelper.ReadJtTemplate("TplModel.txt");
var tplDto = FileHelper.ReadJtTemplate("TplDto.txt"); var tplDto = FileHelper.ReadJtTemplate("TplDto.txt");
string fullPath = generateDto.IsPreview ? string.Empty : Path.Combine(generateDto.GenCodePath, _option.ModelsNamespace, "Models", _option.SubNamespace, replaceDto.ModelTypeName + ".cs"); string fullPath = Path.Combine(_option.ModelsNamespace, "Models", _option.SubNamespace, replaceDto.ModelTypeName + ".cs");
string fullPathDto = generateDto.IsPreview ? string.Empty : Path.Combine(generateDto.GenCodePath, _option.ModelsNamespace, "Dto", _option.SubNamespace, $"{replaceDto.ModelTypeName}Dto.cs"); string fullPathDto = Path.Combine(_option.ModelsNamespace, "Dto", _option.SubNamespace, $"{replaceDto.ModelTypeName}Dto.cs");
generateDto.GenCodes.Add(new GenCode(1, "Model.cs", fullPath, tpl.Render())); generateDto.GenCodes.Add(new GenCode(1, "Model.cs", fullPath, tpl.Render()));
generateDto.GenCodes.Add(new GenCode(2, "Dto.cs", fullPathDto, tplDto.Render())); generateDto.GenCodes.Add(new GenCode(2, "Dto.cs", fullPathDto, tplDto.Render()));
@ -120,7 +130,7 @@ namespace ZR.CodeGenerator
{ {
var tpl = FileHelper.ReadJtTemplate("TplRepository.txt"); var tpl = FileHelper.ReadJtTemplate("TplRepository.txt");
var result = tpl.Render(); var result = tpl.Render();
var fullPath = generateDto.IsPreview ? string.Empty : Path.Combine(generateDto.GenCodePath, _option.RepositoriesNamespace, _option.SubNamespace, $"{replaceDto.ModelTypeName}Repository.cs"); var fullPath = Path.Combine(_option.RepositoriesNamespace, _option.SubNamespace, $"{replaceDto.ModelTypeName}Repository.cs");
generateDto.GenCodes.Add(new GenCode(3, "Repository.cs", fullPath, result)); generateDto.GenCodes.Add(new GenCode(3, "Repository.cs", fullPath, result));
} }
@ -135,8 +145,8 @@ namespace ZR.CodeGenerator
var result = tpl.Render(); var result = tpl.Render();
var result2 = tpl2.Render(); var result2 = tpl2.Render();
var fullPath = generateDto.IsPreview ? string.Empty : Path.Combine(generateDto.GenCodePath, _option.ServicesNamespace, _option.SubNamespace, $"{replaceDto.ModelTypeName}Service.cs"); var fullPath = Path.Combine(_option.ServicesNamespace, _option.SubNamespace, $"{replaceDto.ModelTypeName}Service.cs");
var fullPath2 = generateDto.IsPreview ? string.Empty : Path.Combine(generateDto.GenCodePath, _option.IServicsNamespace, _option.SubNamespace, $"I{_option.SubNamespace}Service", $"I{replaceDto.ModelTypeName}Service.cs"); var fullPath2 = Path.Combine(_option.IServicsNamespace, _option.SubNamespace, $"I{_option.SubNamespace}Service", $"I{replaceDto.ModelTypeName}Service.cs");
generateDto.GenCodes.Add(new GenCode(4, "Service.cs", fullPath, result)); generateDto.GenCodes.Add(new GenCode(4, "Service.cs", fullPath, result));
generateDto.GenCodes.Add(new GenCode(4, "IService.cs", fullPath2, result2)); generateDto.GenCodes.Add(new GenCode(4, "IService.cs", fullPath2, result2));
@ -151,7 +161,7 @@ namespace ZR.CodeGenerator
tpl.Set("QueryCondition", replaceDto.QueryCondition); tpl.Set("QueryCondition", replaceDto.QueryCondition);
var result = tpl.Render(); var result = tpl.Render();
var fullPath = generateDto.IsPreview ? string.Empty : Path.Combine(generateDto.GenCodePath, _option.ApiControllerNamespace, "Controllers", _option.SubNamespace, $"{replaceDto.ModelTypeName}Controller.cs"); var fullPath = Path.Combine(_option.ApiControllerNamespace, "Controllers", _option.SubNamespace, $"{replaceDto.ModelTypeName}Controller.cs");
generateDto.GenCodes.Add(new GenCode(5, "Controller.cs", fullPath, result)); generateDto.GenCodes.Add(new GenCode(5, "Controller.cs", fullPath, result));
} }
@ -180,7 +190,7 @@ namespace ZR.CodeGenerator
tpl.Set("VueViewListContent", replaceDto.VueViewListHtml);//查询 table列 tpl.Set("VueViewListContent", replaceDto.VueViewListHtml);//查询 table列
var result = tpl.Render(); var result = tpl.Render();
var fullPath = generateDto.IsPreview ? string.Empty : Path.Combine(generateDto.GenCodePath, "ZR.Vue", "src", "views", generateDto.GenTable.ModuleName.FirstLowerCase(), $"{generateDto.GenTable.BusinessName.FirstUpperCase()}.vue"); var fullPath = Path.Combine(generateDto.VueParentPath, "src", "views", generateDto.GenTable.ModuleName.FirstLowerCase(), $"{generateDto.GenTable.BusinessName.FirstUpperCase()}.vue");
generateDto.GenCodes.Add(new GenCode(6, "index.vue", fullPath, result)); generateDto.GenCodes.Add(new GenCode(6, "index.vue", fullPath, result));
} }
@ -191,29 +201,24 @@ namespace ZR.CodeGenerator
/// <param name="generateDto"></param> /// <param name="generateDto"></param>
private static void GenerateVue3Views(ReplaceDto replaceDto, GenerateDto generateDto) private static void GenerateVue3Views(ReplaceDto replaceDto, GenerateDto generateDto)
{ {
string fileName = string.Empty; string fileName = generateDto.GenTable.TplCategory switch
switch (generateDto.GenTable.TplCategory)
{ {
//case "tree": "tree" => "TreeVue.txt",
// fileName = "TplTreeVue.txt"; "crud" => "Vue.txt",
// break;
case "crud":
fileName = "Vue.txt";
break;
//case "select": //case "select":
// fileName = "TplVueSelect.txt"; // fileName = "TplVueSelect.txt";
// break; // break;
default: _ => "Vue.txt",
fileName = "Vue.txt"; };
break;
}
fileName = Path.Combine("v3", fileName); fileName = Path.Combine("v3", fileName);
var tpl = FileHelper.ReadJtTemplate(fileName); var tpl = FileHelper.ReadJtTemplate(fileName);
tpl.Set("treeCode", generateDto.GenTable?.TreeCode?.ToString()?.FirstLowerCase());
tpl.Set("treeName", generateDto.GenTable.TreeName?.ToString()?.FirstLowerCase());
tpl.Set("treeParentCode", generateDto.GenTable.TreeParentCode?.ToString()?.FirstLowerCase());
var result = tpl.Render(); var result = tpl.Render();
var fullPath = generateDto.IsPreview ? string.Empty : Path.Combine(generateDto.GenCodePath, "ZRAdmin-vue", "src", "views", generateDto.GenTable.ModuleName.FirstLowerCase(), $"{generateDto.GenTable.BusinessName.FirstUpperCase()}.vue"); var fullPath = Path.Combine(generateDto.VueParentPath, "src", "views", generateDto.GenTable.ModuleName.FirstLowerCase(), $"{generateDto.GenTable.BusinessName.FirstUpperCase()}.vue");
//Console.WriteLine(result); generateDto.GenCodes.Add(new GenCode(16, "index.vue", fullPath, result));
generateDto.GenCodes.Add(new GenCode(16, "vue3.vue", fullPath, result));
} }
/// <summary> /// <summary>
/// 生成vue页面api /// 生成vue页面api
@ -226,11 +231,19 @@ namespace ZR.CodeGenerator
var tpl = FileHelper.ReadJtTemplate("TplVueApi.txt"); var tpl = FileHelper.ReadJtTemplate("TplVueApi.txt");
var result = tpl.Render(); var result = tpl.Render();
string fullPath = generateDto.IsPreview ? string.Empty : Path.Combine(generateDto.GenCodePath, "ZR.Vue", "src", "api", generateDto.GenTable.ModuleName.FirstLowerCase(), generateDto.GenTable.BusinessName.FirstUpperCase() + ".js"); string fileName;
if (generateDto.VueVersion == 3)
{
fileName = generateDto.GenTable.BusinessName.ToLower() + ".js";
}
else
{
fileName = generateDto.GenTable.BusinessName.FirstUpperCase() + ".js";
}
string fullPath = Path.Combine(generateDto.VueParentPath, "src", "api", generateDto.GenTable.ModuleName.FirstLowerCase(), fileName);
generateDto.GenCodes.Add(new GenCode(7, "api.js", fullPath, result)); generateDto.GenCodes.Add(new GenCode(7, "api.js", fullPath, result));
string fullPathV3 = generateDto.IsPreview ? string.Empty : Path.Combine(generateDto.GenCodePath, "ZRAdmin-vue", "src", "api", generateDto.GenTable.ModuleName.FirstLowerCase(), generateDto.GenTable.BusinessName.ToLower() + ".js");
generateDto.GenCodes.Add(new GenCode(7, "api.js", fullPathV3, result));
} }
/// <summary> /// <summary>
@ -255,7 +268,7 @@ namespace ZR.CodeGenerator
var tpl = FileHelper.ReadJtTemplate($"{tempName}.txt"); var tpl = FileHelper.ReadJtTemplate($"{tempName}.txt");
tpl.Set("parentId", generateDto.GenTable.ParentMenuId ?? 0); tpl.Set("parentId", generateDto.GenTable.ParentMenuId ?? 0);
var result = tpl.Render(); var result = tpl.Render();
string fullPath = generateDto.IsPreview ? string.Empty : Path.Combine(generateDto.GenCodePath, "sql", generateDto.GenTable.BusinessName + ".sql"); string fullPath = Path.Combine(generateDto.GenCodePath, "sql", generateDto.GenTable.BusinessName + ".sql");
generateDto.GenCodes.Add(new GenCode(8, "sql", fullPath, result)); generateDto.GenCodes.Add(new GenCode(8, "sql", fullPath, result));
} }
@ -278,7 +291,7 @@ namespace ZR.CodeGenerator
{ {
var tpl = FileHelper.ReadJtTemplate("TableList.txt"); var tpl = FileHelper.ReadJtTemplate("TableList.txt");
var result = tpl.Render(); var result = tpl.Render();
//Console.WriteLine(result);
return result; return result;
} }
/// <summary> /// <summary>
@ -289,7 +302,6 @@ namespace ZR.CodeGenerator
{ {
var tpl = FileHelper.ReadJtTemplate("CurdForm.txt"); var tpl = FileHelper.ReadJtTemplate("CurdForm.txt");
var result = tpl.Render(); var result = tpl.Render();
//Console.WriteLine(result);
return result; return result;
} }
#endregion #endregion
@ -339,7 +351,15 @@ namespace ZR.CodeGenerator
/// <returns></returns> /// <returns></returns>
public static string FirstLowerCase(string str) public static string FirstLowerCase(string str)
{ {
return string.IsNullOrEmpty(str) ? str : str.Substring(0, 1).ToLower() + str[1..]; try
{
return string.IsNullOrEmpty(str) ? str : str.Substring(0, 1).ToLower() + str[1..];
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
return "";
}
} }
/// <summary> /// <summary>
@ -493,7 +513,7 @@ namespace ZR.CodeGenerator
/// <param name="replaceDto"></param> /// <param name="replaceDto"></param>
private static void InitJntTemplate(GenerateDto dto, ReplaceDto replaceDto) private static void InitJntTemplate(GenerateDto dto, ReplaceDto replaceDto)
{ {
//Engine.Current.Clean(); Engine.Current.Clean();
dto.GenTable.Columns = dto.GenTable.Columns.OrderBy(x => x.Sort).ToList(); dto.GenTable.Columns = dto.GenTable.Columns.OrderBy(x => x.Sort).ToList();
bool showCustomInput = dto.GenTable.Columns.Any(f => f.HtmlType.Equals(GenConstants.HTML_CUSTOM_INPUT, StringComparison.OrdinalIgnoreCase)); bool showCustomInput = dto.GenTable.Columns.Any(f => f.HtmlType.Equals(GenConstants.HTML_CUSTOM_INPUT, StringComparison.OrdinalIgnoreCase));
//jnt模板引擎全局变量 //jnt模板引擎全局变量

View File

@ -5,6 +5,10 @@ namespace ZR.CodeGenerator.Model
{ {
public class GenerateDto public class GenerateDto
{ {
/// <summary>
/// vue版本
/// </summary>
public int VueVersion { get; set; }
public long TableId { get; set; } public long TableId { get; set; }
/// <summary> /// <summary>
/// 是否预览代码 /// 是否预览代码
@ -28,7 +32,7 @@ namespace ZR.CodeGenerator.Model
/// <summary> /// <summary>
/// 代码生成路径 /// 代码生成路径
/// </summary> /// </summary>
public string GenCodePath { get; set; } public string GenCodePath { get; set; } = string.Empty;
/// <summary> /// <summary>
/// 代码生成压缩包路径 /// 代码生成压缩包路径
/// </summary> /// </summary>
@ -42,6 +46,10 @@ namespace ZR.CodeGenerator.Model
/// </summary> /// </summary>
public string GenType { get; set; } public string GenType { get; set; }
public string GenPath { get; set; } = ""; public string GenPath { get; set; } = "";
/// <summary>
/// vue代码路径
/// </summary>
public string VueParentPath { get; set; }
#endregion #endregion
} }

View File

@ -63,7 +63,7 @@ namespace ZR.Repository.System
/// <returns></returns> /// <returns></returns>
public SysUser SelectUserById(long userId) public SysUser SelectUserById(long userId)
{ {
return Context.Queryable<SysUser>().Where(f => f.UserId == userId).First(); return Context.Queryable<SysUser>().Filter(null, true).Where(f => f.UserId == userId).First();
} }
/// <summary> /// <summary>

View File

@ -68,5 +68,7 @@ namespace ZR.Service.System.IService
/// <param name="dto"></param> /// <param name="dto"></param>
/// <returns></returns> /// <returns></returns>
SysUser Register(RegisterDto dto); SysUser Register(RegisterDto dto);
void CheckUserAllowed(SysUser user);
void CheckUserDataScope(long userid, long loginUserId);
} }
} }

View File

@ -1,5 +1,6 @@
using Infrastructure; using Infrastructure;
using Infrastructure.Attribute; using Infrastructure.Attribute;
using Microsoft.AspNetCore.Http;
using System; using System;
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
@ -144,10 +145,15 @@ namespace ZR.Service
/// <summary> /// <summary>
/// 删除用户 /// 删除用户
/// </summary> /// </summary>
/// <param name="user"></param> /// <param name="userid"></param>
/// <returns></returns> /// <returns></returns>
public int DeleteUser(long userid) public int DeleteUser(long userid)
{ {
CheckUserAllowed(new SysUser() { UserId = userid});
//删除用户与角色关联
UserRoleService.DeleteUserRoleByUserId((int)userid);
// 删除用户与岗位关联
UserPostService.Delete(userid);
return UserRepository.DeleteUser(userid); return UserRepository.DeleteUser(userid);
} }
@ -189,5 +195,31 @@ namespace ZR.Service
return user; return user;
} }
/// <summary>
/// 校验角色是否允许操作
/// </summary>
/// <param name="user"></param>
public void CheckUserAllowed(SysUser user)
{
if (user.IsAdmin())
{
throw new CustomException("不允许操作超级管理员角色");
}
}
/// <summary>
/// 校验用户是否有数据权限
/// </summary>
/// <param name="userid"></param>
/// <param name="loginUserId"></param>
public void CheckUserDataScope(long userid, long loginUserId)
{
if (!SysUser.IsAdmin(loginUserId))
{
SysUser user = new SysUser() { UserId = userid};
//TODO 判断用户是否有数据权限
}
}
} }
} }

View File

@ -63,8 +63,8 @@ export function delMenu(menuId) {
export function changeMenuSort(data) { export function changeMenuSort(data) {
return request({ return request({
url: '/system/Menu/ChangeSort', url: '/system/Menu/ChangeSort',
method: 'post', method: 'get',
data: data params: data
}) })
} }
@ -75,4 +75,4 @@ export const getRouters = (query) => {
method: 'get', method: 'get',
params: query params: query
}) })
} }

View File

@ -425,7 +425,7 @@ export default {
*/ */
handleChangeSort(item) { handleChangeSort(item) {
this.editIndex = -1; this.editIndex = -1;
changeMenuSort({ orderNum: item.orderNum, menuId: item.menuId }).then( changeMenuSort({ value: item.orderNum, id: item.menuId }).then(
(response) => { (response) => {
this.msgSuccess("修改成功"); this.msgSuccess("修改成功");
this.getList(); this.getList();

View File

@ -155,7 +155,6 @@ import {
changeRoleStatus changeRoleStatus
} from '@/api/system/role' } from '@/api/system/role'
import { import {
treeselect as menuTreeselect,
roleMenuTreeselect roleMenuTreeselect
} from '@/api/system/menu' } from '@/api/system/menu'
import { import {
@ -277,12 +276,6 @@ export default {
} }
) )
}, },
/** 查询菜单树结构 */
getMenuTreeselect() {
menuTreeselect().then((response) => {
this.menuOptions = response.data
})
},
/** 查询部门树结构 */ /** 查询部门树结构 */
getDeptTreeselect() { getDeptTreeselect() {
deptTreeselect().then((response) => { deptTreeselect().then((response) => {

View File

@ -248,7 +248,6 @@ INSERT INTO sys_menu VALUES (2, '系统监控', 0, 2, 'monitor', NULL, 0, 0, 'M'
INSERT INTO sys_menu VALUES (3, '系统工具', 0, 3, 'tool', NULL, 0, 0, 'M', '0', '0', '', 'tool', '', SYSDATE(), '', NULL, '系统工具目录'); INSERT INTO sys_menu VALUES (3, '系统工具', 0, 3, 'tool', NULL, 0, 0, 'M', '0', '0', '', 'tool', '', SYSDATE(), '', NULL, '系统工具目录');
INSERT INTO sys_menu VALUES (5, '外部打开', 0, 5, 'http://www.izhaorui.cn', NULL, 1, 0, 'M', '0', '0', '', 'link', '', SYSDATE(), '', NULL, 'Zr官网地址'); INSERT INTO sys_menu VALUES (5, '外部打开', 0, 5, 'http://www.izhaorui.cn', NULL, 1, 0, 'M', '0', '0', '', 'link', '', SYSDATE(), '', NULL, 'Zr官网地址');
INSERT INTO sys_menu VALUES (6, '控制台', 0, 0, 'dashboard', 'index_v1', 0, 0, 'C', '0', '0', '', 'dashboard', '', SYSDATE(), '', NULL, ''); INSERT INTO sys_menu VALUES (6, '控制台', 0, 0, 'dashboard', 'index_v1', 0, 0, 'C', '0', '0', '', 'dashboard', '', SYSDATE(), '', NULL, '');
INSERT INTO sys_menu VALUES (7, '图标icon', 0, 6, 'icon', 'components/icons/index', 0, 0, 'C', '0', '0', NULL, 'icon1', '', SYSDATE(), '', NULL, NULL);
-- 二级菜单 -- 二级菜单
INSERT INTO sys_menu VALUES (100, '用户管理', 1, 1, 'user', 'system/user/index', 0, 0, 'C', '0', '0', 'system:user:list', 'user', '', SYSDATE(), '', NULL, '用户管理菜单'); INSERT INTO sys_menu VALUES (100, '用户管理', 1, 1, 'user', 'system/user/index', 0, 0, 'C', '0', '0', 'system:user:list', 'user', '', SYSDATE(), '', NULL, '用户管理菜单');

View File

@ -226,7 +226,6 @@ INSERT INTO sys_menu(menuId, menuName, parentId, orderNum, path, component, isFr
INSERT INTO sys_menu(menuId, menuName, parentId, orderNum, path, component, isFrame, isCache, menuType, visible, status, perms, icon, create_by,create_time) VALUES (3, '系统工具', 0, 3, 'tool', NULL, 0, 0, 'M', '0', '0', '', 'tool', '', GETDATE()); INSERT INTO sys_menu(menuId, menuName, parentId, orderNum, path, component, isFrame, isCache, menuType, visible, status, perms, icon, create_by,create_time) VALUES (3, '系统工具', 0, 3, 'tool', NULL, 0, 0, 'M', '0', '0', '', 'tool', '', GETDATE());
INSERT INTO sys_menu(menuId, menuName, parentId, orderNum, path, component, isFrame, isCache, menuType, visible, status, perms, icon, create_by,create_time) VALUES (5, '外部打开', 0, 5, 'http://www.izhaorui.cn', NULL, 1, 0, 'M', '0', '0', '', 'link', '', GETDATE()); INSERT INTO sys_menu(menuId, menuName, parentId, orderNum, path, component, isFrame, isCache, menuType, visible, status, perms, icon, create_by,create_time) VALUES (5, '外部打开', 0, 5, 'http://www.izhaorui.cn', NULL, 1, 0, 'M', '0', '0', '', 'link', '', GETDATE());
INSERT INTO sys_menu(menuId, menuName, parentId, orderNum, path, component, isFrame, isCache, menuType, visible, status, perms, icon, create_by,create_time) VALUES (6, '控制台', 0, 0, 'dashboard', 'index_v1', 0, 0, 'C', '0', '0', '', 'dashboard', '', GETDATE()); INSERT INTO sys_menu(menuId, menuName, parentId, orderNum, path, component, isFrame, isCache, menuType, visible, status, perms, icon, create_by,create_time) VALUES (6, '控制台', 0, 0, 'dashboard', 'index_v1', 0, 0, 'C', '0', '0', '', 'dashboard', '', GETDATE());
INSERT INTO sys_menu(menuId, menuName, parentId, orderNum, path, component, isFrame, isCache, menuType, visible, status, perms, icon, create_by,create_time) VALUES (7, '图标icon', 0, 6, 'icon', 'components/icons/index', 0, 0, 'C', '0', '0', NULL, 'icon1', '', GETDATE());
-- 二级菜单 -- 二级菜单
INSERT INTO sys_menu(menuId, menuName, parentId, orderNum, path, component, isFrame, isCache, menuType, visible, status, perms, icon, create_by,create_time) VALUES (100, '用户管理', 1, 1, 'user', 'system/user/index', 0, 0, 'C', '0', '0', 'system:user:list', 'user', '', GETDATE()); INSERT INTO sys_menu(menuId, menuName, parentId, orderNum, path, component, isFrame, isCache, menuType, visible, status, perms, icon, create_by,create_time) VALUES (100, '用户管理', 1, 1, 'user', 'system/user/index', 0, 0, 'C', '0', '0', 'system:user:list', 'user', '', GETDATE());