@yorha2b-lab/autodev 2.1.1 → 2.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -49,18 +49,34 @@ jobs:
49
49
  if [ -d "/tmp/bunker_assets/plots" ]; then sudo cp -r /tmp/bunker_assets/plots . ; fi
50
50
  if [ -f "report.md" ]; then sudo mv report.md README.md; fi
51
51
 
52
- # 4. 🔥 核心逻辑:执行全量战绩加和
53
- echo "🤖 Pod 042: 正在执行‘战绩全量加和协议’..."
54
- CSV_FILE="ghrs-data/views_clones_aggregate.csv"
55
- if [ -f "$CSV_FILE" ]; then
56
- # 使用 awk 物理加和第 2 列 (clones_total)
57
- TOTAL_CLONES=$(awk -F',' 'NR>1 {sum+=$2} END {print sum}' "$CSV_FILE")
58
- echo "{\"total_clones\": $TOTAL_CLONES}" > bunker-stats.json
59
- echo "✅ 构筑成功:地堡全时段总克隆数为 $TOTAL_CLONES"
52
+ # 4. 🔥 核心逻辑优化:精准定位 README 中的 Total Clones 累计值
53
+ echo "🤖 Pod 042: 正在执行‘精准数据侦察协议’..."
54
+
55
+ TARGET_FILE="README.md"
56
+ if [ ! -f "$TARGET_FILE" ]; then TARGET_FILE="report.md"; fi
57
+
58
+ if [ -f "$TARGET_FILE" ]; then
59
+ # 💡 精准定位逻辑:
60
+ # 1. 寻找包含 "Total clones" 的行
61
+ # 2. 锁定该行之后的第一个 "Cumulative" 关键字
62
+ # 3. 提取其中的数字
63
+ TOTAL_CLONES=$(awk '/Total clones/{flag=1; next} flag && /Cumulative/{print $0; flag=0}' "$TARGET_FILE" | grep -oE "[0-9]+" | head -n 1 || echo "")
64
+
65
+ if [ ! -z "$TOTAL_CLONES" ] && [ "$TOTAL_CLONES" -gt 0 ]; then
66
+ echo "{\"total_clones\": $TOTAL_CLONES}" > bunker-stats.json
67
+ echo "✅ 成功:已精准定位克隆总数:$TOTAL_CLONES"
68
+ else
69
+ echo "⚠️ 警告:精准提取失败,正在启动 CSV 账本回溯..."
70
+ # 最后的兜底:计算 CSV 的总和
71
+ CSV_FILE="ghrs-data/views_clones_aggregate.csv"
72
+ TOTAL_CLONES=$(awk -F',' 'NR>1 {sum+=$2} END {print sum}' "$CSV_FILE" || echo "0")
73
+ echo "{\"total_clones\": $TOTAL_CLONES}" > bunker-stats.json
74
+ fi
60
75
  else
61
- echo "❌ 严重错误:未发现 CSV 核心文件。" && exit 1
76
+ echo "❌ 严重错误:未发现任何报表文件。"
77
+ exit 1
62
78
  fi
63
-
79
+
64
80
  # 5. 封存推送
65
81
  sudo chown -R runner:docker .
66
82
  git config user.name github-actions
package/bin/autodev.js CHANGED
@@ -58,7 +58,7 @@ program
58
58
  console.log('\n')
59
59
  console.log(chalk.gray('--------------------------------------------------'))
60
60
  console.log(chalk.white(' [System] ') + chalk.yellow(language('正在断开神经云链接,执行数据物理封存...', 'Disconnecting Neural Link, Executing Physical Assembly...')))
61
- matrixEffect(1500)
61
+ matrixEffect(500)
62
62
  })
63
63
  })
64
64
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yorha2b-lab/autodev",
3
- "version": "2.1.1",
3
+ "version": "2.1.3",
4
4
  "description": "基于视觉大模型的前端(react+Antd)全自动 CRUD 代码生成器",
5
5
  "bin": {
6
6
  "autodev": "bin/autodev.js"
@@ -19,8 +19,8 @@ module.exports = async (filePath, context) => {
19
19
 
20
20
  const spinner = ora({
21
21
  text: chalk.cyan(language(
22
- `[System] 视觉传感器捕捉完成: [${fileName}]。正在调配地堡资源进行物理构筑...`,
23
- `[System] Visual sensor captured: [${fileName}]. Allocating Bunker resources for physical construction...`
22
+ `[System] 视觉传感器捕捉完成: [${fileName}]。正在调配地堡资源进行物理构筑...\n`,
23
+ `[System] Visual sensor captured: [${fileName}]. Allocating Bunker resources for physical construction...\n`
24
24
  )),
25
25
  color: 'cyan'
26
26
  }).start()
@@ -46,6 +46,8 @@ const index = ({ config, fileName, indexTpl, pageConfig }) => {
46
46
  const hasTabs = pageConfig.tabs?.length > 0
47
47
  const hasFormItems = pageConfig.formItems?.length > 0
48
48
  const hasOperate = pageConfig.table.operation?.length > 0
49
+ const functionButtons = pageConfig.functionButton?.filter(item => !['查询', '重置'].includes(item.btn)) || []
50
+ const hasFunctionButtons = functionButtons.length > 0
49
51
 
50
52
  let columnsValue = hasTabs ? 'columns[activeKey]' : 'columns'
51
53
  if (hasOperate) {
@@ -58,17 +60,16 @@ const index = ({ config, fileName, indexTpl, pageConfig }) => {
58
60
  hasOperate,
59
61
  columnsValue,
60
62
  hasFormItems,
63
+ functionButtons,
61
64
  tabs: pageConfig.tabs,
62
- pageStruct: pageConfig.pageStruct,
63
65
  responseSuccess: config.responseSuccess,
66
+ hasStaticInfo: pageConfig.staticInfo?.has,
64
67
  hasExpandable: pageConfig.table.expandable,
65
68
  hasPagination: pageConfig.table.pagination,
66
69
  operations: pageConfig.table.operation || [],
67
70
  hasRowSelection: pageConfig.table.rowSelection,
68
- hasStaticInfo: pageConfig.table.staticInfo?.has,
69
- staticInfoText: pageConfig.table.staticInfo?.text,
70
71
  formItems: hasTabs ? 'formItems[activeKey]' : 'formItems',
71
- functionButtons: pageConfig.functionButton?.filter(item => !['查询', '重置'].includes(item.btn)) || []
72
+ pageStruct: hasFunctionButtons ? pageConfig.pageStruct : pageConfig.pageStruct?.filter(item => item !== 'FunctionButtonsBlock'),
72
73
  }
73
74
 
74
75
  if (viewData.hasOperate) {
@@ -79,15 +80,18 @@ const index = ({ config, fileName, indexTpl, pageConfig }) => {
79
80
  Handlebars.registerPartial('MySearchForm', `${fs.readFileSync(path.join(__dirname, '../../templates/react/handlebars/MySearchForm.hbs'), 'utf-8')}\n`)
80
81
  }
81
82
 
83
+ if (hasFunctionButtons) {
84
+ Handlebars.registerPartial('FunctionButtonsBlock', `${fs.readFileSync(path.join(__dirname, '../../templates/react/handlebars/functionButtonsBlock.hbs'), 'utf-8')}\n`)
85
+ }
86
+
82
87
  if (viewData.hasStaticInfo) {
83
- Handlebars.registerPartial('AlertInfo', `{{{{raw}}}}<Alert showIcon title='${pageConfig.table.staticInfo?.text}' type='info' style={{ marginBottom: 16 }} />\n{{{{/raw}}}}`)
88
+ Handlebars.registerPartial('AlertInfo', `{{{{raw}}}}<Alert showIcon title='${pageConfig.staticInfo?.text}' type='info' style={{ marginBottom: 16 }} />\n{{{{/raw}}}}`)
84
89
  }
85
90
 
86
91
  Handlebars.registerPartial('MyTable', `${fs.readFileSync(path.join(__dirname, '../../templates/react/handlebars/MyTable.hbs'), 'utf-8')}\n`)
87
92
  Handlebars.registerPartial('hookBlock', `${fs.readFileSync(path.join(__dirname, '../../templates/react/handlebars/hookBlock.hbs'), 'utf-8')}\n`)
88
93
  Handlebars.registerPartial('stateBlock', `${fs.readFileSync(path.join(__dirname, '../../templates/react/handlebars/stateBlock.hbs'), 'utf-8')}\n`)
89
94
  Handlebars.registerPartial('handleBlock', `${fs.readFileSync(path.join(__dirname, '../../templates/react/handlebars/handleBlock.hbs'), 'utf-8')}\n`)
90
- Handlebars.registerPartial('FunctionButtonsBlock', `${fs.readFileSync(path.join(__dirname, '../../templates/react/handlebars/functionButtonsBlock.hbs'), 'utf-8')}\n`)
91
95
 
92
96
  const bodyCode = indexTpl(viewData)
93
97
  const importsStr = generateSmartImports(bodyCode, hasTabs)
@@ -12,12 +12,13 @@ module.exports = `
12
12
  ⚠️⚠️⚠️注意:
13
13
  如果是下拉框,请加入type:'select',options:_CODE_对应的英文名词Options_CODE_
14
14
  如果是时间范围查询,请加入type:'daterange',name:'对应的英文名词start,对应的英文名词end'
15
- 4.表格:
15
+ 4.统计条:
16
+ staticInfo:{has:true/false,text:'具体统计内容'},
17
+ 5.表格:
16
18
  {
17
19
  pagination: true/false,
18
20
  expandable: true/false,
19
21
  rowSelection: true/false,
20
- staticInfo:{has:true/false,text:''},
21
22
  operation: [{label:'操作',action:'操作动词+ByRecord'}],
22
23
  columns: [{ title: '普通列', dataIndex:'对应的英文名词' }],
23
24
  }
@@ -28,17 +29,17 @@ module.exports = `
28
29
  如果是序号列直接渲染为{ title: '序号',render: _CODE_(_, record, index) => index + 1_CODE_ }
29
30
  如果是下拉框列(所对应的查询项明确是下拉框),请加入render:_CODE_text=>对应的options.find(item=>item.value===text)?.label_CODE_
30
31
  如果列需要过滤请加上filters:[],onFilter: _CODE_(value, record) => record[对应的英文名词].includes(value)_CODE_
31
- 5.功能按钮
32
+ 6.功能按钮
32
33
  functionButton:[{btn:'btn',action:'操作动词+模块英文名词'}]
33
34
  如果和表格行操作重复请在action加上BySelected前缀
34
35
  如果是导出功能,对应的动词为export+对应的英文名词,没有名词则为exportData
35
- 6.下拉选项字典
36
+ 7.下拉选项字典
36
37
  optionDict:{_CODE_对应的英文名词Options_CODE_:[]]}
37
38
  ⚠️⚠️⚠️注意:数组值为对应列展示的内容组成的类似{label:'',value:''}的数组
38
- 7.pageStruct
39
+ 8.pageStruct
39
40
  从上至下的页面结构组成
40
41
  ⚠️⚠️⚠️注意:这里只能从AlertInfo,MySearchForm,FunctionButtonsBlock,MyTable中选择,并且只有真的存在才加入,绝对禁止加入其他组件
41
42
  ⚠️⚠️⚠️另外这里不要加入tabs组件
42
43
  最后输出一个JSON对象,不要包含任何Markdown标签,格式如下
43
- { tabs: [], table: {}, formItems: [], optionDict: {}, functionButton: [],pageStruct:[]}
44
+ { tabs: [], table: {}, formItems: [],staticInfo:{}, optionDict: {}, functionButton: [],pageStruct:[]}
44
45
  `
@@ -1,6 +1,8 @@
1
1
  module.exports = `
2
2
  识别图片页面结构输出一个JSON对象
3
3
 
4
+ 任务模式:请根据图片内容,分别识别搜索表单结构和表格列结构。如果图片包含搜索区,请按Form规则输出;如果包含列表区,请按Table规则输出。
5
+
4
6
  1. 严禁包含任何 Markdown 标签。
5
7
  2. 严禁包含注释或解释文字。
6
8
  3. 必须严格遵守以下字段规范。
@@ -1,5 +1,5 @@
1
1
  import { MyTable } from './MyTable'
2
- import { Modal, Button } from 'antd'
2
+ import { Modal, Space, Button } from 'antd'
3
3
  import { MySearchForm } from './MySearchForm'
4
4
  import { useTableQuery } from '../hooks/useTableQuery'
5
5
 
@@ -22,7 +22,7 @@ export const MyModalTable = ({ api, onOk, title, width, footer, visible, columns
22
22
  return (
23
23
  <Modal centered destroyOnClose title={title} width={width} open={visible} onOk={handleOk} footer={footer} onCancel={() => setModal({ visible: false })}>
24
24
  {formItems?.length > 0 && <MySearchForm search={search} formItems={formItems} setSearch={handleSearch} syncUrlParams={false} />}
25
- {functionButtons?.length > 0 && functionButtons.map(item => <Button key={item.name} type={item.type} onClick={item.onClick}>{item.name}</Button>)}
25
+ {functionButtons?.length > 0 && <Space>{functionButtons.map(item => <Button key={item.name} type={item.type} onClick={item.onClick}>{item.name}</Button>)}</Space>}
26
26
  <MyTable
27
27
  loading={loading}
28
28
  columns={columns}
@@ -45,11 +45,12 @@ export const timeRender = ({ time, date, minute }) => {
45
45
  }
46
46
  }
47
47
 
48
- export const exportDataToExcel = async (url, options, columns, fileName, resultKey = 'data') => {
48
+ export const exportDataToExcel = async (url, options, columns, fileName, formatter) => {
49
49
  /* const response = await request(url, options)
50
- if (response?.[resultKey]?.length > 0) {
50
+ const result = formatter ? formatter(response) : (response?.data ?? [])
51
+ if (result?.length > 0) {
51
52
  const XLSX = require('xlsx')
52
- const datas = response?.[resultKey]?.map(item => Object.fromEntries(columns.map(col => {
53
+ const datas = result.map(item => Object.fromEntries(columns.map(col => {
53
54
  let value = item[col.dataIndex]
54
55
  if (col.exportRender) {
55
56
  value = col.exportRender(value, item)