1.0.16 • Published 1 year ago

icc-cli v1.0.16

Weekly downloads
-
License
ISC
Repository
-
Last release
1 year ago

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