index.vue 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455
  1. <template>
  2. <div class="container">
  3. <nav class="settings-nav">
  4. <div class="nav-item" :class="{'active': activeIndex === 0}" @click="activeIndex = 0">
  5. <img src="@/assets/images/setting/icon1.png" class="nav-icon" v-if="activeIndex !== 0"/>
  6. <img src="@/assets/images/setting/icon1a.png" class="nav-icon" v-else/>
  7. <span>基础配置</span>
  8. </div>
  9. <div class="nav-item" :class="{'active': activeIndex === 1}" @click="activeIndex = 1">
  10. <img src="@/assets/images/setting/icon2.png" class="nav-icon" v-if="activeIndex !== 1"/>
  11. <img src="@/assets/images/setting/icon2a.png" class="nav-icon" v-else/>
  12. <span>拍照设置</span>
  13. </div>
  14. <div class="nav-item" :class="{'active': activeIndex === 2}" @click="activeIndex = 2">
  15. <img src="@/assets/images/setting/icon3.png" class="nav-icon" v-if="activeIndex !== 2"/>
  16. <img src="@/assets/images/setting/icon3a.png" class="nav-icon" v-else/>
  17. <span>其他设置</span>
  18. </div>
  19. <div class="nav-item" :class="{'active': activeIndex === 3}" @click="activeIndex = 3">
  20. <img src="@/assets/images/setting/icon4.png" class="nav-icon" v-if="activeIndex !== 3"/>
  21. <img src="@/assets/images/setting/icon4a.png" class="nav-icon" v-else/>
  22. <span>遥控器设置</span>
  23. </div>
  24. </nav>
  25. <div class="form-container">
  26. <div class="captureBox" v-if="activeIndex === 0">
  27. <div class="form-item">
  28. <label>canpture_one图片输出文件夹:</label>
  29. <div class="input-group">
  30. <el-input style="width: 430px;" type="textarea" :rows="2" v-model="formData.captureOneFolder" readonly></el-input>
  31. <div class="select-btn" @click="selectFolder">
  32. <img src="@/assets/images/setting/folder.png" /> 选择文件夹
  33. </div>
  34. </div>
  35. </div>
  36. <p class="error-text">capture one的导出拍照图像自动和智能拍的待处理图像自不一致,请重新选择</p>
  37. </div>
  38. <div class="selectBox" v-if="activeIndex === 0">
  39. <div class="form-item">
  40. <label>主图尺寸:</label>
  41. <div class="select-wrapper">
  42. <el-select v-model="formData.mainImageSize" placeholder="请选择">
  43. <el-option v-for="item in mainImageSizeList" :key="item.value" :label="item.label" :value="item.value"></el-option>
  44. </el-select>
  45. </div>
  46. </div>
  47. <div class="form-item">
  48. <label>图片输出格式:</label>
  49. <div class="select-wrapper">
  50. <el-select v-model="formData.imageFormat" placeholder="请选择">
  51. <el-option v-for="item in imageFormatList" :key="item.value" :label="item.label" :value="item.value"></el-option>
  52. </el-select>
  53. </div>
  54. </div>
  55. <div class="form-item">
  56. <label>图片锐化:</label>
  57. <div class="select-wrapper">
  58. <el-select v-model="formData.imageSharpening" placeholder="请选择">
  59. <el-option v-for="item in imageSharpeningList" :key="item.value" :label="item.label" :value="item.value"></el-option>
  60. </el-select>
  61. </div>
  62. </div>
  63. </div>
  64. <div class="selectBox" style="padding-top: 0px" v-if="activeIndex === 1">
  65. <div class="form-item">
  66. <label>重复拍摄警告:</label>
  67. <div class="select-wrapper">
  68. <el-select v-model="formData.repeatWarning" placeholder="请选择">
  69. <el-option v-for="item in repeatWarningList" :key="item.value" :label="item.label" :value="item.value"></el-option>
  70. </el-select>
  71. </div>
  72. </div>
  73. <div class="form-item">
  74. <label>单次张数警告:</label>
  75. <div class="select-wrapper">
  76. <el-select v-model="formData.singleWarning" placeholder="请选择">
  77. <el-option v-for="item in singleWarningList" :key="item.value" :label="item.label" :value="item.value"></el-option>
  78. </el-select>
  79. </div>
  80. </div>
  81. <div class="form-item">
  82. <label>累计拍照警告:</label>
  83. <div class="select-wrapper">
  84. <el-select v-model="formData.totalWarning" placeholder="请选择">
  85. <el-option v-for="item in totalWarningList" :key="item.value" :label="item.label" :value="item.value"></el-option>
  86. </el-select>
  87. </div>
  88. </div>
  89. <div class="form-item">
  90. <label>对焦时间:</label>
  91. <div class="select-wrapper">
  92. <el-input v-model="formData.focusTime" placeholder="请输入">
  93. <template #append>秒</template>
  94. </el-input>
  95. </div>
  96. </div>
  97. <div class="form-item">
  98. <label>拍照停留:</label>
  99. <div class="select-wrapper">
  100. <el-input v-model="formData.photoTime" placeholder="请输入">
  101. <template #append>秒</template>
  102. </el-input>
  103. </div>
  104. </div>
  105. </div>
  106. <div class="selectBox" style="padding-top: 0px" v-if="activeIndex === 2">
  107. <div class="form-item">
  108. <label>产品类型:</label>
  109. <div class="select-wrapper">
  110. <el-select v-model="formData.productType" placeholder="请选择">
  111. <el-option v-for="item in productTypeList" :key="item.value" :label="item.label" :value="item.value"></el-option>
  112. </el-select>
  113. </div>
  114. </div>
  115. <div class="form-item">
  116. <label>默认抠图模式:</label>
  117. <div class="select-wrapper">
  118. <el-select v-model="formData.defaultCutoutMode" placeholder="请选择">
  119. <el-option v-for="item in defaultCutoutModeList" :key="item.value" :label="item.label" :value="item.value"></el-option>
  120. </el-select>
  121. </div>
  122. </div>
  123. <div class="form-item">
  124. <label>设备运动速度:</label>
  125. <div class="select-wrapper">
  126. <el-select v-model="formData.deviceSpeed" placeholder="请选择">
  127. <el-option v-for="item in deviceSpeedList" :key="item.value" :label="item.label" :value="item.value"></el-option>
  128. </el-select>
  129. </div>
  130. </div>
  131. <div class="form-item">
  132. <label>运行模式:</label>
  133. <div class="select-wrapper">
  134. <el-select v-model="formData.runMode" placeholder="请选择">
  135. <el-option v-for="item in runModeList" :key="item.value" :label="item.label" :value="item.value"></el-option>
  136. </el-select>
  137. </div>
  138. </div>
  139. </div>
  140. <div class="selectBox" style="padding-top: 0px" v-if="activeIndex === 3">
  141. <div class="form-item">
  142. <label>接收器:</label>
  143. <div class="select-wrapper">
  144. <el-select v-model="formData.receiver" placeholder="请选择">
  145. <el-option v-for="item in receiverList" :key="item.value" :label="item.label" :value="item.value"></el-option>
  146. </el-select>
  147. </div>
  148. </div>
  149. <div class="form-item">
  150. <label>左:</label>
  151. <div class="select-wrapper">
  152. <el-select v-model="formData.left" placeholder="请选择">
  153. <el-option v-for="item in leftList" :key="item.value" :label="item.label" :value="item.value"></el-option>
  154. </el-select>
  155. </div>
  156. </div>
  157. <div class="form-item">
  158. <label>右:</label>
  159. <div class="select-wrapper">
  160. <el-select v-model="formData.right" placeholder="请选择">
  161. <el-option v-for="item in rightList" :key="item.value" :label="item.label" :value="item.value"></el-option>
  162. </el-select>
  163. </div>
  164. </div>
  165. <div class="form-item">
  166. <label>上:</label>
  167. <div class="select-wrapper">
  168. <el-select v-model="formData.up" placeholder="请选择">
  169. <el-option v-for="item in upList" :key="item.value" :label="item.label" :value="item.value"></el-option>
  170. </el-select>
  171. </div>
  172. </div>
  173. <div class="form-item">
  174. <label>下:</label>
  175. <div class="select-wrapper">
  176. <el-select v-model="formData.down" placeholder="请选择">
  177. <el-option v-for="item in downList" :key="item.value" :label="item.label" :value="item.value"></el-option>
  178. </el-select>
  179. </div>
  180. </div>
  181. </div>
  182. <div class="text-center mt-8">
  183. <button class="bg-gradient-to-r from-primary" @click="saveSetting">
  184. 保存
  185. </button>
  186. </div>
  187. </div>
  188. </div>
  189. </template>
  190. <script setup>
  191. // 这里可以添加Vue组件的逻辑
  192. import { ref } from 'vue';
  193. const folderPath = ref('');
  194. const activeIndex = ref(0);
  195. const formData = ref({
  196. captureOneFolder: '',
  197. mainImageSize: '',
  198. imageFormat: '',
  199. imageSharpening: '',
  200. repeatWarning: '',
  201. singleWarning: '',
  202. totalWarning: '',
  203. focusTime: '',
  204. photoTime: '',
  205. productType: '',
  206. defaultCutoutMode: '',
  207. deviceSpeed: '',
  208. runMode: '',
  209. receiver: '',
  210. left: '',
  211. right: '',
  212. up: '',
  213. down: '',
  214. });
  215. const mainImageSizeList = ref([
  216. { label: '1600', value: '1600' },
  217. { label: '1200', value: '1200' },
  218. { label: '1024', value: '1024' },
  219. { label: '800', value: '800' },
  220. ]);
  221. const imageFormatList = ref([
  222. { label: 'jpg', value: 'jpg' },
  223. { label: 'png', value: 'png' },
  224. { label: 'jpeg', value: 'jpeg' },
  225. ]);
  226. const imageSharpeningList = ref([
  227. { label: '0', value: '0' },
  228. { label: '1', value: '1' },
  229. { label: '2', value: '2' },
  230. { label: '3', value: '3' },
  231. ]);
  232. const repeatWarningList = ref([
  233. { label: '关闭', value: '0' },
  234. { label: '开启', value: '1' },
  235. ]);
  236. const singleWarningList = ref([
  237. { label: '11', value: '11' },
  238. { label: '12', value: '12' },
  239. { label: '13', value: '13' },
  240. ]);
  241. const totalWarningList = ref([
  242. { label: '1.0', value: '1.0' },
  243. { label: '1.5', value: '1.5' },
  244. { label: '2.0', value: '2.0' },
  245. ]);
  246. const productTypeList = ref([
  247. { label: '鞋类', value: '1' },
  248. { label: '服装', value: '2' },
  249. { label: '箱包', value: '3' },
  250. ]);
  251. const defaultCutoutModeList = ref([
  252. { label: '普通抠图', value: '1' },
  253. { label: '智能抠图', value: '2' },
  254. { label: '手动抠图', value: '3' },
  255. ]);
  256. const deviceSpeedList = ref([
  257. { label: '一档', value: '1' },
  258. { label: '二档', value: '2' },
  259. { label: '三档', value: '3' },
  260. ]);
  261. const runModeList = ref([
  262. { label: '普通模式', value: '1' },
  263. { label: '自动模式', value: '2' },
  264. { label: '手动模式', value: '3' },
  265. ]);
  266. const receiverList = ref([
  267. { label: '蓝牙', value: '1' },
  268. { label: '2.4G', value: '2' },
  269. { label: '5.8G', value: '3' },
  270. ]);
  271. const leftList = ref([
  272. { label: '左脚', value: '1' },
  273. { label: '右脚', value: '2' },
  274. { label: '左右脚', value: '3' },
  275. ]);
  276. const rightList = ref([
  277. { label: '左脚', value: '1' },
  278. { label: '右脚', value: '2' },
  279. { label: '左右脚', value: '3' },
  280. ]);
  281. const upList = ref([
  282. { label: '上移', value: '1' },
  283. { label: '下移', value: '2' },
  284. { label: '左右移', value: '3' },
  285. ]);
  286. const downList = ref([
  287. { label: '上移', value: '1' },
  288. { label: '下移', value: '2' },
  289. { label: '左右移', value: '3' },
  290. ]);
  291. const selectFolder = () => {
  292. // 这里可以添加选择文件夹的逻辑
  293. // 由于浏览器安全限制,网页应用无法直接访问本地文件系统
  294. // 这里我们可以使用一个模拟的文件选择对话框
  295. // 创建一个隐藏的input元素用于选择文件夹
  296. const input = document.createElement('input');
  297. input.type = 'file';
  298. input.webkitdirectory = true; // 允许选择文件夹而不是文件
  299. input.directory = true; // 非标准属性,某些浏览器支持
  300. // 监听文件选择事件
  301. input.onchange = (event) => {
  302. const files = event.target.files;
  303. if (files && files.length > 0) {
  304. // 获取选择的文件夹路径(仅显示第一个文件的目录)
  305. const path = files[0].webkitRelativePath.split('/')[0];
  306. folderPath.value = path;
  307. // 更新表单数据中的captureOneFolder字段
  308. formData.value.captureOneFolder = path;
  309. // 这里可以添加更新UI或发送到后端的逻辑
  310. console.log('选择的文件夹:', path);
  311. // 如果需要,可以在这里添加API调用来保存路径到后端
  312. // 例如:axios.post('/api/settings/folder', { path: folderPath.value });
  313. }
  314. };
  315. // 触发文件选择对话框
  316. input.click();
  317. }
  318. const saveSetting = () => {
  319. console.log(formData.value);
  320. }
  321. </script>
  322. <style lang="scss" scoped>
  323. body {
  324. min-height: 1024px;
  325. background: #EAECED;
  326. }
  327. .container {
  328. margin: 0 auto;
  329. background: #EAECED;
  330. }
  331. .settings-nav {
  332. display: flex;
  333. justify-content: center;
  334. gap: 40px;
  335. padding: 30px 0;
  336. background: #EDEFF0;
  337. border-bottom: 1px solid rgba(0,0,0,0.1);
  338. }
  339. .nav-item {
  340. display: flex;
  341. flex-direction: column;
  342. align-items: center;
  343. cursor: pointer;
  344. color: #666;
  345. transition: all 0.3s;
  346. width: 100px;
  347. justify-content: center;
  348. height: 70px;
  349. font-size: 14px;
  350. }
  351. .nav-item.active {
  352. background: #DFE2E3;
  353. border-radius: 10px;
  354. color: #2957FF;
  355. }
  356. .nav-item i {
  357. font-size: 24px;
  358. margin-bottom: 8px;
  359. width: 40px;
  360. height: 40px;
  361. display: flex;
  362. justify-content: center;
  363. align-items: center;
  364. background: #fff;
  365. border-radius: 8px;
  366. }
  367. .form-container {
  368. border-radius: 12px;
  369. padding: 30px;
  370. width: 800px;
  371. margin: 0 auto;
  372. }
  373. .form-item {
  374. margin-bottom: 24px;
  375. display: flex;
  376. align-items: center;
  377. }
  378. .form-item label {
  379. display: block;
  380. min-width: 98px;
  381. text-align: right;
  382. font-size: 14px;
  383. color: #1A1A1A;
  384. }
  385. .input-group {
  386. display: flex;
  387. gap: 12px;
  388. }
  389. .input-group input {
  390. flex: 1;
  391. border: 1px solid #e5e7eb;
  392. border-radius: 4px;
  393. padding: 8px 12px;
  394. font-size: 14px;
  395. }
  396. .select-wrapper {
  397. position: relative;
  398. width: 200px;
  399. ::v-deep(.el-input__inner){
  400. border-radius: 6px;
  401. }
  402. }
  403. .error-text {
  404. color: #dc2626;
  405. font-size: 12px;
  406. margin-top: 4px;
  407. }
  408. .from-primary{
  409. width: 150px;
  410. margin-top: 30px;
  411. height: 40px;
  412. color: #FFFFFF;
  413. background: linear-gradient( 135deg, #2FB0FF 0%, #B863FB 100%);
  414. }
  415. .nav-icon{
  416. width: 32px;
  417. height: 32px;
  418. }
  419. .captureBox{
  420. border-bottom: 1px solid rgba(0,0,0,0.1);
  421. }
  422. .selectBox{
  423. padding-top: 30px;
  424. padding-left: 100px;
  425. border-bottom: 1px solid rgba(0,0,0,0.1);
  426. }
  427. .select-btn{
  428. display: flex;
  429. align-items: center;
  430. flex-shrink: 0;
  431. width: 120px;
  432. height: 30px;
  433. background: #DFE2E3;
  434. border-radius: 6px;
  435. justify-content: center;
  436. font-size: 14px;
  437. color: #2957FF;
  438. gap: 5px;
  439. img{
  440. width: 16px;
  441. height: 16px;
  442. }
  443. }
  444. </style>