Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 1a4f76d878 | |||
| f3726f0810 | |||
| 300b15aa9f |
@@ -0,0 +1,66 @@
|
||||
# ── 依赖 ──────────────────────────────────────────
|
||||
node_modules/
|
||||
|
||||
# ── 构建产物 ──────────────────────────────────────
|
||||
dist/
|
||||
dist-ssr/
|
||||
build/
|
||||
*.tsbuildinfo
|
||||
|
||||
# ── 环境变量(含密钥,勿提交)──────────────────────
|
||||
.env
|
||||
.env.*
|
||||
!.env.example
|
||||
|
||||
# ── 日志 ──────────────────────────────────────────
|
||||
logs/
|
||||
*.log
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
pnpm-debug.log*
|
||||
lerna-debug.log*
|
||||
|
||||
# ── 测试 / 覆盖率 ─────────────────────────────────
|
||||
coverage/
|
||||
/cypress/videos/
|
||||
/cypress/screenshots/
|
||||
|
||||
# ── Tauri / Rust ──────────────────────────────────
|
||||
src-tauri/target/
|
||||
src-tauri/gen/schemas/
|
||||
|
||||
# ── 移动端 / 本地 SDK(体积大,本机路径)──────────
|
||||
NDK/
|
||||
|
||||
# ── 系统文件 ──────────────────────────────────────
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
Desktop.ini
|
||||
|
||||
# ── 编辑器 / IDE ──────────────────────────────────
|
||||
.vscode/*
|
||||
!.vscode/extensions.json
|
||||
.idea/
|
||||
*.suo
|
||||
*.ntvs*
|
||||
*.njsproj
|
||||
*.sln
|
||||
*.sw?
|
||||
|
||||
# ── Cursor / AI 本地缓存 ───────────────────────────
|
||||
.cursor/
|
||||
|
||||
# ── 密钥与证书 ────────────────────────────────────
|
||||
*.pem
|
||||
*.p12
|
||||
*.key
|
||||
*.keystore
|
||||
credentials.json
|
||||
secrets.json
|
||||
|
||||
# ── 临时文件 ──────────────────────────────────────
|
||||
*.local
|
||||
*.tmp
|
||||
*.temp
|
||||
.cache/
|
||||
@@ -1,3 +1,16 @@
|
||||
# weihai_erp
|
||||
|
||||
威海项目
|
||||
威海项目 ERP 前端(Vue 3 + Vite + Tauri)
|
||||
|
||||
## 开发
|
||||
|
||||
```sh
|
||||
npm install
|
||||
npm run dev
|
||||
npm run build
|
||||
```
|
||||
|
||||
## 变更记录
|
||||
|
||||
- **应用内「更新说明」弹层:** [`src/data/appChangelog.js`](src/data/appChangelog.js)
|
||||
- **多维表技术长文:** [`docs/多维表格(MDT)_改动纪要.md`](docs/多维表格(MDT)_改动纪要.md)
|
||||
|
||||
@@ -0,0 +1,107 @@
|
||||
# 多维表格(MDT)改动纪要
|
||||
|
||||
面向产品/联调:本节为多维表与 **配置保存 → 多维表衍生回写** 的技术长文。**按日变更摘录**以仓库根目录 **`PROJECT_OVERVIEW.md` →「8. showtime_weihai」** 为准(与 `src/data/appChangelog.js` 对齐);本文件写实现细节与沿革,避免与总览表格完全重复。
|
||||
|
||||
---
|
||||
|
||||
## 1. 数据源 listed 与请求策略
|
||||
|
||||
| 项 | 说明 |
|
||||
|----|------|
|
||||
| 共用模块 | `src/views/material/mdt/dsListedApi.js`:白名单映射 `oa_bank`、`oa_config`、`oa_led`(ledger)等,未命中时 **`oa_<x>` → `/api/<x>/listed`** 回退。 |
|
||||
| 主视图 | `MultiDimensionalTable.vue`:`getListedApiForDsTable` 从上述模块导入,避免与各处的 listed 路由分叉。 |
|
||||
| 去重 | `POST /api/excel/dynamic/data_source/listed` 成功后记 `dataSourcesListedLoaded`,并用 inflight Promise 合并并发调用。 |
|
||||
| 并行 | 关联列 / 数据源列的 `runRefreshLinkDisplayMap` 内对 `fetchLinkDisplay`、`fetchDsDisplay` 使用 `Promise.all`。 |
|
||||
| 预取 | `prefetchSideSheetCaches` 对侧表预取并行;`ensureLookupTable` 对同一 `target` 用 Map 合并进行中的请求。 |
|
||||
|
||||
---
|
||||
|
||||
## 2. LinkPicker(关联记录 / 数据源选择弹窗)
|
||||
|
||||
| 项 | 说明 |
|
||||
|----|------|
|
||||
| 解析模块 | `src/views/material/mdt/pickerFieldResolve.js`:`resolvePickerDynLabel` 等对动态表 **`cells`** 按列类型递归解析(查找引用、关联、数据源、单多选等),与主表网格侧语义对齐。 |
|
||||
| 预热 | `warmupPickerResolveContext`:对列中出现的 `table:` / `ds:` 及直接查表目标做 **BFS**,并合并各层列定义中出现的 **数据源** 以拉 listed 构建 `dsMapsByTarget`。 |
|
||||
| 动态表判定 | `linkTarget` 规范化(如 `Table:` → `table:`);仅凭「行内有 `cells` + 已有列定义」也会走格子解析路径,避免误用扁平行而退化为 `row.id`。 |
|
||||
| 可读标题兜底 | 配置列解析结果为内部 id 时,尝试扫描同类列推断可读文案;占位行号 `#1`、`#2` 等兜底。 |
|
||||
| 加载 UX | `element-loading-text="正在加载可选记录…"`。 |
|
||||
| 刷新 | `pickerViewEpoch` + 列表 `:key`,预热完成后强制刷新列表与已选 chips。 |
|
||||
| **写回常量不出现在候选列表(2026-05-10)** | 目标为 `oa_config` 时,合并 listed 后 **`filter` 掉** `desc` 命中 `isOaConfigDescFromMdtWriteback` 的行(与多维表 `formatOaConstWriteDesc` 文案一致:`来自多维表格「…」· 列「…」`),防止「表写回的常量」在弹窗再次被关联。实现:`oaConfigListedMerge.js`(`OA_CONFIG_DESC_FROM_MDT_SUFFIX_RE`)、`LinkPicker.vue`。 |
|
||||
|
||||
---
|
||||
|
||||
## 3. 查找引用与关联列的体验与样式
|
||||
|
||||
| 项 | 说明 |
|
||||
|----|------|
|
||||
| 查找引用占位 | 无解析结果时:**「—」+ 「无引用数据」**(小字);整格占位使用 `cell-lookup-placeholder-row`(深灰、`font-style: normal`,与默认浅灰斜体计算列区分)。 |
|
||||
| 悬停说明 | `buildLookupFailureExplanation` / `getLookupCellTooltip` 用词改为白话(避免「对方表」「该行无录入」等偏开发措辞)。 |
|
||||
| 关联列 | 标签可带 `title`;有 PK 但尚未解析出可读 tag 时的加载/失败提示文案。 |
|
||||
|
||||
---
|
||||
|
||||
## 4. 涉及文件一览(数据源于传播与多维表 UX 的早期迭代)
|
||||
|
||||
- `src/views/material/MultiDimensionalTable.vue`
|
||||
- `src/views/material/mdt/LinkPicker.vue`
|
||||
- `src/views/material/mdt/pickerFieldResolve.js`(新增)
|
||||
- `src/views/material/mdt/dsListedApi.js`(新增)
|
||||
|
||||
---
|
||||
|
||||
## 5. 衍生常量传播 · 上游索引(减轻全表 view)
|
||||
|
||||
保存配置项或多维表格子写回常量后,`oaConstWritePropagation.js` 会按合并后的 `oa_config` listed 去多维表里找「漂移」并调用 `/api/config/set`。**冷启动仍会逐表 view**,之后便依赖客户端缓存尽量 **少 view**。
|
||||
|
||||
| 项 | 说明 |
|
||||
|----|------|
|
||||
| 静态依赖 | `mdtConstUpstreamDeps.js`:`computeMdtUpstreamScanHint(columns, rows)` 从 **`oaConstWrite` / `oa_const_write`** 绑定列推断:公式链上的 `ds:oa_config` 格内 PK → Pinia 同款 **sig**;数字列写回 / 链上出现 lookup·link → 该表 **scanAll(保守)**;无任何绑定 → **noDeps**。 |
|
||||
| 持久化索引 | `mdtUpstreamIndexCache.js`:`localStorage` **`mdt_const_upstream_idx_v1`**;`upsert` / `shouldScanTableForConfigPatch(excel_code, patchSig)`。传播循环里:**无索引或应扫时才 view**;每次 view 后对应该表 **`upsert` hint**。 |
|
||||
| 表格侧回填 | `MultiDimensionalTable.vue`:换表 **`loadContent`**、**保存成功** 后对本表 **`upsert`**,保证用户在 MDT 里改绑定/公式后索引不陈旧。**从未在本机打开过的表**只能靠传播首轮 view 写入索引。 |
|
||||
| 补丁 sig | `configConstantSig(classify_code, key)`,`patchSig` 空时仍可依赖索引 **跳过 noDeps**,避免无写回表的无效请求。 |
|
||||
| 演进 | 未做服务端依赖索引;日后订单/长连接可替换或补强。 |
|
||||
|
||||
**涉及文件**:`oaConstWritePropagation.js`、`mdtConstUpstreamDeps.js`、`mdtUpstreamIndexCache.js`、`MultiDimensionalTable.vue`。
|
||||
|
||||
---
|
||||
|
||||
## 6. 配置项管理:`loadCfg` 时机与进行中提示(`ConfigManage.vue`)
|
||||
|
||||
| 项 | 说明 |
|
||||
|----|------|
|
||||
| 二次拉列表 | 保存:`/api/config/set` 成功 → **第一次 `loadCfg`** → `propagateMdtDependentConstants`(可能二次 `config/set`)→ **再一次 `loadCfg`**,避免首拉早于衍生落库。 |
|
||||
| 橘色常驻提示 | 第一次 `loadCfg` 后到传播结束前:`ElMessage.warning`、`duration: 0`(口语文案,示意「顺带算多维表里绑定的」);**`finally` 里 `close`**,再出现绿色的「已按多维表公式同步 N 项…」。 |
|
||||
|
||||
---
|
||||
|
||||
## 7. 已知产品差异(尚未在本迭代落地)
|
||||
|
||||
### 常量 / 「常量信息」数据源(`oa_config`)
|
||||
|
||||
- 接口 `POST /api/excel/dynamic/data_source/listed` 中 **`table: oa_config`**,下拉展示一般为 **「常量信息」**。
|
||||
- 「配置项管理」(`ConfigManage.vue` / 菜单「常量管理」)业务流程为:**一级分类 → 子分类 → `/api/config/listed`(带 `classify_code`)→ 每条配置的 `key` / `value` / `desc`**。
|
||||
- 当前多维表「数据源选择」对 `oa_config` 仍走通用 **扁平 listed +「展示字段」**,与后台分类层级 **不完全同构**;若要「先分类再选常量」,需单独产品方案与前端交互(及部分存盘结构设计,例如 `classify_code + key`),**记入本文档备忘,后续专项做**。
|
||||
|
||||
---
|
||||
|
||||
## 8. 配置项管理卡片:多维表 desc 分行与阴影
|
||||
|
||||
- 多维表写回常量时 `desc` 形态为 **`来自多维表格「表名」· 列「列标题」`**(见 `MultiDimensionalTable.vue` 中 `formatOaConstWriteDesc`)。
|
||||
- `ConfigManage.vue` 若匹配该形态,将 **表来源** 与 **`· 列「列名」`** 拆成两行,放在 **Key/Value 与底栏之间的 flex 伸展区**内:同行卡片 **栅格 stretch 等高**;多维表两行用 **`justify-content: space-between`** 把列名行贴在底栏分割线上方,**不依赖再堆一行撑高整卡**;单行 `desc` 仍在区顶,余下空白由 flex 填充。栅格显式 **`column-gap` / `row-gap`**,子卡 **勿设 `width:100%` 顶破轨道** 以免叠层。
|
||||
|
||||
---
|
||||
|
||||
## 9. 删除常量/删列确认与格内失效展示(2026-05-10)
|
||||
|
||||
| 项 | 说明 |
|
||||
|----|------|
|
||||
| 配置项删除 | `ConfigManage.vue`:删除前明示页签/物料/多维表可能仍引用、**不自动修改引用**;取消单独捕获。多维表写回的占位项仍禁止在此删除(既有逻辑)。 |
|
||||
| 删除列 | `MultiDimensionalTable.vue`:`columnDeleteTouchesOaConst`——列为 **`ds:oa_config`**,或数字/公式列且存在 **`oaConstWrite`** 绑定——删列确认追加文案。 |
|
||||
| 后台已删常量、格内 PK 仍在 | `resolveDsCell` 无记录时返回 **空串**;格内仍有 PK 时常 **仍渲染数据源外壳、主展示区为空**。 |
|
||||
|
||||
---
|
||||
|
||||
## 10. 维护说明
|
||||
|
||||
- **按日摘录**:根目录 **`PROJECT_OVERVIEW.md`** → **「8. showtime_weihai」**;应用内弹出层 **`src/data/appChangelog.js`** 与总览对齐。
|
||||
- 修改本纪要、changelog 或总览后,生产环境需重新 **build** 方可生效。
|
||||
@@ -0,0 +1,45 @@
|
||||
# 组织管理 · 关联物料分类
|
||||
|
||||
面向联调/产品:编辑组织弹窗右侧「关联物料分类」的实现说明。与 **应用内更新说明**(`src/data/appChangelog.js`)及根目录 **`PROJECT_OVERVIEW.md` →「8. showtime_weihai」** 同日(2026-05-10)条目对齐。
|
||||
|
||||
---
|
||||
|
||||
## 1. 接口约定
|
||||
|
||||
| 用途 | 方法 | 路径 | Body 要点 |
|
||||
|------|------|------|-----------|
|
||||
| 当前组织已关联的物料分类 | POST | `/api/company/category_listed` | `{ company_code }` |
|
||||
| 新增关联 | POST | `/api/company/link_category` | `{ company_code, category_code }` |
|
||||
| 解除关联 | POST | `/api/company/unlink_category` | `{ company_code, category_code }` |
|
||||
| 全量物料分类树(勾选用 + 路径索引) | POST | `/api/category/listed` | `{}` |
|
||||
|
||||
响应解析:关联列表兼容 `data` 为数组或 `list` / `rows` / `categories` 等字段;分类树与物料分类页一致,节点映射为 `id`(`category_code`)、`label`、`children`。
|
||||
|
||||
---
|
||||
|
||||
## 2. 交互流程
|
||||
|
||||
1. **编辑组织**(已有 `company_code`):打开弹窗后请求 `category_listed`,并行请求 `category/listed` 构建 **code →「父 / 子 / …」** 路径表;列表每项上方展示灰色路径行,下方为名称与编码。
|
||||
2. **新建组织**:无组织编码,右侧仅说明文案,不调列表与维护接口。
|
||||
3. **管理关联**:点击「管理关联」加载树,预勾选当前已关联节点;用户勾选/取消勾选后点「确认」,与进入管理时的勾选快照 diff,分别调用 `link_category`、`unlink_category`。
|
||||
4. **加载文案**:列表与树加载态为「加载中」;提交关联过程遮罩为 **「关联中」**。
|
||||
5. **说明文案**:标题行右侧橘色小字提示进入管理后勾选 / 取消勾选与确认的含义(无编辑权限时仍可看到说明,可无按钮)。
|
||||
|
||||
---
|
||||
|
||||
## 3. 布局与样式(OrgManage.vue)
|
||||
|
||||
- 弹窗宽度约 **1200px**;`el-dialog__body` **固定高度**(`min(68vh, 720px)`),避免树数据加载后整窗被撑高。
|
||||
- 左侧表单区、右侧关联区 **内部纵向滚动**;分类票据双列、关联列表与树区域 **禁止横向滚动条**(树标签省略号截断)。
|
||||
- 右侧虚线容器内:列表模式与管理模式(搜索 + 树 + 取消/确认)切换,高度在固定窗体内分配。
|
||||
|
||||
---
|
||||
|
||||
## 4. 代码位置
|
||||
|
||||
| 项 | 路径 |
|
||||
|----|------|
|
||||
| 页面 | `src/views/base/OrgManage.vue` |
|
||||
| 权限 | `usePagePower('company')`,`canUpdate` 控制「管理关联」按钮 |
|
||||
|
||||
同名能力(**部门 `dept_code`**、页签入口)见 **`docs/部门管理_关联物料分类.md`**。
|
||||
@@ -0,0 +1,44 @@
|
||||
# 部门管理 · 关联物料分类
|
||||
|
||||
面向联调/产品:**部门管理** 右侧顶栏页签 **「关联物料分类」** 的实现说明。交互与 **组织管理** 弹窗内「关联物料分类」一致(已关联列表、路径行、「管理关联」全树勾选、确认 diff 保存),差异在于主键为 **部门 `dept_code`**、入口为页签而非弹窗侧栏。与 **应用内更新说明**(`src/data/appChangelog.js`)**2026-05-10** 条目对齐(与 `docs/组织管理_关联物料分类.md` 同日)。
|
||||
|
||||
---
|
||||
|
||||
## 1. 接口约定
|
||||
|
||||
| 用途 | 方法 | 路径 | Body 要点 |
|
||||
|------|------|------|-----------|
|
||||
| 当前部门已关联的物料分类 | POST | `/api/dept/category_listed` | `{ dept_code }` |
|
||||
| 新增关联 | POST | `/api/dept/link_category` | `{ dept_code, category_code }` |
|
||||
| 解除关联 | POST | `/api/dept/unlink_category` | `{ dept_code, category_code }` |
|
||||
| 全量物料分类树(勾选用 + 路径索引) | POST | `/api/category/listed` | `{}` |
|
||||
|
||||
响应解析:关联列表兼容 `data` 为数组,或对象内 `list` / `rows` / `categories` / `data` 等字段;分类树与组织侧一致,节点映射为 `id`(`category_code`)、`label`、`children`。
|
||||
|
||||
---
|
||||
|
||||
## 2. 交互流程
|
||||
|
||||
1. **选择部门**:左侧部门树选中节点后,若当前页签为 **「关联物料分类」**,请求 `category_listed`(`dept_code`),并行请求 `category/listed` 构建 **code →「父 / 子 / …」** 路径表;列表项上方为灰色路径行,下方为名称与编码。
|
||||
2. **未选部门**:右侧工作区提示先选部门,不调列表与维护接口。
|
||||
3. **切换页签**:切回「角色列表」时退出物料分类管理态(取消编辑中的树);切至「关联物料分类」且已有选中部门时刷新已关联列表。
|
||||
4. **切换部门**:在「关联物料分类」下更换部门时退出管理态并重新拉取该部门的关联列表。
|
||||
5. **管理关联**:点击「管理关联」加载树,预勾选当前已关联节点;勾选/取消后点「确认」,与进入管理时的快照 diff,分别调用 `link_category`、`unlink_category`。
|
||||
6. **加载文案**:列表与树加载态为「加载中」;提交关联过程遮罩为 **「关联中」**。
|
||||
7. **权限**:`usePagePower('dept')`,`canUpdate` 控制「管理关联」按钮(无编辑权限时仍可看到橘色说明文案)。
|
||||
|
||||
---
|
||||
|
||||
## 3. 布局与样式(DeptManage.vue)
|
||||
|
||||
- 右侧 **`dept-right-stack`**:顶栏 **「角色列表 | 关联物料分类」**,下方整块切换;**不** 把页签放在左侧部门栏。
|
||||
- 「关联物料分类」:`dept-mc-workspace` 占满页签下方区域;有部门时为虚线框 **`dept-mc-bordered`** 包一层,内层 **`dept-mc-panel`** 与组织侧 `org-mc-*` 规则对齐(列表滚动区、管理态搜索 + 树 + 取消/确认;树标签省略、内部纵向滚动)。
|
||||
|
||||
---
|
||||
|
||||
## 4. 代码与文档对照
|
||||
|
||||
| 项 | 路径 |
|
||||
|----|------|
|
||||
| 页面 | `src/views/base/DeptManage.vue` |
|
||||
| 类似实现(组织 + `company_code`) | `src/views/base/OrgManage.vue`、`docs/组织管理_关联物料分类.md` |
|
||||
@@ -0,0 +1,25 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<link rel="icon" type="image/png" href="%BASE_URL%favicon.png" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<link rel="preload" as="image" href="%BASE_URL%map.webp" type="image/webp" />
|
||||
<title></title>
|
||||
<script>
|
||||
// 必须在所有 JS 模块加载前运行,否则 loglevel 会缓存原始 console 引用
|
||||
// 屏蔽 OpenIM SDK 内部 "SDK =>" 调试日志
|
||||
;(function () {
|
||||
var _filter = function (a) { return typeof a === 'string' && a.startsWith('SDK =>') }
|
||||
;['log', 'info', 'debug', 'trace'].forEach(function (m) {
|
||||
var orig = console[m].bind(console)
|
||||
console[m] = function () { if (!_filter(arguments[0])) orig.apply(console, arguments) }
|
||||
})
|
||||
})()
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="app"></div>
|
||||
<script type="module" src="/src/main.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"baseUrl": ".",
|
||||
"paths": {
|
||||
"@/*": ["./src/*"]
|
||||
},
|
||||
"target": "es2020",
|
||||
"module": "esnext",
|
||||
"moduleResolution": "node",
|
||||
"jsx": "preserve",
|
||||
"strict": true,
|
||||
"allowJs": true,
|
||||
"skipLibCheck": true,
|
||||
"esModuleInterop": true,
|
||||
"resolveJsonModule": true,
|
||||
"allowSyntheticDefaultImports": true,
|
||||
"lib": ["esnext", "dom", "dom.iterable", "scripthost"]
|
||||
},
|
||||
"include": [
|
||||
"src/**/*.js",
|
||||
"src/**/*.vue",
|
||||
"src/**/*.json"
|
||||
],
|
||||
"exclude": [
|
||||
"node_modules",
|
||||
"dist"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
import VabCard from './index.vue'
|
||||
|
||||
VabCard.install = function(app) {
|
||||
app.component(VabCard.name, VabCard)
|
||||
}
|
||||
|
||||
export default VabCard
|
||||
@@ -0,0 +1,81 @@
|
||||
<template>
|
||||
<el-card :body-class="props.bodyClass" :body-style="props.bodyStyle" :class="['vab-card', $attrs.class]" :shadow="props.shadow">
|
||||
<template v-if="$slots.header || props.title" #header>
|
||||
<slot v-if="$slots.header" name="header"></slot>
|
||||
<template v-else>{{ props.title }}</template>
|
||||
</template>
|
||||
<el-skeleton v-if="props.skeleton" animated :loading="skeletonShow" :rows="props.skeletonRows">
|
||||
<template #default>
|
||||
<slot></slot>
|
||||
</template>
|
||||
</el-skeleton>
|
||||
<slot v-else></slot>
|
||||
<template v-if="$slots.footer" #footer>
|
||||
<slot name="footer"></slot>
|
||||
</template>
|
||||
</el-card>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref, onBeforeUnmount } from 'vue'
|
||||
import { ElCard } from 'element-plus'
|
||||
|
||||
// 定义组件名称
|
||||
defineOptions({
|
||||
name: 'VabCard',
|
||||
})
|
||||
|
||||
// 定义 props
|
||||
const props = defineProps({
|
||||
...ElCard.props,
|
||||
shadow: {
|
||||
type: String,
|
||||
default: 'never',
|
||||
},
|
||||
skeleton: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
skeletonRows: {
|
||||
type: Number,
|
||||
default: 5, // 显示的数量会比传入的数量多 1
|
||||
},
|
||||
title: {
|
||||
type: String,
|
||||
default: '',
|
||||
},
|
||||
})
|
||||
|
||||
const skeletonShow = ref(true)
|
||||
|
||||
const timer = setTimeout(() => {
|
||||
skeletonShow.value = false
|
||||
}, 500)
|
||||
|
||||
onBeforeUnmount(() => {
|
||||
if (timer) clearTimeout(timer)
|
||||
})
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.vab-card {
|
||||
:deep() {
|
||||
.el-card__header {
|
||||
font-weight: 500;
|
||||
color: inherit;
|
||||
background: inherit;
|
||||
|
||||
[class*='ri-'] {
|
||||
background-image: linear-gradient(120deg, #bd34fe 30%, var(--el-color-primary));
|
||||
background-clip: text;
|
||||
-webkit-text-fill-color: transparent;
|
||||
}
|
||||
}
|
||||
|
||||
.el-skeleton {
|
||||
height: 100%;
|
||||
overflow: hidden;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -0,0 +1,7 @@
|
||||
import VabColorfulCard from './index.vue'
|
||||
|
||||
VabColorfulCard.install = function(app) {
|
||||
app.component(VabColorfulCard.name, VabColorfulCard)
|
||||
}
|
||||
|
||||
export default VabColorfulCard
|
||||
@@ -0,0 +1,92 @@
|
||||
<template>
|
||||
<el-card
|
||||
:body-style="props.bodyStyle"
|
||||
class="vab-colorful-card"
|
||||
:shadow="props.shadow"
|
||||
:style="
|
||||
props.style
|
||||
? props.style
|
||||
: {
|
||||
background: `linear-gradient(135deg, ${props.colorFrom} 15%, ${props.colorTo} 85%)`,
|
||||
}
|
||||
"
|
||||
>
|
||||
<!-- 头部插槽 -->
|
||||
<template v-if="$slots.header" #header>
|
||||
<slot name="header"></slot>
|
||||
</template>
|
||||
<!-- 使用 Iconify -->
|
||||
<Icon v-if="props.icon" :icon="props.icon" class="card-icon" />
|
||||
<!-- 默认插槽 -->
|
||||
<slot></slot>
|
||||
</el-card>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ElCard } from 'element-plus'
|
||||
import { Icon } from '@iconify/vue' // 导入 Iconify
|
||||
|
||||
// 定义组件名称
|
||||
defineOptions({
|
||||
name: 'VabColorfulCard',
|
||||
})
|
||||
|
||||
// 定义 props
|
||||
const props = defineProps({
|
||||
bodyStyle: {
|
||||
type: [String, Object],
|
||||
default: ''
|
||||
},
|
||||
shadow: {
|
||||
type: String,
|
||||
default: 'always',
|
||||
},
|
||||
colorFrom: {
|
||||
type: String,
|
||||
default: '',
|
||||
},
|
||||
colorTo: {
|
||||
type: String,
|
||||
default: '',
|
||||
},
|
||||
title: {
|
||||
type: String,
|
||||
default: '',
|
||||
},
|
||||
icon: {
|
||||
type: String,
|
||||
default: '',
|
||||
},
|
||||
style: {
|
||||
type: Object,
|
||||
default: () => ({}),
|
||||
},
|
||||
})
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.vab-colorful-card {
|
||||
position: relative;
|
||||
min-height: 120px;
|
||||
cursor: pointer;
|
||||
border: 1px solid rgba(0, 0, 0, 0.1); // 更淡的边框
|
||||
border-radius: 4px; // 稍微小一点的圆角
|
||||
box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05); // 更轻的阴影
|
||||
transition: all 0.25s;
|
||||
|
||||
:deep(.el-card__header) {
|
||||
color: var(--el-color-white);
|
||||
}
|
||||
|
||||
:deep(.el-card__body) {
|
||||
padding: 20px;
|
||||
}
|
||||
|
||||
.card-icon {
|
||||
position: absolute;
|
||||
right: 20px;
|
||||
font-size: 60px;
|
||||
transform: rotate(15deg);
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -0,0 +1,7 @@
|
||||
import VabCount from './index.vue'
|
||||
|
||||
VabCount.install = function(app) {
|
||||
app.component(VabCount.name, VabCount)
|
||||
}
|
||||
|
||||
export default VabCount
|
||||
@@ -0,0 +1,106 @@
|
||||
<template>
|
||||
<span>{{ displayValue }}</span>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref, computed, watch } from 'vue'
|
||||
import { isNumber } from '@/utils/validate'
|
||||
import { TransitionPresets, useTransition } from '@vueuse/core'
|
||||
|
||||
defineOptions({
|
||||
name: 'VabCount',
|
||||
})
|
||||
|
||||
const props = defineProps({
|
||||
startValue: {
|
||||
type: Number,
|
||||
required: false,
|
||||
default: 0,
|
||||
},
|
||||
endValue: {
|
||||
type: Number,
|
||||
required: false,
|
||||
default: 20,
|
||||
},
|
||||
duration: {
|
||||
type: Number,
|
||||
required: false,
|
||||
default: 3000,
|
||||
},
|
||||
autoplay: {
|
||||
type: Boolean,
|
||||
required: false,
|
||||
default: true,
|
||||
},
|
||||
decimals: {
|
||||
type: Number,
|
||||
required: false,
|
||||
default: 0,
|
||||
validator(value) {
|
||||
return value >= 0
|
||||
},
|
||||
},
|
||||
decimal: {
|
||||
type: String,
|
||||
required: false,
|
||||
default: '.',
|
||||
},
|
||||
separator: {
|
||||
type: String,
|
||||
required: false,
|
||||
default: ',',
|
||||
},
|
||||
prefix: {
|
||||
type: String,
|
||||
required: false,
|
||||
default: '',
|
||||
},
|
||||
suffix: {
|
||||
type: String,
|
||||
required: false,
|
||||
default: '',
|
||||
},
|
||||
useEasing: {
|
||||
type: Boolean,
|
||||
required: false,
|
||||
default: true,
|
||||
},
|
||||
easingFn: {
|
||||
type: Array,
|
||||
default: () => [0.2, 0.2, 0, 1],
|
||||
},
|
||||
})
|
||||
|
||||
const source = ref(props.startValue)
|
||||
const output = useTransition(source, {
|
||||
duration: props.duration,
|
||||
transition: props.useEasing ? props.easingFn : TransitionPresets.linear,
|
||||
})
|
||||
|
||||
const formatNumber = (num) => {
|
||||
num = num.toFixed(props.decimals)
|
||||
num += ''
|
||||
const x = num.split('.')
|
||||
let x1 = x[0]
|
||||
const x2 = x.length > 1 ? props.decimal + x[1] : ''
|
||||
const rgx = /(\d+)(\d{3})/
|
||||
if (props.separator && !isNumber(props.separator)) {
|
||||
while (rgx.test(x1)) {
|
||||
x1 = x1.replace(rgx, `$1${props.separator}$2`)
|
||||
}
|
||||
}
|
||||
return props.prefix + x1 + x2 + props.suffix
|
||||
}
|
||||
|
||||
const displayValue = computed(() => formatNumber(output.value))
|
||||
|
||||
watch(
|
||||
props,
|
||||
(props) => {
|
||||
if (props.autoplay) {
|
||||
source.value = props.endValue
|
||||
}
|
||||
},
|
||||
{ immediate: true }
|
||||
)
|
||||
</script>
|
||||
@@ -0,0 +1,23 @@
|
||||
import VabColorfulCard from './components/VabColorfulCard'
|
||||
import VabCard from './components/VabCard'
|
||||
import VabCount from './components/VabCount'
|
||||
|
||||
// 导入样式
|
||||
import './styles/vab.scss'
|
||||
|
||||
const components = [
|
||||
VabColorfulCard,
|
||||
VabCard,
|
||||
VabCount,
|
||||
// 其他组件...
|
||||
]
|
||||
|
||||
export default {
|
||||
install(app) {
|
||||
components.forEach(component => {
|
||||
app.component(component.name, component)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
export { VabColorfulCard, VabCard, VabCount }
|
||||
@@ -0,0 +1,16 @@
|
||||
@use 'normalize.css';
|
||||
@use 'element-plus/theme-chalk/src/index';
|
||||
@use './var.scss' as *;
|
||||
|
||||
// 基础样式
|
||||
body {
|
||||
font-size: var(--el-font-size-base);
|
||||
color: var(--el-color-black);
|
||||
background: var(--el-background-color);
|
||||
}
|
||||
|
||||
// 卡片样式
|
||||
.vab-card {
|
||||
border-radius: var(--el-border-radius-base);
|
||||
transition: var(--el-transition);
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
@use './variables.scss' as *;
|
||||
|
||||
:root {
|
||||
//背景色
|
||||
--el-background-color: #f6f8f9;
|
||||
//菜单背景色
|
||||
--el-menu-background-color: #282c34;
|
||||
//菜单文字颜色
|
||||
--el-menu-color-text: #ffffff;
|
||||
|
||||
// 主题色
|
||||
--el-color-primary: #{$base-color-primary};
|
||||
--el-color-primary-light-1: #{$vab-color-primary-light-1};
|
||||
--el-color-primary-light-2: #{$vab-color-primary-light-2};
|
||||
--el-color-primary-light-3: #{$vab-color-primary-light-3};
|
||||
--el-color-primary-light-4: #{$vab-color-primary-light-4};
|
||||
--el-color-primary-light-5: #{$vab-color-primary-light-5};
|
||||
--el-color-primary-light-6: #{$vab-color-primary-light-6};
|
||||
--el-color-primary-light-7: #{$vab-color-primary-light-7};
|
||||
--el-color-primary-light-8: #{$vab-color-primary-light-8};
|
||||
--el-color-primary-light-9: #{$vab-color-primary-light-9};
|
||||
|
||||
// 成功色
|
||||
--el-color-success: #{$base-color-success};
|
||||
--el-color-success-light: #{$vab-color-success-light};
|
||||
--el-color-success-lighter: #{$vab-color-success-lighter};
|
||||
|
||||
// 白色
|
||||
--el-color-white: #ffffff;
|
||||
|
||||
--el-color-warning: #{$base-color-warning};
|
||||
--el-color-danger: #{$base-color-danger};
|
||||
|
||||
--el-transition-duration: 0.25s;
|
||||
--el-transition: all var(--el-transition-duration) cubic-bezier(0.42, 0, 0.58, 1);
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
@use "sass:color";
|
||||
|
||||
/**
|
||||
* @description 全局主题变量配置
|
||||
*/
|
||||
$base-color-primary: #4e88f3;
|
||||
$base-color-success: #13ce66;
|
||||
$base-color-warning: #e6a23c;
|
||||
$base-color-danger: #fd4e4e;
|
||||
$base-color-error: #fd4e4e;
|
||||
$base-color-text: #909399;
|
||||
|
||||
$vab-color-primary: $base-color-primary;
|
||||
$vab-color-primary-light-1: color.mix(white, $base-color-primary, 10%);
|
||||
$vab-color-primary-light-2: color.mix(white, $base-color-primary, 20%);
|
||||
$vab-color-primary-light-3: color.mix(white, $base-color-primary, 30%);
|
||||
$vab-color-primary-light-4: color.mix(white, $base-color-primary, 40%);
|
||||
$vab-color-primary-light-5: color.mix(white, $base-color-primary, 50%);
|
||||
$vab-color-primary-light-6: color.mix(white, $base-color-primary, 60%);
|
||||
$vab-color-primary-light-7: color.mix(white, $base-color-primary, 70%);
|
||||
$vab-color-primary-light-8: color.mix(white, $base-color-primary, 80%);
|
||||
$vab-color-primary-light-9: color.mix(white, $base-color-primary, 90%);
|
||||
|
||||
$vab-color-success: $base-color-success;
|
||||
$vab-color-success-light: color.mix(white, $base-color-success, 80%);
|
||||
$vab-color-success-lighter: color.mix(white, $base-color-success, 90%);
|
||||
@@ -0,0 +1,52 @@
|
||||
{
|
||||
"name": "showtime_pay",
|
||||
"version": "0.0.0",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
"prebuild": "node scripts/bump-build-id.mjs",
|
||||
"build": "vite build",
|
||||
"preview": "vite preview",
|
||||
"tauri": "tauri",
|
||||
"tauri:dev": "tauri dev",
|
||||
"tauri:build": "tauri build"
|
||||
},
|
||||
"dependencies": {
|
||||
"@amap/amap-jsapi-loader": "^1.0.1",
|
||||
"@element-plus/icons-vue": "^2.3.1",
|
||||
"@iconify/vue": "^4.1.1",
|
||||
"@openim/client-sdk": "^3.8.3",
|
||||
"@tauri-apps/api": "^2.8.0",
|
||||
"@univerjs/preset-sheets-core": "^0.16.1",
|
||||
"@univerjs/presets": "^0.16.1",
|
||||
"@vueuse/core": "^12.7.0",
|
||||
"animate.css": "^4.1.1",
|
||||
"axios": "^1.7.9",
|
||||
"countup.js": "^2.9.0",
|
||||
"dayjs": "^1.11.13",
|
||||
"echarts": "^6.0.0",
|
||||
"element-plus": "^2.9.4",
|
||||
"mapbox-gl": "^3.18.1",
|
||||
"normalize.css": "^8.0.1",
|
||||
"nprogress": "^0.2.0",
|
||||
"pinia": "^2.3.1",
|
||||
"postcss": "^8.5.2",
|
||||
"qs": "^6.14.0",
|
||||
"sortablejs": "^1.15.7",
|
||||
"vite-plugin-remove-console": "^2.2.0",
|
||||
"vue": "^3.5.13",
|
||||
"vue-i18n": "^11.1.1",
|
||||
"vue-router": "^4.5.0",
|
||||
"xlsx": "^0.18.5"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@tauri-apps/cli": "^2.8.4",
|
||||
"@vitejs/plugin-vue": "^5.2.1",
|
||||
"autoprefixer": "^10.4.21",
|
||||
"cross-env": "^10.0.0",
|
||||
"sass": "^1.85.0",
|
||||
"vite": "^6.0.11",
|
||||
"vite-plugin-vue-devtools": "^7.7.1"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
export default {
|
||||
plugins: {
|
||||
autoprefixer: {},
|
||||
},
|
||||
}
|
||||
|
After Width: | Height: | Size: 2.1 KiB |
|
After Width: | Height: | Size: 3.4 KiB |
|
After Width: | Height: | Size: 3.2 KiB |
|
After Width: | Height: | Size: 3.7 KiB |
|
After Width: | Height: | Size: 3.5 KiB |
|
After Width: | Height: | Size: 2.1 KiB |
|
After Width: | Height: | Size: 2.4 KiB |
|
After Width: | Height: | Size: 2.5 KiB |
|
After Width: | Height: | Size: 2.0 KiB |
|
After Width: | Height: | Size: 4.2 KiB |
|
After Width: | Height: | Size: 2.0 KiB |
|
After Width: | Height: | Size: 1.9 KiB |
|
After Width: | Height: | Size: 4.5 KiB |
|
After Width: | Height: | Size: 2.1 KiB |
|
After Width: | Height: | Size: 3.9 KiB |
|
After Width: | Height: | Size: 3.7 KiB |
|
After Width: | Height: | Size: 2.5 KiB |
|
After Width: | Height: | Size: 2.3 KiB |
|
After Width: | Height: | Size: 1.9 KiB |
|
After Width: | Height: | Size: 2.8 KiB |
|
After Width: | Height: | Size: 2.5 KiB |
|
After Width: | Height: | Size: 5.4 KiB |
|
After Width: | Height: | Size: 5.0 KiB |
|
After Width: | Height: | Size: 3.8 KiB |
|
After Width: | Height: | Size: 3.6 KiB |
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 1.6 KiB |
|
After Width: | Height: | Size: 957 B |
|
After Width: | Height: | Size: 1.2 KiB |
|
After Width: | Height: | Size: 938 B |
|
After Width: | Height: | Size: 1.2 KiB |
|
After Width: | Height: | Size: 927 B |
|
After Width: | Height: | Size: 1.0 KiB |
|
After Width: | Height: | Size: 28 KiB |
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 494 KiB |
|
After Width: | Height: | Size: 264 KiB |
@@ -0,0 +1,58 @@
|
||||
/**
|
||||
* 生产 11 位构建号:YYYYMMDD(8)+ 当日第几次构建(3 位 001~999)
|
||||
* 状态存 build/build-sequence.json,结果写 src/config/buildId.json
|
||||
* 在 npm prebuild 时执行(仅正式 vite build 前,dev 不跑)
|
||||
*/
|
||||
import fs from 'node:fs'
|
||||
import path from 'node:path'
|
||||
import { fileURLToPath } from 'node:url'
|
||||
|
||||
const __dirname = path.dirname(fileURLToPath(import.meta.url))
|
||||
const root = path.resolve(__dirname, '..')
|
||||
const statePath = path.join(root, 'build', 'build-sequence.json')
|
||||
const outPath = path.join(root, 'src', 'config', 'buildId.json')
|
||||
|
||||
const now = new Date()
|
||||
const y = now.getFullYear()
|
||||
const m = String(now.getMonth() + 1).padStart(2, '0')
|
||||
const d = String(now.getDate()).padStart(2, '0')
|
||||
const ymd8 = `${y}${m}${d}`
|
||||
const todayKey = `${y}-${m}-${d}`
|
||||
|
||||
let state = { date: todayKey, daySeq: 0 }
|
||||
if (fs.existsSync(statePath)) {
|
||||
try {
|
||||
const prev = JSON.parse(fs.readFileSync(statePath, 'utf8'))
|
||||
if (prev && typeof prev === 'object') {
|
||||
state.date = prev.date || todayKey
|
||||
state.daySeq = Number.isFinite(prev.daySeq) ? prev.daySeq : 0
|
||||
}
|
||||
} catch { /* 忽略损坏文件 */ }
|
||||
}
|
||||
|
||||
if (state.date === todayKey) {
|
||||
state.daySeq = (state.daySeq || 0) + 1
|
||||
} else {
|
||||
state.date = todayKey
|
||||
state.daySeq = 1
|
||||
}
|
||||
if (state.daySeq > 999) {
|
||||
console.warn('[bump-build-id] 当日构建已超过 999 次,已钳位为 999')
|
||||
state.daySeq = 999
|
||||
}
|
||||
|
||||
const buildId = `${ymd8}${String(state.daySeq).padStart(3, '0')}`
|
||||
|
||||
fs.mkdirSync(path.dirname(statePath), { recursive: true })
|
||||
fs.writeFileSync(statePath, JSON.stringify(state, null, 2), 'utf8')
|
||||
fs.mkdirSync(path.dirname(outPath), { recursive: true })
|
||||
fs.writeFileSync(
|
||||
outPath,
|
||||
JSON.stringify(
|
||||
{ buildId, generatedAt: new Date().toISOString() },
|
||||
null,
|
||||
2,
|
||||
),
|
||||
'utf8',
|
||||
)
|
||||
console.log(`[bump-build-id] buildId=${buildId}`)
|
||||
@@ -0,0 +1,4 @@
|
||||
# Generated by Cargo
|
||||
# will have compiled files and executables
|
||||
/target/
|
||||
/gen/schemas
|
||||
@@ -0,0 +1,25 @@
|
||||
[package]
|
||||
name = "app"
|
||||
version = "0.1.0"
|
||||
description = "A Tauri App"
|
||||
authors = ["you"]
|
||||
license = ""
|
||||
repository = ""
|
||||
edition = "2021"
|
||||
rust-version = "1.77.2"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[lib]
|
||||
name = "app_lib"
|
||||
crate-type = ["staticlib", "cdylib", "rlib"]
|
||||
|
||||
[build-dependencies]
|
||||
tauri-build = { version = "2.4.1", features = [] }
|
||||
|
||||
[dependencies]
|
||||
serde_json = "1.0"
|
||||
serde = { version = "1.0", features = ["derive"] }
|
||||
log = "0.4"
|
||||
tauri = { version = "2.8.5", features = [] }
|
||||
tauri-plugin-log = "2"
|
||||
@@ -0,0 +1,3 @@
|
||||
fn main() {
|
||||
tauri_build::build()
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"$schema": "../gen/schemas/desktop-schema.json",
|
||||
"identifier": "default",
|
||||
"description": "enables the default permissions",
|
||||
"windows": [
|
||||
"main"
|
||||
],
|
||||
"permissions": [
|
||||
"core:default"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
xcuserdata/
|
||||
build/
|
||||
Externals/
|
||||
|
After Width: | Height: | Size: 1.0 KiB |
|
After Width: | Height: | Size: 2.2 KiB |
|
After Width: | Height: | Size: 2.2 KiB |
|
After Width: | Height: | Size: 3.4 KiB |
|
After Width: | Height: | Size: 1.5 KiB |
|
After Width: | Height: | Size: 3.3 KiB |
|
After Width: | Height: | Size: 3.3 KiB |
|
After Width: | Height: | Size: 5.1 KiB |
|
After Width: | Height: | Size: 2.2 KiB |
|
After Width: | Height: | Size: 4.7 KiB |
|
After Width: | Height: | Size: 4.7 KiB |
|
After Width: | Height: | Size: 7.1 KiB |
|
After Width: | Height: | Size: 118 KiB |
|
After Width: | Height: | Size: 7.1 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 4.4 KiB |
|
After Width: | Height: | Size: 9.0 KiB |
|
After Width: | Height: | Size: 10 KiB |
@@ -0,0 +1,116 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"size" : "20x20",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "AppIcon-20x20@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "20x20",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "AppIcon-20x20@3x.png",
|
||||
"scale" : "3x"
|
||||
},
|
||||
{
|
||||
"size" : "29x29",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "AppIcon-29x29@2x-1.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "29x29",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "AppIcon-29x29@3x.png",
|
||||
"scale" : "3x"
|
||||
},
|
||||
{
|
||||
"size" : "40x40",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "AppIcon-40x40@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "40x40",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "AppIcon-40x40@3x.png",
|
||||
"scale" : "3x"
|
||||
},
|
||||
{
|
||||
"size" : "60x60",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "AppIcon-60x60@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "60x60",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "AppIcon-60x60@3x.png",
|
||||
"scale" : "3x"
|
||||
},
|
||||
{
|
||||
"size" : "20x20",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "AppIcon-20x20@1x.png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"size" : "20x20",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "AppIcon-20x20@2x-1.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "29x29",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "AppIcon-29x29@1x.png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"size" : "29x29",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "AppIcon-29x29@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "40x40",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "AppIcon-40x40@1x.png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"size" : "40x40",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "AppIcon-40x40@2x-1.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "76x76",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "AppIcon-76x76@1x.png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"size" : "76x76",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "AppIcon-76x76@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "83.5x83.5",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "AppIcon-83.5x83.5@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "1024x1024",
|
||||
"idiom" : "ios-marketing",
|
||||
"filename" : "AppIcon-512@2x.png",
|
||||
"scale" : "1x"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>method</key>
|
||||
<string>debugging</string>
|
||||
</dict>
|
||||
</plist>
|
||||
@@ -0,0 +1,30 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="17150" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="Y6W-OH-hqX">
|
||||
<dependencies>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="17122"/>
|
||||
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
|
||||
<capability name="System colors in document resources" minToolsVersion="11.0"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<scenes>
|
||||
<!--View Controller-->
|
||||
<scene sceneID="s0d-6b-0kx">
|
||||
<objects>
|
||||
<viewController id="Y6W-OH-hqX" sceneMemberID="viewController">
|
||||
<view key="view" contentMode="scaleToFill" id="5EZ-qb-Rvc">
|
||||
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<viewLayoutGuide key="safeArea" id="vDu-zF-Fre"/>
|
||||
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
|
||||
</view>
|
||||
</viewController>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="Ief-a0-LHa" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
|
||||
</objects>
|
||||
</scene>
|
||||
</scenes>
|
||||
<resources>
|
||||
<systemColor name="systemBackgroundColor">
|
||||
<color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
</systemColor>
|
||||
</resources>
|
||||
</document>
|
||||
@@ -0,0 +1,21 @@
|
||||
# Uncomment the next line to define a global platform for your project
|
||||
|
||||
target 'app_iOS' do
|
||||
platform :ios, '14.0'
|
||||
# Pods for app_iOS
|
||||
end
|
||||
|
||||
target 'app_macOS' do
|
||||
platform :osx, '11.0'
|
||||
# Pods for app_macOS
|
||||
end
|
||||
|
||||
# Delete the deployment target for iOS and macOS, causing it to be inherited from the Podfile
|
||||
post_install do |installer|
|
||||
installer.pods_project.targets.each do |target|
|
||||
target.build_configurations.each do |config|
|
||||
config.build_settings.delete 'IPHONEOS_DEPLOYMENT_TARGET'
|
||||
config.build_settings.delete 'MACOSX_DEPLOYMENT_TARGET'
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,8 @@
|
||||
#pragma once
|
||||
|
||||
namespace ffi {
|
||||
extern "C" {
|
||||
void start_app();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
#include "bindings/bindings.h"
|
||||
|
||||
int main(int argc, char * argv[]) {
|
||||
ffi::start_app();
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,458 @@
|
||||
// !$*UTF8*$!
|
||||
{
|
||||
archiveVersion = 1;
|
||||
classes = {
|
||||
};
|
||||
objectVersion = 77;
|
||||
objects = {
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
299814393FFBF154FAD94CA8 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F3673D372C5ABDD1AD6E7067 /* QuartzCore.framework */; };
|
||||
3036F7131E55779ABF15BD58 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 02B7F8347F94B067E6B27396 /* LaunchScreen.storyboard */; };
|
||||
31585529C029A01BE249A285 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1E81BD6B453D87B7F7B1597B /* CoreGraphics.framework */; };
|
||||
324A1E9A4258E7911D4DAC39 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9FACFFCB6E3743955F72464C /* Security.framework */; };
|
||||
53CDD0ACFBE8BDF1550B2E53 /* main.mm in Sources */ = {isa = PBXBuildFile; fileRef = 682535EEFE1DA20BE07B123C /* main.mm */; };
|
||||
5C516481BCA83A182C2BCC94 /* assets in Resources */ = {isa = PBXBuildFile; fileRef = 3842AE2A64FB9933D0400EA4 /* assets */; };
|
||||
618672DC8A5E0605441C9935 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0E2B15F176E4B041AE33EEEA /* UIKit.framework */; };
|
||||
836D84C5F07860664DAF79C8 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D8F57162F5CC7AEDD55F173D /* WebKit.framework */; };
|
||||
9D59FB167BB4E699DA17D1E9 /* MetalKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 04B56F58E2E44DDE1D67E7B7 /* MetalKit.framework */; };
|
||||
C6BD59C055C986EA4A77FDA2 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = AF1DE57E7D9CF13BB2E0E038 /* Assets.xcassets */; };
|
||||
C869023DDFE275D42F3FBF29 /* libapp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 39EEC6A55698228E08917A52 /* libapp.a */; };
|
||||
E68F6CFDAED6503ABB4044A5 /* Metal.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE1209BFDECB28E00189B168 /* Metal.framework */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
007E478DB8BC37A788C4730F /* app_iOS.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = app_iOS.entitlements; sourceTree = "<group>"; };
|
||||
02B7F8347F94B067E6B27396 /* LaunchScreen.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = "<group>"; };
|
||||
04B56F58E2E44DDE1D67E7B7 /* MetalKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MetalKit.framework; path = System/Library/Frameworks/MetalKit.framework; sourceTree = SDKROOT; };
|
||||
0E2B15F176E4B041AE33EEEA /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
|
||||
1631E4CFBB715FFDBF919C8C /* main.rs */ = {isa = PBXFileReference; path = main.rs; sourceTree = "<group>"; };
|
||||
17B52554D60D361AFE791C3E /* lib.rs */ = {isa = PBXFileReference; path = lib.rs; sourceTree = "<group>"; };
|
||||
1E81BD6B453D87B7F7B1597B /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
|
||||
306B9C1792E7B1C53FA262A6 /* bindings.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = bindings.h; sourceTree = "<group>"; };
|
||||
3842AE2A64FB9933D0400EA4 /* assets */ = {isa = PBXFileReference; lastKnownFileType = folder; path = assets; sourceTree = SOURCE_ROOT; };
|
||||
39EEC6A55698228E08917A52 /* libapp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libapp.a; sourceTree = "<group>"; };
|
||||
682535EEFE1DA20BE07B123C /* main.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = main.mm; sourceTree = "<group>"; };
|
||||
81E326B61ED92E1D1EECF952 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; };
|
||||
9FACFFCB6E3743955F72464C /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; };
|
||||
AF1DE57E7D9CF13BB2E0E038 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
||||
CE1209BFDECB28E00189B168 /* Metal.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Metal.framework; path = System/Library/Frameworks/Metal.framework; sourceTree = SDKROOT; };
|
||||
D8F57162F5CC7AEDD55F173D /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; };
|
||||
F3673D372C5ABDD1AD6E7067 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
|
||||
FBC720DFA1D01F55B0A32344 /* app_iOS.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = app_iOS.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
4825CF6C55516D374210C8E1 /* Frameworks */ = {
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
C869023DDFE275D42F3FBF29 /* libapp.a in Frameworks */,
|
||||
31585529C029A01BE249A285 /* CoreGraphics.framework in Frameworks */,
|
||||
E68F6CFDAED6503ABB4044A5 /* Metal.framework in Frameworks */,
|
||||
9D59FB167BB4E699DA17D1E9 /* MetalKit.framework in Frameworks */,
|
||||
299814393FFBF154FAD94CA8 /* QuartzCore.framework in Frameworks */,
|
||||
324A1E9A4258E7911D4DAC39 /* Security.framework in Frameworks */,
|
||||
618672DC8A5E0605441C9935 /* UIKit.framework in Frameworks */,
|
||||
836D84C5F07860664DAF79C8 /* WebKit.framework in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXFrameworksBuildPhase section */
|
||||
|
||||
/* Begin PBXGroup section */
|
||||
1BBF8C620E54F8C028CA130C /* Frameworks */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
1E81BD6B453D87B7F7B1597B /* CoreGraphics.framework */,
|
||||
39EEC6A55698228E08917A52 /* libapp.a */,
|
||||
CE1209BFDECB28E00189B168 /* Metal.framework */,
|
||||
04B56F58E2E44DDE1D67E7B7 /* MetalKit.framework */,
|
||||
F3673D372C5ABDD1AD6E7067 /* QuartzCore.framework */,
|
||||
9FACFFCB6E3743955F72464C /* Security.framework */,
|
||||
0E2B15F176E4B041AE33EEEA /* UIKit.framework */,
|
||||
D8F57162F5CC7AEDD55F173D /* WebKit.framework */,
|
||||
);
|
||||
name = Frameworks;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
2867E55E70187711EE923EBD /* app_iOS */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
007E478DB8BC37A788C4730F /* app_iOS.entitlements */,
|
||||
81E326B61ED92E1D1EECF952 /* Info.plist */,
|
||||
);
|
||||
path = app_iOS;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
329C38BE5E8B40354375D0D0 /* bindings */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
306B9C1792E7B1C53FA262A6 /* bindings.h */,
|
||||
);
|
||||
path = bindings;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
78CBE3E5873199C0066F12DF /* Sources */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
FB1C68C0357A1866B3D27465 /* app */,
|
||||
);
|
||||
path = Sources;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
855775165ACE55D883F89EB3 /* src */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
17B52554D60D361AFE791C3E /* lib.rs */,
|
||||
1631E4CFBB715FFDBF919C8C /* main.rs */,
|
||||
);
|
||||
name = src;
|
||||
path = ../../src;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
87648061424F20D5D4871E9E = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
3842AE2A64FB9933D0400EA4 /* assets */,
|
||||
AF1DE57E7D9CF13BB2E0E038 /* Assets.xcassets */,
|
||||
02B7F8347F94B067E6B27396 /* LaunchScreen.storyboard */,
|
||||
2867E55E70187711EE923EBD /* app_iOS */,
|
||||
BAFB695BB8415511FEC74542 /* Externals */,
|
||||
78CBE3E5873199C0066F12DF /* Sources */,
|
||||
855775165ACE55D883F89EB3 /* src */,
|
||||
1BBF8C620E54F8C028CA130C /* Frameworks */,
|
||||
EE72B6AC647386A11F795E44 /* Products */,
|
||||
);
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
BAFB695BB8415511FEC74542 /* Externals */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
);
|
||||
path = Externals;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
EE72B6AC647386A11F795E44 /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
FBC720DFA1D01F55B0A32344 /* app_iOS.app */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
FB1C68C0357A1866B3D27465 /* app */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
682535EEFE1DA20BE07B123C /* main.mm */,
|
||||
329C38BE5E8B40354375D0D0 /* bindings */,
|
||||
);
|
||||
path = app;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXGroup section */
|
||||
|
||||
/* Begin PBXNativeTarget section */
|
||||
E86255CB8A1836C0BF0C0E14 /* app_iOS */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = CDCB6DFA1AEBFEE3F608BA27 /* Build configuration list for PBXNativeTarget "app_iOS" */;
|
||||
buildPhases = (
|
||||
E028F843270D8815FCE2B491 /* Build Rust Code */,
|
||||
81BE6BC5B603407AF570E994 /* Sources */,
|
||||
2FBCB8C3ED193E9C4A9FDB59 /* Resources */,
|
||||
4825CF6C55516D374210C8E1 /* Frameworks */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
dependencies = (
|
||||
);
|
||||
name = app_iOS;
|
||||
packageProductDependencies = (
|
||||
);
|
||||
productName = app_iOS;
|
||||
productReference = FBC720DFA1D01F55B0A32344 /* app_iOS.app */;
|
||||
productType = "com.apple.product-type.application";
|
||||
};
|
||||
/* End PBXNativeTarget section */
|
||||
|
||||
/* Begin PBXProject section */
|
||||
A9B1B09F1872768368ACECE2 /* Project object */ = {
|
||||
isa = PBXProject;
|
||||
attributes = {
|
||||
BuildIndependentTargetsInParallel = YES;
|
||||
LastUpgradeCheck = 1430;
|
||||
};
|
||||
buildConfigurationList = B302E784349268C93E6F0A36 /* Build configuration list for PBXProject "app" */;
|
||||
compatibilityVersion = "Xcode 14.0";
|
||||
developmentRegion = en;
|
||||
hasScannedForEncodings = 0;
|
||||
knownRegions = (
|
||||
Base,
|
||||
en,
|
||||
);
|
||||
mainGroup = 87648061424F20D5D4871E9E;
|
||||
minimizedProjectReferenceProxies = 1;
|
||||
preferredProjectObjectVersion = 77;
|
||||
projectDirPath = "";
|
||||
projectRoot = "";
|
||||
targets = (
|
||||
E86255CB8A1836C0BF0C0E14 /* app_iOS */,
|
||||
);
|
||||
};
|
||||
/* End PBXProject section */
|
||||
|
||||
/* Begin PBXResourcesBuildPhase section */
|
||||
2FBCB8C3ED193E9C4A9FDB59 /* Resources */ = {
|
||||
isa = PBXResourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
C6BD59C055C986EA4A77FDA2 /* Assets.xcassets in Resources */,
|
||||
3036F7131E55779ABF15BD58 /* LaunchScreen.storyboard in Resources */,
|
||||
5C516481BCA83A182C2BCC94 /* assets in Resources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXResourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXShellScriptBuildPhase section */
|
||||
E028F843270D8815FCE2B491 /* Build Rust Code */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
alwaysOutOfDate = 1;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
inputFileListPaths = (
|
||||
);
|
||||
inputPaths = (
|
||||
);
|
||||
name = "Build Rust Code";
|
||||
outputFileListPaths = (
|
||||
);
|
||||
outputPaths = (
|
||||
"$(SRCROOT)/Externals/x86_64/${CONFIGURATION}/libapp.a",
|
||||
"$(SRCROOT)/Externals/arm64/${CONFIGURATION}/libapp.a",
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/sh;
|
||||
shellScript = "npm run -- tauri ios xcode-script -v --platform ${PLATFORM_DISPLAY_NAME:?} --sdk-root ${SDKROOT:?} --framework-search-paths \"${FRAMEWORK_SEARCH_PATHS:?}\" --header-search-paths \"${HEADER_SEARCH_PATHS:?}\" --gcc-preprocessor-definitions \"${GCC_PREPROCESSOR_DEFINITIONS:-}\" --configuration ${CONFIGURATION:?} ${FORCE_COLOR} ${ARCHS:?}";
|
||||
};
|
||||
/* End PBXShellScriptBuildPhase section */
|
||||
|
||||
/* Begin PBXSourcesBuildPhase section */
|
||||
81BE6BC5B603407AF570E994 /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
53CDD0ACFBE8BDF1550B2E53 /* main.mm in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXSourcesBuildPhase section */
|
||||
|
||||
/* Begin XCBuildConfiguration section */
|
||||
1B9D5B8D34E6E0C88D0207F2 /* release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
||||
ARCHS = (
|
||||
arm64,
|
||||
);
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CODE_SIGN_ENTITLEMENTS = app_iOS/app_iOS.entitlements;
|
||||
CODE_SIGN_IDENTITY = "iPhone Developer";
|
||||
ENABLE_BITCODE = NO;
|
||||
"EXCLUDED_ARCHS[sdk=iphoneos*]" = x86_64;
|
||||
FRAMEWORK_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"\".\"",
|
||||
);
|
||||
INFOPLIST_FILE = app_iOS/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
"LIBRARY_SEARCH_PATHS[arch=arm64]" = "$(inherited) $(PROJECT_DIR)/Externals/arm64/$(CONFIGURATION) $(SDKROOT)/usr/lib/swift $(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME) $(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)";
|
||||
"LIBRARY_SEARCH_PATHS[arch=x86_64]" = "$(inherited) $(PROJECT_DIR)/Externals/x86_64/$(CONFIGURATION) $(SDKROOT)/usr/lib/swift $(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME) $(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.tauri.dev;
|
||||
PRODUCT_NAME = "showtime_pay";
|
||||
SDKROOT = iphoneos;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
VALID_ARCHS = arm64;
|
||||
};
|
||||
name = release;
|
||||
};
|
||||
3C6497CF9EADFA373F12EF5C /* release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
CLANG_ENABLE_OBJC_WEAK = YES;
|
||||
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||
CLANG_WARN_COMMA = YES;
|
||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||
CLANG_WARN_EMPTY_BODY = YES;
|
||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||
CLANG_WARN_INT_CONVERSION = YES;
|
||||
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
|
||||
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
||||
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
ENABLE_NS_ASSERTIONS = NO;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||
GCC_NO_COMMON_BLOCKS = YES;
|
||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
MTL_FAST_MATH = YES;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SDKROOT = iphoneos;
|
||||
SWIFT_COMPILATION_MODE = wholemodule;
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-O";
|
||||
SWIFT_VERSION = 5.0;
|
||||
};
|
||||
name = release;
|
||||
};
|
||||
4AC19FD47C6011940ACEB467 /* debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
||||
ARCHS = (
|
||||
arm64,
|
||||
);
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CODE_SIGN_ENTITLEMENTS = app_iOS/app_iOS.entitlements;
|
||||
CODE_SIGN_IDENTITY = "iPhone Developer";
|
||||
ENABLE_BITCODE = NO;
|
||||
"EXCLUDED_ARCHS[sdk=iphoneos*]" = x86_64;
|
||||
FRAMEWORK_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"\".\"",
|
||||
);
|
||||
INFOPLIST_FILE = app_iOS/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
"LIBRARY_SEARCH_PATHS[arch=arm64]" = "$(inherited) $(PROJECT_DIR)/Externals/arm64/$(CONFIGURATION) $(SDKROOT)/usr/lib/swift $(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME) $(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)";
|
||||
"LIBRARY_SEARCH_PATHS[arch=x86_64]" = "$(inherited) $(PROJECT_DIR)/Externals/x86_64/$(CONFIGURATION) $(SDKROOT)/usr/lib/swift $(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME) $(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.tauri.dev;
|
||||
PRODUCT_NAME = "showtime_pay";
|
||||
SDKROOT = iphoneos;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
VALID_ARCHS = arm64;
|
||||
};
|
||||
name = debug;
|
||||
};
|
||||
CAA806262C53A2E15E5DB0CA /* debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
CLANG_ENABLE_OBJC_WEAK = YES;
|
||||
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||
CLANG_WARN_COMMA = YES;
|
||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||
CLANG_WARN_EMPTY_BODY = YES;
|
||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||
CLANG_WARN_INT_CONVERSION = YES;
|
||||
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
|
||||
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
||||
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
ENABLE_TESTABILITY = YES;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||
GCC_DYNAMIC_NO_PIC = NO;
|
||||
GCC_NO_COMMON_BLOCKS = YES;
|
||||
GCC_OPTIMIZATION_LEVEL = 0;
|
||||
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||
"$(inherited)",
|
||||
"DEBUG=1",
|
||||
);
|
||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
|
||||
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
||||
MTL_FAST_MATH = YES;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SDKROOT = iphoneos;
|
||||
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||
SWIFT_VERSION = 5.0;
|
||||
};
|
||||
name = debug;
|
||||
};
|
||||
/* End XCBuildConfiguration section */
|
||||
|
||||
/* Begin XCConfigurationList section */
|
||||
B302E784349268C93E6F0A36 /* Build configuration list for PBXProject "app" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
CAA806262C53A2E15E5DB0CA /* debug */,
|
||||
3C6497CF9EADFA373F12EF5C /* release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = debug;
|
||||
};
|
||||
CDCB6DFA1AEBFEE3F608BA27 /* Build configuration list for PBXNativeTarget "app_iOS" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
4AC19FD47C6011940ACEB467 /* debug */,
|
||||
1B9D5B8D34E6E0C88D0207F2 /* release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = debug;
|
||||
};
|
||||
/* End XCConfigurationList section */
|
||||
};
|
||||
rootObject = A9B1B09F1872768368ACECE2 /* Project object */;
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Workspace
|
||||
version = "1.0">
|
||||
<FileRef
|
||||
location = "self:">
|
||||
</FileRef>
|
||||
</Workspace>
|
||||
@@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>BuildSystemType</key>
|
||||
<string>Original</string>
|
||||
<key>DisableBuildSystemDeprecationDiagnostic</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
||||
@@ -0,0 +1,131 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "1430"
|
||||
version = "1.7">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
buildImplicitDependencies = "YES"
|
||||
runPostActionsOnFailure = "NO">
|
||||
<BuildActionEntries>
|
||||
<BuildActionEntry
|
||||
buildForTesting = "YES"
|
||||
buildForRunning = "YES"
|
||||
buildForProfiling = "YES"
|
||||
buildForArchiving = "YES"
|
||||
buildForAnalyzing = "YES">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "E86255CB8A1836C0BF0C0E14"
|
||||
BuildableName = "app_iOS.app"
|
||||
BlueprintName = "app_iOS"
|
||||
ReferencedContainer = "container:app.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildActionEntry>
|
||||
</BuildActionEntries>
|
||||
</BuildAction>
|
||||
<TestAction
|
||||
buildConfiguration = "debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
shouldUseLaunchSchemeArgsEnv = "NO"
|
||||
onlyGenerateCoverageForSpecifiedTargets = "NO">
|
||||
<MacroExpansion>
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "E86255CB8A1836C0BF0C0E14"
|
||||
BuildableName = "app_iOS.app"
|
||||
BlueprintName = "app_iOS"
|
||||
ReferencedContainer = "container:app.xcodeproj">
|
||||
</BuildableReference>
|
||||
</MacroExpansion>
|
||||
<Testables>
|
||||
</Testables>
|
||||
<CommandLineArguments>
|
||||
</CommandLineArguments>
|
||||
<EnvironmentVariables>
|
||||
<EnvironmentVariable
|
||||
key = "RUST_BACKTRACE"
|
||||
value = "full"
|
||||
isEnabled = "YES">
|
||||
</EnvironmentVariable>
|
||||
<EnvironmentVariable
|
||||
key = "RUST_LOG"
|
||||
value = "info"
|
||||
isEnabled = "YES">
|
||||
</EnvironmentVariable>
|
||||
</EnvironmentVariables>
|
||||
</TestAction>
|
||||
<LaunchAction
|
||||
buildConfiguration = "debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
launchStyle = "0"
|
||||
useCustomWorkingDirectory = "NO"
|
||||
ignoresPersistentStateOnLaunch = "NO"
|
||||
debugDocumentVersioning = "YES"
|
||||
debugServiceExtension = "internal"
|
||||
allowLocationSimulation = "YES">
|
||||
<BuildableProductRunnable
|
||||
runnableDebuggingMode = "0">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "E86255CB8A1836C0BF0C0E14"
|
||||
BuildableName = "app_iOS.app"
|
||||
BlueprintName = "app_iOS"
|
||||
ReferencedContainer = "container:app.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildableProductRunnable>
|
||||
<CommandLineArguments>
|
||||
</CommandLineArguments>
|
||||
<EnvironmentVariables>
|
||||
<EnvironmentVariable
|
||||
key = "RUST_BACKTRACE"
|
||||
value = "full"
|
||||
isEnabled = "YES">
|
||||
</EnvironmentVariable>
|
||||
<EnvironmentVariable
|
||||
key = "RUST_LOG"
|
||||
value = "info"
|
||||
isEnabled = "YES">
|
||||
</EnvironmentVariable>
|
||||
</EnvironmentVariables>
|
||||
</LaunchAction>
|
||||
<ProfileAction
|
||||
buildConfiguration = "release"
|
||||
shouldUseLaunchSchemeArgsEnv = "NO"
|
||||
savedToolIdentifier = ""
|
||||
useCustomWorkingDirectory = "NO"
|
||||
debugDocumentVersioning = "YES">
|
||||
<BuildableProductRunnable
|
||||
runnableDebuggingMode = "0">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "E86255CB8A1836C0BF0C0E14"
|
||||
BuildableName = "app_iOS.app"
|
||||
BlueprintName = "app_iOS"
|
||||
ReferencedContainer = "container:app.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildableProductRunnable>
|
||||
<CommandLineArguments>
|
||||
</CommandLineArguments>
|
||||
<EnvironmentVariables>
|
||||
<EnvironmentVariable
|
||||
key = "RUST_BACKTRACE"
|
||||
value = "full"
|
||||
isEnabled = "YES">
|
||||
</EnvironmentVariable>
|
||||
<EnvironmentVariable
|
||||
key = "RUST_LOG"
|
||||
value = "info"
|
||||
isEnabled = "YES">
|
||||
</EnvironmentVariable>
|
||||
</EnvironmentVariables>
|
||||
</ProfileAction>
|
||||
<AnalyzeAction
|
||||
buildConfiguration = "debug">
|
||||
</AnalyzeAction>
|
||||
<ArchiveAction
|
||||
buildConfiguration = "release"
|
||||
revealArchiveInOrganizer = "YES">
|
||||
</ArchiveAction>
|
||||
</Scheme>
|
||||
@@ -0,0 +1,44 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>$(DEVELOPMENT_LANGUAGE)</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>$(EXECUTABLE_NAME)</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>$(PRODUCT_NAME)</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>0.1.0</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>0.1.0</string>
|
||||
<key>LSRequiresIPhoneOS</key>
|
||||
<true/>
|
||||
<key>UILaunchStoryboardName</key>
|
||||
<string>LaunchScreen</string>
|
||||
<key>UIRequiredDeviceCapabilities</key>
|
||||
<array>
|
||||
<string>arm64</string>
|
||||
<string>metal</string>
|
||||
</array>
|
||||
<key>UISupportedInterfaceOrientations</key>
|
||||
<array>
|
||||
<string>UIInterfaceOrientationPortrait</string>
|
||||
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||
<string>UIInterfaceOrientationLandscapeRight</string>
|
||||
</array>
|
||||
<key>UISupportedInterfaceOrientations~ipad</key>
|
||||
<array>
|
||||
<string>UIInterfaceOrientationPortrait</string>
|
||||
<string>UIInterfaceOrientationPortraitUpsideDown</string>
|
||||
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||
<string>UIInterfaceOrientationLandscapeRight</string>
|
||||
</array>
|
||||
</dict>
|
||||
</plist>
|
||||
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict/>
|
||||
</plist>
|
||||
@@ -0,0 +1,88 @@
|
||||
name: app
|
||||
options:
|
||||
bundleIdPrefix: com.tauri.dev
|
||||
deploymentTarget:
|
||||
iOS: 14.0
|
||||
fileGroups: [../../src]
|
||||
configs:
|
||||
debug: debug
|
||||
release: release
|
||||
settingGroups:
|
||||
app:
|
||||
base:
|
||||
PRODUCT_NAME: showtime_pay
|
||||
PRODUCT_BUNDLE_IDENTIFIER: com.tauri.dev
|
||||
targetTemplates:
|
||||
app:
|
||||
type: application
|
||||
sources:
|
||||
- path: Sources
|
||||
scheme:
|
||||
environmentVariables:
|
||||
RUST_BACKTRACE: full
|
||||
RUST_LOG: info
|
||||
settings:
|
||||
groups: [app]
|
||||
targets:
|
||||
app_iOS:
|
||||
type: application
|
||||
platform: iOS
|
||||
sources:
|
||||
- path: Sources
|
||||
- path: Assets.xcassets
|
||||
- path: Externals
|
||||
- path: app_iOS
|
||||
- path: assets
|
||||
buildPhase: resources
|
||||
type: folder
|
||||
- path: LaunchScreen.storyboard
|
||||
info:
|
||||
path: app_iOS/Info.plist
|
||||
properties:
|
||||
LSRequiresIPhoneOS: true
|
||||
UILaunchStoryboardName: LaunchScreen
|
||||
UIRequiredDeviceCapabilities: [arm64, metal]
|
||||
UISupportedInterfaceOrientations:
|
||||
- UIInterfaceOrientationPortrait
|
||||
- UIInterfaceOrientationLandscapeLeft
|
||||
- UIInterfaceOrientationLandscapeRight
|
||||
UISupportedInterfaceOrientations~ipad:
|
||||
- UIInterfaceOrientationPortrait
|
||||
- UIInterfaceOrientationPortraitUpsideDown
|
||||
- UIInterfaceOrientationLandscapeLeft
|
||||
- UIInterfaceOrientationLandscapeRight
|
||||
CFBundleShortVersionString: 0.1.0
|
||||
CFBundleVersion: "0.1.0"
|
||||
entitlements:
|
||||
path: app_iOS/app_iOS.entitlements
|
||||
scheme:
|
||||
environmentVariables:
|
||||
RUST_BACKTRACE: full
|
||||
RUST_LOG: info
|
||||
settings:
|
||||
base:
|
||||
ENABLE_BITCODE: false
|
||||
ARCHS: [arm64]
|
||||
VALID_ARCHS: arm64
|
||||
LIBRARY_SEARCH_PATHS[arch=x86_64]: $(inherited) $(PROJECT_DIR)/Externals/x86_64/$(CONFIGURATION) $(SDKROOT)/usr/lib/swift $(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME) $(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)
|
||||
LIBRARY_SEARCH_PATHS[arch=arm64]: $(inherited) $(PROJECT_DIR)/Externals/arm64/$(CONFIGURATION) $(SDKROOT)/usr/lib/swift $(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME) $(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)
|
||||
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES: true
|
||||
EXCLUDED_ARCHS[sdk=iphoneos*]: x86_64
|
||||
groups: [app]
|
||||
dependencies:
|
||||
- framework: libapp.a
|
||||
embed: false
|
||||
- sdk: CoreGraphics.framework
|
||||
- sdk: Metal.framework
|
||||
- sdk: MetalKit.framework
|
||||
- sdk: QuartzCore.framework
|
||||
- sdk: Security.framework
|
||||
- sdk: UIKit.framework
|
||||
- sdk: WebKit.framework
|
||||
preBuildScripts:
|
||||
- script: npm run -- tauri ios xcode-script -v --platform ${PLATFORM_DISPLAY_NAME:?} --sdk-root ${SDKROOT:?} --framework-search-paths "${FRAMEWORK_SEARCH_PATHS:?}" --header-search-paths "${HEADER_SEARCH_PATHS:?}" --gcc-preprocessor-definitions "${GCC_PREPROCESSOR_DEFINITIONS:-}" --configuration ${CONFIGURATION:?} ${FORCE_COLOR} ${ARCHS:?}
|
||||
name: Build Rust Code
|
||||
basedOnDependencyAnalysis: false
|
||||
outputFiles:
|
||||
- $(SRCROOT)/Externals/x86_64/${CONFIGURATION}/libapp.a
|
||||
- $(SRCROOT)/Externals/arm64/${CONFIGURATION}/libapp.a
|
||||
@@ -0,0 +1,32 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
// Tauri iOS build script
|
||||
// This script is called during the Xcode build process
|
||||
|
||||
const path = require('path');
|
||||
const { spawn } = require('child_process');
|
||||
|
||||
// 获取项目根目录
|
||||
const projectRoot = path.resolve(__dirname, '../../..');
|
||||
const tauriRoot = path.resolve(projectRoot, 'src-tauri');
|
||||
|
||||
console.log('Starting Tauri iOS build...');
|
||||
console.log('Project root:', projectRoot);
|
||||
console.log('Tauri root:', tauriRoot);
|
||||
|
||||
// 执行 tauri build for iOS
|
||||
const buildProcess = spawn('npx', ['tauri', 'build', '--target', 'ios'], {
|
||||
cwd: projectRoot,
|
||||
stdio: 'inherit',
|
||||
env: { ...process.env }
|
||||
});
|
||||
|
||||
buildProcess.on('exit', (code) => {
|
||||
console.log(`Tauri build exited with code ${code}`);
|
||||
process.exit(code);
|
||||
});
|
||||
|
||||
buildProcess.on('error', (error) => {
|
||||
console.error('Error running tauri build:', error);
|
||||
process.exit(1);
|
||||
});
|
||||
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 23 KiB |