Explorar el Código

Merge branch 'xinyan' into dev

xinyan hace 5 meses
padre
commit
b724cd515e

+ 1 - 1
src/views/product-manage/Columns.ts

@@ -61,7 +61,7 @@ export const ProductColumns = [
     slots: { default: 'create_datetime' }
   },
   {
-    field: 'operate', title: '操 作', minWidth: 90, align: 'center', fixed: 'right',
+    field: 'operate', title: '操 作', minWidth: 130, align: 'center', fixed: 'right',
     slots: { default: 'operate' }
   }
 ];

+ 8 - 0
src/views/product-manage/product-list/api.ts

@@ -19,6 +19,14 @@ export function updateRow(body: any) {
   });
 }
 
+export function deleteRow(body: any) {
+  return request({
+    url: apiPrefix + `${body.id}/` ,
+    method: 'DELETE',
+    data: body
+  });
+}
+
 export function getGroupOptions() {
   return request({
     url: apiPrefix + 'tags/',

+ 9 - 1
src/views/product-manage/product-list/component/DataTable.vue

@@ -185,6 +185,14 @@ function handleEdit(row: any) {
   rowData.value = row;
 }
 
+async function singleDelete(row: any) {
+	const res = await useResponse(api.deleteRow, row);
+	if (res.code === 2000) {
+		ElMessage.error({ message: '已删除!', plain: true, icon: 'Delete' });
+		handleRefresh();
+	}
+}
+
 function handleNotice(row: any) {
   dialogVisible.value = true;
   rowData.value = row;
@@ -333,7 +341,7 @@ defineExpose({ fetchList });
     <!-- 自定义列插槽 -->
     <template v-for="col in ProductColumns" #[`${col.field}`]="{ row }">
       <DataTableSlot :key="row.id" :field="col.field" :row="row" @edit-row="handleEdit" @handle-notice="handleNotice"
-                     @handle-monitor="switchMonitor" />
+                     @handle-monitor="switchMonitor" @handle-delete="singleDelete"/>
     </template>
   </vxe-grid>
   <EditDrawer v-if="editOpen" v-model="editOpen" :row-data="rowData" @refresh="handleRefresh" />

+ 34 - 2
src/views/product-manage/product-list/component/DataTableSlot.vue

@@ -6,11 +6,12 @@
  */
 
 import { useCountryInfoStore } from '/@/stores/countryInfo';
-import { CopyDocument, Message, Operation } from '@element-plus/icons-vue';
+import { CopyDocument, Delete, InfoFilled, Message, Operation } from '@element-plus/icons-vue';
 import { getTagType } from '/@/utils/useTagColor';
 import PermissionButton from '/@/components/PermissionButton/index.vue';
 import ProductInfo from '/@/views/product-manage/component/ProductInfo.vue';
 import { handleCopy } from '/@/utils/useCopyText';
+import { hasPermission } from '/@/utils/hasPermission';
 // import { BtnPermissionStore } from '/@/stores/btnPermission';
 //
 // const x = BtnPermissionStore();
@@ -22,7 +23,7 @@ const props = defineProps<{
 }>();
 const { row, field } = props;
 
-const emit = defineEmits([ 'edit-row', 'handle-notice', 'handle-monitor' ]);
+const emit = defineEmits([ 'edit-row', 'handle-notice', 'handle-monitor' ,'handle-delete',]);
 
 const countryInfoStore = useCountryInfoStore();
 const country = countryInfoStore.Countries.find(c => c.code == row.country_code);
@@ -35,6 +36,10 @@ function handleEdit() {
   emit('edit-row', row);
 }
 
+function onConfirm() {
+	emit('handle-delete', row);
+}
+
 function handleNotice() {
   emit('handle-notice', row);
 }
@@ -131,6 +136,33 @@ function handleMonitor() {
             </el-icon>
           </PermissionButton>
         </div>
+				<div v-if="hasPermission('GoodsDelete')">
+					<el-popconfirm
+						:icon="InfoFilled"
+						icon-color="#626AEF"
+						title="你确定要删除此项吗?"
+						width="220"
+						@confirm="onConfirm"
+					>
+						<template #reference>
+							<PermissionButton circle plain type="danger">
+								<el-icon>
+									<Delete />
+								</el-icon>
+							</PermissionButton>
+						</template>
+						<template #actions="{ confirm, cancel }">
+							<el-button size="small" @click="cancel">No!</el-button>
+							<el-button
+								size="small"
+								type="danger"
+								@click="confirm"
+							>
+								Yes?
+							</el-button>
+						</template>
+					</el-popconfirm>
+				</div>
         <div>
           <el-tooltip :enterable="false" :show-arrow="false" content="变更通知" hide-after="0"
                       placement="top" popper-class="custom-btn-tooltip-info">

+ 3 - 1
src/views/store-manage/market-store/component/DataTable.vue

@@ -17,6 +17,7 @@ interface Parameter {
   country: string,
   shop: string,
   region: string,
+	platformId: string,
 }
 
 const queryParameter: Parameter | undefined = inject('query-parameter');
@@ -83,7 +84,8 @@ async function fetchList(isQuery = false) {
   const query = {
     country_code: queryParameter?.country,
     region: queryParameter?.region,
-    shop: queryParameter?.shop
+    shop: queryParameter?.shop,
+		platform_number: queryParameter?.platformId,
   };
 
   await useTableData(api.getTableData, query, gridOptions);

+ 8 - 1
src/views/store-manage/market-store/index.vue

@@ -29,7 +29,8 @@ const resetLoading = ref(false);
 const formInline = reactive<any>({
   country: '',
   region: '',
-  shop: ''
+  shop: '',
+	platformId: '',
 });
 provide('query-parameter', formInline);
 
@@ -81,6 +82,12 @@ async function resetParameter() {
                   <el-input v-model="formInline.shop" clearable placeholder="请输入店铺名称" />
                 </div>
               </el-col>
+							<el-col :span="6">
+								<div class="flex items-center">
+									<span class="mr-2">平台编号</span>
+									<el-input v-model="formInline.platformId" clearable placeholder="请输入平台编号" />
+								</div>
+							</el-col>
             </el-row>
           </div>
         </div>

+ 4 - 2
src/views/store-manage/online-merchandise/component/DataTable.vue

@@ -21,7 +21,8 @@ interface Parameter {
   delivery: string,
   status: string,
   asin: string,
-  sku: string
+  sku: string,
+	platformId: string,
 }
 
 const queryParameter: Parameter | undefined = inject('query-parameter');
@@ -92,7 +93,8 @@ async function fetchList(isQuery = false) {
     shop_id: queryParameter?.shop,
     region: queryParameter?.region,
     delivery: queryParameter?.delivery,
-    status: queryParameter?.status
+    status: queryParameter?.status,
+		platform_number: queryParameter?.platformId,
   };
 
   await useTableData(api.getTableData, query, gridOptions);

+ 7 - 0
src/views/store-manage/online-merchandise/index.vue

@@ -36,6 +36,7 @@ const formInline = reactive<any>({
   status: '',
   asin: '',
   sku: '',
+	platformId: '',
 });
 provide('query-parameter', formInline);
 
@@ -134,6 +135,12 @@ async function resetParameter() {
                   <el-input v-model="formInline.sku" clearable placeholder="请输入SKU" />
                 </div>
               </el-col>
+							<el-col :span="6">
+								<div class="flex items-center">
+									<span class="mr-2">平台编号</span>
+									<el-input v-model="formInline.platformId" clearable placeholder="请输入平台编号" />
+								</div>
+							</el-col>
             </el-row>
           </div>
         </div>

+ 9 - 6
src/views/system/login/index.vue

@@ -17,19 +17,22 @@ const storesThemeConfig = useThemeConfig();
 const { themeConfig } = storeToRefs(storesThemeConfig);
 const stores = SystemConfigStore(pinia);
 const { systemConfig }: { systemConfig: any } = storeToRefs(stores);
-console.log("=>(index.vue:20) systemConfig", systemConfig.value);
+
 const keepRecord = computed(() => {
 	return systemConfig.value['login.keep_record'];
 });
 const helpUrl = computed(() => {
 	return systemConfig.value['login.help_url'];
 });
-const privacyUrl= computed(() => {
+const privacyUrl = computed(() => {
 	return systemConfig.value['login.privacy_url'];
 });
 const clauseUrl = computed(() => {
 	return systemConfig.value['login.clause_url'];
 });
+const copyright = computed(() => {
+	return systemConfig.value['login.copyright'];
+});
 
 const state = reactive({
 	tabsActiveName: 'account',
@@ -112,12 +115,12 @@ onMounted(() => {
 		</div>
 
 		<div class="login-authorization">
-			<p>Copyright © 2023-2024 Ansjer 版权所有</p>
+			<p>Copyright &copy; {{ copyright }} 版权所有</p>
+			<!--<p>Copyright © 2023-2024 Ansjer 版权所有</p>-->
 			<p class="la-other">
-				<a href="https://beian.miit.gov.cn" target="_blank">{{keepRecord}}</a>
+				<a href="https://beian.miit.gov.cn" target="_blank">{{ keepRecord }}</a>
 				|
-				<a :href="helpUrl || '#'" target="_blank">帮助</a> |
-				<a :href="privacyUrl || '#'" target="_blank">隐私</a> |
+				<a :href="helpUrl || '#'" target="_blank">帮助</a> | <a :href="privacyUrl || '#'" target="_blank">隐私</a> |
 				<a :href="clauseUrl || '#'" target="_blank">条款</a>
 			</p>
 		</div>

+ 8 - 0
src/views/system/user/api.ts

@@ -88,3 +88,11 @@ export function postAuthorize(body: any) {
         data: body
     })
 }
+
+export function getShops(query: any) {
+    return request({
+        url: '/api/choice/marketplace_shops/select/',
+        method: 'get',
+        params: query
+    })
+}

+ 27 - 1
src/views/system/user/crud.tsx

@@ -346,7 +346,7 @@ export const createCrudOptions = function({ crudExpose }: CreateCrudOptionsProps
         user_type: {
           title: '用户类型',
           search: {
-            show: true
+            show: false
           },
           type: 'dict-select',
           dict: dict({
@@ -363,6 +363,32 @@ export const createCrudOptions = function({ crudExpose }: CreateCrudOptionsProps
             }
           }
         },
+        shop: {
+          title: '授权店铺',
+          type: 'dict-select', // 依旧保持字典选择器类型
+          search: {
+            show: true,
+            component: {
+              props: {
+                filterable: true, // 启用搜索功能
+              },
+            },
+          },
+          dict: dict({
+            // url: '/api/choice/marketplace_shops/select/',
+            value: 'id',
+            label: 'name',
+            getData: () => {
+              return api.getShops({is_all : true}).then(ret => {
+                const extraOption = { id: 0, name: '全部' };
+                return [extraOption, ...ret.data];
+              });
+            }
+          }),
+          column: {
+            show: false,
+          },
+        },
         is_active: {
           title: '状态',
           search: {