ts-glitter 22.3.5 → 22.3.7
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.
- package/lowcode/Entry.js +1 -1
- package/lowcode/Entry.ts +1 -1
- package/package.json +1 -1
- package/src/api-public/services/checkout-event.js +7 -17
- package/src/api-public/services/checkout-event.js.map +1 -1
- package/src/api-public/services/public-table-check.d.ts +1 -0
- package/src/api-public/services/public-table-check.js +271 -268
- package/src/api-public/services/public-table-check.js.map +1 -1
- package/src/api-public/services/public-table-check.ts +310 -305
- package/src/api-public/services/user.d.ts +1 -0
- package/src/api-public/services/user.js +17 -9
- package/src/api-public/services/user.js.map +1 -1
- package/src/api-public/services/user.ts +22 -10
- package/src/modules/server-cache.js.map +1 -1
- package/src/modules/server-cache.ts +2 -0
- package/src/services/app.js +41 -29
- package/src/services/app.js.map +1 -1
- package/src/services/app.ts +45 -29
- package/p68kz5exx6.json +0 -1
package/src/services/app.ts
CHANGED
|
@@ -19,6 +19,7 @@ import { User } from '../api-public/services/user.js';
|
|
|
19
19
|
import { LanguageLocation } from '../Language.js';
|
|
20
20
|
import express from 'express';
|
|
21
21
|
import { ServerCache } from '../modules/server-cache.js';
|
|
22
|
+
import { UtTimer } from '../api-public/utils/ut-timer.js';
|
|
22
23
|
|
|
23
24
|
export class App {
|
|
24
25
|
public token?: IToken;
|
|
@@ -73,9 +74,10 @@ export class App {
|
|
|
73
74
|
sub_domain: string;
|
|
74
75
|
}) {
|
|
75
76
|
try {
|
|
77
|
+
const utTimer = new UtTimer('CreateAPP');
|
|
76
78
|
cf.copyWith = cf.copyWith ?? [];
|
|
77
79
|
cf.sub_domain = cf.sub_domain.replace(/\./g, '');
|
|
78
|
-
const count = await db.
|
|
80
|
+
const count = await db.query(
|
|
79
81
|
`
|
|
80
82
|
select count(1)
|
|
81
83
|
from \`${saasConfig.SAAS_NAME}\`.app_config
|
|
@@ -86,7 +88,7 @@ export class App {
|
|
|
86
88
|
if (count[0]['count(1)'] === 1) {
|
|
87
89
|
throw exception.BadRequestError('HAVE_APP', 'This app already be used.', null);
|
|
88
90
|
}
|
|
89
|
-
const domain_count = await db.
|
|
91
|
+
const domain_count = await db.query(
|
|
90
92
|
`
|
|
91
93
|
select count(1)
|
|
92
94
|
from \`${saasConfig.SAAS_NAME}\`.app_config
|
|
@@ -104,20 +106,20 @@ export class App {
|
|
|
104
106
|
if (cf.copyApp) {
|
|
105
107
|
await ApiPublic.createScheme(cf.copyApp);
|
|
106
108
|
copyAppData = (
|
|
107
|
-
await db.
|
|
109
|
+
await db.query(
|
|
108
110
|
`select *
|
|
109
111
|
from \`${saasConfig.SAAS_NAME}\`.app_config
|
|
110
112
|
where appName = ${db.escape(cf.copyApp)}`,
|
|
111
113
|
[]
|
|
112
114
|
)
|
|
113
115
|
)[0];
|
|
114
|
-
copyPageData = await db.
|
|
116
|
+
copyPageData = await db.query(
|
|
115
117
|
`select *
|
|
116
118
|
from \`${saasConfig.SAAS_NAME}\`.page_config
|
|
117
119
|
where appName = ${db.escape(cf.copyApp)}`,
|
|
118
120
|
[]
|
|
119
121
|
);
|
|
120
|
-
privateConfig = await db.
|
|
122
|
+
privateConfig = await db.query(
|
|
121
123
|
`select *
|
|
122
124
|
from \`${saasConfig.SAAS_NAME}\`.private_config
|
|
123
125
|
where app_name = ${db.escape(cf.copyApp)} `,
|
|
@@ -125,7 +127,7 @@ export class App {
|
|
|
125
127
|
);
|
|
126
128
|
}
|
|
127
129
|
|
|
128
|
-
await db.
|
|
130
|
+
await db.query(
|
|
129
131
|
`insert into \`${saasConfig.SAAS_NAME}\`.app_config (user, appName, dead_line, \`config\`,
|
|
130
132
|
brand, theme_config, refer_app,
|
|
131
133
|
template_config)
|
|
@@ -145,12 +147,14 @@ export class App {
|
|
|
145
147
|
[this.token!.userID, cf.appName, addDays(new Date(), saasConfig.DEF_DEADLINE)]
|
|
146
148
|
);
|
|
147
149
|
|
|
150
|
+
utTimer.checkPoint('set-sub-domain')
|
|
148
151
|
await this.putSubDomain({
|
|
149
152
|
app_name: cf.appName,
|
|
150
153
|
name: cf.sub_domain,
|
|
151
154
|
});
|
|
152
|
-
|
|
153
|
-
|
|
155
|
+
utTimer.checkPoint('createTable')
|
|
156
|
+
await ApiPublic.createTable(cf.appName);
|
|
157
|
+
utTimer.checkPoint('createTable-finish')
|
|
154
158
|
if (cf.copyWith.indexOf('manager_post') !== -1) {
|
|
155
159
|
for (const dd of await db.query(
|
|
156
160
|
`SELECT *
|
|
@@ -159,7 +163,7 @@ export class App {
|
|
|
159
163
|
)) {
|
|
160
164
|
dd.content = dd.content && JSON.stringify(dd.content);
|
|
161
165
|
dd.userID = this.token!.userID;
|
|
162
|
-
await
|
|
166
|
+
await db.query(
|
|
163
167
|
`
|
|
164
168
|
insert into \`${cf.appName}\`.t_manager_post
|
|
165
169
|
SET ?;
|
|
@@ -175,7 +179,7 @@ export class App {
|
|
|
175
179
|
[]
|
|
176
180
|
)) {
|
|
177
181
|
dd.content = dd.content && JSON.stringify(dd.content);
|
|
178
|
-
await
|
|
182
|
+
await db.query(
|
|
179
183
|
`
|
|
180
184
|
insert into \`${cf.appName}\`.t_post
|
|
181
185
|
SET ?;
|
|
@@ -190,7 +194,14 @@ export class App {
|
|
|
190
194
|
[]
|
|
191
195
|
)) {
|
|
192
196
|
dd.json = dd.json && JSON.stringify(dd.json);
|
|
193
|
-
await
|
|
197
|
+
await db.query(
|
|
198
|
+
`
|
|
199
|
+
delete from \`${cf.appName}\`.t_global_event
|
|
200
|
+
where id>0;
|
|
201
|
+
`,
|
|
202
|
+
[dd]
|
|
203
|
+
);
|
|
204
|
+
await db.query(
|
|
194
205
|
`
|
|
195
206
|
insert into \`${cf.appName}\`.t_global_event
|
|
196
207
|
SET ?;
|
|
@@ -206,7 +217,7 @@ export class App {
|
|
|
206
217
|
)) {
|
|
207
218
|
dd.value = dd.value && JSON.stringify(dd.value);
|
|
208
219
|
if (!['editorGuide', 'guideable', 'guide'].includes(dd.key)) {
|
|
209
|
-
await
|
|
220
|
+
await db.query(
|
|
210
221
|
`
|
|
211
222
|
insert into \`${cf.appName}\`.public_config
|
|
212
223
|
SET ?;
|
|
@@ -232,7 +243,7 @@ export class App {
|
|
|
232
243
|
'message_setting',
|
|
233
244
|
].includes(dd.key)
|
|
234
245
|
) {
|
|
235
|
-
await
|
|
246
|
+
await db.query(
|
|
236
247
|
`
|
|
237
248
|
insert
|
|
238
249
|
ignore into \`${cf.appName}\`.t_user_public_config
|
|
@@ -261,7 +272,7 @@ export class App {
|
|
|
261
272
|
selectCalc: 'volume',
|
|
262
273
|
};
|
|
263
274
|
}
|
|
264
|
-
await
|
|
275
|
+
await db.query(
|
|
265
276
|
`
|
|
266
277
|
insert into \`${saasConfig.SAAS_NAME}\`.private_config (\`app_name\`, \`key\`, \`value\`, updated_at)
|
|
267
278
|
values (?, ?, ?, ?);
|
|
@@ -270,10 +281,11 @@ export class App {
|
|
|
270
281
|
);
|
|
271
282
|
}
|
|
272
283
|
}
|
|
284
|
+
utTimer.checkPoint('copyPageData')
|
|
273
285
|
if (copyPageData) {
|
|
274
286
|
for (const dd of copyPageData) {
|
|
275
287
|
if (dd.tag !== 'index-app') {
|
|
276
|
-
await
|
|
288
|
+
await db.query(
|
|
277
289
|
`
|
|
278
290
|
insert into \`${saasConfig.SAAS_NAME}\`.page_config (userID, appName, tag, \`group\`,
|
|
279
291
|
\`name\`,
|
|
@@ -286,7 +298,7 @@ export class App {
|
|
|
286
298
|
}
|
|
287
299
|
}
|
|
288
300
|
} else {
|
|
289
|
-
await
|
|
301
|
+
await db.query(
|
|
290
302
|
`
|
|
291
303
|
insert into \`${saasConfig.SAAS_NAME}\`.page_config (userID, appName, tag, \`group\`, \`name\`,
|
|
292
304
|
\`config\`, \`page_config\`)
|
|
@@ -295,7 +307,8 @@ export class App {
|
|
|
295
307
|
[this.token!.userID, cf.appName, 'index', '', '首頁']
|
|
296
308
|
);
|
|
297
309
|
}
|
|
298
|
-
|
|
310
|
+
|
|
311
|
+
utTimer.checkPoint('get-store_information')
|
|
299
312
|
const store_information = (
|
|
300
313
|
await db.query(
|
|
301
314
|
`select *
|
|
@@ -304,6 +317,7 @@ export class App {
|
|
|
304
317
|
[`store-information`]
|
|
305
318
|
)
|
|
306
319
|
)[0];
|
|
320
|
+
utTimer.checkPoint('finish-store_information')
|
|
307
321
|
if (store_information) {
|
|
308
322
|
await db.query(
|
|
309
323
|
`delete
|
|
@@ -330,7 +344,9 @@ export class App {
|
|
|
330
344
|
},
|
|
331
345
|
]
|
|
332
346
|
);
|
|
347
|
+
utTimer.checkPoint('createAPP-start')
|
|
333
348
|
await createAPP(cf);
|
|
349
|
+
utTimer.checkPoint('createAPP-finish')
|
|
334
350
|
return true;
|
|
335
351
|
} catch (e: any) {
|
|
336
352
|
await db.query(
|
|
@@ -497,7 +513,7 @@ export class App {
|
|
|
497
513
|
|
|
498
514
|
public async getTemplate(query: { app_name?: string; template_from: 'all' | 'me' }) {
|
|
499
515
|
try {
|
|
500
|
-
return await db.
|
|
516
|
+
return await db.query(
|
|
501
517
|
`
|
|
502
518
|
SELECT user, appName, created_time, dead_line, brand, template_config, template_type, domain
|
|
503
519
|
FROM \`${saasConfig.SAAS_NAME}\`.app_config
|
|
@@ -523,7 +539,7 @@ export class App {
|
|
|
523
539
|
public async getAppConfig(config: { appName: string }) {
|
|
524
540
|
try {
|
|
525
541
|
const data = (
|
|
526
|
-
await db.
|
|
542
|
+
await db.query(
|
|
527
543
|
`
|
|
528
544
|
SELECT config, \`dead_line\`, \`template_config\`, \`template_type\`
|
|
529
545
|
FROM \`${saasConfig.SAAS_NAME}\`.app_config
|
|
@@ -546,7 +562,7 @@ export class App {
|
|
|
546
562
|
|
|
547
563
|
public async getOfficialPlugin() {
|
|
548
564
|
try {
|
|
549
|
-
return await db.
|
|
565
|
+
return await db.query(
|
|
550
566
|
`
|
|
551
567
|
SELECT *
|
|
552
568
|
FROM \`${saasConfig.SAAS_NAME}\`.official_component;
|
|
@@ -782,7 +798,7 @@ export class App {
|
|
|
782
798
|
|
|
783
799
|
return (
|
|
784
800
|
(
|
|
785
|
-
await db.
|
|
801
|
+
await db.query(
|
|
786
802
|
`update \`${saasConfig.SAAS_NAME}\`.app_config
|
|
787
803
|
set config=?,
|
|
788
804
|
update_time=?
|
|
@@ -813,7 +829,7 @@ export class App {
|
|
|
813
829
|
}
|
|
814
830
|
return (
|
|
815
831
|
(
|
|
816
|
-
await db.
|
|
832
|
+
await db.query(
|
|
817
833
|
`update \`${saasConfig.SAAS_NAME}\`.app_config
|
|
818
834
|
set template_config = ?,
|
|
819
835
|
template_type=${template_type}
|
|
@@ -952,7 +968,7 @@ export class App {
|
|
|
952
968
|
// }
|
|
953
969
|
// );
|
|
954
970
|
// });
|
|
955
|
-
await db.
|
|
971
|
+
await db.query(
|
|
956
972
|
`
|
|
957
973
|
update \`${saasConfig.SAAS_NAME}\`.app_config
|
|
958
974
|
set domain=?
|
|
@@ -960,7 +976,7 @@ export class App {
|
|
|
960
976
|
`,
|
|
961
977
|
[null, config.domain]
|
|
962
978
|
);
|
|
963
|
-
return await db.
|
|
979
|
+
return await db.query(
|
|
964
980
|
`
|
|
965
981
|
update \`${saasConfig.SAAS_NAME}\`.app_config
|
|
966
982
|
set domain=?
|
|
@@ -1072,7 +1088,7 @@ export class App {
|
|
|
1072
1088
|
if (!response) {
|
|
1073
1089
|
throw exception.BadRequestError('BAD_REQUEST', '網域驗證失敗', null);
|
|
1074
1090
|
}
|
|
1075
|
-
await db.
|
|
1091
|
+
await db.query(
|
|
1076
1092
|
`
|
|
1077
1093
|
update \`${saasConfig.SAAS_NAME}\`.app_config
|
|
1078
1094
|
set domain=?
|
|
@@ -1080,7 +1096,7 @@ export class App {
|
|
|
1080
1096
|
`,
|
|
1081
1097
|
[null, config.domain]
|
|
1082
1098
|
);
|
|
1083
|
-
return await db.
|
|
1099
|
+
return await db.query(
|
|
1084
1100
|
`
|
|
1085
1101
|
update \`${saasConfig.SAAS_NAME}\`.app_config
|
|
1086
1102
|
set domain=?
|
|
@@ -1099,21 +1115,21 @@ export class App {
|
|
|
1099
1115
|
try {
|
|
1100
1116
|
await new BackendService(config.appName).stopServer();
|
|
1101
1117
|
} catch (e) {}
|
|
1102
|
-
await db.
|
|
1118
|
+
await db.query(
|
|
1103
1119
|
`delete
|
|
1104
1120
|
from \`${saasConfig.SAAS_NAME}\`.app_config
|
|
1105
1121
|
where appName = ${db.escape(config.appName)}
|
|
1106
1122
|
and user = '${this.token!.userID}'`,
|
|
1107
1123
|
[]
|
|
1108
1124
|
);
|
|
1109
|
-
await db.
|
|
1125
|
+
await db.query(
|
|
1110
1126
|
`delete
|
|
1111
1127
|
from \`${saasConfig.SAAS_NAME}\`.page_config
|
|
1112
1128
|
where appName = ${db.escape(config.appName)}
|
|
1113
1129
|
and userID = '${this.token!.userID}'`,
|
|
1114
1130
|
[]
|
|
1115
1131
|
);
|
|
1116
|
-
await db.
|
|
1132
|
+
await db.query(
|
|
1117
1133
|
`delete
|
|
1118
1134
|
from \`${saasConfig.SAAS_NAME}\`.private_config
|
|
1119
1135
|
where app_name = ${db.escape(config.appName)}
|
package/p68kz5exx6.json
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
[{"request":["請問要如何新增訂單","新增訂單該怎麼做"],"response":"請前往訂單管理的「訂單」,點擊右上角「新增」即可新增訂單"},{"request":["請問要如何編輯訂單","編輯訂單該怎麼做","如何修改訂單"],"response":"請前往訂單管理的「訂單」,點擊一份訂單進行編輯操作"},{"request":["請問要如何封存訂單","封存訂單該怎麼做"],"response":"請前往訂單管理的「訂單」,在列表中勾選想要封存的訂單,即可批量封存"},{"request":["請問要如何解除封存訂單","解除封存訂單該怎麼做"],"response":"請前往訂單管理的「已封存訂單」,在列表中勾選想要解除封存的訂單,即可批量解除封存"},{"request":["請問要如何刪除訂單","刪除訂單該怎麼做"],"response":"目前系統沒有設計訂單刪除的功能,僅可勾選想要封存的訂單,將訂單以封存的方式改變狀態"},{"request":["請問要如何搜尋訂單","搜尋訂單該怎麼做","我想要按照日期排序訂單,該怎麼做","可以只顯示付款狀態已付款的訂單嗎"],"response":"請前往訂單管理的「訂單」,在列表左上方可以根據訂單編號、訂購人姓名、商品名稱等進行關鍵字搜尋,也可以在右上選擇篩選和排序,可以做到更仔細的訂單查詢"},{"request":["請問要如何查看訂單狀態","訂單付款狀態如何得知","訂單出貨狀態如何得知","請問出貨狀態在哪"],"response":"請前往訂單管理的「訂單」,點擊任一訂單,在右上角有出貨狀態、付款狀態、訂單進度的顯示,也可以在詳細訂單中查看更多內容"},{"request":["請問要如何匯出訂單列表","匯出訂單列表要怎麼做","有辦法匯出訂單"],"response":"請前往訂單管理的「訂單」,點擊右上角「匯出」即匯出當前搜尋結果的訂單excel檔案"},{"request":["如何上架商品","如何下架商品","有辦法上架或下架多個商品嗎","上架商品","下架商品"],"response":"請前往商品管理的「商品列表」,可直接在列表上下架商品,或勾選多個商品後,點擊「更多操作」來批量更改"},{"request":["請問要如何新增商品","新增商品該怎麼做","新增商品在哪","新增商品","如何添加商品","添加商品該怎麼做"],"response":"請前往商品管理的「商品列表」,點擊右上角「新增」即可新增商品"},{"request":["請問要如何匯出商品列表","匯出商品列表要怎麼做","有辦法匯出商品列表嗎"],"response":"請前往商品管理的「商品列表」,點擊右上角「匯入」或「匯出」,即可匯入多個商品,或匯出當前搜尋結果的商品excel檔案"},{"request":["如何透過訂單編號查詢商品","如何用商品條碼來搜尋商品","有辦法在商品列表中加入篩選嗎","排序建立時間為最新的商品列表"],"response":"請前往商品管理的「商品列表」,在列表左上方可以根據商品名稱、SKU、商品條碼等進行關鍵字搜尋,也可以在右上選擇篩選和排序,可以做到更仔細的商品查詢"},{"request":["如何新增商品規格","如何編輯商品規格","調整商品規格","能更改商品規格的大小、尺寸、顏色、型號嗎","新增規格","如何修改規格"],"response":"請前往商品管理的「商品列表」,點擊任一商品,往下找到「商品規格」欄位,可以新增與編輯規格種類,下方「規格設定」將會顯示所有商品規格的組合"},{"request":["如何修改商品狀態","如何編輯商品狀態為草稿的商品","啟用商品該如何設定","如何讓商品無法購買"],"response":"請前往商品管理的「商品列表」,點擊任一商品,「商品狀態」在右上角,「啟用」為在前台公布並開放購買,「草稿」則在前台暫時不公布也不可購買"},{"request":["如何設定商品價格","商品的原價該怎麼設定","商品的價格該在哪裡設定"],"response":"請前往商品管理的「商品列表」,點擊任一商品,若有多個規格請點擊任一規格,往下找到「定價」欄位,「售價」為消費者商品購買金額,「原價」為較高價格的售價,可依照銷售策略訂定您想要的價格"},{"request":["如何設定商品運費","如何設定商品重量","如何設定商品材積","商品的重量該怎麼設定","商品的材積該在哪裡設定"],"response":"請前往商品管理的「商品列表」,點擊任一商品,若有多個規格請點擊任一規格,往下找到「運費計算」欄位,可針對商品的運費計算方式選擇依照「材積」、「重量」或不計算,並在下方填入商品的單位值,隨後會依照商店設定中「運費設定」的級距後,計算出消費者購物車的運費總金額"},{"request":["如何新增商品分類","商品分類該怎麼設定","商品分類在哪裡設定"],"response":"請前往商品管理的「商品分類」,點擊右上角「新增」,輸入分類標題與連結網址(唯一),並設定該分類的商品與SEO,即可儲存完成新增"},{"request":["如何編輯商品分類","商品分類在哪裡編輯"],"response":"請前往商品管理的「商品分類」,點擊任一商品分類進行編輯"},{"request":["如何刪除商品分類","商品分類在哪裡刪除"],"response":"請前往商品管理的「商品分類」,點擊任一商品分類,下方功能列中按下「刪除類別」,請注意刪除類別時,若有包含子類別,也將一併刪除"},{"request":["如何調整商品分類的順序","想調整商品分類在前台的順序"],"response":"請前往商品管理的「商品分類」,點擊右上角「編輯順序」,可拖曳父子層的類別,進而改變前台瀏覽商品的分類順序"},{"request":["如何設定商店的基本訊息","如何設定商店的基本資料","設定商店名稱和統一編號,該從哪裡開始"],"response":"請前往商店設定的「商店訊息」,在基本資訊欄位可填寫商家資料,作為對外宣傳與首頁資訊"},{"request":["如何設定商店的SEO","如何設定商店的圖示","設定商店縮圖,該從哪裡開始"],"response":"請前往商店設定的「商店訊息」,在SEO欄位可填寫商家在網頁上的SEO設定與圖片,並自訂網域、Google Analytics(GA4)、代碼管理工具"},{"request":["如何編輯商店金流","商店線上或線下金流該怎麼設定","商店的付款方式","atm或貨到付款在哪裡設定","信用卡付款方式在哪裡設定","如何設定line pay"],"response":"請前往商店設定的「金流設定」,可管理線上與線下金流,無論是指定付款方式、付款告知提醒等,商家皆可自訂"},{"request":["如何編輯商店物流","超商配送該怎麼設定","711店到店如何設定","全家店到店如何設定","ok店到店如何設定","萊爾富店到店如何設定","交貨方式在哪裡設定"],"response":"請前往商店設定的「配送設定」,可設定啟用物流的方式,以及設定給消費者的配送說明,超商店到店請詳閱各大超商配送與價格資訊"},{"request":["如何填寫商店物流追蹤","物流追蹤該怎麼設定","如何新增物流追蹤"],"response":"請前往商店設定的「配送設定」,點擊右上角的「物流追蹤設定」,可設定綠界物流參數,設定完成即可達成物流追蹤與托運單列印功能"},{"request":["如何填寫商店物流運費","運費級距該怎麼設定"],"response":"請前往商店設定的「運費設定」,可以設定訂單「總材積」或「總重量」所在的級距,進而計算該訂單運費金額"},{"request":["如何開啟或關閉購物金功能","新加入會員購物金該怎麼設定","購物金的使用期限","生日禮發放購物金的方式","如何設定購物金折抵上限","如何允許購物金是否可折抵"],"response":"請前往商店設定的「購物金設定」,可以設定消費者在訂單結帳時可使用折抵的購物金,以及新註冊加入會員或會員生日禮的購物金自動發放、訂單折抵上限、購物金使用期限等"},{"request":["線上金流有哪些"],"response":"我們有提供「藍新金流」與「綠界金流」的串接,並提供正式測試區切分與多種付款方式"},{"request":["線下金流有哪些"],"response":"我們有提供「ATM轉帳」、「LINE PAY」與基本的「貨到付款」,在不執行線上付款時,可由店家自行與消費者商議付款方式"},{"request":["訂單重量的運費計算方式","訂單材積的運費計算方式"],"response":"訂單內的商品會設定依「重量」或依「材積」,分別做出總計,再按照總計值找出「運費設定」所設定的區間,算出該訂單的運費金額"},{"request":["購物金的用途是什麼","什麼是購物金"],"response":"購物金是商家發送給消費者的訂單可抵用金額,1點購物金代表1元,並搭配新加入會員、生日禮、優惠券,或是手動給予消費者購物金,來達到行銷作用"},{"request":["如何查看商品庫存","什麼是商品庫存"],"response":"請前往商品管理的「庫存列表」,會顯示商品的每個規格中各自的安全庫存與實際庫存數量,可即時查看與編輯值,點擊則可查看商品規格詳細資料"},{"request":["如何設定商品庫存"],"response":"請前往商品管理的「商品列表」,點擊任一商品,若有多個規格請點擊任一規格,往下找到「庫存政策」欄位,可設定是否追蹤庫存,系統將會記錄購買商品時的增減"},{"request":["什麼是安全庫存"],"response":"安全庫存指的是商品啟用庫存追蹤時,若實際庫存低於安全庫存量,系統將會通知商家,商品低於安全庫存量的提醒"},{"request":["什麼是POS"],"response":"POS是指在零售行業中用於處理交易的硬軟體組合。通常包括一台電腦、POS軟體、條碼掃描儀、收銀機、發票列印機和付款處理等設備"},{"request":["如何查看POS訂單","怎麼篩選POS訂單"],"response":"請前往訂單管理的「訂單」,在列表上方可以點選「POS訂單」的標籤,即可查看所有的POS訂單"},{"request":["什麼是已封存訂單"],"response":"已封存的訂單將不會在所有訂單中顯示,需要到訂單管理的「已封存訂單」中解除封存訂單,才會顯示於所有訂單的列表中"},{"request":["如何新增退貨單"],"response":"請前往訂單管理的「退貨單」,點擊右上角新增,輸入想要退貨的訂單編號,並設定退貨單的詳細內容,即可建立退貨單"},{"request":["如何新增顧客"],"response":"請前往顧客管理的「顧客列表」,點擊右上角新增,輸入顧客基本資料,即可新增"},{"request":["如何加入黑名單","什麼是顧客黑名單"],"response":"請前往顧客管理的「顧客列表」,點擊想要加入黑名單的顧客,在顧客詳細右上角點擊「加入黑名單」即可,黑名單的顧客將無法登入與購物車結帳"},{"request":["什麼是顧客分群"],"response":"顧客分群是將所有的顧客分類,目前有提供「電子郵件訂閱者」、「尚未成立有效訂單的顧客」、「已購買多次的顧客」,可透過顧客分群了解到不同客群有哪些會員"},{"request":["什麼是會員等級"],"response":"會員等級是按照顧客訂單消費紀錄來給予不同等級的設定,條件可分為累計蕭累或單次消費,會員等級可以在優惠券、生日禮等活動時,界定不同內容與優惠身份"},{"request":["什麼是優惠券","如何設定優惠券","如何設定優惠促銷活動","優惠券要怎麼新增","如何建立優惠券"],"response":"請前往優惠促銷的「折扣活動」,可以新增一個新的優惠券活動,可指定產品、顧客、設定金額、套用範圍、計算方式等,建立專屬店家的活動"},{"request":["怎樣啟用或關閉優惠券","如何更改優惠券狀態"],"response":"點擊任一優惠券,在設定中有「活動狀態」的按鈕,可以點擊啟用與關閉並儲存"},{"request":["如何設定優惠券代碼","如何指定優惠券可使用的對象","如何指定想要的顧客才可以使用的優惠券","怎麼設定優惠券可使用的來源","如何僅限POS使用優惠券"],"response":"點擊任一優惠券,在設定中有「活動方式」、「活動對象」、「可使用訂單來源」,這些設定可以限制優惠券的使用範圍與來源"},{"request":["如何設定優惠券折扣金額","如何指定優惠券折抵的百分比","怎麼設定優惠券套用的商品分類","指定商品才可以使用優惠券","如何應用優惠券到特定商品"],"response":"點擊任一優惠券,在設定中有「折扣金額」與「套用至」,這些設定可以限制優惠券折扣條件,以及在商品上的套用限制"},{"request":["如何設定優惠券消費條件","如何指定滿額送","怎麼設定優惠券觸發條件","如何設定買幾送幾的優惠券"],"response":"點擊任一優惠券,在設定中有「消費條件」、「計算單位」、「重複觸發」,這些設定可以讓優惠券有其觸發條件、是否重複觸發,以及計算單位的標的"},{"request":["如何設定優惠券使用次數","如何設定全館使用次數","怎麼設定一個人使用優惠券的次數","指定優惠券使用次數"],"response":"點擊任一優惠券,在設定中有「全館總使用次數」與「個人總使用次數」,可以設定在全館或個人,在商店中無限制次數或限制使用次數"},{"request":["如何設定優惠券使用期限","怎麼設定優惠券的開始時間與結束時間","無期限的優惠券要如何設定"],"response":"點擊任一優惠券,在設定中有「有效日期」,可以設定優惠券啟用的開始時間與結束時間"},{"request":["如何刪除優惠券"],"response":"點擊任一優惠券,下方功能列有「刪除優惠券」,或是在列表勾選洗要刪除的優惠券,點擊「批量移除」,即可刪除優惠券"},{"request":["如何新增購物金","如何發放購物金"],"response":"請前往優惠促銷的「購物金紀錄」,點擊右上角新增,輸入欲增加或減少的金額,並設定天數,接著指定顧客,即可完成購物金增減"},{"request":["如何新增隱形賣場"],"response":"請前往行銷推廣的「隱形賣場」,點擊右上角新增,選擇符合您需求的模板,接著設定網頁名稱、連結、SEO,以及賣場內的產品,儲存即可完成隱形賣場"},{"request":["什麼是隱形賣場"],"response":"隱形賣場是指透過專屬的連結,可進入的賣場,只有透過專屬連結進入網站時,才可進入此隱形賣場,進而做到行銷與分流追蹤的目的"},{"request":["如何新增一頁商店"],"response":"請前往行銷推廣的「一頁商店」,點擊右上角新增,選擇符合您需求的模板,接著設定網頁名稱、連結、SEO,以及賣場內的產品,儲存即可完成一頁商店"},{"request":["什麼是一頁商店"],"response":"一頁商店是指透過單一頁面設計,推廣指定商品與類別,讓頁面獨立展現特色,進而做到行銷與分流追蹤的目的"},{"request":["如何設定分銷連結"],"response":"請前往行銷推廣的「分銷連結」,點擊右上角新增,設定分銷代碼、導向的網址、專屬網址,以及分潤條件與類型,並設定推薦人,儲存即可完成分銷連結"},{"request":["什麼是分銷連結"],"response":"分銷連結指的是特別給予推薦人引薦用的商城連結,透過推薦人的廣發與行銷,來達到觸擊連結的效果,讓電商與賣場得到更多關注與曝光率"},{"request":["分銷連結的推薦人是什麼","如何新增推薦人"],"response":"請前往行銷推廣的「推薦人列表」,點擊右上角新增,可新增行銷用的推薦人帳號,並可以在「分銷連結」設定上選取該推薦人"},{"request":["自動寄件是什麼功能","如何使用自動寄件"],"response":"自動寄件是系統在指定事件發生時自動發送的寄信功能,諸如商品出到貨、訂單成立與付款、生日祝福、客服訊息等寄件格式設定,以及是否啟用功能"},{"request":["手動寄件是什麼功能","如何使用手動寄件"],"response":"手動寄件是系統提供商家寄信給消費者的寄信功能,可以指定多個客群或顧客,輸入標題與內文,並指定寄送時間"},{"request":["如何自訂網頁主題","如何設定網站佈景主題","前台網頁要如何設計","什麼是佈景主題","如何修改網站排版","網頁設計該怎麼做"],"response":"請前往品牌官網的「佈景主題」,在第一張卡的右側點擊「自訂」,即可進入頁面編輯系統,在該系統可以自由設定您想要的網站設計與排版"},{"request":["如何新增網誌文章","網誌文章是什麼","如何發佈網誌"],"response":"請前往品牌官網的「網誌文章」,在右上角點擊新增,選定一個模板並設定網誌內容,儲存即建立網誌完成"},{"request":["如何設定分頁","分頁列表是什麼","分頁列表在哪"],"response":"請前往品牌官網的「分頁列表」,列表是自訂新增的連結,可配合「佈景主題」在頁面中自訂添加需要有連結的地方"},{"request":["如何設定選單管理","選單管理是什麼","頁腳連結在哪","導覽列的連結要如何設定","如何設定主選單"],"response":"請前往品牌官網的「選單管理」,選單分為主選單與頁腳,可加入指定的頁面連結與外部連結,系統將自動在每個頁面的頁首頁腳添加超連結"},{"request":["如何切換商店","其他的商城要如何開啟","切換商店的地方在哪","如何新增商店"],"response":"請移動至右上角會員頭像處,點擊「所有商店」,即可查看所有您建立的商店、當前方案與預覽圖"},{"request":["要如何為商品添加圖片和描述","如何新增商品圖片或敘述"],"response":"點擊任一商品編輯,可以在「商品說明」欄位添加商品的敘述,「圖片」則可以新增多張不同角度和種類的圖片"},{"request":["怎樣將商品分類到不同的分類目錄中","可以將商品新增到不同的分類嗎"],"response":"商品可以填加到多個不同的「商品分類」,在父層的商品分類中會同時包含底下的子層商品,讓您的商品有更多方式來分類"},{"request":["如何查看最新的訂單"],"response":"訂單管理的「訂單」列表,預設已按照最新到最舊的方式排列"},{"request":["如何處理待處理的訂單","如何篩選已付款的訂單"],"response":"訂單管理的「訂單」列表右上有篩選器,可以從篩選器中選取訂單裝態處理中、付款狀態已付款等設定"},{"request":["怎樣查看訂單的配送地址","怎樣查看訂購人資料","如何知道訂單的結帳方式"],"response":"訂單管理的「訂單」點選任一訂單,右側有「訂購人資料」、「收件人資料」、「付款方式」、「配送方式」,這些欄位可以讓您清楚知道訂單的消費者資訊"},{"request":["怎樣更新訂單的訂單狀態","如何更新訂單的付款狀態","訂單該怎麼更新出貨狀態"],"response":"訂單管理的「訂單」點選任一訂單,可以查找「訂單狀態」、「付款狀態」、「配送狀態」,這些欄位可以讓您調整訂單的各項狀態"},{"request":["怎樣處理顧客在訂單的疑問","如何回答顧客對訂單的疑問"],"response":"顧客管理的「客服系統」可以針對不同的顧客來專一答覆,顧客在購物車結帳時也可以填寫備註,在訂單詳細裡的「訂單備註」中可以查看"},{"request":["如何查看顧客的訂單紀錄"],"response":"顧客管理的「顧客列表」搜尋顧客後,點擊該顧客,顧客詳細中有「訂單記錄」,可查閱顧客訂單歷史紀錄"},{"request":["怎麼查找顧客的購物金紀錄"],"response":"顧客管理的「顧客列表」搜尋顧客後,點擊該顧客,顧客詳細中有「購物金」,可瞭解到顧客現有購物金餘額,與購物金增減紀錄"},{"request":["怎麼設定免運費"],"response":"請前往優惠促銷的「免運費活動」,可以新增一個免運費優惠券活動,並設定消費條件、觸發方式、使用期限等"}]
|