分類
發燒車訊

第二輪第二批中央生態環境保護督察近日將全面啟動_網頁設計

台北網頁設計公司這麼多該如何選擇?

網動是一群專業、熱情、向前行的工作團隊,我們擁有靈活的組織與溝通的能力,能傾聽客戶聲音,激發創意的火花,呈現完美的作品

2020-08-27 來源:生態環境部

2020-08-27
來源:生態環境部 分享到:
[打印]
字號:[大] [中] [小]   為深入貫徹落實習近平生態文明思想,按照中央統籌推進常態化疫情防控和經濟社會發展的有關安排,根據《中央生態環境保護督察工作規定》,經黨中央、國務院批准,近日,第二輪第二批中央生態環境保護督察將全面啟動。已組建7个中央生態環境保護督察組,組長由張寶順、焦煥成、耿惠昌、黃龍雲、蔣巨峰、李家祥、於廣洲同志擔任,副組長由生態環境部副部長翟青、趙英民、劉華同志擔任,分別負責對北京、天津、浙江3個省(市),中國鋁業集團有限公司、中國建材集團有限公司2家中央企業開展督察進駐工作,並對國家能源局、國家林業和草原局2個部門開展督察試點。督察進駐時間約為1個月,各督察組具體如下:   
第一組:北京市,組長張寶順,副組長趙英民;   
第二組:天津市,組長焦煥成,副組長趙英民;   
第三組:浙江省,組長耿惠昌,副組長翟青;   
第四組:中國鋁業,組長黃龍雲,副組長劉華;   
第五組:中國建材,組長蔣巨峰,副組長劉華;   
第六組:國家能源局,組長李家祥,副組長翟青;   
第七組:國家林業和草原局

網頁設計最專業,超強功能平台可客製化

窩窩以「數位行銷」「品牌經營」「網站與應用程式」「印刷品設計」等四大主軸,為每一位客戶客製建立行銷脈絡及洞燭市場先機。

組長於廣洲,副組長翟青。   督察組將堅持問題導向和結果導向,重點督察有關省(市)、中央企業、部門貫徹落實習近平生態文明思想和習近平總書記等中央領導同志有關生態文明建設和生態環境保護重要指示批示情況,推動落實污染防治攻堅戰等黨中央、國務院生態文明建設和生態環境保護決策部署情況,落實新發展理念、推動高質量發展情況。針對地方,還要督察省級有關部門、地市級黨委和政府生態環境保護責任落實、擔當作為和工作推進落實等情況;針對中央企業,還要督察其所屬企業單位環境守法和落實生態環境社會責任等情況。   在對地方和中央企業開展督察的同時,此批同步啟動對國務院有關部門的督察試點。重點關注部門工作立足點、制修訂政策文件是否符合貫徹落實習近平生態文明思想和新發展理念要求,重點檢查部門職能範圍內生態文明建設重點任務部署推動、監督指導情況,以及發生的突出生態環境問題處理處置情況。通過督察,要從加強規劃計劃、強化行業管理、推動建立健全綠色發展政策體系等方面,不斷夯實生態環境保護一崗雙責。   在督察過程中,督察組將堅決服務國家經濟社會發展大局,堅決服務“六穩”“六保”,強化精準督察、科學督察、依法督察,把握督察方向和重點。更加關注新發展理念落實情況,以生態環境高水平保護推動經濟社會高質量發展;更加關注污染防治攻堅戰任務完成情況,為決勝全面建成小康社會做出貢獻;更加聚焦環境基礎設施建設、生態修復治理、環境風險防控等重點任務,推動經濟社會秩序加快恢復。   督察組將嚴肅紀律規矩,不斷增強“四個意識”、堅定“四個自信”、做到“兩個維護”,認真貫徹落實《中央生態環境保護督察工作規定》,力戒形式主義,減輕基層負擔,平穩有效有序推進督察工作。各督察組還將分別設立聯繫電話和郵政信箱,受理關於被督察對象生態文明建設和生態環境保護方面的來信來電舉報或情況反映。

※推薦評價好的iphone維修中心

擁有專業的維修技術團隊,同時聘請資深iphone手機維修專家,現場說明手機問題,快速修理,沒修好不收錢

分類
發燒車訊

Redmi K40 Pro 最新渲染圖曝光:可能是最便宜的 S888 旗艦 5G 手機之一_網頁設計

網頁設計最專業,超強功能平台可客製化

窩窩以「數位行銷」「品牌經營」「網站與應用程式」「印刷品設計」等四大主軸,為每一位客戶客製建立行銷脈絡及洞燭市場先機。

繼小米11 為全球首發高通 Snapdragon 888 旗艦處理器後,這段時間個手機品牌關於 S888 旗艦新機的傳聞也陸續曝光。
紅米 Redmi 作為小米的「友商」,小米集團中國區總裁、 Redmi 品牌總經理盧偉冰曾表示 Redmi 也將會推出 Snapdragon 888 旗艦處理器的新機。除了日前在地鐵拍到疑似 Redmi K40 Pro 工程機,近日也有網友釋出據稱是 Redmi K40 Pro 的渲染圖。

▲圖片來源:微博

Redmi K40 Pro 最新渲染圖曝光:可能是最便宜的 S888 旗艦 5G 手機之一

雖然小米11 擁有全面的旗艦規格,對於更重視性價比的米粉來說,Redmi(紅米)能擁有性能表現相當、但價格相對更便宜也是另一種選擇。傳聞 Redmi 將在今年第一季發表旗下的 K40 系列旗艦新機,包括預計搭載高通 Snapdragon 888 處理器的 Redmi k40 Pro , Redmi K40 也傳聞採用聯發科最新的 6nm 旗艦處理器。
近期,也有網友刊出了聲稱是 Redmi K40 Pro 的最新渲染圖,渲染圖可見到這款手機配備 1.08 億像素四鏡頭主相機:

▲圖片來源:微博

然而這不是第一次關於 Redmi K40 系列的消息被揭露,其實早在一個月前在微博就流傳數張疑似 Redmi K40 Pro 的工程機照片,不過將工程機照片和這次最新的渲染圖比較會發現,兩者雖然設計風格相近、但在鏡頭配置的部分略有差異,推測可能兩者分別是 Redmi K40 和 Redmi K40 Pro 的可能性較大。

▲圖片來源:酷安網

根據數碼閒聊站之前的爆料, Redmi K40 和 K40 Pro 皆採用 120Hz 更新率 OLED 螢幕,不過處理器和相機規格略有不同。前相機方面,Redmi K40 系列捨棄上一代的升降式前鏡頭,全面改採用居中的挖孔全螢幕。相機方面, Redmi K40 將配備 6400 萬像素主相機,而 Redmi K40 Pro 則為 1.08 億像素主相機。

▲圖片來源:數碼閒聊站(微博)

關於螢幕居中挖孔全螢幕這點,也與之前洩漏的工程機消息吻合:

▲圖片來源:酷安網

處理器方面,除了已經幾乎確定將搭載高通 Snapdragon 888 處理器的 Redmi K40 Pro ,標準版的 Redmi K40 則預計首發搭載聯發科 6nm 製程的 5G 處理器(代號疑似為 MT6893),之前在 Geekbench 資料庫也曝光了該處理器的跑分數據,其 CPU 效能表現超越當前聯發科天璣 1000+ 、直逼高通 Snapdragon 865 :

▲圖片來源:Geekbench

※推薦評價好的iphone維修中心

擁有專業的維修技術團隊,同時聘請資深iphone手機維修專家,現場說明手機問題,快速修理,沒修好不收錢

延伸閱讀:
紫米 ZMI 無線充車載支架(自動版)通過 NCC 認證,近期將在台開賣

小米 POCO 官方 Facebook 粉專成立、官網上線,即將以 POCO 品牌「重返」台灣市場

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

台北網頁設計公司這麼多該如何選擇?

網動是一群專業、熱情、向前行的工作團隊,我們擁有靈活的組織與溝通的能力,能傾聽客戶聲音,激發創意的火花,呈現完美的作品

分類
發燒車訊

SpringAOP使用及源碼分析(SpringBoot下)_網頁設計

※推薦評價好的iphone維修中心

擁有專業的維修技術團隊,同時聘請資深iphone手機維修專家,現場說明手機問題,快速修理,沒修好不收錢

一、SpringAOP應用

  1. 先搭建一個SpringBoot項目
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.1.7.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.mmc</groupId>
	<artifactId>springboot-study</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>springboot-study</name>
	<description>Demo project for Spring Boot</description>

	<properties>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		
	</dependencies>
	
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>
  1. 定義一個業務邏輯類,作為切面
public interface CalculationService {

    /**
     * 加法運算
     * @param x
     * @param y
     * @return
     */
    public Integer add(Integer x,Integer y);
}

/**
 * @description:
 * @author: mmc
 * @create: 2020-06-01 14:22
 **/
@Service
public class CalculationServiceImpl implements CalculationService {

    @Override
    public Integer add(Integer x, Integer y) {
        if(x==null||y==null){
            throw  new NullPointerException("參數不能為空");
        }
        return x+y;
    }
}
  1. 定義一個切面類,添加通知方法
  • 前置通知(@Before):logStart:在目標方法(div)運行之前運行
  • 後置通知(@After):logEnd:在目標方法(add)運行結束之後運行(無論方法正常結束還是異常結束)
  • 返回通知(@AfterReturning):logReturn:在目標方法(add)正常返回之後運行
  • 異常通知(@AfterThrowing):logException:在目標方法(add)出現異常以後運行
  • 環繞通知(@Around):動態代理,手動推進目標方法運行(joinPoint.procced())

/**
 * @description:  切面類
 * @author: mmc
 * @create: 2020-06-01 14:24
 **/
@Aspect
@Component
public class LogAspects {

    //抽取公共的切入點表達式
    //1、本類引用
    //2、其他的切面引用
    @Pointcut("execution(public Integer com.mmc.springbootstudy.service.CalculationService.*(..))")
    public void pointCut(){};

    @Before("pointCut()")
    public void logStart(JoinPoint joinPoint){
        Object[] args = joinPoint.getArgs();
        System.out.println(""+joinPoint.getSignature().getName()+"運行。。。@Before:參數列表是:{"+Arrays.asList(args)+"}");
    }

    @After("pointCut()")
    public void logEnd(JoinPoint joinPoint){
        System.out.println(""+joinPoint.getSignature().getName()+"結束。。。@After");
    }


    //JoinPoint一定要出現在參數表的第一位
    @AfterReturning(value="pointCut()",returning="result")
    public void logReturn(JoinPoint joinPoint,Object result){
        System.out.println(""+joinPoint.getSignature().getName()+"正常返回。。。@AfterReturning:運行結果:{"+result+"}");
    }

    @AfterThrowing(value="pointCut()",throwing="exception")
    public void logException(JoinPoint joinPoint,Exception exception){
        System.out.println(""+joinPoint.getSignature().getName()+"異常。。。異常信息:{"+exception+"}");
    }
}
  1. 寫一個controller測試
@RequestMapping("/testaop")
   @ResponseBody
    public Integer testaop(Integer x,Integer y){
       Integer result = calculationService.add(x, y);
       return result;
   }
  1. 測試

add運行。。。@Before:參數列表是:{[2, 3]}
add結束。。。@After
add正常返回。。。@AfterReturning:運行結果:{5}

二、源碼分析

主線流程圖:

網頁設計最專業,超強功能平台可客製化

窩窩以「數位行銷」「品牌經營」「網站與應用程式」「印刷品設計」等四大主軸,為每一位客戶客製建立行銷脈絡及洞燭市場先機。

  1. spring.factories文件里引入了AopAutoConfiguration類
@Configuration
@ConditionalOnClass({ EnableAspectJAutoProxy.class, Aspect.class, Advice.class, AnnotatedElement.class })
@ConditionalOnProperty(prefix = "spring.aop", name = "auto", havingValue = "true", matchIfMissing = true)
public class AopAutoConfiguration {

	@Configuration
	@EnableAspectJAutoProxy(proxyTargetClass = false)
	//看配置文件,如果配置的spring.aop.proxy-target-class為false則引入JdkDynamicAutoProxyConfiguration
	@ConditionalOnProperty(prefix = "spring.aop", name = "proxy-target-class", havingValue = "false",
			matchIfMissing = false)
	public static class JdkDynamicAutoProxyConfiguration {

	}

	@Configuration
	//開啟AspectJAutoProxy
	@EnableAspectJAutoProxy(proxyTargetClass = true)
	//看配置文件,如果配置的spring.aop.proxy-target-class為true則引入CglibAutoProxyConfiguration 
	@ConditionalOnProperty(prefix = "spring.aop", name = "proxy-target-class", havingValue = "true",
			matchIfMissing = true)
	public static class CglibAutoProxyConfiguration {

	}

}

在包目錄下找到配置文件,並且發現他的值為true

在上面的方法上有EnableAspectJAutoProxy註解,並傳入了proxyTargetClass=true

  1. 進入@EnableAspectJAutoProxy註解
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
//引入了AspectJAutoProxyRegistrar
@Import({AspectJAutoProxyRegistrar.class})
public @interface EnableAspectJAutoProxy {
    boolean proxyTargetClass() default false;

    boolean exposeProxy() default false;
}
  1. 進入AspectJAutoProxyRegistrar類
class AspectJAutoProxyRegistrar implements ImportBeanDefinitionRegistrar {
    AspectJAutoProxyRegistrar() {
    }

    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        //註冊了自動自動代理類
        AopConfigUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary(registry);
        AnnotationAttributes enableAspectJAutoProxy = AnnotationConfigUtils.attributesFor(importingClassMetadata, EnableAspectJAutoProxy.class);
        if (enableAspectJAutoProxy != null) {
            if (enableAspectJAutoProxy.getBoolean("proxyTargetClass")) {
                AopConfigUtils.forceAutoProxyCreatorToUseClassProxying(registry);
            }

            if (enableAspectJAutoProxy.getBoolean("exposeProxy")) {
                AopConfigUtils.forceAutoProxyCreatorToExposeProxy(registry);
            }
        }

    }
}
  1. 進入registerAspectJAnnotationAutoProxyCreatorIfNecessary方法裏面
 public static BeanDefinition registerAspectJAnnotationAutoProxyCreatorIfNecessary(BeanDefinitionRegistry registry, @Nullable Object source) {
        return registerOrEscalateApcAsRequired(AnnotationAwareAspectJAutoProxyCreator.class, registry, source);
    }

可以看到返回了一個BeanDefinition,裏面的BeanClass類型是AnnotationAwareAspectJAutoProxyCreator,這個類看名字是一個AOP的動態代理創建類,裏面沒有啥可疑的方法。在IDEA里按Ctrl+H看他的繼承結構。有一個父類AbstractAutoProxyCreator,這個類實現了BeanPostProcessor接口。這個接口是Bean的擴展接口,在bean初始化完成後會調用到他的postProcessAfterInitialization(Object bean, String beanName)方法。

  1. 方法內容如下
 public Object postProcessAfterInitialization(@Nullable Object bean, String beanName) {
        if (bean != null) {
            Object cacheKey = this.getCacheKey(bean.getClass(), beanName);
            if (this.earlyProxyReferences.remove(cacheKey) != bean) {
                //如果有必要,進行包裝  
                return this.wrapIfNecessary(bean, beanName, cacheKey);
            }
        }

        return bean;
    }
    
    protected Object wrapIfNecessary(Object bean, String beanName, Object cacheKey) {
        if (StringUtils.hasLength(beanName) && this.targetSourcedBeans.contains(beanName)) {
            return bean;
        } else if (Boolean.FALSE.equals(this.advisedBeans.get(cacheKey))) {
            return bean;
        } else if (!this.isInfrastructureClass(bean.getClass()) && !this.shouldSkip(bean.getClass(), beanName)) {
        //獲取切面的方法,第9點那裡展開討論
            Object[] specificInterceptors = this.getAdvicesAndAdvisorsForBean(bean.getClass(), beanName, (TargetSource)null);
            if (specificInterceptors != DO_NOT_PROXY) {
                this.advisedBeans.put(cacheKey, Boolean.TRUE);
                //創建動態代理
                Object proxy = this.createProxy(bean.getClass(), beanName, specificInterceptors, new SingletonTargetSource(bean));
                this.proxyTypes.put(cacheKey, proxy.getClass());
                return proxy;
            } else {
                this.advisedBeans.put(cacheKey, Boolean.FALSE);
                return bean;
            }
        } else {
            this.advisedBeans.put(cacheKey, Boolean.FALSE);
            return bean;
        }
    }
  1. 可以看出這裏已經在開始創建動態代理了
  protected Object createProxy(Class<?> beanClass, @Nullable String beanName, @Nullable Object[] specificInterceptors, TargetSource targetSource) {
        if (this.beanFactory instanceof ConfigurableListableBeanFactory) {
            AutoProxyUtils.exposeTargetClass((ConfigurableListableBeanFactory)this.beanFactory, beanName, beanClass);
        }
        //動態代理工廠
        ProxyFactory proxyFactory = new ProxyFactory();
        proxyFactory.copyFrom(this);
        if (!proxyFactory.isProxyTargetClass()) {
            if (this.shouldProxyTargetClass(beanClass, beanName)) {
                proxyFactory.setProxyTargetClass(true);
            } else {
                this.evaluateProxyInterfaces(beanClass, proxyFactory);
            }
        }

        Advisor[] advisors = this.buildAdvisors(beanName, specificInterceptors);
        //切面那裡的方法
        proxyFactory.addAdvisors(advisors);
        proxyFactory.setTargetSource(targetSource);
        this.customizeProxyFactory(proxyFactory);
        proxyFactory.setFrozen(this.freezeProxy);
        if (this.advisorsPreFiltered()) {
            proxyFactory.setPreFiltered(true);
        }
        //獲取動態代理類
        return proxyFactory.getProxy(this.getProxyClassLoader());
    }
  1. 學過AOP的人都知道動態代理的方式有兩種,一種JDK代理,一種CGLIB動態代理。那麼Spring裏面是怎麼選擇的呢?答案就在這裏:
 public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException {
   // 1.config.isOptimize()是否使用優化的代理策略,目前使用與CGLIB
        // config.isProxyTargetClass() 是否目標類本身被代理而不是目標類的接口
        // hasNoUserSuppliedProxyInterfaces()是否存在代理接口

        if (!config.isOptimize() && !config.isProxyTargetClass() && !this.hasNoUserSuppliedProxyInterfaces(config)) {
            return new JdkDynamicAopProxy(config);
        } else {
            Class<?> targetClass = config.getTargetClass();
            if (targetClass == null) {
                throw new AopConfigException("TargetSource cannot determine target class: Either an interface or a target is required for proxy creation.");
            } else {
                //目標類不是接口或不是代理類就使用cglib代理
                return (AopProxy)(!targetClass.isInterface() && !Proxy.isProxyClass(targetClass) ? new ObjenesisCglibAopProxy(config) : new JdkDynamicAopProxy(config));
            }
        }
    }
  1. Cglib的代理類是CglibAopProxy、ObjenesisCglibAopProxy,JDK的代理類是JdkDynamicAopProxy。在這些類裏面對目標類進行了代理,在執行方法的時候就是執行的代理類的方法,而實現了切面編程的效果。
  2. 主線流程就是這些了,還有一個沒說的就是我們如何獲取的切面方法,@Before(“pointCut()”)這些註解又是如何生效的?再回到AbstractAutoProxyCreator的wrapIfNecessary()方法
    裏面有這句代碼:
 Object[] specificInterceptors = this.getAdvicesAndAdvisorsForBean(bean.getClass(), beanName, (TargetSource)null);
 
 
  @Nullable
    protected Object[] getAdvicesAndAdvisorsForBean(Class<?> beanClass, String beanName, @Nullable TargetSource targetSource) {
        List<Advisor> advisors = this.findEligibleAdvisors(beanClass, beanName);
        return advisors.isEmpty() ? DO_NOT_PROXY : advisors.toArray();
    }
    
    protected List<Advisor> findEligibleAdvisors(Class<?> beanClass, String beanName) {
        //查找候選的要切面附加的方法,這裏加進去的
        List<Advisor> candidateAdvisors = this.findCandidateAdvisors();
        List<Advisor> eligibleAdvisors = this.findAdvisorsThatCanApply(candidateAdvisors, beanClass, beanName);
        this.extendAdvisors(eligibleAdvisors);
        if (!eligibleAdvisors.isEmpty()) {
            eligibleAdvisors = this.sortAdvisors(eligibleAdvisors);
        }

        return eligibleAdvisors;
    }
    
    
    
  1. 他會找到Aspect類,然後遍歷裏面的方法,並獲取Pointcut,然後構造出Advisor,加入到集合List advisors里,供動態代理時使用

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

台北網頁設計公司這麼多該如何選擇?

網動是一群專業、熱情、向前行的工作團隊,我們擁有靈活的組織與溝通的能力,能傾聽客戶聲音,激發創意的火花,呈現完美的作品

分類
發燒車訊

這地方美女如雲 竟然多個世界車神都喜歡來?_網頁設計

台北網頁設計公司這麼多該如何選擇?

網動是一群專業、熱情、向前行的工作團隊,我們擁有靈活的組織與溝通的能力,能傾聽客戶聲音,激發創意的火花,呈現完美的作品

在這裏,你可以看到各種的進口車型,

網頁設計最專業,超強功能平台可客製化

窩窩以「數位行銷」「品牌經營」「網站與應用程式」「印刷品設計」等四大主軸,為每一位客戶客製建立行銷脈絡及洞燭市場先機。

它們出沒的身影,是每一個愛車人士不會放過的風景。澳門不僅有深厚的汽車文化、讓人流連忘返的景色、垂涎欲滴的美食、更有讓人血脈膨脹、激情四射的汽車賽事。又是一年十一月,太陽城集團第63屆澳門格蘭披治大賽車即將在這座絢麗的城市上演。
她坐落於世界東方,是祖國南部的一顆璀璨明本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

※推薦評價好的iphone維修中心

擁有專業的維修技術團隊,同時聘請資深iphone手機維修專家,現場說明手機問題,快速修理,沒修好不收錢

分類
發燒車訊

致命性高溫、高濕來襲 研究:極端天氣頻率與強度持續增加_網頁設計

※推薦評價好的iphone維修中心

擁有專業的維修技術團隊,同時聘請資深iphone手機維修專家,現場說明手機問題,快速修理,沒修好不收錢

環境資訊中心綜合外電;姜唯 編譯;林大利 審校

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

網頁設計最專業,超強功能平台可客製化

窩窩以「數位行銷」「品牌經營」「網站與應用程式」「印刷品設計」等四大主軸,為每一位客戶客製建立行銷脈絡及洞燭市場先機。

分類
發燒車訊

MVVM 小雛形 knockout_網頁設計

※推薦評價好的iphone維修中心

擁有專業的維修技術團隊,同時聘請資深iphone手機維修專家,現場說明手機問題,快速修理,沒修好不收錢

前言

knockout學過的當工具腳本用,就像jquery一樣使用,學習成本15分鐘,沒學過的可學可不學。

knockout 是上古神器,話說在遠古開天闢地,前端到處是飛禽走獸,一片混亂。

這時候人類開始人類開始誕生了,因為惡劣的環境備受煎熬,在生存角逐中,人們通過智慧寫了各種js腳本,進入了石器時代,但是人類只有兩條腿和兩隻手切換工具的速度限制了人類的發展。

這時候John Resig 整理了各種工具,注入熔爐,一件草莽神器誕生了,jquery。人們開始利用jquery,在html上開墾大地,馬力十足,這是一個被jquery奴隸的時代,史稱奴隸時代。

後來人們就發現了一個問題,在html中這塊廣袤的大地上,js不同腳本是衝突的,部落與聯盟之間的戰爭一觸即發。隨着因為衝突,調試繁瑣,js的部落與部落之間在戰爭中,被require.js等模塊管理所統治,不同的部落得到分封,進入了封建時代。

但是幾乎在同一時間,mvvm思想開始萌芽,他們提出有一個假設,如果可以修改數據就能對html產生驅動變化,那麼是不是可以解放生產力?這個實現不斷得到驗證與實際,工業革命誕生了。這是一次沒有流血的革命,因為以前的技術誕生往往充滿着爭議,這個是真的解放人類的雙手,蒸汽時代開始來臨。

knockout 就是蒸汽時代的產物,它是mvvm模式在js實現的前驅,是現在電力時代3大框架的基石。好了,故事模式結束。

正文

首先說明一下什麼是mvvm,它是一種模式,還有一些其他模式比如說mvc,mvp等等。

他們其實是一個重的問題,偏向於哪一塊。

mvc的c很重,那麼它的重點功能在於控制器,可以說是c連接了視圖和model。

mvp的p很重,他們的視圖和model完全分離,中間p的其實相當於c,操作層,但是和mvc不同的是隔離了model層和視圖。比如說window form開發。

mvvm,偏向view,和mvp完全相反,他的視圖和數據層相當緊密,兩者不可分割。knockout就是一個例子,包括現在比較成熟的框架vue。

knockout它的作用就是一個重要功能在於監聽,監聽數據的變化,然後從新部分渲染。

台北網頁設計公司這麼多該如何選擇?

網動是一群專業、熱情、向前行的工作團隊,我們擁有靈活的組織與溝通的能力,能傾聽客戶聲音,激發創意的火花,呈現完美的作品

那麼開始實踐一下吧:

public class Product
{
	public int Id { get; set; }
	public string Name { get; set; }
	public string Category { get; set; }
	public decimal Price { get; set; }
}

一個model類,裏面存放這id,name,category,price,對應數據庫。

然後編輯控制器:

public class HomeController : Controller
{
	static List<Product> productsList = new List<Product>();
	public IActionResult Index()
	{
		return View();
	}

	[HttpGet]
	public IActionResult products() {

		productsList = new List<Product>() {
			new Product{Id=1,Category="哈哈",Name="張三",Price=10 },
			new Product{Id=2,Category="哈哈",Name="李小二",Price=10 }
		};
		return Json(productsList);
	}
}

這裏面只是提供一些數據:

前台:
html部分

<table id="products">
    <thead>
        <tr><th>ID</th><th>Name</th><th>Category</th><th>Price</th></tr>
    </thead>
    <tbody data-bind="foreach: products">
        <tr>
            <td data-bind="text: id"></td>
            <td data-bind="text: name"></td>
            <td data-bind="text: category"></td>
            <td data-bind="text: price"></td>
        </tr>
    </tbody>
</table>

js 部分:

function ViewModel() {
	var self = this;
	//創建綁定
	self.products = ko.observableArray(); // 創建數組綁定。
	self.product = ko.observable();//單個產品
	self.status = ko.observable();//單個錯誤提示
	// 得到全部的產品
	self.getAll = function () {
		self.products.removeAll();
		$.getJSON("/Home/products", function (products) {
			self.products(products);
		});
	}
	//更新
	self.update = function () {
		self.status("");
		var id = $('#productId').val();
		var product = {
			Name: $('#name').val(),
			Price: $('#price').val(),
			Category: $('#category').val()
		};
		$.ajax({
			url: '/Home/products/' + id,
			cache: false,
			type: 'PUT',
			contentType: 'application/json; charset=utf-8',
			data: JSON.stringify(product),
			success: self.getAll
		})
			.fail(
				function (xhr, textStatus, err) {
					self.status(err);
				});
	}
	//新增
	self.create = function () {
		self.status("");
		var product = {
			Name: $('#name2').val(),
			Price: $('#price2').val(),
			Category: $('#category2').val()
		};
		$.ajax({
			url: '/Home/products',
			cache: false,
			type: 'POST',
			contentType: 'application/json; charset=utf-8',
			data: JSON.stringify(product),
			statusCode: {
				201 /*Created*/: function (data) {
					//得到返回結果然後返回添加添加
					self.products.push(data);
				}
			}
		})
			.fail(
				function (xhr, textStatus, err) {
					self.status(err);
				});
	}
	//初始化
	self.getAll();
}

$(function () {
	var viewModel = new ViewModel();
	ko.applyBindings(viewModel);
})

在裏面配置增刪改查即可,裏面配置的方法可以在html這樣寫自動綁定:

<button data-bind="click: $root.create">添加</button>

就會觸發裏面的create 方法。

這裏只是作為一個綁定用例,其實在真正的編輯中是全部綁定的,不會出現這種$(‘#productName’).val();

而是使用:

<input data-bind="value: $root.Name" type="text" title="Name" />

在此就不多複述。

效果:

總結

感覺 knockout 也不是完全過時,小型的開發速率還是非常快的,綁定就完事,源碼也少,vs 編輯器也支持提示。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

網頁設計最專業,超強功能平台可客製化

窩窩以「數位行銷」「品牌經營」「網站與應用程式」「印刷品設計」等四大主軸,為每一位客戶客製建立行銷脈絡及洞燭市場先機。

分類
發燒車訊

你們真的了解車震的真諦嗎?_網頁設計

台北網頁設計公司這麼多該如何選擇?

網動是一群專業、熱情、向前行的工作團隊,我們擁有靈活的組織與溝通的能力,能傾聽客戶聲音,激發創意的火花,呈現完美的作品

首先可能是你節氣門需要清洗了車子行駛一段時間后,節氣門會很臟,然後會導致節氣門關閉不嚴或怠速步進電動機卡滯,然後你的車子怠速會很高,然後就抖了。噴油嘴積碳噴油嘴積碳之後,在冷啟動時噴出來的汽油會被積碳吸收,導致啟動時候的汽油過於稀薄。

今天說說車震的那些事兒。大家不好誤會,並不是大家所想的人在車上震,而是汽車自己震的問題。

有一次,同事坐我車的時候,跟我說為啥你的車子在抖,你要去檢查一下喔。但其實,我是在抖腳……不少車子在行駛了一定的里程之後,車子都會出現不同程度的抖動,就是怎麼回事呢?

行駛中:如果在行駛中發現汽車抖動,你可能要檢查一下你的輪胎和輪圈。首先可能是你輪胎已經偏了,需要去做一下動平衡或者是四輪定位,其次是你的輪轂有可能變形了,如果真的變形,你需要換一個新的了。

靜止時抖動,車輛在靜止時抖動的話,原因有幾個。

首先可能是你節氣門需要清洗了

車子行駛一段時間后,

※推薦評價好的iphone維修中心

擁有專業的維修技術團隊,同時聘請資深iphone手機維修專家,現場說明手機問題,快速修理,沒修好不收錢

節氣門會很臟,然後會導致節氣門關閉不嚴或怠速步進電動機卡滯,然後你的車子怠速會很高,然後就抖了。

噴油嘴積碳

噴油嘴積碳之後,在冷啟動時噴出來的汽油會被積碳吸收,導致啟動時候的汽油過於稀薄。

火花塞積碳

火花塞是發動機點火的重要部件,如果火花塞積碳會影響打火,嚴重時候甚至會導致氣缸停止工作,這個時候更換一套火花塞就好了,有經驗的可以清理一下火花塞上的積碳。如果火花塞沒積碳,則檢查點火線圈、高壓導線的工作情況。

油壓不穩定、進氣壓力傳感器出問題

如果上面的部件都沒問題,這個時候就要檢查一下油泵、進氣壓力傳感器是不是有問題,如果這兩個部件出問題,都會造成供油壓力不正常或進氣壓力傳感器數值錯誤,這個問題最好到4S店檢查一下。

發動機的腳墊老化

如果你的車已經老到了有一定的年紀,然後你又發現上面這些部件都沒問題,那就有可能是發動機的腳墊老化。這個腳墊有點兒像避震,發動機工作的時候,這個腳墊是吸收震動,防止震動傳進車廂。

汽車抖動的含義有很多,其中不少都是車主沒辦法自己來維護,建議到快修店做一個檢測就可以,一般十來分鐘就能夠完成檢查。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

網頁設計最專業,超強功能平台可客製化

窩窩以「數位行銷」「品牌經營」「網站與應用程式」「印刷品設計」等四大主軸,為每一位客戶客製建立行銷脈絡及洞燭市場先機。

分類
發燒車訊

德國憂連三年乾旱 迫切祈求降雨_網頁設計

台北網頁設計公司這麼多該如何選擇?

網動是一群專業、熱情、向前行的工作團隊,我們擁有靈活的組織與溝通的能力,能傾聽客戶聲音,激發創意的火花,呈現完美的作品

摘錄自2020年4月28日自由時報報導

歐洲2018年的乾旱造成萊茵河有史以來首次停航,同時GDP下降0.2個百分點,去年7月的高溫則讓法蘭克福附近的考布(Kaub)隘口水位降至150公分以下;德國環境部長舒爾茲(Svenja Schulze)今(28)日出席線上氣候會議表示,鑒於過去兩年的乾旱,今年勢必得採取一些行動。

網頁設計最專業,超強功能平台可客製化

窩窩以「數位行銷」「品牌經營」「網站與應用程式」「印刷品設計」等四大主軸,為每一位客戶客製建立行銷脈絡及洞燭市場先機。

德國氣象局(DWD)的專家弗里德里希(Andreas Friedrich)分析,自3月14日以來德國幾乎沒有降雨,若5月開始出現降雨,情勢將被緩解,但若5月如同4月一樣乾燥,「那我們將不得不擔心嚴重的乾旱」。

土地水文
土地利用
國際新聞
德國
乾旱

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

※推薦評價好的iphone維修中心

擁有專業的維修技術團隊,同時聘請資深iphone手機維修專家,現場說明手機問題,快速修理,沒修好不收錢

分類
發燒車訊

美大選辯論 拜登批川普無法改善環境 承諾會帶來1860萬個新工作_網頁設計

※推薦評價好的iphone維修中心

擁有專業的維修技術團隊,同時聘請資深iphone手機維修專家,現場說明手機問題,快速修理,沒修好不收錢

摘錄自2020年10月23日自由時報報導

美國總統川普與民主黨籍總統候選人拜登(Joe Biden)的最後一場辯論於台灣時間今(23日)上午9點舉行,分別就6大題目進行6階段各15分鐘問答。主持人《NBC News》資深記者維爾克(Kristen Welker)的下個議題為「氣候變遷」,向拜登問如何實行他的能源政策。

拜登稱,氣候議題已經是全體人類的存亡危機,大家都有道德責任拯救環境,再給川普做4年無法改善碳排放等等議題。

台北網頁設計公司這麼多該如何選擇?

網動是一群專業、熱情、向前行的工作團隊,我們擁有靈活的組織與溝通的能力,能傾聽客戶聲音,激發創意的火花,呈現完美的作品

對於川普說綠能政策會重傷美國能源業、導致失業,拜登強調他上台後會與各界環保組織、工會合作,推出環境友善也能創造工作的政策,包括廣設充電站、家庭電費補助等等。

拜登最後強調,他的政策能帶來1860萬個新工作,比川普還多,也能創造1兆美元的經濟產值。

能源轉型
國際新聞
美國總統大選
川普
拜登

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

網頁設計最專業,超強功能平台可客製化

窩窩以「數位行銷」「品牌經營」「網站與應用程式」「印刷品設計」等四大主軸,為每一位客戶客製建立行銷脈絡及洞燭市場先機。

分類
發燒車訊

一缸油續航1000公里 這款車居然比豐田混動車還省油?_網頁設計

※推薦評價好的iphone維修中心

擁有專業的維修技術團隊,同時聘請資深iphone手機維修專家,現場說明手機問題,快速修理,沒修好不收錢

我掐指一算,看來這個1000公里不加油還是不難做到的。價格區間邁銳寶XL混動版只推出兩款車型,分別是售價23。99萬的銳尚版和26。99萬的銳尊版。同時,它們的終端優惠都有2萬塊左右,可以看出來是誠意十足,畢竟脫離價格空談產品力也是耍流氓。

技術特點

不同於豐田THS(Toyota Hybird System)系統只有一組行星齒輪,通用這套系統有兩組行星齒輪,這樣的優點在於可以比豐田有更寬泛的傳動比範圍,就好像變速箱有了更多的擋位可以去匹配,從而可以在更大的車速比例範圍內實現最好的燃油經濟性。

邁銳寶XL混動版搭載了1.8L的自然吸氣發動機和兩個電機,然後由兩組行星齒輪組對動力進行分配,一共具有五種模式。分別是單電機純電動模式,雙電機純電動模式,低速混動模式,中速混動模式,高速混動模式。

單電機純電動模式:此時車輛處於中低負荷工況,僅由一個電機來進行驅動。

雙電機純電動模式:此時車輛處於高負荷工況,由兩個電機來驅動。

低速混動模式:此時發動機會一邊驅動車輛,一邊發電給驅動電機,而另一個電機也會輔助發動機同時驅動車輛行駛。

中速混動模式:發動機以固定傳動比來驅動車輛,同時一個電機被鎖定不工作,另一個電機會進行動力輔助或動能回收。

高速混動模式:發動機的動力分別用來驅動車輛和通過行星齒輪組進行再分配,然後利用電機來調速使發動機轉速處在經濟區間。

上面的模式看起來很複雜,但是這些都不用我們來操作,車子會根據情況進行選擇,我們只需要安心把油門控制好就OK了。

油耗及續航里程

曾經雷克薩斯ES出過一條廣告,表明它可以做到1000公里不加油。我對此事表示懷疑,但是當我了解了混動技術,才發現原來邁銳寶XL混動版也是可以做到的,在市區裏面開就可以純電動駕駛,越堵越省油,高速就更不用說了,所以它百公里綜合油耗為4.3L,而且擁有一個49L的油箱。我掐指一算,

網頁設計最專業,超強功能平台可客製化

窩窩以「數位行銷」「品牌經營」「網站與應用程式」「印刷品設計」等四大主軸,為每一位客戶客製建立行銷脈絡及洞燭市場先機。

看來這個1000公里不加油還是不難做到的。

價格區間

邁銳寶XL混動版只推出兩款車型,分別是售價23.99萬的銳尚版和26.99萬的銳尊版。同時,它們的終端優惠都有2萬塊左右,可以看出來是誠意十足,畢竟脫離價格空談產品力也是耍流氓。

高配車型比低配車型多了前駐車雷達,電動座椅記憶,前排座椅通風,GpS導航,自適應遠近光,自動泊車入位,併線輔助,車道偏離預警,主動剎車和自適應巡航等等。我個人認為,如果不是對高科技配置特別情有獨鍾就沒必要花多幾萬塊上高配了。

競爭對手

廣汽豐田-凱美瑞雙擎

指導價: 25.98-32.98萬

與凱美瑞混動版相比,邁銳寶XL混動版的入門價格要更低,兩者相差了兩萬塊左右,同時它的軸距也更長,配置上,也比入門版凱美瑞混動多了胎壓監測裝置,后駐車雷達,發動機啟停等實用性配置。不過,凱美瑞混動版能提供8年20萬公里的電池質保,而邁銳寶XL混動版僅能提供8年16萬公里。另外,豐田的THS系統早已久經沙場,名滿天下,而通用的這套系統還有待檢驗。

廣汽本田-雅閣

指導價: 23.98-27.98萬

與雅閣混動版相比,邁銳寶XL混動版的終端優惠更多。儘管兩者的配置各有千秋,但是雅閣混動的入門版就有方向盤換擋,更顯運動范。而電池質保方面,雅閣混動版可以提供10年20萬公里的質保,這方面,邁銳寶XL混動版始終處於劣勢。

從以上的分析來看,對於那些不喜歡日系車,但是又想感受一下高效混動車型的人來說,邁銳寶XL混動版是一個很不錯的選擇。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

台北網頁設計公司這麼多該如何選擇?

網動是一群專業、熱情、向前行的工作團隊,我們擁有靈活的組織與溝通的能力,能傾聽客戶聲音,激發創意的火花,呈現完美的作品