2021年4月2日星期五

详解activity,及其生命周期

1:应用程序的启动过程

应用程序的图标被点击-》启动activitythread-》线程的入口main函数-》创建activitythread-》绑定activitythread thread.attach(false,startSeq)-》创建仪表类生命周期,管理程序的生命进程mInstrumentation = new Instrumentation();-》创建上下文Context ContextImpl context = ContextImpl.createAppContext(this,getSystemContext().mPackageInfo);-》创建应用程序 mInitialApplication = context.mPackageInfo.makeApplication(true,null);-》回调application的onCreate方法

启动Activity的流程:

ActivityThread->handleLaunchActivity->performLaunchActivity->创建activity的上下文createBaseContextForActivity->创建启动的⻚面activity=mInstrumentation.newActivity(cl,component.getClassName(), r.intent);->将界面和window绑定activity.attach(appContext,getInstrumentation,window)->调用onCreate方法布局activity界面mInstrumentation.callActivityOnCreate(activity, r.state);->activity.performCreate(icicle);->onCreate(icicle);在Activity的子类中通过实现onCreate方法来对界面进行初始化(UI布局,逻辑初始化)什么是Context上下文ApplicationActivityService有上下文运行环境Context提供了访问系统资源的方法可以理解为就是一个桥梁设备<->Context<->界面

:2:当从写父类的方法时,是否需要调用父类的方法:当父类的实现是空的时,一般是不需要回调的,
如果父类有实现,通常需要使用super调用以下父类,

3:什么是上下文:Context

application activity service是有上下文,运行环境的,context提供了访问系统资源的方法,可以作为一个设备与界面之间的桥梁

4:activity的各个时期所要调用的方法
onCreate()方法:
必须实现此回调,它会在系统创建 Activity 时触发。实现应该初始化 Activity 的基本组
件:例如,在此处创建视图并将数据绑定到列表。最重要的是,在此处调⽤setContentView() 来定义 Activity 界⾯的布局

onStart()方法:
onCreate() 退出后,Activity 将进⼊"已启动"状态,并对⽤户可⻅。此回调包含 Activity 进⼊前台
与⽤户进⾏互动之前的最后准备⼯作。

onResume()方法:
系统会在 Activity 开始与⽤户互动之前调⽤此回调。此时,该 Activity 位于 Activity 堆栈的顶部,
并会捕获所有⽤户输⼊。应⽤的⼤部分核⼼功能都是在 onResume() ⽅法中实现的。

onPause()方法:
当 Activity 失去焦点并进⼊"已暂停"状态时,系统就会调⽤ onPause()。例如,当⽤户点按"返回"
或"最近使⽤的应⽤"按钮时,就会出现此状态。当系统为您的 Activity 调⽤ onPause() 时,从技术
上来说,这意味着您的 Activity 仍然部分可⻅,但⼤多数情况下,这表明⽤户正在离开该
Activity,该 Activity 很快将进⼊"已停⽌"或"已恢复"状态。
如果⽤户希望界⾯继续更新,则处于"已暂停"状态的 Activity 也可以继续更新界⾯。例如,显示导
航地图屏幕或播放媒体播放器的 Activity 就属于此类 Activity。即使此类 Activity 失去了焦点,⽤
户仍希望其界⾯继续更新。

onStop()方法:
当 Activity 对⽤户不再可⻅时,系统会调⽤ onStop()。出现这种情况的原因可能是 Activity 被销
毁,新的 Activity 启动,或者现有的 Activity 正在进⼊"已恢复"状态并覆盖了已停⽌的 Activity。
在所有这些情况下,停⽌的 Activity 都将完全不再可⻅。

onRestart()方法:
当处于"已停⽌"状态的 Activity 即将重启时,系统就会调⽤此回调。onRestart() 会从 Activity 停
⽌时的状态恢复 Activity。
此回调后⾯总是跟着 onStart()。

onDestroy()方法:
系统会在销毁 Activity 之前调⽤此回调。
此回调是 Activity 接收的最后⼀个回调。通常,实现 onDestroy() 是为了确保在销毁 Activity 或包
含该 Activity 的进程时释放该 Activity 的所有资源。

5:不同操作时,activity周期变化
程序第一次启动时:
oncreate->onstart->onResum
程序切换到后台时:
onpause->onstop
程序从后台切换回来时:
onRestart->onStart->onResum
如果当前界面是第一个界面,且按返回按钮时进入桌面时:
onPause->onStop->onDestory
从当前界面切换到其他界面时:
onPause->onStop
从下一个页面切换回来时:
onRestart->onStart->onResum
当由横屏变为竖屏(或由竖屏变横屏)时:
onPause->onStop->onDestory->onCreate->onStart->onResum

在界面被销毁之前会调用
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
}


在界面被销毁之前可以在该方法中存储数据
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putString("lfl","要被销毁了")
}

在onCreate方法中将数据取出
savedInstanceState?.getString("lfl")
用bundle存取数据

用lifecycle监听生命周期:
一:从写一个类,将数据放在该类里面
二:让该类继承与lifecycleobserver
class GaodeMap :LifecycleObserver{
//二:标记,当要什么时候调用就标记成什么时候,
//如init()要在create时就调用,则标记为on_create
//三:添加一个监听器,需要在哪监听该类就在哪加
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
fun init(){
Log.v("lfl","create方法")
}
//该方法会在onStart时调用
@OnLifecycleEvent(Lifecycle.Event.ON_START)
fun connect(){
Log.v("lfl","开始连接获取用户信息")
}

}
三:添加一个监听器,哪个activity需要在各时期调用以上方法,便在哪个activity的类中添加
//添加的生命周期的监听器,
lifecycle.addObserver(GaodeMap())//是需要一个lifecycleobserver参数,但是我们的类是继承于lifecycleobserver,
所以只需要初始化一个该类









原文转载:http://www.shaoqun.com/a/661738.html

跨境电商:https://www.ikjzd.com/

picitup:https://www.ikjzd.com/w/446

beien:https://www.ikjzd.com/w/1336


1:应用程序的启动过程应用程序的图标被点击-》启动activitythread-》线程的入口main函数-》创建activitythread-》绑定activitythreadthread.attach(false,startSeq)-》创建仪表类生命周期,管理程序的生命进程mInstrumentation=newInstrumentation();-》创建上下文ContextContextImp
败欧洲网站:https://www.ikjzd.com/w/1555
浩方:https://www.ikjzd.com/w/1046
西农:https://www.ikjzd.com/w/1368
狗狗快点舔我嗯…啊 听到女房东与她狗狗上演人兽大战我冲了进去:http://lady.shaoqun.com/a/274621.html
女友选择了我却在床上安慰别人:http://lady.shaoqun.com/m/a/273291.html
瑞士电商市场洞察:男性消费频率更高,Wish比亚马逊更受欢迎:https://www.ikjzd.com/home/133670

MySQL视图了解一下

简介

MySQL视图是一种虚拟的表,本身不包含任何数据,可以看作是对SQL查询的封装,它的数据都是动态执行SQL查询的结果。

MySQL视图常见应用主要有以下两种:

  1. 重用SQL语句,简化复杂SQL的操作。

  2. 保护数据,可以给用户授予表特定部分的访问权限,而不是整个表的访问权限。

视图的使用

创建视图

语法:CREATE VIEW <视图名> AS <SELECT语句>

CREATE VIEW student_class_view AS SELECT	t.*, c.class_nameFROM	tb_student tLEFT JOIN tb_class c ON t.class_id = c.class_id;

如上创建了一个名为student_class_view的视图,它包含一个tb_student表和tb_class表的联结查询,现在我们就可以操作表一样操作student_class_view视图了:

SELECT * FROM student_class_view;

输出:

+----+------+-----+-------------+-----------+----------+------------+| id | name | age | phone  | address | class_id | class_name |+----+------+-----+-------------+-----------+----------+------------+| 1 | 小明 | 18 | 188xxxx1234 | xxxxxxxxx |  1 | IT2班  || 2 | 小米 | 28 | 188xxxx1234 | xxxxxxxxx |  2 | IT3班  || 3 | 小看 | 28 | 188xxxx1234 | xxxxxxxxx |  3 | IT1班  || 4 | 小阿 | 38 | 188xxxx1234 | xxxxxxxxx |  3 | IT1班  |+----+------+-----+-------------+-----------+----------+------------+

CREATE VIEW完整语法:

CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] [DEFINER = user] [SQL SECURITY { DEFINER | INVOKER }] VIEW view_name [(column_list)] AS select_statement [WITH [CASCADED | LOCAL] CHECK OPTION]
查看创建视图的语句

语法:SHOW CREATE VIEW <视图名>

SHOW CREATE VIEW student_class_view;

输出:

+--------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+| View    | Create View                                                                                         | character_set_client | collation_connection |+--------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+| student_class_view | CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `student_class_view` AS select `t`.`id` AS `id`,`t`.`name` AS `name`,`t`.`age` AS `age`,`t`.`phone` AS `phone`,`t`.`address` AS `address`,`t`.`class_id` AS `class_id`,`c`.`class_name` AS `class_name` from (`tb_student` `t` left join `tb_class` `c` on((`t`.`class_id` = `c`.`class_id`))) | utf8     | utf8_general_ci  |+--------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+

Create View列为该视图的创建语句。

删除视图

语法:DROP VIEW <视图名>

DROP VIEW student_class_view;

再次查询该视图,视图已被删除:

[SQL]SELECT * FROM student_class_view;[Err] 1146 - Table 'resource.student_class_view' doesn't exist

DROP VIEW完整语法:

DROP VIEW [IF EXISTS] view_name [, view_name] ... [RESTRICT | CASCADE]
修改视图定义

修改视图定义可以使用以下方式:

1.先DROP删除视图,然后重新使用CREATE VIEW创建视图。

2.使用CREATE OR REPLACE VIEW,如果原视图不存在,则会创建新的视图,如果原视图存在,则会替换原视图。

CREATE OR REPLACE VIEW student_class_view AS SELECT...

3.使用ALTER VIEW,原视图必须要存在。

ALTER VIEW student_class_view AS SELECT...

ALTER VIEW完整语法:

ALTER [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] [DEFINER = user] [SQL SECURITY { DEFINER | INVOKER }] VIEW view_name [(column_list)] AS select_statement [WITH [CASCADED | LOCAL] CHECK OPTION]

视图的更新

更新视图是指对视图使用INSERT、UPDATE、DELETE语句,对视图的更新都是直接更新基础表的数据。

并非所有视图都能更新,如果MySQL不能确定要更新的基础数据,则不允许更新

如果视图定义中包含以下操作,则不允许更新:

  • 分组
  • 联结
  • 子查询
  • 聚集函数
  • DISTINCT
  • 导出(计算)列

更新视图的限制挺多,其实影响不大,因为MySQL视图主要用于数据查询,很少会直接更新视图。

参考:MySQL必知必会









原文转载:http://www.shaoqun.com/a/661734.html

跨境电商:https://www.ikjzd.com/

weebly:https://www.ikjzd.com/w/2486

worldfirst:https://www.ikjzd.com/w/289


简介MySQL视图是一种虚拟的表,本身不包含任何数据,可以看作是对SQL查询的封装,它的数据都是动态执行SQL查询的结果。MySQL视图常见应用主要有以下两种:重用SQL语句,简化复杂SQL的操作。保护数据,可以给用户授予表特定部分的访问权限,而不是整个表的访问权限。视图的使用创建视图语法:CREATEVIEW<视图名>AS<SELECT语句>CREATEVIEWstude
olive:https://www.ikjzd.com/w/2025
e邮包:https://www.ikjzd.com/w/594.html?source=tagwish
pocket:https://www.ikjzd.com/w/1903
男朋友半夜把我的腿打开了 他的舌头伸进来好爽:http://lady.shaoqun.com/a/248230.html
亚马逊运营进阶路上,如何通过广告来加速Best Seller速度?:https://www.ikjzd.com/home/23145
卖家故事:做亚马逊的老板太好,我要不要辞职?:https://www.ikjzd.com/home/99377

2021年4月1日星期四

facebook广告优化技巧,了解一下?

回望今年的第一季度,真是个多灾多难的季度,卖家不仅碰上运河拥堵、极端天气和工人罢工导致的物流迟滞,还赶上亚马逊要求缴纳保险和来自各方的征税。

亚马逊卖家作为知名的韭菜大军,在今年这种状况下,都快被割得根都不剩。抗压能力极强的卖家已经慢慢开始习惯,可信用卡突如其来的失效,再一次深深地伤到卖家。

信用卡验证失效

据了解, 有卖家像往常一样,查看邮箱发现一封来自亚马逊的邮件,点开邮件发现是亚马逊提示信用卡信息错误,需要更新信用卡信息。

既然亚马逊都提示了,那就按照要求的要求来更新信息吧。抱着这个想法的卖家重新上传信用卡信息,试图解决问题。但令卖家万万没想到的是,自己已经按照亚马逊要求更新信用卡信息,结果还是没有通过。

卖家思索或许信用卡信息确实有问题,于是决定更换一张信用卡绑定账户,但还是出现了同样的提示。不信邪的卖家,连试了5张卡,都没有绑定成功

察觉到事情不对的卖家开始怀疑这是亚马逊的BUG,于是便在AMZ123卖家交流群里反应自己的情况,并询问是否还有卖家收到邮件提醒。

这条信息发出后,有不少卖家也开始反馈自己的信用卡失效了,需要更新信息。

对于这种情况,不少卖家都感到很愤怒,甚至有卖家气到想和姐夫真人PK。

卖家A:"请亚马逊带上我真挚的问候麻溜地滚。我都没改信息,你还提示信息错误,那不就是你的问题?"

卖家B:"亚马逊这是要把我饭碗掀了!好想让亚马逊高层什么叫做沙包大的拳头!"

卖家C:"我已经因为信用卡无效,被停售了。我上哪找人说理去?积极配合更新就是没通过,我还能咋办?真有你的亚马逊!"

有卖家开始对这种情况产生疑问,并猜测是否又为亚马逊BUG导致。

虽然这位卖家的发言有失偏颇,可一切的怀疑和猜想都必须建立在真实的证据与合理的推断上。这次信用卡失效的真相到底是什么呢?

真是BUG?揭秘真相!

1、可能与银行有关

信用卡失效的情况早在之前就曾出现过两次,第一次出现是在19年,当时是因为亚马逊日本站和招商银行出现矛盾纠纷,导致招商银行阻拦亚马逊预扣款,亚马逊则阻止卖家使用招商银行的信用卡进行提款。

第二次是去年,有卖家反映自己的信用卡突然验证失效,疑惑的卖家开case询问客服,只得到换张新卡的回答。从客服口中没得到到原因的卖家,于是来到论坛发帖求解。

有老练的卖家一下子就猜出,这位卖家应该使用的是招商银行的信用卡。

在帖子的下面也有卖家反映,自己也是出现了同类的情况,使用的也是招商银行的信用卡。

所以当信用卡失效问题重现,就有卖家怀疑是否又是招商银行信用卡的问题。

也有卖家不这么认为,觉得问题可能就是出在卖家的信息上。

2、身份证或信用卡过期

有卖家认为可能是身份证到期或者信用卡到期,并表示自己身边就有因信用卡到期导致信用卡身份验证失败的例子。

还有部分卖家坚定地认为,信用卡验证失效的问题,应该就是亚马逊BUG。

3、亚马逊BUG

有卖家为了验证自己的猜想,便去询问亚马逊客服,客服在邮件中表示:信用卡无效是因为亚马逊系统原因,所以导致信用卡无法通过验证。若系统问题恢复后仍报错,则需要您更换新的信用卡。

难道信用卡失效的原因就是亚马逊的系统BUG吗?在客服回复的中,可以发现在亚马逊修复完系统问题再重新添加信用卡信息,还是有可能会报错。原因也如有卖家分析的一致,信用卡过期和发卡银行确实会使信用卡验证失败。

既然已经了解原因,那卖家应该如何解决信用卡无效的问题呢?

解决办法

1、重新上传信息

在亚马逊系统问题修复后,卖家再次尝试添加信用卡信息。

2、换新的信用卡

如果重新上传依然报错,卖家需要先检查信用卡是否过期或者询问发卡银行自己办理的信用卡是否符合亚马逊给出的要求。

如果是信用卡过期,卖家本人需要带上身份证前往银行办理换卡业务,或者也可以选择网上换卡,让银行将新的信用卡邮寄上门。

如果是办理的信用卡不符合亚马逊给出的要求,卖家需要办理一张新的符合要求的银行卡。

希望亚马逊赶紧修复BUG,不要因此影响到卖家的正常经营,而卖家在运营的时候,不光要关心销量和库存,更要关注自己的身份信息是否正确。



来源:AMZ123


文章来源:https://www.ikjzd.com/home/143736

跨境电商:https://www.ikjzd.com/

淘粉吧返利:https://www.ikjzd.com/w/1725

邮乐:https://www.ikjzd.com/w/1776

跨境通:https://www.ikjzd.com/w/1329

facebook广告优化技巧,了解一下?

回望今年的第一季度,真是个多灾多难的季度,卖家不仅碰上运河拥堵、极端天气和工人罢工导致的物流迟滞,还赶上亚马逊要求缴纳保险和来自各方的征税。

abp加DDD开发:低耦合、可复用、可扩展的【工单】业务模块-简介和集成

前言

很多场景【单体+模块化】比微服务更合适,开发难度低、代码可复用性强、可扩展性强。模块化开发有些难点,模块启动与卸载、模块之间的依赖和通讯。asp.net core abp为我们提供了模块化开发能力及其它基础功能。基于abp(一代6.3)结合DDD已基本开发好一个【工单管理模块】,本篇做个基本介绍并说明如何集成此模块,后续会详细说明思路。

资源

线上demo 密码:123qwe

后端源码:https://gitee.com/bxjg1987/abp

前端源码:https://gitee.com/bxjg1987/front

必备知识

熟悉asp.net core和abp(注意是老版本,非vNext,但也很容易迁移到vNext上)

术语

下文会提供到一些概念,理解这个黑重要。

abp模块:这个不解释了,是abp基础,请参考官方文档

通用模块:这个是使用abp模块开发方式做的一些通用的,与具体业务无关的模块,比如:数据字典模块

业务模块:工单管理、广告管理、电商模块等为了实现具体业务的模块。

业务场景

客户是做复印机出租的,它希望做一套系统管理整个业务,其中工单是一个比较重要的模块,大致流程如下:

  1. 客户通过小程序上报工单,说明什么设备出了什么问题
  2. 系统后台管理员查看下大致问题后审核    
  3. 后台管理员将已审核的工单分配给指定维修人员,或维修人员通过app自己领取已审核的工单
  4. 当维修人员到达客户处,通过app将工单设置为已执行状态
  5. 当维修人员处理完任务后通过app将工单设置为已完成状态,同时可能需要录入完成情况说明

以上是主体流程,还有些边角的以后文章会详细说明,比如:从审核状态跳跃到已完成状态;从已完成状态回退到待审核状态;状态变化时的事件等。

工单类型不同:有些工单可能并不是客户提交的,比如当采购的二手设备入库时要做检修,也会产生工单,这种情况工单不会与客户关联,而时与入库单关联;再比如让某员工开车去托快递回来这种情况工单会与物流信息关联

工单创建方式不同:客户通过小程序提交、后台管理员手动建立、当发生某些事件时自动创建(比如采购入库时自动创建)

其实工单管理模块是个通用的业务,在很多系统可能都需要,因此考虑做成独立的业务模块,方便复用。

目标

可复用

工单模块以nuget包发布,你可以安装后简单配置后就可以使用。

易升级

上面说了,以nuget包形式发布的,将来模块更新后发布新版本的nuget包,各系统更新下,引用新版本包就ok啦

独立性

工单模块只依赖些通用的、非业务型的模块。工单模块需要用到"员工"概念,在系统中往往体现为一个用户,工单模块本身不提供"员工管理"的功能,因为你的系统可能有自己的"员工管理"功能;或你直接拿abp原始的 AbpUser作为员工也行。试想如果"工单模块"本身提供了员工管理模块,你引用过去,发现自己系统中已有实现了的员工管理,是不是很麻烦?

所以你的项目引用工单模块时需要做个适配,为工单模块提供需要用到的员工相关功能,主要是几个查询。

说明:

abp vNext使用契约层来实现模块独立化,个人认为不完整,比如你的项目中有个"员工管理"模块,你在定义契约接口和DTO时只能定义通用的,为了尽量通用,接口中的方法会尽量多,或分开多定义几个接口,DTO中的属性也会尽量多,因为你不知道将来哪各模块引用你,所以你无法定义准确的、刚好够用的接口和DTO。

现在有各"工资管理"模块,引用你的"员工管理模块",它会拿到DTO中很多不必要的属性,也会在引入接口时拿到很多不需要的方法。

再比如我的"工单模块"如果直接引用你的契约,将来我发布工单模块,其它系统引用后,它必须去实现"员工契约"中的接口,它会很迷茫,我要实现这个契约中所有的接口吗?DTO所有的属性我都需要赋值吗?其实某些契约中的接口方法工单模块可能根本不需要,同理契约中的DTO也不一定都需要赋值。

还有更多问题,这些问题不影响使用,但挺别扭。出现这样的原因,是独立的业务模块应该在契约中定义自己能向外提供什么数据之外,还应该定义自己需要什么,而不是让别的模块的契约来指定

我们在开发工单模块时,会从这两个方向来定义契约,即:工单模块需要什么数据?工单模块能向外提供什么数据?

可扩展

abp本身提供了很强的扩展能力,你可以

  1. 通过"动态属性系统"来扩展实体类
  2. 通过工单CRUD、工单状态变化等事件来添加自己的业务逻辑
  3. 通过集成并替换工单模块提供领域服务、应用服务来重写现有业务逻辑
  4. 默认的UI只是结合我自己的项目用easyui实现的,你可以实现自己的UI
  5. 通过集成抽象工单实体、抽象工单的领域服务、抽象的工单应用服务来实现更多的工单类型

使用DDD开发方式

实践下DDD

核心业务逻辑在工单实体类中,它定义了相应的业务方法,内部会改变工单实体自身的一些状态,必要时触发相应事件,以此来确保工单始终能处于正确的状态,比如:某个已完成的工单无关联的员工或没有开始和完成时间;再比如某个已拒绝的工单,没有拒绝说明。如果实体的属性都是public get; set; 很容易出现这种问题,因为协作开发时别人很可能胡乱调用你的实体,随意设置值。

领域服务有少量代码,也触发相应的领域事件。

应用服务来接收前端调用,协调领域实体和服务来实现业务逻辑。

关于DDD下篇详细说明设计思路时再细说

集成

可扩展性中提到工单是抽象化的,但默认提供了一个"普通工单"的实现,因此安装并配置模块后此功能立即可用。另外也可用提供几个子类实现一个自定义类型的工单。

线上demo 账号:admin 密码:123qwe

先在abp官方下载一个干净的abp项目,写此文章时用的abp6.3 .net 5。或者你可用在你目前的项目引入并测试。按以下步骤进行配置。

安装nuget包

相关nuget包都是以:BXJG.WorkOrder为前缀的。

先确保:

在解决方案上右键 > 管理解决方案的包 > 更新 -> Castle.Windsor.MsDependencyInjection 升级到3.4.0

在解决方案上右键 > 管理解决方案的包 > 更新 -> Microsoft.EntityFrameworkCore 更新到5.0.4

XXX.Core层中

Install-Package BXJG.WorkOrder.EFCore -Version 1.0.0-rc

XXX.EntityFrameworkCore层中

Install-Package BXJG.WorkOrder.EFCore -Version 1.0.0-rc

XXX.Application层中

Install-Package BXJG.WorkOrder.Application -Version 1.0.0-rc
Install-Package BXJG.WorkOrder.EmployeeApplication -Version 1.0.0-rc

工单模块中,后台管理工单和员工端对工单的操作是分开两个应用层项目定义的,根据你的情况决定是否分开,若分开则上面的包需要分开安装。

配置

在DbContext中注册相关实体

由于工单模块没有使用独立DbContext的方式,因此需要在你的主程序的DbContext中注册并配置"普通工单"和"工单分类"的实体。在XXX.EntityFrameworkCore层中找到你的DbContext,做如下配置:

1   public virtual DbSet<BXJG.WorkOrder.WorkOrderCategory.CategoryEntity> BXJGWorkOrderCategory { get; set; }2   public virtual DbSet<BXJG.WorkOrder.WorkOrder.OrderEntity> BXJGWorkOrder { get; set; }3 4   protected override void OnModelCreating(ModelBuilder modelBuilder)5   {6    base.OnModelCreating(modelBuilder);7    modelBuilder.ApplyConfigurationBXJGWorkOrder();//别忘了这里的映射配置8   }

注册权限和菜单

普通工单后台管理和员工端相关权限已定义为扩展方法,可以直接在主程序中调用,将其注册到主程序的权限树中。在XXX.Core/Authorization/XXXAuthorizationProvider中注册【普通工单】和【工单分类】的权限,为了演示将权限注册在了租户权限下面。

1 //注意这里的admin是指你已经存在的权限节点2 admin.AddBXJGWorkOrderPermission();3 admin.AddBXJGEmployeeWorkOrderPermission();

同理在BXJG.Web.Mvc/Startup/XXXNavigationProvider中注册【普通工单】和【工单分类】的菜单

context.Manager.MainMenu.AddBXJGWorkOrderNavigation();

注册动态api

由于开发模块时不确定你会如何使用工单模块的应用层,因此默认并未自动注册为动态web api,如果需要你可以自己配置,目前是手动,将来可能提供扩展方法一次性注册。在XXX.Web.Core/XXXWebCoreModule的PreInitialize()中配置启用工单模块中普通工单和工单分类的相关动态web api

1 //注册后台管理工单的动态api   
Configuration.Modules.AbpAspNetCore().CreateControllersForAppServices(typeof(BXJG.WorkOrder.ApplicationModule).Assembly,"bxjgworkorder");2 //注册后台和员工端管理工单的动态api
Configuration.Modules.AbpAspNetCore().CreateControllersForAppServices(typeof(BXJG.WorkOrder.BXJGCommonApplicationModule).Assembly, "bxjgworkorder");3 //注册员工端管理工单的动态api
Configuration.Modules.AbpAspNetCore().CreateControllersForAppServices(typeof(BXJG.WorkOrder.BXJGWorkOrderEmployeeApplicationModule).Assembly, "bxjgworkorder");

添加模块依赖

虽然已添加了模块相关包引用,但此时这些包对于主程序来说仅仅是普通的dll,必须按abp的方式,让主程序的模块依赖工单模块,这样工单模块中的dll才会以Abp模块方式启动。由于工单模块只提供到应用程序级别,因此在主程序的Application层中的Module类中添加依赖是最合适的。在XXX.Application/XXXApplicationModule中添加模块依赖

 [DependsOn(略...    typeof(BXJG.WorkOrder.ApplicationModule),    
typeof(BXJG.WorkOrder.BXJGWorkOrderEmployeeApplicationModule))] public class XXXApplicationModule : AbpModule {

添加模块适配代码

如前所述,工单模块不提供员工管理功能,但依赖员工信息,因此你需要提供一个适配,这也是完全独立的工单模块的关键。在XXXApplication中新增WorkOrder文件夹,然后定义如代码

 1  public class EmployeeAppService : IEmployeeAppService 2  { 3   private readonly IRepository<User, long> userRepository; 4   public IAsyncQueryableExecuter AsyncQueryableExecuter { get; set; } = NullAsyncQueryableExecuter.Instance; 5   public EmployeeAppService(IRepository<User, long> userRepository) 6   { 7    this.userRepository = userRepository; 8   } 9 10   public async Task<IEnumerable<EmployeeDto>> GetByIdsAsync(params string[] ids)11   {12    var query = userRepository.GetAll()13          .Where(c => ids.Contains(c.Id.ToString()))14          .Select(c => new EmployeeDto15           {16           Id = c.Id.ToString(),17           Name = c.Name,18           Phone = c.PhoneNumber19           });20    return await AsyncQueryableExecuter.ToListAsync(query);21   }22 23   public async Task<IEnumerable<string>> GetIdsByKeywordAsync(string keyword)24   {25    var query = userRepository.GetAll()26          .WhereIf(!keyword.IsNullOrEmpty(), c => c.Name.Contains(keyword) || c.PhoneNumber.Contains(keyword))27          .Select(c => c.Id.ToString());28    return await AsyncQueryableExecuter.ToListAsync(query);29   }30 31   public async Task<IEnumerable<EmployeeDto>> GetAllAsync(string keyword)32   {33    var query = userRepository.GetAll()34          .WhereIf(!keyword.IsNullOrEmpty(), c => c.Name.Contains(keyword) || c.PhoneNumber.Contains(keyword))35          .Select(c => new EmployeeDto36           {37           Id = c.Id.ToString(),38           Name = c.Name,39           Phone = c.PhoneNumber40           });41    return await AsyncQueryableExecuter.ToListAsync(query);42   }43  }44  public class EmployeeSession : IEmployeeSession45  {46   private readonly IAbpSession abpSession;47 48   public EmployeeSession(IAbpSession abpSession)49   {50    this.abpSession = abpSession;51   }52 53   public string CurrentEmployeeId => abpSession.UserId?.ToString();54  }

当然还需要在XXXApplication中的Model文件的Initialize()中配置依赖注入

IocManager.Register<IEmployeeAppService, WorkOrder.EmployeeAppService>(DependencyLifeStyle.Transient);IocManager.Register<IEmployeeSession, EmployeeSession>(DependencyLifeStyle.Transient);

数据库迁移

这个是按abp的套路,这不再详述。注意abp默认下载来的项目连接字符串是连接到localhost的,而vs2019的localdb稍有不同,我是改成如下形式的,你看着办

"Default": "Server=(localDB)\\mssqllocaldb; Database=BXJGDB; Trusted_Connection=True;"

运行

不出意外的话接口就可以访问了

  

  • WorkOrder:后台管理员对工单进行管理的接口,其中ChangeStatus是将工单跳跃或回退到指定状态,这个操作不是一步到位的,比如从"待审核"状态 跳跃到 "已完成"中间会经历:确认、分配、执行、完成等步骤,操作员必须有这些步骤的权限,切工单状态必须正确(打个比方,分配时会判断工单是否已关联的处理人,只是假设,目前没做这个限制),这部分逻辑大多在工单实体中。
  • WorkOrderCategory:后台管理员对工单分类进行维护的接口
  • WorkOrderCommon:员工端或后台管理端都可以调用的接口,用来获取工单状态列表、紧急程度列表等
  • WorkOrderEmployee:员工端对工单进行操作的接口,获取待分配的工单、执行、完成工单等。 

后续

  • 目前已实现真正的独立的业务模块
  • 配置还需要进一步简化
  • 目前只是基本能跑通工单流程,未作详细测试。
  • 上面说明了模块的基本集成,以及模块内默认实现的"普通工单"的功能,如何扩展后续会说明,比如:实现自定义类型的工单、如何通过继承、事件等方式来扩展工单模块等。
  • 目前模块只提供到应用层级别,也就是只提供后端接口,前端我使用的easyui,虽然可以使用abp的虚拟文件系统来实现UI模块化,但目前没有这样做,你可以使用自己喜欢的框架来完成UI








原文转载:http://www.shaoqun.com/a/659726.html

跨境电商:https://www.ikjzd.com/

斑马物联网:https://www.ikjzd.com/w/1316

邮乐:https://www.ikjzd.com/w/1776


前言很多场景【单体+模块化】比微服务更合适,开发难度低、代码可复用性强、可扩展性强。模块化开发有些难点,模块启动与卸载、模块之间的依赖和通讯。asp.netcoreabp为我们提供了模块化开发能力及其它基础功能。基于abp(一代6.3)结合DDD已基本开发好一个【工单管理模块】,本篇做个基本介绍并说明如何集成此模块,后续会详细说明思路。资源线上demo密码:123qwe后端源码:https://g
聚贸:https://www.ikjzd.com/w/1305
tradekey:https://www.ikjzd.com/w/1630
epa认证:https://www.ikjzd.com/w/1769
盘点2019年eBay十大动向:https://www.ikjzd.com/home/114273
跨境电商卖家必看!意法西到底要不要注册VAT?:https://www.ikjzd.com/home/101448
如何打造一个优秀的listing来带动产品的销量和转化率?:https://www.ikjzd.com/home/15747

亚马逊卖家常见的6大侵权问题,如何解决?

在亚马逊上销售商品有很多优势,如拥有庞大的买家群、全球品牌知名度、安装和使用方便等,但会有一些不法卖家会侵犯你的利益。下面就为大家介绍,通常在亚马逊上会遇到的一些问题以及如何保护自己的listing和品牌不受侵害。

问题1:Hijacked Listings

"Hijacked Listings"是指有些卖家使用相同的listing出售和你相似的假冒商品,还可能会抢走了你的Buy Box。

如果你遇到这种情况,可以参考以下建议:

▪ 单击产品页面上的卖家名称,然后选择"Ask A Question"按钮。然后给他们发送一封终止函,说明下你是该lisitng的原始所有者,要求他们停止销售此类商品,并告知他们的行为已违反了亚马逊的服务条款。

▪ 向亚马逊投诉,无论你是否是品牌注册者。

▪ 与律师联系,交给他们处理。

问题2:Piggybacked Listings

与"Hijacked Listings"密切相关的是,"Piggybacked Listings"是指有些卖家也在销售你的商品,但不是假冒商品。

但是,仅仅看一眼几乎无法分辨其是否是你的产品,所以最好的做法是购买一个并仔细检查它是否真正属于你。

虽然美国法律允许卖家转售商品,但亚马逊的ToS规定,同一ASIN不能有重复的listing,因此你的选择受到更多限制。

为了应对这种问题并确保你的listing的安全,唯一的方法是,要找出他们的采购货源并尝试切断供应。

问题3:版权或商标侵权( Copyright or Trademark Infringement)

版权通常与创意作品有关,比如你的logo、图像、产品包装设计和listing。一旦由你自己创建了这些,只要是原创,这个版权就归你所有。

另一方面,商标更多地与公司本身有关,即品牌名称、产品名称、标语等。

如果你发现一个卖家存在侵犯了你的版权或商标权的行为,采取与"Piggybacked Listings"时相同的步骤给对方发一封终止信函,通过Amazon Brand Registry或the infringement violation report向亚马逊投诉。

你将遵循与商标侵权几乎相同的步骤,但是当你发送终止函或填写侵权违规表格时,要收集尽可能多的证据。投诉能否获得成功,取决于你能否可以证明自己是原始所有者/设计者。

问题4:专利侵权(Patent Infringement)

尽管上述介绍的问题涉及的是对创意和专有信息的侵犯,但专利涉及的是与创新或发明有关,主要有两种。

▪ 实用专利,保护的是产品的使用或生产。这些专利本质上是技术性很强的,因此它们可能很昂贵,并且需要很长时间才能获得保护。

▪ 设计专利,保护的是产品的设计和外观。这些专利通常需要较少的时间来确保安全,价格更便宜,但你需要证明部分或全部的设计是100%的原创。

一旦发现你的专利受到侵害,你可以像处理版权和商标侵权一样处理专利侵权,唯一的不同是,对于实用专利,你可以使用亚马逊的专利中性评估服务。

问题5:知识产权侵权索赔(IP Infringement Claim)

知识产权自身涉及专利、商标、版权、商业秘密等领域,其保护的权利内容、权利边界等有各自的特点。

如果你遇到了一个卖家对你提出了一个虚假的知识产权索赔,你可以这么做:

▪ 给这个卖家发电子邮件(用亚马逊提供的电子邮件地址),并问他们概述下你侵犯了哪些知识产权。保持冷静、理智是关键,因为你的目标是尽快解决这个问题。

▪ 然后从这个卖家那里获取更多详细信息。如果你可能确实侵犯了他们的知识产权,那么你就应该尽可能多地获取信息。

▪ 最后,如果他们的知识产权侵权索赔是毫无根据的,那么你需要向亚马逊提交反DMCA通知。

问题6:虚假评论(Fake Reviews)

尽管亚马逊已经大力打击那些虚假的一星或五星评论的买家,但是这一情况仍然存在。区分虚假评论的一个清晰方法是,他们是否有认证标志(Verified badg),另一种方法是检查listing的评论中出现的共同关键词,然后找出虚假评论。

在采取任何措施之前,把所有你认为可疑的评论截屏,尽可能多地查找和截图评论。对于虚假评论,联系"Seller Support ",并向他们提供详细信息和评论截图。

保护品牌的最佳方法

在遇到上述问题之前,卖家可以参考以下建议来保护自己的品牌:

▪ 把你的商标放在包括在产品和它的包装上的任何地方。

▪ 使用亚马逊提供的条形码(FNSKU)代替制造商提供的条形码。

▪ 通过两步验证登录,在卖家中心上保护你的帐户。

▪ 考虑使用第三方应用程序,它会提醒你可能的可疑行为,如更改你的描述或图像等。

▪ 为你的品牌和标志申请一个正式的商标。

▪ 加入Amazon Brand Registry,这样你的品牌和产品就会被分类和识别出来。

▪ 进一步利用Amazon Transparency,它会为你的产品分配一个独特的条形码。

在Amazon Project Zero中直接采取另外两个步骤,类似于Transparency,但功能更大,你可以自行删除listing,而无需等待亚马逊来完成。

如果你是Brand Registry的一员,你可以在你的品牌或特定的ASINs上使用品牌控制,这样就可以保护你的品牌和listing。



(来源:卖家之家)


文章来源:https://www.ikjzd.com/home/143734

跨境电商:https://www.ikjzd.com/

farfetch:https://www.ikjzd.com/w/2133

环球b2b:https://www.ikjzd.com/w/1762

易麦:https://www.ikjzd.com/w/2048

亚马逊卖家常见的6大侵权问题,如何解决?

在亚马逊上销售商品有很多优势,如拥有庞大的买家群、全球品牌知名度、安装和使用方便等,但会有一些不法卖家会侵犯你的利益。下面就为大家介绍,通常在亚马逊上会遇到的一些问题以及如何保护自己的listing和品牌不受侵害。

两个方法,让体重悄悄减!根本不用费什么劲

核心提示:减肥到底一个月能瘦多少斤?很多人认为这跟跟人努力程度有关,说的没错,但是一个月到底减肥多少件算正常呢?

减肥,三分练七分吃,一个月下来,有的人也就瘦下去两三斤,练也练了,东西少吃了,这个数字让很多人不满意,到底怎么回事?到底一个月减肥应该掉多少才正常?


如果你想安全有效的瘦下来,一定不要去纠结时间,享受你运动流的每一滴汗、每一点苦,最后你收获的绝对不止体重秤上的数字。

一个月最多瘦多少,这个是有前提的。首先是你的基数,100kg跟50kg,前者一个月瘦20斤也不奇怪,后者一个月瘦8斤都伤身体。再来就是你的基础代谢和肌肉含量,两个人做同样的训练,效果是不一样的,原因就在于肌肉质量较高的那个人代谢会较多。所以想要减脂一定不要只做有氧运动,适当的力量训练会让你的减脂效果更加显著。

健康减肥法才是正道

减肥不可急于求成,慢慢的采取健康减肥的方法才是正道。而健康减肥关键就是要做到控制饮食、坚持运动。总的来说,就是最简单的6个字:管住嘴,迈开腿。

1、饮食减肥首先要控制进食量。很多人的胖都是吃出来了,所以必须要把吃出来的胖吃回去。控制每天的热量摄入低于1500大卡,少吃高热量食物,多吃蔬菜、水果和粗粮;一日三餐不可少,吃饭保持七分饱即可;零食可以适量吃,建议以低热量零食代替高热量零食,如酸奶代替冰激凌。


2、运动减肥方面,每天要坚持90分钟以上的运动时间,每次进行有氧运动时间需要超过30分钟,运动形式方面尽量多样。但如果你的基数大,建议不要做跳绳、跑步、爬楼梯这种对关节负担大的运动。除了每周安排3~5次的中等强度的有氧运动以外,建议每周安排2~3次的力量训练。

无论是运动员们,还是普通百姓,适当的控制体重,对于健康是有好处的,但是这需要科学的减肥、减重,在民间,流传着许多减肥的秘方:什么饥饿减肥、运动减肥、药物减肥、寄生虫减肥等许多种,还有只吃菜,不吃饭的减肥方法,这些方法或许有减肥效果,但对于身体都是有害的。过快的减轻体重是不科学的,也是危险的。因此,我们想告诉大家,减肥不搞"大跃进"。


原文转载:http://health.shaoqun.com/a/214126.html

跨境电商:https://www.ikjzd.com/

识货:https://www.ikjzd.com/w/1745

一淘网比价平台:https://www.ikjzd.com/w/1698


核心提示:减肥到底一个月能瘦多少斤?很多人认为这跟跟人努力程度有关,说的没错,但是一个月到底减肥多少件算正常呢? 减肥,三分练七分吃,一个月下来,有的人也就瘦下去两三斤,练也练了,东西少吃了,这个数字让很多人不满意,到底怎么回事?到底一个月减肥应该掉多少才正常?如果你想安全有效的瘦下来,一定不要去纠结时间,享受你运动流的每一滴汗、每一点苦,最后你收获的绝对不止体重秤上的数字。一个月最多瘦多少,这个
贝贝网:https://www.ikjzd.com/w/1321
深诺互动:https://www.ikjzd.com/w/2746
打折网站:https://www.ikjzd.com/w/74
我把女校花处破了 校花在教室把第一次给我了:http://lady.shaoqun.com/a/247321.html
换妻游戏没能给我带来难忘的快感(3/3):http://lady.shaoqun.com/m/a/66904.html
震惊!亚马逊日本站遭疯狂上VP差评,欧美站的各种恶习已经快速蔓延至日本站!:https://www.ikjzd.com/home/12860

中国跨境电商出口激增40% 供应端支付电子化需求加剧

受全球疫情的影响,中国跨境电商的进出口出现了爆发式增长,其中,2020年跨境电商的出口同比增长超过40%,成为稳外贸的重要力量;同期,跨境电商零售进口的规模已突破1000亿元。

与之相对应的是,除了面向消费端的支付之外,供应端的企业跨境支付方式也在发生显著改变——电子化或数字化成为重要趋势。帮助外贸和制造企业实现订单和支付的线上同步,以实现更高效的现金流管理,也成为越来越多支付领域的企业瞄准的商机。

支付方式加速电子化

金融服务科技企业FIS旗下的Worldpay近期发布的《2021年全球支付报告》(The Global Payments Report 2021,下称《报告》)显示,随着电子商务的激增,电子钱包蓬勃发展。作为全球电商消费者的首选支付方式,电子钱包在2020年的使用率占电商交易量的44.5%,同比2019年增长了6.5%。

《报告》提出,全球范围内,中国的消费者最喜欢使用电子钱包,电子钱包使用率占电商交易量的72.1%。在美国(其电子/手机钱包使用率低于全球平均水平),电子钱包使用率占电商交易量的29.8%,比2019年增长了23.7%。

不只是消费端,企业之间的支付也在加速拥抱线上系统。

WorldPay中国区总经理施南飞对第一财经表示,2019年,B2B市场的支票支付占了很大一部分,约占29%,其中三分之二来自于中小企业。受疫情影响,B2B支付的电子化趋势明显上升。2020年,虚拟卡的B2B支付提升了11%之多,达到了1.6万亿美元的市场规模,预计2021年~2025年,虚拟卡可能会增长2倍以上。

施南飞告诉第一财经,他们在全球的最大客户之一,就是一家中国的制造企业,服务是"通过ERP系统(企业资源计划),帮助企业把订单系统和支付环节打通"。根据他的观察,越来越多的中国企业,尤其是零售和制造业的企业,正在加快支付的电子化,通过在线的方式来解决订单的支付,以实现数据流和资金流的一致。

在施南飞看来,传统的外贸及制造企业一般是"线上下单、线下支付"的模式,或者即使是在线支付,也主要是通过网银转账或电子支票等方式来完成,和实际订单并不能完全匹配。这种方式必然会产生大量管理成本,比如需要人力去做清算和对账,而且还会产生应收账款等问题。

一站式外贸企业跨境金融和风控服务公司XTransfer创始人兼CEO邓国标对第一财经表示,受疫情的影响,B2B跨境电商的线上支付比重在上升。不过,目前大家所熟知的支付工具大都是为B2C的跨境电商业务打造的,作为全球贸易主流的B2B业务却还没有能很好匹配需求的线上支付工具。

"比如有些线上支付工具,B2B业务也能使用,但价格会很贵。而且B2C的业务中,用户对于产品不满意是可以拿回钱的,但B2B却不能支持。"邓国标表示,目前大部分企业之间的跨境贸易,都还是依赖传统国际电汇来完成。疫情加速了企业电子化的过程,也为它们提供了更多B2B的客户群体。

邓国标提出,和B2C的跨境电商相比,B2B的跨境电商及支付领域,不仅体量更大,为前者的10~20倍,而且也尚未出现任何大平台来一统江湖,因此,这个领域存在挑战的同时,也存在很大的机遇。

如何解决企业端的痛点

"B2B的支付领域很大,我们看到的不仅仅是中国企业,全球企业的痛点都是如何有效管理现金流。"根据施南飞的经验,企业客户碰到的痛点之一即支付速度的问题。如果能让支付电子化并与下单同步,不仅可以大幅降低成本,还可以实现与订单匹配的自动结算,保障支付速度,从而提高现金流的管理效率。

XTransfer提供的服务,简言之即帮助中国从事跨境电商B2B的中小微企业实现外贸收款。除了加快资金周转的速度,邓国标提出,企业的另一个痛点是风险管控。

"在B2B的交易里,以往企业更多是依赖银行账户来周转资金,这个过程中需要由银行来管控反洗钱等风险,而传统银行缺乏一套B2B电商交易系统,因此很难高效并且低成本地管控这些风险。由于反洗钱的要求,跨境支付的审核很严格,收款的流畅性很差,企业经常会面临资金被冻结的情况。"邓国标表示,他们试图做的就是帮助客户做好风控,从而让资金流转更加顺畅。

邓国标举例说,客户在收跨境款项时,如果用国内的银行账户等着跨境汇款进来,"这个过程很慢,费用也较高。以欧洲的贸易为例,我们会帮助企业在欧洲当地开设本地的虚拟银行账户,用这个账户在欧洲当地银行把资金收齐,从而降低成本、提高效率。"

XTransfer首次对中国中小外贸企业竞争力表现进行了研究,并在今年2月发布了《2020年中国中小外贸企业竞争力指数》。

该指数基于XTransfer服务的超过10万家从事跨境电商B2B的中国中小微外贸企业的外贸收款数据,以买家信任度、产品吸引力、出口运营效率3个纬度,以及订单第一期收款比例、单一订单平均收款次数、订单预付款比例、订单金额、平均发货时间5个指标为基础,评估出中国中小微外贸企业竞争力在2020年实现了显著提升。

邓国标认为,中国中小微外贸企业的竞争力仍在稳步提升,未来这些企业还将赢得更多国际买家的信任。



来源:第一财经

文章来源:https://www.ikjzd.com/home/143721

跨境电商:https://www.ikjzd.com/

cares:https://www.ikjzd.com/w/1302

韩国naver:https://www.ikjzd.com/w/1727

terapeak:https://www.ikjzd.com/w/556

中国跨境电商出口激增40% 供应端支付电子化需求加剧

受全球疫情的影响,中国跨境电商的进出口出现了爆发式增长,其中,2020年跨境电商的出口同比增长超过40%,成为稳外贸的重要力量;同期,跨境电商零售进口的规模已突破1000亿元。