1.0.17 • Published 1 year ago
icc-cli v1.0.17
icc-cli
icc-cli 是基于vue封装的脚手架
初始化项目
icc init 【objectName】创建模块
icc createpage 【moduleName】编译指定模块
icc build 【moduleName】编译全部模块
icc build发布代码到服务器
项目发布命令
icc deploy 【serve】生成swagger api文件
生成swagger api文件命令
icc apiGenerate代码发布需要在项目根目录创建icc.config.js 配置文件,配置文件如下所示
function resolve(dir) {
return require('path').join(process.cwd(), dir)
}
module.exports = {
// 每个模块的公共资源引用
cdn: [
{
type: 'js',
src: 'public/js/plugins.js'
},
{
type: 'css',
src: 'public/common.css'
}],
externals: {
vue: 'Vue'
},
// 项目运行的端口
port:3000,
// 项目的反向代理
proxy: {
'/api': {
target: 'http://0.0.0.0:80',
pathRewrite:{
'^/api':''
},
changeOrigin: true,
logLevel:'info'
},
},
// webpack 的别名配置
alias: {
'vue$': 'vue/dist/vue.esm.js',
'@': resolve('src'),
'@c': resolve('src/components'),
'@common': resolve('src/common'),
'@mixins': resolve('src/common/mixins'),
'@store': resolve('src/store'),
'@api': resolve('src/api')
},
// swagger api 生成
apiGenerate: {
serverName: {
swagger: '', //swagger 服务地址
template: 'axios',// 默认模板 支持axios umi-request 传入自定义模板该选项可不配置
apiTemplate: './api.ejs',//自定义生成的模板 在项目根目录创建api.ejs 模板文件
// importText: ``,
typescript: false,//是否生成ts
outputDir: 'src/service/serverName'// 生成api文件的路径
}
},
// 发布服务器配置
deploy:{
serveName:'online',//默认要发布的服务器
serveConfig:{
online:{
host: '0.0.0.0',//服务器连接地址
port: 22,//服务器端口
username: 'root',//服务器连接用户名
password: '******',//服务器连接密码
distPath: 'dist',// 要发送的代码包本地目录,可以是绝对路径,也可以是相对路径
remoteBuildPath:'/opt/deployTest/html',// 远程服务器部署路径(最终Nginx指定要访问的路径)
remoteCodePath: '/opt/deployTest/back',// 临时存放代码路径
buildScript: 'npm run build'//项目打包的npm命令
}
}
},
// 项目开发时启动的模块
dev_modules: [
'index',
'login',
'workbench',
]
}自定义模板的的格式
<%_ if(importText !== '') { -%>
<%- importText %>
<%_ } else { -%>
import HttpRequest from '@common/libs/axios'
const ajax = new HttpRequest(`<%- basePath %>`)
const axios = ajax.request
<%_ } -%>
<%_ if(typescript) { -%>
import {
<%_ deps.forEach((dep) => { -%>
<%- dep %>,
<%_ }); -%>
} from './typings';
<%_ } -%>
<% apis.forEach((api) => { %>
/**
* @method <%- api.name %>
<%_ if(api.request.filter.path.length !== 0||api.request.urlText.indexOf('pathVars')!==-1) { -%>* @param {Object} pathVars
<%_ api.request.filter.path.forEach((param) => { -%>
* @param {<%- param.type %>} pathVars.<%- param.name %> <%- param.description %>
<%_ }); -%>
<%_ } -%>
<%_ if(api.request.filter.query.length !== 0) { -%>* @param {Object} params
<%_ api.request.filter.query.forEach((param) => { -%>
* @param {<%- param.type %>} params.<%- param.name %> <%- param.description %>
<%_ }); -%>
<%_ } -%>
<%_ if(api.request.filter.body.length !== 0) { -%>* @param {Object} data
<%_ api.request.filter.body.forEach((param) => { -%>
* @param {<%- param.type %>} data.<%- param.name %> <%- param.description %>
<%_ }); -%>
<%_ } -%>
* @description <%- api.description %> <%- api.request.method %> <%- api.request.url %>
*/
export async function <%- api.name %> (
<%_ if(api.request.filter.path.length !== 0||api.request.urlText.indexOf('pathVars')!==-1) { -%>
pathVars<%_ if(typescript) { -%>: {
<%_ api.request.filter.path.forEach((param) => { -%>
<%- param.name %><% if(!param.required) { %>?<% } %>: <%- param.type %>; // <%- param.description %>
<%_ }); -%>
}<%_ } -%>,
<%_ } -%>
<%_ if(api.request.filter.query.length !== 0) { -%>
params<%_ if(typescript) { -%>: {
<%_ api.request.filter.query.forEach((param) => { -%>
<%- param.name %><% if(!param.required) { %>?<% } %>: <%- param.type %>; // <%- param.description %>
<%_ }); -%>
}<%_ } -%>,
<%_ } -%>
<%_ if(api.request.filter.body.length !== 0) { -%>
data<%_ if(typescript) { -%>: {
<%_ api.request.filter.body.forEach((param) => { -%>
<%- param.name %><% if(!param.required) { %>?<% } %>: <%- param.type %>; // <%- param.description %>
<%_ }); -%>
}<%_ } -%>,
<%_ } -%>
<%_ if(api.request.filter.formdata.length !== 0) { -%>
body<%_ if(typescript) { -%>: {
<%_ api.request.filter.formdata.forEach((param) => { -%>
<%- param.name %><% if(!param.required) { %>?<% } %>: <%- param.type %>; // <%- param.description %>
<%_ }); -%>
}<%_ } -%>,
<%_ } -%>
options<%_ if(typescript) { -%>?: Record<string, any><%_ } -%>,
)<%_ if(typescript) { -%>: Promise<<%- api.response.type %>><%_ } -%> {
return axios({
method: '<%- api.request.method %>',
url: `<%- api.request.urlText %>`,
<%_ if(api.request.filter.query.length !== 0) { -%>
params: {
...params,
},
<%_ } -%>
<%_ if(api.request.filter.body.length !== 0) { -%>
data: {
...data,
},
<%_ } -%>
<%_ if(api.request.filter.formdata.length !== 0) { -%>
headers: { 'content-type': 'application/x-www-form-urlencoded' },
data: {
...data,
},
<%_ } -%>
...(options || {}),
})
}
<%_ }); -%>模板文件 ejs 数据源apiData 数据格式说明
export interface types {
// 是否是泛型
isGenerics: boolean,
// ts interface type name
name: string,
// 枚举
enum: [],
//
params: Array<{
// 是否是泛型
isGenerics: boolean,
// 字段名称
name: string,
// 字段类型
type: string,
// 字段描述
description: string,
// 是否必须
required: boolean
}>
}
export interface apis {
// 对应后端 controller 的名称
tag: string,
// 后端的接口方法名称 可以用作javascript方法名称
name: string,
// 当前接口的描述信息
description: string
// 接口的请求体数据
request: {
// 接口请求地址
url: string,
// 地址有路径 path 参数 处理后的接口地址
urlText: string,
// 接口请求方式
method: 'GET' | 'POST' | 'PUT' | 'DELETE',
params: Array<{
in: string,
name: string,
type: string,
description: string,
required: boolean
}>,
// 接口参数
filter:{
// 路径参数集合
path:Array<{
in: string,
name: string,
type: string,
description: string,
required: string
}>,
// url 参数集合
query:Array<{
in: string,
name: string,
type: string,
description: string,
required: string
}>,
// jsonData 参数集合
body:Array<{
in: string,
name: string,
type: string,
description: string,
required: string
}>,
// formdata 参数集合
formdata:Array<{
in: string,
name: string,
type: string,
description: string,
required: string
}>
}
},
// 接口响应返回数据对应类型
response: {
// 对应types中 name === type 的数据
type: string
}
}
export interface apiData {
host: string,
// 接口地址的前缀路径 默认是swagger的basePath 在生成配置中配置了就取配置文件中的basePath
basePath: String,
// 接口类型数据
types: Array<types>,
// 后端接口 controller 文件内的所有接口数据
apis: Array<apis>
}